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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995, 1996 AO ROSNO             }
  6. {         Copyright (c) 1997 Master-Bank                }
  7. {                                                       }
  8. {*******************************************************}
  9. unit SbSetup;
  10. interface
  11. {$I RX.INC}
  12. uses
  13. {$IFDEF WIN32}
  14.   Windows,
  15. {$ELSE}
  16.   WinTypes, WinProcs,
  17. {$ENDIF WIN32}
  18.   SysUtils, Messages, Classes, Graphics, Controls, Forms, Dialogs,
  19.   StdCtrls, Buttons, Grids, RxCtrls, SpeedBar, ExtCtrls, RxConst;
  20. type
  21.   TSpeedbarSetupWindow = class(TForm)
  22.     ButtonsList: TDrawGrid;
  23.     ButtonsLabel: TLabel;
  24.     SectionList: TDrawGrid;
  25.     CategoriesLabel: TLabel;
  26.     Bevel1: TBevel;
  27.     HintLabel: TLabel;
  28.     CloseBtn: TButton;
  29.     HelpBtn: TButton;
  30.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  31.     procedure SectionListSelectCell(Sender: TObject; Col, Row: Longint;
  32.       var CanSelect: Boolean);
  33.     procedure SectionListDrawCell(Sender: TObject; Col, Row: Longint;
  34.       Rect: TRect; State: TGridDrawState);
  35.     procedure ButtonsListMouseDown(Sender: TObject; Button: TMouseButton;
  36.       Shift: TShiftState; X, Y: Integer);
  37.     procedure ButtonsListMouseMove(Sender: TObject; Shift: TShiftState; X,
  38.       Y: Integer);
  39.     procedure ButtonsListMouseUp(Sender: TObject; Button: TMouseButton;
  40.       Shift: TShiftState; X, Y: Integer);
  41.     procedure ButtonsListSelectCell(Sender: TObject; Col, Row: Longint;
  42.       var CanSelect: Boolean);
  43.     procedure FormCreate(Sender: TObject);
  44.     procedure FormDestroy(Sender: TObject);
  45.     procedure ButtonsListDrawCell(Sender: TObject; Col, Row: Longint;
  46.       Rect: TRect; State: TGridDrawState);
  47.     procedure CloseBtnClick(Sender: TObject);
  48.     procedure HelpBtnClick(Sender: TObject);
  49.     procedure FormShow(Sender: TObject);
  50.   private
  51.     { Private declarations }
  52.     FButton: TBtnControl;
  53.     FImage: TButtonImage;
  54.     FBar: TSpeedBar;
  55.     FDrag: Boolean;
  56.     FDragItem: TSpeedItem;
  57.     procedure UpdateHint(Section, Row: Integer);
  58.     function CheckSpeedBar: Boolean;
  59.     function CurrentSection: Integer;
  60.     procedure SetSection(Section: Integer);
  61.     procedure UpdateCurrentSection;
  62.     procedure UpdateData(Section: Integer);
  63.     procedure UpdateListHeight;
  64.     procedure SetSpeedBar(Value: TSpeedBar);
  65.     function ItemByRow(Row: Integer): TSpeedItem;
  66.     procedure CMSpeedBarChanged(var Message: TMessage); message CM_SPEEDBARCHANGED;
  67.   public
  68.     { Public declarations }
  69.     property SpeedBar: TSpeedBar read FBar write SetSpeedBar;
  70.   end;
  71. procedure ShowSpeedbarSetupWindow(Speedbar: TSpeedbar; HelpCtx: THelpContext);
  72. implementation
  73. uses VCLUtils, MaxMin, Consts, RXTConst;
  74. {$R *.DFM}
  75. function FindEditor(Speedbar: TSpeedbar): TSpeedbarSetupWindow;
  76. var
  77.   I: Integer;
  78. begin
  79.   Result := nil;
  80.   for I := 0 to Screen.FormCount - 1 do begin
  81.     if Screen.Forms[I] is TSpeedbarSetupWindow then begin
  82.       if TSpeedbarSetupWindow(Screen.Forms[I]).SpeedBar = SpeedBar then
  83.       begin
  84.         Result := TSpeedbarSetupWindow(Screen.Forms[I]);
  85.         Break;
  86.       end;
  87.     end;
  88.   end;
  89. end;
  90. procedure ShowSpeedbarSetupWindow(Speedbar: TSpeedbar; HelpCtx: THelpContext);
  91. var
  92.   Editor: TSpeedbarSetupWindow;
  93. begin
  94.   if Speedbar = nil then Exit;
  95.   Editor := FindEditor(Speedbar);
  96.   if Editor = nil then begin
  97.     Editor := TSpeedbarSetupWindow.Create(Application);
  98.     Editor.Speedbar := Speedbar;
  99.   end;
  100.   try
  101.     if HelpCtx > 0 then Editor.HelpContext := HelpCtx;
  102. {$IFDEF WIN32}
  103.     Editor.BorderIcons := [biSystemMenu];
  104. {$ENDIF}
  105.     Editor.HelpBtn.Visible := (HelpCtx > 0);
  106.     Editor.Show;
  107.     if Editor.WindowState = wsMinimized then Editor.WindowState := wsNormal;
  108.   except
  109.     Editor.Free;
  110.     raise;
  111.   end;
  112. end;
  113. { TSpeedbarSetupWindow }
  114. const
  115.   MaxBtnListHeight = 186;
  116. function TSpeedbarSetupWindow.CheckSpeedBar: Boolean;
  117. begin
  118.   Result := (FBar <> nil) and (FBar.Owner <> nil) and
  119.     (FBar.Parent <> nil);
  120. end;
  121. function TSpeedbarSetupWindow.CurrentSection: Integer;
  122. begin
  123.   if CheckSpeedBar and (FBar.SectionCount > 0) then
  124.     Result := SectionList.Row
  125.   else Result := -1;
  126. end;
  127. procedure TSpeedbarSetupWindow.SetSection(Section: Integer);
  128. var
  129.   I: Integer;
  130. begin
  131.   if CheckSpeedBar then begin
  132.     I := Section;
  133.     if (I >= 0) and (FBar.SectionCount > 0) then
  134.       ButtonsList.RowCount := FBar.ItemsCount(I)
  135.     else ButtonsList.RowCount := 0;
  136.     SectionList.DefaultColWidth := SectionList.ClientWidth;
  137.     ButtonsList.DefaultColWidth := ButtonsList.ClientWidth;
  138.     UpdateHint(I, ButtonsList.Row);
  139.   end;
  140. end;
  141. procedure TSpeedbarSetupWindow.UpdateCurrentSection;
  142. begin
  143.   SetSection(CurrentSection);
  144. end;
  145. procedure TSpeedbarSetupWindow.UpdateData(Section: Integer);
  146. begin
  147.   if CheckSpeedBar then begin
  148.     SectionList.RowCount := FBar.SectionCount;
  149.     UpdateCurrentSection;
  150.     if (Section >= 0) and (Section < SectionList.RowCount) then
  151.       SectionList.Row := Section;
  152.   end
  153.   else begin
  154.     SectionList.RowCount := 0;
  155.     ButtonsList.RowCount := 0;
  156.   end;
  157. end;
  158. procedure TSpeedbarSetupWindow.UpdateListHeight;
  159. var
  160.   Cnt: Integer;
  161.   MaxHeight: Integer;
  162. begin
  163.   Canvas.Font := Font;
  164.   MaxHeight := MulDiv(MaxBtnListHeight, Screen.PixelsPerInch, 96);
  165.   ButtonsList.DefaultRowHeight := FBar.BtnHeight + 2;
  166.   Cnt := Max(1, Max(ButtonsList.ClientHeight, MaxHeight) div
  167.     (FBar.BtnHeight + 2));
  168.   ButtonsList.ClientHeight := Min(MaxHeight,
  169.     ButtonsList.DefaultRowHeight * Cnt);
  170.   SectionList.ClientHeight := ButtonsList.ClientHeight;
  171.   SectionList.DefaultRowHeight := Canvas.TextHeight('Wg') + 2;
  172. end;
  173. procedure TSpeedbarSetupWindow.SetSpeedBar(Value: TSpeedBar);
  174. begin
  175.   if FBar <> Value then begin
  176.     if FBar <> nil then FBar.SetEditing(0);
  177.     FBar := Value;
  178.     if FBar <> nil then begin
  179.       FBar.SetEditing(Handle);
  180.       UpdateListHeight;
  181.     end;
  182.     UpdateData(-1);
  183.   end;
  184. end;
  185. procedure TSpeedbarSetupWindow.CMSpeedBarChanged(var Message: TMessage);
  186. begin
  187.   if Pointer(Message.LParam) = FBar then begin
  188.     case Message.WParam of
  189.       SBR_CHANGED: UpdateData(CurrentSection);
  190.       SBR_DESTROYED: Close;
  191.       SBR_BTNSIZECHANGED: if FBar <> nil then UpdateListHeight;
  192.     end;
  193.   end;
  194. end;
  195. function TSpeedbarSetupWindow.ItemByRow(Row: Integer): TSpeedItem;
  196. begin
  197.   Result := FBar.Items(CurrentSection, Row);
  198. end;
  199. procedure TSpeedbarSetupWindow.UpdateHint(Section, Row: Integer);
  200. var
  201.   Item: TSpeedItem;
  202. begin
  203.   Item := FBar.Items(Section, Row);
  204.   if Item <> nil then Hint := Item.Hint
  205.   else Hint := '';
  206. end;
  207. procedure TSpeedbarSetupWindow.FormClose(Sender: TObject; var Action: TCloseAction);
  208. begin
  209.   Action := caFree;
  210.   FButton.Free;
  211.   FButton := nil;
  212.   if FBar <> nil then FBar.SetEditing(0);
  213.   FBar := nil;
  214. end;
  215. procedure TSpeedbarSetupWindow.SectionListSelectCell(Sender: TObject; Col,
  216.   Row: Longint; var CanSelect: Boolean);
  217. begin
  218.   CanSelect := False;
  219.   SetSection(Row);
  220.   CanSelect := True;
  221. end;
  222. procedure TSpeedbarSetupWindow.SectionListDrawCell(Sender: TObject; Col,
  223.   Row: Longint; Rect: TRect; State: TGridDrawState);
  224. begin
  225.   if CheckSpeedBar then begin
  226.     if Row < FBar.SectionCount then begin
  227.       DrawCellText(Sender as TDrawGrid, Col, Row,
  228.         FBar.Sections[Row].Caption, Rect, taLeftJustify, vaCenter
  229.         {$IFDEF RX_D4}, TDrawGrid(Sender).IsRightToLeft {$ENDIF});
  230.     end;
  231.   end;
  232. end;
  233. procedure TSpeedbarSetupWindow.ButtonsListMouseDown(Sender: TObject;
  234.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  235. var
  236.   Item: TSpeedItem;
  237. begin
  238.   Item := ItemByRow(ButtonsList.Row);
  239.   if (Item <> nil) and (X < FBar.BtnWidth + 2) and (Button = mbLeft) then
  240.   begin
  241.     FDrag := True;
  242.     if Item.Visible then FDragItem := nil
  243.     else begin
  244.       FDragItem := Item;
  245.       if FButton = nil then begin
  246.         FButton := TBtnControl.Create(Self);
  247.         FButton.AssignSpeedItem(Item);
  248.       end;
  249.     end;
  250.   end;
  251. end;
  252. procedure TSpeedbarSetupWindow.ButtonsListMouseMove(Sender: TObject;
  253.   Shift: TShiftState; X, Y: Integer);
  254. var
  255.   P: TPoint;
  256. begin
  257.   if FDrag and (FButton <> nil) and (FDragItem <> nil) then begin
  258.     P := (Sender as TControl).ClientToScreen(Point(X, Y));
  259.     X := P.X - (FButton.Width {div 2});
  260.     Y := P.Y - (FButton.Height {div 2});
  261.     FButton.Activate(Bounds(X, Y, FBar.BtnWidth, FBar.BtnHeight));
  262.   end
  263.   else if FDrag then SetCursor(Screen.Cursors[crNoDrop]);
  264. end;
  265. procedure TSpeedbarSetupWindow.ButtonsListMouseUp(Sender: TObject;
  266.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  267. var
  268.   P: TPoint;
  269. begin
  270.   if FDrag and (Button = mbLeft) then
  271.   try
  272.     if (FDragItem <> nil) and (FButton <> nil) then begin
  273.       Dec(X, FButton.Width {div 2});
  274.       Dec(Y, FButton.Height {div 2});
  275.       P := (Sender as TControl).ClientToScreen(Point(X, Y));
  276.       FButton.Free;
  277.       FButton := nil;
  278.       if CheckSpeedBar and (FBar = FindSpeedBar(P)) then begin
  279.         P := FBar.ScreenToClient(P);
  280.         if FBar.AcceptDropItem(FDragItem, P.X, P.Y) then
  281.           UpdateCurrentSection;
  282.       end;
  283.     end
  284.     else SetCursor(Screen.Cursors[ButtonsList.Cursor]);
  285.   finally
  286.     FDrag := False;
  287.     FDragItem := nil;
  288.   end;
  289. end;
  290. procedure TSpeedbarSetupWindow.ButtonsListSelectCell(Sender: TObject; Col,
  291.   Row: Longint; var CanSelect: Boolean);
  292. begin
  293.   CanSelect := not FDrag or (Row = ButtonsList.Row);
  294.   if CanSelect then UpdateHint(CurrentSection, Row)
  295.   else Hint := '';
  296. end;
  297. procedure TSpeedbarSetupWindow.FormCreate(Sender: TObject);
  298. begin
  299.   FImage := TButtonImage.Create;
  300.   FButton := nil;
  301.   FBar := nil;
  302.   FDrag := False;
  303.   CloseBtn.Default := False;
  304.   if NewStyleControls then Font.Style := [];
  305.   { Load string resources }
  306.   CloseBtn.Caption := ResStr(SOKButton);
  307.   HelpBtn.Caption := ResStr(SHelpButton);
  308.   Caption := LoadStr(SCustomizeSpeedbar);
  309.   CategoriesLabel.Caption := LoadStr(SSpeedbarCategories);
  310.   ButtonsLabel.Caption := LoadStr(SAvailButtons);
  311.   HintLabel.Caption := LoadStr(SSpeedbarEditHint);
  312. end;
  313. procedure TSpeedbarSetupWindow.FormDestroy(Sender: TObject);
  314. begin
  315.   FImage.Free;
  316. end;
  317. procedure TSpeedbarSetupWindow.ButtonsListDrawCell(Sender: TObject; Col,
  318.   Row: Longint; Rect: TRect; State: TGridDrawState);
  319. var
  320.   I: Integer;
  321. begin
  322.   I := CurrentSection;
  323.   if (I >= 0) and (Row < FBar.ItemsCount(I)) then
  324.     DrawCellButton(Sender as TDrawGrid, Rect, ItemByRow(Row), FImage
  325.       {$IFDEF RX_D4}, TDrawGrid(Sender).IsRightToLeft {$ENDIF});
  326. end;
  327. procedure TSpeedbarSetupWindow.CloseBtnClick(Sender: TObject);
  328. begin
  329.   Close;
  330. end;
  331. procedure TSpeedbarSetupWindow.HelpBtnClick(Sender: TObject);
  332. begin
  333.   Application.HelpContext(HelpContext);
  334. end;
  335. procedure TSpeedbarSetupWindow.FormShow(Sender: TObject);
  336. begin
  337.   if FBar <> nil then UpdateListHeight;
  338.   SectionList.DefaultColWidth := SectionList.ClientWidth;
  339.   ButtonsList.DefaultColWidth := ButtonsList.ClientWidth;
  340. end;
  341. end.