You can subscribe to this list here.
| 2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(11) |
Sep
(46) |
Oct
(3) |
Nov
(1) |
Dec
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2008 |
Jan
|
Feb
(11) |
Mar
(6) |
Apr
(77) |
May
|
Jun
(29) |
Jul
(5) |
Aug
(8) |
Sep
(76) |
Oct
(55) |
Nov
(4) |
Dec
(18) |
| 2009 |
Jan
(22) |
Feb
(3) |
Mar
(28) |
Apr
(5) |
May
(9) |
Jun
(10) |
Jul
(2) |
Aug
(12) |
Sep
(19) |
Oct
(12) |
Nov
(9) |
Dec
(14) |
| 2010 |
Jan
(1) |
Feb
(12) |
Mar
(1) |
Apr
(1) |
May
(3) |
Jun
(2) |
Jul
(2) |
Aug
|
Sep
(16) |
Oct
(3) |
Nov
|
Dec
(11) |
| 2011 |
Jan
(11) |
Feb
(3) |
Mar
(10) |
Apr
|
May
|
Jun
(21) |
Jul
(8) |
Aug
(3) |
Sep
(20) |
Oct
|
Nov
|
Dec
(6) |
| 2012 |
Jan
(2) |
Feb
(6) |
Mar
(8) |
Apr
|
May
|
Jun
|
Jul
|
Aug
(15) |
Sep
(15) |
Oct
(10) |
Nov
(33) |
Dec
(3) |
| 2013 |
Jan
(2) |
Feb
|
Mar
|
Apr
(10) |
May
|
Jun
(3) |
Jul
(4) |
Aug
(3) |
Sep
|
Oct
(8) |
Nov
|
Dec
(1) |
| 2014 |
Jan
|
Feb
|
Mar
|
Apr
(67) |
May
(11) |
Jun
(6) |
Jul
|
Aug
|
Sep
(9) |
Oct
|
Nov
|
Dec
|
| 2015 |
Jan
|
Feb
(2) |
Mar
(1) |
Apr
(17) |
May
(11) |
Jun
(29) |
Jul
(8) |
Aug
|
Sep
(15) |
Oct
(72) |
Nov
(80) |
Dec
(47) |
| 2016 |
Jan
(125) |
Feb
(51) |
Mar
(13) |
Apr
(127) |
May
(84) |
Jun
(86) |
Jul
(47) |
Aug
(11) |
Sep
(62) |
Oct
(52) |
Nov
(4) |
Dec
|
| 2017 |
Jan
(62) |
Feb
(24) |
Mar
(40) |
Apr
(51) |
May
(1) |
Jun
(13) |
Jul
(20) |
Aug
(4) |
Sep
(6) |
Oct
(2) |
Nov
|
Dec
(15) |
| 2018 |
Jan
(28) |
Feb
(8) |
Mar
(21) |
Apr
(66) |
May
(31) |
Jun
(19) |
Jul
(44) |
Aug
(29) |
Sep
(21) |
Oct
(11) |
Nov
(57) |
Dec
(61) |
| 2019 |
Jan
|
Feb
(26) |
Mar
(38) |
Apr
(25) |
May
(24) |
Jun
(13) |
Jul
(30) |
Aug
(10) |
Sep
(53) |
Oct
(55) |
Nov
(81) |
Dec
(111) |
| 2020 |
Jan
(31) |
Feb
(14) |
Mar
(18) |
Apr
(18) |
May
(72) |
Jun
(21) |
Jul
(68) |
Aug
(15) |
Sep
(47) |
Oct
(39) |
Nov
(23) |
Dec
(33) |
| 2021 |
Jan
(9) |
Feb
(17) |
Mar
(19) |
Apr
(41) |
May
(39) |
Jun
(7) |
Jul
(13) |
Aug
(15) |
Sep
(52) |
Oct
(51) |
Nov
(30) |
Dec
(58) |
| 2022 |
Jan
(33) |
Feb
(4) |
Mar
(12) |
Apr
(17) |
May
(12) |
Jun
(7) |
Jul
(3) |
Aug
(7) |
Sep
(44) |
Oct
(6) |
Nov
(5) |
Dec
(13) |
| 2023 |
Jan
(25) |
Feb
(16) |
Mar
(35) |
Apr
(13) |
May
(6) |
Jun
|
Jul
(13) |
Aug
(8) |
Sep
(1) |
Oct
(24) |
Nov
(34) |
Dec
(56) |
| 2024 |
Jan
(28) |
Feb
(27) |
Mar
|
Apr
(8) |
May
(25) |
Jun
(17) |
Jul
(14) |
Aug
(16) |
Sep
(35) |
Oct
(23) |
Nov
(25) |
Dec
(29) |
| 2025 |
Jan
(12) |
Feb
(10) |
Mar
(52) |
Apr
(39) |
May
(59) |
Jun
(29) |
Jul
(27) |
Aug
(48) |
Sep
(111) |
Oct
(64) |
Nov
(48) |
Dec
(11) |
| 2026 |
Jan
(113) |
Feb
(138) |
Mar
(136) |
Apr
(22) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <tw...@us...> - 2026-04-18 16:10:11
|
Revision: 5351
http://sourceforge.net/p/gexperts/code/5351
Author: twm
Date: 2026-04-18 16:10:09 +0000 (Sat, 18 Apr 2026)
Log Message:
-----------
Release 1.3.28: bump version to 1.3.29, add changelog for next release
Modified Paths:
--------------
trunk/Projects/GExperts_version.ini
Added Paths:
-----------
trunk/Documentation/CHANGES-1.3.29.md
Added: trunk/Documentation/CHANGES-1.3.29.md
===================================================================
--- trunk/Documentation/CHANGES-1.3.29.md (rev 0)
+++ trunk/Documentation/CHANGES-1.3.29.md 2026-04-18 16:10:09 UTC (rev 5351)
@@ -0,0 +1,11 @@
+# GExperts 1.3.29 Changes
+
+Changes since version 1.3.28 (released 2026-04-18)
+
+## New Features
+
+## Bug Fixes
+
+## Contributors
+
+- Thomas Mueller (twm)
Modified: trunk/Projects/GExperts_version.ini
===================================================================
--- trunk/Projects/GExperts_version.ini 2026-04-18 16:10:03 UTC (rev 5350)
+++ trunk/Projects/GExperts_version.ini 2026-04-18 16:10:09 UTC (rev 5351)
@@ -2,7 +2,7 @@
Build=85
MajorVer=1
MinorVer=3
-Release=28
+Release=29
AutoIncBuild=0
Revision=
Private=0
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-18 16:10:05
|
Revision: 5350
http://sourceforge.net/p/gexperts/code/5350
Author: twm
Date: 2026-04-18 16:10:03 +0000 (Sat, 18 Apr 2026)
Log Message:
-----------
Tag release 1.3.28
Added Paths:
-----------
tags/1.3.28_2026-04-18/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-18 15:51:34
|
Revision: 5349
http://sourceforge.net/p/gexperts/code/5349
Author: twm
Date: 2026-04-18 15:51:32 +0000 (Sat, 18 Apr 2026)
Log Message:
-----------
__BuildEverything.cmd: show version number in the banner
Read MajorVer, MinorVer, and Release from Projects/GExperts_version.ini
and include the resulting version in the initial banner so the user can
confirm which version they are about to build.
Modified Paths:
--------------
trunk/__BuildEverything.cmd
Modified: trunk/__BuildEverything.cmd
===================================================================
--- trunk/__BuildEverything.cmd 2026-04-18 15:36:07 UTC (rev 5348)
+++ trunk/__BuildEverything.cmd 2026-04-18 15:51:32 UTC (rev 5349)
@@ -1,106 +1,114 @@
-@rem Full GExperts release build: all DLLs, standalone tools, and installers
-@setlocal enableextensions
-@if not defined gx_cmd_debug (echo off)
-@endlocal
-setlocal
-
-cd /d "%~dp0"
-
-echo.
-echo ============================================================
-echo GExperts Full Release Build
-echo ============================================================
-echo.
-echo This script will:
-echo 1. Build all GExperts DLLs (all Delphi versions)
-echo 2. Build standalone tools included in the installer:
-echo CodeFormatter, DebugWindow, ExpertManager, Grep, PeInformation
-echo 3. Build all installers
-echo.
-echo Select Delphi version for building the standalone tools:
-echo.
-call Projects\StandAlone\doSelectDelphi.cmd
-if not defined delphiver (
- echo.
- echo Cancelled - no Delphi version selected.
- exit /b 1
-)
-echo.
-echo Standalone tools will be built with Delphi %delphiver%.
-echo.
-set /p _confirm=Press Enter to start the build, or Ctrl+C to cancel...
-echo.
-
-rem === Step 1: Build all GExperts DLLs ===
-title Step 1/3: Building GExperts DLLs
-echo Step 1 of 3: Building all GExperts DLLs...
-echo.
-pushd Projects
-call _BuildNoPause.cmd
-set _err=%ERRORLEVEL%
-popd
-if %_err% neq 0 (
- echo.
- echo ERROR: GExperts DLL build failed.
- set /p _dummy=Press Enter to exit...
- exit /b 1
-)
-echo.
-
-rem === Step 2: Build standalone tools ===
-echo Step 2 of 3: Building standalone tools...
-echo.
-call :standalone CodeFormatter GExpertsFormatter
-if errorlevel 1 exit /b 1
-call :standalone DebugWindow GExpertsDebugWindow
-if errorlevel 1 exit /b 1
-call :standalone ExpertManager ExpertManager
-if errorlevel 1 exit /b 1
-call :standalone Grep GExpertsGrep
-if errorlevel 1 exit /b 1
-call :standalone PeInformation GExpertsPeInformation
-if errorlevel 1 exit /b 1
-echo.
-
-rem === Step 3: Build installers ===
-title Step 3/3: Building installers
-echo Step 3 of 3: Building installers...
-echo.
-pushd BuildInstall
-call MakeInstallers.cmd
-set _err=%ERRORLEVEL%
-popd
-if %_err% neq 0 (
- echo.
- echo ERROR: Installer build failed.
- set /p _dummy=Press Enter to exit...
- exit /b 1
-)
-
-title Build complete
-echo.
-echo ============================================================
-echo Build complete! Installers are in BuildInstall\Output\
-echo ============================================================
-echo.
-if not defined gx_no_success_pause pause
-exit /b 0
-
-:standalone
-rem %1 = directory name under Projects\StandAlone\
-rem %2 = project name prefix passed to doBuildStandAlone.cmd
-setlocal
-set _tool=%~1
-set _prefix=%~2
-title Step 2/3: Building %_prefix%
-echo Building %_prefix%...
-pushd "Projects\StandAlone\%_tool%\src"
-call "..\..\doBuildStandAlone.cmd" %_prefix%
-set _err=%ERRORLEVEL%
-popd
-if %_err%==0 (endlocal & exit /b 0)
-endlocal
-echo.
-echo ERROR: Failed to build %_prefix%.
-set /p _dummy=Press Enter to exit...
-exit /b 1
+@rem Full GExperts release build: all DLLs, standalone tools, and installers
+@setlocal enableextensions
+@if not defined gx_cmd_debug (echo off)
+@endlocal
+setlocal
+
+cd /d "%~dp0"
+
+rem Read version from Projects\GExperts_version.ini
+for /f "tokens=1,2 delims==" %%a in ('findstr /b /c:"MajorVer=" /c:"MinorVer=" /c:"Release=" "Projects\GExperts_version.ini"') do (
+ if /i "%%a"=="MajorVer" set _major=%%b
+ if /i "%%a"=="MinorVer" set _minor=%%b
+ if /i "%%a"=="Release" set _release=%%b
+)
+set _version=%_major%.%_minor%.%_release%
+
+echo.
+echo ============================================================
+echo GExperts Full Release Build - Version %_version%
+echo ============================================================
+echo.
+echo This script will:
+echo 1. Build all GExperts DLLs (all Delphi versions)
+echo 2. Build standalone tools included in the installer:
+echo CodeFormatter, DebugWindow, ExpertManager, Grep, PeInformation
+echo 3. Build all installers
+echo.
+echo Select Delphi version for building the standalone tools:
+echo.
+call Projects\StandAlone\doSelectDelphi.cmd
+if not defined delphiver (
+ echo.
+ echo Cancelled - no Delphi version selected.
+ exit /b 1
+)
+echo.
+echo Standalone tools will be built with Delphi %delphiver%.
+echo.
+set /p _confirm=Press Enter to start the build, or Ctrl+C to cancel...
+echo.
+
+rem === Step 1: Build all GExperts DLLs ===
+title Step 1/3: Building GExperts DLLs
+echo Step 1 of 3: Building all GExperts DLLs...
+echo.
+pushd Projects
+call _BuildNoPause.cmd
+set _err=%ERRORLEVEL%
+popd
+if %_err% neq 0 (
+ echo.
+ echo ERROR: GExperts DLL build failed.
+ set /p _dummy=Press Enter to exit...
+ exit /b 1
+)
+echo.
+
+rem === Step 2: Build standalone tools ===
+echo Step 2 of 3: Building standalone tools...
+echo.
+call :standalone CodeFormatter GExpertsFormatter
+if errorlevel 1 exit /b 1
+call :standalone DebugWindow GExpertsDebugWindow
+if errorlevel 1 exit /b 1
+call :standalone ExpertManager ExpertManager
+if errorlevel 1 exit /b 1
+call :standalone Grep GExpertsGrep
+if errorlevel 1 exit /b 1
+call :standalone PeInformation GExpertsPeInformation
+if errorlevel 1 exit /b 1
+echo.
+
+rem === Step 3: Build installers ===
+title Step 3/3: Building installers
+echo Step 3 of 3: Building installers...
+echo.
+pushd BuildInstall
+call MakeInstallers.cmd
+set _err=%ERRORLEVEL%
+popd
+if %_err% neq 0 (
+ echo.
+ echo ERROR: Installer build failed.
+ set /p _dummy=Press Enter to exit...
+ exit /b 1
+)
+
+title Build complete
+echo.
+echo ============================================================
+echo Build complete! Installers are in BuildInstall\Output\
+echo ============================================================
+echo.
+if not defined gx_no_success_pause pause
+exit /b 0
+
+:standalone
+rem %1 = directory name under Projects\StandAlone\
+rem %2 = project name prefix passed to doBuildStandAlone.cmd
+setlocal
+set _tool=%~1
+set _prefix=%~2
+title Step 2/3: Building %_prefix%
+echo Building %_prefix%...
+pushd "Projects\StandAlone\%_tool%\src"
+call "..\..\doBuildStandAlone.cmd" %_prefix%
+set _err=%ERRORLEVEL%
+popd
+if %_err%==0 (endlocal & exit /b 0)
+endlocal
+echo.
+echo ERROR: Failed to build %_prefix%.
+set /p _dummy=Press Enter to exit...
+exit /b 1
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-18 15:36:09
|
Revision: 5348
http://sourceforge.net/p/gexperts/code/5348
Author: twm
Date: 2026-04-18 15:36:07 +0000 (Sat, 18 Apr 2026)
Log Message:
-----------
Remove accidental duplicate tag; 1.3.27 was already tagged on 2026-03-21
Removed Paths:
-------------
tags/1.3.27_2026-04-18/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-18 15:30:42
|
Revision: 5347
http://sourceforge.net/p/gexperts/code/5347
Author: twm
Date: 2026-04-18 15:30:12 +0000 (Sat, 18 Apr 2026)
Log Message:
-----------
Bump Release= to 28 to match actual repo state
1.3.27 was released at r5312 (tag 1.3.27_2026-03-21) but the version.ini
bump silently failed due to the sed/CRLF bug fixed in r5346. All
changelog entries since r5312 have been going into CHANGES-1.3.28.md,
so the repo has effectively been on 1.3.28 - this just corrects
version.ini to match.
Modified Paths:
--------------
trunk/Projects/GExperts_version.ini
Modified: trunk/Projects/GExperts_version.ini
===================================================================
--- trunk/Projects/GExperts_version.ini 2026-04-18 15:29:43 UTC (rev 5346)
+++ trunk/Projects/GExperts_version.ini 2026-04-18 15:30:12 UTC (rev 5347)
@@ -2,7 +2,7 @@
Build=85
MajorVer=1
MinorVer=3
-Release=27
+Release=28
AutoIncBuild=0
Revision=
Private=0
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-18 15:29:45
|
Revision: 5346
http://sourceforge.net/p/gexperts/code/5346
Author: twm
Date: 2026-04-18 15:29:43 +0000 (Sat, 18 Apr 2026)
Log Message:
-----------
Improve __PublishRelease.sh robustness after 1.3.27 release incident
Three independent fixes, all triggered by the r5312 incident where the
1.3.27 release committed the new CHANGES-1.3.28.md but silently failed
to bump Release= in version.ini.
1. Step 9 (bump version): the sed regex ^Release=27$ never matched
because version.ini has CRLF line endings - the \r sits before the
end-of-line anchor. Now matches an optional trailing CR and verifies
that the substitution actually changed the file; aborts loudly if
not.
2. Step 8 (next-version changelog): instead of silently skipping when
CHANGES-<next>.md already exists, prompt the user whether to
overwrite. svn add is only run for genuinely new files.
3. Step 1 (early sanity check): warn when CHANGES-<next>.md already
exists before doing any release work, since this almost always
indicates a prior release failed to bump the version or entries
are going into the wrong file.
Modified Paths:
--------------
trunk/__PublishRelease.sh
Modified: trunk/__PublishRelease.sh
===================================================================
--- trunk/__PublishRelease.sh 2026-04-18 15:14:34 UTC (rev 5345)
+++ trunk/__PublishRelease.sh 2026-04-18 15:29:43 UTC (rev 5346)
@@ -86,6 +86,27 @@
echo "Version: $VERSION"
echo "Date: $TODAY"
+# Sanity check: if the changelog for the NEXT version already exists, something
+# is wrong — either an earlier release run failed to bump Release= in
+# version.ini (as happened before r5344), or changelog entries have been added
+# to the wrong file. Warn and let the user decide whether to continue.
+SANITY_NEXT_RELEASE=$((RELEASE + 1))
+SANITY_NEXT_VERSION="${MAJOR_VER}.${MINOR_VER}.${SANITY_NEXT_RELEASE}"
+SANITY_NEXT_CHANGES="Documentation/CHANGES-${SANITY_NEXT_VERSION}.md"
+if [[ -f "$SANITY_NEXT_CHANGES" ]]; then
+ echo ""
+ echo "WARNING: Changelog for the next version already exists:"
+ echo " $SANITY_NEXT_CHANGES"
+ echo "This usually means ${VERSION} was already released and version.ini"
+ echo "was not bumped, or changelog entries are going into the wrong file."
+ read -r -p "Continue anyway? [y/N]: " confirm
+ if [[ "${confirm,,}" != "y" ]]; then
+ echo "Aborted."
+ exit 1
+ fi
+fi
+unset SANITY_NEXT_RELEASE SANITY_NEXT_VERSION SANITY_NEXT_CHANGES
+
# Extract expected installer prefixes from MakeInstallers.cmd
# Logic mirrors the :makeinst subroutine: if a second arg is given it is the
# prefix, otherwise the first arg doubles as the prefix.
@@ -420,12 +441,7 @@
NEXT_VERSION="${MAJOR_VER}.${MINOR_VER}.${NEXT_RELEASE}"
NEXT_CHANGES="Documentation/CHANGES-${NEXT_VERSION}.md"
-if [[ -f "$NEXT_CHANGES" ]]; then
- echo "Already exists: $NEXT_CHANGES (skipping)"
-elif $DRY_RUN; then
- echo "[DRY RUN] Would create: $NEXT_CHANGES"
- echo "[DRY RUN] svn.exe add Documentation/CHANGES-${NEXT_VERSION}.md"
-else
+write_next_changelog() {
cat > "$NEXT_CHANGES" <<__CHANGELOG__
# GExperts ${NEXT_VERSION} Changes
@@ -439,6 +455,30 @@
- Thomas Mueller (twm)
__CHANGELOG__
+}
+
+NEXT_CHANGES_EXISTED=false
+NEXT_CHANGES_OVERWRITTEN=false
+
+if [[ -f "$NEXT_CHANGES" ]]; then
+ NEXT_CHANGES_EXISTED=true
+ if $DRY_RUN; then
+ echo "[DRY RUN] Exists: $NEXT_CHANGES — would prompt user whether to overwrite"
+ else
+ read -r -p "Changelog already exists: $NEXT_CHANGES — overwrite? [y/N]: " confirm
+ if [[ "${confirm,,}" == "y" ]]; then
+ write_next_changelog
+ NEXT_CHANGES_OVERWRITTEN=true
+ echo "Overwritten: $NEXT_CHANGES"
+ else
+ echo "Kept existing: $NEXT_CHANGES"
+ fi
+ fi
+elif $DRY_RUN; then
+ echo "[DRY RUN] Would create: $NEXT_CHANGES"
+ echo "[DRY RUN] svn.exe add Documentation/CHANGES-${NEXT_VERSION}.md"
+else
+ write_next_changelog
echo "Created: $NEXT_CHANGES"
svn.exe add "Documentation/CHANGES-${NEXT_VERSION}.md"
echo "Added to SVN."
@@ -459,11 +499,21 @@
echo "[DRY RUN] Would update $VERSION_INI: Release=${RELEASE} → Release=${NEXT_RELEASE}"
echo "[DRY RUN] svn.exe commit -m \"Release ${VERSION}: bump version to ${NEXT_VERSION}, add changelog for next release\""
else
- # sed -i can fail on NTFS mounts in WSL; use temp-file workaround instead
- sed "s/^Release=${RELEASE}$/Release=${NEXT_RELEASE}/" "$VERSION_INI" \
- > /tmp/gx_version_bump_$$.ini
- cp /tmp/gx_version_bump_$$.ini "$VERSION_INI"
- rm /tmp/gx_version_bump_$$.ini
+ # sed -i can fail on NTFS mounts in WSL; use temp-file workaround instead.
+ # Match optional trailing CR so the substitution works on CRLF files and
+ # preserves the original line ending.
+ CR=$'\r'
+ TMP_INI="/tmp/gx_version_bump_$$.ini"
+ sed -E "s/^Release=${RELEASE}(${CR}?)\$/Release=${NEXT_RELEASE}\\1/" \
+ "$VERSION_INI" > "$TMP_INI"
+ if diff -q "$VERSION_INI" "$TMP_INI" > /dev/null; then
+ rm -f "$TMP_INI"
+ echo "ERROR: Failed to bump Release in $VERSION_INI (no matching line found)"
+ echo " Expected to find: Release=${RELEASE}"
+ exit 1
+ fi
+ cp "$TMP_INI" "$VERSION_INI"
+ rm -f "$TMP_INI"
echo "Updated $VERSION_INI: Release=${RELEASE} → Release=${NEXT_RELEASE}"
svn.exe commit \
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-18 15:14:36
|
Revision: 5345
http://sourceforge.net/p/gexperts/code/5345
Author: twm
Date: 2026-04-18 15:14:34 +0000 (Sat, 18 Apr 2026)
Log Message:
-----------
Tag release 1.3.27
Added Paths:
-----------
tags/1.3.27_2026-04-18/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-14 15:43:15
|
Revision: 5344
http://sourceforge.net/p/gexperts/code/5344
Author: twm
Date: 2026-04-14 15:43:13 +0000 (Tue, 14 Apr 2026)
Log Message:
-----------
Fix Uses Clause Manager access violation on 64-bit IDE
TStringGrid.AssociatedList stored a TStringList pointer in TComponent.Tag
(Integer, 32-bit), truncating the upper 32 bits on Win64. Replaced with
a proper FAssociatedList field.
Modified Paths:
--------------
trunk/Documentation/CHANGES-1.3.28.md
trunk/Source/UsesExpert/GX_UsesExpert.pas
Modified: trunk/Documentation/CHANGES-1.3.28.md
===================================================================
--- trunk/Documentation/CHANGES-1.3.28.md 2026-04-11 12:14:36 UTC (rev 5343)
+++ trunk/Documentation/CHANGES-1.3.28.md 2026-04-14 15:43:13 UTC (rev 5344)
@@ -26,6 +26,7 @@
- Grep: Work around blank docked Grep Results window by calling ForceRedraw after ShowForm
- Auto Switch Desktop: Fixed crash in Debug builds when pressing F12 — `GetAsyncKeyState` with `SmallInt` caused a range check error; replaced with `GetKeyState` and `< 0` test (bug #481)
- Vertical Tabs: Fixed file switching not working in Delphi 6/7 by pausing the polling timer during switch. Project and project group files are now filtered from the list (feature #226)
+- Uses Clause Manager: Fixed access violation on 64-bit IDE caused by storing a TStringList pointer in the 32-bit TComponent.Tag property, truncating the upper 32 bits
## Contributors
Modified: trunk/Source/UsesExpert/GX_UsesExpert.pas
===================================================================
--- trunk/Source/UsesExpert/GX_UsesExpert.pas 2026-04-11 12:14:36 UTC (rev 5343)
+++ trunk/Source/UsesExpert/GX_UsesExpert.pas 2026-04-14 15:43:13 UTC (rev 5344)
@@ -38,11 +38,9 @@
type
TStringGrid = class(Grids.TStringGrid)
private
- function GetAssociatedList: TStringList;
- procedure SetAssociatedList(const Value: TStringList);
- published
+ FAssociatedList: TStringList;
public
- property AssociatedList: TStringList read GetAssociatedList write SetAssociatedList;
+ property AssociatedList: TStringList read FAssociatedList write FAssociatedList;
end;
type
@@ -3644,16 +3642,6 @@
{ TStringGrid }
-function TStringGrid.GetAssociatedList: TStringList;
-begin
- Result := TStringList(Tag);
-end;
-
-procedure TStringGrid.SetAssociatedList(const Value: TStringList);
-begin
- Tag := Integer(Value);
-end;
-
procedure TfmUsesManager.pnlIdentifiersResize(Sender: TObject);
begin
inherited;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-11 12:14:39
|
Revision: 5343
http://sourceforge.net/p/gexperts/code/5343
Author: twm
Date: 2026-04-11 12:14:36 +0000 (Sat, 11 Apr 2026)
Log Message:
-----------
Updated from dzlib repository
Modified Paths:
--------------
trunk/ExternalSource/dzlib/dzlib.inc
trunk/ExternalSource/dzlib/u_dzConvertUtils.pas
trunk/ExternalSource/dzlib/u_dzDpiScaleUtils.pas
trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas
trunk/ExternalSource/dzlib/u_dzTypes.pas
trunk/ExternalSource/dzlib/u_dzVclUtils.pas
Modified: trunk/ExternalSource/dzlib/dzlib.inc
===================================================================
--- trunk/ExternalSource/dzlib/dzlib.inc 2026-04-04 13:46:58 UTC (rev 5342)
+++ trunk/ExternalSource/dzlib/dzlib.inc 2026-04-11 12:14:36 UTC (rev 5343)
@@ -24,6 +24,7 @@
// Delphi 6 and 7 understood deprecated, but not for types
{$DEFINE SUPPORTS_DEPRECATED_TYPES}
{$DEFINE HAS_UNIT_WIDESTRINGS}
+ {$DEFINE HAS_UNIT_THEMES}
{$DEFINE OPENDIALOG_EXCUTE_HAS_HANDLE}
{$DEFINE ENUM_NAMES_ARE_UTF8}
{$ENDIF}
@@ -76,6 +77,9 @@
{$IFDEF DELPHIXE3_UP}
{$DEFINE SUPPORTS_RECORD_HELPERS_FOR_SIMPLE_TYPES}
+ // For now I assume the BDE is not installed for Delphi XE3 and later, but that
+ // largely depends on what the user selected for installation.
+ {$DEFINE BDE_IS_DEPRECATED}
{$ENDIF}
{$IFDEF DELPHIXE6_UP}
@@ -84,9 +88,6 @@
{$IFDEF DELPHIXE7_UP}
{$DEFINE HAS_UNIT_NETENCODING}
- // For now I assume the BDE is not installed for Delphi XE7 and later, but that
- // largely depends on what the user selected for installation.
- {$DEFINE BDE_IS_DEPRECATED}
{$ENDIF}
{$IFDEF DELPHIX_SEATTLE_UP}
Modified: trunk/ExternalSource/dzlib/u_dzConvertUtils.pas
===================================================================
--- trunk/ExternalSource/dzlib/u_dzConvertUtils.pas 2026-04-04 13:46:58 UTC (rev 5342)
+++ trunk/ExternalSource/dzlib/u_dzConvertUtils.pas 2026-04-11 12:14:36 UTC (rev 5343)
@@ -2261,6 +2261,8 @@
Result := True;
end;
+ {$IFDEF SUPPORTS_ENHANCED_RECORDS}
+
procedure AssertBitsDump;
var
bits64: TBits64;
@@ -2273,6 +2275,7 @@
bits16.Dump;
bits8.Dump;
end;
+ {$ENDIF SUPPORTS_ENHANCED_RECORDS}
{$ENDIF DEBUG}
initialization
@@ -2286,6 +2289,8 @@
Assert(AssertSwap32);
Assert(AssertBitReverse32);
+ {$IFDEF SUPPORTS_ENHANCED_RECORDS}
AssertBitsDump;
+ {$ENDIF SUPPORTS_ENHANCED_RECORDS}
{$ENDIF DEBUG}
end.
Modified: trunk/ExternalSource/dzlib/u_dzDpiScaleUtils.pas
===================================================================
--- trunk/ExternalSource/dzlib/u_dzDpiScaleUtils.pas 2026-04-04 13:46:58 UTC (rev 5342)
+++ trunk/ExternalSource/dzlib/u_dzDpiScaleUtils.pas 2026-04-11 12:14:36 UTC (rev 5343)
@@ -1,6 +1,9 @@
unit u_dzDpiScaleUtils;
{$INCLUDE dzlib.inc}
+{$IFNDEF SUPPORTS_PER_MONITOR_DPI}
+{$MESSAGE WARN 'u_dzDpiScaleUtils works only for Delphi 11 and newer, for building GExperts with older version, use a unit alias to u_dzDpiScaleUtilsDummy'}
+{$ENDIF}
{.$DEFINE DPI_SCALER_LOGGING}
@@ -11,6 +14,8 @@
interface
+{$IFDEF SUPPORTS_PER_MONITOR_DPI}
+
uses
Windows,
SysUtils,
@@ -92,8 +97,12 @@
property DesignDPI: Integer read FDesignDpi;
end;
+{$ENDIF SUPPORTS_PER_MONITOR_DPI}
+
implementation
+{$IFDEF SUPPORTS_PER_MONITOR_DPI}
+
uses
StdCtrls,
CommCtrl,
@@ -737,4 +746,5 @@
CloseFile(LogFile);
{$ENDIF}
DoneApiCalls;
+{$ENDIF SUPPORTS_PER_MONITOR_DPI}
end.
Modified: trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas
===================================================================
--- trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas 2026-04-04 13:46:58 UTC (rev 5342)
+++ trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas 2026-04-11 12:14:36 UTC (rev 5343)
@@ -128,6 +128,9 @@
{$ENDIF}
end;
+procedure TdzRgbTriple_SetGray(var _Triple: TdzRgbTriple; _Value: Byte);
+{$IFDEF SUPPORTS_INLINE} inline; {$ENDIF}
+
function GetRgbBrightness(_Red, _Green, _Blue: Byte; _Channel: TRgbBrightnessChannelEnum): Byte;
function CalcBytesPerPixel(_PixelFormat: TPixelFormat): Integer;
@@ -180,6 +183,9 @@
TdzRgbQuadArray = packed array[0..MaxInt div SizeOf(TdzRgbQuad) - 1] of TdzRgbQuad;
PdzRgbQuadArray = ^TdzRgbQuadArray;
+procedure TdzRgbQuad_SetGray(var _Quad: TdzRgbQuad; _Value: Byte);
+{$IFDEF SUPPORTS_INLINE} inline; {$ENDIF}
+
///<summary> Returns the bounding box of the active clipping region </summary>
function TCanvas_GetClipRect(_Canvas: TCanvas): TRect;
{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)}
@@ -1274,6 +1280,13 @@
_Triple.Blue := GetBValue(_Color);
end;
+procedure TdzRgbTriple_SetGray(var _Triple: TdzRgbTriple; _Value: Byte);
+begin
+ _Triple.Red := _Value;
+ _Triple.Green := _Value;
+ _Triple.Blue := _Value;
+end;
+
procedure GetRgbHls(_Red, _Green, _Blue: Byte; out _Hls: THlsRec);
begin
{$IFDEF dzUseGraphics32}
@@ -1629,6 +1642,16 @@
end;
{$ENDIF}
+procedure TdzRgbQuad_SetGray(var _Quad: TdzRgbQuad; _Value: Byte);
+begin
+ _Quad.Red := _Value;
+ _Quad.Green := _Value;
+ _Quad.Blue := _Value;
+ // According to the Win32 API documenation this member is reserved and must be zero,
+ // but apparently it can be non-zero and contain an alpha value.
+ _Quad.Reserved := 0;
+end;
+
procedure TBitmap_SetSize(_bmp: TBitmap; _Width, _Height: Integer);
begin
{$IFDEF SUPPPORTS_BITMAP_SETSIZE}
Modified: trunk/ExternalSource/dzlib/u_dzTypes.pas
===================================================================
--- trunk/ExternalSource/dzlib/u_dzTypes.pas 2026-04-04 13:46:58 UTC (rev 5342)
+++ trunk/ExternalSource/dzlib/u_dzTypes.pas 2026-04-11 12:14:36 UTC (rev 5343)
@@ -59,7 +59,7 @@
{$IF not declared(PUInt64)}
PUInt64 = ^UInt64;
{$IFEND}
-{$IF SizeOf(Pointer) <> SizeOf(NativeInt)}
+{$IF not Declared(NativeInt) or (SizeOf(Pointer) <> SizeOf(NativeInt))}
// In Delphi 2007 and older, the NativeInt declaration is wrong. It should always have the same size
// as a pointer.
type
@@ -266,9 +266,11 @@
/// Gets and sets the bottom left coordinates keeping the size </summary>
property BottomLeft: TPoint read GetBottomLeft write SetBottomLeft;
function GetCenter: TPoint;
+ function Dump: string;
function Right: Integer;
function Bottom: Integer;
class operator Implicit(_a: TRect): TRectLTWH;
+ class operator Equal(const _a, _b: TRectLTWH): Boolean;
class operator Implicit(_a: TRectLTWH): TRect;
class function FromLTWH(_Left, _Top, _Width, _Height: Integer): TRectLTWH; static;
{$ENDIF}
@@ -366,6 +368,19 @@
begin
Result.Assign(_a);
end;
+
+function TRectLTWH.Dump: string;
+begin
+ Result := Format('Left: %d Top: %d Width: %d Height: %d', [Left, Top, Width, Height]);
+end;
+
+class operator TRectLTWH.Equal(const _a, _b: TRectLTWH): Boolean;
+begin
+ Result := (_a.Left = _b.Left)
+ and (_a.Top = _b.Top)
+ and (_a.Width = _b.Width)
+ and (_a.Height = _b.Height);
+end;
{$ENDIF}
procedure TRectLTWH_Assign(var _LTWH: TRectLTWH; _Left, _Top, _Width, _Height: Integer);
Modified: trunk/ExternalSource/dzlib/u_dzVclUtils.pas
===================================================================
--- trunk/ExternalSource/dzlib/u_dzVclUtils.pas 2026-04-04 13:46:58 UTC (rev 5342)
+++ trunk/ExternalSource/dzlib/u_dzVclUtils.pas 2026-04-11 12:14:36 UTC (rev 5343)
@@ -35,7 +35,9 @@
{$ENDIF dzVCL_DISABLE_DBGRID_SUPPORT}
Buttons,
Menus,
+{$IFDEF HAS_UNIT_THEMES}
Themes,
+{$ENDIF HAS_UNIT_THEMES}
MultiMon, // this unit doesn't exist in older Delphi versions, use a unit alias like Multimon=Windows in that case
{$IFDEF HAS_UNIT_SYSTEM_ACTIONS}
Actions,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-04 13:47:00
|
Revision: 5342
http://sourceforge.net/p/gexperts/code/5342
Author: twm
Date: 2026-04-04 13:46:58 +0000 (Sat, 04 Apr 2026)
Log Message:
-----------
Changed compiler option. Now it no longer crashes my Delphi 6 IDE
Modified Paths:
--------------
trunk/Projects/Delphi6/GExpertsD6.dof
Modified: trunk/Projects/Delphi6/GExpertsD6.dof
===================================================================
--- trunk/Projects/Delphi6/GExpertsD6.dof 2026-04-04 11:50:40 UTC (rev 5341)
+++ trunk/Projects/Delphi6/GExpertsD6.dof 2026-04-04 13:46:58 UTC (rev 5342)
@@ -1,6 +1,5 @@
[FileVersion]
Version=6.0
-
[Compiler]
A=8
B=0
@@ -26,7 +25,7 @@
V=1
W=0
X=1
-Y=1
+Y=0
Z=1
ShowHints=1
ShowWarnings=1
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-04 11:50:43
|
Revision: 5341
http://sourceforge.net/p/gexperts/code/5341
Author: twm
Date: 2026-04-04 11:50:40 +0000 (Sat, 04 Apr 2026)
Log Message:
-----------
Update changelog for r5340 (feature #226)
Modified Paths:
--------------
trunk/Documentation/CHANGES-1.3.28.md
Modified: trunk/Documentation/CHANGES-1.3.28.md
===================================================================
--- trunk/Documentation/CHANGES-1.3.28.md 2026-04-04 11:49:56 UTC (rev 5340)
+++ trunk/Documentation/CHANGES-1.3.28.md 2026-04-04 11:50:40 UTC (rev 5341)
@@ -25,6 +25,7 @@
- Open File expert: Dialog position and size are now saved even when the dialog is cancelled (bug #480)
- Grep: Work around blank docked Grep Results window by calling ForceRedraw after ShowForm
- Auto Switch Desktop: Fixed crash in Debug builds when pressing F12 — `GetAsyncKeyState` with `SmallInt` caused a range check error; replaced with `GetKeyState` and `< 0` test (bug #481)
+- Vertical Tabs: Fixed file switching not working in Delphi 6/7 by pausing the polling timer during switch. Project and project group files are now filtered from the list (feature #226)
## Contributors
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-04 11:49:58
|
Revision: 5340
http://sourceforge.net/p/gexperts/code/5340
Author: twm
Date: 2026-04-04 11:49:56 +0000 (Sat, 04 Apr 2026)
Log Message:
-----------
Feature #226: Fix Vertical Tabs in Delphi 6/7 and filter project files
- Pause the 500ms polling timer when switching files so it does not
reselect the previous file before the IDE completes the switch.
Uses a single timer with swapped OnTimer handler (1500ms delay).
- Filter out project and project group files (.dpr, .dproj, .bdsgroup,
.groupproj, .bpg, .dpk, etc.) from the file list since MakeSourceVisible
cannot switch to them.
Modified Paths:
--------------
trunk/Source/VerticalTabs/GX_VerticalTabs.pas
Modified: trunk/Source/VerticalTabs/GX_VerticalTabs.pas
===================================================================
--- trunk/Source/VerticalTabs/GX_VerticalTabs.pas 2026-04-04 11:44:35 UTC (rev 5339)
+++ trunk/Source/VerticalTabs/GX_VerticalTabs.pas 2026-04-04 11:49:56 UTC (rev 5340)
@@ -51,11 +51,11 @@
FEditNotifierIndex: Integer;
{$ELSE}
FTimer: TTimer;
+ procedure TimerTick(Sender: TObject);
+ procedure ResumeTimerTick(Sender: TObject);
+ procedure PausePolling;
{$ENDIF}
function GetSelectedFilePath: string;
-{$IFNDEF GX_VER160_up}
- procedure TimerTick(Sender: TObject);
-{$ENDIF}
procedure RefreshFileList;
procedure AddFile(const _FileName: string);
procedure RemoveFile(const _FileName: string);
@@ -262,6 +262,9 @@
fn := SourceEditor.FileName;
if fn = '' then
Continue;
+ // Skip project and project group files
+ if IsBdsProjectFile(fn) then
+ Continue;
if FFilePaths.IndexOf(fn) >= 0 then
Continue;
FFilePaths.Add(fn);
@@ -284,6 +287,10 @@
if _FileName = '' then
Exit;
+ // Skip project and project group files
+ if IsBdsProjectFile(_FileName) then
+ Exit;
+
// Only add files that have a source editor
if not Ota.TryGetSourceEditor(_FileName, SourceEditor) then
Exit;
@@ -377,8 +384,12 @@
if FUpdatingSelection then
Exit;
fn := GetSelectedFilePath;
- if fn <> '' then
+ if fn <> '' then begin
+{$IFNDEF GX_VER160_up}
+ PausePolling;
+{$ENDIF}
Ota.MakeSourceVisible(fn);
+ end;
end;
procedure TfmVerticalTabs.lbFilesMouseMove(Sender: TObject; Shift: TShiftState;
@@ -410,8 +421,12 @@
fn: string;
begin
fn := GetSelectedFilePath;
- if fn <> '' then
+ if fn <> '' then begin
+{$IFNDEF GX_VER160_up}
+ PausePolling;
+{$ENDIF}
Ota.MakeSourceVisible(fn);
+ end;
end;
procedure TfmVerticalTabs.actCloseFileExecute(Sender: TObject);
@@ -483,6 +498,23 @@
if fn <> '' then
UpdateSelection(fn);
end;
+
+procedure TfmVerticalTabs.ResumeTimerTick(Sender: TObject);
+begin
+ FTimer.Interval := 500;
+ FTimer.OnTimer := TimerTick;
+end;
+
+procedure TfmVerticalTabs.PausePolling;
+begin
+ // Temporarily stop polling so the timer doesn't reselect the previous
+ // file before the IDE has finished switching. The timer fires once
+ // after 1500ms to resume normal polling.
+ FTimer.Enabled := False;
+ FTimer.Interval := 1500;
+ FTimer.OnTimer := ResumeTimerTick;
+ FTimer.Enabled := True;
+end;
{$ENDIF}
{ TVerticalTabsExpert }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-04 11:44:38
|
Revision: 5339
http://sourceforge.net/p/gexperts/code/5339
Author: twm
Date: 2026-04-04 11:44:35 +0000 (Sat, 04 Apr 2026)
Log Message:
-----------
indented comments
Modified Paths:
--------------
trunk/Source/Framework/GX_EventHook.pas
Modified: trunk/Source/Framework/GX_EventHook.pas
===================================================================
--- trunk/Source/Framework/GX_EventHook.pas 2026-04-04 08:16:14 UTC (rev 5338)
+++ trunk/Source/Framework/GX_EventHook.pas 2026-04-04 11:44:35 UTC (rev 5339)
@@ -159,8 +159,8 @@
Ptr: TMethod;
begin
if not Assigned(_Hook) then begin
- // Just in case somebody did not check whether TSecureNotifyEventHook.Install actually returned
- // a valid object or simply didn't call it.
+ // Just in case somebody did not check whether TSecureNotifyEventHook.Install actually returned
+ // a valid object or simply didn't call it.
Exit; //==>
end;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-04 08:16:16
|
Revision: 5338
http://sourceforge.net/p/gexperts/code/5338
Author: twm
Date: 2026-04-04 08:16:14 +0000 (Sat, 04 Apr 2026)
Log Message:
-----------
Update changelog for r5337 (feature #222)
Modified Paths:
--------------
trunk/Documentation/CHANGES-1.3.28.md
Modified: trunk/Documentation/CHANGES-1.3.28.md
===================================================================
--- trunk/Documentation/CHANGES-1.3.28.md 2026-04-04 08:14:55 UTC (rev 5337)
+++ trunk/Documentation/CHANGES-1.3.28.md 2026-04-04 08:16:14 UTC (rev 5338)
@@ -17,6 +17,7 @@
- Grep: The match context preview now uses a syntax-highlighted code editor (SynEdit) with IDE editor colors instead of a plain RichEdit. Highlighting adapts automatically to the file type (Pascal, C++, HTML, SQL, XML). Match highlighting (line background + matched text color/bold) is preserved on top of syntax colors.
- Grep: Context match colors configuration now uses a "Use default colors" checkbox instead of a Reset button, matching the pattern used for list colors.
+- Grep: Context preview syntax colors now update when switching between light and dark mode (feature #222)
## Bug Fixes
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-04 08:14:58
|
Revision: 5337
http://sourceforge.net/p/gexperts/code/5337
Author: twm
Date: 2026-04-04 08:14:55 +0000 (Sat, 04 Apr 2026)
Log Message:
-----------
Feature #222: Grep context preview now updates syntax colors when switching light/dark mode
Re-apply the SynEdit highlighter in InitThemedColors so the editor colors
are re-read from the IDE registry after a theme switch.
Modified Paths:
--------------
trunk/Source/Grep/GX_GrepResults.pas
Modified: trunk/Source/Grep/GX_GrepResults.pas
===================================================================
--- trunk/Source/Grep/GX_GrepResults.pas 2026-04-04 07:54:42 UTC (rev 5336)
+++ trunk/Source/Grep/GX_GrepResults.pas 2026-04-04 08:14:55 UTC (rev 5337)
@@ -959,11 +959,10 @@
lbResults.Color := LBackColor;
lbHistoryList.Color := LBackColor;
FContextEditor.Color := LBackColor;
+ SetSynEditHighlighter(FContextEditor, FContextHighlighter);
SplitterHistoryList.Color := LSplitterColor;
SplitterContext.Color := LSplitterColor;
-
- // todo: Set the SynMemo (FContextEditor) to dark mode
end;
end { InitThemedColors };
{$ELSE GX_SUPPORTS_THEMING}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-04 07:54:44
|
Revision: 5336
http://sourceforge.net/p/gexperts/code/5336
Author: twm
Date: 2026-04-04 07:54:42 +0000 (Sat, 04 Apr 2026)
Log Message:
-----------
Update changelog for bug #481 fix (r5335)
Modified Paths:
--------------
trunk/Documentation/CHANGES-1.3.28.md
Modified: trunk/Documentation/CHANGES-1.3.28.md
===================================================================
--- trunk/Documentation/CHANGES-1.3.28.md 2026-04-04 07:54:08 UTC (rev 5335)
+++ trunk/Documentation/CHANGES-1.3.28.md 2026-04-04 07:54:42 UTC (rev 5336)
@@ -23,6 +23,7 @@
- Code Formatter: Nested generic types like `TJSON.JsonToObject<TJSONReport<TPrintData>>` are now recognized correctly instead of being treated as comparison operators (bug #219)
- Open File expert: Dialog position and size are now saved even when the dialog is cancelled (bug #480)
- Grep: Work around blank docked Grep Results window by calling ForceRedraw after ShowForm
+- Auto Switch Desktop: Fixed crash in Debug builds when pressing F12 — `GetAsyncKeyState` with `SmallInt` caused a range check error; replaced with `GetKeyState` and `< 0` test (bug #481)
## Contributors
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-04 07:54:10
|
Revision: 5335
http://sourceforge.net/p/gexperts/code/5335
Author: twm
Date: 2026-04-04 07:54:08 +0000 (Sat, 04 Apr 2026)
Log Message:
-----------
Fix for bug #481: Auto Switch Desktop crash in Debug builds (Alt+F12 crashes IDE)
GetAsyncKeyState returns SmallInt; masking with 'and $8000' caused a range
check error in Debug builds because the result (32768) overflows SmallInt.
Fix: use GetKeyState (correct for hook procs, synchronized with message queue)
and test '< 0' instead of masking - the high-order bit is the sign bit.
Modified Paths:
--------------
trunk/Source/AutoSwitchDesktop/GX_AutoSwitchDesktop.pas
Modified: trunk/Source/AutoSwitchDesktop/GX_AutoSwitchDesktop.pas
===================================================================
--- trunk/Source/AutoSwitchDesktop/GX_AutoSwitchDesktop.pas 2026-04-03 17:05:10 UTC (rev 5334)
+++ trunk/Source/AutoSwitchDesktop/GX_AutoSwitchDesktop.pas 2026-04-04 07:54:08 UTC (rev 5335)
@@ -82,19 +82,14 @@
{$IFEND}
function GetShiftState: TShiftState;
-var
- LState: SmallInt;
begin
Result := [];
-
- LState := GetAsyncKeyState(VK_CONTROL) and $8000;
- if LState <> 0 then Include(Result, ssCtrl);
-
- LState := GetAsyncKeyState(VK_SHIFT) and $8000;
- if LState <> 0 then Include(Result, ssShift);
-
- LState := GetAsyncKeyState(VK_MENU) and $8000;
- if LState <> 0 then Include(Result, ssAlt);
+ // GetKeyState sets the high order bit if a key is pressed. The return value is
+ // a signed 16 bit integer (SmallInt), so the high order bit is the sign
+ // -> if the key is pressed the return value is negative.
+ if GetKeyState(VK_CONTROL) < 0 then Include(Result, ssCtrl);
+ if GetKeyState(VK_SHIFT) < 0 then Include(Result, ssShift);
+ if GetKeyState(VK_MENU) < 0 then Include(Result, ssAlt);
end;
function KeyboardHookProc(Code: Integer; wparam: wparam; lparam: lparam): LRESULT; stdcall;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-03 17:05:12
|
Revision: 5334
http://sourceforge.net/p/gexperts/code/5334
Author: twm
Date: 2026-04-03 17:05:10 +0000 (Fri, 03 Apr 2026)
Log Message:
-----------
Update changelog for r5333
Modified Paths:
--------------
trunk/Documentation/CHANGES-1.3.28.md
Modified: trunk/Documentation/CHANGES-1.3.28.md
===================================================================
--- trunk/Documentation/CHANGES-1.3.28.md 2026-04-03 17:04:46 UTC (rev 5333)
+++ trunk/Documentation/CHANGES-1.3.28.md 2026-04-03 17:05:10 UTC (rev 5334)
@@ -22,6 +22,7 @@
- Code Formatter: Nested generic types like `TJSON.JsonToObject<TJSONReport<TPrintData>>` are now recognized correctly instead of being treated as comparison operators (bug #219)
- Open File expert: Dialog position and size are now saved even when the dialog is cancelled (bug #480)
+- Grep: Work around blank docked Grep Results window by calling ForceRedraw after ShowForm
## Contributors
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-03 17:04:49
|
Revision: 5333
http://sourceforge.net/p/gexperts/code/5333
Author: twm
Date: 2026-04-03 17:04:46 +0000 (Fri, 03 Apr 2026)
Log Message:
-----------
Grep: Work around blank docked Grep Results window by calling ForceRedraw after ShowForm
When the Grep Results window is shown via the search dialog or the
show results menu item, ForceRedraw (toggling pnlMain visibility)
is called to ensure the docked form paints correctly.
Modified Paths:
--------------
trunk/Source/Grep/GX_GrepExpert.pas
trunk/Source/Grep/GX_GrepResults.pas
Modified: trunk/Source/Grep/GX_GrepExpert.pas
===================================================================
--- trunk/Source/Grep/GX_GrepExpert.pas 2026-04-03 14:53:14 UTC (rev 5332)
+++ trunk/Source/Grep/GX_GrepExpert.pas 2026-04-03 17:04:46 UTC (rev 5333)
@@ -343,6 +343,7 @@
SetFormIcon(fmGrepResults);
IdeDockManager.ShowForm(fmGrepResults);
EnsureFormVisible(fmGrepResults);
+ fmGrepResults.ForceRedraw;
IncCallCount;
end;
Modified: trunk/Source/Grep/GX_GrepResults.pas
===================================================================
--- trunk/Source/Grep/GX_GrepResults.pas 2026-04-03 14:53:14 UTC (rev 5332)
+++ trunk/Source/Grep/GX_GrepResults.pas 2026-04-03 17:04:46 UTC (rev 5333)
@@ -420,7 +420,6 @@
procedure DoEmbeddedSearch(Sender: TObject);
procedure UpdateHistoryPagesOptions;
procedure GoToMatchLine(MatchLine: TLineResult);
- procedure ForceRedraw;
procedure GetEnabledFlags(out _IsOnlySaveSettings, _HaveItems, _Processing: Boolean);
///<summary>
/// Gets and sets the value of FLoadedContextHeightRelative taking the current height and
@@ -440,6 +439,7 @@
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Loaded; override;
+ procedure ForceRedraw;
procedure InitThemedColors;
procedure InitGrepSettings(AGrepSettings: TGrepSettings);
function Execute(AState: TGrepSearchState): Boolean;
@@ -669,6 +669,7 @@
BringToFront;
IdeDockManager.ShowForm(Self);
EnsureFormVisible(Self);
+ ForceRedraw;
TimeStart := Now;
TCursor_TempHourglass;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-03 14:53:17
|
Revision: 5332
http://sourceforge.net/p/gexperts/code/5332
Author: twm
Date: 2026-04-03 14:53:14 +0000 (Fri, 03 Apr 2026)
Log Message:
-----------
Update changelog for r5331
Modified Paths:
--------------
trunk/Documentation/CHANGES-1.3.28.md
Modified: trunk/Documentation/CHANGES-1.3.28.md
===================================================================
--- trunk/Documentation/CHANGES-1.3.28.md 2026-04-03 14:52:42 UTC (rev 5331)
+++ trunk/Documentation/CHANGES-1.3.28.md 2026-04-03 14:53:14 UTC (rev 5332)
@@ -16,6 +16,7 @@
## Enhancements
- Grep: The match context preview now uses a syntax-highlighted code editor (SynEdit) with IDE editor colors instead of a plain RichEdit. Highlighting adapts automatically to the file type (Pascal, C++, HTML, SQL, XML). Match highlighting (line background + matched text color/bold) is preserved on top of syntax colors.
+- Grep: Context match colors configuration now uses a "Use default colors" checkbox instead of a Reset button, matching the pattern used for list colors.
## Bug Fixes
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-03 14:52:45
|
Revision: 5331
http://sourceforge.net/p/gexperts/code/5331
Author: twm
Date: 2026-04-03 14:52:42 +0000 (Fri, 03 Apr 2026)
Log Message:
-----------
Grep Results Options: Replace Reset button with 'Use default colors' checkbox for context match colors
The checkbox enables/disables the color picker panels, similar to how the list colors checkbox works. When checked, clHighlightText/clHighlight system colors are used. The UseDefaultContextColors setting is persisted to registry. Also removed the obsolete pnlContextFont panel and renamed 'Match Line Font Color' to 'Match Line Background Color'.
Modified Paths:
--------------
trunk/Source/Grep/GX_GrepExpert.pas
trunk/Source/Grep/GX_GrepResults.pas
trunk/Source/Grep/GX_GrepResultsOptions.dfm
trunk/Source/Grep/GX_GrepResultsOptions.pas
Modified: trunk/Source/Grep/GX_GrepExpert.pas
===================================================================
--- trunk/Source/Grep/GX_GrepExpert.pas 2026-04-03 13:57:36 UTC (rev 5330)
+++ trunk/Source/Grep/GX_GrepExpert.pas 2026-04-03 14:52:42 UTC (rev 5331)
@@ -52,6 +52,7 @@
FListMatchTextColor: TColor;
FListMatchBrushColor: TColor;
FContextMatchColor: TColor;
+ FUseDefaultContextColors: Boolean;
FAutoHide: Boolean;
FContextMatchLineColor: TColor;
FGrepSaveHistoryListItems: Integer;
@@ -170,6 +171,7 @@
property ListUseDefaultColors: Boolean read FListUseDefaultColors write FListUseDefaultColors;
property ListMatchTextColor: TColor read FListMatchTextColor write FListMatchTextColor;
property ListMatchBrushColor: TColor read FListMatchBrushColor write FListMatchBrushColor;
+ property UseDefaultContextColors: Boolean read FUseDefaultContextColors write FUseDefaultContextColors;
property ContextMatchColor: TColor read FContextMatchColor write FContextMatchColor;
property ContextMatchLineColor: TColor read FContextMatchLineColor write FContextMatchLineColor;
property AutoHide: Boolean read FAutoHide write FAutoHide;
@@ -233,6 +235,7 @@
FListUseDefaultColors := True;
FListMatchTextColor := clHighlightText;
FListMatchBrushColor := clHighlight;
+ FUseDefaultContextColors := True;
FContextMatchColor := clHighlightText;
FContextMatchLineColor := clHighlight;
@@ -364,7 +367,7 @@
FGrepExpandAll, FGrepExpandIf, FGrepExpandIfFiles, FGrepExpandIfMatches,
FGrepExpandFew, FGrepExpandFewLines,
FListUseDefaultColors, FListFont, FListMatchTextColor, FListMatchBrushColor,
- FContextMatchLineColor, FContextMatchColor, FNumContextLines,
+ FUseDefaultContextColors, FContextMatchLineColor, FContextMatchColor, FNumContextLines,
FGrepSaveHistoryListItems,
FAutoHide, FGrepFileListDeleteAfterDays, FGrepDeleteAfterDays,
FGrepEmptyMoveToOnlySaveParams, FGrepSaveOptionDefaultValue, FGrepOpenSaveOptionDefaultValue,
@@ -426,14 +429,14 @@
_Settings.SaveFont('ListFont', ListFont, [ffColor]);
_Settings.WriteInteger('ListMatchTextColor', ListMatchTextColor);
_Settings.WriteInteger('ListMatchBrushColor', ListMatchBrushColor);
- if ColorToRGB(ContextMatchColor) = ColorToRGB(clHighlightText) then
- _Settings.DeleteKey('ContextMatchColor')
- else
+ _Settings.WriteBool('UseDefaultContextColors', UseDefaultContextColors);
+ if UseDefaultContextColors then begin
+ _Settings.DeleteKey('ContextMatchColor');
+ _Settings.DeleteKey('ContextMatchLineColor');
+ end else begin
_Settings.WriteInteger('ContextMatchColor', ContextMatchColor);
- if ColorToRGB(ContextMatchLineColor) = ColorToRGB(clHighlight) then
- _Settings.DeleteKey('ContextMatchLineColor')
- else
_Settings.WriteInteger('ContextMatchLineColor', ContextMatchLineColor);
+ end;
_Settings.WriteInteger('NumContextLines', NumContextLines);
_Settings.WriteInteger('SaveHistoryListItems', FGrepSaveHistoryListItems);
@@ -700,6 +703,7 @@
_Settings.LoadFont('ListFont', ListFont, [ffColor]);
FListMatchTextColor := _Settings.ReadInteger('ListMatchTextColor', FListMatchTextColor);
FListMatchBrushColor := _Settings.ReadInteger('ListMatchBrushColor', FListMatchBrushColor);
+ FUseDefaultContextColors := _Settings.ReadBool('UseDefaultContextColors', FUseDefaultContextColors);
FContextMatchColor := _Settings.ReadInteger('ContextMatchColor', FContextMatchColor);
if _Settings.ValueExists('ContextMatchLineColor') then
FContextMatchLineColor := _Settings.ReadInteger('ContextMatchLineColor', FContextMatchLineColor)
Modified: trunk/Source/Grep/GX_GrepResults.pas
===================================================================
--- trunk/Source/Grep/GX_GrepResults.pas 2026-04-03 13:57:36 UTC (rev 5330)
+++ trunk/Source/Grep/GX_GrepResults.pas 2026-04-03 14:52:42 UTC (rev 5331)
@@ -1305,7 +1305,10 @@
for i := 0 to Length(FContextMatchLines) - 1 do begin
if FContextMatchLines[i] = Line then begin
Special := True;
- BG := gblGrepExpert.ContextMatchLineColor;
+ if gblGrepExpert.UseDefaultContextColors then
+ BG := clHighlight
+ else
+ BG := gblGrepExpert.ContextMatchLineColor;
Exit;
end;
end;
@@ -1328,8 +1331,13 @@
// Check if token overlaps with this match range
if (TokenEnd1 >= FContextMatches[i].SPos) and (TokenStart1 <= FContextMatches[i].EPos) then begin
ASpecial := True;
- FG := gblGrepExpert.ContextMatchColor;
- BG := gblGrepExpert.ContextMatchLineColor;
+ if gblGrepExpert.UseDefaultContextColors then begin
+ FG := clHighlightText;
+ BG := clHighlight;
+ end else begin
+ FG := gblGrepExpert.ContextMatchColor;
+ BG := gblGrepExpert.ContextMatchLineColor;
+ end;
AStyle := AStyle + [fsBold];
Exit;
end;
Modified: trunk/Source/Grep/GX_GrepResultsOptions.dfm
===================================================================
--- trunk/Source/Grep/GX_GrepResultsOptions.dfm 2026-04-03 13:57:36 UTC (rev 5330)
+++ trunk/Source/Grep/GX_GrepResultsOptions.dfm 2026-04-03 14:52:42 UTC (rev 5331)
@@ -162,17 +162,6 @@
Caption = 'Number of context lines'
FocusControl = edtContextLines
end
- object pnlContextFont: TPanel
- Left = 48
- Top = 24
- Width = 197
- Height = 33
- BevelWidth = 2
- Caption = 'Context Font...'
- Color = clWindow
- TabOrder = 0
- Visible = False
- end
object pnlContextMatchFontColor: TPanel
Left = 48
Top = 104
@@ -208,19 +197,20 @@
Width = 197
Height = 33
BevelWidth = 2
- Caption = 'Match Line Font Color...'
+ Caption = 'Match Line Background Color...'
Color = clWindow
TabOrder = 1
OnClick = pnlContextMatchLineFontColorClick
end
- object btnResetContextColors: TButton
- Left = 252
- Top = 80
- Width = 75
- Height = 25
- Caption = 'Reset'
- TabOrder = 5
- OnClick = btnResetContextColorsClick
+ object chk_UseDefaultContextColors: TCheckBox
+ Left = 8
+ Top = 32
+ Width = 321
+ Height = 17
+ Anchors = [akLeft, akTop, akRight]
+ Caption = 'Use default colors'
+ TabOrder = 0
+ OnClick = chk_UseDefaultContextColorsClick
end
end
object btnOK: TButton
Modified: trunk/Source/Grep/GX_GrepResultsOptions.pas
===================================================================
--- trunk/Source/Grep/GX_GrepResultsOptions.pas 2026-04-03 13:57:36 UTC (rev 5330)
+++ trunk/Source/Grep/GX_GrepResultsOptions.pas 2026-04-03 14:52:42 UTC (rev 5331)
@@ -27,7 +27,6 @@
gbxMatchList: TGroupBox;
pnlListFont: TPanel;
gbxMatchContext: TGroupBox;
- pnlContextFont: TPanel;
lblContextLines: TLabel;
btnOK: TButton;
btnCancel: TButton;
@@ -42,7 +41,7 @@
chkDefaultListColors: TCheckBox;
pnlListMatchBackgroundColor: TPanel;
pnlContextMatchLineFontColor: TPanel;
- btnResetContextColors: TButton;
+ chk_UseDefaultContextColors: TCheckBox;
chkGrepAutoHide: TCheckBox;
chkGrepSaveHistoryListItems: TCheckBox;
chkGrepExpandIf: TCheckBox;
@@ -79,7 +78,7 @@
procedure pnlListMatchTextColorClick(Sender: TObject);
procedure pnlListMatchBackgroundColorClick(Sender: TObject);
procedure pnlContextMatchLineFontColorClick(Sender: TObject);
- procedure btnResetContextColorsClick(Sender: TObject);
+ procedure chk_UseDefaultContextColorsClick(Sender: TObject);
procedure chkDefaultListColorsClick(Sender: TObject);
procedure chkGrepExpandClick(Sender: TObject);
procedure chkGrepSaveHistoryListItemsClick(Sender: TObject);
@@ -89,6 +88,8 @@
private
FListMatchTextColor: TColor;
FListMatchBackgroundColor: TColor;
+ FContextMatchColor: TColor;
+ FContextMatchLineColor: TColor;
FExpandsChanging: Boolean;
function SelectColor(_Pnl: TPanel): Boolean;
procedure SetData(
@@ -104,6 +105,7 @@
_ListFont: TFont;
_ListMatchTextColor: TColor;
_ListMatchBrushColor: TColor;
+ _UseDefaultContextColors: Boolean;
_ContextMatchLineColor: TColor;
_ContextMatchColor: TColor;
_NumContextLines: Integer;
@@ -132,6 +134,7 @@
_ListFont: TFont;
out _ListMatchTextColor: TColor;
out _ListMatchBrushColor: TColor;
+ out _UseDefaultContextColors: Boolean;
out _ContextMatchLineColor: TColor;
out _ContextMatchColor: TColor;
out _NumContextLines: Integer;
@@ -164,6 +167,7 @@
_ListFont: TFont;
var _ListMatchTextColor: TColor;
var _ListMatchBrushColor: TColor;
+ var _UseDefaultContextColors: Boolean;
var _ContextMatchLineColor: TColor;
var _ContextMatchColor: TColor;
var _NumContextLines: Integer;
@@ -202,6 +206,7 @@
_ListFont: TFont;
var _ListMatchTextColor: TColor;
var _ListMatchBrushColor: TColor;
+ var _UseDefaultContextColors: Boolean;
var _ContextMatchLineColor: TColor;
var _ContextMatchColor: TColor;
var _NumContextLines: Integer;
@@ -227,7 +232,7 @@
frm.SetData(_AdvancedOptions, _Middle,
_ExpandAll, _ExpandIf, _ExpandIfFiles, _ExpandIfMatches, _ExpandFew, _ExpandFewLines,
_ListUseDefaultColors, _ListFont, _ListMatchTextColor, _ListMatchBrushColor,
- _ContextMatchLineColor, _ContextMatchColor, _NumContextLines,
+ _UseDefaultContextColors, _ContextMatchLineColor, _ContextMatchColor, _NumContextLines,
_SaveHistoryListItems,
_AutoHide, _FileListDeleteAfterDays, _DeleteAfterDays,
_EmptyMoveToOnlySaveParams, _SaveOptionDefaultValue, _OpenSaveOptionDefaultValue,
@@ -238,7 +243,7 @@
frm.GetData(_AdvancedOptions, _Middle,
_ExpandAll, _ExpandIf, _ExpandIfFiles, _ExpandIfMatches, _ExpandFew, _ExpandFewLines,
_ListUseDefaultColors, _ListFont, _ListMatchTextColor, _ListMatchBrushColor,
- _ContextMatchLineColor, _ContextMatchColor, _NumContextLines,
+ _UseDefaultContextColors, _ContextMatchLineColor, _ContextMatchColor, _NumContextLines,
_SaveHistoryListItems,
_AutoHide, _FileListDeleteAfterDays, _DeleteAfterDays,
_EmptyMoveToOnlySaveParams, _SaveOptionDefaultValue, _OpenSaveOptionDefaultValue,
@@ -279,6 +284,7 @@
_ListFont: TFont;
_ListMatchTextColor: TColor;
_ListMatchBrushColor: TColor;
+ _UseDefaultContextColors: Boolean;
_ContextMatchLineColor: TColor;
_ContextMatchColor: TColor;
_NumContextLines: Integer;
@@ -316,10 +322,14 @@
pnlListMatchBackgroundColor.Font.Color := BestForegroundForColor(_ListMatchBrushColor);
chkDefaultListColors.Checked := _UseDefaultColors;
+ FContextMatchColor := _ContextMatchColor;
+ FContextMatchLineColor := _ContextMatchLineColor;
pnlContextMatchLineFontColor.Color := _ContextMatchLineColor;
pnlContextMatchLineFontColor.Font.Color := BestForegroundForColor(_ContextMatchLineColor);
pnlContextMatchFontColor.Color := _ContextMatchColor;
pnlContextMatchFontColor.Font.Color := BestForegroundForColor(_ContextMatchColor);
+ chk_UseDefaultContextColors.Checked := _UseDefaultContextColors;
+ chk_UseDefaultContextColorsClick(nil);
udContextLines.Position := _NumContextLines;
chkGrepSaveHistoryListItems.Checked := (_SaveHistoryListItems in [1, 2]);
@@ -354,6 +364,7 @@
_ListFont: TFont;
out _ListMatchTextColor: TColor;
out _ListMatchBrushColor: TColor;
+ out _UseDefaultContextColors: Boolean;
out _ContextMatchLineColor: TColor;
out _ContextMatchColor: TColor;
out _NumContextLines: Integer;
@@ -391,8 +402,14 @@
_ListMatchBrushColor := pnlListMatchBackgroundColor.Color;
end;
- _ContextMatchLineColor := pnlContextMatchLineFontColor.Color;
- _ContextMatchColor := pnlContextMatchFontColor.Color;
+ _UseDefaultContextColors := chk_UseDefaultContextColors.Checked;
+ if _UseDefaultContextColors then begin
+ _ContextMatchLineColor := FContextMatchLineColor;
+ _ContextMatchColor := FContextMatchColor;
+ end else begin
+ _ContextMatchLineColor := pnlContextMatchLineFontColor.Color;
+ _ContextMatchColor := pnlContextMatchFontColor.Color;
+ end;
_NumContextLines := udContextLines.Position;
if _AdvancedOptions then begin
@@ -516,12 +533,25 @@
SelectColor(pnlContextMatchFontColor);
end;
-procedure TfmGrepResultsOptions.btnResetContextColorsClick(Sender: TObject);
+procedure TfmGrepResultsOptions.chk_UseDefaultContextColorsClick(Sender: TObject);
begin
- pnlContextMatchLineFontColor.Color := clHighlight;
- pnlContextMatchLineFontColor.Font.Color := BestForegroundForColor(clHighlight);
- pnlContextMatchFontColor.Color := clHighlightText;
- pnlContextMatchFontColor.Font.Color := BestForegroundForColor(clHighlightText);
+ if chk_UseDefaultContextColors.Checked then begin
+ FContextMatchColor := pnlContextMatchFontColor.Color;
+ FContextMatchLineColor := pnlContextMatchLineFontColor.Color;
+ pnlContextMatchFontColor.Enabled := False;
+ pnlContextMatchFontColor.ParentColor := True;
+ pnlContextMatchFontColor.Font.Color := clGrayText;
+ pnlContextMatchLineFontColor.Enabled := False;
+ pnlContextMatchLineFontColor.ParentColor := True;
+ pnlContextMatchLineFontColor.Font.Color := clGrayText;
+ end else begin
+ pnlContextMatchFontColor.Enabled := True;
+ pnlContextMatchFontColor.Color := FContextMatchColor;
+ pnlContextMatchFontColor.Font.Color := BestForegroundForColor(FContextMatchColor);
+ pnlContextMatchLineFontColor.Enabled := True;
+ pnlContextMatchLineFontColor.Color := FContextMatchLineColor;
+ pnlContextMatchLineFontColor.Font.Color := BestForegroundForColor(FContextMatchLineColor);
+ end;
end;
procedure TfmGrepResultsOptions.chkDefaultListColorsClick(Sender: TObject);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-04-03 13:57:39
|
Revision: 5330
http://sourceforge.net/p/gexperts/code/5330
Author: twm
Date: 2026-04-03 13:57:36 +0000 (Fri, 03 Apr 2026)
Log Message:
-----------
Grep: Replace RichEdit context preview with syntax-highlighted SynEdit
Replace the TRichEdit context preview with TSynEdit for proper syntax
highlighting with IDE editor colors. The highlighter adapts automatically
to the file type (Pascal, C++, HTML, SQL, XML).
Match highlighting uses two SynEdit events: OnSpecialLineColors for the
line background color, and OnSpecialTokenAttributes for the matched text
foreground color and bold style. The eoSpecialLineDefaultFg option ensures
per-token colors are respected on special lines.
Remove the ContextFont setting (always use IDE editor font via
Ota.GetEditorFont). Change default match colors to clHighlightText (text)
and clHighlight (background) for proper contrast.
Add Reset button to the options dialog for context match colors. When
saving, delete registry keys for colors at their defaults (using
ColorToRGB comparison to handle system color constant variants). Fix the
load fallback to only copy ContextMatchColor to ContextMatchLineColor
when upgrading from old versions (not on fresh installs).
Add utility function GetHighlighterFromFileName in GX_GenericUtils.
Fix standalone Grep build by adding SynEdit units to the DPR and stub
functions (GetIDEVersionID, Ota.ThemingEnabled, etc.) to the standalone
GX_IdeUtils.pas and GX_OtaUtils.pas.
Modified Paths:
--------------
trunk/Documentation/CHANGES-1.3.28.md
trunk/Projects/StandAlone/Grep/src/GExpertsGrep.dpr
trunk/Projects/StandAlone/Grep/src/GX_IdeUtils.pas
trunk/Projects/StandAlone/common/GX_OtaUtils.pas
trunk/Source/Grep/GX_GrepExpert.pas
trunk/Source/Grep/GX_GrepResults.dfm
trunk/Source/Grep/GX_GrepResults.pas
trunk/Source/Grep/GX_GrepResultsOptions.dfm
trunk/Source/Grep/GX_GrepResultsOptions.pas
trunk/Source/Grep/GX_GrepSearch.pas
trunk/Source/Grep/GX_TestRegEx.pas
trunk/Source/Utils/GX_GenericUtils.pas
Modified: trunk/Documentation/CHANGES-1.3.28.md
===================================================================
--- trunk/Documentation/CHANGES-1.3.28.md 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Documentation/CHANGES-1.3.28.md 2026-04-03 13:57:36 UTC (rev 5330)
@@ -13,6 +13,10 @@
- Configuration: New "Disable IDE license notification" checkbox on the IDE tab writes the `LicenseNotificationEnabled` registry value to suppress the IDE's license notification popup (feature #202)
- Vertical Tabs: New dockable panel showing open editor files as a vertical list. Single-click to switch files. Supports alphabetical or tab-order sorting, and a context menu with Close File, Close All Other, Copy Path, and Open Containing Folder (feature #224)
+## Enhancements
+
+- Grep: The match context preview now uses a syntax-highlighted code editor (SynEdit) with IDE editor colors instead of a plain RichEdit. Highlighting adapts automatically to the file type (Pascal, C++, HTML, SQL, XML). Match highlighting (line background + matched text color/bold) is preserved on top of syntax colors.
+
## Bug Fixes
- Code Formatter: Nested generic types like `TJSON.JsonToObject<TJSONReport<TPrintData>>` are now recognized correctly instead of being treated as comparison operators (bug #219)
Modified: trunk/Projects/StandAlone/Grep/src/GExpertsGrep.dpr
===================================================================
--- trunk/Projects/StandAlone/Grep/src/GExpertsGrep.dpr 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Projects/StandAlone/Grep/src/GExpertsGrep.dpr 2026-04-03 13:57:36 UTC (rev 5330)
@@ -3,6 +3,17 @@
uses
ToolsAPI in '..\..\common\ToolsAPI.pas',
DropSource in '..\..\..\..\ExternalSource\DropSource.pas',
+ SynEdit in '..\..\..\..\ExternalSource\UniSynEdit\SynEdit.pas',
+ SynMemo in '..\..\..\..\ExternalSource\UniSynEdit\SynMemo.pas',
+ SynEditTypes in '..\..\..\..\ExternalSource\UniSynEdit\SynEditTypes.pas',
+ SynEditHighlighter in '..\..\..\..\ExternalSource\UniSynEdit\SynEditHighlighter.pas',
+ SynHighlighterPas in '..\..\..\..\ExternalSource\UniSynEdit\SynHighlighterPas.pas',
+ SynHighlighterCpp in '..\..\..\..\ExternalSource\UniSynEdit\SynHighlighterCpp.pas',
+ SynHighlighterHtml in '..\..\..\..\ExternalSource\UniSynEdit\SynHighlighterHtml.pas',
+ SynHighlighterSql in '..\..\..\..\ExternalSource\UniSynEdit\SynHighlighterSql.pas',
+ SynHighlighterCS in '..\..\..\..\ExternalSource\UniSynEdit\SynHighlighterCS.pas',
+ SynHighlighterXML in '..\..\..\..\ExternalSource\UniSynEdit\SynHighlighterXML.pas',
+ SynHighlighterGeneral in '..\..\..\..\ExternalSource\UniSynEdit\SynHighlighterGeneral.pas',
GrepMain in 'GrepMain.pas',
GX_Logging in '..\..\..\..\Source\Framework\GX_Logging.pas',
GX_About in '..\..\..\..\Source\Framework\GX_About.pas' {fmAbout},
@@ -48,7 +59,8 @@
GX_VerDepConst in '..\..\..\..\Source\Framework\GX_VerDepConst.pas',
GX_IndexTypes in '..\..\..\..\Source\Utils\GX_IndexTypes.pas',
GX_Splitter in '..\..\..\..\Source\Utils\GX_Splitter.pas',
- GX_SplitterPainter in '..\..\..\..\Source\Utils\GX_SplitterPainter.pas';
+ GX_SplitterPainter in '..\..\..\..\Source\Utils\GX_SplitterPainter.pas',
+ GX_SynMemoUtils in '..\..\..\..\Source\Framework\GX_SynMemoUtils.pas';
{$R *_icon.res}
{$R *_version.res}
Modified: trunk/Projects/StandAlone/Grep/src/GX_IdeUtils.pas
===================================================================
--- trunk/Projects/StandAlone/Grep/src/GX_IdeUtils.pas 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Projects/StandAlone/Grep/src/GX_IdeUtils.pas 2026-04-03 13:57:36 UTC (rev 5330)
@@ -43,6 +43,10 @@
/// @returns AColor </summary>
function GetThemedColor(AColor: TColor): TColor;
+///<summary>
+/// @returns an empty string </summary>
+function GetIDEVersionID: string;
+
implementation
uses
@@ -106,4 +110,9 @@
Result := AColor;
end;
+function GetIDEVersionID: string;
+begin
+ Result := '';
+end;
+
end.
Modified: trunk/Projects/StandAlone/common/GX_OtaUtils.pas
===================================================================
--- trunk/Projects/StandAlone/common/GX_OtaUtils.pas 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Projects/StandAlone/common/GX_OtaUtils.pas 2026-04-03 13:57:36 UTC (rev 5330)
@@ -14,6 +14,7 @@
Graphics,
Forms,
ToolsAPI,
+ GX_GenericUtils,
GX_StringList;
type
@@ -58,6 +59,14 @@
class function HaveCPPSupport: Boolean;
class function HaveCSharpSupport: Boolean;
class function GetIDEProductIdentifier: string;
+ // always returns False
+ class function ThemingEnabled: Boolean;
+ // always returns False
+ class function TryGetCurrentSourceEditor(out SourceEditor: IOTASourceEditor): Boolean;
+ // always returns gxpNone
+ class function GetCurrentSyntaxHighlighter(SourceEditor: IOTASourceEditor = nil): TGXSyntaxHighlighter;
+ // always returns an empty string
+ class function GetCurrentProjectFileName(NormalizeBdsProj: Boolean = False): string;
end;
///<summary>
@@ -172,7 +181,6 @@
implementation
uses
- GX_GenericUtils,
GX_VerDepConst;
function IsStandAlone: Boolean;
@@ -549,4 +557,25 @@
Result := True;
end;
+class function Ota.ThemingEnabled: Boolean;
+begin
+ Result := False;
+end;
+
+class function Ota.TryGetCurrentSourceEditor(out SourceEditor: IOTASourceEditor): Boolean;
+begin
+ SourceEditor := nil;
+ Result := False;
+end;
+
+class function Ota.GetCurrentSyntaxHighlighter(SourceEditor: IOTASourceEditor): TGXSyntaxHighlighter;
+begin
+ Result := gxpNone;
+end;
+
+class function Ota.GetCurrentProjectFileName(NormalizeBdsProj: Boolean): string;
+begin
+ Result := '';
+end;
+
end.
Modified: trunk/Source/Grep/GX_GrepExpert.pas
===================================================================
--- trunk/Source/Grep/GX_GrepExpert.pas 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Source/Grep/GX_GrepExpert.pas 2026-04-03 13:57:36 UTC (rev 5330)
@@ -51,7 +51,6 @@
FListUseDefaultColors: Boolean;
FListMatchTextColor: TColor;
FListMatchBrushColor: TColor;
- FContextFont: TFont;
FContextMatchColor: TColor;
FAutoHide: Boolean;
FContextMatchLineColor: TColor;
@@ -171,7 +170,6 @@
property ListUseDefaultColors: Boolean read FListUseDefaultColors write FListUseDefaultColors;
property ListMatchTextColor: TColor read FListMatchTextColor write FListMatchTextColor;
property ListMatchBrushColor: TColor read FListMatchBrushColor write FListMatchBrushColor;
- property ContextFont: TFont read FContextFont write FContextFont;
property ContextMatchColor: TColor read FContextMatchColor write FContextMatchColor;
property ContextMatchLineColor: TColor read FContextMatchLineColor write FContextMatchLineColor;
property AutoHide: Boolean read FAutoHide write FAutoHide;
@@ -235,8 +233,7 @@
FListUseDefaultColors := True;
FListMatchTextColor := clHighlightText;
FListMatchBrushColor := clHighlight;
- FContextFont := TFont.Create;
- FContextMatchColor := clHighlight;
+ FContextMatchColor := clHighlightText;
FContextMatchLineColor := clHighlight;
FNumContextLines := 2;
@@ -309,7 +306,6 @@
FreeAndNil(FDirList);
FreeAndNil(FExcludedDirsList);
FreeAndNil(FListFont);
- FreeAndNil(FContextFont);
inherited Destroy;
end;
@@ -368,7 +364,7 @@
FGrepExpandAll, FGrepExpandIf, FGrepExpandIfFiles, FGrepExpandIfMatches,
FGrepExpandFew, FGrepExpandFewLines,
FListUseDefaultColors, FListFont, FListMatchTextColor, FListMatchBrushColor,
- FContextFont, FContextMatchLineColor, FContextMatchColor, FNumContextLines,
+ FContextMatchLineColor, FContextMatchColor, FNumContextLines,
FGrepSaveHistoryListItems,
FAutoHide, FGrepFileListDeleteAfterDays, FGrepDeleteAfterDays,
FGrepEmptyMoveToOnlySaveParams, FGrepSaveOptionDefaultValue, FGrepOpenSaveOptionDefaultValue,
@@ -430,9 +426,14 @@
_Settings.SaveFont('ListFont', ListFont, [ffColor]);
_Settings.WriteInteger('ListMatchTextColor', ListMatchTextColor);
_Settings.WriteInteger('ListMatchBrushColor', ListMatchBrushColor);
- _Settings.SaveFont('ContextFont', ContextFont, [ffColor]);
- _Settings.WriteInteger('ContextMatchColor', ContextMatchColor);
- _Settings.WriteInteger('ContextMatchLineColor', ContextMatchLineColor);
+ if ColorToRGB(ContextMatchColor) = ColorToRGB(clHighlightText) then
+ _Settings.DeleteKey('ContextMatchColor')
+ else
+ _Settings.WriteInteger('ContextMatchColor', ContextMatchColor);
+ if ColorToRGB(ContextMatchLineColor) = ColorToRGB(clHighlight) then
+ _Settings.DeleteKey('ContextMatchLineColor')
+ else
+ _Settings.WriteInteger('ContextMatchLineColor', ContextMatchLineColor);
_Settings.WriteInteger('NumContextLines', NumContextLines);
_Settings.WriteInteger('SaveHistoryListItems', FGrepSaveHistoryListItems);
@@ -699,11 +700,11 @@
_Settings.LoadFont('ListFont', ListFont, [ffColor]);
FListMatchTextColor := _Settings.ReadInteger('ListMatchTextColor', FListMatchTextColor);
FListMatchBrushColor := _Settings.ReadInteger('ListMatchBrushColor', FListMatchBrushColor);
- _Settings.LoadFont('ContextFont', ContextFont, [ffColor]);
FContextMatchColor := _Settings.ReadInteger('ContextMatchColor', FContextMatchColor);
if _Settings.ValueExists('ContextMatchLineColor') then
FContextMatchLineColor := _Settings.ReadInteger('ContextMatchLineColor', FContextMatchLineColor)
- else
+ else if _Settings.ValueExists('ContextMatchColor') then
+ // Upgrade from old version that only had ContextMatchColor: use same color for line BG
FContextMatchLineColor := FContextMatchColor;
FNumContextLines := _Settings.ReadInteger('NumContextLines', FNumContextLines);
Modified: trunk/Source/Grep/GX_GrepResults.dfm
===================================================================
--- trunk/Source/Grep/GX_GrepResults.dfm 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Source/Grep/GX_GrepResults.dfm 2026-04-03 13:57:36 UTC (rev 5330)
@@ -282,25 +282,6 @@
SimplePanel = False
UseSystemFont = False
end
- object reContext: TRichEdit
- Left = 0
- Top = 0
- Width = 396
- Height = 78
- Align = alClient
- Font.Charset = ANSI_CHARSET
- Font.Color = clWindowText
- Font.Height = -12
- Font.Name = 'Tahoma'
- Font.Style = []
- ParentFont = False
- PopupMenu = pmContextMenu
- ReadOnly = True
- ScrollBars = ssBoth
- TabOrder = 1
- WordWrap = False
- OnContextPopup = reContextContextPopup
- end
end
end
object MainMenu: TMainMenu
Modified: trunk/Source/Grep/GX_GrepResults.pas
===================================================================
--- trunk/Source/Grep/GX_GrepResults.pas 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Source/Grep/GX_GrepResults.pas 2026-04-03 13:57:36 UTC (rev 5330)
@@ -10,8 +10,9 @@
Windows, Classes, Graphics, Controls, Forms, ActnList, Dialogs, StdCtrls, ExtCtrls, ToolWin,
Types, // for inlining
ComCtrls, Menus, Actions, UITypes,
+ SynEdit, SynEditTypes,
DropSource,
- GX_Splitter,
+ GX_Splitter, GX_GenericUtils,
GX_GrepBackend, GX_GrepExpert, GX_ConfigurationInfo, GX_IdeDock, GX_GrepSearch, GX_SharedImages;
type
@@ -20,6 +21,12 @@
TPageIndexes = array[TPageIndexType] of Integer;
TExpandMode = (emExpand, emContract, emToggle);
+ TContextMatchRange = record
+ Line: Integer; // 1-based SynEdit line number
+ SPos: Integer; // 1-based start column
+ EPos: Integer; // 1-based end column (inclusive)
+ end;
+
TfmGrepResults = class(TfmIdeDockForm)
StatusBar: TStatusBar;
lbResults: TListBox;
@@ -72,7 +79,6 @@
mitListSep1: TMenuItem;
mitFileSep1: TMenuItem;
pnlBottom: TPanel;
- reContext: TRichEdit;
SplitterContext: TSplitter;
mitViewSep1: TMenuItem;
actViewShowContext: TAction;
@@ -318,7 +324,6 @@
procedure lbHistoryListKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure actHistorySearchInHistoryExecute(Sender: TObject);
procedure SplitterHistoryListMoved(Sender: TObject);
- procedure reContextContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
procedure actListSelectNextExecute(Sender: TObject);
procedure actListSelectPreviousExecute(Sender: TObject);
procedure actHamburgerMenuExecute(Sender: TObject);
@@ -362,10 +367,20 @@
FSaveSortCaption: string;
FSavedFormCaption: string;
FlbHistoryListIndexForHistoryMenuActions: Integer;
+ FContextEditor: TSynEdit;
+ FContextHighlighter: TGXSyntaxHighlighter;
+ FContextMatchLines: array of Integer; // 1-based SynEdit line numbers that contain matches
+ FContextMatches: array of TContextMatchRange;
procedure SetStayOnTop(Value: Boolean);
procedure RefreshContextLines;
procedure SetShowContext(Value: Boolean);
- procedure HighlightMemo(FileMatches: TFileResult; StartLine, MatchLineNo: Integer);
+ procedure BuildMatchArrays(FileMatches: TFileResult; StartLine, LineCount: Integer);
+ procedure ContextEditorSpecialLineColors(Sender: TObject; Line: Integer;
+ var Special: Boolean; var FG, BG: TColor);
+ procedure ContextEditorSpecialTokenAttributes(Sender: TObject;
+ ALine, APos: Integer; const AToken: string;
+ var ASpecial: Boolean; var FG, BG: TColor; var AStyle: TFontStyles);
+ procedure ContextMenuPopup(Sender: TObject);
procedure ReportProgress(const PathName: string);
procedure StartDirectorySearch(Sender: TObject; const DirectoryName: string);
procedure StartFileSearch(Sender: TObject; const FileName: string);
@@ -457,8 +472,8 @@
{$IFDEF GX_SUPPORTS_THEMING}
UxTheme,
{$ENDIF}
- GX_GExperts, GX_GenericUtils, GX_StringList, GX_OtaUtils, GX_GxUtils, GX_IdeUtils, GX_MessageBox,
- GX_SplitterPainter,
+ GX_GExperts, GX_StringList, GX_OtaUtils, GX_GxUtils, GX_IdeUtils, GX_MessageBox,
+ GX_SplitterPainter, GX_SynMemoUtils,
GX_GrepPrinting, GX_Replace, GX_GrepReplace, GX_GrepSelect, GX_GrepProgress;
resourcestring
@@ -641,7 +656,7 @@
end;
FLastRepaintTick := GetTickCount;
- reContext.Clear;
+ FContextEditor.Lines.Clear;
ResultFiles := TStringList.Create;
try
@@ -942,15 +957,12 @@
pnlBottom.Color := LBackColor;
lbResults.Color := LBackColor;
lbHistoryList.Color := LBackColor;
- reContext.Color := LBackColor;
+ FContextEditor.Color := LBackColor;
SplitterHistoryList.Color := LSplitterColor;
SplitterContext.Color := LSplitterColor;
- if Ota.IdeStyleIsDark then begin
- if reContext.HandleAllocated then
- SetWindowTheme(reContext.Handle, 'DarkMode_Explorer', nil);
- end;
+ // todo: Set the SynMemo (FContextEditor) to dark mode
end;
end { InitThemedColors };
{$ELSE GX_SUPPORTS_THEMING}
@@ -1151,7 +1163,7 @@
SetLoadedContextHeight(pnlBottom.Height);
FShowContext := Value;
- reContext.Visible := Value;
+ FContextEditor.Visible := Value;
SplitterContext.Visible := Value;
UpdateContextPanelHeight;
@@ -1177,14 +1189,18 @@
MatchLineNo, BeginLineNo, EndLineNo, REMatchLineNo: Integer;
FileLines: TGXUnicodeStringList;
FileName: string;
+ NewHL: TGXSyntaxHighlighter;
i: Integer;
begin
if not ShowContext then
Exit;
- reContext.Lines.BeginUpdate;
+ FContextEditor.Lines.BeginUpdate;
try
- reContext.Clear;
+ FContextEditor.Lines.Clear;
+ SetLength(FContextMatchLines, 0);
+ SetLength(FContextMatches, 0);
+
if (lbResults.ItemIndex < 0) then
Exit;
if (ShowContext) and (gblGrepExpert.NumContextLines > 0) then
@@ -1196,6 +1212,12 @@
FileName := CurrentFile.FileName;
SetStatusString(CurrentFile.RelativeFileName);
+ NewHL := GetHighlighterFromFileName(FileName);
+ if NewHL <> FContextHighlighter then begin
+ FContextHighlighter := NewHL;
+ SetSynEditHighlighter(FContextEditor, NewHL);
+ end;
+
MatchLineNo := CurrentLine.LineNo - 1;
FileLines := TGXUnicodeStringList.Create;
@@ -1205,13 +1227,13 @@
except
on E: EGXFileNotFound do
begin
- reContext.Lines.Text := E.Message;
+ FContextEditor.Lines.Text := E.Message;
Exit;
end;
end;
if FileLines.Count < 1 then
begin
- reContext.Lines.Text := SMatchContextNotAvail;
+ FContextEditor.Lines.Text := SMatchContextNotAvail;
Exit;
end;
@@ -1220,61 +1242,105 @@
EndLineNo := MatchLineNo + gblGrepExpert.NumContextLines;
EndLineNo := Min(EndLineNo, FileLines.Count - 1);
- REMatchLineNo := 0;
- reContext.SelStart := reContext.GetTextLen;
+ REMatchLineNo := MatchLineNo - BeginLineNo + 1; // 1-based SynEdit line
for i := BeginLineNo to EndLineNo do
- begin
- reContext.SelText := FileLines[i] + IfThen(i <> EndLineNo, sLineBreak);
- if i = MatchLineNo then
- REMatchLineNo := reContext.Lines.Count - 1;
- end;
+ FContextEditor.Lines.Add(FileLines[i]);
finally
FreeAndNil(FileLines);
end;
- HighlightMemo(TFileResult(CurrentLine.Collection), BeginLineNo, REMatchLineNo);
- CenterLineInEdit(reContext, REMatchLineNo)
+
+ BuildMatchArrays(CurrentFile, BeginLineNo, EndLineNo - BeginLineNo + 1);
+
+ // Center the matched line in the context editor
+ FContextEditor.TopLine := Max(1, REMatchLineNo - (FContextEditor.LinesInWindow div 2));
+ FContextEditor.CaretXY := BufferCoord(1, REMatchLineNo);
end;
end;
finally
- reContext.Lines.EndUpdate;
+ FContextEditor.Lines.EndUpdate;
end;
+ FContextEditor.Invalidate;
end;
-// Make any matches found in the context lines bold
-// Also highlight the current match line using clHighlightText
-procedure TfmGrepResults.HighlightMemo(FileMatches: TFileResult; StartLine, MatchLineNo: Integer);
+procedure TfmGrepResults.BuildMatchArrays(FileMatches: TFileResult; StartLine, LineCount: Integer);
var
Matches: TMatchArray;
i, j: Integer;
+ MatchLineCount: Integer;
+ MatchCount: Integer;
+ SynLine: Integer;
begin
- reContext.SelStart := 0;
- reContext.SelLength := Length(reContext.Lines.Text);
- reContext.SelAttributes.Name := reContext.DefAttributes.Name;
- reContext.SelAttributes.Size := reContext.DefAttributes.Size;
- reContext.SelAttributes.Style := [];
+ MatchLineCount := 0;
+ MatchCount := 0;
+ SetLength(FContextMatchLines, LineCount);
+ SetLength(FContextMatches, LineCount * 4); // pre-allocate, will trim
- // Highlight the matched line
- reContext.SelStart := reContext.Perform(EM_LINEINDEX, MatchLineNo, 0);
- reContext.SelLength := Length(reContext.Lines[MatchLineNo]);
- reContext.SelAttributes.Color := gblGrepExpert.ContextMatchLineColor;
-
- for i := StartLine + 1 to StartLine + reContext.Lines.Count + 1 do
- begin
+ for i := StartLine + 1 to StartLine + LineCount do begin
+ SynLine := i - StartLine; // 1-based
FileMatches.GetMatchesOnLine(i, Matches);
- for j := 0 to Length(Matches) - 1 do
- begin
- if Matches[j].ShowBold then
- begin
- reContext.SelStart := reContext.Perform(EM_LINEINDEX, i - StartLine - 1, 0) + Matches[j].SPos - 1;
- reContext.SelLength := Matches[j].EPos - Matches[j].SPos + 1;
- reContext.SelAttributes.Color := gblGrepExpert.ContextMatchColor;
- reContext.SelAttributes.Style := [fsBold];
+ if Length(Matches) > 0 then begin
+ FContextMatchLines[MatchLineCount] := SynLine;
+ Inc(MatchLineCount);
+ for j := 0 to Length(Matches) - 1 do begin
+ if Matches[j].ShowBold then begin
+ if MatchCount >= Length(FContextMatches) then
+ SetLength(FContextMatches, MatchCount + 16);
+ FContextMatches[MatchCount].Line := SynLine;
+ FContextMatches[MatchCount].SPos := Matches[j].SPos;
+ FContextMatches[MatchCount].EPos := Matches[j].EPos;
+ Inc(MatchCount);
+ end;
end;
end;
end;
- reContext.SelStart := 0;
+ SetLength(FContextMatchLines, MatchLineCount);
+ SetLength(FContextMatches, MatchCount);
end;
+procedure TfmGrepResults.ContextEditorSpecialLineColors(Sender: TObject; Line: Integer;
+ var Special: Boolean; var FG, BG: TColor);
+var
+ i: Integer;
+begin
+ for i := 0 to Length(FContextMatchLines) - 1 do begin
+ if FContextMatchLines[i] = Line then begin
+ Special := True;
+ BG := gblGrepExpert.ContextMatchLineColor;
+ Exit;
+ end;
+ end;
+end;
+
+procedure TfmGrepResults.ContextEditorSpecialTokenAttributes(Sender: TObject;
+ ALine, APos: Integer; const AToken: string;
+ var ASpecial: Boolean; var FG, BG: TColor; var AStyle: TFontStyles);
+var
+ i: Integer;
+ TokenStart1: Integer; // 1-based start column
+ TokenEnd1: Integer; // 1-based end column
+begin
+ // APos is 0-based (from SynEdit's GetExpandedTokenPos), SPos/EPos are 1-based
+ TokenStart1 := APos + 1;
+ TokenEnd1 := APos + Length(AToken);
+ for i := 0 to Length(FContextMatches) - 1 do begin
+ if FContextMatches[i].Line <> ALine then
+ Continue;
+ // Check if token overlaps with this match range
+ if (TokenEnd1 >= FContextMatches[i].SPos) and (TokenStart1 <= FContextMatches[i].EPos) then begin
+ ASpecial := True;
+ FG := gblGrepExpert.ContextMatchColor;
+ BG := gblGrepExpert.ContextMatchLineColor;
+ AStyle := AStyle + [fsBold];
+ Exit;
+ end;
+ end;
+end;
+
+procedure TfmGrepResults.ContextMenuPopup(Sender: TObject);
+begin
+ actContextSelSearch.Enabled := FContextEditor.SelText <> '';
+end;
+
procedure TfmGrepResults.lbResultsMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
@@ -1618,11 +1684,11 @@
var
AItem: TGrepHistoryListItem;
begin
- if reContext.Focused then begin
- if reContext.SelLength > 0 then begin
- reContext.CopyToClipboard;
+ if FContextEditor.Focused then begin
+ if FContextEditor.SelLength > 0 then begin
+ FContextEditor.CopyToClipboard;
end else begin
- Clipboard.AsText := reContext.Lines.Text;
+ Clipboard.AsText := FContextEditor.Lines.Text;
end;
Exit; //==>
end;
@@ -1909,6 +1975,22 @@
TControl_SetMinConstraints(Self);
+ FContextEditor := TSynEdit.Create(Self);
+ FContextEditor.Parent := pnlBottom;
+ FContextEditor.Align := alClient;
+ FContextEditor.ReadOnly := True;
+ FContextEditor.Gutter.Width := 0;
+ FContextEditor.ScrollBars := ssBoth;
+ FContextEditor.WordWrap := False;
+ FContextEditor.Options := FContextEditor.Options + [eoSpecialLineDefaultFg];
+ FContextEditor.PopupMenu := pmContextMenu;
+ pmContextMenu.OnPopup := ContextMenuPopup;
+ FContextEditor.OnSpecialLineColors := ContextEditorSpecialLineColors;
+ FContextEditor.OnSpecialTokenAttributes := ContextEditorSpecialTokenAttributes;
+ Ota.GetEditorFont(FContextEditor.Font);
+ FContextHighlighter := gxpNone;
+ SetSynEditHighlighter(FContextEditor, gxpNone);
+
TSplitterPainter.Create(SplitterContext);
TSplitterPainter.Create(SplitterHistoryList);
@@ -2209,8 +2291,7 @@
procedure TfmGrepResults.AssignSettingsToForm;
begin
Assert(Assigned(gblGrepExpert));
- reContext.Font.Assign(gblGrepExpert.ContextFont);
- reContext.Font.Color := GetThemedColor(gblGrepExpert.ContextFont.Color);
+ Ota.GetEditorFont(FContextEditor.Font);
lbResults.Font.Assign(gblGrepExpert.ListFont);
lbResults.Font.Color := GetThemedColor(gblGrepExpert.ListFont.Color);
lbHistoryList.ParentFont := True;
@@ -2878,7 +2959,7 @@
begin
if Assigned(FEmbeddedGrepSearch) then
FEmbeddedGrepSearch.Hide;
- reContext.Clear;
+ FContextEditor.Lines.Clear;
ContractList(False);
SetStatusString('');
SetMatchString('');
@@ -3042,14 +3123,9 @@
end ;
end;
-procedure TfmGrepResults.reContextContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
-begin
- actContextSelSearch.Enabled := reContext.SelText <> '';
-end;
-
procedure TfmGrepResults.actContextSelSearchExecute(Sender: TObject);
begin
- FContextSearchText := reContext.SelText;
+ FContextSearchText := FContextEditor.SelText;
Execute(gssNormal);
FContextSearchText := '';
end;
Modified: trunk/Source/Grep/GX_GrepResultsOptions.dfm
===================================================================
--- trunk/Source/Grep/GX_GrepResultsOptions.dfm 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Source/Grep/GX_GrepResultsOptions.dfm 2026-04-03 13:57:36 UTC (rev 5330)
@@ -171,7 +171,7 @@
Caption = 'Context Font...'
Color = clWindow
TabOrder = 0
- OnClick = pnlContextFontClick
+ Visible = False
end
object pnlContextMatchFontColor: TPanel
Left = 48
@@ -213,6 +213,15 @@
TabOrder = 1
OnClick = pnlContextMatchLineFontColorClick
end
+ object btnResetContextColors: TButton
+ Left = 252
+ Top = 80
+ Width = 75
+ Height = 25
+ Caption = 'Reset'
+ TabOrder = 5
+ OnClick = btnResetContextColorsClick
+ end
end
object btnOK: TButton
Left = 520
Modified: trunk/Source/Grep/GX_GrepResultsOptions.pas
===================================================================
--- trunk/Source/Grep/GX_GrepResultsOptions.pas 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Source/Grep/GX_GrepResultsOptions.pas 2026-04-03 13:57:36 UTC (rev 5330)
@@ -42,6 +42,7 @@
chkDefaultListColors: TCheckBox;
pnlListMatchBackgroundColor: TPanel;
pnlContextMatchLineFontColor: TPanel;
+ btnResetContextColors: TButton;
chkGrepAutoHide: TCheckBox;
chkGrepSaveHistoryListItems: TCheckBox;
chkGrepExpandIf: TCheckBox;
@@ -73,12 +74,12 @@
lblHistoryPagesTabWidth: TLabel;
chkMouseWheelMoveItemIndex: TCheckBox;
lblWhenIDEClosing: TLabel;
- procedure pnlContextFontClick(Sender: TObject);
procedure pnlContextMatchFontColorClick(Sender: TObject);
procedure pnlListFontClick(Sender: TObject);
procedure pnlListMatchTextColorClick(Sender: TObject);
procedure pnlListMatchBackgroundColorClick(Sender: TObject);
procedure pnlContextMatchLineFontColorClick(Sender: TObject);
+ procedure btnResetContextColorsClick(Sender: TObject);
procedure chkDefaultListColorsClick(Sender: TObject);
procedure chkGrepExpandClick(Sender: TObject);
procedure chkGrepSaveHistoryListItemsClick(Sender: TObject);
@@ -103,7 +104,6 @@
_ListFont: TFont;
_ListMatchTextColor: TColor;
_ListMatchBrushColor: TColor;
- _ContextFont: TFont;
_ContextMatchLineColor: TColor;
_ContextMatchColor: TColor;
_NumContextLines: Integer;
@@ -132,7 +132,6 @@
_ListFont: TFont;
out _ListMatchTextColor: TColor;
out _ListMatchBrushColor: TColor;
- _ContextFont: TFont;
out _ContextMatchLineColor: TColor;
out _ContextMatchColor: TColor;
out _NumContextLines: Integer;
@@ -165,7 +164,6 @@
_ListFont: TFont;
var _ListMatchTextColor: TColor;
var _ListMatchBrushColor: TColor;
- _ContextFont: TFont;
var _ContextMatchLineColor: TColor;
var _ContextMatchColor: TColor;
var _NumContextLines: Integer;
@@ -204,7 +202,6 @@
_ListFont: TFont;
var _ListMatchTextColor: TColor;
var _ListMatchBrushColor: TColor;
- _ContextFont: TFont;
var _ContextMatchLineColor: TColor;
var _ContextMatchColor: TColor;
var _NumContextLines: Integer;
@@ -230,7 +227,7 @@
frm.SetData(_AdvancedOptions, _Middle,
_ExpandAll, _ExpandIf, _ExpandIfFiles, _ExpandIfMatches, _ExpandFew, _ExpandFewLines,
_ListUseDefaultColors, _ListFont, _ListMatchTextColor, _ListMatchBrushColor,
- _ContextFont, _ContextMatchLineColor, _ContextMatchColor, _NumContextLines,
+ _ContextMatchLineColor, _ContextMatchColor, _NumContextLines,
_SaveHistoryListItems,
_AutoHide, _FileListDeleteAfterDays, _DeleteAfterDays,
_EmptyMoveToOnlySaveParams, _SaveOptionDefaultValue, _OpenSaveOptionDefaultValue,
@@ -241,7 +238,7 @@
frm.GetData(_AdvancedOptions, _Middle,
_ExpandAll, _ExpandIf, _ExpandIfFiles, _ExpandIfMatches, _ExpandFew, _ExpandFewLines,
_ListUseDefaultColors, _ListFont, _ListMatchTextColor, _ListMatchBrushColor,
- _ContextFont, _ContextMatchLineColor, _ContextMatchColor, _NumContextLines,
+ _ContextMatchLineColor, _ContextMatchColor, _NumContextLines,
_SaveHistoryListItems,
_AutoHide, _FileListDeleteAfterDays, _DeleteAfterDays,
_EmptyMoveToOnlySaveParams, _SaveOptionDefaultValue, _OpenSaveOptionDefaultValue,
@@ -282,7 +279,6 @@
_ListFont: TFont;
_ListMatchTextColor: TColor;
_ListMatchBrushColor: TColor;
- _ContextFont: TFont;
_ContextMatchLineColor: TColor;
_ContextMatchColor: TColor;
_NumContextLines: Integer;
@@ -320,7 +316,6 @@
pnlListMatchBackgroundColor.Font.Color := BestForegroundForColor(_ListMatchBrushColor);
chkDefaultListColors.Checked := _UseDefaultColors;
- pnlContextFont.Font.Assign(_ContextFont);
pnlContextMatchLineFontColor.Color := _ContextMatchLineColor;
pnlContextMatchLineFontColor.Font.Color := BestForegroundForColor(_ContextMatchLineColor);
pnlContextMatchFontColor.Color := _ContextMatchColor;
@@ -359,7 +354,6 @@
_ListFont: TFont;
out _ListMatchTextColor: TColor;
out _ListMatchBrushColor: TColor;
- _ContextFont: TFont;
out _ContextMatchLineColor: TColor;
out _ContextMatchColor: TColor;
out _NumContextLines: Integer;
@@ -397,7 +391,6 @@
_ListMatchBrushColor := pnlListMatchBackgroundColor.Color;
end;
- _ContextFont.Assign(pnlContextFont.Font);
_ContextMatchLineColor := pnlContextMatchLineFontColor.Color;
_ContextMatchColor := pnlContextMatchFontColor.Color;
@@ -513,11 +506,6 @@
SelectColor(pnlListMatchBackgroundColor);
end;
-procedure TfmGrepResultsOptions.pnlContextFontClick(Sender: TObject);
-begin
- SelectFont(pnlContextFont);
-end;
-
procedure TfmGrepResultsOptions.pnlContextMatchLineFontColorClick(Sender: TObject);
begin
SelectColor(pnlContextMatchLineFontColor);
@@ -528,6 +516,14 @@
SelectColor(pnlContextMatchFontColor);
end;
+procedure TfmGrepResultsOptions.btnResetContextColorsClick(Sender: TObject);
+begin
+ pnlContextMatchLineFontColor.Color := clHighlight;
+ pnlContextMatchLineFontColor.Font.Color := BestForegroundForColor(clHighlight);
+ pnlContextMatchFontColor.Color := clHighlightText;
+ pnlContextMatchFontColor.Font.Color := BestForegroundForColor(clHighlightText);
+end;
+
procedure TfmGrepResultsOptions.chkDefaultListColorsClick(Sender: TObject);
begin
if chkDefaultListColors.Checked then begin
Modified: trunk/Source/Grep/GX_GrepSearch.pas
===================================================================
--- trunk/Source/Grep/GX_GrepSearch.pas 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Source/Grep/GX_GrepSearch.pas 2026-04-03 13:57:36 UTC (rev 5330)
@@ -196,7 +196,7 @@
begin
s := cbText.Text;
b := cbCaseSensitive.Checked;
- if TfmTestRegEx.Execute(Self, gblGrepExpert.ContextFont, gblGrepExpert.ContextMatchColor, s, b) then begin
+ if TfmTestRegEx.Execute(Self, gblGrepExpert.ContextMatchColor, s, b) then begin
cbText.Text := s;
cbCaseSensitive.Checked := b;
end;
Modified: trunk/Source/Grep/GX_TestRegEx.pas
===================================================================
--- trunk/Source/Grep/GX_TestRegEx.pas 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Source/Grep/GX_TestRegEx.pas 2026-04-03 13:57:36 UTC (rev 5330)
@@ -40,7 +40,7 @@
FCurrentCode: TGxUnicodeStringList;
procedure UpdateOutput;
public
- class function Execute(_Owner: TComponent; _MatchFont: TFont; _MatchColor: TColor;
+ class function Execute(_Owner: TComponent; _MatchColor: TColor;
var _RegEx: string; var _CaseSensitive: Boolean): Boolean;
constructor Create(_Owner: TComponent); override;
destructor Destroy; override;
@@ -57,7 +57,7 @@
{ TfmTestRegEx }
-class function TfmTestRegEx.Execute(_Owner: TComponent; _MatchFont: TFont; _MatchColor: TColor;
+class function TfmTestRegEx.Execute(_Owner: TComponent; _MatchColor: TColor;
var _RegEx: string; var _CaseSensitive: Boolean): Boolean;
var
frm: TfmTestRegEx;
@@ -65,7 +65,6 @@
frm := TfmTestRegEx.Create(_Owner);
try
frm.FMatchColor := _MatchColor;
- frm.ed_RegEx.Font.Assign(_MatchFont);
frm.ed_RegEx.Text := _RegEx;
frm.chk_CaseSensitive.Checked := _CaseSensitive;
Result := (frm.ShowModal = mrOk);
Modified: trunk/Source/Utils/GX_GenericUtils.pas
===================================================================
--- trunk/Source/Utils/GX_GenericUtils.pas 2026-03-24 17:28:33 UTC (rev 5329)
+++ trunk/Source/Utils/GX_GenericUtils.pas 2026-04-03 13:57:36 UTC (rev 5330)
@@ -618,6 +618,10 @@
// Extract the file extension from FileName and return it in all UPPERCASE.
function ExtractUpperFileExt(const FileName: string): string;
+// Return the syntax highlighter type that matches the file extension of FileName.
+// Uses the GXSyntaxInfo table. Returns gxpNone when no extension matches.
+function GetHighlighterFromFileName(const FileName: string): TGXSyntaxHighlighter;
+
// Extract the pure file name and return it.
// The "pure" file name is the file name without path information
// and without a file extension.
@@ -3731,6 +3735,40 @@
Result := AnsiUpperCase(ExtractFileExt(FileName));
end;
+function GetHighlighterFromFileName(const FileName: string): TGXSyntaxHighlighter;
+var
+ Ext: string;
+ hl: TGXSyntaxHighlighter;
+ ExtList: string;
+ p: Integer;
+ Pattern: string;
+begin
+ Result := gxpNone;
+ Ext := ExtractUpperFileExt(FileName); // e.g. '.PAS'
+ if Ext = '' then
+ Exit;
+ for hl := Low(TGXSyntaxHighlighter) to High(TGXSyntaxHighlighter) do begin
+ ExtList := AnsiUpperCase(GXSyntaxInfo[hl].Extensions); // e.g. '*.PAS;*.DPR;*.INC'
+ while ExtList <> '' do begin
+ p := Pos(';', ExtList);
+ if p > 0 then begin
+ Pattern := Copy(ExtList, 1, p - 1);
+ ExtList := Copy(ExtList, p + 1, MaxInt);
+ end else begin
+ Pattern := ExtList;
+ ExtList := '';
+ end;
+ // Pattern is e.g. '*.PAS' -> strip the '*' to get '.PAS'
+ if (Length(Pattern) > 1) and (Pattern[1] = '*') then
+ Pattern := Copy(Pattern, 2, MaxInt);
+ if Pattern = Ext then begin
+ Result := GXSyntaxInfo[hl].Highlighter;
+ Exit;
+ end;
+ end;
+ end;
+end;
+
function ExtractPureFileName(const FileName: string): string;
begin
Result := ExtractFileName(FileName);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-03-24 17:28:37
|
Revision: 5329
http://sourceforge.net/p/gexperts/code/5329
Author: twm
Date: 2026-03-24 17:28:33 +0000 (Tue, 24 Mar 2026)
Log Message:
-----------
Fix line endings: restore CRLF on all .dpr, .dproj, .pas, .dfm, and .md files modified in r5328
Modified Paths:
--------------
trunk/Documentation/CHANGES-1.3.28.md
trunk/Projects/Delphi2005/GExpertsDelphi2005.dpr
trunk/Projects/Delphi2006/GExpertsBDS2006.dpr
trunk/Projects/Delphi2007/GExpertsDelphi2007.dpr
trunk/Projects/Delphi2009/GExpertsRS2009.dpr
trunk/Projects/Delphi2009/GExpertsRS2009.dproj
trunk/Projects/Delphi2010/GExpertsRS2010.dpr
trunk/Projects/Delphi2010/GExpertsRS2010.dproj
trunk/Projects/Delphi6/GExpertsD6.dpr
trunk/Projects/Delphi7/GExpertsD7.dpr
trunk/Projects/DelphiXE1/GExpertsRSXE1.dpr
trunk/Projects/DelphiXE1/GExpertsRSXE1.dproj
trunk/Projects/DelphiXE2/GExpertsRSXE2.dpr
trunk/Projects/DelphiXE2/GExpertsRSXE2.dproj
trunk/Projects/DelphiXE3/GExpertsRSXE3.dpr
trunk/Projects/DelphiXE3/GExpertsRSXE3.dproj
trunk/Projects/DelphiXE4/GExpertsRSXE4.dpr
trunk/Projects/DelphiXE4/GExpertsRSXE4.dproj
trunk/Projects/DelphiXE5/GExpertsRSXE5.dpr
trunk/Projects/DelphiXE5/GExpertsRSXE5.dproj
trunk/Projects/DelphiXE6/GExpertsRSXE6.dpr
trunk/Projects/DelphiXE6/GExpertsRSXE6.dproj
trunk/Projects/DelphiXE7/GExpertsRSXE7.dpr
trunk/Projects/DelphiXE7/GExpertsRSXE7.dproj
trunk/Projects/DelphiXE8/GExpertsRSXE8.dpr
trunk/Projects/DelphiXE8/GExpertsRSXE8.dproj
trunk/Projects/DelphiXx101Berlin/GExpertsRS101.dpr
trunk/Projects/DelphiXx101Berlin/GExpertsRS101.dproj
trunk/Projects/DelphiXx102Tokyo/GExpertsRS102.dpr
trunk/Projects/DelphiXx102Tokyo/GExpertsRS102.dproj
trunk/Projects/DelphiXx103Rio/GExpertsRS103.dpr
trunk/Projects/DelphiXx103Rio/GExpertsRS103.dproj
trunk/Projects/DelphiXx104Sydney/GExpertsRS104.dpr
trunk/Projects/DelphiXx104Sydney/GExpertsRS104.dproj
trunk/Projects/DelphiXx10Seattle/GExpertsRS10.dpr
trunk/Projects/DelphiXx10Seattle/GExpertsRS10.dproj
trunk/Projects/DelphiXx110Alexandria/GExpertsRS110.dpr
trunk/Projects/DelphiXx110Alexandria/GExpertsRS110.dproj
trunk/Projects/DelphiXx120/GExpertsRS120.dpr
trunk/Projects/DelphiXx120/GExpertsRS120.dproj
trunk/Projects/DelphiXx130/GExpertsRS130.dpr
trunk/Projects/DelphiXx130/GExpertsRS130.dproj
trunk/Projects/DelphiXx130_64/GExperts64RS130.dpr
trunk/Projects/DelphiXx130_64/GExperts64RS130.dproj
trunk/Source/VerticalTabs/GX_VerticalTabs.dfm
trunk/Source/VerticalTabs/GX_VerticalTabs.pas
Modified: trunk/Documentation/CHANGES-1.3.28.md
===================================================================
--- trunk/Documentation/CHANGES-1.3.28.md 2026-03-24 17:14:29 UTC (rev 5328)
+++ trunk/Documentation/CHANGES-1.3.28.md 2026-03-24 17:28:33 UTC (rev 5329)
@@ -1,23 +1,23 @@
-# GExperts 1.3.28 Changes
-
-Changes since version 1.3.27 (released 2026-03-21)
-
-## New Features
-
-- Grep: Access error messages (missing directories, inaccessible files) now use a dialog with a Details button to hide the potentially long error list, and a "Don't show again" checkbox to suppress the dialog permanently (feature #221)
-- Message box framework: `TGxMsgBoxAdaptor` now supports a `GetDetails` method to show detail text behind a Details button
-- Comment Code expert: When the configured block comment style (`{ }`, `(* *)`, or `/* */`) would produce broken nested comments, the expert now offers to fall back to `//` line comments instead. The "Don't show again" checkbox remembers the choice. The Uncomment expert auto-detects `//`-commented blocks when a block style is configured (feature #178)
-- Message box framework: `DoPermanentlySuppress` and `IsPermanentlySuppressed` are now virtual, enabling per-result suppression in subclasses
-- Open File expert: New "Project Group" tab shows files from all projects in the project group. The tab is hidden when only a single project is loaded. The Project tab's content has been extracted into a reusable frame (feature #175)
-- IDE Form Enhancer: The debugger's Exception dialog (and other IDE message dialogs with only an OK button) can now be closed with Esc (feature #206)
-- Configuration: New "Disable IDE license notification" checkbox on the IDE tab writes the `LicenseNotificationEnabled` registry value to suppress the IDE's license notification popup (feature #202)
-- Vertical Tabs: New dockable panel showing open editor files as a vertical list. Single-click to switch files. Supports alphabetical or tab-order sorting, and a context menu with Close File, Close All Other, Copy Path, and Open Containing Folder (feature #224)
-
-## Bug Fixes
-
-- Code Formatter: Nested generic types like `TJSON.JsonToObject<TJSONReport<TPrintData>>` are now recognized correctly instead of being treated as comparison operators (bug #219)
-- Open File expert: Dialog position and size are now saved even when the dialog is cancelled (bug #480)
-
-## Contributors
-
-- Thomas Mueller (twm)
+# GExperts 1.3.28 Changes
+
+Changes since version 1.3.27 (released 2026-03-21)
+
+## New Features
+
+- Grep: Access error messages (missing directories, inaccessible files) now use a dialog with a Details button to hide the potentially long error list, and a "Don't show again" checkbox to suppress the dialog permanently (feature #221)
+- Message box framework: `TGxMsgBoxAdaptor` now supports a `GetDetails` method to show detail text behind a Details button
+- Comment Code expert: When the configured block comment style (`{ }`, `(* *)`, or `/* */`) would produce broken nested comments, the expert now offers to fall back to `//` line comments instead. The "Don't show again" checkbox remembers the choice. The Uncomment expert auto-detects `//`-commented blocks when a block style is configured (feature #178)
+- Message box framework: `DoPermanentlySuppress` and `IsPermanentlySuppressed` are now virtual, enabling per-result suppression in subclasses
+- Open File expert: New "Project Group" tab shows files from all projects in the project group. The tab is hidden when only a single project is loaded. The Project tab's content has been extracted into a reusable frame (feature #175)
+- IDE Form Enhancer: The debugger's Exception dialog (and other IDE message dialogs with only an OK button) can now be closed with Esc (feature #206)
+- Configuration: New "Disable IDE license notification" checkbox on the IDE tab writes the `LicenseNotificationEnabled` registry value to suppress the IDE's license notification popup (feature #202)
+- Vertical Tabs: New dockable panel showing open editor files as a vertical list. Single-click to switch files. Supports alphabetical or tab-order sorting, and a context menu with Close File, Close All Other, Copy Path, and Open Containing Folder (feature #224)
+
+## Bug Fixes
+
+- Code Formatter: Nested generic types like `TJSON.JsonToObject<TJSONReport<TPrintData>>` are now recognized correctly instead of being treated as comparison operators (bug #219)
+- Open File expert: Dialog position and size are now saved even when the dialog is cancelled (bug #480)
+
+## Contributors
+
+- Thomas Mueller (twm)
Modified: trunk/Projects/Delphi2005/GExpertsDelphi2005.dpr
===================================================================
--- trunk/Projects/Delphi2005/GExpertsDelphi2005.dpr 2026-03-24 17:14:29 UTC (rev 5328)
+++ trunk/Projects/Delphi2005/GExpertsDelphi2005.dpr 2026-03-24 17:28:33 UTC (rev 5329)
@@ -1,302 +1,302 @@
-library GExpertsDelphi2005;
-
-{$E dll}
-
-{%File '_prebuild.cmd'}
-
-uses
- GX_About in '..\..\source\Framework\GX_About.pas' {fmAbout},
- GX_ActionBroker in '..\..\source\Framework\GX_ActionBroker.pas',
- GX_Actions in '..\..\source\Framework\GX_Actions.pas',
- GX_AddDockWindow in '..\..\Source\AddDockWindow\GX_AddDockWindow.pas' {fmGxDockForm},
- GX_AsciiChart in '..\..\source\AsciiChart\GX_AsciiChart.pas' {fmAsciiChart},
- GX_AutoTodoDone in '..\..\Source\AutoTodo\GX_AutoTodoDone.pas' {fmAutoTodoDone},
- GX_Backup in '..\..\source\BackupProject\GX_Backup.pas' {fmBackup},
- GX_BackupConfig in '..\..\source\BackupProject\GX_BackupConfig.pas' {fmBackupConfig},
- GX_BackupNotFound in '..\..\Source\BackupProject\GX_BackupNotFound.pas' {fmBackupNotFound},
- GX_BackupOptions in '..\..\source\BackupProject\GX_BackupOptions.pas' {fmBackupOptions},
- GX_BaseExpert in '..\..\Source\Framework\GX_BaseExpert.pas',
- GX_BaseForm in '..\..\source\Framework\GX_BaseForm.pas' {fmBaseForm},
- GX_BookmarkList in '..\..\source\Utils\GX_BookmarkList.pas',
- GX_Bookmarks in '..\..\source\Bookmarks\GX_Bookmarks.pas' {fmGxBookmarksForm},
- GX_BookmarksConst in '..\..\source\Bookmarks\GX_BookmarksConst.pas',
- GX_BookmarksEdit in '..\..\source\Bookmarks\GX_BookmarksEdit.pas' {foBookmarksEdit},
- GX_BookmarksFuncProcName in '..\..\Source\Bookmarks\GX_BookmarksFuncProcName.pas',
- GX_BookmarksLists in '..\..\Source\Bookmarks\GX_BookmarksLists.pas',
- GX_BookmarksOptions in '..\..\source\Bookmarks\GX_BookmarksOptions.pas' {foBookmarksOptions},
- GX_BookmarksSelect in '..\..\source\Bookmarks\GX_BookmarksSelect.pas' {foBookmarksSelect},
- GX_CheckButton in '..\..\source\Utils\GX_CheckButton.pas',
- GX_CheckListBoxWithHints in '..\..\Source\ProjectOptionSets\GX_CheckListBoxWithHints.pas',
- GX_ClassBrowser in '..\..\source\ClassBrowser\GX_ClassBrowser.pas' {fmClassBrowser},
- GX_ClassHacks in '..\..\source\Framework\GX_ClassHacks.pas',
- GX_ClassIdentify in '..\..\source\ClassBrowser\GX_ClassIdentify.pas' {fmClassIdentify},
- GX_ClassMgr in '..\..\source\Framework\GX_ClassMgr.pas',
- GX_ClassOptions in '..\..\source\ClassBrowser\GX_ClassOptions.pas' {fmClassOptions},
- GX_ClassParsing in '..\..\source\ClassBrowser\GX_ClassParsing.pas' {fmClassParsing},
- GX_ClassProp in '..\..\source\ClassBrowser\GX_ClassProp.pas' {fmClassProp},
- GX_CleanDirectories in '..\..\source\CleanDirectories\GX_CleanDirectories.pas' {fmCleanDirectories},
- GX_CleanDirectoriesOptions in '..\..\Source\CleanDirectories\GX_CleanDirectoriesOptions.pas' {fmCleanDirectoriesOptions},
- GX_ClipboardHistory in '..\..\source\ClipboardHistory\GX_ClipboardHistory.pas' {fmClipboardHistory},
- GX_ClipboardOptions in '..\..\source\ClipboardHistory\GX_ClipboardOptions.pas' {fmClipboardOptions},
- GX_CodeFormatterBookmarks in '..\..\source\Formatter\GX_CodeFormatterBookmarks.pas',
- GX_CodeFormatterBreakpoints in '..\..\source\Formatter\GX_CodeFormatterBreakpoints.pas',
- GX_CodeFormatterConfig in '..\..\source\Formatter\GX_CodeFormatterConfig.pas' {fmCodeFormatterConfig},
- GX_CodeFormatterConfigHandler in '..\..\source\Formatter\GX_CodeFormatterConfigHandler.pas',
- GX_CodeFormatterDefaultSettings in '..\..\source\Formatter\GX_CodeFormatterDefaultSettings.pas',
- GX_CodeFormatterEditCapitalization in '..\..\source\Formatter\GX_CodeFormatterEditCapitalization.pas' {fmCodeFormatterEditCapitalization},
- GX_CodeFormatterEngine in '..\..\source\Formatter\engine\GX_CodeFormatterEngine.pas',
- GX_CodeFormatterExpert in '..\..\source\Formatter\GX_CodeFormatterExpert.pas',
- GX_CodeFormatterFormatter in '..\..\source\Formatter\engine\GX_CodeFormatterFormatter.pas',
- GX_CodeFormatterGXConfigWrapper in '..\..\source\Formatter\GX_CodeFormatterGXConfigWrapper.pas',
- GX_CodeFormatterParser in '..\..\source\Formatter\engine\GX_CodeFormatterParser.pas',
- GX_CodeFormatterSettings in '..\..\source\Formatter\engine\GX_CodeFormatterSettings.pas',
- GX_CodeFormatterSourceLineList in '..\..\Source\Formatter\GX_CodeFormatterSourceLineList.pas',
- GX_CodeFormatterStack in '..\..\source\Formatter\engine\GX_CodeFormatterStack.pas',
- GX_CodeFormatterTokenList in '..\..\source\Formatter\engine\GX_CodeFormatterTokenList.pas',
- GX_CodeFormatterTokens in '..\..\source\Formatter\engine\GX_CodeFormatterTokens.pas',
- GX_CodeFormatterTypes in '..\..\source\Formatter\engine\GX_CodeFormatterTypes.pas',
- GX_CodeFormatterUnicode in '..\..\source\Formatter\engine\GX_CodeFormatterUnicode.pas',
- GX_CodeLib in '..\..\source\CodeLibrarian\GX_CodeLib.pas' {fmCodeLib},
- GX_CodeLibFile in '..\..\Source\CodeLibrarian\GX_CodeLibFile.pas',
- GX_CodeOpt in '..\..\source\CodeLibrarian\GX_CodeOpt.pas' {fmCodeOptions},
- GX_CodeSrch in '..\..\source\CodeLibrarian\GX_CodeSrch.pas' {fmCodeSearch},
- GX_ComponentGrid in '..\..\source\ComponentGrid\GX_ComponentGrid.pas' {fmComponentGrid},
- GX_CompRename in '..\..\source\RenameComponents\GX_CompRename.pas' {fmCompRename},
- GX_CompRenameAdvanced in '..\..\source\RenameComponents\GX_CompRenameAdvanced.pas' {fmCompRenameAdvanced},
- GX_CompRenameConfig in '..\..\source\RenameComponents\GX_CompRenameConfig.pas' {fmCompRenameConfig},
- GX_CompsToCode in '..\..\source\ComponentsToCode\GX_CompsToCode.pas' {fmCompsToCode},
- GX_ConfigurationInfo in '..\..\source\Framework\GX_ConfigurationInfo.pas',
- GX_Configure in '..\..\source\Framework\GX_Configure.pas' {fmConfiguration},
- GX_ConfigureExperts in '..\..\Source\Framework\GX_ConfigureExperts.pas' {frConfigureExperts: TFrame},
- GX_Consts in '..\..\source\Framework\GX_Consts.pas',
- GX_CopyComponentNames in '..\..\source\CopyComponentNames\GX_CopyComponentNames.pas',
- GX_CustomClipboard in '..\..\Source\Framework\GX_CustomClipboard.pas',
- GX_DbugIntf in '..\..\source\Utils\GX_DbugIntf.pas',
- GX_Debug in '..\..\Source\Utils\GX_Debug.pas',
- GX_DesignerMenu in '..\..\source\Framework\GX_DesignerMenu.pas',
- GX_DrawFixes in '..\..\Source\Utils\GX_DrawFixes.pas',
- GX_DummyWizard in '..\..\Source\Framework\GX_DummyWizard.pas',
- GX_DuplicateDllHandler in '..\..\Source\Framework\GX_DuplicateDllHandler.pas',
- GX_eAddToCaptitalization in '..\..\Source\Formatter\GX_eAddToCaptitalization.pas',
- GX_eAlign in '..\..\source\Editor\GX_eAlign.pas' {fmAlign},
- GX_eAlignOptions in '..\..\source\Editor\GX_eAlignOptions.pas' {fmAlignOptions},
- GX_eChangeCase in '..\..\source\Editor\GX_eChangeCase.pas',
- GX_eCodeFormatter in '..\..\source\Formatter\GX_eCodeFormatter.pas',
- GX_eComment in '..\..\source\Editor\GX_eComment.pas' {fmCommentConfig},
- GX_eConvertStrings in '..\..\Source\Editor\GX_eConvertStrings.pas' {fmEConvertStrings},
- GX_eDate in '..\..\source\Editor\GX_eDate.pas' {fmDateFormat},
- GX_eDeclareVariable in '..\..\source\DeclareVariable\GX_eDeclareVariable.pas' {fmDeclareVariable},
- GX_DeclareVariable in '..\..\source\DeclareVariable\GX_DeclareVariable.pas',
- GX_EditorChangeServices in '..\..\source\Framework\GX_EditorChangeServices.pas',
- GX_EditorEnhancements in '..\..\source\experts\editorenhancements\GX_EditorEnhancements.pas',
- GX_EditorEnhancementsConfig in '..\..\Source\Experts\EditorEnhancements\GX_EditorEnhancementsConfig.pas' {fmEditorEnhancementsConfig},
- GX_EditorExpert in '..\..\source\Editor\GX_EditorExpert.pas',
- GX_EditorExpertManager in '..\..\source\Editor\GX_EditorExpertManager.pas',
- GX_EditorFormServices in '..\..\source\Framework\GX_EditorFormServices.pas',
- GX_EditPath in '..\..\Source\EditPath\GX_EditPath.pas' {f_EditPath},
- GX_EditPathConfig in '..\..\Source\EditPath\GX_EditPathConfig.pas' {f_EditPathConfig},
- GX_EditReader in '..\..\source\Framework\GX_EditReader.pas',
- GX_eFindDelimiter in '..\..\source\Editor\GX_eFindDelimiter.pas',
- GX_eGotoModification in '..\..\Source\Editor\GX_eGotoModification.pas',
- GX_eIfDef in '..\..\Source\Editor\GX_eIfDef.pas' {fmConfigureIfDef},
- GX_ePasteAs in '..\..\source\Editor\GX_ePasteAs.pas' {fmPasteAsConfig},
- GX_ePopupMenu in '..\..\Source\Editor\GX_ePopupMenu.pas' {fmEditorPopupMenuExpertConfig},
- GX_ePrevNextIdentifier in '..\..\source\Editor\GX_ePrevNextIdentifier.pas',
- GX_eRenameIdentifier in '..\..\source\Editor\GX_eRenameIdentifier.pas' {fmRenameIdentifier},
- GX_PascalTokenAnalyzer in '..\..\source\Utils\GX_PascalTokenAnalyzer.pas',
- GX_RenameIdentifier in '..\..\source\Editor\GX_RenameIdentifier.pas',
- GX_eRemoveMatchingLines in '..\..\Source\Editor\GX_eRemoveMatchingLines.pas' {fmRemoveMatchingLinesExpertConfig},
- GX_eReverseStatement in '..\..\source\ReverseStatement\GX_eReverseStatement.pas',
- GX_ReverseStatementUtils in '..\..\source\ReverseStatement\GX_ReverseStatementUtils.pas',
- GX_eReverseOptions in '..\..\source\ReverseStatement\GX_eReverseOptions.pas' {fmReverseOptions},
- GX_eReverseRuleEdit in '..\..\source\ReverseStatement\GX_eReverseRuleEdit.pas' {fmReverseRuleEdit},
- GX_eSelectIdentifier in '..\..\source\Editor\GX_eSelectIdentifier.pas',
- GX_eSelectionEditorExpert in '..\..\source\Editor\GX_eSelectionEditorExpert.pas',
- GX_eDuplicateLine in '..\..\Source\DuplicateLine\GX_eDuplicateLine.pas',
- GX_eSort in '..\..\Source\Editor\GX_eSort.pas' {fmeSortConfig},
- GX_eSortOptions in '..\..\Source\Editor\GX_eSortOptions.pas' {frmSortOptions},
- GX_EventHook in '..\..\source\framework\GX_EventHook.pas',
- GX_eWarn in '..\..\Source\Editor\GX_eWarn.pas' {fmConfigureWarning},
- GX_ExpertManager in '..\..\source\ExpertManager\GX_ExpertManager.pas' {fmExpertManager},
- GX_Experts in '..\..\source\Framework\GX_Experts.pas',
- GX_ExplicitFilterExpert in '..\..\Source\ExplicitFilter\GX_ExplicitFilterExpert.pas' {fmGxExplicitFilter},
- GX_FavFileProp in '..\..\source\FavoriteFiles\GX_FavFileProp.pas' {fmFavFileProp},
- GX_FavFiles in '..\..\source\FavoriteFiles\GX_FavFiles.pas' {fmFavFiles},
- GX_FavFolderProp in '..\..\source\FavoriteFiles\GX_FavFolderProp.pas' {fmFavFolderProperties},
- GX_FavNewFolder in '..\..\source\FavoriteFiles\GX_FavNewFolder.pas' {fmFavNewFolder},
- GX_FavOptions in '..\..\source\FavoriteFiles\GX_FavOptions.pas' {fmFavOptions},
- GX_FavUtil in '..\..\source\FavoriteFiles\GX_FavUtil.pas',
- GX_FavWuppdiWPImport in '..\..\Source\FavoriteFiles\GX_FavWuppdiWPImport.pas' {fmFavWuppdiWPImport},
- GX_FeedbackWizard in '..\..\source\Framework\GX_FeedbackWizard.pas' {fmFeedbackWizard},
- GX_FileScanner in '..\..\source\Framework\GX_FileScanner.pas',
- GX_FilterExceptions in '..\..\Source\FilterExceptions\GX_FilterExceptions.pas' {fmGxFilterExceptionsExpert},
- GX_FilterExceptionsEdit in '..\..\Source\FilterExceptions\GX_FilterExceptionsEdit.pas' {fmGxFilterExceptionsEdit},
- GX_FilterExceptionsNotification in '..\..\Source\FilterExceptions\GX_FilterExceptionsNotification.pas' {fmExceptionNotification},
- GX_FindComponentRef in '..\..\source\FindComponentReference\GX_FindComponentRef.pas',
- GX_FocusCodeEditor in '..\..\Source\FocusCodeEditor\GX_FocusCodeEditor.pas',
- GX_FormHotkeys in '..\..\Source\FormHotkeys\GX_FormHotkeys.pas' {f_FormHotkeys},
- GX_FormHotkeysSelect in '..\..\Source\FormHotkeys\GX_FormHotkeysSelect.pas' {fmFormHotkeysSelect},
- GX_GenericClasses in '..\..\source\Utils\GX_GenericClasses.pas',
- GX_GenericUtils in '..\..\source\Utils\GX_GenericUtils.pas',
- GX_GetIdeVersion in '..\..\source\Framework\GX_GetIdeVersion.pas',
- GX_GExperts in '..\..\source\Framework\GX_GExperts.pas',
- GX_Goto in '..\..\Source\Goto\GX_Goto.pas' {f_Goto},
- GX_GotoConfig in '..\..\Source\Goto\GX_GotoConfig.pas' {f_GotoConfig},
- GX_GrepBackend in '..\..\source\Grep\GX_GrepBackend.pas',
- GX_GrepExpert in '..\..\source\Grep\GX_GrepExpert.pas',
- GX_GrepInstantGrep in '..\..\Source\Grep\GX_GrepInstantGrep.pas' {fmGxInstantGrepForm},
- GX_GrepMenuConfig in '..\..\Source\Grep\GX_GrepMenuConfig.pas' {f_GrepMenuConfig},
- GX_GrepMenuEntry in '..\..\Source\Grep\GX_GrepMenuEntry.pas',
- GX_GrepOptions in '..\..\source\Grep\GX_GrepOptions.pas' {fmGrepOptions},
- GX_GrepNextItemExpert in '..\..\Source\Grep\GX_GrepNextItemExpert.pas',
- GX_GrepPrevItemExpert in '..\..\Source\Grep\GX_GrepPrevItemExpert.pas',
- GX_GrepPrinting in '..\..\source\Grep\GX_GrepPrinting.pas',
- GX_GrepProgress in '..\..\Source\Grep\GX_GrepProgress.pas' {fmGrepProgress},
- GX_GrepRegExSearch in '..\..\source\Grep\GX_GrepRegExSearch.pas',
- GX_GrepReplace in '..\..\source\Grep\GX_GrepReplace.pas' {fmGrepReplace},
- GX_GrepResults in '..\..\source\Grep\GX_GrepResults.pas' {fmGrepResults},
- GX_GrepResultsOptions in '..\..\source\Grep\GX_GrepResultsOptions.pas' {fmGrepResultsOptions},
- GX_GrepSearch in '..\..\source\Grep\GX_GrepSearch.pas' {fmGrepSearch},
- GX_GrepSearchExpert in '..\..\Source\Grep\GX_GrepSearchExpert.pas',
- GX_GrepSelect in '..\..\Source\Grep\GX_GrepSelect.pas' {fmGrepSelect},
- GX_GxUtils in '..\..\source\Utils\GX_GxUtils.pas',
- GX_HideNavbar in '..\..\source\Experts\EditorEnhancements\GX_HideNavbar.pas',
- GX_HideNonVisualComps in '..\..\source\HideNonvisualComponents\GX_HideNonVisualComps.pas',
- GX_HintWindow in '..\..\Source\Framework\GX_HintWindow.pas',
- GX_IconMessageBox in '..\..\source\Framework\GX_IconMessageBox.pas',
- GX_IdeApplicationSettingsEnhancer in '..\..\Source\IDE\GX_IdeApplicationSettingsEnhancer.pas',
- GX_IdeBuildEventFavoriteEdit in '..\..\Source\IDE\GX_IdeBuildEventFavoriteEdit.pas' {f_IdeBuildEventFavoriteEdit},
- GX_IdeBuildEventsEnhancer in '..\..\Source\IDE\GX_IdeBuildEventsEnhancer.pas',
- GX_IdeDetectForms in '..\..\Source\ide\GX_IdeDetectForms.pas',
- GX_IdeDialogEnhancer in '..\..\Source\IDE\GX_IdeDialogEnhancer.pas',
- GX_IdeDock in '..\..\source\IDEDocking\GX_IdeDock.pas' {fmIdeDockForm},
- GX_IdeDockFormEnhancer in '..\..\Source\IDE\GX_IdeDockFormEnhancer.pas',
- GX_IdeEnhance in '..\..\source\IDE\GX_IdeEnhance.pas',
- GX_IdeEvaluateModifyEnhancer in '..\..\Source\IDE\GX_IdeEvaluateModifyEnhancer.pas',
- GX_IdeFavoritesList in '..\..\Source\IDE\GX_IdeFavoritesList.pas' {f_GxIdeFavoritesList},
- GX_IdeFormChangeManager in '..\..\Source\IDE\GX_IdeFormChangeManager.pas',
- GX_IdeFormEnhancer in '..\..\source\IDE\GX_IdeFormEnhancer.pas',
- GX_IdeInstallPackagesEnhancer in '..\..\source\IDE\GX_IdeInstallPackagesEnhancer.pas',
- GX_IdeManagedForm in '..\..\Source\IDE\GX_IdeManagedForm.pas',
- GX_IdeManagedFormHandler in '..\..\Source\IDE\GX_IdeManagedFormHandler.pas',
- GX_IdeMessageAutoClose in '..\..\Source\IDE\GX_IdeMessageAutoClose.pas',
- GX_IdeObjectInspectorEnhancer in '..\..\Source\IDE\GX_IdeObjectInspectorEnhancer.pas',
- GX_IdePackageRenameDlg in '..\..\source\IDE\GX_IdePackageRenameDlg.pas' {fmIdxPackageRenameDlg},
- GX_IdeProjectOptionsEnhancer in '..\..\source\IDE\GX_IdeProjectOptionsEnhancer.pas',
- GX_IdeSearchPathEnhancer in '..\..\source\IDE\GX_IdeSearchPathEnhancer.pas',
- GX_IdeSearchPathFavoriteEdit in '..\..\Source\IDE\GX_IdeSearchPathFavoriteEdit.pas' {f_IdeSearchPathFavoriteEdit},
- GX_IdeShortCuts in '..\..\source\IdeShortCuts\GX_IdeShortCuts.pas' {fmIdeShortCuts},
- GX_IdeToolbar in '..\..\Source\IdeToolbar\GX_IdeToolbar.pas',
- GX_IdeToolbarExpert in '..\..\Source\IdeToolbar\GX_IdeToolbarExpert.pas',
- GX_IdeToolPropertiesEnhancer in '..\..\source\IDE\GX_IdeToolPropertiesEnhancer.pas',
- GX_IdeSplitterVisibility in '..\..\Source\IDE\GX_IdeSplitterVisibility.pas',
- GX_IdeUtils in '..\..\source\Utils\GX_IdeUtils.pas',
- GX_IndexTypes in '..\..\source\Utils\GX_IndexTypes.pas',
- GX_InspectionServer in '..\..\Source\Framework\GX_InspectionServer.pas',
- GX_InsertAutoTodo in '..\..\Source\AutoTodo\GX_InsertAutoTodo.pas' {fmInsertAutoTodoForm},
- GX_KbdShortCutBroker in '..\..\source\Framework\GX_KbdShortCutBroker.pas',
- GX_KeyboardShortcuts in '..\..\Source\KeyboardShortcuts\GX_KeyboardShortcuts.pas' {fmGxKeyboardShortcuts},
- GX_KibitzComp in '..\..\source\Framework\GX_KibitzComp.pas',
- GX_LibrarySource in '..\..\source\Framework\GX_LibrarySource.pas',
- GX_Logging in '..\..\Source\Framework\GX_Logging.pas',
- GX_MacroExpandNotifier in '..\..\source\MacroTemplates\GX_MacroExpandNotifier.pas',
- GX_MacroFile in '..\..\source\MacroTemplates\GX_MacroFile.pas',
- GX_MacroLibrary in '..\..\source\MacroLibrary\GX_MacroLibrary.pas' {fmMacroLibrary},
- GX_MacroLibraryConfig in '..\..\source\MacroLibrary\GX_MacroLibraryConfig.pas' {fmGxMacroLibraryConfig},
- GX_MacroLibraryEditEntry in '..\..\Source\MacroLibrary\GX_MacroLibraryEditEntry.pas' {fmEditMacroItem},
- GX_MacroLibraryNamePrompt in '..\..\source\MacroLibrary\GX_MacroLibraryNamePrompt.pas' {fmMacroLibraryNamePrompt},
- GX_MacroParser in '..\..\source\Framework\GX_MacroParser.pas',
- GX_MacroSelect in '..\..\source\MacroTemplates\GX_MacroSelect.pas' {fmMacroSelect},
- GX_MacroTemplateEdit in '..\..\source\MacroTemplates\GX_MacroTemplateEdit.pas' {fmMacroTemplateEdit},
- GX_MacroTemplates in '..\..\source\MacroTemplates\GX_MacroTemplates.pas' {fmMacroTemplates},
- GX_MacroTemplatesExpert in '..\..\source\MacroTemplates\GX_MacroTemplatesExpert.pas',
- GX_MemoEscFix in '..\..\Source\Utils\GX_MemoEscFix.pas',
- GX_MenuActions in '..\..\source\Framework\GX_MenuActions.pas',
- GX_MenusForEditorExpert in '..\..\source\Editor\GX_MenusForEditorExpert.pas',
- GX_MessageBox in '..\..\source\Framework\GX_MessageBox.pas' {fmGxMessageBox},
- GX_MessageDialog in '..\..\source\MessageDialog\GX_MessageDialog.pas' {fmMessageDialog},
- GX_MessageOptions in '..\..\source\MessageDialog\GX_MessageOptions.pas' {fmMessageOptions},
- GX_MultilineHost in '..\..\source\IDE\GX_MultilineHost.pas',
- GX_MultiLinePalette in '..\..\source\IDE\GX_MultiLinePalette.pas',
- GX_NTAEditServiceNotifier in '..\..\source\Utils\GX_NTAEditServiceNotifier.pas',
- GX_OpenFile in '..\..\source\OpenFile\GX_OpenFile.pas' {fmOpenFile},
- GX_OpenFileList in '..\..\source\OpenFile\GX_OpenFileList.pas' {frOpenFileList: TFrame},
- GX_OpenFileConfig in '..\..\source\OpenFile\GX_OpenFileConfig.pas' {fmOpenFileConfig},
- GX_OtaUtils in '..\..\source\Utils\GX_OtaUtils.pas',
- GX_PasteAs in '..\..\source\Framework\GX_PasteAs.pas',
- GX_PeInformation in '..\..\source\PeInfo\GX_PeInformation.pas',
- GX_PerfectLayout in '..\..\Source\Legacy\GX_PerfectLayout.pas' {fmPerfectLayout},
- GX_ProcedureList in '..\..\source\ProcedureList\GX_ProcedureList.pas' {fmProcedureList},
- GX_ProcedureListOptions in '..\..\source\ProcedureList\GX_ProcedureListOptions.pas' {fmProcedureListOptions},
- GX_Progress in '..\..\source\Framework\GX_Progress.pas' {fmProgress},
- GX_ProjDepend in '..\..\source\ProjectDependencies\GX_ProjDepend.pas' {fmProjDepend},
- GX_ProjDependFilter in '..\..\source\ProjectDependencies\GX_ProjDependFilter.pas' {fmProjDependFilter},
- GX_ProjDependOptions in '..\..\Source\ProjectDependencies\GX_ProjDependOptions.pas' {fmProjDependOptions},
- GX_ProjDependProp in '..\..\source\ProjectDependencies\GX_ProjDependProp.pas' {fmProjDependProp},
- GX_ProjOptionSets in '..\..\source\ProjectOptionSets\GX_ProjOptionSets.pas' {fmProjOptionSets},
- GX_ProjOptMap in '..\..\source\ProjectOptionSets\GX_ProjOptMap.pas',
- GX_ProofreaderAutoCorrectEntry in '..\..\source\CodeProofreader\GX_ProofreaderAutoCorrectEntry.pas' {fmProofreaderAutoCorrectEntry},
- GX_ProofreaderConfig in '..\..\source\CodeProofreader\GX_ProofreaderConfig.pas' {fmProofreaderConfig},
- GX_ProofreaderCorrection in '..\..\source\CodeProofreader\GX_ProofreaderCorrection.pas',
- GX_ProofreaderData in '..\..\source\CodeProofreader\GX_ProofreaderData.pas',
- GX_ProofreaderExpert in '..\..\source\CodeProofreader\GX_ProofreaderExpert.pas',
- GX_ProofreaderKeyboard in '..\..\source\CodeProofreader\GX_ProofreaderKeyboard.pas',
- GX_ProofreaderUtils in '..\..\source\CodeProofreader\GX_ProofreaderUtils.pas',
- GX_ReadMapFileThread in '..\..\Source\Utils\GX_ReadMapFileThread.pas',
- GX_RegExpr in '..\..\Source\Utils\GX_RegExpr.pas',
- GX_Replace in '..\..\source\Grep\GX_Replace.pas',
- GX_ReplaceComp in '..\..\source\ReplaceComponents\GX_ReplaceComp.pas' {fmReplaceComp},
- GX_ReplaceCompData in '..\..\source\ReplaceComponents\GX_ReplaceCompData.pas',
- GX_ReplaceCompLog in '..\..\source\ReplaceComponents\GX_ReplaceCompLog.pas' {fmReplaceCompLog},
- GX_ReplaceCompMapDets in '..\..\source\ReplaceComponents\GX_ReplaceCompMapDets.pas' {fmReplaceCompMapDets},
- GX_ReplaceCompMapGrpList in '..\..\source\ReplaceComponents\GX_ReplaceCompMapGrpList.pas' {fmReplaceCompMapGrpList},
- GX_ReplaceCompMapList in '..\..\source\ReplaceComponents\GX_ReplaceCompMapList.pas' {fmReplaceCompMapList},
- GX_ReplaceCompUtils in '..\..\source\ReplaceComponents\GX_ReplaceCompUtils.pas',
- GX_ReselectDesktop in '..\..\Source\ReselectDesktop\GX_ReselectDesktop.pas',
- GX_SelectComponents in '..\..\Source\Experts\GX_SelectComponents.pas' {SelectComponentsForm},
- GX_SetComponentProps in '..\..\source\SetComponentProperties\GX_SetComponentProps.pas',
- GX_SetComponentPropsConfig in '..\..\source\SetComponentProperties\GX_SetComponentPropsConfig.pas' {fmSetComponentPropsConfig},
- GX_SetComponentPropsStatus in '..\..\source\SetComponentProperties\GX_SetComponentPropsStatus.pas' {fmSetComponentPropsStatus},
- GX_SetFocusControl in '..\..\source\SetFocusControl\GX_SetFocusControl.pas',
- GX_SharedImages in '..\..\source\Framework\GX_SharedImages.pas' {dmSharedImages: TDataModule},
- GX_ShLwApi in '..\..\Source\Utils\GX_ShLwApi.pas',
- GX_SourceExport in '..\..\source\SourceExport\GX_SourceExport.pas' {fmSourceExport},
- GX_SourceExportOptions in '..\..\source\SourceExport\GX_SourceExportOptions.pas' {fmSourceExportOptions},
- GX_Splitter in '..\..\Source\Utils\GX_Splitter.pas',
- GX_SplitterPainter in '..\..\source\Utils\GX_SplitterPainter.pas',
- GX_StringGridDrawFix in '..\..\Source\Utils\GX_StringGridDrawFix.pas',
- GX_StringList in '..\..\Source\Utils\GX_StringList.pas',
- GX_SynMemoUtils in '..\..\source\Framework\GX_SynMemoUtils.pas',
- GX_TabOrder in '..\..\source\TabOrder\GX_TabOrder.pas' {fmTabOrder},
- GX_TabOrderOptions in '..\..\Source\TabOrder\GX_TabOrderOptions.pas' {fmTabOrderOptions},
- GX_TestRegEx in '..\..\Source\Grep\GX_TestRegEx.pas' {fmTestRegEx},
- GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
- GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
- GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
- GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
- GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
- GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
- GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
- GX_uAutoTodoHandler in '..\..\Source\AutoTodo\GX_uAutoTodoHandler.pas',
- GX_UnitExportList in '..\..\Source\UsesExpert\GX_UnitExportList.pas',
- GX_UnitExportsParser in '..\..\Source\Framework\GX_UnitExportsParser.pas',
- GX_UnitPositions in '..\..\source\Framework\GX_UnitPositions.pas',
- GX_UnspecifiedImage in '..\..\Source\Framework\GX_UnspecifiedImage.pas',
- GX_UsageStatistics in '..\..\Source\Framework\GX_UsageStatistics.pas' {fmUsageStatistics},
- GX_UsesExpert in '..\..\Source\UsesExpert\GX_UsesExpert.pas' {fmUsesManager},
- GX_UsesSortGroups in '..\..\Source\UsesExpert\GX_UsesSortGroups.pas',
- GX_UsesExpertOptions in '..\..\Source\UsesExpert\GX_UsesExpertOptions.pas' {fmUsesExpertOptions},
- GX_UsesManager in '..\..\source\Framework\GX_UsesManager.pas',
- GX_VCLFixPack in '..\..\Source\Utils\GX_VCLFixPack.pas',
- GX_VerDepConst in '..\..\source\Framework\GX_VerDepConst.pas',
- GX_XmlUtils in '..\..\source\Utils\GX_XmlUtils.pas',
- GX_Zipper in '..\..\source\BackupProject\GX_Zipper.pas';
-
-{$R '..\..\images\GXIcons.res' '..\..\images\GXIcons.rc'}
-{$R '..\..\Binaries\CodeProofreaderDefault.res' '..\..\Binaries\CodeProofreaderDefault.rc'}
-{$R '..\..\Binaries\ConvertStrings.res' '..\..\Binaries\ConvertStrings.rc'}
-{$R *_version.res} // if you get an error here, run the __build_project.cmd script first
-
-begin
-end.
-
+library GExpertsDelphi2005;
+
+{$E dll}
+
+{%File '_prebuild.cmd'}
+
+uses
+ GX_About in '..\..\source\Framework\GX_About.pas' {fmAbout},
+ GX_ActionBroker in '..\..\source\Framework\GX_ActionBroker.pas',
+ GX_Actions in '..\..\source\Framework\GX_Actions.pas',
+ GX_AddDockWindow in '..\..\Source\AddDockWindow\GX_AddDockWindow.pas' {fmGxDockForm},
+ GX_AsciiChart in '..\..\source\AsciiChart\GX_AsciiChart.pas' {fmAsciiChart},
+ GX_AutoTodoDone in '..\..\Source\AutoTodo\GX_AutoTodoDone.pas' {fmAutoTodoDone},
+ GX_Backup in '..\..\source\BackupProject\GX_Backup.pas' {fmBackup},
+ GX_BackupConfig in '..\..\source\BackupProject\GX_BackupConfig.pas' {fmBackupConfig},
+ GX_BackupNotFound in '..\..\Source\BackupProject\GX_BackupNotFound.pas' {fmBackupNotFound},
+ GX_BackupOptions in '..\..\source\BackupProject\GX_BackupOptions.pas' {fmBackupOptions},
+ GX_BaseExpert in '..\..\Source\Framework\GX_BaseExpert.pas',
+ GX_BaseForm in '..\..\source\Framework\GX_BaseForm.pas' {fmBaseForm},
+ GX_BookmarkList in '..\..\source\Utils\GX_BookmarkList.pas',
+ GX_Bookmarks in '..\..\source\Bookmarks\GX_Bookmarks.pas' {fmGxBookmarksForm},
+ GX_BookmarksConst in '..\..\source\Bookmarks\GX_BookmarksConst.pas',
+ GX_BookmarksEdit in '..\..\source\Bookmarks\GX_BookmarksEdit.pas' {foBookmarksEdit},
+ GX_BookmarksFuncProcName in '..\..\Source\Bookmarks\GX_BookmarksFuncProcName.pas',
+ GX_BookmarksLists in '..\..\Source\Bookmarks\GX_BookmarksLists.pas',
+ GX_BookmarksOptions in '..\..\source\Bookmarks\GX_BookmarksOptions.pas' {foBookmarksOptions},
+ GX_BookmarksSelect in '..\..\source\Bookmarks\GX_BookmarksSelect.pas' {foBookmarksSelect},
+ GX_CheckButton in '..\..\source\Utils\GX_CheckButton.pas',
+ GX_CheckListBoxWithHints in '..\..\Source\ProjectOptionSets\GX_CheckListBoxWithHints.pas',
+ GX_ClassBrowser in '..\..\source\ClassBrowser\GX_ClassBrowser.pas' {fmClassBrowser},
+ GX_ClassHacks in '..\..\source\Framework\GX_ClassHacks.pas',
+ GX_ClassIdentify in '..\..\source\ClassBrowser\GX_ClassIdentify.pas' {fmClassIdentify},
+ GX_ClassMgr in '..\..\source\Framework\GX_ClassMgr.pas',
+ GX_ClassOptions in '..\..\source\ClassBrowser\GX_ClassOptions.pas' {fmClassOptions},
+ GX_ClassParsing in '..\..\source\ClassBrowser\GX_ClassParsing.pas' {fmClassParsing},
+ GX_ClassProp in '..\..\source\ClassBrowser\GX_ClassProp.pas' {fmClassProp},
+ GX_CleanDirectories in '..\..\source\CleanDirectories\GX_CleanDirectories.pas' {fmCleanDirectories},
+ GX_CleanDirectoriesOptions in '..\..\Source\CleanDirectories\GX_CleanDirectoriesOptions.pas' {fmCleanDirectoriesOptions},
+ GX_ClipboardHistory in '..\..\source\ClipboardHistory\GX_ClipboardHistory.pas' {fmClipboardHistory},
+ GX_ClipboardOptions in '..\..\source\ClipboardHistory\GX_ClipboardOptions.pas' {fmClipboardOptions},
+ GX_CodeFormatterBookmarks in '..\..\source\Formatter\GX_CodeFormatterBookmarks.pas',
+ GX_CodeFormatterBreakpoints in '..\..\source\Formatter\GX_CodeFormatterBreakpoints.pas',
+ GX_CodeFormatterConfig in '..\..\source\Formatter\GX_CodeFormatterConfig.pas' {fmCodeFormatterConfig},
+ GX_CodeFormatterConfigHandler in '..\..\source\Formatter\GX_CodeFormatterConfigHandler.pas',
+ GX_CodeFormatterDefaultSettings in '..\..\source\Formatter\GX_CodeFormatterDefaultSettings.pas',
+ GX_CodeFormatterEditCapitalization in '..\..\source\Formatter\GX_CodeFormatterEditCapitalization.pas' {fmCodeFormatterEditCapitalization},
+ GX_CodeFormatterEngine in '..\..\source\Formatter\engine\GX_CodeFormatterEngine.pas',
+ GX_CodeFormatterExpert in '..\..\source\Formatter\GX_CodeFormatterExpert.pas',
+ GX_CodeFormatterFormatter in '..\..\source\Formatter\engine\GX_CodeFormatterFormatter.pas',
+ GX_CodeFormatterGXConfigWrapper in '..\..\source\Formatter\GX_CodeFormatterGXConfigWrapper.pas',
+ GX_CodeFormatterParser in '..\..\source\Formatter\engine\GX_CodeFormatterParser.pas',
+ GX_CodeFormatterSettings in '..\..\source\Formatter\engine\GX_CodeFormatterSettings.pas',
+ GX_CodeFormatterSourceLineList in '..\..\Source\Formatter\GX_CodeFormatterSourceLineList.pas',
+ GX_CodeFormatterStack in '..\..\source\Formatter\engine\GX_CodeFormatterStack.pas',
+ GX_CodeFormatterTokenList in '..\..\source\Formatter\engine\GX_CodeFormatterTokenList.pas',
+ GX_CodeFormatterTokens in '..\..\source\Formatter\engine\GX_CodeFormatterTokens.pas',
+ GX_CodeFormatterTypes in '..\..\source\Formatter\engine\GX_CodeFormatterTypes.pas',
+ GX_CodeFormatterUnicode in '..\..\source\Formatter\engine\GX_CodeFormatterUnicode.pas',
+ GX_CodeLib in '..\..\source\CodeLibrarian\GX_CodeLib.pas' {fmCodeLib},
+ GX_CodeLibFile in '..\..\Source\CodeLibrarian\GX_CodeLibFile.pas',
+ GX_CodeOpt in '..\..\source\CodeLibrarian\GX_CodeOpt.pas' {fmCodeOptions},
+ GX_CodeSrch in '..\..\source\CodeLibrarian\GX_CodeSrch.pas' {fmCodeSearch},
+ GX_ComponentGrid in '..\..\source\ComponentGrid\GX_ComponentGrid.pas' {fmComponentGrid},
+ GX_CompRename in '..\..\source\RenameComponents\GX_CompRename.pas' {fmCompRename},
+ GX_CompRenameAdvanced in '..\..\source\RenameComponents\GX_CompRenameAdvanced.pas' {fmCompRenameAdvanced},
+ GX_CompRenameConfig in '..\..\source\RenameComponents\GX_CompRenameConfig.pas' {fmCompRenameConfig},
+ GX_CompsToCode in '..\..\source\ComponentsToCode\GX_CompsToCode.pas' {fmCompsToCode},
+ GX_ConfigurationInfo in '..\..\source\Framework\GX_ConfigurationInfo.pas',
+ GX_Configure in '..\..\source\Framework\GX_Configure.pas' {fmConfiguration},
+ GX_ConfigureExperts in '..\..\Source\Framework\GX_ConfigureExperts.pas' {frConfigureExperts: TFrame},
+ GX_Consts in '..\..\source\Framework\GX_Consts.pas',
+ GX_CopyComponentNames in '..\..\source\CopyComponentNames\GX_CopyComponentNames.pas',
+ GX_CustomClipboard in '..\..\Source\Framework\GX_CustomClipboard.pas',
+ GX_DbugIntf in '..\..\source\Utils\GX_DbugIntf.pas',
+ GX_Debug in '..\..\Source\Utils\GX_Debug.pas',
+ GX_DesignerMenu in '..\..\source\Framework\GX_DesignerMenu.pas',
+ GX_DrawFixes in '..\..\Source\Utils\GX_DrawFixes.pas',
+ GX_DummyWizard in '..\..\Source\Framework\GX_DummyWizard.pas',
+ GX_DuplicateDllHandler in '..\..\Source\Framework\GX_DuplicateDllHandler.pas',
+ GX_eAddToCaptitalization in '..\..\Source\Formatter\GX_eAddToCaptitalization.pas',
+ GX_eAlign in '..\..\source\Editor\GX_eAlign.pas' {fmAlign},
+ GX_eAlignOptions in '..\..\source\Editor\GX_eAlignOptions.pas' {fmAlignOptions},
+ GX_eChangeCase in '..\..\source\Editor\GX_eChangeCase.pas',
+ GX_eCodeFormatter in '..\..\source\Formatter\GX_eCodeFormatter.pas',
+ GX_eComment in '..\..\source\Editor\GX_eComment.pas' {fmCommentConfig},
+ GX_eConvertStrings in '..\..\Source\Editor\GX_eConvertStrings.pas' {fmEConvertStrings},
+ GX_eDate in '..\..\source\Editor\GX_eDate.pas' {fmDateFormat},
+ GX_eDeclareVariable in '..\..\source\DeclareVariable\GX_eDeclareVariable.pas' {fmDeclareVariable},
+ GX_DeclareVariable in '..\..\source\DeclareVariable\GX_DeclareVariable.pas',
+ GX_EditorChangeServices in '..\..\source\Framework\GX_EditorChangeServices.pas',
+ GX_EditorEnhancements in '..\..\source\experts\editorenhancements\GX_EditorEnhancements.pas',
+ GX_EditorEnhancementsConfig in '..\..\Source\Experts\EditorEnhancements\GX_EditorEnhancementsConfig.pas' {fmEditorEnhancementsConfig},
+ GX_EditorExpert in '..\..\source\Editor\GX_EditorExpert.pas',
+ GX_EditorExpertManager in '..\..\source\Editor\GX_EditorExpertManager.pas',
+ GX_EditorFormServices in '..\..\source\Framework\GX_EditorFormServices.pas',
+ GX_EditPath in '..\..\Source\EditPath\GX_EditPath.pas' {f_EditPath},
+ GX_EditPathConfig in '..\..\Source\EditPath\GX_EditPathConfig.pas' {f_EditPathConfig},
+ GX_EditReader in '..\..\source\Framework\GX_EditReader.pas',
+ GX_eFindDelimiter in '..\..\source\Editor\GX_eFindDelimiter.pas',
+ GX_eGotoModification in '..\..\Source\Editor\GX_eGotoModification.pas',
+ GX_eIfDef in '..\..\Source\Editor\GX_eIfDef.pas' {fmConfigureIfDef},
+ GX_ePasteAs in '..\..\source\Editor\GX_ePasteAs.pas' {fmPasteAsConfig},
+ GX_ePopupMenu in '..\..\Source\Editor\GX_ePopupMenu.pas' {fmEditorPopupMenuExpertConfig},
+ GX_ePrevNextIdentifier in '..\..\source\Editor\GX_ePrevNextIdentifier.pas',
+ GX_eRenameIdentifier in '..\..\source\Editor\GX_eRenameIdentifier.pas' {fmRenameIdentifier},
+ GX_PascalTokenAnalyzer in '..\..\source\Utils\GX_PascalTokenAnalyzer.pas',
+ GX_RenameIdentifier in '..\..\source\Editor\GX_RenameIdentifier.pas',
+ GX_eRemoveMatchingLines in '..\..\Source\Editor\GX_eRemoveMatchingLines.pas' {fmRemoveMatchingLinesExpertConfig},
+ GX_eReverseStatement in '..\..\source\ReverseStatement\GX_eReverseStatement.pas',
+ GX_ReverseStatementUtils in '..\..\source\ReverseStatement\GX_ReverseStatementUtils.pas',
+ GX_eReverseOptions in '..\..\source\ReverseStatement\GX_eReverseOptions.pas' {fmReverseOptions},
+ GX_eReverseRuleEdit in '..\..\source\ReverseStatement\GX_eReverseRuleEdit.pas' {fmReverseRuleEdit},
+ GX_eSelectIdentifier in '..\..\source\Editor\GX_eSelectIdentifier.pas',
+ GX_eSelectionEditorExpert in '..\..\source\Editor\GX_eSelectionEditorExpert.pas',
+ GX_eDuplicateLine in '..\..\Source\DuplicateLine\GX_eDuplicateLine.pas',
+ GX_eSort in '..\..\Source\Editor\GX_eSort.pas' {fmeSortConfig},
+ GX_eSortOptions in '..\..\Source\Editor\GX_eSortOptions.pas' {frmSortOptions},
+ GX_EventHook in '..\..\source\framework\GX_EventHook.pas',
+ GX_eWarn in '..\..\Source\Editor\GX_eWarn.pas' {fmConfigureWarning},
+ GX_ExpertManager in '..\..\source\ExpertManager\GX_ExpertManager.pas' {fmExpertManager},
+ GX_Experts in '..\..\source\Framework\GX_Experts.pas',
+ GX_ExplicitFilterExpert in '..\..\Source\ExplicitFilter\GX_ExplicitFilterExpert.pas' {fmGxExplicitFilter},
+ GX_FavFileProp in '..\..\source\FavoriteFiles\GX_FavFileProp.pas' {fmFavFileProp},
+ GX_FavFiles in '..\..\source\FavoriteFiles\GX_FavFiles.pas' {fmFavFiles},
+ GX_FavFolderProp in '..\..\source\FavoriteFiles\GX_FavFolderProp.pas' {fmFavFolderProperties},
+ GX_FavNewFolder in '..\..\source\FavoriteFiles\GX_FavNewFolder.pas' {fmFavNewFolder},
+ GX_FavOptions in '..\..\source\FavoriteFiles\GX_FavOptions.pas' {fmFavOptions},
+ GX_FavUtil in '..\..\source\FavoriteFiles\GX_FavUtil.pas',
+ GX_FavWuppdiWPImport in '..\..\Source\FavoriteFiles\GX_FavWuppdiWPImport.pas' {fmFavWuppdiWPImport},
+ GX_FeedbackWizard in '..\..\source\Framework\GX_FeedbackWizard.pas' {fmFeedbackWizard},
+ GX_FileScanner in '..\..\source\Framework\GX_FileScanner.pas',
+ GX_FilterExceptions in '..\..\Source\FilterExceptions\GX_FilterExceptions.pas' {fmGxFilterExceptionsExpert},
+ GX_FilterExceptionsEdit in '..\..\Source\FilterExceptions\GX_FilterExceptionsEdit.pas' {fmGxFilterExceptionsEdit},
+ GX_FilterExceptionsNotification in '..\..\Source\FilterExceptions\GX_FilterExceptionsNotification.pas' {fmExceptionNotification},
+ GX_FindComponentRef in '..\..\source\FindComponentReference\GX_FindComponentRef.pas',
+ GX_FocusCodeEditor in '..\..\Source\FocusCodeEditor\GX_FocusCodeEditor.pas',
+ GX_FormHotkeys in '..\..\Source\FormHotkeys\GX_FormHotkeys.pas' {f_FormHotkeys},
+ GX_FormHotkeysSelect in '..\..\Source\FormHotkeys\GX_FormHotkeysSelect.pas' {fmFormHotkeysSelect},
+ GX_GenericClasses in '..\..\source\Utils\GX_GenericClasses.pas',
+ GX_GenericUtils in '..\..\source\Utils\GX_GenericUtils.pas',
+ GX_GetIdeVersion in '..\..\source\Framework\GX_GetIdeVersion.pas',
+ GX_GExperts in '..\..\source\Framework\GX_GExperts.pas',
+ GX_Goto in '..\..\Source\Goto\GX_Goto.pas' {f_Goto},
+ GX_GotoConfig in '..\..\Source\Goto\GX_GotoConfig.pas' {f_GotoConfig},
+ GX_GrepBackend in '..\..\source\Grep\GX_GrepBackend.pas',
+ GX_GrepExpert in '..\..\source\Grep\GX_GrepExpert.pas',
+ GX_GrepInstantGrep in '..\..\Source\Grep\GX_GrepInstantGrep.pas' {fmGxInstantGrepForm},
+ GX_GrepMenuConfig in '..\..\Source\Grep\GX_GrepMenuConfig.pas' {f_GrepMenuConfig},
+ GX_GrepMenuEntry in '..\..\Source\Grep\GX_GrepMenuEntry.pas',
+ GX_GrepOptions in '..\..\source\Grep\GX_GrepOptions.pas' {fmGrepOptions},
+ GX_GrepNextItemExpert in '..\..\Source\Grep\GX_GrepNextItemExpert.pas',
+ GX_GrepPrevItemExpert in '..\..\Source\Grep\GX_GrepPrevItemExpert.pas',
+ GX_GrepPrinting in '..\..\source\Grep\GX_GrepPrinting.pas',
+ GX_GrepProgress in '..\..\Source\Grep\GX_GrepProgress.pas' {fmGrepProgress},
+ GX_GrepRegExSearch in '..\..\source\Grep\GX_GrepRegExSearch.pas',
+ GX_GrepReplace in '..\..\source\Grep\GX_GrepReplace.pas' {fmGrepReplace},
+ GX_GrepResults in '..\..\source\Grep\GX_GrepResults.pas' {fmGrepResults},
+ GX_GrepResultsOptions in '..\..\source\Grep\GX_GrepResultsOptions.pas' {fmGrepResultsOptions},
+ GX_GrepSearch in '..\..\source\Grep\GX_GrepSearch.pas' {fmGrepSearch},
+ GX_GrepSearchExpert in '..\..\Source\Grep\GX_GrepSearchExpert.pas',
+ GX_GrepSelect in '..\..\Source\Grep\GX_GrepSelect.pas' {fmGrepSelect},
+ GX_GxUtils in '..\..\source\Utils\GX_GxUtils.pas',
+ GX_HideNavbar in '..\..\source\Experts\EditorEnhancements\GX_HideNavbar.pas',
+ GX_HideNonVisualComps in '..\..\source\HideNonvisualComponents\GX_HideNonVisualComps.pas',
+ GX_HintWindow in '..\..\Source\Framework\GX_HintWindow.pas',
+ GX_IconMessageBox in '..\..\source\Framework\GX_IconMessageBox.pas',
+ GX_IdeApplicationSettingsEnhancer in '..\..\Source\IDE\GX_IdeApplicationSettingsEnhancer.pas',
+ GX_IdeBuildEventFavoriteEdit in '..\..\Source\IDE\GX_IdeBuildEventFavoriteEdit.pas' {f_IdeBuildEventFavoriteEdit},
+ GX_IdeBuildEventsEnhancer in '..\..\Source\IDE\GX_IdeBuildEventsEnhancer.pas',
+ GX_IdeDetectForms in '..\..\Source\ide\GX_IdeDetectForms.pas',
+ GX_IdeDialogEnhancer in '..\..\Source\IDE\GX_IdeDialogEnhancer.pas',
+ GX_IdeDock in '..\..\source\IDEDocking\GX_IdeDock.pas' {fmIdeDockForm},
+ GX_IdeDockFormEnhancer in '..\..\Source\IDE\GX_IdeDockFormEnhancer.pas',
+ GX_IdeEnhance in '..\..\source\IDE\GX_IdeEnhance.pas',
+ GX_IdeEvaluateModifyEnhancer in '..\..\Source\IDE\GX_IdeEvaluateModifyEnhancer.pas',
+ GX_IdeFavoritesList in '..\..\Source\IDE\GX_IdeFavoritesList.pas' {f_GxIdeFavoritesList},
+ GX_IdeFormChangeManager in '..\..\Source\IDE\GX_IdeFormChangeManager.pas',
+ GX_IdeFormEnhancer in '..\..\source\IDE\GX_IdeFormEnhancer.pas',
+ GX_IdeInstallPackagesEnhancer in '..\..\source\IDE\GX_IdeInstallPackagesEnhancer.pas',
+ GX_IdeManagedForm in '..\..\Source\IDE\GX_IdeManagedForm.pas',
+ GX_IdeManagedFormHandler in '..\..\Source\IDE\GX_IdeManagedFormHandler.pas',
+ GX_IdeMessageAutoClose in '..\..\Source\IDE\GX_IdeMessageAutoClose.pas',
+ GX_IdeObjectInspectorEnhancer in '..\..\Source\IDE\GX_IdeObjectInspectorEnhancer.pas',
+ GX_IdePackageRenameDlg in '..\..\source\IDE\GX_IdePackageRenameDlg.pas' {fmIdxPackageRenameDlg},
+ GX_IdeProjectOptionsEnhancer in '..\..\source\IDE\GX_IdeProjectOptionsEnhancer.pas',
+ GX_IdeSearchPathEnhancer in '..\..\source\IDE\GX_IdeSearchPathEnhancer.pas',
+ GX_IdeSearchPathFavoriteEdit in '..\..\Source\IDE\GX_IdeSearchPathFavoriteEdit.pas' {f_IdeSearchPathFavoriteEdit},
+ GX_IdeShortCuts in '..\..\source\IdeShortCuts\GX_IdeShortCuts.pas' {fmIdeShortCuts},
+ GX_IdeToolbar in '..\..\Source\IdeToolbar\GX_IdeToolbar.pas',
+ GX_IdeToolbarExpert in '..\..\Source\IdeToolbar\GX_IdeToolbarExpert.pas',
+ GX_IdeToolPropertiesEnhancer in '..\..\source\IDE\GX_IdeToolPropertiesEnhancer.pas',
+ GX_IdeSplitterVisibility in '..\..\Source\IDE\GX_IdeSplitterVisibility.pas',
+ GX_IdeUtils in '..\..\source\Utils\GX_IdeUtils.pas',
+ GX_IndexTypes in '..\..\source\Utils\GX_IndexTypes.pas',
+ GX_InspectionServer in '..\..\Source\Framework\GX_InspectionServer.pas',
+ GX_InsertAutoTodo in '..\..\Source\AutoTodo\GX_InsertAutoTodo.pas' {fmInsertAutoTodoForm},
+ GX_KbdShortCutBroker in '..\..\source\Framework\GX_KbdShortCutBroker.pas',
+ GX_KeyboardShortcuts in '..\..\Source\KeyboardShortcuts\GX_KeyboardShortcuts.pas' {fmGxKeyboardShortcuts},
+ GX_KibitzComp in '..\..\source\Framework\GX_KibitzComp.pas',
+ GX_LibrarySource in '..\..\source\Framework\GX_LibrarySource.pas',
+ GX_Logging in '..\..\Source\Framework\GX_Logging.pas',
+ GX_MacroExpandNotifier in '..\..\source\MacroTemplates\GX_MacroExpandNotifier.pas',
+ GX_MacroFile in '..\..\source\MacroTemplates\GX_MacroFile.pas',
+ GX_MacroLibrary in '..\..\source\MacroLibrary\GX_MacroLibrary.pas' {fmMacroLibrary},
+ GX_MacroLibraryConfig in '..\..\source\MacroLibrary\GX_MacroLibraryConfig.pas' {fmGxMacroLibraryConfig},
+ GX_MacroLibraryEditEntry in '..\..\Source\MacroLibrary\GX_MacroLibraryEditEntry.pas' {fmEditMacroItem},
+ GX_MacroLibraryNamePrompt in '..\..\source\MacroLibrary\GX_MacroLibraryNamePrompt.pas' {fmMacroLibraryNamePrompt},
+ GX_MacroParser in '..\..\source\Framework\GX_MacroParser.pas',
+ GX_MacroSelect in '..\..\source\MacroTemplates\GX_MacroSelect.pas' {fmMacroSelect},
+ GX_MacroTemplateEdit in '..\..\source\MacroTemplates\GX_MacroTemplateEdit.pas' {fmMacroTemplateEdit},
+ GX_MacroTemplates in '..\..\source\MacroTemplates\GX_MacroTemplates.pas' {fmMacroTemplates},
+ GX_MacroTemplatesExpert in '..\..\source\MacroTemplates\GX_MacroTemplatesExpert.pas',
+ GX_MemoEscFix in '..\..\Source\Utils\GX_MemoEscFix.pas',
+ GX_MenuActions in '..\..\source\Framework\GX_MenuActions.pas',
+ GX_MenusForEditorExpert in '..\..\source\Editor\GX_MenusForEditorExpert.pas',
+ GX_MessageBox in '..\..\source\Framework\GX_MessageBox.pas' {fmGxMessageBox},
+ GX_MessageDialog in '..\..\source\MessageDialog\GX_MessageDialog.pas' {fmMessageDialog},
+ GX_MessageOptions in '..\..\source\MessageDialog\GX_MessageOptions.pas' {fmMessageOptions},
+ GX_MultilineHost in '..\..\source\IDE\GX_MultilineHost.pas',
+ GX_MultiLinePalette in '..\..\source\IDE\GX_MultiLinePalette.pas',
+ GX_NTAEditServiceNotifier in '..\..\source\Utils\GX_NTAEditServiceNotifier.pas',
+ GX_OpenFile in '..\..\source\OpenFile\GX_OpenFile.pas' {fmOpenFile},
+ GX_OpenFileList in '..\..\source\OpenFile\GX_OpenFileList.pas' {frOpenFileList: TFrame},
+ GX_OpenFileConfig in '..\..\source\OpenFile\GX_OpenFileConfig.pas' {fmOpenFileConfig},
+ GX_OtaUtils in '..\..\source\Utils\GX_OtaUtils.pas',
+ GX_PasteAs in '..\..\source\Framework\GX_PasteAs.pas',
+ GX_PeInformation in '..\..\source\PeInfo\GX_PeInformation.pas',
+ GX_PerfectLayout in '..\..\Source\Legacy\GX_PerfectLayout.pas' {fmPerfectLayout},
+ GX_ProcedureList in '..\..\source\ProcedureList\GX_ProcedureList.pas' {fmProcedureList},
+ GX_ProcedureListOptions in '..\..\source\ProcedureList\GX_ProcedureListOptions.pas' {fmProcedureListOptions},
+ GX_Progress in '..\..\source\Framework\GX_Progress.pas' {fmProgress},
+ GX_ProjDepend in '..\..\source\ProjectDependencies\GX_ProjDepend.pas' {fmProjDepend},
+ GX_ProjDependFilter in '..\..\source\ProjectDependencies\GX_ProjDependFilter.pas' {fmProjDependFilter},
+ GX_ProjDependOptions in '..\..\Source\ProjectDependencies\GX_ProjDependOptions.pas' {fmProjDependOptions},
+ GX_ProjDependProp in '..\..\source\ProjectDependencies\GX_ProjDependProp.pas' {fmProjDependProp},
+ GX_ProjOptionSets in '..\..\source\ProjectOptionSets\GX_ProjOptionSets.pas' {fmProjOptionSets},
+ GX_ProjOptMap in '..\..\source\ProjectOptionSets\GX_ProjOptMap.pas',
+ GX_ProofreaderAutoCorrectEntry in '..\..\source\CodeProofreader\GX_ProofreaderAutoCorrectEntry.pas' {fmProofreaderAutoCorrectEntry},
+ GX_ProofreaderConfig in '..\..\source\CodeProofreader\GX_ProofreaderConfig.pas' {fmProofreaderConfig},
+ GX_ProofreaderCorrection in '..\..\source\CodeProofreader\GX_ProofreaderCorrection.pas',
+ GX_ProofreaderData in '..\..\source\CodeProofreader\GX_ProofreaderData.pas',
+ GX_ProofreaderExpert in '..\..\source\CodeProofreader\GX_ProofreaderExpert.pas',
+ GX_ProofreaderKeyboard in '..\..\source\CodeProofreader\GX_ProofreaderKeyboard.pas',
+ GX_ProofreaderUtils in '..\..\source\CodeProofreader\GX_ProofreaderUtils.pas',
+ GX_ReadMapFileThread in '..\..\Source\Utils\GX_ReadMapFileThread.pas',
+ GX_RegExpr in '..\..\Source\Utils\GX_RegExpr.pas',
+ GX_Replace in '..\..\source\Grep\GX_Replace.pas',
+ GX_ReplaceComp in '..\..\source\ReplaceComponents\GX_ReplaceComp.pas' {fmReplaceComp},
+ GX_ReplaceCompData in '..\..\source\ReplaceComponents\GX_ReplaceCompData.pas',
+ GX_ReplaceCompLog in '..\..\source\ReplaceComponents\GX_ReplaceCompLog.pas' {fmReplaceCompLog},
+ GX_ReplaceCompMapDets in '..\..\source\ReplaceComponents\GX_ReplaceCompMapDets.pas' {fmReplaceCompMapDets},
+ GX_ReplaceCompMapGrpList in '..\..\source\ReplaceComponents\GX_ReplaceCompMapGrpList.pas' {fmReplaceCompMapGrpList},
+ GX_ReplaceCompMapList in '..\..\source\ReplaceComponents\GX_ReplaceCompMapList.pas' {fmReplaceCompMapList},
+ GX_ReplaceCompUtils in '..\..\source\ReplaceComponents\GX_ReplaceCompUtils.pas',
+ GX_ReselectDesktop in '..\..\Source\ReselectDesktop\GX_ReselectDesktop.pas',
+ GX_SelectComponents in '..\..\Source\Experts\GX_SelectComponents.pas' {SelectComponentsForm},
+ GX_SetComponentProps in '..\..\source\SetComponentProperties\GX_SetComponentProps.pas',
+ GX_SetComponentPropsConfig in '..\..\source\SetComponentProperties\GX_SetComponentPropsConfig.pas' {fmSetComponentPropsConfig},
+ GX_SetComponentPropsStatus in '..\..\source\SetComponentProperties\GX_SetComponentPropsStatus.pas' {fmSetComponentPropsStatus},
+ GX_SetFocusControl in '..\..\source\SetFocusControl\GX_SetFocusControl.pas',
+ GX_SharedImages in '..\..\source\Framework\GX_SharedImages.pas' {dmSharedImages: TDataModule},
+ GX_ShLwApi in '..\..\Source\Utils\GX_ShLwApi.pas',
+ GX_SourceExport in '..\..\source\SourceExport\GX_SourceExport.pas' {fmSourceExport},
+ GX_SourceExportOptions in '..\..\source\SourceExport\GX_SourceExportOptions.pas' {fmSourceExportOptions},
+ GX_Splitter in '..\..\Source\Utils\GX_Splitter.pas',
+ GX_SplitterPainter in '..\..\source\Utils\GX_SplitterPainter.pas',
+ GX_StringGridDrawFix in '..\..\Source\Utils\GX_StringGridDrawFix.pas',
+ GX_StringList in '..\..\Source\Utils\GX_StringList.pas',
+ GX_SynMemoUtils in '..\..\source\Framework\GX_SynMemoUtils.pas',
+ GX_TabOrder in '..\..\source\TabOrder\GX_TabOrder.pas' {fmTabOrder},
+ GX_TabOrderOptions in '..\..\Source\TabOrder\GX_TabOrderOptions.pas' {fmTabOrderOptions},
+ GX_TestRegEx in '..\..\Source\Grep\GX_TestRegEx.pas' {fmTestRegEx},
+ GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
+ GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
+ GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
+ GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
+ GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
+ GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
+ GX_uAutoTodoHandler in '..\..\Source\AutoTodo\GX_uAutoTodoHandler.pas',
+ GX_UnitExportList in '..\..\Source\UsesExpert\GX_UnitExportList.pas',
+ GX_UnitExportsParser in '..\..\Source\Framework\GX_UnitExportsParser.pas',
+ GX_UnitPositions in '..\..\source\Framework\GX_UnitPositions.pas',
+ GX_UnspecifiedImage in '..\..\Source\Framework\GX_UnspecifiedImage.pas',
+ GX_UsageStatistics in '..\..\Source\Framework\GX_UsageStatistics.pas' {fmUsageStatistics},
+ GX_UsesExpert in '..\..\Source\UsesExpert\GX_UsesExpert.pas' {fmUsesManager},
+ GX_UsesSortGroups in '..\..\Source\UsesExpert\GX_UsesSortGroups.pas',
+ GX_UsesExpertOptions in '..\..\Source\UsesExpert\GX_UsesExpertOptions.pas' {fmUsesExpertOptions},
+ GX_UsesManager in '..\..\source\Framework\GX_UsesManager.pas',
+ GX_VCLFixPack in '..\..\Source\Utils\GX_VCLFixPack.pas',
+ GX_VerDepConst in '..\..\source\Framework\GX_VerDepConst.pas',
+ GX_XmlUtils in '..\..\source\Utils\GX_XmlUtils.pas',
+ GX_Zipper in '..\..\source\BackupProject\GX_Zipper.pas';
+
+{$R '..\..\images\GXIcons.res' '..\..\images\GXIcons.rc'}
+{$R '..\..\Binaries\CodeProofreaderDefault.res' '..\..\Binaries\CodeProofreaderDefault.rc'}
+{$R '..\..\Binaries\ConvertStrings.res' '..\..\Binaries\ConvertStrings.rc'}
+{$R *_version.res} // if you get an error here, run the __build_project.cmd script first
+
+begin
+end.
+
Modified: trunk/Projects/Delphi2006/GExpertsBDS2006.dpr
===================================================================
--- trunk/Projects/Delphi2006/GExpertsBDS2006.dpr 2026-03-24 17:14:29 UTC (rev 5328)
+++ trunk/Projects/Delphi2006/GExpertsBDS2006.dpr 2026-03-24 17:28:33 UTC (rev 5329)
@@ -1,302 +1,302 @@
-library GExpertsBDS2006;
-
-{$E dll}
-
-{%File '_prebuild.cmd'}
-
-uses
- GX_About in '..\..\source\Framework\GX_About.pas' {fmAbout},
- GX_ActionBroker in '..\..\source\Framework\GX_ActionBroker.pas',
- GX_Actions in '..\..\source\Framework\GX_Actions.pas',
- GX_AddDockWindow in '..\..\Source\AddDockWindow\GX_AddDockWindow.pas' {fmGxDockForm},
- GX_AsciiChart in '..\..\source\AsciiChart\GX_AsciiChart.pas' {fmAsciiChart},
- GX_AutoTodoDone in '..\..\Source\AutoTodo\GX_AutoTodoDone.pas' {fmAutoTodoDone},
- GX_Backup in '..\..\source\BackupProject\GX_Backup.pas' {fmBackup},
- GX_BackupConfig in '..\..\source\BackupProject\GX_BackupConfig.pas' {fmBackupConfig},
- GX_BackupNotFound in '..\..\Source\BackupProject\GX_BackupNotFound.pas' {fmBackupNotFound},
- GX_BackupOptions in '..\..\source\BackupProject\GX_BackupOptions.pas' {fmBackupOptions},
- GX_BaseExpert in '..\..\Source\Framework\GX_BaseExpert.pas',
- GX_BaseForm in '..\..\source\Framework\GX_BaseForm.pas' {fmBaseForm},
- GX_BookmarkList in '..\..\source\Utils\GX_BookmarkList.pas',
- GX_Bookmarks in '..\..\source\Bookmarks\GX_Bookmarks.pas' {fmGxBookmarksForm},
- GX_BookmarksConst in '..\..\source\Bookmarks\GX_BookmarksConst.pas',
- GX_BookmarksEdit in '..\..\source\Bookmarks\GX_BookmarksEdit.pas' {foBookmarksEdit},
- GX_BookmarksFuncProcName in '..\..\Source\Bookmarks\GX_BookmarksFuncProcName.pas',
- GX_BookmarksLists in '..\..\Source\Bookmarks\GX_BookmarksLists.pas',
- GX_BookmarksOptions in '..\..\source\Bookmarks\GX_BookmarksOptions.pas' {foBookmarksOptions},
- GX_BookmarksSelect in '..\..\source\Bookmarks\GX_BookmarksSelect.pas' {foBookmarksSelect},
- GX_CheckButton in '..\..\source\Utils\GX_CheckButton.pas',
- GX_CheckListBoxWithHints in '..\..\Source\ProjectOptionSets\GX_CheckListBoxWithHints.pas',
- GX_ClassBrowser in '..\..\source\ClassBrowser\GX_ClassBrowser.pas' {fmClassBrowser},
- GX_ClassHacks in '..\..\source\Framework\GX_ClassHacks.pas',
- GX_ClassIdentify in '..\..\source\ClassBrowser\GX_ClassIdentify.pas' {fmClassIdentify},
- GX_ClassMgr in '..\..\source\Framework\GX_ClassMgr.pas',
- GX_ClassOptions in '..\..\source\ClassBrowser\GX_ClassOptions.pas' {fmClassOptions},
- GX_ClassParsing in '..\..\source\ClassBrowser\GX_ClassParsing.pas' {fmClassParsing},
- GX_ClassProp in '..\..\source\ClassBrowser\GX_ClassProp.pas' {fmClassProp},
- GX_CleanDirectories in '..\..\source\CleanDirectories\GX_CleanDirectories.pas' {fmCleanDirectories},
- GX_CleanDirectoriesOptions in '..\..\Source\CleanDirectories\GX_CleanDirectoriesOptions.pas' {fmCleanDirectoriesOptions},
- GX_ClipboardHistory in '..\..\source\ClipboardHistory\GX_ClipboardHistory.pas' {fmClipboardHistory},
- GX_ClipboardOptions in '..\..\source\ClipboardHistory\GX_ClipboardOptions.pas' {fmClipboardOptions},
- GX_CodeFormatterBookmarks in '..\..\source\Formatter\GX_CodeFormatterBookmarks.pas',
- GX_CodeFormatterBreakpoints in '..\..\source\Formatter\GX_CodeFormatterBreakpoints.pas',
- GX_CodeFormatterConfig in '..\..\source\Formatter\GX_CodeFormatterConfig.pas' {fmCodeFormatterConfig},
- GX_CodeFormatterConfigHandler in '..\..\source\Formatter\GX_CodeFormatterConfigHandler.pas',
- GX_CodeFormatterDefaultSettings in '..\..\source\Formatter\GX_CodeFormatterDefaultSettings.pas',
- GX_CodeFormatterEditCapitalization in '..\..\source\Formatter\GX_CodeFormatterEditCapitalization.pas' {fmCodeFormatterEditCapitalization},
- GX_CodeFormatterEngine in '..\..\source\Formatter\engine\GX_CodeFormatterEngine.pas',
- GX_CodeFormatterExpert in '..\..\source\Formatter\GX_CodeFormatterExpert.pas',
- GX_CodeFormatterFormatter in '..\..\source\Formatter\engine\GX_CodeFormatterFormatter.pas',
- GX_CodeFormatterGXConfigWrapper in '..\..\source\Formatter\GX_CodeFormatterGXConfigWrapper.pas',
- GX_CodeFormatterParser in '..\..\source\Formatter\engine\GX_CodeFormatterParser.pas',
- GX_CodeFormatterSettings in '..\..\source\Formatter\engine\GX_CodeFormatterSettings.pas',
- GX_CodeFormatterSourceLineList in '..\..\Source\Formatter\GX_CodeFormatterSourceLineList.pas',
- GX_CodeFormatterStack in '..\..\source\Formatter\engine\GX_CodeFormatterStack.pas',
- GX_CodeFormatterTokenList in '..\..\source\Formatter\engine\GX_CodeFormatterTokenList.pas',
- GX_CodeFormatterTokens in '..\..\source\Formatter\engine\GX_CodeFormatterTokens.pas',
- GX_CodeFormatterTypes in '..\..\source\Formatter\engine\GX_CodeFormatterTypes.pas',
- GX_CodeFormatterUnicode in '..\..\source\Formatter\engine\GX_CodeFormatterUnicode.pas',
- GX_CodeLib in '..\..\source\CodeLibrarian\GX_CodeLib.pas' {fmCodeLib},
- GX_CodeLibFile in '..\..\Source\CodeLibrarian\GX_CodeLibFile.pas',
- GX_CodeOp...
[truncated message content] |
|
From: <tw...@us...> - 2026-03-24 17:14:32
|
Revision: 5328
http://sourceforge.net/p/gexperts/code/5328
Author: twm
Date: 2026-03-24 17:14:29 +0000 (Tue, 24 Mar 2026)
Log Message:
-----------
Feature #224: Vertical Tabs for the editor window
New dockable panel showing open editor files as a vertical list.
Single-click to switch files. Supports alphabetical or tab-order sorting,
and a context menu with Close File, Close All Other, Copy Path, and
Open Containing Folder.
Uses IDE notifiers for file open/close tracking, EditorViewActivated
for active tab tracking (BDS+), and timer fallback for Delphi 6/7.
Modified Paths:
--------------
trunk/Documentation/CHANGES-1.3.28.md
trunk/Projects/Delphi2005/GExpertsDelphi2005.dpr
trunk/Projects/Delphi2006/GExpertsBDS2006.dpr
trunk/Projects/Delphi2007/GExpertsDelphi2007.dpr
trunk/Projects/Delphi2007/GExpertsDelphi2007.dproj
trunk/Projects/Delphi2009/GExpertsRS2009.dpr
trunk/Projects/Delphi2009/GExpertsRS2009.dproj
trunk/Projects/Delphi2010/GExpertsRS2010.dpr
trunk/Projects/Delphi2010/GExpertsRS2010.dproj
trunk/Projects/Delphi6/GExpertsD6.dpr
trunk/Projects/Delphi7/GExpertsD7.dpr
trunk/Projects/DelphiXE1/GExpertsRSXE1.dpr
trunk/Projects/DelphiXE1/GExpertsRSXE1.dproj
trunk/Projects/DelphiXE2/GExpertsRSXE2.dpr
trunk/Projects/DelphiXE2/GExpertsRSXE2.dproj
trunk/Projects/DelphiXE3/GExpertsRSXE3.dpr
trunk/Projects/DelphiXE3/GExpertsRSXE3.dproj
trunk/Projects/DelphiXE4/GExpertsRSXE4.dpr
trunk/Projects/DelphiXE4/GExpertsRSXE4.dproj
trunk/Projects/DelphiXE5/GExpertsRSXE5.dpr
trunk/Projects/DelphiXE5/GExpertsRSXE5.dproj
trunk/Projects/DelphiXE6/GExpertsRSXE6.dpr
trunk/Projects/DelphiXE6/GExpertsRSXE6.dproj
trunk/Projects/DelphiXE7/GExpertsRSXE7.dpr
trunk/Projects/DelphiXE7/GExpertsRSXE7.dproj
trunk/Projects/DelphiXE8/GExpertsRSXE8.dpr
trunk/Projects/DelphiXE8/GExpertsRSXE8.dproj
trunk/Projects/DelphiXx101Berlin/GExpertsRS101.dpr
trunk/Projects/DelphiXx101Berlin/GExpertsRS101.dproj
trunk/Projects/DelphiXx102Tokyo/GExpertsRS102.dpr
trunk/Projects/DelphiXx102Tokyo/GExpertsRS102.dproj
trunk/Projects/DelphiXx103Rio/GExpertsRS103.dpr
trunk/Projects/DelphiXx103Rio/GExpertsRS103.dproj
trunk/Projects/DelphiXx104Sydney/GExpertsRS104.dpr
trunk/Projects/DelphiXx104Sydney/GExpertsRS104.dproj
trunk/Projects/DelphiXx10Seattle/GExpertsRS10.dpr
trunk/Projects/DelphiXx10Seattle/GExpertsRS10.dproj
trunk/Projects/DelphiXx110Alexandria/GExpertsRS110.dpr
trunk/Projects/DelphiXx110Alexandria/GExpertsRS110.dproj
trunk/Projects/DelphiXx120/GExpertsRS120.dpr
trunk/Projects/DelphiXx120/GExpertsRS120.dproj
trunk/Projects/DelphiXx130/GExpertsRS130.dpr
trunk/Projects/DelphiXx130/GExpertsRS130.dproj
trunk/Projects/DelphiXx130_64/GExperts64RS130.dpr
trunk/Projects/DelphiXx130_64/GExperts64RS130.dproj
Added Paths:
-----------
trunk/Source/VerticalTabs/
trunk/Source/VerticalTabs/GX_VerticalTabs.dfm
trunk/Source/VerticalTabs/GX_VerticalTabs.pas
Modified: trunk/Documentation/CHANGES-1.3.28.md
===================================================================
--- trunk/Documentation/CHANGES-1.3.28.md 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Documentation/CHANGES-1.3.28.md 2026-03-24 17:14:29 UTC (rev 5328)
@@ -11,6 +11,7 @@
- Open File expert: New "Project Group" tab shows files from all projects in the project group. The tab is hidden when only a single project is loaded. The Project tab's content has been extracted into a reusable frame (feature #175)
- IDE Form Enhancer: The debugger's Exception dialog (and other IDE message dialogs with only an OK button) can now be closed with Esc (feature #206)
- Configuration: New "Disable IDE license notification" checkbox on the IDE tab writes the `LicenseNotificationEnabled` registry value to suppress the IDE's license notification popup (feature #202)
+- Vertical Tabs: New dockable panel showing open editor files as a vertical list. Single-click to switch files. Supports alphabetical or tab-order sorting, and a context menu with Close File, Close All Other, Copy Path, and Open Containing Folder (feature #224)
## Bug Fixes
Modified: trunk/Projects/Delphi2005/GExpertsDelphi2005.dpr
===================================================================
--- trunk/Projects/Delphi2005/GExpertsDelphi2005.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/Delphi2005/GExpertsDelphi2005.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -273,6 +273,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/Delphi2006/GExpertsBDS2006.dpr
===================================================================
--- trunk/Projects/Delphi2006/GExpertsBDS2006.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/Delphi2006/GExpertsBDS2006.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -273,6 +273,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/Delphi2007/GExpertsDelphi2007.dpr
===================================================================
--- trunk/Projects/Delphi2007/GExpertsDelphi2007.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/Delphi2007/GExpertsDelphi2007.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -273,6 +273,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/Delphi2007/GExpertsDelphi2007.dproj
===================================================================
--- trunk/Projects/Delphi2007/GExpertsDelphi2007.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/Delphi2007/GExpertsDelphi2007.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -653,6 +653,10 @@
<DCCReference Include="..\..\source\ToDoList\GX_ToDoOptions.pas">
<Form>fmToDoOptions</Form>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\Source\UsesExpert\GX_UnitExportList.pas"/>
<DCCReference Include="..\..\Source\UsesExpert\GX_UsesExpert.pas">
<Form>fmUsesManager</Form>
Modified: trunk/Projects/Delphi2009/GExpertsRS2009.dpr
===================================================================
--- trunk/Projects/Delphi2009/GExpertsRS2009.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/Delphi2009/GExpertsRS2009.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/Delphi2009/GExpertsRS2009.dproj
===================================================================
--- trunk/Projects/Delphi2009/GExpertsRS2009.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/Delphi2009/GExpertsRS2009.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -580,6 +580,10 @@
<DCCReference Include="..\..\source\ToDoList\GX_ToDoOptions.pas">
<Form>fmToDoOptions</Form>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/Delphi2010/GExpertsRS2010.dpr
===================================================================
--- trunk/Projects/Delphi2010/GExpertsRS2010.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/Delphi2010/GExpertsRS2010.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/Delphi2010/GExpertsRS2010.dproj
===================================================================
--- trunk/Projects/Delphi2010/GExpertsRS2010.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/Delphi2010/GExpertsRS2010.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -554,6 +554,10 @@
<DCCReference Include="..\..\source\ToDoList\GX_ToDoOptions.pas">
<Form>fmToDoOptions</Form>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/Delphi6/GExpertsD6.dpr
===================================================================
--- trunk/Projects/Delphi6/GExpertsD6.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/Delphi6/GExpertsD6.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/Delphi7/GExpertsD7.dpr
===================================================================
--- trunk/Projects/Delphi7/GExpertsD7.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/Delphi7/GExpertsD7.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXE1/GExpertsRSXE1.dpr
===================================================================
--- trunk/Projects/DelphiXE1/GExpertsRSXE1.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE1/GExpertsRSXE1.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXE1/GExpertsRSXE1.dproj
===================================================================
--- trunk/Projects/DelphiXE1/GExpertsRSXE1.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE1/GExpertsRSXE1.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -561,6 +561,10 @@
<DCCReference Include="..\..\source\ToDoList\GX_ToDoOptions.pas">
<Form>fmToDoOptions</Form>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXE2/GExpertsRSXE2.dpr
===================================================================
--- trunk/Projects/DelphiXE2/GExpertsRSXE2.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE2/GExpertsRSXE2.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXE2/GExpertsRSXE2.dproj
===================================================================
--- trunk/Projects/DelphiXE2/GExpertsRSXE2.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE2/GExpertsRSXE2.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -701,6 +701,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXE3/GExpertsRSXE3.dpr
===================================================================
--- trunk/Projects/DelphiXE3/GExpertsRSXE3.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE3/GExpertsRSXE3.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXE3/GExpertsRSXE3.dproj
===================================================================
--- trunk/Projects/DelphiXE3/GExpertsRSXE3.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE3/GExpertsRSXE3.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -702,6 +702,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXE4/GExpertsRSXE4.dpr
===================================================================
--- trunk/Projects/DelphiXE4/GExpertsRSXE4.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE4/GExpertsRSXE4.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXE4/GExpertsRSXE4.dproj
===================================================================
--- trunk/Projects/DelphiXE4/GExpertsRSXE4.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE4/GExpertsRSXE4.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -700,6 +700,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXE5/GExpertsRSXE5.dpr
===================================================================
--- trunk/Projects/DelphiXE5/GExpertsRSXE5.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE5/GExpertsRSXE5.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXE5/GExpertsRSXE5.dproj
===================================================================
--- trunk/Projects/DelphiXE5/GExpertsRSXE5.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE5/GExpertsRSXE5.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -704,6 +704,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXE6/GExpertsRSXE6.dpr
===================================================================
--- trunk/Projects/DelphiXE6/GExpertsRSXE6.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE6/GExpertsRSXE6.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXE6/GExpertsRSXE6.dproj
===================================================================
--- trunk/Projects/DelphiXE6/GExpertsRSXE6.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE6/GExpertsRSXE6.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -702,6 +702,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXE7/GExpertsRSXE7.dpr
===================================================================
--- trunk/Projects/DelphiXE7/GExpertsRSXE7.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE7/GExpertsRSXE7.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXE7/GExpertsRSXE7.dproj
===================================================================
--- trunk/Projects/DelphiXE7/GExpertsRSXE7.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE7/GExpertsRSXE7.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -577,6 +577,10 @@
<DCCReference Include="..\..\source\ToDoList\GX_ToDoOptions.pas">
<Form>fmToDoOptions</Form>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXE8/GExpertsRSXE8.dpr
===================================================================
--- trunk/Projects/DelphiXE8/GExpertsRSXE8.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE8/GExpertsRSXE8.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXE8/GExpertsRSXE8.dproj
===================================================================
--- trunk/Projects/DelphiXE8/GExpertsRSXE8.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXE8/GExpertsRSXE8.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -583,6 +583,10 @@
<DCCReference Include="..\..\source\ToDoList\GX_ToDoOptions.pas">
<Form>fmToDoOptions</Form>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXx101Berlin/GExpertsRS101.dpr
===================================================================
--- trunk/Projects/DelphiXx101Berlin/GExpertsRS101.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx101Berlin/GExpertsRS101.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXx101Berlin/GExpertsRS101.dproj
===================================================================
--- trunk/Projects/DelphiXx101Berlin/GExpertsRS101.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx101Berlin/GExpertsRS101.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -583,6 +583,10 @@
<DCCReference Include="..\..\source\ToDoList\GX_ToDoOptions.pas">
<Form>fmToDoOptions</Form>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXx102Tokyo/GExpertsRS102.dpr
===================================================================
--- trunk/Projects/DelphiXx102Tokyo/GExpertsRS102.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx102Tokyo/GExpertsRS102.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -273,6 +273,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXx102Tokyo/GExpertsRS102.dproj
===================================================================
--- trunk/Projects/DelphiXx102Tokyo/GExpertsRS102.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx102Tokyo/GExpertsRS102.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -737,6 +737,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXx103Rio/GExpertsRS103.dpr
===================================================================
--- trunk/Projects/DelphiXx103Rio/GExpertsRS103.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx103Rio/GExpertsRS103.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXx103Rio/GExpertsRS103.dproj
===================================================================
--- trunk/Projects/DelphiXx103Rio/GExpertsRS103.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx103Rio/GExpertsRS103.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -585,6 +585,10 @@
<DCCReference Include="..\..\source\ToDoList\GX_ToDoOptions.pas">
<Form>fmToDoOptions</Form>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXx104Sydney/GExpertsRS104.dpr
===================================================================
--- trunk/Projects/DelphiXx104Sydney/GExpertsRS104.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx104Sydney/GExpertsRS104.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXx104Sydney/GExpertsRS104.dproj
===================================================================
--- trunk/Projects/DelphiXx104Sydney/GExpertsRS104.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx104Sydney/GExpertsRS104.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -702,6 +702,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXx10Seattle/GExpertsRS10.dpr
===================================================================
--- trunk/Projects/DelphiXx10Seattle/GExpertsRS10.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx10Seattle/GExpertsRS10.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -271,6 +271,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXx10Seattle/GExpertsRS10.dproj
===================================================================
--- trunk/Projects/DelphiXx10Seattle/GExpertsRS10.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx10Seattle/GExpertsRS10.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -582,6 +582,10 @@
<DCCReference Include="..\..\source\ToDoList\GX_ToDoOptions.pas">
<Form>fmToDoOptions</Form>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXx110Alexandria/GExpertsRS110.dpr
===================================================================
--- trunk/Projects/DelphiXx110Alexandria/GExpertsRS110.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx110Alexandria/GExpertsRS110.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -273,6 +273,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXx110Alexandria/GExpertsRS110.dproj
===================================================================
--- trunk/Projects/DelphiXx110Alexandria/GExpertsRS110.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx110Alexandria/GExpertsRS110.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -723,6 +723,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXx120/GExpertsRS120.dpr
===================================================================
--- trunk/Projects/DelphiXx120/GExpertsRS120.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx120/GExpertsRS120.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -273,6 +273,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXx120/GExpertsRS120.dproj
===================================================================
--- trunk/Projects/DelphiXx120/GExpertsRS120.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx120/GExpertsRS120.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -769,6 +769,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXx130/GExpertsRS130.dpr
===================================================================
--- trunk/Projects/DelphiXx130/GExpertsRS130.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx130/GExpertsRS130.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -273,6 +273,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXx130/GExpertsRS130.dproj
===================================================================
--- trunk/Projects/DelphiXx130/GExpertsRS130.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx130/GExpertsRS130.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -766,6 +766,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Modified: trunk/Projects/DelphiXx130_64/GExperts64RS130.dpr
===================================================================
--- trunk/Projects/DelphiXx130_64/GExperts64RS130.dpr 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx130_64/GExperts64RS130.dpr 2026-03-24 17:14:29 UTC (rev 5328)
@@ -273,6 +273,7 @@
GX_TimedCallback in '..\..\Source\Utils\GX_TimedCallback.pas',
GX_ToDo in '..\..\source\ToDoList\GX_ToDo.pas' {fmToDo},
GX_ToDoOptions in '..\..\source\ToDoList\GX_ToDoOptions.pas' {fmToDoOptions},
+ GX_VerticalTabs in '..\..\source\VerticalTabs\GX_VerticalTabs.pas' {fmVerticalTabs},
GX_Toolbar in '..\..\source\EditorToolbar\GX_Toolbar.pas',
GX_ToolbarConfig in '..\..\source\EditorToolbar\GX_ToolbarConfig.pas' {fmToolbarConfig},
GX_ToolBarDropDown in '..\..\source\EditorToolbar\GX_ToolBarDropDown.pas',
Modified: trunk/Projects/DelphiXx130_64/GExperts64RS130.dproj
===================================================================
--- trunk/Projects/DelphiXx130_64/GExperts64RS130.dproj 2026-03-24 10:43:26 UTC (rev 5327)
+++ trunk/Projects/DelphiXx130_64/GExperts64RS130.dproj 2026-03-24 17:14:29 UTC (rev 5328)
@@ -781,6 +781,10 @@
<Form>fmToDoOptions</Form>
<FormType>dfm</FormType>
</DCCReference>
+ <DCCReference Include="..\..\source\VerticalTabs\GX_VerticalTabs.pas">
+ <Form>fmVerticalTabs</Form>
+ <FormType>dfm</FormType>
+ </DCCReference>
<DCCReference Include="..\..\source\EditorToolbar\GX_Toolbar.pas"/>
<DCCReference Include="..\..\source\EditorToolbar\GX_ToolbarConfig.pas">
<Form>fmToolbarConfig</Form>
Added: trunk/Source/VerticalTabs/GX_VerticalTabs.dfm
===================================================================
--- trunk/Source/VerticalTabs/GX_VerticalTabs.dfm (rev 0)
+++ trunk/Source/VerticalTabs/GX_VerticalTabs.dfm 2026-03-24 17:14:29 UTC (rev 5328)
@@ -0,0 +1,143 @@
+object fmVerticalTabs: TfmVerticalTabs
+ Left = 268
+ Top = 191
+ AutoScroll = False
+ Caption = 'Vertical Tabs'
+ ClientHeight = 400
+ ClientWidth = 200
+ Color = clBtnFace
+ Font.Charset = ANSI_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ PopupMenu = Popup
+ OldCreateOrder = True
+ Position = poScreenCenter
+ Scaled = False
+ PixelsPerInch = 96
+ TextHeight = 14
+ object lbFiles: TListBox
+ Left = 0
+ Top = 22
+ Width = 200
+ Height = 359
+ Align = alClient
+ ItemHeight = 14
+ PopupMenu = Popup
+ TabOrder = 0
+ OnClick = lbFilesClick
+ OnMouseMove = lbFilesMouseMove
+ end
+ object ToolBar: TToolBar
+ Left = 0
+ Top = 0
+ Width = 200
+ Height = 22
+ AutoSize = True
+ EdgeBorders = []
+ Flat = True
+ Images = dmSharedImages.Images
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 1
+ object tbnRefresh: TToolButton
+ Left = 0
+ Top = 0
+ Action = actRefresh
+ end
+ object tbnSep1: TToolButton
+ Left = 23
+ Top = 0
+ Width = 8
+ ImageIndex = 1
+ Style = tbsSeparator
+ end
+ object tbnSortAlpha: TToolButton
+ Left = 31
+ Top = 0
+ Action = actSortAlpha
+ Style = tbsCheck
+ end
+ end
+ object StatusBar: TStatusBar
+ Left = 0
+ Top = 381
+ Width = 200
+ Height = 19
+ Panels = <>
+ ParentFont = True
+ SimplePanel = True
+ UseSystemFont = False
+ end
+ object Popup: TPopupMenu
+ Images = dmSharedImages.Images
+ Left = 80
+ Top = 120
+ object mitGotoFile: TMenuItem
+ Action = actGotoFile
+ Default = True
+ end
+ object mitSep1: TMenuItem
+ Caption = '-'
+ end
+ object mitCloseFile: TMenuItem
+ Action = actCloseFile
+ end
+ object mitCloseAllOther: TMenuItem
+ Action = actCloseAllOther
+ end
+ object mitSep2: TMenuItem
+ Caption = '-'
+ end
+ object mitCopyPath: TMenuItem
+ Action = actCopyPath
+ end
+ object mitOpenFolder: TMenuItem
+ Action = actOpenFolder
+ end
+ end
+ object Actions: TActionList
+ Images = dmSharedImages.Images
+ Left = 80
+ Top = 180
+ object actRefresh: TAction
+ Caption = '&Refresh'
+ Hint = 'Refresh file list'
+ ImageIndex = 39
+ ShortCut = 116
+ OnExecute = actRefreshExecute
+ end
+ object actSortAlpha: TAction
+ Caption = 'Sort &Alphabetically'
+ Hint = 'Toggle alphabetical sorting'
+ ImageIndex = 93
+ OnExecute = actSortAlphaExecute
+ end
+ object actGotoFile: TAction
+ Caption = '&Go to File'
+ Hint = 'Switch to selected file'
+ OnExecute = actGotoFileExecute
+ end
+ object actCloseFile: TAction
+ Caption = '&Close File'
+ Hint = 'Close selected file'
+ OnExecute = actCloseFileExecute
+ end
+ object actCloseAllOther: TAction
+ Caption = 'Close &All Other Files'
+ Hint = 'Close all files except selected'
+ OnExecute = actCloseAllOtherExecute
+ end
+ object actCopyPath: TAction
+ Caption = 'Copy &Path'
+ Hint = 'Copy full path to clipboard'
+ OnExecute = actCopyPathExecute
+ end
+ object actOpenFolder: TAction
+ Caption = 'Open Containing &Folder'
+ Hint = 'Open containing folder in Explorer'
+ OnExecute = actOpenFolderExecute
+ end
+ end
+end
Added: trunk/Source/VerticalTabs/GX_VerticalTabs.pas
===================================================================
--- trunk/Source/VerticalTabs/GX_VerticalTabs.pas (rev 0)
+++ trunk/Source/VerticalTabs/GX_VerticalTabs.pas 2026-03-24 17:14:29 UTC (rev 5328)
@@ -0,0 +1,540 @@
+unit GX_VerticalTabs;
+
+{$I GX_CondDefine.inc}
+
+interface
+
+uses
+ Windows, SysUtils, Classes, Controls, Forms, Menus, ActnList, ComCtrls,
+ StdCtrls, ExtCtrls, ToolWin, ToolsAPI,
+ GX_IdeDock, GX_Experts, GX_OtaUtils, GX_ConfigurationInfo, GX_SharedImages;
+
+type
+ TfmVerticalTabs = class(TfmIdeDockForm)
+ lbFiles: TListBox;
+ ToolBar: TToolBar;
+ tbnRefresh: TToolButton;
+ tbnSep1: TToolButton;
+ tbnSortAlpha: TToolButton;
+ StatusBar: TStatusBar;
+ Popup: TPopupMenu;
+ mitGotoFile: TMenuItem;
+ mitSep1: TMenuItem;
+ mitCloseFile: TMenuItem;
+ mitCloseAllOther: TMenuItem;
+ mitSep2: TMenuItem;
+ mitCopyPath: TMenuItem;
+ mitOpenFolder: TMenuItem;
+ Actions: TActionList;
+ actRefresh: TAction;
+ actSortAlpha: TAction;
+ actGotoFile: TAction;
+ actCloseFile: TAction;
+ actCloseAllOther: TAction;
+ actCopyPath: TAction;
+ actOpenFolder: TAction;
+ procedure lbFilesClick(Sender: TObject);
+ procedure lbFilesMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
+ procedure actRefreshExecute(Sender: TObject);
+ procedure actSortAlphaExecute(Sender: TObject);
+ procedure actGotoFileExecute(Sender: TObject);
+ procedure actCloseFileExecute(Sender: TObject);
+ procedure actCloseAllOtherExecute(Sender: TObject);
+ procedure actCopyPathExecute(Sender: TObject);
+ procedure actOpenFolderExecute(Sender: TObject);
+ private
+ FFilePaths: TStringList;
+ FIdeNotifier: TBaseIdeNotifier;
+ FSortAlphabetical: Boolean;
+ FUpdatingSelection: Boolean;
+{$IFDEF GX_VER160_up}
+ FEditNotifierIndex: Integer;
+{$ELSE}
+ FTimer: TTimer;
+{$ENDIF}
+ function GetSelectedFilePath: string;
+{$IFNDEF GX_VER160_up}
+ procedure TimerTick(Sender: TObject);
+{$ENDIF}
+ procedure RefreshFileList;
+ procedure AddFile(const _FileName: string);
+ procedure RemoveFile(const _FileName: string);
+ procedure UpdateSelection(const _FileName: string);
+ procedure UpdateStatusBar;
+ procedure SortFileList;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ end;
+
+ TVerticalTabsExpert = class(TGX_Expert)
+ protected
+ procedure SetActive(New: Boolean); override;
+ procedure InternalLoadSettings(_Settings: IExpertSettings); override;
+ procedure InternalSaveSettings(_Settings: IExpertSettings); override;
+ public
+ function GetActionCaption: string; override;
+ class function GetName: string; override;
+ procedure Execute(Sender: TObject); override;
+ function HasConfigOptions: Boolean; override;
+ end;
+
+var
+ fmVerticalTabs: TfmVerticalTabs;
+ VerticalTabsExpert: TVerticalTabsExpert;
+
+implementation
+
+{$R *.dfm}
+
+uses
+ Clipbrd, ShellAPI,
+ u_dzVclUtils,
+ GX_GenericUtils,
+{$IFDEF GX_VER160_up}
+ DockForm,
+ GX_NTAEditServiceNotifier,
+{$ENDIF}
+ GX_GExperts;
+
+type
+ TVerticalTabsIdeNotifier = class(TBaseIdeNotifier)
+ private
+ FForm: TfmVerticalTabs;
+ public
+ constructor Create(_Form: TfmVerticalTabs);
+ procedure FileNotification(NotifyCode: TOTAFileNotification;
+ const FileName: string; var Cancel: Boolean); override;
+ end;
+
+{$IFDEF GX_VER160_up}
+type
+ TVerticalTabsEditNotifier = class(TGxNTAEditServiceNotifier, INTAEditServicesNotifier)
+ private
+ FForm: TfmVerticalTabs;
+ protected
+ procedure EditorViewActivated(const EditWindow: INTAEditWindow;
+ const EditView: IOTAEditView); override;
+ public
+ constructor Create(_Form: TfmVerticalTabs);
+ end;
+{$ENDIF}
+
+{ TVerticalTabsIdeNotifier }
+
+constructor TVerticalTabsIdeNotifier.Create(_Form: TfmVerticalTabs);
+begin
+ inherited Create;
+ FForm := _Form;
+end;
+
+procedure TVerticalTabsIdeNotifier.FileNotification(NotifyCode: TOTAFileNotification;
+ const FileName: string; var Cancel: Boolean);
+begin
+ if not Assigned(FForm) then
+ Exit;
+ case NotifyCode of
+ ofnFileOpened:
+ FForm.AddFile(FileName);
+ ofnFileClosing:
+ FForm.RemoveFile(FileName);
+ end;
+end;
+
+{$IFDEF GX_VER160_up}
+
+{ TVerticalTabsEditNotifier }
+
+constructor TVerticalTabsEditNotifier.Create(_Form: TfmVerticalTabs);
+begin
+ FForm := _Form;
+ inherited Create;
+end;
+
+procedure TVerticalTabsEditNotifier.EditorViewActivated(
+ const EditWindow: INTAEditWindow; const EditView: IOTAEditView);
+var
+ fn: string;
+begin
+ if not Assigned(FForm) then
+ Exit;
+ if not Assigned(EditView) then
+ Exit;
+ try
+ fn := EditView.Buffer.FileName;
+ if fn <> '' then
+ FForm.UpdateSelection(fn);
+ except
+ // Ignore OTA exceptions during IDE shutdown
+ end;
+end;
+{$ENDIF}
+
+{ TfmVerticalTabs }
+
+constructor TfmVerticalTabs.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ SetToolbarGradient(ToolBar);
+
+ if Assigned(VerticalTabsExpert) then
+ VerticalTabsExpert.SetFormIcon(Self);
+
+ FFilePaths := TStringList.Create;
+ lbFiles.ShowHint := True;
+
+ FIdeNotifier := TVerticalTabsIdeNotifier.Create(Self);
+ FIdeNotifier.AddNotifierToIDE;
+
+{$IFDEF GX_VER160_up}
+ FEditNotifierIndex := Ota.GetEditorServices.AddNotifier(
+ TVerticalTabsEditNotifier.Create(Self));
+{$ELSE}
+ FTimer := TTimer.Create(Self);
+ FTimer.Interval := 500;
+ FTimer.OnTimer := TimerTick;
+ FTimer.Enabled := True;
+{$ENDIF}
+
+ RefreshFileList;
+end;
+
+destructor TfmVerticalTabs.Destroy;
+begin
+{$IFDEF GX_VER160_up}
+ if FEditNotifierIndex >= 0 then begin
+ Ota.GetEditorServices.RemoveNotifier(FEditNotifierIndex);
+ FEditNotifierIndex := -1;
+ end;
+{$ELSE}
+ FreeAndNil(FTimer);
+{$ENDIF}
+
+ if Assigned(FIdeNotifier) then begin
+ FIdeNotifier.RemoveNotifierFromIDE;
+ FIdeNotifier := nil;
+ end;
+
+ FreeAndNil(FFilePaths);
+
+ inherited Destroy;
+
+ fmVerticalTabs := nil;
+end;
+
+function TfmVerticalTabs.GetSelectedFilePath: string;
+var
+ Idx: Integer;
+begin
+ Result := '';
+ Idx := lbFiles.ItemIndex;
+ if (Idx >= 0) and (Idx < FFilePaths.Count) then
+ Result := FFilePaths[Idx];
+end;
+
+procedure TfmVerticalTabs.RefreshFileList;
+var
+ ModuleServices: IOTAModuleServices;
+ Module: IOTAModule;
+ SourceEditor: IOTASourceEditor;
+ i: Integer;
+ fn: string;
+ SelectedFile: string;
+begin
+ SelectedFile := GetSelectedFilePath;
+
+ lbFiles.Items.BeginUpdate;
+ try
+ lbFiles.Items.Clear;
+ FFilePaths.Clear;
+
+ ModuleServices := BorlandIDEServices as IOTAModuleServices;
+ if not Assigned(ModuleServices) then
+ Exit;
+
+ for i := 0 to ModuleServices.ModuleCount - 1 do begin
+ Module := ModuleServices.Modules[i];
+ if not Assigned(Module) then
+ Continue;
+ SourceEditor := Ota.GetSourceEditorFromModule(Module);
+ if not Assigned(SourceEditor) then
+ Continue;
+ fn := SourceEditor.FileName;
+ if fn = '' then
+ Continue;
+ if FFilePaths.IndexOf(fn) >= 0 then
+ Continue;
+ FFilePaths.Add(fn);
+ lbFiles.Items.Add(ExtractFileName(fn));
+ end;
+
+ SortFileList;
+ finally
+ lbFiles.Items.EndUpdate;
+ end;
+
+ UpdateSelection(SelectedFile);
+ UpdateStatusBar;
+end;
+
+procedure TfmVerticalTabs.AddFile(const _FileName: string);
+var
+ SourceEditor: IOTASourceEditor;
+begin
+ if _FileName = '' then
+ Exit;
+
+ // Only add files that have a source editor
+ if not Ota.TryGetSourceEditor(_FileName, SourceEditor) then
+ Exit;
+
+ if FFilePaths.IndexOf(_FileName) >= 0 then
+ Exit;
+
+ FFilePaths.Add(_FileName);
+ lbFiles.Items.Add(ExtractFileName(_FileName));
+
+ if FSortAlphabetical then
+ SortFileList;
+
+ UpdateStatusBar;
+end;
+
+procedure TfmVerticalTabs.RemoveFile(const _FileName: string);
+var
+ Idx: Integer;
+begin
+ Idx := FFilePaths.IndexOf(_FileName);
+ if Idx < 0 then
+ Exit;
+
+ FFilePaths.Delete(Idx);
+ lbFiles.Items.Delete(Idx);
+
+ UpdateStatusBar;
+end;
+
+procedure TfmVerticalTabs.UpdateSelection(const _FileName: string);
+var
+ i: Integer;
+begin
+ if FUpdatingSelection then
+ Exit;
+ FUpdatingSelection := True;
+ try
+ for i := 0 to FFilePaths.Count - 1 do begin
+ if SameFileName(FFilePaths[i], _FileName) then begin
+ if lbFiles.ItemIndex <> i then
+ lbFiles.ItemIndex := i;
+ Exit;
+ end;
+ end;
+ finally
+ FUpdatingSelection := False;
+ end;
+end;
+
+procedure TfmVerticalTabs.UpdateStatusBar;
+begin
+ StatusBar.SimpleText := Format(' %d files', [FFilePaths.Count]);
+end;
+
+procedure TfmVerticalTabs.SortFileList;
+var
+ i, j: Integer;
+ TempName: string;
+ TempPath: string;
+ SelectedFile: string;
+begin
+ if not FSortAlphabetical then
+ Exit;
+
+ SelectedFile := GetSelectedFilePath;
+
+ // Simple insertion sort by display name
+ for i := 1 to lbFiles.Items.Count - 1 do begin
+ j := i;
+ while (j > 0) and (AnsiCompareText(lbFiles.Items[j - 1], lbFiles.Items[j]) > 0) do begin
+ TempName := lbFiles.Items[j];
+ lbFiles.Items[j] := lbFiles.Items[j - 1];
+ lbFiles.Items[j - 1] := TempName;
+
+ TempPath := FFilePaths[j];
+ FFilePaths[j] := FFilePaths[j - 1];
+ FFilePaths[j - 1] := TempPath;
+
+ Dec(j);
+ end;
+ end;
+
+ UpdateSelection(SelectedFile);
+end;
+
+procedure TfmVerticalTabs.lbFilesClick(Sender: TObject);
+var
+ fn: string;
+begin
+ if FUpdatingSelection then
+ Exit;
+ fn := GetSelectedFilePath;
+ if fn <> '' then
+ Ota.MakeSourceVisible(fn);
+end;
+
+procedure TfmVerticalTabs.lbFilesMouseMove(Sender: TObject; Shift: TShiftState;
+ X, Y: Integer);
+var
+ Idx: Integer;
+begin
+ Idx := lbFiles.ItemAtPos(Point(X, Y), True);
+ if (Idx >= 0) and (Idx < FFilePaths.Count) then
+ lbFiles.Hint := FFilePaths[Idx]
+ else
+ lbFiles.Hint := '';
+end;
+
+procedure TfmVerticalTabs.actRefreshExecute(Sender: TObject);
+begin
+ RefreshFileList;
+end;
+
+procedure TfmVerticalTabs.actSortAlphaExecute(Sender: TObject);
+begin
+ FSortAlphabetical := not FSortAlphabetical;
+ tbnSortAlpha.Down := FSortAlphabetical;
+ RefreshFileList;
+end;
+
+procedure TfmVerticalTabs.actGotoFileExecute(Sender: TObject);
+var
+ fn: string;
+begin
+ fn := GetSelectedFilePath;
+ if fn <> '' then
+ Ota.MakeSourceVisible(fn);
+end;
+
+procedure TfmVerticalTabs.actCloseFileExecute(Sender: TObject);
+var
+ fn: string;
+ Module: IOTAModule;
+begin
+ fn := GetSelectedFilePath;
+ if fn = '' then
+ Exit;
+ Module := Ota.GetModule(fn);
+ if Assigned(Module) then
+ Module.CloseModule(True);
+end;
+
+procedure TfmVerticalTabs.actCloseAllOtherExecute(Sender: TObject);
+var
+ SelectedFile: string;
+ Module: IOTAModule;
+ i: Integer;
+ FilesToClose: TStringList;
+begin
+ SelectedFile := GetSelectedFilePath;
+ if SelectedFile = '' then
+ Exit;
+
+ FilesToClose := TStringList.Create;
+ try
+ // Collect files to close first, then close them
+ for i := 0 to FFilePaths.Count - 1 do begin
+ if not SameFileName(FFilePaths[i], SelectedFile) then
+ FilesToClose.Add(FFilePaths[i]);
+ end;
+
+ for i := 0 to FilesToClose.Count - 1 do begin
+ Module := Ota.GetModule(FilesToClose[i]);
+ if Assigned(Module) then
+ Module.CloseModule(True);
+ end;
+ finally
+ FreeAndNil(FilesToClose);
+ end;
+end;
+
+procedure TfmVerticalTabs.actCopyPathExecute(Sender: TObject);
+var
+ fn: string;
+begin
+ fn := GetSelectedFilePath;
+ if fn <> '' then
+ Clipboard.AsText := fn;
+end;
+
+procedure TfmVerticalTabs.actOpenFolderExecute(Sender: TObject);
+var
+ fn: string;
+begin
+ fn := GetSelectedFilePath;
+ if fn <> '' then
+ ShellExecute(0, 'open', 'explorer.exe', PChar('/select,' + fn), nil, SW_SHOWNORMAL);
+end;
+
+{$IFNDEF GX_VER160_up}
+procedure TfmVerticalTabs.TimerTick(Sender: TObject);
+var
+ fn: string;
+begin
+ fn := Ota.GetCurrentSourceFile;
+ if fn <> '' then
+ UpdateSelection(fn);
+end;
+{$ENDIF}
+
+{ TVerticalTabsExpert }
+
+function TVerticalTabsExpert.GetActionCaption: string;
+begin
+ Result := '&Vertical Tabs';
+end;
+
+class function TVerticalTabsExpert.GetName: string;
+begin
+ Result := 'VerticalTabs';
+end;
+
+function TVerticalTabsExpert.HasConfigOptions: Boolean;
+begin
+ Result := False;
+end;
+
+procedure TVerticalTabsExpert.Execute(Sender: TObject);
+begin
+ if fmVerticalTabs = nil then
+ fmVerticalTabs := TfmVerticalTabs.Create(nil);
+ IdeDockManager.ShowForm(fmVerticalTabs);
+ IncCallCount;
+end;
+
+procedure TVerticalTabsExpert.SetActive(New: Boolean);
+begin
+ if New <> Active then begin
+ inherited SetActive(New);
+ if not New then
+ FreeAndNil(fmVerticalTabs);
+ end;
+end;
+
+procedure TVerticalTabsExpert.InternalLoadSettings(_Settings: IExpertSettings);
+begin
+ inherited;
+ if Assigned(fmVerticalTabs) then begin
+ fmVerticalTabs.FSortAlphabetical := _Settings.ReadBool('SortAlphabetical', False);
+ fmVerticalTabs.tbnSortAlpha.Down := fmVerticalTabs.FSortAlphabetical;
+ end;
+end;
+
+procedure TVerticalTabsExpert.InternalSaveSettings(_Settings: IExpertSettings);
+begin
+ inherited;
+ if Assigned(fmVerticalTabs) then
+ _Settings.WriteBool('SortAlphabetical', fmVerticalTabs.FSortAlphabetical);
+end;
+
+initialization
+ RegisterGX_Expert(TVerticalTabsExpert);
+end.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tw...@us...> - 2026-03-24 10:43:27
|
Revision: 5327
http://sourceforge.net/p/gexperts/code/5327
Author: twm
Date: 2026-03-24 10:43:26 +0000 (Tue, 24 Mar 2026)
Log Message:
-----------
Fix for bug in feature #202: LicenseNotificationEnabled is a string value
The IDE stores LicenseNotificationEnabled as a REG_SZ string ('0'/'1'),
not as a REG_DWORD integer. Using ReadInteger/WriteInteger caused an
'Invalid data type' error when the value already existed as a string.
Modified Paths:
--------------
trunk/Source/Framework/GX_Configure.pas
Modified: trunk/Source/Framework/GX_Configure.pas
===================================================================
--- trunk/Source/Framework/GX_Configure.pas 2026-03-24 10:37:17 UTC (rev 5326)
+++ trunk/Source/Framework/GX_Configure.pas 2026-03-24 10:43:26 UTC (rev 5327)
@@ -717,7 +717,7 @@
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKeyReadOnly(Ota.GetIdeBaseRegistryKey + '\Globals') then begin
if Reg.ValueExists('LicenseNotificationEnabled') then
- chkDisableLicenseNotification.Checked := Reg.ReadInteger('LicenseNotificationEnabled') = 0
+ chkDisableLicenseNotification.Checked := Reg.ReadString('LicenseNotificationEnabled') = '0'
else
chkDisableLicenseNotification.Checked := False;
Reg.CloseKey;
@@ -737,7 +737,7 @@
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey(Ota.GetIdeBaseRegistryKey + '\Globals', True) then begin
if chkDisableLicenseNotification.Checked then
- Reg.WriteInteger('LicenseNotificationEnabled', 0)
+ Reg.WriteString('LicenseNotificationEnabled', '0')
else if Reg.ValueExists('LicenseNotificationEnabled') then
Reg.DeleteValue('LicenseNotificationEnabled');
Reg.CloseKey;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|