{*********************************************************} {* VPNABED.PAS 1.03 *} {*********************************************************} {* ***** BEGIN LICENSE BLOCK ***** *} {* Version: MPL 1.1 *} {* *} {* The contents of this file are subject to the Mozilla Public License *} {* Version 1.1 (the "License"); you may not use this file except in *} {* compliance with the License. You may obtain a copy of the License at *} {* http://www.mozilla.org/MPL/ *} {* *} {* Software distributed under the License is distributed on an "AS IS" basis, *} {* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License *} {* for the specific language governing rights and limitations under the *} {* License. *} {* *} {* The Original Code is TurboPower Visual PlanIt *} {* *} {* The Initial Developer of the Original Code is TurboPower Software *} {* *} {* Portions created by TurboPower Software Inc. are Copyright (C) 2002 *} {* TurboPower Software Inc. All Rights Reserved. *} {* *} {* Contributor(s): *} {* *} {* ***** END LICENSE BLOCK ***** *} {$I Vp.INC} unit VpNabEd; {-property editor for the NavBar} interface uses {$IFDEF LCL} LMessages, LCLProc, LCLType, LCLIntf, {$ELSE} Windows,Messages, {$ENDIF} SysUtils, Classes, Graphics, Controls, Forms, Dialogs, {$IFDEF VERSION6} {$IFNDEF LCL} DesignIntf, DesignEditors, {$ELSE} PropEdits, LazarusPackageIntf, FieldsEditor, ComponentEditors, {$ENDIF} {$ELSE} DsgnIntf, {$ENDIF} StdCtrls, ExtCtrls, Buttons, VpBase, VpNavBar; type {$IFNDEF LCL} {$IFDEF VERSION6} TProtectedSelList = class(TDesignerSelections); {$ENDIF} {$ENDIF} TVpNavBarEditor = class(TComponentEditor) procedure ExecuteVerb(Index : Integer); override; function GetVerb(Index : Integer) : string; override; function GetVerbCount : Integer; override; end; TfrmNavBarEd = class(TForm) pnlItems: TPanel; pnlFolders: TPanel; lbItems: TListBox; lbFolders: TListBox; Panel1: TPanel; btnItemAdd: TSpeedButton; btnItemDelete: TSpeedButton; btnItemUp: TSpeedButton; btnItemDown: TSpeedButton; Panel4: TPanel; Label2: TLabel; Panel5: TPanel; btnFolderAdd: TSpeedButton; btnFolderDelete: TSpeedButton; btnFolderUp: TSpeedButton; btnFolderDown: TSpeedButton; Panel6: TPanel; Label1: TLabel; pnlImages: TPanel; Panel8: TPanel; Label3: TLabel; lbImages: TListBox; procedure FormCreate(Sender: TObject); procedure FormResize(Sender: TObject); procedure lbFoldersClick(Sender: TObject); procedure lbItemsMeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); procedure lbItemsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure lbImagesDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure lbImagesClick(Sender: TObject); procedure btnItemUpClick(Sender: TObject); procedure btnItemDownClick(Sender: TObject); procedure btnFolderUpClick(Sender: TObject); procedure btnFolderDownClick(Sender: TObject); procedure btnItemDeleteClick(Sender: TObject); procedure btnFolderDeleteClick(Sender: TObject); procedure btnFolderAddClick(Sender: TObject); procedure btnItemAddClick(Sender: TObject); procedure lbItemsClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private RefreshTimer: TTimer; {$IFDEF VERSION5} {$IFDEF VERSION6} {$IFNDEF LCL} procedure SelectList(SelList : TDesignerSelections); {$ENDIF} {$ELSE} procedure SelectList(SelList : TDesignerSelectionList); {$ENDIF} {$ELSE} procedure SelectList(SelList : TComponentList); {$ENDIF} procedure OnTimer(Sender: TObject); public { Public declarations } Bar : TVpNavBar; Designer : TIDesigner; procedure PopulateFolderList; procedure PopulateItemList; end; var frmNavEd: TfrmNavBarEd; implementation {$IFDEF LCL} {$R *.lfm} {$ELSE} {$R *.DFM} {$ENDIF} {$IFDEF VERSION6} procedure EditNavBar(Designer : TIDesigner; Bar : TVpNavBar); {$ELSE} procedure EditNavBar(Designer : TIFormDesigner; Bar : TVpNavBar); {$ENDIF} var i : Integer; begin frmNavEd := TfrmNavBarEd.Create(Application); frmNavEd.Bar := Bar; frmNavEd.PopulateFolderList; frmNavEd.Designer := Designer; if Bar.Images <> nil then begin frmNavEd.lbImages.ItemHeight := Bar.Images.Height + 4; for i := 0 to pred(Bar.Images.Count) do frmNavEd.lbImages.Items.Add(IntToStr(i)); end; frmNavEd.Show; end; {*** TVpNavBarEditor ***} procedure TVpNavBarEditor.ExecuteVerb(Index : Integer); begin if Index = 0 then EditNavBar(Designer, (Component as TVpNavBar)); end; function TVpNavBarEditor.GetVerb(Index : Integer) : string; begin if Index = 0 then Result := 'Layout Tool...'; end; function TVpNavBarEditor.GetVerbCount : Integer; begin Result := 1; end; {*** TfrmNavBarEd ***} procedure TfrmNavBarEd.FormCreate(Sender: TObject); begin Top := (Screen.Height - Height) div 3; Left := (Screen.Width - Width) div 2; RefreshTimer := TTimer.Create(Self); RefreshTimer.Interval := 1000; RefreshTimer.OnTimer := OnTimer; RefreshTimer.Enabled := true; end; {=====} procedure TfrmNavBarEd.FormClose(Sender: TObject; var Action: TCloseAction); begin RefreshTimer.Free; Release; end; {=====} { Changed} { Could not find a way to get notification from the IDE that a change had } { been made to the component outside of the component editor, so I used a } { timer } procedure TfrmNavBarEd.OnTimer(Sender: TObject); var S : string; begin if Bar.ActiveFolder < 0 then exit; { update folder } S := Bar.Folders[Bar.ActiveFolder].Caption; if S = '' then S := Bar.Folders[Bar.ActiveFolder].Name; lbFolders.Items[Bar.ActiveFolder] := S; if (lbItems.ItemIndex > -1) then begin S := lbItems.Items.Strings[lbItems.ItemIndex]; PopulateItemList; if S <> '' then lbItems.ItemIndex := lbItems.Items.IndexOf(S); end; end; {=====} procedure TfrmNavBarEd.FormResize(Sender: TObject); begin pnlFolders.Width := (pnlItems.Width + pnlFolders.Width) div 2; if Bar.Images <> nil then begin pnlImages.Height := 25 + (5 * (Bar.Images.Height div 3)); lbImages.Columns := lbImages.Width div Bar.Images.Width; {Allow for scrollbar if excessive number of images} if (lbImages.Width >= Bar.Images.Width) then pnlImages.Height := pnlImages.Height + 20; end; end; {=====} procedure TfrmNavBarEd.PopulateFolderList; var I : Integer; S : string; begin lbFolders.Clear; for I := 0 to Pred(Bar.FolderCount) do begin S := Bar.Folders[I].Caption; if S = '' then S := Bar.Folders[I].Name; lbFolders.Items.AddObject(S, Bar.Folders[I]); end; end; {=====} procedure TfrmNavBarEd.PopulateItemList; var I : Integer; S : string; begin lbItems.Clear; if lbFolders.ItemIndex = -1 then exit; with Bar.Folders[lbFolders.ItemIndex] do for I := 0 to pred(ItemCount) do begin S := Items[I].Caption; if S = '' then S := Items[I].Name; lbItems.Items.AddObject(S,Items[i]); end; end; {=====} procedure TfrmNavBarEd.lbFoldersClick(Sender: TObject); var {$IFDEF VERSION5} {$IFDEF VERSION6} {$IFNDEF LCL} SelList : TDesignerSelections; {$ENDIF} {$ELSE} SelList : TDesignerSelectionList; {$ENDIF} {$ELSE} SelList : TComponentList; {$ENDIF} i : Integer; begin {$IFNDEF LCL} PopulateItemList; Bar.ActiveFolder := lbFolders.ItemIndex; {$IFDEF VERSION5} {$IFDEF VERSION6} SelList := TDesignerSelections.Create; {$ELSE} SelList := TDesignerSelectionList.Create; {$ENDIF} {$ELSE} SelList := TComponentList.Create; {$ENDIF} for i := 0 to pred(lbFolders.Items.Count) do if lbFolders.Selected[i] then begin {$IFDEF VERSION6} TProtectedSelList(SelList).Add(TComponent(lbFolders.Items.Objects[i])); {$ELSE} SelList.Add(TComponent(lbFolders.Items.Objects[i])); {$ENDIF} Bar.FolderCollection.DoOnItemSelected(I); end; if not Bar.FolderCollection.ReadOnly then begin {$IFDEF VERSION6} btnFolderUp.Enabled := TProtectedSelList(SelList).Count = 1; {$ELSE} btnFolderUp.Enabled := SelList.Count = 1; {$ENDIF} btnFolderDown.Enabled := btnFolderUp.Enabled; btnFolderDelete.Enabled := btnFolderUp.Enabled; end; {$IFDEF VERSION6} if TProtectedSelList(SelList).Count > 0 then {$ELSE} if SelList.Count > 0 then {$ENDIF} SelectList(SelList); {$ENDIF} end; {=====} procedure TfrmNavBarEd.lbItemsMeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); begin if (Bar.Images <> nil) then Height := Bar.Images.Height + 4; end; {=====} procedure TfrmNavBarEd.lbItemsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with TListBox(Control).Canvas do FillRect(Rect); if (Bar.Images <> nil) and (TVpNavBtnItem(lbItems.Items.Objects[Index]).IconIndex > -1) and (TVpNavBtnItem(lbItems.Items.Objects[Index]).IconIndex < Bar.Images.Count) then begin Bar.Images.Draw(TListBox(Control).Canvas, Rect.Right - Bar.Images.Width, Rect.Top, TVpNavBtnItem(lbItems.Items.Objects[Index]).IconIndex); with TListBox(Control).Canvas do TextOut(Rect.Left + 2, Rect.Top + (Rect.Bottom - Rect.Top) div 3, TListBox(Control).Items[Index]); end else with TListBox(Control).Canvas do TextOut(Rect.Left + 2, Rect.Top, TListBox(Control).Items[Index]); end; {=====} procedure TfrmNavBarEd.lbImagesDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with TListBox(Control).Canvas do FillRect(Rect); if (Bar.Images <> nil) then Bar.Images.Draw(TListBox(Control).Canvas, Rect.Left + 1, Rect.Top + 1, Index); end; {=====} procedure TfrmNavBarEd.lbItemsClick(Sender: TObject); var {$IFDEF VERSION5} {$IFDEF VERSION6} {$IFNDEF LCL} SelList : TDesignerSelections; {$ENDIF} {$ELSE} SelList : TDesignerSelectionList; {$ENDIF} {$ELSE} SelList : TComponentList; {$ENDIF} i : Integer; begin {$IFNDEF LCL} if (lbItems.ItemIndex <> -1) then begin lbImages.ItemIndex := TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]).IconIndex; {$IFDEF VERSION5} {$IFDEF VERSION6} SelList := TDesignerSelections.Create; {$ELSE} SelList := TDesignerSelectionList.Create; {$ENDIF} {$ELSE} SelList := TComponentList.Create; {$ENDIF} for i := 0 to pred(lbItems.Items.Count) do if lbItems.Selected[i] then begin {$IFDEF VERSION6} TProtectedSelList(SelList).Add(TComponent(lbItems.Items.Objects[i])); {$ELSE} SelList.Add(TComponent(lbItems.Items.Objects[i])); {$ENDIF} Bar.Folders[Bar.ActiveFolder].ItemCollection.DoOnItemSelected(I); end; if not Bar.Folders[Bar.ActiveFolder].ItemCollection.ReadOnly then begin {$IFDEF VERSION6} btnItemUp.Enabled := TProtectedSelList(SelList).Count = 1; {$ELSE} btnItemUp.Enabled := SelList.Count = 1; {$ENDIF} btnItemDown.Enabled := btnItemUp.Enabled; btnItemDelete.Enabled := btnItemUp.Enabled; end; {$IFDEF VERSION6} if TProtectedSelList(SelList).Count > 0 then {$ELSE} if SelList.Count > 0 then {$ENDIF} SelectList(SelList); end; {$ENDIF} end; {=====} procedure TfrmNavBarEd.lbImagesClick(Sender: TObject); begin if (lbImages.ItemIndex <> -1) and (lbItems.ItemIndex <> -1) then begin TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]).IconIndex := lbImages.ItemIndex; lbItems.Invalidate; if assigned(Designer) then Designer.Modified; end; end; {=====} procedure TfrmNavBarEd.btnItemUpClick(Sender: TObject); var SaveItemIndex : Integer; Item: TVpNavBtnItem; begin if (lbItems.ItemIndex > 0) then begin SaveItemIndex := lbItems.ItemIndex; Item := TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]); if Item.Index > 0 then Item.Index := Item.Index - 1; if Assigned(Designer) then Designer.Modified; PopulateItemList; lbItems.ItemIndex := SaveItemIndex - 1; end; end; {=====} procedure TfrmNavBarEd.btnItemDownClick(Sender: TObject); var Item: TVpNavBtnItem; begin if (lbItems.ItemIndex > -1) then begin Item := TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]); if Item.Index < Pred(lbItems.Items.Count) then Item.Index := Item.Index + 1; if Assigned(Designer) then Designer.Modified; PopulateItemList; lbItems.ItemIndex := Item.Index; end; end; {=====} procedure TfrmNavBarEd.btnFolderUpClick(Sender: TObject); var SaveItemIndex : Integer; Folder: TVpNavFolder; begin if (lbFolders.ItemIndex > 0) then begin SaveItemIndex := lbFolders.ItemIndex; Folder := TVpNavFolder(lbFolders.Items.Objects[lbFolders.ItemIndex]); if Folder.Index > 0 then Folder.Index := Folder.Index - 1; if assigned(Designer) then Designer.Modified; PopulateFolderList; lbFolders.ItemIndex := SaveItemIndex - 1; end; end; {=====} procedure TfrmNavBarEd.btnFolderDownClick(Sender: TObject); var Folder: TVpNavFolder; begin if (lbFolders.ItemIndex > -1) then begin Folder := TVpNavFolder(lbFolders.Items.Objects[lbFolders.ItemIndex]); if Folder.Index < pred(lbFolders.Items.Count) then Folder.Index := Folder.Index + 1; if assigned(Designer) then Designer.Modified; PopulateFolderList; lbFolders.ItemIndex := Folder.Index; end; end; {=====} procedure TfrmNavBarEd.btnItemDeleteClick(Sender: TObject); begin if (lbItems.ItemIndex <> -1) then begin TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]).Free; lbItems.ItemIndex := -1; PopulateItemList; if assigned(Designer) then Designer.Modified; end; end; {=====} procedure TfrmNavBarEd.btnFolderDeleteClick(Sender: TObject); begin if (lbFolders.ItemIndex <> -1) then begin TVpNavFolder(lbFolders.Items.Objects[lbFolders.ItemIndex]).Free; lbFolders.ItemIndex := -1; PopulateFolderList; PopulateItemList; if assigned(Designer) then Designer.Modified; end; end; {=====} procedure TfrmNavBarEd.btnFolderAddClick(Sender: TObject); begin Bar.FolderCollection.Add; PopulateFolderList; lbFolders.ItemIndex := lbFolders.Items.Count - 1; if assigned(Designer) then Designer.Modified; lbFoldersClick(Self); end; {=====} procedure TfrmNavBarEd.btnItemAddClick(Sender: TObject); begin if (lbFolders.ItemIndex <> -1) then begin TVpNavFolder( lbFolders.Items.Objects[lbFolders.ItemIndex]).ItemCollection.Add; lbItems.ItemIndex := -1; PopulateItemList; if assigned(Designer) then Designer.Modified; end; end; {=====} {$IFDEF VERSION5} {$IFDEF VERSION6} {$IFNDEF LCL} procedure TfrmNavBarEd.SelectList(SelList : TDesignerSelections); {$ENDIF} {$ELSE} procedure TfrmNavBarEd.SelectList(SelList : TDesignerSelectionList); {$ENDIF} {$ELSE} procedure TfrmNavBarEd.SelectList(SelList : TComponentList); {$ENDIF} begin {$IFNDEF LCL} {$IFNDEF Ver80} {$IFDEF VERSION4} if Designer <> nil then {$IFDEF VERSION6} (Designer as IDesigner).SetSelections(SelList); {$ELSE} (Designer as IFormDesigner).SetSelections(SelList); {$ENDIF} {$ELSE} if Designer <> nil then (Designer as TFormDesigner).SetSelections(SelList); {$ENDIF} SelList.Free; {$ELSE} CompLib.SetSelection(Designer, Designer.Form, SelList); {$ENDIF} end; {$ENDIF} {=====} end.