home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d6 / RX275D6.ZIP / Units / MrgMngr.pas < prev    next >
Pascal/Delphi Source File  |  1999-10-12  |  10KB  |  378 lines

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1998 Master-Bank                }
  6. {                                                       }
  7. {*******************************************************}
  8.  
  9. unit MrgMngr;
  10.  
  11. {$I RX.INC}
  12.  
  13. interface
  14.  
  15. uses Classes, Controls, Forms, VCLUtils;
  16.  
  17. type
  18.   TFormRequestEvent = procedure(Sender: TObject; CurrentForm: TCustomForm;
  19.     var NewForm: TCustomForm) of object;
  20.   TFormReorderEvent = procedure(Sender: TObject;
  21.     Activated, Deactivated: TCustomForm) of object;
  22.   TFormHistory = class;
  23.   TFormHistoryCommand = (hcNone, hcAdd, hcBack, hcForward, hcGoto);
  24.  
  25. { TMergeManager }
  26.  
  27.   TMergeManager = class(TComponent)
  28.   private
  29.     FMergeFrame: TWinControl;
  30.     FFormHistory: TFormHistory;
  31.     FHistoryCommand: TFormHistoryCommand;
  32.     FOnGetBackForm: TFormRequestEvent;
  33.     FOnGetForwardForm: TFormRequestEvent;
  34.     FOnChange: TNotifyEvent;
  35.     FOnReorder: TFormReorderEvent;
  36.     function IsForm: Boolean;
  37.     function NotIsForm: Boolean;
  38.     procedure ReadForm(Reader: TReader);
  39.     procedure WriteForm(Writer: TWriter);
  40.     procedure SetMergeFrame(Value: TWinControl);
  41.     function GetActiveForm: TCustomForm;
  42.     procedure SetActiveForm(Value: TCustomForm);
  43.   protected
  44.     procedure DefineProperties(Filer: TFiler); override;
  45.     function GetBackForm: TCustomForm; virtual;
  46.     function GetForwardForm: TCustomForm; virtual;
  47.     procedure Notification(AComponent: TComponent;
  48.       Operation: TOperation); override;
  49.     procedure DoChange; dynamic;
  50.     procedure DoReorder(Deactivated: TCustomForm); dynamic;
  51.   public
  52.     constructor Create(AOwner: TComponent); override;
  53.     destructor Destroy; override;
  54.     procedure Merge(AForm: TCustomForm; Show: Boolean);
  55.     function GotoForm(AForm: TCustomForm): Boolean;
  56.     function GotoFormClass(AFormClass: TFormClass): Boolean;
  57.     procedure GoBack;
  58.     procedure GoForward;
  59.     procedure GotoHistoryIndex(HistoryIndex: Integer);
  60.     property FormHistory: TFormHistory read FFormHistory;
  61.     property ActiveForm: TCustomForm read GetActiveForm write SetActiveForm;
  62.     property HistoryCommand: TFormHistoryCommand read FHistoryCommand
  63.       write FHistoryCommand;
  64.   published
  65.     property MergeFrame: TWinControl read FMergeFrame write SetMergeFrame
  66.       stored NotIsForm;
  67.     property OnGetBackForm: TFormRequestEvent read FOnGetBackForm
  68.       write FOnGetBackForm;
  69.     property OnGetForwardForm: TFormRequestEvent read FOnGetForwardForm
  70.       write FOnGetForwardForm;
  71.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  72.     property OnReorder: TFormReorderEvent read FOnReorder write FOnReorder;
  73.   end;
  74.  
  75. { TFormHistory }
  76.  
  77.   TFormHistory = class(TList)
  78.   private
  79.     FCurrent: Integer;
  80.     FHistoryCapacity: Integer;
  81.     procedure SetCurrent(Value: Integer);
  82.     procedure SetHistoryCapacity(Value: Integer);
  83.     function GetForm(Index: Integer): TCustomForm;
  84.   public
  85.     constructor Create;
  86.     destructor Destroy; override;
  87.     procedure AddForm(AForm: TCustomForm);
  88.     procedure DeleteHistoryItem(Index: Integer);
  89.     function RemoveItem(Item: TComponent): Boolean;
  90.     procedure ResetHistory;
  91.     property Current: Integer read FCurrent write SetCurrent;
  92.     property HistoryCapacity: Integer read FHistoryCapacity
  93.       write SetHistoryCapacity;
  94.     property Forms[Index: Integer]: TCustomForm read GetForm;
  95.   end;
  96.  
  97. implementation
  98.  
  99. { TMergeManager }
  100.  
  101. constructor TMergeManager.Create(AOwner: TComponent);
  102. begin
  103.   inherited Create(AOwner);
  104.   FFormHistory := TFormHistory.Create;
  105.   FHistoryCommand := hcAdd;
  106. end;
  107.  
  108. destructor TMergeManager.Destroy;
  109. begin
  110.   FFormHistory.Free;
  111.   inherited Destroy;
  112. end;
  113.  
  114. function TMergeManager.NotIsForm: Boolean;
  115. begin
  116.   Result := (MergeFrame <> nil) and not (MergeFrame is TCustomForm);
  117. end;
  118.  
  119. function TMergeManager.IsForm: Boolean;
  120. begin
  121.   Result := (MergeFrame <> nil) and ((MergeFrame = Owner) and
  122.     (Owner is TCustomForm));
  123. end;
  124.  
  125. procedure TMergeManager.ReadForm(Reader: TReader);
  126. begin
  127.   if Reader.ReadBoolean then
  128.     if Owner is TCustomForm then MergeFrame := TWinControl(Owner);
  129. end;
  130.  
  131. procedure TMergeManager.WriteForm(Writer: TWriter);
  132. begin
  133.   Writer.WriteBoolean(IsForm);
  134. end;
  135.  
  136. procedure TMergeManager.DefineProperties(Filer: TFiler);
  137. {$IFDEF WIN32}
  138.   function DoWrite: Boolean;
  139.   begin
  140.     if Assigned(Filer.Ancestor) then
  141.       Result := IsForm <> TMergeManager(Filer.Ancestor).IsForm
  142.     else Result := IsForm;
  143.   end;
  144. {$ENDIF}
  145. begin
  146.   inherited DefineProperties(Filer);
  147.   Filer.DefineProperty('IsForm', ReadForm, WriteForm,
  148.     {$IFDEF WIN32} DoWrite {$ELSE} IsForm {$ENDIF});
  149. end;
  150.  
  151. procedure TMergeManager.SetMergeFrame(Value: TWinControl);
  152. begin
  153.   if FMergeFrame <> Value then begin
  154.     FMergeFrame := Value;
  155. {$IFDEF WIN32}
  156.     if Value <> nil then Value.FreeNotification(Self);
  157. {$ENDIF}
  158.     FFormHistory.ResetHistory;
  159.   end;
  160. end;
  161.  
  162. function TMergeManager.GetActiveForm: TCustomForm;
  163. var
  164.   I: Integer;
  165. begin
  166.   if (MergeFrame <> nil) and (MergeFrame.ControlCount > 0) then begin
  167.     for I := MergeFrame.ControlCount - 1 downto 0 do begin
  168.       if MergeFrame.Controls[I] is TCustomForm then begin
  169.         Result := TCustomForm(MergeFrame.Controls[I]);
  170.         Exit;
  171.       end;
  172.     end;
  173.   end;
  174.   Result := nil;
  175. end;
  176.  
  177. procedure TMergeManager.SetActiveForm(Value: TCustomForm);
  178. begin
  179.   GotoForm(Value);
  180. end;
  181.  
  182. function TMergeManager.GetBackForm: TCustomForm;
  183. begin
  184.   if FormHistory.Current < 1 then
  185.     Result := nil
  186.   else
  187.     Result := FormHistory.Forms[FormHistory.Current - 1];
  188.   if Assigned(FOnGetBackForm) then FOnGetBackForm(Self, ActiveForm, Result);
  189. end;
  190.  
  191. function TMergeManager.GetForwardForm: TCustomForm;
  192. begin
  193.   if FormHistory.Current >= FormHistory.Count - 1 then
  194.     Result := nil
  195.   else
  196.     Result := FormHistory.Forms[FormHistory.Current + 1];
  197.   if Assigned(FOnGetForwardForm) then FOnGetForwardForm(Self, ActiveForm, Result);
  198. end;
  199.  
  200. procedure TMergeManager.Notification(AComponent: TComponent;
  201.   Operation: TOperation);
  202. begin
  203.   inherited Notification(AComponent, Operation);
  204.   if Operation = opRemove then begin
  205.     if AComponent = MergeFrame then MergeFrame := nil;
  206.     if FormHistory.RemoveItem(AComponent) then DoChange;
  207.   end;
  208. end;
  209.  
  210. procedure TMergeManager.DoChange;
  211. begin
  212.   if Assigned(FOnChange) then FOnChange(Self);
  213. end;
  214.  
  215. procedure TMergeManager.DoReorder(Deactivated: TCustomForm);
  216. begin
  217.   if Assigned(FOnReorder) then FOnReorder(Self, ActiveForm, Deactivated);
  218. end;
  219.  
  220. procedure TMergeManager.Merge(AForm: TCustomForm; Show: Boolean);
  221. begin
  222.   MergeForm(MergeFrame, TForm(AForm), alClient, Show);
  223.   GotoForm(AForm);
  224. end;
  225.  
  226. function TMergeManager.GotoForm(AForm: TCustomForm): Boolean;
  227. var
  228.   I: Integer;
  229.   OldActiveForm: TCustomForm;
  230. begin
  231.   Result := False;
  232.   OldActiveForm := ActiveForm;
  233.   if MergeFrame = nil then Exit;
  234.   for I := 0 to MergeFrame.ControlCount - 1 do begin
  235.     if MergeFrame.Controls[I] = AForm then begin
  236.       AForm.BringToFront;
  237.       case HistoryCommand of
  238.         hcNone: ;
  239.         hcAdd: FormHistory.AddForm(AForm);
  240.         hcBack: FormHistory.Current := FormHistory.Current - 1;
  241.         hcForward: FormHistory.Current := FormHistory.Current + 1;
  242.         hcGoto: ;
  243.       end;
  244.       HistoryCommand := hcAdd;
  245.       DoReorder(OldActiveForm);
  246.       DoChange;
  247.       Result := True;
  248.       Exit;
  249.     end;
  250.   end;
  251. end;
  252.  
  253. function TMergeManager.GotoFormClass(AFormClass: TFormClass): Boolean;
  254. var
  255.   I: Integer;
  256. begin
  257.   Result := False;
  258.   if MergeFrame = nil then Exit;
  259.   for I := 0 to MergeFrame.ControlCount - 1 do begin
  260.     if MergeFrame.Controls[I] is AFormClass then begin
  261.       Result := GotoForm(MergeFrame.Controls[I] as TCustomForm);     
  262.       Exit;
  263.     end;
  264.   end;
  265. end;
  266.  
  267. procedure TMergeManager.GoBack;
  268. begin
  269.   HistoryCommand := hcBack;
  270.   GotoForm(GetBackForm);
  271. end;
  272.  
  273. procedure TMergeManager.GoForward;
  274. begin
  275.   HistoryCommand := hcForward;
  276.   GotoForm(GetForwardForm);
  277. end;
  278.  
  279. procedure TMergeManager.GotoHistoryIndex(HistoryIndex: Integer);
  280. var
  281.   SaveCurrent: Integer;
  282. begin
  283.   SaveCurrent := FormHistory.Current;
  284.   FormHistory.Current := HistoryIndex;
  285.   try
  286.     HistoryCommand := hcGoto;
  287.     GotoForm(FormHistory.Forms[HistoryIndex]);
  288.   finally
  289.     if ActiveForm <> FormHistory.Forms[HistoryIndex] then
  290.       FormHistory.Current := SaveCurrent;
  291.   end;
  292. end;
  293.  
  294. { TFormHistory }
  295.  
  296. constructor TFormHistory.Create;
  297. begin
  298.   inherited Create;
  299.   FCurrent := -1;
  300.   FHistoryCapacity := 10;
  301. end;
  302.  
  303. destructor TFormHistory.Destroy;
  304. begin
  305.   inherited Destroy;
  306. end;
  307.  
  308. procedure TFormHistory.SetCurrent(Value: Integer);
  309. begin
  310.   if Value < 0 then Value := -1;
  311.   if Value > Count - 1 then Value := Count - 1;
  312.   if FCurrent <> Value then begin
  313.     FCurrent := Value;
  314.   end;
  315. end;
  316.  
  317. procedure TFormHistory.SetHistoryCapacity(Value: Integer);
  318. var
  319.   I: Integer;
  320. begin
  321.   if Value < FHistoryCapacity then begin
  322.     for I := 0 to Count - Value do begin
  323.       RemoveItem(Forms[0]);
  324.     end;
  325.   end;
  326.   FHistoryCapacity := Value;
  327. end;
  328.  
  329. function TFormHistory.GetForm(Index: Integer): TCustomForm;
  330. begin
  331.   Result := TCustomForm(Items[Index]);
  332. end;
  333.  
  334. procedure TFormHistory.AddForm(AForm: TCustomForm);
  335. var
  336.   I: Integer;
  337. begin
  338.   for I := Count - 1 downto Current + 1 do begin
  339.     DeleteHistoryItem(I);
  340.   end;
  341.   for I := 0 to Count - HistoryCapacity do begin
  342.     DeleteHistoryItem(0);
  343.   end;
  344.   if Count < HistoryCapacity then begin
  345.     Add(AForm);
  346.   end;
  347.   Current := Count - 1;
  348. end;
  349.  
  350. procedure TFormHistory.DeleteHistoryItem(Index: Integer);
  351. begin
  352.   if (Index >= 0) and (Index < Count) then begin
  353.     Delete(Index);
  354.     if Current > Count - 1 then Current := Count - 1;
  355.   end;
  356. end;
  357.  
  358. function TFormHistory.RemoveItem(Item: TComponent): Boolean;
  359. var
  360.   I: Integer;
  361. begin
  362.   Result := False;
  363.   for I := Count - 1 downto 0 do begin
  364.     if Items[I] = Item then begin
  365.       DeleteHistoryItem(I);
  366.       Result := True;
  367.     end;
  368.   end;
  369. end;
  370.  
  371. procedure TFormHistory.ResetHistory;
  372. begin
  373.   Clear;
  374.   Current := -1;
  375. end;
  376.  
  377. end.
  378.