Compare commits

...

70 Commits

Author SHA1 Message Date
Basile Burg 129d83d568 fix #145- add __rvalue keyword 2025-03-10 11:27:51 +01:00
Basile Burg 3a6a20c466 fix #144 - highlight D IES 2025-03-10 10:46:57 +01:00
Basile Burg 685242ae65 fix debug build after HEAD~1 2025-03-03 14:18:52 +01:00
Basile Burg 647daa96c8 fix #141- DCD causes dexed to crash violently
- remove old code that was used to determine if DCD is able to upagete cache
  and that was based on `dcd-client --version` + internal SemVar handling
- default to 0 for bad SemVer component
2025-03-03 14:00:05 +01:00
Basile Burg d4766a2d2a text completions, tweaks to partially ignore comments 2025-01-08 08:47:18 +01:00
Basile Burg a45e590521 fix #139 - explorer, add options to control whether the size and the ext columns are visible 2025-01-08 08:09:19 +01:00
Basile Burg 340c099fe9 fix #138 - The filter of the mini-explorer is too small 2025-01-08 08:08:38 +01:00
Basile Burg be699bd9bc completions, better behavior with `..` and when "auto-dot" is enabled (_autoDotDelay_ > 0). 2024-04-29 07:49:06 +02:00
Basile Burg 7fea8c5e4d blame widget, force lower case hash
a741032bd1 did not fix the problem,
the problem is in the input text
2024-04-29 07:18:42 +02:00
Basile Burg e16a751495 explorer, more filter fixes 2024-04-29 07:15:00 +02:00
Basile Burg a741032bd1 blame view, keep hashes lowcased
otherwise copy button will copy something that's not always handled,
xref https://gitlab.com/gitlab-org/gitlab/-/issues/453996
2024-04-02 21:51:08 +02:00
Basile Burg ccbc12a16c blame, add early exit for when the initial data are not yet collected 2024-03-30 11:25:28 +01:00
Basile Burg 877072dc48 Add initial support for git blame 2024-03-30 06:21:27 +01:00
Basile Burg ad9f8ca2d4 sxsyn, add support the `defer` keyword 2024-02-21 05:25:44 +01:00
Basile Burg 503196e999 editor cleanup commented code
that stuff, i.e indent lines, was designed for Lazarus and has
never really worked with the D HL.
2024-01-29 06:49:15 +01:00
Basile Burg 488301ac2c ESC while typing in the input field of the search & replace widg. to give the editor the focus back 2024-01-29 06:47:29 +01:00
Basile Burg 200e197b95 update changelog
impliclty fixed from Laz 3.0
2024-01-29 06:46:25 +01:00
Basile Burg 129c3c4d2c more related to #130 2024-01-22 06:49:21 +01:00
Basile Burg 0160c52b61 dftm commander, output a warning if the tool is missing
xref #125
2024-01-22 06:38:15 +01:00
Basile Burg f349dee6a4 search & replace widg, add visual feedback will typing in the input field 2024-01-21 20:52:10 +01:00
Basile Burg 58332062d1 fix, debugging or running from Laz3 did not work anymore 2024-01-21 20:50:21 +01:00
Basile Burg 61c2d132df fix #130 - mini-explorer, on startup selected folder becomes the root, instead of the previous root 2024-01-21 20:17:40 +01:00
Basile Burg bd3625a63f fix #129 - mini-explorer, clearing the filter has for effect to scan the explorer root folder instead of the selected one 2024-01-21 20:16:50 +01:00
Basile Burg 5f0cb4a3f4 sxsyn, adjust lexing to make dot equal ligature working 2023-12-18 12:06:17 +01:00
Basile Burg 6e2209e3b0 sxsyn, add support for char literals 2023-11-26 03:24:33 +01:00
Basile Burg 1d6442917e styx syntax, add the `char` keyword 2023-11-13 01:20:30 +01:00
Basile Burg 4c85af2cc4 sxsyn, allow $1 as identifier 2023-09-23 17:29:28 +02:00
Basile Burg 22f0a5cf39 rlz 2023-09-18 08:41:22 +02:00
Basile Burg af68051ba8 fixup HEAD~1, missing lfm changes 2023-09-18 08:40:46 +02:00
Basile Burg f1c6b38c38 add a MRU for the customized executable used in gdb commander 2023-09-17 13:03:13 +02:00
Basile Burg e576ad1702 fix, font size of reloaded document not always correct 2023-09-17 11:52:18 +02:00
Basile Burg 68f2d53b5c styx syntax, add support for the `from` keyword 2023-09-10 22:04:38 +02:00
Basile Burg 47e00a6a9b editor, add the "undo all" action 2023-08-28 10:39:21 +02:00
Basile Burg 011907d934 fix, diff viewer, unmodified text not visible with dark themes 2023-08-28 10:17:12 +02:00
Basile Burg 263f2a1121 patch use of deprecated API property 2023-08-24 12:12:45 +02:00
Basile Burg 052e49aa35 fix #116 - libdexed-d can only be build with ldc 1.30.0
1.31.0 or newer required now
2023-07-27 15:36:38 +02:00
Basile Burg 73513b3512 rlz 2023-07-07 09:42:54 +02:00
Basile.B 6aea36e65a Merge branch 'rlz-image-upd' into 'master'
change the image used to build the releases

See merge request basile.b/dexed!21
2023-07-07 00:01:07 +00:00
Basile Burg 2478e6dd03 change the image used to build the releases 2023-07-07 01:49:50 +02:00
Basile Burg 700d2c6fd8 update changelog 2023-07-06 22:03:45 +02:00
Basile Burg 1eeeaccdf0 add Arc Dark HL preset 2023-07-06 22:03:39 +02:00
Basile Burg cd19075e38 remove obsolete patch 2023-07-06 21:45:37 +02:00
Basile Burg 1d2ac14225 update release build script 2023-07-06 21:45:25 +02:00
Basile Burg 985b8b073d fix #120 - "select all" in the messages can hang dexed for a while 2023-07-06 20:48:00 +02:00
Basile Burg c2c987cdda fix #121 - Words completions dont not fully take idents containing digits 2023-07-06 20:26:09 +02:00
Basile Burg 75ed028f58 fix, completion broken if dependency specified using a path DUB property 2023-07-06 20:16:48 +02:00
Basile Burg f06ad0ad8c update dparse 2023-07-06 20:08:48 +02:00
Basile Burg bd2a5d16df fix #118 - add support for the new DUB package naming scheme 2023-06-26 01:09:33 +02:00
Basile Burg 63fff3f001 fix appveyor broken
note that ldc 1.30 + matching dub is the last that
can build libdexed-d. That start failing from 1.31
again.
2023-02-28 10:55:17 +01:00
Basile Burg 468a3a6656 rename field w/ typo 2023-02-27 23:40:30 +01:00
Basile Burg 8622a7039a tools widget, prevent the input box on keypress
on gtk2 a small input box is displayed by default, which is annoying and of not usefulness
2023-02-27 23:37:38 +01:00
Basile Burg 81c336c3bb tools widget, disable extended selection
of no usefulness here
2023-02-27 23:15:07 +01:00
Basile Burg 78cb98640f update readme for version 3.9.24 2023-02-25 14:54:44 +01:00
Basile Burg 5044e0d1fc rlz 2023-02-25 14:30:43 +01:00
Basile Burg b4ae83569f docking, initialize a `var` parameter used as result
it's not `out` so there is no guarantee that the caller
has initialized it.
2023-02-25 13:32:55 +01:00
Basile Burg 7398bf9609 dont load docking in the OnFirstShow handler
This caused random cycles while auto-sizing, making dexed impossible
to start without deleting docking.xml
2023-02-15 09:34:46 +01:00
Basile Burg 390ec7777e fix, possible AV when trying to quit and if the FSP just got closed while a group also present 2023-01-05 16:12:48 +01:00
Basile Burg 3dfad53fe3 update year 2023-01-02 10:59:31 +01:00
Basile Burg 9f56a74e54 remove widget back panel 2022-12-26 15:41:01 +01:00
Basile Burg 0c5932e0cf fix, color selector problem when using dark themes 2022-09-10 19:29:37 +02:00
Basile Burg 9b58fe161e fix, scrollCentered inverted 2022-08-14 20:27:47 +02:00
Basile Burg 0c5b0b101e editor, add the ecScrollCenteredDown and ecScrollCenteredUp actions 2022-08-14 14:33:57 +02:00
Basile Burg 5966e03425 add the redoAll action 2022-08-08 15:07:19 +02:00
Basile Burg 1c03f6175a fix, wrong diagnostic output when a makefile rule is already geing processed 2022-08-05 18:43:48 +02:00
Basile Burg 2fb9dfda94 sxsyn, add the `apply` keyword 2022-07-24 10:13:19 +02:00
Basile Burg 10ce57f723 rlz 2022-07-15 05:29:07 +02:00
Basile Burg accb025ac7 fixup HEAD^1, importPaths must be used for DCD
module names can mismatch with sourcePaths
2022-07-15 05:15:00 +02:00
Basile Burg e73d226dba better dcd completion if receipt us subpackage-oriented 2022-07-15 05:04:45 +02:00
Basile Burg 60f9e4e984 fix, dub projects, "sourcePath" not tried in subPackages objects 2022-07-15 04:54:46 +02:00
Basile Burg cf93e0d9e6 gdb commander, center view after click on call stack view 2022-07-12 17:22:32 +02:00
66 changed files with 4385 additions and 3172 deletions

