This commit is contained in:
Basile Burg 2014-07-18 06:36:27 +02:00
parent 3b2b8362fc
commit 305d64f6d9
16 changed files with 720 additions and 305 deletions

View File

@ -114,22 +114,25 @@
<FormatVersion Value="1"/> <FormatVersion Value="1"/>
</local> </local>
</RunParams> </RunParams>
<RequiredPackages Count="5"> <RequiredPackages Count="6">
<Item1> <Item1>
<PackageName Value="FCL"/> <PackageName Value="AnchorDocking"/>
</Item1> </Item1>
<Item2> <Item2>
<PackageName Value="RunTimeTypeInfoControls"/> <PackageName Value="FCL"/>
</Item2> </Item2>
<Item3> <Item3>
<PackageName Value="SynEdit"/> <PackageName Value="RunTimeTypeInfoControls"/>
</Item3> </Item3>
<Item4> <Item4>
<PackageName Value="LazControls"/> <PackageName Value="SynEdit"/>
</Item4> </Item4>
<Item5> <Item5>
<PackageName Value="LCL"/> <PackageName Value="LazControls"/>
</Item5> </Item5>
<Item6>
<PackageName Value="LCL"/>
</Item6>
</RequiredPackages> </RequiredPackages>
<Units Count="17"> <Units Count="17">
<Unit0> <Unit0>

View File

@ -6,17 +6,18 @@ uses
{$IFDEF UNIX}{$IFDEF UseCThreads} {$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads, cthreads,
{$ENDIF}{$ENDIF} {$ENDIF}{$ENDIF}
Interfaces, Forms, lazcontrols, runtimetypeinfocontrols, ce_widget, Interfaces, Forms, lazcontrols, runtimetypeinfocontrols, anchordockpkg,
ce_dmdwrap, ce_common, ce_synmemo, ce_main, ce_messages, ce_editor, AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg,
ce_projinspect, ce_projconf, jsonparser, ce_project, ce_widget, ce_dmdwrap, ce_common, ce_synmemo, ce_main, ce_messages, ce_editor,
ce_widgettypes, ce_staticexplorer, ce_search, ce_dlang, ce_dlangutils; ce_projinspect, ce_projconf, jsonparser, ce_project, ce_widgettypes,
ce_staticexplorer, ce_search, ce_dlang, ce_dlangutils;
{$R *.res} {$R *.res}
begin begin
RequireDerivedFormResource := True; RequireDerivedFormResource := True;
Application.Initialize; Application.Initialize;
Application.CreateForm(TCEMainForm, mainForm); Application.CreateForm(TCEMainForm, CEMainForm);
Application.Run; Application.Run;
end. end.

View File

@ -5,7 +5,11 @@ unit ce_common;
interface interface
uses uses
Classes, SysUtils, ActnList, dialogs, forms, process; Classes, SysUtils,
{$IFDEF WINDOWS}
Windows,
{$ENDIF}
ActnList, dialogs, forms, process;
const const
@ -40,6 +44,8 @@ type
TMRUFileList = class(TMRUList) TMRUFileList = class(TMRUList)
protected protected
function checkItem(const S: string): boolean; override; function checkItem(const S: string): boolean; override;
public
procedure assign(src: TPersistent); override;
end; end;
(** (**
@ -107,6 +113,11 @@ type
*) *)
function shortenPath(const aPath: string; charThresh: Word = 80): string; function shortenPath(const aPath: string; charThresh: Word = 80): string;
(**
* Returns the folder Coedit documents and settings.
*)
function getDocPath: string;
implementation implementation
procedure TProcessEx.Assign(aValue: TPersistent); procedure TProcessEx.Assign(aValue: TPersistent);
@ -183,6 +194,15 @@ begin
clearOutOfRange; clearOutOfRange;
end; end;
procedure TMRUFileList.assign(src: TPersistent);
var
i: NativeInt;
begin
inherited;
for i := Count-1 downto 0 do
if not fileExists(Strings[i]) then Delete(i);
end;
function TMRUFileList.checkItem(const S: string): boolean; function TMRUFileList.checkItem(const S: string): boolean;
begin begin
exit( inherited checkItem(S) and fileExists(S)); exit( inherited checkItem(S) and fileExists(S));
@ -390,4 +410,24 @@ begin
exit( format('%s%s...%s',[drv,directorySeparator,pth1]) ); exit( format('%s%s...%s',[drv,directorySeparator,pth1]) );
end; end;
function getDocPath: string;
{$IFDEF WINDOWS}
var
PIDL : PItemIDList;
Folder : array[0..MAX_PATH] of Char;
const
CSIDL_APPDATA = $001A;
{$ENDIF}
begin
{$IFDEF WINDOWS}
SHGetSpecialFolderLocation(0, CSIDL_APPDATA, PIDL);
SHGetPathFromIDList(PIDL, Folder);
result:=Folder;
{$ENDIF}
{$IFDEF UNIX}
result := ExpandFileName('~/'));
{$ENDIF}
result += directorySeparator + 'Coedit' + directorySeparator;
end;
end. end.

View File

@ -8,8 +8,8 @@ uses
Classes, SysUtils, FileUtil, ExtendedNotebook, Forms, Controls, lcltype, Classes, SysUtils, FileUtil, ExtendedNotebook, Forms, Controls, lcltype,
Graphics, SynEditKeyCmds, ComCtrls, SynEditHighlighter, ExtCtrls, Menus, Graphics, SynEditKeyCmds, ComCtrls, SynEditHighlighter, ExtCtrls, Menus,
SynEditHighlighterFoldBase, SynMacroRecorder, SynPluginSyncroEdit, SynEdit, SynEditHighlighterFoldBase, SynMacroRecorder, SynPluginSyncroEdit, SynEdit,
SynHighlighterLFM, ce_widget, ce_d2syn, ce_synmemo, ce_common, AnchorDocking, SynHighlighterLFM, AnchorDocking, ce_widget, ce_d2syn, ce_synmemo, ce_dlang,
ce_dlang, ce_project; ce_project;
type type
{ TCEEditorWidget } { TCEEditorWidget }
@ -67,7 +67,6 @@ var
bmp: TBitmap; bmp: TBitmap;
begin begin
inherited; inherited;
fID := 'ID_EDIT';
// //
tokLst := TLexTokenList.Create; tokLst := TLexTokenList.Create;
errLst := TLexErrorList.Create; errLst := TLexErrorList.Create;
@ -80,7 +79,6 @@ begin
finally finally
bmp.Free; bmp.Free;
end; end;
DockMaster.GetAnchorSite(Self).Name := ID;
end; end;
destructor TCEEditorWidget.destroy; destructor TCEEditorWidget.destroy;
@ -122,7 +120,7 @@ begin
fSyncEdit.Editor := curr; fSyncEdit.Editor := curr;
// //
if pageControl.ActivePageIndex <> -1 then if pageControl.ActivePageIndex <> -1 then
mainForm.docFocusedNotify(Self, pageControl.ActivePageIndex); CEMainForm.docFocusedNotify(Self, pageControl.ActivePageIndex);
// //
if (pageControl.ActivePage.Caption = '') then if (pageControl.ActivePage.Caption = '') then
begin begin
@ -139,8 +137,8 @@ end;
procedure TCEEditorWidget.PageControlCloseTabClicked(Sender: TObject); procedure TCEEditorWidget.PageControlCloseTabClicked(Sender: TObject);
begin begin
// closeBtn not implemented // closeBtn not implemented (Win.)
mainForm.actFileClose.Execute; CEMainForm.actFileClose.Execute;
end; end;
procedure TCEEditorWidget.addEditor; procedure TCEEditorWidget.addEditor;
@ -158,9 +156,7 @@ begin
memo.OnKeyUp := @memoKeyDown; memo.OnKeyUp := @memoKeyDown;
memo.OnKeyPress := @memoKeyPress; memo.OnKeyPress := @memoKeyPress;
memo.OnMouseDown := @memoMouseDown; memo.OnMouseDown := @memoMouseDown;
memo.OnChange := @memoChange;
// http://forum.lazarus.freepascal.org/index.php/topic,25213.0.html
//memo.OnChange := @memoChange;
memo.OnMouseMove := @memoMouseMove; memo.OnMouseMove := @memoMouseMove;
// //
@ -172,7 +168,7 @@ end;
procedure TCEEditorWidget.removeEditor(const aIndex: NativeInt); procedure TCEEditorWidget.removeEditor(const aIndex: NativeInt);
begin begin
mainForm.MessageWidget.ClearMessages(msEditor); CEMainForm.MessageWidget.ClearMessages(msEditor);
editor[aIndex].OnChange:= nil; editor[aIndex].OnChange:= nil;
pageControl.Pages[aIndex].Free; pageControl.Pages[aIndex].Free;
end; end;
@ -249,15 +245,15 @@ begin
if not fKeyChanged then exit; if not fKeyChanged then exit;
// //
fKeyChanged := false; fKeyChanged := false;
mainForm.docChangeNotify(Self, editorIndex); CEMainForm.docChangeNotify(Self, editorIndex);
if ed.Lines.Count = 0 then exit; if ed.Lines.Count = 0 then exit;
// //
mainForm.MessageWidget.ClearMessages(msEditor); CEMainForm.MessageWidget.ClearMessages(msEditor);
lex( ed.Lines.Text, tokLst ); lex(ed.Lines.Text, tokLst);
checkSyntacticErrors( tokLst, errLst); checkSyntacticErrors(tokLst, errLst);
for err in errLst do for err in errLst do
mainForm.MessageWidget.addMessage(format( '%s (@line:%4.d @char:%.4d)', CEMainForm.MessageWidget.addMessage(format( '%s (@line:%4.d @char:%.4d)',
[err.msg, err.position.y, err.position.x]), msEditor); [err.msg, err.position.y, err.position.x]), msEditor);
md := ''; md := '';
@ -266,7 +262,7 @@ begin
if md = '' then md := extractFileName(ed.fileName); if md = '' then md := extractFileName(ed.fileName);
pageControl.ActivePage.Caption := md; pageControl.ActivePage.Caption := md;
mainForm.MessageWidget.scrollToBack; CEMainForm.MessageWidget.scrollToBack;
tokLst.Clear; tokLst.Clear;
errLst.Clear; errLst.Clear;
end; end;

View File

