This commit is contained in:
Basile Burg 2014-08-18 20:38:39 +02:00
parent 4a43e6200d
commit c4ec74e3e1
20 changed files with 644 additions and 261 deletions

View File

@ -215,9 +215,9 @@
<UnitName Value="ce_project"/> <UnitName Value="ce_project"/>
</Unit11> </Unit11>
<Unit12> <Unit12>
<Filename Value="..\src\ce_widgettypes.pas"/> <Filename Value="..\src\ce_interfaces.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="ce_widgettypes"/> <UnitName Value="ce_interfaces"/>
</Unit12> </Unit12>
<Unit13> <Unit13>
<Filename Value="..\src\ce_staticexplorer.pas"/> <Filename Value="..\src\ce_staticexplorer.pas"/>

View File

@ -7,7 +7,7 @@ uses
cthreads, cthreads,
{$ENDIF}{$ENDIF} {$ENDIF}{$ENDIF}
Interfaces, Forms, lazcontrols, runtimetypeinfocontrols, Interfaces, Forms, lazcontrols, runtimetypeinfocontrols,
ce_main, ce_dcd, ce_observer; ce_dcd, ce_observer, ce_main;
{$R *.res} {$R *.res}

View File

@ -1,6 +1,7 @@
unit ce_customtools; unit ce_customtools;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface

View File

@ -1,6 +1,7 @@
unit ce_editor; unit ce_editor;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface
@ -8,22 +9,21 @@ 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, SynCompletion, AnchorDocking, ce_widget, ce_d2syn, ce_widgettypes, SynHighlighterLFM, SynCompletion, AnchorDocking, ce_widget, ce_d2syn, ce_interfaces,
ce_synmemo, ce_dlang, ce_project, ce_common, types, ce_dcd, ce_observer; ce_synmemo, ce_dlang, ce_project, ce_common, types, ce_dcd, ce_observer;
type type
{ TCEEditorWidget } { TCEEditorWidget }
TCEEditorWidget = class(TCEWidget) TCEEditorWidget = class(TCEWidget, ICEProjectObserver)
imgList: TImageList; imgList: TImageList;
PageControl: TExtendedNotebook; PageControl: TExtendedNotebook;
macRecorder: TSynMacroRecorder; macRecorder: TSynMacroRecorder;
editorStatus: TStatusBar; editorStatus: TStatusBar;
completion: TSynCompletion; completion: TSynCompletion;
procedure completionCodeCompletion(var Value: string; SourceValue: string; procedure completionCodeCompletion(var Value: string; SourceValue: string;
var SourceStart, SourceEnd: TPoint; KeyChar: TUTF8Char; Shift: TShiftState var SourceStart, SourceEnd: TPoint; KeyChar: TUTF8Char; Shift: TShiftState);
);
procedure completionExecute(Sender: TObject); procedure completionExecute(Sender: TObject);
procedure PageControlChange(Sender: TObject); procedure PageControlChange(Sender: TObject);
procedure PageControlCloseTabClicked(Sender: TObject); procedure PageControlCloseTabClicked(Sender: TObject);
@ -33,7 +33,6 @@ type
private private
fKeyChanged: boolean; fKeyChanged: boolean;
fProj: TCEProject; fProj: TCEProject;
fMultiDocSubject: TCEMultiDocSubject;
// http://bugs.freepascal.org/view.php?id=26329 // http://bugs.freepascal.org/view.php?id=26329
fSyncEdit: TSynPluginSyncroEdit; fSyncEdit: TSynPluginSyncroEdit;
@ -59,11 +58,14 @@ type
procedure focusedEditorChanged; procedure focusedEditorChanged;
function getEditorHint: string; function getEditorHint: string;
// //
procedure projNew(const aProject: TCEProject); override; procedure projNew(const aProject: TCEProject);
procedure projClose(const aProject: TCEProject); override; procedure projClosing(const aProject: TCEProject);
procedure projFocused(const aProject: TCEProject); override; procedure projFocused(const aProject: TCEProject);
procedure projCompile(const aProject: TCEProject); override; procedure projChanged(const aProject: TCEProject);
procedure projRun(const aProject: TCEProject); override;
procedure projCompile(const aProject: TCEProject); //warning: removed from itf
procedure projRun(const aProject: TCEProject); //warning: removed from itf
// //
property currentEditor: TCESynMemo read getCurrentEditor; property currentEditor: TCESynMemo read getCurrentEditor;
property editor[index: NativeInt]: TCESynMemo read getEditor; property editor[index: NativeInt]: TCESynMemo read getEditor;
@ -95,14 +97,10 @@ begin
finally finally
bmp.Free; bmp.Free;
end; end;
//
fMultiDocSubject := TCEMultiDocSubject.create;
EntitiesConnector.addSubject(fMultiDocSubject);
end; end;
destructor TCEEditorWidget.destroy; destructor TCEEditorWidget.destroy;
begin begin
fMultiDocSubject.Free;
tokLst.Free; tokLst.Free;
errLst.Free; errLst.Free;
inherited; inherited;
@ -142,15 +140,13 @@ begin
// //
if pageControl.ActivePageIndex <> -1 then if pageControl.ActivePageIndex <> -1 then
begin begin
CEMainForm.docFocusedNotify(Self, pageControl.ActivePageIndex); //CEMainForm.docFocusedNotify(Self, pageControl.ActivePageIndex);
if (pageControl.ActivePage.Caption = '') then if (pageControl.ActivePage.Caption = '') then
begin begin
fKeyChanged := true; fKeyChanged := true;
beginUpdateByDelay; beginUpdateByDelay;
end; end;
end; end;
self.fMultiDocSubject.docFocused(curr);
end; end;
procedure TCEEditorWidget.PageControlChange(Sender: TObject); procedure TCEEditorWidget.PageControlChange(Sender: TObject);
@ -264,7 +260,7 @@ begin
fProj := aProject; fProj := aProject;
end; end;
procedure TCEEditorWidget.projClose(const aProject: TCEProject); procedure TCEEditorWidget.projClosing(const aProject: TCEProject);
begin begin
fProj := nil; fProj := nil;
end; end;
@ -274,14 +270,18 @@ begin
fProj := aProject; fProj := aProject;
end; end;
procedure TCEEditorWidget.projChanged(const aProject: TCEProject);
begin
end;
procedure TCEEditorWidget.projCompile(const aProject: TCEProject); procedure TCEEditorWidget.projCompile(const aProject: TCEProject);
begin begin
endUpdateByDelay; endUpdateByDelay; // warning not trigered anymore
end; end;
procedure TCEEditorWidget.projRun(const aProject: TCEProject); procedure TCEEditorWidget.projRun(const aProject: TCEProject);
begin begin
endUpdateByDelay; endUpdateByDelay; // warning not trigered anymore
end; end;
procedure TCEEditorWidget.getSymbolLoc; procedure TCEEditorWidget.getSymbolLoc;
@ -396,7 +396,7 @@ begin
if not fKeyChanged then exit; if not fKeyChanged then exit;
// //
fKeyChanged := false; fKeyChanged := false;
CEMainForm.docChangeNotify(Self, editorIndex); //CEMainForm.docChangeNotify(Self, editorIndex);
if ed.Lines.Count = 0 then exit; if ed.Lines.Count = 0 then exit;
// //
if fProj = nil then if fProj = nil then

227
src/ce_interfaces.pas Normal file
View File