View File

@ -16,30 +16,9 @@ pages:
- merge_requests
release:
image: dlang2/ldc-ubuntu
image: registry.gitlab.com/basile.b/dexed/rlz-image.fedora.x86_64:1.3
variables:
GIT_SUBMODULE_STRATEGY: normal
before_script:
- apt-get update -y
# deps, packaging tools
- apt-get install -y rpm
- apt-get install -y git
- apt-get install -y zip
- apt-get install -y libcurl4-openssl-dev
- apt-get install -y git-lfs && git lfs install
# gitlab Ubuntu-based runners default to LD gold
# but linking lazarus programs requires LD bfd.
- update-alternatives --install "/usr/bin/ld" "ld" "/usr/bin/ld.bfd" 20
- update-alternatives --install "/usr/bin/ld" "ld" "/usr/bin/ld.gold" 10
- update-alternatives --config ld
- ld --version
# lazarus
- git clone https://gitlab.com/basile.b/laz-bin-cache.git --depth=1
- cd laz-bin-cache
- apt install -y ./fpc-laz_3.2.2-210709_amd64.deb
- apt install -y ./fpc-src_3.2.2-210709_amd64.deb
- apt install -y ./lazarus-project_2.2.0-0_amd64.deb
- cd ..
script:
- bash setup/build-release.sh
artifacts:

View File

@ -1,3 +1,72 @@
# 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
- Added support for the new DUB package naming scheme.
However older DUB versions (or package installed with) are still supported. (#118)
- Add highlighter preset "Arc Dark".
## Bugs fixed
- Completion did not work properly for dependencies specified with a _path_ property.
- Word completions (non-semantics ones) did not include identifiers containing digits. (#121)
- Messages, "select all" could hang the IDE for a while (#120)
- Custom tools editor, when focused and typing, a useless input box appeared.
- Symbol List, spurious errors when the code used most recently added languages constructs.
# v3.9.24
## Enhancements
- Editor, added the _Redo All_ action.
- Editor, added the _ecScrollCenteredDown_ and _ecScrollCenteredUp_ actions. Only available using shortcuts and
binded by default to <kbd>UP/DOWN</kbd>+<kbd>CTRL</kbd>+<kbd>ALT</kbd>, they allow to maintain the caret at the center
of the text view while scrolling.
## Bugs fixed
- dexed did not, or was slow, to start on Plasma. (7398bf960958)
- make projects, DUB was wrongly mentioned when trying to compile while previous build not finished.
- possible access violation related to project groups (390ec7777e63)
# v3.9.23
## Enhancements
- GDB Commander, center editor view after double click on the call stack.
## Fixes
- fix, dub projects, "sourcePath" not tried in the "subPackages".
- fix, dub projects, completion not working well if project is organized as sub packages. (#65)
# v3.9.22
## Enhancements

View File

@ -24,16 +24,16 @@ Dexed, the _D Extended EDitor_, is an IDE for the [D programming language](https
## Project information
- :bookmark: latest release: version 3.9.22, Sun 3 Jul. 2022.
- :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.22
## Download version 3.9.26
- :package: [setup program for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.22/downloads/binaries/dexed.3.9.22.linux64.setup.zip)
- :package: [binaries for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.22/downloads/binaries/dexed.3.9.22.linux64.zip)
- :package: [rpm for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.22/downloads/binaries/dexed-3.9.22-0.x86_64.rpm)
- :package: [deb for Linux 64 bit](https://gitlab.com/basile.b/dexed/-/releases/v3.9.22/downloads/binaries/dexed-3.9.22.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.

View File

@ -19,14 +19,14 @@ branches:
install:
- ps: |
$LDC_URL = "https://github.com/ldc-developers/ldc/releases/download/v1.27.1/ldc2-1.27.1-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.27.1-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"

View File

@ -8,7 +8,12 @@
"path" : "../etc/libdparse"
}
},
"dflags" : [
"dflags-linux" : [
"-link-defaultlib-shared=false"
]
],
"dflags-windows" : [
"-link-defaultlib-shared=false",
"-fvisibility=public",
"-dllimport=none",
],
}

View File

@ -432,7 +432,7 @@ static assert (!MustAddGcRange!(SymbolListBuilder!(ListFmt.Pas)));
override void visit(const ContinueStatement) {}
override void visit(const Deprecated) {}
override void visit(const Expression) {}
override void visit(const ExpressionNode) {}
override void dynamicDispatch(const ExpressionNode) {}
override void visit(const ExpressionStatement) {}
override void visit(const FunctionAttribute) {}
override void visit(const FunctionContract) {}

View File

@ -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

@ -1 +1 @@
Subproject commit b94a1573acc5c5c6b21794970af5907f2a21822d
Subproject commit fe6d1e38fb4fc04323170389cfec67ed7fd4e24a

View File

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

2
isitthere/sxkeywords.sh Executable file
View File

@ -0,0 +1,2 @@
#!/usr/bin/sh
isitthere --if=sxkeywords.txt --ml=128 --is=6574 --fk=pascal --of=sxkw.pas --fn=KeywordMatch

61
isitthere/sxkeywords.txt Normal file
View File

@ -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

View File

@ -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>

View File

@ -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}

View File

@ -1,23 +0,0 @@
Fixes https://github.com/Basile-z/Coedit/issues/218
Must be applied to any Lazarus 1.8.0 Vanilla.
Has not be applied to Lazarus 1.8.1 or newer.
--- synedit.pp
+++ synedit.pp
@@ -8945,7 +8945,7 @@
while not Highlighter.GetEol do begin
Start := Highlighter.GetTokenPos + 1;
Token := Highlighter.GetToken;
+ if (PosX >= Start) and (PosX < Start + Length(Token)) then begin
- if (PosX >= Start) and (PosX <= Start + Length(Token)) then begin
Attri := Highlighter.GetTokenAttribute;
TokenType := Highlighter.GetTokenKind;
exit(True);
@@ -8990,7 +8990,7 @@
//TokenType := Highlighter.GetTokenKind;
Attri := Highlighter.GetTokenAttribute;
//DebugLn([' TCustomSynEdit.CaretAtIdentOrString: Start=', Start, ', Token=', Token]);
+ if (PosX >= Start) and (PosX < Start + Length(Token)) then
- if (PosX >= Start) and (PosX <= Start + Length(Token)) then
begin
AtIdent := Attri = Highlighter.IdentifierAttribute;
NearString := (Attri = Highlighter.StringAttribute)

10
setup/Dockerfile Normal file
View File

@ -0,0 +1,10 @@
FROM fedora:37
RUN dnf install -y "coreutils" "dpkg" "rpm" "rpm-build" "zip" "tar" "make" "findutils" "curl" "git" "libgcc" "bash" "which" &&\
curl -JLO "https://sourceforge.net/projects/lazarus/files/Lazarus%20Linux%20x86_64%20RPM/Lazarus%202.2.6/fpc-3.2.2-1.x86_64.rpm/download" &&\
curl -JLO "https://sourceforge.net/projects/lazarus/files/Lazarus%20Linux%20x86_64%20RPM/Lazarus%202.2.6/fpc-src-3.2.2-1.x86_64.rpm" &&\
curl -JLO "https://sourceforge.net/projects/lazarus/files/Lazarus%20Linux%20x86_64%20RPM/Lazarus%202.2.6/lazarus-2.2.6-0.x86_64.rpm/download" &&\
dnf install -y "fpc-3.2.2-1.x86_64.rpm" "fpc-src-3.2.2-1.x86_64.rpm" "lazarus-2.2.6-0.x86_64.rpm" &&\
curl -JLO "https://github.com/ldc-developers/ldc/releases/download/v1.32.2/ldc2-1.32.2-linux-x86_64.tar.xz" &&\
tar -xf "ldc2-1.32.2-linux-x86_64.tar.xz" && mv "ldc2-1.32.2-linux-x86_64" "ldc2-" &&\
ln -s "/ldc2-/bin/ldc2" "/usr/bin/ldc2" && ln -s "/ldc2-/bin/ldmd2" "/usr/bin/ldmd2" && ln -s "/ldc2-/bin/dub" "/usr/bin/dub" &&\
dnf clean all && rm -rf "/var/cache/yum"

View File

@ -51,7 +51,7 @@ git fetch --tags
if [ ! -z "$dcd_ver" ]; then
git checkout $dcd_ver
fi
make ldc
make ldc -j5
echo "...done"
cd ..
@ -69,7 +69,7 @@ git fetch --tags
if [ ! -z "$dscanner_ver" ]; then
git checkout $dscanner_ver
fi
make ldc
make ldc -j5
echo "...done"
cd ..
@ -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
setup/build-rlz-image.sh Normal file
View File

@ -0,0 +1 @@
sudo docker build $(realpath ".") -t "registry.gitlab.com/basile.b/dexed/rlz-image.fedora.x86_64:1.3"

View File

@ -1 +1 @@
v3.9.22
v3.9.26

241
src/u_blame.lfm Normal file
View File

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

504
src/u_blame.pas Normal file
View File

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

View File

@ -6,11 +6,6 @@ inherited CECdbWidget: TCECdbWidget
Caption = 'CDB commander'
ClientHeight = 589
ClientWidth = 496
inherited Back: TPanel
Height = 589
Width = 496
ClientHeight = 589
ClientWidth = 496
inherited Content: TPanel
Height = 589
Width = 496
@ -263,7 +258,6 @@ inherited CECdbWidget: TCECdbWidget
ViewStyle = vsReport
end
end
end
inherited contextMenu: TPopupMenu
left = 200
top = 8

View File

@ -6,12 +6,6 @@ inherited ProjectConfigurationWidget: TProjectConfigurationWidget
Caption = 'DEXED project editor'
ClientHeight = 315
ClientWidth = 445
inherited Back: TPanel
Height = 315
Width = 445
AutoSize = True
ClientHeight = 315
ClientWidth = 445
inherited Content: TPanel
Height = 279
Width = 445
@ -145,7 +139,6 @@ inherited ProjectConfigurationWidget: TProjectConfigurationWidget
TabOrder = 0
end
end
end
inherited contextMenu: TPopupMenu
Left = 8
Top = 8

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -595,6 +595,70 @@ begin
selection.Foreground := clNone;
getHl.calls.Assign(getHl.identifiers);
end;
with fPresets.insertPreset(5) do
begin
fIsHardcoded := true;
name := 'Arc Dark';
getHl.phobosStyleType := False;
getHl.foldKinds := [fkBrackets, fkRegion];
getHl.whites.FrameEdges := sfeNone;
getHl.numbers.Foreground := 16761218;
getHl.numbers.FrameEdges := sfeNone;
getHl.symbols.Foreground := clYellow;
getHl.symbols.FrameEdges := sfeNone;
getHl.identifiers.Foreground := clWhite;
getHl.identifiers.FrameEdges := sfeNone;
getHl.comments.Foreground := 10664152;
getHl.comments.FrameEdges := sfeNone;
getHl.strings.Foreground := 5157104;
getHl.strings.FrameEdges := sfeNone;
getHl.keywords.Foreground := 8511369;
getHl.keywords.FrameEdges := sfeNone;
getHl.ddoc.Foreground := 14671730;
getHl.ddoc.FrameEdges := sfeNone;
getHl.inlineAsm.Foreground := 15500491;
getHl.inlineAsm.FrameEdges := sfeNone;
getHl.special.Foreground := 9684887;
getHl.special.FrameEdges := sfeNone;
getHl.errors.Foreground := 14807024;
getHl.attributes.Foreground := 8441210;
getHl.attributes.FrameEdges := sfeNone;
getHl.types.Foreground := 14807024;
getHl.calls.Foreground := clWhite;
getHl.calls.Style := [fsItalic];
background := 5391680;
bracketMatch.Background := clNone;
bracketMatch.Foreground := clGradientActiveCaption;
bracketMatch.FrameStyle := slsDashed;
bracketMatch.FrameEdges := sfeNone;
bracketMatch.Style := [fsBold];
currentLine.Background := 8816262;
currentLine.Foreground := clNone;
currentLine.BackAlpha := 50;
folding.Background := 7303023;
folding.Foreground := clYellow;
folding.FrameColor := clGray;
identifierMatch.Background := clMoneyGreen;
identifierMatch.Foreground := clNone;
identifierMatch.FrameColor := clInfoText;
identifierMatch.FrameEdges := sfeBottom;
identifierMatch.BackPriority := 1;
identifierMatch.BackAlpha := 30;
mouseLink.Background := clNone;
mouseLink.Foreground := clNone;
mouseLink.Style := [fsBold, fsUnderline];
selection.Background := 5987166;
selection.Foreground := clNone;
selection.BackPriority := 2;
end;
fEditor := TSynEdit.Create(self);
fEditor.Parent:= self;

View File

@ -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;

View File

@ -6,15 +6,6 @@ inherited DfmtWidget: TDfmtWidget
Caption = 'Dfmt commander'
ClientHeight = 365
ClientWidth = 458
inherited Back: TPanel
Left = 4
Height = 357
Top = 4
Width = 450
AutoSize = True
BorderSpacing.Around = 4
ClientHeight = 357
ClientWidth = 450
inherited Content: TPanel
Height = 321
Width = 450
@ -79,4 +70,3 @@ inherited DfmtWidget: TDfmtWidget
Width = 442
end
end
end

View File

@ -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);

View File

@ -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

View File

@ -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}

