Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
0093ac6
Phase 1: Restructure for FMX port — three-layer architecture
jareddavison Feb 25, 2026
32b3dc4
Fix C++ Builder packages for Win32 compilation
jareddavison Feb 25, 2026
e2d30d5
Add ARCHITECTURE.md documenting three-layer VCL/FMX design
jareddavison Feb 25, 2026
92eea87
Fix TSynEditStringList.Create constructor signature mismatch
jareddavison Feb 25, 2026
d9bf692
Implement FMX editor — Phase 2 core functionality
jareddavison Feb 25, 2026
0a30a0c
Add FMX HighlighterDemo with 13 language highlighters
jareddavison Feb 25, 2026
c0219b9
Fix selection rendering in FMX editor
jareddavison Feb 25, 2026
fb0cae4
Fix stack overflow in multi-line highlighters by adding range scanning
jareddavison Feb 25, 2026
da2ccf8
Fix selection rendering making non-selected text disappear
jareddavison Feb 25, 2026
f27f090
Fix crash on second keystroke due to operator precedence in EndBlock
jareddavison Feb 25, 2026
a0b5ec5
Fix VCL demo builds broken by directory restructuring
jareddavison Feb 25, 2026
66e4e3c
Add syntax highlighting color scheme to all 13 FMX demo highlighters
jareddavison Feb 25, 2026
e70705e
Update README.md and What's new.md for FMX port and current project s…
jareddavison Feb 25, 2026
3db1248
Add FMX EditApp and FeaturesDemo, fix Tab key handling in FMX editor
jareddavison Feb 25, 2026
52f867e
Rewrite FMX completion proposal from stub to full implementation
jareddavison Feb 25, 2026
9f4b8ea
Add FMX editor plugin infrastructure
jareddavison Feb 25, 2026
32a2e14
Add FMX spell check with abstract provider interface
jareddavison Feb 25, 2026
653095f
Add FMX printing with abstract provider interface
jareddavison Feb 25, 2026
f9127b2
Add FMX search and replace demo dialogs
jareddavison Feb 25, 2026
3b40370
Add code folding, search/replace, and plugin support to FMX editor
jareddavison Feb 25, 2026
b8a76c7
Update FMX package and registration for Phase 3 features
jareddavison Feb 25, 2026
30c7c52
Add IsRegex property to FMX search and replace dialogs
jareddavison Feb 25, 2026
882bd58
Add Phase 3 UI controls to FMX FeaturesDemo layout
jareddavison Feb 25, 2026
149d865
Wire Phase 3 features into FMX FeaturesDemo
jareddavison Feb 25, 2026
dbb4996
Move TSynFMXEditPlugin into FMX.SynEdit and remove dead code
jareddavison Feb 25, 2026
7f321c4
Fix FMX completion proposal compilation errors
jareddavison Feb 25, 2026
5ce2759
Fix FMX printing subsystem compilation errors
jareddavison Feb 25, 2026
8daaeb8
Fix completion proposal popup position and keyboard selection
jareddavison Feb 25, 2026
8be0bd2
Include Enter and Tab completion options in FeaturesDemo
jareddavison Feb 25, 2026
15532c3
Add null-safety guards for FForm in completion proposal
jareddavison Feb 25, 2026
0d96f1b
Fix FMX print scaling by using actual printer page dimensions
jareddavison Feb 25, 2026
d774770
Update docs for Phase 3 features and new FMX demos
jareddavison Feb 25, 2026
da593df
Add DUnitX test suite for FMX SynEdit editor (80 tests)
jareddavison Feb 25, 2026
b2fd4c8
Add FMX test suite to documentation
jareddavison Feb 25, 2026
0328673
Remove unused variable in TSynFMXEditPrint.PrintPage
jareddavison Feb 25, 2026
bbd34f0
Use relative paths in all build scripts
jareddavison Feb 25, 2026
5aefca5
Restore full license header in SynEditKeyConst.pas
jareddavison Feb 25, 2026
bdc09d7
Update docs for FMX printing, spell check, completion, and build scripts
jareddavison Feb 25, 2026
7951686
Add spell provider and language switching to FMX Features Demo
jareddavison Feb 26, 2026
44a3d93
Add Hunspell provider and squiggly underline painting for FMX spell c…
jareddavison Feb 26, 2026
48357f4
Add DUnitX tests for Hunspell spell check provider
jareddavison Feb 26, 2026
11576ed
Add highlighter-aware spell check filtering
jareddavison Feb 26, 2026
df63f46
Add tests for 6 blocking bugs found in FMX port review
jareddavison Feb 26, 2026
c94fa2c
Fix plugin FHandlers not initialized in base class
jareddavison Feb 26, 2026
6c1325e
Fix Modified property returning CanUndo instead of save state
jareddavison Feb 26, 2026
23b6eb1
Fix print output ignoring syntax highlighting colors
jareddavison Feb 26, 2026
4f2bd84
Fix crash when FTextWidthFunc is nil in TSynEditStringList
jareddavison Feb 26, 2026
93bb88b
Fix tab expansion creating coordinate mismatch in token painting
jareddavison Feb 26, 2026
1938783
Fix GetMaxScrollWidth ignoring tab expansion
jareddavison Feb 26, 2026
2d1ac34
Add tests for keyboard handler chain and OnKeyDown preservation
jareddavison Feb 26, 2026
750e115
Fix completion proposal hijacking editor's OnKeyDown event
jareddavison Feb 26, 2026
b67a8cb
Strengthen FMX test coverage: fix weak assertions, add 63 new tests
jareddavison Feb 28, 2026
904537b
Add tests for Windows spell provider and spell check component (27 te…
jareddavison Feb 28, 2026
22bac80
Extract shared spell check infrastructure and refactor FMX internals
jareddavison Feb 28, 2026
277c655
Add VCL spell check test project (DUnitX)
jareddavison Feb 28, 2026
cd2b44f
Add VCL spell check tests: Hunspell, Windows provider, and component …
jareddavison Feb 28, 2026
b28d485
Update docs to reflect 186 tests across 16 fixtures
jareddavison Feb 28, 2026
05e67b5
Add VCL tests and shared spell-check infrastructure to docs
jareddavison Feb 28, 2026
c75d3d0
Fix Delphi code folding: procedures fold from header, class var excluded
jareddavison Feb 28, 2026
12a05f0
Add interface/implementation section folding
jareddavison Feb 28, 2026
4985650
Add code folding support to HTML highlighter
jareddavison Feb 28, 2026
a5011d3
Add code folding support to XML highlighter
jareddavison Feb 28, 2026
f7661f1
Add code folding support to CSS highlighter
jareddavison Feb 28, 2026
2fc844b
Update docs to reflect 277 tests and highlighter folding support
jareddavison Feb 28, 2026
5bb5ec0
Update What's New with 277 tests and highlighter folding fixtures
jareddavison Feb 28, 2026
ba326f1
Fix redundant BeginScene/EndScene in completion proposal Paint
jareddavison Feb 28, 2026
e82131f
Fix RecalcSizes subtracting scrollbar size unconditionally
jareddavison Feb 28, 2026
a18f747
Cache GetMaxScrollWidth to avoid O(n) scan on every call
jareddavison Feb 28, 2026
c681ec1
Fix auto-indent to preserve tabs, not just spaces
jareddavison Feb 28, 2026
e18af98
Fix PixelToBufferCoord using Round instead of Trunc
jareddavison Feb 28, 2026
482dd55
Consolidate duplicated color and text measurement utilities
jareddavison Feb 28, 2026
6d3a59f
Update readme test count to match actual 277 tests across 22 fixtures
jareddavison Feb 28, 2026
fd6e631
Harden scrollbar visibility handling in RecalcSizes
jareddavison Feb 28, 2026
86bfa97
Add regression tests for auto-indent, PixelToBufferCoord, and scrollbar
jareddavison Feb 28, 2026
ca08ab8
Update docs to reflect 288 tests across 25 fixtures
jareddavison Feb 28, 2026
1f77526
Fix bugs in print, undo redo, and spell check
jareddavison Feb 28, 2026
a996fc1
Remove dead code and fix print header alignment
jareddavison Feb 28, 2026
658d89f
Add tests for redo caret position and spell check selection
jareddavison Feb 28, 2026
eedfe0f
Update docs to reflect 290 tests across 25 fixtures
jareddavison Feb 28, 2026
a9a636f
Update docs to reflect 290 tests across 25 fixtures
jareddavison Feb 28, 2026
27d2dda
Fix cross-platform issues in FMX editor (issues 12-15)
jareddavison Feb 28, 2026
5448a43
Update docs to reflect 299 tests across 26 fixtures
jareddavison Feb 28, 2026
9e9ab8c
Add FMX word wrap support (mutually exclusive with code folding)
jareddavison Feb 28, 2026
31bf2d1
Update docs to reflect 319 tests across 27 fixtures
jareddavison Feb 28, 2026
410449d
Add FMX bookmark support (Ctrl+1-9 goto, Ctrl+Shift+1-9 set/toggle)
jareddavison Feb 28, 2026
50176fe
Add FMX extensible gutter band architecture
jareddavison Feb 28, 2026
018082d
Add gutter click to clear bookmarks (FMX and VCL)
jareddavison Feb 28, 2026
dab6f15
Update docs to reflect 349 tests across 28 fixtures
jareddavison Feb 28, 2026
e452d44
Extract shared TSynSelectionsBase for multi-caret support
jareddavison Feb 28, 2026
aaa32d5
Refactor VCL TSynSelections to inherit TSynSelectionsBase
jareddavison Feb 28, 2026
7aa25b7
Add FMX multi-caret and column selection support
jareddavison Feb 28, 2026
c1ca91b
Add FMX multi-caret tests (17 tests, 366 total)
jareddavison Feb 28, 2026
3b8a115
Update docs to reflect 366 tests across 29 fixtures
jareddavison Feb 28, 2026
5446106
Move TSynSelectedColor to shared SynEditTypes.pas
jareddavison Feb 28, 2026
9cc6f29
Add ColumnSelectionStart and ForEachSelection to TSynSelectionsBase
jareddavison Feb 28, 2026
2143df5
Extract shared undo base class into SynEditUndoShared.pas
jareddavison Feb 28, 2026
ccf6b1b
Move Architecture.md to Doc/ folder
jareddavison Feb 28, 2026
24bef7a
Rename SynEditKeyConst → SynEditKeyConstShared to fix scope collision
jareddavison Mar 1, 2026
ba123aa
Rename SynUnicode → SynUnicodeShared to fix scope collision
jareddavison Mar 1, 2026
0e21706
Rename Vcl/FMX.SynEditTypes → SynEditScrollTypes to fix scope collision
jareddavison Mar 1, 2026
e539d60
Fix broken What's New.md link in README (case mismatch)
jareddavison Mar 2, 2026
830fd2c
Update docs to reflect unit renames and new shared units
jareddavison Mar 2, 2026
4b9bb4b
Add shared drag-drop units (SynEditDragDropShared, SynEditDragDropWin)
jareddavison Mar 3, 2026
9124d80
Refactor VCL drag-drop units to use shared building blocks
jareddavison Mar 3, 2026
9674d56
Implement FMX OLE drag-and-drop support
jareddavison Mar 3, 2026
0ce2518
Add drag-drop tests (shared helper + FMX integration)
jareddavison Mar 3, 2026
eaea14f
Fix VCL EditAppSDI search paths after demo directory reorganization
jareddavison Mar 3, 2026
f5a8b08
Update docs to reflect FMX drag-drop support and new test counts
jareddavison Mar 3, 2026
9b7b18e
Add VCL drag-drop integration tests (17 tests)
jareddavison Mar 3, 2026
d285949
Add "What's Missing" section to FMX documentation
jareddavison Mar 3, 2026
27d29cf
Fix FMX caret and selection not updating visually on keyboard input
jareddavison Mar 3, 2026
fd99f1f
Add macro recording and playback for FMX with shared event architecture
jareddavison Mar 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,18 @@ __recovery/

Packages/Sydney/CBuilder/Win64/
Packages/Sydney/cpp/
*.o
*.a
*.d

# Dev-only scripts #
####################
build.bat
build_verbose.bat
build_cpp.bat
build_cpp_verbose.bat
build_cpp_delphi_only.bat
build_cpp_group.bat
build_cpp_win64_test.bat
build.ps1
check_env.bat
Empty file added Demos/FMX/.gitkeep
Empty file.
13 changes: 13 additions & 0 deletions Demos/FMX/EditApp/FMXEditApp.dpr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
program FMXEditApp;

uses
System.StartUpCopy,
FMX.Forms,
uFMXEditAppMain in 'uFMXEditAppMain.pas' {FMXEditAppForm},
uHighlighterProcs in '..\..\uHighlighterProcs.pas';

begin
Application.Initialize;
Application.CreateForm(TFMXEditAppForm, FMXEditAppForm);
Application.Run;
end.
106 changes: 106 additions & 0 deletions Demos/FMX/EditApp/FMXEditApp.dproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Base>True</Base>
<AppType>Application</AppType>
<Config Condition="'$(Config)'==''">Debug</Config>
<DCC_DCCCompiler>DCC32</DCC_DCCCompiler>
<FrameworkType>FMX</FrameworkType>
<MainSource>FMXEditApp.dpr</MainSource>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
<ProjectGuid>{B2C3D4E5-F6A7-8901-BCDE-F12345678901}</ProjectGuid>
<ProjectName Condition="'$(ProjectName)'==''">FMXEditApp</ProjectName>
<ProjectVersion>20.3</ProjectVersion>
<TargetedPlatforms>3</TargetedPlatforms>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<SanitizedProjectName>FMXEditApp</SanitizedProjectName>
<DCC_DcuOutput>..\dcu\$(Platform)\$(Config)\</DCC_DcuOutput>
<DCC_ExeOutput>..\bin\$(Platform)\$(Config)\</DCC_ExeOutput>
<DCC_Define>SYN_SHARED;$(DCC_Define)</DCC_Define>
<DCC_Namespace>FMX;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
<DCC_UnitSearchPath>..\..\..\Source;..\..\..\Source\FMX;..\..\..\Source\Highlighters;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<BT_BuildType>Debug</BT_BuildType>
<DCC_Namespace>System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<BT_BuildType>Debug</BT_BuildType>
<DCC_Namespace>System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_DebugInformation>0</DCC_DebugInformation>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="uFMXEditAppMain.pas">
<Form>FMXEditAppForm</Form>
<FormType>fmx</FormType>
</DCCReference>
<DCCReference Include="..\..\uHighlighterProcs.pas"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType>Application</Borland.ProjectType>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">FMXEditApp.dpr</Source>
</Source>
</Delphi.Personality>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">True</Platform>
</Platforms>
</BorlandProject>
</ProjectExtensions>
</Project>
124 changes: 124 additions & 0 deletions Demos/FMX/EditApp/uFMXEditAppMain.fmx
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
object FMXEditAppForm: TFMXEditAppForm
Left = 0
Top = 0
Caption = 'Untitled - SynEdit FMX'
ClientHeight = 600
ClientWidth = 900
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnCreate = FormCreate
DesignerMasterStyle = 0
object MenuBar1: TMenuBar
Size.Width = 900.000000000000000000
Size.Height = 25.000000000000000000
Size.PlatformDefault = False
object MenuFile: TMenuItem
Text = 'File'
object MenuNew: TMenuItem
Text = 'New'
ShortCut = 16462
OnClick = MenuNewClick
end
object MenuOpen: TMenuItem
Text = 'Open...'
ShortCut = 16463
OnClick = MenuOpenClick
end
object MenuSave: TMenuItem
Text = 'Save'
ShortCut = 16467
OnClick = MenuSaveClick
end
object MenuSaveAs: TMenuItem
Text = 'Save As...'
OnClick = MenuSaveAsClick
end
object MenuSep1: TMenuItem
Text = '-'
end
object MenuExit: TMenuItem
Text = 'Exit'
ShortCut = 32883
OnClick = MenuExitClick
end
end
object MenuEdit: TMenuItem
Text = 'Edit'
object MenuUndo: TMenuItem
Text = 'Undo'
ShortCut = 16474
OnClick = MenuUndoClick
end
object MenuRedo: TMenuItem
Text = 'Redo'
ShortCut = 24666
OnClick = MenuRedoClick
end
object MenuSep2: TMenuItem
Text = '-'
end
object MenuCut: TMenuItem
Text = 'Cut'
ShortCut = 16472
OnClick = MenuCutClick
end
object MenuCopy: TMenuItem
Text = 'Copy'
ShortCut = 16451
OnClick = MenuCopyClick
end
object MenuPaste: TMenuItem
Text = 'Paste'
ShortCut = 16470
OnClick = MenuPasteClick
end
object MenuSep3: TMenuItem
Text = '-'
end
object MenuSelectAll: TMenuItem
Text = 'Select All'
ShortCut = 16449
OnClick = MenuSelectAllClick
end
end
end
object PanelStatus: TPanel
Align = Bottom
Position.Y = 575.000000000000000000
Size.Width = 900.000000000000000000
Size.Height = 25.000000000000000000
Size.PlatformDefault = False
object LabelPos: TLabel
Align = Left
Size.Width = 200.000000000000000000
Size.Height = 25.000000000000000000
Size.PlatformDefault = False
TextSettings.HorzAlign = Leading
Margins.Left = 8.000000000000000000
Text = 'Ln: 1 Col: 1'
end
object LabelInsert: TLabel
Align = Left
Size.Width = 100.000000000000000000
Size.Height = 25.000000000000000000
Size.PlatformDefault = False
TextSettings.HorzAlign = Center
Text = 'Insert'
end
object LabelModified: TLabel
Align = Left
Size.Width = 100.000000000000000000
Size.Height = 25.000000000000000000
Size.PlatformDefault = False
TextSettings.HorzAlign = Center
Text = ''
end
end
object OpenDialog1: TOpenDialog
Filter = 'All Files (*.*)|*.*'
end
object SaveDialog1: TSaveDialog
Filter = 'All Files (*.*)|*.*'
end
end
Loading