@ -0,0 +1,227 @@
unit ce_interfaces;
{$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface
uses
Classes, SysUtils, actnList, menus, ce_synmemo, ce_project, ce_observer;
type
(**
* An implementer can save and load some stuffs on application start/quit
*)
ICEWidgetPersist = interface
['ICEWidgetPersist']
// Coedit options are about to be saved.
procedure beforeSave(sender: TObject);
// some custom properties can be declared to aFiler.
procedure declareProperties(aFiler: TFiler);
// Coedit options has just been reloaded.
procedure afterLoad(sender: TObject);
end;
(**
* An implementer declares some actions on demand.
* TODO-cfeature: improve the interface so that a widget can declare a complete main menu category.
*)
ICEContextualActions = interface
['ICEContextualActions']
// declares a context name for the actions
function contextName: string;
// action count, called before contextAction()
function contextActionCount: integer;
// declares actions, called in loop, from 0 to contextActionCount-1
function contextAction(index: integer): TAction;
end;
(**
* An implementer is informed about the current file(s).
*)
ICEMultiDocObserver = interface
['ICEMultiDocObserver']
// 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 docClosing(const aDoc: TCESynMemo);
end;
(**
* An implementer informs some ICEMultiDocObserver about the current file(s)
*)
TCEMultiDocSubject = class(TCECustomSubject)
protected
function acceptObserver(aObject: TObject): boolean; override;
end;
(**
* An implementer is informed about the current project(s).
*)
ICEProjectObserver = interface
['ICEProjectObserver']
// the new project aProject has been created/opened
procedure projNew(const aProject: TCEProject);
// aProject has been modified: switches, source name, ...
procedure projChanged(const aProject: TCEProject);
// aProject is about to be closed.
procedure projClosing(const aProject: TCEProject);
// not used yet: the active project is now aProject
procedure projFocused(const aProject: TCEProject); // rename: projSelected or projActivated
// aProject is about to be compiled.
//procedure projCompile(const aProject: TCEProject);
// aProject is about to be executed.
//procedure projRun(const aProject: TCEProject);
end;
(**
* An implementer informs some ICEMultiDocObserver about the current file(s)
*)
TCEProjectSubject = class(TCECustomSubject)
protected
function acceptObserver(aObject: TObject): boolean; override;
end;
(**
* An implementer can add a mainmenu entry.
*)
ICEMainMenuProvider = interface
['ICEMainMenuProvider']
// item must contain the full items tree to be added
procedure menuDeclare(out item: TMenuItem);
end;
{
subject Primitives:
A subject has not necessarly all the informations the observers expect.
It can compose using the following "primitives".
}
(**
* TCEMultiDocSubject primitives.
*)
procedure subjDocNew(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjDocClosing(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjDocFocused(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjDocChanged(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo); {$IFDEF RELEASE}inline;{$ENDIF}
(**
* TCEProjectSubject primitives.
*)
procedure subjProjNew(aSubject: TCEProjectSubject; aProj: TCEProject); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjProjClosing(aSubject: TCEProjectSubject; aProj: TCEProject); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjProjFocused(aSubject: TCEProjectSubject; aProj: TCEProject); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjProjChanged(aSubject: TCEProjectSubject; aProj: TCEProject); {$IFDEF RELEASE}inline;{$ENDIF}
//procedure subjProjCompile(aSubject: TCEProjectSubject; aProj: TCEProject); //{$IFDEF RELEASE}inline;{$ENDIF}
//procedure subjProjRun(aSubject: TCEProjectSubject; aProj: TCEProject); //{$IFDEF RELEASE}inline;{$ENDIF}
implementation
function TCEMultiDocSubject.acceptObserver(aObject: TObject): boolean;
begin
result := (aObject is ICEMultiDocObserver);
end;
procedure subjDocNew(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEMultiDocObserver).docNew(aDoc);
end;
procedure subjDocClosing(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEMultiDocObserver).docClosing(aDoc);
end;
procedure subjDocFocused(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEMultiDocObserver).docFocused(aDoc);
end;
procedure subjDocChanged(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEMultiDocObserver).docChanged(aDoc);
end;
function TCEProjectSubject.acceptObserver(aObject: TObject): boolean;
begin
result := (aObject is ICEProjectObserver);
end;
procedure subjProjNew(aSubject: TCEProjectSubject; aProj: TCEProject);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEProjectObserver).ProjNew(aProj);
end;
procedure subjProjClosing(aSubject: TCEProjectSubject; aProj: TCEProject);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEProjectObserver).projClosing(aProj);
end;
procedure subjProjFocused(aSubject: TCEProjectSubject; aProj: TCEProject);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEProjectObserver).projFocused(aProj);
end;
procedure subjProjChanged(aSubject: TCEProjectSubject; aProj: TCEProject);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEProjectObserver).projChanged(aProj);
end;
//procedure subjProjCompile(aSubject: TCEProjectSubject; aProj: TCEProject);
//var
// i: Integer;
//begin
// with aSubject do for i:= 0 to fObservers.Count-1 do
// (fObservers.Items[i] as ICEProjectObserver).projCompile(aProj);
//end;
//
//procedure subjProjRun(aSubject: TCEProjectSubject; aProj: TCEProject);
//var
// i: Integer;
//begin
// with aSubject do for i:= 0 to fObservers.Count-1 do
// (fObservers.Items[i] as ICEProjectObserver).projRun(aProj);
//end;
end.

View File

@ -1,6 +1,7 @@
unit ce_libman; unit ce_libman;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface

View File

@ -1,6 +1,7 @@
unit ce_libmaneditor; unit ce_libmaneditor;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface

View File

