MrgMngr.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:10k
源码类别:

Delphi控件源码

开发平台:

Delphi

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