@ -1,16 +1,14 @@
object CEMainForm: TCEMainForm object CEMainForm: TCEMainForm
Left = 1435 Left = 1071
Height = 53 Height = 49
Top = 140 Top = 187
Width = 745 Width = 745
AllowDropFiles = True AllowDropFiles = True
Caption = 'Coedit' Caption = 'Coedit'
ChildSizing.Layout = cclTopToBottomThenLeftToRight ChildSizing.Layout = cclLeftToRightThenTopToBottom
DockSite = True
Menu = mainMenu Menu = mainMenu
OnCloseQuery = FormCloseQuery OnCloseQuery = FormCloseQuery
OnDropFiles = FormDropFiles OnDropFiles = FormDropFiles
Position = poMainFormCenter
ShowHint = True ShowHint = True
LCLVersion = '1.2.4.0' LCLVersion = '1.2.4.0'
object mainMenu: TMainMenu object mainMenu: TMainMenu
@ -824,9 +822,81 @@ object CEMainForm: TCEMainForm
end end
object MenuItem57: TMenuItem object MenuItem57: TMenuItem
Action = actEdFind Action = actEdFind
Bitmap.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000000000000000
0033000000330000003300000033000000330000000000000000000000000000
0000000000330000003300000033000000330000003300000000716F6DC07674
72FF706D6CFF6D6A69FF696765FF666362FF5A5756C0605D5C007E7C7A00716F
6DC0767472FF706D6CFF6D6A69FF696765FF666362FF5A5756C07A7876FF817E
7DFF9C9996FF898583FF716F6CFF595756FF605D5CFF605D5C007F7D7B007A78
76FF817E7DFF9C9996FF898583FF716F6CFF595756FF615E5DFF777573FFCFCF
CFFFD9D7D6FFD0CFCEFFC8C8C7FFC3C1C1FF5E5A59FF5F5C5B007E7C7A007775
73FFD0CFCFFFD9D7D6FFD0CFCEFFC8C8C7FFC3C1C1FF5E5B5AFF767472FFB3B1
AFFFCAC9C7FFB0AEADFF91908EFF757472FF5E5A59FF00000033000000337775
73FFB3B1AFFFCAC9C7FFB0AEADFF91908EFF757572FF5F5C5BFF767472FFB3B1
AFFFCAC9C7FFB1AEAEFF939290FF777674FF5E5A59FF7A7876FF646260FF7775
73FFB3B1AFFFCAC9C7FFB1AEAEFF939290FF777674FF605D5CFF767472FFB3B0
AEFFCAC9C7FFB0ADADFF91908EFF757472FF5B5857FF767472FF615F5DFF7674
72FFB3B1AFFFCAC9C7FFB0ADADFF91908EFF757573FF5F5C5BFF777472FFDEDD
DDFFEBEBE9FFDBDAD9FFCAC9C8FFBBBAB9FF575453FFD6D5D3FF8C8B89FF7573
71FFDEDDDCFFEBEBE9FFDBDAD9FFCAC9C8FFBCBCBBFF5E5B5AFF7A7876FF6F6D
6BFF666261FF605D5CFF5E5C5AFF5E5A5AFF4946469BD3D2D0FF8A8987FF6261
5F9B6C6A68FF646160FF625F5EFF615F5DFF615E5DFF615E5DA87B7977007774
73FFBCBAB8FFCDCBCAFFA5A3A2FF7E7C7BFF595655FFD6D5D3FF8C8C89FF7673
72FFBCBAB7FFCCCAC9FFA4A2A1FF7E7C7BFF5F5C5BFF625F5E007B7877007774
73FFB9B7B5FFC9C7C6FFA2A09FFF7D7B7AFF5C5858FF777472FF615F5DFF7774
73FFB9B8B5FFC9C7C6FFA2A09FFF7E7C7BFF605D5CFF63605F007C7978007875
74FFBDBBB9FFCECCCBFFA5A3A2FF7E7C7BFF5E5B5AFF7B7977FF646260FF7976
75FFBCBBB8FFCECCCBFFA6A4A3FF807E7DFF605D5CFF63605F007B7977007978
75AE716E6DFF696665FF64605FFF625E5DFF545251AA7B7A7700656361006A69
67AA6F6C6BFF696665FF676463FF656261FF63605FAE646160007B7977007B79
770000000033787574FFCBCAC7FF9B9A99FF625E5DFF625F5E007D7A79007875
74FFCAC8C6FF989796FF605D5CFF0000003364616000646160007B7977007B79
77007A7976FF908D8CFF908E8CFF656461FF615E5DFF615E5D007D7B79007977
75FF8E8B8AFF918F8DFF686664FF63605FFF64616000646160007B7977007B79
77007B7977FF73716FFF6D6B69FF696665FF625F5EFF615E5D007E7C7A007B79
77FF73716FFF6D6B69FF696665FF63605FFF6461600064616000
}
end end
object MenuItem58: TMenuItem object MenuItem58: TMenuItem
Action = actEdFindNext Action = actEdFindNext
Bitmap.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000000000000000
0033000000330000003300000033000000330000000000000000000000000000
0000000000330000003300000033000000330000003300000000716F6DC07674
72FF706D6CFF6D6A69FF696765FF666362FF5A5756C0605D5C007E7C7A00716F
6DC0767472FF706D6CFF6D6A69FF696765FF666362FF5A5756C07A7876FF817E
7DFF9C9996FF898583FF716F6CFF595756FF605D5CFF605D5C007F7D7B007A78
76FF817E7DFF9C9996FF898583FF716F6CFF595756FF615E5DFF777573FFCFCF
CFFFD9D7D6FFD0CFCEFFC8C8C7FFC3C1C1FF5E5A59FF5F5C5B007E7C7A007775
73FFD0CFCFFFD9D7D6FFD0CFCEFFC8C8C7FFC3C1C1FF5E5B5AFF767472FFB3B1
AFFFCAC9C7FFB0AEADFF91908EFF757472FF5E5A59FF00000033000000337775
73FFB3B1AFFFCAC9C7FFB0AEADFF91908EFF757572FF5F5C5BFF767472FFB3B1
AFFFCAC9C7FFB1AEAEFF939290FF777674FF5E5A59FF7A7876FF646260FF7775
73FFB3B1AFFFCAC9C7FFB1AEAEFF939290FF777674FF605D5CFF767472FFB3B0
AEFFCAC9C7FFB0ADADFF91908EFF757472FF5B5857FF767472FF615F5DFF7674
72FFB3B1AFFFCAC9C7FFB0ADADFF91908EFF757573FF5F5C5BFF777472FFDEDD
DDFFEBEBE9FFDBDAD9FFCAC9C8FFBBBAB9FF575453FFD6D5D3FF8C8B89FF7573
71FFDEDDDCFFEBEBE9FFDBDAD9FFCAC9C8FFBCBCBBFF5E5B5AFF7A7876FF6F6D
6BFF666261FF605D5CFF5E5C5AFF5E5A5AFF4946469BD3D2D0FF8A8987FF6261
5F9B6C6A68FF646160FF625F5EFF615F5DFF615E5DFF615E5DA87B7977007774
73FFBCBAB8FFCDCBCAFFA5A3A2FF7E7C7BFF595655FFD6D5D3FF8C8C89FF7673
72FFBCBAB7FFCCCAC9FFA4A2A1FF7E7C7BFF5F5C5BFF625F5E007B7877007774
73FFB9B7B5FFC9C7C6FFA2A09FFF7D7B7AFF5C5858FF777472FF615F5DFF7774
73FFB9B8B5FFC9C7C6FFA2A09FFF7E7C7BFF605D5CFF63605F007C7978007875
74FFBDBBB9FFCECCCBFFA5A3A2FF7E7C7BFF5E5B5AFF7B7977FF646260FF7976
75FFBCBBB8FFCECCCBFFA6A4A3FF807E7DFF605D5CFF63605F007B7977007978
75AE716E6DFF696665FF64605FFF625E5DFF545251AA7B7A7700656361006A69
67AA6F6C6BFF696665FF676463FF656261FF63605FAE646160007B7977007B79
770000000033787574FFCBCAC7FF9B9A99FF625E5DFF625F5E007D7A79007875
74FFCAC8C6FF989796FF605D5CFF0000003364616000646160007B7977007B79
77007A7976FF908D8CFF908E8CFF656461FF615E5DFF615E5D007D7B79007977
75FF8E8B8AFF918F8DFF686664FF63605FFF64616000646160007B7977007B79
77007B7977FF73716FFF6D6B69FF696665FF625F5EFF615E5D007E7C7A007B79
77FF73716FFF6D6B69FF696665FF63605FFF6461600064616000
}
end end
end end
object MenuItem14: TMenuItem object MenuItem14: TMenuItem
@ -2006,39 +2076,39 @@ object CEMainForm: TCEMainForm
0033000000330000003300000033000000330000003300000033000000330000 0033000000330000003300000033000000330000003300000033000000330000
00330000002C0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF 00330000002C0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00B782187CB78114FFB57E0FFFB57C0BFFB57C
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF 09FFB57C09FFB57C09FFB57C09FFB57C09FFB57C09FFB57C09FFB57C09FFB57C
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF 0BFFB57E0FFFB78114FFB782187CB78115FFFFECCDFFFCE7C3FFFFFFFFFFFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B9851BB0B781 FFFFFCE7C3FFFFECCDFFB78115FFB68012FFFDECD1FFDA8600FFFFFFFFFFF1E5
14FFB57E0FFFB57D0CFFB57C0AFFB57C0AFFB57C0AFFB57D0CFFB57E0FFFB781 D8FFF2E5D8FFF2E5D7FFF0E3D6FFEFE2D5FFF1E4D7FFF1E4D6FFEFE3D6FFFFFF
14FFB9851BB0FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B78114FFFFEC FFFFDA8600FFFDECD1FFB68012FFB68012FFFEE9C6FF714100FFFFFFFFFF7979
CEFFFCE6C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE6C4FFFFEC 7AFF7A7A7AFFA2A1A1FF9F9F9FFFF6ECDEFF777777FFA1A1A1FF9E9FA0FFFFFF
CEFFB78114FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B67F12FFFCEA FFFF704100FFFEE9C6FFB68012FFB68113FFFCE3BCFF9B6104FFFDFCF9FFFDF5
D1FFD88700FFF1F1EEFFB2AFAAFFB4B0A9FFB2AFAAFFF1F1EEFFD88700FFFCEA E8FFFEF4E7FFFBF2E5FFFCF2E5FFFBF2E5FFFBF2E5FFFAF1E3FFF9F1E5FFFCFA
D1FFB67F12FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B68012FFF8E3 F7FF9A6104FFFCE3BCFFB68113FFB68014FFF8DCB0FFE0981CFFFBFBF8FF7978
BFFFDD9112FFEFEDE9FFF2EBE0FFF4EBDFFFF2EBE0FFEFEDE9FFDD9112FFF8E3 7BFFA2A0A2FFFCF6EAFF797879FFA3A1A3FFA09FA1FFFAF4E9FF9D9DA0FFF9F9
BFFFB68012FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B68014FFF7DB F6FFE0981CFFF8DCB0FFB68014FFB68014FFF6D8A7FFE09C27FFFBFFFFFFFCFB
B0FFE09925FFEEE9E8FFB1AAA4FFB2AAA2FFB1AAA4FFEEE9E8FFE09925FFF7DB F3FFFCF9EFFFFBF8EEFFFCFAF0FFFCFAF0FFFBF9EEFFF9F8EDFFFAF9F1FFFAFE
B0FFB68014FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B68114FFF4D5 FEFFE09B27FFF6D8A7FFB68014FFB68114FFF4D4A0FFE1A136FFF2DEB7FFFCFF
A2FFE2A237FFE8CCA4FFECE4E0FFEDE3DDFFECE4E0FFE8CCA4FFE2A237FFF4D5 FFFFFBFFFDFFFBFFFCFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFDFFFBFFFFFFF2DE
A2FFB68114FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B68115FFF3D1 B7FFE1A136FFF4D4A0FFB68114FFB68115FFF3D09AFFE5A845FFE3A640FFE2A1
99FFE5AB47FFE5A840FFE5A538FFE4A435FFE4A538FFE4A840FFE5AA47FFF3D1 36FFE29E2FFFE19D2DFFE19D2CFFE19D2CFFE19D2DFFE29E2FFFE2A136FFE3A6
99FFB68115FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B68115FFF3CD 40FFE5A845FFF3D09AFFB68115FFB68115FFF3CE94FFE6AE51FFE5AB4BFFE6C9
90FFE7B052FFEACFABFFFFFFFFFFFCFDFFFFFBFDFFFFE7CDA9FFE7AF52FFF3CD A4FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFDFFFFFFFEFFFFFFE6C9A4FFE5AC
90FFB68115FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B68116FFF3CB 4BFFE6AE51FFF3CE94FFB68115FFB68116FFF3CC8EFFE8B25AFFE7AE51FFFCFF
8AFFECB760FFF2EDECFF7F7977FFF1E8DFFFEDE5DEFFEDE8E8FFEBB65FFFF3CB FFFFECE0D7FFF1E4DAFFF1E5DAFFEDE0D5FFEADDD3FFE9DED5FFFBFFFFFFE7AE
8AFFB68116FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B78218FFF6CD 51FFE8B25AFFF3CC8EFFB68116FFB68116FFF1CB89FFE9B762FFE7B257FFF9F8
8BFFF2C476FFF9FCFFFF8B8D90FFF8F9F7FFF4F5F5FFF4F7FBFFF2C375FFF6CD FBFFFDF7F2FF877F79FF4A4441FFFEF7F2FFEEE3D8FFEDE2D9FFF8F7FBFFE8B2
8BFFB78218FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B7831CF2B782 57FFE9B762FFF1CB89FFB68116FFB68116FFF3CA87FFEDBC6DFFEBB761FFF8F5
18FFB68114FFB88010FFB9810FFFB87F0DFFB67E0CFFB67E0EFFB68013FFB782 F7FFFFFFFFFF4A4541FF948C88FFFFFFFFFFF1E8E0FFF0E7E0FFF7F4F7FFEBB7
18FFB7831CF2FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000300000 61FFEDBC6DFFF3CA87FFB68116FFB78218FFF6CD8BFFF2C67DFFF0C171FFFAF7
0033000000330000003300000033000000330000003300000033000000330000 FBFFFFFFFFFF4C4848FF989392FFFFFFFFFFF7EFEAFFF6EFEBFFF9F6FAFFF0C1
003300000030FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF 71FFF2C67DFFF6CD8BFFB78218FF976C1496B78218FFB68014FFB37A06FFD7CF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF D2FFD8CEC9FF6C676653593A0053D9CFCEFFD5CAC3FFD4CAC4FFD6CFD2FFB37A
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF 06FFB68014FFB78218FF976C1496000000000000003300000033000000330000
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF 0033000000330000000800000008000000330000003300000033000000330000
FF00FFFFFF00FFFFFF00FFFFFF00B3B3B1EFB0B0ADFFAEAEACFFAEAEABFFADAD 0033000000330000003300000000B3B3B1EFB0B0ADFFAEAEACFFAEAEABFFADAD
ABFFAEAEABFFAFAFADFFB0B0AED5000000000000000000000000000000000000 ABFFAEAEABFFAFAFADFFB0B0AED5000000000000000000000000000000000000
0000000000000000000000000000AFAFADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000000000000000000000000000AFAFADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFE9E9E9FFAFAFADA70000000000000000000000000000 FFFFFFFFFFFFFFFFFFFFE9E9E9FFAFAFADA70000000000000000000000000000