@ -1,6 +1,7 @@
unit ce_main; unit ce_main;
{$mode objfpc}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface
@ -9,7 +10,7 @@ uses
AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg, Controls, Graphics, AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg, Controls, Graphics,
Dialogs, Menus, ActnList, ExtCtrls, process, XMLPropStorage, ComCtrls, dynlibs, Dialogs, Menus, ActnList, ExtCtrls, process, XMLPropStorage, ComCtrls, dynlibs,
ce_common, ce_dmdwrap, ce_project, ce_dcd, ce_plugin, ce_synmemo, ce_widget, ce_common, ce_dmdwrap, ce_project, ce_dcd, ce_plugin, ce_synmemo, ce_widget,
ce_messages, ce_widgettypes, ce_editor, ce_projinspect, ce_projconf, ce_search, ce_messages, ce_interfaces, ce_editor, ce_projinspect, ce_projconf, ce_search,
ce_staticexplorer, ce_miniexplorer, ce_libman, ce_libmaneditor, ce_customtools, ce_staticexplorer, ce_miniexplorer, ce_libman, ce_libmaneditor, ce_customtools,
ce_observer; ce_observer;
@ -60,7 +61,7 @@ type
end; end;
{ TCEMainForm } { TCEMainForm }
TCEMainForm = class(TForm) TCEMainForm = class(TForm, ICEMultiDocObserver)
actFileCompAndRun: TAction; actFileCompAndRun: TAction;
actFileSaveAll: TAction; actFileSaveAll: TAction;
actFileClose: TAction; actFileClose: TAction;
@ -210,9 +211,8 @@ type
procedure FormDropFiles(Sender: TObject; const FileNames: array of String); procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
private private
// oh no...a field which is not a class.^^ fDoc: TCESynMemo;
fUpdateCount: NativeInt; fUpdateCount: NativeInt;
fProject: TCEProject; fProject: TCEProject;
fPlugList: TCEPlugDescriptorList; fPlugList: TCEPlugDescriptorList;
fWidgList: TCEWidgetList; fWidgList: TCEWidgetList;
@ -229,6 +229,12 @@ type
fLibMan: TLibraryManager; fLibMan: TLibraryManager;
fTools: TCETools; fTools: TCETools;
// ICEMultiDocObserver
procedure docNew(const aDoc: TCESynMemo);
procedure docClosing(const aDoc: TCESynMemo);
procedure docFocused(const aDoc: TCESynMemo);
procedure docChanged(const aDoc: TCESynMemo);
//Init - Fina //Init - Fina
procedure getCMdParams; procedure getCMdParams;
procedure checkCompilo; procedure checkCompilo;
@ -262,7 +268,6 @@ type
// project sub routines // project sub routines
procedure saveProjSource(const aEditor: TCESynMemo); procedure saveProjSource(const aEditor: TCESynMemo);
procedure projChange(sender: TObject);
procedure newProj; procedure newProj;
procedure saveProj; procedure saveProj;
procedure saveProjAs(const aFilename: string); procedure saveProjAs(const aFilename: string);
@ -282,8 +287,6 @@ type
procedure UpdateDockCaption(Exclude: TControl = nil); override; procedure UpdateDockCaption(Exclude: TControl = nil); override;
// //
procedure openFile(const aFilename: string); procedure openFile(const aFilename: string);
procedure docChangeNotify(Sender: TObject; const aIndex: Integer);
procedure docFocusedNotify(Sender: TObject; const aIndex: Integer);
function expandSymbolicString(const symString: string): string; function expandSymbolicString(const symString: string): string;
// //
property WidgetList: TCEWidgetList read fWidgList; property WidgetList: TCEWidgetList read fWidgList;
@ -309,6 +312,7 @@ uses
constructor TCEMainForm.create(aOwner: TComponent); constructor TCEMainForm.create(aOwner: TComponent);
begin begin
inherited create(aOwner); inherited create(aOwner);
EntitiesConnector.addObserver(self);
// //
InitMRUs; InitMRUs;
InitLibMan; InitLibMan;
@ -726,7 +730,6 @@ end;
procedure TCEMainForm.ActionsUpdate(AAction: TBasicAction; var Handled: Boolean); procedure TCEMainForm.ActionsUpdate(AAction: TBasicAction; var Handled: Boolean);
var var
curr: TCESynMemo;
hasEd: boolean; hasEd: boolean;
hasProj: boolean; hasProj: boolean;
begin begin
@ -734,25 +737,24 @@ begin
if fUpdateCount > 0 then exit; if fUpdateCount > 0 then exit;
Inc(fUpdateCount); Inc(fUpdateCount);
try try
curr := fEditWidg.currentEditor; hasEd := fDoc <> nil;
hasEd := curr <> nil;
if hasEd then if hasEd then
begin begin
actEdCopy.Enabled := curr.SelAvail and fEditWidg.Focused; // allows copy/cut/paste by shortcut on widgets actEdCopy.Enabled := fDoc.SelAvail and fEditWidg.Focused; // allows copy/cut/paste by shortcut on widgets
actEdCut.Enabled := curr.SelAvail and fEditWidg.Focused; // actEdCut.Enabled := fDoc.SelAvail and fEditWidg.Focused; //
actEdPaste.Enabled := curr.CanPaste and fEditWidg.Focused; actEdPaste.Enabled := fDoc.CanPaste and fEditWidg.Focused;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
// close file : raises a segfault on linux UndoStuff.>>fList<<.Count... // close file : raises a segfault on linux UndoStuff.>>fList<<.Count...
actEdUndo.Enabled := curr.CanUndo; actEdUndo.Enabled := fDoc.CanUndo;
actEdRedo.Enabled := curr.CanRedo; actEdRedo.Enabled := fDoc.CanRedo;
{$ENDIF} {$ENDIF}
actEdMacPlay.Enabled := true; actEdMacPlay.Enabled := true;
actEdMacStartStop.Enabled := true; actEdMacStartStop.Enabled := true;
actEdIndent.Enabled := true; actEdIndent.Enabled := true;
actEdUnIndent.Enabled := true; actEdUnIndent.Enabled := true;
// //
actFileCompAndRun.Enabled := curr.isDSource; actFileCompAndRun.Enabled := fDoc.isDSource;
actFileCompAndRunWithArgs.Enabled := curr.isDSource; actFileCompAndRunWithArgs.Enabled := fDoc.isDSource;
actFileSave.Enabled := true; actFileSave.Enabled := true;
actFileSaveAs.Enabled := true; actFileSaveAs.Enabled := true;
actFileClose.Enabled := true; actFileClose.Enabled := true;
@ -890,12 +892,32 @@ begin
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEMultiDocMonitor ----------------------------------------------------}
procedure TCEMainForm.docNew(const aDoc: TCESynMemo);
begin
fDoc := aDoc;
end;
procedure TCEMainForm.docClosing(const aDoc: TCESynMemo);
begin
fDoc := nil;
end;
procedure TCEMainForm.docFocused(const aDoc: TCESynMemo);
begin
fDoc := aDoc;
end;
procedure TCEMainForm.docChanged(const aDoc: TCESynMemo);
begin
end;
{$ENDREGION}
{$REGION file ------------------------------------------------------------------} {$REGION file ------------------------------------------------------------------}
procedure TCEMainForm.newFile; procedure TCEMainForm.newFile;
begin begin
if fEditWidg = nil then exit; if fEditWidg = nil then exit;
fEditWidg.addEditor; fEditWidg.addEditor;
fEditWidg.focusedEditorChanged;
end; end;
function TCEMainForm.findFile(const aFilename: string): NativeInt; function TCEMainForm.findFile(const aFilename: string): NativeInt;
@ -930,7 +952,6 @@ end;
procedure TCEMainForm.saveFile(const edIndex: NativeInt); procedure TCEMainForm.saveFile(const edIndex: NativeInt);
var var
str: string; str: string;
i: NativeInt;
begin begin
if fEditWidg = nil then exit; if fEditWidg = nil then exit;
if edIndex >= fEditWidg.editorCount then exit; if edIndex >= fEditWidg.editorCount then exit;
@ -944,9 +965,6 @@ begin
str := fEditWidg.editor[edIndex].fileName; str := fEditWidg.editor[edIndex].fileName;
if str = '' then exit; if str = '' then exit;
fEditWidg.editor[edIndex].save; fEditWidg.editor[edIndex].save;
//
for i := 0 to fWidgList.Count-1 do
fWidgList.widget[i].docChanged(fEditWidg.editor[edIndex]);
end; end;
procedure TCEMainForm.saveFileAs(const edIndex: NativeInt; const aFilename: string); procedure TCEMainForm.saveFileAs(const edIndex: NativeInt; const aFilename: string);
@ -959,24 +977,6 @@ begin
fFileMru.Insert(0, aFilename); fFileMru.Insert(0, aFilename);
end; end;
procedure TCEMainForm.docChangeNotify(Sender: TObject; const aIndex: Integer);
var
i: NativeInt;
begin
for i := 0 to fWidgList.Count-1 do
if fWidgList.widget[i] <> Sender then
fWidgList.widget[i].docChanged(fEditWidg.editor[aIndex]);
end;
procedure TCEMainForm.docFocusedNotify(Sender: TObject; const aIndex: Integer);
var
i: NativeInt;
begin
for i := 0 to fWidgList.Count-1 do
if fWidgList.widget[i] <> Sender then
fWidgList.widget[i].docFocused(fEditWidg.editor[aIndex]);
end;
procedure TCEMainForm.mruFileItemClick(Sender: TObject); procedure TCEMainForm.mruFileItemClick(Sender: TObject);
begin begin
openFile(TMenuItem(Sender).Hint); openFile(TMenuItem(Sender).Hint);
@ -1046,14 +1046,11 @@ end;
procedure TCEMainForm.actFileSaveExecute(Sender: TObject); procedure TCEMainForm.actFileSaveExecute(Sender: TObject);
var var
str: string; str: string;
ed: TCESynMemo;
begin begin
if fEditWidg = nil then exit; if fDoc = nil then exit;
ed := fEditWidg.currentEditor;
if ed = nil then exit;
// //
str := ed.fileName; str := fDoc.fileName;
if (str <> ed.tempFilename) and (fileExists(str)) then if (str <> fDoc.tempFilename) and (fileExists(str)) then
saveFile(fEditWidg.editorIndex) saveFile(fEditWidg.editorIndex)
else actFileSaveAs.Execute; else actFileSaveAs.Execute;
end; end;
@ -1073,18 +1070,12 @@ begin
end; end;
procedure TCEMainForm.actFileCloseExecute(Sender: TObject); procedure TCEMainForm.actFileCloseExecute(Sender: TObject);
var
curr: TCESynMemo;
i: NativeInt;
begin begin
curr := fEditWidg.currentEditor; if fDoc = nil then exit;
if curr.modified then if dlgOkCancel( if fDoc.modified then if dlgOkCancel(
'The latest mdofifications are not saved, continue ?') = mrCancel 'The latest mdofifications are not saved, continue ?') = mrCancel
then exit; then exit;
// //
for i := 0 to fWidgList.Count-1 do
fWidgList.widget[i].docClose(fEditWidg.currentEditor);
//
fEditWidg.removeEditor(fEditWidg.editorIndex); fEditWidg.removeEditor(fEditWidg.editorIndex);
end; end;
@ -1092,7 +1083,8 @@ procedure TCEMainForm.actFileSaveAllExecute(Sender: TObject);
var var
i: NativeInt; i: NativeInt;
begin begin
for i:= 0 to fEditWidg.editorCount-1 do saveFile(i); for i:= 0 to fEditWidg.editorCount-1 do
saveFile(i);
end; end;
procedure TCEMainForm.FormDropFiles(Sender: TObject;const FileNames: array of String); procedure TCEMainForm.FormDropFiles(Sender: TObject;const FileNames: array of String);
@ -1327,8 +1319,8 @@ begin
fMesgWidg.ClearAllMessages; fMesgWidg.ClearAllMessages;
for i := 0 to fWidgList.Count-1 do //for i := 0 to fWidgList.Count-1 do
fWidgList.widget[i].projCompile(aProject); //fWidgList.widget[i].projCompile(aProject);
with fProject.currentConfiguration do with fProject.currentConfiguration do
begin begin
@ -1425,8 +1417,8 @@ begin
if aProject.currentConfiguration.outputOptions.binaryKind <> if aProject.currentConfiguration.outputOptions.binaryKind <>
executable then exit; executable then exit;
for i := 0 to fWidgList.Count-1 do //for i := 0 to fWidgList.Count-1 do
fWidgList.widget[i].projRun(aProject); //fWidgList.widget[i].projRun(aProject);
runproc := TProcess.Create(nil); runproc := TProcess.Create(nil);
try try
@ -1584,14 +1576,6 @@ end;
{$ENDREGION} {$ENDREGION}
{$REGION project ---------------------------------------------------------------} {$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.saveProjSource(const aEditor: TCESynMemo); procedure TCEMainForm.saveProjSource(const aEditor: TCESynMemo);
begin begin
if fProject = nil then exit; if fProject = nil then exit;
@ -1602,24 +1586,15 @@ begin
end; end;
procedure TCEMainForm.closeProj; procedure TCEMainForm.closeProj;
var
i: NativeInt;
begin begin
for i := 0 to WidgetList.Count-1 do
WidgetList.widget[i].projClose(fProject);
fProject.Free; fProject.Free;
fProject := nil; fProject := nil;
end; end;
procedure TCEMainForm.newProj; procedure TCEMainForm.newProj;
var
i: NativeInt;
begin begin
fProject := TCEProject.Create(nil); fProject := TCEProject.Create(nil);
fProject.Name := 'CurrentProject'; fProject.Name := 'CurrentProject';
for i := 0 to WidgetList.Count-1 do
WidgetList.widget[i].projNew(fProject);
fProject.onChange := @projChange;
fProject.libraryManager := fLibMan; fProject.libraryManager := fLibMan;
end; end;

View File

@ -1,13 +1,14 @@
unit ce_messages; unit ce_messages;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface 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, ce_dlangutils; ce_synmemo, ce_dlangutils, ce_interfaces, ce_observer;
type type
@ -21,7 +22,7 @@ type
position: TPoint; position: TPoint;
end; end;
TCEMessagesWidget = class(TCEWidget) TCEMessagesWidget = class(TCEWidget, ICEMultiDocObserver, ICEProjectObserver)
imgList: TImageList; imgList: TImageList;
List: TTreeView; List: TTreeView;
procedure ListDblClick(Sender: TObject); procedure ListDblClick(Sender: TObject);
@ -66,12 +67,15 @@ type
function contextActionCount: integer; override; function contextActionCount: integer; override;
function contextAction(index: integer): TAction; override; function contextAction(index: integer): TAction; override;
// //
procedure projNew(const aProject: TCEProject); override; procedure projNew(const aProject: TCEProject);
procedure projClose(const aProject: TCEProject); override; procedure projClosing(const aProject: TCEProject);
procedure projFocused(const aProject: TCEProject); override; procedure projFocused(const aProject: TCEProject);
procedure projChanged(const aProject: TCEProject);
// //
procedure docFocused(const aDoc: TCESynMemo); override; procedure docNew(const aDoc: TCESynMemo);
procedure docClose(const aDoc: TCESynMemo); override; procedure docClosing(const aDoc: TCESynMemo);
procedure docFocused(const aDoc: TCESynMemo);
procedure docChanged(const aDoc: TCESynMemo);
// //
procedure ClearAllMessages; procedure ClearAllMessages;
procedure ClearMessages(aCtxt: TMessageContext); procedure ClearMessages(aCtxt: TMessageContext);
@ -115,6 +119,8 @@ begin
// //
List.PopupMenu := contextMenu; List.PopupMenu := contextMenu;
List.OnDeletion := @ListDeletion; List.OnDeletion := @ListDeletion;
//
EntitiesConnector.addObserver(self);
end; end;
procedure TCEMessagesWidget.listDeletion(Sender: TObject; Node: TTreeNode); procedure TCEMessagesWidget.listDeletion(Sender: TObject; Node: TTreeNode);
@ -251,7 +257,7 @@ begin
filterMessages; filterMessages;
end; end;
procedure TCEMessagesWidget.projClose(const aProject: TCEProject); procedure TCEMessagesWidget.projClosing(const aProject: TCEProject);
begin begin
if fProj = aProject then if fProj = aProject then
ClearMessages(mcProject); ClearMessages(mcProject);
@ -264,21 +270,35 @@ begin
fProj := aProject; fProj := aProject;
filterMessages; filterMessages;
end; end;
procedure TCEMessagesWidget.projChanged(const aProject: TCEProject);
begin
end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEMultiDocMonitor ----------------------------------------------------} {$REGION ICEMultiDocMonitor ----------------------------------------------------}
procedure TCEMessagesWidget.docNew(const aDoc: TCESynMemo);
begin
fDoc := aDoc;
filterMessages;
end;
procedure TCEMessagesWidget.docClosing(const aDoc: TCESynMemo);
begin
if aDoc <> fDoc then exit;
ClearMessages(mcEditor);
fDoc := nil;
filterMessages;
end;
procedure TCEMessagesWidget.docFocused(const aDoc: TCESynMemo); procedure TCEMessagesWidget.docFocused(const aDoc: TCESynMemo);
begin begin
fDoc := aDoc; fDoc := aDoc;
filterMessages; filterMessages;
end; end;
procedure TCEMessagesWidget.docClose(const aDoc: TCESynMemo); procedure TCEMessagesWidget.docChanged(const aDoc: TCESynMemo);
begin begin
if aDoc <> fDoc then exit;
ClearMessages(mcEditor);
fDoc := nil;
filterMessages;
end; end;
{$ENDREGION} {$ENDREGION}

