This commit is contained in:
Basile Burg 2014-06-13 16:50:16 +02:00
parent 3fd4bb6ac7
commit 5591812bae
14 changed files with 924 additions and 92 deletions

View File

@ -126,7 +126,7 @@
<PackageName Value="LCL"/> <PackageName Value="LCL"/>
</Item3> </Item3>
</RequiredPackages> </RequiredPackages>
<Units Count="9"> <Units Count="10">
<Unit0> <Unit0>
<Filename Value="coedit.lpr"/> <Filename Value="coedit.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
@ -187,6 +187,11 @@
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="ce_synmemo"/> <UnitName Value="ce_synmemo"/>
</Unit8> </Unit8>
<Unit9>
<Filename Value="..\src\ce_dmdwrap.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ce_dmdwrap"/>
</Unit9>
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>

View File

@ -8,7 +8,7 @@ uses
{$ENDIF}{$ENDIF} {$ENDIF}{$ENDIF}
Interfaces, Interfaces,
Forms, lazcontrols, ce_main, ce_widget, ce_common, Forms, lazcontrols, ce_main, ce_widget, ce_common,
ce_messages, ce_editor, ce_project, ce_synmemo; ce_messages, ce_editor, ce_project, ce_synmemo, ce_dmdwrap;
{$R *.res} {$R *.res}

View File

@ -5,10 +5,12 @@ unit ce_common;
interface interface
uses uses
Classes, SysUtils, ce_dmdwrap; Classes, SysUtils, ce_dmdwrap, ActnList;
type type
TCEProject = class;
(** (**
* An implementer is informed when a new document is added, focused or closed. * An implementer is informed when a new document is added, focused or closed.
*) *)
@ -17,20 +19,20 @@ type
procedure docClose(const aNewIndex: integer); procedure docClose(const aNewIndex: integer);
end; end;
(**
* An implementer informs when a new document is added, focused or closed.
*)
ICEMultiDocEmitter = interface(ICEMultiDocMonitor)
end;
(** (**
* An implementer adds some menu actions when its context is valid. * An implementer adds some menu actions when its context is valid.
* Called from mainForm to a widget when necessary.
*) *)
ICEContextualActions = interface ICEContextualActions = interface
function contextName: string; function contextName: string;
function contextActionCount: integer; function contextActionCount: integer;
function contextAction(index: integer): TBasicAction; function contextAction(index: integer): TAction;
end;
(**
* An implementer is informed when a project changes.
*)
ICEProjectMonitor = interface
procedure projChange(const aProject: TCEProject);
end; end;
(***************************************************************************** (*****************************************************************************
@ -38,50 +40,163 @@ type
*) *)
TCEProject = class(TComponent) TCEProject = class(TComponent)
private private
fOnChange: TNotifyEvent;
fModified: boolean; fModified: boolean;
fFilename: string; fFilename: string;
fBasePath: string;
fOptsColl: TCollection; fOptsColl: TCollection;
fSrcs: TStringList; // an editor can be associated to a file using the Object[] property fSrcs, fSrcsCop: TStringList; // an editor can be associated to a file using the Object[] property
fConfIx: Integer; fConfIx: Integer;
procedure doChanged;
procedure subMemberChanged(sender : TObject); procedure subMemberChanged(sender : TObject);
procedure setOptsColl(const aValue: TCollection); procedure setOptsColl(const aValue: TCollection);
procedure setFname(const aValue: string); procedure setFname(const aValue: string);
procedure setSrcs(const aValue: TStringList); procedure setSrcs(const aValue: TStringList);
procedure setConfIx(aValue: Integer); procedure setConfIx(aValue: Integer);
function getConfig(const ix: integer): TCompilerConfiguration; function getConfig(const ix: integer): TCompilerConfiguration;
function getSrcs: TStringList;
published published
property OptionsCollection: TCollection read fOptsColl write setOptsColl; property OptionsCollection: TCollection read fOptsColl write setOptsColl;
property Sources: TStringList read fSrcs write setSrcs; property Sources: TStringList read fSrcs write setSrcs; // 'read' should return a copy to avoid abs/rel errors
property ConfigurationIndex: Integer read fConfIx write setConfIx; property ConfigurationIndex: Integer read fConfIx write setConfIx;
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
procedure reset;
function getAbsoluteSourceName(const aIndex: integer): string;
procedure addSource(const aFilename: string);
function addConfiguration: TCompilerConfiguration; function addConfiguration: TCompilerConfiguration;
function getOpts: string;
//
property configuration[ix: integer]: TCompilerConfiguration read getConfig; property configuration[ix: integer]: TCompilerConfiguration read getConfig;
property fileName: string read fFilename write setFname; property fileName: string read fFilename write setFname;
property onChange: TNotifyEvent read fOnChange write fOnChange;
end; end;
procedure saveCompToTxtFile(const aComp: TComponent; const aFilename: string);
procedure loadCompFromTxtFile(const aComp: TComponent; const aFilename: string);
function expandFilenameEx(const aBasePath, aFilename: string): string;
function getModuleName(const aSource: TStrings): string;
implementation implementation
(*****************************************************************************
* Routines
*)
procedure saveCompToTxtFile(const aComp: TComponent; const aFilename: string);
var
str1, str2: TMemoryStream;
begin
str1 := TMemoryStream.Create;
str2 := TMemoryStream.Create;
try
str1.WriteComponent(aComp);
str1.Position := 0;
ObjectBinaryToText(str1,str2);
str2.SaveToFile(aFilename);
finally
str1.Free;
str2.Free;
end;
end;
procedure loadCompFromTxtFile(const aComp: TComponent; const aFilename: string);
var
str1, str2: TMemoryStream;
begin
str1 := TMemoryStream.Create;
str2 := TMemoryStream.Create;
try
str1.LoadFromFile(aFilename);
str1.Position := 0;
ObjectTextToBinary(str1,str2);
str2.Position := 0;
str2.ReadComponent(aComp);
finally
str1.Free;
str2.Free;
end;
end;
function expandFilenameEx(const aBasePath, aFilename: string): string;
var
curr: string;
begin
curr := '';
getDir(0,curr);
try
if curr <> aBasePath then
chDir(aBasePath);
result := expandFileName(aFilename);
finally
chDir(curr);
end;
end;
// TODO: comments handling
function getModuleName(const aSource: TStrings): string;
var
ln: string;
pos: NativeInt;
id: string;
tok: boolean;
begin
result := '';
tok := false;
for ln in aSource do
begin
pos := 1;
id := '';
while(true) do
begin
if pos > length(ln) then
break;
if ln[pos] in [#0..#32] then
begin
Inc(pos);
id := '';
continue;
end;
if tok then if ln[pos] = ';'then
begin
result := id;
exit;
end;
id += ln[pos];
Inc(pos);
if id = 'module' then
begin
tok := true;
id := '';
continue;
end;
end;
end;
end;
(***************************************************************************** (*****************************************************************************
* TProject * TProject
*) *)
constructor TCEProject.create(aOwner: TComponent); constructor TCEProject.create(aOwner: TComponent);
var
defConf: TCompilerConfiguration;
begin begin
inherited create(aOwner); inherited create(aOwner);
fSrcs := TStringList.Create; fSrcs := TStringList.Create;
fSrcsCop := TStringList.Create;
fSrcs.OnChange := @subMemberChanged; fSrcs.OnChange := @subMemberChanged;
fOptsColl := TCollection.create(TCompilerConfiguration); fOptsColl := TCollection.create(TCompilerConfiguration);
reset;
defConf := addConfiguration;
defConf.name := 'default';
end; end;
destructor TCEProject.destroy; destructor TCEProject.destroy;
begin begin
fSrcs.free; fSrcs.free;
fSrcsCop.Free;
fOptsColl.free; fOptsColl.free;
inherited; inherited;
end; end;
@ -97,17 +212,42 @@ begin
fOptsColl.Assign(aValue); fOptsColl.Assign(aValue);
end; end;
procedure TCEProject.addSource(const aFilename: string);
var
relSrc, absSrc: string;
begin
for relSrc in fSrcs do
begin
absSrc := expandFilenameEx(fBasePath,relsrc);
if aFilename = absSrc then exit;
end;
fSrcs.Add(ExtractRelativepath(fBasePath,aFilename));
end;
procedure TCEProject.setFname(const aValue: string); procedure TCEProject.setFname(const aValue: string);
var
oldAbs, newRel, oldBase: string;
i: NativeInt;
begin begin
if fFilename = aValue then exit; if fFilename = aValue then exit;
fFilename := aValue; fFilename := aValue;
subMemberChanged(nil); oldBase := fBasePath;
fBasePath := extractFilePath(fFilename);
//
for i:= 0 to fSrcs.Count-1 do
begin
oldAbs := expandFilenameEx(oldBase,fSrcs[i]);
newRel := ExtractRelativepath(fBasePath, oldAbs);
fSrcs[i] := newRel;
end;
//
doChanged;
end; end;
procedure TCEProject.setSrcs(const aValue: TStringList); procedure TCEProject.setSrcs(const aValue: TStringList);
begin begin
fSrcs.Assign(aValue); fSrcs.Assign(aValue);
subMemberChanged(nil); doChanged;
end; end;
procedure TCEProject.setConfIx(aValue: Integer); procedure TCEProject.setConfIx(aValue: Integer);
@ -116,12 +256,19 @@ begin
if aValue < 0 then aValue := 0; if aValue < 0 then aValue := 0;
if aValue > fOptsColl.Count-1 then aValue := fOptsColl.Count-1; if aValue > fOptsColl.Count-1 then aValue := fOptsColl.Count-1;
fConfIx := aValue; fConfIx := aValue;
subMemberChanged(nil); doChanged;
end; end;
procedure TCEProject.subMemberChanged(sender : TObject); procedure TCEProject.subMemberChanged(sender : TObject);
begin begin
fModified := true; fModified := true;
doChanged;
end;
procedure TCEProject.doChanged;
begin
fModified := true;
if assigned(fOnChange) then fOnChange(Self);
end; end;
function TCEProject.getConfig(const ix: integer): TCompilerConfiguration; function TCEProject.getConfig(const ix: integer): TCompilerConfiguration;
@ -129,5 +276,59 @@ begin
result := TCompilerConfiguration(fOptsColl.Items[ix]); result := TCompilerConfiguration(fOptsColl.Items[ix]);
end; end;
function TCEProject.getSrcs: TStringList;
var
str: TMemoryStream;
begin
if not (csReading in componentState) or (csWriting in componentState) then
begin
str := TMemoryStream.Create;
try
fSrcs.SaveToStream(str);
str.Position:=0;
fSrcsCop.Clear;
fSrcsCop.LoadFromStream(str);
finally
str.Free;
end;
result := fSrcsCop;
end
else result := fSrcs;
end;
procedure TCEProject.reset;
var
defConf: TCompilerConfiguration;
begin
fOptsColl.Clear;
defConf := addConfiguration;
defConf.name := 'default';
fSrcs.Clear;
fFilename := '';
fModified := true;
fConfIx := 0;
doChanged;
end;
function TCEProject.getOpts: string;
var
rel, abs: string;
begin
result := '';
for rel in fSrcs do
begin
abs := expandFilenameEx(fBasePath,rel);
result += '"' + abs + '"';
end;
result += TCompilerConfiguration(fOptsColl.Items[fConfIx]).getOpts;
end;
function TCEProject.getAbsoluteSourceName(const aIndex: integer): string;
begin
if aIndex < 0 then exit;
if aIndex > fSrcs.Count-1 then exit;
result := expandFileNameEx(fBasePath,fSrcs.Strings[aIndex]);
end;
end. end.

View File

@ -212,7 +212,7 @@ type
public public
constructor create(aCollection: TCollection); override; constructor create(aCollection: TCollection); override;
destructor destroy; override; destructor destroy; override;
property cmdLine: string read getCmdLine; property getOpts: string read getCmdLine;
property onChanged: TNotifyEvent read fOnChanged write fOnChanged; property onChanged: TNotifyEvent read fOnChanged write fOnChanged;
end; end;

View File

@ -20,7 +20,7 @@ inherited CEEditorWidget: TCEEditorWidget
ClientWidth = 477 ClientWidth = 477
object PageControl: TExtendedNotebook[0] object PageControl: TExtendedNotebook[0]
Left = 2 Left = 2
Height = 483 Height = 460
Top = 2 Top = 2
Width = 473 Width = 473
Align = alClient Align = alClient
@ -28,6 +28,23 @@ inherited CEEditorWidget: TCEEditorWidget
TabOrder = 0 TabOrder = 0
OnChange = PageControlChange OnChange = PageControlChange
end end
object editorStatus: TStatusBar[1]
Left = 0
Height = 23
Top = 464
Width = 477
Panels = <
item
Width = 100
end
item
Width = 150
end
item
Width = 200
end>
SimplePanel = False
end
end end
inherited Header: TPanel inherited Header: TPanel
Width = 481 Width = 481
@ -75,4 +92,7 @@ inherited CEEditorWidget: TCEEditorWidget
0000000000000000000000000000 0000000000000000000000000000
} }
end end
object ApplicationProperties1: TApplicationProperties[3]
left = 64
end
end end

