home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 June / Chip_2002-06_cd1.bin / zkuste / delphi / kolekce / d6 / rxlibsetup.exe / {app} / units / PRESRDSN.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-02-19  |  13.3 KB  |  482 lines

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 2001,2002 SGB Software          }
  6. {         Copyright (c) 1997, 1998 Fedor Koshevnikov,   }
  7. {                        Igor Pavluk and Serge Korolev  }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11.  
  12. unit PresrDsn;
  13.  
  14. {$I RX.INC}
  15.  
  16. interface
  17.  
  18. uses
  19.   SysUtils, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, 
  20.   Buttons, ExtCtrls, RXCtrls, Placemnt, RXProps, Consts, RTLConsts, DesignIntf, DesignEditors, VCLEditors, VclUtils;
  21.  
  22. type
  23.  
  24. {$IFNDEF RX_D4}
  25.   IDesigner = TDesigner;
  26. {$ENDIF}
  27.  
  28. { TFormPropsDlg }
  29.  
  30.   TFormPropsDlg = class(TForm)
  31.     Bevel1: TBevel;
  32.     Label30: TLabel;
  33.     Label31: TLabel;
  34.     Label2: TLabel;
  35.     UpBtn: TSpeedButton;
  36.     DownBtn: TSpeedButton;
  37.     StoredList: TTextListBox;
  38.     PropertiesList: TTextListBox;
  39.     ComponentsList: TTextListBox;
  40.     FormBox: TGroupBox;
  41.     ActiveCtrlBox: TCheckBox;
  42.     PositionBox: TCheckBox;
  43.     StateBox: TCheckBox;
  44.     AddButton: TButton;
  45.     DeleteButton: TButton;
  46.     ClearButton: TButton;
  47.     OkBtn: TButton;
  48.     CancelBtn: TButton;
  49.     procedure AddButtonClick(Sender: TObject);
  50.     procedure ClearButtonClick(Sender: TObject);
  51.     procedure ListClick(Sender: TObject);
  52.     procedure FormDestroy(Sender: TObject);
  53.     procedure DeleteButtonClick(Sender: TObject);
  54.     procedure StoredListClick(Sender: TObject);
  55.     procedure UpBtnClick(Sender: TObject);
  56.     procedure DownBtnClick(Sender: TObject);
  57.     procedure StoredListDragOver(Sender, Source: TObject; X, Y: Integer;
  58.       State: TDragState; var Accept: Boolean);
  59.     procedure StoredListDragDrop(Sender, Source: TObject; X, Y: Integer);
  60.     procedure PropertiesListDblClick(Sender: TObject);
  61.   private
  62.     { Private declarations }
  63.     FCompOwner: TComponent;
  64.     FDesigner: IDesigner;
  65.     procedure ListToIndex(List: TCustomListBox; Idx: Integer);
  66.     procedure UpdateCurrent;
  67.     procedure DeleteProp(I: Integer);
  68.     function FindProp(const CompName, PropName: string; var IdxComp,
  69.       IdxProp: Integer): Boolean;
  70.     procedure ClearLists;
  71.     procedure CheckAddItem(const CompName, PropName: string);
  72.     procedure AddItem(IdxComp, IdxProp: Integer; AUpdate: Boolean);
  73.     procedure BuildLists(StoredProps: TStrings);
  74.     procedure CheckButtons;
  75.     procedure SetStoredList(AList: TStrings);
  76.   public
  77.     { Public declarations }
  78.   end;
  79.  
  80. { TFormStorageEditor }
  81.  
  82.   TFormStorageEditor = class(TComponentEditor)
  83.     procedure ExecuteVerb(Index: Integer); override;
  84.     function GetVerb(Index: Integer): string; override;
  85.     function GetVerbCount: Integer; override;
  86.   end;
  87.  
  88. { TStoredPropsProperty }
  89.  
  90.   TStoredPropsProperty = class(TClassProperty)
  91.   public
  92.     function GetAttributes: TPropertyAttributes; override;
  93.     function GetValue: string; override;
  94.     procedure Edit; override;
  95.   end;
  96.  
  97. { Show component editor }
  98. function ShowStorageDesigner(ACompOwner: TComponent; ADesigner: IDesigner;
  99.   AStoredList: TStrings; var Options: TPlacementOptions): Boolean;
  100.  
  101. implementation
  102.  
  103. {$IFDEF WIN32}
  104. uses Windows, BoxProcs, TypInfo, RXLConst;
  105. {$ELSE}
  106. uses WinTypes, WinProcs, Str16, BoxProcs, TypInfo, RXLConst;
  107. {$ENDIF}
  108.  
  109. {$R *.DFM}
  110.  
  111. {$IFDEF WIN32}
  112.  {$D-}
  113. {$ENDIF}
  114.  
  115. { TFormStorageEditor }
  116.  
  117. procedure TFormStorageEditor.ExecuteVerb(Index: Integer);
  118. var
  119.   Storage: TFormStorage;
  120.   Opt: TPlacementOptions;
  121. begin
  122.   Storage := Component as TFormStorage;
  123.   if Index = 0 then begin
  124.     Opt := Storage.Options;
  125.     if ShowStorageDesigner(TComponent(Storage.Owner), Designer,
  126.       Storage.StoredProps, Opt) then
  127.     begin
  128.       Storage.Options := Opt;
  129. {$IFDEF WIN32}
  130.       Storage.SetNotification;
  131. {$ENDIF}
  132.     end;
  133.   end;
  134. end;
  135.  
  136. function TFormStorageEditor.GetVerb(Index: Integer): string;
  137. begin
  138.   case Index of
  139.     0: Result := LoadStr(srStorageDesigner);
  140.     else Result := '';
  141.   end;
  142. end;
  143.  
  144. function TFormStorageEditor.GetVerbCount: Integer;
  145. begin
  146.   Result := 1;
  147. end;
  148.  
  149. { TStoredPropsProperty }
  150.  
  151. function TStoredPropsProperty.GetAttributes: TPropertyAttributes;
  152. begin
  153.   Result := inherited GetAttributes + [paDialog] - [paSubProperties];
  154. end;
  155.  
  156. function TStoredPropsProperty.GetValue: string;
  157. begin
  158.   if TStrings(GetOrdValue).Count > 0 then Result := inherited GetValue
  159.   else Result := ResStr(srNone);
  160. end;
  161.  
  162. procedure TStoredPropsProperty.Edit;
  163. var
  164.   Storage: TFormStorage;
  165.   Opt: TPlacementOptions;
  166. begin
  167.   Storage := GetComponent(0) as TFormStorage;
  168.   Opt := Storage.Options;
  169.   if ShowStorageDesigner(Storage.Owner as TComponent, Designer,
  170.     Storage.StoredProps, Opt) then
  171.   begin
  172.     Storage.Options := Opt;
  173. {$IFDEF WIN32}
  174.     Storage.SetNotification;
  175. {$ENDIF}
  176.   end;
  177. end;
  178.  
  179. { Show component editor }
  180.  
  181. function ShowStorageDesigner(ACompOwner: TComponent; ADesigner: IDesigner;
  182.   AStoredList: TStrings; var Options: TPlacementOptions): Boolean;
  183. begin
  184.   with TFormPropsDlg.Create(Application) do
  185.   try
  186.     FCompOwner := ACompOwner;
  187.     FDesigner := ADesigner;
  188.     Screen.Cursor := crHourGlass;
  189.     try
  190.       UpdateStoredList(ACompOwner, AStoredList, False);
  191.       SetStoredList(AStoredList);
  192.       ActiveCtrlBox.Checked := fpActiveControl in Options;
  193.       PositionBox.Checked := fpPosition in Options;
  194.       StateBox.Checked := fpState in Options;
  195.     finally
  196.       Screen.Cursor := crDefault;
  197.     end;
  198.     Result := ShowModal = mrOk;
  199.     if Result then begin
  200.       AStoredList.Assign(StoredList.Items);
  201.       Options := [];
  202.       if ActiveCtrlBox.Checked then Include(Options, fpActiveControl);
  203.       if PositionBox.Checked then Include(Options, fpPosition);
  204.       if StateBox.Checked then Include(Options, fpState);
  205.     end;
  206.   finally
  207.     Free;
  208.   end;
  209. end;
  210.  
  211. { TFormPropsDlg }
  212.  
  213. procedure TFormPropsDlg.ListToIndex(List: TCustomListBox; Idx: Integer);
  214.  
  215.   procedure SetItemIndex(Index: Integer);
  216.   begin
  217.     if TTextListBox(List).MultiSelect then
  218.       TTextListBox(List).Selected[Index] := True;
  219.     List.ItemIndex := Index;
  220.   end;
  221.  
  222. begin
  223.   if Idx < List.Items.Count then
  224.     SetItemIndex(Idx)
  225.   else if Idx - 1 < List.Items.Count then
  226.     SetItemIndex(Idx - 1)
  227.   else if (List.Items.Count > 0) then
  228.     SetItemIndex(0);
  229. end;
  230.  
  231. procedure TFormPropsDlg.UpdateCurrent;
  232. var
  233.   IdxProp: Integer;
  234.   List: TStrings;
  235. begin
  236.   IdxProp := PropertiesList.ItemIndex;
  237.   if IdxProp < 0 then IdxProp := 0;
  238.   if ComponentsList.Items.Count <= 0 then
  239.   begin
  240.     PropertiesList.Clear;
  241.     Exit;
  242.   end;
  243.   if (ComponentsList.ItemIndex < 0) then
  244.     ComponentsList.ItemIndex := 0;
  245.   List := TStrings(ComponentsList.Items.Objects[ComponentsList.ItemIndex]);
  246.   if List.Count > 0 then PropertiesList.Items := List
  247.   else PropertiesList.Clear;
  248.   ListToIndex(PropertiesList, IdxProp);
  249.   CheckButtons;
  250. end;
  251.  
  252. procedure TFormPropsDlg.DeleteProp(I: Integer);
  253. var
  254.   CompName, PropName: string;
  255.   IdxComp, IdxProp, Idx: Integer;
  256.   StrList: TStringList;
  257. begin
  258.   Idx := StoredList.ItemIndex;
  259.   if ParseStoredItem(StoredList.Items[I], CompName, PropName) then begin
  260.     StoredList.Items.Delete(I);
  261.     if FDesigner <> nil then FDesigner.Modified;
  262.     ListToIndex(StoredList, Idx);
  263.     {I := ComponentsList.ItemIndex;}
  264.     if not FindProp(CompName, PropName, IdxComp, IdxProp) then begin
  265.       if IdxComp < 0 then begin
  266.         StrList := TStringList.Create;
  267.         try
  268.           StrList.Add(PropName);
  269.           ComponentsList.Items.AddObject(CompName, StrList);
  270.           ComponentsList.ItemIndex := ComponentsList.Items.IndexOf(CompName);
  271.         except
  272.           StrList.Free;
  273.           raise;
  274.         end;
  275.       end
  276.       else begin
  277.         TStrings(ComponentsList.Items.Objects[IdxComp]).Add(PropName);
  278.       end;
  279.       UpdateCurrent;
  280.     end;
  281.   end;
  282. end;
  283.  
  284. function TFormPropsDlg.FindProp(const CompName, PropName: string; var IdxComp,
  285.   IdxProp: Integer): Boolean;
  286. begin
  287.   Result := False;
  288.   IdxComp := ComponentsList.Items.IndexOf(CompName);
  289.   if IdxComp >= 0 then begin
  290.     IdxProp := TStrings(ComponentsList.Items.Objects[IdxComp]).IndexOf(PropName);
  291.     if IdxProp >= 0 then Result := True;
  292.   end;
  293. end;
  294.  
  295. procedure TFormPropsDlg.ClearLists;
  296. var
  297.   I: Integer;
  298. begin
  299.   for I := 0 to ComponentsList.Items.Count - 1 do begin
  300.     ComponentsList.Items.Objects[I].Free;
  301.   end;
  302.   ComponentsList.Items.Clear;
  303.   ComponentsList.Clear;
  304.   PropertiesList.Clear;
  305.   StoredList.Clear;
  306. end;
  307.  
  308. procedure TFormPropsDlg.AddItem(IdxComp, IdxProp: Integer; AUpdate: Boolean);
  309. var
  310.   Idx: Integer;
  311.   StrList: TStringList;
  312.   CompName, PropName: string;
  313.   Component: TComponent;
  314. begin
  315.   CompName := ComponentsList.Items[IdxComp];
  316.   Component := FCompOwner.FindComponent(CompName);
  317.   if Component = nil then Exit;
  318.   StrList := TStringList(ComponentsList.Items.Objects[IdxComp]);
  319.   PropName := StrList[IdxProp];
  320.   StrList.Delete(IdxProp);
  321.   if StrList.Count = 0 then begin
  322.     Idx := ComponentsList.ItemIndex;
  323.     StrList.Free;
  324.     ComponentsList.Items.Delete(IdxComp);
  325.     ListToIndex(ComponentsList, Idx);
  326.   end;
  327.   StoredList.Items.AddObject(CreateStoredItem(CompName, PropName), Component);
  328.   if FDesigner <> nil then FDesigner.Modified;
  329.   StoredList.ItemIndex := StoredList.Items.Count - 1;
  330.   if AUpdate then UpdateCurrent;
  331. end;
  332.  
  333. procedure TFormPropsDlg.CheckAddItem(const CompName, PropName: string);
  334. var
  335.   IdxComp, IdxProp: Integer;
  336. begin
  337.   if FindProp(CompName, PropName, IdxComp, IdxProp) then
  338.     AddItem(IdxComp, IdxProp, True);
  339. end;
  340.  
  341. procedure TFormPropsDlg.BuildLists(StoredProps: TStrings);
  342. var
  343.   I, J: Integer;
  344.   C: TComponent;
  345.   List: TPropInfoList;
  346.   StrList: TStrings;
  347.   CompName, PropName: string;
  348. begin
  349.   ClearLists;
  350.   if FCompOwner <> nil then begin
  351.     for I := 0 to FCompOwner.ComponentCount - 1 do begin
  352.       C := FCompOwner.Components[I];
  353.       if (C is TFormPlacement) or (C.Name = '') then Continue;
  354.       List := TPropInfoList.Create(C, tkProperties);
  355.       try
  356.         StrList := TStringList.Create;
  357.         try
  358.           TStringList(StrList).Sorted := True;
  359.           for J := 0 to List.Count - 1 do
  360.             StrList.Add(List.Items[J]^.Name);
  361.           ComponentsList.Items.AddObject(C.Name, StrList);
  362.         except
  363.           StrList.Free;
  364.           raise;
  365.         end;
  366.       finally
  367.         List.Free;
  368.       end;
  369.     end;
  370.     if StoredProps <> nil then begin
  371.       for I := 0 to StoredProps.Count - 1 do begin
  372.         if ParseStoredItem(StoredProps[I], CompName, PropName) then
  373.           CheckAddItem(CompName, PropName);
  374.       end;
  375.       ListToIndex(StoredList, 0);
  376.     end;
  377.   end
  378.   else StoredList.Items.Clear;
  379.   UpdateCurrent;
  380. end;
  381.  
  382. procedure TFormPropsDlg.SetStoredList(AList: TStrings);
  383. begin
  384.   BuildLists(AList);
  385.   if ComponentsList.Items.Count > 0 then
  386.     ComponentsList.ItemIndex := 0;
  387.   CheckButtons;
  388. end;
  389.  
  390. procedure TFormPropsDlg.CheckButtons;
  391. var
  392.   Enable: Boolean;
  393. begin
  394.   AddButton.Enabled := (ComponentsList.ItemIndex >= 0) and
  395.     (PropertiesList.ItemIndex >= 0);
  396.   Enable := (StoredList.Items.Count > 0) and
  397.     (StoredList.ItemIndex >= 0);
  398.   DeleteButton.Enabled := Enable;
  399.   ClearButton.Enabled := Enable;
  400.   UpBtn.Enabled := Enable and (StoredList.ItemIndex > 0);
  401.   DownBtn.Enabled := Enable and (StoredList.ItemIndex < StoredList.Items.Count - 1);
  402. end;
  403.  
  404. procedure TFormPropsDlg.AddButtonClick(Sender: TObject);
  405. var
  406.   I: Integer;
  407. begin
  408.   if PropertiesList.SelCount > 0 then begin
  409.     for I := PropertiesList.Items.Count - 1 downto 0 do begin
  410.       if PropertiesList.Selected[I] then
  411.         AddItem(ComponentsList.ItemIndex, I, False);
  412.     end;
  413.     UpdateCurrent;
  414.   end
  415.   else AddItem(ComponentsList.ItemIndex, PropertiesList.ItemIndex, True);
  416.   CheckButtons;
  417. end;
  418.  
  419. procedure TFormPropsDlg.ClearButtonClick(Sender: TObject);
  420. begin
  421.   if StoredList.Items.Count > 0 then begin
  422.     SetStoredList(nil);
  423.     if FDesigner <> nil then FDesigner.Modified;
  424.   end;
  425. end;
  426.  
  427. procedure TFormPropsDlg.DeleteButtonClick(Sender: TObject);
  428. begin
  429.   DeleteProp(StoredList.ItemIndex);
  430. end;
  431.  
  432. procedure TFormPropsDlg.ListClick(Sender: TObject);
  433. begin
  434.   if Sender = ComponentsList then UpdateCurrent
  435.   else CheckButtons;
  436. end;
  437.  
  438. procedure TFormPropsDlg.FormDestroy(Sender: TObject);
  439. begin
  440.   ClearLists;
  441. end;
  442.  
  443. procedure TFormPropsDlg.StoredListClick(Sender: TObject);
  444. begin
  445.   CheckButtons;
  446. end;
  447.  
  448. procedure TFormPropsDlg.UpBtnClick(Sender: TObject);
  449. begin
  450.   BoxMoveFocusedItem(StoredList, StoredList.ItemIndex - 1);
  451.   if FDesigner <> nil then FDesigner.Modified;
  452.   CheckButtons;
  453. end;
  454.  
  455. procedure TFormPropsDlg.DownBtnClick(Sender: TObject);
  456. begin
  457.   BoxMoveFocusedItem(StoredList, StoredList.ItemIndex + 1);
  458.   if FDesigner <> nil then FDesigner.Modified;
  459.   CheckButtons;
  460. end;
  461.  
  462. procedure TFormPropsDlg.StoredListDragOver(Sender, Source: TObject; X,
  463.   Y: Integer; State: TDragState; var Accept: Boolean);
  464. begin
  465.   BoxDragOver(StoredList, Source, X, Y, State, Accept, StoredList.Sorted);
  466.   CheckButtons;
  467. end;
  468.  
  469. procedure TFormPropsDlg.StoredListDragDrop(Sender, Source: TObject; X,
  470.   Y: Integer);
  471. begin
  472.   BoxMoveFocusedItem(StoredList, StoredList.ItemAtPos(Point(X, Y), True));
  473.   if FDesigner <> nil then FDesigner.Modified;
  474.   CheckButtons;
  475. end;
  476.  
  477. procedure TFormPropsDlg.PropertiesListDblClick(Sender: TObject);
  478. begin
  479.   if AddButton.Enabled then AddButtonClick(nil);
  480. end;
  481.  
  482. end.