View File

@ -1,6 +1,7 @@
unit ce_miniexplorer; unit ce_miniexplorer;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface

View File

@ -35,6 +35,7 @@ type
* Interface for a Coedit subject. Basically designed to hold a list of observer * Interface for a Coedit subject. Basically designed to hold a list of observer
*) *)
ICESubject = interface ICESubject = interface
['ICESubject']
// an observer is proposed. anObserver is not necessarly compatible. // an observer is proposed. anObserver is not necessarly compatible.
procedure addObserver(anObserver: TObject); procedure addObserver(anObserver: TObject);
// anObserver must be removed. // anObserver must be removed.
@ -52,7 +53,7 @@ type
// test for a specific interface when adding an observer. // test for a specific interface when adding an observer.
function acceptObserver(aObject: TObject): boolean; virtual; function acceptObserver(aObject: TObject): boolean; virtual;
public public
constructor create; constructor create; virtual;
destructor destroy; override; destructor destroy; override;
// //
procedure addObserver(anObserver: TObject); procedure addObserver(anObserver: TObject);
@ -60,10 +61,6 @@ type
procedure updateObservers; virtual; procedure updateObservers; virtual;
end; end;
ICEObserver = interface
//function subjectType: ICESubject;
end;
var var
EntitiesConnector: TCEEntitiesConnector = nil; EntitiesConnector: TCEEntitiesConnector = nil;
@ -90,13 +87,12 @@ begin
fUpdating := false; fUpdating := false;
for i := 0 to fSubjects.Count-1 do for i := 0 to fSubjects.Count-1 do
begin begin
if (fSubjects[i] as ICESubject) = nil then if not (fSubjects[i] is ICESubject) then
continue; continue;
for j := 0 to fObservers.Count-1 do for j := 0 to fObservers.Count-1 do
begin begin
if (fSubjects[i] as ICEObserver) <> nil then if fSubjects[i] <> fObservers[j] then
if fSubjects[i] <> fObservers[j] then (fSubjects[i] as ICESubject).addObserver(fObservers[j]);
(fSubjects[i] as ICESubject).addObserver(fObservers[j]);
end; end;
end; end;
end; end;
@ -113,8 +109,6 @@ end;
procedure TCEEntitiesConnector.addObserver(anObserver: TObject); procedure TCEEntitiesConnector.addObserver(anObserver: TObject);
begin begin
if (anObserver as ICEObserver) = nil then
exit;
if fObservers.IndexOf(anObserver) <> -1 then if fObservers.IndexOf(anObserver) <> -1 then
exit; exit;
fUpdating := true; fUpdating := true;
@ -132,9 +126,13 @@ begin
end; end;
procedure TCEEntitiesConnector.removeObserver(anObserver: TObject); procedure TCEEntitiesConnector.removeObserver(anObserver: TObject);
var
i: Integer;
begin begin
fUpdating := true; fUpdating := true;
fObservers.Remove(anObserver); fObservers.Remove(anObserver);
for i := 0 to fSubjects.Count-1 do
(fSubjects[i] as ICESubject).removeObserver(anObserver);
end; end;
procedure TCEEntitiesConnector.removeSubject(aSubject: TObject); procedure TCEEntitiesConnector.removeSubject(aSubject: TObject);
@ -148,10 +146,14 @@ end;
constructor TCECustomSubject.create; constructor TCECustomSubject.create;
begin begin
fObservers := TObjectList.create(false); fObservers := TObjectList.create(false);
EntitiesConnector.addSubject(Self);
EntitiesConnector.endUpdate;
end; end;
destructor TCECustomSubject.destroy; destructor TCECustomSubject.destroy;
begin begin
EntitiesConnector.removeSubject(Self);
EntitiesConnector.endUpdate;
fObservers.Free; fObservers.Free;
Inherited; Inherited;
end; end;