View File

@ -6,20 +6,28 @@ interface
uses uses
Classes, SysUtils, FileUtil, ExtendedNotebook, Forms, Controls, Graphics, Classes, SysUtils, FileUtil, ExtendedNotebook, Forms, Controls, Graphics,
SynEditKeyCmds, ComCtrls, SynEditHighlighter, SynEditHighlighterFoldBase, SynMacroRecorder, SynEditKeyCmds, ComCtrls, SynEditHighlighter, SynEditHighlighterFoldBase,
SynPluginSyncroEdit, SynEdit, Dialogs, ExtCtrls, ce_widget, ce_d2syn, ce_synmemo; SynMacroRecorder, SynPluginSyncroEdit, SynEdit, Dialogs, ExtCtrls, ce_widget,
ce_d2syn, ce_synmemo, ce_common;
type type
{ TCEEditorWidget } { TCEEditorWidget }
TCEEditorWidget = class(TCEWidget) TCEEditorWidget = class(TCEWidget)
ApplicationProperties1: TApplicationProperties;
imgList: TImageList; imgList: TImageList;
PageControl: TExtendedNotebook; PageControl: TExtendedNotebook;
macRecorder: TSynMacroRecorder; macRecorder: TSynMacroRecorder;
editorStatus: TStatusBar;
procedure PageControlChange(Sender: TObject); procedure PageControlChange(Sender: TObject);
protected
procedure UpdaterProc; override;
private private
// a TSynPluginSyncroEdit cannot be created from design(comp streaming err.) // http://bugs.freepascal.org/view.php?id=26329
fSyncEdit: TSynPluginSyncroEdit; fSyncEdit: TSynPluginSyncroEdit;
procedure focusedEditorChanged; procedure focusedEditorChanged;
procedure memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure memoChange(Sender: TObject);
function getCurrentEditor: TCESynMemo; function getCurrentEditor: TCESynMemo;
function getEditor(index: NativeInt): TCESynMemo; function getEditor(index: NativeInt): TCESynMemo;
function getEditorCount: NativeInt; function getEditorCount: NativeInt;
@ -30,9 +38,6 @@ type
destructor destroy; override; destructor destroy; override;
procedure addEditor; procedure addEditor;
// //
procedure memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
//
property currentEditor: TCESynMemo read getCurrentEditor; property currentEditor: TCESynMemo read getCurrentEditor;
property editor[index: NativeInt]: TCESynMemo read getEditor; property editor[index: NativeInt]: TCESynMemo read getEditor;
property editorCount: NativeInt read getEditorCount; property editorCount: NativeInt read getEditorCount;
@ -85,9 +90,16 @@ begin
end; end;
procedure TCEEditorWidget.focusedEditorChanged; procedure TCEEditorWidget.focusedEditorChanged;
var
curr: TCESynMemo;
md: string;
begin begin
macRecorder.Editor := getCurrentEditor; curr := getCurrentEditor;
fSyncEdit.Editor := getCurrentEditor; macRecorder.Editor := curr;
fSyncEdit.Editor := curr;
identifierToD2Syn(curr);
md := getModuleName(curr.Lines);
pageControl.ActivePage.Caption := md;
end; end;
procedure TCEEditorWidget.PageControlChange(Sender: TObject); procedure TCEEditorWidget.PageControlChange(Sender: TObject);
@ -101,6 +113,7 @@ var
sheet: TTabSheet; sheet: TTabSheet;
memo: TCESynMemo; memo: TCESynMemo;
begin begin
fNeedUpdate := true;
sheet := pageControl.AddTabSheet; sheet := pageControl.AddTabSheet;
memo := TCESynMemo.Create(sheet); memo := TCESynMemo.Create(sheet);
// //
@ -110,6 +123,7 @@ begin
memo.OnKeyDown := @memoKeyDown; memo.OnKeyDown := @memoKeyDown;
memo.OnKeyUp := @memoKeyDown; memo.OnKeyUp := @memoKeyDown;
memo.OnMouseDown := @memoMouseDown; memo.OnMouseDown := @memoMouseDown;
memo.OnChange := @memoChange;
// //
//http://bugs.freepascal.org/view.php?id=26320 //http://bugs.freepascal.org/view.php?id=26320
focusedEditorChanged; focusedEditorChanged;
@ -122,16 +136,41 @@ end;
procedure TCEEditorWidget.memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TCEEditorWidget.memoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin begin
fNeedUpdate := true;
if (sender is TCESynMemo) then if (sender is TCESynMemo) then
identifierToD2Syn(TCESynMemo(Sender)); identifierToD2Syn(TCESynMemo(Sender));
end; end;
procedure TCEEditorWidget.memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure TCEEditorWidget.memoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin begin
fNeedUpdate := true;
if (sender is TCESynMemo) then if (sender is TCESynMemo) then
identifierToD2Syn(TCESynMemo(Sender)); identifierToD2Syn(TCESynMemo(Sender));
end; end;
procedure TCEEditorWidget.memoChange(Sender: TObject);
var
ed: TCESynMemo;
begin
fNeedUpdate := true;
ed := TCESynMemo(sender);
ed.modified := true;
end;
procedure TCEEditorWidget.UpdaterProc;
const
modstr: array[boolean] of string = ('...','MODIFIED');
var
ed: TCESynMemo;
begin
ed := getCurrentEditor;
if ed <> nil then
begin
editorStatus.Panels[0].Text := format('%d : %d',[ed.CaretY, ed.CaretX]);
editorStatus.Panels[1].Text := modstr[ed.modified];
editorStatus.Panels[2].Text := ed.fileName;
end;
end;
end. end.