View File

@ -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];

View File

@ -30,6 +30,7 @@ type
strict private
fName : string;
fVersions: TSemVerList;
fNewNamingScheme: boolean;
public
constructor create;
destructor destroy; override;
@ -38,6 +39,7 @@ type
function highestInInterval(constref lo, hi: TSemVer): PSemVer;
function highest: PSemVer;
property name: string read fName write fName;
property newNamingScheme: boolean read fNewNamingScheme write fNewNamingScheme;
end;
TDubLocalPackages = class
@ -324,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;
@ -359,10 +361,12 @@ begin
begin
v := fVersions[i]^;
if v < lo then
continue;
if v < hi then
result := fVersions[i];
if v > hi then
continue
else if (v > lo) or (v = lo) then
result := fVersions[i]
else if (v < hi) and ((assigned(result) and (v > result^)) or (not assigned(result))) then
result := fVersions[i]
else if v > hi then
break;
end;
end;
@ -395,6 +399,23 @@ begin
end;
class procedure TDubLocalPackages.update;
procedure addPackageOrVersion(name, semVer: string; newNamingScheme: Boolean);
var
d: PDubLocalPackage = nil;
begin
if not find(name, d) then
begin
setLength(fLocalPackages, length(fLocalPackages) + 1);
fLocalPackages[high(fLocalPackages)] := TDubLocalPackage.create;
d := @fLocalPackages[high(fLocalPackages)];
d^.name := name;
d^.newNamingScheme := newNamingScheme;
end;
d^.addVersion(semVer);
end;
var
p: TStringList;
r: TStringList;
@ -404,9 +425,10 @@ var
i: integer;
j: integer = 0;
k: integer;
d: PDubLocalPackage = nil;
h: TStringRange = (ptr: nil; pos: 0; len: 0);
x: string;
u: TStringList;
g: string;
begin
@ -441,6 +463,23 @@ begin
j := 0;
s := p[i];
h.init(s);
// after 2.104 <cachePath>/<package>/<version>/<package>
// new naming scheme can be distinguished because '.' is not a legal char in a package name
v := s.extractFileName;
if (Pos('.', v) < 1) and (Pos('master', v) < 1) then
begin
u := TStringList.Create;
try
listFolders(u, s + DirectorySeparator);
for g in u do
addPackageOrVersion(v, 'v' + g.extractFileName, true);
finally
u.free;
end;
end
// before 2.104 <cachePath>/<package>-<version>/<package>
else
begin
while true do
begin
h.popUntil('-');
@ -453,21 +492,13 @@ begin
break;
end;
end;
if j.equals(0) then
continue;
if not j.equals(0) then
begin
n := s[1..j-1];
n := n.extractFileName;
if not find(n, d) then
begin
setLength(fLocalPackages, length(fLocalPackages) + 1);
fLocalPackages[high(fLocalPackages)] := TDubLocalPackage.create;
d := @fLocalPackages[high(fLocalPackages)];
d^.name := n;
addPackageOrVersion(n, 'v' + s[j+1 .. length(s)], false);
end;
end;
v := 'v' + s[j+1 .. length(s)];
d^.addVersion(v);
end;
finally
p.Free;
@ -509,7 +540,6 @@ begin
hi.patch := 0;
hi.additional :='';
result := package^.highestInInterval(opVer, hi);
result := result;
end;
end
else if op = '=' then
@ -1379,6 +1409,31 @@ begin
fSrcs.Add(patchPlateformPath(ExtractRelativepath(fBasePath, abs)));
end;
end;
procedure tryFromCustomPath(o: TJSONObject);
var
i: integer;
a: TJSONArray;
p: string;
begin
if o.findArray('sourcePaths', a) then
for i := 0 to a.Count-1 do
begin
p := TrimRightSet(a.Strings[i], ['/','\']);
if p.dirExists and FilenameIsAbsolute(p) then
tryAddFromFolder(p)
else
tryAddFromFolder(expandFilenameEx(fBasePath, p));
end;
if o.findArray('importPaths', a) then
for i := 0 to a.Count-1 do
begin
p := TrimRightSet(a.Strings[i], ['/','\']);
if p.dirExists and FilenameIsAbsolute(p) then
fImportPaths.Add(p)
else
fImportPaths.Add(expandFilenameEx(fBasePath, p));
end;
end;
procedure trySubpPackages(a: TJSONArray);
var
n: TJSONData;
@ -1396,6 +1451,7 @@ begin
o := a.Objects[i];
if o.findAny('name', n) then
tryAddFromFolder(fBasePath + n.AsString);
tryFromCustomPath(o);
end;
end;
end;
@ -1449,15 +1505,7 @@ begin
fSrcs.Add(patchPlateformPath(pth));
end;
// custom folders in current config
if conf.findArray('sourcePaths', arr) then
for i := 0 to arr.Count-1 do
begin
pth := TrimRightSet(arr.Strings[i], ['/','\']);
if pth.dirExists and FilenameIsAbsolute(pth) then
tryAddFromFolder(pth)
else
tryAddFromFolder(expandFilenameEx(fBasePath, pth));
end;
tryFromCustomPath(conf);
// subpackages
if conf.findArray('subPackages', arr) then
trySubpPackages(arr);
@ -1630,9 +1678,9 @@ procedure TDubProject.updateImportPathsFromJson;
s += w;
// as auto detected by DUB
if (s + 'source').dirExists then
fImportPaths.Add(s)
fImportPaths.Add(s + 'source')
else if (s + 'src').dirExists then
fImportPaths.Add(s)
fImportPaths.Add(s + 'src')
// when standard src content is directly in the repo root
else if (s + n).dirExists or (w.length <> 0) then
fImportPaths.Add(s);
@ -1678,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;
@ -1725,9 +1773,13 @@ procedure TDubProject.updateImportPathsFromJson;
begin
s := b[k] + n;
p := s + '-' + u^.asString + DirectorySeparator + n + DirectorySeparator;
// e.g vibe-d:http -> <registrypath>/vibed-<sember>/http
// new naming scheme
if not p.dirExists then
p := s + DirectorySeparator + u^.asString + DirectorySeparator + n + DirectorySeparator;
// e.g vibe-d:http -> <registrypath>/vibed/<semver>/vibed/http
// e.g ae:sys-wininet -> <registrypath>/ae/<semver>/ae/sys/wininet
if length(w) <> 0 then
p += w;
p += strutils.ReplaceText(w, '-', DirectorySeparator);
if not p.dirExists then
continue;
if (p + 'source').dirExists then
@ -1875,9 +1927,9 @@ procedure TDubProject.updateFields;
begin
updatePackageNameFromJson;
udpateConfigsFromJson;
updateImportPathsFromJson;
updateSourcesFromJson;
updateTargetKindFromJson;
updateImportPathsFromJson;
updateOutputNameFromJson;
end;

View File

@ -6,12 +6,6 @@ inherited DubProjectEditorWidget: TDubProjectEditorWidget
Caption = 'DUB project editor'
ClientHeight = 424
ClientWidth = 407
inherited Back: TPanel
Height = 424
Width = 407
AutoSize = True
ClientHeight = 424
ClientWidth = 407
inherited Content: TPanel
Height = 388
Width = 407
@ -136,7 +130,6 @@ inherited DubProjectEditorWidget: TDubProjectEditorWidget
scaledSeparator = False
end
end
end
inherited contextMenu: TPopupMenu
Left = 248
Top = 8

View File

@ -8,20 +8,16 @@ inherited EditorWidget: TEditorWidget
ClientWidth = 465
OnShortCut = FormShortCut
OnShow = FormShow
inherited Back: TPanel
Height = 434
Width = 465
ClientHeight = 434
ClientWidth = 465
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 = <
@ -50,21 +46,19 @@ inherited EditorWidget: TEditorWidget
end
end
inherited toolbar: TDexedToolBar
Height = 30
Width = 457
end
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
@ -87,10 +81,18 @@ 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 mnuedRedoAll: TMenuItem
Caption = 'Redo all'
OnClick = mnuedRedoAllClick
end
object MenuItem11: TMenuItem
Caption = '-'
end
@ -282,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

View File

@ -62,6 +62,8 @@ type
MenuItem14: TMenuItem;
MenuItem15: TMenuItem;
MenuItem16: TMenuItem;
mnuedRedoAll: TMenuItem;
mnuedUndoAll: TMenuItem;
mnuCurFileCopyName: TMenuItem;
mnuCurFileShowInMiniExpl: TMenuItem;
mnuCurFileShellOpen: TMenuItem;
@ -112,6 +114,7 @@ type
editorStatus: TStatusBar;
mnuEditor: TPopupMenu;
mnuCurFile: TPopupMenu;
procedure mnuedRedoAllClick(Sender: TObject);
procedure FormShortCut(var Msg: TLMKey; var Handled: Boolean);
procedure FormShow(Sender: TObject);
procedure mnuCurFileCopyNameClick(Sender: TObject);
@ -132,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);
@ -201,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;
@ -358,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');
@ -386,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');
@ -414,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');
@ -659,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 ---------------------------------------------}
@ -1041,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
@ -1090,6 +1112,12 @@ begin
end;
end;
procedure TEditorWidget.mnuedRedoAllClick(Sender: TObject);
begin
if fDoc.isAssigned then
fDoc.redoAll();
end;
procedure TEditorWidget.FormShow(Sender: TObject);
begin
if fDoc.isAssigned then
@ -1251,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;

View File

@ -6,45 +6,39 @@ inherited GdbWidget: TGdbWidget
Caption = 'GDB commander'
ClientHeight = 668
ClientWidth = 672
inherited Back: TPanel
Height = 662
Top = 6
Width = 672
AutoSize = True
ClientHeight = 662
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
@ -77,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
@ -109,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
@ -124,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
@ -139,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
@ -158,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
@ -180,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
@ -216,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 = <
@ -253,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
@ -268,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
@ -309,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
@ -332,7 +326,7 @@ inherited GdbWidget: TGdbWidget
end
end
inherited toolbar: TDexedToolBar
Height = 30
Top = 10
Width = 664
object btnStack: TDexedToolButton[0]
Left = 238
@ -464,8 +458,7 @@ inherited GdbWidget: TGdbWidget
scaledSeparator = False
end
end
end
object Splitter2: TSplitter[1]
object Splitter2: TSplitter[2]
Cursor = crVSplit
Left = 0
Height = 6
@ -474,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
@ -497,8 +490,11 @@ inherited GdbWidget: TGdbWidget
Caption = 'Debug custom executable...'
OnClick = mnuSelCustomClick
end
object mnuDebugRecent: TMenuItem
Caption = 'Debug recent executable'
end
object mnuWatch: TPopupMenu[4]
end
object mnuWatch: TPopupMenu[5]
Left = 56
Top = 160
object mnuReadW: TMenuItem
@ -518,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
@ -526,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
@ -534,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
@ -554,7 +550,7 @@ inherited GdbWidget: TGdbWidget
OnClick = mnuEvalCustomClick
end
end
object mnuEvalCompletion: TPopupMenu[8]
object mnuEvalCompletion: TPopupMenu[9]
Left = 288
Top = 168
end

View File

@ -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;
@ -3084,7 +3169,10 @@ begin
fDocHandler.openDocument(nme);
doc := fDocHandler.findDocument(nme);
if doc.isAssigned then
begin
doc.CaretY:= itm.line;
doc.centerCursor();
end;
gdbCommand('-stack-select-frame ' + intToStr(lstCallStack.ItemIndex));
if fOptions.autoGetVariables then
infoVariables;

View File

@ -1,79 +1,76 @@
inherited InfoWidget: TInfoWidget
Left = 713
Height = 299
Height = 302
Top = 245
Width = 287
Width = 255
AutoSize = True
BorderIcons = [biSystemMenu, biMinimize, biMaximize]
Caption = 'About'
ClientHeight = 299
ClientWidth = 287
inherited Back: TPanel
Height = 299
Width = 287
AutoSize = True
ClientHeight = 299
ClientWidth = 287
ClientHeight = 302
ClientWidth = 255
inherited Content: TPanel
Height = 263
Width = 287
ClientHeight = 263
ClientWidth = 287
Height = 266
Top = 36
Width = 255
ClientHeight = 266
ClientWidth = 255
object GroupBox1: TGroupBox[0]
Left = 4
Height = 74
Height = 80
Top = 4
Width = 279
Width = 247
Align = alTop
AutoSize = True
BorderSpacing.Around = 4
Caption = 'about'
ClientHeight = 55
ClientWidth = 275
ClientHeight = 61
ClientWidth = 245
TabOrder = 0
object Label1: TLabel
Left = 8
Height = 1
Top = 8
Width = 259
Width = 229
Align = alTop
Alignment = taCenter
BorderSpacing.Around = 8
Font.Style = [fsBold]
Layout = tlCenter
ParentColor = False
ParentFont = False
end
object Label2: TLabel
Left = 8
Height = 30
Height = 36
Top = 17
Width = 259
Width = 229
Align = alClient
Alignment = taCenter
BorderSpacing.Around = 8
Caption = 'Licensed under the terms of the BSL-1.0'#10'©Basile Burg, 2014-2022'
Caption = 'Licensed under the terms of the BSL-1.0'#10'©Basile Burg, 2014-2023'
Font.Style = [fsItalic]
Layout = tlCenter
ParentColor = False
ParentFont = False
end
end
object GroupBox2: TGroupBox[1]
Left = 4
Height = 177
Top = 82
Width = 279
Height = 174
Top = 88
Width = 247
Align = alClient
AutoSize = True
BorderSpacing.Around = 4
Caption = 'tools status'
ClientHeight = 158
ClientWidth = 275
ClientHeight = 155
ClientWidth = 245
TabOrder = 1
object boxTools: TScrollBox
Left = 4
Height = 150
Height = 147
Top = 4
Width = 267
Width = 237
HorzScrollBar.Page = 1
VertScrollBar.Page = 1
Align = alClient
@ -85,8 +82,6 @@ inherited InfoWidget: TInfoWidget
end
end
inherited toolbar: TDexedToolBar
Height = 30
Width = 279
end
Width = 247
end
end

View File

@ -122,7 +122,7 @@ begin
// set things up and do the work
noFill := CurValue = 'clNone';
if noFill then
Brush.Color := clWindow
Brush.Color := clBackground
else
Brush.Color := StringToColorDef(CurValue,clNone);
Pen.Color := ColorToBorderColor(ColorToRGB(Brush.Color));
@ -167,7 +167,7 @@ begin
ACanvas.Font.Color := clHighlightText;
end
else begin
ACanvas.Brush.Color := clwhite{clWindow};
ACanvas.Brush.Color := clWindow;
ACanvas.Font.Color := clWindowText;
end;
ACanvas.FillRect(rc);

View File

@ -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;

View File

@ -6,12 +6,6 @@ inherited LibManEditorWidget: TLibManEditorWidget
Caption = 'Library manager'
ClientHeight = 297
ClientWidth = 641
inherited Back: TPanel
Height = 297
Width = 641
AutoSize = True
ClientHeight = 297
ClientWidth = 641
inherited Content: TPanel
Height = 261
Width = 641
@ -198,7 +192,6 @@ inherited LibManEditorWidget: TLibManEditorWidget
scaledSeparator = False
end
end
end
inherited contextMenu: TPopupMenu
Left = 400
end

View File

@ -12,7 +12,6 @@ object MainForm: TMainForm
OnDropFiles = FormDropFiles
OnResize = FormResize
ShowHint = True
LCLVersion = '2.2.0.4'
object mainMenu: TMainMenu
Top = 1
object MenuItem1: TMenuItem
@ -135,9 +134,15 @@ object MainForm: TMainForm
object MenuItem19: TMenuItem
Action = actEdUndo
end
object MenuItem120: TMenuItem
Action = actEdUndoAll
end
object MenuItem20: TMenuItem
Action = actEdRedo
end
object MenuItem119: TMenuItem
Action = actEdRedoAll
end
object MenuItem21: TMenuItem
Caption = '-'
end
@ -418,7 +423,7 @@ object MainForm: TMainForm
end
end
object Actions: TActionList
Left = 31
Left = 32
object actEdCopy: TAction
Category = 'Edit'
Caption = 'Copy'
@ -448,27 +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 actEdMacStartStop: TAction
Category = 'Edit'
Caption = 'Start/stop macro recording'
OnExecute = actEdMacStartStopExecute
OnUpdate = updateDocEditBasedAction
ShortCut = 24658
end
object actEdMacPlay: TAction
Category = 'Edit'
Caption = 'Play macro'
OnExecute = actEdMacPlayExecute
OnUpdate = updateDocEditBasedAction
ShortCut = 24656
end
object actFileSave: TAction
Category = 'File'
Caption = 'Save file'
@ -530,20 +514,6 @@ object MainForm: TMainForm
OnExecute = actProjSourceExecute
OnUpdate = updateProjectBasedAction
end
object actEdIndent: TAction
Category = 'Edit'
Caption = 'Indent'
OnExecute = actEdIndentExecute
OnUpdate = updateDocEditBasedAction
ShortCut = 24649
end
object actEdUnIndent: TAction
Category = 'Edit'
Caption = 'Unindent'
OnExecute = actEdUnIndentExecute
OnUpdate = updateDocEditBasedAction
ShortCut = 24661
end
object actProjOptView: TAction
Category = 'Project'
Caption = 'View project command line'
@ -583,20 +553,6 @@ object MainForm: TMainForm
OnExecute = actProjRunWithArgsExecute
OnUpdate = updateProjectBasedAction
end
object actEdFind: TAction
Category = 'Edit'
Caption = 'Find...'
OnExecute = actEdFindExecute
OnUpdate = updateDocumentBasedAction
ShortCut = 16454
end
object actEdFindNext: TAction
Category = 'Edit'
Caption = 'Find next'
OnExecute = actEdFindNextExecute
OnUpdate = updateDocumentBasedAction
ShortCut = 114
end
object actProjOpenContFold: TAction
Category = 'Project'
Caption = 'View in mini explorer'
@ -819,12 +775,6 @@ object MainForm: TMainForm
OnExecute = actFileCloseAllExecute
OnUpdate = updateDocumentBasedAction
end
object actEdFormat: TAction
Category = 'Edit'
Caption = 'Apply code formatting'
OnExecute = actEdFormatExecute
OnUpdate = updateDocumentBasedAction
end
object actProjTest: TAction
Category = 'Project'
Caption = 'Test project'
@ -862,6 +812,74 @@ 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'
OnExecute = actEdRedoAllExecute
OnUpdate = updateDocEditBasedAction
ShortCut = 49242
end
object actEdMacStartStop: TAction
Category = 'Edit'
Caption = 'Start/stop macro recording'
OnExecute = actEdMacStartStopExecute
OnUpdate = updateDocEditBasedAction
ShortCut = 24658
end
object actEdMacPlay: TAction
Category = 'Edit'
Caption = 'Play macro'
OnExecute = actEdMacPlayExecute
OnUpdate = updateDocEditBasedAction
ShortCut = 24656
end
object actEdIndent: TAction
Category = 'Edit'
Caption = 'Indent'
OnExecute = actEdIndentExecute
OnUpdate = updateDocEditBasedAction
ShortCut = 24649
end
object actEdUnIndent: TAction
Category = 'Edit'
Caption = 'Unindent'
OnExecute = actEdUnIndentExecute
OnUpdate = updateDocEditBasedAction
ShortCut = 24661
end
object actEdFind: TAction
Category = 'Edit'
Caption = 'Find...'
OnExecute = actEdFindExecute
OnUpdate = updateDocumentBasedAction
ShortCut = 16454
end
object actEdFindNext: TAction
Category = 'Edit'
Caption = 'Find next'
OnExecute = actEdFindNextExecute
OnUpdate = updateDocumentBasedAction
ShortCut = 114
end
object actEdFormat: TAction
Category = 'Edit'
Caption = 'Apply code formatting'
OnExecute = actEdFormatExecute
OnUpdate = updateDocumentBasedAction
end
end
object ApplicationProperties1: TApplicationProperties
OnActivate = ApplicationProperties1Activate

View File

@ -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
@ -117,6 +118,8 @@ type
actFileCloseAll: TAction;
actFileNewClip: TAction;
actEdFormat: TAction;
actEdRedoAll: TAction;
actEdUndoAll: TAction;
actProjCheckSema: TAction;
actProjSetEnv: TAction;
actProjGitPull: TAction;
@ -186,6 +189,8 @@ type
MenuItem116: TMenuItem;
MenuItem117: TMenuItem;
MenuItem118: TMenuItem;
MenuItem119: TMenuItem;
MenuItem120: TMenuItem;
mnuGitBranch: TMenuItem;
mnuItemDubDialog: TMenuItem;
mnuItemHelp: TMenuItem;
@ -297,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);
@ -330,6 +336,7 @@ type
procedure actProjSetEnvExecute(Sender: TObject);
procedure actProjStopCompExecute(Sender: TObject);
procedure actProjTestExecute(Sender: TObject);
procedure actEdRedoAllExecute(Sender: TObject);
procedure actSetRunnableSwExecute(Sender: TObject);
procedure ApplicationProperties1Activate(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
@ -431,8 +438,9 @@ type
fDubProjWidg: TDubProjectEditorWidget;
fPrjGrpWidg: TProjectGroupWidget;
fGdbWidg: TGdbWidget;
fBlameWidg: TBlameWidget;
{$IFDEF UNIX}
fTermWWidg: TTermWidget;
fTermWidg: TTermWidget;
{$ENDIF}
fDfmtWidg: TDfmtWidget;
@ -454,6 +462,8 @@ type
procedure updateFloatingWidgetOnTop(onTop: boolean);
procedure widgetDockingChanged(sender: TDexedWidget; newState: TWidgetDockingState);
procedure mnuOptsItemClick(sender: TObject);
procedure anchorDockingAddControlEvent(Sender: TObject; aName: string;
var AControl: TControl; DoDisableAutoSizing: boolean);
// IMainMenu
function singleServiceName: string;
@ -1079,7 +1089,7 @@ begin
// group, group item has the focus
grp := getProjectGroup();
fProjectGroup := grp.groupFilename();
if fProjectGroup.isNotEmpty() and MainForm.fProj.inGroup() then
if fProjectGroup.isNotEmpty() and assigned(MainForm.fProj) and MainForm.fProj.inGroup() then
begin
fProjectIndex := grp.getProjectIndex();
fProjectConfigIndex := MainForm.fProj.getActiveConfigurationIndex();
@ -1353,6 +1363,10 @@ begin
fProcInputHandler := getprocInputHandler;
InitDocking;
if FileExists(getDocPath + 'docking.xml') then
LoadDocking();
fInitialized := true;
end;
@ -1556,8 +1570,10 @@ begin
actFileNewClip.ImageIndex:= i;
i := loadIcon('ARROW_UNDO');
actEdUndo.ImageIndex:= i;
actEdUndoAll.ImageIndex:= i;
i := loadIcon('ARROW_REDO');
actEdRedo.ImageIndex:= i;
actEdRedoAll.ImageIndex:= i;
i := loadIcon('FIND');
actEdFind.ImageIndex:= i;
actEdFindNext.ImageIndex:= i;
@ -1606,6 +1622,19 @@ begin
fCleanIconIndex := loadIcon('CLEAN');
end;
procedure TMainForm.anchorDockingAddControlEvent(Sender: TObject; aName: string;
var AControl: TControl; DoDisableAutoSizing: boolean);
var w : TDexedWidget;
begin
AControl := nil;
for w in fWidgList do
if w.name = aName then
begin
AControl := w;
break;
end;
end;
procedure TMainForm.InitWidgets;
var
widg: TDexedWidget;
@ -1613,6 +1642,9 @@ var
itm: TMenuItem;
idx: integer;
begin
DockMaster.OnCreateControl := @anchorDockingAddControlEvent;
fWidgList := TWidgetList.Create;
fMesgWidg := TMessagesWidget.create(self);
fEditWidg := TEditorWidget.create(self);
@ -1632,8 +1664,9 @@ begin
fPrjGrpWidg := TProjectGroupWidget.create(self);
fProfWidg := TProfileViewerWidget.create(self);
fGdbWidg := TGdbWidget.create(self);
fBlameWidg := TBlameWidget.create(self);
{$IFDEF UNIX}
fTermWWidg := TTermWidget.create(self);
fTermWidg := TTermWidget.create(self);
{$ENDIF}
getMessageDisplay(fMsgs);
@ -1657,8 +1690,9 @@ begin
fWidgList.addWidget(@fPrjGrpWidg);
fWidgList.addWidget(@fProfWidg);
fWidgList.addWidget(@fGdbWidg);
fWidgList.addWidget(@fBlameWidg);
{$IFDEF UNIX}
fWidgList.addWidget(@fTermWWidg);
fWidgList.addWidget(@fTermWidg);
{$ENDIF}
fWidgList.sort(@CompareWidgCaption);
@ -1818,7 +1852,7 @@ begin
DockMaster.ManualDock(DockMaster.GetAnchorSite(fLibMWidg), DockMaster.GetSite(fMesgWidg), alClient, fMesgWidg);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fTodolWidg), DockMaster.GetSite(fMesgWidg), alClient, fMesgWidg);
{$IFDEF LINUX}
DockMaster.ManualDock(DockMaster.GetAnchorSite(fTermWWidg), DockMaster.GetSite(fMesgWidg), alClient, fMesgWidg);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fTermWidg), DockMaster.GetSite(fMesgWidg), alClient, fMesgWidg);
{$ENDIF}
fMesgWidg.showWidget;
// left
@ -2106,8 +2140,6 @@ var
begin
inherited;
InitDocking;
// TODO-cbetterfix: clipboard doesn't work first time it's used on a reloaded doc.
// see: http://forum.lazarus.freepascal.org/index.php/topic,30616.0.htm
if fAppliOpts.reloadLastDocuments then
@ -2125,11 +2157,6 @@ begin
fInfoWidg.showWidget;
end;
// see https://bugs.freepascal.org/view.php?id=29475
// reloading must be done here otherwise there are "jumps"
if FileExists(getDocPath + 'docking.xml') then
LoadDocking();
if fAppliOpts.autoCheckUpdates then
begin
url := checkForUpdate;
@ -2891,6 +2918,18 @@ begin
fDoc.Redo;
end;
procedure TMainForm.actEdRedoAllExecute(Sender: TObject);
begin
if fDoc.isAssigned then
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
@ -2930,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;
@ -4084,6 +4123,8 @@ begin
fProj.test;
end;
procedure TMainForm.actProjStopCompExecute(Sender: TObject);
begin
if fProj.isAssigned then