View File

@ -1,6 +1,7 @@
unit ce_plugin; unit ce_plugin;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface

View File

@ -1,16 +1,17 @@
unit ce_projconf; unit ce_projconf;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface
uses uses
Classes, SysUtils, FileUtil, RTTIGrids, Forms, Controls, Graphics, Dialogs, Classes, SysUtils, FileUtil, RTTIGrids, Forms, Controls, Graphics, Dialogs,
ExtCtrls, ComCtrls, StdCtrls, Menus, Buttons, PropEdits, ObjectInspector, ExtCtrls, ComCtrls, StdCtrls, Menus, Buttons, PropEdits, ObjectInspector,
ce_dmdwrap, ce_project, ce_widget, AnchorDocking; ce_dmdwrap, ce_project, ce_widget, ce_interfaces, ce_observer;
type type
TCEProjectConfigurationWidget = class(TCEWidget) TCEProjectConfigurationWidget = class(TCEWidget, ICEProjectObserver)
imgList: TImageList; imgList: TImageList;
selConf: TComboBox; selConf: TComboBox;
Panel1: TPanel; Panel1: TPanel;
@ -35,9 +36,10 @@ type
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
// //
procedure projNew(const aProject: TCEProject); override; procedure projNew(const aProject: TCEProject);
procedure projChange(const aProject: TCEProject); override; procedure projClosing(const aProject: TCEProject);
procedure projClose(const aProject: TCEProject); override; procedure projChanged(const aProject: TCEProject);
procedure projFocused(const aProject: TCEProject);
end; end;
implementation implementation
@ -48,6 +50,8 @@ begin
inherited; inherited;
Tree.Selected := Tree.Items.GetLastNode; Tree.Selected := Tree.Items.GetLastNode;
Grid.OnEditorFilter := @GridFilter; Grid.OnEditorFilter := @GridFilter;
//
EntitiesConnector.addObserver(self);
end; end;
procedure TCEProjectConfigurationWidget.projNew(const aProject: TCEProject); procedure TCEProjectConfigurationWidget.projNew(const aProject: TCEProject);
@ -57,18 +61,25 @@ begin
endUpdateByEvent; endUpdateByEvent;
end; end;
procedure TCEProjectConfigurationWidget.projChange(const aProject: TCEProject); procedure TCEProjectConfigurationWidget.projClosing(const aProject: TCEProject);
begin
Grid.TIObject := nil;
Grid.ItemIndex := -1;
fProj := nil;
end;
procedure TCEProjectConfigurationWidget.projChanged(const aProject: TCEProject);
begin begin
beginUpdateByEvent; beginUpdateByEvent;
fProj := aProject; fProj := aProject;
endUpdateByEvent; endUpdateByEvent;
end; end;
procedure TCEProjectConfigurationWidget.projClose(const aProject: TCEProject); procedure TCEProjectConfigurationWidget.projFocused(const aProject: TCEProject);
begin begin
Grid.TIObject := nil; beginUpdateByEvent;
Grid.ItemIndex := -1; fProj := aProject;
fProj := nil; endUpdateByEvent;
end; end;
procedure TCEProjectConfigurationWidget.selConfChange(Sender: TObject); procedure TCEProjectConfigurationWidget.selConfChange(Sender: TObject);

View File

@ -1,11 +1,12 @@
unit ce_project; unit ce_project;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface
uses uses
Classes, SysUtils, ce_dmdwrap, ce_libman; Classes, SysUtils, ce_dmdwrap, ce_libman, ce_observer;
type type
@ -30,6 +31,7 @@ type
fConfIx: Integer; fConfIx: Integer;
fLibMan: TLibraryManager; fLibMan: TLibraryManager;
fChangedCount: NativeInt; fChangedCount: NativeInt;
fProjectSubject: TCECustomSubject;
procedure doChanged; procedure doChanged;
procedure setLibAliases(const aValue: TStringList); procedure setLibAliases(const aValue: TStringList);
procedure subMemberChanged(sender : TObject); procedure subMemberChanged(sender : TObject);
@ -77,23 +79,32 @@ type
implementation implementation
uses uses
ce_common, dialogs; ce_common, ce_interfaces, dialogs;
constructor TCEProject.create(aOwner: TComponent); constructor TCEProject.create(aOwner: TComponent);
begin begin
inherited create(aOwner); inherited create(aOwner);
fProjectSubject := TCEProjectSubject.create;
//
fLibAliases := TStringList.Create; fLibAliases := TStringList.Create;
fSrcs := TStringList.Create; fSrcs := TStringList.Create;
fSrcs.OnChange := @subMemberChanged; fSrcs.OnChange := @subMemberChanged;
fSrcsCop := TStringList.Create; fSrcsCop := TStringList.Create;
fOptsColl := TCollection.create(TCompilerConfiguration); fOptsColl := TCollection.create(TCompilerConfiguration);
//
//subjProjNew(TCEProjectSubject(fProjectSubject), self);
//
reset; reset;
addDefaults; addDefaults;
//
fModified := false; fModified := false;
end; end;
destructor TCEProject.destroy; destructor TCEProject.destroy;
begin begin
subjProjClosing(TCEProjectSubject(fProjectSubject), self);
fProjectSubject.Free;
//
fOnChange := nil; fOnChange := nil;
fLibAliases.Free; fLibAliases.Free;
fSrcs.free; fSrcs.free;
@ -218,6 +229,7 @@ var
{$ENDIF} {$ENDIF}
begin begin
fModified := true; fModified := true;
subjProjChanged(TCEProjectSubject(fProjectSubject), self);
if assigned(fOnChange) then fOnChange(Self); if assigned(fOnChange) then fOnChange(Self);
{$IFDEF DEBUG} {$IFDEF DEBUG}
lst := TStringList.Create; lst := TStringList.Create;

View File

