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

Delphi控件源码

开发平台:

Delphi

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