View File

@ -27,6 +27,12 @@ object CEMainForm: TCEMainForm
object MenuItem4: TMenuItem object MenuItem4: TMenuItem
Action = actSaveFile Action = actSaveFile
end end
object MenuItem25: TMenuItem
Caption = '-'
end
object MenuItem26: TMenuItem
Action = actAddCurrToProj
end
end end
object MenuItem7: TMenuItem object MenuItem7: TMenuItem
Caption = 'Edit' Caption = 'Edit'
@ -60,6 +66,21 @@ object CEMainForm: TCEMainForm
end end
object MenuItem14: TMenuItem object MenuItem14: TMenuItem
Caption = 'Project' Caption = 'Project'
object MenuItem31: TMenuItem
Action = actNewProj
end
object MenuItem30: TMenuItem
Action = actOpenProj
end
object MenuItem29: TMenuItem
Caption = '-'
end
object MenuItem27: TMenuItem
Action = actSaveProj
end
object MenuItem28: TMenuItem
Action = actSaveProjAs
end
end end
object MenuItem8: TMenuItem object MenuItem8: TMenuItem
Caption = 'Run' Caption = 'Run'
@ -94,9 +115,10 @@ object CEMainForm: TCEMainForm
OnExecute = actCopyExecute OnExecute = actCopyExecute
ShortCut = 16451 ShortCut = 16451
end end
object Action3: TAction object actSaveProj: TAction
Category = 'Project' Category = 'Project'
Caption = 'Action3' Caption = 'Save project'
OnExecute = actSaveProjExecute
end end
object Action4: TAction object Action4: TAction
Category = 'Windows' Category = 'Windows'
@ -135,9 +157,10 @@ object CEMainForm: TCEMainForm
Category = 'Run' Category = 'Run'
Caption = 'Compile and run project' Caption = 'Compile and run project'
end end
object Action1: TAction object actSaveProjAs: TAction
Category = 'Project' Category = 'Project'
Caption = 'Action1' Caption = 'Save project as...'
OnExecute = actSaveProjAsExecute
end end
object actPaste: TAction object actPaste: TAction
Category = 'Edit' Category = 'Edit'
@ -180,6 +203,21 @@ object CEMainForm: TCEMainForm
Caption = 'New runnable module' Caption = 'New runnable module'
OnExecute = actNewRunnableExecute OnExecute = actNewRunnableExecute
end end
object actAddCurrToProj: TAction
Category = 'File'
Caption = 'Add file to project'
OnExecute = actAddCurrToProjExecute
end
object actOpenProj: TAction
Category = 'Project'
Caption = 'Open project...'
OnExecute = actOpenProjExecute
end
object actNewProj: TAction
Category = 'Project'
Caption = 'New project'
OnExecute = actNewProjExecute
end
end end
object imgList: TImageList object imgList: TImageList
left = 64 left = 64

View File