@ -1,16 +1,17 @@
unit ce_projinspect; unit ce_projinspect;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface
uses uses
Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics, Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics, actnlist,
actnlist, Dialogs, ExtCtrls, ComCtrls, Menus, Buttons, ce_project, Dialogs, ExtCtrls, ComCtrls, Menus, Buttons, ce_project, ce_interfaces, ce_common,
ce_common, ce_widget, AnchorDocking; ce_widget, ce_observer;
type type
TCEProjectInspectWidget = class(TCEWidget) TCEProjectInspectWidget = class(TCEWidget, ICEProjectObserver)
imgList: TImageList; imgList: TImageList;
Panel1: TPanel; Panel1: TPanel;
btnAddFile: TSpeedButton; btnAddFile: TSpeedButton;
@ -38,9 +39,11 @@ type
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
// //
procedure projNew(const aProject: TCEProject); override; procedure projNew(const aProject: TCEProject);
procedure projChange(const aProject: TCEProject); override; procedure projClosing(const aProject: TCEProject);
procedure projClose(const aProject: TCEProject); override; procedure projFocused(const aProject: TCEProject);
procedure projChanged(const aProject: TCEProject);
// //
function contextName: string; override; function contextName: string; override;
function contextActionCount: integer; override; function contextActionCount: integer; override;
@ -70,6 +73,8 @@ begin
fConfNode := Tree.Items[1]; fConfNode := Tree.Items[1];
// //
Tree.PopupMenu := contextMenu; Tree.PopupMenu := contextMenu;
//
EntitiesConnector.addObserver(self);
end; end;
{$ENDREGION} {$ENDREGION}
@ -102,21 +107,27 @@ end;
{$REGION ICEProjectMonitor -----------------------------------------------------} {$REGION ICEProjectMonitor -----------------------------------------------------}
procedure TCEProjectInspectWidget.projNew(const aProject: TCEProject); procedure TCEProjectInspectWidget.projNew(const aProject: TCEProject);
begin begin
fProject := aProject; //fProject := aProject;
UpdateByEvent; //UpdateByEvent;
end; end;
procedure TCEProjectInspectWidget.projChange(const aProject: TCEProject); procedure TCEProjectInspectWidget.projClosing(const aProject: TCEProject);
begin
fProject := aProject;
UpdateByEvent;
end;
procedure TCEProjectInspectWidget.projClose(const aProject: TCEProject);
begin begin
fProject := nil; fProject := nil;
UpdateByEvent; UpdateByEvent;
end; end;
procedure TCEProjectInspectWidget.projFocused(const aProject: TCEProject);
begin
fProject := aProject;
UpdateByEvent;
end;
procedure TCEProjectInspectWidget.projChanged(const aProject: TCEProject);
begin
fProject := aProject;
UpdateByEvent;
end;
{$ENDREGION} {$ENDREGION}
procedure TCEProjectInspectWidget.TreeKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState); procedure TCEProjectInspectWidget.TreeKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);

View File

@ -1,16 +1,17 @@
unit ce_search; unit ce_search;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface
uses uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Menus, StdCtrls, actnList, Buttons, SynEdit, SynEditSearch, SynEditTypes, ce_common, Menus, StdCtrls, actnList, Buttons, SynEdit, SynEditSearch, SynEditTypes, ce_common,
ce_widget, ce_synmemo, AnchorDocking; ce_widget, ce_synmemo, ce_interfaces, ce_observer;
type type
TCESearchWidget = class(TCEWidget) TCESearchWidget = class(TCEWidget, ICEMultiDocObserver)
btnFind: TBitBtn; btnFind: TBitBtn;
btnReplace: TBitBtn; btnReplace: TBitBtn;
btnReplaceAll: TBitBtn; btnReplaceAll: TBitBtn;
@ -52,8 +53,10 @@ type
constructor Create(aOwner: TComponent); override; constructor Create(aOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
// //
procedure docFocused(const aDoc: TCESynMemo); override; procedure docNew(const aDoc: TCESynMemo);
procedure docClose(const aDoc: TCESynMemo); override; procedure docClosing(const aDoc: TCESynMemo);
procedure docFocused(const aDoc: TCESynMemo);
procedure docChanged(const aDoc: TCESynMemo);
// //
function contextName: string; override; function contextName: string; override;
function contextActionCount: integer; override; function contextActionCount: integer; override;
@ -88,6 +91,8 @@ begin
// //
fSearchMru := TMruList.Create; fSearchMru := TMruList.Create;
fReplaceMru:= TMruList.Create; fReplaceMru:= TMruList.Create;
//
EntitiesConnector.addObserver(self);
end; end;
destructor TCESearchWidget.Destroy; destructor TCESearchWidget.Destroy;
@ -270,16 +275,26 @@ end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEMultiDocMonitor ----------------------------------------------------} {$REGION ICEMultiDocMonitor ----------------------------------------------------}
procedure TCESearchWidget.docNew(const aDoc: TCESynMemo);
begin
fEditor := aDoc;
UpdateByEvent;
end;
procedure TCESearchWidget.docClosing(const aDoc: TCESynMemo);
begin
if fEditor = aDoc then fEditor := nil;
UpdateByEvent;
end;
procedure TCESearchWidget.docFocused(const aDoc: TCESynMemo); procedure TCESearchWidget.docFocused(const aDoc: TCESynMemo);
begin begin
fEditor := aDoc; fEditor := aDoc;
UpdateByEvent; UpdateByEvent;
end; end;
procedure TCESearchWidget.docClose(const aDoc: TCESynMemo); procedure TCESearchWidget.docChanged(const aDoc: TCESynMemo);
begin begin
if fEditor = aDoc then fEditor := nil;
UpdateByEvent;
end; end;
{$ENDREGION} {$ENDREGION}

View File

@ -1,18 +1,19 @@
unit ce_staticexplorer; unit ce_staticexplorer;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface
uses uses
Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics, Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics,
Dialogs, ExtCtrls, Menus, ComCtrls, ce_widget, jsonparser, fpjson, Dialogs, ExtCtrls, Menus, ComCtrls, ce_widget, jsonparser, fpjson,
ce_synmemo, process, actnlist, Buttons, ce_common, ce_project, AnchorDocking; ce_synmemo, process, actnlist, Buttons, ce_common, ce_project, ce_observer,
ce_interfaces;
type type
{ TCEStaticExplorerWidget } { TCEStaticExplorerWidget }
TCEStaticExplorerWidget = class(TCEWidget) TCEStaticExplorerWidget = class(TCEWidget)
btnRefresh: TBitBtn; btnRefresh: TBitBtn;
imgList: TImageList; imgList: TImageList;
@ -59,19 +60,23 @@ type
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
// //
procedure docFocused(const aDoc: TCESynMemo); override; procedure docNew(const aDoc: TCESynMemo);
procedure docChanged(const aDoc: TCESynMemo); override; procedure docClosing(const aDoc: TCESynMemo);
procedure docClose(const aDoc: TCESynMemo); override; procedure docFocused(const aDoc: TCESynMemo);
procedure docChanged(const aDoc: TCESynMemo);
// //
function contextName: string; override; function contextName: string; override;
function contextActionCount: integer; override; function contextActionCount: integer; override;
function contextAction(index: integer): TAction; override; function contextAction(index: integer): TAction; override;
// //
procedure projNew(const aProject: TCEProject); override; procedure projNew(const aProject: TCEProject);
procedure projChange(const aProject: TCEProject); override; procedure projClosing(const aProject: TCEProject);
procedure projClose(const aProject: TCEProject); override; procedure projFocused(const aProject: TCEProject);
procedure projCompile(const aProject: TCEProject); override; procedure projChanged(const aProject: TCEProject);
procedure projRun(const aProject: TCEProject); override;
procedure projCompile(const aProject: TCEProject); // warning: removed from itf
procedure projRun(const aProject: TCEProject); // warning: removed from itf
// //
procedure declareProperties(aFiler: TFiler); override; procedure declareProperties(aFiler: TFiler); override;
end; end;
@ -124,6 +129,8 @@ begin
// //
Tree.OnDblClick := @TreeDblClick; Tree.OnDblClick := @TreeDblClick;
Tree.PopupMenu := contextMenu; Tree.PopupMenu := contextMenu;
//
EntitiesConnector.addObserver(self);
end; end;
{$ENDREGION} {$ENDREGION}
@ -216,6 +223,17 @@ end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEMultiDocMonitor ----------------------------------------------------} {$REGION ICEMultiDocMonitor ----------------------------------------------------}
procedure TCEStaticExplorerWidget.docNew(const aDoc: TCESynMemo);
begin
end;
procedure TCEStaticExplorerWidget.docClosing(const aDoc: TCESynMemo);
begin
if fDoc <> aDoc then exit;
fDoc := nil;
beginUpdateByDelay;
end;
procedure TCEStaticExplorerWidget.docFocused(const aDoc: TCESynMemo); procedure TCEStaticExplorerWidget.docFocused(const aDoc: TCESynMemo);
begin begin
fDoc := aDoc; fDoc := aDoc;
@ -229,13 +247,6 @@ begin
if fAutoRefresh then beginUpdateByDelay if fAutoRefresh then beginUpdateByDelay
else if fRefreshOnChange then Rescan; else if fRefreshOnChange then Rescan;
end; end;
procedure TCEStaticExplorerWidget.docClose(const aDoc: TCESynMemo);
begin
if fDoc <> aDoc then exit;
fDoc := nil;
beginUpdateByDelay;
end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEProjectMonitor -----------------------------------------------------} {$REGION ICEProjectMonitor -----------------------------------------------------}
@ -244,24 +255,29 @@ begin
fProj := aProject; fProj := aProject;
end; end;
procedure TCEStaticExplorerWidget.projChange(const aProject: TCEProject); procedure TCEStaticExplorerWidget.projClosing(const aProject: TCEProject);
begin
fProj := aProject;
end;
procedure TCEStaticExplorerWidget.projClose(const aProject: TCEProject);
begin begin
fProj := nil; fProj := nil;
end; end;
procedure TCEStaticExplorerWidget.projFocused(const aProject: TCEProject);
begin
fProj := aProject;
end;
procedure TCEStaticExplorerWidget.projChanged(const aProject: TCEProject);
begin
fProj := aProject;
end;
procedure TCEStaticExplorerWidget.projCompile(const aProject: TCEProject); procedure TCEStaticExplorerWidget.projCompile(const aProject: TCEProject);
begin begin
stopUpdateByDelay; stopUpdateByDelay; // warning: not triggered anymore
end; end;
procedure TCEStaticExplorerWidget.projRun(const aProject: TCEProject); procedure TCEStaticExplorerWidget.projRun(const aProject: TCEProject);
begin begin
stopUpdateByDelay; stopUpdateByDelay; // warning: not triggered anymore
end; end;
{$ENDREGION} {$ENDREGION}

