Compare commits

...

32 Commits

Author SHA1 Message Date
Basile Burg 7dabdb269b update readme 2025-06-03 04:43:26 +02:00
Basile Burg b2caf55b73 rm link to paypal 2025-06-03 04:40:59 +02:00
Basile Burg 245ca87e26 partially revert HEAD~1 2025-05-12 09:31:20 +02:00
Basile Burg 8b6f7e0f63 fix #146 - linenum not detected in message produced by ld.gold 2025-05-12 06:01:42 +02:00
Basile Burg f1f209a486 address warnings 2025-05-12 05:17:36 +02:00
Basile Burg 129d83d568 fix #145- add __rvalue keyword 2025-03-10 11:27:51 +01:00
Basile Burg 3a6a20c466 fix #144 - highlight D IES 2025-03-10 10:46:57 +01:00
Basile Burg 685242ae65 fix debug build after HEAD~1 2025-03-03 14:18:52 +01:00
Basile Burg 647daa96c8 fix #141- DCD causes dexed to crash violently
- remove old code that was used to determine if DCD is able to upagete cache
  and that was based on `dcd-client --version` + internal SemVar handling
- default to 0 for bad SemVer component
2025-03-03 14:00:05 +01:00
Basile Burg d4766a2d2a text completions, tweaks to partially ignore comments 2025-01-08 08:47:18 +01:00
Basile Burg a45e590521 fix #139 - explorer, add options to control whether the size and the ext columns are visible 2025-01-08 08:09:19 +01:00
Basile Burg 340c099fe9 fix #138 - The filter of the mini-explorer is too small 2025-01-08 08:08:38 +01:00
Basile Burg be699bd9bc completions, better behavior with `..` and when "auto-dot" is enabled (_autoDotDelay_ > 0). 2024-04-29 07:49:06 +02:00
Basile Burg 7fea8c5e4d blame widget, force lower case hash
a741032bd1 did not fix the problem,
the problem is in the input text
2024-04-29 07:18:42 +02:00
Basile Burg e16a751495 explorer, more filter fixes 2024-04-29 07:15:00 +02:00
Basile Burg a741032bd1 blame view, keep hashes lowcased
otherwise copy button will copy something that's not always handled,
xref https://gitlab.com/gitlab-org/gitlab/-/issues/453996
2024-04-02 21:51:08 +02:00
Basile Burg ccbc12a16c blame, add early exit for when the initial data are not yet collected 2024-03-30 11:25:28 +01:00
Basile Burg 877072dc48 Add initial support for git blame 2024-03-30 06:21:27 +01:00
Basile Burg ad9f8ca2d4 sxsyn, add support the `defer` keyword 2024-02-21 05:25:44 +01:00
Basile Burg 503196e999 editor cleanup commented code
that stuff, i.e indent lines, was designed for Lazarus and has
never really worked with the D HL.
2024-01-29 06:49:15 +01:00
Basile Burg 488301ac2c ESC while typing in the input field of the search & replace widg. to give the editor the focus back 2024-01-29 06:47:29 +01:00
Basile Burg 200e197b95 update changelog
impliclty fixed from Laz 3.0
2024-01-29 06:46:25 +01:00
Basile Burg 129c3c4d2c more related to #130 2024-01-22 06:49:21 +01:00
Basile Burg 0160c52b61 dftm commander, output a warning if the tool is missing
xref #125
2024-01-22 06:38:15 +01:00
Basile Burg f349dee6a4 search & replace widg, add visual feedback will typing in the input field 2024-01-21 20:52:10 +01:00
Basile Burg 58332062d1 fix, debugging or running from Laz3 did not work anymore 2024-01-21 20:50:21 +01:00
Basile Burg 61c2d132df fix #130 - mini-explorer, on startup selected folder becomes the root, instead of the previous root 2024-01-21 20:17:40 +01:00
Basile Burg bd3625a63f fix #129 - mini-explorer, clearing the filter has for effect to scan the explorer root folder instead of the selected one 2024-01-21 20:16:50 +01:00
Basile Burg 5f0cb4a3f4 sxsyn, adjust lexing to make dot equal ligature working 2023-12-18 12:06:17 +01:00
Basile Burg 6e2209e3b0 sxsyn, add support for char literals 2023-11-26 03:24:33 +01:00
Basile Burg 1d6442917e styx syntax, add the `char` keyword 2023-11-13 01:20:30 +01:00
Basile Burg 4c85af2cc4 sxsyn, allow $1 as identifier 2023-09-23 17:29:28 +02:00
29 changed files with 1110 additions and 211 deletions

View File

