home *** CD-ROM | disk | FTP | other *** search
/ Softwarová Záchrana 3 / Softwarova-zachrana-3.bin / StartRight / source.zip / UnitFormEdit.pas < prev    next >
Pascal/Delphi Source File  |  2004-10-05  |  30KB  |  1,030 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, UnitMyRegistry, 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.     Panel2: TPanel;
  39.     lvRunkeyDisabled: TListView;
  40.     bRunkeyEnable: TButton;
  41.     Splitter1: TSplitter;
  42.     Panel3: TPanel;
  43.     btnTop2: TSpeedButton;
  44.     lvStartup: TListView;
  45.     btnUp2: TSpeedButton;
  46.     btnDown2: TSpeedButton;
  47.     btnBottom2: TSpeedButton;
  48.     btnDeleteStartup: TSpeedButton;
  49.     bStartupProperties: TButton;
  50.     Panel4: TPanel;
  51.     lvStartupDisabled: TListView;
  52.     bStartupEnable: TButton;
  53.     Splitter2: TSplitter;
  54.     lblVersion: TLabel;
  55.     Shape1: TShape;
  56.     Shape2: TShape;
  57.     Label1: TLabel;
  58.     Label2: TLabel;
  59.     btnExclude: TSpeedButton;
  60.     btnExcludeStartup: TSpeedButton;
  61.     bRunkeyOtherProperties: TButton;
  62.     bStartupOtherProperties: TButton;
  63.     txtPause: TEdit;
  64.     btnSetPause: TButton;
  65.     btnSetStartupPause: TButton;
  66.     txtStartupPause: TEdit;
  67.     btnRunkeyDelete: TButton;
  68.     btnStartupDelete: TButton;
  69.     procedure FormCreate(Sender: TObject);
  70.     procedure FormDestroy(Sender: TObject);
  71.     procedure FormShow(Sender: TObject);
  72.     procedure btnTopClick(Sender: TObject);
  73.     procedure btnUpClick(Sender: TObject);
  74.     procedure btnDownClick(Sender: TObject);
  75.     procedure btnBottomClick(Sender: TObject);
  76.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  77.     procedure btnTop2Click(Sender: TObject);
  78.     procedure btnUp2Click(Sender: TObject);
  79.     procedure btnDown2Click(Sender: TObject);
  80.     procedure btnBottom2Click(Sender: TObject);
  81.     procedure btnDeleteRunClick(Sender: TObject);
  82.     procedure btnDeleteStartupClick(Sender: TObject);
  83.     procedure lvRunkeySortClick(Sender: TObject);
  84.     procedure lvStartupClick(Sender: TObject);
  85.     procedure bRunPropertiesClick(Sender: TObject);
  86.     procedure bStartupPropertiesClick(Sender: TObject);
  87.     procedure lvStartupDisabledClick(Sender: TObject);
  88.     procedure bStartupEnableClick(Sender: TObject);
  89.     procedure bRunkeyEnableClick(Sender: TObject);
  90.     procedure lvRunkeyDisabledClick(Sender: TObject);
  91.     procedure btnExcludeClick(Sender: TObject);
  92.     procedure btnExcludeStartupClick(Sender: TObject);
  93.     procedure bRunkeyOtherPropertiesClick(Sender: TObject);
  94.     procedure bStartupOtherPropertiesClick(Sender: TObject);
  95.     procedure bSelectNewRunItemsClick(Sender: TObject);
  96.     procedure btnSetPauseClick(Sender: TObject);
  97.     procedure btnSetStartupPauseClick(Sender: TObject);
  98.     procedure btnRunkeyDeleteClick(Sender: TObject);
  99.     procedure btnStartupDeleteClick(Sender: TObject);
  100.   private
  101.     { Private declarations }
  102.     r : TMyRegistry;
  103.     EndProgramOnClose : boolean;
  104.     function OKToDelete() : boolean;
  105.     function OKToExclude() : boolean;
  106.     procedure LoadData;
  107.     procedure SaveData;
  108.     procedure ShowPropertiesDialog(filename : string);
  109.   public
  110.     { Public declarations }
  111.     procedure SetEndProgramOnClose(value : boolean);
  112.     function SelectNewItems : boolean;
  113.     procedure ShowNewItems;
  114.     procedure InitGUI;
  115.   end;
  116.  
  117. var
  118.   FrmEdit: TFrmEdit;
  119.  
  120. implementation
  121.  
  122. Uses shellAPI, shlobj, UnitItemManager,
  123. UnitFrmAbout, UnitSpecialPaths{for extracting ICONS}, UnitFrmDummyRunner,
  124.   UnitFrmOptions, UnitUtils;
  125.  
  126. const PAUSE_DEFAULT = 'Default';
  127. const DISABLED_STATUS = 'Disabled';
  128. const EXCLUDED_STATUS = 'Excluded';
  129. const NO_LONGER_EXISTS_VALUE = '[Item no longer exists in system''s runkey]';
  130. {$R *.dfm}
  131.  
  132. procedure TFrmEdit.InitGUI;
  133. var c : TListColumn;
  134. begin
  135.     lvRunkeySort.Columns.Clear;
  136.  
  137.  
  138.     c := lvRunkeySort.Columns.Add;
  139.     c.Caption := 'Key';
  140.     c.Width := Trunc(lvRunkeySort.ClientWidth * 0.18);
  141.  
  142.     c := lvRunkeySort.Columns.Add;
  143.     c.Caption := 'Value';
  144.     c.Width := Trunc(lvRunkeySort.ClientWidth * 0.55);
  145.  
  146.     c := lvRunkeySort.Columns.Add;
  147.     c.Caption := 'New';
  148.     c.Width := Trunc(lvRunkeySort.ClientWidth * 0.1);
  149.  
  150.     c := lvRunkeySort.Columns.Add;
  151.     c.Caption := 'Pause(ms)';
  152.     c.Width := Trunc(lvRunkeySort.ClientWidth * 0.15);
  153.  
  154.     c := lvRunkeySort.Columns.Add;
  155.     c.Caption := 'User';
  156.     c.Width := Trunc(lvRunkeySort.ClientWidth * 0.15);
  157.  
  158.     // disabled/excluded run keys
  159.     lvRunkeyDisabled.Columns.clear;
  160.     c := lvRunkeyDisabled.Columns.Add;
  161.     c.Caption := 'Disabled Key';
  162.     c.Width := Trunc(lvRunkeyDisabled.ClientWidth * 0.2);
  163.  
  164.     c := lvRunkeyDisabled.Columns.Add;
  165.     c.Caption := 'Disabled Value';
  166.     c.Width := Trunc(lvRunkeyDisabled.ClientWidth * 0.5);
  167.  
  168.     c := lvRunkeyDisabled.Columns.Add;
  169.     c.Caption := 'Status';
  170.     c.Width := Trunc(lvRunkeyDisabled.ClientWidth * 0.2);
  171.  
  172.     c := lvRunkeyDisabled.Columns.Add;
  173.     c.Caption := 'New';
  174.     c.Width := Trunc(lvRunkeyDisabled.ClientWidth * 0.1);
  175.  
  176.  
  177.  
  178.  
  179.     lvStartup.Columns.clear;
  180.     c := lvStartup.Columns.Add;
  181.     c.Caption := 'Startup Shortcuts';
  182.     c.Width := trunc(lvStartup.ClientWidth * 0.7);
  183.  
  184.     c := lvStartup.Columns.Add;
  185.     c.Caption := 'New';
  186.     c.Width := Trunc(lvStartup.ClientWidth * 0.1);
  187.  
  188.     c := lvStartup.Columns.Add;
  189.     c.Caption := 'Pause(ms)';
  190.     c.Width := Trunc(lvStartup.ClientWidth * 0.15);
  191.  
  192.  
  193.     lvStartupDisabled.Columns.clear;
  194.     c := lvStartupDisabled.Columns.Add;
  195.     c.Caption := 'Shortcuts';
  196.     c.width := Trunc(lvStartupDisabled.ClientWidth * 0.7);
  197.  
  198.     c := lvStartupDisabled.Columns.Add;
  199.     c.Caption := 'Status';
  200.     c.width := Trunc(lvStartupDisabled.ClientWidth * 0.2);
  201.  
  202.     c := lvStartupDisabled.Columns.Add;
  203.     c.Caption := 'New';
  204.     c.Width := Trunc(lvStartupDisabled.ClientWidth * 0.1);
  205.  
  206.  
  207.  
  208.     self.PageControl1.ActivePageIndex := 0;
  209.  
  210.     self.LoadData;
  211. end;
  212. procedure TFrmEdit.ShowNewItems;
  213. begin
  214.     if not self.Visible then begin
  215.         self.Position := poScreenCenter;
  216.         self.InitGUI;
  217.         //self.SelectNewItems;
  218.         self.Show;
  219.     end;
  220.  
  221. end;
  222.  
  223. procedure TFrmEdit.SetEndProgramOnClose(value : boolean);
  224. begin
  225.    EndProgramOnClose := value;
  226. end;
  227.  
  228.  
  229. procedure TFrmEdit.FormCreate(Sender: TObject);
  230. begin
  231.     r := TMyRegistry.Create();
  232. end;
  233.  
  234. procedure TFrmEdit.FormDestroy(Sender: TObject);
  235. begin
  236.     r.Free;
  237. end;
  238.  
  239. procedure TFrmEdit.FormShow(Sender: TObject);
  240. begin
  241.     //self.LoadData;
  242. end;
  243. procedure TFrmEdit.LoadData;
  244.  
  245.     function GetSmallShortcutIcon(FileName: String): HICON;
  246.     var
  247.         FileInfo: TSHFileInfo;
  248.     begin
  249.         SHGetFileInfo(PChar(FileName), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON
  250.             or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  251.         Result := FileInfo.hIcon;
  252.     end;
  253.  
  254.     procedure ExtractAndSetIconRunkey(li : TListItem; keyvalue : string);
  255.     var sEXE : string;
  256.         IconIndex : word;
  257.         icon : TIcon;
  258.     begin
  259.         // find ICON of EXE item
  260.         // add default icon if can't find the file
  261.         //
  262.         sEXE := '';
  263.         sEXE := UnitMyKeys.FindExecutableFromRunValue(keyvalue);
  264.         If FileExists(sEXE) then begin
  265.             IconIndex := 0;
  266.  
  267.             icon := TIcon.Create;
  268.             icon.Handle := 0;
  269.             icon.Handle := ShellAPI.ExtractAssociatedIcon(hInstance, PChar(sEXE), IconIndex);
  270.             if (icon.Handle <> 0) then begin
  271.                 ILRunKeyIcons.AddIcon(icon);
  272.             end;
  273.             icon.Free;
  274.  
  275.             li.ImageIndex := ILRunKeyIcons.Count - 1;
  276.         end else begin
  277.             li.ImageIndex := 0;
  278.         end;
  279.     end;
  280.  
  281.     procedure ExtractAndSetIconShortcut(li : TListItem; filename : string);
  282.     var icon : TIcon;
  283.     begin
  284.         //
  285.         // find ICON of .LNK item
  286.         // add default icon if can't find the file
  287.         //
  288.         if FileExists(filename) then begin
  289.  
  290.             icon := TIcon.Create;
  291.             icon.Handle := 0;
  292.             icon.Handle := GetSmallShortcutIcon(li.caption);
  293.             if (icon.Handle <> 0) then begin
  294.                 ILStartupIcons.AddIcon(icon);
  295.             end;
  296.             icon.Free;
  297.  
  298.             li.ImageIndex := ILStartupIcons.Count - 1;
  299.         end else begin
  300.             li.ImageIndex := 0;
  301.         end;
  302.     end;
  303. var
  304.     data, s, user : string;
  305.     i, sortIndex, delay : integer;
  306.     li : TListItem;
  307.  
  308.  
  309.     //link : IShellLink;
  310.     DisabledValues, ExcludedValues : TStringList;
  311. begin
  312.     lvRunkeySort.Clear;
  313.     //
  314.     // read the sorted RunKey values & their dat
  315.     //
  316.     ILRunKeyIcons.Clear;
  317.     ILRunKeyIcons.AddIcon(Application.Icon);
  318.  
  319.     for i := 0 to UnitMyKeys.GetRunSortCount - 1 do begin
  320.         s := UnitMyKeys.GetRunSortData(i);
  321.         if (s <> '') then begin
  322.  
  323.             li := lvRunkeySort.Items.add;
  324.             li.Caption := UnitMyKeys.GetRunSortValue(i);
  325.             li.SubItems.Add(s);
  326.  
  327.  
  328.             if (UnitMyKeys.GetIsNewRunkey(li.caption)) then begin
  329.                 li.subitems.Add('Yes');
  330.             end else begin
  331.                 li.subitems.Add('');
  332.             end;
  333.  
  334.             delay := UnitMyKeys.GetCustomDelay(li.caption);
  335.             if delay = 0 then begin
  336.                 li.SubItems.Add(PAUSE_DEFAULT);
  337.             end else begin
  338.                 li.SubItems.Add(IntToStr(delay));
  339.             end;
  340.             user := UnitMyKeys.GetRunLocation(li.caption);
  341.             if (user <> UnitUtils.UNKNOWN_USER) then begin
  342.                 if UnitMyKeys.GetRunLocationRootkey(li.caption) = HKEY_CURRENT_USER then begin
  343.                     li.SubItems.Add(user);
  344.                 end;
  345.             end else begin
  346.                 li.SubItems.Add('');
  347.             end;
  348.  
  349.  
  350.             ExtractAndSetIconRunkey(li, s);
  351.         end;
  352.     end;
  353.  
  354.  
  355.     //
  356.     // Shortcurt data
  357.     //
  358.  
  359.     lvStartup.Clear;
  360.     ILStartupIcons.Clear;
  361.     ILStartupIcons.AddIcon(Application.Icon);
  362.  
  363.  
  364.     if (r.ValueExistsInteger(SR_STARTUPSORT_KEY, SR_SORTINDEX_VALUE, sortIndex)) then begin
  365.         for i := 0 to (sortIndex - 1) do begin
  366.             s := r.GetDataString(SR_STARTUPSORT_KEY, IntToStr(i));
  367.             if (s <> '') then begin
  368.                 li := lvStartup.Items.Add;
  369.                 li.caption := s;
  370.                 if (UnitMyKeys.GetIsNewStartup(ExtractFilename(li.caption))) then begin
  371.                     li.subitems.Add('Yes');
  372.                 end else begin
  373.                     li.subitems.Add('');
  374.                 end;
  375.  
  376.                 delay := UnitMyKeys.GetCustomDelay(li.caption);
  377.                 if delay = 0 then begin
  378.                     li.SubItems.Add(PAUSE_DEFAULT);
  379.                 end else begin
  380.                     li.SubItems.Add(IntToStr(delay));
  381.                 end;
  382.  
  383.                 ExtractAndSetIconShortcut(li, li.caption);
  384.             end;
  385.         end;
  386.     end;
  387.     
  388.     // disabled startup items
  389.     lvStartupDisabled.Items.Clear;
  390.  
  391.     disabledValues := TStringList.Create;
  392.     r.GetValues(SR_STARTUPDISABLE_KEY, DisabledValues);
  393.     for i := 0 to (disabledValues.Count - 1) do begin
  394.         s := r.GetDataString(SR_STARTUPDISABLE_KEY, disabledValues.Strings[i]);
  395.         if (s <> '') then begin
  396.             li := lvStartupDisabled.items.Add;
  397.             li.caption := s ;
  398.             li.SubItems.Add(DISABLED_STATUS);
  399.  
  400.             if (UnitMyKeys.GetIsNewStartup(ExtractFilename(s))) then begin
  401.                 li.SubItems.Add('Yes');
  402.             end else begin
  403.                 li.SubItems.Add('');
  404.             end;
  405.  
  406.             ExtractAndSetIconShortcut(li, li.caption);
  407.         end;
  408.     end;
  409.  
  410.     // excluded startup items
  411.     ExcludedValues := TStringList.Create;
  412.     r.GetValues(SR_STARTUPEXCLUDE_KEY, ExcludedValues);
  413.  
  414.     for i := 0 to (ExcludedValues.Count - 1) do begin
  415.         {the data may or may not include the full path to the shortcut}
  416.         li := lvStartupDisabled.items.Add;
  417.  
  418.         data := r.GetDataString(SR_STARTUPEXCLUDE_KEY, Excludedvalues[i]);
  419.         if not (fileExists(data)) then begin
  420.             ItemManager.CorrectExcludedShortcutItem(Excludedvalues[i]);
  421.             li.caption := r.GetDataString(SR_STARTUPEXCLUDE_KEY, Excludedvalues[i]);
  422.         end else begin
  423.             li.caption := data;
  424.         end;
  425.         li.SubItems.Add(EXCLUDED_STATUS);
  426.         if (UnitMyKeys.GetIsNewStartup(ExtractFilename(s))) then begin
  427.             li.SubItems.Add('Yes');
  428.         end else begin
  429.             li.SubItems.Add('');
  430.         end;
  431.  
  432.         ExtractAndSetIconShortcut(li, li.caption);
  433.     end;
  434.     ExcludedValues.Free;
  435.  
  436.  
  437.     // disabled runkey items
  438.     lvRunkeyDisabled.Items.Clear;
  439.     disabledValues := TStringList.Create;
  440.     r.GetValues(SR_RUNDISABLED_KEY, disabledValues);
  441.  
  442.     for i := 0 to (disabledValues.Count - 1) do begin
  443.         li := lvRunkeyDisabled.items.Add;
  444.         li.caption := disabledValues.Strings[i];
  445.         li.SubItems.add( r.GetDataString(SR_RUNDISABLED_KEY, disabledValues.Strings[i]) );
  446.         li.SubItems.Add(DISABLED_STATUS);
  447.         if (UnitMyKeys.GetIsNewRunkey(li.caption)) then begin
  448.             li.SubItems.Add('Yes');
  449.         end else begin
  450.             li.SubItems.Add('');
  451.         end;
  452.  
  453.         s := li.SubItems[0];
  454.  
  455.         ExtractAndSetIconRunkey(li, s);
  456.     end;
  457.     disabledValues.Free;
  458.  
  459.     //
  460.     // excluded runkey items
  461.     //
  462.     ExcludedValues := TStringList.Create;
  463.     r.GetValues(SR_RUNEXCLUDE_KEY, ExcludedValues);
  464.     i := ExcludedValues.IndexOf(SR_STARTRIGHT_VALUE);
  465.     if (i <> -1) then ExcludedValues.Delete(i);
  466.     {don't show ME in the excluded list}
  467.  
  468.     for i := 0 to (ExcludedValues.Count - 1) do begin
  469.         s := r.GetDataString(WINDOWS_RUN_KEY, ExcludedValues.Strings[i]);
  470.         li := lvRunkeyDisabled.Items.add;
  471.         if (s = '') then begin
  472.             li.caption := ExcludedValues.Strings[i];
  473.             li.SubItems.Add(NO_LONGER_EXISTS_VALUE);
  474.             li.SubItems.Add(EXCLUDED_STATUS);
  475.             li.ImageIndex := 0;
  476.         end else begin
  477.             li.caption := ExcludedValues.Strings[i];
  478.             li.SubItems.Add(s);
  479.             li.SubItems.Add(EXCLUDED_STATUS);
  480.             if (UnitMyKeys.GetIsNewRunkey(li.caption)) then begin
  481.                 li.SubItems.Add('Yes');
  482.             end else begin
  483.                 li.SubItems.Add('');
  484.             end;
  485.  
  486.             ExtractAndSetIconRunkey(li, s);
  487.         end;
  488.  
  489.     end;
  490.     ExcludedValues.Free;
  491. end;
  492.  
  493.  
  494. procedure TFrmEdit.FormClose(Sender: TObject;
  495.   var Action: TCloseAction);
  496. begin
  497.     self.SaveData;
  498.     if (self.EndProgramOnClose) then begin
  499.         FrmDummyRunner.HideIcon;
  500.         Application.Terminate;
  501.     end;
  502. end;
  503.  
  504.  
  505. procedure TFrmEdit.SaveData;
  506. var i, j : integer;
  507. begin
  508.     //
  509.     // delete the current RunSort key, and rebuild
  510.     //
  511.     r.EraseKey(SR_HOME_KEY, SR_SUB_RUNSORT);
  512.     j := 0;
  513.     for i := 0 to (lvRunkeySort.Items.count - 1) do begin
  514.         if (Trim(lvRunkeySort.Items[i].caption) <> '') then begin
  515.             r.SetDataString(SR_RUNSORT_KEY, IntToStr(j), lvRunkeySort.Items[i].caption);
  516.             j := j + 1;
  517.         end;
  518.     end;
  519.     r.SetDataInteger(SR_RUNSORT_KEY, SR_SORTINDEX_VALUE, lvRunkeySort.Items.Count );
  520.  
  521.  
  522.     //
  523.     // same for StartupSort key
  524.     //
  525.     r.EraseKey(SR_HOME_KEY, SR_SUB_STARTUPSORT);
  526.     for i := 0 to lvStartup.Items.count - 1 do begin
  527.         r.SetDataString(SR_STARTUPSORT_KEY, IntToStr(i), lvStartup.Items[i].caption);
  528.     end;
  529.     r.SetDataInteger(SR_STARTUPSORT_KEY, SR_SORTINDEX_VALUE, lvStartup.Items.Count );
  530.  
  531.  
  532.  
  533.  
  534.     //
  535.     // save the disabled items
  536.     for i := 0 to (lvRunkeyDisabled.Items.Count - 1) do begin
  537.         if (lvRunkeyDisabled.Items[i].SubItems[1] = DISABLED_STATUS) then begin
  538.             r.SetDataString(SR_RUNDISABLED_KEY, lvRunkeyDisabled.Items[i].Caption,
  539.                 lvRunkeyDisabled.Items[i].SubItems[0] );
  540.         end;
  541.     end;
  542. end;
  543.  
  544.  
  545.  
  546. //
  547. // move the runkey items
  548. //
  549. procedure TFrmEdit.btnTopClick(Sender: TObject);
  550. begin
  551.     UnitListViewMover.MoveSelectedTop(lvRunkeySort);
  552.        self.SaveData;
  553. end;
  554. procedure TFrmEdit.btnUpClick(Sender: TObject);
  555. begin
  556.     UnitListViewMover.MoveSelectedUp(lvRunkeySort);
  557.        self.SaveData;
  558. end;
  559. procedure TFrmEdit.btnDownClick(Sender: TObject);
  560. begin
  561.     UnitListViewMover.MoveSelectedDown(lvRunkeySort);
  562.        self.SaveData;
  563. end;
  564. procedure TFrmEdit.btnBottomClick(Sender: TObject);
  565. begin
  566.     UnitListViewMover.MoveSelectedBottom(lvRunkeySort);
  567.        self.SaveData;
  568. end;
  569.  
  570. //
  571. // move the startup items
  572. //
  573. procedure TFrmEdit.btnTop2Click(Sender: TObject);
  574. begin
  575.     UnitListViewMover.MoveSelectedTop(lvStartup);
  576.     self.SaveData;
  577. end;
  578.  
  579. procedure TFrmEdit.btnUp2Click(Sender: TObject);
  580. begin
  581.     UnitListViewMover.MoveSelectedUp(lvStartup);
  582.     self.SaveData;
  583. end;
  584.  
  585. procedure TFrmEdit.btnDown2Click(Sender: TObject);
  586. begin
  587.     UnitListViewMover.MoveSelectedDown(lvStartup);
  588.     self.SaveData;
  589. end;
  590.  
  591. procedure TFrmEdit.btnBottom2Click(Sender: TObject);
  592. begin
  593.     UnitListViewMover.MoveSelectedBottom(lvStartup);
  594.     self.SaveData;
  595. end;
  596.  
  597. //
  598. // show a property page
  599. // enable/disable property buttons
  600. //
  601. procedure TFrmEdit.bRunPropertiesClick(Sender: TObject);
  602. var f : string;
  603. begin
  604.     f := UnitMyKeys.FindExecutableFromRunValue( lvRunkeySort.Selected.SubItems.Strings[0]);
  605.     if (f = '') then begin
  606.         Dialogs.ShowMessage('Cannot locate executable');
  607.     end else begin
  608.         self.ShowPropertiesDialog(f);
  609.     end;
  610. end;
  611.  
  612. procedure TFrmEdit.bStartupPropertiesClick(Sender: TObject);
  613. begin
  614.     self.ShowPropertiesDialog(lvStartup.Selected.caption);
  615. end;
  616.  
  617. procedure TFrmEdit.lvRunkeySortClick(Sender: TObject);
  618. var v : string;
  619. begin
  620.     bRunProperties.Enabled := (lvRunkeySort.SelCount  = 1);
  621.     if (lvRunkeySort.SelCount  = 1) then begin
  622.         v := UnitFrmAbout.GetVersionString(
  623.                 FindExecutableFromRunValue(lvRunkeySort.Selected.subitems[0]));
  624.         if (v = '') then begin
  625.             lblVersion.Caption := '';
  626.         end else begin
  627.             lblVersion.caption := ExtractFilename(lvRunkeySort.selected.caption) +
  628.                 ' version: ' + v;
  629.         end;
  630.         txtPause.Text := lvRunkeySort.Selected.subitems[2];
  631.         if txtPause.Text = PAUSE_DEFAULT then begin
  632.             txtPause.Text := FrmOptions.txtIntRunkeyPause.text;
  633.         end;
  634.  
  635.     end else begin
  636.         lblVersion.caption := '';
  637.     end;
  638.     btnExclude.Enabled := (lvRunkeySort.SelCount > 0);
  639.     btnDeleteRun.Enabled := btnExclude.Enabled;
  640.  
  641.     btnSetPause.Enabled := (lvRunkeySort.SelCount  = 1);
  642.     txtPause.Enabled := btnSetPause.Enabled;
  643.  
  644. end;
  645.  
  646. procedure TFrmEdit.lvStartupClick(Sender: TObject);
  647. begin
  648.     bStartupProperties.Enabled := (lvStartup.SelCount = 1);
  649.     btnDeleteStartup.Enabled := (lvStartup.SelCount > 0);
  650.     btnExcludeStartup.Enabled := (lvStartup.SelCount > 0);
  651.  
  652.     btnSetStartupPause.Enabled := (lvStartup.SelCount  = 1);
  653.     if (btnSetStartupPause.Enabled) then begin
  654.         txtStartupPause.Text := lvStartup.Selected.subitems[1];
  655.         if txtStartupPause.Text = PAUSE_DEFAULT then begin
  656.             txtStartupPause.Text := FrmOptions.txtIntStartupPause.text;
  657.         end;
  658.  
  659.     end;
  660.     txtStartupPause.Enabled := btnSetStartupPause .Enabled;
  661.  
  662. end;
  663.  
  664. procedure TFrmEdit.ShowPropertiesDialog(filename : string);
  665. var sei : TShellExecuteInfo;
  666. begin
  667.     FillChar(sei, SizeOf(sei), #0);
  668.     sei.cbSize := SizeOf(sei);
  669.     sei.lpFile := PChar(filename);
  670.     sei.lpVerb := 'properties';
  671.  
  672.     sei.fMask := SEE_MASK_INVOKEIDLIST;
  673.     ShellExecuteEx(@sei);
  674.  
  675. end;
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682. //
  683. // Disable/Exclude buttons & util dialog
  684. //
  685.  
  686. function TFrmEdit.OKToDelete() : boolean;
  687. begin
  688.     result := (MessageDlg(
  689.         'Disabled items are not run by Windows and not run by StartRight' +#13#10+
  690.         'Disable the selected item(s)?',
  691.         mtConfirmation, [mbYes, mbNo], 0) = mrYes)
  692. end;
  693.  
  694.  
  695. function TFrmEdit.OKToExclude() : boolean;
  696. begin
  697.     result := (MessageDlg(
  698.         'Excluded items are run by Windows and not managed by StartRight' +#13#10+
  699.         'Exclude the selected item(s)?',
  700.         mtConfirmation, [mbYes, mbNo], 0) = mrYes)
  701. end;
  702. procedure TFrmEdit.btnExcludeClick(Sender: TObject);
  703. var i : longint;
  704. begin
  705.     if (self.OKToExclude) then begin
  706.         for i := 0 to (lvRunkeySort.Items.count - 1) do begin
  707.             if (lvRunkeysort.items[i].Selected) then begin
  708.                 ItemManager.ExcludeRunkeyItem(
  709.                     lvRunkeySort.Items[i].Caption);
  710.             end;
  711.         end;
  712.  
  713.  
  714.         lvRunkeySort.DeleteSelected;
  715.         self.LoadData;
  716.     end;
  717. end;
  718.  
  719. procedure TFrmEdit.btnDeleteRunClick(Sender: TObject);
  720. var i : longint;
  721.     li : TListItem;
  722. begin
  723.     if self.OKToDelete then begin
  724.         // update any changes in order
  725.         // delete the Run value and delete it's associated sort key
  726.         // remove the item from the list
  727.         for i := 0 to  (lvRunkeySort.Items.count - 1) do begin
  728.             if lvRunkeysort.items[i].Selected then begin
  729.                 ItemManager.DisableRunkeyItem(lvRunkeySort.Items[i].Caption);
  730.  
  731.                 // move a copy to the disabled items
  732.                 li := lvRunkeyDisabled.Items.Add;
  733.                 li.Caption := lvRunkeySort.Items[i].Caption;
  734.                 li.SubItems.Add(lvRunkeySort.items[i].SubItems[0]);
  735.                 li.SubItems.Add(DISABLED_STATUS);
  736.             end;
  737.         end;
  738.  
  739.  
  740.         // reload the form data
  741.         self.LoadData;
  742.         btnDeleteRun.Enabled := false;
  743.     end;
  744. end;
  745.  
  746. procedure TFrmEdit.btnDeleteStartupClick(Sender: TObject);
  747. var i : longint;
  748.     sl : TStringList;
  749.     s :  string;
  750. begin
  751.     if (self.OKToDelete) then begin
  752.         self.SaveData;
  753.  
  754.         sl := TStringList.Create;
  755.         for i := (lvStartup.Items.Count - 1) downto 0 do begin
  756.             if (not lvStartup.items[i].Selected) then CONTINUE;
  757.  
  758.             sl.Add(lvStartup.items[i].Caption);
  759.             lvStartup.Items[i].Delete;
  760.         end;
  761.  
  762.         for i := sl.Count - 1 downto 0 do begin
  763.             s := ItemManager.IncludeStartupItem(sl[i]);
  764.             ItemManager.DisableStartupItem(s); 
  765.         end;
  766.  
  767.         self.LoadData;
  768.         sl.Free;
  769.  
  770.         btnDeleteStartup.Enabled := false;
  771.         btnExcludeStartup.Enabled := false;
  772.         bStartupProperties.Enabled := false;
  773.     end;
  774.  
  775.     ItemManager.ResortStartupSortItems;
  776. end;
  777.  
  778. procedure TFrmEdit.btnExcludeStartupClick(Sender: TObject);
  779. var i : longint;
  780. begin
  781.     if (self.OKToExclude) then begin
  782.         //self.SaveData;
  783.  
  784.         for i := (lvStartup.Items.Count - 1) downto 0 do begin
  785.             if (not lvStartup.items[i].Selected) then CONTINUE;
  786.  
  787.             ItemManager.ExcludeStartupItem(lvStartup.items[i].Caption);
  788.             lvStartup.Items[i].Delete;
  789.         end;
  790.         self.LoadData;
  791.  
  792.         btnDeleteStartup.Enabled := false;
  793.         btnExcludeStartup.Enabled := false;
  794.         bStartupProperties.Enabled := false;
  795.     end;
  796. end;
  797.  
  798.  
  799.  
  800.  
  801.  
  802. //
  803. // Disable / Enable buttons
  804. //
  805.  
  806.  
  807. procedure TFrmEdit.lvStartupDisabledClick(Sender: TObject);
  808. begin
  809.     if (lvStartupDisabled.SelCount = 1) then begin
  810.         bStartupEnable.Enabled := true;
  811.         bStartupOtherProperties.Enabled := true;
  812.         if (lvStartupDisabled.Selected.SubItems[0] = DISABLED_STATUS) then begin
  813.             bStartupEnable.Caption := 'Enable';
  814.             btnStartupDelete.Enabled := true;
  815.         end else begin
  816.             bStartupEnable.Caption := 'Include';
  817.         end;
  818.     end else begin
  819.         bStartupEnable.Enabled := false;
  820.         bStartupOtherProperties.Enabled := false;
  821.         btnStartupDelete.Enabled := false;
  822.     end;
  823. end;
  824.  
  825. procedure TFrmEdit.bStartupEnableClick(Sender: TObject);
  826. var shortcut : string;
  827. begin
  828.     shortcut := lvStartupDisabled.Selected.Caption;
  829.  
  830.     if (lvStartupDisabled.Selected.SubItems[0] = EXCLUDED_STATUS) then begin
  831.         ItemManager.IncludeStartupItem(shortcut);
  832.     end else begin
  833.         ItemManager.EnableStartupItem(shortcut);
  834.     end;
  835.  
  836.     lvStartupDisabled.DeleteSelected;
  837.     bStartupEnable.Enabled := false;
  838.     bStartupOtherProperties.Enabled := false;
  839.     btnStartupDelete.Enabled := false;
  840.     
  841.     self.LoadData;
  842. end;
  843.  
  844. procedure TFrmEdit.bRunkeyEnableClick(Sender: TObject);
  845. var i : integer;
  846. begin
  847.     for i := 0 to (lvRunkeyDisabled.Items.count - 1) do begin
  848.         if (lvRunkeyDisabled.Items[i].Selected) then begin
  849.             if (lvRunkeyDisabled.Items[i].SubItems[1] = EXCLUDED_STATUS) then begin
  850.                 ItemManager.IncludeRunkeyItem(lvRunkeyDisabled.Items[i].Caption);
  851.             end else begin
  852.                 ItemManager.EnableRunkeyItem(lvRunkeyDisabled.Items[i].Caption);
  853.             end;
  854.         end;
  855.     end;
  856.     lvRunkeyDisabled.DeleteSelected;
  857.     self.LoadData;
  858.  
  859.     bRunkeyEnable.Enabled := false;
  860.     bRunkeyOtherProperties.Enabled := false;
  861.     btnRunkeyDelete.Enabled := false;
  862. end;
  863.  
  864. procedure TFrmEdit.btnRunkeyDeleteClick(Sender: TObject);
  865. begin
  866.     if
  867.         MessageDlg('Permanently delete item?', mtConfirmation, [mbYes,mbNo], 0)
  868.         = mrYes then begin
  869.  
  870.         r.DeleteDataString(SR_RUNDISABLED_KEY, lvRunkeyDisabled.Selected.caption);
  871.         self.LoadData;
  872.     end;
  873. end;
  874.  
  875. procedure TFrmEdit.lvRunkeyDisabledClick(Sender: TObject);
  876. begin
  877.     if (lvRunkeyDisabled.SelCount = 1) then begin
  878.         bRunkeyEnable.Enabled := true;
  879.         bRunkeyOtherProperties.Enabled := true;
  880.         btnRunkeyDelete.Enabled := false;
  881.         if (lvRunkeyDisabled.Selected.SubItems[1] = DISABLED_STATUS) then begin
  882.             bRunkeyEnable.Caption := 'Enable';
  883.             btnRunkeyDelete.Enabled := true;
  884.         end else begin
  885.             bRunkeyEnable.Caption := 'Include';
  886.         end;
  887.     end else begin
  888.         btnRunkeyDelete.Enabled := false;
  889.         bRunkeyEnable.Enabled := false;
  890.         bRunkeyOtherProperties.Enabled := false;        
  891.     end;
  892.  
  893. end;
  894.  
  895. function TFrmEdit.SelectNewItems : boolean;
  896. var values : TStringList;
  897.     i : integer;
  898.     li : TListItem;
  899.     topItemSet : boolean;
  900. begin
  901.     // read new values
  902.     values := TStringList.Create;
  903.     r.GetValues(SR_RUNNEWITEMS_KEY, values);
  904.  
  905.     // select new items
  906.     result := false;
  907.     lvRunkeySort.ClearSelection;
  908.     topItemSet := false;
  909.     for i := 0 to (values.Count - 1) do begin
  910.         li := lvRunkeySort.FindCaption(0,values.Strings[i],false,true,false);
  911.         if li = nil then CONTINUE;
  912.  
  913.         li.Selected := true;
  914.         result := true;
  915.         {make the first item visible to the user}
  916.         if (not topItemSet) then  begin
  917.             li.MakeVisible(true);
  918.             topItemSet := true;
  919.         end;
  920.     end;
  921.     values.free;
  922.  
  923.     self.lvRunkeySortClick(self);
  924. end;
  925.  
  926.  
  927.  
  928.  
  929. procedure TFrmEdit.bRunkeyOtherPropertiesClick(Sender: TObject);
  930. var f : string;
  931. begin
  932.     f := UnitMyKeys.FindExecutableFromRunValue( lvRunkeyDisabled.Selected.SubItems.Strings[0]);
  933.     if (f = '') then begin
  934.         Dialogs.ShowMessage('Cannot locate executable');
  935.     end else begin
  936.         self.ShowPropertiesDialog(f);
  937.     end;
  938. end;
  939.  
  940.  
  941. procedure TFrmEdit.bStartupOtherPropertiesClick(Sender: TObject);
  942. begin
  943.     self.ShowPropertiesDialog(lvStartupDisabled.Selected.caption);
  944. end;
  945.  
  946. procedure TFrmEdit.bSelectNewRunItemsClick(Sender: TObject);
  947. var values : TStringList;
  948.     i : integer;
  949.     li : TListItem;
  950.     topItemSet : boolean;
  951.     s : string;
  952. begin
  953.     values := TStringList.Create;
  954.  
  955.     // read new values
  956.     r.GetValues(SR_STARTUPNEW_KEY, values);
  957.     r.GetValueNames(values);
  958.  
  959.     // select new items
  960.  
  961.     lvRunkeySort.ClearSelection;
  962.     topItemSet := false;
  963.     for i := 0 to (values.Count - 1) do begin
  964.         s := r.ReadString(values.Strings[i]);
  965.         li := lvStartup.FindCaption(0,s,false,true,false);
  966.         if li = nil then CONTINUE;
  967.  
  968.         li.Selected := true;
  969.  
  970.         {make the first item visible to the user}
  971.         if (not topItemSet) then  begin
  972.             li.MakeVisible(true);
  973.             topItemSet := true;
  974.         end;
  975.     end;
  976.     values.free;
  977.  
  978.     if (not topItemSet) then   ShowMessage('No new items');
  979.     self.lvStartupClick(self);
  980. end;
  981.  
  982. procedure TFrmEdit.btnSetPauseClick(Sender: TObject);
  983. var i : integer;
  984. begin
  985.     try
  986.         i := StrToInt(txtPause.text);
  987.     except on e : exception do
  988.         begin
  989.             ShowMessage('Pause value must be numbers only');
  990.             EXIT;
  991.         end;
  992.     end;
  993.     UnitMyKeys.SetCustomDelay(lvRunkeySort.Selected.caption, i);
  994.  
  995.     self.LoadData;
  996. end;
  997.  
  998. procedure TFrmEdit.btnSetStartupPauseClick(Sender: TObject);
  999. var i : integer;
  1000. begin
  1001.     try
  1002.         i := StrToInt(txtStartupPause.text);
  1003.     except on e : exception do
  1004.         begin
  1005.             ShowMessage('Pause value must be numbers only');
  1006.             EXIT;
  1007.         end;
  1008.     end;
  1009.     UnitMyKeys.SetCustomDelay(lvStartup.Selected.caption, i);
  1010.  
  1011.     self.LoadData;
  1012. end;
  1013.  
  1014.  
  1015.  
  1016. procedure TFrmEdit.btnStartupDeleteClick(Sender: TObject);
  1017. begin
  1018.     if
  1019.         MessageDlg('Permanently delete item?', mtConfirmation, [mbYes,mbNo], 0)
  1020.         = mrYes then begin
  1021.  
  1022.         r.DeleteDataString(
  1023.             SR_STARTUPDISABLE_KEY,
  1024.             ExtractFilename(lvStartupDisabled.Selected.caption));
  1025.  
  1026.         self.LoadData;
  1027.     end;
  1028. end;
  1029. end.
  1030.