View File

@ -7,7 +7,7 @@ interface
uses uses
Classes, SysUtils, FileUtil, SynEditKeyCmds, SynHighlighterLFM, Forms, Classes, SysUtils, FileUtil, SynEditKeyCmds, SynHighlighterLFM, Forms,
AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg, Controls, Graphics, AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg, Controls, Graphics,
Dialogs, Menus, ActnList, ExtCtrls, process, XMLPropStorage, asyncprocess, Dialogs, Menus, ActnList, ExtCtrls, process, XMLPropStorage, ComCtrls,
ce_common, ce_dmdwrap, ce_project, ce_synmemo, ce_widget, ce_messages, ce_common, ce_dmdwrap, ce_project, ce_synmemo, ce_widget, ce_messages,
ce_editor, ce_projinspect, ce_projconf, ce_staticexplorer, ce_search; ce_editor, ce_projinspect, ce_projconf, ce_staticexplorer, ce_search;
@ -19,17 +19,21 @@ type
//TODO-cwidget: options editor //TODO-cwidget: options editor
(** (**
* Encapsulates the options in a writable component. * Encapsulates the options in a writable component.
* note: likely to change however needed to test correctly Coedit.
*) *)
TCEOptions = class(TComponent) TCEOptions = class(TComponent)
private private
fFileMru, fProjMru: TMruFileList; fFileMru, fProjMru: TMruFileList;
fWidgUpdDel, fWidgUpdPer: Integer;
fLeft, FTop, fWidth, fHeight: Integer; fLeft, FTop, fWidth, fHeight: Integer;
fErrorFlg: boolean;
procedure setFileMru(aValue: TMruFileList); procedure setFileMru(aValue: TMruFileList);
procedure setProjMru(aValue: TMruFileList); procedure setProjMru(aValue: TMruFileList);
procedure saveLayout(str: TStream); procedure saveLayout(str: TStream);
procedure loadLayout(str: TStream); procedure loadLayout(str: TStream);
//
procedure readerPropNoFound(Reader: TReader; Instance: TPersistent;
var PropName: string; IsPath: boolean; var Handled, Skip: Boolean);
procedure readerError(Reader: TReader; const Message: string;
var Handled: Boolean);
published published
property APP_Left: Integer read fLeft write fLeft; property APP_Left: Integer read fLeft write fLeft;
property APP_Top: Integer read fTop write fTop; property APP_Top: Integer read fTop write fTop;
@ -38,17 +42,16 @@ type
// //
property MRU_Files: TMruFileList read fFileMru write setFileMru; property MRU_Files: TMruFileList read fFileMru write setFileMru;
property MRU_Projects: TMruFileList read fProjMru write setProjMru; property MRU_Projects: TMruFileList read fProjMru write setProjMru;
//
property WIDG_UpdateDelay: Integer read fWidgUpdDel write fWidgUpdDel;
property WIDG_UpdatePeriod: Integer read fWidgUpdPer write fWidgUpdPer;
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
procedure defineProperties(Filer: TFiler); override;
procedure saveToFile(const aFilename: string); procedure saveToFile(const aFilename: string);
procedure loadFromFile(const aFilename: string); procedure loadFromFile(const aFilename: string);
procedure beforeSave; procedure beforeSave;
procedure afterLoad; procedure afterLoad;
procedure DefineProperties(Filer: TFiler); override; //
property hasLoaded: boolean read fErrorFlg;
end; end;
{ TCEMainForm } { TCEMainForm }
@ -204,6 +207,14 @@ type
fProjMru: TMruFileList; fProjMru: TMruFileList;
fFileMru: TMruFileList; fFileMru: TMruFileList;
//Init - Fina
procedure InitMRUs;
procedure InitWidgets;
procedure InitDocking;
procedure InitSettings;
procedure SaveSettings;
procedure SaveDocking;
// widget interfaces subroutines // widget interfaces subroutines
procedure checkWidgetActions(const aWidget: TCEWidget); procedure checkWidgetActions(const aWidget: TCEWidget);
procedure widgetShowFromAction(sender: TObject); procedure widgetShowFromAction(sender: TObject);
@ -239,6 +250,8 @@ type
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
procedure DockMasterCreateControl(Sender: TObject; aName: string; var
AControl: TControl; DoDisableAutoSizing: boolean);
// //
procedure openFile(const aFilename: string); procedure openFile(const aFilename: string);
procedure docChangeNotify(Sender: TObject; const aIndex: Integer); procedure docChangeNotify(Sender: TObject; const aIndex: Integer);
@ -252,7 +265,7 @@ type
end; end;
var var
mainForm: TCEMainForm; CEMainForm: TCEMainForm;
implementation implementation
{$R *.lfm} {$R *.lfm}
@ -260,23 +273,34 @@ implementation
uses uses
SynMacroRecorder; SynMacroRecorder;
{$REGION std comp methods ******************************************************} {$REGION Standard Comp/Obj------------------------------------------------------}
constructor TCEMainForm.create(aOwner: TComponent); constructor TCEMainForm.create(aOwner: TComponent);
var
act: TAction;
itm: TMenuItem;
widg: TCEWidget;
opts: TCEOptions;
begin begin
inherited create(aOwner); inherited create(aOwner);
InitMRUs;
InitWidgets;
InitDocking;
InitSettings;
// //
newProj;
end;
procedure TCEMainForm.InitMRUs;
begin
fProjMru := TMruFileList.Create; fProjMru := TMruFileList.Create;
fFileMru := TMruFileList.Create; fFileMru := TMruFileList.Create;
fProjMru.objectTag := mnuItemMruProj; fProjMru.objectTag := mnuItemMruProj;
fFileMru.objectTag := mnuItemMruFile; fFileMru.objectTag := mnuItemMruFile;
fProjMru.OnChange := @mruChange; fProjMru.OnChange := @mruChange;
fFileMru.OnChange := @mruChange; fFileMru.OnChange := @mruChange;
// end;
procedure TCEMainForm.InitWidgets;
var
widg: TCEWidget;
act: TAction;
itm: TMenuItem;
begin
fWidgList := TCEWidgetList.Create; fWidgList := TCEWidgetList.Create;
fMesgWidg := TCEMessagesWidget.create(nil); fMesgWidg := TCEMessagesWidget.create(nil);
fEditWidg := TCEEditorWidget.create(nil); fEditWidg := TCEEditorWidget.create(nil);
@ -304,47 +328,101 @@ begin
itm.Action := act; itm.Action := act;
itm.Tag := ptrInt(widg); itm.Tag := ptrInt(widg);
mnuItemWin.Add(itm); mnuItemWin.Add(itm);
widg.Show
end; end;
end;
Height := 0; procedure TCEMainForm.InitDocking;
DockMaster.MakeDockSite(Self, [akBottom], admrpChild, true); var
i: NativeInt;
aManager: TAnchorDockManager;
begin
DockMaster.MakeDockSite(Self, [akBottom], admrpChild);
DockMaster.OnCreateControl := @DockMasterCreateControl;
DockMaster.OnShowOptions := @ShowAnchorDockOptions; DockMaster.OnShowOptions := @ShowAnchorDockOptions;
DockMaster.HeaderStyle := adhsPoints; DockMaster.HeaderStyle := adhsPoints;
DockMaster.ManualDock(DockMaster.GetAnchorSite(fEditWidg), Self, alBottom); if DockManager is TAnchorDockManager then begin
DockMaster.ManualDock(DockMaster.GetAnchorSite(fMesgWidg), Self, alBottom); aManager:=TAnchorDockManager(DockManager);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fStExpWidg), Self, alLeft); aManager.PreferredSiteSizeAsSiteMinimum:=false;
end;
Height := 0;
for i := 0 to fWidgList.Count-1 do
begin
DockMaster.MakeDockable(fWidgList.widget[i],true);
DockMaster.GetAnchorSite(fWidgList.widget[i]).Header.HeaderPosition := adlhpTop;
end;
DockMaster.ManualDock(DockMaster.GetAnchorSite(fEditWidg), DockMaster.GetSite(Self), alBottom);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fMesgWidg), DockMaster.GetSite(Self), alBottom);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fStExpWidg), DockMaster.GetSite(Self), alLeft);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fFindWidg), DockMaster.ManualDock(DockMaster.GetAnchorSite(fFindWidg),
DockMaster.GetAnchorSite(fStExpWidg), alBottom, fStExpWidg); DockMaster.GetAnchorSite(fStExpWidg), alBottom, fStExpWidg);
width := width - fProjWidg.Width; width := width - fProjWidg.Width;
DockMaster.ManualDock(DockMaster.GetAnchorSite(fProjWidg), Self, alRight); DockMaster.ManualDock(DockMaster.GetAnchorSite(fProjWidg), DockMaster.GetSite(Self), alRight);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fPrjCfWidg), DockMaster.ManualDock(DockMaster.GetAnchorSite(fPrjCfWidg),
DockMaster.GetAnchorSite(fProjWidg), alBottom, fProjWidg); DockMaster.GetAnchorSite(fProjWidg), alBottom, fProjWidg);
DockMaster.GetAnchorSite(fEditWidg).Header.HeaderPosition := adlhpTop; DockMaster.GetAnchorSite(fEditWidg).Header.HeaderPosition := adlhpTop;
//
SaveDocking;
end;
newProj; procedure TCEMainForm.InitSettings;
var
fname1: string;
fname2: string;
opts: TCEOptions;
begin
fname1 := getDocPath + 'options.txt';
fname2 := getDocPath + 'options.bak';
opts := TCEOptions.create(nil); opts := TCEOptions.create(nil);
try try
if fileExists('temp_coedit_options.txt') then if fileExists(fname1) then
opts.loadFromFile('temp_coedit_options.txt'); begin
opts.loadFromFile(fname1);
if opts.hasLoaded then
begin
if fileExists(fname2) then
deleteFile(fname2);
if not fileExists(fname2) then
copyFile(fname1, fname2, false);
end;
end;
finally finally
opts.Free; opts.Free;
end; end;
end; end;
destructor TCEMainForm.destroy; procedure TCEMainForm.SaveSettings;
var var
opts: TCEOptions; opts: TCEOptions;
begin begin
opts := TCEOptions.create(nil); opts := TCEOptions.create(nil);
try try
opts.saveToFile('temp_coedit_options.txt'); forceDirectory(getDocPath);
opts.saveToFile(getDocPath + 'options.txt');
finally finally
opts.Free; opts.Free;
end; end;
end;
procedure TCEMainForm.SaveDocking;
var
xcfg: TXMLConfigStorage;
begin
xcfg := TXMLConfigStorage.Create(getDocPath + 'docking.xml',true);
try
// <Item1 Name="CEMainForm" Type="CustomSite" ChildCount="..."> is always missing
DockMaster.SaveLayoutToConfig(xcfg);
xcfg.WriteToDisk;
finally
xcfg.Free;
end;
end;
destructor TCEMainForm.destroy;
begin
SaveSettings;
SaveDocking;
// //
fWidgList.Free; fWidgList.Free;
fMesgWidg.Free; fMesgWidg.Free;
@ -538,7 +616,7 @@ begin
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION file ******************************************************************} {$REGION file ------------------------------------------------------------------}
procedure TCEMainForm.newFile; procedure TCEMainForm.newFile;
begin begin
if fEditWidg = nil then exit; if fEditWidg = nil then exit;
@ -740,7 +818,7 @@ begin
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION edit ******************************************************************} {$REGION edit ------------------------------------------------------------------}
procedure TCEMainForm.actEdCopyExecute(Sender: TObject); procedure TCEMainForm.actEdCopyExecute(Sender: TObject);
var var
curr: TCESynMemo; curr: TCESynMemo;
@ -844,7 +922,7 @@ end;
{$ENDREGION} {$ENDREGION}
{$REGION run ******************************************************************} {$REGION run -------------------------------------------------------------------}
procedure TCEMainForm.ProcessOutputToMsg(const aProcess: TProcess; aCtxt: TMessageContext = msUnknown); procedure TCEMainForm.ProcessOutputToMsg(const aProcess: TProcess; aCtxt: TMessageContext = msUnknown);
var var
str: TMemoryStream; str: TMemoryStream;
@ -1157,7 +1235,7 @@ begin
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION view ******************************************************************} {$REGION view ------------------------------------------------------------------}
procedure TCEMainForm.widgetShowFromAction(sender: TObject); procedure TCEMainForm.widgetShowFromAction(sender: TObject);
var var
widg: TCEWidget; widg: TCEWidget;
@ -1170,9 +1248,21 @@ begin
win.Show; win.Show;
win.BringToFront; win.BringToFront;
end; end;
procedure TCEMainForm.DockMasterCreateControl(Sender: TObject; aName: string; var
AControl: TControl; DoDisableAutoSizing: boolean);
var
i: NativeInt;
begin
for i := 0 to fWidgList.Count-1 do if fWidgList.widget[i].Name = aName then
begin
AControl := fWidgList.widget[i];
if DoDisableAutoSizing then AControl.DisableAutoSizing;
end;
end;
{$ENDREGION} {$ENDREGION}
{$REGION project ***************************************************************} {$REGION project ---------------------------------------------------------------}
procedure TCEMainForm.projChange(sender: TObject); procedure TCEMainForm.projChange(sender: TObject);
var var
widg: TCEWidget; widg: TCEWidget;
@ -1323,15 +1413,13 @@ begin
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION options ***************************************************************} {$REGION options ---------------------------------------------------------------}
constructor TCEOptions.create(aOwner: TComponent); constructor TCEOptions.create(aOwner: TComponent);
begin begin
inherited; inherited;
fFileMru := TMruFileList.Create; fFileMru := TMruFileList.Create;
fProjMru := TMruFileList.Create; fProjMru := TMruFileList.Create;
// //
fWidgUpdDel := 70;
fWidgUpdPer := 1000;
fLeft := 0; fLeft := 0;
fTop := 0; fTop := 0;
fWidth := 800; fWidth := 800;
@ -1345,6 +1433,20 @@ begin
inherited; inherited;
end; end;
procedure TCEOptions.readerPropNoFound(Reader: TReader; Instance: TPersistent;
var PropName: string; IsPath: boolean; var Handled, Skip: Boolean);
begin
Skip := true;
Handled := true;
end;
procedure TCEOptions.readerError(Reader: TReader; const Message: string;
var Handled: Boolean);
begin
Handled := true;
fErrorFlg := false;
end;
procedure TCEOptions.setFileMru(aValue: TMruFileList); procedure TCEOptions.setFileMru(aValue: TMruFileList);
begin begin
fFileMru.Assign(aValue); fFileMru.Assign(aValue);
@ -1388,59 +1490,66 @@ begin
end; end;
end; end;
procedure TCEOptions.defineProperties(Filer: TFiler);
procedure TCEOptions.DefineProperties(Filer: TFiler);
begin begin
//Filer.DefineBinaryProperty('APP_Docking', @loadLayout, @saveLayout, true); inherited;
// Filer is either a TReader or a TWriter
CEMainForm.fEditWidg.declareProperties(Filer);
CEMainForm.fFindWidg.declareProperties(Filer);
CEMainForm.fMesgWidg.declareProperties(Filer);
CEMainForm.fPrjCfWidg.declareProperties(Filer);
CEMainForm.fProjWidg.declareProperties(Filer);
CEMainForm.fStExpWidg.declareProperties(Filer);
end; end;
procedure TCEOptions.beforeSave; procedure TCEOptions.beforeSave;
begin begin
fLeft := mainForm.Left; fLeft := CEMainForm.Left;
fTop := mainForm.Top; fTop := CEMainForm.Top;
fWidth := mainForm.Width; fWidth := CEMainForm.Width;
fHeight := mainForm.Height; fHeight := CEMainForm.Height;
// //
fFileMru.Assign(mainForm.fFileMru); fFileMru.Assign(CEMainForm.fFileMru);
fProjMru.Assign(mainForm.fProjMru); fProjMru.Assign(CEMainForm.fProjMru);
// //
fWidgUpdPer := mainForm.fEditWidg.updaterByLoopInterval; CEMainForm.fEditWidg.beforeSave(nil);
fWidgUpdDel := mainForm.fEditWidg.updaterByDelayDuration; CEMainForm.fFindWidg.beforeSave(nil);
CEMainForm.fMesgWidg.beforeSave(nil);
CEMainForm.fPrjCfWidg.beforeSave(nil);
CEMainForm.fProjWidg.beforeSave(nil);
CEMainForm.fStExpWidg.beforeSave(nil);
end; end;
procedure TCEOptions.saveToFile(const aFilename: string); procedure TCEOptions.saveToFile(const aFilename: string);
begin begin
fErrorFlg := true;
beforeSave; beforeSave;
saveCompToTxtFile(Self, aFilename); ce_common.saveCompToTxtFile(self, aFilename);
end; end;
procedure TCEOptions.loadFromFile(const aFilename: string); procedure TCEOptions.loadFromFile(const aFilename: string);
begin begin
try fErrorFlg := true;
loadCompFromTxtFile(Self, aFilename); loadCompFromTxtFile(self, aFilename, @readerPropNoFound, @readerError);
except
exit;
end;
afterLoad; afterLoad;
end; end;
procedure TCEOptions.afterLoad; procedure TCEOptions.afterLoad;
var
widg: TCEWidget;
begin begin
mainForm.Left := fLeft; CEMainForm.Left := fLeft;
mainForm.Top := fTop; CEMainForm.Top := fTop;
mainForm.Width := fWidth; CEMainForm.Width := fWidth;
mainForm.Height := fHeight; CEMainForm.Height := fHeight;
// //
mainForm.fFileMru.Assign(fFileMru); CEMainForm.fFileMru.Assign(fFileMru);
mainForm.fProjMru.Assign(fProjMru); CEMainForm.fProjMru.Assign(fProjMru);
// //
for widg in mainForm.fWidgList do CEMainForm.fEditWidg.afterLoad(nil);
begin CEMainForm.fFindWidg.afterLoad(nil);
widg.updaterByDelayDuration := fWidgUpdDel; CEMainForm.fMesgWidg.afterLoad(nil);
widg.updaterByLoopInterval := fWidgUpdPer; CEMainForm.fPrjCfWidg.afterLoad(nil);
end; CEMainForm.fProjWidg.afterLoad(nil);
CEMainForm.fStExpWidg.afterLoad(nil);
end; end;
{$ENDREGION} {$ENDREGION}

