home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 April A / Pcwk4a98.iso / PROGRAM / DELPHI16 / Calmira / Src / SRC / OPTIONS.PAS < prev    next >
Pascal/Delphi Source File  |  1996-09-08  |  23KB  |  798 lines

  1. unit Options;
  2.  
  3. interface
  4.  
  5. uses Classes, Forms, Controls, Buttons, StdCtrls, ExtCtrls, TabNotBk,
  6.   Grids, Outline, Menus, Spin, Dialogs, StylSped, WinTypes,
  7.   Iconic, SysUtils;
  8.  
  9. type
  10.   TOptionDlg = class(TForm)
  11.     OKBtn: TBitBtn;
  12.     CancelBtn: TBitBtn;
  13.     Notebook: TTabbedNotebook;
  14.     FilterEdit: TEdit;
  15.     Label1: TLabel;
  16.     cbShowHidSys: TCheckBox;
  17.     Replace: TCheckBox;
  18.     FileDelete: TCheckBox;
  19.     Move: TCheckBox;
  20.     Copy: TCheckBox;
  21.     FolderDelete: TCheckBox;
  22.     Protect: TCheckBox;
  23.     Outline: TOutline;
  24.     OpenDialog: TOpenDialog;
  25.     DelayLabel: TLabel;
  26.     cbFileHints: TCheckBox;
  27.     HelpBtn: TBitBtn;
  28.     AddBtn: TStyleSpeed;
  29.     InsertBtn: TStyleSpeed;
  30.     EditBtn: TStyleSpeed;
  31.     DeleteBtn: TStyleSpeed;
  32.     ExpandBtn: TStyleSpeed;
  33.     CollapseBtn: TStyleSpeed;
  34.     OutlineMenu: TPopupMenu;
  35.     AddItem: TMenuItem;
  36.     InsertItem: TMenuItem;
  37.     EditItem: TMenuItem;
  38.     DeleteItem: TMenuItem;
  39.     CollapseItem: TMenuItem;
  40.     ExpandItem: TMenuItem;
  41.     N1: TMenuItem;
  42.     Convert: TMenuItem;
  43.     cbAutoSize: TCheckBox;
  44.     cbAutoActivate: TCheckBox;
  45.     cbBrowseSame: TCheckBox;
  46.     cbShortArrows: TCheckBox;
  47.     cbHollowDrag: TCheckBox;
  48.     cbSaveWindows: TCheckBox;
  49.     cbFindVersion: TCheckBox;
  50.     cbShowGlyphs: TCheckBox;
  51.     cbShowSplash: TCheckBox;
  52.     cbAnimCursor: TCheckBox;
  53.     cbProgDrop: TCheckBox;
  54.     ChangeFont: TStyleSpeed;
  55.     Element: TComboBox;
  56.     Label2: TLabel;
  57.     BrowseXEdit: TSpinEdit;
  58.     BrowseYEdit: TSpinEdit;
  59.     Label13: TLabel;
  60.     Label14: TLabel;
  61.     Bevel1: TBevel;
  62.     Bevel2: TBevel;
  63.     Bevel3: TBevel;
  64.     Bevel4: TBevel;
  65.     Bevel5: TBevel;
  66.     Bevel6: TBevel;
  67.     Bevel7: TBevel;
  68.     Bevel8: TBevel;
  69.     FontDialog: TFontDialog;
  70.     cbClearSearch: TCheckBox;
  71.     Bevel9: TBevel;
  72.     ColorDialog: TColorDialog;
  73.     Label17: TLabel;
  74.     Label18: TLabel;
  75.     rbCopy: TRadioButton;
  76.     rbMove: TRadioButton;
  77.     rbPrompt: TRadioButton;
  78.     cbRemoveShort: TCheckBox;
  79.     Bevel11: TBevel;
  80.     Label7: TLabel;
  81.     UndeleteEdit: TEdit;
  82.     Label4: TLabel;
  83.     InspectEdit: TEdit;
  84.     Label5: TLabel;
  85.     DefaultEdit: TEdit;
  86.     Label6: TLabel;
  87.     DiskEdit: TEdit;
  88.     Bevel10: TBevel;
  89.     cbShrinkMax: TCheckBox;
  90.     cb24Hour: TCheckBox;
  91.     Label19: TLabel;
  92.     RefreshEdit: TSpinEdit;
  93.     cbAnimate: TCheckBox;
  94.     cbButtonHint: TCheckBox;
  95.     IconEdit: TEdit;
  96.     Label8: TLabel;
  97.     Label21: TLabel;
  98.     rbType: TRadioButton;
  99.     rbName: TRadioButton;
  100.     rbDate: TRadioButton;
  101.     rbSize: TRadioButton;
  102.     cbEnableBin: TCheckBox;
  103.     rbLeave: TRadioButton;
  104.     rbEmpty: TRadioButton;
  105.     rbDelete: TRadioButton;
  106.     rbCollect: TRadioButton;
  107.     KeepFreeEdit: TSpinEdit;
  108.     KeepFreeLab: TLabel;
  109.     Label15: TLabel;
  110.     SysEdit: TEdit;
  111.     Label16: TLabel;
  112.     BinEdit: TEdit;
  113.     Label22: TLabel;
  114.     rbCascaded: TRadioButton;
  115.     rbRandom: TRadioButton;
  116.     rbSaved: TRadioButton;
  117.     cbPromptQuit: TCheckBox;
  118.     cbConfirmAlias: TCheckBox;
  119.     Delay: TScrollBar;
  120.     CustomColor: TStyleSpeed;
  121.     ColorPick: TComboBox;
  122.     Label3: TLabel;
  123.     Shape: TShape;
  124.     Bevel12: TBevel;
  125.     SamplePanel: TPanel;
  126.     PaintBox: TPaintBox;
  127.     cbTaskbar: TCheckBox;
  128.     cbRestoreSys: TCheckBox;
  129.     cbRefreshShort: TCheckBox;
  130.     cbAliasArrows: TCheckBox;
  131.     cbShowList: TCheckBox;
  132.     Bevel13: TBevel;
  133.     cbAlwaysStart: TCheckBox;
  134.     cbAlwaysVisible: TCheckBox;
  135.     cbHighlight: TCheckBox;
  136.     ExcludeList: TListBox;
  137.     Label10: TLabel;
  138.     AddExcl: TStyleSpeed;
  139.     RemoveExcl: TStyleSpeed;
  140.     cbNewStart: TCheckBox;
  141.     Panel1: TPanel;
  142.     rbStandard: TRadioButton;
  143.     rb4DOS: TRadioButton;
  144.     rbExtended: TRadioButton;
  145.     cbSysWinQuit: TCheckBox;
  146.     cbMsgSounds: TCheckBox;
  147.     cbShowDeskMenu: TCheckBox;
  148.     procedure OKBtnClick(Sender: TObject);
  149.     procedure FormCreate(Sender: TObject);
  150.     procedure FormDestroy(Sender: TObject);
  151.     procedure UndeleteEditDblClick(Sender: TObject);
  152.     procedure OutlineMouseDown(Sender: TObject; Button: TMouseButton;
  153.       Shift: TShiftState; X, Y: Integer);
  154.     procedure OutlineDragOver(Sender, Source: TObject; X, Y: Integer;
  155.       State: TDragState; var Accept: Boolean);
  156.     procedure OutlineDragDrop(Sender, Source: TObject; X, Y: Integer);
  157.     procedure InsertBtnClick(Sender: TObject);
  158.     procedure AddBtnClick(Sender: TObject);
  159.     procedure DeleteBtnClick(Sender: TObject);
  160.     procedure EditBtnClick(Sender: TObject);
  161.     procedure ExpandBtnClick(Sender: TObject);
  162.     procedure CollapseBtnClick(Sender: TObject);
  163.     procedure NotebookChange(Sender: TObject; NewTab: Integer;
  164.       var AllowChange: Boolean);
  165.     procedure OutlineEndDrag(Sender, Target: TObject; X, Y: Integer);
  166.     procedure ConvertClick(Sender: TObject);
  167.     procedure rbCollectClick(Sender: TObject);
  168.     procedure ChangeFontClick(Sender: TObject);
  169.     procedure CustomColorClick(Sender: TObject);
  170.     procedure ColorPickChange(Sender: TObject);
  171.     procedure ElementChange(Sender: TObject);
  172.     procedure PaintBoxPaint(Sender: TObject);
  173.     procedure BrowseXEditChange(Sender: TObject);
  174.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  175.     procedure CancelBtnClick(Sender: TObject);
  176.     procedure AddExclClick(Sender: TObject);
  177.     procedure RemoveExclClick(Sender: TObject);
  178.   private
  179.     { Private declarations }
  180.     DragItem : Longint;
  181.     MakeChild : Boolean;
  182.     StartChanged : Boolean;
  183.     DisplayChanged : Boolean;
  184.     NotifyTaskbar : Boolean;
  185.     BuiltTree : Boolean;
  186.     ColorsSet : Boolean;
  187.     DropFocus : Integer;
  188.     Sample1, Sample2, Sample3, Sample4 : TSampleImage;
  189.     procedure EnumColorProc(const s: string);
  190.     procedure ConvertProgItem(Sender : TObject;
  191.       const group, caption: TFilename; const data :string);
  192.     procedure SetDisplayChanged;
  193.     procedure EraseDropFocus;
  194.     procedure AddOutlineNode(index : Longint;
  195.       const cap, data : string; Op: TAttachMode);
  196.   public
  197.     { Public declarations }
  198.   end;
  199.  
  200.  
  201. var OptionDlg: TOptionDlg;
  202.  
  203.  
  204. implementation
  205.  
  206. {$R *.DFM}
  207.  
  208. uses Settings, Directry, MMSystem, Sys, WasteBin, MenuEdit, MultiGrd,
  209.   Strings, Files, MiscUtil, IniFiles, Shorts, Start, Alias,
  210.   WinProcs, ProgConv, Desk, Graphics, Resource, BarLink, IconWin;
  211.  
  212. procedure TOptionDlg.FormCreate(Sender: TObject);
  213. var c: TCalColor;
  214. begin
  215.   { File view }
  216.   SetRadioIndex([rbType, rbName, rbSize, rbDate], Integer(DefaultSort));
  217.   IconEdit.Text        := Trim(IconStrings);
  218.   FilterEdit.Text      := DefaultFilter;
  219.   cbShowHidSys.Checked := DefaultHidSys;
  220.   cbShowList.Checked   := ShowList;
  221.   cbFileHints.Checked  := FileHints;
  222.   Delay.Position       := HintDelay;
  223.   SetRadioIndex([rbStandard, rb4DOS, rbExtended], Integer(FileSystem));
  224.  
  225.   { Confirmation }
  226.   FileDelete.Checked    := ConfirmFileDel;
  227.   FolderDelete.Checked  := ConfirmFolderDel;
  228.   Replace.Checked       := ConfirmReplace;
  229.   Copy.Checked          := ConfirmCopy;
  230.   Move.Checked          := ConfirmMove;
  231.   Protect.Checked       := ConfirmProtected;
  232.   cbRemoveShort.Checked := ConfirmShort;
  233.   cbConfirmAlias.Checked := ConfirmAlias;
  234.   cbPromptQuit.Checked  := PromptQuit;
  235.   SetRadioIndex([rbCopy, rbMove, rbPrompt], Integer(DropAction));
  236.  
  237.   { Desktop }
  238.   cbAutoSize.Checked      := AutoSize;
  239.   cbAutoActivate.Checked  := AutoActivate;
  240.   cbBrowseSame.Checked    := BrowseSame;
  241.   cbShortArrows.Checked   := ShortArrows;
  242.   cbAliasArrows.Checked   := AliasArrows;
  243.   cbHollowDrag.Checked    := HollowDrag;
  244.   cbSaveWindows.Checked   := SaveWindows;
  245.   SetRadioIndex([rbCascaded, rbRandom, rbSaved], Integer(WindowOpen));
  246.   SysEdit.Text     := SysCaption;
  247.   BinEdit.Text     := BinCaption;
  248.  
  249.   { Misc }
  250.   cbEnableBin.Checked     := EnableBin;
  251.   SetRadioIndex([rbLeave, rbEmpty, rbDelete, rbCollect], Integer(BinAction));
  252.   KeepFreeEdit.Value      := KeepFree;
  253.   UndeleteEdit.Text   := UndeleteProg;
  254.   InspectEdit.Text := InspectProg;
  255.   DefaultEdit.Text := DefaultProg;
  256.   DiskEdit.Text    := DiskProg;
  257.  
  258.   { Display }
  259.   BrowseXEdit.Value := BrowseGrid.X;
  260.   BrowseYEdit.Value := BrowseGrid.Y;
  261.   for c := Low(TCalColor) to High(TCalColor) do
  262.     Element.Items.AddObject(ColorNames[c], Pointer(Colors[c]));
  263.   FontDialog.Font.Assign(GlobalFont);
  264.  
  265.   { Preferences }
  266.   cbShowSplash.Checked := ShowSplash;
  267.   cbFindVersion.Checked   := FindVersion;
  268.   cbShowGlyphs.Checked    := ShowGlyphs;
  269.   cbClearSearch.Checked  := ClearSearch;
  270.   cbAnimCursor.Checked := AnimCursor;
  271.   cbProgDrop.Checked := ProgDrop;
  272.   cbMsgSounds.Checked := MsgDialogSounds;
  273.   cbTaskbar.Checked := LoadTaskbar;
  274.   cbRestoreSys.Checked := RestoreSys;
  275.   cbRefreshShort.Checked := RefreshShort;
  276.   cbAlwaysStart.Checked := AlwaysStart;
  277.   cbNewStart.Checked := NewStart;
  278.   cbShowDeskMenu.Checked := ShowDeskMenu;
  279.  
  280.   { Taskbar }
  281.  
  282.   cbAlwaysVisible.Checked := ini.ReadBool('Taskbar', 'StayVisible', True);
  283.   cbShrinkMax.Checked := ini.ReadBool('Taskbar', 'NoOverlap', False);
  284.   cb24Hour.Checked := ini.ReadBool('Taskbar', '24Hour', False);
  285.   cbHighlight.Checked := ini.ReadBool('Taskbar', 'Highlight', True);
  286.   cbAnimate.Checked := ini.ReadBool('Taskbar', 'Animate', True);
  287.   cbButtonHint.Checked := ini.ReadBool('Taskbar', 'ButtonHint', True);
  288.   RefreshEdit.Value := ini.ReadInteger('Taskbar', 'Refresh', 5);
  289.   ini.ReadStrings('Exclude', ExcludeList.Items);
  290.  
  291.   Outline.ItemHeight := LineHeight;
  292.   Notebook.PageIndex := 0;
  293.   DropFocus := -1;
  294. end;
  295.  
  296.  
  297. procedure TOptionDlg.OKBtnClick(Sender: TObject);
  298. var c: TCalColor;
  299. begin
  300.   { File display }
  301.   DefaultSort := TSortOrder(GetRadioIndex([rbType, rbName, rbSize, rbDate]));
  302.   DefaultFilter := FilterEdit.Text;
  303.   DefaultHidSys := cbShowHidSys.Checked;
  304.   IconStrings := ' ' + Lowercase(Trim(IconEdit.Text)) + ' ';
  305.   ShowList   := cbShowList.Checked;
  306.   FileHints  := cbFileHints.Checked;
  307.   HintDelay  := Delay.Position;
  308.   FileSystem := TFileSystem(GetRadioIndex([rbStandard, rb4DOS, rbExtended]));
  309.  
  310.   { Confirmation }
  311.   ConfirmFileDel   := FileDelete.Checked;
  312.   ConfirmFolderDel := FolderDelete.Checked;
  313.   ConfirmReplace   := Replace.Checked;
  314.   ConfirmCopy      := Copy.Checked;
  315.   ConfirmMove      := Move.Checked;
  316.   ConfirmProtected := Protect.Checked;
  317.   ConfirmShort     := cbRemoveShort.Checked;
  318.   ConfirmAlias     := cbConfirmAlias.Checked;
  319.   PromptQuit       := cbPromptQuit.Checked;
  320.   DropAction := TDropAction(GetRadioIndex([rbCopy, rbMove, rbPrompt]));
  321.  
  322.   { Desktop }
  323.   AutoSize := cbAutoSize.Checked;
  324.   AutoActivate := cbAutoActivate.Checked;
  325.   BrowseSame := cbBrowseSame.Checked;
  326.   ShortArrows := cbShortArrows.Checked;
  327.   AliasArrows := cbAliasArrows.Checked;
  328.   HollowDrag := cbHollowDrag.Checked;
  329.   SaveWindows := cbSaveWindows.Checked;
  330.   WindowOpen := TWindowOpen(GetRadioIndex([rbCascaded, rbRandom, rbSaved]));
  331.   BinCaption := BinEdit.Text;
  332.   SysCaption := SysEdit.Text;
  333.  
  334.   { Misc }
  335.   EnableBin := cbEnableBin.Checked;
  336.   Bin.Visible := EnableBin;
  337.   BinAction := TBinAction(GetRadioIndex([rbLeave, rbEmpty, rbDelete, rbCollect]));
  338.   KeepFree :=KeepFreeEdit.Value;
  339.   UndeleteProg := UndeleteEdit.Text;
  340.   InspectProg := InspectEdit.Text;
  341.   DefaultProg := DefaultEdit.Text;
  342.   DiskProg := DiskEdit.Text;
  343.  
  344.   { Display }
  345.  
  346.   if DisplayChanged then begin
  347.     BrowseGrid.X := BrowseXEdit.Value;
  348.     BrowseGrid.Y := BrowseYEdit.Value;
  349.     for c:= Low(TCalColor) to High(TCalColor) do
  350.       Colors[c] := Longint(Element.Items.Objects[Integer(c)]);
  351.     GlobalFont.Assign(FontDialog.Font);
  352.     Desktop.Configure;
  353.   end;
  354.  
  355.   { Preferences }
  356.   ShowSplash := cbShowSplash.Checked;
  357.   FindVersion := cbFindVersion.Checked;
  358.   ShowGlyphs := cbShowGlyphs.Checked;
  359.   ClearSearch := cbClearSearch.Checked;
  360.   AnimCursor := cbAnimCursor.Checked;
  361.   ProgDrop := cbProgDrop.Checked;
  362.   MsgDialogSounds := cbMsgSounds.Checked;
  363.   LoadTaskbar := cbTaskbar.Checked;
  364.   RestoreSys := cbRestoreSys.Checked;
  365.   RefreshShort := cbRefreshShort.Checked;
  366.   AlwaysStart := cbAlwaysStart.Checked;
  367.   NewStart := cbNewStart.Checked;
  368.   ShowDeskMenu := cbShowDeskMenu.Checked;
  369.  
  370.   if StartChanged then
  371.     StartMenu.RebuildFromOutline(Outline, ApplicationPath + 'START.INI');
  372.  
  373.   ini.WriteBool('Taskbar', 'StayVisible', cbAlwaysVisible.Checked);
  374.   ini.WriteBool('Taskbar', 'NoOverlap', cbShrinkMax.Checked);
  375.   ini.WriteBool('Taskbar', '24Hour', cb24Hour.Checked);
  376.   ini.WriteBool('Taskbar', 'Highlight', cbHighlight.Checked);
  377.   ini.WriteBool('Taskbar', 'Animate', cbAnimate.Checked);
  378.   ini.WriteBool('Taskbar', 'ButtonHint', cbButtonHint.Checked);
  379.   ini.WriteInteger('Taskbar', 'Refresh', RefreshEdit.Value);
  380.   ini.WriteStrings('Exclude', ExcludeList.Items);
  381.  
  382.   SaveSettings;
  383.  
  384.   if NotifyTaskbar or DisplayChanged then
  385.     PostMessage(TaskbarWindow, WM_CALYPSO, CM_TASKCONFIG, 0);
  386.  
  387.   Close;
  388. end;
  389.  
  390.  
  391. procedure TOptionDlg.EnumColorProc(const s: string);
  392. begin
  393.   ColorPick.Items.AddObject(System.Copy(s, 3, Length(s)-2), TObject(StringToColor(s)));
  394. end;
  395.  
  396.  
  397. procedure TOptionDlg.FormDestroy(Sender: TObject);
  398. var i: Integer;
  399. begin
  400.   with Outline do
  401.     for i := 1 to ItemCount do
  402.       if Items[i].Data <> nil then Dispose(PString(Items[i].Data));
  403.  
  404.   MenuEditDlg.Free;
  405.   Sample1.Free;
  406.   Sample2.Free;
  407.   Sample3.Free;
  408.   Sample4.Free;
  409.  
  410.   OptionDlg := nil;
  411. end;
  412.  
  413.  
  414. procedure TOptionDlg.UndeleteEditDblClick(Sender: TObject);
  415. begin
  416.   if OpenDialog.Execute then (Sender as TEdit).Text := OpenDialog.Filename;
  417. end;
  418.  
  419.  
  420. procedure TOptionDlg.OutlineMouseDown(Sender: TObject;
  421.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  422. var
  423.   r : TRect;
  424.   i : Longint;
  425.   p : TPoint;
  426. begin
  427.   if ssDouble in Shift then exit
  428.   else if Button = mbRight then with Outline do begin
  429.     i := GetItem(X, Y);
  430.     if i > 0 then SelectedItem := i;
  431.     GetCursorPos(p);
  432.     OutlineMenu.Popup(p.X, p.Y);
  433.   end
  434.   else with Outline do begin
  435.     DragItem := GetItem(X, Y);
  436.     if DragItem > 0 then begin
  437.       MakeChild := ssAlt in Shift;
  438.       with ClientRect do begin
  439.         r.TopLeft := ClientToScreen(TopLeft);
  440.         r.BottomRight := ClientToScreen(Bottomright);
  441.         ClipCursor(@r);
  442.       end;
  443.       BeginDrag(False);
  444.     end;
  445.   end
  446. end;
  447.  
  448.  
  449. procedure TOptionDlg.EraseDropFocus;
  450. begin
  451.   if DropFocus <> -1 then with Outline do
  452.     Canvas.DrawFocusRect(Bounds(0, DropFocus * ItemHeight, Width, ItemHeight));
  453.   DropFocus := -1;
  454. end;
  455.  
  456.  
  457. procedure TOptionDlg.OutlineDragOver(Sender, Source: TObject; X,
  458.   Y: Integer; State: TDragState; var Accept: Boolean);
  459. var i: Integer;
  460. begin
  461.   Accept := ((Sender = Source) or
  462.              (Source is TMultiGrid) and (Source <> SysWindow.Grid))
  463.             and (Outline.GetItem(X, Y) > 0);
  464.  
  465.   with Outline do begin
  466.     if not Accept or (State = dsDragLeave) then
  467.       EraseDropFocus
  468.     else begin
  469.       i := Y div ItemHeight;
  470.       if i <> DropFocus then begin
  471.         EraseDropFocus;
  472.         Canvas.DrawFocusRect(Bounds(0, i * ItemHeight, Width, ItemHeight));
  473.         DropFocus := i;
  474.       end;
  475.     end;
  476.   end;
  477. end;
  478.  
  479.  
  480. procedure TOptionDlg.OutlineDragDrop(Sender, Source: TObject; X,
  481.   Y: Integer);
  482. const
  483.   MoveOp: array[Boolean] of TAttachMode = (oaInsert, oaAddChild);
  484. var
  485.   dest : Longint;
  486.   i : Integer;
  487. begin
  488.   EraseDropFocus;
  489.   dest := Outline.GetItem(X, Y);
  490.  
  491.   if Source is TMultiGrid then
  492.     with (TMultiGrid(Source).Owner as TIconWindow).CompileSelection(False) do
  493.       for i := 0 to Count-1 do
  494.         with  TDirItem(Items[i]) do
  495.           AddOutlineNode(dest, GetTitle, GetStartInfo, oaAddChild)
  496.  
  497.   else with Outline do begin
  498.     BeginUpdate;
  499.     Items[DragItem].MoveTo(dest, MoveOp[MakeChild]);
  500.     EndUpdate;
  501.   end;
  502.   StartChanged := True;
  503. end;
  504.  
  505.  
  506. procedure TOptionDlg.InsertBtnClick(Sender: TObject);
  507. begin
  508.   with Outline, MenuEditDlg do
  509.     if SelectedItem = 0 then AddBtn.Click else
  510.       if EditItem('Insert menu item', '', '', False) = mrOK then
  511.         AddOutlineNode(SelectedItem, CaptionEdit.Text, DataString, oaAddChild);
  512. end;
  513.  
  514.  
  515. procedure TOptionDlg.AddBtnClick(Sender: TObject);
  516. begin
  517.   with MenuEditDlg do
  518.   if EditItem('Add menu item', '', '', False) = mrOK then
  519.     AddOutlineNode(Outline.SelectedItem, CaptionEdit.Text, DataString, oaInsert);
  520. end;
  521.  
  522. procedure TOptionDlg.AddOutlineNode(index : Longint;
  523.   const cap, data : string; Op: TAttachMode);
  524. var p: PString;
  525. begin
  526.   StartChanged := True;
  527.   New(p);
  528.   p^ := data;
  529.   case Op of
  530.     oaAdd      : Outline.AddObject(index, cap, p);
  531.     oaAddChild : Outline.AddChildObject(index, cap, p);
  532.     oaInsert   : Outline.InsertObject(index, cap, p);
  533.   end;
  534. end;
  535.  
  536.  
  537. procedure TOptionDlg.DeleteBtnClick(Sender: TObject);
  538.  
  539. procedure DisposeNode(node : TOutlineNode);
  540. var i : Longint;
  541. begin
  542.   Dispose(PString(node.Data));
  543.   i := node.GetFirstChild;
  544.   while i <> -1 do begin
  545.     DisposeNode(Outline.Items[i]);
  546.     i := node.GetNextChild(i);
  547.   end;
  548. end;
  549.  
  550.  
  551. var
  552.   node: TOutlineNode;
  553.   i : Longint;
  554. begin
  555.   with Outline do
  556.     if SelectedItem > 0 then begin
  557.       node := Items[SelectedItem];
  558.       if node.HasItems and (MsgDialog('Delete this menu?',
  559.         mtConfirmation, [mbYes, mbNo], 0) <> mrYes) then exit;
  560.  
  561.       DisposeNode(node);
  562.       node.Collapse;
  563.       i := node.Parent.GetPrevChild(SelectedItem);
  564.       if i > 0 then Items[i].Collapse;
  565.       Delete(SelectedItem);
  566.       StartChanged := True;
  567.     end;
  568. end;
  569.  
  570.  
  571. procedure TOptionDlg.EditBtnClick(Sender: TObject);
  572. var node : TOutlineNode;
  573. begin
  574.   with Outline, MenuEditDlg do
  575.     if (SelectedItem > 0) then begin
  576.       node := Items[SelectedItem];
  577.       if EditItem('Edit menu item', node.Text,
  578.       PString(node.Data)^, node.HasItems) = mrOK then begin
  579.         PString(node.Data)^ := DataString;
  580.         node.Text := CaptionEdit.Text;
  581.         StartChanged := True;
  582.       end;
  583.     end;
  584. end;
  585.  
  586.  
  587. procedure TOptionDlg.ExpandBtnClick(Sender: TObject);
  588. begin
  589.   Outline.FullExpand;
  590. end;
  591.  
  592. procedure TOptionDlg.CollapseBtnClick(Sender: TObject);
  593. begin
  594.   Outline.FullCollapse;
  595. end;
  596.  
  597.  
  598. procedure TOptionDlg.NotebookChange(Sender: TObject; NewTab: Integer;
  599.   var AllowChange: Boolean);
  600. begin
  601.   HelpContext := NewTab + 20;
  602.   HelpBtn.HelpContext := HelpContext;
  603.  
  604.   if (NewTab = 3) and not BuiltTree then begin
  605.     MenuEditDlg := TMenuEditDlg.Create(Application);
  606.     StartMenu.AssignToOutline(Outline);
  607.     Outline.SetUpdateState(False);
  608.     BuiltTree := True;
  609.   end
  610.  
  611.   else if (NewTab = 4) and not ColorsSet then begin
  612.     GetColorValues(EnumColorProc);
  613.     Sample1 := TSampleImage.Create('CDROM(D:)', icons.Get('CDROMDrive'));
  614.     Sample2 := TSampleImage.Create('command.com', icons.Get('MSDOS'));
  615.     Sample3 := TSampleImage.Create('windows', foldericon);
  616.     Sample4 := TSampleImage.Create('config.sys', fileicon);
  617.     ColorsSet := True;
  618.   end
  619.  
  620.   else if NewTab = 7 then
  621.     NotifyTaskbar := True;
  622. end;
  623.  
  624.  
  625. procedure TOptionDlg.OutlineEndDrag(Sender, Target: TObject; X,
  626.   Y: Integer);
  627. begin
  628.   ClipCursor(nil);
  629. end;
  630.  
  631. procedure TOptionDlg.ConvertClick(Sender: TObject);
  632. begin
  633.   with TConvertDlg.Create(Application) do
  634.   try
  635.     OnConvertProg := ConvertProgItem;
  636.     ShowModal;
  637.   finally
  638.     Free;
  639.   end;
  640. end;
  641.  
  642.  
  643. procedure TOptionDlg.ConvertProgItem(Sender : TObject;
  644.   const group, caption: TFilename; const data: string);
  645. var
  646.   i, parentnode: Longint;
  647. begin
  648.   with Outline do begin
  649.     parentnode := GetTextItem(group);
  650.  
  651.     if parentnode = 0 then begin
  652.       AddOutlineNode(0, group, '', oaInsert);
  653.       AddOutlineNode(GetTextItem(group), caption, data, oaAddChild);
  654.     end
  655.     else begin
  656.       i := Items[parentnode].GetFirstChild;
  657.       while i <> -1 do
  658.         if CompareText(Items[i].Text, caption) = 0 then begin
  659.           PString(Items[i].Data)^ := data;
  660.           Exit;
  661.         end
  662.         else i := Items[parentnode].GetNextChild(i);
  663.  
  664.       AddOutlineNode(parentnode, caption, data, oaAddChild);
  665.     end;
  666.   end;
  667. end;
  668.  
  669.  
  670. procedure TOptionDlg.rbCollectClick(Sender: TObject);
  671. begin
  672.   with rbCollect do begin
  673.     KeepFreeLab.Enabled := Checked;
  674.     KeepFreeEdit.Enabled := Checked;
  675.   end;
  676. end;
  677.  
  678. procedure TOptionDlg.ChangeFontClick(Sender: TObject);
  679. begin
  680.   if FontDialog.Execute then SetDisplayChanged;
  681. end;
  682.  
  683.  
  684. procedure TOptionDlg.SetDisplayChanged;
  685. begin
  686.   DisplayChanged := True;
  687.   Paintbox.Repaint;
  688. end;
  689.  
  690. procedure TOptionDlg.CustomColorClick(Sender: TObject);
  691. var c: TColor;
  692. begin
  693.   if ColorDialog.Execute then begin
  694.     c := ColorDialog.Color;
  695.     with ColorPick do ItemIndex := Items.IndexOfObject(TObject(c));
  696.     with Element do Items.Objects[ItemIndex] := TObject(c);
  697.     Shape.Brush.Color := c;
  698.     SetDisplayChanged;
  699.   end;
  700. end;
  701.  
  702.  
  703. procedure TOptionDlg.ColorPickChange(Sender: TObject);
  704. var c: TColor;
  705. begin
  706.   c := TColor(ColorPick.Items.Objects[ColorPick.ItemIndex]);
  707.   with Element do Items.Objects[ItemIndex] := TObject(c);
  708.   Shape.Brush.Color := c;
  709.   SetDisplayChanged;
  710. end;
  711.  
  712.  
  713. procedure TOptionDlg.ElementChange(Sender: TObject);
  714. var c: TColor;
  715. begin
  716.   CustomColor.Enabled := True;
  717.   with Element do c := TColor(Items.Objects[ItemIndex]);
  718.  
  719.   with ColorPick do begin
  720.     Enabled := True;
  721.     ItemIndex := Items.IndexOfObject(TObject(c));
  722.   end;
  723.  
  724.   Shape.Brush.Color := c;
  725.   SetDisplayChanged;
  726. end;
  727.  
  728.  
  729. procedure TOptionDlg.PaintBoxPaint(Sender: TObject);
  730. var
  731.   r: TRect;
  732.   w, h: Integer;
  733. begin
  734.   if NoteBook.PageIndex = 4 then begin
  735.     SamplePanel.Color := TColor(Element.Items.Objects[Integer(ccWinFrame)]);
  736.     w := BrowseXEdit.Value;
  737.     h := BrowseYEdit.Value;
  738.  
  739.     with PaintBox do begin
  740.       with Canvas do begin
  741.         Font.Assign(FontDialog.Font);
  742.         Brush.Color := TColor(Element.Items.Objects[Integer(ccIconBack)]);
  743.         Pen.Color := clBlack;
  744.         with ClientRect do Rectangle(Left, Top, Right, Bottom);
  745.       end;
  746.  
  747.       r := Rect(1, 1, w+1, h+1);
  748.       Sample1.Draw(Canvas, r);
  749.       OffSetRect(r, w, 0);
  750.       Sample2.Draw(Canvas, r);
  751.       OffSetRect(r, -w, h);
  752.       with Canvas do begin
  753.         Brush.Color := TColor(Element.Items.Objects[Integer(ccIconSel)]);;
  754.         FillRect(r);
  755.         DrawFocusRect(r);
  756.         Sample3.Draw(Canvas, r);
  757.         Brush.Color := TColor(Element.Items.Objects[Integer(ccIconBack)]);
  758.       end;
  759.       OffSetRect(r, w, 0);
  760.       Sample4.Draw(Canvas, r);
  761.     end;
  762.   end;
  763. end;
  764.  
  765. procedure TOptionDlg.BrowseXEditChange(Sender: TObject);
  766. begin
  767.   SetDisplayChanged;
  768. end;
  769.  
  770.  
  771. procedure TOptionDlg.FormClose(Sender: TObject; var Action: TCloseAction);
  772. begin
  773.   Action := caFree;
  774. end;
  775.  
  776. procedure TOptionDlg.CancelBtnClick(Sender: TObject);
  777. begin
  778.   Close;
  779. end;
  780.  
  781. procedure TOptionDlg.AddExclClick(Sender: TObject);
  782. var s: TFilename;
  783. begin
  784.   s := '';
  785.   if InputQuery('Add taskbar exclusion', 'Filename', s) then begin
  786.     s := ExtractFilename(s);
  787.     if s > '' then ExcludeList.Items.Add(s);
  788.   end;
  789. end;
  790.  
  791. procedure TOptionDlg.RemoveExclClick(Sender: TObject);
  792. begin
  793.   with ExcludeList do
  794.     if ItemIndex <> -1 then Items.Delete(ItemIndex);
  795. end;
  796.  
  797. end.
  798.