mirror of https://gitlab.com/basile.b/dexed.git
Compare commits
36 Commits
Author | SHA1 | Date |
---|---|---|
|
129d83d568 | |
|
3a6a20c466 | |
|
685242ae65 | |
|
647daa96c8 | |
|
d4766a2d2a | |
|
a45e590521 | |
|
340c099fe9 | |
|
be699bd9bc | |
|
7fea8c5e4d | |
|
e16a751495 | |
|
a741032bd1 | |
|
ccbc12a16c | |
|
877072dc48 | |
|
ad9f8ca2d4 | |
|
503196e999 | |
|
488301ac2c | |
|
200e197b95 | |
|
129c3c4d2c | |
|
0160c52b61 | |
|
f349dee6a4 | |
|
58332062d1 | |
|
61c2d132df | |
|
bd3625a63f | |
|
5f0cb4a3f4 | |
|
6e2209e3b0 | |
|
1d6442917e | |
|
4c85af2cc4 | |
|
22f0a5cf39 | |
|
af68051ba8 | |
|
f1c6b38c38 | |
|
e576ad1702 | |
|
68f2d53b5c | |
|
47e00a6a9b | |
|
011907d934 | |
|
263f2a1121 | |
|
052e49aa35 |
27
CHANGELOG.md
27
CHANGELOG.md
|
@ -1,3 +1,30 @@
|
|||
# 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
|
||||
|
||||
## Enhancements
|
||||
|
||||
- Editor, added the _Undo All_ action.
|
||||
- GDB Commander, custom executables selected for debugging are now stored in a persistent MRU list.
|
||||
|
||||
## Bugx fixed
|
||||
|
||||
- Fixed windows release (#116). From now ldc2 >= 1.31.0 is a minimal requirement.
|
||||
- The context lines of the diff viewer were not legible whith dark themes.
|
||||
- Font size of reloaded document not always correct.
|
||||
|
||||
# v3.9.25
|
||||
|
||||
## Enhancements
|
||||
|
|
14
README.md
14
README.md
|
@ -24,22 +24,22 @@ Dexed, the _D Extended EDitor_, is an IDE for the [D programming language](https
|
|||
|
||||
## Project information
|
||||
|
||||
- :bookmark: latest release: version 3.9.25, Wed 7 Jul. 2023.
|
||||
- :bookmark: latest release: version 3.9.26, Mon 18 Sep. 2023.
|
||||
- :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.25
|
||||
## Download version 3.9.26
|
||||
|
||||
- :package: [setup program for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.25/downloads/binaries/dexed.3.9.25.linux64.setup.zip)
|
||||
- :package: [binaries for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.25/downloads/binaries/dexed.3.9.25.linux64.zip)
|
||||
- :package: [rpm for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.25/downloads/binaries/dexed-3.9.25-0.x86_64.rpm)
|
||||
- :package: [deb for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.25/downloads/binaries/dexed-3.9.25.amd64.deb)
|
||||
- :package: [setup program for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.26/downloads/binaries/dexed.3.9.26.linux64.setup.zip)
|
||||
- :package: [binaries for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.26/downloads/binaries/dexed.3.9.26.linux64.zip)
|
||||
- :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)
|
||||
|
||||
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.~~
|
||||
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.
|
||||
|
||||
|
|
|
@ -19,14 +19,14 @@ branches:
|
|||
|
||||
install:
|
||||
- ps: |
|
||||
$LDC_URL = "https://github.com/ldc-developers/ldc/releases/download/v1.30.0/ldc2-1.30.0-windows-x64.7z"
|
||||
$LDC_URL = "https://github.com/ldc-developers/ldc/releases/download/v1.33.0/ldc2-1.33.0-windows-multilib.7z"
|
||||
$LDC_NME = "C:\ldc.7z";
|
||||
$LAZ_URL = "https://gitlab.com/basile.b/laz-bin-cache.git"
|
||||
$LAZ_NME = "laz-bin-cache\lazarus-2.2.0-fpc-3.2.2-win64.exe"
|
||||
|
||||
(new-object net.webclient).DownloadFile($LDC_URL, $LDC_NME)
|
||||
7z x $LDC_NME -o"C:\" -y -r
|
||||
Rename-Item "C:\ldc2-1.30.0-windows-x64" "C:\ldc"
|
||||
Rename-Item "C:\ldc2-1.33.0-windows-multilib" "C:\ldc"
|
||||
|
||||
git clone $LAZ_URL --depth=1
|
||||
Start-Process -FilePath $LAZ_NME -Wait -ArgumentList "/SILENT", "/SUPPRESSMSGBOXES", "/DIR=C:\lazarus"
|
|
@ -8,7 +8,12 @@
|
|||
"path" : "../etc/libdparse"
|
||||
}
|
||||
},
|
||||
"dflags" : [
|
||||
"dflags-linux" : [
|
||||
"-link-defaultlib-shared=false"
|
||||
]
|
||||
],
|
||||
"dflags-windows" : [
|
||||
"-link-defaultlib-shared=false",
|
||||
"-fvisibility=public",
|
||||
"-dllimport=none",
|
||||
],
|
||||
}
|
|
@ -11,7 +11,7 @@ Dexed is mostly programmed in Object Pascal, using the the [Lazarus development
|
|||
* [Download](http://lazarus.freepascal.org/index.php?page=downloads) and setup the latest Lazarus version (>= 2.2.0) and FPC + FPC sources (= 3.2.2) for your platform.
|
||||
* Windows: the three packages are bundled in an installer.
|
||||
* Linux: the three packages must be downloaded and setup individually. It's recommended to download the packages from _SourceForge_ and not from the official repository of the distribution because they don't always propose the latest version.
|
||||
* [Download](https://github.com/ldc-developers/ldc/releases) and setup LDC2, the LLVM-based D compiler. It is used to compile the part of the IDE that's written in D, a library called _libdexed-d_. LDC2 binaries must be visible in the system PATH variable. Note that building _libdexed-d_ is automatic.
|
||||
* [Download](https://github.com/ldc-developers/ldc/releases) and setup LDC2 (>= v1.31.0), the LLVM-based D compiler. It is used to compile the part of the IDE that's written in D, a library called _libdexed-d_. LDC2 binaries must be visible in the system PATH variable. Note that building _libdexed-d_ is automatic.
|
||||
|
||||
## Build
|
||||
|
||||
|
|
|
@ -125,3 +125,4 @@ __gshared
|
|||
__traits
|
||||
__vector
|
||||
__parameters
|
||||
__rvalue
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
#!/usr/bin/sh
|
||||
isitthere --if=sxkeywords.txt --ml=128 --is=6574 --fk=pascal --of=sxkw.pas --fn=KeywordMatch
|
|
@ -0,0 +1,61 @@
|
|||
alias
|
||||
apply
|
||||
asm
|
||||
assert
|
||||
auto
|
||||
break
|
||||
class
|
||||
const
|
||||
continue
|
||||
defer
|
||||
delete
|
||||
do
|
||||
echo
|
||||
else
|
||||
enum
|
||||
false
|
||||
finally
|
||||
foreach
|
||||
from
|
||||
function
|
||||
goto
|
||||
if
|
||||
import
|
||||
in
|
||||
label
|
||||
new
|
||||
null
|
||||
on
|
||||
overload
|
||||
protection
|
||||
return
|
||||
static
|
||||
struct
|
||||
super
|
||||
switch
|
||||
template
|
||||
this
|
||||
throw
|
||||
true
|
||||
try
|
||||
union
|
||||
unit
|
||||
var
|
||||
version
|
||||
with
|
||||
while
|
||||
|
||||
char
|
||||
bool
|
||||
f32
|
||||
f64
|
||||
s16
|
||||
s32
|
||||
s64
|
||||
s8
|
||||
ssize
|
||||
u16
|
||||
u32
|
||||
u64
|
||||
u8
|
||||
usize
|
|
@ -434,6 +434,7 @@
|
|||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<DebugInfoType Value="dsDwarf2"/>
|
||||
<UseHeaptrc Value="True"/>
|
||||
</Debugging>
|
||||
<Options>
|
||||
|
@ -487,6 +488,7 @@
|
|||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<DebugInfoType Value="dsDwarf2"/>
|
||||
<UseHeaptrc Value="True"/>
|
||||
</Debugging>
|
||||
<Options>
|
||||
|
@ -511,7 +513,7 @@
|
|||
<RunParams>
|
||||
<environment>
|
||||
<UserOverrides Count="1">
|
||||
<Variable0 Name="LD_LIBRARY_PATH" Value="./"/>
|
||||
<Variable0 Name="LD_LIBRARY_PATH" Value="$(ProjPath)/../bin"/>
|
||||
</UserOverrides>
|
||||
</environment>
|
||||
<FormatVersion Value="2"/>
|
||||
|
@ -519,7 +521,7 @@
|
|||
<Mode0 Name="default">
|
||||
<environment>
|
||||
<UserOverrides Count="1">
|
||||
<Variable0 Name="LD_LIBRARY_PATH" Value="./"/>
|
||||
<Variable0 Name="LD_LIBRARY_PATH" Value="$(ProjPath)/../bin"/>
|
||||
</UserOverrides>
|
||||
</environment>
|
||||
</Mode0>
|
||||
|
@ -551,7 +553,7 @@
|
|||
<PackageName Value="LCL"/>
|
||||
</Item8>
|
||||
</RequiredPackages>
|
||||
<Units Count="64">
|
||||
<Units Count="65">
|
||||
<Unit0>
|
||||
<Filename Value="dexed.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
|
@ -884,6 +886,13 @@
|
|||
<Filename Value="..\src\u_makeproject.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit63>
|
||||
<Unit64>
|
||||
<Filename Value="..\src\u_blame.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="BlameWidget"/>
|
||||
<HasResources Value="True"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
</Unit64>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
|
@ -907,6 +916,7 @@
|
|||
<Linking>
|
||||
<Debugging>
|
||||
<GenerateDebugInfo Value="False"/>
|
||||
<DebugInfoType Value="dsDwarf2"/>
|
||||
</Debugging>
|
||||
<LinkSmart Value="True"/>
|
||||
<Options>
|
||||
|
|
|
@ -14,7 +14,7 @@ uses
|
|||
u_lcldragdrop, u_stringrange, u_dlangmaps, u_projgroup, u_projutils,
|
||||
u_d2synpresets, u_dbgitf, u_ddemangle, u_dubproject, LCLVersion,
|
||||
u_halstead, u_diff, u_profileviewer, u_semver, u_term, u_simpleget,
|
||||
u_makeproject;
|
||||
u_makeproject, u_blame;
|
||||
|
||||
{$if lcl_fullversion < 2020000}
|
||||
{$ERROR Lazarus version >= 2.2 required}
|
||||
|
|
|
@ -126,10 +126,10 @@ if [ ! -z "$GITLAB_CI" ]; then
|
|||
LOG=$(./extract_last_changelog_part)
|
||||
LOG=$(echo "$LOG" | sed -z 's/\n/\\n/g' | sed -z 's/\"/\\"/g')
|
||||
|
||||
ASSET_RPM='{ "name" : "'$RPM_NAME'" , "url" : "'$LNK_BASE$RPM_NAME'" , "filepath" : "/binaries/'$RPM_NAME'" }'
|
||||
ASSET_DEB='{ "name" : "'$DEB_NAME'" , "url" : "'$LNK_BASE$DEB_NAME'" , "filepath" : "/binaries/'$DEB_NAME'" }'
|
||||
ASSET_ZP1='{ "name" : "'$ZP1_NAME'" , "url" : "'$LNK_BASE$ZP1_NAME'" , "filepath" : "/binaries/'$ZP1_NAME'" }'
|
||||
ASSET_ZP2='{ "name" : "'$ZP2_NAME'" , "url" : "'$LNK_BASE$ZP2_NAME'" , "filepath" : "/binaries/'$ZP2_NAME'" }'
|
||||
ASSET_RPM='{ "name" : "'$RPM_NAME'" , "url" : "'$LNK_BASE$RPM_NAME'" , "direct_asset_path" : "/binaries/'$RPM_NAME'" }'
|
||||
ASSET_DEB='{ "name" : "'$DEB_NAME'" , "url" : "'$LNK_BASE$DEB_NAME'" , "direct_asset_path" : "/binaries/'$DEB_NAME'" }'
|
||||
ASSET_ZP1='{ "name" : "'$ZP1_NAME'" , "url" : "'$LNK_BASE$ZP1_NAME'" , "direct_asset_path" : "/binaries/'$ZP1_NAME'" }'
|
||||
ASSET_ZP2='{ "name" : "'$ZP2_NAME'" , "url" : "'$LNK_BASE$ZP2_NAME'" , "direct_asset_path" : "/binaries/'$ZP2_NAME'" }'
|
||||
|
||||
# ASSET_RPM='{ "name" : "'$RPM_NAME'" , "url" : "'$LNK_BASE$RPM_NAME'" }'
|
||||
# ASSET_DEB='{ "name" : "'$DEB_NAME'" , "url" : "'$LNK_BASE$DEB_NAME'" }'
|
||||
|
|
|
@ -1 +1 @@
|
|||
v3.9.25
|
||||
v3.9.26
|
||||
|
|
|
@ -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
|
|
@ -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.
|
||||
|
|
@ -351,6 +351,9 @@ type
|
|||
// Converts the delta between two calls to GetTickCount64 to a string indicating a duration.
|
||||
function formatTicksAsDuration(ticks: UInt64): string;
|
||||
|
||||
// Returns wether runing in a dark DE
|
||||
function isDarkDE(): boolean;
|
||||
|
||||
(**
|
||||
* Compares two TPoints.
|
||||
*)
|
||||
|
@ -1562,6 +1565,11 @@ begin
|
|||
result += value[p .. value.length];
|
||||
end;
|
||||
|
||||
function isDarkDE(): boolean;
|
||||
begin
|
||||
result := clBackground < clCaptionText;
|
||||
end;
|
||||
|
||||
{$IFDEF DEBUG}
|
||||
initialization
|
||||
|
||||
|
|
|
@ -22,9 +22,12 @@ type
|
|||
private
|
||||
function getIndex: integer;
|
||||
protected
|
||||
fFixedCaption: string;
|
||||
procedure realSetText(const Value: TCaption); override;
|
||||
procedure setFixedCaption(const value: string);
|
||||
public
|
||||
property index: integer read getIndex;
|
||||
property fixedCaption: string read fFixedCaption write setFixedCaption;
|
||||
end;
|
||||
|
||||
TPageControlOption = (poPageHistory, poBottomHeader, poFlatButtons);
|
||||
|
@ -171,16 +174,26 @@ procedure TDexedPage.RealSetText(const Value: TCaption);
|
|||
var
|
||||
i: integer;
|
||||
ctrl: TDexedPageControl;
|
||||
v : string;
|
||||
begin
|
||||
inherited;
|
||||
v := value;
|
||||
if fFixedCaption.isNotEmpty then
|
||||
v := fFixedCaption;
|
||||
inherited RealSetText(v);
|
||||
ctrl := TDexedPageControl(owner);
|
||||
i := ctrl.getPageIndex(self);
|
||||
ctrl.fTabs.BeginUpdate;
|
||||
if i <> -1 then
|
||||
ctrl.fTabs.Tabs[i] := value;
|
||||
ctrl.fTabs.Tabs[i] := v;
|
||||
ctrl.fTabs.EndUpdate;
|
||||
end;
|
||||
|
||||
procedure TDexedPage.setFixedCaption(const value: string);
|
||||
begin
|
||||
fFixedCaption:= value;
|
||||
caption := value;
|
||||
end;
|
||||
|
||||
constructor TDexedPageControl.Create(aowner: TComponent);
|
||||
begin
|
||||
inherited;
|
||||
|
|
|
@ -648,7 +648,7 @@ begin
|
|||
// double quoted strings | raw double quoted strings
|
||||
if (fCurrRange.notInExclusiveRange()) and readDelim(reader, fTokStop, stringPrefixes) then
|
||||
begin
|
||||
if readerPrev^ in ['r','x'] then
|
||||
if readerPrev^ in ['r','x','i'] then
|
||||
begin
|
||||
fCurrRange.rString := reader^ = 'r';
|
||||
if not (readerNext^ = '"') then
|
||||
|
@ -747,7 +747,7 @@ begin
|
|||
end;
|
||||
|
||||
// token string
|
||||
if readDelim(reader, fTokStop, 'q{') then
|
||||
if readDelim(reader, fTokStop, 'q{') or readDelim(reader, fTokStop, 'iq{') then
|
||||
begin
|
||||
fTokKind := tkSymbl;
|
||||
StartCodeFoldBlock(nil, fkBrackets in fFoldKinds);
|
||||
|
|
|
@ -38,7 +38,6 @@ type
|
|||
fProj: ICommonProject;
|
||||
fPortAsProcParam: string;
|
||||
fVersion: TSemVer;
|
||||
fCanRemove: boolean;
|
||||
procedure killServer;
|
||||
procedure terminateClient; {$IFNDEF DEBUG}inline;{$ENDIF}
|
||||
procedure waitClient; {$IFNDEF DEBUG}inline;{$ENDIF}
|
||||
|
@ -105,7 +104,7 @@ var
|
|||
begin
|
||||
inherited;
|
||||
|
||||
fVersion.init('v0.0.0');
|
||||
fVersion.init('v0.0.0', false);
|
||||
fname := getDocPath + optsname;
|
||||
if fname.fileExists then
|
||||
loadFromFile(fname);
|
||||
|
@ -137,16 +136,6 @@ begin
|
|||
fTempLines := TStringList.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
|
||||
begin
|
||||
fServer.Execute;
|
||||
|
@ -442,8 +431,6 @@ end;
|
|||
|
||||
procedure TDcdWrapper.remImportFolder(const folder: string);
|
||||
begin
|
||||
if not fCanRemove then
|
||||
exit;
|
||||
if not fAvailable or not fServerListening or not fImportCache.contains(folder) then
|
||||
exit;
|
||||
|
||||
|
@ -460,8 +447,6 @@ var
|
|||
i: string;
|
||||
c: integer;
|
||||
begin
|
||||
if not fCanRemove then
|
||||
exit;
|
||||
if not fAvailable or not fServerListening then
|
||||
exit;
|
||||
|
||||
|
|
|
@ -308,7 +308,10 @@ begin
|
|||
if fDoc.isNotAssigned then
|
||||
exit;
|
||||
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;
|
||||
end;
|
||||
|
||||
fBackup.Assign(fDoc.Lines);
|
||||
prc := TProcess.create(nil);
|
||||
|
|
|
@ -41,7 +41,10 @@ begin
|
|||
editor.Gutter.LineNumberPart.Visible:=false;
|
||||
|
||||
if ed.isAssigned then
|
||||
begin
|
||||
editor.Font.Assign(ed.Font);
|
||||
editor.Color := ed.Color;
|
||||
end;
|
||||
|
||||
p := TProcess.Create(self);
|
||||
try
|
||||
|
|
|
@ -55,20 +55,20 @@ type
|
|||
keywordsMap = record
|
||||
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
|
||||
- map length: 512
|
||||
- case sensitive: true
|
||||
}
|
||||
|
||||
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 =
|
||||
(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 =
|
||||
(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}
|
||||
public
|
||||
class function match(const w: string): boolean; static; {$IFNDEF DEBUG}inline;{$ENDIF}
|
||||
|
|
|
@ -12,7 +12,7 @@ type
|
|||
|
||||
const
|
||||
stringPostfixes: TCharSet = ['c', 'w', 'd'];
|
||||
stringPrefixes: TCharSet = ['r', 'x', '"'];
|
||||
stringPrefixes: TCharSet = ['r', 'x', 'i', '"'];
|
||||
stringStopChecks: TCharSet = ['\', '"'];
|
||||
charStopChecks: TCharSet = ['\', #39];
|
||||
symbChars: TCharSet = [';', '{', '}', '(', ')', '[', ']', ',', '.', ':', '?', '$', '"', #39];
|
||||
|
|
|
@ -326,9 +326,9 @@ var
|
|||
begin
|
||||
v := new(PSemVer);
|
||||
if value = 'vmaster' then
|
||||
v^.init('v0.0.0-master')
|
||||
v^.init('v0.0.0-master', false)
|
||||
else try
|
||||
v^.init(value);
|
||||
v^.init(value, true);
|
||||
except
|
||||
dispose(v);
|
||||
exit;
|
||||
|
@ -1726,18 +1726,18 @@ procedure TDubProject.updateImportPathsFromJson;
|
|||
p := '0.0.0';
|
||||
end
|
||||
else if (p = 'master') or (v = '~master') then
|
||||
q.init('v0.0.0-master')
|
||||
q.init('v0.0.0-master', false)
|
||||
else
|
||||
begin
|
||||
try
|
||||
q.init('v' + p);
|
||||
q.init('v' + p, true);
|
||||
except
|
||||
// while editing a DUB project from the DUB project editor,
|
||||
// '<value>', i.e "undefined JSON value" can be found here.
|
||||
// So get DUB to fetch the most recent if the 'autoFetch' IDE option
|
||||
// is ON, even if another version is set later.
|
||||
o := '>=';
|
||||
q.init('v0.0.0');
|
||||
q.init('v0.0.0', false);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
|
@ -10,13 +10,14 @@ inherited EditorWidget: TEditorWidget
|
|||
OnShow = FormShow
|
||||
inherited Content: TPanel
|
||||
Height = 398
|
||||
Top = 36
|
||||
Width = 465
|
||||
ClientHeight = 398
|
||||
ClientWidth = 465
|
||||
object editorStatus: TStatusBar[0]
|
||||
Left = 0
|
||||
Height = 19
|
||||
Top = 377
|
||||
Height = 20
|
||||
Top = 376
|
||||
Width = 465
|
||||
BorderSpacing.Bottom = 2
|
||||
Panels = <
|
||||
|
@ -45,20 +46,19 @@ inherited EditorWidget: TEditorWidget
|
|||
end
|
||||
end
|
||||
inherited toolbar: TDexedToolBar
|
||||
Height = 30
|
||||
Width = 457
|
||||
end
|
||||
inherited contextMenu: TPopupMenu
|
||||
Left = 24
|
||||
Top = 16
|
||||
end
|
||||
object macRecorder: TSynMacroRecorder[2]
|
||||
object macRecorder: TSynMacroRecorder[3]
|
||||
RecordShortCut = 0
|
||||
PlaybackShortCut = 0
|
||||
Left = 80
|
||||
Top = 16
|
||||
end
|
||||
object mnuEditor: TPopupMenu[3]
|
||||
object mnuEditor: TPopupMenu[4]
|
||||
OnPopup = mnuEditorPopup
|
||||
Left = 152
|
||||
Top = 16
|
||||
|
@ -81,13 +81,17 @@ inherited EditorWidget: TEditorWidget
|
|||
Caption = 'Undo'
|
||||
OnClick = mnuedUndoClick
|
||||
end
|
||||
object mnuedUndoAll: TMenuItem
|
||||
Caption = 'Undo all'
|
||||
OnClick = mnuedUndoAllClick
|
||||
end
|
||||
object mnuedRedo: TMenuItem
|
||||
Caption = 'Redo'
|
||||
OnClick = mnuedRedoClick
|
||||
end
|
||||
object enuItemRedoAll: TMenuItem
|
||||
object mnuedRedoAll: TMenuItem
|
||||
Caption = 'Redo all'
|
||||
OnClick = enuItemRedoAllClick
|
||||
OnClick = mnuedRedoAllClick
|
||||
end
|
||||
object MenuItem11: TMenuItem
|
||||
Caption = '-'
|
||||
|
@ -280,7 +284,7 @@ inherited EditorWidget: TEditorWidget
|
|||
OnClick = MenuItem8Click
|
||||
end
|
||||
end
|
||||
object mnuCurFile: TPopupMenu[4]
|
||||
object mnuCurFile: TPopupMenu[5]
|
||||
Left = 216
|
||||
Top = 16
|
||||
object mnuCurFileShowInMiniExpl: TMenuItem
|
||||
|
|
|
@ -62,7 +62,8 @@ type
|
|||
MenuItem14: TMenuItem;
|
||||
MenuItem15: TMenuItem;
|
||||
MenuItem16: TMenuItem;
|
||||
enuItemRedoAll: TMenuItem;
|
||||
mnuedRedoAll: TMenuItem;
|
||||
mnuedUndoAll: TMenuItem;
|
||||
mnuCurFileCopyName: TMenuItem;
|
||||
mnuCurFileShowInMiniExpl: TMenuItem;
|
||||
mnuCurFileShellOpen: TMenuItem;
|
||||
|
@ -113,7 +114,7 @@ type
|
|||
editorStatus: TStatusBar;
|
||||
mnuEditor: TPopupMenu;
|
||||
mnuCurFile: TPopupMenu;
|
||||
procedure enuItemRedoAllClick(Sender: TObject);
|
||||
procedure mnuedRedoAllClick(Sender: TObject);
|
||||
procedure FormShortCut(var Msg: TLMKey; var Handled: Boolean);
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure mnuCurFileCopyNameClick(Sender: TObject);
|
||||
|
@ -134,6 +135,7 @@ type
|
|||
procedure mnuEdShowSpecClick(Sender: TObject);
|
||||
procedure mnuedSortLinesClick(Sender: TObject);
|
||||
procedure mnuEdTabWidth2Click(Sender: TObject);
|
||||
procedure mnuedUndoAllClick(Sender: TObject);
|
||||
procedure mnuedUpcaseClick(Sender: TObject);
|
||||
procedure MenuItem5Click(Sender: TObject);
|
||||
procedure MenuItem6Click(Sender: TObject);
|
||||
|
@ -203,6 +205,7 @@ type
|
|||
procedure openDocument(const fname: string);
|
||||
function closeDocument(index: Integer;promptOnChanged: boolean = true): boolean;
|
||||
function closeDocument(doc: TDexedMemo;promptOnChanged: boolean = true): boolean;
|
||||
procedure forceCaption(doc: TDexedMemo; value: string);
|
||||
public
|
||||
constructor create(aOwner: TComponent); override;
|
||||
destructor destroy; override;
|
||||
|
@ -360,7 +363,9 @@ begin
|
|||
AssignPng(mnuedCut.Bitmap, 'CUT');
|
||||
AssignPng(mnuedPaste.Bitmap, 'PASTE');
|
||||
AssignPng(mnuedUndo.Bitmap, 'ARROW_UNDO');
|
||||
AssignPng(mnuedUndoAll.Bitmap, 'ARROW_UNDO');
|
||||
AssignPng(mnuedRedo.Bitmap, 'ARROW_REDO');
|
||||
AssignPng(mnuedRedoAll.Bitmap, 'ARROW_REDO');
|
||||
AssignPng(mnuedJum2Decl.Bitmap, 'ARROW_SHOE');
|
||||
AssignPng(mnuedCopy.Bitmap, 'COPY');
|
||||
AssignPng(mnuedNext.Bitmap, 'GO_NEXT');
|
||||
|
@ -388,7 +393,9 @@ begin
|
|||
AssignPng(mnuedCut.Bitmap, 'CUT24');
|
||||
AssignPng(mnuedPaste.Bitmap, 'PASTE24');
|
||||
AssignPng(mnuedUndo.Bitmap, 'ARROW_UNDO24');
|
||||
AssignPng(mnuedUndoAll.Bitmap, 'ARROW_UNDO24');
|
||||
AssignPng(mnuedRedo.Bitmap, 'ARROW_REDO24');
|
||||
AssignPng(mnuedRedoAll.Bitmap, 'ARROW_REDO24');
|
||||
//AssignPng(mnuedJum2Decl.Bitmap, 'ARROW_SHOE24');
|
||||
AssignPng(mnuedCopy.Bitmap, 'COPY24');
|
||||
AssignPng(mnuedNext.Bitmap, 'GO_NEXT24');
|
||||
|
@ -416,7 +423,9 @@ begin
|
|||
AssignPng(mnuedCut.Bitmap, 'CUT32');
|
||||
AssignPng(mnuedPaste.Bitmap, 'PASTE32');
|
||||
AssignPng(mnuedUndo.Bitmap, 'ARROW_UNDO32');
|
||||
AssignPng(mnuedUndoAll.Bitmap, 'ARROW_UNDO32');
|
||||
AssignPng(mnuedRedo.Bitmap, 'ARROW_REDO32');
|
||||
AssignPng(mnuedRedoAll.Bitmap, 'ARROW_REDO32');
|
||||
//AssignPng(mnuedJum2Decl.Bitmap, 'ARROW_SHOE32');
|
||||
AssignPng(mnuedCopy.Bitmap, 'COPY32');
|
||||
AssignPng(mnuedNext.Bitmap, 'GO_NEXT32');
|
||||
|
@ -661,6 +670,11 @@ begin
|
|||
exit(false);
|
||||
exit(closeDocument(page.index, promptOnChanged));
|
||||
end;
|
||||
|
||||
procedure TEditorWidget.forceCaption(doc: TDexedMemo; value: string);
|
||||
begin
|
||||
TDexedPage(doc.Parent).fixedCaption := value;
|
||||
end;
|
||||
{$ENDREGION}
|
||||
|
||||
{$REGION PageControl/Editor things ---------------------------------------------}
|
||||
|
@ -1043,6 +1057,12 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
procedure TEditorWidget.mnuedUndoAllClick(Sender: TObject);
|
||||
begin
|
||||
if fDoc.isAssigned then
|
||||
fDoc.undoAll();
|
||||
end;
|
||||
|
||||
procedure TEditorWidget.mnuedNextCareaClick(Sender: TObject);
|
||||
begin
|
||||
if fDoc.isAssigned then
|
||||
|
@ -1092,7 +1112,7 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
procedure TEditorWidget.enuItemRedoAllClick(Sender: TObject);
|
||||
procedure TEditorWidget.mnuedRedoAllClick(Sender: TObject);
|
||||
begin
|
||||
if fDoc.isAssigned then
|
||||
fDoc.redoAll();
|
||||
|
@ -1259,7 +1279,9 @@ begin
|
|||
mnuedPaste.Enabled:=fDoc.CanPaste;
|
||||
mnuedCopy.Enabled:=fDoc.SelAvail;
|
||||
mnuedUndo.Enabled:=fDoc.CanUndo;
|
||||
mnuedUndoAll.Enabled:=fDoc.CanUndo;
|
||||
mnuedRedo.Enabled:=fDoc.CanRedo;
|
||||
mnuedRedoAll.Enabled:=fDoc.CanRedo;
|
||||
mnuedJum2Decl.Enabled:=fDoc.isDSource;
|
||||
|
||||
mnuEdSetSpaces.Checked:= eoTabsToSpaces in fDoc.Options;
|
||||
|
|
114
src/u_gdb.lfm
114
src/u_gdb.lfm
|
@ -8,36 +8,37 @@ inherited GdbWidget: TGdbWidget
|
|||
ClientWidth = 672
|
||||
inherited Content: TPanel
|
||||
Height = 626
|
||||
Top = 42
|
||||
Width = 672
|
||||
ClientHeight = 626
|
||||
ClientWidth = 672
|
||||
object Panel1: TPanel[0]
|
||||
Left = 0
|
||||
Height = 386
|
||||
Height = 383
|
||||
Top = 205
|
||||
Width = 672
|
||||
Align = alClient
|
||||
AutoSize = True
|
||||
BevelOuter = bvNone
|
||||
ClientHeight = 386
|
||||
ClientHeight = 383
|
||||
ClientWidth = 672
|
||||
TabOrder = 0
|
||||
object GroupBox3: TGroupBox
|
||||
Left = 0
|
||||
Height = 180
|
||||
Height = 177
|
||||
Top = 206
|
||||
Width = 672
|
||||
Align = alClient
|
||||
Caption = 'CPU'
|
||||
ClientHeight = 161
|
||||
ClientWidth = 668
|
||||
ClientHeight = 158
|
||||
ClientWidth = 670
|
||||
TabOrder = 0
|
||||
object cpuViewer: TTIPropertyGrid
|
||||
Left = 0
|
||||
Height = 161
|
||||
Height = 158
|
||||
Hint = 'cpu registers'
|
||||
Top = 0
|
||||
Width = 668
|
||||
Width = 670
|
||||
Align = alClient
|
||||
CheckboxForBoolean = True
|
||||
DefaultValueFont.Color = clWindowText
|
||||
|
@ -70,25 +71,25 @@ inherited GdbWidget: TGdbWidget
|
|||
OnChange = PageControl2Change
|
||||
object TabSheet3: TTabSheet
|
||||
Caption = 'Variables'
|
||||
ClientHeight = 173
|
||||
ClientWidth = 670
|
||||
ClientHeight = 168
|
||||
ClientWidth = 662
|
||||
object lstVariables: TListView
|
||||
Left = 2
|
||||
Height = 140
|
||||
Top = 31
|
||||
Width = 666
|
||||
Height = 132
|
||||
Top = 34
|
||||
Width = 658
|
||||
Align = alClient
|
||||
BorderSpacing.Around = 2
|
||||
Columns = <
|
||||
item
|
||||
AutoSize = True
|
||||
Caption = 'name'
|
||||
Width = 43
|
||||
Width = 52
|
||||
end
|
||||
item
|
||||
AutoSize = True
|
||||
Caption = 'value'
|
||||
Width = 621
|
||||
Width = 604
|
||||
end>
|
||||
GridLines = True
|
||||
HideSelection = False
|
||||
|
@ -102,10 +103,10 @@ inherited GdbWidget: TGdbWidget
|
|||
end
|
||||
object varListFlt: TListViewFilterEdit
|
||||
Left = 2
|
||||
Height = 27
|
||||
Height = 30
|
||||
Hint = 'locate variables'
|
||||
Top = 2
|
||||
Width = 666
|
||||
Width = 658
|
||||
ButtonWidth = 24
|
||||
Align = alTop
|
||||
BorderSpacing.Around = 2
|
||||
|
@ -117,13 +118,13 @@ inherited GdbWidget: TGdbWidget
|
|||
end
|
||||
object TabSheet4: TTabSheet
|
||||
Caption = 'Assembler'
|
||||
ClientHeight = 173
|
||||
ClientWidth = 670
|
||||
ClientHeight = 168
|
||||
ClientWidth = 662
|
||||
object lstAsm: TListView
|
||||
Left = 2
|
||||
Height = 169
|
||||
Height = 164
|
||||
Top = 2
|
||||
Width = 666
|
||||
Width = 658
|
||||
Align = alClient
|
||||
AutoSort = False
|
||||
AutoWidthLastColumn = True
|
||||
|
@ -132,11 +133,11 @@ inherited GdbWidget: TGdbWidget
|
|||
item
|
||||
AutoSize = True
|
||||
Caption = 'address'
|
||||
Width = 57
|
||||
Width = 64
|
||||
end
|
||||
item
|
||||
Caption = 'instruction'
|
||||
Width = 607
|
||||
Width = 592
|
||||
end>
|
||||
GridLines = True
|
||||
HideSelection = False
|
||||
|
@ -151,19 +152,19 @@ inherited GdbWidget: TGdbWidget
|
|||
end
|
||||
object Panel3: TPanel[1]
|
||||
Left = 4
|
||||
Height = 27
|
||||
Top = 595
|
||||
Height = 30
|
||||
Top = 592
|
||||
Width = 664
|
||||
Align = alBottom
|
||||
AutoSize = True
|
||||
BorderSpacing.Around = 4
|
||||
BevelOuter = bvNone
|
||||
ClientHeight = 27
|
||||
ClientHeight = 30
|
||||
ClientWidth = 664
|
||||
TabOrder = 1
|
||||
object btnSendCom: TSpeedButton
|
||||
Left = 659
|
||||
Height = 25
|
||||
Height = 28
|
||||
Top = 1
|
||||
Width = 4
|
||||
Align = alRight
|
||||
|
@ -173,7 +174,7 @@ inherited GdbWidget: TGdbWidget
|
|||
end
|
||||
object Edit1: TComboBox
|
||||
Left = 0
|
||||
Height = 27
|
||||
Height = 30
|
||||
Hint = 'enter a custom GDB command or the program input with ">"'
|
||||
Top = 0
|
||||
Width = 658
|
||||
|
@ -209,14 +210,14 @@ inherited GdbWidget: TGdbWidget
|
|||
TabOrder = 3
|
||||
object TabSheet1: TTabSheet
|
||||
Caption = 'Call stack'
|
||||
ClientHeight = 173
|
||||
ClientWidth = 670
|
||||
ClientHeight = 168
|
||||
ClientWidth = 662
|
||||
object lstCallStack: TListView
|
||||
Left = 0
|
||||
Height = 173
|
||||
Height = 168
|
||||
Hint = 'call stack'
|
||||
Top = 0
|
||||
Width = 670
|
||||
Width = 662
|
||||
Align = alClient
|
||||
AutoSort = False
|
||||
Columns = <
|
||||
|
@ -246,14 +247,14 @@ inherited GdbWidget: TGdbWidget
|
|||
end
|
||||
object TabSheet2: TTabSheet
|
||||
Caption = 'Thread list'
|
||||
ClientHeight = 173
|
||||
ClientWidth = 670
|
||||
ClientHeight = 168
|
||||
ClientWidth = 662
|
||||
object lstThreads: TListView
|
||||
Left = 0
|
||||
Height = 173
|
||||
Height = 168
|
||||
Hint = 'call stack'
|
||||
Top = 0
|
||||
Width = 670
|
||||
Width = 662
|
||||
Align = alClient
|
||||
AutoSort = False
|
||||
AutoWidthLastColumn = True
|
||||
|
@ -261,36 +262,36 @@ inherited GdbWidget: TGdbWidget
|
|||
item
|
||||
AutoSize = True
|
||||
Caption = 'id'
|
||||
Width = 18
|
||||
Width = 26
|
||||
end
|
||||
item
|
||||
AutoSize = True
|
||||
Caption = 'state'
|
||||
Width = 39
|
||||
Width = 48
|
||||
end
|
||||
item
|
||||
AutoSize = True
|
||||
Caption = 'core'
|
||||
Width = 34
|
||||
Width = 43
|
||||
end
|
||||
item
|
||||
AutoSize = True
|
||||
Caption = 'function'
|
||||
Width = 59
|
||||
Width = 71
|
||||
end
|
||||
item
|
||||
AutoSize = True
|
||||
Caption = 'address'
|
||||
Width = 57
|
||||
Width = 64
|
||||
end
|
||||
item
|
||||
AutoSize = True
|
||||
Caption = 'filename'
|
||||
Width = 64
|
||||
Width = 73
|
||||
end
|
||||
item
|
||||
Caption = 'line'
|
||||
Width = 397
|
||||
Width = 335
|
||||
end>
|
||||
GridLines = True
|
||||
ReadOnly = True
|
||||
|
@ -302,13 +303,13 @@ inherited GdbWidget: TGdbWidget
|
|||
end
|
||||
object TabSheet5: TTabSheet
|
||||
Caption = 'Debugee options'
|
||||
ClientHeight = 173
|
||||
ClientWidth = 670
|
||||
ClientHeight = 168
|
||||
ClientWidth = 662
|
||||
object dbgeeOptsEd: TTIPropertyGrid
|
||||
Left = 2
|
||||
Height = 169
|
||||
Height = 164
|
||||
Top = 2
|
||||
Width = 666
|
||||
Width = 658
|
||||
Align = alClient
|
||||
BorderSpacing.Around = 2
|
||||
CheckboxForBoolean = True
|
||||
|
@ -325,7 +326,7 @@ inherited GdbWidget: TGdbWidget
|
|||
end
|
||||
end
|
||||
inherited toolbar: TDexedToolBar
|
||||
Height = 30
|
||||
Top = 10
|
||||
Width = 664
|
||||
object btnStack: TDexedToolButton[0]
|
||||
Left = 238
|
||||
|
@ -457,7 +458,7 @@ inherited GdbWidget: TGdbWidget
|
|||
scaledSeparator = False
|
||||
end
|
||||
end
|
||||
object Splitter2: TSplitter[1]
|
||||
object Splitter2: TSplitter[2]
|
||||
Cursor = crVSplit
|
||||
Left = 0
|
||||
Height = 6
|
||||
|
@ -466,11 +467,11 @@ inherited GdbWidget: TGdbWidget
|
|||
Align = alTop
|
||||
ResizeAnchor = akTop
|
||||
end
|
||||
inherited contextMenu: TPopupMenu[2]
|
||||
inherited contextMenu: TPopupMenu[3]
|
||||
Left = 56
|
||||
Top = 64
|
||||
end
|
||||
object mnuProjRunnable: TPopupMenu[3]
|
||||
object mnuProjRunnable: TPopupMenu[4]
|
||||
Left = 56
|
||||
Top = 112
|
||||
object mnuSelProj: TMenuItem
|
||||
|
@ -489,8 +490,11 @@ inherited GdbWidget: TGdbWidget
|
|||
Caption = 'Debug custom executable...'
|
||||
OnClick = mnuSelCustomClick
|
||||
end
|
||||
object mnuDebugRecent: TMenuItem
|
||||
Caption = 'Debug recent executable'
|
||||
end
|
||||
end
|
||||
object mnuWatch: TPopupMenu[4]
|
||||
object mnuWatch: TPopupMenu[5]
|
||||
Left = 56
|
||||
Top = 160
|
||||
object mnuReadW: TMenuItem
|
||||
|
@ -510,7 +514,7 @@ inherited GdbWidget: TGdbWidget
|
|||
OnClick = mnuReadWriteWClick
|
||||
end
|
||||
end
|
||||
object mnuNext: TPopupMenu[5]
|
||||
object mnuNext: TPopupMenu[6]
|
||||
Left = 152
|
||||
Top = 112
|
||||
object mnuNextMachine: TMenuItem
|
||||
|
@ -518,7 +522,7 @@ inherited GdbWidget: TGdbWidget
|
|||
Caption = 'machine instruction'
|
||||
end
|
||||
end
|
||||
object mnuStep: TPopupMenu[6]
|
||||
object mnuStep: TPopupMenu[7]
|
||||
Left = 152
|
||||
Top = 160
|
||||
object mnuStepMachine: TMenuItem
|
||||
|
@ -526,7 +530,7 @@ inherited GdbWidget: TGdbWidget
|
|||
Caption = 'machine instruction'
|
||||
end
|
||||
end
|
||||
object mnuEval: TPopupMenu[7]
|
||||
object mnuEval: TPopupMenu[8]
|
||||
Left = 216
|
||||
Top = 168
|
||||
object mnuEvalSelected: TMenuItem
|
||||
|
@ -546,7 +550,7 @@ inherited GdbWidget: TGdbWidget
|
|||
OnClick = mnuEvalCustomClick
|
||||
end
|
||||
end
|
||||
object mnuEvalCompletion: TPopupMenu[8]
|
||||
object mnuEvalCompletion: TPopupMenu[9]
|
||||
Left = 288
|
||||
Top = 168
|
||||
end
|
||||
|
|
|
@ -8,7 +8,7 @@ uses
|
|||
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, RegExpr, ComCtrls,
|
||||
PropEdits, GraphPropEdits, RTTIGrids, Dialogs, ExtCtrls, Menus, Buttons,
|
||||
StdCtrls, process, fpjson, typinfo, {$IFDEF UNIX}Unix,{$ELSE} Windows,{$ENDIF}
|
||||
ListViewFilterEdit, SynEdit, ObjectInspector, math,
|
||||
ListViewFilterEdit, SynEdit, ObjectInspector, math, u_mru,
|
||||
u_common, u_interfaces, u_widget, u_processes, u_observer, u_synmemo,
|
||||
u_sharedres, u_stringrange, u_dsgncontrols, u_dialogs, u_dbgitf,
|
||||
u_ddemangle, u_writableComponent, EditBtn, strutils, u_controls;
|
||||
|
@ -319,11 +319,13 @@ type
|
|||
fGdbPath: TFilename;
|
||||
fUseCustomCommandsHistory: boolean;
|
||||
fAutoDotCompletion: boolean;
|
||||
fDebugRecentMru: TMRUFileList;
|
||||
procedure setIgnoredSignals(value: TStringList);
|
||||
procedure setCommandsHistory(value: TStringList);
|
||||
procedure setCustomEvalHistory(value: TStringList);
|
||||
procedure setShortcuts(value: TDebugShortcuts);
|
||||
procedure setMaxCallStackDepth(value: integer);
|
||||
procedure setDebugRecentMru(value: TMRUFileList);
|
||||
procedure cleanInvalidHistoryEntries;
|
||||
published
|
||||
property asmSyntax: TAsmSyntax read fAsmSyntax write fAsmSyntax;
|
||||
|
@ -338,6 +340,7 @@ type
|
|||
property coreBreakingSymbols: TDlangBreakpoints read fDlangBreakpoints write fDlangBreakpoints;
|
||||
property currentEvalKind: TGdbEvalKind read fCurrentEvalKind write fCurrentEvalKind;
|
||||
property customEvalHistory: TStringList read fCustomEvalHistory write setCustomEvalHistory;
|
||||
property debugRecentMru: TMRUFileList read fDebugRecentMru write setDebugRecentMru;
|
||||
property gdbPath: TFilename read fGdbPath write fGdbPath;
|
||||
property hideCpuView: boolean read fHideCpuView write fHideCpuView default false;
|
||||
property ignoredSignals: TStringList read fIgnoredSignals write setIgnoredSignals;
|
||||
|
@ -437,6 +440,7 @@ type
|
|||
Edit1: TComboBox;
|
||||
GroupBox3: TGroupBox;
|
||||
lstThreads: TListView;
|
||||
mnuDebugRecent: TMenuItem;
|
||||
mnuSelCustom: TMenuItem;
|
||||
mnuEvalDeref: TMenuItem;
|
||||
mnuEvalSelected: TMenuItem;
|
||||
|
@ -604,6 +608,10 @@ type
|
|||
function evaluate(const exp: string): string;
|
||||
procedure executeFromShortcut(sender: TObject);
|
||||
procedure itemCompletetionClick(sender: TObject);
|
||||
procedure mruDebugRecentChange(Sender: TObject);
|
||||
procedure mruDebugRecentClick(Sender: TObject);
|
||||
procedure mruDebugRecentClearClick(Sender: TObject);
|
||||
procedure mruDebugRecentDeleteInvalidClick(Sender: TObject);
|
||||
public
|
||||
constructor create(aOwner: TComponent); override;
|
||||
destructor destroy; override;
|
||||
|
@ -717,6 +725,7 @@ begin
|
|||
fCustomEvalHistory := TstringList.Create;
|
||||
fCustomEvalHistory.Duplicates:= dupIgnore;
|
||||
fCustomEvalHistory.Sorted:=true;
|
||||
fDebugRecentMru := TMRUFileList.create;
|
||||
for d in [low(TDlangBreakpoint) .. high(TDlangBreakpoint)] do
|
||||
include(fDlangBreakpoints, d);
|
||||
end;
|
||||
|
@ -727,6 +736,7 @@ begin
|
|||
fCommandsHistory.Free;
|
||||
fCustomEvalHistory.Free;
|
||||
fShortcuts.Free;
|
||||
fDebugRecentMru.free;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
|
@ -769,6 +779,11 @@ begin
|
|||
fShortcuts.assign(value);
|
||||
end;
|
||||
|
||||
procedure TDebugOptionsBase.setDebugRecentMru(value: TMRUFileList);
|
||||
begin
|
||||
fDebugRecentMru.assign(value);
|
||||
end;
|
||||
|
||||
procedure TDebugOptionsBase.setMaxCallStackDepth(value: integer);
|
||||
begin
|
||||
value := max(1, value);
|
||||
|
@ -801,6 +816,7 @@ begin
|
|||
fCurrentEvalKind := src.fCurrentEvalKind;
|
||||
fUseCustomCommandsHistory:= src.fUseCustomCommandsHistory;
|
||||
fAutoDotCompletion:=src.fAutoDotCompletion;
|
||||
fDebugRecentMru.assign(src.fDebugRecentMru);
|
||||
end
|
||||
else inherited;
|
||||
end;
|
||||
|
@ -1278,6 +1294,7 @@ begin
|
|||
fSubj:= TDebugObserverSubject.Create;
|
||||
fOptions:= TDebugOptions.create(self);
|
||||
fOptions.onChangesApplied:=@optionsChangesApplied;
|
||||
fOptions.debugRecentMru.OnChange:=@mruDebugRecentChange;
|
||||
fDebugeeOptions:= TDebugeeOptions.Create(self);
|
||||
Edit1.Items.Assign(fOptions.commandsHistory);
|
||||
fAddWatchPointKind := wpkWrite;
|
||||
|
@ -1324,6 +1341,7 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
mruDebugRecentChange(nil);
|
||||
updateCpuViewVisibility;
|
||||
updateMenu;
|
||||
updateButtonsState;
|
||||
|
@ -2023,6 +2041,7 @@ begin
|
|||
fLastFunction := '';
|
||||
// gdb process
|
||||
killGdb;
|
||||
fOptions.debugRecentMru.Insert(0, fExe);
|
||||
fGdb := TDexedProcess.create(nil);
|
||||
fGdb.Executable:= gdb;
|
||||
fgdb.Options:= [poUsePipes, poStderrToOutPut];
|
||||
|
@ -3064,6 +3083,72 @@ begin
|
|||
Edit1.Text := (sender as TMenuItem).Caption;
|
||||
end;
|
||||
|
||||
procedure TGdbWidget.mruDebugRecentChange(Sender: TObject);
|
||||
var
|
||||
srcLst: TMRUFileList;
|
||||
itm: TMenuItem;
|
||||
fname: string;
|
||||
i: integer;
|
||||
s: string;
|
||||
begin
|
||||
srcLst := fOptions.debugRecentMru;
|
||||
mnuDebugRecent.Clear;
|
||||
for i := 0 to srcLst.Count-1 do
|
||||
begin
|
||||
s := srcLst.Strings[i];
|
||||
fname := s.extractFileName;
|
||||
itm := TMenuItem.Create(mnuDebugRecent);
|
||||
itm.Hint := s;
|
||||
itm.Caption := fname + ' - (' + itm.Hint + ')';
|
||||
itm.OnClick := @mruDebugRecentClick;
|
||||
mnuDebugRecent.Add(itm);
|
||||
end;
|
||||
|
||||
mnuDebugRecent.AddSeparator;
|
||||
itm := TMenuItem.Create(mnuDebugRecent);
|
||||
itm.Caption := 'Clear all';
|
||||
itm.OnClick := @mruDebugRecentClearClick;
|
||||
itm.Tag := PtrInt(srcLst);
|
||||
mnuDebugRecent.Add(itm);
|
||||
|
||||
itm := TMenuItem.Create(mnuDebugRecent);
|
||||
itm.Caption := 'Remove invalid entries';
|
||||
itm.OnClick := @mruDebugRecentDeleteInvalidClick;
|
||||
itm.Tag := PtrInt(srcLst);
|
||||
mnuDebugRecent.Add(itm);
|
||||
end;
|
||||
|
||||
procedure TGdbWidget.mruDebugRecentClick(Sender: TObject);
|
||||
begin
|
||||
fCustomTargetFile := TMenuItem(sender).Hint;
|
||||
fDebugTargetKind := dtkCustom;
|
||||
mnuSelProj.Checked:=false;
|
||||
mnuSelRunnable.Checked:=false;
|
||||
mnuSelCustom.Checked:=true;
|
||||
updateDebugeeOptionsEditor;
|
||||
btnStart.Click();
|
||||
end;
|
||||
|
||||
procedure TGdbWidget.mruDebugRecentClearClick(Sender: TObject);
|
||||
begin
|
||||
mnuDebugRecent.Clear;
|
||||
end;
|
||||
|
||||
procedure TGdbWidget.mruDebugRecentDeleteInvalidClick(Sender: TObject);
|
||||
var
|
||||
srcLst: TMRUFileList;
|
||||
i: integer;
|
||||
begin
|
||||
srcLst := fOptions.debugRecentMru;
|
||||
if srcLst.isNotAssigned then
|
||||
exit;
|
||||
srcLst.BeginUpdate;
|
||||
for i := srcLst.Count-1 downto 0 do
|
||||
if not srcLst.Strings[i].fileExists then
|
||||
srcLst.Delete(i);
|
||||
srcLst.EndUpdate;
|
||||
end;
|
||||
|
||||
procedure TGdbWidget.btnSendComClick(Sender: TObject);
|
||||
begin
|
||||
sendCustomCommand;
|
||||
|
|
|
@ -320,6 +320,8 @@ type
|
|||
function closeDocument(doc: TDexedMemo; promptOnChanged: boolean = true): boolean;
|
||||
// conveniance property.
|
||||
property document[index: integer]: TDexedMemo read getDocument;
|
||||
// force page caption
|
||||
procedure forceCaption(doc: TDexedMemo; value: string);
|
||||
end;
|
||||
|
||||
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
object MainForm: TMainForm
|
||||
Left = 383
|
||||
Height = 35
|
||||
Height = 34
|
||||
Top = 610
|
||||
Width = 687
|
||||
Width = 673
|
||||
AllowDropFiles = True
|
||||
Caption = 'Dexed'
|
||||
DesignTimePPI = 94
|
||||
Menu = mainMenu
|
||||
OnClose = FormClose
|
||||
OnCloseQuery = FormCloseQuery
|
||||
OnDropFiles = FormDropFiles
|
||||
OnResize = FormResize
|
||||
ShowHint = True
|
||||
LCLVersion = '2.2.4.0'
|
||||
object mainMenu: TMainMenu
|
||||
Top = 1
|
||||
object MenuItem1: TMenuItem
|
||||
|
@ -134,6 +134,9 @@ object MainForm: TMainForm
|
|||
object MenuItem19: TMenuItem
|
||||
Action = actEdUndo
|
||||
end
|
||||
object MenuItem120: TMenuItem
|
||||
Action = actEdUndoAll
|
||||
end
|
||||
object MenuItem20: TMenuItem
|
||||
Action = actEdRedo
|
||||
end
|
||||
|
@ -420,7 +423,7 @@ object MainForm: TMainForm
|
|||
end
|
||||
end
|
||||
object Actions: TActionList
|
||||
Left = 33
|
||||
Left = 32
|
||||
object actEdCopy: TAction
|
||||
Category = 'Edit'
|
||||
Caption = 'Copy'
|
||||
|
@ -450,13 +453,6 @@ object MainForm: TMainForm
|
|||
OnUpdate = updateDocEditBasedAction
|
||||
ShortCut = 16474
|
||||
end
|
||||
object actEdRedo: TAction
|
||||
Category = 'Edit'
|
||||
Caption = 'Redo'
|
||||
OnExecute = actEdRedoExecute
|
||||
OnUpdate = updateDocEditBasedAction
|
||||
ShortCut = 24666
|
||||
end
|
||||
object actFileSave: TAction
|
||||
Category = 'File'
|
||||
Caption = 'Save file'
|
||||
|
@ -816,6 +812,19 @@ object MainForm: TMainForm
|
|||
Caption = 'Check semantics'
|
||||
OnExecute = actProjCheckSemaExecute
|
||||
end
|
||||
object actEdUndoAll: TAction
|
||||
Category = 'Edit'
|
||||
Caption = 'Undo all'
|
||||
OnExecute = actEdUndoAllExecute
|
||||
OnUpdate = updateDocEditBasedAction
|
||||
end
|
||||
object actEdRedo: TAction
|
||||
Category = 'Edit'
|
||||
Caption = 'Redo'
|
||||
OnExecute = actEdRedoExecute
|
||||
OnUpdate = updateDocEditBasedAction
|
||||
ShortCut = 24666
|
||||
end
|
||||
object actEdRedoAll: TAction
|
||||
Category = 'Edit'
|
||||
Caption = 'Redo all'
|
||||
|
@ -875,7 +884,7 @@ object MainForm: TMainForm
|
|||
object ApplicationProperties1: TApplicationProperties
|
||||
OnActivate = ApplicationProperties1Activate
|
||||
OnException = ApplicationProperties1Exception
|
||||
Left = 64
|
||||
Left = 63
|
||||
Top = 1
|
||||
end
|
||||
end
|
||||
|
|
|
@ -16,7 +16,8 @@ uses
|
|||
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_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
|
||||
|
||||
|
@ -118,6 +119,7 @@ type
|
|||
actFileNewClip: TAction;
|
||||
actEdFormat: TAction;
|
||||
actEdRedoAll: TAction;
|
||||
actEdUndoAll: TAction;
|
||||
actProjCheckSema: TAction;
|
||||
actProjSetEnv: TAction;
|
||||
actProjGitPull: TAction;
|
||||
|
@ -188,6 +190,7 @@ type
|
|||
MenuItem117: TMenuItem;
|
||||
MenuItem118: TMenuItem;
|
||||
MenuItem119: TMenuItem;
|
||||
MenuItem120: TMenuItem;
|
||||
mnuGitBranch: TMenuItem;
|
||||
mnuItemDubDialog: TMenuItem;
|
||||
mnuItemHelp: TMenuItem;
|
||||
|
@ -299,6 +302,7 @@ type
|
|||
MenuItem8: TMenuItem;
|
||||
MenuItem9: TMenuItem;
|
||||
procedure actEdFormatExecute(Sender: TObject);
|
||||
procedure actEdUndoAllExecute(Sender: TObject);
|
||||
procedure actFileCloseAllExecute(Sender: TObject);
|
||||
procedure actFileCloseAllOthersExecute(Sender: TObject);
|
||||
procedure actFileCompileExecute(Sender: TObject);
|
||||
|
@ -434,6 +438,7 @@ type
|
|||
fDubProjWidg: TDubProjectEditorWidget;
|
||||
fPrjGrpWidg: TProjectGroupWidget;
|
||||
fGdbWidg: TGdbWidget;
|
||||
fBlameWidg: TBlameWidget;
|
||||
{$IFDEF UNIX}
|
||||
fTermWidg: TTermWidget;
|
||||
{$ENDIF}
|
||||
|
@ -1565,6 +1570,7 @@ begin
|
|||
actFileNewClip.ImageIndex:= i;
|
||||
i := loadIcon('ARROW_UNDO');
|
||||
actEdUndo.ImageIndex:= i;
|
||||
actEdUndoAll.ImageIndex:= i;
|
||||
i := loadIcon('ARROW_REDO');
|
||||
actEdRedo.ImageIndex:= i;
|
||||
actEdRedoAll.ImageIndex:= i;
|
||||
|
@ -1658,6 +1664,7 @@ begin
|
|||
fPrjGrpWidg := TProjectGroupWidget.create(self);
|
||||
fProfWidg := TProfileViewerWidget.create(self);
|
||||
fGdbWidg := TGdbWidget.create(self);
|
||||
fBlameWidg := TBlameWidget.create(self);
|
||||
{$IFDEF UNIX}
|
||||
fTermWidg := TTermWidget.create(self);
|
||||
{$ENDIF}
|
||||
|
@ -1683,6 +1690,7 @@ begin
|
|||
fWidgList.addWidget(@fPrjGrpWidg);
|
||||
fWidgList.addWidget(@fProfWidg);
|
||||
fWidgList.addWidget(@fGdbWidg);
|
||||
fWidgList.addWidget(@fBlameWidg);
|
||||
{$IFDEF UNIX}
|
||||
fWidgList.addWidget(@fTermWidg);
|
||||
{$ENDIF}
|
||||
|
@ -2916,6 +2924,12 @@ begin
|
|||
fDoc.redoAll();
|
||||
end;
|
||||
|
||||
procedure TMainForm.actEdUndoAllExecute(Sender: TObject);
|
||||
begin
|
||||
if fDoc.isAssigned then
|
||||
fDoc.undoAll();
|
||||
end;
|
||||
|
||||
procedure TMainForm.actEdMacPlayExecute(Sender: TObject);
|
||||
begin
|
||||
if fDoc.isAssigned then
|
||||
|
@ -2955,7 +2969,7 @@ begin
|
|||
if fDoc.SelAvail then
|
||||
str := fDoc.SelText
|
||||
else
|
||||
str := fDoc.Identifier;
|
||||
str := fDoc.HighlightedIdent;
|
||||
ffindwidg.cbToFind.Text := str;
|
||||
ffindwidg.cbToFindChange(nil);
|
||||
ffindwidg.cbToFind.SetFocus;
|
||||
|
|
|
@ -84,23 +84,51 @@ inherited MiniExplorerWidget: TMiniExplorerWidget
|
|||
ObjectTypes = [otFolders]
|
||||
ShellListView = lstFiles
|
||||
end
|
||||
object lstFiles: TShellListView
|
||||
object Panel1: TPanel
|
||||
Left = 0
|
||||
Height = 162
|
||||
Top = 224
|
||||
Width = 527
|
||||
Align = alClient
|
||||
Color = clDefault
|
||||
DragMode = dmAutomatic
|
||||
ReadOnly = True
|
||||
ScrollBars = ssAutoBoth
|
||||
SortType = stText
|
||||
Caption = 'Panel1'
|
||||
ClientHeight = 162
|
||||
ClientWidth = 527
|
||||
TabOrder = 2
|
||||
OnColumnClick = lstFilesColumnClick
|
||||
OnDblClick = lstFilesDblClick
|
||||
OnFileAdded = lstFilesFileAdded
|
||||
ObjectTypes = [otNonFolders, otHidden]
|
||||
ShellTreeView = treeFolders
|
||||
object lstFilter: TListViewFilterEdit
|
||||
Left = 3
|
||||
Height = 30
|
||||
Top = 3
|
||||
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
|
||||
|
@ -169,28 +197,12 @@ inherited MiniExplorerWidget: TMiniExplorerWidget
|
|||
resourceName = 'GO_PREVIOUS'
|
||||
scaledSeparator = False
|
||||
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
|
||||
inherited contextMenu: TPopupMenu
|
||||
Left = 40
|
||||
Top = 48
|
||||
end
|
||||
object mnuDrives: TPopupMenu[2]
|
||||
object mnuDrives: TPopupMenu[3]
|
||||
Left = 8
|
||||
Top = 48
|
||||
end
|
||||
|
|
|
@ -22,6 +22,8 @@ type
|
|||
fDblClick: TExplorerDoubleClick;
|
||||
fContextExpand: boolean;
|
||||
fShowHidden: boolean;
|
||||
fShowSize: boolean;
|
||||
fShowType: boolean;
|
||||
fExplorer: TMiniExplorerWidget;
|
||||
function optionedWantCategory(): string;
|
||||
function optionedWantEditorKind: TOptionEditorKind;
|
||||
|
@ -33,6 +35,8 @@ type
|
|||
property doubleClick: TExplorerDoubleClick read fDblClick write fDblClick;
|
||||
property contextExpand: boolean read fContextExpand write fContextExpand;
|
||||
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
|
||||
constructor create(miniexpl: TMiniExplorerWidget);
|
||||
destructor destroy; override;
|
||||
|
@ -44,18 +48,24 @@ type
|
|||
fSplitter1Position: integer;
|
||||
fSplitter2Position: integer;
|
||||
fLastFolder: string;
|
||||
fRootFolder: string;
|
||||
fDblClick: TExplorerDoubleClick;
|
||||
fContextExpand: boolean;
|
||||
fShowHidden: boolean;
|
||||
fShowSize: boolean;
|
||||
fShowType: boolean;
|
||||
procedure setFavoriteFolders(value: TStringList);
|
||||
published
|
||||
property splitter1Position: integer read fSplitter1Position write fSplitter1Position;
|
||||
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 doubleClick: TExplorerDoubleClick read fDblClick write fDblClick;
|
||||
property contextExpand: boolean read fContextExpand write fContextExpand;
|
||||
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
|
||||
constructor create(aOwner: TComponent); override;
|
||||
destructor destroy; override;
|
||||
|
@ -74,6 +84,7 @@ type
|
|||
btnShellOpen: TDexedToolButton;
|
||||
lstFilter: TListViewFilterEdit;
|
||||
lstFav: TListView;
|
||||
Panel1: TPanel;
|
||||
Panel2: TPanel;
|
||||
lstFiles: TShellListView;
|
||||
mnuDrives: TPopupMenu;
|
||||
|
@ -93,6 +104,8 @@ type
|
|||
procedure lstFilesDblClick(Sender: TObject);
|
||||
procedure lstFilesEnter(Sender: TObject);
|
||||
procedure lstFilesFileAdded(Sender: TObject; Item: TListItem);
|
||||
procedure lstFilesMouseMove(Sender: TObject; Shift: TShiftState; X,
|
||||
Y: Integer);
|
||||
procedure lstFilterButtonClick(Sender: TObject);
|
||||
procedure lstFilterKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
|
||||
procedure Splitter2MouseWheel(Sender: TObject; Shift: TShiftState;
|
||||
|
@ -162,6 +175,8 @@ constructor TMiniExplorerEditableOptions.create(miniexpl: TMiniExplorerWidget);
|
|||
begin
|
||||
fExplorer := miniexpl;
|
||||
fShowHidden:=true;
|
||||
fShowSize:=true;
|
||||
fShowType:=true;
|
||||
EntitiesConnector.addObserver(self);
|
||||
end;
|
||||
|
||||
|
@ -185,6 +200,8 @@ begin
|
|||
fExplorer.treeFolders.ObjectTypes := fExplorer.treeFolders.ObjectTypes - [otHidden];
|
||||
fExplorer.lstFiles.ObjectTypes := fExplorer.lstFiles.ObjectTypes - [otHidden];
|
||||
end;
|
||||
fExplorer.lstFiles.Columns[1].Visible := fShowSize;
|
||||
fExplorer.lstFiles.Columns[2].Visible := fShowType;
|
||||
fExplorer.treeFolders.Refresh;
|
||||
end;
|
||||
|
||||
|
@ -220,6 +237,8 @@ begin
|
|||
inherited;
|
||||
fFavoriteFolders := TStringList.Create;
|
||||
fShowHidden:=true;
|
||||
fShowType:=true;
|
||||
fShowSize:=true;
|
||||
end;
|
||||
|
||||
destructor TMiniExplorerOptions.destroy;
|
||||
|
@ -237,11 +256,14 @@ begin
|
|||
widg := TMiniExplorerWidget(source);
|
||||
fFavoriteFolders.Assign(widg.fFavorites);
|
||||
fLastFolder := widg.fLastFold;
|
||||
fRootFolder := widg.treeFolders.Root;
|
||||
fSplitter1Position := widg.Splitter1.GetSplitterPosition;
|
||||
fSplitter2Position := widg.Splitter2.GetSplitterPosition;
|
||||
fDblClick:= widg.fDblClick;
|
||||
fContextExpand:=widg.fContextExpand;
|
||||
fShowHidden:= otHidden in widg.lstFiles.ObjectTypes;
|
||||
fShowSize := widg.lstFiles.Columns[1].Visible;
|
||||
fShowType := widg.lstFiles.Columns[2].Visible;
|
||||
end
|
||||
else inherited;
|
||||
end;
|
||||
|
@ -272,7 +294,11 @@ begin
|
|||
widg.treeFolders.ObjectTypes := widg.treeFolders.ObjectTypes - [otHidden];
|
||||
widg.lstFiles.ObjectTypes := widg.lstFiles.ObjectTypes -[otHidden];
|
||||
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);
|
||||
end
|
||||
else inherited;
|
||||
|
@ -352,8 +378,6 @@ begin
|
|||
lstFav.OnSelectItem := @lstFavSelect;
|
||||
lstFav.OnDblClick := @lstFavDblClick;
|
||||
|
||||
lstFilter.BorderSpacing.Left := ScaleX(182, 96);
|
||||
|
||||
treeSetRoots;
|
||||
|
||||
fname := getDocPath + OptsFname;
|
||||
|
@ -735,13 +759,20 @@ begin
|
|||
lstFiles.Sort;
|
||||
end;
|
||||
|
||||
procedure TMiniExplorerWidget.lstFilterButtonClick(Sender: TObject);
|
||||
procedure TMiniExplorerWidget.lstFilesMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
|
||||
var
|
||||
s: string;
|
||||
i: TListItem;
|
||||
begin
|
||||
s := treeFolders.Root;
|
||||
treeFolders.Root:= '';
|
||||
treeFolders.Root:= s;
|
||||
i := lstFiles.GetItemAt(x,y);
|
||||
if i.isAssigned() then
|
||||
begin
|
||||
lstFiles.Hint := i.Caption;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TMiniExplorerWidget.lstFilterButtonClick(Sender: TObject);
|
||||
begin
|
||||
filterFiles;
|
||||
end;
|
||||
|
||||
procedure TMiniExplorerWidget.lstFilterKeyUp(Sender: TObject; var Key: Word;
|
||||
|
@ -769,7 +800,6 @@ end;
|
|||
|
||||
procedure TMiniExplorerWidget.toolbarResize(Sender: TObject);
|
||||
begin
|
||||
lstFilter.Width := toolbar.Width - lstFilter.Left - lstFilter.BorderSpacing.Around;
|
||||
end;
|
||||
|
||||
procedure TMiniExplorerWidget.shellOpenSelected;
|
||||
|
|
109
src/u_search.lfm
109
src/u_search.lfm
|
@ -8,12 +8,13 @@ inherited SearchWidget: TSearchWidget
|
|||
ClientWidth = 422
|
||||
inherited Content: TPanel
|
||||
Height = 293
|
||||
Top = 36
|
||||
Width = 422
|
||||
ClientHeight = 293
|
||||
ClientWidth = 422
|
||||
object cbToFind: TComboBox[0]
|
||||
Left = 4
|
||||
Height = 27
|
||||
Height = 30
|
||||
Top = 4
|
||||
Width = 414
|
||||
Align = alTop
|
||||
|
@ -22,15 +23,15 @@ inherited SearchWidget: TSearchWidget
|
|||
BorderSpacing.Around = 4
|
||||
ItemHeight = 0
|
||||
MaxLength = 128
|
||||
TabOrder = 0
|
||||
OnChange = cbToFindChange
|
||||
OnKeyDown = cbToFindKeyDown
|
||||
OnSelect = cbToFindChange
|
||||
TabOrder = 0
|
||||
end
|
||||
object btnFind: TBitBtn[1]
|
||||
Left = 4
|
||||
Height = 27
|
||||
Top = 169
|
||||
Height = 32
|
||||
Top = 149
|
||||
Width = 414
|
||||
Align = alBottom
|
||||
AutoSize = True
|
||||
|
@ -40,8 +41,8 @@ inherited SearchWidget: TSearchWidget
|
|||
end
|
||||
object btnReplace: TBitBtn[2]
|
||||
Left = 4
|
||||
Height = 27
|
||||
Top = 231
|
||||
Height = 32
|
||||
Top = 221
|
||||
Width = 414
|
||||
Align = alBottom
|
||||
AutoSize = True
|
||||
|
@ -51,21 +52,21 @@ inherited SearchWidget: TSearchWidget
|
|||
end
|
||||
object grpOpts: TGroupBox[3]
|
||||
Left = 4
|
||||
Height = 99
|
||||
Top = 66
|
||||
Height = 73
|
||||
Top = 72
|
||||
Width = 414
|
||||
Align = alClient
|
||||
AutoSize = True
|
||||
BorderSpacing.Around = 4
|
||||
Caption = 'Options'
|
||||
ClientHeight = 80
|
||||
ClientWidth = 410
|
||||
ClientHeight = 54
|
||||
ClientWidth = 412
|
||||
TabOrder = 4
|
||||
object FlowPanel1: TFlowPanel
|
||||
Left = 0
|
||||
Height = 80
|
||||
Height = 54
|
||||
Top = 0
|
||||
Width = 410
|
||||
Width = 412
|
||||
Align = alClient
|
||||
AutoSize = True
|
||||
BevelOuter = bvNone
|
||||
|
@ -105,9 +106,9 @@ inherited SearchWidget: TSearchWidget
|
|||
TabOrder = 0
|
||||
object chkRegex: TCheckBox
|
||||
Left = 0
|
||||
Height = 22
|
||||
Height = 23
|
||||
Top = 0
|
||||
Width = 100
|
||||
Width = 94
|
||||
Anchors = []
|
||||
Caption = 'allow regex'
|
||||
Checked = True
|
||||
|
@ -116,27 +117,27 @@ inherited SearchWidget: TSearchWidget
|
|||
end
|
||||
object chkPrompt: TCheckBox
|
||||
Left = 0
|
||||
Height = 22
|
||||
Top = 23
|
||||
Width = 71
|
||||
Height = 23
|
||||
Top = 24
|
||||
Width = 72
|
||||
Anchors = []
|
||||
Caption = 'prompt'
|
||||
TabOrder = 1
|
||||
end
|
||||
object chkCaseSens: TCheckBox
|
||||
Left = 0
|
||||
Height = 22
|
||||
Top = 46
|
||||
Width = 117
|
||||
Left = 94
|
||||
Height = 23
|
||||
Top = 0
|
||||
Width = 107
|
||||
Anchors = []
|
||||
Caption = 'case sensitive'
|
||||
TabOrder = 2
|
||||
end
|
||||
object chkFromCur: TCheckBox
|
||||
Left = 117
|
||||
Height = 22
|
||||
Top = 0
|
||||
Width = 99
|
||||
Left = 94
|
||||
Height = 23
|
||||
Top = 24
|
||||
Width = 96
|
||||
Anchors = []
|
||||
Caption = 'from cursor'
|
||||
Checked = True
|
||||
|
@ -144,19 +145,19 @@ inherited SearchWidget: TSearchWidget
|
|||
TabOrder = 3
|
||||
end
|
||||
object chkBack: TCheckBox
|
||||
Left = 117
|
||||
Height = 22
|
||||
Top = 23
|
||||
Width = 87
|
||||
Left = 201
|
||||
Height = 23
|
||||
Top = 0
|
||||
Width = 84
|
||||
Anchors = []
|
||||
Caption = 'backward'
|
||||
TabOrder = 4
|
||||
end
|
||||
object chkWWord: TCheckBox
|
||||
Left = 117
|
||||
Height = 22
|
||||
Top = 46
|
||||
Width = 99
|
||||
Left = 201
|
||||
Height = 23
|
||||
Top = 24
|
||||
Width = 96
|
||||
Anchors = []
|
||||
Caption = 'whole word'
|
||||
Checked = True
|
||||
|
@ -167,8 +168,8 @@ inherited SearchWidget: TSearchWidget
|
|||
end
|
||||
object btnReplaceAll: TBitBtn[4]
|
||||
Left = 4
|
||||
Height = 27
|
||||
Top = 262
|
||||
Height = 32
|
||||
Top = 257
|
||||
Width = 414
|
||||
Align = alBottom
|
||||
AutoSize = True
|
||||
|
@ -178,69 +179,69 @@ inherited SearchWidget: TSearchWidget
|
|||
end
|
||||
object Panel1: TPanel[5]
|
||||
Left = 4
|
||||
Height = 27
|
||||
Top = 35
|
||||
Height = 30
|
||||
Top = 38
|
||||
Width = 414
|
||||
Align = alTop
|
||||
AutoSize = True
|
||||
BorderSpacing.Around = 4
|
||||
BevelOuter = bvNone
|
||||
ClientHeight = 27
|
||||
ClientHeight = 30
|
||||
ClientWidth = 414
|
||||
TabOrder = 5
|
||||
object cbReplaceWth: TComboBox
|
||||
Left = 111
|
||||
Height = 27
|
||||
Left = 104
|
||||
Height = 30
|
||||
Top = 0
|
||||
Width = 303
|
||||
Width = 310
|
||||
Align = alClient
|
||||
AutoComplete = True
|
||||
AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchCaseSensitive, cbactSearchAscending]
|
||||
ItemHeight = 0
|
||||
MaxLength = 128
|
||||
TabOrder = 1
|
||||
OnChange = cbReplaceWthChange
|
||||
OnKeyDown = cbReplaceWthKeyDown
|
||||
OnSelect = cbReplaceWthChange
|
||||
TabOrder = 1
|
||||
end
|
||||
object chkEnableRep: TCheckBox
|
||||
Left = 0
|
||||
Height = 27
|
||||
Height = 30
|
||||
Top = 0
|
||||
Width = 111
|
||||
Width = 104
|
||||
Align = alLeft
|
||||
Caption = 'Replace with '
|
||||
OnChange = chkEnableRepChange
|
||||
TabOrder = 0
|
||||
OnChange = chkEnableRepChange
|
||||
end
|
||||
end
|
||||
object Panel2: TPanel[6]
|
||||
Left = 4
|
||||
Height = 27
|
||||
Top = 200
|
||||
Height = 32
|
||||
Top = 185
|
||||
Width = 414
|
||||
Align = alBottom
|
||||
AutoSize = True
|
||||
BorderSpacing.Around = 4
|
||||
BevelOuter = bvNone
|
||||
ClientHeight = 27
|
||||
ClientHeight = 32
|
||||
ClientWidth = 414
|
||||
TabOrder = 6
|
||||
object btnFindAll: TBitBtn
|
||||
Left = 0
|
||||
Height = 27
|
||||
Height = 32
|
||||
Top = 0
|
||||
Width = 402
|
||||
Width = 398
|
||||
Align = alClient
|
||||
AutoSize = True
|
||||
Caption = 'btnFindAll'
|
||||
TabOrder = 0
|
||||
end
|
||||
object btnAllScope: TBitBtn
|
||||
Left = 404
|
||||
Height = 27
|
||||
Left = 400
|
||||
Height = 32
|
||||
Top = 0
|
||||
Width = 10
|
||||
Width = 14
|
||||
Align = alRight
|
||||
AutoSize = True
|
||||
BorderSpacing.Left = 2
|
||||
|
@ -256,7 +257,7 @@ inherited SearchWidget: TSearchWidget
|
|||
Left = 216
|
||||
Top = 16
|
||||
end
|
||||
object imgList: TImageList[2]
|
||||
object imgList: TImageList[3]
|
||||
Left = 248
|
||||
Top = 16
|
||||
Bitmap = {
|
||||
|
|
|
@ -7,7 +7,7 @@ interface
|
|||
uses
|
||||
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
|
||||
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_writableComponent, u_dialogs, u_sharedres, u_dsgncontrols;
|
||||
|
||||
|
@ -762,13 +762,16 @@ begin
|
|||
fToFind := cbToFind.Text;
|
||||
fHasSearched := false;
|
||||
updateImperative;
|
||||
if fDoc.isAssigned and (not chkRegex.Checked) then
|
||||
fDoc.HighlightedIdent := fToFind;
|
||||
end;
|
||||
|
||||
procedure TSearchWidget.cbToFindKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
|
||||
begin
|
||||
if Key <> 13 then
|
||||
exit;
|
||||
actFindNextExecute(nil);
|
||||
if Key = 13 then
|
||||
actFindNextExecute(nil)
|
||||
else if (key = VK_ESCAPE) and fDoc.isAssigned then
|
||||
fDoc.setFocus;
|
||||
end;
|
||||
|
||||
procedure TSearchWidget.chkEnableRepChange(Sender: TObject);
|
||||
|
|
|
@ -20,7 +20,7 @@ type
|
|||
public
|
||||
// Initializes with the semVer text.
|
||||
// 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.
|
||||
function isPreRelease: boolean;
|
||||
|
@ -58,7 +58,7 @@ implementation
|
|||
var v1, v2: TSemVer;
|
||||
{$ENDIF}
|
||||
|
||||
procedure TSemVer.init(const text: string; throw: boolean = true);
|
||||
procedure TSemVer.init(const text: string; throw: boolean);
|
||||
|
||||
procedure resetFields();
|
||||
begin
|
||||
|
@ -84,12 +84,12 @@ begin
|
|||
if throw and (r.front <> 'v') then
|
||||
error('Invalid semVer format, the text must start with "v"');
|
||||
r.popFront;
|
||||
fMajor := r.takeUntil('.').yield.ToInteger;
|
||||
fMajor := StrToInt64Def(r.takeUntil('.').yield, 0);
|
||||
if throw and r.empty then
|
||||
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
|
||||
fPatch := r.popFront^.takeWhile(['0'..'9']).yield.ToInteger;
|
||||
fPatch := StrToInt64Def(r.popFront^.takeWhile(['0'..'9']).yield, 0);
|
||||
if not r.empty then
|
||||
fAdditional := r.popFront^.takeUntil(#0).yield;
|
||||
fValid := true;
|
||||
|
@ -146,46 +146,46 @@ end;
|
|||
|
||||
{$IFDEF DEBUG}
|
||||
begin
|
||||
v1.init('v1.0.0');
|
||||
v2.init('v1.0.0');
|
||||
v1.init('v1.0.0', true);
|
||||
v2.init('v1.0.0', true);
|
||||
assert(v1 = v2);
|
||||
|
||||
v1.init('v2.0.0');
|
||||
v2.init('v1.0.0');
|
||||
v1.init('v2.0.0', true);
|
||||
v2.init('v1.0.0', true);
|
||||
assert(v1 > v2);
|
||||
assert(v2 < v1);
|
||||
|
||||
v1.init('v1.1.0');
|
||||
v2.init('v1.0.0');
|
||||
v1.init('v1.1.0', true);
|
||||
v2.init('v1.0.0', true);
|
||||
assert(v1 > v2);
|
||||
assert(v2 < v1);
|
||||
|
||||
v1.init('v1.1.1');
|
||||
v2.init('v1.1.0');
|
||||
v1.init('v1.1.1', true);
|
||||
v2.init('v1.1.0', true);
|
||||
assert(v1 > v2);
|
||||
assert(v2 < v1);
|
||||
|
||||
v1.init('v1.1.1');
|
||||
v2.init('v1.0.1');
|
||||
v1.init('v1.1.1', true);
|
||||
v2.init('v1.0.1', true);
|
||||
assert(v1 > v2);
|
||||
assert(v2 < v1);
|
||||
|
||||
v1.init('v1.1.1-alpha.2');
|
||||
v2.init('v1.1.1-alpha.1');
|
||||
v1.init('v1.1.1-alpha.2', true);
|
||||
v2.init('v1.1.1-alpha.1', true);
|
||||
assert(v1 > v2);
|
||||
assert(v1.isAlpha);
|
||||
assert(v2.isAlpha);
|
||||
assert(v2.asString = '1.1.1-alpha.1');
|
||||
|
||||
v1.init('v1.1.1-beta.1');
|
||||
v2.init('v1.1.1-alpha.8');
|
||||
v1.init('v1.1.1-beta.1', true);
|
||||
v2.init('v1.1.1-alpha.8', true);
|
||||
assert(v1 > v2);
|
||||
assert(v1.isBeta);
|
||||
assert(v2.isAlpha);
|
||||
assert(v1.isPreRelease);
|
||||
|
||||
v1.init('v1.2.3');
|
||||
v2.init('v1.22.33');
|
||||
v1.init('v1.2.3', true);
|
||||
v2.init('v1.22.33', true);
|
||||
assert(v1.major = 1);
|
||||
assert(v1.minor = 2);
|
||||
assert(v1.patch = 3);
|
||||
|
@ -194,7 +194,7 @@ begin
|
|||
assert(v2.patch = 33);
|
||||
assert(v2.asString = '1.22.33');
|
||||
|
||||
v1.init('v0.0.2060');
|
||||
v1.init('v0.0.2060', true);
|
||||
assert(v1.major = 0);
|
||||
assert(v1.minor = 0);
|
||||
assert(v1.patch = 2060);
|
||||
|
@ -204,7 +204,7 @@ begin
|
|||
assert(v2.minor = 0);
|
||||
assert(v2.patch = 2060);
|
||||
|
||||
v1.init('v0.6.0');
|
||||
v1.init('v0.6.0', true);
|
||||
assert(v1.major = 0);
|
||||
assert(v1.minor = 6);
|
||||
assert(v1.patch = 0);
|
||||
|
|
|
@ -14,21 +14,21 @@ type
|
|||
KeywordMatch = record
|
||||
private
|
||||
|
||||
{
|
||||
rendered on 2022-Jul-14 15:02:46.845477 by IsItThere.
|
||||
{
|
||||
rendered on 2024-Feb-21 05:21:19.9635608 by IsItThere.
|
||||
- PRNG seed: 6574
|
||||
- map length: 128
|
||||
- case sensitive: true
|
||||
}
|
||||
}
|
||||
|
||||
const fWords: array [0..127] of string =
|
||||
('label', 'switch', '', 'goto', '', '', '', '', 'delete', 'var', '', '', '', '', '', 'apply', '', '', 'on', '', '', '', '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');
|
||||
const fWords: array [0..127] of string =
|
||||
('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 =
|
||||
(true, true, false, true, false, false, false, false, true, true, false, false, false, false, false, true, false, false, true, false, false, false, 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);
|
||||
const fFilled: array [0..127] of boolean =
|
||||
(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 =
|
||||
(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);
|
||||
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);
|
||||
|
||||
class function hash(const w: string): Word; static;
|
||||
public
|
||||
|
@ -91,6 +91,7 @@ type
|
|||
procedure lexFloatingLiteralFractionalPart();
|
||||
procedure lexExponent();
|
||||
procedure lexStringLiteral();
|
||||
procedure lexCharLiteral();
|
||||
procedure lexRawStringLiteral();
|
||||
procedure lexLineComment();
|
||||
procedure lexStarComment();
|
||||
|
@ -577,6 +578,25 @@ begin
|
|||
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();
|
||||
var
|
||||
firstLine: Boolean;
|
||||
|
@ -675,21 +695,12 @@ begin
|
|||
while fTokStop <= fLineBuf.length do
|
||||
begin
|
||||
case fLineBuf[fTokStop] of
|
||||
'_', 'a'..'z', 'A'..'Z':
|
||||
'_', 'a'..'z', 'A'..'Z', '0'..'9':
|
||||
begin
|
||||
oneChr := true;
|
||||
fTokStop += 1;
|
||||
continue;
|
||||
end;
|
||||
'0' .. '9':
|
||||
begin
|
||||
if oneChr then
|
||||
begin
|
||||
fTokStop += 1;
|
||||
continue;
|
||||
end
|
||||
else break; // e.g $0
|
||||
end
|
||||
else break;
|
||||
end;
|
||||
end;
|
||||
|
@ -779,6 +790,8 @@ begin
|
|||
end;
|
||||
// number
|
||||
'1' .. '9' : lexIntLiteral();
|
||||
// char
|
||||
#39 : lexCharLiteral();
|
||||
// "string"
|
||||
'"': lexStringLiteral();
|
||||
// `string`
|
||||
|
@ -798,7 +811,16 @@ begin
|
|||
'>': lexOpAndOpOpAndOpEqualAndOpOpEqual('>');
|
||||
// `=`, `==`, `=>`
|
||||
'=': lexAssEquOrLambda();
|
||||
'.', '(', ')', ',', ':' , '[', ']', ';' :
|
||||
'.':
|
||||
begin
|
||||
nextPChar := safeLookupChar();
|
||||
fTokKind := TTokenKind.tkSymbl;
|
||||
if (nextPChar <> nil) and (nextPChar^ = '=') then
|
||||
fTokStop += 2
|
||||
else
|
||||
fTokStop += 1;
|
||||
end;
|
||||
'(', ')', ',', ':' , '[', ']', ';' :
|
||||
begin
|
||||
fTokKind := TTokenKind.tkSymbl;
|
||||
fTokStop += 1;
|
||||
|
|
|
@ -209,8 +209,8 @@ begin
|
|||
fSymbols[CFF] := fDoc.fileName;
|
||||
fSymbols[CFR] := fSymbols[CFF].stripFileExt + exeExt;
|
||||
fSymbols[CFP] := fSymbols[CFF].extractFilePath;
|
||||
if fDoc.Identifier.isNotEmpty then
|
||||
fSymbols[CI] := fDoc.Identifier;
|
||||
if fDoc.HighlightedIdent.isNotEmpty then
|
||||
fSymbols[CI] := fDoc.HighlightedIdent;
|
||||
fSymbols[CL] := fDoc.LineText;
|
||||
fSymbols[CS] := fDoc.SelText;
|
||||
end;
|
||||
|
|
|
@ -11,7 +11,6 @@ uses
|
|||
SynEditMarks, SynEditTypes, SynHighlighterJScript, SynBeautifier, dialogs,
|
||||
md5, Spin, LCLIntf, LazFileUtils, LMessages, SynHighlighterCpp, math,
|
||||
SynGutterBase, LCLVersion, SynEditMiscProcs,
|
||||
//SynEditMarkupFoldColoring,
|
||||
Clipbrd, fpjson, jsonparser, LazUTF8, Buttons, StdCtrls,
|
||||
u_common, u_writableComponent, u_d2syn, u_txtsyn, u_dialogs, u_sxsyn,
|
||||
u_sharedres, u_dlang, u_stringrange, u_dbgitf, u_observer, u_diff,
|
||||
|
@ -98,6 +97,7 @@ type
|
|||
fCaretPosition: Integer;
|
||||
fSelectionEnd: Integer;
|
||||
fFontSize: Integer;
|
||||
fFontHeight: Integer;
|
||||
fSourceFilename: string;
|
||||
procedure setFolds(someFolds: TCollection);
|
||||
published
|
||||
|
@ -106,6 +106,7 @@ type
|
|||
property folds: TCollection read fFolds write setFolds;
|
||||
property selectionEnd: Integer read fSelectionEnd write fSelectionEnd;
|
||||
property fontSize: Integer read fFontSize write fFontSize;
|
||||
property fontHeight: Integer read fFontHeight write fFontHeight;
|
||||
public
|
||||
constructor create(aComponent: TComponent); override;
|
||||
destructor destroy; override;
|
||||
|
@ -189,7 +190,6 @@ type
|
|||
|
||||
TDexedMemo = class(TSynEdit, IDebugObserver)
|
||||
private
|
||||
//fIndentGuideMarkup: TSynEditMarkupFoldColors;
|
||||
fLifeTimeManager: TObject;
|
||||
fIdentDialShown: boolean;
|
||||
fScrollMemo: TScrollMemo;
|
||||
|
@ -199,7 +199,7 @@ type
|
|||
fCacheLoaded: boolean;
|
||||
fIsDSource: boolean;
|
||||
fFocusForInput: boolean;
|
||||
fIdentifier: string;
|
||||
fHighlightedIdent: string;
|
||||
fTempFileName: string;
|
||||
fMultiDocSubject: TObject;
|
||||
fDefaultFontSize: Integer;
|
||||
|
@ -265,7 +265,7 @@ type
|
|||
procedure setMatchOpts(value: TIdentifierMatchOptions);
|
||||
function getMouseBytePosition: Integer;
|
||||
procedure changeNotify(Sender: TObject);
|
||||
procedure highlightCurrentIdentifier;
|
||||
procedure highlightCurrentIdentifier(fromEditor: boolean = true);
|
||||
procedure saveCache;
|
||||
procedure loadCache;
|
||||
class procedure cleanCache; static;
|
||||
|
@ -319,6 +319,7 @@ type
|
|||
procedure debugBreak(const fname: string; line: integer; reason: TDebugBreakReason);
|
||||
function breakPointsCount: integer;
|
||||
procedure tryToPatchMixedIndentation;
|
||||
procedure setHighligthedIdent(value: string);
|
||||
protected
|
||||
procedure DoEnter; override;
|
||||
procedure DoExit; override;
|
||||
|
@ -382,10 +383,12 @@ type
|
|||
procedure setDscannerOptions(dsEnabled: boolean; dsDelay: integer);
|
||||
procedure centerCursor();
|
||||
procedure redoAll();
|
||||
procedure undoAll();
|
||||
procedure scrollCentered(down: boolean);
|
||||
procedure setHighligtherFrom(other: TDexedMemo);
|
||||
//
|
||||
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 modified: boolean read fModified;
|
||||
property tempFilename: string read fTempFileName;
|
||||
|
@ -484,8 +487,9 @@ const
|
|||
ecSelLeftWordEdge = ecUserFirst + 32;
|
||||
ecSelRightWordEdge = ecUserFirst + 33;
|
||||
ecRedoAll = ecUserFirst + 34;
|
||||
ecScrollCenteredUp = ecUserFirst + 35;
|
||||
ecScrollCenteredDown = ecUserFirst + 36;
|
||||
ecUndoAll = ecUserFirst + 35;
|
||||
ecScrollCenteredUp = ecUserFirst + 36;
|
||||
ecScrollCenteredDown = ecUserFirst + 37;
|
||||
var
|
||||
D2Syn: TSynD2Syn; // used as model to set the options when no editor exists.
|
||||
TxtSyn: TSynTxtSyn; // used as model to set the options when no editor exists.
|
||||
|
@ -844,6 +848,7 @@ begin
|
|||
fSourceFilename := fMemo.fileName;
|
||||
fSelectionEnd := fMemo.SelEnd;
|
||||
fFontSize := fMemo.Font.Size;
|
||||
fFontHeight := fMemo.Font.Height;
|
||||
TEditorHintWindow.FontSize := fMemo.Font.Size;
|
||||
|
||||
prev := fMemo.Lines.Count-1;
|
||||
|
@ -871,8 +876,10 @@ begin
|
|||
if fMemo.isNotAssigned then
|
||||
exit;
|
||||
|
||||
if fFontSize > 0 then
|
||||
if fFontSize <> 0 then
|
||||
fMemo.Font.Size := fFontSize;
|
||||
if fFontHeight <> 0 then
|
||||
fMemo.Font.Height := fFontHeight;
|
||||
|
||||
// Currently collisions are not handled.
|
||||
if fMemo.fileName <> fSourceFilename then
|
||||
|
@ -1239,9 +1246,6 @@ begin
|
|||
LineHighlightColor.Background := color - $080808;
|
||||
LineHighlightColor.Foreground := clNone;
|
||||
|
||||
//fIndentGuideMarkup:= TSynEditMarkupFoldColors.Create(self);
|
||||
//MarkupManager.AddMarkUp(fIndentGuideMarkup);
|
||||
|
||||
fAutoCloseCurlyBrace:= autoCloseOnNewLineLexically;
|
||||
fAutoClosedPairs:= [autoCloseSquareBracket];
|
||||
|
||||
|
@ -1261,7 +1265,6 @@ destructor TDexedMemo.destroy;
|
|||
begin
|
||||
saveCache;
|
||||
|
||||
//fIndentGuideMarkup.Free;
|
||||
EntitiesConnector.removeObserver(self);
|
||||
subjDocClosing(TMultiDocSubject(fMultiDocSubject), self);
|
||||
fMultiDocSubject.Free;
|
||||
|
@ -1487,6 +1490,7 @@ begin
|
|||
AddKey(ecSmartWordLeft, 0, [], 0, []);
|
||||
AddKey(ecSmartWordRight, 0, [], 0, []);
|
||||
AddKey(ecRedoAll, 0, [], 0, []);
|
||||
AddKey(ecUndoAll, 0, [], 0, []);
|
||||
AddKey(ecScrollCenteredDown, VK_DOWN, [ssCtrl, ssAlt], 0, []);
|
||||
AddKey(ecScrollCenteredUp, VK_UP, [ssCtrl, ssAlt], 0, []);
|
||||
end;
|
||||
|
@ -1529,6 +1533,7 @@ begin
|
|||
'ecSelLeftWordEdge': begin Int := ecSelLeftWordEdge; exit(true); end;
|
||||
'ecSelRightWordEdge': begin Int := ecSelRightWordEdge; exit(true); end;
|
||||
'ecRedoAll': begin Int := ecRedoAll; exit(true); end;
|
||||
'ecUndoAll': begin Int := ecUndoAll; exit(true); end;
|
||||
'ecScrollCenteredUp': begin Int := ecScrollCenteredUp; exit(true); end;
|
||||
'ecScrollCenteredDown': begin Int := ecScrollCenteredDown; exit(true); end;
|
||||
else exit(false);
|
||||
|
@ -1572,6 +1577,7 @@ begin
|
|||
ecSelLeftWordEdge: begin Ident := 'ecSelLeftWordEdge'; exit(true); end;
|
||||
ecSelRightWordEdge: begin Ident := 'ecSelRightWordEdge'; exit(true); end;
|
||||
ecRedoAll: begin Ident := 'ecRedoAll'; exit(true); end;
|
||||
ecUndoAll: begin Ident := 'ecUndoAll'; exit(true); end;
|
||||
ecScrollCenteredUp: begin Ident := 'ecScrollCenteredUp'; exit(true); end;
|
||||
ecScrollCenteredDown: begin Ident := 'ecScrollCenteredDown'; exit(true); end;
|
||||
else exit(false);
|
||||
|
@ -1708,6 +1714,8 @@ begin
|
|||
gotoWordEdge(true);
|
||||
ecRedoAll:
|
||||
redoAll();
|
||||
ecUndoAll:
|
||||
undoAll();
|
||||
ecScrollCenteredUp:
|
||||
scrollCentered(false);
|
||||
ecScrollCenteredDown:
|
||||
|
@ -2162,6 +2170,21 @@ begin
|
|||
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;
|
||||
var
|
||||
str: string;
|
||||
|
@ -2715,6 +2738,14 @@ begin
|
|||
EndUpdate();
|
||||
end;
|
||||
|
||||
procedure TDexedMemo.undoAll();
|
||||
begin
|
||||
BeginUpdate(false);
|
||||
while CanUndo do
|
||||
Undo;
|
||||
EndUpdate();
|
||||
end;
|
||||
|
||||
procedure TDexedMemo.gotoWordEdge(right: boolean);
|
||||
var
|
||||
s: string;
|
||||
|
@ -2963,6 +2994,15 @@ begin
|
|||
r := TStringRange.create(lines[i]);
|
||||
while not r.empty do
|
||||
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;
|
||||
if (w.length >= fTextCompletionMinLength) and not h.contains(w) then
|
||||
begin
|
||||
|
@ -2983,6 +3023,11 @@ procedure TDexedMemo.completionCodeCompletion(var value: string;
|
|||
begin
|
||||
if KeyChar = '' then
|
||||
exit;
|
||||
if (KeyChar = '.') and (SourceValue <> value) then
|
||||
begin
|
||||
value := SourceValue + '.';
|
||||
exit;
|
||||
end;
|
||||
if KeyChar[1] = ' ' then
|
||||
value := sourceValue + KeyChar[1]
|
||||
else
|
||||
|
@ -3352,14 +3397,23 @@ begin
|
|||
fIsDSource := Highlighter = fD2Highlighter;
|
||||
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
|
||||
s: string;
|
||||
i: integer;
|
||||
begin
|
||||
fIdentifier := GetWordAtRowCol(LogicalCaretXY);
|
||||
if (fIdentifier.length > 2) and (not SelAvail) then
|
||||
SetHighlightSearch(fIdentifier, fMatchIdentOpts)
|
||||
if fromEditor then
|
||||
fHighlightedIdent := GetWordAtRowCol(LogicalCaretXY);
|
||||
if (fHighlightedIdent.length > 2) and (not SelAvail) then
|
||||
SetHighlightSearch(fHighlightedIdent, fMatchIdentOpts)
|
||||
else if SelAvail and (BlockBegin.Y = BlockEnd.Y) then
|
||||
begin
|
||||
s := SelText;
|
||||
|
|
Loading…
Reference in New Issue