@ -17,8 +17,11 @@ type
actCompileProj: TAction; actCompileProj: TAction;
ActCompileAndRunProj: TAction; ActCompileAndRunProj: TAction;
ActCompAndRunFileWithArgs: TAction; ActCompAndRunFileWithArgs: TAction;
Action1: TAction; actNewProj: TAction;
actOpenProj: TAction;
actSaveProjAs: TAction;
actCut: TAction; actCut: TAction;
actAddCurrToProj: TAction;
actNewRunnable: TAction; actNewRunnable: TAction;
actMacPlay: TAction; actMacPlay: TAction;
actMacStartStop: TAction; actMacStartStop: TAction;
@ -30,7 +33,7 @@ type
actSaveFileAs: TAction; actSaveFileAs: TAction;
actSaveFile: TAction; actSaveFile: TAction;
actCopy: TAction; actCopy: TAction;
Action3: TAction; actSaveProj: TAction;
Action4: TAction; Action4: TAction;
Actions: TActionList; Actions: TActionList;
imgList: TImageList; imgList: TImageList;
@ -52,13 +55,21 @@ type
MenuItem22: TMenuItem; MenuItem22: TMenuItem;
MenuItem23: TMenuItem; MenuItem23: TMenuItem;
MenuItem24: TMenuItem; MenuItem24: TMenuItem;
MenuItem25: TMenuItem;
MenuItem26: TMenuItem;
MenuItem27: TMenuItem;
MenuItem28: TMenuItem;
MenuItem29: TMenuItem;
MenuItem3: TMenuItem; MenuItem3: TMenuItem;
MenuItem30: TMenuItem;
MenuItem31: TMenuItem;
MenuItem4: TMenuItem; MenuItem4: TMenuItem;
MenuItem5: TMenuItem; MenuItem5: TMenuItem;
MenuItem6: TMenuItem; MenuItem6: TMenuItem;
MenuItem7: TMenuItem; MenuItem7: TMenuItem;
MenuItem8: TMenuItem; MenuItem8: TMenuItem;
MenuItem9: TMenuItem; MenuItem9: TMenuItem;
procedure actAddCurrToProjExecute(Sender: TObject);
procedure actCompAndRunFileExecute(Sender: TObject); procedure actCompAndRunFileExecute(Sender: TObject);
procedure ActCompAndRunFileWithArgsExecute(Sender: TObject); procedure ActCompAndRunFileWithArgsExecute(Sender: TObject);
procedure actCopyExecute(Sender: TObject); procedure actCopyExecute(Sender: TObject);
@ -67,12 +78,16 @@ type
procedure actMacPlayExecute(Sender: TObject); procedure actMacPlayExecute(Sender: TObject);
procedure actMacStartStopExecute(Sender: TObject); procedure actMacStartStopExecute(Sender: TObject);
procedure actNewFileExecute(Sender: TObject); procedure actNewFileExecute(Sender: TObject);
procedure actNewProjExecute(Sender: TObject);
procedure actNewRunnableExecute(Sender: TObject); procedure actNewRunnableExecute(Sender: TObject);
procedure actOpenFileExecute(Sender: TObject); procedure actOpenFileExecute(Sender: TObject);
procedure actOpenProjExecute(Sender: TObject);
procedure actPasteExecute(Sender: TObject); procedure actPasteExecute(Sender: TObject);
procedure actRedoExecute(Sender: TObject); procedure actRedoExecute(Sender: TObject);
procedure actSaveFileAsExecute(Sender: TObject); procedure actSaveFileAsExecute(Sender: TObject);
procedure actSaveFileExecute(Sender: TObject); procedure actSaveFileExecute(Sender: TObject);
procedure actSaveProjAsExecute(Sender: TObject);
procedure actSaveProjExecute(Sender: TObject);
procedure actUndoExecute(Sender: TObject); procedure actUndoExecute(Sender: TObject);
private private
fProject: TCEProject; fProject: TCEProject;
@ -80,20 +95,35 @@ type
fMesgWidg: TCEMessagesWidget; fMesgWidg: TCEMessagesWidget;
fEditWidg: TCEEditorWidget; fEditWidg: TCEEditorWidget;
fProjWidg: TCEProjectWidget; fProjWidg: TCEProjectWidget;
//
// widget interfaces subroutines
procedure checkWidgetActions(const aWidget: TCEWidget);
// run & exec sub routines
procedure ProcessOutputToMsg(const aProcess: TProcess); procedure ProcessOutputToMsg(const aProcess: TProcess);
// procedure compileAndRunFile(const edIndex: NativeInt; const runArgs: string = '');
// file sub routines
procedure newFile; procedure newFile;
function findFile(const aFilename: string): NativeInt; function findFile(const aFilename: string): NativeInt;
procedure openFile(const aFilename: string);
procedure saveFile(const edIndex: NativeInt); procedure saveFile(const edIndex: NativeInt);
procedure saveFileAs(const edIndex: NativeInt; const aFilename: string); procedure saveFileAs(const edIndex: NativeInt; const aFilename: string);
//
procedure compileAndRunFile(const edIndex: NativeInt; const runArgs: string = ''); // project sub routines
procedure projChange(sender: TObject);
procedure newProj;
procedure saveProj;
procedure saveProjAs(const aFilename: string);
procedure openProj(const aFilename: string);
procedure closeProj;
procedure addSource(const aFilename: string);
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
// //
procedure openFile(const aFilename: string);
//
property WidgetList: TCEWidgetList read fWidgList; property WidgetList: TCEWidgetList read fWidgList;
property MessageWidget: TCEMessagesWidget read fMesgWidg; property MessageWidget: TCEMessagesWidget read fMesgWidg;
property EditWidget: TCEEditorWidget read fEditWidg; property EditWidget: TCEEditorWidget read fEditWidg;
@ -123,12 +153,15 @@ begin
fWidgList.addWidget(@fEditWidg); fWidgList.addWidget(@fEditWidg);
fWidgList.addWidget(@fProjWidg); fWidgList.addWidget(@fProjWidg);
checkWidgetActions(fMesgWidg);
fMesgWidg.Show; fMesgWidg.Show;
fEditWidg.Show; fEditWidg.Show;
fProjWidg.Show; fProjWidg.Show;
fProject := TCEProject.Create(self); fProject := TCEProject.Create(self);
fProjWidg.project := fProject; fProject.onChange := @projChange;
end; end;
destructor TCEMainForm.destroy; destructor TCEMainForm.destroy;
@ -165,6 +198,7 @@ begin
// //
actSaveFile.Enabled := true; actSaveFile.Enabled := true;
actSaveFileAs.Enabled := true; actSaveFileAs.Enabled := true;
actAddCurrToProj.Enabled := true;
end end
else begin else begin
actCopy.Enabled := false; actCopy.Enabled := false;
@ -180,6 +214,30 @@ begin
// //
actSaveFile.Enabled := false; actSaveFile.Enabled := false;
actSaveFileAs.Enabled := false; actSaveFileAs.Enabled := false;
actAddCurrToProj.Enabled := false;
end;
end;
procedure TCEMainForm.checkWidgetActions(const aWidget: TCEWidget);
var
tlt: string;
cnt, i: NativeInt;
prt, itm: TMenuItem;
begin
tlt := aWidget.contextName;
if tlt = '' then exit;
cnt := aWidget.contextActionCount;
if cnt = 0 then exit;
//
prt := TMenuItem.Create(self);
prt.Caption := tlt;
mainMenu.Items.Add(prt);
for i := 0 to cnt-1 do
begin
itm := TMenuItem.Create(self);
itm.Action := aWidget.contextAction(i);
prt.Add(itm);
end; end;
end; end;
@ -188,20 +246,20 @@ end;
{$REGION file ******************************************************************} {$REGION file ******************************************************************}
procedure TCEMainForm.newFile; procedure TCEMainForm.newFile;
var var
i: NativeInt; i, j: NativeInt;
str: string; str: string;
begin begin
if fEditWidg = nil then exit; if fEditWidg = nil then exit;
// //
i := fEditWidg.editorCount; i := fEditWidg.editorCount;
fEditWidg.addEditor; fEditWidg.addEditor;
i := 0; j := 0;
while(true) do while(true) do
begin begin
str := format('<new %d>',[i]); str := format('<new %d>',[j]);
if findFile(str) = -1 then break; if findFile(str) = -1 then break;
if i >= high(NativeInt) then break; if j >= high(NativeInt) then break;
i += 1; j += 1;
end; end;
fEditWidg.editor[i].fileName := str; fEditWidg.editor[i].fileName := str;
fEditWidg.editor[i].modified := true; fEditWidg.editor[i].modified := true;
@ -215,11 +273,7 @@ begin
result := -1; result := -1;
if fEditWidg = nil then exit; if fEditWidg = nil then exit;
for i := 0 to fEditWidg.editorCount-1 do for i := 0 to fEditWidg.editorCount-1 do
if fEditWidg.editor[i].fileName = aFilename then if fEditWidg.editor[i].fileName = aFilename then exit(i);
begin
result := i;
exit;
end;
end; end;
procedure TCEMainForm.openFile(const aFilename: string); procedure TCEMainForm.openFile(const aFilename: string);
@ -237,6 +291,7 @@ begin
i := fEditWidg.editorCount; i := fEditWidg.editorCount;
fEditWidg.addEditor; fEditWidg.addEditor;
fEditWidg.editor[i].Lines.LoadFromFile(aFilename); fEditWidg.editor[i].Lines.LoadFromFile(aFilename);
fEditWidg.editor[i].fileName := aFilename;
fEditWidg.PageControl.PageIndex := i; fEditWidg.PageControl.PageIndex := i;
end; end;
@ -302,7 +357,7 @@ begin
'{' + #13#10 + '{' + #13#10 +
' writeln("runnable module is just a `toy feature`");' + #13#10 + ' writeln("runnable module is just a `toy feature`");' + #13#10 +
' writeln;' + #13#10 + ' writeln;' + #13#10 +
' writeln("coedit just saves a temporar d module before compiling it and running it...");' + #13#10 + ' writeln("coedit just saves a temporary d module before compiling it and running it...");' + #13#10 +
'}' + #13#10; '}' + #13#10;
end; end;
@ -333,6 +388,17 @@ begin
if fileExists(str) then saveFile(fEditWidg.editorIndex) if fileExists(str) then saveFile(fEditWidg.editorIndex)
else actSaveFileAs.Execute; else actSaveFileAs.Execute;
end; end;
procedure TCEMainForm.actAddCurrToProjExecute(Sender: TObject);
var
str: string;
begin
if fEditWidg = nil then exit;
if fEditWidg.editorIndex < 0 then exit;
//
str := fEditWidg.editor[fEditWidg.editorIndex].fileName;
fProject.addSource(str);
end;
{$ENDREGION} {$ENDREGION}
{$REGION edit ******************************************************************} {$REGION edit ******************************************************************}
@ -442,7 +508,7 @@ begin
dmdproc := TProcess.Create(nil); dmdproc := TProcess.Create(nil);
runproc := TProcess.Create(nil); runproc := TProcess.Create(nil);
try try
temppath := ''; temppath := GetTempDir;
{$IFDEF DEBUG}{$WARNINGS OFF}{$HINTS OFF}{$ENDIF} {$IFDEF DEBUG}{$WARNINGS OFF}{$HINTS OFF}{$ENDIF}
fname := temppath + format('temp_%.8x',[LongWord(@dmdproc)]); fname := temppath + format('temp_%.8x',[LongWord(@dmdproc)]);
{$IFDEF DEBUG}{$WARNINGS ON}{$HINTS ON}{$ENDIF} {$IFDEF DEBUG}{$WARNINGS ON}{$HINTS ON}{$ENDIF}
@ -508,4 +574,78 @@ end;
{$REGION view ******************************************************************} {$REGION view ******************************************************************}
{$ENDREGION} {$ENDREGION}
{$REGION project ***************************************************************}
procedure TCEMainForm.projChange(sender: TObject);
var
i: NativeInt;
begin
for i:= 0 to WidgetList.Count-1 do
widgetList.widget[i].projChange(fProject);
end;
procedure TCEMainForm.newProj;
begin
fProject.reset;
end;
procedure TCEMainForm.saveProj;
begin
saveCompToTxtFile(fProject, fProject.fileName);
end;
procedure TCEMainForm.saveProjAs(const aFilename: string);
begin
fProject.fileName := aFilename;
saveCompToTxtFile(fProject, aFilename);
end;
procedure TCEMainForm.openProj(const aFilename: string);
begin
newProj;
fProject.fileName := aFilename;
loadCompFromTxtFile(fProject, aFilename);
end;
procedure TCEMainForm.closeProj;
begin
newProj;
end;
procedure TCEMainForm.actNewProjExecute(Sender: TObject);
begin
closeProj;
end;
procedure TCEMainForm.addSource(const aFilename: string);
begin
if fProject.Sources.IndexOf(aFilename) >= 0 then exit;
fProject.addSource(aFilename);
end;
procedure TCEMainForm.actSaveProjAsExecute(Sender: TObject);
begin
with TSaveDialog.Create(nil) do
try
if execute then saveProjAs(filename);
finally
Free;
end;
end;
procedure TCEMainForm.actSaveProjExecute(Sender: TObject);
begin
if fProject.fileName <> '' then saveProj
else actSaveProjAs.Execute;
end;
procedure TCEMainForm.actOpenProjExecute(Sender: TObject);
begin
with TOpenDialog.Create(nil) do
try
if execute then openProj(filename);
finally
Free;
end;
end;
{$ENDREGION}
end. end.