View File

@ -529,7 +529,7 @@ var
begin
if fMakeProc.isAssigned and fMakeProc.Active then
begin
fMsgs.message('the project is already being processed by DUB', fAsProjectItf, amcProj, amkWarn);
fMsgs.message('the project is already being compiled by make', fAsProjectItf, amcProj, amkWarn);
exit;
end;
killProcess(fMakeProc);

View File

@ -6,12 +6,6 @@ inherited MessagesWidget: TMessagesWidget
Caption = 'Messages'
ClientHeight = 159
ClientWidth = 844
inherited Back: TPanel
Height = 159
Width = 844
AutoSize = True
ClientHeight = 159
ClientWidth = 844
inherited Content: TPanel
Height = 123
Width = 844
@ -182,7 +176,6 @@ inherited MessagesWidget: TMessagesWidget
scaledSeparator = False
end
end
end
inherited contextMenu: TPopupMenu
Left = 32
Top = 40

View File

@ -811,6 +811,7 @@ var
i: integer;
n: TTreeNode;
begin
List.ClearSelection();
List.BeginUpdate;
for i := 0 to List.Items.Count-1 do
begin

View File

@ -7,12 +7,6 @@ inherited MiniExplorerWidget: TMiniExplorerWidget
Caption = 'Mini explorer'
ClientHeight = 565
ClientWidth = 535
inherited Back: TPanel
Height = 565
Width = 535
AutoSize = True
ClientHeight = 565
ClientWidth = 535
inherited Content: TPanel
Left = 4
Height = 523
@ -90,26 +84,54 @@ inherited MiniExplorerWidget: TMiniExplorerWidget
ObjectTypes = [otFolders]
ShellListView = lstFiles
end
object lstFiles: TShellListView
object Panel1: TPanel
Left = 0
Height = 162
Top = 224
Width = 527
Align = alClient
Caption = 'Panel1'
ClientHeight = 162
ClientWidth = 527
TabOrder = 2
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 = 2
TabOrder = 1
OnColumnClick = lstFilesColumnClick
OnDblClick = lstFilesDblClick
OnMouseMove = lstFilesMouseMove
OnFileAdded = lstFilesFileAdded
ObjectTypes = [otNonFolders, otHidden]
ShellTreeView = treeFolders
end
end
end
end
inherited toolbar: TDexedToolBar
Width = 527
OnResize = toolbarResize
@ -175,29 +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
end
inherited contextMenu: TPopupMenu
Left = 40
Top = 48
end
object mnuDrives: TPopupMenu[2]
object mnuDrives: TPopupMenu[3]
Left = 8
Top = 48
end