View File

@ -7,7 +7,7 @@ interface
uses uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, ComCtrls, Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, ComCtrls,
lcltype, ce_widget, ActnList, Menus, clipbrd, AnchorDocking, ce_project, lcltype, ce_widget, ActnList, Menus, clipbrd, AnchorDocking, ce_project,
ce_synmemo, LMessages; ce_synmemo;
type type
@ -103,11 +103,9 @@ begin
fActSaveMsg.caption := 'Save selected message(s) to...'; fActSaveMsg.caption := 'Save selected message(s) to...';
// //
inherited; inherited;
fID := 'ID_MSGS';
// //
List.PopupMenu := contextMenu; List.PopupMenu := contextMenu;
List.OnDeletion := @ListDeletion; List.OnDeletion := @ListDeletion;
DockMaster.GetAnchorSite(Self).Name := ID;
end; end;
procedure TCEMessagesWidget.clearOutOfRangeMessg; procedure TCEMessagesWidget.clearOutOfRangeMessg;

View File

@ -47,9 +47,7 @@ implementation
constructor TCEProjectConfigurationWidget.create(aOwner: TComponent); constructor TCEProjectConfigurationWidget.create(aOwner: TComponent);
begin begin
inherited; inherited;
fID := 'PROJ_CONF';
Tree.Selected := Tree.Items.GetLastNode; Tree.Selected := Tree.Items.GetLastNode;
DockMaster.GetAnchorSite(Self).Name := ID;
end; end;
procedure TCEProjectConfigurationWidget.projNew(const aProject: TCEProject); procedure TCEProjectConfigurationWidget.projNew(const aProject: TCEProject);
@ -106,7 +104,7 @@ begin
nme := ''; nme := '';
beginUpdateByEvent; beginUpdateByEvent;
cfg := fProj.addConfiguration; cfg := fProj.addConfiguration;
// note: Cancel is actually related to the conf name not to the adding operation. // note: Cancel is actually related to the conf. name not to the add operation.
if InputQuery('Configuration name', '', nme) then cfg.name := nme; if InputQuery('Configuration name', '', nme) then cfg.name := nme;
fProj.ConfigurationIndex := cfg.Index; fProj.ConfigurationIndex := cfg.Index;
endUpdateByEvent; endUpdateByEvent;