View File

@ -1,13 +1,14 @@
unit ce_synmemo; unit ce_synmemo;
{$MODE OBJFPC}{$H+} {$MODE OBJFPC}{$H+}
{$INTERFACES CORBA}
interface interface
uses uses
Classes, SysUtils, SynEdit, SynMemo, ce_d2syn, SynEditHighlighter, controls, Classes, SysUtils, SynEdit, SynMemo, ce_d2syn, SynEditHighlighter, controls,
lcltype, LazSynEditText, SynPluginSyncroEdit, SynEditKeyCmds, ce_project, lcltype, LazSynEditText, SynPluginSyncroEdit, SynEditKeyCmds, ce_project,
SynEditMouseCmds, ce_common; SynEditMouseCmds, ce_common, ce_observer;
type type
TCESynMemo = class(TSynMemo) TCESynMemo = class(TSynMemo)
@ -20,6 +21,7 @@ type
fIsConfig: boolean; fIsConfig: boolean;
fIdentifier: string; fIdentifier: string;
fTempFileName: string; fTempFileName: string;
fMultiDocSubject: TCECustomSubject;
procedure changeNotify(Sender: TObject); procedure changeNotify(Sender: TObject);
procedure identifierToD2Syn; procedure identifierToD2Syn;
protected protected
@ -55,7 +57,7 @@ var
implementation implementation
uses uses
graphics, ce_main, forms; graphics, ce_main, forms, ce_interfaces;
constructor TCESynMemo.Create(aOwner: TComponent); constructor TCESynMemo.Create(aOwner: TComponent);
begin begin
@ -88,10 +90,16 @@ begin
// avoid many call to get envir.string // avoid many call to get envir.string
fTempFileName := GetTempDir(false) + 'temp_' + uniqueObjStr(self) + '.d'; fTempFileName := GetTempDir(false) + 'temp_' + uniqueObjStr(self) + '.d';
fMultiDocSubject := TCEMultiDocSubject.create;
subjDocNew(TCEMultiDocSubject(fMultiDocSubject), self);
end; end;
destructor TCESynMemo.destroy; destructor TCESynMemo.destroy;
begin begin
subjDocClosing(TCEMultiDocSubject(fMultiDocSubject), self);
fMultiDocSubject.Free;
//
if fileExists(fTempFileName) then if fileExists(fTempFileName) then
sysutils.DeleteFile(fTempFileName); sysutils.DeleteFile(fTempFileName);
inherited; inherited;
@ -102,6 +110,7 @@ begin
inherited; inherited;
checkFileDate; checkFileDate;
identifierToD2Syn; identifierToD2Syn;
subjDocFocused(TCEMultiDocSubject(fMultiDocSubject), self);
end; end;
procedure TCESynMemo.UpdateShowing; procedure TCESynMemo.UpdateShowing;
@ -135,6 +144,7 @@ procedure TCESynMemo.changeNotify(Sender: TObject);
begin begin
identifierToD2Syn; identifierToD2Syn;
fModified := true; fModified := true;
subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
end; end;
procedure TCESynMemo.loadFromFile(const aFilename: string); procedure TCESynMemo.loadFromFile(const aFilename: string);
@ -148,6 +158,7 @@ begin
fFilename := aFilename; fFilename := aFilename;
FileAge(fFilename, fFileDate); FileAge(fFilename, fFileDate);
fModified := false; fModified := false;
subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
end; end;
procedure TCESynMemo.saveToFile(const aFilename: string); procedure TCESynMemo.saveToFile(const aFilename: string);
@ -156,6 +167,7 @@ begin
fFilename := aFilename; fFilename := aFilename;
FileAge(fFilename, fFileDate); FileAge(fFilename, fFileDate);
fModified := false; fModified := false;
subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
end; end;
procedure TCESynMemo.save; procedure TCESynMemo.save;
@ -163,6 +175,7 @@ begin
Lines.SaveToFile(fFilename); Lines.SaveToFile(fFilename);
FileAge(fFilename, fFileDate); FileAge(fFilename, fFileDate);
fModified := false; fModified := false;
subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
end; end;
procedure TCESynMemo.checkFileDate; procedure TCESynMemo.checkFileDate;

View File

@ -5,9 +5,8 @@ unit ce_widget;
interface interface
uses uses
Classes, SysUtils, FileUtil, Forms, Controls, ExtCtrls, Classes, SysUtils, FileUtil, Forms, Controls, ExtCtrls, ActnList, Menus,
AnchorDocking, AnchorDockStorage, ActnList, Menus, ce_interfaces;
ce_synmemo, ce_widgettypes, ce_project;
type type
@ -15,7 +14,7 @@ type
* Base type for an UI module. * Base type for an UI module.
*) *)
PTCEWidget = ^TCEWidget; PTCEWidget = ^TCEWidget;
TCEWidget = class(TForm, ICEContextualActions, ICEProjectMonitor, ICEMultiDocObserver, ICEWidgetPersist) TCEWidget = class(TForm, ICEContextualActions, ICEWidgetPersist)
Content: TPanel; Content: TPanel;
Back: TPanel; Back: TPanel;
contextMenu: TPopupMenu; contextMenu: TPopupMenu;
@ -66,18 +65,6 @@ type
// immediate call 'UpdateByEvent' // immediate call 'UpdateByEvent'
procedure forceUpdateByEvent; procedure forceUpdateByEvent;
// //
procedure docNew(const aDoc: TCESynMemo); virtual;
procedure docFocused(const aDoc: TCESynMemo); virtual;
procedure docChanged(const aDoc: TCESynMemo); virtual;
procedure docClose(const aDoc: TCESynMemo); virtual;
//
procedure projNew(const aProject: TCEProject); virtual;
procedure projChange(const aProject: TCEProject); virtual;
procedure projClose(const aProject: TCEProject); virtual;
procedure projCompile(const aProject: TCEProject); virtual;
procedure projRun(const aProject: TCEProject); virtual;
procedure projFocused(const aProject: TCEProject); virtual;
//
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;
@ -204,47 +191,47 @@ end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEMultiDocObserver ----------------------------------------------------} {$REGION ICEMultiDocObserver ----------------------------------------------------}
procedure TCEWidget.docNew(const aDoc: TCESynMemo); //procedure TCEWidget.docNew(const aDoc: TCESynMemo);
begin //begin
end; //end;
//
procedure TCEWidget.docFocused(const aDoc: TCESynMemo); //procedure TCEWidget.docFocused(const aDoc: TCESynMemo);
begin //begin
end; //end;
//
procedure TCEWidget.docChanged(const aDoc: TCESynMemo); //procedure TCEWidget.docChanged(const aDoc: TCESynMemo);
begin //begin
end; //end;
//
procedure TCEWidget.docClose(const aDoc: TCESynMemo); //procedure TCEWidget.docClose(const aDoc: TCESynMemo);
begin //begin
end; //end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEProjectMonitor -----------------------------------------------------} {$REGION ICEProjectObserver -----------------------------------------------------}
procedure TCEWidget.projNew(const aProject: TCEProject); //procedure TCEWidget.projNew(const aProject: TCEProject);
begin //begin
end; //end;
//
procedure TCEWidget.projChange(const aProject: TCEProject); //procedure TCEWidget.projChange(const aProject: TCEProject);
begin //begin
end; //end;
//
procedure TCEWidget.projClose(const aProject: TCEProject); //procedure TCEWidget.projClose(const aProject: TCEProject);
begin //begin
end; //end;
//
procedure TCEWidget.projCompile(const aProject: TCEProject); //procedure TCEWidget.projCompile(const aProject: TCEProject);
begin //begin
end; //end;
//
procedure TCEWidget.projRun(const aProject: TCEProject); //procedure TCEWidget.projRun(const aProject: TCEProject);
begin //begin
end; //end;
//
procedure TCEWidget.projFocused(const aProject: TCEProject); //procedure TCEWidget.projFocused(const aProject: TCEProject);
begin //begin
end; //end;
{$ENDREGION} {$ENDREGION}
{$REGION Updaters---------------------------------------------------------------} {$REGION Updaters---------------------------------------------------------------}