View File

@ -1,35 +1,35 @@
inherited CEMessagesWidget: TCEMessagesWidget inherited CEMessagesWidget: TCEMessagesWidget
Left = 1249 Left = 1248
Height = 186 Height = 186
Top = 643 Top = 643
Width = 656 Width = 657
Caption = 'MessagesWidget' Caption = 'MessagesWidget'
ClientHeight = 186 ClientHeight = 186
ClientWidth = 656 ClientWidth = 657
inherited Back: TPanel inherited Back: TPanel
Height = 186 Height = 186
Width = 656 Width = 657
ClientHeight = 186 ClientHeight = 186
ClientWidth = 656 ClientWidth = 657
inherited Content: TScrollBox inherited Content: TScrollBox
Height = 160 Height = 160
Width = 656 Width = 657
HorzScrollBar.Page = 652 HorzScrollBar.Page = 653
VertScrollBar.Page = 156 VertScrollBar.Page = 156
ClientHeight = 156 ClientHeight = 156
ClientWidth = 652 ClientWidth = 653
object List: TListView[0] object List: TListView[0]
Left = 2 Left = 2
Height = 152 Height = 152
Top = 2 Top = 2
Width = 648 Width = 649
Align = alClient Align = alClient
AutoSort = False AutoSort = False
AutoWidthLastColumn = True AutoWidthLastColumn = True
BorderSpacing.Around = 2 BorderSpacing.Around = 2
Columns = < Columns = <
item item
Width = 644 Width = 645
end> end>
GridLines = True GridLines = True
IconOptions.Arrangement = iaLeft IconOptions.Arrangement = iaLeft
@ -40,7 +40,108 @@ inherited CEMessagesWidget: TCEMessagesWidget
end end
end end
inherited Header: TPanel inherited Header: TPanel
Width = 656 Width = 657
end end
end end
object imgList: TImageList[1]
Bitmap = {
4C69030000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF003B85CC003B85CC003B85CC003B85CC003B85
CC003B85CC003983CA213384CDFF3384CDFF3983CA213B85CC003B85CC003B85
CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85
CC003983CB00337EC7CF84C3F1FF84C3F1FF337EC7CF3983CB003B85CC003B85
CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003A84
CB003580CA6D5398D7FFC1F0FFFFC1F0FFFF5398D7FF3580CA6D3A84CB003B85
CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003882
CA0A3A83CBFFB2E5FFFF9EC8DEFF9EC8DEFFB2E5FFFF3A83CBFF3882CA0A3B85
CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003983CB00337E
C8CF86BEEAFFA4ECFFFF6C5D53FF6C5D53FFA4ECFFFF86BEEAFF337EC8CF3983
CB003B85CC003B85CC003B85CC003B85CC003B85CC003A84CC003580C9585797
D5FFC6F3FFFF3ACAFFFF6C5B54FF6C5B54FF3ACAFFFFC6F3FFFF5797D5FF3580
C9583A84CC003B85CC003B85CC003B85CC003B85CC003882CA003C82C9FFC1E8
FDFF50CCFFFF27C5FFFF69554CFF69554CFF27C5FFFF50CCFFFFC1E8FDFF3C82
C9FF3882CA003B85CC003B85CC003B85CC003983CB00337EC8BB90BFE6FF6FD7
FFFF32C3FFFF34CBFFFF644B3FFF644B3FFF34CBFFFF32C3FFFF6FD7FFFF90BF
E6FF337EC8BB3983CB003B85CC003A84CC003680C9445B97D4FF9EE8FFFF38C7
FFFF3DC8FFFF3DCFFFFF4BBCE9FF4BBCE9FF3DCFFFFF3DC8FFFF38C7FFFF9EE8
FFFF5B97D4FF3680C9443A84CC003982CB003F82C9FFA3E0FAFF40CFFFFF44CE
FFFF46CFFFFF44D6FFFF775C50FF775C50FF44D6FFFF46CFFFFF44CEFFFF40CF
FFFFA3E0FAFF3F82C9FF3982CB003880C9947AB8E4FF52DBFFFF4BD5FFFF4DD5
FFFF4DD6FFFF4BDCFFFF67493FFF67493FFF4BDCFFFF4DD6FFFF4DD5FFFF4BD5
FFFF52DBFFFF7AB8E4FF3880C9943B86CDFF55E3FFFF55E3FFFF56E1FFFF56E1
FFFF56E2FFFF56E5FFFF55E9FFFF55E9FFFF56E5FFFF56E2FFFF56E1FFFF56E1
FFFF55E3FFFF55E3FFFF3B86CDFF3A82CAFF397FC8FF387DC7FF387CC7FF397C
C7FF397CC7FF387DC7FF387EC9FF387EC9FF387DC7FF397CC7FF397CC7FF387C
C7FF387DC7FF397FC8FF3A82CAFF000000330000003300000033000000330000
0033000000330000003300000033000000330000003300000033000000330000
0033000000330000003300000033FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
000000000000000000001B73A8FF000000000000000000000000000000000000
00000000000000000000FFFFFF00000000000000000000000000000000000000
000000000000186EA4FFD0F9FFFF186EA3FF0000000000000000000000000000
00000000000000000000FFFFFF00000000000000000000000000000000000000
00001B6FA3FF83DCFFFF16B2FFFF82DBFFFF1A6EA2FF00000000000000000000
00000000000000000000FFFFFF00000000000000000000000000000000001B6F
A3FF52B8F1FF22B9FFFF23BAFFFF21B8FFFF81DDFFFF1A6DA2FF000000000000
00000000000000000000FFFFFF000000000000000000000000001A6EA2FF7EDF
FFFF29BBFFFF2AC0FFFF3B1707FF2AC0FFFF27BAFFFF7DDEFFFF1A6DA2FF0000
00000000000000000000FFFFFF0000000000000000001A6DA2FF7CDFFFFF2CBD
FFFF2FBEFFFF2FC7FFFF452619FF2FC6FFFF2EBEFFFF2CBDFFFF7CDFFFFF1A6D
A2FF0000000000000000FFFFFF0000000000196DA3FF78E0FFFF32C1FFFF34C0
FFFF35C2FFFF34CBFFFF503024FF34CBFFFF35C2FFFF34C0FFFF32C1FFFF78E0
FFFF196DA3FF00000000FFFFFF001C73A8FF9BF5FFFF36C8FFFF39C4FFFF3BC4
FFFF3BC6FFFF39CEFFFF5A3A2DFF39CEFFFF3BC6FFFF3BC4FFFF39C4FFFF36C8
FFFF9BF5FFFF1C73A8FFFFFFFF0000000033196DA3FF6FE2FFFF3ECCFFFF3FC9
FFFF3FCAFFFF3DD1FFFF654233FF3DD1FFFF3FCAFFFF3FC9FFFF3ECCFFFF6FE2
FFFF196DA3FF00000033FFFFFF0000000000000000331B6DA3FF4EC1F0FF44D1
FFFF44CEFFFF44D4FFFF3AA1CAFF44D4FFFF44CEFFFF44D0FFFF4EC1F0FF1B6D
A3FF0000003300000000FFFFFF000000000000000000000000331B6DA3FF6AE6
FFFF4BD5FFFF4AD7FFFF471D11FF49D6FFFF4AD4FFFF6AE5FFFF1B6DA3FF0000
00330000000000000000FFFFFF00000000000000000000000000000000331B6D
A3FF4DC4F0FF4FDBFFFF4DDAFFFF4EDAFFFF66E6FFFF1A6CA2FF000000330000
00000000000000000000FFFFFF00000000000000000000000000000000000000
00331B6DA3FF63E8FFFF55E0FFFF63E7FFFF1A6CA2FF00000033000000000000
00000000000000000000FFFFFF00000000000000000000000000000000000000
0000000000331B6DA4FF66F0FFFF1B6DA3FF0000003300000000000000000000
00000000000000000000FFFFFF00000000000000000000000000000000000000
000000000000000000331E73A8FF000000330000000000000000000000000000
00000000000000000000FFFFFF00000000000000000000000000000000000000
0000000000000000000000000033000000000000000000000000000000000000
00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D898
5223D4964D7DD2924CDBCD8C45F3CB8B41F3C98B40DBC78B407DC5873D23FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D6974F53D191
49E6D0A06AFFE0BFA0FFE3C5AEFFE3C5AEFFDFBC9FFFC89762FFBD7D35E6BC7E
3553FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D4964D53CF8D47F4D9B2
8CFFE6CDB8FFE0BA9DFFD7AB85FFD6A982FFD9B391FFE1C2ABFFD4AE86FFB16B
35F4B16F3553FFFFFF00FFFFFF00FFFFFF00D2934C22CE8E47E5D9B28CFFE6CA
B3FFD6A97DFFD1A579FFE2C4A8FFE1C3A8FFD0A276FFD1A477FFDDBDA2FFD0AC
85FFAB6635E5A9653522FFFFFF00FFFFFF00CE91477ECD9C68FFE7CBB4FFD4A5
7AFFD0A077FFCF9E74FFFBF8F5FFFBF8F5FFCB9E71FFCB9D71FFCDA177FFDFC0
A5FFB98A5BFFA45C347EFFFFFF00FFFFFF00CB8E41DBE0BC9FFFDBB393FFCFA0
75FFCD9E72FFCB9C71FFDDBFA3FFDDBFA2FFC5996BFFC5996BFFC4986BFFD1AB
85FFD8BA97FF9E5635DBFFFFFF00FFFFFF00C5853BF6E4C9B0FFD0A37AFFCC9D
71FFC79A6CFFC5986BFFFFFFFFFFFFFFFEFFC39669FFC19468FFC29468FFC398
6DFFDFC5ABFF955334F6FFFFFF00FFFFFF00BF7E35F6E3C7AFFFD0A276FFC599
6BFFC4976AFFC49669FFEEE0D4FFFBF7F4FFBF9066FFBE8F65FFBE8F64FFBE92
69FFDFC6AAFF925034F6FFFFFF00FFFFFF00BC7E35DBDBBC9CFFD5AD89FFC798
6CFFC39569FFC19367FFEDDFD3FFFAF7F4FFBB8B63FFB98A63FFB88A62FFC59D
78FFD2B893FF905135DBFFFFFF00FFFFFF00B878357EBF915EFFE0C2A8FFC596
6CFFC29169FFE1CBB8FFFEFDFCFFFFFFFEFFEADCD0FFB4855EFFB3855EFFD4B5
99FFAE7B56FF8F51357EFFFFFF00FFFFFF00AF703522AB6935E5CFAA81FFDABC
A2FFBE9166FFBA8C62FFB7895FFFB3845EFFB1835DFFB0835CFFCDAA8DFFC6A5
79FF895034E589503522FFFFFF00FFFFFF00FFFFFF00A76234539F5533F4CBA7
7DFFD8BB9FFFC39C77FFB68A62FFB48660FFBE9672FFD1B397FFC5A377FF844F
35F489503553FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009F5634539955
34E6B28057FFD5B793FFDBC3A6FFDAC3A6FFD2B490FFAB7A52FF864F34E68850
3553FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009754
35239453347D925234DB8A5034F3884F34F3895035DB8950357D84503623FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00
}
end
end end

