home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d56 / RMCTL.ZIP / rmTVComboBox.pas < prev    next >
Pascal/Delphi Source File  |  2001-06-22  |  32KB  |  1,092 lines

  1. {================================================================================
  2. Copyright (C) 1997-2001 Mills Enterprise
  3.  
  4. Unit     : rmTVComboBox
  5. Purpose  : TreeView and PathTreeView based ComboBoxes
  6. Date     : 02-01-2000
  7. Author   : Ryan J. Mills
  8. Version  : 1.80
  9. ================================================================================}
  10.  
  11. unit rmTVComboBox;
  12.  
  13. interface
  14.  
  15. {$I CompilerDefines.INC}
  16.  
  17. uses
  18.    Windows, Messages, Classes, Controls, ComCtrls, CommCtrl, rmBtnEdit,
  19.    rmPathTreeView, ImgList, rmScrnCtrls {$ifDef rmDebug}, rmMsgList{$endif};
  20.  
  21. type
  22.    TrmCustomComboTreeView = class(TrmCustomBtnEdit)
  23.    private
  24.    { Private declarations }
  25.      FScreenTreeview: TrmCustomScreenTreeView;
  26.      fDropDownWidth: integer;
  27.      fSelectedNode: TTreeNode;
  28.      FDropDownHeight: integer;
  29.      FOnDropDown: TNotifyEvent;
  30.      fChanged: TTVChangedEvent;
  31.      fChanging: TTVChangingEvent;
  32.      fLeafOnly: boolean;
  33.      fOnDestroy: TNotifyEvent;
  34. {$ifdef rmDebug}
  35.      fMsg: TrmMsgEvent;
  36. {$endif}
  37.  
  38.      procedure ToggleTreeView(Sender: TObject);
  39.  
  40.      procedure DoClick(Sender: TObject);
  41.      procedure DoMyKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  42.      procedure DoMyExit(Sender: Tobject);
  43.  
  44.      procedure CMFontchanged(var Message: TMessage); message CM_FontChanged;
  45.      procedure cmCancelMode(var Message:TCMCancelMode); Message cm_cancelMode;
  46.      procedure wmKillFocus(var Message:TMessage); message wm_KillFocus;
  47.  
  48.      function GetAutoExpand: boolean;
  49.      function GetCollapsedEvent: TTVExpandedEvent;
  50.      function GetCollapsingEvent: TTVCollapsingEvent;
  51.      function GetCompareEvent: TTVCompareEvent;
  52.      function GetExpandedEvent: TTVExpandedEvent;
  53.      function GetExpandingEvent: TTVExpandingEvent;
  54.      function GetImages: TCustomImageList;
  55.      function GetItems: TTreeNodes;
  56.      function GetSortType: TSortType;
  57.      function GetStateImages: TCustomImageList;
  58.  
  59.      procedure SetAutoExpand(const Value: boolean);
  60.      procedure SetCollapsedEvent(const Value: TTVExpandedEvent);
  61.      procedure SetCollapsingEvent(const Value: TTVCollapsingEvent);
  62.      procedure SetCompareEvent(const Value: TTVCompareEvent);
  63.      procedure SetExpandingEvent(const Value: TTVExpandingEvent);
  64.      procedure SetExpandedEvent(const Value: TTVExpandedEvent);
  65.      procedure SetImages(const Value: TCustomImageList);
  66.      procedure SetSelectedNode(const Value: TTreeNode);
  67.      procedure SetSortType(const Value: TSortType);
  68.      procedure SetStateImages(const Value: TCustomImageList);
  69.      procedure SetImageIndexEvent(const Value: TTVExpandedEvent);
  70.      procedure SetSelectedIndexEvent(const Value: TTVExpandedEvent);
  71.      function GetImageIndexEvent: TTVExpandedEvent;
  72.      function GetSelectedIndexEvent: TTVExpandedEvent;
  73.    protected
  74.    { Protected declarations }
  75.      procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  76.  
  77.      property AllowLeafOnly : boolean read fLeafOnly write fLeafOnly default false;
  78.      property AutoExpand: boolean read getAutoExpand write setAutoExpand;
  79.      property DropDownHeight: integer read FDropDownHeight write fDropDownHeight default 0;
  80.      property DropDownWidth: integer read fDropDownWidth write fDropDownWidth default 0;
  81.      property Images: TCustomImageList read GetImages write SetImages;
  82.      property Items: TTreeNodes read GetItems;
  83.      property SelectedNode: TTreeNode read fSelectedNode write SetSelectedNode;
  84.      property SortType: TSortType read GetSortType write SetSortType;
  85.      property StateImages: TCustomImageList read GetStateImages write SetStateImages;
  86.  
  87.      property OnChanged: TTVChangedEvent read fChanged write fChanged;
  88.      property OnChanging: TTVChangingEvent read fChanging write fChanging;
  89.      property OnCollapsing: TTVCollapsingEvent read GetCollapsingEvent write SetCollapsingEvent;
  90.      property OnCollapsed: TTVExpandedEvent read GetCollapsedEvent write SetCollapsedEvent;
  91.      property OnCompare: TTVCompareEvent read GetCompareEvent write SetCompareEvent;
  92.      property OnDropDown: TNotifyEvent read FOnDropDown write fOnDropDown;
  93.      property OnExpanding: TTVExpandingEvent read GetExpandingEvent write SetExpandingEvent;
  94.      property OnExpanded: TTVExpandedEvent read GetExpandedEvent write SetExpandedEvent;
  95.      property OnGetImageIndex : TTVExpandedEvent read GetImageIndexEvent write SetImageIndexEvent;
  96.      property OnGetSelectedIndex : TTVExpandedEvent read GetSelectedIndexEvent write SetSelectedIndexEvent;
  97.      property OnDestroy : TNotifyEvent read fOnDestroy write fOnDestroy;
  98.    public
  99.    { Public declarations }
  100.      constructor Create(AOwner: TComponent); override;
  101.      destructor Destroy; override;
  102.      procedure WndProc(var Message: TMessage); override;
  103.  
  104.      function CustomSort(SortProc: TTVCompare; Data: Longint): Boolean;
  105.      procedure FullExpand;
  106.      procedure FullCollapse;
  107. {$ifdef rmDebug}
  108.      property OnMessage:TrmMsgEvent read fMsg write fMsg;
  109. {$endif}
  110.    end;
  111.  
  112.    TrmComboTreeView = class(TrmCustomComboTreeView)
  113.    public
  114.    { Public declarations }
  115.      property Items;
  116.      property SelectedNode;
  117.    published
  118.    { Published declarations }
  119.      {$ifdef D4_OR_HIGHER}
  120.      property Anchors;
  121.      property Constraints;
  122.      {$endif}
  123.      property Enabled;
  124.      property Font;
  125.      property MaxLength;
  126.      property ParentColor;
  127.      property ParentCtl3D;
  128.      property ParentFont;
  129.      property ParentShowHint;
  130.      property PopupMenu;
  131.      property ShowHint;
  132.      property TabOrder;
  133.      property TabStop;
  134.      property Visible;
  135.  
  136.      property AllowLeafOnly;
  137.      property AutoExpand;
  138.      property DropDownHeight;
  139.      property DropDownWidth;
  140.      property Images;
  141.      property SortType;
  142.      property StateImages;
  143.      property OnDropDown;
  144.      property OnChanged;
  145.      property OnChanging;
  146.      property OnCollapsed;
  147.      property OnCollapsing;
  148.      property OnCompare;
  149.      property OnExpanding;
  150.      property OnExpanded;
  151.      property OnGetImageIndex;
  152.      property OnGetSelectedIndex;
  153.      property OnDestroy;
  154.    end;
  155.  
  156.    TrmCustomComboPathTreeView = class(TrmCustomBtnEdit)
  157.    private
  158.    { Private declarations }
  159.      FScreenTreeview: TrmCustomScreenPathTreeView;
  160.      fDropDownWidth: integer;
  161.      fSelectedNode: TrmTreeNode;
  162.      FDropDownHeight: integer;
  163.      FOnDropDown: TNotifyEvent;
  164.      fChanged: TrmTVChangedEvent;
  165.      fChanging: TrmTVChangingEvent;
  166.      fLeafOnly: boolean;
  167.      fOnDestroy: TNotifyEvent;
  168. {$ifdef rmDebug}
  169.      fMsg: TrmMsgEvent;
  170. {$endif}
  171.  
  172.      procedure ToggleTreeView(Sender: TObject);
  173.  
  174.      procedure DoClick(Sender: TObject);
  175.      procedure DoMyKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  176.      procedure DoMyExit(Sender: Tobject);
  177.  
  178.      procedure CMFontchanged(var Message: TMessage); message CM_FontChanged;
  179.      procedure cmCancelMode(var Message:TCMCancelMode); Message cm_cancelMode;
  180.      procedure wmKillFocus(var Message:TMessage); message wm_KillFocus;
  181.  
  182.      function GetAutoExpand: boolean;
  183.      function GetCollapsedEvent: TrmTVExpandedEvent;
  184.      function GetCollapsingEvent: TrmTVCollapsingEvent;
  185.      function GetCompareEvent: TrmTVCompareEvent;
  186.      function GetExpandedEvent: TrmTVExpandedEvent;
  187.      function GetExpandingEvent: TrmTVExpandingEvent;
  188.      function GetImages: TCustomImageList;
  189.      function GetItems: TrmTreeNodes;
  190.      function GetSepChar: Char;
  191.      function GetSortType: TSortType;
  192.      function GetStateImages: TCustomImageList;
  193.  
  194.      procedure SetAutoExpand(const Value: boolean);
  195.      procedure SetCollapsedEvent(const Value: TrmTVExpandedEvent);
  196.      procedure SetCollapsingEvent(const Value: TrmTVCollapsingEvent);
  197.      procedure SetCompareEvent(const Value: TrmTVCompareEvent);
  198.      procedure SetExpandingEvent(const Value: TrmTVExpandingEvent);
  199.      procedure SetExpandedEvent(const Value: TrmTVExpandedEvent);
  200.      procedure SetImages(const Value: TCustomImageList);
  201.      procedure SetSelectedNode(const Value: TrmTreeNode);
  202.      procedure SetSepChar(const Value: Char);
  203.      procedure SetSortType(const Value: TSortType);
  204.      procedure SetStateImages(const Value: TCustomImageList);
  205.      procedure SetImageIndexEvent(const Value: TrmTVExpandedEvent);
  206.      procedure SetSelectedIndexEvent(const Value: TrmTVExpandedEvent);
  207.      function GetImageIndexEvent: TrmTVExpandedEvent;
  208.      function GetSelectedIndexEvent: TrmTVExpandedEvent;
  209.    protected
  210.    { Protected declarations }
  211.      procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  212.  
  213.      property AllowLeafOnly : boolean read fLeafOnly write fLeafOnly default false;
  214.      property AutoExpand: boolean read getAutoExpand write setAutoExpand;
  215.      property DropDownHeight: integer read FDropDownHeight write fDropDownHeight default 0;
  216.      property DropDownWidth: integer read fDropDownWidth write fDropDownWidth default 0;
  217.      property Images: TCustomImageList read GetImages write SetImages;
  218.      property Items: TrmTreeNodes read GetItems;
  219.      property SelectedNode: TrmTreeNode read fSelectedNode write SetSelectedNode;
  220.      property SepChar: Char read GetSepChar write SetSepChar;
  221.      property SortType: TSortType read GetSortType write SetSortType;
  222.      property StateImages: TCustomImageList read GetStateImages write SetStateImages;
  223.  
  224.      property OnChanged: TrmTVChangedEvent read fChanged write fChanged;
  225.      property OnChanging: TrmTVChangingEvent read fChanging write fChanging;
  226.      property OnCollapsing: TrmTVCollapsingEvent read GetCollapsingEvent write SetCollapsingEvent;
  227.      property OnCollapsed: TrmTVExpandedEvent read GetCollapsedEvent write SetCollapsedEvent;
  228.      property OnCompare: TrmTVCompareEvent read GetCompareEvent write SetCompareEvent;
  229.      property OnDropDown: TNotifyEvent read FOnDropDown write fOnDropDown;
  230.      property OnExpanding: TrmTVExpandingEvent read GetExpandingEvent write SetExpandingEvent;
  231.      property OnExpanded: TrmTVExpandedEvent read GetExpandedEvent write SetExpandedEvent;
  232.      property OnGetImageIndex : TrmTVExpandedEvent read GetImageIndexEvent write SetImageIndexEvent;
  233.      property OnGetSelectedIndex : TrmTVExpandedEvent read GetSelectedIndexEvent write SetSelectedIndexEvent;
  234.      property OnDestroy : TNotifyEvent read fOnDestroy write fOnDestroy;
  235.    public
  236.    { Public declarations }
  237.      constructor Create(AOwner: TComponent); override;
  238.      destructor Destroy; override;
  239.      procedure WndProc(var Message: TMessage); override;
  240.  
  241.      function AddPathNode(Node: TrmTreeNode; Path: string): TrmTreeNode;
  242.      function FindPathNode(Path: string): TrmTreeNode;
  243.      function NodePath(Node: TrmTreeNode): string;
  244.      function CustomSort(SortProc: TTVCompare; Data: Longint): Boolean;
  245.      procedure FullExpand;
  246.      procedure FullCollapse;
  247. {$ifdef rmDebug}
  248.     property OnMessage:TrmMsgEvent read fMsg write fMsg;
  249. {$endif}
  250.    end;
  251.  
  252.    TrmComboPathTreeView = class(TrmCustomComboPathTreeView)
  253.    public
  254.    { Public declarations }
  255.      property Items;
  256.      property SelectedNode;
  257.    published
  258.    { Published declarations }
  259.  
  260.      {$ifdef D4_OR_HIGHER}
  261.      property Anchors;
  262.      property Constraints;
  263.      {$endif}
  264.      property Enabled;
  265.      property Font;
  266.      property MaxLength;
  267.      property ParentColor;
  268.      property ParentCtl3D;
  269.      property ParentFont;
  270.      property ParentShowHint;
  271.      property PopupMenu;
  272.      property ShowHint;
  273.      property TabOrder;
  274.      property TabStop;
  275.      property Visible;
  276.  
  277.      property AllowLeafOnly;
  278.      property AutoExpand;
  279.      property DropDownHeight;
  280.      property DropDownWidth;
  281.      property Images;
  282.      property SepChar;
  283.      property SortType;
  284.      property StateImages;
  285.      property OnDropDown;
  286.      property OnChanged;
  287.      property OnChanging;
  288.      property OnCollapsed;
  289.      property OnCollapsing;
  290.      property OnCompare;
  291.      property OnExpanding;
  292.      property OnExpanded;
  293.      property OnGetImageIndex;
  294.      property OnGetSelectedIndex;
  295.      property OnDestroy;
  296.    end;
  297.  
  298. implementation
  299.  
  300. uses forms;
  301.  
  302. { TrmCustomComboTreeView }
  303.  
  304. constructor TrmCustomComboTreeView.Create(AOwner: TComponent);
  305. begin
  306.    inherited create(aowner);
  307.  
  308.    fSelectedNode := nil;
  309.  
  310.    OnBtn1Click := ToggleTreeView;
  311.    OnExit := DoMyExit;
  312.    readonly := true;
  313.    fDropDownHeight := 0;
  314.    fDropDownWidth := 0;
  315.    fLeafOnly := false;
  316.  
  317.    with GetButton(1) do
  318.    begin
  319.       Font.name := 'Marlett';
  320.       font.size := 10;
  321.       Caption := '6';
  322.       Glyph := nil;
  323.    end;
  324.  
  325.    FScreenTreeview := TrmCustomScreenTreeView.create(nil);
  326.    with FScreenTreeview do
  327.    begin
  328.       width := self.width;
  329.       height := self.height * 8;
  330.       visible := false;
  331.       Parent := self;
  332.       ReadOnly := true;
  333.       OnClick := DoClick;
  334.       OnKeyDown := DoMyKeyDown;
  335.    end;
  336.    FScreenTreeview.hide;
  337. end;
  338.  
  339. function TrmCustomComboTreeView.CustomSort(SortProc: TTVCompare;
  340.   Data: Integer): Boolean;
  341. begin
  342.    result := FScreenTreeview.CustomSort(SortProc, Data);
  343. end;
  344.  
  345. procedure TrmCustomComboTreeView.DoClick(Sender: TObject);
  346. var
  347.    allowchange:boolean;
  348.    wPoint : TPoint;
  349.    HitTest : THitTests;
  350. begin
  351.    if not assigned(FScreenTreeview.Selected) then
  352.       exit;
  353.  
  354.    wPoint := FScreenTreeview.ScreenToClient(Mouse.CursorPos);
  355.    if not assigned(FScreenTreeview.GetNodeAt(wPoint.x, wPoint.y)) then
  356.       exit;
  357.  
  358.    HitTest := FScreenTreeview.GetHitTestInfoAt(wPoint.x, wPoint.y);
  359.    if not (htOnItem in HitTest) then
  360.       exit;
  361.  
  362.    if not (fLeafOnly) or ((fLeafOnly) and (FScreenTreeview.Selected.Count = 0)) then
  363.    begin
  364.       allowchange := true;
  365.       if Assigned(fChanging) then
  366.          fChanging(self, FScreenTreeview.Selected, allowchange);
  367.       if allowchange then
  368.       begin
  369.          fSelectedNode := FScreenTreeview.Selected;
  370.          FScreenTreeview.hide;
  371.          Text := fSelectedNode.Text;
  372.          if assigned(fChanged) then
  373.             fChanged(self, fSelectedNode);
  374.       end
  375.       else
  376.          FScreenTreeview.Selected := fSelectedNode;
  377.    end;
  378. end;
  379.  
  380. procedure TrmCustomComboTreeView.DoMyKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  381. var
  382.    AllowChange : boolean;
  383. begin
  384.    if (key = vk_escape) then
  385.    begin
  386.       FScreenTreeview.hide;
  387.       self.setfocus;
  388.       self.SelectAll;
  389.    end
  390.    else
  391.    if (key = vk_Return) then
  392.    begin
  393.       if not assigned(FScreenTreeview.Selected) then
  394.          exit;
  395.  
  396.       if not (fLeafOnly) or ((fLeafOnly) and (FScreenTreeview.Selected.Count = 0)) then
  397.       begin
  398.          allowchange := true;
  399.          if Assigned(fChanging) then
  400.             fChanging(self, FScreenTreeview.Selected, allowchange);
  401.          if allowchange then
  402.          begin
  403.             fSelectedNode := FScreenTreeview.Selected;
  404.             FScreenTreeview.hide;
  405.             Text := fSelectedNode.Text;
  406.             if assigned(fChanged) then
  407.                fChanged(self, fSelectedNode);
  408.             self.setfocus;
  409.             self.SelectAll;
  410.          end
  411.          else
  412.             FScreenTreeview.Selected := fSelectedNode;
  413.       end;
  414.    end
  415. end;
  416.  
  417. procedure TrmCustomComboTreeView.DoMyExit(Sender: Tobject);
  418. begin
  419.    if FScreenTreeview.visible then
  420.       FScreenTreeview.visible := false;
  421. end;
  422.  
  423. procedure TrmCustomComboTreeView.FullCollapse;
  424. begin
  425.    FScreenTreeview.FullCollapse;  
  426. end;
  427.  
  428. procedure TrmCustomComboTreeView.FullExpand;
  429. begin
  430.    FScreenTreeview.FullExpand;
  431. end;
  432.  
  433. function TrmCustomComboTreeView.getAutoExpand: boolean;
  434. begin
  435.    result := FScreenTreeview.AutoExpand;
  436. end;
  437.  
  438. function TrmCustomComboTreeView.GetCollapsedEvent: TTVExpandedEvent;
  439. begin
  440.    Result := FScreenTreeview.OnCollapsed;
  441. end;
  442.  
  443. function TrmCustomComboTreeView.GetCollapsingEvent: TTVCollapsingEvent;
  444. begin
  445.    Result := FScreenTreeview.OnCollapsing;
  446. end;
  447.  
  448. function TrmCustomComboTreeView.GetCompareEvent: TTVCompareEvent;
  449. begin
  450.    Result := FScreenTreeview.OnCompare;
  451. end;
  452.  
  453. function TrmCustomComboTreeView.GetExpandedEvent: TTVExpandedEvent;
  454. begin
  455.    Result := FScreenTreeview.OnExpanded;
  456. end;
  457.  
  458. function TrmCustomComboTreeView.GetExpandingEvent: TTVExpandingEvent;
  459. begin
  460.    result := FScreenTreeview.OnExpanding;
  461. end;
  462.  
  463. function TrmCustomComboTreeView.GetImageIndexEvent: TTVExpandedEvent;
  464. begin
  465.    Result := FScreenTreeview.OnGetImageIndex;
  466. end;
  467.  
  468. function TrmCustomComboTreeView.GetImages: TCustomImageList;
  469. begin
  470.    result := FScreenTreeview.images;
  471. end;
  472.  
  473. function TrmCustomComboTreeView.GetItems: TTreeNodes;
  474. begin
  475.    Result := FScreenTreeview.Items;
  476. end;
  477.  
  478. function TrmCustomComboTreeView.GetSelectedIndexEvent: TTVExpandedEvent;
  479. begin
  480.    Result := FScreenTreeview.OnGetSelectedIndex;
  481. end;
  482.  
  483. function TrmCustomComboTreeView.GetSortType: TSortType;
  484. begin
  485.    Result := FScreenTreeview.SortType;
  486. end;
  487.  
  488. function TrmCustomComboTreeView.GetStateImages: TCustomImageList;
  489. begin
  490.    result := FScreenTreeview.StateImages;
  491. end;
  492.  
  493. procedure TrmCustomComboTreeView.KeyDown(var Key: Word;
  494.    Shift: TShiftState);
  495. begin
  496.    if ((Key = VK_DOWN) or (key = VK_UP)) and (ssAlt in Shift) then
  497.    begin
  498.       if not FScreenTreeview.visible then
  499.          ToggleTreeView(self)
  500.       else
  501.          FScreenTreeview.hide;
  502.    end
  503.    else
  504.       inherited KeyDown(Key, Shift);
  505. end;
  506.  
  507. procedure TrmCustomComboTreeView.setAutoExpand(const Value: boolean);
  508. begin
  509.    FScreenTreeview.AutoExpand := Value;
  510. end;
  511.  
  512. procedure TrmCustomComboTreeView.SetCollapsedEvent(
  513.    const Value: TTVExpandedEvent);
  514. begin
  515.    FScreenTreeview.OnCollapsed := Value;
  516. end;
  517.  
  518. procedure TrmCustomComboTreeView.SetCollapsingEvent(
  519.    const Value: TTVCollapsingEvent);
  520. begin
  521.    FScreenTreeview.OnCollapsing := Value;
  522. end;
  523.  
  524. procedure TrmCustomComboTreeView.SetCompareEvent(
  525.    const Value: TTVCompareEvent);
  526. begin
  527.    FScreenTreeview.OnCompare := Value;
  528. end;
  529.  
  530. procedure TrmCustomComboTreeView.SetExpandedEvent(
  531.    const Value: TTVExpandedEvent);
  532. begin
  533.    FScreenTreeview.OnExpanded := Value;
  534. end;
  535.  
  536. procedure TrmCustomComboTreeView.SetExpandingEvent(
  537.    const Value: TTVExpandingEvent);
  538. begin
  539.    FScreenTreeview.OnExpanding := Value;
  540. end;
  541.  
  542. procedure TrmCustomComboTreeView.SetImageIndexEvent(
  543.   const Value: TTVExpandedEvent);
  544. begin
  545.    FScreenTreeview.OnGetImageIndex := value;  
  546. end;
  547.  
  548. procedure TrmCustomComboTreeView.SetImages(const Value: TCustomImageList);
  549. begin
  550.    FScreenTreeview.Images := value;
  551. end;
  552.  
  553. procedure TrmCustomComboTreeView.SetSelectedIndexEvent(
  554.   const Value: TTVExpandedEvent);
  555. begin
  556.    FScreenTreeview.OnGetSelectedIndex := value;  
  557. end;
  558.  
  559. procedure TrmCustomComboTreeView.SetSelectedNode(const Value: TTreeNode);
  560. begin
  561.    fSelectedNode := Value;
  562.    if assigned(fSelectedNode) then
  563.       Text := fSelectedNode.Text;
  564. end;
  565.  
  566. procedure TrmCustomComboTreeView.SetSortType(const Value: TSortType);
  567. begin
  568.    FScreenTreeview.SortType := value;
  569. end;
  570.  
  571. procedure TrmCustomComboTreeView.SetStateImages(
  572.    const Value: TCustomImageList);
  573. begin
  574.    FScreenTreeview.StateImages := value;
  575. end;
  576.  
  577. procedure TrmCustomComboTreeView.ToggleTreeView(Sender: TObject);
  578. var
  579.    CP, SP: TPoint;
  580. begin
  581.    CP.X := Left;
  582.    CP.Y := Top + Height;
  583.    SP := parent.ClientToScreen(CP);
  584.  
  585.    SetFocus;
  586.    SelectAll;
  587.  
  588.    with FScreenTreeview do
  589.    begin
  590.       if fDropDownWidth = 0 then
  591.          Width := self.width
  592.       else
  593.          width := fDropDownWidth;
  594.  
  595.       if fDropDownHeight = 0 then
  596.          Height := self.Height * 8
  597.       else
  598.          Height := fDropDownHeight;
  599.  
  600.       try
  601.          Selected := fSelectedNode;
  602.          if assigned(Selected) then
  603.             Selected.MakeVisible;
  604.       except
  605.          Selected := nil;
  606.       end;
  607.       Left := SP.X;
  608.  
  609.       if assigned(screen.ActiveForm) then
  610.       begin
  611.         if (SP.Y + FScreenTreeview.height < screen.activeForm.Monitor.Height) then
  612.           FScreenTreeview.Top := SP.Y
  613.         else
  614.           FScreenTreeview.Top := (SP.Y - self.height) - FScreenTreeview.height;
  615.       end
  616.       else
  617.       begin
  618.         if (SP.Y + FScreenTreeview.height < screen.Height) then
  619.           FScreenTreeview.Top := SP.Y
  620.         else
  621.           FScreenTreeview.Top := (SP.Y - self.height) - FScreenTreeview.height;
  622.       end;
  623.  
  624.       Show;
  625.       SetWindowPos(handle, hwnd_topMost, 0, 0, 0, 0, swp_nosize or swp_NoMove);
  626.    end; { Calendar }
  627. end;
  628.  
  629. procedure TrmCustomComboTreeView.WndProc(var Message: TMessage);
  630. begin
  631. {$ifdef rmDebug}
  632.   if assigned(OnMessage) then
  633.   try
  634.      OnMessage(Message);
  635.   except
  636.   end;
  637. {$endif}
  638.  
  639.   case Message.Msg of
  640.     WM_CHAR,
  641.     WM_KEYDOWN,
  642.     WM_KEYUP   : if (FScreenTreeview.visible) then
  643.                  begin
  644.                       if GetCaptureControl = nil then
  645.                       begin
  646.                          Message.result := SendMessage(FScreenTreeview.Handle, message.msg, message.wParam, message.LParam);
  647.                          if message.result = 0 then exit;
  648.                       end;
  649.                  end;
  650.   end;
  651.   inherited WndProc(Message);
  652. end;
  653.  
  654. destructor TrmCustomComboTreeView.Destroy;
  655. begin
  656.   if assigned(fOnDestroy) then
  657.      fOnDestroy(self);
  658.   FScreenTreeview.free;
  659.   inherited;
  660. end;
  661.  
  662. procedure TrmCustomComboTreeView.wmKillFocus(var Message: TMessage);
  663. begin
  664.    inherited;
  665.    if FScreenTreeview.visible then
  666.       FScreenTreeview.Hide;
  667. end;
  668.  
  669. procedure TrmCustomComboTreeView.cmCancelMode(var Message: TCMCancelMode);
  670. begin
  671.    inherited;
  672.    if Message.Sender = fScreenTreeView then
  673.       exit;
  674.    if FScreenTreeview.visible then
  675.       FScreenTreeview.Hide;
  676. end;
  677.  
  678. procedure TrmCustomComboTreeView.CMFontchanged(var Message: TMessage);
  679. begin
  680.    inherited;
  681.    FScreenTreeview.Font.Assign(self.font);  
  682. end;
  683.  
  684. { TrmCustomComboPathTreeView }
  685.  
  686. function TrmCustomComboPathTreeView.AddPathNode(Node: TrmTreeNode;
  687.    Path: string): TrmTreeNode;
  688. begin
  689.    result := FScreenTreeview.AddPathNode(Node, Path);
  690. end;
  691.  
  692. constructor TrmCustomComboPathTreeView.Create(AOwner: TComponent);
  693. begin
  694.    inherited create(aowner);
  695.  
  696.    fSelectedNode := nil;
  697.  
  698.    OnBtn1Click := ToggleTreeView;
  699.    OnExit := DoMyExit;
  700.    readonly := true;
  701.    fDropDownHeight := 0;
  702.    fDropDownWidth := 0;
  703.    fLeafOnly := false;
  704.  
  705.    with GetButton(1) do
  706.    begin
  707.       Font.name := 'Marlett';
  708.       font.size := 10;
  709.       Caption := '6';
  710.       Glyph := nil;
  711.    end;
  712.  
  713.    FScreenTreeview := TrmCustomScreenPathTreeView.create(nil);
  714.    with FScreenTreeview do
  715.    begin
  716.       width := self.width;
  717.       height := self.height * 8;
  718.       visible := false;
  719.       Parent := self;
  720.       ReadOnly := true;
  721.       OnClick := DoClick;
  722.       OnKeyDown := DoMyKeyDown;
  723.    end;
  724.    FScreenTreeview.hide;
  725. end;
  726.  
  727. function TrmCustomComboPathTreeView.CustomSort(SortProc: TTVCompare;
  728.   Data: Integer): Boolean;
  729. begin
  730.    result := FScreenTreeview.CustomSort(SortProc, Data);
  731. end;
  732.  
  733. procedure TrmCustomComboPathTreeView.DoClick(Sender: TObject);
  734. var
  735.    allowchange:boolean;
  736.    wPoint : TPoint;
  737.    HitTest : THitTests;
  738. begin
  739.    if not assigned(FScreenTreeview.Selected) then
  740.       exit;
  741.  
  742.    wPoint := FScreenTreeview.ScreenToClient(Mouse.CursorPos);
  743.    if not assigned(FScreenTreeview.GetNodeAt(wPoint.x, wPoint.y)) then
  744.       exit;
  745.  
  746.    HitTest := FScreenTreeview.GetHitTestInfoAt(wPoint.x, wPoint.y);
  747.    if not (htOnItem in HitTest) then
  748.       exit;
  749.  
  750.    if not (fLeafOnly) or ((fLeafOnly) and (FScreenTreeview.Selected.Count = 0)) then
  751.    begin
  752.       allowchange := true;
  753.       if Assigned(fChanging) then
  754.          fChanging(self, FScreenTreeview.Selected, allowchange);
  755.       if allowchange then
  756.       begin
  757.          fSelectedNode := FScreenTreeview.Selected;
  758.          FScreenTreeview.hide;
  759.          Text := fSelectedNode.Text;
  760.          if assigned(fChanged) then
  761.             fChanged(self, fSelectedNode);
  762.       end
  763.       else
  764.          FScreenTreeview.Selected := fSelectedNode;
  765.    end;
  766. end;
  767.  
  768. procedure TrmCustomComboPathTreeView.DoMyKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  769. var
  770.    AllowChange : boolean;
  771. begin
  772.    if (key = vk_escape) then
  773.    begin
  774.       FScreenTreeview.hide;
  775.       self.setfocus;
  776.       self.SelectAll;
  777.    end
  778.    else
  779.    if (key = vk_Return) then
  780.    begin
  781.       if not assigned(FScreenTreeview.Selected) then
  782.          exit;
  783.  
  784.       if not (fLeafOnly) or ((fLeafOnly) and (FScreenTreeview.Selected.Count = 0)) then
  785.       begin
  786.          allowchange := true;
  787.          if Assigned(fChanging) then
  788.             fChanging(self, FScreenTreeview.Selected, allowchange);
  789.          if allowchange then
  790.          begin
  791.             fSelectedNode := FScreenTreeview.Selected;
  792.             FScreenTreeview.hide;
  793.             Text := fSelectedNode.Text;
  794.             if assigned(fChanged) then
  795.                fChanged(self, fSelectedNode);
  796.             self.setfocus;
  797.             self.SelectAll;
  798.          end
  799.          else
  800.             FScreenTreeview.Selected := fSelectedNode;
  801.       end;
  802.    end
  803. end;
  804.  
  805. procedure TrmCustomComboPathTreeView.DoMyExit(Sender: Tobject);
  806. begin
  807.    if FScreenTreeview.visible then
  808.       FScreenTreeview.visible := false;
  809. end;
  810.  
  811. function TrmCustomComboPathTreeView.FindPathNode(Path: string): TrmTreeNode;
  812. begin
  813.    result := FScreenTreeview.FindPathNode(Path);
  814. end;
  815.  
  816. procedure TrmCustomComboPathTreeView.FullCollapse;
  817. begin
  818.    FScreenTreeview.FullCollapse;  
  819. end;
  820.  
  821. procedure TrmCustomComboPathTreeView.FullExpand;
  822. begin
  823.    FScreenTreeview.FullExpand;
  824. end;
  825.  
  826. function TrmCustomComboPathTreeView.getAutoExpand: boolean;
  827. begin
  828.    result := FScreenTreeview.AutoExpand;
  829. end;
  830.  
  831. function TrmCustomComboPathTreeView.GetCollapsedEvent: TrmTVExpandedEvent;
  832. begin
  833.    Result := FScreenTreeview.OnCollapsed;
  834. end;
  835.  
  836. function TrmCustomComboPathTreeView.GetCollapsingEvent: TrmTVCollapsingEvent;
  837. begin
  838.    Result := FScreenTreeview.OnCollapsing;
  839. end;
  840.  
  841. function TrmCustomComboPathTreeView.GetCompareEvent: TrmTVCompareEvent;
  842. begin
  843.    Result := FScreenTreeview.OnCompare;
  844. end;
  845.  
  846. function TrmCustomComboPathTreeView.GetExpandedEvent: TrmTVExpandedEvent;
  847. begin
  848.    Result := FScreenTreeview.OnExpanded;
  849. end;
  850.  
  851. function TrmCustomComboPathTreeView.GetExpandingEvent: TrmTVExpandingEvent;
  852. begin
  853.    result := FScreenTreeview.OnExpanding;
  854. end;
  855.  
  856. function TrmCustomComboPathTreeView.GetImageIndexEvent: TrmTVExpandedEvent;
  857. begin
  858.    Result := FScreenTreeview.OnGetImageIndex;
  859. end;
  860.  
  861. function TrmCustomComboPathTreeView.GetImages: TCustomImageList;
  862. begin
  863.    result := FScreenTreeview.images;
  864. end;
  865.  
  866. function TrmCustomComboPathTreeView.GetItems: TrmTreeNodes;
  867. begin
  868.    Result := FScreenTreeview.Items;
  869. end;
  870.  
  871. function TrmCustomComboPathTreeView.GetSelectedIndexEvent: TrmTVExpandedEvent;
  872. begin
  873.    Result := FScreenTreeview.OnGetSelectedIndex;
  874. end;
  875.  
  876. function TrmCustomComboPathTreeView.GetSepChar: Char;
  877. begin
  878.    Result := FScreenTreeview.SepChar;
  879. end;
  880.  
  881. function TrmCustomComboPathTreeView.GetSortType: TSortType;
  882. begin
  883.    Result := FScreenTreeview.SortType;
  884. end;
  885.  
  886. function TrmCustomComboPathTreeView.GetStateImages: TCustomImageList;
  887. begin
  888.    result := FScreenTreeview.StateImages;
  889. end;
  890.  
  891. procedure TrmCustomComboPathTreeView.KeyDown(var Key: Word;
  892.    Shift: TShiftState);
  893. begin
  894.    if ((Key = VK_DOWN) or (key = VK_UP)) and (ssAlt in Shift) then
  895.    begin
  896.       if not FScreenTreeview.visible then
  897.          ToggleTreeView(self)
  898.       else
  899.          FScreenTreeview.hide;
  900.    end
  901.    else
  902.       inherited KeyDown(Key, Shift);
  903. end;
  904.  
  905. function TrmCustomComboPathTreeView.NodePath(Node: TrmTreeNode): string;
  906. begin
  907.    result := FScreenTreeview.NodePath(Node);
  908. end;
  909.  
  910. procedure TrmCustomComboPathTreeView.setAutoExpand(const Value: boolean);
  911. begin
  912.    FScreenTreeview.AutoExpand := Value;
  913. end;
  914.  
  915. procedure TrmCustomComboPathTreeView.SetCollapsedEvent(
  916.    const Value: TrmTVExpandedEvent);
  917. begin
  918.    FScreenTreeview.OnCollapsed := Value;
  919. end;
  920.  
  921. procedure TrmCustomComboPathTreeView.SetCollapsingEvent(
  922.    const Value: TrmTVCollapsingEvent);
  923. begin
  924.    FScreenTreeview.OnCollapsing := Value;
  925. end;
  926.  
  927. procedure TrmCustomComboPathTreeView.SetCompareEvent(
  928.    const Value: TrmTVCompareEvent);
  929. begin
  930.    FScreenTreeview.OnCompare := Value;
  931. end;
  932.  
  933. procedure TrmCustomComboPathTreeView.SetExpandedEvent(
  934.    const Value: TrmTVExpandedEvent);
  935. begin
  936.    FScreenTreeview.OnExpanded := Value;
  937. end;
  938.  
  939. procedure TrmCustomComboPathTreeView.SetExpandingEvent(
  940.    const Value: TrmTVExpandingEvent);
  941. begin
  942.    FScreenTreeview.OnExpanding := Value;
  943. end;
  944.  
  945. procedure TrmCustomComboPathTreeView.SetImageIndexEvent(
  946.   const Value: TrmTVExpandedEvent);
  947. begin
  948.    FScreenTreeview.OnGetImageIndex := value;
  949. end;
  950.  
  951. procedure TrmCustomComboPathTreeView.SetImages(const Value: TCustomImageList);
  952. begin
  953.    FScreenTreeview.Images := value;
  954. end;
  955.  
  956. procedure TrmCustomComboPathTreeView.SetSelectedIndexEvent(
  957.   const Value: TrmTVExpandedEvent);
  958. begin
  959.    FScreenTreeview.OnGetSelectedIndex := value;
  960. end;
  961.  
  962. procedure TrmCustomComboPathTreeView.SetSelectedNode(const Value: TrmTreeNode);
  963. begin
  964.    fSelectedNode := Value;
  965.    if assigned(fSelectedNode) then
  966.       Text := fSelectedNode.Text;
  967. end;
  968.  
  969. procedure TrmCustomComboPathTreeView.SetSepChar(const Value: Char);
  970. begin
  971.    FScreenTreeview.SepChar := value;
  972. end;
  973.  
  974. procedure TrmCustomComboPathTreeView.SetSortType(const Value: TSortType);
  975. begin
  976.    FScreenTreeview.SortType := value;
  977. end;
  978.  
  979. procedure TrmCustomComboPathTreeView.SetStateImages(
  980.    const Value: TCustomImageList);
  981. begin
  982.    FScreenTreeview.StateImages := value;
  983. end;
  984.  
  985. procedure TrmCustomComboPathTreeView.ToggleTreeView(Sender: TObject);
  986. var
  987.    CP, SP: TPoint;
  988. begin
  989.    CP.X := Left;
  990.    CP.Y := Top + Height;
  991.    SP := parent.ClientToScreen(CP);
  992.  
  993.    SetFocus;
  994.    SelectAll;
  995.  
  996.    with FScreenTreeview do
  997.    begin
  998.       if fDropDownWidth = 0 then
  999.          Width := self.width
  1000.       else
  1001.          width := fDropDownWidth;
  1002.  
  1003.       if fDropDownHeight = 0 then
  1004.          Height := self.Height * 8
  1005.       else
  1006.          Height := fDropDownHeight;
  1007.  
  1008.       Selected := fSelectedNode;
  1009.       if assigned(selected) then
  1010.          Selected.MakeVisible;
  1011.  
  1012.       Left := SP.X;
  1013.       if assigned(screen.ActiveForm) then
  1014.       begin
  1015.         if (SP.Y + FScreenTreeview.height < screen.activeForm.Monitor.Height) then
  1016.           FScreenTreeview.Top := SP.Y
  1017.         else
  1018.           FScreenTreeview.Top := (SP.Y - self.height) - FScreenTreeview.height;
  1019.       end
  1020.       else
  1021.       begin
  1022.         if (SP.Y + FScreenTreeview.height < screen.Height) then
  1023.           FScreenTreeview.Top := SP.Y
  1024.         else
  1025.           FScreenTreeview.Top := (SP.Y - self.height) - FScreenTreeview.height;
  1026.       end;
  1027.  
  1028.       Show;
  1029.       SetWindowPos(handle, hwnd_topMost, 0, 0, 0, 0, swp_nosize or swp_NoMove);
  1030.    end; { Calendar }
  1031. end;
  1032.  
  1033. procedure TrmCustomComboPathTreeView.WndProc(var Message: TMessage);
  1034. begin
  1035. {$ifdef rmDebug}
  1036.   if assigned(OnMessage) then
  1037.   try
  1038.      OnMessage(Message);
  1039.   except
  1040.   end;
  1041. {$endif}
  1042.  
  1043.   case Message.Msg of
  1044.     WM_CHAR,
  1045.     WM_KEYDOWN,
  1046.     WM_KEYUP   : if (FScreenTreeview.visible) then
  1047.                  begin
  1048.                       if GetCaptureControl = nil then
  1049.                       begin
  1050.                          Message.result := SendMessage(FScreenTreeview.Handle, message.msg, message.wParam, message.LParam);
  1051.                          if message.result = 0 then exit;
  1052.                       end;
  1053.                  end;
  1054.   end;
  1055.   inherited WndProc(Message);
  1056. end;
  1057.  
  1058. destructor TrmCustomComboPathTreeView.Destroy;
  1059. begin
  1060.   if assigned(fOnDestroy) then
  1061.      fOnDestroy(self);
  1062.   FScreenTreeview.free;
  1063.   inherited;
  1064. end;
  1065.  
  1066. procedure TrmCustomComboPathTreeView.cmCancelMode(
  1067.   var Message: TCMCancelMode);
  1068. begin
  1069.    inherited;
  1070.    if Message.Sender = fScreenTreeView then
  1071.       exit;
  1072.  
  1073.    if FScreenTreeview.visible then
  1074.       FScreenTreeview.Hide;
  1075. end;
  1076.  
  1077. procedure TrmCustomComboPathTreeView.wmKillFocus(var Message: TMessage);
  1078. begin
  1079.    inherited;
  1080.    if FScreenTreeview.visible then
  1081.       FScreenTreeview.Hide;
  1082. end;
  1083.  
  1084. procedure TrmCustomComboPathTreeView.CMFontchanged(var Message: TMessage);
  1085. begin
  1086.    inherited;
  1087.    FScreenTreeview.Font.assign(self.Font);
  1088. end;
  1089.  
  1090. end.
  1091.  
  1092.