View File

@ -240,7 +240,7 @@ begin
for rel in fSrcs do if rel <> '' then for rel in fSrcs do if rel <> '' then
begin begin
abs := expandFilenameEx(fBasePath,rel); abs := expandFilenameEx(fBasePath,rel);
aList.Add(abs); // process.inc ln 249. double quotes are added anyway if there's a space... aList.Add(abs); // process.inc ln 249. double quotes are added if there's a space.
end; end;
TCompilerConfiguration(fOptsColl.Items[fConfIx]).getOpts(aList); TCompilerConfiguration(fOptsColl.Items[fConfIx]).getOpts(aList);
end; end;

View File

@ -209,7 +209,7 @@ inherited CEProjectInspectWidget: TCEProjectInspectWidget
object btnRemFile: TSpeedButton object btnRemFile: TSpeedButton
Left = 28 Left = 28
Height = 24 Height = 24
Hint = 'remove a source file from the project' Hint = 'remove selected sources file(s) from the project'
Top = 0 Top = 0
Width = 28 Width = 28
Align = alLeft Align = alLeft

View File

@ -65,13 +65,11 @@ begin
fActSelConf.OnUpdate := @actUpdate; fActSelConf.OnUpdate := @actUpdate;
// //
inherited; inherited;
fID := 'ID_PROJ';
Tree.OnDblClick := @TreeDblClick; Tree.OnDblClick := @TreeDblClick;
fFileNode := Tree.Items[0]; fFileNode := Tree.Items[0];
fConfNode := Tree.Items[1]; fConfNode := Tree.Items[1];
// //
Tree.PopupMenu := contextMenu; Tree.PopupMenu := contextMenu;
DockMaster.GetAnchorSite(Self).Name := ID;
end; end;
function TCEProjectInspectWidget.contextName: string; function TCEProjectInspectWidget.contextName: string;
@ -137,7 +135,7 @@ begin
begin begin
fname := fProject.getAbsoluteSourceName(i); fname := fProject.getAbsoluteSourceName(i);
if fileExists(fname) then if fileExists(fname) then
mainForm.openFile(fname); CEMainForm.openFile(fname);
end; end;
end end
else if Tree.Selected.Parent = fConfNode then else if Tree.Selected.Parent = fConfNode then
@ -195,7 +193,7 @@ begin
if fileExists(fProject.fileName) then if fileExists(fProject.fileName) then
dir := extractFilePath(fProject.fileName) dir := extractFilePath(fProject.fileName)
else dir := ''; else dir := '';
if selectDirectory(dir, [], 0) then if selectDirectory('sources', dir, dir, true, 0) then
begin begin
if FindFirst(dir + DirectorySeparator + '*.*', faAnyFile, sr ) = 0 then if FindFirst(dir + DirectorySeparator + '*.*', faAnyFile, sr ) = 0 then
try try
@ -218,19 +216,19 @@ begin
if Tree.Selected = nil then exit; if Tree.Selected = nil then exit;
// //
if Tree.Selected.Parent = fFileNode then if Tree.Selected.Parent = fFileNode then
begin begin
fname := Tree.Selected.Text; fname := Tree.Selected.Text;
i := fProject.Sources.IndexOf(fname); i := fProject.Sources.IndexOf(fname);
if i > -1 then fProject.Sources.Delete(i); if i > -1 then fProject.Sources.Delete(i);
UpdateByEvent; UpdateByEvent;
end end;
end; end;
procedure TCEProjectInspectWidget.FormDropFiles(Sender: TObject; const FileNames: array of String); procedure TCEProjectInspectWidget.FormDropFiles(Sender: TObject; const FileNames: array of String);
var var
fname: string; fname: string;
begin begin
mainForm.FormDropFiles(Sender, Filenames); CEMainForm.FormDropFiles(Sender, Filenames);
if fProject = nil then exit; if fProject = nil then exit;
for fname in Filenames do fProject.addSource(fname); for fname in Filenames do fProject.addSource(fname);
end; end;

View File

