sPropEditors.pas
上传用户:hbdzzq
上传日期:2007-12-16
资源大小:1465k
文件大小:14k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit sPropEditors;
  2. {$I sDefs.inc}
  3. {$IFDEF DELPHI6UP}
  4. {$WARN UNIT_PLATFORM OFF}
  5. {$ENDIF}
  6. interface
  7. uses
  8.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  9.   ComCtrls, sStyleUtil, sConst, ExtCtrls, sPanel, sGraphUtils, sUtils, ImgList,
  10.   Consts, ComStrs, CommCtrl
  11. {$IFNDEF ALITE}
  12.   , sPageControl//, colnedit
  13. {$ENDIF}
  14.   , sColors, TypInfo,
  15.   {$IFDEF DELPHI6UP} DesignEditors, DesignIntf, VCLEditors,
  16.   {$ELSE}dsgnintf,
  17.   {$ENDIF}sVclUtils
  18.   ;
  19. type
  20. {$IFNDEF ALITE}
  21.   TsPageControlEditor = class(TDefaultEditor)
  22.   protected
  23.   public
  24.     procedure ExecuteVerb(Index: Integer); override;
  25.     function GetVerb(Index: Integer): string; override;
  26.     function GetVerbCount: Integer; override;
  27.   end;
  28.   TsTabSheetEditor = class(TDefaultEditor)
  29.   protected
  30.   public
  31.     procedure ExecuteVerb(Index: Integer); override;
  32.     function GetVerb(Index: Integer): string; override;
  33.     function GetVerbCount: Integer; override;
  34.   end;
  35.   TsToolBarEditor = class(TDefaultEditor)
  36.   protected
  37.   public
  38.     procedure ExecuteVerb(Index: Integer); override;
  39.     function GetVerb(Index: Integer): string; override;
  40.     function GetVerbCount: Integer; override;
  41.   end;
  42.   TsImageListEditor = class(TComponentEditor)
  43.   protected
  44.   public
  45.     procedure ExecuteVerb(Index: Integer); override;
  46.     function GetVerb(Index: Integer): string; override;
  47.     function GetVerbCount: Integer; override;
  48.   end;
  49. {$ENDIF}
  50. { TsColorProperty }
  51.   TsColorProperty = class(TColorProperty)
  52.   public
  53.     function GetValue: string; override;
  54.     procedure GetValues (Proc: TGetStrProc); override;
  55.     procedure SetValue (const Value: string); override;
  56. {$IFDEF DELPHI5}
  57.     procedure ListDrawValue(const Value: string; ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); override;
  58. {$ELSE}
  59. {$ENDIF}
  60.   end;
  61.   TsSkinNameProperty = class(TStringProperty)
  62.   private
  63.   public
  64.     function GetAttributes: TPropertyAttributes; override;
  65.     procedure GetValues(Proc: TGetStrProc); override;
  66.   end;
  67.   TsDirProperty = class(TStringProperty)
  68.   private
  69.   public
  70.     function GetAttributes: TPropertyAttributes; override;
  71.     procedure Edit; override;
  72.   end;
  73.   TsInternalSkinsProperty = class(TClassProperty)
  74.   private
  75.   public
  76.     function GetAttributes: TPropertyAttributes; override;
  77.     procedure Edit; override;
  78.   end;
  79.   TsInternalSkinsEditor = class(TComponentEditor)
  80.   private
  81.   public
  82.     procedure ExecuteVerb(Index: Integer); override;
  83.     function GetVerb(Index: Integer): string; override;
  84.     function GetVerbCount: Integer; override;
  85.   end;
  86. procedure Register;
  87. implementation
  88. uses sDefaults, sCustomButton, sSkinManager, FileCtrl,
  89. {$IFNDEF ALITE}
  90.   sToolEdit, sImageList, sImgListEditor, sComboBoxes,
  91. {$ENDIF}
  92.   FiltEdit,
  93.   sInternalSkins, stdreg, sButtonControl;
  94. {$IFNDEF ALITE}
  95. { TsPageControlEditor }
  96. procedure TsPageControlEditor.ExecuteVerb(Index: Integer);
  97. var
  98.   NewPage: TsTabSheet;
  99. begin
  100.   case Index of
  101.     0: begin
  102.       NewPage := TsTabSheet.Create(Designer.GetRoot);
  103.       NewPage.Parent := (Component as TsPageControl);
  104.       NewPage.PageControl := (Component as TsPageControl);
  105.       NewPage.Caption := Designer.UniqueName('sTabSheet');
  106.       NewPage.Name := NewPage.Caption;
  107.     end;
  108.     1: begin
  109.       NewPage := (Component as TsPageControl).ActivePage;
  110.       NewPage.Free;
  111.     end;
  112.     2: begin
  113. //      (Component as TsPageControl).FindNextPage((Component as TsPageControl).ActivePage,True,False);
  114.       (Component as TsPageControl).SelectNextPage(True);
  115.     end;
  116.     3: begin
  117. //      (Component as TsPageControl).FindNextPage((Component as TsPageControl).ActivePage,False,False);
  118.       (Component as TsPageControl).SelectNextPage(False);
  119.     end;
  120.   end;
  121.   if Designer <> nil then Designer.Modified;
  122. end;
  123. function TsPageControlEditor.GetVerb(Index: Integer): string;
  124. begin
  125.   case Index of
  126.     0:  result := 'New Page';
  127.     1:  result := 'Delete Page';
  128.     2:  result := 'Next Page';
  129.     3:  result := 'Previous Page';
  130.   end;
  131. end;
  132. function TsPageControlEditor.GetVerbCount: Integer;
  133. begin
  134.   result := 4;
  135. end;
  136. { TsToolBarEditor }
  137. procedure TsToolBarEditor.ExecuteVerb(Index: Integer);
  138. var
  139.   NewButton : TsSpeedButton;
  140. begin
  141.   (Component as TsToolBar).DontAutoSize := True;
  142.   NewButton := TsSpeedButton.Create(Designer.GetRoot);
  143.   NewButton.Parent := (Component as TsToolBar);
  144.   NewButton.Align := alLeft;
  145.   NewButton.sStyle.Painting.Transparency := 50;
  146.   NewButton.sStyle.Painting.Bevel := cbRaisedSoft;
  147.   NewButton.sStyle.HotStyle.HotPainting.BevelWidth := 2;
  148. //  NewButton.sStyle.HotStyle.Painting.Bevel := sConst.bsRaised;
  149.   NewButton.ShowCaption := False;
  150.   NewButton.Left := (Component as TsToolBar).Width - 1;
  151.   NewButton.Images := (Component as TsToolBar).Buttons.Images;
  152.   NewButton.ImagesGrayed := (Component as TsToolBar).Buttons.ImagesGrayed;
  153.   NewButton.ImagesDisabled := (Component as TsToolBar).Buttons.ImagesDisabled;
  154. //  NewButton.sStyle.Selection.Color := scViolet;
  155.   NewButton.Height  := (Component as TsToolBar).Buttons.ButtonHeight;
  156.   NewButton.Width   := (Component as TsToolBar).Buttons.ButtonWidth;
  157.   NewButton.Grayed  := (Component as TsToolBar).Buttons.Grayed;
  158.   case Index of
  159.     0:  begin
  160.       NewButton.ShowCaption := (Component as TsToolBar).Buttons.ShowCaptions;
  161.       NewButton.Name := Designer.UniqueName('TsToolButton');
  162.       NewButton.Caption := NewButton.Name;
  163.       NewButton.sStyle.Background.ListenMSG := False;
  164.       NewButton.sStyle.Background.Gradient.Data := GradientTsToolButton;
  165.       NewButton.sStyle.HotStyle.HotBackground.Gradient.Data := GradientTsToolButtonHot;
  166.       NewButton.sStyle.HotStyle.HotPainting.BevelWidth := DefBevelWidthHot;
  167.       NewButton.sStyle.Painting.Bevel := cbRaisedSoft;
  168.       NewButton.sStyle.SkinSection := 'TsToolButton';
  169.       NewButton.BevelWidth := 1;
  170.       NewButton.sStyle.Painting.Transparency := 100;
  171.     end;
  172.     1:  begin
  173.       NewButton.ButtonStyle := tbsDivider;
  174.       NewButton.sStyle.Painting.Bevel := cbRaisedSoft;
  175.       NewButton.Name := Designer.UniqueName('TsToolDivider');
  176.       NewButton.sStyle.Painting.Bevel := cbLoweredHard;
  177.       NewButton.BevelWidth := 1;
  178.     end;
  179.     2:  begin
  180.       NewButton.ButtonStyle := tbsSeparator;
  181.       NewButton.Name := Designer.UniqueName('TsToolSeparator');
  182.     end;
  183.   end;
  184. //  NewButton.AutoSize := True;
  185.   (Component as TsToolBar).DontAutoSize := True;
  186.   Designer.SelectComponent(NewButton);
  187.   if Designer <> nil then Designer.Modified;
  188. end;
  189. function TsToolBarEditor.GetVerb(Index: Integer): string;
  190. begin
  191.   case Index of
  192.     0:  result := 'New button';
  193.     1:  result := 'New divider';
  194.     2:  result := 'New separator';
  195.   end;
  196. end;
  197. function TsToolBarEditor.GetVerbCount: Integer;
  198. begin
  199.   result := 3;
  200. end;
  201. {$ENDIF}
  202. function TsColorProperty.GetValue: string;
  203. var
  204.   Color: TColor;
  205. begin
  206.   try
  207.     Color := TColor(GetOrdValue);
  208.     if Color = clNone16
  209.       then Color := clNone
  210.       else if Color = clInfoBk16
  211.              then Color := clInfoBk;
  212.     Result := RxColorToString(Color);
  213.   except
  214.   end;
  215. end;
  216. procedure TsColorProperty.GetValues(Proc: TGetStrProc);
  217. begin
  218.   try
  219.     RxGetColorValues(Proc);
  220.   except
  221.   end;
  222. end;
  223. procedure TsColorProperty.SetValue(const Value: string);
  224. begin
  225.   try
  226.     SetOrdValue(RxStringToColor(Value));
  227.   except
  228.   end;
  229. end;
  230. {$IFDEF DELPHI5}
  231. procedure TsColorProperty.ListDrawValue(const Value: string; ACanvas: TCanvas;
  232.   const ARect: TRect; ASelected: Boolean);
  233.   function ColorToBorderColor(AColor: TColor): TColor;
  234.   type
  235.     TColorQuad = record
  236.       Red, Green, Blue, Alpha: Byte;
  237.     end;
  238.   begin
  239.     Result := AColor;
  240.     try
  241.       if (TColorQuad(AColor).Red > 192) or (TColorQuad(AColor).Green > 192) or (TColorQuad(AColor).Blue > 192) then
  242.         Result := clBlack
  243.       else if ASelected then begin
  244.         Result := clWhite;
  245.       end;
  246.     except
  247.     end;
  248.   end;
  249. var
  250.   vRight: Integer;
  251.   vOldPenColor, vOldBrushColor: TColor;
  252. begin
  253.   vRight := (ARect.Bottom - ARect.Top) + ARect.Left;
  254.   with ACanvas do
  255.   try
  256.     vOldPenColor := Pen.Color;
  257.     vOldBrushColor := Brush.Color;
  258.     Pen.Color := Brush.Color;
  259.     Rectangle(ARect.Left, ARect.Top, vRight, ARect.Bottom);
  260.     Brush.Color := RxStringToColor(Value);
  261.     Pen.Color := ColorToBorderColor(ColorToRGB(Brush.Color));
  262.     Rectangle(ARect.Left + 1, ARect.Top + 1, vRight - 1, ARect.Bottom - 1);
  263.     Brush.Color := vOldBrushColor;
  264.     Pen.Color := vOldPenColor;
  265.   finally
  266.     ACanvas.TextRect(Rect(vRight, ARect.Top, ARect.Right, ARect.Bottom),
  267.       vRight + 1, ARect.Top + 1, Value);
  268.   end;
  269. end;
  270. {$ENDIF}
  271. procedure Register;
  272. begin
  273. //  RegisterPropertyEditor(TypeInfo(TImageIndex), TsButtoncontrol, 'ImageIndex', TComponentImageIndexPropertyEditor);
  274. {$IFNDEF ALITE}
  275.   RegisterComponentEditor(TsPageControl, TsPageControlEditor);
  276.   RegisterComponentEditor(TsTabSheet, TsTabSheetEditor);
  277.   RegisterComponentEditor(TsToolBar, TsToolBarEditor);
  278.   RegisterComponentEditor(TsImageList, TsImageListEditor);
  279. {$ENDIF}
  280. {$IFDEF DELPHI5}
  281.   RegisterPropertyEditor(TypeInfo(TColor), TPersistent, '', TsColorProperty);
  282. {$ENDIF}
  283.   RegisterPropertyEditor(TypeInfo(TsSkinName), TsSkinManager, 'SkinName', TsSkinNameProperty);
  284.   RegisterPropertyEditor(TypeInfo(TsDirectory), TsSkinManager, 'SkinDirectory', TsDirProperty);
  285.   RegisterPropertyEditor(TypeInfo(TsStoredSkins), TsSkinManager, 'InternalSkins', TsInternalSkinsProperty);
  286.   RegisterComponentEditor(TsSkinManager, TsInternalSkinsEditor);
  287. {$IFNDEF ALITE}
  288.   RegisterPropertyEditor(TypeInfo(string), TsFileNameEdit, 'Filter', TFilterProperty);
  289. {$ENDIF}
  290. end;
  291. { TsSkinNameProperty }
  292. function TsSkinNameProperty.GetAttributes: TPropertyAttributes;
  293. begin
  294.   Result := [paValueList, paSortList, {paReadOnly, }paAutoUpdate];
  295. end;
  296. procedure TsSkinNameProperty.GetValues(Proc: TGetStrProc);
  297. var
  298.   i: integer;
  299.   FileInfo: TSearchRec;
  300.   DosCode: Integer;
  301.   s : string;
  302. begin
  303.   // Internal skins names loading
  304.   if TsSkinManager(GetComponent(0)).InternalSkins.Count > 0 then begin
  305.     for i := 0 to TsSkinManager(GetComponent(0)).InternalSkins.Count - 1 do begin
  306.       Proc(TsSkinManager(GetComponent(0)).InternalSkins[i].Name);
  307.     end;
  308.   end;
  309.   // External skins names loading
  310.   if DirExists(TsSkinManager(GetComponent(0)).SkinDirectory) then begin
  311.     s := TsSkinManager(GetComponent(0)).SkinDirectory + '*.*';
  312.     DosCode := FindFirst(s, faVolumeID or faDirectory, FileInfo);
  313.     try
  314.       while DosCode = 0 do begin
  315.         if (FileInfo.Name[1] <> '.') and (FileInfo.Attr and faDirectory = faDirectory) then begin
  316.           Proc(FileInfo.Name);
  317.         end;
  318.         DosCode := FindNext(FileInfo);
  319.       end;
  320.     finally
  321.       FindClose(FileInfo);
  322.     end;
  323.   end;
  324. end;
  325. { TsDirProperty }
  326. function TsDirProperty.GetAttributes: TPropertyAttributes;
  327. begin
  328.   Result := [paDialog, paAutoUpdate];
  329. end;
  330. procedure TsDirProperty.Edit;
  331. var
  332.   s : string;
  333. begin
  334.   s := TsSkinManager(GetComponent(0)).SkinDirectory;
  335.   if SelectDirectory(s, [], 0) then begin
  336.     TsSkinManager(GetComponent(0)).SkinDirectory := s
  337.   end;
  338. end;
  339. { TsInternalSkinsProperty }
  340. procedure TsInternalSkinsProperty.Edit;
  341. var
  342.   i : integer;
  343. begin
  344.   Application.CreateForm(TFormInternalSkins, FormInternalSkins);
  345.   FormInternalSkins.ListBox1.Clear;
  346.   FormInternalSkins.SkinManager := TsSkinManager(GetComponent(0));
  347.   for i := 0 to TsSkinManager(GetComponent(0)).InternalSkins.Count - 1 do begin
  348.     FormInternalSkins.ListBox1.Items.Add(TsSkinManager(GetComponent(0)).InternalSkins.Items[i].Name);
  349.   end;
  350.   FormInternalSkins.ShowModal;
  351.   if Assigned(FormInternalSkins) then FreeAndNil(FormInternalSkins);
  352.   inherited;
  353. end;
  354. function TsInternalSkinsProperty.GetAttributes: TPropertyAttributes;
  355. begin
  356.   Result := [paDialog, paAutoUpdate];
  357. end;
  358. { TsInternalSkinsEditor }
  359. procedure TsInternalSkinsEditor.ExecuteVerb(Index: Integer);
  360. var
  361.   i : integer;
  362.   sm : TsSkinManager;
  363. begin
  364.   inherited;
  365.   sm := TsSkinManager(Component);
  366.   Application.CreateForm(TFormInternalSkins, FormInternalSkins);
  367.   FormInternalSkins.ListBox1.Clear;
  368.   FormInternalSkins.SkinManager := sm;
  369.   for i := 0 to sm.InternalSkins.Count - 1 do begin
  370.     FormInternalSkins.ListBox1.Items.Add(sm.InternalSkins.Items[i].Name);
  371.   end;
  372.   FormInternalSkins.ShowModal;
  373.   if Assigned(FormInternalSkins) then FreeAndNil(FormInternalSkins);
  374.   if Designer <> nil then Designer.Modified;
  375. end;
  376. function TsInternalSkinsEditor.GetVerb(Index: Integer): string;
  377. begin
  378.   case Index of 
  379.     0 : Result := '&Internal skins...';
  380.     1 : Result := '-';
  381.   end;
  382. end;
  383. function TsInternalSkinsEditor.GetVerbCount: Integer;
  384. begin
  385.   Result := 2;
  386. end;
  387. {$IFNDEF ALITE}
  388. { TsImageListEditor }
  389. procedure TsImageListEditor.ExecuteVerb(Index: Integer);
  390. var
  391.   Form : TFormImgListEditor;
  392. begin
  393.   case Index of
  394.     0:  begin
  395.       Application.CreateForm(TFormImgListEditor, Form);
  396.       Form.InitFromImgList(Component as TsImageList);
  397.       Form.ShowModal;
  398.       FreeAndNil(Form);
  399.     end;
  400.   end;
  401.   if Designer <> nil then Designer.Modified;
  402. end;
  403. function TsImageListEditor.GetVerb(Index: Integer): string;
  404. begin
  405.   case Index of
  406.     0:  result := '&ImageList editor...';
  407.   end;
  408. end;
  409. function TsImageListEditor.GetVerbCount: Integer;
  410. begin
  411.   result := 1;
  412. end;
  413. {$ENDIF}
  414. { TsTabSheetEditor }
  415. procedure TsTabSheetEditor.ExecuteVerb(Index: Integer);
  416. var
  417.   NewPage: TsTabSheet;
  418. begin
  419.   case Index of
  420.     0: begin
  421.       NewPage := TsTabSheet.Create(Designer.GetRoot);
  422.       NewPage.Parent := TsTabSheet(Component).PageControl;
  423.       NewPage.PageControl := TsTabSheet(Component).PageControl;
  424.       NewPage.Caption := Designer.UniqueName('sTabSheet');
  425.       NewPage.Name := NewPage.Caption;
  426.     end;
  427.     1: begin
  428.       NewPage := TsTabSheet(Component).PageControl.ActivePage;
  429.       NewPage.Free;
  430.     end;
  431.     2: begin
  432. //      TsTabSheet(Component).PageControl.FindNextPage(TsTabSheet(Component), True, False);
  433.       TsTabSheet(Component).PageControl.SelectNextPage(True);
  434.     end;
  435.     3: begin
  436. //      TsTabSheet(Component).PageControl.FindNextPage(TsTabSheet(Component), False, False);
  437.       TsTabSheet(Component).PageControl.SelectNextPage(False);
  438.     end;
  439.   end;
  440.   if Designer <> nil then Designer.Modified;
  441. end;
  442. function TsTabSheetEditor.GetVerb(Index: Integer): string;
  443. begin
  444.   case Index of
  445.     0:  result := 'New Page';
  446.     1:  result := 'Delete Page';
  447.     2:  result := 'Next Page';
  448.     3:  result := 'Previous Page';
  449.   end;
  450. end;
  451. function TsTabSheetEditor.GetVerbCount: Integer;
  452. begin
  453.   result := 4;
  454. end;
  455. end.