View File

@ -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;

View File

@ -8,11 +8,6 @@ inherited OptionEditorWidget: TOptionEditorWidget
ClientHeight = 514
ClientWidth = 637
OnCloseQuery = FormCloseQuery
inherited Back: TPanel
Height = 514
Width = 637
ClientHeight = 514
ClientWidth = 637
inherited Content: TPanel
Height = 478
Width = 637
@ -124,7 +119,6 @@ inherited OptionEditorWidget: TOptionEditorWidget
inherited toolbar: TDexedToolBar
Width = 629
end
end
inherited contextMenu: TPopupMenu
Left = 144
Top = 24

View File

@ -6,11 +6,6 @@ inherited ProcInputWidget: TProcInputWidget
Caption = 'Process input'
ClientHeight = 107
ClientWidth = 558
inherited Back: TPanel
Height = 107
Width = 558
ClientHeight = 107
ClientWidth = 558
inherited Content: TPanel
Height = 71
Width = 558
@ -91,7 +86,6 @@ inherited ProcInputWidget: TProcInputWidget
inherited toolbar: TDexedToolBar
Width = 550
end
end
inherited contextMenu: TPopupMenu
left = 16
top = 8

View File

@ -6,12 +6,6 @@ inherited ProfileViewerWidget: TProfileViewerWidget
Caption = 'Profile viewer'
ClientHeight = 537
ClientWidth = 551
inherited Back: TPanel
Height = 537
Width = 551
AutoSize = True
ClientHeight = 537
ClientWidth = 551
inherited Content: TPanel
Height = 501
Width = 551
@ -203,7 +197,6 @@ inherited ProfileViewerWidget: TProfileViewerWidget
scaledSeparator = False
end
end
end
inherited contextMenu: TPopupMenu
Left = 8
Top = 48

