home *** CD-ROM | disk | FTP | other *** search
/ PC Administrator / spravce.iso / StartRight / source / UnitFormEdit.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-10-26  |  25.2 KB  |  892 lines

  1. unit UnitFormEdit;
  2.  
  3. {
  4.     Purpose:
  5.         - show the contents of the startright's run key and the startup folder
  6.         - allow removal of items
  7.         - allow for sorting of items
  8.  
  9.     Updates:
  10.         Show the icons of each item
  11.         Show the system's "File Properties" dialog
  12.         Enable/Disable functionality
  13.         New EndProgramOnClose functionality to show "new items"
  14. }
  15.  
  16. interface
  17.  
  18. uses
  19.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  20.   Dialogs, Registry, ComCtrls, StdCtrls,
  21.   UnitMyKeys, UnitListViewMover , Buttons, ImgList, ExtCtrls;
  22.  
  23. type
  24.   TFrmEdit = class(TForm)
  25.     ILStartupIcons: TImageList;
  26.     PageControl1: TPageControl;
  27.     TabSheet1: TTabSheet;
  28.     TabSheet2: TTabSheet;
  29.     ILRunKeyIcons: TImageList;
  30.     Panel1: TPanel;
  31.     btnTop: TSpeedButton;
  32.     btnUp: TSpeedButton;
  33.     btnDown: TSpeedButton;
  34.     btnBottom: TSpeedButton;
  35.     lvRunkeySort: TListView;
  36.     btnDeleteRun: TSpeedButton;
  37.     bRunProperties: TButton;
  38.     bSelectNew: TButton;
  39.     Panel2: TPanel;
  40.     lvRunkeyDisabled: TListView;
  41.     bRunkeyEnable: TButton;
  42.     Splitter1: TSplitter;
  43.     Panel3: TPanel;
  44.     btnTop2: TSpeedButton;
  45.     lvStartup: TListView;
  46.     btnUp2: TSpeedButton;
  47.     btnDown2: TSpeedButton;
  48.     btnBottom2: TSpeedButton;
  49.     btnDeleteStartup: TSpeedButton;
  50.     bStartupProperties: TButton;
  51.     Panel4: TPanel;
  52.     lvStartupDisabled: TListView;
  53.     bStartupEnable: TButton;
  54.     Splitter2: TSplitter;
  55.     lblVersion: TLabel;
  56.     Shape1: TShape;
  57.     Shape2: TShape;
  58.     Label1: TLabel;
  59.     Label2: TLabel;
  60.     btnExclude: TSpeedButton;
  61.     btnExcludeStartup: TSpeedButton;
  62.     bRunkeyOtherProperties: TButton;
  63.     bStartupOtherProperties: TButton;
  64.     bSelectNewRunItems: TButton;
  65.     procedure FormCreate(Sender: TObject);
  66.     procedure FormDestroy(Sender: TObject);
  67.     procedure FormShow(Sender: TObject);
  68.     procedure btnTopClick(Sender: TObject);
  69.     procedure btnUpClick(Sender: TObject);
  70.     procedure btnDownClick(Sender: TObject);
  71.     procedure btnBottomClick(Sender: TObject);
  72.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  73.     procedure btnTop2Click(Sender: TObject);
  74.     procedure btnUp2Click(Sender: TObject);
  75.     procedure btnDown2Click(Sender: TObject);
  76.     procedure btnBottom2Click(Sender: TObject);
  77.     procedure btnDeleteRunClick(Sender: TObject);
  78.     procedure btnDeleteStartupClick(Sender: TObject);
  79.     procedure lvRunkeySortClick(Sender: TObject);
  80.     procedure lvStartupClick(Sender: TObject);
  81.     procedure bRunPropertiesClick(Sender: TObject);
  82.     procedure bStartupPropertiesClick(Sender: TObject);
  83.     procedure lvStartupDisabledClick(Sender: TObject);
  84.     procedure bStartupEnableClick(Sender: TObject);
  85.     procedure bRunkeyEnableClick(Sender: TObject);
  86.     procedure lvRunkeyDisabledClick(Sender: TObject);
  87.     procedure bSelectNewClick(Sender: TObject);
  88.     procedure btnExcludeClick(Sender: TObject);
  89.     procedure btnExcludeStartupClick(Sender: TObject);
  90.     procedure bRunkeyOtherPropertiesClick(Sender: TObject);
  91.     procedure bStartupOtherPropertiesClick(Sender: TObject);
  92.     procedure bSelectNewRunItemsClick(Sender: TObject);
  93.   private
  94.     { Private declarations }
  95.     r : TRegistry;
  96.     EndProgramOnClose : boolean;
  97.     function OKToDelete() : boolean;
  98.     function OKToExclude() : boolean;
  99.     procedure LoadData;
  100.     procedure SaveData;
  101.     procedure ShowPropertiesDialog(filename : string);
  102.   public
  103.     { Public declarations }
  104.     procedure SetEndProgramOnClose(value : boolean);
  105.     function SelectNewItems : boolean;
  106.     procedure ShowNewItems;
  107.     procedure InitGUI;
  108.   end;
  109.  
  110. var
  111.   FrmEdit: TFrmEdit;
  112.  
  113. implementation
  114.  
  115. Uses shellAPI, shlobj, UnitItemManager, UnitFrmAbout, UnitSpecialPaths; {for extracting ICONS}
  116.  
  117. const DISABLED_STATUS = 'Disabled';
  118. const EXCLUDED_STATUS = 'Excluded';
  119. const NO_LONGER_EXISTS_VALUE = '[Item no longer exists in system''s runkey]';
  120. {$R *.dfm}
  121.  
  122. procedure TFrmEdit.InitGUI;
  123. var c : TListColumn;
  124. begin
  125.     lvRunkeySort.Columns.Clear;
  126.     c := lvRunkeySort.Columns.Add;
  127.     c.Caption := 'Key';
  128.     c.Width := Trunc(lvRunkeySort.ClientWidth * 0.3);
  129.  
  130.     c := lvRunkeySort.Columns.Add;
  131.     c.Caption := 'Value';
  132.     c.Width := Trunc(lvRunkeySort.ClientWidth * 0.65);
  133.  
  134.     // disabled/excluded run keys
  135.     lvRunkeyDisabled.Columns.clear;
  136.     c := lvRunkeyDisabled.Columns.Add;
  137.     c.Caption := 'Disabled Key';
  138.     c.Width := Trunc(lvRunkeyDisabled.ClientWidth * 0.2);
  139.  
  140.     c := lvRunkeyDisabled.Columns.Add;
  141.     c.Caption := 'Disabled Value';
  142.     c.Width := Trunc(lvRunkeyDisabled.ClientWidth * 0.6);
  143.  
  144.     c := lvRunkeyDisabled.Columns.Add;
  145.     c.Caption := 'Status';
  146.     c.Width := Trunc(lvRunkeyDisabled.ClientWidth * 0.2);
  147.  
  148.  
  149.  
  150.  
  151.     lvStartup.Columns.clear;
  152.     c := lvStartup.Columns.Add;
  153.     c.Caption := 'Startup Shortcuts';
  154.     c.Width := lvStartup.ClientWidth;
  155.  
  156.     lvStartupDisabled.Columns.clear;
  157.     c := lvStartupDisabled.Columns.Add;
  158.     c.Caption := 'Shortcuts';
  159.     c.width := Trunc(lvStartupDisabled.ClientWidth * 0.8);
  160.  
  161.     c := lvStartupDisabled.Columns.Add;
  162.     c.Caption := 'Status';
  163.     c.width := Trunc(lvStartupDisabled.ClientWidth * 0.2);
  164.  
  165.  
  166.     self.PageControl1.ActivePageIndex := 0;
  167.  
  168.     self.LoadData;
  169. end;
  170. procedure TFrmEdit.ShowNewItems;
  171. begin
  172.     self.Position := poScreenCenter;
  173.     self.InitGUI;
  174.     self.SelectNewItems;
  175.     self.Show;
  176.  
  177. end;
  178.  
  179. procedure TFrmEdit.SetEndProgramOnClose(value : boolean);
  180. begin
  181.    EndProgramOnClose := value;
  182. end;
  183.  
  184.  
  185. procedure TFrmEdit.FormCreate(Sender: TObject);
  186. begin
  187.     r := TRegistry.Create();
  188. end;
  189.  
  190. procedure TFrmEdit.FormDestroy(Sender: TObject);
  191. begin
  192.     r.Free;
  193. end;
  194.  
  195. procedure TFrmEdit.FormShow(Sender: TObject);
  196. begin
  197.     //self.LoadData;
  198. end;
  199. procedure TFrmEdit.LoadData;
  200.  
  201.     function GetSmallShortcutIcon(FileName: String): HICON;
  202.     var
  203.         FileInfo: TSHFileInfo;
  204.     begin
  205.         SHGetFileInfo(PChar(FileName), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON
  206.             or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  207.         Result := FileInfo.hIcon;
  208.     end;
  209.  
  210.     procedure ExtractAndSetIconRunkey(li : TListItem; keyvalue : string);
  211.     var sEXE : string;
  212.         IconIndex : word;
  213.         icon : TIcon;
  214.     begin
  215.         // find ICON of EXE item
  216.         // add default icon if can't find the file
  217.         //
  218.         sEXE := '';
  219.         sEXE := UnitMyKeys.FindExecutableFromRunValue(keyvalue);
  220.         If FileExists(sEXE) then begin
  221.             IconIndex := 0;
  222.  
  223.             icon := TIcon.Create;
  224.             icon.Handle := 0;
  225.             icon.Handle := ShellAPI.ExtractAssociatedIcon(hInstance, PChar(sEXE), IconIndex);
  226.             if (icon.Handle <> 0) then begin
  227.                 ILRunKeyIcons.AddIcon(icon);
  228.             end;
  229.             icon.Free;
  230.  
  231.             li.ImageIndex := ILRunKeyIcons.Count - 1;
  232.         end else begin
  233.             li.ImageIndex := 0;
  234.         end;
  235.     end;
  236.  
  237.     procedure ExtractAndSetIconShortcut(li : TListItem; filename : string);
  238.     var icon : TIcon;
  239.     begin
  240.         //
  241.         // find ICON of .LNK item
  242.         // add default icon if can't find the file
  243.         //
  244.         if FileExists(filename) then begin
  245.  
  246.             icon := TIcon.Create;
  247.             icon.Handle := 0;
  248.             icon.Handle := GetSmallShortcutIcon(li.caption);
  249.             if (icon.Handle <> 0) then begin
  250.                 ILStartupIcons.AddIcon(icon);
  251.             end;
  252.             icon.Free;
  253.  
  254.             li.ImageIndex := ILStartupIcons.Count - 1;
  255.         end else begin
  256.             li.ImageIndex := 0;
  257.         end;
  258.     end;
  259. var sorted : array of string;
  260.     data, s : string;
  261.     i, sortIndex : integer;
  262.     li : TListItem;
  263.  
  264.  
  265.     //link : IShellLink;
  266.     DisabledValues, ExcludedValues : TStringList;
  267. begin
  268.     lvRunkeySort.Clear;
  269.     //
  270.     // read the sorted RunKey values & their dat
  271.     //
  272.     r.RootKey := HKEY_LOCAL_MACHINE;
  273.     sortIndex := 0;
  274.     if (r.OpenKey(SR_RUNSORT_KEY, false)) then begin
  275.         sortIndex := r.ReadInteger(SR_SORTINDEX_VALUE);
  276.         SetLength(sorted, sortIndex);
  277.  
  278.         for i := 0 to (sortIndex - 1) do begin
  279.             sorted[i] := r.ReadString(IntToStr(i));
  280.         end;
  281.         r.CloseKey;
  282.     end;
  283.  
  284.     ILRunKeyIcons.Clear;
  285.     ILRunKeyIcons.AddIcon(Application.Icon);
  286.  
  287.     if (r.OpenKey(SR_RUN_KEY, false )) then begin
  288.         for i := 0 to (sortIndex - 1) do begin
  289.             s := r.ReadString(sorted[i]);
  290.  
  291.             li := lvRunkeySort.Items.add;
  292.             li.Caption := sorted[i];
  293.             li.SubItems.Add(s);
  294.  
  295.             ExtractAndSetIconRunkey(li, s);
  296.         end;
  297.         r.CloseKey;
  298.     end;
  299.  
  300.     //
  301.     // Shortcurt data
  302.     //
  303.  
  304.     lvStartup.Clear;
  305.     r.RootKey := HKEY_LOCAL_MACHINE;
  306.  
  307.     ILStartupIcons.Clear;
  308.     ILStartupIcons.AddIcon(Application.Icon);
  309.     r.RootKey := HKEY_LOCAL_MACHINE;
  310.     if (r.OpenKey(SR_STARTUPSORT_KEY, false)) then begin
  311.         sortIndex := r.ReadInteger(SR_SORTINDEX_VALUE);
  312.         SetLength(sorted, sortIndex);
  313.  
  314.         for i := 0 to (sortIndex - 1) do begin
  315.             li := lvStartup.Items.Add;
  316.             li.caption := r.ReadString( IntToStr(i) );
  317.  
  318.             ExtractAndSetIconShortcut(li, li.caption);
  319.         end;
  320.         r.CloseKey;
  321.     end;
  322.  
  323.     // disabled startup items
  324.     lvStartupDisabled.Items.Clear;
  325.  
  326.     r.RootKey := HKEY_LOCAL_MACHINE;
  327.     if (r.OpenKey(SR_STARTUPDISABLE_KEY, false)) then begin
  328.         disabledValues := TStringList.Create;
  329.         r.GetValueNames(disabledValues);
  330.         for i := 0 to (disabledValues.Count - 1) do begin
  331.             li := lvStartupDisabled.items.Add;
  332.             li.caption := r.ReadString(disabledValues.Strings[i]);
  333.             li.SubItems.Add(DISABLED_STATUS);
  334.  
  335.             ExtractAndSetIconShortcut(li, li.caption);
  336.         end;
  337.         r.CloseKey;
  338.  
  339.         disabledValues.Free;
  340.     end;
  341.     // excluded startup items
  342.     r.RootKey := HKEY_LOCAL_MACHINE;
  343.     if (r.OpenKey(SR_STARTUPEXCLUDE_KEY, false)) then begin
  344.         ExcludedValues := TStringList.Create;
  345.         r.GetValueNames(ExcludedValues);
  346.         for i := 0 to (ExcludedValues.Count - 1) do begin
  347.             {the data may or may not include the full path to the shortcut}
  348.             li := lvStartupDisabled.items.Add;
  349.             
  350.             data := r.ReadString(Excludedvalues[i]);
  351.             if not (fileExists(data)) then begin
  352.                 ItemManager.CorrectExcludedShortcutItem(Excludedvalues[i]);
  353.                 li.caption := r.ReadString(Excludedvalues[i]);
  354.             end else begin
  355.                 li.caption := data;
  356.             end;
  357.             li.SubItems.Add(EXCLUDED_STATUS);
  358.  
  359.             ExtractAndSetIconShortcut(li, li.caption);
  360.         end;
  361.  
  362.         ExcludedValues.Free;
  363.         r.CloseKey;
  364.     end;
  365.  
  366.  
  367.     // disabled runkey items
  368.     lvRunkeyDisabled.Items.Clear;
  369.     r.RootKey := HKEY_LOCAL_MACHINE;
  370.     if (r.OpenKey(SR_RUNDISABLED_KEY, false)) then begin
  371.         disabledValues := TStringList.Create;
  372.         r.GetValueNames(disabledValues);
  373.         for i := 0 to (disabledValues.Count - 1) do begin
  374.             li := lvRunkeyDisabled.items.Add;
  375.             li.caption := disabledValues.Strings[i];
  376.             li.SubItems.add( r.ReadString(disabledValues.Strings[i]) );
  377.             li.SubItems.Add(DISABLED_STATUS);
  378.             s := li.SubItems[0];
  379.  
  380.             ExtractAndSetIconRunkey(li, s);
  381.         end;
  382.         r.CloseKey;
  383.  
  384.         disabledValues.Free;
  385.     end;
  386.     //
  387.     // excluded runkey items
  388.     //
  389.     ExcludedValues := TStringList.Create;
  390.     r.RootKey := HKEY_LOCAL_MACHINE;
  391.     if (r.OpenKey(SR_RUNEXCLUDE_KEY, false)) then begin
  392.         r.GetValueNames(ExcludedValues);
  393.         r.CloseKey;
  394.     end;
  395.     i := ExcludedValues.IndexOf(SR_STARTRIGHT_VALUE);
  396.     if (i <> -1) then ExcludedValues.Delete(i);
  397.     {don't show ME in the excluded list}
  398.  
  399.     r.RootKey := HKEY_LOCAL_MACHINE;
  400.     if (r.OpenKey(WINDOWS_RUN_KEY, false)) then begin
  401.         for i := 0 to (ExcludedValues.Count - 1) do begin
  402.  
  403.             s := r.ReadString(ExcludedValues.Strings[i]);
  404.             li := lvRunkeyDisabled.Items.add;
  405.             if (s = '') then begin
  406.                 li.caption := ExcludedValues.Strings[i];
  407.                 li.SubItems.Add(NO_LONGER_EXISTS_VALUE);
  408.                 li.SubItems.Add(EXCLUDED_STATUS);
  409.                 li.ImageIndex := 0;
  410.             end else begin
  411.                 li.caption := ExcludedValues.Strings[i];
  412.                 li.SubItems.Add(s);
  413.                 li.SubItems.Add(EXCLUDED_STATUS);
  414.                 ExtractAndSetIconRunkey(li, s);
  415.             end;
  416.         end;
  417.         r.CloseKey;
  418.     end;
  419.  
  420.     ExcludedValues.Free;
  421. end;
  422.  
  423.  
  424. procedure TFrmEdit.FormClose(Sender: TObject;
  425.   var Action: TCloseAction);
  426. begin
  427.     self.SaveData;
  428.     if (self.EndProgramOnClose) then begin
  429.         Application.Terminate; 
  430.     end;
  431. end;
  432.  
  433.  
  434. procedure TFrmEdit.SaveData;
  435. var i, j : integer;
  436. begin
  437.     //
  438.     // delete the current RunSort key, and rebuild
  439.     //
  440.     r.RootKey := HKEY_LOCAL_MACHINE;
  441.     if (r.OpenKey(SR_HOME_KEY, false )) then begin
  442.         r.DeleteKey(SR_SUB_RUNSORT);
  443.         r.CloseKey;
  444.     end;
  445.  
  446.     if (r.OpenKey(SR_RUNSORT_KEY, true)) then begin
  447.         j := 0;
  448.         for i := 0 to (lvRunkeySort.Items.count - 1) do begin
  449.             if (Trim(lvRunkeySort.Items[i].caption) <> '') then begin
  450.                 r.WriteString(IntToStr(j), lvRunkeySort.Items[i].caption);
  451.                 j := j + 1;
  452.             end;
  453.         end;
  454.         r.WriteInteger(SR_SORTINDEX_VALUE, lvRunkeySort.Items.Count );
  455.         r.CloseKey;
  456.     end;
  457.  
  458.  
  459.     //
  460.     // same for StartupSort key
  461.     //
  462.     r.RootKey := HKEY_LOCAL_MACHINE;
  463.     if (r.OpenKey(SR_HOME_KEY, false )) then begin
  464.         r.DeleteKey(SR_SUB_STARTUPSORT);
  465.         r.CloseKey;
  466.     end;
  467.  
  468.     r.RootKey := HKEY_LOCAL_MACHINE;
  469.     if (r.OpenKey(SR_STARTUPSORT_KEY, true)) then begin
  470.         for i := 0 to lvStartup.Items.count - 1 do begin
  471.             r.WriteString(IntToStr(i), lvStartup.Items[i].caption);
  472.         end;
  473.         r.WriteInteger(SR_SORTINDEX_VALUE, lvStartup.Items.Count );
  474.         r.CloseKey;
  475.     end;
  476.  
  477.  
  478.     //
  479.     // save the disabled items
  480.  
  481.  
  482.     r.RootKey := HKEY_LOCAL_MACHINE;
  483.     if (r.OpenKey(SR_RUNDISABLED_KEY, true)) then begin
  484.         for i := 0 to (lvRunkeyDisabled.Items.Count - 1) do begin
  485.             if (lvRunkeyDisabled.Items[i].SubItems[1] = DISABLED_STATUS) then begin
  486.                 r.WriteString(lvRunkeyDisabled.Items[i].Caption,
  487.                     lvRunkeyDisabled.Items[i].SubItems[0] );
  488.             end;
  489.         end;
  490.         r.CloseKey;
  491.     end;
  492.  
  493. end;
  494.  
  495.  
  496.  
  497. //
  498. // move the runkey items
  499. //
  500. procedure TFrmEdit.btnTopClick(Sender: TObject);
  501. begin
  502.     UnitListViewMover.MoveSelectedTop(lvRunkeySort);
  503. end;
  504. procedure TFrmEdit.btnUpClick(Sender: TObject);
  505. begin
  506.     UnitListViewMover.MoveSelectedUp(lvRunkeySort);
  507. end;
  508. procedure TFrmEdit.btnDownClick(Sender: TObject);
  509. begin
  510.     UnitListViewMover.MoveSelectedDown(lvRunkeySort);
  511. end;
  512. procedure TFrmEdit.btnBottomClick(Sender: TObject);
  513. begin
  514.     UnitListViewMover.MoveSelectedBottom(lvRunkeySort);
  515. end;
  516.  
  517. //
  518. // move the startup items
  519. //
  520. procedure TFrmEdit.btnTop2Click(Sender: TObject);
  521. begin
  522.    UnitListViewMover.MoveSelectedTop(lvStartup);
  523. end;
  524.  
  525. procedure TFrmEdit.btnUp2Click(Sender: TObject);
  526. begin
  527.    UnitListViewMover.MoveSelectedUp(lvStartup);
  528. end;
  529.  
  530. procedure TFrmEdit.btnDown2Click(Sender: TObject);
  531. begin
  532.     UnitListViewMover.MoveSelectedDown(lvStartup);
  533. end;
  534.  
  535. procedure TFrmEdit.btnBottom2Click(Sender: TObject);
  536. begin
  537.      UnitListViewMover.MoveSelectedBottom(lvStartup);
  538. end;
  539.  
  540. //
  541. // show a property page
  542. // enable/disable property buttons
  543. //
  544. procedure TFrmEdit.bRunPropertiesClick(Sender: TObject);
  545. var f : string;
  546. begin
  547.     f := UnitMyKeys.FindExecutableFromRunValue( lvRunkeySort.Selected.SubItems.Strings[0]);
  548.     if (f = '') then begin
  549.         Dialogs.ShowMessage('Cannot locate executable');
  550.     end else begin
  551.         self.ShowPropertiesDialog(f);
  552.     end;
  553. end;
  554.  
  555. procedure TFrmEdit.bStartupPropertiesClick(Sender: TObject);
  556. begin
  557.     self.ShowPropertiesDialog(lvStartup.Selected.caption);
  558. end;
  559.  
  560. procedure TFrmEdit.lvRunkeySortClick(Sender: TObject);
  561. var v : string;
  562. begin
  563.     bRunProperties.Enabled := (lvRunkeySort.SelCount  = 1);
  564.     if (lvRunkeySort.SelCount  = 1) then begin
  565.         v := UnitFrmAbout.GetVersionString(
  566.                 FindExecutableFromRunValue(lvRunkeySort.Selected.subitems[0]));
  567.         if (v = '') then begin
  568.             lblVersion.Caption := '';
  569.         end else begin
  570.             lblVersion.caption := ExtractFilename(lvRunkeySort.selected.caption) +
  571.                 ' version: ' + v;
  572.         end;
  573.  
  574.     end else begin
  575.         lblVersion.caption := '';                
  576.     end;
  577.     btnExclude.Enabled := (lvRunkeySort.SelCount > 0);
  578.     btnDeleteRun.Enabled := (lvRunkeySort.SelCount > 0);
  579. end;
  580.  
  581. procedure TFrmEdit.lvStartupClick(Sender: TObject);
  582. begin
  583.     bStartupProperties.Enabled := (lvStartup.SelCount = 1);
  584.     btnDeleteStartup.Enabled := (lvStartup.SelCount > 0);
  585.     btnExcludeStartup.Enabled := (lvStartup.SelCount > 0);
  586. end;
  587.  
  588. procedure TFrmEdit.ShowPropertiesDialog(filename : string);
  589. var sei : TShellExecuteInfo;
  590. begin
  591.     FillChar(sei, SizeOf(sei), #0);
  592.     sei.cbSize := SizeOf(sei);
  593.     sei.lpFile := PChar(filename);
  594.     sei.lpVerb := 'properties';
  595.  
  596.     sei.fMask := SEE_MASK_INVOKEIDLIST;
  597.     ShellExecuteEx(@sei);
  598.  
  599. end;
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606. //
  607. // Disable/Exclude buttons & util dialog
  608. //
  609.  
  610. function TFrmEdit.OKToDelete() : boolean;
  611. begin
  612.     result := (MessageDlg(
  613.         'Disabled items are not run by Windows and not run by StartRight' +#13#10+
  614.         'Disable the selected item(s)?',
  615.         mtConfirmation, [mbYes, mbNo], 0) = mrYes)
  616. end;
  617.  
  618.  
  619. function TFrmEdit.OKToExclude() : boolean;
  620. begin
  621.     result := (MessageDlg(
  622.         'Excluded items are run by Windows and not managed by StartRight' +#13#10+
  623.         'Exclude the selected item(s)?',
  624.         mtConfirmation, [mbYes, mbNo], 0) = mrYes)
  625. end;
  626. procedure TFrmEdit.btnExcludeClick(Sender: TObject);
  627. var i : longint;
  628. begin
  629.     if (self.OKToExclude) then begin
  630.         for i := 0 to (lvRunkeySort.Items.count - 1) do begin
  631.             if (lvRunkeysort.items[i].Selected) then begin
  632.                 ItemManager.ExcludeRunkeyItem(
  633.                     lvRunkeySort.Items[i].Caption);
  634.             end;
  635.         end;
  636.  
  637.  
  638.         lvRunkeySort.DeleteSelected;
  639.         self.LoadData;
  640.     end;
  641. end;
  642.  
  643. procedure TFrmEdit.btnDeleteRunClick(Sender: TObject);
  644. var i : longint;
  645.     li : TListItem;
  646. begin
  647.     if self.OKToDelete then begin
  648.         // update any changes in order
  649.         // delete the Run value and delete it's associated sort key
  650.         // remove the item from the list
  651.         for i := 0 to  (lvRunkeySort.Items.count - 1) do begin
  652.             if lvRunkeysort.items[i].Selected then begin
  653.                 ItemManager.DisableRunkeyItem(lvRunkeySort.Items[i].Caption);
  654.  
  655.                 // move a copy to the disabled items
  656.                 li := lvRunkeyDisabled.Items.Add;
  657.                 li.Caption := lvRunkeySort.Items[i].Caption;
  658.                 li.SubItems.Add(lvRunkeySort.items[i].SubItems[0]);
  659.                 li.SubItems.Add(DISABLED_STATUS);
  660.             end;
  661.         end;
  662.  
  663.  
  664.         // reload the form data
  665.         self.LoadData;
  666.         btnDeleteRun.Enabled := false;
  667.     end;
  668. end;
  669.  
  670. procedure TFrmEdit.btnDeleteStartupClick(Sender: TObject);
  671. var i : longint;
  672. begin
  673.     if (self.OKToDelete) then begin
  674.         self.SaveData;
  675.  
  676.         for i := (lvStartup.Items.Count - 1) downto 0 do begin
  677.             if (not lvStartup.items[i].Selected) then CONTINUE;
  678.  
  679.             ItemManager.DisableStartupItem(lvStartup.items[i].Caption);
  680.             lvStartup.Items[i].Delete;
  681.         end;
  682.         self.LoadData;
  683.  
  684.         btnDeleteStartup.Enabled := false;
  685.         btnExcludeStartup.Enabled := false;
  686.     end;
  687. end;
  688.  
  689. procedure TFrmEdit.btnExcludeStartupClick(Sender: TObject);
  690. var i : longint;
  691. begin
  692.     if (self.OKToExclude) then begin
  693.         //self.SaveData;
  694.  
  695.         for i := (lvStartup.Items.Count - 1) downto 0 do begin
  696.             if (not lvStartup.items[i].Selected) then CONTINUE;
  697.  
  698.             ItemManager.ExcludeStartupItem(lvStartup.items[i].Caption);
  699.             lvStartup.Items[i].Delete;
  700.         end;
  701.         self.LoadData;
  702.  
  703.         btnDeleteStartup.Enabled := false;
  704.         btnExcludeStartup.Enabled := false;
  705.     end;
  706. end;
  707.  
  708.  
  709.  
  710.  
  711.  
  712. //
  713. // Disable / Enable buttons
  714. //
  715.  
  716.  
  717. procedure TFrmEdit.lvStartupDisabledClick(Sender: TObject);
  718. begin
  719.     if (lvStartupDisabled.SelCount = 1) then begin
  720.         bStartupEnable.Enabled := true;
  721.         bStartupOtherProperties.Enabled := true;
  722.         if (lvStartupDisabled.Selected.SubItems[0] = DISABLED_STATUS) then begin
  723.             bStartupEnable.Caption := 'Enable';
  724.         end else begin
  725.             bStartupEnable.Caption := 'Include';
  726.         end;
  727.     end else begin
  728.         bStartupEnable.Enabled := false;
  729.         bStartupOtherProperties.Enabled := false;
  730.     end;
  731. end;
  732.  
  733. procedure TFrmEdit.bStartupEnableClick(Sender: TObject);
  734. var shortcut : string;
  735. begin
  736.     shortcut := lvStartupDisabled.Selected.Caption;
  737.  
  738.     if (lvStartupDisabled.Selected.SubItems[0] = EXCLUDED_STATUS) then begin
  739.         ItemManager.IncludeStartupItem(shortcut);
  740.     end else begin
  741.         ItemManager.EnableStartupItem(shortcut);
  742.     end;
  743.  
  744.     lvStartupDisabled.DeleteSelected;
  745.     bStartupEnable.Enabled := false;
  746.     bStartupOtherProperties.Enabled := false;
  747.     self.LoadData;
  748. end;
  749.  
  750. procedure TFrmEdit.bRunkeyEnableClick(Sender: TObject);
  751. var i : integer;
  752. begin
  753.     for i := 0 to (lvRunkeyDisabled.Items.count - 1) do begin
  754.         if (lvRunkeyDisabled.Items[i].Selected) then begin
  755.             if (lvRunkeyDisabled.Items[i].SubItems[1] = EXCLUDED_STATUS) then begin
  756.                 ItemManager.IncludeRunkeyItem(lvRunkeyDisabled.Items[i].Caption);
  757.             end else begin
  758.                 ItemManager.EnableRunkeyItem(lvRunkeyDisabled.Items[i].Caption);
  759.             end;
  760.         end;
  761.     end;
  762.     lvRunkeyDisabled.DeleteSelected;
  763.     self.LoadData;
  764.  
  765.     bRunkeyEnable.Enabled := false;
  766.     bRunkeyOtherProperties.Enabled := false;
  767. end;
  768.  
  769. procedure TFrmEdit.lvRunkeyDisabledClick(Sender: TObject);
  770. begin
  771.     if (lvRunkeyDisabled.SelCount = 1) then begin
  772.         bRunkeyEnable.Enabled := true;
  773.         bRunkeyOtherProperties.Enabled := true;
  774.         if (lvRunkeyDisabled.Selected.SubItems[1] = DISABLED_STATUS) then begin
  775.             bRunkeyEnable.Caption := 'Enable';
  776.         end else begin
  777.             bRunkeyEnable.Caption := 'Include';
  778.         end;
  779.     end else begin
  780.         bRunkeyEnable.Enabled := false;
  781.         bRunkeyOtherProperties.Enabled := false;        
  782.     end;
  783.  
  784. end;
  785.  
  786. procedure TFrmEdit.bSelectNewClick(Sender: TObject);
  787. begin
  788.     if not SelectNewItems then begin
  789.         ShowMessage('No new items');
  790.     end;
  791. end;
  792.  
  793.  
  794. function TFrmEdit.SelectNewItems : boolean;
  795. var values : TStringList;
  796.     i : integer;
  797.     li : TListItem;
  798.     topItemSet : boolean;
  799. begin
  800.     values := TStringList.Create;
  801.     // read new values
  802.     r.RootKey := HKEY_LOCAL_MACHINE;
  803.     if (r.OpenKey(SR_RUNNEWITEMS_KEY, false)) then begin
  804.         r.GetValueNames(values);
  805.         r.CloseKey;
  806.     end;
  807.  
  808.     // select new items
  809.     result := false;
  810.     lvRunkeySort.ClearSelection;
  811.     topItemSet := false;
  812.     for i := 0 to (values.Count - 1) do begin
  813.         li := lvRunkeySort.FindCaption(0,values.Strings[i],false,true,false);
  814.         if li = nil then CONTINUE;
  815.  
  816.         li.Selected := true;
  817.         result := true;
  818.         {make the first item visible to the user}
  819.         if (not topItemSet) then  begin
  820.             li.MakeVisible(true);
  821.             topItemSet := true;
  822.         end;
  823.     end;
  824.     values.free;
  825.  
  826.     self.lvRunkeySortClick(self);
  827. end;
  828.  
  829.  
  830.  
  831.  
  832. procedure TFrmEdit.bRunkeyOtherPropertiesClick(Sender: TObject);
  833. var f : string;
  834. begin
  835.     f := UnitMyKeys.FindExecutableFromRunValue( lvRunkeyDisabled.Selected.SubItems.Strings[0]);
  836.     if (f = '') then begin
  837.         Dialogs.ShowMessage('Cannot locate executable');
  838.     end else begin
  839.         self.ShowPropertiesDialog(f);
  840.     end;
  841. end;
  842.  
  843.  
  844. procedure TFrmEdit.bStartupOtherPropertiesClick(Sender: TObject);
  845. begin
  846.     self.ShowPropertiesDialog(lvStartupDisabled.Selected.caption);
  847. end;
  848.  
  849. procedure TFrmEdit.bSelectNewRunItemsClick(Sender: TObject);
  850. var values : TStringList;
  851.     i : integer;
  852.     li : TListItem;
  853.     topItemSet : boolean;
  854.     s : string;
  855. begin
  856.     values := TStringList.Create;
  857.     topItemSet := false;
  858.     
  859.     // read new values
  860.     r.RootKey := HKEY_LOCAL_MACHINE;
  861.     if (r.OpenKey(SR_STARTUPNEW_KEY, false)) then begin
  862.         r.GetValueNames(values);
  863.  
  864.         // select new items
  865.  
  866.         lvRunkeySort.ClearSelection;
  867.         topItemSet := false;
  868.         for i := 0 to (values.Count - 1) do begin
  869.             s := r.ReadString(values.Strings[i]);
  870.             li := lvStartup.FindCaption(0,s,false,true,false);
  871.             if li = nil then CONTINUE;
  872.  
  873.             li.Selected := true;
  874.  
  875.             {make the first item visible to the user}
  876.             if (not topItemSet) then  begin
  877.                 li.MakeVisible(true);
  878.                 topItemSet := true;
  879.             end;
  880.         end;
  881.         values.free;
  882.  
  883.  
  884.         r.CloseKey;
  885.     end;
  886.  
  887.     if (not topItemSet) then   ShowMessage('No new items');
  888.     self.lvStartupClick(self);
  889. end;
  890.  
  891. end.
  892.