View File

@ -6,22 +6,28 @@ interface
uses uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Classes, SysUtils, Forms, Controls, Graphics, Dialogs,
ExtCtrls, ComCtrls, ce_widget, ce_common; ExtCtrls, ComCtrls, ce_widget, ActnList;
type type
{ TCEMessagesWidget } { TCEMessagesWidget }
TCEMessagesWidget = class(TCEWidget,ICEMultiDocMonitor) TCEMessagesWidget = class(TCEWidget)
imgList: TImageList;
List: TListView; List: TListView;
private private
fActClear: TAction;
fActSaveMsg: TAction;
procedure actClearExecute(Sender: TObject);
procedure actSaveMsgExecute(Sender: TObject);
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
// //
procedure addMessage(const aMsg: string); procedure addMessage(const aMsg: string);
// //
procedure docChange(const aNewIndex: integer); function contextName: string; override;
procedure docClose(const aNewIndex: integer); function contextActionCount: integer; override;
function contextAction(index: integer): TAction; override;
end; end;
PTCEMessageItem = ^TCEMessageItem; PTCEMessageItem = ^TCEMessageItem;
@ -38,6 +44,13 @@ constructor TCEMessagesWidget.create(aOwner: TComponent);
begin begin
inherited; inherited;
fID := 'ID_MSGS'; fID := 'ID_MSGS';
//
fActClear := TAction.Create(self);
fActClear.OnExecute := @actClearExecute;
fActClear.caption := 'Clear messages';
fActSaveMsg := TAction.Create(self);
fActSaveMsg.OnExecute := @actSaveMsgExecute;
fActSaveMsg.caption := 'Save messages to...';
end; end;
destructor TCEMessagesWidget.destroy; destructor TCEMessagesWidget.destroy;
@ -55,15 +68,50 @@ begin
List.Items.AddItem(item); List.Items.AddItem(item);
end; end;
procedure TCEMessagesWidget.docChange(const aNewIndex: integer); function TCEMessagesWidget.contextName: string;
begin begin
// can grow the list... result := 'Messages';
// can display matching msgs from a list...
end; end;
procedure TCEMessagesWidget.docClose(const aNewIndex: integer); function TCEMessagesWidget.contextActionCount: integer;
begin begin
// can shrink the list... result := 2;
end;
function TCEMessagesWidget.contextAction(index: integer): TAction;
begin
case index of
0: result := fActClear;
1: result := fActSaveMsg;
end;
end;
procedure TCEMessagesWidget.actClearExecute(Sender: TObject);
begin
List.Clear;
end;
procedure TCEMessagesWidget.actSaveMsgExecute(Sender: TObject);
var
lst: TStringList;
itm: TListItem;
begin
with TSaveDialog.Create(nil) do
try
if execute then
begin
lst := TStringList.Create;
try
for itm in List.Items do
lst.Add(itm.Caption);
lst.SaveToFile(filename);
finally
lst.Free;
end;
end;
finally
free;
end;
end; end;
end. end.

View File