@ -39,9 +39,12 @@ type
fSearchMru, fReplaceMru: TMruList; fSearchMru, fReplaceMru: TMruList;
fCancelAll: boolean; fCancelAll: boolean;
fHasSearched: boolean; fHasSearched: boolean;
procedure optset_SearchMru(aReader: TReader);
procedure optget_SearchMru(aWriter: TWriter);
procedure optset_ReplaceMru(aReader: TReader);
procedure optget_ReplaceMru(aWriter: TWriter);
function getOptions: TSynSearchOptions; function getOptions: TSynSearchOptions;
procedure actReplaceAllExecute(sender: TObject); procedure actReplaceAllExecute(sender: TObject);
procedure replaceEvent(Sender: TObject; const ASearch, AReplace: procedure replaceEvent(Sender: TObject; const ASearch, AReplace:
string; Line, Column: integer; var ReplaceAction: TSynReplaceAction); string; Line, Column: integer; var ReplaceAction: TSynReplaceAction);
protected protected
@ -57,6 +60,8 @@ type
function contextActionCount: integer; override; function contextActionCount: integer; override;
function contextAction(index: integer): TAction; override; function contextAction(index: integer): TAction; override;
// //
procedure declareProperties(aFiler: TFiler); override;
//
procedure actFindNextExecute(sender: TObject); procedure actFindNextExecute(sender: TObject);
procedure actReplaceNextExecute(sender: TObject); procedure actReplaceNextExecute(sender: TObject);
end; end;
@ -64,6 +69,7 @@ type
implementation implementation
{$R *.lfm} {$R *.lfm}
{$REGION Standard Comp/Obj------------------------------------------------------}
constructor TCESearchWidget.Create(aOwner: TComponent); constructor TCESearchWidget.Create(aOwner: TComponent);
begin begin
fActFindNext := TAction.Create(self); fActFindNext := TAction.Create(self);
@ -76,7 +82,6 @@ begin
fActReplaceAll.Caption := 'Replace all'; fActReplaceAll.Caption := 'Replace all';
fActReplaceAll.OnExecute := @actReplaceAllExecute; fActReplaceAll.OnExecute := @actReplaceAllExecute;
inherited; inherited;
fID := 'ID_FIND';
// //
btnFind.Action := fActFindNext; btnFind.Action := fActFindNext;
btnReplace.Action := fActReplaceNext; btnReplace.Action := fActReplaceNext;
@ -84,7 +89,6 @@ begin
// //
fSearchMru := TMruList.Create; fSearchMru := TMruList.Create;
fReplaceMru:= TMruList.Create; fReplaceMru:= TMruList.Create;
DockMaster.GetAnchorSite(Self).Name := ID;
end; end;
destructor TCESearchWidget.Destroy; destructor TCESearchWidget.Destroy;
@ -93,19 +97,39 @@ begin
fReplaceMru.Free; fReplaceMru.Free;
inherited; inherited;
end; end;
{$ENDREGION}
procedure TCESearchWidget.docFocused(const aDoc: TCESynMemo); {$REGION ICEWidgetPersist ------------------------------------------------------}
procedure TCESearchWidget.declareProperties(aFiler: TFiler);
begin begin
fEditor := aDoc; inherited;
UpdateByEvent; aFiler.DefineProperty(Name + '_FindMRU', @optset_SearchMru, @optget_SearchMru, true);
aFiler.DefineProperty(Name + '_ReplaceMRU', @optset_ReplaceMru, @optget_ReplaceMru, true);
end; end;
procedure TCESearchWidget.docClose(const aDoc: TCESynMemo); procedure TCESearchWidget.optset_SearchMru(aReader: TReader);
begin begin
if fEditor = aDoc then fEditor := nil; fSearchMru.DelimitedText := aReader.ReadString;
UpdateByEvent; cbToFind.Items.DelimitedText := fSearchMru.DelimitedText;
end; end;
procedure TCESearchWidget.optget_SearchMru(aWriter: TWriter);
begin
aWriter.WriteString(fSearchMru.DelimitedText);
end;
procedure TCESearchWidget.optset_ReplaceMru(aReader: TReader);
begin
fReplaceMru.DelimitedText := aReader.ReadString;
cbReplaceWth.Items.DelimitedText := fReplaceMru.DelimitedText ;
end;
procedure TCESearchWidget.optget_ReplaceMru(aWriter: TWriter);
begin
aWriter.WriteString(fReplaceMru.DelimitedText);
end;
{$ENDREGION}
{$REGION ICEContextualActions---------------------------------------------------}
function TCESearchWidget.contextName: string; function TCESearchWidget.contextName: string;
begin begin
exit('Search'); exit('Search');
@ -126,26 +150,6 @@ begin
end; end;
end; end;
procedure TCESearchWidget.cbToFindChange(Sender: TObject);
begin
if Updating then exit;
fToFind := cbToFind.Text;
fHasSearched := false;
end;
procedure TCESearchWidget.chkEnableRepChange(Sender: TObject);
begin
if Updating then exit;
UpdateByEvent;
end;
procedure TCESearchWidget.cbReplaceWthChange(Sender: TObject);
begin
if Updating then exit;
fReplaceWth := cbReplaceWth.Text;
fHasSearched := false;
end;
function TCESearchWidget.getOptions: TSynSearchOptions; function TCESearchWidget.getOptions: TSynSearchOptions;
begin begin
result := [ssoRegExpr]; result := [ssoRegExpr];
@ -155,6 +159,28 @@ begin
if chkPrompt.Checked then result += [ssoPrompt]; if chkPrompt.Checked then result += [ssoPrompt];
end; end;
function dlgReplaceAll: TModalResult;
const
Btns = [mbYes, mbNo, mbYesToAll, mbNoToAll];
begin
exit( MessageDlg('Coedit', 'Replace this match ?', mtConfirmation, Btns, ''));
end;
procedure TCESearchWidget.replaceEvent(Sender: TObject; const ASearch, AReplace:
string; Line, Column: integer; var ReplaceAction: TSynReplaceAction);
begin
case dlgReplaceAll of
mrYes: ReplaceAction := raReplace;
mrNo: ReplaceAction := raSkip;
mrYesToAll: ReplaceAction := raReplaceAll;
mrCancel, mrClose, mrNoToAll:
begin
ReplaceAction := raCancel;
fCancelAll := true;
end;
end;
end;
procedure TCESearchWidget.actFindNextExecute(sender: TObject); procedure TCESearchWidget.actFindNextExecute(sender: TObject);
begin begin
if fEditor = nil then exit; if fEditor = nil then exit;
@ -233,27 +259,40 @@ begin
fEditor.OnReplaceText := nil; fEditor.OnReplaceText := nil;
UpdateByEvent; UpdateByEvent;
end; end;
{$ENDREGION}
function dlgReplaceAll: TModalResult; {$REGION ICEMultiDocMonitor ----------------------------------------------------}
const procedure TCESearchWidget.docFocused(const aDoc: TCESynMemo);
Btns = [mbYes, mbNo, mbYesToAll, mbNoToAll];
begin begin
exit( MessageDlg('Coedit', 'Replace this match ?', mtConfirmation, Btns, '')); fEditor := aDoc;
UpdateByEvent;
end; end;
procedure TCESearchWidget.replaceEvent(Sender: TObject; const ASearch, AReplace: procedure TCESearchWidget.docClose(const aDoc: TCESynMemo);
string; Line, Column: integer; var ReplaceAction: TSynReplaceAction);
begin begin
case dlgReplaceAll of if fEditor = aDoc then fEditor := nil;
mrYes: ReplaceAction := raReplace; UpdateByEvent;
mrNo: ReplaceAction := raSkip; end;
mrYesToAll: ReplaceAction := raReplaceAll; {$ENDREGION}
mrCancel, mrClose, mrNoToAll:
begin procedure TCESearchWidget.cbToFindChange(Sender: TObject);
ReplaceAction := raCancel; begin
fCancelAll := true; if Updating then exit;
end; fToFind := cbToFind.Text;
end; fHasSearched := false;
end;
procedure TCESearchWidget.chkEnableRepChange(Sender: TObject);
begin
if Updating then exit;
UpdateByEvent;
end;
procedure TCESearchWidget.cbReplaceWthChange(Sender: TObject);
begin
if Updating then exit;
fReplaceWth := cbReplaceWth.Text;
fHasSearched := false;
end; end;
procedure TCESearchWidget.UpdateByEvent; procedure TCESearchWidget.UpdateByEvent;

View File