View File

@ -8,12 +8,13 @@ interface
uses uses
Classes, SysUtils, actnList, menus, ce_synmemo, ce_project, ce_observer; Classes, SysUtils, actnList, menus, ce_synmemo, ce_project, ce_observer;
type type
(** (**
* An implementer can save and load some stuffs on application start/quit * An implementer can save and load some stuffs on application start/quit
*) *)
ICEWidgetPersist = interface ICEWidgetPersist = interface(ICEObserver)
// Coedit options are about to be saved. // Coedit options are about to be saved.
procedure beforeSave(sender: TObject); procedure beforeSave(sender: TObject);
// some custom properties can be declared to aFiler. // some custom properties can be declared to aFiler.
@ -26,7 +27,7 @@ type
* An implementer declares some actions on demand. * An implementer declares some actions on demand.
* TODO-cfeature: improve the interface so that a widget can declare a complete main menu category. * TODO-cfeature: improve the interface so that a widget can declare a complete main menu category.
*) *)
ICEContextualActions = interface ICEContextualActions = interface(ICEObserver)
// declares a context name for the actions // declares a context name for the actions
function contextName: string; function contextName: string;
// action count, called before contextAction() // action count, called before contextAction()
@ -52,32 +53,35 @@ type
(** (**
* An implementer informs some ICEMultiDocObserver about the current file(s) * An implementer informs some ICEMultiDocObserver about the current file(s)
*) *)
TCEMultiDocSubject = class(TCECustomSubject, ICEMultiDocObserver) TCEMultiDocSubject = class(TCECustomSubject)
protected protected
function acceptObserver(aObject: TObject): boolean; override; function acceptObserver(aObject: TObject): boolean; override;
public
procedure docNew(const aDoc: TCESynMemo);
procedure docFocused(const aDoc: TCESynMemo);
procedure docChanged(const aDoc: TCESynMemo);
procedure docClose(const aDoc: TCESynMemo);
end; end;
(** (**
* An implementer is informed about the current project(s). * An implementer is informed about the current project(s).
*) *)
ICEProjectMonitor = interface ICEProjectObserver = interface(ICEObserver)
// the new project aProject has been created/opened // 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, ... // aProject has been modified: switches, source name, ...
procedure projChange(const aProject: TCEProject); procedure projChange(const aProject: TCEProject);
// aProject is about to be closed. // aProject is about to be closed.
procedure projClose(const aProject: TCEProject); procedure projClose(const aProject: TCEProject);
// not used yet: the active project is now aProject
procedure projFocused(const aProject: TCEProject); // rename: projSelected or projActivated
// aProject is about to be compiled. // aProject is about to be compiled.
procedure projCompile(const aProject: TCEProject); procedure projCompile(const aProject: TCEProject);
// aProject is about to be executed. // 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 end;
procedure projFocused(const aProject: TCEProject); // rename: projSelected or projActivated
(**
* An implementer informs some ICEMultiDocObserver about the current file(s)
*)
TCEProjectSubject = class(TCECustomSubject)
protected
function acceptObserver(aObject: TObject): boolean; override;
end; end;
(** (**
@ -88,43 +92,128 @@ type
procedure menuDeclare(out item: TMenuItem); procedure menuDeclare(out item: TMenuItem);
end; end;
{
subject Primitives:
A subject has not necessarly all the informations the observers expect.
It can compose using the following "primitives".
}
(**
* TCEMultiDocSubject primitives.
*)
procedure subjDocNew(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjDocFocused(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjDocChanged(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjDocClosed(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo); {$IFDEF RELEASE}inline;{$ENDIF}
(**
* TCEProjectSubject primitives.
*)
procedure subjProjNew(aSubject: TCEProjectSubject; aProj: TCEProject); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjProjFocused(aSubject: TCEProjectSubject; aProj: TCEProject); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjProjChanged(aSubject: TCEProjectSubject; aProj: TCEProject); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjProjClose(aSubject: TCEProjectSubject; aProj: TCEProject); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjProjCompile(aSubject: TCEProjectSubject; aProj: TCEProject); {$IFDEF RELEASE}inline;{$ENDIF}
procedure subjProjRun(aSubject: TCEProjectSubject; aProj: TCEProject); {$IFDEF RELEASE}inline;{$ENDIF}
implementation implementation
function TCEMultiDocSubject.acceptObserver(aObject: TObject): boolean; function TCEMultiDocSubject.acceptObserver(aObject: TObject): boolean;
begin begin
result := (aObject as ICEMultiDocObserver) <> nil; result := (aObject as ICEMultiDocObserver) <> nil;
end; end;
procedure TCEMultiDocSubject.docNew(const aDoc: TCESynMemo); procedure subjDocNew(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var var
i: Integer; i: Integer;
begin begin
for i:= 0 to fObservers.Count-1 do with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEMultiDocObserver).docNew(aDoc); (fObservers.Items[i] as ICEMultiDocObserver).docNew(aDoc);
end; end;
procedure TCEMultiDocSubject.docFocused(const aDoc: TCESynMemo); procedure subjDocFocused(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var var
i: Integer; i: Integer;
begin begin
for i:= 0 to fObservers.Count-1 do with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEMultiDocObserver).docFocused(aDoc); (fObservers.Items[i] as ICEMultiDocObserver).docFocused(aDoc);
end; end;
procedure TCEMultiDocSubject.docChanged(const aDoc: TCESynMemo); procedure subjDocChanged(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var var
i: Integer; i: Integer;
begin begin
for i:= 0 to fObservers.Count-1 do with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEMultiDocObserver).docChanged(aDoc); (fObservers.Items[i] as ICEMultiDocObserver).docChanged(aDoc);
end; end;
procedure TCEMultiDocSubject.docClose(const aDoc: TCESynMemo); procedure subjDocClosed(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var var
i: Integer; i: Integer;
begin begin
for i:= 0 to fObservers.Count-1 do with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEMultiDocObserver).docClose(aDoc); (fObservers.Items[i] as ICEMultiDocObserver).docClose(aDoc);
end; end;
function TCEProjectSubject.acceptObserver(aObject: TObject): boolean;
begin
result := (aObject as ICEProjectObserver) <> nil;
end;
procedure subjProjNew(aSubject: TCEProjectSubject; aProj: TCEProject);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEProjectObserver).ProjNew(aProj);
end;
procedure subjProjFocused(aSubject: TCEProjectSubject; aProj: TCEProject);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEProjectObserver).projFocused(aProj);
end;
procedure subjProjChanged(aSubject: TCEProjectSubject; aProj: TCEProject);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEProjectObserver).projChange(aProj);
end;
procedure subjProjClose(aSubject: TCEProjectSubject; aProj: TCEProject);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEProjectObserver).projClose(aProj);
end;
procedure subjProjCompile(aSubject: TCEProjectSubject; aProj: TCEProject);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEProjectObserver).projCompile(aProj);
end;
procedure subjProjRun(aSubject: TCEProjectSubject; aProj: TCEProject);
var
i: Integer;
begin
with aSubject do for i:= 0 to fObservers.Count-1 do
(fObservers.Items[i] as ICEProjectObserver).projRun(aProj);
end;
end. end.