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

Delphi控件源码

开发平台:

Delphi

  1. end;
  2. procedure TbsSkinControlBar.WMSIZE;
  3. begin
  4.   inherited;
  5.   GetSkinData;
  6.   if (FIndex <> -1) and FSkinBevel then PaintNCSkin;
  7. end;
  8. procedure TbsSkinControlBar.SetSkinBevel;
  9. begin
  10.   FSkinBevel := Value;
  11.   if FIndex <> -1 then RecreateWnd;
  12. end;
  13. procedure TbsSkinControlBar.PaintNCSkin;
  14. var
  15.   LeftBitMap, TopBitMap, RightBitMap, BottomBitMap: TBitMap;
  16.   DC: HDC;
  17.   Cnvs: TControlCanvas;
  18.   OX, OY: Integer;
  19. begin
  20.   DC := GetWindowDC(Handle);
  21.   Cnvs := TControlCanvas.Create;
  22.   Cnvs.Handle := DC;
  23.   LeftBitMap := TBitMap.Create;
  24.   TopBitMap := TBitMap.Create;
  25.   RightBitMap := TBitMap.Create;
  26.   BottomBitMap := TBitMap.Create;
  27.   //
  28.   OX := Width - RectWidth(SkinRect);
  29.   OY := Height - RectHeight(SkinRect);
  30.   NewLTPoint := LTPt;
  31.   NewRTPoint := Point(RTPt.X + OX, RTPt.Y);
  32.   NewLBPoint := Point(LBPt.X, LBPt.Y + OY);
  33.   NewRBPoint := Point(RBPt.X + OX, RBPt.Y + OY);
  34.   NewClRect := Rect(ClRect.Left, ClRect.Top,
  35.     ClRect.Right + OX, ClRect.Bottom + OY);
  36.   //
  37.   CreateSkinBorderImages(LTPt, RTPt, LBPt, RBPt, ClRect,
  38.       NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewCLRect,
  39.       LeftBitMap, TopBitMap, RightBitMap, BottomBitMap,
  40.       FSkinPicture, SkinRect, Width, Height, False, False, False, False);
  41.   if NewClRect.Bottom > NewClRect.Top
  42.   then
  43.     ExcludeClipRect(Cnvs.Handle,
  44.       NewClRect.Left, NewClRect.Top, NewClRect.Right, NewClRect.Bottom);
  45.   Cnvs.Draw(0, 0, TopBitMap);
  46.   Cnvs.Draw(0, TopBitMap.Height, LeftBitMap);
  47.   Cnvs.Draw(Width - RightBitMap.Width, TopBitMap.Height, RightBitMap);
  48.   Cnvs.Draw(0, Height - BottomBitMap.Height, BottomBitMap);
  49.   //
  50.   TopBitMap.Free;
  51.   LeftBitMap.Free;
  52.   RightBitMap.Free;
  53.   BottomBitMap.Free;
  54.   Cnvs.Handle := 0;
  55.   ReleaseDC(Handle, DC);
  56.   Cnvs.Free;
  57. end;
  58. procedure TbsSkinControlBar.Paint;
  59. var
  60.   X, Y, XCnt, YCnt, w, h,
  61.   rw, rh, XO, YO: Integer;
  62.   Buffer: TBitMap;
  63.   i: Integer;
  64.   R: TRect;
  65.   B: TBitMap;
  66. begin
  67.   GetSkinData;
  68.   if FIndex = -1
  69.   then
  70.     begin
  71.       inherited;
  72.       Exit
  73.     end;
  74.   if (ClientWidth > 0) and (ClientHeight > 0)
  75.   then
  76.     begin
  77.       Buffer := TBitMap.Create;
  78.       Buffer.Width := ClientWidth;
  79.       Buffer.Height := ClientHeight;
  80.       if BGPictureIndex = -1
  81.       then
  82.         begin
  83.           w := RectWidth(ClRect);
  84.           h := RectHeight(ClRect);
  85.           rw := Buffer.Width;
  86.           rh := Buffer.Height;
  87.           with Buffer.Canvas do
  88.           begin
  89.             XCnt := rw div w;
  90.             YCnt := rh div h;
  91.             for X := 0 to XCnt do
  92.             for Y := 0 to YCnt do
  93.             begin
  94.               if X * w + w > rw then XO := X * W + W - rw else XO := 0;
  95.               if Y * h + h > rh then YO := Y * h + h - rh else YO := 0;
  96.                 CopyRect(Rect(X * w, Y * h,X * w + w - XO, Y * h + h - YO),
  97.                    FSkinPicture.Canvas,
  98.                    Rect(SkinRect.Left + ClRect.Left,
  99.                         SkinRect.Top + ClRect.Top,
  100.                         SkinRect.Left + ClRect.Right - XO,
  101.                          SkinRect.Top + ClRect.Bottom - YO));
  102.             end;
  103.           end;
  104.         end
  105.       else
  106.         begin
  107.           B := TBitMap(FSD.FActivePictures.Items[BGPictureIndex]);
  108.           XCnt := Width div B.Width;
  109.           YCnt := Height div B.Height;
  110.           for X := 0 to XCnt do
  111.           for Y := 0 to YCnt do
  112.             Buffer.Canvas.Draw(X * B.Width, Y * B.Height, B);
  113.         end;
  114.         // draw controls frame
  115.           for i := 0 to ControlCount - 1 do
  116.             if Controls[i].Visible
  117.             then
  118.                begin
  119.                  R := Controls[i].BoundsRect;
  120.                  Dec(R.Left, 11);
  121.                  Dec(R.Top, 2);
  122.                  Inc(R.Right, 2);
  123.                  Inc(R.Bottom, 2);
  124.                  PaintControlFrame(Buffer.Canvas, Controls[i], R);
  125.                end;
  126.       Canvas.Draw(0, 0, Buffer);
  127.       Buffer.Free;
  128.     end;
  129. end;
  130. procedure TbsSkinControlBar.PaintControlFrame;
  131. var
  132.   LeftB, TopB, RightB, BottomB: TBitMap;
  133.   W, H, IW, IH: Integer;
  134. begin
  135.   GetSkinData;
  136.   if FIndex <> -1
  137.   then
  138.     begin
  139.       LeftB := TBitMap.Create;
  140.       TopB := TBitMap.Create;
  141.       RightB := TBitMap.Create;
  142.       BottomB := TBitMap.Create;
  143.       W := RectWidth(ARect);
  144.       H := RectHeight(ARect);
  145.       IW := RectWidth(ItemRect);
  146.       IH := RectHeight(ItemRect);
  147.       //
  148.       CreateSkinBorderImages(
  149.         Point(12, 3), Point(IW - 3, 3),
  150.         Point(12, IH - 3), Point(IW - 3, IH - 3),
  151.         Rect(11, 2, IW - 2, IH - 2),
  152.         Point(12, 3), Point(W - 3, 3),
  153.         Point(12, H - 3), Point(W - 3, H - 3),
  154.         Rect(11, 2, W - 2, H - 2),
  155.         LeftB, TopB, RightB, BottomB,
  156.         FSkinPicture, ItemRect,  W, H, False, False, False, False);
  157.       //
  158.       Canvas.Draw(ARect.Left, ARect.Top, TopB);
  159.       Canvas.Draw(ARect.Left, ARect.Top + TopB.Height, LeftB);
  160.       Canvas.Draw(ARect.Right - RightB.Width, ARect.Top + TopB.Height, RightB);
  161.       Canvas.Draw(ARect.Left, ARect.Bottom - BottomB.Height, BottomB);
  162.       //
  163.       LeftB.Free;
  164.       TopB.Free;
  165.       RightB.Free;
  166.       BottomB.Free;
  167.     end
  168.   else
  169.     inherited;
  170. end;
  171. procedure TbsSkinControlBar.GetSkinData;
  172. begin
  173.   if (FSD = nil) or FSD.Empty
  174.   then
  175.     FIndex := -1
  176.   else
  177.     FIndex := FSD.GetControlIndex(FSkinDataName);
  178.   BGPictureIndex := -1;  
  179.   FSkinPicture := nil;
  180.   if FIndex <> -1
  181.   then
  182.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinControlBar
  183.     then
  184.       with TbsDataSkinControlBar(FSD.CtrlList.Items[FIndex]) do
  185.       begin
  186.         LTPt := LTPoint;
  187.         RTPt := RTPoint;
  188.         LBPt := LBPoint;
  189.         RBPt := RBPoint;
  190.         Self.SkinRect := SkinRect;
  191.         Self.ClRect := ClRect;
  192.         if (PictureIndex <> -1) and (PictureIndex < FSD.FActivePictures.Count)
  193.         then
  194.           FSkinPicture := TBitMap(FSD.FActivePictures.Items[PictureIndex])
  195.         else
  196.           FSkinPicture := nil;
  197.         Self.ItemRect := ItemRect;
  198.         Self.BGPictureIndex := BGPictureIndex; 
  199.       end;
  200. end;
  201. procedure TbsSkinControlBar.ChangeSkinData;
  202. var
  203.   R: TRect;
  204. begin
  205.   GetSkinData;
  206.   if FSkinBevel then ReCreateWnd;
  207.   R := ClientRect;
  208.   AdjustClientRect(R);
  209.   RePaint;
  210. end;
  211. procedure TbsSkinControlBar.SetSkinData;
  212. begin
  213.   FSD := Value;
  214.   ChangeSkinData;
  215. end;
  216. procedure TbsSkinControlBar.WMNCCALCSIZE;
  217. begin
  218.   GetSkinData;
  219.   if FIndex <> -1
  220.   then
  221.     begin
  222.       if FSkinBevel then 
  223.       with TWMNCCALCSIZE(Message).CalcSize_Params^.rgrc[0] do
  224.       begin
  225.         Inc(Left, ClRect.Left);
  226.         Inc(Top,  ClRect.Top);
  227.         Dec(Right, RectWidth(SkinRect) - ClRect.Right);
  228.         Dec(Bottom, RectHeight(SkinRect) - ClRect.Bottom);
  229.         if Right < Left then Right := Left;
  230.         if Bottom < Top
  231.         then Bottom := Top;
  232.       end;  
  233.     end
  234.   else
  235.     inherited;
  236. end;
  237. procedure TbsSkinControlBar.WMNCPAINT(var Message: TMessage);
  238. begin
  239.   GetSkinData;
  240.   if FIndex <> -1
  241.   then
  242.     begin
  243.       if FSkinBevel then PaintNCSkin;
  244.     end
  245.   else
  246.     inherited;
  247. end;
  248. procedure TbsSkinControlBar.CreateParams;
  249. begin
  250.   inherited CreateParams(Params);
  251.   with Params do
  252.   begin
  253.     Style := Style and not WS_BORDER;
  254.     ExStyle := ExStyle and not WS_EX_CLIENTEDGE;
  255.   end;
  256. end;
  257. procedure TbsSkinControlBar.WMEraseBkgnd;
  258. begin
  259.   if FIndex = -1 then inherited else Message.Result := 1;
  260. end;
  261. { TbsGroupButton }
  262. type
  263.   TbsGroupButton = class(TbsSkinCheckRadioBox)
  264.   private
  265.     FInClick: Boolean;
  266.     procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
  267.   protected
  268.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  269.     procedure KeyPress(var Key: Char); override;
  270.   public
  271.     constructor InternalCreate(RadioGroup: TbsSkinCustomRadioGroup);
  272.     destructor Destroy; override;
  273.   end;
  274.   TbsCheckGroupButton = class(TbsSkinCheckRadioBox)
  275.   private
  276.     FInClick: Boolean;
  277.     procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
  278.   protected
  279.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  280.     procedure KeyPress(var Key: Char); override;
  281.   public
  282.     constructor InternalCreate(CheckGroup: TbsSkinCustomCheckGroup);
  283.     destructor Destroy; override;
  284.   end;
  285. constructor TbsGroupButton.InternalCreate(RadioGroup: TbsSkinCustomRadioGroup);
  286. begin
  287.   inherited Create(RadioGroup);
  288.   RadioGroup.FButtons.Add(Self);
  289.   Visible := False;
  290.   Enabled := RadioGroup.Enabled;
  291.   ParentShowHint := False;
  292.   OnClick := RadioGroup.ButtonClick;
  293.   Parent := RadioGroup;
  294.   Radio := True;
  295.   CanFocused := True;
  296.   SkinDataName := 'radiobox';
  297.   GroupIndex := 1;
  298.   Flat := True;
  299. end;
  300. destructor TbsGroupButton .Destroy;
  301. begin
  302.   TbsSkinCustomRadioGroup(Owner).FButtons.Remove(Self);
  303.   inherited Destroy;
  304. end;
  305. procedure TbsGroupButton .CNCommand(var Message: TWMCommand);
  306. begin
  307.   if not FInClick then
  308.   begin
  309.     FInClick := True;
  310.     try
  311.       if ((Message.NotifyCode = BN_CLICKED) or
  312.         (Message.NotifyCode = BN_DOUBLECLICKED)) and
  313.         TbsSkinCustomRadioGroup(Parent).CanModify then
  314.         inherited;
  315.     except
  316.       Application.HandleException(Self);
  317.     end;
  318.     FInClick := False;
  319.   end;
  320. end;
  321. procedure TbsGroupButton.KeyPress(var Key: Char);
  322. begin
  323.   inherited KeyPress(Key);
  324.   TbsSkinCustomRadioGroup(Parent).KeyPress(Key);
  325.   if (Key = #8) or (Key = ' ') then
  326.   begin
  327.     if not TbsSkinCustomRadioGroup(Parent).CanModify then Key := #0;
  328.   end;
  329. end;
  330. procedure TbsGroupButton.KeyDown(var Key: Word; Shift: TShiftState);
  331. begin
  332.   inherited KeyDown(Key, Shift);
  333.   TbsSkinCustomRadioGroup(Parent).KeyDown(Key, Shift);
  334. end;
  335. constructor TbsCheckGroupButton.InternalCreate(CheckGroup: TbsSkinCustomCheckGroup);
  336. begin
  337.   inherited Create(CheckGroup);
  338.   CheckGroup.FButtons.Add(Self);
  339.   Visible := False;
  340.   Enabled := CheckGroup.Enabled;
  341.   ParentShowHint := False;
  342.   OnClick := CheckGroup.ButtonClick;
  343.   Parent := CheckGroup;
  344.   Radio := False;
  345.   CanFocused := True;
  346.   SkinDataName := 'checkbox';
  347.   Flat := True;
  348. end;
  349. destructor TbsCheckGroupButton .Destroy;
  350. begin
  351.   TbsSkinCustomCheckGroup(Owner).FButtons.Remove(Self);
  352.   inherited Destroy;
  353. end;
  354. function TbsSkinCustomCheckGroup.CanModify: Boolean;
  355. begin
  356.   Result := True;
  357. end;
  358. procedure TbsSkinCustomCheckGroup.GetChildren(Proc: TGetChildProc; Root: TComponent);
  359. begin
  360. end;
  361. procedure TbsCheckGroupButton .CNCommand(var Message: TWMCommand);
  362. begin
  363.   if not FInClick then
  364.   begin
  365.     FInClick := True;
  366.     try
  367.       if ((Message.NotifyCode = BN_CLICKED) or
  368.         (Message.NotifyCode = BN_DOUBLECLICKED)) and
  369.         TbsSkinCustomCheckGroup(Parent).CanModify then
  370.         inherited;
  371.     except
  372.       Application.HandleException(Self);
  373.     end;
  374.     FInClick := False;
  375.   end;
  376. end;
  377. procedure TbsCheckGroupButton .KeyPress(var Key: Char);
  378. begin
  379.   inherited KeyPress(Key);
  380.   TbsSkinCustomCheckGroup(Parent).KeyPress(Key);
  381.   if (Key = #8) or (Key = ' ') then
  382.   begin
  383.     if not TbsSkinCustomCheckGroup(Parent).CanModify then Key := #0;
  384.   end;
  385. end;
  386. procedure TbsCheckGroupButton .KeyDown(var Key: Word; Shift: TShiftState);
  387. begin
  388.   inherited KeyDown(Key, Shift);
  389.   TbsSkinCustomCheckGroup(Parent).KeyDown(Key, Shift);
  390. end;
  391. { TbsSkinCustomRadioGroup }
  392. constructor TbsSkinCustomRadioGroup.Create(AOwner: TComponent);
  393. begin
  394.   inherited Create(AOwner);
  395.   ControlStyle := [csSetCaption, csDoubleClicks];
  396.   FButtons := TList.Create;
  397.   FItems := TStringList.Create;
  398.   TStringList(FItems).OnChange := ItemsChange;
  399.   FItemIndex := -1;
  400.   FColumns := 1;
  401.   FButtonSkinDataName := 'radiobox';
  402.   FButtonDefaultFont := TFont.Create;
  403.   with FButtonDefaultFont do
  404.   begin
  405.     Name := 'Arial';
  406.     Style := [];
  407.     Height := 14;
  408.   end;
  409. end;
  410. procedure TbsSkinCustomRadioGroup.SetImages(Value: TCustomImageList);
  411. var
  412.   I: Integer;
  413. begin
  414.   FImages := Value;
  415.   if FButtons.Count > 0
  416.   then
  417.     for I := 0 to FButtons.Count - 1 do
  418.       with TbsGroupButton (FButtons[I]) do
  419.         Images := Self.Images; 
  420. end;
  421. procedure TbsSkinCustomRadioGroup.Notification(AComponent: TComponent;
  422.   Operation: TOperation);
  423. begin
  424.   inherited Notification(AComponent, Operation);
  425.   if Operation = opRemove then
  426.   begin
  427.     if AComponent = FImages then Images := nil;
  428.   end;
  429. end;
  430. procedure TbsSkinCustomRadioGroup.SetButtonDefaultFont;
  431. var
  432.   I: Integer;
  433. begin
  434.   FButtonDefaultFont.Assign(Value);
  435.   if FButtons.Count > 0
  436.   then
  437.     for I := 0 to FButtons.Count - 1 do
  438.       with TbsGroupButton (FButtons[I]) do
  439.       begin
  440.         DefaultFont.Assign(FButtonDefaultFont);
  441.       end;
  442. end;
  443. destructor TbsSkinCustomRadioGroup.Destroy;
  444. begin
  445.   FButtonDefaultFont.Free;
  446.   SetButtonCount(0);
  447.   TStringList(FItems).OnChange := nil;
  448.   FItems.Free;
  449.   FButtons.Free;
  450.   inherited Destroy;
  451. end;
  452. procedure TbsSkinCustomRadioGroup.ChangeSkinData;
  453. begin
  454.   inherited;
  455.   Self.ArrangeButtons;
  456. end;
  457. procedure TbsSkinCustomRadioGroup.SetSkinData;
  458. var
  459.   I: Integer;
  460. begin
  461.   inherited;
  462.   if FButtons.Count > 0
  463.   then
  464.    for I := 0 to FButtons.Count - 1 do
  465.      with TbsGroupButton (FButtons[I]) do
  466.        SkinData := Value;
  467. end;
  468. procedure TbsSkinCustomRadioGroup.SetButtonSkinDataName;
  469. var
  470.   I: Integer;
  471. begin
  472.   FButtonSkinDataName := Value;
  473.   if FButtons.Count > 0
  474.   then
  475.    for I := 0 to FButtons.Count - 1 do
  476.      with TbsGroupButton (FButtons[I]) do
  477.        SkinDataName := Value;
  478. end;
  479. procedure TbsSkinCustomRadioGroup.FlipChildren(AllLevels: Boolean);
  480. begin
  481.   { The radio buttons are flipped using BiDiMode }
  482. end;
  483. procedure TbsSkinCustomRadioGroup.ArrangeButtons;
  484. var
  485.   ButtonsPerCol, ButtonWidth, ButtonHeight, TopMargin, I: Integer;
  486.   DeferHandle: THandle;
  487.   ALeft: Integer;
  488.   ButtonsRect: TRect;
  489. begin
  490.   if (FButtons.Count <> 0) and not FReading then
  491.   begin
  492.     ButtonsRect := Rect(0, 0, Width, Height);
  493.     AdjustClientRect(ButtonsRect);
  494.     ButtonsPerCol := (FButtons.Count + FColumns - 1) div FColumns;
  495.     ButtonWidth := RectWidth(ButtonsRect) div FColumns - 2;
  496.     I := RectHeight(ButtonsRect);
  497.     ButtonHeight := I div ButtonsPerCol;
  498.     TopMargin := ButtonsRect.Top;
  499.     DeferHandle := BeginDeferWindowPos(FButtons.Count);
  500.     try
  501.       for I := 0 to FButtons.Count - 1 do
  502.         with TbsGroupButton(FButtons[I]) do
  503.         begin
  504.           BiDiMode := Self.BiDiMode;
  505.           ALeft := (I div ButtonsPerCol) * ButtonWidth + ButtonsRect.Left + 1;
  506.           if UseRightToLeftAlignment then
  507.             ALeft := RectWidth(ButtonsRect) - ALeft - ButtonWidth;
  508.           DeferHandle := DeferWindowPos(DeferHandle, Handle, 0,
  509.             ALeft,
  510.             (I mod ButtonsPerCol) * ButtonHeight + TopMargin,
  511.             ButtonWidth, ButtonHeight,
  512.             SWP_NOZORDER or SWP_NOACTIVATE);
  513.           Visible := True;
  514.         end;
  515.     finally
  516.       EndDeferWindowPos(DeferHandle);
  517.     end;
  518.   end;
  519. end;
  520. procedure TbsSkinCustomRadioGroup.ButtonClick(Sender: TObject);
  521. begin
  522.   if not FUpdating then
  523.   begin
  524.     FItemIndex := FButtons.IndexOf(Sender);
  525.     Changed;
  526.     Click;
  527.   end;
  528. end;
  529. procedure TbsSkinCustomRadioGroup.ItemsChange(Sender: TObject);
  530. begin
  531.   if not FReading then
  532.   begin
  533.     if FItemIndex >= FItems.Count then FItemIndex := FItems.Count - 1;
  534.     UpdateButtons;
  535.   end;
  536. end;
  537. procedure TbsSkinCustomRadioGroup.Loaded;
  538. begin
  539.   inherited Loaded;
  540.   ArrangeButtons;
  541. end;
  542. procedure TbsSkinCustomRadioGroup.ReadState(Reader: TReader);
  543. begin
  544.   FReading := True;
  545.   inherited ReadState(Reader);
  546.   FReading := False;
  547.   UpdateButtons;
  548. end;
  549. procedure TbsSkinCustomRadioGroup.SetButtonCount(Value: Integer);
  550. var
  551.   i: Integer;
  552. begin
  553.   while FButtons.Count < Value do TbsGroupButton .InternalCreate(Self);
  554.   while FButtons.Count > Value do TbsGroupButton (FButtons.Last).Free;
  555.   if FButtons.Count > 0
  556.   then
  557.    for I := 0 to FButtons.Count - 1 do
  558.      with TbsGroupButton (FButtons[I]) do
  559.      begin
  560.        ImageIndex := I;
  561.        SkinData := Self.SkinData;
  562.        SkinDataName := ButtonSkinDataName;
  563.        DefaultFont.Assign(FButtonDefaultFont);
  564.        UseSkinFont := Self.UseSkinFont;
  565.      end;
  566. end;
  567. procedure TbsSkinCustomRadioGroup.SetColumns(Value: Integer);
  568. begin
  569.   if Value < 1 then Value := 1;
  570.   if Value > 16 then Value := 16;
  571.   if FColumns <> Value then
  572.   begin
  573.     FColumns := Value;
  574.     ArrangeButtons;
  575.     Invalidate;
  576.   end;
  577. end;
  578. procedure TbsSkinCustomRadioGroup.SetItemIndex(Value: Integer);
  579. begin
  580.   if FReading then FItemIndex := Value else
  581.   begin
  582.     if Value < -1 then Value := -1;
  583.     if Value >= FButtons.Count then Value := FButtons.Count - 1;
  584.     if FItemIndex <> Value then
  585.     begin
  586.       if FItemIndex >= 0 then
  587.         TbsGroupButton (FButtons[FItemIndex]).Checked := False;
  588.       FItemIndex := Value;
  589.       if FItemIndex >= 0 then
  590.         TbsGroupButton (FButtons[FItemIndex]).Checked := True;
  591.     end;
  592.   end;
  593. end;
  594. procedure TbsSkinCustomRadioGroup.SetItems(Value: TStrings);
  595. begin
  596.   FItems.Assign(Value);
  597. end;
  598. procedure TbsSkinCustomRadioGroup.UpdateButtons;
  599. var
  600.   I: Integer;
  601. begin
  602.   SetButtonCount(FItems.Count);
  603.   for I := 0 to FButtons.Count - 1 do
  604.     TbsGroupButton (FButtons[I]).Caption := FItems[I];
  605.   if FItemIndex >= 0 then
  606.   begin
  607.     FUpdating := True;
  608.     TbsGroupButton (FButtons[FItemIndex]).Checked := True;
  609.     FUpdating := False;
  610.   end;
  611.   ArrangeButtons;
  612.   Invalidate;
  613. end;
  614. procedure TbsSkinCustomRadioGroup.CMEnabledChanged(var Message: TMessage);
  615. var
  616.   I: Integer;
  617. begin
  618.   inherited;
  619.   for I := 0 to FButtons.Count - 1 do
  620.     TbsGroupButton(FButtons[I]).Enabled := Enabled;
  621. end;
  622. procedure TbsSkinCustomRadioGroup.CMFontChanged(var Message: TMessage);
  623. begin
  624.   inherited;
  625.   ArrangeButtons;
  626. end;
  627. procedure TbsSkinCustomRadioGroup.WMSize(var Message: TWMSize);
  628. begin
  629.   inherited;
  630.   ArrangeButtons;
  631. end;
  632. function TbsSkinCustomRadioGroup.CanModify: Boolean;
  633. begin
  634.   Result := True;
  635. end;
  636. procedure TbsSkinCustomRadioGroup.GetChildren(Proc: TGetChildProc; Root: TComponent);
  637. begin
  638. end;
  639. { TbsSkinCustomCheckGroup }
  640. constructor TbsSkinCustomCheckGroup.Create(AOwner: TComponent);
  641. begin
  642.   inherited Create(AOwner);
  643.   ControlStyle := [csSetCaption, csDoubleClicks];
  644.   FButtons := TList.Create;
  645.   FItems := TStringList.Create;
  646.   TStringList(FItems).OnChange := ItemsChange;
  647.   FColumns := 1;
  648.   FItemIndex := -1;
  649.   FButtonSkinDataName := 'checkbox';
  650.   FButtonDefaultFont := TFont.Create;
  651.   with FButtonDefaultFont do
  652.   begin
  653.     Name := 'Arial';
  654.     Style := [];
  655.     Height := 14;
  656.   end;
  657. end;
  658. procedure TbsSkinCustomCheckGroup.SetButtonDefaultFont;
  659. var
  660.   I: Integer;
  661. begin
  662.   FButtonDefaultFont.Assign(Value);
  663.   if FButtons.Count > 0
  664.   then
  665.     for I := 0 to FButtons.Count - 1 do
  666.       with TbsCheckGroupButton (FButtons[I]) do
  667.         DefaultFont.Assign(FButtonDefaultFont);
  668. end;
  669. destructor TbsSkinCustomCheckGroup.Destroy;
  670. begin
  671.   FButtonDefaultFont.Free;
  672.   SetButtonCount(0);
  673.   TStringList(FItems).OnChange := nil;
  674.   FItems.Free;
  675.   FButtons.Free;
  676.   inherited Destroy;
  677. end;
  678. procedure TbsSkinCustomCheckGroup.SetImages(Value: TCustomImageList);
  679. var
  680.   I: Integer;
  681. begin
  682.   FImages := Value;
  683.   if FButtons.Count > 0
  684.   then
  685.     for I := 0 to FButtons.Count - 1 do
  686.       with TbsCheckGroupButton (FButtons[I]) do
  687.         Images := Self.Images;
  688. end;
  689. procedure TbsSkinCustomCheckGroup.Notification(AComponent: TComponent;
  690.   Operation: TOperation);
  691. begin
  692.   inherited Notification(AComponent, Operation);
  693.   if Operation = opRemove then
  694.   begin
  695.     if AComponent = FImages then Images := nil;
  696.   end;
  697. end;
  698. function TbsSkinCustomCheckGroup.GetCheckedStatus(Index: Integer): Boolean;
  699. begin
  700.   if (Index >= 0) and (Index < FButtons.Count)
  701.   then
  702.     Result := TbsCheckGroupButton(FButtons[Index]).Checked
  703.   else
  704.     Result := False;
  705. end;
  706. procedure TbsSkinCustomCheckGroup.SetCheckedStatus(Index: Integer; Value: Boolean);
  707. begin
  708.   if (Index >= 0) and (Index < FButtons.Count)
  709.   then
  710.     TbsCheckGroupButton(FButtons[Index]).Checked := Value;
  711. end;
  712. procedure TbsSkinCustomCheckGroup.UpdateButtons;
  713. var
  714.   I: Integer;
  715. begin
  716.   SetButtonCount(FItems.Count);
  717.   for I := 0 to FButtons.Count - 1 do
  718.     TbsGroupButton (FButtons[I]).Caption := FItems[I];
  719.   ArrangeButtons;
  720.   Invalidate;
  721. end;
  722. procedure TbsSkinCustomCheckGroup.ChangeSkinData;
  723. begin
  724.   inherited;
  725.   Self.ArrangeButtons;
  726. end;
  727. procedure TbsSkinCustomCheckGroup.SetSkinData;
  728. var
  729.   I: Integer;
  730. begin
  731.   inherited;
  732.   if FButtons.Count > 0
  733.   then
  734.    for I := 0 to FButtons.Count - 1 do
  735.      with TbsCheckGroupButton (FButtons[I]) do
  736.        SkinData := Value;
  737. end;
  738. procedure TbsSkinCustomCheckGroup.SetButtonSkinDataName;
  739. var
  740.   I: Integer;
  741. begin
  742.   FButtonSkinDataName := Value;
  743.   if FButtons.Count > 0
  744.   then
  745.    for I := 0 to FButtons.Count - 1 do
  746.      with TbsCheckGroupButton (FButtons[I]) do
  747.        SkinDataName := Value;
  748. end;
  749. procedure TbsSkinCustomCheckGroup.FlipChildren(AllLevels: Boolean);
  750. begin
  751.   { The radio buttons are flipped using BiDiMode }
  752. end;
  753. procedure TbsSkinCustomCheckGroup.ArrangeButtons;
  754. var
  755.   ButtonsPerCol, ButtonWidth, ButtonHeight, TopMargin, I: Integer;
  756.   DeferHandle: THandle;
  757.   ALeft: Integer;
  758.   ButtonsRect: TRect;
  759. begin
  760.   if (FButtons.Count <> 0) and not FReading then
  761.   begin
  762.     ButtonsRect := Rect(0, 0, Width, Height);
  763.     AdjustClientRect(ButtonsRect);
  764.     ButtonsPerCol := (FButtons.Count + FColumns - 1) div FColumns;
  765.     ButtonWidth := RectWidth(ButtonsRect) div FColumns - 2;
  766.     I := RectHeight(ButtonsRect);
  767.     ButtonHeight := I div ButtonsPerCol;
  768.     TopMargin := ButtonsRect.Top;
  769.     DeferHandle := BeginDeferWindowPos(FButtons.Count);
  770.     try
  771.       for I := 0 to FButtons.Count - 1 do
  772.         with TbsCheckGroupButton(FButtons[I]) do
  773.         begin
  774.           BiDiMode := Self.BiDiMode;
  775.           ALeft := (I div ButtonsPerCol) * ButtonWidth + ButtonsRect.Left + 1;
  776.           if UseRightToLeftAlignment then
  777.             ALeft := RectWidth(ButtonsRect) - ALeft - ButtonWidth;
  778.           DeferHandle := DeferWindowPos(DeferHandle, Handle, 0,
  779.             ALeft,
  780.             (I mod ButtonsPerCol) * ButtonHeight + TopMargin,
  781.             ButtonWidth, ButtonHeight,
  782.             SWP_NOZORDER or SWP_NOACTIVATE);
  783.           Visible := True;
  784.         end;
  785.     finally
  786.       EndDeferWindowPos(DeferHandle);
  787.     end;
  788.   end;
  789. end;
  790. procedure TbsSkinCustomCheckGroup.ButtonClick(Sender: TObject);
  791. begin
  792.   if not FUpdating then
  793.   begin
  794.     FItemIndex := FButtons.IndexOf(Sender);
  795.     Changed;
  796.     Click;
  797.   end;
  798. end;
  799. procedure TbsSkinCustomCheckGroup.ItemsChange(Sender: TObject);
  800. begin
  801.   if not FReading then
  802.   begin
  803.     UpdateButtons;
  804.   end;
  805. end;
  806. procedure TbsSkinCustomCheckGroup.Loaded;
  807. begin
  808.   inherited Loaded;
  809.   ArrangeButtons;
  810. end;
  811. procedure TbsSkinCustomCheckGroup.ReadState(Reader: TReader);
  812. begin
  813.   FReading := True;
  814.   inherited ReadState(Reader);
  815.   FReading := False;
  816.   UpdateButtons;
  817. end;
  818. procedure TbsSkinCustomCheckGroup.SetButtonCount(Value: Integer);
  819. var
  820.   i: Integer;
  821. begin
  822.   while FButtons.Count < Value do TbsCheckGroupButton .InternalCreate(Self);
  823.   while FButtons.Count > Value do TbsCheckGroupButton (FButtons.Last).Free;
  824.   if FButtons.Count > 0
  825.   then
  826.    for I := 0 to FButtons.Count - 1 do
  827.      with TbsCheckGroupButton (FButtons[I]) do
  828.      begin
  829.        ImageIndex := I;
  830.        SkinData := Self.SkinData;
  831.        SkinDataName := ButtonSkinDataName;
  832.        DefaultFont.Assign(FButtonDefaultFont);
  833.        UseSkinFont := Self.UseSkinFont;
  834.      end;
  835. end;
  836. procedure TbsSkinCustomCheckGroup.SetColumns(Value: Integer);
  837. begin
  838.   if Value < 1 then Value := 1;
  839.   if Value > 16 then Value := 16;
  840.   if FColumns <> Value then
  841.   begin
  842.     FColumns := Value;
  843.     ArrangeButtons;
  844.     Invalidate;
  845.   end;
  846. end;
  847. procedure TbsSkinCustomCheckGroup.SetItems(Value: TStrings);
  848. begin
  849.   FItems.Assign(Value);
  850. end;
  851. procedure TbsSkinCustomCheckGroup.CMEnabledChanged(var Message: TMessage);
  852. var
  853.   I: Integer;
  854. begin
  855.   inherited;
  856.   for I := 0 to FButtons.Count - 1 do
  857.     TbsCheckGroupButton(FButtons[I]).Enabled := Enabled;
  858. end;
  859. procedure TbsSkinCustomCheckGroup.CMFontChanged(var Message: TMessage);
  860. begin
  861.   inherited;
  862.   ArrangeButtons;
  863. end;
  864. procedure TbsSkinCustomCheckGroup.WMSize(var Message: TWMSize);
  865. begin
  866.   inherited;
  867.   ArrangeButtons;
  868. end;
  869. constructor TbsSkinCustomTreeView.Create(AOwner: TComponent);
  870. begin
  871.   inherited;
  872.   FVScrollBar := nil;
  873.   FHScrollBar := nil;
  874.   FSD := nil;
  875.   FIndex := -1;
  876.   FDefaultFont := TFont.Create;
  877.   with FDefaultFont do
  878.   begin
  879.     Name := 'Arial';
  880.     Style := [];
  881.     Height := 14;
  882.   end;
  883.   FDefaultColor := clWindow;
  884.   FSkinDataName := 'treeview';
  885.   FInCheckScrollBars := False;
  886.   FUseSkinFont := True;
  887. end;
  888. destructor TbsSkinCustomTreeView.Destroy;
  889. begin
  890.   FDefaultFont.Free;
  891.   inherited;
  892. end;
  893. procedure TbsSkinCustomTreeView.CMVisibleChanged;
  894. begin
  895.   inherited;
  896.   if FVScrollBar <> nil then FVScrollBar.Visible := Self.Visible;
  897.   if FHScrollBar <> nil then FHScrollBar.Visible := Self.Visible; 
  898. end;
  899. procedure TbsSkinCustomTreeView.Loaded;
  900. begin
  901.   inherited;
  902.   ChangeSkinData;
  903. end;
  904. procedure TbsSkinCustomTreeView.SetDefaultColor;
  905. begin
  906.   FDefaultColor := Value;
  907.   if FIndex = -1 then Color := Value;
  908. end;
  909. procedure TbsSkinCustomTreeView.SetDefaultFont;
  910. begin
  911.   FDefaultFont.Assign(Value);
  912.   if FIndex =  -1 then Font.Assign(Value);
  913. end;
  914. procedure TbsSkinCustomTreeView.ChangeSkinData;
  915. begin
  916.   if (csLoading in ComponentState) then Exit;
  917.   if (FSD = nil) or FSD.Empty
  918.   then
  919.     FIndex := -1
  920.   else
  921.     FIndex := FSD.GetControlIndex(FSkinDataName);
  922.   if FIndex <> -1
  923.   then
  924.     begin
  925.       if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is
  926.          TbsDataSkinTreeView
  927.       then
  928.         with TbsDataSkinTreeView(FSD.CtrlList.Items[FIndex]) do
  929.         begin
  930.           if FUseSkinFont
  931.           then
  932.             begin
  933.               Font.Name := FontName;
  934.               Font.Style := FontStyle;
  935.               Font.Height := FontHeight;
  936.             end
  937.           else
  938.             Font.Assign(FDefaultFont);
  939.             Font.Color := FontColor;
  940.             Color := BGColor;
  941.         end;
  942.     end
  943.   else
  944.     begin
  945.       Color := FDefaultColor;
  946.       Font.Assign(FDefaultFont);
  947.     end;
  948.    if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  949.    then
  950.      Font.Charset := SkinData.ResourceStrData.CharSet
  951.    else
  952.      Font.Charset := FDefaultFont.Charset;
  953.   if Images <> nil then Images.BkColor := Self.Color;
  954.   if StateImages <> nil then StateImages.BkColor := Self.Color;
  955.   UpDateScrollBars;
  956.   if FVScrollBar <> nil then FVScrollBar.Align := FVScrollBar.Align;
  957.   if FHScrollBar <> nil then FHScrollBar.Align := FHScrollBar.Align;
  958. end;
  959. procedure TbsSkinCustomTreeView.SetSkinData;
  960. begin
  961.   FSD := Value;
  962.   if (FSD <> nil) then
  963.   if not FSD.Empty and not (csDesigning in ComponentState)
  964.   then
  965.     ChangeSkinData;
  966. end;
  967. procedure TbsSkinCustomTreeView.Notification;
  968. begin
  969.   inherited Notification(AComponent, Operation);
  970.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  971.   if (Operation = opRemove) and (AComponent = FVScrollBar)
  972.   then FVScrollBar := nil;
  973.   if (Operation = opRemove) and (AComponent = FHScrollBar)
  974.   then FHScrollBar := nil;
  975. end;
  976. procedure TbsSkinCustomTreeView.Change;
  977. begin
  978.   inherited;
  979.   UpDateScrollBars;
  980. end;
  981. procedure TbsSkinCustomTreeView.WMNCCALCSIZE;
  982. begin
  983. end;
  984. procedure TbsSkinCustomTreeView.WMNCPAINT;
  985. begin
  986. end;
  987. procedure TbsSkinCustomTreeView.SetVScrollBar;
  988. begin
  989.   FVScrollBar := Value;
  990.   if FVScrollBar <> nil
  991.   then
  992.     with FVScrollBar do
  993.     begin
  994.       Enabled := True;
  995.       Visible := False;
  996.       OnChange := OnVScrollBarChange;
  997.     end;
  998.   UpDateScrollBars;
  999. end;
  1000. procedure TbsSkinCustomTreeView.SetHScrollBar;
  1001. begin
  1002.   FHScrollBar := Value;
  1003.   if FHScrollBar <> nil
  1004.   then
  1005.     with FHScrollBar do
  1006.     begin
  1007.       Enabled := True;
  1008.       Visible := False;
  1009.       OnChange := OnHScrollBarChange;
  1010.     end;
  1011.   UpDateScrollBars;
  1012. end;
  1013. procedure TbsSkinCustomTreeView.WndProc;
  1014. begin
  1015.   inherited;
  1016.   case Message.Msg of
  1017.     WM_SIZE, WM_PAINT:
  1018.       if not FInCheckScrollBars then UpDateScrollBars;
  1019.     WM_KEYDOWN, WM_LBUTTONUP:
  1020.        UpDateScrollBars;
  1021.   end;
  1022. end;
  1023. procedure TbsSkinCustomTreeView.UpDateScrollBars;
  1024. var
  1025.   Min, Max, Pos, Page: Integer;
  1026.   R: TRect;
  1027.   OldVisible, HVisibleChanged, VVisibleChanged: Boolean;
  1028. begin
  1029.   if (csLoading in ComponentState) or FInCheckScrollBars then Exit;
  1030.   VVisibleChanged := False;
  1031.   HVisibleChanged := False;
  1032.   if FVScrollBar <> nil
  1033.   then
  1034.     begin
  1035.       GetScrollRange(Handle, SB_VERT, Min, Max);
  1036.       Pos := GetScrollPos(Handle, SB_VERT);
  1037.       Page := TreeView_GetVisibleCount(Handle);
  1038.       FInCheckScrollBars := True;
  1039.       OldVisible := FVScrollBar.Visible;
  1040.       FVScrollBar.Visible := (Max > 0) and (Max >= Page) and
  1041.                    (Max < treeview_GetCount(Handle)) and Self.Visible;
  1042.       VVisibleChanged := FVScrollBar.Visible <> OldVisible;
  1043.       FInCheckScrollBars := False;
  1044.       if FVScrollBar.Visible
  1045.       then
  1046.          FVScrollBar.SetRange(Min, Max, Pos, Page);
  1047.     end;
  1048.   if FHScrollBar <> nil
  1049.   then
  1050.     begin
  1051.       GetScrollRange(Handle, SB_HORZ, Min, Max);
  1052.       Pos := GetScrollPos(Handle, SB_HORZ);
  1053.       FInCheckScrollBars := True;
  1054.       OldVisible := FHScrollBar.Visible;
  1055.       FHScrollBar.Visible := (Max > Width) and Self.Visible;
  1056.       HVisibleChanged := FHScrollBar.Visible <> OldVisible;
  1057.       FInCheckScrollBars := False;
  1058.       if FHScrollBar.Visible
  1059.       then
  1060.         FHScrollBar.SetRange(Min, Max, Pos, Width);
  1061.     end;
  1062.   if (FVScrollBar <> nil) and (FHScrollBar <> nil)
  1063.   then
  1064.     begin
  1065.       if not FVScrollBar.Visible and FHScrollBar.Both
  1066.       then
  1067.         FHScrollBar.Both := False
  1068.       else
  1069.       if FVScrollBar.Visible and not FHScrollBar.Both
  1070.       then
  1071.         FHScrollBar.Both := True;
  1072.     end;
  1073.   if (Self.Align <> alNone) and (HVisibleChanged or VVisibleChanged)
  1074.   then
  1075.     begin
  1076.       FInCheckScrollBars := True;
  1077.       R := Parent.ClientRect;
  1078.       TParentControl(Parent).AlignControls(nil, R);
  1079.       FInCheckScrollBars := False;
  1080.     end;
  1081. end;
  1082. procedure TbsSkinCustomTreeView.OnVScrollBarChange;
  1083. begin
  1084.   SendMessage(Handle, WM_VSCROLL,
  1085.    MakeWParam(SB_THUMBPOSITION, FVSCROLLBAR.Position), 0);
  1086. end;
  1087. procedure TbsSkinCustomTreeView.OnHScrollBarChange;
  1088. begin
  1089.  SendMessage(Handle, WM_HSCROLL,
  1090.    MakeWParam(SB_THUMBPOSITION, FHSCROLLBAR.Position), 0);
  1091. end;
  1092. procedure TbsSkinCustomTreeView.CreateParams;
  1093. begin
  1094.   inherited;
  1095.   with Params do
  1096.     Style := Style and not (WS_HSCROLL or WS_VSCROLL);
  1097. end;
  1098. constructor TbsSkinCustomListView.Create(AOwner: TComponent);
  1099. begin
  1100.   inherited;
  1101.   FHeaderSkinDataName := 'resizebutton';
  1102.   FHIndex := -1;
  1103.   FHeaderHandle := 0;
  1104.   FHeaderInstance := MakeObjectInstance(HeaderWndProc);
  1105.   FDefHeaderProc := nil;
  1106.   FInCheckScrollBars := False;
  1107.   FVScrollBar := nil;
  1108.   FHScrollBar := nil;
  1109.   FOldVScrollBarPos := 0;
  1110.   FOldHScrollBarPos := 0;
  1111.   FSD := nil;
  1112.   FIndex := -1;
  1113.   FDefaultFont := TFont.Create;
  1114.   with FDefaultFont do
  1115.   begin
  1116.     Name := 'Arial';
  1117.     Style := [];
  1118.     Height := 14;
  1119.   end;
  1120.   Font.Assign(FDefaultFont);
  1121.   FDefaultColor := clWindow;
  1122.   FSkinDataName := 'listview';
  1123.   FUseSkinFont := True;
  1124. end;
  1125. destructor TbsSkinCustomListView.Destroy;
  1126. begin
  1127.   FDefaultFont.Free;
  1128.   if FHeaderHandle <> 0 then
  1129.     SetWindowLong(FHeaderHandle, GWL_WNDPROC, LongInt(FDefHeaderProc));
  1130.   FreeObjectInstance(FHeaderInstance);
  1131.   FHeaderHandle := 0;
  1132.   inherited;
  1133. end;
  1134. procedure TbsSkinCustomListView.HGetSkinData;
  1135. begin
  1136.   if (FSD = nil) or FSD.Empty
  1137.   then
  1138.     FHIndex := -1
  1139.   else
  1140.     FHIndex := FSD.GetControlIndex(FHeaderSkinDataName);
  1141.   if FHIndex <> -1
  1142.   then
  1143.     if TbsDataSkinControl(FSD.CtrlList.Items[FHIndex]) is TbsDataSkinButtonControl
  1144.     then
  1145.       with TbsDataSkinButtonControl(FSD.CtrlList.Items[FHIndex]) do
  1146.       begin
  1147.         HLTPt := LTPoint;
  1148.         HRTPt := RTPoint;
  1149.         HLBPt := LBPoint;
  1150.         HRBPt := RBPoint;
  1151.         HSkinRect := SkinRect;
  1152.         HClRect := ClRect;
  1153.         if (PictureIndex <> -1) and (PictureIndex < FSD.FActivePictures.Count)
  1154.         then
  1155.           HPicture := TBitMap(FSD.FActivePictures.Items[PictureIndex])
  1156.         else
  1157.           HPicture := nil;
  1158.         //
  1159.         HFontColor := FontColor;
  1160.         HActiveFontColor := ActiveFontColor;
  1161.         HDownFontColor := DownFontColor;
  1162.         HActiveSkinRect := ActiveSkinRect;
  1163.         HDownSkinRect := DownSkinRect;
  1164.         if IsNullRect(HActiveSkinRect) then HActiveSkinRect := SkinRect;
  1165.         if IsNullRect(HDownSkinRect) then HDownSkinRect := HActiveSkinRect;
  1166.       end
  1167.     else
  1168.       HPicture := nil;
  1169. end;
  1170. procedure TbsSkinCustomListView.CreateWnd;
  1171. begin
  1172.   inherited;
  1173. end;
  1174. procedure TbsSkinCustomListView.DrawHeaderSection;
  1175. var
  1176.   SR, BR, DR: TRect;
  1177.   S: String;
  1178.   B, B1: TBitMap;
  1179.   W, H, TX, TY, GX, GY, XO, YO: Integer;
  1180. begin
  1181.   if (RectWidth(R) <= 0) or (RectHeight(R) <= 0) then Exit;
  1182.   S := Column.Caption;
  1183.   B := TBitMap.Create;
  1184.   W := RectWidth(R);
  1185.   H := RectHeight(R);
  1186.   B.Width := W;
  1187.   B.Height := H;
  1188.   BR := Rect(0, 0, B.Width, B.Height);
  1189.   HGetSkinData;
  1190.   if FHIndex = -1
  1191.   then
  1192.   with B.Canvas do
  1193.   begin
  1194.     //
  1195.     if Pressed
  1196.     then
  1197.       begin
  1198.         Frame3D(B.Canvas, BR, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  1199.         Brush.Color := BS_XP_BTNDOWNCOLOR;
  1200.       end
  1201.     else
  1202.     if Active
  1203.     then
  1204.       begin
  1205.         Frame3D(B.Canvas, BR, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  1206.         Brush.Color := BS_XP_BTNACTIVECOLOR;
  1207.       end
  1208.     else
  1209.       begin
  1210.         Frame3D(B.Canvas, BR, clBtnShadow, clBtnShadow, 1);
  1211.         Brush.Color := clBtnFace;
  1212.       end;
  1213.     //
  1214.     FillRect(BR);
  1215.     Brush.Style := bsClear;
  1216.     Font := Self.Font;
  1217.     Font.Color := clBtnText;
  1218.   end
  1219.   else
  1220.   with B.Canvas do
  1221.   begin
  1222.     Font := Self.Font;
  1223.     if Pressed
  1224.     then
  1225.        begin
  1226.          SR := HDownSkinRect;
  1227.          Font.Color := HDownFontColor;
  1228.        end
  1229.      else
  1230.        begin
  1231.          SR := HSkinRect;
  1232.          Font.Color := HFontColor;
  1233.        end;
  1234.       //
  1235.       XO := RectWidth(BR) - RectWidth(HSkinRect);
  1236.       YO := RectHeight(BR) - RectHeight(HSkinRect);
  1237.       if (HLBPt.X = 0) and (HLBPt.Y = 0)
  1238.       then
  1239.         begin
  1240.           B1 := TBitMap.Create;
  1241.           B1.Width := RectWidth(R);
  1242.           B1.Height := RectHeight(HSkinRect);
  1243.           CreateHSkinImage(HLTPt.X, RectWidth(SR) - HRTPt.X,
  1244.             B1, HPicture, SR, B1.Width, B1.Height);
  1245.           DR := Rect(0, 0, B.Width, B.Height);
  1246.           B.Canvas.StretchDraw(DR, B1);
  1247.           B1.Free;
  1248.         end
  1249.       else
  1250.         begin
  1251.           HNewLTPoint := HLTPt;
  1252.           HNewRTPoint := Point(HRTPt.X + XO, HRTPt.Y);
  1253.           HNewLBPoint := Point(HLBPt.X, HLBPt.Y + YO);
  1254.           HNewRBPoint := Point(HRBPt.X + XO, HRBPt.Y + YO);
  1255.           HNewClRect := Rect(HCLRect.Left, HClRect.Top,
  1256.           HCLRect.Right + XO, HClRect.Bottom + YO);
  1257.           CreateSkinImage(HLTPt, HRTPt, HLBPt, HRBPt, hCLRect,
  1258.             HNewLtPoint, HNewRTPoint, HNewLBPoint, HNewRBPoint, HNewCLRect,
  1259.             B, HPicture, SR, B.Width, B.Height, True);
  1260.         end;
  1261.   end;
  1262.   if Assigned(FOnDrawHeaderSection)
  1263.   then
  1264.     FOnDrawHeaderSection(B.Canvas, Column, Pressed, Rect(0, 0, B.Width, B.Height))
  1265.   else
  1266.   with B.Canvas do
  1267.   begin
  1268.     Brush.Style := bsClear;
  1269.     Inc(BR.Left, 5); Dec(BR.Right, 5);
  1270.     if (SmallImages <> nil) and (Column.ImageIndex >= 0) and
  1271.         (Column.ImageIndex < SmallImages.Count)
  1272.     then
  1273.       begin
  1274.         CorrectTextbyWidth(B.Canvas, S, RectWidth(BR) - 10 - SmallImages.Width);
  1275.         GX := BR.Left;
  1276.         if S = Column.Caption then
  1277.          case Column.Alignment of
  1278.            taRightJustify: GX := BR.Right - TextWidth(S) - SmallImages.Width - 10;
  1279.            taCenter: GX := BR.Left + RectWidth(BR) div 2 -
  1280.                      (TextWidth(S) + SmallImages.Width + 10) div 2;
  1281.          end;
  1282.         TX := GX + SmallImages.Width + 10;
  1283.         TY := BR.Top + RectHeight(BR) div 2 - TextHeight(S) div 2;
  1284.         GY := BR.Top + RectHeight(BR) div 2 - SmallImages.Height div 2;
  1285.         SmallImages.Draw(B.Canvas, GX, GY, Column.ImageIndex, True);
  1286.       end
  1287.      else
  1288.        begin
  1289.          CorrectTextbyWidth(B.Canvas, S, RectWidth(BR));
  1290.          TX := BR.Left;
  1291.          TY := BR.Top + RectHeight(BR) div 2 - TextHeight(S) div 2;
  1292.          case Column.Alignment of
  1293.             taRightJustify: TX := BR.Right - TextWidth(S) - 10;
  1294.            taCenter: TX := RectWidth(BR) div 2 - TextWidth(S) div 2;
  1295.          end;
  1296.        end;
  1297.     TextRect(BR, TX, TY, S);
  1298.   end;
  1299.   Cnvs.Draw(R.Left, R.Top, B);
  1300.   B.Free;
  1301. end;
  1302. function TbsSkinCustomListView.GetHeaderSectionRect(Index: Integer): TRect;
  1303. var
  1304.   SectionOrder: array of Integer;
  1305.   R: TRect;
  1306. begin
  1307.   if Self.FullDrag
  1308.   then
  1309.     begin
  1310.       SetLength(SectionOrder, Columns.Count);
  1311.       Header_GetOrderArray(FHeaderHandle, Columns.Count, PInteger(SectionOrder));
  1312.       Header_GETITEMRECT(FHeaderHandle, SectionOrder[Index] , @R);
  1313.     end
  1314.   else
  1315.     Header_GETITEMRECT(FHeaderHandle, Index, @R);
  1316.   Result := R;
  1317. end;
  1318. procedure TbsSkinCustomListView.PaintHeader;
  1319. var
  1320.   Cnvs: TControlCanvas;
  1321.   i, RightOffset, Xo, YO: Integer;
  1322.   DR, R, BGR, HR: TRect;
  1323.   PS: TPaintStruct;
  1324.   B, B1: TBitMap;
  1325. begin
  1326.   if DC = 0 then DC := BeginPaint(FHeaderHandle, PS);
  1327.   try
  1328.     Cnvs := TControlCanvas.Create;
  1329.     Cnvs.Handle := DC;
  1330.     RightOffset := 0;
  1331.     with Cnvs do
  1332.     begin
  1333.       for i := 0 to Header_GetItemCount(FHeaderHandle) - 1 do
  1334.       begin
  1335.         R := GetHeaderSectionRect(i);
  1336.         DrawHeaderSection(Cnvs, Columns[i], False, (FActiveSection = I) and FHeaderDown, R);
  1337.         if RightOffset < R.Right then RightOffset := R.Right;
  1338.       end;
  1339.     end;
  1340.     Windows.GetWindowRect(FHeaderHandle, HR);
  1341.     BGR := Rect(RightOffset, 0, RectWidth(HR) + 1, RectHeight(R));
  1342.     HGetSkinData;
  1343.     if BGR.Left < BGR.Right then
  1344.     if FhIndex = -1
  1345.     then
  1346.       with Cnvs do
  1347.       begin
  1348.         Brush.Color := clBtnFace;
  1349.         Fillrect(BGR);
  1350.         Frame3D(Cnvs, BGR, clBtnShadow, clBtnShadow, 1);
  1351.       end
  1352.     else
  1353.       begin
  1354.         //
  1355.         B := TBitMap.Create;
  1356.         B.Width := RectWidth(BGR);
  1357.         B.Height := RectHeight(BGR);
  1358.         XO := RectWidth(BGR) - RectWidth(HSkinRect);
  1359.         YO := RectHeight(BGR) - RectHeight(HSkinRect);
  1360.         if (HLBPt.X = 0) and (HLBPt.Y = 0)
  1361.         then
  1362.           begin
  1363.             B1 := TBitMap.Create;
  1364.             B1.Width := RectWidth(BGR);
  1365.             B1.Height := RectHeight(HSkinRect);
  1366.             CreateHSkinImage2(HLtPt.X, RectWidth(HSkinRect) - HRTPt.X,
  1367.               B1, HPicture, HSkinRect, B1.Width, B1.Height);
  1368.             DR := Rect(0, 0, B.Width, B.Height);
  1369.             B.Canvas.StretchDraw(DR, B1);
  1370.             B1.Free;
  1371.           end
  1372.         else
  1373.           begin
  1374.             HNewLTPoint := HLTPt;
  1375.             HNewRTPoint := Point(HRTPt.X + XO, HRTPt.Y);
  1376.             HNewLBPoint := Point(HLBPt.X, HLBPt.Y + YO);
  1377.             HNewRBPoint := Point(HRBPt.X + XO, HRBPt.Y + YO);
  1378.             HNewClRect := Rect(HCLRect.Left, HClRect.Top,
  1379.             HCLRect.Right + XO, HClRect.Bottom + YO);
  1380.             CreateSkinImage2(HLTPt, HRTPt, HLBPt, HRBPt, HCLRect,
  1381.               HNewLtPoint, HNewRTPoint, HNewLBPoint, HNewRBPoint, HNewCLRect,
  1382.               B, HPicture, HSkinRect, B.Width, B.Height, True);
  1383.           end;
  1384.         Cnvs.Draw(BGR.Left, BGR.Top, B);
  1385.         B.Free;
  1386.       end;
  1387.     Cnvs.Handle := 0;
  1388.     Cnvs.Free;
  1389.   finally
  1390.     if DC = 0
  1391.     then
  1392.       EndPaint(FHeaderHandle, PS)
  1393.     else
  1394.       ReleaseDC(FHeaderHandle, DC);
  1395.   end;
  1396. end;
  1397. procedure TbsSkinCustomListView.HeaderWndProc(var Message: TMessage);
  1398. var
  1399.   X, Y: Integer;
  1400. function GetSectionFromPoint(P: TPoint): Integer;
  1401. var
  1402.   i: Integer;
  1403.   R: TRect;
  1404. begin
  1405.   FActiveSection := -1;
  1406.   for i := 0 to Columns.Count - 1 do
  1407.   begin
  1408.     R := GetHeaderSectionRect(i);
  1409.     if PtInRect(R, Point(X, Y))
  1410.     then
  1411.       begin
  1412.         FActiveSection := i;
  1413.         Break;
  1414.       end;
  1415.   end;
  1416. end;
  1417. var
  1418.   Info: THDHitTestInfo;
  1419. begin
  1420.   if Message.Msg  = WM_PAINT
  1421.   then
  1422.     begin
  1423.       PaintHeader(TWMPAINT(MESSAGE).DC);
  1424.     end
  1425.   else  
  1426.   if Message.Msg  = WM_ERASEBKGND
  1427.   then
  1428.     begin
  1429.       Message.Result := 1;
  1430.     end
  1431.   else
  1432.     Message.Result := CallWindowProc(FDefHeaderProc, FHeaderHandle,
  1433.       Message.Msg, Message.WParam, Message.LParam);
  1434.   case Message.Msg of
  1435.     WM_LBUTTONDOWN:
  1436.       begin
  1437.         X := TWMLBUTTONDOWN(Message).XPos;
  1438.         Y := TWMLBUTTONDOWN(Message).YPos;
  1439.         GetSectionFromPoint(Point(X, Y));
  1440.         //
  1441.         Info.Point.X := X;
  1442.         Info.Point.Y := Y;
  1443.         SendMessage(FHeaderHandle, HDM_HITTEST, 0, Integer(@Info));
  1444.         FHeaderDown := not (Info.Flags = HHT_ONDIVIDER);
  1445.         //
  1446.         RedrawWindow(FHeaderHandle, 0, 0, RDW_INVALIDATE);
  1447.       end;
  1448.     WM_LBUTTONUP:
  1449.       begin
  1450.         FHeaderDown := False;
  1451.         FActiveSection := -1;
  1452.         RedrawWindow(FHeaderHandle, 0, 0, RDW_INVALIDATE);
  1453.       end;
  1454.   end;
  1455. end;
  1456. procedure TbsSkinCustomListView.CMVisibleChanged;
  1457. begin
  1458.   inherited;
  1459.   if FVScrollBar <> nil then FVScrollBar.Visible := Self.Visible;
  1460.   if FHScrollBar <> nil then FHScrollBar.Visible := Self.Visible;
  1461. end;
  1462. procedure TbsSkinCustomListView.SetDefaultColor;
  1463. begin
  1464.   FDefaultColor := Value;
  1465.   if FIndex = -1 then Color := Value;
  1466. end;
  1467. procedure TbsSkinCustomListView.Loaded;
  1468. begin
  1469.   ChangeSkinData;
  1470. end;
  1471. procedure TbsSkinCustomListView.ChangeSkinData;
  1472. begin
  1473.   if (FSD = nil) or FSD.Empty
  1474.   then
  1475.     FIndex := -1
  1476.   else
  1477.     FIndex := FSD.GetControlIndex(FSkinDataName);
  1478.   if FIndex <> -1
  1479.   then
  1480.     begin
  1481.       if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is
  1482.          TbsDataSkinListView
  1483.       then
  1484.       with TbsDataSkinListView(FSD.CtrlList.Items[FIndex]) do
  1485.       begin
  1486.         if FUseSkinFont
  1487.           then
  1488.             begin
  1489.               Font.Name := FontName;
  1490.               Font.Style := FontStyle;
  1491.               Font.Height := FontHeight;
  1492.             end
  1493.           else
  1494.             Font.Assign(FDefaultFont);
  1495.           Font.Color := FontColor;
  1496.           Color := BGColor;
  1497.       end;
  1498.     end
  1499.   else
  1500.     begin
  1501.       Color := FDefaultColor;
  1502.       Font := FDefaultFont;
  1503.     end;
  1504.   if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  1505.   then
  1506.     Font.Charset := SkinData.ResourceStrData.CharSet
  1507.   else
  1508.     Font.CharSet := FDefaultFont.CharSet;
  1509.   UpDateScrollBars;
  1510.   if FVScrollBar <> nil then FVScrollBar.Align := FVScrollBar.Align;
  1511.   if FHScrollBar <> nil then FHScrollBar.Align := FHScrollBar.Align;
  1512. end;
  1513. procedure TbsSkinCustomListView.SetDefaultFont;
  1514. begin
  1515.   FDefaultFont.Assign(Value);
  1516.   if FIndex =  -1 then Font.Assign(Value);
  1517. end;
  1518. procedure TbsSkinCustomListView.SetSkinData;
  1519. begin
  1520.   FSD := Value;
  1521.   if (FSD <> nil) then
  1522.   if not FSD.Empty and not (csDesigning in ComponentState)
  1523.   then
  1524.     ChangeSkinData;
  1525. end;
  1526. procedure TbsSkinCustomListView.Notification;
  1527. begin
  1528.   inherited Notification(AComponent, Operation);
  1529.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  1530.   if (Operation = opRemove) and (AComponent = FVScrollBar)
  1531.   then FVScrollBar := nil;
  1532.   if (Operation = opRemove) and (AComponent = FHScrollBar)
  1533.   then FHScrollBar := nil;
  1534. end;
  1535. procedure TbsSkinCustomListView.WMNCCALCSIZE;
  1536. begin
  1537. end;
  1538. procedure TbsSkinCustomListView.WMNCPAINT;
  1539. begin
  1540. end;
  1541. procedure TbsSkinCustomListView.SetVScrollBar;
  1542. begin
  1543.   FVScrollBar := Value;
  1544.   if FVScrollBar <> nil
  1545.   then
  1546.     with FVScrollBar do
  1547.     begin
  1548.       Enabled := True;
  1549.       Visible := False;
  1550.       OnChange := OnVScrollBarChange;
  1551.     end;
  1552.   UpDateScrollBars;
  1553. end;
  1554. procedure TbsSkinCustomListView.SetHScrollBar;
  1555. begin
  1556.   FHScrollBar := Value;
  1557.   if FHScrollBar <> nil
  1558.   then
  1559.     with FHScrollBar do
  1560.     begin
  1561.       Enabled := True;
  1562.       Visible := False;
  1563.       OnChange := OnHScrollBarChange;
  1564.     end;
  1565.   UpDateScrollBars;
  1566. end;
  1567. procedure TbsSkinCustomListView.WndProc;
  1568. var
  1569.   WndClass: String;
  1570. begin
  1571.   case Message.Msg of
  1572.     WM_PARENTNOTIFY:
  1573.        with TWMPARENTNOTIFY(Message) do
  1574.        begin
  1575.          SetLength(WndClass, 80);
  1576.          SetLength(WndClass, GetClassName(ChildWnd, PChar(WndClass), Length(WndClass)));
  1577.          if (Event = WM_CREATE) and (FHeaderHandle <> 0) and ShowColumnHeaders and
  1578.             (WndClass = 'SysHeader32')
  1579.          then
  1580.            begin
  1581.              SetWindowLong(FHeaderHandle, GWL_WNDPROC, LongInt(FDefHeaderProc));
  1582.              FHeaderHandle := 0;
  1583.            end;
  1584.          if (Event = WM_CREATE) and (FHeaderHandle = 0) and ShowColumnHeaders and
  1585.             (WndClass = 'SysHeader32')
  1586.          then
  1587.            begin
  1588.              FHeaderHandle := ChildWnd;
  1589.              FDefHeaderProc := Pointer(GetWindowLong(FHeaderHandle, GWL_WNDPROC));
  1590.              SetWindowLong(FHeaderHandle, GWL_WNDPROC, LongInt(FHeaderInstance));
  1591.            end;
  1592.         end;
  1593.   end;
  1594.   inherited;
  1595.   case Message.Msg of
  1596.      WM_SIZE, WM_PAINT:
  1597.       if not FInCheckScrollBars then UpDateScrollBars;
  1598.      WM_KEYDOWN, WM_LBUTTONUP:
  1599.       UpDateScrollBars;
  1600.   end;
  1601. end;
  1602. procedure TbsSkinCustomListView.UpDateScrollBars;
  1603. begin
  1604.   if HandleAllocated and not FromSB and (Width > 5) and (Height > 5) then
  1605.   case ViewStyle of
  1606.     vsIcon, vsSmallIcon: UpDateScrollBars1;
  1607.     vsReport: UpDateScrollBars2;
  1608.     vsList: UpDateScrollBars3;
  1609.   end;
  1610. end;
  1611. procedure TbsSkinCustomListView.UpDateScrollBars3;
  1612. var
  1613.   IC, IPP, Min, Max, Pos, Page: Integer;
  1614.   R: TRect;
  1615.   IH: Integer;
  1616.   OldVisible, HVisibleChanged, VVisibleChanged: Boolean;
  1617. begin
  1618.   if FInCheckScrollBars then Exit;
  1619.   VVisibleChanged := False;
  1620.   HVisibleChanged := False;
  1621.   if (FVScrollBar <> nil) and FVScrollBar.Visible
  1622.   then
  1623.     begin
  1624.       FInCheckScrollBars := True;
  1625.       FVScrollBar.Visible := False;
  1626.       FInCheckScrollBars := False;
  1627.       VVisibleChanged := True;
  1628.     end;
  1629.     
  1630.   if FHScrollBar <> nil
  1631.   then
  1632.     begin
  1633.       GetScrollRange(Handle, SB_HORZ, Min, Max);
  1634.       Pos := GetScrollPos(Handle, SB_HORZ);
  1635.       IH := 1;
  1636.       if Items.Count > 0
  1637.       then
  1638.         begin
  1639.           ListView_GetItemRect(Handle, 0, R, LVIR_BOUNDS);
  1640.           IH := RectWidth(R);
  1641.         end;
  1642.       if IH = 0 then IH := 1;
  1643.       Page := Width div IH;
  1644.       IC := ListView_GetItemCount(Handle);
  1645.       IPP := ListView_GetCountPerPage(Handle);
  1646.       OldVisible := FHScrollBar.Visible;
  1647.       FInCheckScrollBars := True;
  1648.       FHScrollBar.Visible := (IC > IPP) and Self.Visible;
  1649.       FInCheckScrollBars := False;
  1650.       HVisibleChanged := FHScrollBar.Visible <> OldVisible;
  1651.       if FHScrollBar.Visible
  1652.       then
  1653.         begin
  1654.           FHScrollBar.SetRange(Min, Max, Pos, Page);
  1655.           FHScrollBar.SmallChange := 1;
  1656.           FHScrollBar.LargeChange := 1;
  1657.           FOldHScrollBarPos := Pos;
  1658.         end;
  1659.    end;
  1660.   if (FVScrollBar <> nil) and (FHScrollBar <> nil)
  1661.   then
  1662.     begin
  1663.       if not FVScrollBar.Visible and FHScrollBar.Both
  1664.       then
  1665.         FHScrollBar.Both := False
  1666.       else
  1667.       if FVScrollBar.Visible and not FHScrollBar.Both
  1668.       then
  1669.         FHScrollBar.Both := True;
  1670.     end;
  1671.   if (Self.Align <> alNone) and (HVisibleChanged or VVisibleChanged)
  1672.   then
  1673.     begin
  1674.       FInCheckScrollBars := True;
  1675.       R := Parent.ClientRect;
  1676.       TParentControl(Parent).AlignControls(nil, R);
  1677.       FInCheckScrollBars := False;
  1678.     end;
  1679. end;
  1680. procedure TbsSkinCustomListView.UpDateScrollBars2;
  1681. var
  1682.   Min, Max, Pos: Integer;
  1683.   OldVisible, HVisibleChanged, VVisibleChanged: Boolean;
  1684.   R: TRect;
  1685. begin
  1686.   if FInCheckScrollBars then Exit;
  1687.   VVisibleChanged := False;
  1688.   HVisibleChanged := False;
  1689.   if FVScrollBar <> nil
  1690.   then
  1691.     begin
  1692.       GetScrollRange(Handle, SB_VERT, Min, Max);
  1693.       Pos := GetScrollPos(Handle, SB_VERT);
  1694.       OldVisible := FVScrollBar.Visible;
  1695.       FInCheckScrollBars := True;
  1696.       FVScrollBar.Visible := (Max + 1 > ListView_GetCountPerPage(Handle)) and Self.Visible;;
  1697.       FInCheckScrollBars := False;
  1698.       VVisibleChanged := FVScrollBar.Visible <> OldVisible;
  1699.       if FVScrollBar.Visible
  1700.       then
  1701.         begin
  1702.           FVScrollBar.SetRange(Min, Max, Pos, ListView_GetCountPerPage(Handle));
  1703.           FOldVScrollBarPos := Pos;
  1704.           FVScrollBar.SmallChange := 1;
  1705.           FVScrollBar.LargeChange := ListView_GetCountPerPage(Handle);
  1706.           if FVScrollBar.LargeChange < 1 then FVScrollBar.LargeChange := 1;
  1707.         end;
  1708.     end;
  1709.   if FHScrollBar <> nil
  1710.   then
  1711.     begin
  1712.       GetScrollRange(Handle, SB_HORZ, Min, Max);
  1713.       Pos := GetScrollPos(Handle, SB_HORZ);
  1714.       OldVisible := FHScrollBar.Visible;
  1715.       FInCheckScrollBars := True;
  1716.       FHScrollBar.Visible  := (Max > Width) and Self.Visible;
  1717.       FInCheckScrollBars := False;
  1718.       HVisibleChanged := FHScrollBar.Visible <> OldVisible;
  1719.       if FHScrollBar.Visible
  1720.       then
  1721.         begin
  1722.           FHScrollBar.SetRange(Min, Max, Pos, Width);
  1723.           FOldHScrollBarPos := Pos;
  1724.         end;
  1725.    end;
  1726.   if (FVScrollBar <> nil) and (FHScrollBar <> nil)
  1727.   then
  1728.     begin
  1729.       if not FVScrollBar.Visible and FHScrollBar.Both
  1730.       then
  1731.         FHScrollBar.Both := False
  1732.       else
  1733.       if FVScrollBar.Visible and not FHScrollBar.Both
  1734.       then
  1735.         FHScrollBar.Both := True;
  1736.     end;
  1737.   if (Self.Align <> alNone) and (HVisibleChanged or VVisibleChanged)
  1738.   then
  1739.     begin
  1740.       FInCheckScrollBars := True;
  1741.       R := Parent.ClientRect;
  1742.       TParentControl(Parent).AlignControls(nil, R);
  1743.       FInCheckScrollBars := False;
  1744.     end;
  1745. end;
  1746. procedure TbsSkinCustomListView.UpDateScrollBars1;
  1747. var
  1748.   Min, Max, Pos: Integer;
  1749.   R: TRect;
  1750.   OldVisible, HVisibleChanged, VVisibleChanged: Boolean;
  1751. begin
  1752.   if FInCheckScrollBars then Exit;
  1753.   VVisibleChanged := False;
  1754.   HVisibleChanged := False;
  1755.   if FVScrollBar <> nil
  1756.   then
  1757.     begin
  1758.       GetScrollRange(Handle, SB_VERT, Min, Max);
  1759.       Pos := GetScrollPos(Handle, SB_VERT);
  1760.       OldVisible := FVScrollBar.Visible;
  1761.       FInCheckScrollBars := True;
  1762.       FVScrollBar.Visible  := (Max > Height) and Self.Visible;;
  1763.       FInCheckScrollBars := False;
  1764.       VVisibleChanged := FVScrollBar.Visible <> OldVisible;
  1765.       if FVScrollBar.Visible
  1766.       then
  1767.         begin
  1768.           Listview_GEtItemRect(Handle, 0, R, LVIR_BOUNDS);
  1769.           FVScrollBar.SmallChange := RectHeight(R) div 2;
  1770.           FVScrollBar.LargeChange := RectHeight(R) div 2;
  1771.           if FVScrollBar.SmallChange = 0 then FVScrollBar.SmallChange := 1;
  1772.           if FVScrollBar.LargeChange = 0 then FVScrollBar.LargeChange := 1;
  1773.           FVScrollBar.SetRange(Min, Max, Pos, Height);
  1774.           FOldVScrollBarPos := Pos;
  1775.         end;
  1776.     end;
  1777.   if FHScrollBar <> nil
  1778.   then
  1779.     begin
  1780.       GetScrollRange(Handle, SB_HORZ, Min, Max);
  1781.       Pos := GetScrollPos(Handle, SB_HORZ);
  1782.       OldVisible := FHScrollBar.Visible;
  1783.       FInCheckScrollBars := True;
  1784.       FHScrollBar.Visible  := (Max > Width) and Self.Visible;
  1785.       FInCheckScrollBars := False;
  1786.       HVisibleChanged := FHScrollBar.Visible <> OldVisible;
  1787.       if FHScrollBar.Visible
  1788.       then
  1789.         begin
  1790.           Listview_GEtItemRect(Handle, 0, R, LVIR_BOUNDS);
  1791.           FHScrollBar.SmallChange := RectHeight(R) div 2;
  1792.           FHScrollBar.LargeChange := RectHeight(R) div 2;
  1793.           if FHScrollBar.SmallChange = 0 then FHScrollBar.SmallChange := 1;
  1794.           if FHScrollBar.LargeChange = 0 then FHScrollBar.LargeChange := 1;
  1795.           FHScrollBar.SetRange(Min, Max, Pos, Width);
  1796.           FOldHScrollBarPos := Pos;
  1797.         end;
  1798.    end;
  1799.   if (FVScrollBar <> nil) and (FHScrollBar <> nil)
  1800.   then
  1801.     begin
  1802.       if not FVScrollBar.Visible and FHScrollBar.Both
  1803.       then
  1804.         FHScrollBar.Both := False
  1805.       else
  1806.       if FVScrollBar.Visible and not FHScrollBar.Both
  1807.       then
  1808.         FHScrollBar.Both := True;
  1809.     end;
  1810.   if (Self.Align <> alNone) and (HVisibleChanged or VVisibleChanged)
  1811.   then
  1812.     begin
  1813.       FInCheckScrollBars := True;
  1814.       R := Parent.ClientRect;
  1815.       TParentControl(Parent).AlignControls(nil, R);
  1816.       FInCheckScrollBars := False;
  1817.     end;
  1818. end;
  1819. procedure TbsSkinCustomListView.OnVScrollBarChange;
  1820. var
  1821.   H: Integer;
  1822.   R: TRect;
  1823. begin
  1824.   FromSB := True;
  1825.   if (ViewStyle = vsIcon) or (ViewStyle = vsSmallIcon)
  1826.   then
  1827.     Scroll(0, FVSCROLLBAR.Position - FOldVScrollBarPos)
  1828.   else
  1829.     begin
  1830.       ListView_GetItemRect(Handle, 0, R, LVIR_BOUNDS);
  1831.       H := RectHeight(R);
  1832.       Scroll(0, (FVSCROLLBAR.Position - FOldVScrollBarPos) * H);
  1833.     end;
  1834.   FOldVScrollBarPos := FVSCROLLBAR.Position;
  1835.   FromSB := False;
  1836. end;
  1837. procedure TbsSkinCustomListView.OnHScrollBarChange;
  1838. var
  1839.   i: Integer;
  1840. begin
  1841.   FromSB := True;
  1842.   if ViewStyle = vsList
  1843.   then
  1844.     begin
  1845.       if FOldHScrollBarPos > FHSCROLLBAR.Position
  1846.       then
  1847.         begin
  1848.           for i := 1 to FOldHScrollBarPos - FHSCROLLBAR.Position do
  1849.             SendMessage(Handle, WM_HSCROLL, MakeWParam(SB_LINEUP, 0) , 0)
  1850.         end
  1851.       else
  1852.         begin
  1853.           for i := 1 to FHSCROLLBAR.Position - FOldHScrollBarPos do
  1854.             SendMessage(Handle, WM_HSCROLL, MakeWParam(SB_LINEDOWN, 0), 0);
  1855.         end;
  1856.      end
  1857.   else
  1858.     Scroll(FHSCROLLBAR.Position - FOldHScrollBarPos, 0);
  1859.   FOldHScrollBarPos := FHSCROLLBAR.Position;
  1860.   FromSB := False;
  1861. end;
  1862. procedure TbsSkinCustomListView.CreateParams;
  1863. begin
  1864.   inherited;
  1865.   with Params do
  1866.     Style := Style and not (WS_HSCROLL or WS_VSCROLL);
  1867. end;
  1868. constructor TbsSkinRichEdit.Create(AOwner: TComponent);
  1869. begin
  1870.   inherited;
  1871.   FSkinSupport := False;
  1872.   FVScrollBar := nil;
  1873.   FHScrollBar := nil;
  1874.   FOldVScrollBarPos := 0;
  1875.   FOldHScrollBarPos := 0;
  1876.   FSD := nil;
  1877.   FIndex := -1;
  1878.   FDefaultFont := TFont.Create;
  1879.   with FDefaultFont do
  1880.   begin
  1881.     Name := 'Arial';
  1882.     Style := [];
  1883.     Height := 14;
  1884.   end;
  1885.   Font.Assign(FDefaultFont);
  1886.   FDefaultColor := clWindow;
  1887.   FSkinDataName := 'richedit';
  1888.   ScrollBars := ssBoth;
  1889. end;
  1890. destructor TbsSkinRichEdit.Destroy;
  1891. begin
  1892.   FDefaultFont.Free;
  1893.   inherited;
  1894. end;
  1895. procedure TbsSkinRichEdit.Change;
  1896. begin
  1897.   inherited;
  1898.   UpDateScrollBars;
  1899. end;
  1900. procedure TbsSkinRichEdit.WMMOUSEWHEEL;
  1901. begin
  1902.   inherited;
  1903.   UpDateScrollBars;
  1904. end;
  1905. procedure TbsSkinRichEdit.SetDefaultColor;
  1906. begin
  1907.   FDefaultColor := Value;
  1908.   if (FIndex = -1) and FSkinSupport then Color := Value;
  1909. end;
  1910. procedure TbsSkinRichEdit.SetDefaultFont;
  1911. begin
  1912.   FDefaultFont.Assign(Value);
  1913.   if (FIndex =  -1) and FSkinSupport then Font.Assign(Value);
  1914. end;
  1915. procedure TbsSkinRichEdit.Loaded;
  1916. begin
  1917.   ChangeSkinData;
  1918. end;
  1919. procedure TbsSkinRichEdit.ChangeSkinData;
  1920. begin
  1921.   if (FSD = nil) or FSD.Empty
  1922.   then
  1923.     FIndex := -1
  1924.   else
  1925.     FIndex := FSD.GetControlIndex(FSkinDataName);
  1926.   if FSkinSupport
  1927.   then
  1928.   if FIndex <> -1
  1929.   then
  1930.     begin
  1931.       if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is
  1932.          TbsDataSkinRichEdit
  1933.       then
  1934.       with TbsDataSkinRichEdit(FSD.CtrlList.Items[FIndex]) do
  1935.       begin
  1936.         Font.Name := FontName;
  1937.         Font.Color := FontColor;
  1938.         Font.Style := FontStyle;
  1939.         Font.Height := FontHeight;
  1940.         Color := BGColor;
  1941.       end;
  1942.     end
  1943.   else
  1944.     begin
  1945.       Color := FDefaultColor;
  1946.       Font.Assign(FDefaultFont);
  1947.     end;
  1948.   if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  1949.   then
  1950.     Font.Charset := SkinData.ResourceStrData.CharSet
  1951.   else
  1952.     Font.CharSet := FDefaultFont.CharSet;
  1953.   UpDateScrollBars;
  1954.   if FVScrollBar <> nil then FVScrollBar.Align := FVScrollBar.Align;
  1955.   if FHScrollBar <> nil then FHScrollBar.Align := FHScrollBar.Align;
  1956. end;
  1957. procedure TbsSkinRichEdit.SetSkinData;
  1958. begin
  1959.   FSD := Value;
  1960.   if (FSD <> nil) then
  1961.   if not FSD.Empty and not (csDesigning in ComponentState)
  1962.   then
  1963.     ChangeSkinData;
  1964. end;
  1965. procedure TbsSkinRichEdit.Notification;
  1966. begin
  1967.   inherited Notification(AComponent, Operation);
  1968.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  1969. end;
  1970. procedure TbsSkinRichEdit.WMNCCALCSIZE;
  1971. begin
  1972. end;
  1973. procedure TbsSkinRichEdit.WMNCPAINT;
  1974. begin
  1975.   inherited;
  1976. end;
  1977. procedure TbsSkinRichEdit.SetVScrollBar;
  1978. begin
  1979.   FVScrollBar := Value;
  1980.   if FVScrollBar <> nil
  1981.   then
  1982.     with FVScrollBar do
  1983.     begin
  1984.       OnChange := OnVScrollBarChange;
  1985.       OnUpButtonClick := OnVScrollBarUpButtonClick;
  1986.       OnDownButtonClick := OnVScrollBarDownButtonClick;
  1987.     end;
  1988.   UpDateScrollBars;
  1989. end;
  1990. procedure TbsSkinRichEdit.SetHScrollBar;
  1991. begin
  1992.   FHScrollBar := Value;
  1993.   if FHScrollBar <> nil
  1994.   then
  1995.     with FHScrollBar do
  1996.     begin
  1997.       OnChange := OnHScrollBarChange;
  1998.     end;
  1999.   UpDateScrollBars;
  2000. end;
  2001. procedure TbsSkinRichEdit.WndProc;
  2002. begin
  2003.   inherited;
  2004.   case Message.Msg of
  2005.     WM_SIZE, WM_KEYDOWN, WM_LBUTTONUP, WM_LBUTTONDOWN:
  2006.     UpDateScrollBars;
  2007.   end;
  2008. end;
  2009. procedure TbsSkinRichEdit.UpDateScrollBars;
  2010. var
  2011.   Min, Max, Pos, Page: Integer;
  2012. begin
  2013.   if FVScrollBar <> nil
  2014.   then
  2015.     begin
  2016.       GetScrollRange(Handle, SB_VERT, Min, Max);
  2017.       Pos := GetScrollPos(Handle, SB_VERT);
  2018.       Page := Height;
  2019.       if (Max > Min) and (Page < Max) and (Lines.Count > 0)
  2020.       then
  2021.         begin
  2022.           if not FVScrollBar.Enabled
  2023.           then
  2024.             FVScrollBar.Enabled := True;
  2025.           FVScrollBar.SetRange(Min, Max, Pos, Page);
  2026.         end
  2027.       else
  2028.         begin
  2029.           FVScrollBar.Enabled := False;
  2030.           SetScrollRange(Handle, SB_VERT, 0, 0, False);
  2031.         end;
  2032.     end;
  2033.   if FHScrollBar <> nil
  2034.   then
  2035.     begin
  2036.       GetScrollRange(Handle, SB_HORZ, Min, Max);
  2037.       Pos := GetScrollPos(Handle, SB_HORZ);
  2038.       Page := Width;
  2039.       if (Max > Min) and (Page < Max) and (Lines.Count > 0)
  2040.       then
  2041.         begin
  2042.           if not FHScrollBar.Enabled
  2043.           then
  2044.             FHScrollBar.Enabled := True;
  2045.           FHScrollBar.SetRange(Min, Max, Pos, Page);
  2046.         end
  2047.       else
  2048.         begin
  2049.           FHScrollBar.Enabled := False;
  2050.           SetScrollRange(Handle, SB_HORZ, 0, 0, False);
  2051.         end;
  2052.     end;
  2053. end;
  2054. procedure TbsSkinRichEdit.OnVScrollBarChange;
  2055. begin
  2056.   SendMessage(Handle, WM_VSCROLL,
  2057.    MakeWParam(SB_THUMBPOSITION, FVSCROLLBAR.Position), 0);
  2058. end;
  2059. procedure TbsSkinRichEdit.OnVScrollBarUpButtonClick;
  2060. begin
  2061.   if FVScrollBar.Position < FVScrollBar.Max - FVScrollBar.PageSize + 1
  2062.   then
  2063.     SendMessage(Handle, WM_VSCROLL,
  2064.      MakeWParam(SB_LINEDOWN, FVSCROLLBAR.Position), 0);
  2065.   UpDateScrollBars;
  2066. end;
  2067. procedure TbsSkinRichEdit.OnVScrollBarDownButtonClick;
  2068. begin
  2069.   if FVScrollBar.Position <> 0
  2070.   then
  2071.     SendMessage(Handle, WM_VSCROLL,
  2072.   MakeWParam(SB_LINEUP, FVSCROLLBAR.Position), 0);
  2073.   UpDateScrollBars;
  2074. end;
  2075. procedure TbsSkinRichEdit.OnHScrollBarChange;
  2076. begin
  2077.   SendMessage(Handle, WM_HSCROLL,
  2078.    MakeWParam(SB_THUMBPOSITION, FHSCROLLBAR.Position), 0);
  2079. end;
  2080. procedure TbsSkinRichEdit.CreateParams;
  2081. begin
  2082.   inherited CreateParams(Params);
  2083.   with Params do
  2084.   begin
  2085.     Style := Style and not WS_BORDER;
  2086.     ExStyle := ExStyle and not WS_EX_CLIENTEDGE;
  2087.   end;
  2088. end;
  2089. constructor TbsGraphicSkinControl.Create;
  2090. begin
  2091.   inherited Create(AOwner);
  2092.   ControlStyle := ControlStyle + [csOpaque];
  2093.   FSD := nil;
  2094.   FIndex := -1;
  2095. end;
  2096. destructor TbsGraphicSkinControl.Destroy;
  2097. begin
  2098.   inherited Destroy;
  2099. end;
  2100. procedure TbsGraphicSkinControl.CMMouseEnter;
  2101. begin
  2102.   inherited;
  2103.   if (csDesigning in ComponentState) then Exit;
  2104.   if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
  2105. end;
  2106. procedure TbsGraphicSkinControl.CMMouseLeave;
  2107. begin
  2108.   inherited;
  2109.   if (csDesigning in ComponentState) then Exit;
  2110.   if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
  2111. end;
  2112. procedure TbsGraphicSkinControl.BeforeChangeSkinData;
  2113. begin
  2114.   FIndex := -1;
  2115. end;
  2116. procedure TbsGraphicSkinControl.ChangeSkinData;
  2117. begin
  2118.   GetSkinData;
  2119.   RePaint;
  2120. end;
  2121. procedure TbsGraphicSkinControl.SetSkinData;
  2122. begin
  2123.   FSD := Value;
  2124.   if (FSD <> nil) then
  2125.   if not FSD.Empty and not (csDesigning in ComponentState)
  2126.   then
  2127.     ChangeSkinData;
  2128. end;
  2129. procedure TbsGraphicSkinControl.GetSkinData;
  2130. begin
  2131.   if (FSD = nil) or FSD.Empty
  2132.   then
  2133.     FIndex := -1
  2134.   else
  2135.     FIndex := FSD.GetControlIndex(FSkinDataName);
  2136. end;
  2137. procedure TbsGraphicSkinControl.Paint;
  2138. var
  2139.   Buffer: TBitMap;
  2140. begin
  2141.   if (Width <= 0) or (Height <= 0) then Exit;
  2142.   GetSkinData;
  2143.   Buffer := TBitMap.Create;
  2144.   Buffer.Width := Width;
  2145.   Buffer.Height := Height;
  2146.   if FIndex <> -1
  2147.   then
  2148.     CreateControlSkinImage(Buffer)
  2149.   else
  2150.     CreateControlDefaultImage(Buffer);
  2151.   Canvas.Draw(0, 0, Buffer);
  2152.   Buffer.Free;
  2153. end;
  2154. procedure TbsGraphicSkinControl.CreateControlDefaultImage;
  2155. begin
  2156. end;
  2157. procedure TbsGraphicSkinControl.CreateControlSkinImage;
  2158. begin
  2159. end;
  2160. procedure TbsGraphicSkinControl.Notification;
  2161. begin
  2162.   inherited Notification(AComponent, Operation);
  2163.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  2164. end;
  2165. constructor TbsGraphicSkinCustomControl.Create;
  2166. begin
  2167.   inherited Create(AOwner);
  2168.   FDefaultWidth := 0;
  2169.   FDefaultHeight := 0;
  2170.   FDefaultFont := TFont.Create;
  2171.   FDefaultFont.OnChange := OnDefaultFontChange;
  2172.   with FDefaultFont do
  2173.   begin
  2174.     Name := 'Arial';
  2175.     Style := [];
  2176.     Height := 14;
  2177.   end;
  2178.   FUseSkinFont := True;
  2179. end;
  2180. destructor TbsGraphicSkinCustomControl.Destroy;
  2181. begin
  2182.   FDefaultFont.Free;
  2183.   inherited Destroy;
  2184. end;
  2185. procedure TbsGraphicSkinCustomControl.SetDefaultWidth;
  2186. begin
  2187.   FDefaultWidth := Value;
  2188.   if (FIndex = -1) and (FDefaultWidth > 0) then Width := FDefaultWidth;
  2189. end;
  2190. procedure TbsGraphicSkinCustomControl.SetDefaultHeight;
  2191. begin
  2192.   FDefaultHeight := Value;
  2193.   if (FIndex = -1) and (FDefaultHeight > 0) then Height := FDefaultHeight;
  2194. end;
  2195. procedure TbsGraphicSkinCustomControl.DefaultFontChange;
  2196. begin
  2197. end;
  2198. procedure TbsGraphicSkinCustomControl.SetDefaultFont;
  2199. begin
  2200.   FDefaultFont.Assign(Value);
  2201.   DefaultFontChange;
  2202. end;
  2203. procedure TbsGraphicSkinCustomControl.OnDefaultFontChange;
  2204. begin
  2205.   DefaultFontChange;
  2206.   if FIndex = -1 then RePaint;
  2207. end;
  2208. procedure TbsGraphicSkinCustomControl.CreateControlDefaultImage;
  2209. var
  2210.   R: TRect;
  2211. begin
  2212.   with B.Canvas do
  2213.   begin
  2214.     Brush.Color := clBtnFace;
  2215.     R := ClientRect;
  2216.     FillRect(R);
  2217.   end;
  2218. end;
  2219. procedure TbsGraphicSkinCustomControl.ChangeSkinData;
  2220. var
  2221.   W, H: Integer;
  2222.   UpDate: Boolean;
  2223. begin
  2224.   GetSkinData;
  2225.   W := Width;
  2226.   H := Height;
  2227.   if FIndex <> -1
  2228.   then
  2229.     begin
  2230.       CalcSize(W, H);
  2231.       Update := (W <> Width) or (H <> Height);
  2232.       if W <> Width then Width := W;
  2233.       if H <> Height then Height := H;
  2234.     end
  2235.   else
  2236.     begin
  2237.       UpDate := False;
  2238.       if FDefaultWidth > 0 then Width := FDefaultWidth;
  2239.       if FDefaultHeight > 0 then Height := FDefaultHeight;
  2240.     end;
  2241.   if (not UpDate) or (FIndex = -1) then RePaint;
  2242. end;
  2243. procedure TbsGraphicSkinCustomControl.SetBounds;
  2244. var
  2245.   UpDate: Boolean;
  2246. begin
  2247.   GetSkinData;
  2248.   UpDate := ((Width <> AWidth) or (Height <> AHeight)) and (FIndex <> -1);
  2249.   if UpDate
  2250.   then
  2251.     begin
  2252.       CalcSize(AWidth, AHeight);
  2253.       if ResizeMode = 0 then NewClRect := ClRect;
  2254.     end;
  2255.   inherited;
  2256.   if UpDate then RePaint;
  2257. end;
  2258. procedure TbsGraphicSkinCustomControl.CalcSize;
  2259. var
  2260.   XO, YO: Integer;
  2261. begin
  2262.   if ResizeMode > 0
  2263.   then
  2264.     begin
  2265.       XO := W - RectWidth(SkinRect);
  2266.       YO := H - RectHeight(SkinRect);
  2267.       NewLTPoint := LTPt;
  2268.       case ResizeMode of
  2269.         1:
  2270.           begin
  2271.             NewRTPoint := Point(RTPt.X + XO, RTPt.Y);
  2272.             NewLBPoint := Point(LBPt.X, LBPt.Y + YO);
  2273.             NewRBPoint := Point(RBPt.X + XO, RBPt.Y + YO);
  2274.             NewClRect := Rect(CLRect.Left, ClRect.Top,
  2275.               CLRect.Right + XO, ClRect.Bottom + YO);
  2276.           end;
  2277.         2:
  2278.           begin
  2279.             H := RectHeight(SkinRect);
  2280.             NewRTPoint := Point(RTPt.X + XO, RTPt.Y );
  2281.             NewClRect := ClRect;
  2282.             Inc(NewClRect.Right, XO);
  2283.           end;
  2284.         3:
  2285.           begin
  2286.             W := RectWidth(SkinRect);
  2287.             NewLBPoint := Point(LBPt.X, LBPt.Y + YO);
  2288.             NewClRect := ClRect;
  2289.             Inc(NewClRect.Bottom, YO);
  2290.           end;
  2291.       end;
  2292.     end
  2293.   else
  2294.     if (FIndex <> -1) and (ResizeMode = 0)
  2295.     then
  2296.       begin
  2297.         W := RectWidth(SkinRect);
  2298.         H := RectHeight(SkinRect);
  2299.         NewClRect := CLRect;
  2300.       end;
  2301. end;
  2302. procedure TbsGraphicSkinCustomControl.CreateControlSkinImage;
  2303. begin
  2304.   CreateSkinControlImage(B, Picture, SkinRect);
  2305. end;
  2306. procedure TbsGraphicSkinCustomControl.CreateSkinControlImage;
  2307. begin
  2308.   case ResizeMode of
  2309.     0:
  2310.       begin
  2311.         B.Width := RectWidth(R);
  2312.         B.Height := RectHeight(R);
  2313.         B.Canvas.CopyRect(Rect(0, 0, B.Width, B.Height), SB.Canvas, R);
  2314.       end;
  2315.     1: CreateSkinImage(LTPt, RTPt, LBPt, RBPt, CLRect,
  2316.          NewLtPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewCLRect,
  2317.          B, SB, R, Width, Height, True);
  2318.     2: CreateHSkinImage(LTPt.X, RectWidth(SkinRect) - RTPt.X,
  2319.           B, SB, R, Width, Height);
  2320.     3: CreateVSkinImage(LTPt.Y, RectHeight(SkinRect) - LBPt.Y,
  2321.           B, SB, R, Width, Height);
  2322.   end;
  2323. end;
  2324. function TbsGraphicSkinCustomControl.GetResizeMode;
  2325. begin
  2326.   if IsNullRect(SkinRect)
  2327.   then
  2328.     Result := -1
  2329.   else   
  2330.   if (RBPt.X <> 0) and (RBPt.Y <> 0)
  2331.   then
  2332.     Result := 1
  2333.   else
  2334.   if (RTPt.X <> 0) or (RTPT.Y <> 0)
  2335.   then
  2336.     Result := 2
  2337.   else
  2338.   if (LBPt.X <> 0) or (LBPt.Y <> 0)
  2339.   then
  2340.     Result := 3
  2341.   else
  2342.     Result := 0;  
  2343. end;
  2344. function TbsGraphicSkinCustomControl.GetNewRect;
  2345. var
  2346.   XO, YO: Integer;
  2347.   LeftTop, LeftBottom, RightTop, RightBottom: TRect;
  2348. function CorrectResizeRect: TRect;
  2349. var
  2350.   NR: TRect;
  2351. begin
  2352.   NR := R;
  2353.   if PointInRect(LeftTop, R.TopLeft) and
  2354.      PointInRect(RightBottom, R.BottomRight)
  2355.   then
  2356.     begin
  2357.       Inc(NR.Right, XO);
  2358.       Inc(NR.Bottom, YO);
  2359.     end
  2360.   else
  2361.   if PointInRect(LeftTop, R.TopLeft) and
  2362.      PointInRect(RightTop, R.BottomRight)
  2363.   then
  2364.     Inc(NR.Right, XO)
  2365.   else
  2366.     if PointInRect(LeftBottom, R.TopLeft) and
  2367.        PointInRect(RightBottom, R.BottomRight)
  2368.     then
  2369.       begin
  2370.         Inc(NR.Right, XO);
  2371.         OffsetRect(NR, 0, YO);
  2372.       end
  2373.     else
  2374.       if PointInRect(LeftTop, R.TopLeft) and
  2375.          PointInRect(LeftBottom, R.BottomRight)
  2376.       then
  2377.         Inc(NR.Bottom, YO)
  2378.       else
  2379.         if PointInRect(RightTop, R.TopLeft) and
  2380.            PointInRect(RightBottom, R.BottomRight)
  2381.         then
  2382.           begin
  2383.             OffsetRect(NR, XO, 0);
  2384.             Inc(NR.Bottom, YO);
  2385.           end;
  2386.   Result := NR;
  2387. end;
  2388. begin
  2389.   XO := Width - RectWidth(SkinRect);
  2390.   YO := Height - RectHeight(SkinRect);
  2391.   Result := R;
  2392.   case ResizeMode of
  2393.     1:
  2394.       begin
  2395.         LeftTop := Rect(0, 0, LTPt.X, LTPt.Y);
  2396.         LeftBottom := Rect(0, LBPt.Y, LBPt.X, RectHeight(SkinRect));
  2397.         RightTop := Rect(RTPt.X, 0, RectWidth(SkinRect), RTPt.Y);
  2398.         RightBottom := Rect(RBPt.X, RBPt.Y,
  2399.           RectWidth(SkinRect), RectHeight(SkinRect));
  2400.         Result := R;
  2401.         if RectInRect(R, LeftTop)
  2402.         then Result := R
  2403.         else
  2404.         if RectInRect(R, RightTop)
  2405.         then OffsetRect(Result, XO, 0)
  2406.         else
  2407.         if RectInRect(R, LeftBottom)
  2408.         then OffsetRect(Result, 0, YO)
  2409.         else
  2410.         if RectInRect(R, RightBottom)
  2411.         then
  2412.           OffsetRect(Result,  XO, YO)
  2413.         else
  2414.           Result := CorrectResizeRect;
  2415.       end;
  2416.     2:
  2417.       begin
  2418.         if (R.Left <= LTPt.X) and (R.Right >= RTPt.X)
  2419.         then
  2420.           Inc(Result.Right, XO)
  2421.         else
  2422.         if (R.Left >= RTPt.X) and (R.Right > RTPt.X)
  2423.         then
  2424.           OffsetRect(Result, XO, 0);
  2425.       end;
  2426.      3:
  2427.       begin
  2428.         if (R.Top <= LTPt.Y) and (R.Bottom >= LBPt.Y)
  2429.         then
  2430.           Inc(Result.Bottom, YO)
  2431.         else
  2432.           if (R.Top >= LBPt.Y) and (R.Bottom > LBPt.X)
  2433.           then
  2434.             OffsetRect(Result, 0, YO);
  2435.       end;
  2436.   end;
  2437. end;
  2438. procedure TbsGraphicSkinCustomControl.GetSkinData;
  2439. begin
  2440.   inherited;
  2441.   if FIndex <> -1
  2442.   then
  2443.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinCustomControl
  2444.     then
  2445.       with TbsDataSkinCustomControl(FSD.CtrlList.Items[FIndex]) do
  2446.       begin
  2447.         LTPt := LTPoint;
  2448.         RTPt := RTPoint;
  2449.         LBPt := LBPoint;
  2450.         RBPt := RBPoint;
  2451.         Self.SkinRect := SkinRect;
  2452.         Self.ClRect := ClRect;
  2453.         if (PictureIndex <> -1) and (PictureIndex < FSD.FActivePictures.Count)
  2454.         then
  2455.           Picture := TBitMap(FSD.FActivePictures.Items[PictureIndex])
  2456.         else
  2457.           Picture := nil;
  2458.         ResizeMode := GetResizeMode;
  2459.       end
  2460.     else
  2461.       begin
  2462.         ResizeMode := 0;
  2463.         Picture := nil;
  2464.       end;
  2465. end;
  2466. //=========== TbsSkinButton ===============
  2467. constructor TbsSkinSpeedButton.Create;
  2468. begin
  2469.   inherited;
  2470.   FImageIndex := 0;
  2471.   RepeatTimer := nil;
  2472.   FRepeatMode := False;
  2473.   FRepeatInterval := 100;
  2474.   MorphTimer := nil;
  2475.   FAllowAllUpCheck := False;
  2476.   FAllowAllUp := False;
  2477.   ControlStyle := [csCaptureMouse, csDoubleClicks, csOpaque];
  2478.   Transparent := False;
  2479.   FSkinDataName := 'toolbutton';
  2480.   FDown := False;
  2481.   FMouseDown := False;
  2482.   FMouseIn := False;
  2483.   Width := 25;
  2484.   Height := 25;
  2485.   FGroupIndex := 0;
  2486.   FGlyph := TBitMap.Create;
  2487.   FNumGlyphs := 1;
  2488.   FMargin := -1;
  2489.   FSpacing := 1;
  2490.   FLayout := blGlyphLeft;
  2491.   FShowCaption := True;
  2492.   FWidthWithCaption := 0;
  2493.   FWidthWithoutCaption := 0;
  2494. end;
  2495. destructor TbsSkinSpeedButton.Destroy;
  2496. begin
  2497.   if RepeatTimer <> nil then StopRepeat;
  2498.   FGlyph.Free;
  2499.   StopMorph;
  2500.   inherited;
  2501. end;
  2502. procedure TbsSkinSpeedButton.SetShowCaption(const Value: Boolean);
  2503. begin
  2504.   if FShowCaption <> Value
  2505.   then
  2506.     begin
  2507.       FShowCaption := Value;
  2508.       if (FWidthWithCaption > 0) and (FWidthWithoutCaption > 0)
  2509.       then
  2510.         begin
  2511.           if FShowCaption
  2512.           then Width := FWidthWithCaption
  2513.           else Width := FWidthWithoutCaption;
  2514.         end
  2515.       else
  2516.         RePaint;
  2517.     end;
  2518. end;
  2519. procedure TbsSkinSpeedButton.SetImageIndex(Value: Integer);
  2520. begin
  2521.   FImageIndex := Value;
  2522.   if Parent is TbsSkinToolBar then RePaint;
  2523. end;
  2524. procedure TbsSkinSpeedButton.RepeatTimerProc;
  2525. begin
  2526.   ButtonClick;
  2527. end;
  2528. procedure TbsSkinSpeedButton.StartRepeat;
  2529. begin
  2530.   if RepeatTimer <> nil then RepeatTimer.Free;
  2531.   RepeatTimer := TTimer.Create(Self);
  2532.   RepeatTimer.Enabled := False;
  2533.   RepeatTimer.OnTimer := RepeatTimerProc;
  2534.   RepeatTimer.Interval := FRepeatInterval;
  2535.   RepeatTimer.Enabled := True;
  2536. end;
  2537. procedure TbsSkinSpeedButton.StopRepeat;
  2538. begin
  2539.   if RepeatTimer = nil then Exit;
  2540.   RepeatTimer.Enabled := False;
  2541.   RepeatTimer.Free;
  2542.   RepeatTimer := nil;
  2543. end;
  2544. procedure TbsSkinSpeedButton.DoMorph;
  2545. begin
  2546.   if (FIndex = -1) or not Morphing
  2547.   then
  2548.     begin
  2549.       if FMouseIn then FMorphKf := 1 else FMorphKf := 0;
  2550.       StopMorph;
  2551.     end
  2552.   else
  2553.   if FMouseIn and (FMorphKf < 1)
  2554.   then
  2555.     begin
  2556.       FMorphKf := FMorphKf + MorphInc;
  2557.       RePaint;
  2558.     end
  2559.   else
  2560.   if not FMouseIn and (FMorphKf > 0)
  2561.   then
  2562.     begin
  2563.       FMorphKf := FMorphKf - MorphInc;
  2564.       RePaint;
  2565.     end
  2566.   else
  2567.     begin
  2568.       if FMouseIn then FMorphKf := 1 else FMorphKf := 0;
  2569.       StopMorph;
  2570.       RePaint;
  2571.     end;
  2572. end;
  2573. procedure TbsSkinSpeedButton.StartMorph;
  2574. begin
  2575.   if MorphTimer <> nil then Exit;
  2576.   MorphTimer := TTimer.Create(Self);
  2577.   MorphTimer.Interval := MorphTimerInterval;
  2578.   MorphTimer.OnTimer := DoMorph;
  2579.   MorphTimer.Enabled := True;
  2580. end;
  2581. procedure TbsSkinSpeedButton.StopMorph;
  2582. begin
  2583.   if MorphTimer = nil then Exit;
  2584.   MorphTimer.Free;
  2585.   MorphTimer := nil;
  2586. end;
  2587. procedure TbsSkinSpeedButton.SetTransparent;
  2588. begin
  2589.   if Value
  2590.   then ControlStyle := ControlStyle - [csOpaque]
  2591.   else ControlStyle := ControlStyle + [csOpaque];
  2592.   RePaint;
  2593. end;
  2594. function TbsSkinSpeedButton.GetTransparent;
  2595. begin
  2596.   Result := not (csOpaque in ControlStyle);
  2597. end;
  2598. procedure TbsSkinSpeedButton.SetFlat;
  2599. begin
  2600.   FFlat := Value;
  2601.   Transparent := FFlat;
  2602.   RePaint;
  2603. end;
  2604. procedure TbsSkinSpeedButton.ButtonClick;
  2605. begin
  2606.   if Assigned(OnClick) then OnClick(Self);
  2607. end;
  2608. procedure TbsSkinSpeedButton.CMEnabledChanged;
  2609. begin
  2610.   inherited;
  2611.   if Morphing
  2612.   then
  2613.     begin
  2614.       StopMorph;
  2615.       FMorphKf := 0;
  2616.     end;
  2617.   FMouseIn := False;
  2618.   RePaint;
  2619. end;
  2620. procedure TbsSkinSpeedButton.ChangeSkinData;
  2621. begin
  2622.   StopMorph;
  2623.   inherited;
  2624.   if Morphing and (FIndex <> -1) and FMouseIn and not Transparent
  2625.   then
  2626.     FMorphKf := 1;
  2627. end;
  2628. procedure TbsSkinSpeedButton.SetGroupIndex;
  2629. begin
  2630.   FGroupIndex := Value;
  2631. end;
  2632. procedure TbsSkinSpeedButton.ActionChange(Sender: TObject; CheckDefaults: Boolean);
  2633.   procedure CopyImage(ImageList: TCustomImageList; Index: Integer);
  2634.   begin
  2635.     with FGlyph do
  2636.     begin
  2637.       Width := ImageList.Width;
  2638.       Height := ImageList.Height;
  2639.       Canvas.Brush.Color := clFuchsia;
  2640.       Canvas.FillRect(Rect(0, 0, Width, Height));
  2641.       ImageList.Draw(Canvas, 0, 0, Index);
  2642.     end;
  2643.   end;
  2644. begin
  2645.   inherited ActionChange(Sender, CheckDefaults);
  2646.   if Sender is TCustomAction then
  2647.     with TCustomAction(Sender) do
  2648.     begin
  2649.       if (FGlyph.Empty) and (ActionList <> nil) and (ActionList.Images <> nil) and
  2650.         (ImageIndex >= 0) and (ImageIndex < ActionList.Images.Count) then
  2651.       begin
  2652.         CopyImage(ActionList.Images, ImageIndex);
  2653.         RePaint;
  2654.       end;
  2655.     end;
  2656. end;
  2657. procedure TbsSkinSpeedButton.ReDrawControl;
  2658. begin
  2659.   if Morphing and (FIndex <> -1) and not Transparent
  2660.   then StartMorph
  2661.   else RePaint;
  2662. end;
  2663. procedure TbsSkinSpeedButton.SetLayout;
  2664. begin
  2665.   if FLayout <> Value
  2666.   then
  2667.     begin
  2668.       FLayout := Value;
  2669.       RePaint;
  2670.     end;  
  2671. end;
  2672. procedure TbsSkinSpeedButton.SetSpacing;
  2673. begin
  2674.   if Value <> FSpacing
  2675.   then
  2676.     begin
  2677.       FSpacing := Value;
  2678.       RePaint;
  2679.     end;
  2680. end;
  2681. procedure TbsSkinSpeedButton.SetMargin;
  2682. begin
  2683.   if (Value <> FMargin) and (Value >= -1)
  2684.   then
  2685.     begin
  2686.       FMargin := Value;
  2687.       RePaint;
  2688.     end;
  2689. end;
  2690. procedure TbsSkinSpeedButton.SetDown;
  2691. begin
  2692.   FDown := Value;
  2693.   if Morphing
  2694.   then
  2695.      begin
  2696.        FMorphKf := 1;
  2697.        if not FDown then StartMorph else StopMorph;
  2698.      end;
  2699.   RePaint;   
  2700.   if (GroupIndex <> 0) and FDown and not FAllowAllUp then DoAllUp;
  2701. end;
  2702. procedure TbsSkinSpeedButton.DoAllUp;
  2703. var
  2704.   PC: TWinControl;
  2705.   i: Integer;
  2706. begin
  2707.   if Parent = nil then Exit;
  2708.   PC := TWinControl(Parent);
  2709.   for i := 0 to PC.ControlCount - 1 do
  2710.    if (PC.Controls[i] is TbsSkinSpeedButton) and
  2711.       (PC.Controls[i] <> Self)
  2712.    then
  2713.      with TbsSkinSpeedButton(PC.Controls[i]) do
  2714.        if (GroupIndex = Self.GroupIndex) and
  2715.           (GroupIndex <> 0) and FDown
  2716.        then
  2717.          Down := False;
  2718. end;
  2719. procedure TbsSkinSpeedButton.SetGlyph;
  2720. begin
  2721.   FGlyph.Assign(Value);
  2722.   RePaint;
  2723. end;
  2724. procedure TbsSkinSpeedButton.SetNumGlyphs;
  2725. begin
  2726.   FNumGlyphs := Value;
  2727.   RePaint;
  2728. end;
  2729. procedure TbsSkinSpeedButton.GetSkinData;
  2730. begin
  2731.   inherited;
  2732.   if FIndex <> -1
  2733.   then
  2734.     begin
  2735.       if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinButtonControl
  2736.       then
  2737.         with TbsDataSkinButtonControl(FSD.CtrlList.Items[FIndex]) do
  2738.         begin
  2739.           Self.FontName := FontName;
  2740.           Self.FontColor := FontColor;
  2741.           Self.ActiveFontColor := ActiveFontColor;
  2742.           Self.DownFontColor := DownFontColor;
  2743.           Self.DisabledFontColor := DisabledFontColor;
  2744.           Self.FontStyle := FontStyle;
  2745.           Self.FontHeight := FontHeight;
  2746.           Self.ActiveSkinRect := ActiveSkinRect;
  2747.           Self.DownSkinRect := DownSkinRect;
  2748.           if IsNullRect(ActiveSkinRect) then Self.ActiveSkinRect := SkinRect;
  2749.           if IsNullRect(DownSkinRect) then Self.DownSkinRect := Self.ActiveSkinRect;
  2750.           Self.DisabledSkinRect := DisabledSkinRect;
  2751.           Self.Morphing := Morphing;
  2752.           Self.MorphKind := MorphKind;
  2753.           if Transparent then Self.Morphing := False;
  2754.         end;
  2755.    end;
  2756. end;
  2757. function TbsSkinSpeedButton.GetGlyphNum;
  2758. begin
  2759.   if AIsDown and AIsMouseIn and (FNumGlyphs > 2)
  2760.   then
  2761.     Result := 3
  2762.   else
  2763.   if AIsMouseIn and (FNumGlyphs > 3)
  2764.   then
  2765.     Result := 4
  2766.   else
  2767.     if not Enabled and (FNumGlyphs > 1)
  2768.     then
  2769.       Result := 2
  2770.     else
  2771.       Result := 1;
  2772. end;
  2773. procedure TbsSkinSpeedButton.CreateButtonImage;
  2774. var
  2775.   IL: TCustomImageList;
  2776.   E: Boolean;
  2777.   _Caption: String;
  2778. begin
  2779.   if FShowCaption then _Caption := Caption else _Caption := '';  
  2780.   CreateSkinControlImage(B, Picture, R);
  2781.   if not FUseSkinFont
  2782.   then
  2783.     B.Canvas.Font.Assign(FDefaultFont)
  2784.   else
  2785.     with B.Canvas.Font do
  2786.     begin
  2787.       Name := FontName;
  2788.       Height := FontHeight;
  2789.       Style := FontStyle;
  2790.     end;
  2791.   if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2792.   then
  2793.     B.Canvas.Font.Charset := SkinData.ResourceStrData.CharSet
  2794.   else
  2795.     B.Canvas.Font.CharSet := FDefaultFont.Charset;
  2796.   with B.Canvas.Font do
  2797.   begin
  2798.     if not Enabled
  2799.     then
  2800.       Color := DisabledFontColor
  2801.     else
  2802.     if ADown and AMouseIn
  2803.     then
  2804.       Color := DownFontColor
  2805.     else
  2806.       if AMouseIn
  2807.       then Color := ActiveFontColor
  2808.       else Color := FontColor;
  2809.   end;
  2810.   if FGlyph.Empty and (Parent is TbsSkinToolBar)
  2811.   then
  2812.     begin
  2813.       if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  2814.       then
  2815.         IL := TbsSkinToolBar(Parent).DisabledImages
  2816.       else
  2817.       if (AMouseIn or ADown) and (TbsSkinToolBar(Parent).HotImages <> nil)
  2818.       then
  2819.         IL := TbsSkinToolBar(Parent).HotImages
  2820.       else
  2821.         IL := TbsSkinToolBar(Parent).Images;
  2822.       E := Enabled;
  2823.       if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  2824.       then
  2825.         E := True;
  2826.       DrawImageAndText(B.Canvas, NewClRect, FMargin, FSpacing, FLayout,
  2827.         _Caption, FImageIndex, IL, ADown and AMouseIn, E);
  2828.     end
  2829.   else
  2830.     DrawGlyphAndText(B.Canvas,
  2831.       NewClRect, FMargin, FSpacing, FLayout,
  2832.       _Caption, FGlyph, FNumGlyphs, GetGlyphNum(ADown, AMouseIn), ADown and AMouseIn);
  2833. end;
  2834. procedure TbsSkinSpeedButton.CreateControlDefaultImage;
  2835. var
  2836.   R: TRect;
  2837.   IsDown: Boolean;
  2838.   IL: TCustomImageList;
  2839.   E: Boolean;
  2840.   _Caption: String;
  2841. begin
  2842.   if FShowCaption then _Caption := Caption else _Caption := '';  
  2843.   IsDown := False;
  2844.   R := ClientRect;
  2845.   if FDown and ((FMouseIn and (GroupIndex = 0)) or (GroupIndex  <> 0))
  2846.   then
  2847.     begin
  2848.       Frame3D(B.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  2849.       B.Canvas.Brush.Color := BS_XP_BTNDOWNCOLOR;
  2850.       B.Canvas.FillRect(R);
  2851.       IsDown := True;
  2852.     end
  2853.   else
  2854.     if FMouseIn
  2855.     then
  2856.       begin
  2857.         Frame3D(B.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  2858.         B.Canvas.Brush.Color := BS_XP_BTNACTIVECOLOR;
  2859.         B.Canvas.FillRect(R);
  2860.       end
  2861.     else
  2862.       begin
  2863.         if not (csDesigning in ComponentState) and FFlat
  2864.         then
  2865.           begin
  2866.             if not Transparent
  2867.             then
  2868.               begin
  2869.                 B.Canvas.Brush.Color := clBtnFace;
  2870.                 B.Canvas.FillRect(R);
  2871.               end;
  2872.           end
  2873.         else
  2874.           begin
  2875.             Frame3D(B.Canvas, R, clBtnShadow, clBtnShadow, 1);
  2876.             B.Canvas.Brush.Color := clBtnFace;
  2877.             B.Canvas.FillRect(R);
  2878.           end;
  2879.       end;
  2880.   B.Canvas.Font.Assign(FDefaultFont);
  2881.   if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2882.   then
  2883.     B.Canvas.Font.Charset := SkinData.ResourceStrData.CharSet
  2884.   else
  2885.     B.Canvas.Font.CharSet := FDefaultFont.Charset;
  2886.   if not Enabled then B.Canvas.Font.Color := clBtnShadow;
  2887.   if FGlyph.Empty and (Parent is TbsSkinToolBar)
  2888.   then
  2889.     begin
  2890.       if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  2891.       then
  2892.         IL := TbsSkinToolBar(Parent).DisabledImages
  2893.       else
  2894.       if (FMouseIn or FDown) and (TbsSkinToolBar(Parent).HotImages <> nil)
  2895.       then
  2896.         IL := TbsSkinToolBar(Parent).HotImages
  2897.       else
  2898.         IL := TbsSkinToolBar(Parent).Images;
  2899.       E := Enabled;
  2900.       if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  2901.       then
  2902.         E := True;
  2903.       DrawImageAndText(B.Canvas, ClientRect, FMargin, FSpacing, FLayout,
  2904.         _Caption, FImageIndex, IL, FDown and FMouseIn, E);
  2905.     end
  2906.   else
  2907.   DrawGlyphAndText(B.Canvas,
  2908.     ClientRect, FMargin, FSpacing, FLayout,
  2909.     _Caption, FGlyph, FNumGlyphs, GetGlyphNum(FDown, FMouseIn), IsDown);
  2910. end;
  2911. procedure TbsSkinSpeedButton.CreateControlSkinImage;
  2912. begin
  2913. end;
  2914. procedure TbsSkinSpeedButton.Paint;
  2915. var
  2916.   Buffer, ABuffer: TBitMap;
  2917.   PBuffer, APBuffer: TbsEffectBmp;
  2918.   IL: TCustomImageList;
  2919.   E: Boolean;
  2920.   _Caption: String;
  2921. begin
  2922.   GetSkinData;
  2923.   if FShowCaption then _Caption := Caption else _Caption := '';
  2924.   if FIndex = -1
  2925.   then
  2926.     begin
  2927.       if FDown and (((FMouseIn and (GroupIndex = 0)) or (GroupIndex  <> 0)))
  2928.       then
  2929.         inherited
  2930.       else
  2931.       if FMouseIn
  2932.       then
  2933.         inherited
  2934.       else
  2935.         if Transparent
  2936.         then
  2937.           begin
  2938.             Canvas.Font.Assign(FDefaultFont);
  2939.             if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  2940.             then
  2941.               Canvas.Font.Charset := SkinData.ResourceStrData.CharSet
  2942.             else
  2943.               Canvas.Font.CharSet := FDefaultFont.Charset;
  2944.             if not Enabled then Canvas.Font.Color := clBtnShadow;
  2945.             if FGlyph.Empty and (Parent is TbsSkinToolBar)
  2946.             then
  2947.               begin
  2948.                 if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  2949.                 then
  2950.                   IL := TbsSkinToolBar(Parent).DisabledImages
  2951.                 else
  2952.                   IL := TbsSkinToolBar(Parent).Images;
  2953.                  E := Enabled;
  2954.                  if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  2955.                  then
  2956.                    E := False;
  2957.                   DrawImageAndText(Canvas, ClientRect, FMargin, FSpacing, FLayout,
  2958.                     _Caption, FImageIndex, IL, False, E);
  2959.               end
  2960.             else
  2961.               DrawGlyphAndText(Canvas,
  2962.                 ClientRect, FMargin, FSpacing, FLayout,
  2963.                _Caption, FGlyph, FNumGlyphs, GetGlyphNum(FDown, FMouseIn), False);
  2964.           end
  2965.         else
  2966.           inherited;
  2967.     end
  2968.   else
  2969.     begin
  2970.       if Morphing and (FMorphKf <> 1) and (FMorphKf <> 0) and not Transparent
  2971.       then
  2972.         begin
  2973.           Buffer := TBitMap.Create;
  2974.           ABuffer := TBitMap.Create;
  2975.           ABuffer.Width := Width;
  2976.           ABuffer.Height := Height;
  2977.           CreateButtonImage(Buffer, SkinRect, False, False);
  2978.           CreateButtonImage(ABuffer, ActiveSkinRect, False, True);
  2979.           PBuffer := TbsEffectBmp.CreateFromhWnd(Buffer.Handle);
  2980.           APBuffer := TbsEffectBmp.CreateFromhWnd(ABuffer.Handle);
  2981.           case MorphKind of
  2982.             mkDefault: PBuffer.Morph(APBuffer, FMorphKf);
  2983.             mkGradient: PBuffer.MorphGrad(APBuffer, FMorphKf);
  2984.             mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, FMorphKf);
  2985.             mkRightGradient: PBuffer.MorphRightGrad(APBuffer, FMorphKf);
  2986.             mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, FMorphKf);
  2987.             mkRightSlide: PBuffer.MorphRightSlide(APBuffer, FMorphKf);
  2988.             mkPush: PBuffer.MorphPush(APBuffer, FMorphKf);
  2989.           end;
  2990.           PBuffer.Draw(Canvas.Handle, 0, 0);
  2991.           PBuffer.Free;
  2992.           APBuffer.Free;
  2993.           Buffer.Free;
  2994.           ABuffer.Free;
  2995.         end
  2996.       else
  2997.       if FDown and (((FMouseIn and (GroupIndex = 0)) or (GroupIndex  <> 0)))
  2998.       then
  2999.         begin
  3000.           Buffer := TBitMap.Create;
  3001.           Buffer.Width := Width;
  3002.           Buffer.Height := Height;
  3003.           CreateButtonImage(Buffer, DownSkinRect, True, True);
  3004.           Canvas.Draw(0, 0, Buffer);
  3005.           Buffer.Free;
  3006.         end
  3007.       else
  3008.         if FMouseIn or (not FMouseIn and Morphing and (FMorphKf = 1))
  3009.         then
  3010.           begin
  3011.             Buffer := TBitMap.Create;
  3012.             Buffer.Width := Width;
  3013.             Buffer.Height := Height;
  3014.             CreateButtonImage(Buffer, ActiveSkinRect, False, True);
  3015.             Canvas.Draw(0, 0, Buffer);
  3016.             Buffer.Free;
  3017.           end
  3018.         else
  3019.           begin
  3020.             if Transparent
  3021.             then
  3022.               begin
  3023.                 with Canvas.Font do
  3024.                 begin
  3025.                   Name := FontName;
  3026.                   Style := FontStyle;
  3027.                   if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  3028.                   then
  3029.                     Charset := SkinData.ResourceStrData.CharSet
  3030.                   else
  3031.                     CharSet := FDefaultFont.Charset;
  3032.                   if Self.Enabled
  3033.                   then
  3034.                     Color := FontColor
  3035.                   else
  3036.                     Color := DisabledFontColor;
  3037.                   Height := FontHeight;
  3038.                 end;
  3039.                 if FGlyph.Empty and (Parent is TbsSkinToolBar)
  3040.                 then
  3041.                   begin
  3042.                     if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  3043.                     then
  3044.                       IL := TbsSkinToolBar(Parent).DisabledImages
  3045.                     else
  3046.                       IL := TbsSkinToolBar(Parent).Images;
  3047.                     E := Enabled;
  3048.                     if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  3049.                     then
  3050.                       E := True;
  3051.                      DrawImageAndText(Canvas, NewClRect, FMargin, FSpacing, FLayout,
  3052.                        _Caption, FImageIndex, IL, False, E);
  3053.                   end
  3054.                 else
  3055.                   DrawGlyphAndText(Canvas,
  3056.                     NewClRect, FMargin, FSpacing, FLayout,
  3057.                     _Caption, FGlyph, FNumGlyphs, GetGlyphNum(FDown, FMouseIn), False);
  3058.               end
  3059.             else
  3060.               begin
  3061.                 Buffer := TBitMap.Create;
  3062.                 Buffer.Width := Width;
  3063.                 Buffer.Height := Height;
  3064.                 if not Enabled and not IsNullRect(DisabledSkinRect)
  3065.                 then
  3066.                   CreateButtonImage(Buffer, DisabledSkinRect, False, False)
  3067.                 else
  3068.                   CreateButtonImage(Buffer, SkinRect, False, False);
  3069.                 Canvas.Draw(0, 0, Buffer);
  3070.                 Buffer.Free;
  3071.               end;
  3072.           end;
  3073.     end;
  3074. end;
  3075. procedure TbsSkinSpeedButton.CMTextChanged;
  3076. begin
  3077.   inherited;
  3078.   RePaint;
  3079. end;
  3080. procedure TbsSkinSpeedButton.CMMouseEnter(var Message: TMessage);
  3081. begin
  3082.   inherited;
  3083.   if not Enabled then Exit;
  3084.   if (csDesigning in ComponentState) then Exit;
  3085.   FMouseIn := True;
  3086.   if ((GroupIndex <> 0) and not FDown) or (GroupIndex = 0)
  3087.   then
  3088.     begin
  3089.       if FDown
  3090.       then
  3091.         begin
  3092.           if Morphing then FMorphKf := 1;
  3093.           RePaint;
  3094.         end
  3095.       else
  3096.         ReDrawControl;
  3097.     end;
  3098.   if FDown and RepeatMode and (GroupIndex = 0) then StartRepeat;
  3099. end;
  3100. procedure TbsSkinSpeedButton.CMMouseLeave(var Message: TMessage);
  3101. begin
  3102.   inherited;
  3103.   if not Enabled then Exit;
  3104.   if (csDesigning in ComponentState) then Exit;
  3105.   FMouseIn := False;
  3106.   if ((GroupIndex <> 0) and not FDown) or (GroupIndex = 0)
  3107.   then
  3108.     ReDrawControl;
  3109.   if FDown and RepeatMode and (RepeatTimer <> nil) and (GroupIndex = 0) then StopRepeat;
  3110. end;
  3111. procedure TbsSkinSpeedButton.MouseDown;
  3112. begin
  3113.   inherited;
  3114.   if Button = mbLeft
  3115.   then
  3116.     begin
  3117.       FMouseDown := True;
  3118.       if not FDown
  3119.       then
  3120.         begin
  3121.           FMouseIn := True;
  3122.           Down := True;
  3123.           if FRepeatMode and (GroupIndex = 0)
  3124.           then
  3125.             StartRepeat
  3126.           else
  3127.             if (GroupIndex <> 0) then ButtonClick;
  3128.           FAllowAllUpCheck := False;
  3129.         end
  3130.       else
  3131.         if (GroupIndex <> 0) then FAllowAllUpCheck := True;
  3132.     end;
  3133. end;
  3134. procedure TbsSkinSpeedButton.MouseUp;
  3135. begin
  3136.   inherited;
  3137.   if Button = mbLeft
  3138.   then
  3139.     begin
  3140.       FMouseDown := False;
  3141.       if GroupIndex = 0
  3142.       then
  3143.         begin
  3144.           if FMouseIn
  3145.           then
  3146.             begin
  3147.               Down := False;
  3148.               if RepeatMode then StopRepeat;
  3149.               ButtonClick;
  3150.             end
  3151.              else
  3152.                begin
  3153.                  FDown := False;
  3154.                  if RepeatMode and (RepeatTimer <> nil) then StopRepeat;
  3155.                end;
  3156.         end
  3157.       else
  3158.         if (GroupIndex <> 0) and FDown and FAllowAllUp and
  3159.            FAllowAllUpCheck and FMouseIn
  3160.         then
  3161.           begin
  3162.             Down := False;
  3163.             ButtonClick;
  3164.           end;
  3165.    end;
  3166. end;
  3167. constructor TbsSkinMenuSpeedButton.Create;
  3168. begin
  3169.   inherited;
  3170.   FSkinDataName := 'toolmenubutton';
  3171.   FTrackButtonMode := False;
  3172.   FMenuTracked := False;
  3173.   FSkinPopupMenu := nil;
  3174. end;
  3175. destructor TbsSkinMenuSpeedButton.Destroy;
  3176. begin
  3177.   inherited;
  3178. end;
  3179. procedure TbsSkinMenuSpeedButton.CreateButtonImage;
  3180. begin
  3181.   if FMenuTracked and FTrackButtonMode and
  3182.      not IsNullRect(TrackButtonRect) and not IsNullRect(DownSkinRect)
  3183.   then
  3184.     begin
  3185.       inherited CreateButtonImage(B, ActiveSkinRect, False, True);
  3186.       R := TrackButtonRect;
  3187.       OffsetRect(R, DownSkinRect.Left, DownSkinRect.Top);
  3188.         B.Canvas.CopyRect(GetNewTrackButtonRect, Picture.Canvas,
  3189.        R);
  3190.     end
  3191.   else
  3192.     inherited;
  3193. end;
  3194. procedure TbsSkinMenuSpeedButton.Paint;
  3195. var
  3196.   R: TRect;
  3197.   IL: TCustomImageList;
  3198.   E: Boolean;
  3199.   _Caption: String;
  3200. begin
  3201.   if FShowCaption then _Caption := Caption  else _Caption := '';
  3202.   GetSkinData;
  3203.   if not FMouseIn and not FDown and not FMenuTracked and Transparent
  3204.   then
  3205.     begin
  3206.       if FIndex = -1
  3207.       then
  3208.         begin
  3209.           R := ClientRect;
  3210.           Dec(R.Right, 15);
  3211.         end
  3212.       else
  3213.         R := NewClRect;
  3214.       Canvas.Font.Assign(FDefaultFont);
  3215.      if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  3216.      then
  3217.        Canvas.Font.Charset := SkinData.ResourceStrData.CharSet
  3218.      else
  3219.        Canvas.Font.CharSet := FDefaultFont.Charset;
  3220.       if not Enabled then Canvas.Font.Color := clBtnShadow;
  3221.       if FGlyph.Empty and (Parent is TbsSkinToolBar)
  3222.       then
  3223.         begin
  3224.           if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  3225.           then
  3226.             IL := TbsSkinToolBar(Parent).DisabledImages
  3227.           else
  3228.             IL := TbsSkinToolBar(Parent).Images;
  3229.           E := Enabled;
  3230.           if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  3231.           then
  3232.             E := False;
  3233.           DrawImageAndText(Canvas, R, FMargin, FSpacing, FLayout,
  3234.            _Caption, FImageIndex, IL, False, E);
  3235.         end
  3236.       else
  3237.         DrawGlyphAndText(Canvas, R, FMargin, FSpacing, FLayout,
  3238.           _Caption, FGlyph, FNumGlyphs, 1, False);
  3239.       if FIndex <> -1
  3240.       then
  3241.         begin
  3242.           R.Left := R.Right;
  3243.           R.Right := Width;
  3244.         end
  3245.       else
  3246.         begin
  3247.           R.Left := Width - 15;
  3248.           R.Right := Width;
  3249.         end;
  3250.       if (FDown and FMouseIn) or FMenuTracked
  3251.       then
  3252.         begin
  3253.           Inc(R.Top, 2);
  3254.           Inc(R.Left, 2);
  3255.         end;
  3256.       DrawTrackArrowImage(Canvas, R, clBtnText);
  3257.     end
  3258.   else
  3259.     inherited;
  3260. end;
  3261. procedure TbsSkinMenuSpeedButton.CreateControlDefaultImage;
  3262. var
  3263.   R, R1: TRect;
  3264.   isDown: Boolean;
  3265.   IL: TCustomImageList;
  3266.   E: Boolean;
  3267.   _Caption: String;
  3268. begin
  3269.   if FShowCaption then _Caption := Caption  else _Caption := '';
  3270.   isDown := False;
  3271.   R := Rect(0, 0, Width, Height);
  3272.   if FTrackButtonMode
  3273.   then
  3274.     begin
  3275.       R := Rect(0, 0, Width - 15, Height);
  3276.       R1 := Rect(Width - 15, 0, Width, Height);
  3277.       if FMenuTracked
  3278.       then
  3279.         begin
  3280.           B.Canvas.Brush.Color := BS_XP_BTNACTIVECOLOR;
  3281.           B.Canvas.FillRect(R);
  3282.           Frame3D(B.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  3283.           B.Canvas.Brush.Color := BS_XP_BTNDOWNCOLOR;
  3284.           B.Canvas.FillRect(R1);
  3285.           Frame3D(B.Canvas, R1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  3286.         end
  3287.       else
  3288.         begin
  3289.           if FDown and FMouseIn
  3290.           then
  3291.             begin
  3292.               Frame3D(B.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  3293.               B.Canvas.Brush.Color := BS_XP_BTNDOWNCOLOR;
  3294.               B.Canvas.FillRect(R);
  3295.               Frame3D(B.Canvas, R1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  3296.               B.Canvas.Brush.Color := BS_XP_BTNDOWNCOLOR;
  3297.               B.Canvas.FillRect(R1);
  3298.               isDown := True;
  3299.             end
  3300.           else
  3301.           if FMouseIn
  3302.           then
  3303.             begin
  3304.               Frame3D(B.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  3305.               B.Canvas.Brush.Color := BS_XP_BTNACTIVECOLOR;
  3306.               B.Canvas.FillRect(R);
  3307.               Frame3D(B.Canvas, R1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  3308.               B.Canvas.Brush.Color := BS_XP_BTNACTIVECOLOR;
  3309.               B.Canvas.FillRect(R1);
  3310.             end
  3311.           else
  3312.             if not FFlat
  3313.             then
  3314.               begin
  3315.                 Frame3D(B.Canvas, R, clBtnShadow, clBtnShadow, 1);
  3316.                 B.Canvas.Brush.Color := clBtnFace;
  3317.                 B.Canvas.FillRect(R);
  3318.                 Frame3D(B.Canvas, R1, clBtnShadow, clBtnShadow, 1);
  3319.                 B.Canvas.Brush.Color := clBtnFace;
  3320.                 B.Canvas.FillRect(R1);
  3321.               end
  3322.             else
  3323.               begin
  3324.                 B.Canvas.Brush.Color := clBtnFace;
  3325.                 B.Canvas.FillRect(R);
  3326.                 B.Canvas.FillRect(R1);
  3327.               end;
  3328.         end;
  3329.     end
  3330.   else
  3331.     begin
  3332.       if FDown and FMouseIn
  3333.       then
  3334.         begin
  3335.           Frame3D(B.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  3336.           B.Canvas.Brush.Color := BS_XP_BTNDOWNCOLOR;
  3337.           B.Canvas.FillRect(R);
  3338.           IsDown := True;
  3339.         end
  3340.       else
  3341.         if FMouseIn
  3342.         then
  3343.           begin
  3344.             Frame3D(B.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  3345.             B.Canvas.Brush.Color := BS_XP_BTNACTIVECOLOR;
  3346.             B.Canvas.FillRect(R);
  3347.           end
  3348.        else
  3349.          begin
  3350.            if not FFlat
  3351.            then
  3352.              Frame3D(B.Canvas, R, clBtnShadow, clBtnShadow, 1);
  3353.            B.Canvas.Brush.Color := clBtnFace;
  3354.            B.Canvas.FillRect(R);
  3355.          end;
  3356.     end;
  3357.   R := ClientRect;
  3358.   Dec(R.Right, 15);
  3359.   B.Canvas.Font.Assign(FDefaultFont);
  3360.   if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  3361.   then
  3362.     B.Canvas.Font.Charset := SkinData.ResourceStrData.CharSet
  3363.   else
  3364.     B.Canvas.Font.CharSet := FDefaultFont.Charset;
  3365.   if not Enabled then B.Canvas.Font.Color := clBtnShadow;
  3366.   if FGlyph.Empty and (Parent is TbsSkinToolBar)
  3367.   then
  3368.     begin
  3369.       if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  3370.       then
  3371.         IL := TbsSkinToolBar(Parent).DisabledImages
  3372.       else
  3373.       if (FMouseIn or FDown) and (TbsSkinToolBar(Parent).HotImages <> nil)
  3374.       then
  3375.         IL := TbsSkinToolBar(Parent).HotImages
  3376.       else
  3377.         IL := TbsSkinToolBar(Parent).Images;
  3378.       E := Enabled;
  3379.       if not Enabled and (TbsSkinToolBar(Parent).DisabledImages <> nil)
  3380.       then
  3381.         E := False;
  3382.       DrawImageAndText(B.Canvas, R, FMargin, FSpacing, FLayout,
  3383.         _Caption, FImageIndex, IL, isDown, E);
  3384.     end
  3385.   else
  3386.   DrawGlyphAndText(B.Canvas, R, FMargin, FSpacing, FLayout,
  3387.                   _Caption, FGlyph, FNumGlyphs, 1,  isDown);
  3388.   R.Left := Width - 15;
  3389.   Inc(R.Right, 15);
  3390.   if (FDown and FMouseIn) or FMenuTracked
  3391.   then
  3392.     begin
  3393.       Inc(R.Top, 2);
  3394.       Inc(R.Left, 2);
  3395.     end;
  3396.   DrawTrackArrowImage(B.Canvas, R, clBtnText);
  3397. end;
  3398. function TbsSkinMenuSpeedButton.GetNewTrackButtonRect;
  3399. var
  3400.   RM, Off: Integer;
  3401.   R: TRect;
  3402. begin
  3403.   RM := GetResizeMode;
  3404.   R := TrackButtonRect;
  3405.   case RM of
  3406.     2:
  3407.       begin
  3408.         Off := Width - RectWidth(SkinRect);
  3409.         OffsetRect(R, Off, 0);
  3410.       end;
  3411.     3:
  3412.       begin
  3413.         Off := Height - RectHeight(SkinRect);
  3414.         OffsetRect(R, 0, Off);
  3415.       end;
  3416.   end;
  3417.   Result := R;
  3418. end;
  3419. function TbsSkinMenuSpeedButton.CanMenuTrack;
  3420. var
  3421.   R: TRect;
  3422. begin
  3423.   if FSkinPopupMenu = nil
  3424.   then
  3425.     begin
  3426.       Result := False;
  3427.       Exit;
  3428.     end
  3429.   else
  3430.     begin
  3431.       if not FTrackButtonMode
  3432.       then
  3433.         Result := True
  3434.       else
  3435.         begin
  3436.           if FIndex <> -1
  3437.           then R := GetNewTrackButtonRect
  3438.           else R := Rect(Width - 15, 0, Width, Height);
  3439.           Result := PointInRect(R, Point(X, Y));
  3440.         end;
  3441.     end
  3442. end;
  3443. procedure TbsSkinMenuSpeedButton.WMCLOSESKINMENU;
  3444. begin
  3445.   FMenuTracked := False;
  3446.   Down := False;
  3447.   if Assigned(FOnHideTrackMenu) then FOnHideTrackMenu(Self);
  3448. end;
  3449. procedure TbsSkinMenuSpeedButton.TrackMenu;
  3450. var
  3451.   R: TRect;
  3452.   P: TPoint;
  3453. begin
  3454.   if FSkinPopupMenu = nil then Exit;
  3455.   P := ClientToScreen(Point(0, 0));
  3456.   R := Rect(P.X, P.Y, P.X + Width, P.Y + Height);
  3457.   FSkinPopupMenu.PopupFromRect2(Self, R, False);
  3458.   if Assigned(FOnShowTrackMenu) then FOnShowTrackMenu(Self);
  3459. end;
  3460. procedure TbsSkinMenuSpeedButton.Notification;
  3461. begin
  3462.   inherited Notification(AComponent, Operation);
  3463.   if (Operation = opRemove) and (AComponent = FSkinPopupMenu)
  3464.   then FSkinPopupMenu := nil;
  3465. end;
  3466. procedure TbsSkinMenuSpeedButton.CMMouseEnter(var Message: TMessage);
  3467. begin
  3468.   if (csDesigning in ComponentState) then Exit;
  3469.   if not FMenuTracked then inherited else FMouseIn := True;
  3470. end;
  3471. procedure TbsSkinMenuSpeedButton.CMMouseLeave(var Message: TMessage);
  3472. begin
  3473.   if (csDesigning in ComponentState) then Exit;
  3474.   if not FMenuTracked then inherited else FMouseIn := False;
  3475. end;
  3476. procedure TbsSkinMenuSpeedButton.GetSkinData;
  3477. begin
  3478.   inherited;
  3479.   if FIndex <> -1
  3480.   then
  3481.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinMenuButtonControl
  3482.     then
  3483.       with TbsDataSkinMenuButtonControl(FSD.CtrlList.Items[FIndex]) do
  3484.       begin
  3485.         Self.TrackButtonRect := TrackButtonRect;
  3486.       end;
  3487. end;
  3488. procedure TbsSkinMenuSpeedButton.SetTrackButtonMode;
  3489. begin
  3490.   FTrackButtonMode := Value;
  3491.   if FIndex = - 1 then RePaint;
  3492. end;
  3493. procedure TbsSkinMenuSpeedButton.MouseDown;
  3494. begin
  3495.   if Button <> mbLeft
  3496.   then
  3497.     begin
  3498.       inherited;
  3499.       Exit;
  3500.     end;
  3501.   FMenuTracked := CanMenuTrack(X, Y);
  3502.   FMouseIn := True;
  3503.   if FMenuTracked
  3504.   then
  3505.     begin
  3506.       if not FDown then Down := True;
  3507.       TrackMenu;
  3508.     end
  3509.   else
  3510.     inherited;
  3511. end;
  3512. procedure TbsSkinMenuSpeedButton.MouseUp;
  3513. begin
  3514.   if not FMenuTracked then inherited;
  3515. end;
  3516. constructor TbsSkinTextLabel.Create(AOwner: TComponent);
  3517. begin
  3518.   inherited Create(AOwner);
  3519.   ControlStyle := ControlStyle + [csReplicatable] - [csOpaque];
  3520.   Width := 65;
  3521.   Height := 65;
  3522.   FAutoSize := True;
  3523.   FLines := TStringList.Create;
  3524.   FSkinDataName := 'stdlabel';
  3525.   FDefaultFont := TFont.Create;
  3526.   FUseSkinFont := True;
  3527. end;
  3528. destructor TbsSkinTextLabel.Destroy;
  3529. begin
  3530.   FLines.Free;
  3531.   FDefaultFont.Free;
  3532.   inherited;
  3533. end;
  3534. procedure TbsSkinTextLabel.SetDefaultFont;
  3535. begin
  3536.   FDefaultFont.Assign(Value);
  3537. end;
  3538. procedure TbsSkinTextLabel.Notification;
  3539. begin
  3540.   inherited Notification(AComponent, Operation);
  3541.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  3542. end;
  3543. procedure TbsSkinTextLabel.GetSkinData;
  3544. begin
  3545.   if (FSD = nil) or FSD.Empty
  3546.   then
  3547.     FIndex := -1
  3548.   else
  3549.     FIndex := FSD.GetControlIndex(FSkinDataName);
  3550.   if FIndex <> -1
  3551.   then
  3552.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinStdLabelControl
  3553.     then
  3554.       with TbsDataSkinStdLabelControl(FSD.CtrlList.Items[FIndex]) do
  3555.       begin
  3556.         Self.FontName := FontName;
  3557.         Self.FontStyle := FontStyle;
  3558.         Self.FontHeight := FontHeight;
  3559.         Self.FontColor := FontColor;
  3560.       end;
  3561. end;
  3562. procedure TbsSkinTextLabel.ChangeSkinData;
  3563. begin
  3564.   GetSkinData;
  3565.   if FAutoSize then AdjustBounds;
  3566.   RePaint;
  3567. end;
  3568. procedure TbsSkinTextLabel.SetSkinData;
  3569. begin
  3570.   FSD := Value;
  3571.   if (FSD <> nil) then ChangeSkinData;
  3572. end;
  3573. procedure TbsSkinTextLabel.SetLines;
  3574. begin
  3575.   FLines.Assign(Value);
  3576.   if FAutoSize then AdjustBounds;
  3577.   RePaint;
  3578. end;
  3579. function TbsSkinTextLabel.GetLabelText: string;
  3580. begin
  3581.   Result := FLines.Text;
  3582. end;
  3583. procedure TbsSkinTextLabel.DoDrawText(var Rect: TRect; Flags: Longint);
  3584. var
  3585.   Text: string;
  3586. begin
  3587.   GetSkinData;
  3588.   Text := GetLabelText;
  3589.   Flags := DrawTextBiDiModeFlags(Flags);
  3590.   if FIndex <> -1
  3591.   then
  3592.     with Canvas.Font do
  3593.     begin
  3594.       if FUseSkinFont
  3595.       then
  3596.         begin
  3597.           Name := FontName;
  3598.           Style := FontStyle;
  3599.           Height := FontHeight;
  3600.         end
  3601.       else
  3602.         Canvas.Font := Self.Font;
  3603.       Color := FontColor;
  3604.     end
  3605.   else
  3606.     if FUseSkinFont
  3607.     then
  3608.       Canvas.Font := DefaultFont
  3609.     else
  3610.       Canvas.Font := Self.Font;
  3611.   if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  3612.   then
  3613.     Canvas.Font.Charset := SkinData.ResourceStrData.CharSet
  3614.   else
  3615.     Canvas.Font.CharSet := FDefaultFont.Charset;
  3616.   if not Enabled then
  3617.   begin
  3618.     OffsetRect(Rect, 1, 1);
  3619.     Canvas.Font.Color := clBtnHighlight;
  3620.     DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
  3621.     OffsetRect(Rect, -1, -1);
  3622.     Canvas.Font.Color := clBtnShadow;
  3623.     DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
  3624.   end
  3625.   else
  3626.     begin
  3627.       Canvas.Font := Self.Font;
  3628.       if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  3629.       then
  3630.         Canvas.Font.Charset := SkinData.ResourceStrData.CharSet;
  3631.       DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
  3632.     end;
  3633. end;
  3634. procedure TbsSkinTextLabel.Paint;
  3635. const
  3636.   Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
  3637.   WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
  3638. var
  3639.   Rect, CalcRect: TRect;
  3640.   DrawStyle: Longint;
  3641. begin
  3642.   with Canvas do
  3643.   begin
  3644.     Brush.Style := bsClear;
  3645.     Rect := ClientRect;
  3646.     { DoDrawText takes care of BiDi alignments }
  3647.     DrawStyle := DT_EXPANDTABS or WordWraps[FWordWrap] or Alignments[FAlignment];
  3648.     { Calculate vertical layout }
  3649.     if FLayout <> tlTop then
  3650.     begin
  3651.       CalcRect := Rect;
  3652.       DoDrawText(CalcRect, DrawStyle or DT_CALCRECT);
  3653.       if FLayout = tlBottom then OffsetRect(Rect, 0, Height - CalcRect.Bottom)
  3654.       else OffsetRect(Rect, 0, (Height - CalcRect.Bottom) div 2);
  3655.     end;
  3656.     DoDrawText(Rect, DrawStyle);
  3657.   end;
  3658. end;
  3659. procedure TbsSkinTextLabel.Loaded;
  3660. begin
  3661.   inherited Loaded;
  3662.   AdjustBounds;
  3663. end;
  3664. procedure TbsSkinTextLabel.AdjustBounds;
  3665. const
  3666.   WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
  3667. var
  3668.   DC: HDC;
  3669.   X: Integer;
  3670.   Rect: TRect;
  3671.   AAlignment: TAlignment;
  3672. begin
  3673.   if not (csReading in ComponentState) and FAutoSize then
  3674.   begin
  3675.     Rect := ClientRect;
  3676.     DC := GetDC(0);
  3677.     Canvas.Handle := DC;
  3678.     DoDrawText(Rect, (DT_EXPANDTABS or DT_CALCRECT) or WordWraps[FWordWrap]);
  3679.     Canvas.Handle := 0;
  3680.     ReleaseDC(0, DC);
  3681.     X := Left;
  3682.     AAlignment := FAlignment;
  3683.     if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
  3684.     if AAlignment = taRightJustify then Inc(X, Width - Rect.Right);
  3685.     SetBounds(X, Top, Rect.Right, Rect.Bottom);
  3686.   end;
  3687. end;
  3688. procedure TbsSkinTextLabel.SetAlignment(Value: TAlignment);
  3689. begin
  3690.   if FAlignment <> Value then
  3691.   begin
  3692.     FAlignment := Value;
  3693.     Invalidate;
  3694.   end;
  3695. end;
  3696. procedure TbsSkinTextLabel.SetAutoSize(Value: Boolean);
  3697. begin
  3698.   if FAutoSize <> Value then
  3699.   begin
  3700.     FAutoSize := Value;
  3701.     AdjustBounds;
  3702.   end;
  3703. end;
  3704. procedure TbsSkinTextLabel.SetLayout(Value: TTextLayout);
  3705. begin
  3706.   if FLayout <> Value then
  3707.   begin
  3708.     FLayout := Value;
  3709.     Invalidate;
  3710.   end;
  3711. end;
  3712. procedure TbsSkinTextLabel.SetWordWrap(Value: Boolean);
  3713. begin
  3714.   if FWordWrap <> Value then
  3715.   begin
  3716.     FWordWrap := Value;
  3717.     AdjustBounds;
  3718.     Invalidate;
  3719.   end;
  3720. end;
  3721. procedure TbsSkinTextLabel.CMFontChanged(var Message: TMessage);
  3722. begin
  3723.   inherited;
  3724.   AdjustBounds;
  3725.   Invalidate;
  3726. end;
  3727. // ======================== TbsSkinExPanel ============================= //
  3728. constructor TbsSkinExPanel.Create(AOwner: TComponent);
  3729. begin
  3730.   inherited;
  3731.   ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
  3732.     csSetCaption, csOpaque, csDoubleClicks, csReplicatable];
  3733.   FNumGlyphs := 1;
  3734.   FGlyph := TBitMap.Create;
  3735.   FSpacing := 2;
  3736.   FDefaultCaptionHeight := 21;
  3737.   Width := 150;
  3738.   Height := 100;
  3739.   VisibleControls := nil;
  3740.   FRollKind := rkRollVertical;
  3741.   ActiveButton := -1;
  3742.   OldActiveButton := -1;
  3743.   CaptureButton := -1;
  3744.   FShowRollButton := True;
  3745.   FShowCloseButton := True;
  3746.   FRollState := False;
  3747.   FRealWidth := 0;
  3748.   FRealHeight := 0;
  3749.   StopCheckSize := False;
  3750.   FSkinDataName := 'expanel';
  3751. end;
  3752. destructor TbsSkinExPanel.Destroy;
  3753. begin
  3754.   FGlyph.Free;
  3755.   inherited;
  3756. end;
  3757. procedure TbsSkinExPanel.SetNumGlyphs;
  3758. begin
  3759.   FNumGlyphs := Value;
  3760.   RePaint;
  3761. end;
  3762. procedure TbsSkinExPanel.SetGlyph;
  3763. begin
  3764.   FGlyph.Assign(Value);
  3765.   RePaint;
  3766. end;
  3767. procedure TbsSkinExPanel.SetSpacing;
  3768. begin
  3769.   FSpacing := Value;
  3770.   RePaint;
  3771. end;
  3772. procedure TbsSkinExPanel.ChangeSkinData;
  3773. begin
  3774.   inherited;
  3775.   if FRollState
  3776.   then
  3777.     begin
  3778.       if FRollKind = rkRollVertical
  3779.       then Height := GetRollHeight
  3780.       else Width := GetRollWidth;
  3781.     end
  3782.   else
  3783.     ReAlign;
  3784. end;
  3785. procedure TbsSkinExPanel.Close;
  3786. begin
  3787.   Visible := False;
  3788.   if not (csDesigning in ComponentState) and
  3789.     Assigned(FOnClose)
  3790.   then
  3791.     FOnClose(Self);
  3792. end;
  3793. procedure TbsSkinExPanel.GetSkinData;
  3794. begin
  3795.   inherited;
  3796.   if FIndex <> -1
  3797.   then
  3798.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinExPanelControl
  3799.     then
  3800.       with TbsDataSkinExPanelControl(FSD.CtrlList.Items[FIndex]) do
  3801.       begin
  3802.         Self.CaptionRect := CaptionRect;
  3803.         Self.FontName := FontName;
  3804.         Self.FontColor := FontColor;
  3805.         Self.FontStyle := FontStyle;
  3806.         Self.FontHeight := FontHeight;
  3807.         Self.RollHSkinRect := RollHSkinRect;
  3808.         Self.RollVSkinRect := RollVSkinRect;
  3809.         Self.RollLeftOffset := RollLeftOffset;
  3810.         Self.RollRightOffset := RollRightOffset;
  3811.         Self.RollTopOffset := RollTopOffset;
  3812.         Self.RollBottomOffset := RollBottomOffset;
  3813.         Self.RollVCaptionRect := RollVCaptionRect;
  3814.         Self.RollHCaptionRect := RollHCaptionRect;
  3815.         Self.CloseButtonRect := CloseButtonRect;
  3816.         Self.CloseButtonActiveRect := CloseButtonActiveRect;
  3817.         Self.CloseButtonDownRect := CloseButtonDownRect;
  3818.         Self.HRollButtonRect := HRollButtonRect;
  3819.         Self.HRollButtonActiveRect := HRollButtonActiveRect;
  3820.         if IsNullRect(Self.HRollButtonActiveRect)
  3821.         then Self.HRollButtonActiveRect := Self.HRollButtonRect;
  3822.         Self.HRollButtonDownRect := HRollButtonDownRect;
  3823.         if IsNullRect(Self.HRollButtonDownRect)
  3824.         then Self.HRollButtonDownRect := Self.HRollButtonActiveRect;
  3825.         Self.HRestoreButtonRect := HRestoreButtonRect;
  3826.         Self.HRestoreButtonActiveRect := HRestoreButtonActiveRect;
  3827.         if IsNullRect(Self.HRestoreButtonActiveRect)
  3828.         then Self.HRestoreButtonActiveRect := Self.HRestoreButtonRect;
  3829.         Self.HRestoreButtonDownRect := HRestoreButtonDownRect;
  3830.         if IsNullRect(Self.HRestoreButtonDownRect)
  3831.         then Self.HRestoreButtonDownRect := Self.HRestoreButtonActiveRect;
  3832.         Self.VRollButtonRect := VRollButtonRect;
  3833.         Self.VRollButtonActiveRect := VRollButtonActiveRect;
  3834.         if IsNullRect(Self.VRollButtonActiveRect)
  3835.         then Self.VRollButtonActiveRect := Self.VRollButtonRect;
  3836.         Self.VRollButtonDownRect := VRollButtonDownRect;
  3837.         if IsNullRect(Self.VRollButtonDownRect)
  3838.         then Self.VRollButtonDownRect := Self.VRollButtonActiveRect;
  3839.         Self.VRestoreButtonRect := VRestoreButtonRect;
  3840.         Self.VRestoreButtonActiveRect := VRestoreButtonActiveRect;
  3841.         if IsNullRect(Self.VRestoreButtonActiveRect)
  3842.         then Self.VRestoreButtonActiveRect := Self.VRestoreButtonRect;
  3843.         Self.VRestoreButtonDownRect := VRestoreButtonDownRect;
  3844.         if IsNullRect(Self.VRestoreButtonDownRect)
  3845.         then Self.VRestoreButtonDownRect := Self.VRestoreButtonActiveRect;
  3846.       end;
  3847. end;
  3848. procedure TbsSkinExPanel.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  3849. begin
  3850.   if FRollState and not StopCheckSize
  3851.   then
  3852.     begin
  3853.       if (FRollKind = rkRollHorizontal) and (AWidth <> GetRollWidth)
  3854.       then AWidth := GetRollWidth
  3855.       else
  3856.       if (FRollKind = rkRollVertical) and (AHeight <> GetRollHeight)
  3857.       then AHeight := GetRollHeight
  3858.     end;
  3859.   inherited;
  3860. end;
  3861. procedure TbsSkinExPanel.CMTextChanged;
  3862. begin
  3863.   inherited;
  3864.   RePaint;
  3865. end;
  3866. procedure TbsSkinExPanel.SetShowRollButton(Value: Boolean);
  3867. begin
  3868.   FShowRollButton := Value;
  3869.   RePaint;
  3870. end;
  3871. procedure TbsSkinExPanel.SetShowCloseButton(Value: Boolean);
  3872. begin
  3873.   FShowCloseButton := Value;
  3874.   RePaint;
  3875. end;
  3876. function TbsSkinExPanel.GetRollWidth: Integer;
  3877. begin
  3878.   if FIndex = -1
  3879.   then
  3880.     Result := FDefaultCaptionHeight
  3881.   else
  3882.     Result := RectWidth(RollHSkinRect);
  3883. end;
  3884. function TbsSkinExPanel.GetRollHeight: Integer;
  3885. begin
  3886.   if FIndex = -1
  3887.   then
  3888.     Result := FDefaultCaptionHeight
  3889.   else
  3890.     Result := RectHeight(RollVSkinRect);
  3891. end;
  3892. procedure TbsSkinExPanel.SetRollKind(Value: TbsExPanelRollKind);
  3893. begin
  3894.   FRollKind := Value;
  3895.   RePaint;
  3896. end;
  3897. procedure TbsSkinExPanel.SetDefaultCaptionHeight;
  3898. begin
  3899.   FDefaultCaptionHeight := Value;
  3900.   if FIndex = -1
  3901.   then
  3902.     begin
  3903.       RePaint;
  3904.       ReAlign;
  3905.     end
  3906. end;
  3907. procedure TbsSkinExPanel.CreateControlDefaultImage(B: TBitMap);
  3908. var
  3909.   R, CR: TRect;
  3910.   GlyphNum, BW, CROffset, TX, TY, GX, GY: Integer;
  3911.   F: TLogFont;
  3912. begin
  3913.   BW := FDefaultCaptionHeight - 6;
  3914.   R := Rect(0, 0, Width, Height);
  3915.   if FRollState and (FRollKind = rkRollHorizontal)
  3916.   then
  3917.     with B.Canvas do
  3918.     begin
  3919.       Brush.Color := clBtnFace;
  3920.       FillRect(R);
  3921.       CR := R;
  3922.       Frame3D(B.Canvas, R, clBtnShadow, clBtnShadow, 1);
  3923.       Frame3D(B.Canvas, R, clBtnHighLight, clBtnFace, 1);
  3924.       CROffset := 0;
  3925.       if FShowCloseButton
  3926.       then
  3927.         begin
  3928.           begin
  3929.             Buttons[0].R := Rect(3, 3, 3 + BW, 3 + BW);
  3930.             CROffset := CROffset + RectHeight(Buttons[0].R);
  3931.           end;
  3932.         end
  3933.       else
  3934.         Buttons[0].R := Rect(0, 0, 0, 3);
  3935.       if FShowRollButton
  3936.       then
  3937.         begin
  3938.           Buttons[1].R := Rect(3, Buttons[0].R.Bottom, 3 + BW, Buttons[0].R.Bottom + BW);
  3939.           CROffset := CROffset + RectHeight(Buttons[1].R);
  3940.         end
  3941.       else
  3942.         Buttons[1].R := Rect(0, 0, 0, 0);
  3943.       //
  3944.       Font := DefaultFont;
  3945.       if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  3946.       then
  3947.         Font.Charset := SkinData.ResourceStrData.CharSet;
  3948.         
  3949.       GetObject(Font.Handle, SizeOf(F), @F);
  3950.       F.lfEscapement := round(900);
  3951.       Font.Handle := CreateFontIndirect(F);
  3952.       Inc(CR.Top, CROffset + 2);
  3953.       TX := CR.Left + RectWidth(CR) div 2 - TextHeight(Caption) div 2;
  3954.       TY := CR.Bottom - 2 ;
  3955.       Brush.Style := bsClear;
  3956.       if not FGlyph.Empty
  3957.       then
  3958.         begin
  3959.           GX := CR.Left + RectWidth(CR) div 2 - FGlyph.Width div 2;
  3960.           GY := CR.Bottom - FGlyph.Height - 2;
  3961.           GlyphNum := 1;
  3962.           if not Enabled and (NumGlyphs = 2) then GlyphNum := 2;
  3963.           DrawGlyph(B.Canvas, GX, GY, FGlyph, NumGlyphs, GlyphNum);
  3964.           TY := TY - FGlyph.Height - FSpacing - 2;
  3965.         end;
  3966.       TextRect(CR, TX, TY, Caption);
  3967.       //
  3968.     end
  3969.   else
  3970.     with B.Canvas do
  3971.     begin
  3972.       Frame3D(B.Canvas, R, clBtnShadow, clBtnShadow, 1);
  3973.       Brush.Color := clBtnFace;
  3974.       FillRect(R);
  3975.       CR := Rect(0, 0, Width, FDefaultCaptionHeight);
  3976.       CROffset := 0;
  3977.       Frame3D(B.Canvas, CR, clBtnShadow, clBtnShadow, 1);
  3978.       Frame3D(B.Canvas, CR, clBtnHighLight, clBtnFace, 1);
  3979.       if FShowCloseButton
  3980.       then
  3981.         begin
  3982.           Buttons[0].R := Rect(Width - BW - 2, 3, Width - 2, 3 + BW);
  3983.           CROffset := CROffset + RectWidth(Buttons[1].R);
  3984.         end
  3985.       else
  3986.         Buttons[0].R := Rect(Width - 2, 0, 0, 0);
  3987.       if FShowRollButton
  3988.       then
  3989.         begin
  3990.           Buttons[1].R := Rect(Buttons[0].R.Left - BW, 3, Buttons[0].R.Left, 3 + BW);
  3991.           CROffset := CROffset + RectWidth(Buttons[1].R);
  3992.         end
  3993.       else
  3994.         Buttons[1].R := Rect(0, 0, 0, 0);
  3995.       //
  3996.       Inc(CR.Left, 2);
  3997.       Dec(CR.Right, CROffset + 2);
  3998.       //
  3999.       Brush.Style := bsClear;
  4000.       Font := DefaultFont;
  4001.       if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  4002.       then
  4003.         Font.Charset := SkinData.ResourceStrData.CharSet;
  4004.       //
  4005.       if not FGlyph.Empty
  4006.        then
  4007.          begin
  4008.            GX := CR.Left;
  4009.            GY := CR.Top + RectHeight(CR) div 2 - FGlyph.Height div 2;
  4010.            GlyphNum := 1;
  4011.            if not Enabled and (NumGlyphs = 2) then GlyphNum := 2;
  4012.            DrawGlyph(B.Canvas, GX, GY, FGlyph, NumGlyphs, GlyphNum);
  4013.            Inc(CR.Left, FGlyph.Width + FSpacing);
  4014.          end;
  4015.       BSDrawText2(B.Canvas, Caption, CR);
  4016.      end;
  4017.   if FShowCloseButton then DrawButton(B.Canvas, 0);
  4018.   if FShowRollButton then DrawButton(B.Canvas, 1);
  4019. end;
  4020. procedure TbsSkinExPanel.CreateControlSkinImage(B: TBitMap);
  4021. var
  4022.   CR: TRect;
  4023.   F: TLogFont;
  4024.   CROffset, BO, TX, TY, GX, GY, GlyphNum: Integer;
  4025. begin
  4026.   with B.Canvas.Font do
  4027.   begin
  4028.     if FUseSkinFont
  4029.     then
  4030.       begin
  4031.         Name := FontName;
  4032.         Style := FontStyle;
  4033.         Height := FontHeight;
  4034.       end
  4035.     else
  4036.       Assign(FDefaultFont);
  4037.     Color := FontColor;
  4038.   end;
  4039.   if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
  4040.   then
  4041.     B.Canvas.Font.Charset := SkinData.ResourceStrData.CharSet
  4042.   else
  4043.     B.Canvas.Font.CharSet := FDefaultFont.Charset;
  4044.   B.Canvas.Brush.Style := bsClear;
  4045.   if FRollState and (FRollKind = rkRollHorizontal)
  4046.   then
  4047.     begin
  4048.       CreateVSkinImage(RollTopOffset, RollBottomOffset,
  4049.         B, Picture, RollHSkinRect, GetRollWidth, Height);
  4050.       CR := RollHCaptionRect;
  4051.       Inc(CR.Bottom, Height - RectHeight(RollHSkinRect));
  4052.       CROffset := 0;
  4053.       BO := 0;
  4054.       if FShowCloseButton
  4055.       then
  4056.         begin
  4057.           begin
  4058.             Buttons[0].R := Rect(CR.Left, CR.Top,
  4059.               CR.Left + RectWidth(Self.CloseButtonRect),
  4060.               CR.Top + RectHeight(Self.CloseButtonRect));
  4061.             CROffset := CROffset + RectHeight(Buttons[0].R);
  4062.             BO := 2;
  4063.           end;
  4064.         end
  4065.       else
  4066.         Buttons[0].R := Rect(0, 0, 0, CR.Top);
  4067.       if FShowRollButton
  4068.       then
  4069.         begin
  4070.           Buttons[1].R := Rect(CR.Left, Buttons[0].R.Bottom + BO,
  4071.             CR.Left + RectWidth(Self.HRollButtonRect),
  4072.             Buttons[0].R.Bottom + RectHeight(Self.HRollButtonRect) + BO);
  4073.           CROffset := CROffset + RectHeight(Buttons[1].R) + BO;
  4074.         end
  4075.       else
  4076.         Buttons[1].R := Rect(0, 0, 0, 0);
  4077.       Inc(CR.Top, CROffset);
  4078.       GetObject(B.Canvas.Font.Handle, SizeOf(F), @F);
  4079.       F.lfEscapement := round(900);
  4080.       B.Canvas.Font.Handle := CreateFontIndirect(F);
  4081.       TX := CR.Left + RectWidth(CR) div 2 - B.Canvas.TextHeight(Caption) div 2;
  4082.       TY := CR.Bottom;
  4083.       if not FGlyph.Empty
  4084.        then
  4085.          begin
  4086.            GX := CR.Left + RectWidth(CR) div 2 - FGlyph.Width div 2;
  4087.            GY := CR.Bottom - FGlyph.Height;
  4088.            GlyphNum := 1;
  4089.            if not Enabled and (NumGlyphs = 2) then GlyphNum := 2;
  4090.            DrawGlyph(B.Canvas, GX, GY, FGlyph, NumGlyphs, GlyphNum);
  4091.            TY := TY - FGlyph.Height - FSpacing;
  4092.          end;
  4093.       B.Canvas.TextRect(CR, TX, TY, Caption);
  4094.     end
  4095.   else
  4096.     if FRollState and (FRollKind = rkRollVertical)
  4097.     then
  4098.       begin
  4099.         CreateHSkinImage(RollLeftOffset, RollRightOffset,
  4100.           B, Picture, RollVSkinRect, Width, GetRollHeight);
  4101.         CR := RollVCaptionRect;
  4102.         Inc(CR.Right, Width - RectWidth(RollVSkinRect));
  4103.         CROffset := 0;
  4104.         BO := 0;
  4105.         if FShowCloseButton
  4106.         then
  4107.          begin
  4108.            Buttons[0].R := Rect(CR.Right - RectWidth(CloseButtonRect), CR.Top,
  4109.              CR.Right, CR.Top + RectHeight(CloseButtonRect));
  4110.            CROffset := CROffset + RectWidth(Buttons[1].R);
  4111.            BO := 2;
  4112.          end
  4113.         else
  4114.           Buttons[0].R := Rect(CR.Right, 0, 0, 0);
  4115.         if FShowRollButton
  4116.         then
  4117.           begin
  4118.             Buttons[1].R := Rect(Buttons[0].R.Left - RectWidth(VRollButtonRect) - BO,
  4119.             CR.Top, Buttons[0].R.Left - BO, CR.Top + RectHeight(VRollButtonRect));
  4120.             CROffset := CROffset + RectWidth(Buttons[1].R) + BO;
  4121.           end
  4122.         else
  4123.           Buttons[1].R := Rect(0, 0, 0, 0);
  4124.         Dec(CR.Right, CROffset);
  4125.         if not FGlyph.Empty
  4126.         then
  4127.          begin
  4128.            GX := CR.Left;
  4129.            GY := CR.Top + RectHeight(CR) div 2 - FGlyph.Height div 2;
  4130.            GlyphNum := 1;
  4131.            if not Enabled and (NumGlyphs = 2) then GlyphNum := 2;
  4132.            DrawGlyph(B.Canvas, GX, GY, FGlyph, NumGlyphs, GlyphNum);
  4133.            Inc(CR.Left, FGlyph.Width + FSpacing);
  4134.          end;
  4135.         BSDrawText2(B.Canvas, Caption, CR);
  4136.       end
  4137.    else
  4138.      begin
  4139.        inherited;
  4140.        CR := CaptionRect;
  4141.        Inc(CR.Right, Width - RectWidth(SkinRect));
  4142.        CROffset := 0;
  4143.        BO := 0;
  4144.        if FShowCloseButton
  4145.        then
  4146.         begin
  4147.           Buttons[0].R := Rect(CR.Right - RectWidth(CloseButtonRect), CR.Top,
  4148.            CR.Right, CR.Top + RectHeight(CloseButtonRect));
  4149.           CROffset := CROffset + RectWidth(Buttons[1].R);
  4150.           BO := 2;
  4151.         end
  4152.        else
  4153.          Buttons[0].R := Rect(CR.Right, 0, 0, 0);
  4154.        if FShowRollButton
  4155.        then
  4156.          begin
  4157.            Buttons[1].R := Rect(Buttons[0].R.Left - RectWidth(VRollButtonRect) - BO,
  4158.            CR.Top, Buttons[0].R.Left - BO, CR.Top + RectHeight(VRollButtonRect));
  4159.            CROffset := CROffset + RectWidth(Buttons[1].R) + BO;
  4160.          end
  4161.        else
  4162.          Buttons[1].R := Rect(0, 0, 0, 0);
  4163.        Dec(CR.Right, CROffset);
  4164.        if not FGlyph.Empty
  4165.        then
  4166.          begin
  4167.            GX := CR.Left;
  4168.            GY := CR.Top + RectHeight(CR) div 2 - FGlyph.Height div 2;
  4169.            GlyphNum := 1;
  4170.            if not Enabled and (NumGlyphs = 2) then GlyphNum := 2;
  4171.            DrawGlyph(B.Canvas, GX, GY, FGlyph, NumGlyphs, GlyphNum);
  4172.            Inc(CR.Left, FGlyph.Width + FSpacing);
  4173.          end;
  4174.        BSDrawText2(B.Canvas, Caption, CR);
  4175.      end;
  4176.   if FShowCloseButton then DrawButton(B.Canvas, 0);
  4177.   if FShowRollButton then DrawButton(B.Canvas, 1);
  4178. end;
  4179. procedure TbsSkinExPanel.AdjustClientRect(var Rect: TRect);
  4180. begin
  4181.   inherited AdjustClientRect(Rect);
  4182.   if (FIndex <> -1) and not (csDesigning in ComponentState)
  4183.   then
  4184.     Rect := NewClRect
  4185.   else
  4186.     begin
  4187.       Rect.Top := Rect.Top + FDefaultCaptionHeight;
  4188.       Inc(Rect.Left, 1);
  4189.       Dec(Rect.Right, 1);
  4190.       Dec(Rect.Bottom, 1);
  4191.     end;
  4192. end;
  4193. procedure TbsSkinExPanel.ShowControls;
  4194. var
  4195.   i: Integer;
  4196. begin
  4197.   if VisibleControls = nil then Exit;
  4198.   for i := 0 to VisibleControls.Count - 1 do
  4199.     TControl(VisibleControls.Items[i]).Visible := True;
  4200.   VisibleControls.Clear;
  4201.   VisibleControls.Free;
  4202.   VisibleControls := nil;
  4203. end;
  4204. procedure TbsSkinExPanel.HideControls;
  4205. var
  4206.   i: Integer;
  4207. begin
  4208.   if VisibleControls <> nil then VisibleControls.Free;
  4209.   VisibleControls := TList.Create;
  4210.   VisibleControls.Clear;
  4211.   for i := 0 to ControlCount - 1 do
  4212.   begin
  4213.     if Controls[i].Visible
  4214.     then
  4215.       begin
  4216.         VisibleControls.Add(Controls[i]);
  4217.         Controls[i].Visible := False;
  4218.       end;
  4219.   end;
  4220. end;
  4221. procedure TbsSkinExPanel.SetRollState;
  4222. begin
  4223.   if FRollState = Value then Exit;
  4224.   FRollState := Value;
  4225.   StopCheckSize := True;
  4226.   if FRollState
  4227.   then
  4228.     begin
  4229.       HideControls;
  4230.       case FRollKind of
  4231.         rkRollVertical:
  4232.           if FRealHeight = 0 then
  4233.           begin
  4234.             FRealHeight := Height;
  4235.             Height := GetRollHeight;
  4236.           end;
  4237.         rkRollHorizontal:
  4238.           if FRealWidth = 0 then
  4239.           begin
  4240.             FRealWidth := Width;
  4241.             Width := GetRollWidth;
  4242.           end;
  4243.       end;
  4244.     end
  4245.   else
  4246.     begin
  4247.       case FRollKind of
  4248.         rkRollVertical:
  4249.           begin
  4250.             Height := FRealHeight;
  4251.             FRealHeight := 0;
  4252.           end;
  4253.         rkRollHorizontal:
  4254.           begin
  4255.             Width := FRealWidth;
  4256.             FRealWidth := 0;
  4257.           end;
  4258.       end;
  4259.       ShowControls;
  4260.     end;
  4261.   StopCheckSize := False;
  4262.   if not (csDesigning in ComponentState) and
  4263.     Assigned(FOnChangeRollState)
  4264.   then
  4265.     FOnChangeRollState(Self);
  4266. end;
  4267. procedure TbsSkinExPanel.CMMouseEnter;
  4268. begin
  4269.   inherited;
  4270.   if (csDesigning in ComponentState) then Exit;
  4271.   TestActive(-1, -1);
  4272. end;
  4273. procedure TbsSkinExPanel.CMMouseLeave;
  4274. var
  4275.   i: Integer;
  4276. begin
  4277.   inherited;
  4278.   if (csDesigning in ComponentState) then Exit;
  4279.   for i := 0 to 1 do
  4280.     if Buttons[i].MouseIn
  4281.     then
  4282.        begin
  4283.          Buttons[i].MouseIn := False;
  4284.          DrawButton(Canvas, i);
  4285.        end;
  4286. end;
  4287. procedure TbsSkinExPanel.MouseDown;
  4288. begin
  4289.   TestActive(X, Y);
  4290.   if ActiveButton <> -1
  4291.   then
  4292.     begin
  4293.       CaptureButton := ActiveButton;
  4294.       ButtonDown(ActiveButton, X, Y);
  4295.     end;
  4296.   inherited;
  4297. end;
  4298. procedure TbsSkinExPanel.MouseUp;
  4299. begin
  4300.   inherited;
  4301.   if CaptureButton <> -1
  4302.   then ButtonUp(CaptureButton, X, Y);