@ -22,22 +22,37 @@ type
procedure TreeKeyPress(Sender: TObject; var Key: char); procedure TreeKeyPress(Sender: TObject; var Key: char);
private private
fActRefresh: TAction; fActRefresh: TAction;
fActRefreshOnChange: TAction;
fActRefreshOnFocus: TAction;
fActAutoRefresh: TAction; fActAutoRefresh: TAction;
fActSelectInSource: TAction; fActSelectInSource: TAction;
fDoc: TCESynMemo; fDoc: TCESynMemo;
fProj: TCEProject; fProj: TCEProject;
fAutoRefresh: boolean; fAutoRefresh: boolean;
fRefreshOnChange: boolean;
fRefreshOnFocus: boolean;
ndAlias, ndClass, ndEnum, ndFunc: TTreeNode; ndAlias, ndClass, ndEnum, ndFunc: TTreeNode;
ndImp, ndIntf, ndMix, ndStruct, ndTmp, ndVar: TTreeNode; ndImp, ndIntf, ndMix, ndStruct, ndTmp, ndVar: TTreeNode;
procedure Rescan; procedure Rescan;
procedure TreeDblClick(Sender: TObject); procedure TreeDblClick(Sender: TObject);
procedure actRefreshExecute(Sender: TObject); procedure actRefreshExecute(Sender: TObject);
procedure actAutoRefreshExecute(Sender: TObject); procedure actAutoRefreshExecute(Sender: TObject);
procedure actRefreshOnChangeExecute(Sender: TObject);
procedure actRefreshOnFocusExecute(Sender: TObject);
procedure updateVisibleCat; procedure updateVisibleCat;
//
procedure optget_AutoRefresh(aWriter: TWriter);
procedure optset_AutoRefresh(aReader: TReader);
procedure optget_RefreshOnChange(aWriter: TWriter);
procedure optset_RefreshOnChange(aReader: TReader);
procedure optget_RefreshOnFocus(aWriter: TWriter);
procedure optset_RefreshOnFocus(aReader: TReader);
protected protected
procedure UpdateByDelay; override; procedure UpdateByDelay; override;
published published
property autoRefresh: boolean read fAutoRefresh write fAutoRefresh; property autoRefresh: boolean read fAutoRefresh write fAutoRefresh;
property refreshOnChange: boolean read fRefreshOnChange write fRefreshOnChange;
property refreshOnFocus: boolean read fRefreshOnFocus write fRefreshOnFocus;
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
// //
@ -54,14 +69,19 @@ type
procedure projClose(const aProject: TCEProject); override; procedure projClose(const aProject: TCEProject); override;
procedure projCompile(const aProject: TCEProject); override; procedure projCompile(const aProject: TCEProject); override;
procedure projRun(const aProject: TCEProject); override; procedure projRun(const aProject: TCEProject); override;
//
procedure declareProperties(aFiler: TFiler); override;
end; end;
implementation implementation
{$R *.lfm} {$R *.lfm}
{$REGION Standard Comp/Obj------------------------------------------------------}
constructor TCEStaticExplorerWidget.create(aOwner: TComponent); constructor TCEStaticExplorerWidget.create(aOwner: TComponent);
begin begin
fAutoRefresh := true; fAutoRefresh := true;
fRefreshOnFocus := true;
fRefreshOnChange := true;
fActRefresh := TAction.Create(self); fActRefresh := TAction.Create(self);
fActRefresh.OnExecute := @actRefreshExecute; fActRefresh.OnExecute := @actRefreshExecute;
fActRefresh.Caption := 'Refresh'; fActRefresh.Caption := 'Refresh';
@ -70,12 +90,21 @@ begin
fActAutoRefresh.Caption := 'Auto-refresh'; fActAutoRefresh.Caption := 'Auto-refresh';
fActAutoRefresh.AutoCheck := true; fActAutoRefresh.AutoCheck := true;
fActAutoRefresh.Checked := fAutoRefresh; fActAutoRefresh.Checked := fAutoRefresh;
fActRefreshOnChange := TAction.Create(self);
fActRefreshOnChange.OnExecute := @actRefreshOnChangeExecute;
fActRefreshOnChange.Caption := 'Refresh on change';
fActRefreshOnChange.AutoCheck := true;
fActRefreshOnChange.Checked := fRefreshOnChange;
fActRefreshOnFocus := TAction.Create(self);
fActRefreshOnFocus.OnExecute := @actRefreshOnFocusExecute;
fActRefreshOnFocus.Caption := 'Refresh on focused';
fActRefreshOnFocus.AutoCheck := true;
fActRefreshOnFocus.Checked := fRefreshOnFocus;
fActSelectInSource := TAction.Create(self); fActSelectInSource := TAction.Create(self);
fActSelectInSource.OnExecute := @TreeDblClick; fActSelectInSource.OnExecute := @TreeDblClick;
fActSelectInSource.Caption := 'Select in source'; fActSelectInSource.Caption := 'Select in source';
// //
inherited; inherited;
fID := 'ID_SEXPL';
// //
ndAlias := Tree.Items[0]; ndAlias := Tree.Items[0];
ndClass := Tree.Items[1]; ndClass := Tree.Items[1];
@ -90,9 +119,53 @@ begin
// //
Tree.OnDblClick := @TreeDblClick; Tree.OnDblClick := @TreeDblClick;
Tree.PopupMenu := contextMenu; Tree.PopupMenu := contextMenu;
DockMaster.GetAnchorSite(Self).Name := ID; end;
{$ENDREGION}
{$REGION ICEWidgetPersist ------------------------------------------------------}
procedure TCEStaticExplorerWidget.optget_AutoRefresh(aWriter: TWriter);
begin
aWriter.WriteBoolean(fAutoRefresh);
end; end;
procedure TCEStaticExplorerWidget.optset_AutoRefresh(aReader: TReader);
begin
fAutoRefresh := aReader.ReadBoolean;
fActAutoRefresh.Checked := fAutoRefresh;
end;
procedure TCEStaticExplorerWidget.optget_RefreshOnChange(aWriter: TWriter);
begin
aWriter.WriteBoolean(fRefreshOnChange);
end;
procedure TCEStaticExplorerWidget.optset_RefreshOnChange(aReader: TReader);
begin
fRefreshOnChange := aReader.ReadBoolean;
fActRefreshOnChange.Checked := fRefreshOnChange;
end;
procedure TCEStaticExplorerWidget.optget_RefreshOnFocus(aWriter: TWriter);
begin
aWriter.WriteBoolean(fRefreshOnFocus);
end;
procedure TCEStaticExplorerWidget.optset_RefreshOnFocus(aReader: TReader);
begin
fRefreshOnFocus := aReader.ReadBoolean;
fActRefreshOnFocus.Checked := fRefreshOnFocus;
end;
procedure TCEStaticExplorerWidget.declareProperties(aFiler: TFiler);
begin
inherited;
aFiler.DefineProperty(Name + '_AutoRefresh', @optset_AutoRefresh, @optget_AutoRefresh, true);
aFiler.DefineProperty(Name + '_RefreshOnChange', @optset_RefreshOnChange, @optget_RefreshOnChange, true);
aFiler.DefineProperty(Name + '_RefreshOnFocus', @optset_RefreshOnFocus, @optget_RefreshOnFocus, true);
end;
{$ENDREGION}
{$REGION ICEContextualActions---------------------------------------------------}
function TCEStaticExplorerWidget.contextName: string; function TCEStaticExplorerWidget.contextName: string;
begin begin
result := 'Static explorer'; result := 'Static explorer';
@ -100,15 +173,17 @@ end;
function TCEStaticExplorerWidget.contextActionCount: integer; function TCEStaticExplorerWidget.contextActionCount: integer;
begin begin
result := 3; result := 5;
end; end;
function TCEStaticExplorerWidget.contextAction(index: integer): TAction; function TCEStaticExplorerWidget.contextAction(index: integer): TAction;
begin begin
case index of case index of
0: result := fActSelectInSource; 0: exit(fActSelectInSource);
1: result := fActRefresh; 1: exit(fActRefresh);
2: result := fActAutoRefresh; 2: exit(fActAutoRefresh);
3: exit(fActRefreshOnChange);
4: exit(fActRefreshOnFocus);
else result := nil; else result := nil;
end; end;
end; end;
@ -121,9 +196,44 @@ end;
procedure TCEStaticExplorerWidget.actAutoRefreshExecute(Sender: TObject); procedure TCEStaticExplorerWidget.actAutoRefreshExecute(Sender: TObject);
begin begin
AutoRefresh := not AutoRefresh; autoRefresh := not autoRefresh;
end; end;
procedure TCEStaticExplorerWidget.actRefreshOnChangeExecute(Sender: TObject);
begin
refreshOnChange := not refreshOnChange;
end;
procedure TCEStaticExplorerWidget.actRefreshOnFocusExecute(Sender: TObject);
begin
refreshOnFocus := not refreshOnFocus;
end;
{$ENDREGION}
{$REGION ICEMultiDocMonitor ----------------------------------------------------}
procedure TCEStaticExplorerWidget.docFocused(const aDoc: TCESynMemo);
begin
fDoc := aDoc;
if fAutoRefresh then beginUpdateByDelay
else if fRefreshOnFocus then Rescan;
end;
procedure TCEStaticExplorerWidget.docChanged(const aDoc: TCESynMemo);
begin
if fDoc <> aDoc then exit;
if fAutoRefresh then beginUpdateByDelay
else if fRefreshOnChange then Rescan;
end;
procedure TCEStaticExplorerWidget.docClose(const aDoc: TCESynMemo);
begin
if fDoc <> aDoc then exit;
fDoc := nil;
beginUpdateByDelay;
end;
{$ENDREGION}
{$REGION ICEProjectMonitor -----------------------------------------------------}
procedure TCEStaticExplorerWidget.projNew(const aProject: TCEProject); procedure TCEStaticExplorerWidget.projNew(const aProject: TCEProject);
begin begin
fProj := aProject; fProj := aProject;
@ -139,25 +249,6 @@ begin
fProj := nil; fProj := nil;
end; end;
procedure TCEStaticExplorerWidget.docFocused(const aDoc: TCESynMemo);
begin
fDoc := aDoc;
beginUpdateByDelay;
end;
procedure TCEStaticExplorerWidget.docChanged(const aDoc: TCESynMemo);
begin
if fDoc <> aDoc then exit;
beginUpdateByDelay;
end;
procedure TCEStaticExplorerWidget.docClose(const aDoc: TCESynMemo);
begin
if fDoc <> aDoc then exit;
fDoc := nil;
beginUpdateByDelay;
end;
procedure TCEStaticExplorerWidget.projCompile(const aProject: TCEProject); procedure TCEStaticExplorerWidget.projCompile(const aProject: TCEProject);
begin begin
stopUpdateByDelay; stopUpdateByDelay;
@ -167,6 +258,7 @@ procedure TCEStaticExplorerWidget.projRun(const aProject: TCEProject);
begin begin
stopUpdateByDelay; stopUpdateByDelay;
end; end;
{$ENDREGION}
procedure TCEStaticExplorerWidget.UpdateByDelay; procedure TCEStaticExplorerWidget.UpdateByDelay;
begin begin

View File

@ -5,9 +5,8 @@ unit ce_synmemo;
interface interface
uses uses
Classes, SysUtils, SynEdit, SynMemo, ce_d2syn, SynEditTextBuffer, Classes, SysUtils, SynEdit, SynMemo, ce_d2syn, SynEditHighlighter, controls,
SynEditHighlighter, controls, LazSynEditText, SynPluginSyncroEdit, LazSynEditText, SynPluginSyncroEdit, SynEditKeyCmds, ce_project, ce_common;
SynEditKeyCmds, ce_project, ce_common;
type type
@ -78,9 +77,7 @@ begin
fFilename := '<new document>'; fFilename := '<new document>';
fModified := false; fModified := false;
// http://forum.lazarus.freepascal.org/index.php/topic,25213.0.html TextBuffer.AddNotifyHandler(senrUndoRedoAdded, @changeNotify);
//TSynEditStringList(Lines).AddNotifyHandler(senrUndoRedoAdded, @changeNotify);
onChange := @changeNotify;
end; end;
procedure TCESynMemo.setFocus; procedure TCESynMemo.setFocus;
@ -102,7 +99,7 @@ procedure TCESynMemo.SetHighlighter(const Value: TSynCustomHighlighter);
begin begin
inherited; inherited;
fIsDSource := Highlighter = D2Syn; fIsDSource := Highlighter = D2Syn;
fIsConfig := Highlighter = mainForm.LfmSyn; fIsConfig := Highlighter = CEMainForm.LfmSyn;
end; end;
procedure TCESynMemo.identifierToD2Syn; procedure TCESynMemo.identifierToD2Syn;

View File