@ -24,14 +24,158 @@ inherited CEProjectWidget: TCEProjectWidget
Top = 2 Top = 2
Width = 155 Width = 155
Align = alTop Align = alTop
AutoExpand = True
BorderSpacing.Around = 2 BorderSpacing.Around = 2
DefaultItemHeight = 18 DefaultItemHeight = 18
Images = imgList
ReadOnly = True
ScrollBars = ssAutoBoth ScrollBars = ssAutoBoth
ShowRoot = False
TabOrder = 0 TabOrder = 0
Options = [tvoAutoExpand, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoToolTips, tvoThemedDraw]
Items.Data = {
F9FFFFFF020002000000000000000000000000000000FFFFFFFF000000000000
0000000C000000536F757263652066696C6573010000000100000001000000FF
FFFFFF0000000000000000000E000000436F6E66696775726174696F6E73
}
end end
end end
inherited Header: TPanel inherited Header: TPanel
Width = 163 Width = 163
end end
end end
object imgList: TImageList[2]
top = 3
Bitmap = {
4C69040000001000000010000000B3B3B1EFB0B0ADFFAEAEACFFAEAEACFFAEAE
ACFFAFAFACFFAFAFADFFB1B1AFD5B4B4B100B5B5B300B5B5B300B5B5B300B5B5
B300B5B5B300B5B5B300B5B5B300AFAFADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFEDEDEEFFB3B3B0A4B5B5B300B5B5B300B5B5B300B5B5
B300B5B5B300B5B5B300B5B5B300AEAEACFFFFFFFFFFE3E3E2FFBEBEBCFFA8A8
A6FFA8A8A6FFACACAAFFB0B0ADFFB2B2B0FFB3B3B1FFB4B4B2A8B4B4B200B4B4
B200B4B4B200B5B5B300B5B5B300AEAEABFFFFFFFFFFE9E8E7FFA8A8A6FFFFFF
FFFFFFFFFFFFD1D1D0FFADADABFFADADABFFAEAEABFFADADABFFAEAEABFFAFAF
ADFFB0B0AEACB3B3B100B5B5B300ADADABFFFFFFFFFFEDECECFFA8A8A5FFFFFF
FFFFE4E4E3FFA9A9A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFE9E9E9FFAFAFADA7B3B3B100ADADABFFFFFFFFFFF1F1F0FFA7A7A5FFFFFF
FFFFEAE8E7FFA8A8A6FFFFFFFFFFE0E0DFFFE0E0DFFFE0E0DFFFFFFFFFFFA4A4
A2FFFFFFFFFFE9E9E9FFB0B0AEACADADABFFFFFFFFFFF5F5F4FFA7A7A5FFFFFF
FFFFEDECECFFA8A8A5FFFFFFFFFFE5E4E3FFE6E5E4FFE5E4E3FFFFFFFFFFCACA
C9FFA4A4A2FFFFFFFFFFAFAFADFFADADABFFFFFFFFFFF9F8F8FFA7A7A5FFFFFF
FFFFF1F1F0FFA7A7A5FFFFFFFFFFE9E8E8FFEAE8E9FFE9E8E8FFF3F2F2FFFFFF
FFFFFFFFFFFFFFFFFFFFAEAEABFFADADABFFFFFFFFFFFDFCFCFFA6A7A4FFFFFF
FFFFF5F5F4FFA7A7A5FFFFFFFFFFECECEBFFEDEDECFFEDEDECFFECECEBFFEBEB
EAFFEBEBEAFFFFFFFFFFADADABFFAEAEABFFFFFFFFFFFFFFFFFFA7A7A4FFFFFF
FFFFF9F8F8FFA7A7A4FFFFFFFFFFF0F0EFFFF0F0EFFFF0F0EFFFF0F0EFFFEFEF
EEFFEFEFEEFFFFFFFFFFADADABFFB0B0ADFFFFFFFFFFFFFFFFFFA8A8A6FFFFFF
FFFFFDFCFCFFA6A7A4FFFFFFFFFFF4F3F3FFF4F3F3FFF4F3F3FFF4F3F3FFF4F3
F3FFF4F3F3FFFFFFFFFFADADABFFB0B0AEF1B0B0AEFFAFAFADFFACACA9FFFFFF
FFFFFFFFFFFFA6A7A4FFFFFFFFFFF7F6F6FFF7F6F6FFF7F6F6FFF7F6F6FFF7F6
F6FFF7F6F6FFFFFFFFFFADADABFF0000002F6666655D54545351AFAFADFFFFFF
FFFFFFFFFFFFA8A8A6FFFFFFFFFFFCFCFCFFFBFBFCFFFBFBFCFFFBFBFCFFFBFB
FCFFFCFCFCFFFFFFFFFFAEAEABFFB5B5B3000000000B00000008A4A4A2BDB0B0
AEFFAFAFADFFADADABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFB0B0ADFFB5B5B300B5B5B300B5B5B300000000230000
003300000033AFAFADECAFAFADFFAEAEABFFADADABFFADADABFFADADABFFADAD
ABFFAEAEABFFAFAFADFFB1B1AFF2000000000000000000000000000000000000
0000000000000000002E00000033000000330000003300000033000000330000
0033000000330000003300000030FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009E9E9E709C9C9CD69B9B9BFB9999
99FBFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF009D9D9D709B9B9BF5E4E4E4FFEEEEEEFF9696
96FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF009B9B9BD6E2E2E2FFE7E7E7FFB9B9B9FF9393
93FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00989898FBE4E4E4FFCFCFCFFF929292C2FFFF
FF008E8E8EFF8C8C8CFF8A8A8AFBFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00969696FCDDDDDDFFC5C5C5FF8F8F8FC18D8D
8DC3ACACACFFD7D7D7FF878787FBFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF0095959548939393FED4D4D4FFC8C8C8FFBCBCBCFFBABA
BAFFC2C2C2FFC4C4C4FF858585D6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00E3AD8B92DAA788CF929292FBC7C7C7FFCCCCCCFFC7C7C7FFC6C6C6FFC3C3
C3FFC0C0C0FF848484F582828270FFFFFF00FFFFFF00FFFFFF00FFFFFF00E1A9
8992E7B99CFFE6B698FFD8A98CFFD2D2D2FFB5B5B5FF898989FE878787FB8585
85FB838383D681818170FFFFFF00FFFFFF00FFFFFF00FFFFFF00E1A98792E6B7
9CFFEFCFBCFFEECEBAFFE2AE8CFFD29B7BFF888888F786868623FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E1A78592E6B799FFEECE
BBFFE9C0A7FFE8BDA3FFECC8B3FFDFA481FFD2895DC9FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00DFA58392E6B498FFEECDBAFFE9BF
A5FFE5B496FFE7B99DFFEBC6AEFFDE9F79FFD58351AAFFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00DFA57F92E6B394FFEECCB8FFE9BEA5FFE5B3
94FFE6B79BFFEAC4ADFFDE9E78FFD3814FACFFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00DD9F79FFEDCCB7FFE8BDA3FFE4B192FFE6B6
9AFFEAC3ACFFDE9C74FFD37F4DACFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00DB976FFFEDC8B3FFE7B89BFFE6B498FFEAC3
ABFFDE9C73FFD17D49AFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00D99165CCDFA481FFEAC2ABFFEAC0A8FFDC99
71FFD17B47AFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D58757D5D58351FFD17D4BFFD179
45AFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00BB871F00BB871F00BB871E00B9841A00B67E
0FEAC4973BFFC79D49FFC39538FFB37904FFB47A07FFB47A07FFB47A08FFB57C
0AFFB67F0FFFB88114FFBA851B23BB871F00BB871F00BA861D00B7801283E4CF
A7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFE9DABAFFEEE2C9FFB67F14BFBB871F00BB871F00B9851B00B27A09E5FFFF
FFFFFFFFFFFFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFDFFFFFFFEFFFFFF
FFFFC69941FFECDFC2FFC19234FFBB871F00BB871E00B9831800C89E4AFFFFFF
FFFFFFFDF7FFFFFCF5FFFFFCF4FFFEFBF4FFFEFBF3FFFFFCF4FFFFFDF6FFFFFF
FFFFB27701FFBA851CFFBC8922FFBB871F00BB861E00B882150CCDA557FFFFFF
FFFF96989BFFC3C1BEFFC2C0BDFFC0BFBCFFFFFBF0FF96979AFFC3C2C2FFFFFF
FFFFAA7508D00000003300000033BB871F00BB861D00B07B1134DDC18AFFFFFF
FFFFFFF9EBFFFFF9EAFFFEF7E9FFFDF7E9FFFEF7E9FFFFF8E9FFFFFFFAFFF0E4
CAFFA8740CB2BA851C00BD8C2800BB871F00BA861D00AE790F73EDDDBDFFC1C4
C7FFA8A9A9FFC2C1BAFFC0BFB9FFFBF4E1FF989A9EFFC0BFB8FFFFFFFCFFE4D0
A4FFA2710E90BA861D00BB871E00BB871F00BA851C00AB770C9BF3E6CDFFFDF5
E4FFFAF2DBFFFAF1DBFFF8EFDAFFF7EFD9FFFAF0DAFFF8EFD9FFFFFFFFFFD7B8
79FF9A6C106BBB861D00BB871F00BB871F00BA851C00B07A0BD2FFFFFFFF999D
A4FFC0BFB8FFBFBEB8FFBEBDB7FFF6EDD4FF999BA2FFBEBCB5FFFFFFFFFFC9A0
4BFF90661141BB871E00BB871F00BB871E00B9841900B8821BEFFFFFFFFFF4EC
D4FFF5ECD3FFF4EBD4FFF4EBD3FFF3EAD4FFF3E9D1FFF1E6CCFFFFFFFFFFC190
31FF0000000ABB871F00BB871F00B98419FFB67E0EFFB67F10FFC0902EFFBF8E
2AFFBF8E29FFC08E2AFFC08F2BFFC0902DFFD8BB7DFFF1E9D2FFFFFFFDFFB57C
0AFFBA851B00BB871F00BB871F00B78012FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFE9D9B7FFBB861DFFF4EEDCFFF6F0E2FFB17B
0FE8BA851D00BB871F00BB871F00AC7A14CADCC189FFF5F0E0FFF4EDDBFFF4ED
DBFFF4EDDBFFF4EDDBFFF5EFDDFFF7F2E3FFDFCA99FFF8F4EAFFCFAB61FF9D6F
1399BB861E00BB871F00BB871F0060440E44B88114FFB67E0FFFB57D0DFFB57D
0CFFB57D0CFFB57D0CFFB67D0DFFB67E0FFFB77F11FFB78012FFB58016EE0000
001ABB871F00BB871F00BB871F00000000070000003300000033000000330000
00330000003300000033000000330000003300000033000000330000002F0000
0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0000000000000000000000000000000000898785FF898785FF0000
0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00000000008D8B89FF999795FF84828044B8B6B4FFB8B6B4FF8482
8044999795FF8E8C8AFF00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0000000000989694FFDDDBDAFF9F9D9BFFD3D1D0FFD3D1D0FF9F9D
9BFFDDDBDAFF92908EFF00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00000000006D6B6A9B9E9C9AFFBFBDBCFF999796FF999796FFBFBD
BCFF9E9C9AFF6C6B699B00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00858381FFB2B0AFFFCFCDCCFF989693FF3332314A3332314A9896
93FFCECCCCFFB1AFAEFF8F8D8BFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00848280FFB1AFAEFFCCCAC9FF959392FF00000006000000069593
92FFCCCAC9FFB0AEADFF8E8C8AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00000000336563618B999796FFB8B6B5FF949290FF949290FFB8B6
B5FF999796FF6563618B00000033FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0000000000918F8DFFD1CFCEFF989695FFC8C6C5FFC8C6C5FF9896
95FFD1CFCEFF8A8888FF00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0000000000868482FF8A8885FF52504F69AAA8A7FFAAA8A7FF5250
4F698A8886FF868482FF00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF000000000000000033000000330000000E7F7D7CFF7F7D7CFF0000
000E000000330000003300000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF000000000000000000000000000000000000000033000000330000
0000000000000000000000000000
}
end
end end