View File

@ -7,11 +7,6 @@ inherited ProjectGroupWidget: TProjectGroupWidget
Caption = 'Project group'
ClientHeight = 195
ClientWidth = 328
inherited Back: TPanel
Height = 195
Width = 328
ClientHeight = 195
ClientWidth = 328
inherited Content: TPanel
Height = 159
Width = 328
@ -168,7 +163,6 @@ inherited ProjectGroupWidget: TProjectGroupWidget
scaledSeparator = False
end
end
end
inherited contextMenu: TPopupMenu
Left = 272
Top = 56

View File

@ -9,12 +9,6 @@ inherited ProjectInspectWidget: TProjectInspectWidget
ClientHeight = 258
ClientWidth = 424
OnDropFiles = FormDropFiles
inherited Back: TPanel
Height = 258
Width = 424
AutoSize = True
ClientHeight = 258
ClientWidth = 424
inherited Content: TPanel
Height = 222
Width = 424
@ -144,7 +138,6 @@ inherited ProjectInspectWidget: TProjectInspectWidget
scaledSeparator = False
end
end
end
inherited contextMenu: TPopupMenu
Left = 128
Top = 48

View File

@ -6,19 +6,15 @@ inherited SearchWidget: TSearchWidget
Caption = 'Search & replace'
ClientHeight = 329
ClientWidth = 422
inherited Back: TPanel
Height = 329
Width = 422
ClientHeight = 329
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
@ -27,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
@ -45,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
@ -56,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
@ -110,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
@ -121,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
@ -149,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
@ -172,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
@ -183,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
@ -257,12 +253,11 @@ inherited SearchWidget: TSearchWidget
inherited toolbar: TDexedToolBar
Width = 414
end
end
inherited contextMenu: TPopupMenu
Left = 216
Top = 16
end
object imgList: TImageList[2]
object imgList: TImageList[3]
Left = 248
Top = 16
Bitmap = {

View File

@ -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);