@ -17,7 +17,7 @@ type
PTCEWidget = ^TCEWidget; PTCEWidget = ^TCEWidget;
{ TCEWidget } { TCEWidget }
TCEWidget = class(TForm, ICEContextualActions, ICEProjectMonitor, ICEMultiDocMonitor) TCEWidget = class(TForm, ICEContextualActions, ICEProjectMonitor, ICEMultiDocMonitor, ICEWidgetPersist)
Content: TPanel; Content: TPanel;
Back: TPanel; Back: TPanel;
contextMenu: TPopupMenu; contextMenu: TPopupMenu;
@ -32,6 +32,11 @@ type
procedure setLoopInt(aValue: Integer); procedure setLoopInt(aValue: Integer);
procedure updaterAutoProc(Sender: TObject); procedure updaterAutoProc(Sender: TObject);
procedure updaterLatchProc(Sender: TObject); procedure updaterLatchProc(Sender: TObject);
//
procedure optget_LoopInterval(aWriter: TWriter);
procedure optset_LoopInterval(aReader: TReader);
procedure optget_UpdaterDelay(aWriter: TWriter);
procedure optset_UpdaterDelay(aReader: TReader);
protected protected
fID: string; fID: string;
// a descendant overrides to implementi a periodic update. // a descendant overrides to implementi a periodic update.
@ -78,9 +83,13 @@ type
function contextName: string; virtual; function contextName: string; virtual;
function contextActionCount: integer; virtual; function contextActionCount: integer; virtual;
function contextAction(index: integer): TAction; virtual; function contextAction(index: integer): TAction; virtual;
//
procedure beforeSave(sender: TObject); virtual;
procedure declareProperties(aFiler: TFiler); virtual;
procedure afterLoad(sender: TObject); virtual;
//
// returns true if one of the three updater is processing. // returns true if one of the three updater is processing.
property updating: boolean read fUpdating; property updating: boolean read fUpdating;
property ID: string read fID write fID;
end; end;
(** (**
@ -110,14 +119,14 @@ implementation
(******************************************************************************* (*******************************************************************************
* TCEWidget * TCEWidget
*) *)
{$REGION Standard Comp/Obj------------------------------------------------------}
constructor TCEWidget.create(aOwner: TComponent); constructor TCEWidget.create(aOwner: TComponent);
var var
i: NativeInt; i: NativeInt;
itm: TmenuItem; itm: TmenuItem;
begin begin
inherited; inherited;
fID := 'ID_XXXX';
fUpdaterAuto := TTimer.Create(self); fUpdaterAuto := TTimer.Create(self);
fUpdaterAuto.Interval := 70; fUpdaterAuto.Interval := 70;
fUpdaterAuto.OnTimer := @updaterAutoProc; fUpdaterAuto.OnTimer := @updaterAutoProc;
@ -126,10 +135,6 @@ begin
updaterByLoopInterval := 70; updaterByLoopInterval := 70;
updaterByDelayDuration := 1250; updaterByDelayDuration := 1250;
DockMaster.MakeDockable(Self, true, true, true);
DockMaster.GetAnchorSite(Self).Header.HeaderPosition := adlhpTop;
DockMaster.GetAnchorSite(Self).Name := ID;
for i := 0 to contextActionCount-1 do for i := 0 to contextActionCount-1 do
begin begin
itm := TMenuItem.Create(self); itm := TMenuItem.Create(self);
@ -144,7 +149,107 @@ destructor TCEWidget.destroy;
begin begin
inherited; inherited;
end; end;
{$ENDREGION}
{$REGION ICEWidgetPersist ------------------------------------------------------}
procedure TCEWidget.beforeSave(sender: TObject);
begin
end;
procedure TCEWidget.declareProperties(aFiler: TFiler);
begin
// override rules: inhertied must be called. No dots in the property name, property name prefixed with the widget Name
aFiler.DefineProperty(Name + '_updaterByLoopInterval', @optset_LoopInterval, @optget_LoopInterval, true);
aFiler.DefineProperty(Name + '_updaterByDelayDuration', @optset_UpdaterDelay, @optget_UpdaterDelay, true);
end;
procedure TCEWidget.afterLoad(sender: TObject);
begin
end;
procedure TCEWidget.optget_LoopInterval(aWriter: TWriter);
begin
aWriter.WriteInteger(fLoopInter);
end;
procedure TCEWidget.optset_LoopInterval(aReader: TReader);
begin
updaterByLoopInterval := aReader.ReadInteger;
end;
procedure TCEWidget.optget_UpdaterDelay(aWriter: TWriter);
begin
aWriter.WriteInteger(fDelayDur);
end;
procedure TCEWidget.optset_UpdaterDelay(aReader: TReader);
begin
updaterByDelayDuration := aReader.ReadInteger;
end;
{$ENDREGION}
{$REGION ICEContextualActions---------------------------------------------------}
function TCEWidget.contextName: string;
begin
result := '';
end;
function TCEWidget.contextActionCount: integer;
begin
result := 0;
end;
function TCEWidget.contextAction(index: integer): TAction;
begin
result := nil;
end;
{$ENDREGION}
{$REGION ICEMultiDocMonitor ----------------------------------------------------}
procedure TCEWidget.docNew(const aDoc: TCESynMemo);
begin
end;
procedure TCEWidget.docFocused(const aDoc: TCESynMemo);
begin
end;
procedure TCEWidget.docChanged(const aDoc: TCESynMemo);
begin
end;
procedure TCEWidget.docClose(const aDoc: TCESynMemo);
begin
end;
{$ENDREGION}
{$REGION ICEProjectMonitor -----------------------------------------------------}
procedure TCEWidget.projNew(const aProject: TCEProject);
begin
end;
procedure TCEWidget.projChange(const aProject: TCEProject);
begin
end;
procedure TCEWidget.projClose(const aProject: TCEProject);
begin
end;
procedure TCEWidget.projCompile(const aProject: TCEProject);
begin
end;
procedure TCEWidget.projRun(const aProject: TCEProject);
begin
end;
procedure TCEWidget.projFocused(const aProject: TCEProject);
begin
end;
{$ENDREGION}
{$REGION Updaters---------------------------------------------------------------}
procedure TCEWidget.setDelayDur(aValue: Integer); procedure TCEWidget.setDelayDur(aValue: Integer);
begin begin
if aValue < 100 then aValue := 100; if aValue < 100 then aValue := 100;
@ -227,61 +332,7 @@ end;
procedure TCEWidget.UpdateByDelay; procedure TCEWidget.UpdateByDelay;
begin begin
end; end;
{$ENDREGION}
procedure TCEWidget.projNew(const aProject: TCEProject);
begin
end;
procedure TCEWidget.projChange(const aProject: TCEProject);
begin
end;
procedure TCEWidget.projClose(const aProject: TCEProject);
begin
end;
procedure TCEWidget.projCompile(const aProject: TCEProject);
begin
end;
procedure TCEWidget.projRun(const aProject: TCEProject);
begin
end;
procedure TCEWidget.projFocused(const aProject: TCEProject);
begin
end;
function TCEWidget.contextName: string;
begin
result := '';
end;
function TCEWidget.contextActionCount: integer;
begin
result := 0;
end;
function TCEWidget.contextAction(index: integer): TAction;
begin
result := nil;
end;
procedure TCEWidget.docNew(const aDoc: TCESynMemo);
begin
end;
procedure TCEWidget.docFocused(const aDoc: TCESynMemo);
begin
end;
procedure TCEWidget.docChanged(const aDoc: TCESynMemo);
begin
end;
procedure TCEWidget.docClose(const aDoc: TCESynMemo);
begin
end;
(******************************************************************************* (*******************************************************************************
* TCEWidgetList * TCEWidgetList

View File

@ -12,36 +12,59 @@ type
// TODO-cinterface: document content access/modification // TODO-cinterface: document content access/modification
(** (**
* An implementer is informed when a new document is added, focused or closed. * An implementer can save and load some stuffs on application start/quit
*) *)
ICEMultiDocMonitor = interface ICEWidgetPersist = interface
procedure docNew(const aDoc: TCESynMemo); // Coedit options are about to be saved.
procedure docFocused(const aDoc: TCESynMemo); // docSelected or docActivated procedure beforeSave(sender: TObject);
procedure docChanged(const aDoc: TCESynMemo); // some custom properties can be declared to aFiler.
procedure docClose(const aDoc: TCESynMemo); procedure declareProperties(aFiler: TFiler);
// Coedit options has just been reloaded.
procedure afterLoad(sender: TObject);
end; end;
(** (**
* An implementer declares some actions on demand. * An implementer declares some actions on demand.
*) *)
ICEContextualActions = interface ICEContextualActions = interface
// declares a context name for the actions
function contextName: string; function contextName: string;
// action count, called before contextAction()
function contextActionCount: integer; function contextActionCount: integer;
// declares actions, called in loop, from 0 to contextActionCount-1
function contextAction(index: integer): TAction; function contextAction(index: integer): TAction;
end; end;
(**
* An implementer is informed when a new document is added, focused or closed.
*)
ICEMultiDocMonitor = interface
// the new document aDoc has been created (empty, runnable, project source, ...).
procedure docNew(const aDoc: TCESynMemo);
// aDoc is the document being edited.
procedure docFocused(const aDoc: TCESynMemo); // rename to: docSelected or docActivated
// aDoc content has just been modified (edited, saved).
procedure docChanged(const aDoc: TCESynMemo);
// aDoc is about to be closed.
procedure docClose(const aDoc: TCESynMemo);
end;
(** (**
* An implementer is informed when a project changes. * An implementer is informed when a project changes.
*) *)
ICEProjectMonitor = interface ICEProjectMonitor = interface
// the new project aProject has been created/opened
procedure projNew(const aProject: TCEProject); procedure projNew(const aProject: TCEProject);
// aProject has been modified: switches, source name, ...
procedure projChange(const aProject: TCEProject); procedure projChange(const aProject: TCEProject);
// aProject is about to be closed.
procedure projClose(const aProject: TCEProject); procedure projClose(const aProject: TCEProject);
// aProject is about to be compiled.
procedure projCompile(const aProject: TCEProject); procedure projCompile(const aProject: TCEProject);
// aProject is about to be executed.
procedure projRun(const aProject: TCEProject); procedure projRun(const aProject: TCEProject);
// not used yet: the active project is now aProject
// not used yet: (project group) procedure projFocused(const aProject: TCEProject); // rename: projSelected or projActivated
procedure projFocused(const aProject: TCEProject); // projSelected or projActivated
end; end;
implementation implementation