View File

@ -9,29 +9,35 @@ uses
ComCtrls, ce_common, ce_widget; ComCtrls, ce_common, ce_widget;
type type
{ TCEProjectWidget }
{ TCEWidgetProject }
TCEProjectWidget = class(TCEWidget) TCEProjectWidget = class(TCEWidget)
imgList: TImageList;
Tree: TTreeView; Tree: TTreeView;
private private
fProject: TCEProject; fProject: TCEProject;
fFileNode, fConfNode: TTreeNode;
procedure updateView; procedure updateView;
procedure setProject(aValue: TCEProject); procedure TreeDblClick(sender: TObject);
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
// //
property project: TCEProject read fProject write setProject; procedure projChange(const aProject: TCEProject); override;
end; end;
implementation implementation
{$R *.lfm} {$R *.lfm}
uses
ce_main;
constructor TCEProjectWidget.create(aOwner: TComponent); constructor TCEProjectWidget.create(aOwner: TComponent);
begin begin
inherited; inherited;
fID := 'ID_PROJ'; fID := 'ID_PROJ';
Tree.OnDblClick := @TreeDblClick;
fFileNode := Tree.Items[0];
fConfNode := Tree.Items[1];
end; end;
destructor TCEProjectWidget.destroy; destructor TCEProjectWidget.destroy;
@ -39,17 +45,60 @@ begin
inherited; inherited;
end; end;
procedure TCEProjectWidget.setProject(aValue: TCEProject); procedure TCEProjectWidget.projChange(const aProject: TCEProject);
begin begin
if fProject = aValue then exit; fProject := aProject;
fProject := aValue;
if aValue = nil then exit;
updateView; updateView;
end; end;
procedure TCEProjectWidget.updateView; procedure TCEProjectWidget.TreeDblClick(sender: TObject);
var
fname: string;
i: NativeInt;
begin begin
if fProject = nil then exit;
if Tree.Selected = nil then exit;
//
if Tree.Selected.Parent = fFileNode then
begin
fname := Tree.Selected.Text;
i := fProject.Sources.IndexOf(fname);
if i > -1 then
begin
fname := fProject.getAbsoluteSourceName(i);
mainForm.openFile(fname);
end;
end
else if Tree.Selected.Parent = fConfNode then
begin
i := Tree.Selected.Index;
fProject.ConfigurationIndex:= i;
end;
end;
procedure TCEProjectWidget.updateView;
var
src, conf: string;
itm: TTreeNode;
i: NativeInt;
begin
if fProject = nil then exit;
//
fConfNode.DeleteChildren;
fFileNode.DeleteChildren;
for src in fProject.Sources do
begin
itm := Tree.Items.AddChild(fFileNode, src);
itm.ImageIndex := 2;
itm.SelectedIndex := 2;
end;
for i := 0 to fProject.OptionsCollection.Count-1 do
begin
conf := fProject.configuration[i].name;
itm := Tree.Items.AddChild(fConfNode, conf);
itm.ImageIndex := 3;
itm.SelectedIndex:= 3;
end;
end; end;
end. end.

View File

@ -1,7 +1,7 @@
object CEWidget: TCEWidget object CEWidget: TCEWidget
Left = 1337 Left = 1373
Height = 327 Height = 327
Top = 424 Top = 440
Width = 320 Width = 320
Caption = 'CEWidget' Caption = 'CEWidget'
ClientHeight = 327 ClientHeight = 327
@ -38,4 +38,7 @@ object CEWidget: TCEWidget
TabOrder = 1 TabOrder = 1
end end
end end
object Updater: TTimer
Interval = 50
end
end end

View File

@ -6,7 +6,7 @@ interface
uses uses
Classes, SysUtils, FileUtil, DividerBevel, Forms, Controls, ExtCtrls, Classes, SysUtils, FileUtil, DividerBevel, Forms, Controls, ExtCtrls,
ce_common; ce_common, ActnList;
type type
@ -16,17 +16,28 @@ type
PTCEWidget = ^TCEWidget; PTCEWidget = ^TCEWidget;
{ TCEWidget } { TCEWidget }
TCEWidget = class(TForm) TCEWidget = class(TForm, ICEContextualActions, ICEProjectMonitor)
Content: TScrollBox; Content: TScrollBox;
Back: TPanel; Back: TPanel;
Header: TPanel; Header: TPanel;
Updater: TTimer;
private
procedure updaterTimer(Sender: TObject);
protected protected
fID: string; fID: string;
fNeedUpdate: boolean;
procedure UpdaterProc; virtual;
published published
property ID: string read fID write fID; property ID: string read fID write fID;
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
//
procedure projChange(const aProject: TCEProject); virtual;
//
function contextName: string; virtual;
function contextActionCount: integer; virtual;
function contextAction(index: integer): TAction; virtual;
end; end;
(** (**
@ -37,17 +48,20 @@ type
function getWidget(index: integer): TCEWidget; function getWidget(index: integer): TCEWidget;
public public
procedure addWidget(aValue: PTCEWidget); procedure addWidget(aValue: PTCEWidget);
property frame[index: integer]: TCEWidget read getWidget; property widget[index: integer]: TCEWidget read getWidget;
end; end;
implementation implementation
{$R *.lfm} {$R *.lfm}
(*******************************************************************************
* TCEWidget
*)
constructor TCEWidget.create(aOwner: TComponent); constructor TCEWidget.create(aOwner: TComponent);
begin begin
inherited; inherited;
fID := 'ID_XXXX'; fID := 'ID_XXXX';
Updater.OnTimer := @updaterTimer;
end; end;
destructor TCEWidget.destroy; destructor TCEWidget.destroy;
@ -55,8 +69,38 @@ begin
inherited; inherited;
end; end;
procedure TCEWidget.updaterTimer(Sender: TObject);
begin
if not fNeedUpdate then exit;
fNeedUpdate := false;
UpdaterProc;
end;
procedure TCEWidget.UpdaterProc;
begin
end;
procedure TCEWidget.projChange(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;
(******************************************************************************* (*******************************************************************************
* TFrameList * TCEWidgetList
*) *)
function TCEWidgetList.getWidget(index: integer): TCEWidget; function TCEWidgetList.getWidget(index: integer): TCEWidget;
begin begin