View File

@ -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);

View File

@ -15,20 +15,20 @@ type
private
{
rendered on 2021-Nov-28 21:12:13.8852083 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 =
('', '', 'alias', 'this', 'f32', '', 's32', 's8', 'throw', 'f64', 'switch', 's64', '', '', '', '', '', '', 'finally', '', '', '', 'if', '', '', '', '', '', '', '', '', '', '', '', '', '', 'protection', 's16', '', '', 'goto', 'usize', '', '', 'in', '', 'static', '', 'try', '', '', '', 'enum', 'do', '', '', '', 'super', 'const', 'union', '', '', 'else', '', 'version', '', '', '', '', 'u32', 'u8', 'echo', '', 'true', 'u64', 'asm', '', 'struct', '', 'auto', 'bool', '', '', '', '', '', 'false', 'null', 'class', '', '', 'overload', '', '', '', '', 'label', '', 'assert', 'continue', 'u16', 'foreach', 'break', '', '', '', 'ssize', '', '', '', '', 'unit', 'while', '', 'var', 'new', 'with', 'template', '', 'import', 'on', 'delete', '', 'function', '', 'return', '', '');
('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 =
(false, false, true, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, false, false, false, true, true, true, false, false, true, false, true, false, false, false, false, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, false, false, true, true, true, false, false, true, false, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, false, false, false, true, true, false, true, true, true, true, false, true, true, true, false, true, false, true, false, false);
(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 =
(251, 141, 241, 229, 153, 224, 69, 154, 183, 60, 181, 128, 168, 190, 25, 39, 142, 116, 172, 48, 49, 203, 195, 46, 229, 38, 232, 88, 114, 147, 97, 185, 242, 43, 34, 75, 89, 228, 21, 156, 254, 129, 186, 74, 224, 78, 146, 25, 49, 118, 232, 70, 92, 34, 215, 44, 47, 48, 153, 28, 19, 111, 146, 97, 159, 224, 143, 72, 212, 194, 30, 104, 134, 217, 123, 30, 68, 206, 208, 50, 96, 3, 30, 30, 90, 245, 234, 93, 191, 97, 112, 45, 103, 11, 225, 255, 132, 128, 78, 62, 41, 62, 214, 100, 191, 64, 95, 146, 234, 243, 236, 12, 68, 60, 72, 216, 44, 23, 42, 201, 206, 188, 188, 190, 114, 193, 20, 143, 119, 31, 235, 96, 72, 92, 146, 146, 227, 33, 253, 76, 142, 189, 58, 38, 203, 68, 19, 35, 82, 49, 150, 78, 157, 199, 33, 210, 223, 133, 237, 56, 89, 123, 20, 177, 68, 205, 21, 128, 142, 35, 222, 180, 138, 141, 10, 160, 212, 166, 255, 166, 75, 212, 216, 239, 76, 119, 45, 62, 130, 21, 116, 119, 253, 50, 241, 160, 208, 225, 244, 55, 57, 238, 239, 107, 190, 143, 165, 125, 217, 80, 18, 244, 72, 210, 28, 77, 138, 40, 239, 124, 75, 87, 92, 121, 107, 222, 0, 23, 215, 213, 133, 144, 208, 216, 191, 170, 75, 182, 75, 230, 218, 136, 44, 134, 191, 183, 126, 108, 58, 29, 52, 163, 111, 131, 198, 230);
(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;

View File

@ -6,7 +6,6 @@ inherited SymbolListWidget: TSymbolListWidget
Caption = 'Symbol list'
ClientHeight = 430
ClientWidth = 308
inherited Back: TPanel
Height = 430
Width = 308
AutoSize = True
@ -87,7 +86,6 @@ inherited SymbolListWidget: TSymbolListWidget
FilteredTreeview = Tree
end
end
end
inherited contextMenu: TPopupMenu
Left = 112
Top = 48

View File

@ -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;

View File

@ -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;
@ -381,9 +382,13 @@ type
procedure replaceUndoableContent(const value: string);
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;
@ -481,6 +486,10 @@ const
ecRightWordEdge = ecUserFirst + 31;
ecSelLeftWordEdge = ecUserFirst + 32;
ecSelRightWordEdge = ecUserFirst + 33;
ecRedoAll = ecUserFirst + 34;
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.
@ -839,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;
@ -866,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
@ -1234,9 +1246,6 @@ begin
LineHighlightColor.Background := color - $080808;
LineHighlightColor.Foreground := clNone;
//fIndentGuideMarkup:= TSynEditMarkupFoldColors.Create(self);
//MarkupManager.AddMarkUp(fIndentGuideMarkup);
fAutoCloseCurlyBrace:= autoCloseOnNewLineLexically;
fAutoClosedPairs:= [autoCloseSquareBracket];
@ -1256,7 +1265,6 @@ destructor TDexedMemo.destroy;
begin
saveCache;
//fIndentGuideMarkup.Free;
EntitiesConnector.removeObserver(self);
subjDocClosing(TMultiDocSubject(fMultiDocSubject), self);
fMultiDocSubject.Free;
@ -1481,6 +1489,10 @@ begin
AddKey(ecSelRightWordEdge, 0, [], 0, []);
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;
end;
@ -1520,6 +1532,10 @@ begin
'ecRightWordEdge': begin Int := ecRightWordEdge; exit(true); end;
'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);
end;
end;
@ -1560,6 +1576,10 @@ begin
ecRightWordEdge: begin Ident := 'ecRightWordEdge'; exit(true); end;
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);
end;
end;
@ -1692,6 +1712,14 @@ begin
gotoWordEdge(false);
ecRightWordEdge, ecSelRightWordEdge:
gotoWordEdge(true);
ecRedoAll:
redoAll();
ecUndoAll:
undoAll();
ecScrollCenteredUp:
scrollCentered(false);
ecScrollCenteredDown:
scrollCentered(true);
end;
if fOverrideColMode and not SelAvail then
begin
@ -2128,6 +2156,35 @@ begin
TopView := NewTopLine;
end;
procedure TDexedMemo.scrollCentered(down: boolean);
begin
centerCursor();
if not down then
begin
ExecuteCommand(ecScrollDown, #0, nil);
CaretY := CaretY - 1;
end else
begin
ExecuteCommand(ecScrollUp, #0, nil);
CaretY := CaretY + 1;
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;
@ -2673,6 +2730,22 @@ begin
end;
end;
procedure TDexedMemo.redoAll();
begin
BeginUpdate(false);
while CanRedo do
Redo;
EndUpdate();
end;
procedure TDexedMemo.undoAll();
begin
BeginUpdate(false);
while CanUndo do
Undo;
EndUpdate();
end;
procedure TDexedMemo.gotoWordEdge(right: boolean);
var
s: string;
@ -2889,6 +2962,7 @@ var
h: TStringHashSet;
const
c: TSysCharSet = ['A'..'Z', 'a'..'z', '_'];
a: TSysCharSet = ['A'..'Z', 'a'..'z', '_', '0' .. '9'];
begin
fCompletion.Position := 0;
@ -2920,7 +2994,16 @@ begin
r := TStringRange.create(lines[i]);
while not r.empty do
begin
w := r.popUntil(c)^.takeWhile(c).yield;
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
h.insert(w);
@ -2940,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
@ -3309,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;

View File

@ -6,11 +6,6 @@ inherited TermWidget: TTermWidget
ClientHeight = 296
ClientWidth = 674
OnShortCut = FormShortCut
inherited Back: TPanel
Height = 296
Width = 674
ClientHeight = 296
ClientWidth = 674
inherited Content: TPanel
Height = 260
Width = 674
@ -43,4 +38,3 @@ inherited TermWidget: TTermWidget
Width = 666
end
end
end

View File

@ -6,12 +6,6 @@ inherited TodoListWidget: TTodoListWidget
Caption = 'Todo list'
ClientHeight = 337
ClientWidth = 584
inherited Back: TPanel
Height = 337
Width = 584
AutoSize = True
ClientHeight = 337
ClientWidth = 584
inherited Content: TPanel
Height = 301
Width = 584
@ -97,7 +91,6 @@ inherited TodoListWidget: TTodoListWidget
TabOrder = 0
end
end
end
inherited contextMenu: TPopupMenu
Left = 40
Top = 72

View File

@ -6,14 +6,9 @@ inherited ToolsEditorWidget: TToolsEditorWidget
Caption = 'Tools editor'
ClientHeight = 280
ClientWidth = 441
inherited Back: TPanel
Height = 280
Width = 441
AutoSize = True
ClientHeight = 280
ClientWidth = 441
inherited Content: TPanel
Height = 244
Top = 36
Width = 441
ClientHeight = 244
ClientWidth = 441
@ -35,9 +30,11 @@ inherited ToolsEditorWidget: TToolsEditorWidget
Top = 0
Width = 160
Align = alLeft
ExtendedSelect = False
ItemHeight = 0
OnDblClick = lstToolsDblClick
OnDrawItem = lstToolsDrawItem
OnKeyPress = lstToolsKeyPress
OnSelectionChange = lstToolsSelectionChange
ScrollWidth = 158
Style = lbOwnerDrawFixed
@ -70,6 +67,7 @@ inherited ToolsEditorWidget: TToolsEditorWidget
end
end
inherited toolbar: TDexedToolBar
Height = 30
Width = 433
object btnRun: TDexedToolButton[0]
Left = 174
@ -161,9 +159,8 @@ inherited ToolsEditorWidget: TToolsEditorWidget
scaledSeparator = False
end
end
end
inherited contextMenu: TPopupMenu
left = 16
top = 40
Left = 16
Top = 40
end
end

View File

@ -36,6 +36,7 @@ type
procedure lstToolsDblClick(Sender: TObject);
procedure lstToolsDrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState);
procedure lstToolsKeyPress(Sender: TObject; var Key: char);
procedure lstToolsSelectionChange(Sender: TObject; User: boolean);
procedure propsEdModified(Sender: TObject);
private
@ -261,5 +262,10 @@ begin
lstTools.Canvas.TextOut(rc.Left, rc.Top , CustomTools.tool[Index].toolAlias);
end;
procedure TToolsEditorWidget.lstToolsKeyPress(Sender: TObject; var Key: char);
begin
key := #0;
end;
end.

View File

@ -1,42 +1,31 @@
object DexedWidget: TDexedWidget
Left = 1360
Height = 121
Height = 118
Top = 144
Width = 332
Width = 325
BorderIcons = [biMinimize, biMaximize]
Caption = 'DexedWidget'
ClientHeight = 121
ClientWidth = 332
ClientHeight = 118
ClientWidth = 325
DesignTimePPI = 94
ShowHint = True
ShowInTaskBar = stNever
LCLVersion = '2.2.0.1'
object Back: TPanel
Left = 0
Height = 121
Top = 0
Width = 332
Align = alClient
BevelOuter = bvNone
ClientHeight = 121
ClientWidth = 332
FullRepaint = False
TabOrder = 0
object Content: TPanel
Left = 0
Height = 85
Top = 36
Width = 332
Height = 83
Top = 35
Width = 325
Align = alClient
AutoSize = True
BevelOuter = bvNone
PopupMenu = contextMenu
TabOrder = 0
TabOrder = 1
end
object toolbar: TDexedToolBar
Left = 4
Height = 30
Height = 29
Top = 4
Width = 324
Width = 317
BorderSpacing.Left = 2
BorderSpacing.Top = 2
BorderSpacing.Right = 2
@ -46,10 +35,9 @@ object DexedWidget: TDexedWidget
EdgeInner = esNone
EdgeOuter = esNone
Flat = False
TabOrder = 1
TabOrder = 2
Transparent = True
end
end
object contextMenu: TPopupMenu
end
end