summaryrefslogtreecommitdiff
path: root/extras/tiopf/mvp/basic_impl.pas
diff options
context:
space:
mode:
Diffstat (limited to 'extras/tiopf/mvp/basic_impl.pas')
-rw-r--r--extras/tiopf/mvp/basic_impl.pas720
1 files changed, 0 insertions, 720 deletions
diff --git a/extras/tiopf/mvp/basic_impl.pas b/extras/tiopf/mvp/basic_impl.pas
deleted file mode 100644
index 8ce4b80b..00000000
--- a/extras/tiopf/mvp/basic_impl.pas
+++ /dev/null
@@ -1,720 +0,0 @@
-unit basic_impl;
-
-{$mode objfpc}{$H+}
-
-interface
-
-uses
- Classes, basic_intf;
-
-type
-
- TSubject = class(TInterfacedObject, ISubject)
- private
- fController: Pointer;
- fObservers: IInterfaceList;
- fUpdateCount: integer;
- function GetController: IInterface;
- procedure Attach(Observer: IObserver);
- procedure Detach(Observer: IObserver);
- procedure Notify;
- procedure BeginUpdate;
- procedure EndUpdate;
- public
- constructor Create(const Controller: IInterface);
- end;
-
-
- TString = class(TInterfacedObject, IString, IVisited)
- private
- fString: string;
- // IString
- function GetAsString: string;
- procedure SetAsString(const AValue: string);
- // IVisited
- procedure Accept(const Visitor: IVisitor);
- end;
-
-
- TStringSelection = class(TInterfacedObject, ISelection, IVisited)
- private
- fModel: IStringListModel;
- fItems: IInterfaceList;
- // ISelection
- procedure AddItem(const Item: IInterface);
- procedure Clear;
- function GetCount: integer;
- procedure RemoveItem(const Item: IInterface);
- procedure SelectModel;
- // IVisited
- procedure Accept(const Visitor: IVisitor);
- public
- constructor Create(const Model: IStringListModel); virtual;
- end;
-
-
- TCommand = class(TInterfacedObject, ICommand, IVisited)
- private
- fEnabled: Boolean;
- fSelection: ISelection;
- procedure BindSelection(const Selection: ISelection);
- function GetEnabled: Boolean;
- protected
- property Selection: ISelection read fSelection;
- // IVisited
- procedure Accept(const Visitor: IVisitor); virtual;
- // ICommand
- function Execute: Boolean; virtual; abstract;
- function GetText: string; virtual; abstract;
- public
- constructor Create(Enabled: Boolean); virtual;
- end;
-
-
- TCommandSet = class(TInterfacedObject, ICommandSet, IObserver, ISubject, IVisited)
- private
- fItems: IInterfaceList;
- fSubject: ISubject;
- function GetCount: integer;
- // IVisited
- procedure Accept(const Visitor: IVisitor);
- protected
- property Count: integer read GetCount;
- property Items: IInterfaceList read fItems;
- // IObserver
- procedure Update(const ASubject: IInterface); virtual;
- // ISubject
- property Subject: ISubject read fSubject implements ISubject;
- public
- constructor Create; virtual;
- end;
-
-
- TMVPModel = class(TInterfacedObject, IMVPModel, ISubject)
- private
- fCommandSet: ICommandSet;
- fCurrentSelection: ISelection;
- fSubject: ISubject;
- // IMVPModel
- function GetCommandSet: ICommandSet;
- function GetCurrentSelection: ISelection;
- protected
- property CommandSet: ICommandSet read GetCommandSet;
- property CurrentSelection: ISelection read GetCurrentSelection;
- // 3 methods to be called by the constructor
- procedure BindSelection; virtual;
- procedure CreateCommandSet(var ACommandSet: ICommandSet); virtual; abstract;
- procedure CreateSelection(var ASelection: ISelection); virtual; abstract;
- // ISubject
- property Subject: ISubject read fSubject implements ISubject;
- public
- constructor Create; virtual;
- destructor Destroy; override;
- end;
-
-
- TListModel = class(TMVPModel, IListModel)
- private
- fItems: IInterfaceList;
- protected
- property Items: IInterfaceList read fItems;
- // IListModel
- function GetCount: Integer; virtual;
- function GetItem(Idx: Integer): IInterface; virtual;
- procedure Add(const Item: IInterface); virtual;
- procedure Clear; virtual;
- function IndexOf(const Item: IInterface): Integer; virtual;
- procedure Insert(const Item, Before: IInterface); virtual;
- procedure Move(const Item, Before: IInterface); virtual;
- procedure Remove(const Item: IInterface); virtual;
- public
- destructor Destroy; override;
- end;
-
-
- TStringListModel = class(TListModel, IStringListModel, IVisited)
- private
- // IStringListModel
- function IStringListModel.GetItem = StringListModelGetItem;
- function StringListModelGetItem(Idx: Integer): IString;
- // IVisited
- procedure Accept(const Visitor: IVisitor); virtual;
- protected
- // IMVPModel
- procedure CreateCommandSet(var ACommandSet: ICommandSet); override;
- procedure CreateSelection(var ASelection: ISelection); override;
- public
- destructor Destroy; override;
- end;
-
-
- TStringModelCommandSet = class(TCommandSet)
- protected
- // IObserver
- procedure Update(const ASubject: IInterface); override;
- public
- destructor Destroy; override;
- end;
-
-
- TStringVisitor = class(TInterfacedObject, IStringVisitor)
- private
- fTheString: IString;
- protected
- // IStringVisitor
- function GetTheString: IString; virtual;
- procedure VisitString(const Str: IString); virtual;
- end;
-
-
- TStringMoveVisitor = class(TStringVisitor, IStringMoveVisitor)
- private
- fCanDemote: Boolean;
- fCanPromote: Boolean;
- fModel: IStringListModel;
- function GetCanDemote: Boolean;
- function GetCanPromote: Boolean;
- protected
- procedure VisitString(const Str: IString); override;
- public
- constructor Create(const Model: IStringListModel); virtual;
- end;
-
-
- TPromoteStringCommand = class(TCommand)
- private
- fModel: Pointer;
- function GetModel: IStringListModel;
- protected
- function Execute: Boolean; override;
- function GetText: string; override;
- public
- constructor Create(Enabled: Boolean; const Model: IStringListModel); reintroduce; virtual;
- end;
-
-
- TDemoteStringCommand = class(TCommand)
- private
- fModel: Pointer;
- function GetModel: IStringListModel;
- protected
- function Execute: Boolean; override;
- function GetText: string; override;
- public
- constructor Create(Enabled: Boolean; const Model: IStringListModel); reintroduce; virtual;
- end;
-
-
-
-implementation
-
-uses
- Math;
-
-{ TSubject }
-
-function TSubject.GetController: IInterface;
-begin
- Result := IInterface(fController);
-end;
-
-procedure TSubject.Attach(Observer: IObserver);
-begin
- if fObservers = nil then
- fObservers := TInterfaceList.Create;
- if fObservers.IndexOf(Observer) < 0 then
- fObservers.Add(Observer);
-end;
-
-procedure TSubject.Detach(Observer: IObserver);
-begin
- if fObservers <> nil then
- begin
- if fObservers.IndexOf(Observer) >= 0 then
- fObservers.Remove(Observer);
- if fObservers.Count = 0 then
- fObservers := nil;
- end;
-end;
-
-procedure TSubject.Notify;
-var
- i: integer;
-begin
- if fObservers <> nil then
- for i := 0 to fObservers.Count-1 do
- (fObservers[i] as IObserver).Update(GetController);
-end;
-
-procedure TSubject.BeginUpdate;
-begin
- Inc(fUpdateCount);
-end;
-
-procedure TSubject.EndUpdate;
-begin
- Dec(fUpdateCount);
- if fUpdateCount = 0 then
- Notify;
-end;
-
-constructor TSubject.Create(const Controller: IInterface);
-begin
- inherited Create;
- fController := Pointer(Controller);
-end;
-
-{ TListModel }
-
-function TListModel.GetCount: Integer;
-begin
- Result := fItems.Count;
-end;
-
-function TListModel.GetItem(Idx: Integer): IInterface;
-begin
- Result := fItems[Idx];
-end;
-
-procedure TListModel.Add(const Item: IInterface);
-begin
- Subject.BeginUpdate;
- if fItems = nil then
- fItems := TInterfaceList.Create;
-// fItems.Add(Item as IInterface);
- fItems.Add(Item);
- Subject.EndUpdate;
-end;
-
-procedure TListModel.Clear;
-begin
- Subject.BeginUpdate;
- fItems.Clear;
- Subject.EndUpdate;
-end;
-
-function TListModel.IndexOf(const Item: IInterface): Integer;
-begin
- if fItems <> nil then
-// Result := fItems.IndexOf(Item as IInterface)
- Result := fItems.IndexOf(Item)
- else
- Result := -1;
-end;
-
-procedure TListModel.Insert(const Item, Before: IInterface);
-var
- InsertIdx: integer;
-begin
- if fItems = nil then
- fItems := TInterfaceList.Create;
- if fItems.IndexOf(Item) < 0 then
- begin
- Subject.BeginUpdate;
- InsertIdx := fItems.IndexOf(Before);
- if InsertIdx < 0 then
- InsertIdx := 0;
- fItems.Insert(InsertIdx, Item);
- Subject.EndUpdate;
- end;
-end;
-
-procedure TListModel.Move(const Item, Before: IInterface);
-var
- IdxItem: integer;
- IdxBefore: integer;
- MoveItem: IInterface;
-begin
- if fItems <> nil then
- begin
- IdxItem := fItems.IndexOf(Item);
- if IdxItem >= 0 then
- begin
- Subject.BeginUpdate;
- MoveItem := fItems[IdxItem];
- fItems.Delete(IdxItem);
- IdxBefore := fItems.IndexOf(Before);
- if IdxBefore >0 then
- fItems.Insert(IdxBefore, MoveItem);
- Subject.EndUpdate;
- end;
- end; { if }
-end;
-
-procedure TListModel.Remove(const Item: IInterface);
-begin
- if fItems <> nil then
- begin
- Subject.BeginUpdate;
- fItems.Remove(Item);
- Subject.EndUpdate;
- end;
-end;
-
-destructor TListModel.Destroy;
-begin
- inherited Destroy;
-end;
-
-{ TString }
-
-function TString.GetAsString: string;
-begin
-
-end;
-
-procedure TString.SetAsString(const AValue: string);
-begin
-
-end;
-
-procedure TString.Accept(const Visitor: IVisitor);
-begin
-
-end;
-
-{ TStringListModel }
-
-function TStringListModel.StringListModelGetItem(Idx: Integer): IString;
-begin
- Result := Items[Idx] as IString;
-end;
-
-procedure TStringListModel.Accept(const Visitor: IVisitor);
-begin
-
-end;
-
-procedure TStringListModel.CreateCommandSet(var ACommandSet: ICommandSet);
-begin
-
-end;
-
-procedure TStringListModel.CreateSelection(var ASelection: ISelection);
-begin
-
-end;
-
-destructor TStringListModel.Destroy;
-begin
- inherited Destroy;
-end;
-
-{ TStringSelection }
-
-procedure TStringSelection.AddItem(const Item: IInterface);
-begin
- if fItems = nil then
- fItems := TInterfaceList.Create;
- if fItems.IndexOf(Item) < 0 then
- fItems.Add(Item);
-end;
-
-procedure TStringSelection.Clear;
-begin
-
-end;
-
-function TStringSelection.GetCount: integer;
-begin
- Result := fItems.Count;
-end;
-
-procedure TStringSelection.RemoveItem(const Item: IInterface);
-begin
- if fItems <> nil then
- begin
- if fItems.IndexOf(Item) >= 0 then
- fItems.Remove(Item);
- if fItems.Count = 0 then
- fItems := nil;
- end;
-end;
-
-procedure TStringSelection.SelectModel;
-var
- i: integer;
-begin
- for i := 0 to (fModel as IListModel).Count-1 do
- fItems.Add(fModel.Item[i]);
-end;
-
-procedure TStringSelection.Accept(const Visitor: IVisitor);
-var
- i: integer;
-begin
- for i := 0 to fItems.Count-1 do
- (fItems[i] as IVisited).Accept(Visitor);
-end;
-
-constructor TStringSelection.Create(const Model: IStringListModel);
-begin
- inherited Create;
- fModel := Model;
-end;
-
-{ TCommand }
-
-procedure TCommand.BindSelection(const Selection: ISelection);
-begin
- fSelection := Selection;
-end;
-
-function TCommand.GetEnabled: Boolean;
-begin
- Result := fEnabled;
-end;
-
-procedure TCommand.Accept(const Visitor: IVisitor);
-begin
- (Visitor as ICommandVisitor).VisitComand(self);
-end;
-
-constructor TCommand.Create(Enabled: Boolean);
-begin
- inherited Create;
- fEnabled := Enabled;
-end;
-
-{ TCommandSet }
-
-function TCommandSet.GetCount: integer;
-begin
- if fItems <> nil then
- Result := fItems.Count
- else
- Result := 0;
-end;
-
-procedure TCommandSet.Accept(const Visitor: IVisitor);
-var
- i: integer;
-begin
- for i := 0 to fItems.Count-1 do
- (fItems[i] as IVisited).Accept(Visitor);
-end;
-
-procedure TCommandSet.Update(const ASubject: IInterface);
-begin
- // do nothing yet
-end;
-
-constructor TCommandSet.Create;
-begin
- inherited Create;
- fItems := TInterfaceList.Create;
-end;
-
-{ TMVPModel }
-
-function TMVPModel.GetCommandSet: ICommandSet;
-begin
- Result := fCommandSet;
-end;
-
-function TMVPModel.GetCurrentSelection: ISelection;
-begin
- Result := fCurrentSelection;
-end;
-
-procedure TMVPModel.BindSelection;
-begin
- (fCurrentSelection as ISubject).Attach(fCommandSet as IObserver);
-end;
-
-constructor TMVPModel.Create;
-begin
- inherited Create;
- fSubject := TSubject.Create(self);
- CreateSelection(fCurrentSelection);
- CreateCommandSet(fCommandSet);
- BindSelection;
-end;
-
-destructor TMVPModel.Destroy;
-begin
- inherited Destroy;
-end;
-
-{ TStringModelCommandSet }
-
-procedure TStringModelCommandSet.Update(const ASubject: IInterface);
-var
- ObjSelection: ISelection;
- ObjVisited: IVisited;
- ObjModel: IStringListModel;
- Visitor: IStringMoveVisitor;
- Command: ICommand;
-begin
- ASubject.QueryInterface(ISelection, ObjSelection);
- if ObjSelection <> nil then
- begin
- Items.Clear;
- // We are only interested in a single selection. We don't have a
- // mechanism for multi-select yet.
- if ObjSelection.Count = 1 then
- begin
- ObjSelection.QueryInterface(IVisited, ObjVisited);
- if ObjVisited <> nil then
- begin
- ObjVisited.QueryInterface(IStringListModel, ObjModel);
- if ObjModel <> nil then
- begin
- Visitor := TStringMoveVisitor.Create(ObjModel);
- ObjVisited.Accept(Visitor);
- // This will only give commands that are applicable. So in a Menu the
- // available items will keep changing.
-{
- if Visitor.CanPromote then
- begin
- Command := TPromoteStringCommand.Create(True, ObjModel);
- Command.BindSelection(ObjSelection);
- Items.Add(Command);
- end;
- if Visitor.CanDemote then
- begin
- Command := TDemoteStringCommand.Create(True, ObjModel);
- Command.BindSelection(ObjSelection);
- Items.Add(Command);
- end;
-}
-
- // In this case it will return all commands, but only the applicable
- // ones will be Enabled. I like this idea more.
- Command := TPromoteStringCommand.Create(Visitor.CanPromote, ObjModel);
- Command.BindSelection(ObjSelection);
- Items.Add(Command);
-
- Command := TDemoteStringCommand.Create(Visitor.CanDemote, ObjModel);
- Command.BindSelection(ObjSelection);
- Items.Add(Command);
- end;
- end;
- end;
- Subject.Notify;
- end;
-end;
-
-destructor TStringModelCommandSet.Destroy;
-begin
- inherited Destroy;
-end;
-
-{ TStringVisitor }
-
-function TStringVisitor.GetTheString: IString;
-begin
- Result := fTheString;
-end;
-
-procedure TStringVisitor.VisitString(const Str: IString);
-begin
- fTheString := Str;
-end;
-
-{ TStringMoveVisitor }
-
-function TStringMoveVisitor.GetCanDemote: Boolean;
-begin
- Result := fCanDemote;
-end;
-
-function TStringMoveVisitor.GetCanPromote: Boolean;
-begin
- Result := fCanPromote;
-end;
-
-procedure TStringMoveVisitor.VisitString(const Str: IString);
-begin
- inherited VisitString(Str);
- fCanPromote := fModel.IndexOf(Str) > 0;
- fCanDemote := fModel.IndexOf(Str) < (fModel.Count - 1)
-end;
-
-constructor TStringMoveVisitor.Create(const Model: IStringListModel);
-begin
- inherited Create;
- fModel := Model;
-end;
-
-
-{ TPromoteStringCommand }
-
-function TPromoteStringCommand.GetModel: IStringListModel;
-begin
- Result := IStringListModel(fModel);
-end;
-
-function TPromoteStringCommand.Execute: Boolean;
-var
- Visitor: IStringVisitor;
- BeforeIdx: Integer;
-begin
- Visitor := TStringVisitor.Create;
- try
- (Selection as IVisited).Accept(Visitor);
- BeforeIdx := Max(GetModel.IndexOf(Visitor.TheString) - 1, 0);
- GetModel.Move(Visitor.TheString, GetModel.Item[BeforeIdx]);
- Result := True;
- except
- Result := False;
- end;
-end;
-
-function TPromoteStringCommand.GetText: string;
-begin
- Result := 'Promote String';
-end;
-
-constructor TPromoteStringCommand.Create(Enabled: Boolean;
- const Model: IStringListModel);
-begin
- inherited Create(Enabled);
- fModel := Pointer(Model);
-end;
-
-{ TDemoteStringCommand }
-
-function TDemoteStringCommand.GetModel: IStringListModel;
-begin
- Result := IStringListModel(fModel);
-end;
-
-function TDemoteStringCommand.Execute: Boolean;
-var
- Visitor: IStringVisitor;
- BeforeIdx: Integer;
-begin
- Visitor := TStringVisitor.Create;
- try
- (Selection as IVisited).Accept(Visitor);
- BeforeIdx := GetModel.IndexOf(Visitor.TheString) + 2;
- if BeforeIdx > GetModel.Count - 1 then
- begin
- (GetModel as ISubject).BeginUpdate;
- GetModel.Remove(Visitor.TheString);
- GetModel.Add(Visitor.TheString);
- (GetModel as ISubject).EndUpdate;
- end
- else
- GetModel.Move(Visitor.TheString, GetModel.Item[BeforeIdx]);
- Result := True;
- except
- Result := False;
- end;
-end;
-
-function TDemoteStringCommand.GetText: string;
-begin
- Result := 'Demote String';
-end;
-
-constructor TDemoteStringCommand.Create(Enabled: Boolean;
- const Model: IStringListModel);
-begin
- inherited Create(Enabled);
- fModel := Pointer(Model);
-end;
-
-end.
-