@ -1,3 +1,17 @@
# v3.9.27-devel
## Enhancements
- Added the _Git Blame_ widget.
- Search & Replace, add visual feedback in the editor.
## Bugs fixed
- Mini-explorer, clearing the filter had for effect to scan the root folder instead of the selected one. (#129)
- Mini-explorer, on startup selected folder becomes the root, instead of the previous root. (#130)
- With dark themes warning message on exit was barely legible.
- Editor, completions, better behavior with `..` and when "auto-dot" is enabled (_autoDotDelay_ > 0).
# v3.9.26 # v3.9.26
## Enhancements ## Enhancements

View File

@ -26,7 +26,6 @@ Dexed, the _D Extended EDitor_, is an IDE for the [D programming language](https
- :bookmark: latest release: version 3.9.26, Mon 18 Sep. 2023. - :bookmark: latest release: version 3.9.26, Mon 18 Sep. 2023.
- :scroll: licensed under the terms of the Boost software license. - :scroll: licensed under the terms of the Boost software license.
- :dollar: Development can be supported with [Paypal donations](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=AQDJVC39PJF7J).
## Download version 3.9.26 ## Download version 3.9.26
@ -35,12 +34,6 @@ Dexed, the _D Extended EDitor_, is an IDE for the [D programming language](https
- :package: [rpm for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.26/downloads/binaries/dexed-3.9.26-0.x86_64.rpm) - :package: [rpm for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.26/downloads/binaries/dexed-3.9.26-0.x86_64.rpm)
- :package: [deb for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.26/downloads/binaries/dexed-3.9.26.amd64.deb) - :package: [deb for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.26/downloads/binaries/dexed-3.9.26.amd64.deb)
The _zip_ archives allow to move freely the files.
The _setup.zip_ archives contain a command line program that installs to predefined locations so that the software can be run without additional intervention.
The _deb_ and the _rpm_ packages are for those who prefer the official setup system of their linux systems.
FreeBSD (all archs), Linux (32 bit) and Windows (32 bits) versions must be [built manually](https://basile.b.gitlab.io/dexed/build.html).
A Windows 64bit build can be found [on appveyor](https://ci.appveyor.com/project/BBasile/dexed/history). Click the top most item that has a green left margin and download the file listed in the "Artifacts" tab.
[**See this page**](https://basile.b.gitlab.io/dexed/setup.html) for more information about the setup. [**See this page**](https://basile.b.gitlab.io/dexed/setup.html) for more information about the setup.
## Building ## Building

View File

@ -125,3 +125,4 @@ __gshared
__traits __traits
__vector __vector
__parameters __parameters
__rvalue

View File

@ -7,6 +7,7 @@ break
class class
const const
continue continue
defer
delete delete
do do
echo echo
@ -44,6 +45,7 @@ version
with with
while while
char
bool bool
f32 f32
f64 f64

View File

@ -434,6 +434,7 @@
</CodeGeneration> </CodeGeneration>
<Linking> <Linking>
<Debugging> <Debugging>
<DebugInfoType Value="dsDwarf2"/>
<UseHeaptrc Value="True"/> <UseHeaptrc Value="True"/>
</Debugging> </Debugging>
<Options> <Options>
@ -487,6 +488,7 @@
</CodeGeneration> </CodeGeneration>
<Linking> <Linking>
<Debugging> <Debugging>
<DebugInfoType Value="dsDwarf2"/>
<UseHeaptrc Value="True"/> <UseHeaptrc Value="True"/>
</Debugging> </Debugging>
<Options> <Options>
@ -511,7 +513,7 @@
<RunParams> <RunParams>
<environment> <environment>
<UserOverrides Count="1"> <UserOverrides Count="1">
<Variable0 Name="LD_LIBRARY_PATH" Value="./"/> <Variable0 Name="LD_LIBRARY_PATH" Value="$(ProjPath)/../bin"/>
</UserOverrides> </UserOverrides>
</environment> </environment>
<FormatVersion Value="2"/> <FormatVersion Value="2"/>
@ -519,7 +521,7 @@
<Mode0 Name="default"> <Mode0 Name="default">
<environment> <environment>
<UserOverrides Count="1"> <UserOverrides Count="1">
<Variable0 Name="LD_LIBRARY_PATH" Value="./"/> <Variable0 Name="LD_LIBRARY_PATH" Value="$(ProjPath)/../bin"/>
</UserOverrides> </UserOverrides>
</environment> </environment>
</Mode0> </Mode0>
@ -551,7 +553,7 @@
<PackageName Value="LCL"/> <PackageName Value="LCL"/>
</Item8> </Item8>
</RequiredPackages> </RequiredPackages>
<Units Count="64"> <Units Count="65">
<Unit0> <Unit0>
<Filename Value="dexed.lpr"/> <Filename Value="dexed.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
@ -884,6 +886,13 @@
<Filename Value="..\src\u_makeproject.pas"/> <Filename Value="..\src\u_makeproject.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
</Unit63> </Unit63>
<Unit64>
<Filename Value="..\src\u_blame.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="BlameWidget"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit64>
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>
@ -907,6 +916,7 @@
<Linking> <Linking>
<Debugging> <Debugging>
<GenerateDebugInfo Value="False"/> <GenerateDebugInfo Value="False"/>
<DebugInfoType Value="dsDwarf2"/>
</Debugging> </Debugging>
<LinkSmart Value="True"/> <LinkSmart Value="True"/>
<Options> <Options>

View File

@ -14,7 +14,7 @@ uses
u_lcldragdrop, u_stringrange, u_dlangmaps, u_projgroup, u_projutils, u_lcldragdrop, u_stringrange, u_dlangmaps, u_projgroup, u_projutils,
u_d2synpresets, u_dbgitf, u_ddemangle, u_dubproject, LCLVersion, u_d2synpresets, u_dbgitf, u_ddemangle, u_dubproject, LCLVersion,
u_halstead, u_diff, u_profileviewer, u_semver, u_term, u_simpleget, u_halstead, u_diff, u_profileviewer, u_semver, u_term, u_simpleget,
u_makeproject; u_makeproject, u_blame;
{$if lcl_fullversion < 2020000} {$if lcl_fullversion < 2020000}
{$ERROR Lazarus version >= 2.2 required} {$ERROR Lazarus version >= 2.2 required}

241
src/u_blame.lfm Normal file
View File

@ -0,0 +1,241 @@
inherited BlameWidget: TBlameWidget
Left = 1275
Height = 282
Top = 652
Width = 563
Caption = 'GIT Blame'
ClientHeight = 282
ClientWidth = 563
inherited Content: TPanel
Height = 246
Top = 36
Width = 563
ClientHeight = 246
ClientWidth = 563
object btnBlame: TButton[0]
Left = 8
Height = 32
Top = 206
Width = 547
Align = alClient
BorderSpacing.Around = 8
Caption = 'Blame'
TabOrder = 0
OnClick = btnBlameClick
end
object grpGen: TGroupBox[1]
Left = 4
Height = 95
Top = 4
Width = 555
Align = alTop
AutoSize = True
BorderSpacing.Around = 4
Caption = 'General'
ClientHeight = 76
ClientWidth = 553
TabOrder = 1
object Panel1: TPanel
Left = 4
Height = 32
Top = 4
Width = 545
Align = alTop
BorderSpacing.Around = 4
BevelColor = clNone
BevelOuter = bvNone
ClientHeight = 32
ClientWidth = 545
TabOrder = 0
object Label1: TLabel
Left = 4
Height = 24
Top = 4
Width = 118
Align = alLeft
Alignment = taCenter
BorderSpacing.Around = 4
Caption = 'Displayed Revision '
end
object lblDispRev: TStaticText
Left = 126
Height = 24
Top = 4
Width = 365
Align = alClient
AutoSize = True
BorderSpacing.Around = 4
BorderStyle = sbsSingle
Font.Style = [fsBold]
ParentFont = False
TabOrder = 0
end
object btnCpyCurrHash: TSpeedButton
Left = 495
Height = 32
Hint = 'copy current commit hash'
Top = 0
Width = 25
Align = alRight
OnClick = btnCpyCurrHashClick
end
object btnLogCurr: TSpeedButton
Left = 520
Height = 32
Hint = 'show current commit message'
Top = 0
Width = 25
Align = alRight
OnClick = btnLogCurrClick
end
end
object Panel4: TPanel
Left = 4
Height = 32
Top = 40
Width = 545
Align = alTop
BorderSpacing.Around = 4
BevelColor = clNone
BevelOuter = bvNone
ClientHeight = 32
ClientWidth = 545
TabOrder = 1
object Label4: TLabel
Left = 4
Height = 24
Top = 4
Width = 60
Align = alLeft
Alignment = taCenter
BorderSpacing.Around = 4
Caption = 'Filename '
end
object lblFname: TStaticText
Left = 68
Height = 24
Top = 4
Width = 473
Align = alClient
AutoSize = True
BorderSpacing.Around = 4
BorderStyle = sbsSingle
Font.Style = [fsBold]
ParentFont = False
TabOrder = 0
end
end
end
object grpLine: TGroupBox[2]
Left = 4
Height = 95
Top = 103
Width = 555
Align = alTop
AutoSize = True
BorderSpacing.Around = 4
Caption = 'Current line'
ClientHeight = 76
ClientWidth = 553
TabOrder = 2
object Panel2: TPanel
Left = 4
Height = 32
Top = 4
Width = 545
Align = alTop
BorderSpacing.Around = 4
BevelColor = clNone
BevelOuter = bvNone
ClientHeight = 32
ClientWidth = 545
TabOrder = 0
object Label2: TLabel
Left = 4
Height = 24
Top = 4
Width = 111
Align = alLeft
Alignment = taCenter
BorderSpacing.Around = 4
Caption = 'Previous Revision '
end
object lblPrevRev: TStaticText
Left = 119
Height = 24
Top = 4
Width = 372
Align = alClient
AutoSize = True
BorderSpacing.Around = 4
BorderStyle = sbsSingle
Font.Style = [fsBold]
ParentFont = False
TabOrder = 0
end
object btnCpyPrevHash: TSpeedButton
Left = 495
Height = 32
Hint = 'copy prior commit hash'
Top = 0
Width = 25
Align = alRight
OnClick = btnCpyPrevHashClick
end
object btnLogPrev: TSpeedButton
Left = 520
Height = 32
Hint = 'show prior commit message'
Top = 0
Width = 25
Align = alRight
OnClick = btnLogPrevClick
end
end
object Panel3: TPanel
Left = 4
Height = 32
Top = 40
Width = 545
Align = alTop
BorderSpacing.Around = 4
BevelColor = clNone
BevelOuter = bvNone
ClientHeight = 32
ClientWidth = 545
TabOrder = 1
object Label3: TLabel
Left = 4
Height = 24
Top = 4
Width = 106
Align = alLeft
Alignment = taCenter
BorderSpacing.Around = 4
Caption = 'Author and Date '
end
object lblAuthDate: TStaticText
Left = 114
Height = 24
Top = 4
Width = 427
Align = alClient
AutoSize = True
BorderSpacing.Around = 4
BorderStyle = sbsSingle
Font.Style = [fsBold]
ParentFont = False
TabOrder = 0
end
end
end
end
inherited toolbar: TDexedToolBar
Width = 555
end
object Timer1: TTimer[3]
Enabled = False
OnTimer = Timer1Timer
Left = 32
end
end

504
src/u_blame.pas Normal file
View File

@ -0,0 +1,504 @@
unit u_blame;
{$I u_defines.inc}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
Buttons, ghashmap, process, Clipbrd,
u_common, u_interfaces, u_observer, u_widget,
u_synmemo, u_stringrange, u_sharedres;
type
TLineData = record
// the previous git hash
hash: string;
// if file has ever moved
filename: string;
// data, author or prev
info: string;
end;
TBlameDataKind = (
bdkNone, // no yet computed
bdkFirst, // initial blame on HEAD
bdkBlame // display in a dedicated editor
);
TEditorData = class
private
// if this is a standard editor or one opened to start blaming
kind: TBlameDataKind;
// the filename in git
filename: string;
// current revision
currHash: string;
// previous revision and fname for each line
lineData: array of TLineData;
end;
TEditorToData = specialize THashmap<TDexedMemo, TEditorData, TObjectHash>;
{ TBlameWidget }
TBlameWidget = class(TDexedWidget, IDocumentObserver, IProjectObserver)
btnBlame: TButton;
btnCpyPrevHash: TSpeedButton;
btnLogCurr: TSpeedButton;
btnLogPrev: TSpeedButton;
grpGen: TGroupBox;
Panel4: TPanel;
grpLine: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Panel1: TPanel;
Label4: TLabel;
lblFname: TStaticText;
Panel2: TPanel;
Panel3: TPanel;
lblDispRev: TStaticText;
lblPrevRev: TStaticText;
lblAuthDate: TStaticText;
btnCpyCurrHash: TSpeedButton;
Timer1: TTimer;
procedure btnBlameClick(Sender: TObject);
procedure btnCpyCurrHashClick(Sender: TObject);
procedure btnCpyPrevHashClick(Sender: TObject);
procedure btnLogCurrClick(Sender: TObject);
procedure btnLogPrevClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
fEditors: TEditorToData;
fDocData: TEditorData;
fDoc: TDExedMemo;
fProj: ICommonProject;
function getGitCwd(): string;
procedure showLog(const hash: string);
function checkTool(var exename: string): boolean;
protected
procedure setVisible(Value: Boolean); override;
procedure setToolBarFlat(value: boolean); override;
public
constructor create(aOwner: TComponent); override;
destructor destroy(); override;
procedure docNew(document: TDexedMemo);
procedure docFocused(document: TDexedMemo);
procedure docChanged(document: TDexedMemo);
procedure docClosing(document: TDexedMemo);
procedure projNew(project: ICommonProject);
procedure projChanged(project: ICommonProject);
procedure projClosing(project: ICommonProject);
procedure projFocused(project: ICommonProject);
procedure projCompiling(project: ICommonProject);
procedure projCompiled(project: ICommonProject; success: boolean);
procedure updateView();
procedure blameToData(gitLines: TStrings; blameLines: TStrings);
procedure blameBegin();
procedure blameContinue();
end;
implementation
{$R *.lfm}
constructor TBlameWidget.create(aOwner: TComponent);
begin
inherited;
fEditors := TEditorToData.create();
toolbarVisible:= false;
case GetIconScaledSize of
iss16:
begin
AssignPng(btnCpyCurrHash, 'COPY');
AssignPng(btnCpyPrevHash, 'COPY');
AssignPng(btnLogCurr, 'GIT');
AssignPng(btnLogPrev, 'GIT');
end;
iss24:
begin
AssignPng(btnCpyCurrHash, 'COPY24');
AssignPng(btnCpyPrevHash, 'COPY24');
AssignPng(btnLogCurr, 'GIT24');
AssignPng(btnLogPrev, 'GIT24');
end;
iss32:
begin
AssignPng(btnCpyCurrHash, 'COPY32');
AssignPng(btnCpyPrevHash, 'COPY32');
AssignPng(btnLogCurr, 'GIT32');
AssignPng(btnLogPrev, 'GIT32');
end;
end;
EntitiesConnector.addObserver(self);
end;
destructor TBlameWidget.destroy();
begin
fEditors.free();
inherited;
end;
procedure TBlameWidget.setVisible(Value: Boolean);
begin
inherited SetVisible(value);
if Timer1.isAssigned then
Timer1.Enabled := value;
end;
procedure TBlameWidget.setToolBarFlat(value: boolean);
begin
inherited;
btnLogCurr.Flat := value;
btnCpyCurrHash.Flat := value;
btnLogPrev.Flat := value;
btnCpyPrevHash.Flat := value;
end;
procedure TBlameWidget.docNew(document: TDexedMemo);
begin
end;
procedure TBlameWidget.docFocused(document: TDexedMemo);
begin
fDoc := document;
if fEditors.contains(document) then
begin
fDocData := fEditors[document];
end else
begin
fDocData := TEditorData.Create;
fEditors.insert(fDoc, fDocData);
end;
end;
procedure TBlameWidget.docChanged(document: TDexedMemo);
begin
end;
procedure TBlameWidget.docClosing(document: TDexedMemo);
var
closingData: TEditorData = nil;
begin
if fEditors.contains(document) then
begin
closingData := fEditors[document];
closingData.Free();
fEditors.delete(document);
end;
if fDoc = document then
fDoc := nil;
end;
procedure TBlameWidget.projNew(project: ICommonProject);
begin
end;
procedure TBlameWidget.projChanged(project: ICommonProject);
begin
end;
procedure TBlameWidget.projClosing(project: ICommonProject);
begin
if project = fProj then
fProj := nil;
end;
procedure TBlameWidget.projFocused(project: ICommonProject);
begin
fProj := project;
end;
procedure TBlameWidget.projCompiling(project: ICommonProject);
begin
end;
procedure TBlameWidget.projCompiled(project: ICommonProject; success: boolean);
begin
end;
procedure TBlameWidget.blameToData(gitLines: TStrings; blameLines: TStrings);
var
i : integer;
line: string;
rng : TStringRange = (ptr:nil; pos:0; len:0);
tmp : string;
begin
setLength(fDocData.lineData, gitLines.Count);
for i := 0 to gitLines.count-1 do
begin
line:= gitLines[i];
rng := TStringRange.create(line);
// hash
tmp := rng.takeUntil(' ').yield().ToLower();
fDocData.lineData[i].hash := tmp;
rng.popFront();
// optional filename
if rng.front() <> '(' then
begin
tmp := rng.takeUntil('(').yield();
tmp := TrimRight(tmp);
fDocData.lineData[i].filename := tmp;
rng.popFront();
end;
// date, author
tmp := rng.takeUntil(')').yield();
fDocData.lineData[i].info := tmp;
rng.popFront;
rng.popFront;
// code
if blameLines.isAssigned() then
begin
tmp := rng.takeUntil([#13,#10]).yield();
blameLines.Add(tmp);
end;
end;
end;
function TBlameWidget.getGitCwd():string;
var
old: string = '';
begin
result := '';
if assigned(fProj) then
begin
result := fProj.filename.extractFileDir;
end
else
if fDoc.isAssigned then
begin
result := fDoc.fileName;
while true do
begin
result := result.extractFileDir;
if result = old then
exit;
if (result + DirectorySeparator + '.git').dirExists then
exit;
old := result;
end;
end;
end;
function TBlameWidget.checkTool(var exename: string): boolean;
begin
exename := exeFullName('git' + exeExt);
result := exename.fileExists();
if not result then
getMessageDisplay().message('cannot locate the `git` executable', nil, amcApp, amkErr);
end;
procedure TBlameWidget.blameBegin();
var
p: TProcess = nil;
s: TStringList = nil;
d: IMessagesDisplay = nil;
i: integer;
g: string = '';
begin
if fDoc.isNotAssigned or not checkTool(g) then
exit;
p := TProcess.create(nil);
s := TStringList.Create();
try
p.Executable:= g;
p.Options := [poUsePipes, poNoConsole];
p.ShowWindow:= swoHIDE;
p.CurrentDirectory:= getGitCwd();
p.Parameters.AddStrings([ 'blame', fDoc.fileName]);
p.execute();
processOutputToStrings(p,s);
while p.Running do ;
if p.ExitCode = 0 then
begin
fDocData.filename := fDoc.fileName;
blameToData(s,nil);
fDocData.kind := bdkFirst;
end else
begin
d := getMessageDisplay();
s.LoadFromStream(p.Stderr);
for i := 0 to s.Count-1 do
d.message(s[i], fProj, amcMisc, amkAuto);
end;
finally
p.free();
s.free();
end;
end;
procedure TBlameWidget.blameContinue();
var
newDoc: TDexedMemo = nil;
oldDoc: TDexedMemo = nil;
p: TProcess = nil;
s: TStringList = nil;
d: TLineData;
m: IMessagesDisplay = nil;
n: string = '';
h: string;
i: integer;
g: string = '';
begin
if fDoc.isNotAssigned or not checkTool(g) then
exit;
oldDoc := fDoc;
d := fDocData.lineData[fDoc.CaretY-1];
h := d.hash;
if d.filename.isNotEmpty then
n := d.filename
else if fDocData.kind = bdkFirst then
n := fDoc.fileName
else
n := fDocData.filename;
p := TProcess.create(nil);
s := TStringList.Create();
try
p.Executable := exeFullName('git' + exeExt);
p.Options := [poUsePipes, poNoConsole];
p.ShowWindow := swoHIDE;
p.CurrentDirectory:= getGitCwd();
p.Parameters.AddStrings([ 'blame', n, h]);
p.execute();
processOutputToStrings(p,s);
while p.Running do ;
if p.ExitCode = 0 then
begin
newDoc := TDexedMemo.Create(nil);
blameToData(s,newDoc.Lines);
fDocData.kind := bdkBlame;
fDocData.currHash := h;
fDocData.filename := n;
newDoc.ReadOnly := true;
newDoc.setHighligtherFrom(oldDoc);
getMultiDocHandler().forceCaption(newDoc, '<blame-only view>');
end else
begin
m := getMessageDisplay();
s.LoadFromStream(p.Stderr);
for i := 0 to s.Count-1 do
m.message(s[i], fProj, amcMisc, amkAuto);
end;
finally
p.free();
s.free();
end;
end;
procedure TBlameWidget.updateView();
var
d: TLineData;
begin
if fDocData.isNotAssigned or (not visible) or fDoc.isNotAssigned then
exit;
if fDocData.kind = bdkNone then
begin
lblFname.Caption := fDoc.fileName;
lblDispRev.Caption := 'HEAD';
lblPrevRev.Caption := 'N/A';
lblAuthDate.Caption:= 'N/A';
btnBlame.Caption := 'Collect initial data';
end else
begin
if fDocData.kind = bdkFirst then
begin
lblFname.Caption := fDoc.fileName;
lblDispRev.Caption:= 'HEAD';
end else
begin
lblFname.Caption := fDocData.fileName;
lblDispRev.Caption:= fDocData.currHash;
end;
d := fDocData.lineData[fDoc.CaretY-1];
lblAuthDate.Caption := d.info;
if d.hash <> fDocData.currHash then
begin
btnBlame.Enabled := true;
btnBlame.Caption := format('Open blame view for %s', [d.hash]);
lblPrevRev.Caption := d.hash;
end else
begin
btnBlame.Enabled := false;
btnBlame.Caption := 'Open blame';
lblPrevRev.Caption := 'N/A (initial commit)';
end;
end;
end;
procedure TBlameWidget.btnBlameClick(Sender: TObject);
begin
if fDocData.isNotAssigned then
exit;
if fDocData.kind = bdkNone then
blameBegin()
else
blameContinue();
end;
procedure TBlameWidget.btnCpyCurrHashClick(Sender: TObject);
begin
if fDocData.isAssigned then
Clipboard.AsText := fDocData.currHash;
end;
procedure TBlameWidget.btnCpyPrevHashClick(Sender: TObject);
begin
if fDocData.isAssigned and (length(fDocData.lineData) <> 0) and fDoc.isAssigned then
Clipboard.AsText := fDocData.lineData[fDoc.CaretY-1].hash;
end;
procedure TBlameWidget.btnLogCurrClick(Sender: TObject);
begin
if fDocData.isAssigned then
showLog(fDocData.currHash);
end;
procedure TBlameWidget.btnLogPrevClick(Sender: TObject);
begin
if fDocData.isAssigned and (length(fDocData.lineData) <> 0) and fDoc.isAssigned then
showLog(fDocData.lineData[fDoc.CaretY-1].hash);
end;
procedure TBlameWidget.showLog(const hash: string);
var
p: TProcess;
g: TStringList;
n: string = '';
begin
if not checkTool(n) or hash.isEmpty() or (hash = 'HEAD') then
exit;
p := TProcess.Create(nil);
g := TStringList.Create;
try
p.Executable := n;
p.Options := [poUsePipes, poNoConsole];
p.ShowWindow := swoHIDE;
p.CurrentDirectory:= getGitCwd();
p.Parameters.AddStrings([ 'log', hash, '-n1', '--pretty=full']);
p.execute();
processOutputToStrings(p,g);
while p.Running do ;
if p.ExitCode = 0 then
begin
showMessage(g.Text);
end;
finally
p.free;
g.free;
end;
end;
procedure TBlameWidget.Timer1Timer(Sender: TObject);
begin
updateView;
end;
end.

View File

@ -351,6 +351,9 @@ type
// Converts the delta between two calls to GetTickCount64 to a string indicating a duration. // Converts the delta between two calls to GetTickCount64 to a string indicating a duration.
function formatTicksAsDuration(ticks: UInt64): string; function formatTicksAsDuration(ticks: UInt64): string;
// Returns wether runing in a dark DE
function isDarkDE(): boolean;
(** (**
* Compares two TPoints. * Compares two TPoints.
*) *)
@ -1562,6 +1565,11 @@ begin
result += value[p .. value.length]; result += value[p .. value.length];
end; end;
function isDarkDE(): boolean;
begin
result := clBackground < clCaptionText;
end;
{$IFDEF DEBUG} {$IFDEF DEBUG}
initialization initialization

View File

@ -22,9 +22,12 @@ type
private private
function getIndex: integer; function getIndex: integer;
protected protected
fFixedCaption: string;
procedure realSetText(const Value: TCaption); override; procedure realSetText(const Value: TCaption); override;
procedure setFixedCaption(const value: string);
public public
property index: integer read getIndex; property index: integer read getIndex;
property fixedCaption: string read fFixedCaption write setFixedCaption;
end; end;
TPageControlOption = (poPageHistory, poBottomHeader, poFlatButtons); TPageControlOption = (poPageHistory, poBottomHeader, poFlatButtons);
@ -171,16 +174,26 @@ procedure TDexedPage.RealSetText(const Value: TCaption);
var var
i: integer; i: integer;
ctrl: TDexedPageControl; ctrl: TDexedPageControl;
v : string;
begin begin
inherited; v := value;
if fFixedCaption.isNotEmpty then
v := fFixedCaption;
inherited RealSetText(v);
ctrl := TDexedPageControl(owner); ctrl := TDexedPageControl(owner);
i := ctrl.getPageIndex(self); i := ctrl.getPageIndex(self);
ctrl.fTabs.BeginUpdate; ctrl.fTabs.BeginUpdate;
if i <> -1 then if i <> -1 then
ctrl.fTabs.Tabs[i] := value; ctrl.fTabs.Tabs[i] := v;
ctrl.fTabs.EndUpdate; ctrl.fTabs.EndUpdate;
end; end;
procedure TDexedPage.setFixedCaption(const value: string);
begin
fFixedCaption:= value;
caption := value;
end;
constructor TDexedPageControl.Create(aowner: TComponent); constructor TDexedPageControl.Create(aowner: TComponent);
begin begin
inherited; inherited;

View File

@ -648,7 +648,7 @@ begin
// double quoted strings | raw double quoted strings // double quoted strings | raw double quoted strings
if (fCurrRange.notInExclusiveRange()) and readDelim(reader, fTokStop, stringPrefixes) then if (fCurrRange.notInExclusiveRange()) and readDelim(reader, fTokStop, stringPrefixes) then
begin begin
if readerPrev^ in ['r','x'] then if readerPrev^ in ['r','x','i'] then
begin begin
fCurrRange.rString := reader^ = 'r'; fCurrRange.rString := reader^ = 'r';
if not (readerNext^ = '"') then if not (readerNext^ = '"') then
@ -747,7 +747,7 @@ begin
end; end;
// token string // token string
if readDelim(reader, fTokStop, 'q{') then if readDelim(reader, fTokStop, 'q{') or readDelim(reader, fTokStop, 'iq{') then
begin begin
fTokKind := tkSymbl; fTokKind := tkSymbl;
StartCodeFoldBlock(nil, fkBrackets in fFoldKinds); StartCodeFoldBlock(nil, fkBrackets in fFoldKinds);

View File

@ -38,7 +38,6 @@ type
fProj: ICommonProject; fProj: ICommonProject;
fPortAsProcParam: string; fPortAsProcParam: string;
fVersion: TSemVer; fVersion: TSemVer;
fCanRemove: boolean;
procedure killServer; procedure killServer;
procedure terminateClient; {$IFNDEF DEBUG}inline;{$ENDIF} procedure terminateClient; {$IFNDEF DEBUG}inline;{$ENDIF}
procedure waitClient; {$IFNDEF DEBUG}inline;{$ENDIF} procedure waitClient; {$IFNDEF DEBUG}inline;{$ENDIF}
@ -101,11 +100,10 @@ constructor TDcdWrapper.create(aOwner: TComponent);
var var
fname: string; fname: string;
i: integer = 0; i: integer = 0;
r: TSemVer;
begin begin
inherited; inherited;
fVersion.init('v0.0.0'); fVersion.init('v0.0.0', false);
fname := getDocPath + optsname; fname := getDocPath + optsname;
if fname.fileExists then if fname.fileExists then
loadFromFile(fname); loadFromFile(fname);
@ -137,16 +135,6 @@ begin
fTempLines := TStringList.Create; fTempLines := TStringList.Create;
fImportCache := TStringHashSet.Create; fImportCache := TStringHashSet.Create;
fClient.Parameters.Add('--version');
fClient.Execute;
processOutputToStrings(fClient, fTempLines);
while fClient.Running do ;
fVersion.init(fTempLines.strictText);
r.major := 0;
r.minor := 9;
r.patch := 10;
fCanRemove := fVersion > r;
if fServer.isAssigned then if fServer.isAssigned then
begin begin
fServer.Execute; fServer.Execute;
@ -442,8 +430,6 @@ end;
procedure TDcdWrapper.remImportFolder(const folder: string); procedure TDcdWrapper.remImportFolder(const folder: string);
begin begin
if not fCanRemove then
exit;
if not fAvailable or not fServerListening or not fImportCache.contains(folder) then if not fAvailable or not fServerListening or not fImportCache.contains(folder) then
exit; exit;
@ -460,8 +446,6 @@ var
i: string; i: string;
c: integer; c: integer;
begin begin
if not fCanRemove then
exit;
if not fAvailable or not fServerListening then if not fAvailable or not fServerListening then
exit; exit;

View File

@ -308,7 +308,10 @@ begin
if fDoc.isNotAssigned then if fDoc.isNotAssigned then
exit; exit;
if not exeInSysPath('dfmt') then if not exeInSysPath('dfmt') then
begin
getMessageDisplay().message('DFMT is missing. See https://github.com/dlang-community/dfmt for more instructions on how to get DFMT.', nil, TAppMessageCtxt.amcAll, TAppMessageKind.amkWarn);
exit; exit;
end;
fBackup.Assign(fDoc.Lines); fBackup.Assign(fDoc.Lines);
prc := TProcess.create(nil); prc := TProcess.create(nil);

View File

@ -55,20 +55,20 @@ type
keywordsMap = record keywordsMap = record
private private
{ {
rendered on 2021-Apr-14 18:49:17.621124 by IsItThere. rendered on 2025-Mar-10 11:20:03.8930671 by IsItThere.
- PRNG seed: 0 - PRNG seed: 0
- map length: 512 - map length: 512
- case sensitive: true - case sensitive: true
} }
const fWords: array [0..511] of string = const fWords: array [0..511] of string =
('', '', '', '', '', '', 'scope', '', '', '', '', 'this', 'ucent', 'delegate', 'size_t', '', '', 'ulong', 'nothrow', '', '', 'bool', '', '', '', '', 'debug', '', '', 'class', '', '', 'function', '', '', 'uint', 'private', '', 'for', '', '', '', 'false', 'deprecated', 'mixin', '', 'while', '', '', 'with', '', '', '', 'true', '', '', '', '', '', 'foreach_reverse', '', '', '', 'real', '', '', 'align', '', '', '__vector', '', '', '', '', 'pragma', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'module', '', '', '', '', '', '', '', '', '', '', '', '', '', 'interface', '', '', '', '', '', '', '', '', 'foreach', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'auto', '', 'float', '', 'typeid', 'else', '', 'string', 'creal', 'inout', '', '', 'pure', '', '', '', '', '', '', '', '', '', '', '', 'export', '', '', '', '', '', 'ubyte', 'double', '', '', '', '', '', '', '', 'do', '', '', '', 'union', '', '', '', '', '', 'static', '', 'final', 'ireal', '', '', '', '', '', 'is', '', '', 'immutable', '', 'switch', '', '', '', 'assert', '', '', '', '', 'dstring', '', '__traits', '', '', '', '', '', 'new', 'super', '', '', '', '', '', '', 'typeof', '', '', 'catch', 'short', '', 'alias', '', '', '', 'delete', 'in', '', '', '', '', '', 'cfloat', '', '', '', 'abstract', '', '', '', '__gshared', 'wstring', 'break', '', '', '', 'unittest', '', '', 'struct', '', '', '', '', '', '', '', 'throw', '', '', '', 'cdouble', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'ifloat', 'ptrdiff_t', 'template', 'cent', 'if', '', '', '', 'long', '', '', '', '', '', '', '', '', 'char', '', '', '', 'default', '', '', '', '', 'int', '', '', 'idouble', 'volatile', '', '', '', '', 'version', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'goto', '', '', '', '', '', 'package', '__parameters', '', '', '', '', '', '', '', 'shared', '', '', '', '', '', '', '', '', '', '', '', '', 'dchar', '', '', '', '', '', '', '', '', '', '', '', 'continue', '', '', '', '', '', '', '', '', 'synchronized', '', '', '', 'public', '', '', 'return', '', '', '', '', 'out', '', 'import', '', '', '', 'null', 'protected', '', 'wchar', '', 'finally', '', '', '', 'invariant', '', 'ref', '', 'case', '', '', '', '', '', '', '', '', '', 'asm', '', '', '', '', '', '', '', '', '', '', '', '', 'ushort', 'void', '', '', '', '', '', '', '', '', '', '', '', '', '', 'enum', '', '', '', '', '', '', 'byte', '', '', '', 'const', '', 'lazy', '', '', '', 'cast', '', '', '', 'extern', '', 'try', 'override', '', '', '', '', '', '', '', ''); ('', '', '', '', 'cdouble', '', '', '', 'creal', '', 'abstract', '', 'ulong', 'uint', '', '', '', '', 'delete', '', '', '', '', '', '', 'while', '', '', '', '', '', 'goto', 'void', '', '', 'ptrdiff_t', '', '', 'extern', '', '', '', '', '__traits', '', '', '', 'ifloat', '', '', 'dchar', 'pure', '', '', '', 'template', '', 'auto', '', 'cast', '', '', 'synchronized', '', '', '', 'union', '', '', '', '', '', '', '', '__parameters', '', 'finally', '', '', 'this', '__rvalue', '', '', 'mixin', 'throw', '', '', '', '', 'class', '', '', '', '', '', '', '', '', '', 'false', '', '', '', '', '', '', '', '', '', '', '', 'continue', '', 'import', '', '', '', 'break', '', '', 'immutable', '', 'cfloat', '', '', 'case', '', 'enum', '', '', 'override', 'public', '', 'cent', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'inout', '', '', '', 'in', '', '', '', '', 'interface', 'true', '', '', 'catch', '', 'string', '', '', 'delegate', '', 'else', '', 'if', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'short', '', '', '', '', '', '', '', '', '', 'const', '', '', '', 'wstring', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'super', '', '', 'package', '', '', '', '__gshared', '', '', '', '', '', '', '', '', '', 'is', '', '', '', '', 'scope', '', '', '__vector', '', 'foreach_reverse', '', '', '', '', 'do', '', '', '', '', '', 'unittest', '', 'switch', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'static', '', '', 'dstring', 'null', '', '', 'byte', '', 'for', 'nothrow', '', '', 'debug', 'return', '', '', '', 'align', '', '', '', '', '', '', 'module', '', 'ucent', 'long', 'int', '', '', '', 'final', '', '', '', '', '', 'shared', '', '', '', '', '', '', '', '', '', '', 'protected', '', 'lazy', '', '', '', '', '', 'private', '', 'invariant', '', '', '', '', '', 'size_t', '', '', 'asm', '', '', 'double', '', '', '', 'real', '', '', '', '', '', '', '', '', '', '', '', '', 'new', '', 'volatile', '', 'alias', '', '', '', 'foreach', '', '', '', '', '', '', '', '', '', '', '', 'ushort', 'ref', 'default', 'typeid', 'assert', '', '', '', '', '', '', '', '', '', 'export', 'char', '', '', '', '', '', '', 'struct', '', '', '', '', '', '', '', '', 'idouble', '', '', '', 'ireal', '', '', '', '', '', '', 'bool', 'typeof', '', '', '', 'pragma', '', '', 'with', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'deprecated', '', '', '', '', 'version', 'try', '', '', '', '', 'wchar', '', 'function', '', 'float', '', '', '', '', '', '', '', '', '', '', '', 'ubyte', '', '', '', '', 'out', '', '', '');
const fHasEntry: array [0..511] of boolean = const fHasEntry: array [0..511] of boolean =
(false, false, false, false, false, false, true, false, false, false, false, true, true, true, true, false, false, true, true, false, false, true, false, false, false, false, true, false, false, true, false, false, true, false, false, true, true, false, true, false, false, false, true, true, true, false, true, false, false, true, false, false, false, true, false, false, false, false, false, true, false, false, false, true, false, false, true, false, false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, true, true, false, true, true, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, true, true, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, true, true, false, false, false, false, false, true, false, false, true, false, true, false, false, false, true, false, false, false, false, true, false, true, false, false, false, false, false, true, true, false, false, false, false, false, false, true, false, false, true, true, false, true, false, false, false, true, true, false, false, false, false, false, true, false, false, false, true, false, false, false, true, true, true, false, false, false, true, false, false, true, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, true, false, false, true, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, true, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, true, false, false, false, false, true, false, true, false, false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, true, false, true, true, false, false, false, false, false, false, false, false); (false, false, false, false, true, false, false, false, true, false, true, false, true, true, false, false, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, true, true, false, false, true, false, false, true, false, false, false, false, true, false, false, false, true, false, false, true, true, false, false, false, true, false, true, false, true, false, false, true, false, false, false, true, false, false, false, false, false, false, false, true, false, true, false, false, true, true, false, false, true, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, false, false, true, false, true, false, false, true, false, true, false, false, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, true, true, false, false, true, false, true, false, false, true, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, true, false, false, true, false, true, false, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, false, false, true, false, false, false, false, false, false, true, false, true, true, true, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false, true, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, false, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, true, true, false, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, true, true, false, false, false, false, true, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, true, false, false, false);
const fCoeffs: array [0..255] of Byte = const fCoeffs: array [0..255] of Byte =
(38, 33, 180, 0, 185, 246, 108, 140, 101, 70, 225, 36, 169, 241, 207, 131, 8, 145, 253, 246, 120, 51, 192, 218, 141, 3, 128, 13, 153, 122, 147, 180, 155, 253, 108, 112, 81, 69, 216, 179, 91, 136, 140, 39, 226, 59, 35, 105, 3, 111, 139, 247, 35, 246, 8, 124, 74, 191, 207, 221, 168, 208, 182, 40, 125, 146, 113, 139, 166, 251, 161, 145, 87, 99, 57, 74, 153, 249, 60, 234, 254, 164, 213, 146, 164, 14, 30, 121, 56, 203, 76, 11, 44, 178, 124, 193, 12, 248, 217, 103, 65, 21, 164, 21, 231, 147, 173, 45, 52, 134, 110, 132, 193, 209, 254, 69, 76, 214, 121, 107, 18, 172, 20, 89, 137, 103, 6, 153, 190, 154, 210, 136, 72, 198, 124, 133, 215, 154, 155, 198, 121, 208, 215, 184, 239, 210, 214, 130, 231, 158, 210, 177, 16, 39, 121, 200, 101, 187, 168, 82, 237, 94, 101, 118, 255, 207, 85, 168, 217, 106, 177, 5, 88, 246, 217, 77, 204, 40, 208, 142, 96, 217, 123, 31, 20, 237, 212, 146, 9, 168, 103, 214, 167, 134, 75, 204, 86, 62, 164, 83, 131, 236, 14, 131, 31, 66, 95, 70, 166, 134, 47, 8, 171, 76, 79, 136, 237, 10, 178, 22, 235, 255, 228, 205, 162, 40, 103, 57, 169, 153, 164, 128, 28, 5, 216, 168, 35, 121, 33, 96, 39, 72, 230, 91, 54, 134, 223, 59, 5, 166, 146, 71, 188, 129, 179, 117); (149, 149, 209, 70, 128, 54, 131, 42, 163, 99, 62, 99, 162, 96, 41, 68, 64, 176, 136, 67, 36, 232, 177, 99, 114, 106, 120, 83, 85, 249, 51, 53, 48, 55, 217, 168, 129, 86, 247, 153, 11, 47, 7, 88, 69, 131, 73, 188, 111, 154, 128, 152, 194, 99, 121, 84, 28, 83, 247, 175, 238, 255, 237, 177, 37, 205, 174, 140, 119, 108, 68, 1, 113, 102, 208, 214, 123, 137, 223, 57, 95, 182, 228, 85, 57, 41, 133, 64, 9, 201, 112, 156, 192, 173, 209, 166, 66, 61, 163, 143, 137, 240, 106, 91, 156, 68, 10, 100, 11, 116, 88, 139, 63, 240, 65, 193, 174, 195, 200, 62, 255, 243, 38, 238, 63, 128, 80, 248, 104, 7, 154, 154, 254, 221, 1, 238, 26, 252, 2, 169, 227, 130, 99, 240, 52, 248, 250, 72, 216, 222, 22, 227, 139, 187, 59, 217, 118, 119, 63, 220, 235, 55, 154, 87, 10, 171, 249, 239, 254, 232, 63, 174, 120, 245, 238, 228, 152, 175, 240, 174, 18, 95, 239, 185, 227, 226, 186, 161, 234, 227, 29, 152, 90, 54, 69, 136, 192, 252, 29, 237, 62, 164, 45, 151, 187, 68, 165, 60, 102, 146, 15, 97, 207, 59, 99, 48, 24, 53, 225, 174, 175, 183, 215, 24, 234, 33, 31, 255, 60, 128, 31, 89, 63, 3, 105, 233, 191, 6, 181, 198, 46, 7, 164, 17, 90, 45, 93, 185, 254, 17, 194, 218, 197, 194, 85, 71);
class function hash(const w: string): Word; static; {$IFNDEF DEBUG}inline;{$ENDIF} class function hash(const w: string): Word; static; {$IFNDEF DEBUG}inline;{$ENDIF}
public public
class function match(const w: string): boolean; static; {$IFNDEF DEBUG}inline;{$ENDIF} class function match(const w: string): boolean; static; {$IFNDEF DEBUG}inline;{$ENDIF}

View File

@ -12,7 +12,7 @@ type
const const
stringPostfixes: TCharSet = ['c', 'w', 'd']; stringPostfixes: TCharSet = ['c', 'w', 'd'];
stringPrefixes: TCharSet = ['r', 'x', '"']; stringPrefixes: TCharSet = ['r', 'x', 'i', '"'];
stringStopChecks: TCharSet = ['\', '"']; stringStopChecks: TCharSet = ['\', '"'];
charStopChecks: TCharSet = ['\', #39]; charStopChecks: TCharSet = ['\', #39];
symbChars: TCharSet = [';', '{', '}', '(', ')', '[', ']', ',', '.', ':', '?', '$', '"', #39]; symbChars: TCharSet = [';', '{', '}', '(', ')', '[', ']', ',', '.', ':', '?', '$', '"', #39];

View File

@ -326,9 +326,9 @@ var
begin begin
v := new(PSemVer); v := new(PSemVer);
if value = 'vmaster' then if value = 'vmaster' then
v^.init('v0.0.0-master') v^.init('v0.0.0-master', false)
else try else try
v^.init(value); v^.init(value, true);
except except
dispose(v); dispose(v);
exit; exit;
@ -1726,18 +1726,18 @@ procedure TDubProject.updateImportPathsFromJson;
p := '0.0.0'; p := '0.0.0';
end end
else if (p = 'master') or (v = '~master') then else if (p = 'master') or (v = '~master') then
q.init('v0.0.0-master') q.init('v0.0.0-master', false)
else else
begin begin
try try
q.init('v' + p); q.init('v' + p, true);
except except
// while editing a DUB project from the DUB project editor, // while editing a DUB project from the DUB project editor,
// '<value>', i.e "undefined JSON value" can be found here. // '<value>', i.e "undefined JSON value" can be found here.
// So get DUB to fetch the most recent if the 'autoFetch' IDE option // So get DUB to fetch the most recent if the 'autoFetch' IDE option
// is ON, even if another version is set later. // is ON, even if another version is set later.
o := '>='; o := '>=';
q.init('v0.0.0'); q.init('v0.0.0', false);
end; end;
end; end;

View File

@ -205,6 +205,7 @@ type
procedure openDocument(const fname: string); procedure openDocument(const fname: string);
function closeDocument(index: Integer;promptOnChanged: boolean = true): boolean; function closeDocument(index: Integer;promptOnChanged: boolean = true): boolean;
function closeDocument(doc: TDexedMemo;promptOnChanged: boolean = true): boolean; function closeDocument(doc: TDexedMemo;promptOnChanged: boolean = true): boolean;
procedure forceCaption(doc: TDexedMemo; value: string);
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
@ -669,6 +670,11 @@ begin
exit(false); exit(false);
exit(closeDocument(page.index, promptOnChanged)); exit(closeDocument(page.index, promptOnChanged));
end; end;
procedure TEditorWidget.forceCaption(doc: TDexedMemo; value: string);
begin
TDexedPage(doc.Parent).fixedCaption := value;
end;
{$ENDREGION} {$ENDREGION}
{$REGION PageControl/Editor things ---------------------------------------------} {$REGION PageControl/Editor things ---------------------------------------------}

View File

@ -320,6 +320,8 @@ type
function closeDocument(doc: TDexedMemo; promptOnChanged: boolean = true): boolean; function closeDocument(doc: TDexedMemo; promptOnChanged: boolean = true): boolean;
// conveniance property. // conveniance property.
property document[index: integer]: TDexedMemo read getDocument; property document[index: integer]: TDexedMemo read getDocument;
// force page caption
procedure forceCaption(doc: TDexedMemo; value: string);
end; end;

View File

@ -16,7 +16,8 @@ uses
u_toolseditor, u_procinput, u_optionseditor, u_symlist, u_mru, u_processes, u_toolseditor, u_procinput, u_optionseditor, u_symlist, u_mru, u_processes,
u_infos, u_dubproject, u_dialogs, u_dubprojeditor, u_gdb, u_makeproject, u_infos, u_dubproject, u_dialogs, u_dubprojeditor, u_gdb, u_makeproject,
u_dfmt, u_lcldragdrop, u_projgroup, u_projutils, u_stringrange, u_dexed_d, u_dfmt, u_lcldragdrop, u_projgroup, u_projutils, u_stringrange, u_dexed_d,
u_halstead, u_profileviewer, u_semver, u_dsgncontrols, u_term, u_newdubproj; u_halstead, u_profileviewer, u_semver, u_dsgncontrols, u_term, u_newdubproj,
u_blame;
type type
@ -437,6 +438,7 @@ type
fDubProjWidg: TDubProjectEditorWidget; fDubProjWidg: TDubProjectEditorWidget;
fPrjGrpWidg: TProjectGroupWidget; fPrjGrpWidg: TProjectGroupWidget;
fGdbWidg: TGdbWidget; fGdbWidg: TGdbWidget;
fBlameWidg: TBlameWidget;
{$IFDEF UNIX} {$IFDEF UNIX}
fTermWidg: TTermWidget; fTermWidg: TTermWidget;
{$ENDIF} {$ENDIF}
@ -1662,6 +1664,7 @@ begin
fPrjGrpWidg := TProjectGroupWidget.create(self); fPrjGrpWidg := TProjectGroupWidget.create(self);
fProfWidg := TProfileViewerWidget.create(self); fProfWidg := TProfileViewerWidget.create(self);
fGdbWidg := TGdbWidget.create(self); fGdbWidg := TGdbWidget.create(self);
fBlameWidg := TBlameWidget.create(self);
{$IFDEF UNIX} {$IFDEF UNIX}
fTermWidg := TTermWidget.create(self); fTermWidg := TTermWidget.create(self);
{$ENDIF} {$ENDIF}
@ -1687,6 +1690,7 @@ begin
fWidgList.addWidget(@fPrjGrpWidg); fWidgList.addWidget(@fPrjGrpWidg);
fWidgList.addWidget(@fProfWidg); fWidgList.addWidget(@fProfWidg);
fWidgList.addWidget(@fGdbWidg); fWidgList.addWidget(@fGdbWidg);
fWidgList.addWidget(@fBlameWidg);
{$IFDEF UNIX} {$IFDEF UNIX}
fWidgList.addWidget(@fTermWidg); fWidgList.addWidget(@fTermWidg);
{$ENDIF} {$ENDIF}
@ -2965,7 +2969,7 @@ begin
if fDoc.SelAvail then if fDoc.SelAvail then
str := fDoc.SelText str := fDoc.SelText
else else
str := fDoc.Identifier; str := fDoc.HighlightedIdent;
ffindwidg.cbToFind.Text := str; ffindwidg.cbToFind.Text := str;
ffindwidg.cbToFindChange(nil); ffindwidg.cbToFindChange(nil);
ffindwidg.cbToFind.SetFocus; ffindwidg.cbToFind.SetFocus;

View File

@ -161,7 +161,7 @@ type
function optionedOptionsModified: boolean; function optionedOptionsModified: boolean;
// //
function openFileFromDmdMessage(const aMessage: string): boolean; function openFileFromDmdMessage(const aMessage: string): boolean;
function getLineFromMessage(const aMessage: string): TPoint; class function getLineFromMessage(const aMessage: string): TPoint;
function guessMessageKind(const aMessg: string): TAppMessageKind; function guessMessageKind(const aMessg: string): TAppMessageKind;
// //
function singleServiceName: string; function singleServiceName: string;
@ -1239,7 +1239,7 @@ begin
end; end;
end; end;
function TMessagesWidget.getLineFromMessage(const aMessage: string): TPoint; class function TMessagesWidget.getLineFromMessage(const aMessage: string): TPoint;
var var
rng: TStringRange = (ptr:nil; pos:0; len: 0); rng: TStringRange = (ptr:nil; pos:0; len: 0);
lne: string; lne: string;
@ -1259,8 +1259,11 @@ begin
if gnuStyle then if gnuStyle then
begin begin
lne := rng.takeUntil([':', ' ']).yield; lne := rng.takeUntil([':', ' ']).yield;
//lne := rng.takeWhile(['1'..'9']).yield;
//rng.popWhile(' ');
if rng.front = ':' then if rng.front = ':' then
col := rng.popWhile(':')^.takeUntil(' ').yield; //col := rng.popFront()^.takeUntil([' ', ':']).yield;
col := rng.popFront()^.takeUntil([' ', ':']).yield;
end else end else
begin begin
rng.popWhile(['(', ':']); rng.popWhile(['(', ':']);
@ -1350,4 +1353,13 @@ begin
end; end;
{$ENDREGION} {$ENDREGION}
{$IFDEF DEBUG}
begin
//assert(TMessagesWidget.getLineFromMessage('home/xxx/temp/temp.sx:8 : erreur : référence à « BAD » non définie') = Point(-1,8));
assert(TMessagesWidget.getLineFromMessage('home/xxx/temp/temp.sx:8: erreur : référence à « BAD » non définie') = Point(-1,8));
assert(TMessagesWidget.getLineFromMessage('home/xxx/temp/temp.sx:18:12: erreur : référence à « BAD » non définie') = Point(12,18));
assert(TMessagesWidget.getLineFromMessage('home/xxx/temp/temp.sx(8,12): erreur : référence à « BAD » non définie') = Point(12,8));
assert(TMessagesWidget.getLineFromMessage('home/xxx/temp/temp.sx(8): erreur : référence à « BAD » non définie') = Point(-1,8));
assert(TMessagesWidget.getLineFromMessage('/home/basile/Bureau/temp/temp.sx:10:12: warning, variable `c` is never used') = Point(12,10));
{$ENDIF}
end. end.

View File

@ -21,7 +21,7 @@ inherited MiniExplorerWidget: TMiniExplorerWidget
Top = 0 Top = 0
Width = 527 Width = 527
Align = alTop Align = alTop
Columns = < Columns = <
item item
Width = 525 Width = 525
end> end>
@ -84,23 +84,51 @@ inherited MiniExplorerWidget: TMiniExplorerWidget
ObjectTypes = [otFolders] ObjectTypes = [otFolders]
ShellListView = lstFiles ShellListView = lstFiles
end end
object lstFiles: TShellListView object Panel1: TPanel
Left = 0 Left = 0
Height = 162 Height = 162
Top = 224 Top = 224
Width = 527 Width = 527
Align = alClient Align = alClient
Color = clDefault Caption = 'Panel1'
DragMode = dmAutomatic ClientHeight = 162
ReadOnly = True ClientWidth = 527
ScrollBars = ssAutoBoth
SortType = stText
TabOrder = 2 TabOrder = 2
OnColumnClick = lstFilesColumnClick object lstFilter: TListViewFilterEdit
OnDblClick = lstFilesDblClick Left = 3
OnFileAdded = lstFilesFileAdded Height = 30
ObjectTypes = [otNonFolders, otHidden] Top = 3
ShellTreeView = treeFolders Width = 521
ButtonWidth = 23
Flat = True
Align = alTop
BorderSpacing.Around = 2
NumGlyphs = 1
MaxLength = 0
TabOrder = 0
OnButtonClick = lstFilterButtonClick
OnKeyUp = lstFilterKeyUp
end
object lstFiles: TShellListView
Left = 1
Height = 126
Top = 35
Width = 525
Align = alClient
Color = clDefault
DragMode = dmAutomatic
ReadOnly = True
ScrollBars = ssAutoBoth
SortColumn = 0
SortType = stText
TabOrder = 1
OnColumnClick = lstFilesColumnClick
OnDblClick = lstFilesDblClick
OnMouseMove = lstFilesMouseMove
OnFileAdded = lstFilesFileAdded
ObjectTypes = [otNonFolders, otHidden]
ShellTreeView = treeFolders
end
end end
end end
end end
@ -169,28 +197,12 @@ inherited MiniExplorerWidget: TMiniExplorerWidget
resourceName = 'GO_PREVIOUS' resourceName = 'GO_PREVIOUS'
scaledSeparator = False scaledSeparator = False
end end
object lstFilter: TListViewFilterEdit[6]
Left = 191
Height = 26
Top = 2
Width = 329
ButtonWidth = 23
Flat = True
Align = alClient
BorderSpacing.Left = 180
BorderSpacing.Around = 2
NumGlyphs = 1
MaxLength = 0
TabOrder = 0
OnButtonClick = lstFilterButtonClick
OnKeyUp = lstFilterKeyUp
end
end end
inherited contextMenu: TPopupMenu inherited contextMenu: TPopupMenu
Left = 40 Left = 40
Top = 48 Top = 48
end end
object mnuDrives: TPopupMenu[2] object mnuDrives: TPopupMenu[3]
Left = 8 Left = 8
Top = 48 Top = 48
end end

View File

@ -22,6 +22,8 @@ type
fDblClick: TExplorerDoubleClick; fDblClick: TExplorerDoubleClick;
fContextExpand: boolean; fContextExpand: boolean;
fShowHidden: boolean; fShowHidden: boolean;
fShowSize: boolean;
fShowType: boolean;
fExplorer: TMiniExplorerWidget; fExplorer: TMiniExplorerWidget;
function optionedWantCategory(): string; function optionedWantCategory(): string;
function optionedWantEditorKind: TOptionEditorKind; function optionedWantEditorKind: TOptionEditorKind;
@ -33,6 +35,8 @@ type
property doubleClick: TExplorerDoubleClick read fDblClick write fDblClick; property doubleClick: TExplorerDoubleClick read fDblClick write fDblClick;
property contextExpand: boolean read fContextExpand write fContextExpand; property contextExpand: boolean read fContextExpand write fContextExpand;
property showHidden: boolean read fShowHidden write fShowHidden default true; property showHidden: boolean read fShowHidden write fShowHidden default true;
property showSize: boolean read fShowSize write fShowSize default true;
property showType: boolean read fShowType write fShowType default true;
public public
constructor create(miniexpl: TMiniExplorerWidget); constructor create(miniexpl: TMiniExplorerWidget);
destructor destroy; override; destructor destroy; override;
@ -44,18 +48,24 @@ type
fSplitter1Position: integer; fSplitter1Position: integer;
fSplitter2Position: integer; fSplitter2Position: integer;
fLastFolder: string; fLastFolder: string;
fRootFolder: string;
fDblClick: TExplorerDoubleClick; fDblClick: TExplorerDoubleClick;
fContextExpand: boolean; fContextExpand: boolean;
fShowHidden: boolean; fShowHidden: boolean;
fShowSize: boolean;
fShowType: boolean;
procedure setFavoriteFolders(value: TStringList); procedure setFavoriteFolders(value: TStringList);
published published
property splitter1Position: integer read fSplitter1Position write fSplitter1Position; property splitter1Position: integer read fSplitter1Position write fSplitter1Position;
property splitter2Position: integer read fSplitter2Position write fSplitter2Position; property splitter2Position: integer read fSplitter2Position write fSplitter2Position;
property lastFolder: string read fLastFolder write fLastFolder; property lastFolder: string read fLastFolder;
property rootFolder: string read fRootFolder write fRootFolder;
property favoriteFolders: TStringList read fFavoriteFolders write setFavoriteFolders; property favoriteFolders: TStringList read fFavoriteFolders write setFavoriteFolders;
property doubleClick: TExplorerDoubleClick read fDblClick write fDblClick; property doubleClick: TExplorerDoubleClick read fDblClick write fDblClick;
property contextExpand: boolean read fContextExpand write fContextExpand; property contextExpand: boolean read fContextExpand write fContextExpand;
property showHidden: boolean read fShowHidden write fShowHidden default true; property showHidden: boolean read fShowHidden write fShowHidden default true;
property showSize: boolean read fShowSize write fShowSize default true;
property showType: boolean read fShowType write fShowType default true;
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
@ -74,6 +84,7 @@ type
btnShellOpen: TDexedToolButton; btnShellOpen: TDexedToolButton;
lstFilter: TListViewFilterEdit; lstFilter: TListViewFilterEdit;
lstFav: TListView; lstFav: TListView;
Panel1: TPanel;
Panel2: TPanel; Panel2: TPanel;
lstFiles: TShellListView; lstFiles: TShellListView;
mnuDrives: TPopupMenu; mnuDrives: TPopupMenu;
@ -93,6 +104,8 @@ type
procedure lstFilesDblClick(Sender: TObject); procedure lstFilesDblClick(Sender: TObject);
procedure lstFilesEnter(Sender: TObject); procedure lstFilesEnter(Sender: TObject);
procedure lstFilesFileAdded(Sender: TObject; Item: TListItem); procedure lstFilesFileAdded(Sender: TObject; Item: TListItem);
procedure lstFilesMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure lstFilterButtonClick(Sender: TObject); procedure lstFilterButtonClick(Sender: TObject);
procedure lstFilterKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure lstFilterKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure Splitter2MouseWheel(Sender: TObject; Shift: TShiftState; procedure Splitter2MouseWheel(Sender: TObject; Shift: TShiftState;
@ -162,6 +175,8 @@ constructor TMiniExplorerEditableOptions.create(miniexpl: TMiniExplorerWidget);
begin begin
fExplorer := miniexpl; fExplorer := miniexpl;
fShowHidden:=true; fShowHidden:=true;
fShowSize:=true;
fShowType:=true;
EntitiesConnector.addObserver(self); EntitiesConnector.addObserver(self);
end; end;
@ -185,6 +200,8 @@ begin
fExplorer.treeFolders.ObjectTypes := fExplorer.treeFolders.ObjectTypes - [otHidden]; fExplorer.treeFolders.ObjectTypes := fExplorer.treeFolders.ObjectTypes - [otHidden];
fExplorer.lstFiles.ObjectTypes := fExplorer.lstFiles.ObjectTypes - [otHidden]; fExplorer.lstFiles.ObjectTypes := fExplorer.lstFiles.ObjectTypes - [otHidden];
end; end;
fExplorer.lstFiles.Columns[1].Visible := fShowSize;
fExplorer.lstFiles.Columns[2].Visible := fShowType;
fExplorer.treeFolders.Refresh; fExplorer.treeFolders.Refresh;
end; end;
@ -220,6 +237,8 @@ begin
inherited; inherited;
fFavoriteFolders := TStringList.Create; fFavoriteFolders := TStringList.Create;
fShowHidden:=true; fShowHidden:=true;
fShowType:=true;
fShowSize:=true;
end; end;
destructor TMiniExplorerOptions.destroy; destructor TMiniExplorerOptions.destroy;
@ -237,11 +256,14 @@ begin
widg := TMiniExplorerWidget(source); widg := TMiniExplorerWidget(source);
fFavoriteFolders.Assign(widg.fFavorites); fFavoriteFolders.Assign(widg.fFavorites);
fLastFolder := widg.fLastFold; fLastFolder := widg.fLastFold;
fRootFolder := widg.treeFolders.Root;
fSplitter1Position := widg.Splitter1.GetSplitterPosition; fSplitter1Position := widg.Splitter1.GetSplitterPosition;
fSplitter2Position := widg.Splitter2.GetSplitterPosition; fSplitter2Position := widg.Splitter2.GetSplitterPosition;
fDblClick:= widg.fDblClick; fDblClick:= widg.fDblClick;
fContextExpand:=widg.fContextExpand; fContextExpand:=widg.fContextExpand;
fShowHidden:= otHidden in widg.lstFiles.ObjectTypes; fShowHidden:= otHidden in widg.lstFiles.ObjectTypes;
fShowSize := widg.lstFiles.Columns[1].Visible;
fShowType := widg.lstFiles.Columns[2].Visible;
end end
else inherited; else inherited;
end; end;
@ -272,7 +294,11 @@ begin
widg.treeFolders.ObjectTypes := widg.treeFolders.ObjectTypes - [otHidden]; widg.treeFolders.ObjectTypes := widg.treeFolders.ObjectTypes - [otHidden];
widg.lstFiles.ObjectTypes := widg.lstFiles.ObjectTypes -[otHidden]; widg.lstFiles.ObjectTypes := widg.lstFiles.ObjectTypes -[otHidden];
end; end;
if widg.fLastFold.dirExists then widg.lstFiles.Columns[1].Visible := fShowSize;
widg.lstFiles.Columns[2].Visible := fShowType;
if fRootFolder.isNotEmpty and fRootFolder.dirExists then
widg.browse(fRootFolder)
else if fLastFolder.isNotEmpty and fLastFolder.dirExists then
widg.browse(fLastFolder); widg.browse(fLastFolder);
end end
else inherited; else inherited;
@ -352,8 +378,6 @@ begin
lstFav.OnSelectItem := @lstFavSelect; lstFav.OnSelectItem := @lstFavSelect;
lstFav.OnDblClick := @lstFavDblClick; lstFav.OnDblClick := @lstFavDblClick;
lstFilter.BorderSpacing.Left := ScaleX(182, 96);
treeSetRoots; treeSetRoots;
fname := getDocPath + OptsFname; fname := getDocPath + OptsFname;
@ -735,13 +759,20 @@ begin
lstFiles.Sort; lstFiles.Sort;
end; end;
procedure TMiniExplorerWidget.lstFilterButtonClick(Sender: TObject); procedure TMiniExplorerWidget.lstFilesMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var var
s: string; i: TListItem;
begin begin
s := treeFolders.Root; i := lstFiles.GetItemAt(x,y);
treeFolders.Root:= ''; if i.isAssigned() then
treeFolders.Root:= s; begin
lstFiles.Hint := i.Caption;
end;
end;
procedure TMiniExplorerWidget.lstFilterButtonClick(Sender: TObject);
begin
filterFiles;
end; end;
procedure TMiniExplorerWidget.lstFilterKeyUp(Sender: TObject; var Key: Word; procedure TMiniExplorerWidget.lstFilterKeyUp(Sender: TObject; var Key: Word;
@ -769,7 +800,6 @@ end;
procedure TMiniExplorerWidget.toolbarResize(Sender: TObject); procedure TMiniExplorerWidget.toolbarResize(Sender: TObject);
begin begin
lstFilter.Width := toolbar.Width - lstFilter.Left - lstFilter.BorderSpacing.Around;
end; end;
procedure TMiniExplorerWidget.shellOpenSelected; procedure TMiniExplorerWidget.shellOpenSelected;

View File

@ -8,12 +8,13 @@ inherited SearchWidget: TSearchWidget
ClientWidth = 422 ClientWidth = 422
inherited Content: TPanel inherited Content: TPanel
Height = 293 Height = 293
Top = 36
Width = 422 Width = 422
ClientHeight = 293 ClientHeight = 293
ClientWidth = 422 ClientWidth = 422
object cbToFind: TComboBox[0] object cbToFind: TComboBox[0]
Left = 4 Left = 4
Height = 27 Height = 30
Top = 4 Top = 4
Width = 414 Width = 414
Align = alTop Align = alTop
@ -22,15 +23,15 @@ inherited SearchWidget: TSearchWidget
BorderSpacing.Around = 4 BorderSpacing.Around = 4
ItemHeight = 0 ItemHeight = 0
MaxLength = 128 MaxLength = 128
TabOrder = 0
OnChange = cbToFindChange OnChange = cbToFindChange
OnKeyDown = cbToFindKeyDown OnKeyDown = cbToFindKeyDown
OnSelect = cbToFindChange OnSelect = cbToFindChange
TabOrder = 0
end end
object btnFind: TBitBtn[1] object btnFind: TBitBtn[1]
Left = 4 Left = 4
Height = 27 Height = 32
Top = 169 Top = 149
Width = 414 Width = 414
Align = alBottom Align = alBottom
AutoSize = True AutoSize = True
@ -40,8 +41,8 @@ inherited SearchWidget: TSearchWidget
end end
object btnReplace: TBitBtn[2] object btnReplace: TBitBtn[2]
Left = 4 Left = 4
Height = 27 Height = 32
Top = 231 Top = 221
Width = 414 Width = 414
Align = alBottom Align = alBottom
AutoSize = True AutoSize = True
@ -51,50 +52,50 @@ inherited SearchWidget: TSearchWidget
end end
object grpOpts: TGroupBox[3] object grpOpts: TGroupBox[3]
Left = 4 Left = 4
Height = 99 Height = 73
Top = 66 Top = 72
Width = 414 Width = 414
Align = alClient Align = alClient
AutoSize = True AutoSize = True
BorderSpacing.Around = 4 BorderSpacing.Around = 4
Caption = 'Options' Caption = 'Options'
ClientHeight = 80 ClientHeight = 54
ClientWidth = 410 ClientWidth = 412
TabOrder = 4 TabOrder = 4
object FlowPanel1: TFlowPanel object FlowPanel1: TFlowPanel
Left = 0 Left = 0
Height = 80 Height = 54
Top = 0 Top = 0
Width = 410 Width = 412
Align = alClient Align = alClient
AutoSize = True AutoSize = True
BevelOuter = bvNone BevelOuter = bvNone
ControlList = < ControlList = <
item item
Control = chkRegex Control = chkRegex
WrapAfter = waAuto WrapAfter = waAuto
Index = 0 Index = 0
end end
item item
Control = chkPrompt Control = chkPrompt
WrapAfter = waAuto WrapAfter = waAuto
Index = 1 Index = 1
end end
item item
Control = chkCaseSens Control = chkCaseSens
WrapAfter = waAuto WrapAfter = waAuto
Index = 2 Index = 2
end end
item item
Control = chkFromCur Control = chkFromCur
WrapAfter = waAuto WrapAfter = waAuto
Index = 3 Index = 3
end end
item item
Control = chkBack Control = chkBack
WrapAfter = waAuto WrapAfter = waAuto
Index = 4 Index = 4
end end
item item
Control = chkWWord Control = chkWWord
WrapAfter = waAuto WrapAfter = waAuto
@ -105,9 +106,9 @@ inherited SearchWidget: TSearchWidget
TabOrder = 0 TabOrder = 0
object chkRegex: TCheckBox object chkRegex: TCheckBox
Left = 0 Left = 0
Height = 22 Height = 23
Top = 0 Top = 0
Width = 100 Width = 94
Anchors = [] Anchors = []
Caption = 'allow regex' Caption = 'allow regex'
Checked = True Checked = True
@ -116,27 +117,27 @@ inherited SearchWidget: TSearchWidget
end end
object chkPrompt: TCheckBox object chkPrompt: TCheckBox
Left = 0 Left = 0
Height = 22 Height = 23
Top = 23 Top = 24
Width = 71 Width = 72
Anchors = [] Anchors = []
Caption = 'prompt' Caption = 'prompt'
TabOrder = 1 TabOrder = 1
end end
object chkCaseSens: TCheckBox object chkCaseSens: TCheckBox
Left = 0 Left = 94
Height = 22 Height = 23
Top = 46 Top = 0
Width = 117 Width = 107
Anchors = [] Anchors = []
Caption = 'case sensitive' Caption = 'case sensitive'
TabOrder = 2 TabOrder = 2
end end
object chkFromCur: TCheckBox object chkFromCur: TCheckBox
Left = 117 Left = 94
Height = 22 Height = 23
Top = 0 Top = 24
Width = 99 Width = 96
Anchors = [] Anchors = []
Caption = 'from cursor' Caption = 'from cursor'
Checked = True Checked = True
@ -144,19 +145,19 @@ inherited SearchWidget: TSearchWidget
TabOrder = 3 TabOrder = 3
end end
object chkBack: TCheckBox object chkBack: TCheckBox
Left = 117 Left = 201
Height = 22 Height = 23
Top = 23 Top = 0
Width = 87 Width = 84
Anchors = [] Anchors = []
Caption = 'backward' Caption = 'backward'
TabOrder = 4 TabOrder = 4
end end
object chkWWord: TCheckBox object chkWWord: TCheckBox
Left = 117 Left = 201
Height = 22 Height = 23
Top = 46 Top = 24
Width = 99 Width = 96
Anchors = [] Anchors = []
Caption = 'whole word' Caption = 'whole word'
Checked = True Checked = True
@ -167,8 +168,8 @@ inherited SearchWidget: TSearchWidget
end end
object btnReplaceAll: TBitBtn[4] object btnReplaceAll: TBitBtn[4]
Left = 4 Left = 4
Height = 27 Height = 32
Top = 262 Top = 257
Width = 414 Width = 414
Align = alBottom Align = alBottom
AutoSize = True AutoSize = True
@ -178,69 +179,69 @@ inherited SearchWidget: TSearchWidget
end end
object Panel1: TPanel[5] object Panel1: TPanel[5]
Left = 4 Left = 4
Height = 27 Height = 30
Top = 35 Top = 38
Width = 414 Width = 414
Align = alTop Align = alTop
AutoSize = True AutoSize = True
BorderSpacing.Around = 4 BorderSpacing.Around = 4
BevelOuter = bvNone BevelOuter = bvNone
ClientHeight = 27 ClientHeight = 30
ClientWidth = 414 ClientWidth = 414
TabOrder = 5 TabOrder = 5
object cbReplaceWth: TComboBox object cbReplaceWth: TComboBox
Left = 111 Left = 104
Height = 27 Height = 30
Top = 0 Top = 0
Width = 303 Width = 310
Align = alClient Align = alClient
AutoComplete = True AutoComplete = True
AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchCaseSensitive, cbactSearchAscending] AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchCaseSensitive, cbactSearchAscending]
ItemHeight = 0 ItemHeight = 0
MaxLength = 128 MaxLength = 128
TabOrder = 1
OnChange = cbReplaceWthChange OnChange = cbReplaceWthChange
OnKeyDown = cbReplaceWthKeyDown OnKeyDown = cbReplaceWthKeyDown
OnSelect = cbReplaceWthChange OnSelect = cbReplaceWthChange
TabOrder = 1
end end
object chkEnableRep: TCheckBox object chkEnableRep: TCheckBox
Left = 0 Left = 0
Height = 27 Height = 30
Top = 0 Top = 0
Width = 111 Width = 104
Align = alLeft Align = alLeft
Caption = 'Replace with ' Caption = 'Replace with '
OnChange = chkEnableRepChange
TabOrder = 0 TabOrder = 0
OnChange = chkEnableRepChange
end end
end end
object Panel2: TPanel[6] object Panel2: TPanel[6]
Left = 4 Left = 4
Height = 27 Height = 32
Top = 200 Top = 185
Width = 414 Width = 414
Align = alBottom Align = alBottom
AutoSize = True AutoSize = True
BorderSpacing.Around = 4 BorderSpacing.Around = 4
BevelOuter = bvNone BevelOuter = bvNone
ClientHeight = 27 ClientHeight = 32
ClientWidth = 414 ClientWidth = 414
TabOrder = 6 TabOrder = 6
object btnFindAll: TBitBtn object btnFindAll: TBitBtn
Left = 0 Left = 0
Height = 27 Height = 32
Top = 0 Top = 0
Width = 402 Width = 398
Align = alClient Align = alClient
AutoSize = True AutoSize = True
Caption = 'btnFindAll' Caption = 'btnFindAll'
TabOrder = 0 TabOrder = 0
end end
object btnAllScope: TBitBtn object btnAllScope: TBitBtn
Left = 404 Left = 400
Height = 27 Height = 32
Top = 0 Top = 0
Width = 10 Width = 14
Align = alRight Align = alRight
AutoSize = True AutoSize = True
BorderSpacing.Left = 2 BorderSpacing.Left = 2
@ -256,7 +257,7 @@ inherited SearchWidget: TSearchWidget
Left = 216 Left = 216
Top = 16 Top = 16
end end
object imgList: TImageList[2] object imgList: TImageList[3]
Left = 248 Left = 248
Top = 16 Top = 16
Bitmap = { Bitmap = {

View File

@ -7,7 +7,7 @@ interface
uses uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Menus, StdCtrls, actnList, Buttons, SynEdit, SynEditSearch, SynEditTypes, Menus, StdCtrls, actnList, Buttons, SynEdit, SynEditSearch, SynEditTypes,
RegExpr, SynEditTextBuffer, strutils, RegExpr, SynEditTextBuffer, strutils, LCLType,
u_common, u_mru, u_widget, u_synmemo, u_interfaces, u_observer, u_common, u_mru, u_widget, u_synmemo, u_interfaces, u_observer,
u_writableComponent, u_dialogs, u_sharedres, u_dsgncontrols; u_writableComponent, u_dialogs, u_sharedres, u_dsgncontrols;
@ -762,13 +762,16 @@ begin
fToFind := cbToFind.Text; fToFind := cbToFind.Text;
fHasSearched := false; fHasSearched := false;
updateImperative; updateImperative;
if fDoc.isAssigned and (not chkRegex.Checked) then
fDoc.HighlightedIdent := fToFind;
end; end;
procedure TSearchWidget.cbToFindKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TSearchWidget.cbToFindKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin begin
if Key <> 13 then if Key = 13 then
exit; actFindNextExecute(nil)
actFindNextExecute(nil); else if (key = VK_ESCAPE) and fDoc.isAssigned then
fDoc.setFocus;
end; end;
procedure TSearchWidget.chkEnableRepChange(Sender: TObject); procedure TSearchWidget.chkEnableRepChange(Sender: TObject);

View File

@ -20,7 +20,7 @@ type
public public
// Initializes with the semVer text. // Initializes with the semVer text.
// When throw is set to true an Exception is raised if the format is not compliant. // When throw is set to true an Exception is raised if the format is not compliant.
procedure init(const text: string; throw: boolean = true); procedure init(const text: string; throw: boolean);
// Indicates wether the version is not a final release. // Indicates wether the version is not a final release.
function isPreRelease: boolean; function isPreRelease: boolean;
@ -58,7 +58,7 @@ implementation
var v1, v2: TSemVer; var v1, v2: TSemVer;
{$ENDIF} {$ENDIF}
procedure TSemVer.init(const text: string; throw: boolean = true); procedure TSemVer.init(const text: string; throw: boolean);
procedure resetFields(); procedure resetFields();
begin begin
@ -84,12 +84,12 @@ begin
if throw and (r.front <> 'v') then if throw and (r.front <> 'v') then
error('Invalid semVer format, the text must start with "v"'); error('Invalid semVer format, the text must start with "v"');
r.popFront; r.popFront;
fMajor := r.takeUntil('.').yield.ToInteger; fMajor := StrToInt64Def(r.takeUntil('.').yield, 0);
if throw and r.empty then if throw and r.empty then
error('Invalid semVer format, minor and patch miss'); error('Invalid semVer format, minor and patch miss');
fMinor := r.popFront^.takeUntil('.').yield.ToInteger; fMinor := StrToInt64Def(r.popFront^.takeUntil('.').yield, 0);
if not r.empty then if not r.empty then
fPatch := r.popFront^.takeWhile(['0'..'9']).yield.ToInteger; fPatch := StrToInt64Def(r.popFront^.takeWhile(['0'..'9']).yield, 0);
if not r.empty then if not r.empty then
fAdditional := r.popFront^.takeUntil(#0).yield; fAdditional := r.popFront^.takeUntil(#0).yield;
fValid := true; fValid := true;
@ -146,46 +146,46 @@ end;
{$IFDEF DEBUG} {$IFDEF DEBUG}
begin begin
v1.init('v1.0.0'); v1.init('v1.0.0', true);
v2.init('v1.0.0'); v2.init('v1.0.0', true);
assert(v1 = v2); assert(v1 = v2);
v1.init('v2.0.0'); v1.init('v2.0.0', true);
v2.init('v1.0.0'); v2.init('v1.0.0', true);
assert(v1 > v2); assert(v1 > v2);
assert(v2 < v1); assert(v2 < v1);
v1.init('v1.1.0'); v1.init('v1.1.0', true);
v2.init('v1.0.0'); v2.init('v1.0.0', true);
assert(v1 > v2); assert(v1 > v2);
assert(v2 < v1); assert(v2 < v1);
v1.init('v1.1.1'); v1.init('v1.1.1', true);
v2.init('v1.1.0'); v2.init('v1.1.0', true);
assert(v1 > v2); assert(v1 > v2);
assert(v2 < v1); assert(v2 < v1);
v1.init('v1.1.1'); v1.init('v1.1.1', true);
v2.init('v1.0.1'); v2.init('v1.0.1', true);
assert(v1 > v2); assert(v1 > v2);
assert(v2 < v1); assert(v2 < v1);
v1.init('v1.1.1-alpha.2'); v1.init('v1.1.1-alpha.2', true);
v2.init('v1.1.1-alpha.1'); v2.init('v1.1.1-alpha.1', true);
assert(v1 > v2); assert(v1 > v2);
assert(v1.isAlpha); assert(v1.isAlpha);
assert(v2.isAlpha); assert(v2.isAlpha);
assert(v2.asString = '1.1.1-alpha.1'); assert(v2.asString = '1.1.1-alpha.1');
v1.init('v1.1.1-beta.1'); v1.init('v1.1.1-beta.1', true);
v2.init('v1.1.1-alpha.8'); v2.init('v1.1.1-alpha.8', true);
assert(v1 > v2); assert(v1 > v2);
assert(v1.isBeta); assert(v1.isBeta);
assert(v2.isAlpha); assert(v2.isAlpha);
assert(v1.isPreRelease); assert(v1.isPreRelease);
v1.init('v1.2.3'); v1.init('v1.2.3', true);
v2.init('v1.22.33'); v2.init('v1.22.33', true);
assert(v1.major = 1); assert(v1.major = 1);
assert(v1.minor = 2); assert(v1.minor = 2);
assert(v1.patch = 3); assert(v1.patch = 3);
@ -194,7 +194,7 @@ begin
assert(v2.patch = 33); assert(v2.patch = 33);
assert(v2.asString = '1.22.33'); assert(v2.asString = '1.22.33');
v1.init('v0.0.2060'); v1.init('v0.0.2060', true);
assert(v1.major = 0); assert(v1.major = 0);
assert(v1.minor = 0); assert(v1.minor = 0);
assert(v1.patch = 2060); assert(v1.patch = 2060);
@ -204,7 +204,7 @@ begin
assert(v2.minor = 0); assert(v2.minor = 0);
assert(v2.patch = 2060); assert(v2.patch = 2060);
v1.init('v0.6.0'); v1.init('v0.6.0', true);
assert(v1.major = 0); assert(v1.major = 0);
assert(v1.minor = 6); assert(v1.minor = 6);
assert(v1.patch = 0); assert(v1.patch = 0);

View File

@ -15,17 +15,17 @@ type
private private
{ {
rendered on 2023-Sep-10 22:02:01.9295926 by IsItThere. rendered on 2024-Feb-21 05:21:19.9635608 by IsItThere.
- PRNG seed: 6574 - PRNG seed: 6574
- map length: 128 - map length: 128
- case sensitive: true - case sensitive: true
} }
const fWords: array [0..127] of string = const fWords: array [0..127] of string =
('label', 'switch', '', 'goto', '', '', '', '', 'delete', 'var', '', '', '', '', '', 'apply', '', '', 'on', '', '', 'from', 'alias', '', '', '', 'static', 'super', 'overload', 'usize', '', 'false', '', 'template', 'continue', '', '', 'this', 'new', 'in', 'foreach', 'throw', 'u8', '', '', '', '', 'const', 'break', 'union', '', 'ssize', 'true', '', 'class', '', 'unit', 'version', '', '', '', '', 'asm', '', 's8', 'echo', '', '', '', '', '', 'u16', '', '', '', 'function', 'protection', 'enum', '', 'while', '', '', '', 'return', 'if', '', '', 'u32', '', '', '', 'else', '', 's16', 'import', '', 'auto', 'try', 'bool', '', '', '', 'finally', '', 'null', 'u64', 'f32', '', '', 's32', '', 'struct', '', '', '', 'assert', 'do', '', '', '', '', '', '', '', 'f64', 'with', '', 's64'); ('label', 'switch', '', 'goto', '', '', '', 'char', 'delete', 'var', '', '', '', '', '', 'apply', '', '', 'on', '', '', 'from', 'alias', '', '', '', 'static', 'super', 'overload', 'usize', '', 'false', '', 'template', 'continue', '', '', 'this', 'new', 'in', 'foreach', 'throw', 'u8', '', '', '', '', 'const', 'break', 'union', '', 'ssize', 'true', '', 'class', '', 'unit', 'version', '', '', '', '', 'asm', '', 's8', 'echo', '', '', '', '', '', 'u16', '', '', '', 'function', 'protection', 'enum', '', 'while', 'defer', '', '', 'return', 'if', '', '', 'u32', '', '', '', 'else', '', 's16', 'import', '', 'auto', 'try', 'bool', '', '', '', 'finally', '', 'null', 'u64', 'f32', '', '', 's32', '', 'struct', '', '', '', 'assert', 'do', '', '', '', '', '', '', '', 'f64', 'with', '', 's64');
const fFilled: array [0..127] of boolean = const fFilled: array [0..127] of boolean =
(true, true, false, true, false, false, false, false, true, true, false, false, false, false, false, true, false, false, true, false, false, true, true, false, false, false, true, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, false, false, false, false, true, true, true, false, true, true, false, true, false, true, true, false, false, false, false, true, false, true, true, false, false, false, false, false, true, false, false, false, true, true, true, false, true, false, false, false, true, true, false, false, true, false, false, false, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, true, false, false, true, false, true, false, false, false, true, true, false, false, false, false, false, false, false, true, true, false, true); (true, true, false, true, false, false, false, true, true, true, false, false, false, false, false, true, false, false, true, false, false, true, true, false, false, false, true, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, false, false, false, false, true, true, true, false, true, true, false, true, false, true, true, false, false, false, false, true, false, true, true, false, false, false, false, false, true, false, false, false, true, true, true, false, true, true, false, false, true, true, false, false, true, false, false, false, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, true, false, false, true, false, true, false, false, false, true, true, false, false, false, false, false, false, false, true, true, false, true);
const fCoefficients: array [0..255] of Byte = const fCoefficients: array [0..255] of Byte =
(37, 236, 86, 118, 73, 206, 4, 48, 111, 209, 73, 137, 75, 157, 197, 152, 28, 40, 164, 170, 89, 179, 110, 152, 34, 12, 168, 23, 76, 66, 91, 217, 64, 82, 153, 12, 185, 137, 120, 56, 55, 132, 75, 141, 42, 119, 214, 156, 103, 102, 23, 72, 8, 181, 233, 248, 50, 191, 134, 63, 153, 91, 211, 31, 248, 110, 52, 135, 183, 250, 187, 30, 201, 228, 26, 255, 211, 174, 96, 188, 196, 206, 170, 218, 210, 19, 147, 137, 85, 186, 122, 214, 221, 218, 67, 147, 91, 27, 241, 246, 192, 226, 11, 2, 53, 201, 105, 1, 137, 149, 94, 180, 242, 169, 65, 14, 25, 248, 173, 230, 80, 135, 108, 41, 129, 206, 58, 41, 231, 66, 9, 230, 66, 181, 237, 77, 132, 143, 61, 65, 125, 248, 77, 147, 107, 74, 69, 83, 82, 217, 61, 119, 70, 229, 222, 170, 236, 100, 226, 92, 167, 163, 84, 207, 175, 75, 43, 27, 105, 100, 137, 0, 50, 34, 66, 135, 19, 75, 41, 113, 105, 88, 81, 86, 255, 235, 167, 229, 20, 181, 28, 233, 251, 234, 32, 117, 113, 48, 178, 193, 180, 111, 116, 38, 1, 16, 93, 108, 26, 83, 202, 163, 49, 177, 142, 229, 120, 149, 99, 182, 110, 136, 118, 198, 153, 237, 92, 131, 160, 58, 248, 253, 183, 192, 200, 200, 172, 192, 213, 137, 2, 208, 24, 94, 17, 41, 66, 9, 196, 119, 30, 99, 11, 28, 148, 180); (37, 236, 86, 118, 73, 206, 4, 48, 111, 209, 73, 137, 75, 157, 197, 152, 28, 40, 164, 170, 89, 179, 110, 152, 34, 12, 168, 23, 76, 66, 91, 217, 64, 82, 153, 12, 185, 137, 120, 56, 55, 132, 75, 141, 42, 119, 214, 156, 103, 102, 23, 72, 8, 181, 233, 248, 50, 191, 134, 63, 153, 91, 211, 31, 248, 110, 52, 135, 183, 250, 187, 30, 201, 228, 26, 255, 211, 174, 96, 188, 196, 206, 170, 218, 210, 19, 147, 137, 85, 186, 122, 214, 221, 218, 67, 147, 91, 27, 241, 246, 192, 226, 11, 2, 53, 201, 105, 1, 137, 149, 94, 180, 242, 169, 65, 14, 25, 248, 173, 230, 80, 135, 108, 41, 129, 206, 58, 41, 231, 66, 9, 230, 66, 181, 237, 77, 132, 143, 61, 65, 125, 248, 77, 147, 107, 74, 69, 83, 82, 217, 61, 119, 70, 229, 222, 170, 236, 100, 226, 92, 167, 163, 84, 207, 175, 75, 43, 27, 105, 100, 137, 0, 50, 34, 66, 135, 19, 75, 41, 113, 105, 88, 81, 86, 255, 235, 167, 229, 20, 181, 28, 233, 251, 234, 32, 117, 113, 48, 178, 193, 180, 111, 116, 38, 1, 16, 93, 108, 26, 83, 202, 163, 49, 177, 142, 229, 120, 149, 99, 182, 110, 136, 118, 198, 153, 237, 92, 131, 160, 58, 248, 253, 183, 192, 200, 200, 172, 192, 213, 137, 2, 208, 24, 94, 17, 41, 66, 9, 196, 119, 30, 99, 11, 28, 148, 180);
@ -91,6 +91,7 @@ type
procedure lexFloatingLiteralFractionalPart(); procedure lexFloatingLiteralFractionalPart();
procedure lexExponent(); procedure lexExponent();
procedure lexStringLiteral(); procedure lexStringLiteral();
procedure lexCharLiteral();
procedure lexRawStringLiteral(); procedure lexRawStringLiteral();
procedure lexLineComment(); procedure lexLineComment();
procedure lexStarComment(); procedure lexStarComment();
@ -577,6 +578,25 @@ begin
end; end;
end; end;
procedure TSynSxSyn.lexCharLiteral();
begin
fTokKind := TTokenKind.tkStrng;
fTokStop += 1;
while fTokStop <= fLineBuf.length do
begin
case fLineBuf[fTokStop] of
'\' : fTokStop += 2;
#39 :
begin
fTokStop += 1;
exit;
end
else fTokStop += 1;
end;
end;
fTokKind := TTokenKind.tkError;
end;
procedure TSynSxSyn.lexStringLiteral(); procedure TSynSxSyn.lexStringLiteral();
var var
firstLine: Boolean; firstLine: Boolean;
@ -675,21 +695,12 @@ begin
while fTokStop <= fLineBuf.length do while fTokStop <= fLineBuf.length do
begin begin
case fLineBuf[fTokStop] of case fLineBuf[fTokStop] of
'_', 'a'..'z', 'A'..'Z': '_', 'a'..'z', 'A'..'Z', '0'..'9':
begin begin
oneChr := true; oneChr := true;
fTokStop += 1; fTokStop += 1;
continue; continue;
end; end;
'0' .. '9':
begin
if oneChr then
begin
fTokStop += 1;
continue;
end
else break; // e.g $0
end
else break; else break;
end; end;
end; end;
@ -779,6 +790,8 @@ begin
end; end;
// number // number
'1' .. '9' : lexIntLiteral(); '1' .. '9' : lexIntLiteral();
// char
#39 : lexCharLiteral();
// "string" // "string"
'"': lexStringLiteral(); '"': lexStringLiteral();
// `string` // `string`
@ -798,7 +811,16 @@ begin
'>': lexOpAndOpOpAndOpEqualAndOpOpEqual('>'); '>': lexOpAndOpOpAndOpEqualAndOpOpEqual('>');
// `=`, `==`, `=>` // `=`, `==`, `=>`
'=': lexAssEquOrLambda(); '=': lexAssEquOrLambda();
'.', '(', ')', ',', ':' , '[', ']', ';' : '.':
begin
nextPChar := safeLookupChar();
fTokKind := TTokenKind.tkSymbl;
if (nextPChar <> nil) and (nextPChar^ = '=') then
fTokStop += 2
else
fTokStop += 1;
end;
'(', ')', ',', ':' , '[', ']', ';' :
begin begin
fTokKind := TTokenKind.tkSymbl; fTokKind := TTokenKind.tkSymbl;
fTokStop += 1; fTokStop += 1;

View File

@ -209,8 +209,8 @@ begin
fSymbols[CFF] := fDoc.fileName; fSymbols[CFF] := fDoc.fileName;
fSymbols[CFR] := fSymbols[CFF].stripFileExt + exeExt; fSymbols[CFR] := fSymbols[CFF].stripFileExt + exeExt;
fSymbols[CFP] := fSymbols[CFF].extractFilePath; fSymbols[CFP] := fSymbols[CFF].extractFilePath;
if fDoc.Identifier.isNotEmpty then if fDoc.HighlightedIdent.isNotEmpty then
fSymbols[CI] := fDoc.Identifier; fSymbols[CI] := fDoc.HighlightedIdent;
fSymbols[CL] := fDoc.LineText; fSymbols[CL] := fDoc.LineText;
fSymbols[CS] := fDoc.SelText; fSymbols[CS] := fDoc.SelText;
end; end;

View File

@ -9,9 +9,8 @@ uses
SynEdit, SynPluginSyncroEdit, SynCompletion, SynEditKeyCmds, LazSynEditText, SynEdit, SynPluginSyncroEdit, SynCompletion, SynEditKeyCmds, LazSynEditText,
SynHighlighterLFM, SynEditHighlighter, SynEditMouseCmds, SynEditFoldedView, SynHighlighterLFM, SynEditHighlighter, SynEditMouseCmds, SynEditFoldedView,
SynEditMarks, SynEditTypes, SynHighlighterJScript, SynBeautifier, dialogs, SynEditMarks, SynEditTypes, SynHighlighterJScript, SynBeautifier, dialogs,
md5, Spin, LCLIntf, LazFileUtils, LMessages, SynHighlighterCpp, math, md5, Spin, LCLIntf, LazFileUtils, LMessages, SynHighlighterCpp,
SynGutterBase, LCLVersion, SynEditMiscProcs, SynGutterBase, LCLVersion, SynEditMiscProcs,
//SynEditMarkupFoldColoring,
Clipbrd, fpjson, jsonparser, LazUTF8, Buttons, StdCtrls, Clipbrd, fpjson, jsonparser, LazUTF8, Buttons, StdCtrls,
u_common, u_writableComponent, u_d2syn, u_txtsyn, u_dialogs, u_sxsyn, u_common, u_writableComponent, u_d2syn, u_txtsyn, u_dialogs, u_sxsyn,
u_sharedres, u_dlang, u_stringrange, u_dbgitf, u_observer, u_diff, u_sharedres, u_dlang, u_stringrange, u_dbgitf, u_observer, u_diff,
@ -191,7 +190,6 @@ type
TDexedMemo = class(TSynEdit, IDebugObserver) TDexedMemo = class(TSynEdit, IDebugObserver)
private private
//fIndentGuideMarkup: TSynEditMarkupFoldColors;
fLifeTimeManager: TObject; fLifeTimeManager: TObject;
fIdentDialShown: boolean; fIdentDialShown: boolean;
fScrollMemo: TScrollMemo; fScrollMemo: TScrollMemo;
@ -201,7 +199,7 @@ type
fCacheLoaded: boolean; fCacheLoaded: boolean;
fIsDSource: boolean; fIsDSource: boolean;
fFocusForInput: boolean; fFocusForInput: boolean;
fIdentifier: string; fHighlightedIdent: string;
fTempFileName: string; fTempFileName: string;
fMultiDocSubject: TObject; fMultiDocSubject: TObject;
fDefaultFontSize: Integer; fDefaultFontSize: Integer;
@ -267,7 +265,7 @@ type
procedure setMatchOpts(value: TIdentifierMatchOptions); procedure setMatchOpts(value: TIdentifierMatchOptions);
function getMouseBytePosition: Integer; function getMouseBytePosition: Integer;
procedure changeNotify(Sender: TObject); procedure changeNotify(Sender: TObject);
procedure highlightCurrentIdentifier; procedure highlightCurrentIdentifier(fromEditor: boolean = true);
procedure saveCache; procedure saveCache;
procedure loadCache; procedure loadCache;
class procedure cleanCache; static; class procedure cleanCache; static;
@ -321,6 +319,7 @@ type
procedure debugBreak(const fname: string; line: integer; reason: TDebugBreakReason); procedure debugBreak(const fname: string; line: integer; reason: TDebugBreakReason);
function breakPointsCount: integer; function breakPointsCount: integer;
procedure tryToPatchMixedIndentation; procedure tryToPatchMixedIndentation;
procedure setHighligthedIdent(value: string);
protected protected
procedure DoEnter; override; procedure DoEnter; override;
procedure DoExit; override; procedure DoExit; override;
@ -386,9 +385,10 @@ type
procedure redoAll(); procedure redoAll();
procedure undoAll(); procedure undoAll();
procedure scrollCentered(down: boolean); procedure scrollCentered(down: boolean);
procedure setHighligtherFrom(other: TDexedMemo);
// //
property IdentifierMatchOptions: TIdentifierMatchOptions read fMatchOpts write setMatchOpts; property IdentifierMatchOptions: TIdentifierMatchOptions read fMatchOpts write setMatchOpts;
property Identifier: string read fIdentifier; property HighlightedIdent: string read fHighlightedIdent write setHighligthedIdent;
property fileName: string read fFilename; property fileName: string read fFilename;
property modified: boolean read fModified; property modified: boolean read fModified;
property tempFilename: string read fTempFileName; property tempFilename: string read fTempFileName;
@ -1246,9 +1246,6 @@ begin
LineHighlightColor.Background := color - $080808; LineHighlightColor.Background := color - $080808;
LineHighlightColor.Foreground := clNone; LineHighlightColor.Foreground := clNone;
//fIndentGuideMarkup:= TSynEditMarkupFoldColors.Create(self);
//MarkupManager.AddMarkUp(fIndentGuideMarkup);
fAutoCloseCurlyBrace:= autoCloseOnNewLineLexically; fAutoCloseCurlyBrace:= autoCloseOnNewLineLexically;
fAutoClosedPairs:= [autoCloseSquareBracket]; fAutoClosedPairs:= [autoCloseSquareBracket];
@ -1268,7 +1265,6 @@ destructor TDexedMemo.destroy;
begin begin
saveCache; saveCache;
//fIndentGuideMarkup.Free;
EntitiesConnector.removeObserver(self); EntitiesConnector.removeObserver(self);
subjDocClosing(TMultiDocSubject(fMultiDocSubject), self); subjDocClosing(TMultiDocSubject(fMultiDocSubject), self);
fMultiDocSubject.Free; fMultiDocSubject.Free;
@ -2150,10 +2146,9 @@ end;
procedure TDexedMemo.centerCursor(); procedure TDexedMemo.centerCursor();
var var
Y, LinesInWin, CurTopLine, NewTopLine: Integer; Y, LinesInWin, NewTopLine: Integer;
begin begin
LinesInWin := LinesInWindow; LinesInWin := LinesInWindow;
CurTopLine := TopView;
Y := ToPos(TextView.TextToViewIndex(ToIdx(CaretY))); Y := ToPos(TextView.TextToViewIndex(ToIdx(CaretY)));
NewTopLine := Max(1, Y - (LinesInWin div 2)); NewTopLine := Max(1, Y - (LinesInWin div 2));
if NewTopLine < 1 then NewTopLine := 1; if NewTopLine < 1 then NewTopLine := 1;
@ -2174,6 +2169,21 @@ begin
end; end;
end; end;
procedure TDexedMemo.setHighligtherFrom(other: TDexedMemo);
begin
if other.Highlighter = other.TxtHighlighter then
Highlighter := TxtHighlighter
else if other.Highlighter = other.D2Highlighter then
Highlighter := D2Highlighter
else if other.Highlighter = other.SxHighlighter then
Highlighter := SxHighlighter
else if other.Highlighter = other.CppHighlighter then
Highlighter := CppHighlighter
// LFM, JSON, etc. are shared instances
else
Highlighter := other.Highlighter;
end;
procedure TDexedMemo.ShowPhobosDoc; procedure TDexedMemo.ShowPhobosDoc;
var var
str: string; str: string;
@ -2983,6 +2993,15 @@ begin
r := TStringRange.create(lines[i]); r := TStringRange.create(lines[i]);
while not r.empty do while not r.empty do
begin begin
r.popWhile([' ', #9]);
if r.startsWith('//') then
r.popUntil(#0);
if r.startsWith('/*') then
begin
r.popFrontN(2);
r.popUntil('/');
r.popFront();
end;
w := r.popUntil(c)^.takeWhile(a).yield; w := r.popUntil(c)^.takeWhile(a).yield;
if (w.length >= fTextCompletionMinLength) and not h.contains(w) then if (w.length >= fTextCompletionMinLength) and not h.contains(w) then
begin begin
@ -3003,6 +3022,11 @@ procedure TDexedMemo.completionCodeCompletion(var value: string;
begin begin
if KeyChar = '' then if KeyChar = '' then
exit; exit;
if (KeyChar = '.') and (SourceValue <> value) then
begin
value := SourceValue + '.';
exit;
end;
if KeyChar[1] = ' ' then if KeyChar[1] = ' ' then
value := sourceValue + KeyChar[1] value := sourceValue + KeyChar[1]
else else
@ -3372,14 +3396,23 @@ begin
fIsDSource := Highlighter = fD2Highlighter; fIsDSource := Highlighter = fD2Highlighter;
end; end;
procedure TDexedMemo.highlightCurrentIdentifier; procedure TDexedMemo.setHighligthedIdent(value: string);
begin
if fHighlightedIdent = value then
exit;
fHighlightedIdent := value;
highlightCurrentIdentifier(false);
end;
procedure TDexedMemo.highlightCurrentIdentifier(fromEditor: boolean = true);
var var
s: string; s: string;
i: integer; i: integer;
begin begin
fIdentifier := GetWordAtRowCol(LogicalCaretXY); if fromEditor then
if (fIdentifier.length > 2) and (not SelAvail) then fHighlightedIdent := GetWordAtRowCol(LogicalCaretXY);
SetHighlightSearch(fIdentifier, fMatchIdentOpts) if (fHighlightedIdent.length > 2) and (not SelAvail) then
SetHighlightSearch(fHighlightedIdent, fMatchIdentOpts)
else if SelAvail and (BlockBegin.Y = BlockEnd.Y) then else if SelAvail and (BlockBegin.Y = BlockEnd.Y) then
begin begin
s := SelText; s := SelText;

View File

@ -18,31 +18,31 @@ inherited TodoListWidget: TTodoListWidget
Width = 576 Width = 576
Align = alClient Align = alClient
BorderSpacing.Around = 4 BorderSpacing.Around = 4
Columns = < Columns = <
item item
AutoSize = True AutoSize = True
Caption = 'text' Caption = 'text'
Width = 36 Width = 36
end end
item item
AutoSize = True AutoSize = True
Caption = 'category' Caption = 'category'
Width = 67 Width = 67
end end
item item
AutoSize = True AutoSize = True
Caption = 'assignee' Caption = 'assignee'
Width = 68 Width = 68
end end
item item
AutoSize = True AutoSize = True
Caption = 'status' Caption = 'status'
end end
item item
AutoSize = True AutoSize = True
Caption = 'priority' Caption = 'priority'
Width = 57 Width = 57
end end
item item
AutoSize = True AutoSize = True
Caption = 'file' Caption = 'file'
@ -55,6 +55,7 @@ inherited TodoListWidget: TTodoListWidget
end end
end end
inherited toolbar: TDexedToolBar inherited toolbar: TDexedToolBar
Height = 30
Width = 576 Width = 576
OnResize = toolbarResize OnResize = toolbarResize
object btnGo: TDexedToolButton[0] object btnGo: TDexedToolButton[0]