diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi
index 28181eca..450c7779 100644
--- a/lazproj/coedit.lpi
+++ b/lazproj/coedit.lpi
@@ -215,9 +215,9 @@
-
+
-
+
diff --git a/lazproj/coedit.lpr b/lazproj/coedit.lpr
index 33a3327e..e6dfed08 100644
--- a/lazproj/coedit.lpr
+++ b/lazproj/coedit.lpr
@@ -7,7 +7,7 @@ uses
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, Forms, lazcontrols, runtimetypeinfocontrols,
- ce_main, ce_dcd, ce_observer;
+ ce_dcd, ce_observer, ce_main;
{$R *.res}
diff --git a/src/ce_customtools.pas b/src/ce_customtools.pas
index 6f121eb1..a2ee4bdf 100644
--- a/src/ce_customtools.pas
+++ b/src/ce_customtools.pas
@@ -1,6 +1,7 @@
unit ce_customtools;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
diff --git a/src/ce_editor.pas b/src/ce_editor.pas
index 8bc6dc0c..ff0d8bcb 100644
--- a/src/ce_editor.pas
+++ b/src/ce_editor.pas
@@ -1,6 +1,7 @@
unit ce_editor;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
@@ -8,22 +9,21 @@ uses
Classes, SysUtils, FileUtil, ExtendedNotebook, Forms, Controls, lcltype,
Graphics, SynEditKeyCmds, ComCtrls, SynEditHighlighter, ExtCtrls, Menus,
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;
type
{ TCEEditorWidget }
- TCEEditorWidget = class(TCEWidget)
+ TCEEditorWidget = class(TCEWidget, ICEProjectObserver)
imgList: TImageList;
PageControl: TExtendedNotebook;
macRecorder: TSynMacroRecorder;
editorStatus: TStatusBar;
completion: TSynCompletion;
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 PageControlChange(Sender: TObject);
procedure PageControlCloseTabClicked(Sender: TObject);
@@ -33,7 +33,6 @@ type
private
fKeyChanged: boolean;
fProj: TCEProject;
- fMultiDocSubject: TCEMultiDocSubject;
// http://bugs.freepascal.org/view.php?id=26329
fSyncEdit: TSynPluginSyncroEdit;
@@ -59,11 +58,14 @@ type
procedure focusedEditorChanged;
function getEditorHint: string;
//
- procedure projNew(const aProject: TCEProject); override;
- procedure projClose(const aProject: TCEProject); override;
- procedure projFocused(const aProject: TCEProject); override;
- procedure projCompile(const aProject: TCEProject); override;
- procedure projRun(const aProject: TCEProject); override;
+ procedure projNew(const aProject: TCEProject);
+ procedure projClosing(const aProject: TCEProject);
+ procedure projFocused(const aProject: TCEProject);
+ procedure projChanged(const aProject: TCEProject);
+
+ procedure projCompile(const aProject: TCEProject); //warning: removed from itf
+ procedure projRun(const aProject: TCEProject); //warning: removed from itf
+
//
property currentEditor: TCESynMemo read getCurrentEditor;
property editor[index: NativeInt]: TCESynMemo read getEditor;
@@ -95,14 +97,10 @@ begin
finally
bmp.Free;
end;
- //
- fMultiDocSubject := TCEMultiDocSubject.create;
- EntitiesConnector.addSubject(fMultiDocSubject);
end;
destructor TCEEditorWidget.destroy;
begin
- fMultiDocSubject.Free;
tokLst.Free;
errLst.Free;
inherited;
@@ -142,15 +140,13 @@ begin
//
if pageControl.ActivePageIndex <> -1 then
begin
- CEMainForm.docFocusedNotify(Self, pageControl.ActivePageIndex);
+ //CEMainForm.docFocusedNotify(Self, pageControl.ActivePageIndex);
if (pageControl.ActivePage.Caption = '') then
begin
fKeyChanged := true;
beginUpdateByDelay;
end;
end;
-
- self.fMultiDocSubject.docFocused(curr);
end;
procedure TCEEditorWidget.PageControlChange(Sender: TObject);
@@ -264,7 +260,7 @@ begin
fProj := aProject;
end;
-procedure TCEEditorWidget.projClose(const aProject: TCEProject);
+procedure TCEEditorWidget.projClosing(const aProject: TCEProject);
begin
fProj := nil;
end;
@@ -274,14 +270,18 @@ begin
fProj := aProject;
end;
+procedure TCEEditorWidget.projChanged(const aProject: TCEProject);
+begin
+end;
+
procedure TCEEditorWidget.projCompile(const aProject: TCEProject);
begin
- endUpdateByDelay;
+ endUpdateByDelay; // warning not trigered anymore
end;
procedure TCEEditorWidget.projRun(const aProject: TCEProject);
begin
- endUpdateByDelay;
+ endUpdateByDelay; // warning not trigered anymore
end;
procedure TCEEditorWidget.getSymbolLoc;
@@ -396,7 +396,7 @@ begin
if not fKeyChanged then exit;
//
fKeyChanged := false;
- CEMainForm.docChangeNotify(Self, editorIndex);
+ //CEMainForm.docChangeNotify(Self, editorIndex);
if ed.Lines.Count = 0 then exit;
//
if fProj = nil then
diff --git a/src/ce_interfaces.pas b/src/ce_interfaces.pas
new file mode 100644
index 00000000..c96547d6
--- /dev/null
+++ b/src/ce_interfaces.pas
@@ -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.
diff --git a/src/ce_libman.pas b/src/ce_libman.pas
index cab4aa45..3ae5afe1 100644
--- a/src/ce_libman.pas
+++ b/src/ce_libman.pas
@@ -1,6 +1,7 @@
unit ce_libman;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
diff --git a/src/ce_libmaneditor.pas b/src/ce_libmaneditor.pas
index a5b62d2d..acff2290 100644
--- a/src/ce_libmaneditor.pas
+++ b/src/ce_libmaneditor.pas
@@ -1,6 +1,7 @@
unit ce_libmaneditor;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
diff --git a/src/ce_main.pas b/src/ce_main.pas
index 33eb7aab..b93cad3c 100644
--- a/src/ce_main.pas
+++ b/src/ce_main.pas
@@ -1,6 +1,7 @@
unit ce_main;
-{$mode objfpc}{$H+}
+{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
@@ -9,7 +10,7 @@ uses
AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg, Controls, Graphics,
Dialogs, Menus, ActnList, ExtCtrls, process, XMLPropStorage, ComCtrls, dynlibs,
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_observer;
@@ -60,7 +61,7 @@ type
end;
{ TCEMainForm }
- TCEMainForm = class(TForm)
+ TCEMainForm = class(TForm, ICEMultiDocObserver)
actFileCompAndRun: TAction;
actFileSaveAll: TAction;
actFileClose: TAction;
@@ -210,9 +211,8 @@ type
procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
private
- // oh no...a field which is not a class.^^
+ fDoc: TCESynMemo;
fUpdateCount: NativeInt;
-
fProject: TCEProject;
fPlugList: TCEPlugDescriptorList;
fWidgList: TCEWidgetList;
@@ -229,6 +229,12 @@ type
fLibMan: TLibraryManager;
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
procedure getCMdParams;
procedure checkCompilo;
@@ -262,7 +268,6 @@ type
// project sub routines
procedure saveProjSource(const aEditor: TCESynMemo);
- procedure projChange(sender: TObject);
procedure newProj;
procedure saveProj;
procedure saveProjAs(const aFilename: string);
@@ -282,8 +287,6 @@ type
procedure UpdateDockCaption(Exclude: TControl = nil); override;
//
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;
//
property WidgetList: TCEWidgetList read fWidgList;
@@ -309,6 +312,7 @@ uses
constructor TCEMainForm.create(aOwner: TComponent);
begin
inherited create(aOwner);
+ EntitiesConnector.addObserver(self);
//
InitMRUs;
InitLibMan;
@@ -726,7 +730,6 @@ end;
procedure TCEMainForm.ActionsUpdate(AAction: TBasicAction; var Handled: Boolean);
var
- curr: TCESynMemo;
hasEd: boolean;
hasProj: boolean;
begin
@@ -734,25 +737,24 @@ begin
if fUpdateCount > 0 then exit;
Inc(fUpdateCount);
try
- curr := fEditWidg.currentEditor;
- hasEd := curr <> nil;
+ hasEd := fDoc <> nil;
if hasEd then
begin
- actEdCopy.Enabled := curr.SelAvail and fEditWidg.Focused; // allows copy/cut/paste by shortcut on widgets
- actEdCut.Enabled := curr.SelAvail and fEditWidg.Focused; //
- actEdPaste.Enabled := curr.CanPaste and fEditWidg.Focused;
+ actEdCopy.Enabled := fDoc.SelAvail and fEditWidg.Focused; // allows copy/cut/paste by shortcut on widgets
+ actEdCut.Enabled := fDoc.SelAvail and fEditWidg.Focused; //
+ actEdPaste.Enabled := fDoc.CanPaste and fEditWidg.Focused;
{$IFDEF MSWINDOWS}
// close file : raises a segfault on linux UndoStuff.>>fList<<.Count...
- actEdUndo.Enabled := curr.CanUndo;
- actEdRedo.Enabled := curr.CanRedo;
+ actEdUndo.Enabled := fDoc.CanUndo;
+ actEdRedo.Enabled := fDoc.CanRedo;
{$ENDIF}
actEdMacPlay.Enabled := true;
actEdMacStartStop.Enabled := true;
actEdIndent.Enabled := true;
actEdUnIndent.Enabled := true;
//
- actFileCompAndRun.Enabled := curr.isDSource;
- actFileCompAndRunWithArgs.Enabled := curr.isDSource;
+ actFileCompAndRun.Enabled := fDoc.isDSource;
+ actFileCompAndRunWithArgs.Enabled := fDoc.isDSource;
actFileSave.Enabled := true;
actFileSaveAs.Enabled := true;
actFileClose.Enabled := true;
@@ -890,12 +892,32 @@ begin
end;
{$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 ------------------------------------------------------------------}
procedure TCEMainForm.newFile;
begin
if fEditWidg = nil then exit;
fEditWidg.addEditor;
- fEditWidg.focusedEditorChanged;
end;
function TCEMainForm.findFile(const aFilename: string): NativeInt;
@@ -930,7 +952,6 @@ end;
procedure TCEMainForm.saveFile(const edIndex: NativeInt);
var
str: string;
- i: NativeInt;
begin
if fEditWidg = nil then exit;
if edIndex >= fEditWidg.editorCount then exit;
@@ -944,9 +965,6 @@ begin
str := fEditWidg.editor[edIndex].fileName;
if str = '' then exit;
fEditWidg.editor[edIndex].save;
- //
- for i := 0 to fWidgList.Count-1 do
- fWidgList.widget[i].docChanged(fEditWidg.editor[edIndex]);
end;
procedure TCEMainForm.saveFileAs(const edIndex: NativeInt; const aFilename: string);
@@ -959,24 +977,6 @@ begin
fFileMru.Insert(0, aFilename);
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);
begin
openFile(TMenuItem(Sender).Hint);
@@ -1046,14 +1046,11 @@ end;
procedure TCEMainForm.actFileSaveExecute(Sender: TObject);
var
str: string;
- ed: TCESynMemo;
begin
- if fEditWidg = nil then exit;
- ed := fEditWidg.currentEditor;
- if ed = nil then exit;
+ if fDoc = nil then exit;
//
- str := ed.fileName;
- if (str <> ed.tempFilename) and (fileExists(str)) then
+ str := fDoc.fileName;
+ if (str <> fDoc.tempFilename) and (fileExists(str)) then
saveFile(fEditWidg.editorIndex)
else actFileSaveAs.Execute;
end;
@@ -1073,18 +1070,12 @@ begin
end;
procedure TCEMainForm.actFileCloseExecute(Sender: TObject);
-var
- curr: TCESynMemo;
- i: NativeInt;
begin
- curr := fEditWidg.currentEditor;
- if curr.modified then if dlgOkCancel(
+ if fDoc = nil then exit;
+ if fDoc.modified then if dlgOkCancel(
'The latest mdofifications are not saved, continue ?') = mrCancel
then exit;
//
- for i := 0 to fWidgList.Count-1 do
- fWidgList.widget[i].docClose(fEditWidg.currentEditor);
- //
fEditWidg.removeEditor(fEditWidg.editorIndex);
end;
@@ -1092,7 +1083,8 @@ procedure TCEMainForm.actFileSaveAllExecute(Sender: TObject);
var
i: NativeInt;
begin
- for i:= 0 to fEditWidg.editorCount-1 do saveFile(i);
+ for i:= 0 to fEditWidg.editorCount-1 do
+ saveFile(i);
end;
procedure TCEMainForm.FormDropFiles(Sender: TObject;const FileNames: array of String);
@@ -1327,8 +1319,8 @@ begin
fMesgWidg.ClearAllMessages;
- for i := 0 to fWidgList.Count-1 do
- fWidgList.widget[i].projCompile(aProject);
+ //for i := 0 to fWidgList.Count-1 do
+ //fWidgList.widget[i].projCompile(aProject);
with fProject.currentConfiguration do
begin
@@ -1425,8 +1417,8 @@ begin
if aProject.currentConfiguration.outputOptions.binaryKind <>
executable then exit;
- for i := 0 to fWidgList.Count-1 do
- fWidgList.widget[i].projRun(aProject);
+ //for i := 0 to fWidgList.Count-1 do
+ //fWidgList.widget[i].projRun(aProject);
runproc := TProcess.Create(nil);
try
@@ -1584,14 +1576,6 @@ end;
{$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.saveProjSource(const aEditor: TCESynMemo);
begin
if fProject = nil then exit;
@@ -1602,24 +1586,15 @@ begin
end;
procedure TCEMainForm.closeProj;
-var
- i: NativeInt;
begin
- for i := 0 to WidgetList.Count-1 do
- WidgetList.widget[i].projClose(fProject);
fProject.Free;
fProject := nil;
end;
procedure TCEMainForm.newProj;
-var
- i: NativeInt;
begin
fProject := TCEProject.Create(nil);
fProject.Name := 'CurrentProject';
- for i := 0 to WidgetList.Count-1 do
- WidgetList.widget[i].projNew(fProject);
- fProject.onChange := @projChange;
fProject.libraryManager := fLibMan;
end;
diff --git a/src/ce_messages.pas b/src/ce_messages.pas
index c3d1b009..de4cba2c 100644
--- a/src/ce_messages.pas
+++ b/src/ce_messages.pas
@@ -1,13 +1,14 @@
unit ce_messages;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, ComCtrls,
lcltype, ce_widget, ActnList, Menus, clipbrd, AnchorDocking, ce_project,
- ce_synmemo, ce_dlangutils;
+ ce_synmemo, ce_dlangutils, ce_interfaces, ce_observer;
type
@@ -21,7 +22,7 @@ type
position: TPoint;
end;
- TCEMessagesWidget = class(TCEWidget)
+ TCEMessagesWidget = class(TCEWidget, ICEMultiDocObserver, ICEProjectObserver)
imgList: TImageList;
List: TTreeView;
procedure ListDblClick(Sender: TObject);
@@ -66,12 +67,15 @@ type
function contextActionCount: integer; override;
function contextAction(index: integer): TAction; override;
//
- procedure projNew(const aProject: TCEProject); override;
- procedure projClose(const aProject: TCEProject); override;
- procedure projFocused(const aProject: TCEProject); override;
+ procedure projNew(const aProject: TCEProject);
+ procedure projClosing(const aProject: TCEProject);
+ procedure projFocused(const aProject: TCEProject);
+ procedure projChanged(const aProject: TCEProject);
//
- procedure docFocused(const aDoc: TCESynMemo); override;
- procedure docClose(const aDoc: TCESynMemo); override;
+ procedure docNew(const aDoc: TCESynMemo);
+ procedure docClosing(const aDoc: TCESynMemo);
+ procedure docFocused(const aDoc: TCESynMemo);
+ procedure docChanged(const aDoc: TCESynMemo);
//
procedure ClearAllMessages;
procedure ClearMessages(aCtxt: TMessageContext);
@@ -115,6 +119,8 @@ begin
//
List.PopupMenu := contextMenu;
List.OnDeletion := @ListDeletion;
+ //
+ EntitiesConnector.addObserver(self);
end;
procedure TCEMessagesWidget.listDeletion(Sender: TObject; Node: TTreeNode);
@@ -251,7 +257,7 @@ begin
filterMessages;
end;
-procedure TCEMessagesWidget.projClose(const aProject: TCEProject);
+procedure TCEMessagesWidget.projClosing(const aProject: TCEProject);
begin
if fProj = aProject then
ClearMessages(mcProject);
@@ -264,21 +270,35 @@ begin
fProj := aProject;
filterMessages;
end;
+
+procedure TCEMessagesWidget.projChanged(const aProject: TCEProject);
+begin
+end;
{$ENDREGION}
{$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);
begin
fDoc := aDoc;
filterMessages;
end;
-procedure TCEMessagesWidget.docClose(const aDoc: TCESynMemo);
+procedure TCEMessagesWidget.docChanged(const aDoc: TCESynMemo);
begin
- if aDoc <> fDoc then exit;
- ClearMessages(mcEditor);
- fDoc := nil;
- filterMessages;
end;
{$ENDREGION}
diff --git a/src/ce_miniexplorer.pas b/src/ce_miniexplorer.pas
index f4411630..ca306905 100644
--- a/src/ce_miniexplorer.pas
+++ b/src/ce_miniexplorer.pas
@@ -1,6 +1,7 @@
unit ce_miniexplorer;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
diff --git a/src/ce_observer.pas b/src/ce_observer.pas
index f86aedf7..b83689cd 100644
--- a/src/ce_observer.pas
+++ b/src/ce_observer.pas
@@ -35,6 +35,7 @@ type
* Interface for a Coedit subject. Basically designed to hold a list of observer
*)
ICESubject = interface
+ ['ICESubject']
// an observer is proposed. anObserver is not necessarly compatible.
procedure addObserver(anObserver: TObject);
// anObserver must be removed.
@@ -52,7 +53,7 @@ type
// test for a specific interface when adding an observer.
function acceptObserver(aObject: TObject): boolean; virtual;
public
- constructor create;
+ constructor create; virtual;
destructor destroy; override;
//
procedure addObserver(anObserver: TObject);
@@ -60,10 +61,6 @@ type
procedure updateObservers; virtual;
end;
- ICEObserver = interface
- //function subjectType: ICESubject;
- end;
-
var
EntitiesConnector: TCEEntitiesConnector = nil;
@@ -90,13 +87,12 @@ begin
fUpdating := false;
for i := 0 to fSubjects.Count-1 do
begin
- if (fSubjects[i] as ICESubject) = nil then
+ if not (fSubjects[i] is ICESubject) then
continue;
for j := 0 to fObservers.Count-1 do
begin
- if (fSubjects[i] as ICEObserver) <> nil then
- if fSubjects[i] <> fObservers[j] then
- (fSubjects[i] as ICESubject).addObserver(fObservers[j]);
+ if fSubjects[i] <> fObservers[j] then
+ (fSubjects[i] as ICESubject).addObserver(fObservers[j]);
end;
end;
end;
@@ -113,8 +109,6 @@ end;
procedure TCEEntitiesConnector.addObserver(anObserver: TObject);
begin
- if (anObserver as ICEObserver) = nil then
- exit;
if fObservers.IndexOf(anObserver) <> -1 then
exit;
fUpdating := true;
@@ -132,9 +126,13 @@ begin
end;
procedure TCEEntitiesConnector.removeObserver(anObserver: TObject);
+var
+ i: Integer;
begin
fUpdating := true;
fObservers.Remove(anObserver);
+ for i := 0 to fSubjects.Count-1 do
+ (fSubjects[i] as ICESubject).removeObserver(anObserver);
end;
procedure TCEEntitiesConnector.removeSubject(aSubject: TObject);
@@ -148,10 +146,14 @@ end;
constructor TCECustomSubject.create;
begin
fObservers := TObjectList.create(false);
+ EntitiesConnector.addSubject(Self);
+ EntitiesConnector.endUpdate;
end;
destructor TCECustomSubject.destroy;
begin
+ EntitiesConnector.removeSubject(Self);
+ EntitiesConnector.endUpdate;
fObservers.Free;
Inherited;
end;
diff --git a/src/ce_plugin.pas b/src/ce_plugin.pas
index c1026a0f..2f0dba29 100644
--- a/src/ce_plugin.pas
+++ b/src/ce_plugin.pas
@@ -1,6 +1,7 @@
unit ce_plugin;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
diff --git a/src/ce_projconf.pas b/src/ce_projconf.pas
index 4bf1175c..a9455d6d 100644
--- a/src/ce_projconf.pas
+++ b/src/ce_projconf.pas
@@ -1,16 +1,17 @@
unit ce_projconf;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
uses
Classes, SysUtils, FileUtil, RTTIGrids, Forms, Controls, Graphics, Dialogs,
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
- TCEProjectConfigurationWidget = class(TCEWidget)
+ TCEProjectConfigurationWidget = class(TCEWidget, ICEProjectObserver)
imgList: TImageList;
selConf: TComboBox;
Panel1: TPanel;
@@ -35,9 +36,10 @@ type
public
constructor create(aOwner: TComponent); override;
//
- procedure projNew(const aProject: TCEProject); override;
- procedure projChange(const aProject: TCEProject); override;
- procedure projClose(const aProject: TCEProject); override;
+ procedure projNew(const aProject: TCEProject);
+ procedure projClosing(const aProject: TCEProject);
+ procedure projChanged(const aProject: TCEProject);
+ procedure projFocused(const aProject: TCEProject);
end;
implementation
@@ -48,6 +50,8 @@ begin
inherited;
Tree.Selected := Tree.Items.GetLastNode;
Grid.OnEditorFilter := @GridFilter;
+ //
+ EntitiesConnector.addObserver(self);
end;
procedure TCEProjectConfigurationWidget.projNew(const aProject: TCEProject);
@@ -57,18 +61,25 @@ begin
endUpdateByEvent;
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
beginUpdateByEvent;
fProj := aProject;
endUpdateByEvent;
end;
-procedure TCEProjectConfigurationWidget.projClose(const aProject: TCEProject);
+procedure TCEProjectConfigurationWidget.projFocused(const aProject: TCEProject);
begin
- Grid.TIObject := nil;
- Grid.ItemIndex := -1;
- fProj := nil;
+ beginUpdateByEvent;
+ fProj := aProject;
+ endUpdateByEvent;
end;
procedure TCEProjectConfigurationWidget.selConfChange(Sender: TObject);
diff --git a/src/ce_project.pas b/src/ce_project.pas
index 454ce24f..4e45e579 100644
--- a/src/ce_project.pas
+++ b/src/ce_project.pas
@@ -1,11 +1,12 @@
unit ce_project;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
uses
- Classes, SysUtils, ce_dmdwrap, ce_libman;
+ Classes, SysUtils, ce_dmdwrap, ce_libman, ce_observer;
type
@@ -30,6 +31,7 @@ type
fConfIx: Integer;
fLibMan: TLibraryManager;
fChangedCount: NativeInt;
+ fProjectSubject: TCECustomSubject;
procedure doChanged;
procedure setLibAliases(const aValue: TStringList);
procedure subMemberChanged(sender : TObject);
@@ -77,23 +79,32 @@ type
implementation
uses
- ce_common, dialogs;
+ ce_common, ce_interfaces, dialogs;
constructor TCEProject.create(aOwner: TComponent);
begin
inherited create(aOwner);
+ fProjectSubject := TCEProjectSubject.create;
+ //
fLibAliases := TStringList.Create;
fSrcs := TStringList.Create;
fSrcs.OnChange := @subMemberChanged;
fSrcsCop := TStringList.Create;
fOptsColl := TCollection.create(TCompilerConfiguration);
+ //
+ //subjProjNew(TCEProjectSubject(fProjectSubject), self);
+ //
reset;
addDefaults;
+ //
fModified := false;
end;
destructor TCEProject.destroy;
begin
+ subjProjClosing(TCEProjectSubject(fProjectSubject), self);
+ fProjectSubject.Free;
+ //
fOnChange := nil;
fLibAliases.Free;
fSrcs.free;
@@ -218,6 +229,7 @@ var
{$ENDIF}
begin
fModified := true;
+ subjProjChanged(TCEProjectSubject(fProjectSubject), self);
if assigned(fOnChange) then fOnChange(Self);
{$IFDEF DEBUG}
lst := TStringList.Create;
diff --git a/src/ce_projinspect.pas b/src/ce_projinspect.pas
index ba9c6b01..9f576e89 100644
--- a/src/ce_projinspect.pas
+++ b/src/ce_projinspect.pas
@@ -1,16 +1,17 @@
unit ce_projinspect;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
uses
- Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics,
- actnlist, Dialogs, ExtCtrls, ComCtrls, Menus, Buttons, ce_project,
- ce_common, ce_widget, AnchorDocking;
+ Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics, actnlist,
+ Dialogs, ExtCtrls, ComCtrls, Menus, Buttons, ce_project, ce_interfaces, ce_common,
+ ce_widget, ce_observer;
type
- TCEProjectInspectWidget = class(TCEWidget)
+ TCEProjectInspectWidget = class(TCEWidget, ICEProjectObserver)
imgList: TImageList;
Panel1: TPanel;
btnAddFile: TSpeedButton;
@@ -38,9 +39,11 @@ type
public
constructor create(aOwner: TComponent); override;
//
- procedure projNew(const aProject: TCEProject); override;
- procedure projChange(const aProject: TCEProject); override;
- procedure projClose(const aProject: TCEProject); override;
+ procedure projNew(const aProject: TCEProject);
+ procedure projClosing(const aProject: TCEProject);
+ procedure projFocused(const aProject: TCEProject);
+ procedure projChanged(const aProject: TCEProject);
+
//
function contextName: string; override;
function contextActionCount: integer; override;
@@ -70,6 +73,8 @@ begin
fConfNode := Tree.Items[1];
//
Tree.PopupMenu := contextMenu;
+ //
+ EntitiesConnector.addObserver(self);
end;
{$ENDREGION}
@@ -102,21 +107,27 @@ end;
{$REGION ICEProjectMonitor -----------------------------------------------------}
procedure TCEProjectInspectWidget.projNew(const aProject: TCEProject);
begin
- fProject := aProject;
- UpdateByEvent;
+ //fProject := aProject;
+ //UpdateByEvent;
end;
-procedure TCEProjectInspectWidget.projChange(const aProject: TCEProject);
-begin
- fProject := aProject;
- UpdateByEvent;
-end;
-
-procedure TCEProjectInspectWidget.projClose(const aProject: TCEProject);
+procedure TCEProjectInspectWidget.projClosing(const aProject: TCEProject);
begin
fProject := nil;
UpdateByEvent;
end;
+
+procedure TCEProjectInspectWidget.projFocused(const aProject: TCEProject);
+begin
+ fProject := aProject;
+ UpdateByEvent;
+end;
+
+procedure TCEProjectInspectWidget.projChanged(const aProject: TCEProject);
+begin
+ fProject := aProject;
+ UpdateByEvent;
+end;
{$ENDREGION}
procedure TCEProjectInspectWidget.TreeKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
diff --git a/src/ce_search.pas b/src/ce_search.pas
index a2f2b163..d8d508bc 100644
--- a/src/ce_search.pas
+++ b/src/ce_search.pas
@@ -1,16 +1,17 @@
unit ce_search;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Menus, StdCtrls, actnList, Buttons, SynEdit, SynEditSearch, SynEditTypes, ce_common,
- ce_widget, ce_synmemo, AnchorDocking;
+ ce_widget, ce_synmemo, ce_interfaces, ce_observer;
type
- TCESearchWidget = class(TCEWidget)
+ TCESearchWidget = class(TCEWidget, ICEMultiDocObserver)
btnFind: TBitBtn;
btnReplace: TBitBtn;
btnReplaceAll: TBitBtn;
@@ -52,8 +53,10 @@ type
constructor Create(aOwner: TComponent); override;
destructor Destroy; override;
//
- procedure docFocused(const aDoc: TCESynMemo); override;
- procedure docClose(const aDoc: TCESynMemo); override;
+ procedure docNew(const aDoc: TCESynMemo);
+ procedure docClosing(const aDoc: TCESynMemo);
+ procedure docFocused(const aDoc: TCESynMemo);
+ procedure docChanged(const aDoc: TCESynMemo);
//
function contextName: string; override;
function contextActionCount: integer; override;
@@ -88,6 +91,8 @@ begin
//
fSearchMru := TMruList.Create;
fReplaceMru:= TMruList.Create;
+ //
+ EntitiesConnector.addObserver(self);
end;
destructor TCESearchWidget.Destroy;
@@ -270,16 +275,26 @@ end;
{$ENDREGION}
{$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);
begin
fEditor := aDoc;
UpdateByEvent;
end;
-procedure TCESearchWidget.docClose(const aDoc: TCESynMemo);
+procedure TCESearchWidget.docChanged(const aDoc: TCESynMemo);
begin
- if fEditor = aDoc then fEditor := nil;
- UpdateByEvent;
end;
{$ENDREGION}
diff --git a/src/ce_staticexplorer.pas b/src/ce_staticexplorer.pas
index 636f5e43..3d5a0504 100644
--- a/src/ce_staticexplorer.pas
+++ b/src/ce_staticexplorer.pas
@@ -1,18 +1,19 @@
unit ce_staticexplorer;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
uses
Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics,
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
{ TCEStaticExplorerWidget }
-
TCEStaticExplorerWidget = class(TCEWidget)
btnRefresh: TBitBtn;
imgList: TImageList;
@@ -59,19 +60,23 @@ type
public
constructor create(aOwner: TComponent); override;
//
- procedure docFocused(const aDoc: TCESynMemo); override;
- procedure docChanged(const aDoc: TCESynMemo); override;
- procedure docClose(const aDoc: TCESynMemo); override;
+ procedure docNew(const aDoc: TCESynMemo);
+ procedure docClosing(const aDoc: TCESynMemo);
+ procedure docFocused(const aDoc: TCESynMemo);
+ procedure docChanged(const aDoc: TCESynMemo);
//
function contextName: string; override;
function contextActionCount: integer; override;
function contextAction(index: integer): TAction; override;
//
- procedure projNew(const aProject: TCEProject); override;
- procedure projChange(const aProject: TCEProject); override;
- procedure projClose(const aProject: TCEProject); override;
- procedure projCompile(const aProject: TCEProject); override;
- procedure projRun(const aProject: TCEProject); override;
+ procedure projNew(const aProject: TCEProject);
+ procedure projClosing(const aProject: TCEProject);
+ procedure projFocused(const aProject: TCEProject);
+ procedure projChanged(const aProject: TCEProject);
+
+ procedure projCompile(const aProject: TCEProject); // warning: removed from itf
+ procedure projRun(const aProject: TCEProject); // warning: removed from itf
+
//
procedure declareProperties(aFiler: TFiler); override;
end;
@@ -124,6 +129,8 @@ begin
//
Tree.OnDblClick := @TreeDblClick;
Tree.PopupMenu := contextMenu;
+ //
+ EntitiesConnector.addObserver(self);
end;
{$ENDREGION}
@@ -216,6 +223,17 @@ end;
{$ENDREGION}
{$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);
begin
fDoc := aDoc;
@@ -229,13 +247,6 @@ begin
if fAutoRefresh then beginUpdateByDelay
else if fRefreshOnChange then Rescan;
end;
-
-procedure TCEStaticExplorerWidget.docClose(const aDoc: TCESynMemo);
-begin
- if fDoc <> aDoc then exit;
- fDoc := nil;
- beginUpdateByDelay;
-end;
{$ENDREGION}
{$REGION ICEProjectMonitor -----------------------------------------------------}
@@ -244,24 +255,29 @@ begin
fProj := aProject;
end;
-procedure TCEStaticExplorerWidget.projChange(const aProject: TCEProject);
-begin
- fProj := aProject;
-end;
-
-procedure TCEStaticExplorerWidget.projClose(const aProject: TCEProject);
+procedure TCEStaticExplorerWidget.projClosing(const aProject: TCEProject);
begin
fProj := nil;
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);
begin
- stopUpdateByDelay;
+ stopUpdateByDelay; // warning: not triggered anymore
end;
procedure TCEStaticExplorerWidget.projRun(const aProject: TCEProject);
begin
- stopUpdateByDelay;
+ stopUpdateByDelay; // warning: not triggered anymore
end;
{$ENDREGION}
diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas
index 7c61af18..b7da4557 100644
--- a/src/ce_synmemo.pas
+++ b/src/ce_synmemo.pas
@@ -1,13 +1,14 @@
unit ce_synmemo;
{$MODE OBJFPC}{$H+}
+{$INTERFACES CORBA}
interface
uses
Classes, SysUtils, SynEdit, SynMemo, ce_d2syn, SynEditHighlighter, controls,
lcltype, LazSynEditText, SynPluginSyncroEdit, SynEditKeyCmds, ce_project,
- SynEditMouseCmds, ce_common;
+ SynEditMouseCmds, ce_common, ce_observer;
type
TCESynMemo = class(TSynMemo)
@@ -20,6 +21,7 @@ type
fIsConfig: boolean;
fIdentifier: string;
fTempFileName: string;
+ fMultiDocSubject: TCECustomSubject;
procedure changeNotify(Sender: TObject);
procedure identifierToD2Syn;
protected
@@ -55,7 +57,7 @@ var
implementation
uses
- graphics, ce_main, forms;
+ graphics, ce_main, forms, ce_interfaces;
constructor TCESynMemo.Create(aOwner: TComponent);
begin
@@ -88,10 +90,16 @@ begin
// avoid many call to get envir.string
fTempFileName := GetTempDir(false) + 'temp_' + uniqueObjStr(self) + '.d';
+
+ fMultiDocSubject := TCEMultiDocSubject.create;
+ subjDocNew(TCEMultiDocSubject(fMultiDocSubject), self);
end;
destructor TCESynMemo.destroy;
begin
+ subjDocClosing(TCEMultiDocSubject(fMultiDocSubject), self);
+ fMultiDocSubject.Free;
+ //
if fileExists(fTempFileName) then
sysutils.DeleteFile(fTempFileName);
inherited;
@@ -102,6 +110,7 @@ begin
inherited;
checkFileDate;
identifierToD2Syn;
+ subjDocFocused(TCEMultiDocSubject(fMultiDocSubject), self);
end;
procedure TCESynMemo.UpdateShowing;
@@ -135,6 +144,7 @@ procedure TCESynMemo.changeNotify(Sender: TObject);
begin
identifierToD2Syn;
fModified := true;
+ subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
end;
procedure TCESynMemo.loadFromFile(const aFilename: string);
@@ -148,6 +158,7 @@ begin
fFilename := aFilename;
FileAge(fFilename, fFileDate);
fModified := false;
+ subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
end;
procedure TCESynMemo.saveToFile(const aFilename: string);
@@ -156,6 +167,7 @@ begin
fFilename := aFilename;
FileAge(fFilename, fFileDate);
fModified := false;
+ subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
end;
procedure TCESynMemo.save;
@@ -163,6 +175,7 @@ begin
Lines.SaveToFile(fFilename);
FileAge(fFilename, fFileDate);
fModified := false;
+ subjDocChanged(TCEMultiDocSubject(fMultiDocSubject), self);
end;
procedure TCESynMemo.checkFileDate;
diff --git a/src/ce_widget.pas b/src/ce_widget.pas
index 427e08ea..e091b1d5 100644
--- a/src/ce_widget.pas
+++ b/src/ce_widget.pas
@@ -5,9 +5,8 @@ unit ce_widget;
interface
uses
- Classes, SysUtils, FileUtil, Forms, Controls, ExtCtrls,
- AnchorDocking, AnchorDockStorage, ActnList, Menus,
- ce_synmemo, ce_widgettypes, ce_project;
+ Classes, SysUtils, FileUtil, Forms, Controls, ExtCtrls, ActnList, Menus,
+ ce_interfaces;
type
@@ -15,7 +14,7 @@ type
* Base type for an UI module.
*)
PTCEWidget = ^TCEWidget;
- TCEWidget = class(TForm, ICEContextualActions, ICEProjectMonitor, ICEMultiDocObserver, ICEWidgetPersist)
+ TCEWidget = class(TForm, ICEContextualActions, ICEWidgetPersist)
Content: TPanel;
Back: TPanel;
contextMenu: TPopupMenu;
@@ -66,18 +65,6 @@ type
// immediate call 'UpdateByEvent'
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 contextActionCount: integer; virtual;
function contextAction(index: integer): TAction; virtual;
@@ -204,47 +191,47 @@ end;
{$ENDREGION}
{$REGION ICEMultiDocObserver ----------------------------------------------------}
-procedure TCEWidget.docNew(const aDoc: TCESynMemo);
-begin
-end;
-
-procedure TCEWidget.docFocused(const aDoc: TCESynMemo);
-begin
-end;
-
-procedure TCEWidget.docChanged(const aDoc: TCESynMemo);
-begin
-end;
-
-procedure TCEWidget.docClose(const aDoc: TCESynMemo);
-begin
-end;
+//procedure TCEWidget.docNew(const aDoc: TCESynMemo);
+//begin
+//end;
+//
+//procedure TCEWidget.docFocused(const aDoc: TCESynMemo);
+//begin
+//end;
+//
+//procedure TCEWidget.docChanged(const aDoc: TCESynMemo);
+//begin
+//end;
+//
+//procedure TCEWidget.docClose(const aDoc: TCESynMemo);
+//begin
+//end;
{$ENDREGION}
-{$REGION ICEProjectMonitor -----------------------------------------------------}
-procedure TCEWidget.projNew(const aProject: TCEProject);
-begin
-end;
-
-procedure TCEWidget.projChange(const aProject: TCEProject);
-begin
-end;
-
-procedure TCEWidget.projClose(const aProject: TCEProject);
-begin
-end;
-
-procedure TCEWidget.projCompile(const aProject: TCEProject);
-begin
-end;
-
-procedure TCEWidget.projRun(const aProject: TCEProject);
-begin
-end;
-
-procedure TCEWidget.projFocused(const aProject: TCEProject);
-begin
-end;
+{$REGION ICEProjectObserver -----------------------------------------------------}
+//procedure TCEWidget.projNew(const aProject: TCEProject);
+//begin
+//end;
+//
+//procedure TCEWidget.projChange(const aProject: TCEProject);
+//begin
+//end;
+//
+//procedure TCEWidget.projClose(const aProject: TCEProject);
+//begin
+//end;
+//
+//procedure TCEWidget.projCompile(const aProject: TCEProject);
+//begin
+//end;
+//
+//procedure TCEWidget.projRun(const aProject: TCEProject);
+//begin
+//end;
+//
+//procedure TCEWidget.projFocused(const aProject: TCEProject);
+//begin
+//end;
{$ENDREGION}
{$REGION Updaters---------------------------------------------------------------}
diff --git a/src/ce_widgettypes.pas b/src/ce_widgettypes.pas
index 7a30dc36..f5c72b53 100644
--- a/src/ce_widgettypes.pas
+++ b/src/ce_widgettypes.pas
@@ -8,12 +8,13 @@ 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 = interface(ICEObserver)
// Coedit options are about to be saved.
procedure beforeSave(sender: TObject);
// some custom properties can be declared to aFiler.
@@ -26,7 +27,7 @@ type
* 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 = interface(ICEObserver)
// declares a context name for the actions
function contextName: string;
// action count, called before contextAction()
@@ -52,32 +53,35 @@ type
(**
* An implementer informs some ICEMultiDocObserver about the current file(s)
*)
- TCEMultiDocSubject = class(TCECustomSubject, ICEMultiDocObserver)
+ TCEMultiDocSubject = class(TCECustomSubject)
protected
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;
(**
* An implementer is informed about the current project(s).
*)
- ICEProjectMonitor = interface
+ ICEProjectObserver = interface(ICEObserver)
// the new project aProject has been created/opened
procedure projNew(const aProject: TCEProject);
// aProject has been modified: switches, source name, ...
procedure projChange(const aProject: TCEProject);
// aProject is about to be closed.
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.
procedure projCompile(const aProject: TCEProject);
// aProject is about to be executed.
procedure projRun(const aProject: TCEProject);
- // not used yet: the active project is now aProject
- procedure projFocused(const aProject: TCEProject); // rename: projSelected or projActivated
+ end;
+
+ (**
+ * An implementer informs some ICEMultiDocObserver about the current file(s)
+ *)
+ TCEProjectSubject = class(TCECustomSubject)
+ protected
+ function acceptObserver(aObject: TObject): boolean; override;
end;
(**
@@ -88,43 +92,128 @@ type
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 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
+
+
function TCEMultiDocSubject.acceptObserver(aObject: TObject): boolean;
begin
result := (aObject as ICEMultiDocObserver) <> nil;
end;
-procedure TCEMultiDocSubject.docNew(const aDoc: TCESynMemo);
+procedure subjDocNew(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var
i: Integer;
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);
end;
-procedure TCEMultiDocSubject.docFocused(const aDoc: TCESynMemo);
+procedure subjDocFocused(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var
i: Integer;
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);
end;
-procedure TCEMultiDocSubject.docChanged(const aDoc: TCESynMemo);
+procedure subjDocChanged(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var
i: Integer;
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);
end;
-procedure TCEMultiDocSubject.docClose(const aDoc: TCESynMemo);
+procedure subjDocClosed(aSubject: TCEMultiDocSubject; aDoc: TCESynMemo);
var
i: Integer;
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);
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.