home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 February / PCWorld_1999-02_cd.bin / temacd / HotKeys / hkSelect.pas < prev    next >
Pascal/Delphi Source File  |  1998-08-18  |  8KB  |  333 lines

  1. unit hkSelect;
  2.  
  3. interface
  4.  
  5. uses Windows, SysUtils, ComCtrls, Classes, Graphics, Forms, Controls, StdCtrls,
  6.   Buttons;
  7.  
  8. type
  9.   TfrmSelect = class(TForm)
  10.     btnOk: TButton;
  11.     btnCancel: TButton;
  12.     SrcLabel: TLabel;
  13.     DstLabel: TLabel;
  14.     btnInclude: TButton;
  15.     btnInclAll: TButton;
  16.     btnExclude: TButton;
  17.     btnExclAll: TButton;
  18.     lvSource: TListView;
  19.     lvDestination: TListView;
  20.     Label1: TLabel;
  21.     edtDelay: TEdit;
  22.     btnAddDelay: TButton;
  23.     lblMilliseconds: TLabel;
  24.     udDelay: TUpDown;
  25.     btnUp: TSpeedButton;
  26.     btnDown: TSpeedButton;
  27.     procedure btnIncludeClick(Sender: TObject);
  28.     procedure btnExcludeClick(Sender: TObject);
  29.     procedure btnInclAllClick(Sender: TObject);
  30.     procedure btnExclAllClick(Sender: TObject);
  31.     procedure lvSourceClick(Sender: TObject);
  32.     procedure lvDestinationChange(Sender: TObject; Item: TListItem;
  33.       Change: TItemChange);
  34.     procedure lvDestinationClick(Sender: TObject);
  35.     procedure edtDelayExit(Sender: TObject);
  36.     procedure btnAddDelayClick(Sender: TObject);
  37.     procedure btnUpClick(Sender: TObject);
  38.     procedure btnDownClick(Sender: TObject);
  39.   private
  40.     procedure GetDelay(var Sel: String);
  41.     procedure DeleteFromSource(Item: TListItem);
  42.     function  NextItem(var Commands: String): String;
  43.     procedure SelectAll(List: TListView);
  44.     procedure MoveSelected(Source, Destination: TListView);
  45.     procedure SetButtons;
  46.     function GetSelection: String;
  47.   public
  48.     function Execute(List: TListView; InitialSelection: String): Boolean;
  49.     property Selection: String read GetSelection;
  50.     { Public declarations }
  51.   end;
  52.  
  53. var
  54.   frmSelect: TfrmSelect;
  55.  
  56. implementation
  57.  
  58. {$R *.DFM}
  59.  
  60. uses
  61.   hkEdit;
  62.  
  63. procedure TfrmSelect.btnIncludeClick(Sender: TObject);
  64. begin
  65.   MoveSelected(lvSource, lvDestination);
  66. end;
  67.  
  68. procedure TfrmSelect.btnExcludeClick(Sender: TObject);
  69. begin
  70.   MoveSelected(lvDestination, lvSource);
  71.   lvDestinationClick(Self);
  72. end;
  73.  
  74. procedure TfrmSelect.btnInclAllClick(Sender: TObject);
  75. begin
  76.   SelectAll(lvSource);
  77.   MoveSelected(lvSource, lvDestination);
  78. end;
  79.  
  80. procedure TfrmSelect.btnExclAllClick(Sender: TObject);
  81. begin
  82.   SelectAll(lvDestination);
  83.   MoveSelected(lvDestination, lvSource);
  84.   lvDestinationClick(Self);
  85. end;
  86.  
  87. procedure TfrmSelect.SelectAll(List: TListView);
  88. var
  89.   i : integer;
  90. begin
  91.   for i:=0 to List.Items.Count-1 do List.Items[i].Selected := True;
  92. end;
  93.  
  94. procedure TfrmSelect.MoveSelected(Source, Destination: TListView);
  95. var
  96.   i : integer;
  97. begin
  98.   i := 0;
  99.   while i<Source.Items.Count do
  100.    begin
  101.      if Source.Items[i].Selected then
  102.       begin
  103.         if Source.Items[i].SubItems.Count>0 then
  104.          with Destination.Items.Add do
  105.           begin
  106.             Caption := Source.Items[i].Caption;
  107.             SubItems.Assign(Source.Items[i].SubItems);
  108.             Selected := True;
  109.           end;
  110.         Source.Items.Delete(i);
  111.       end
  112.      else
  113.       inc(i);
  114.    end;
  115.   SetButtons;
  116. end;
  117.  
  118. procedure TfrmSelect.SetButtons;
  119. var
  120.   bUpEnabled,
  121.   bFirst     : Boolean;
  122.   i,
  123.   iLastSelect: Integer;
  124.  
  125. begin
  126.   btnInclude.Enabled := lvSource.SelCount>0;
  127.   btnInclAll.Enabled := lvSource.Items.Count>0;
  128.   btnExclude.Enabled := lvDestination.SelCount>0;
  129.   btnExclAll.Enabled := lvDestination.Items.Count>0;
  130.   btnOk.Enabled := btnExclAll.Enabled;
  131.  
  132.   bFirst := True;
  133.   bUpEnabled := False;
  134.   iLastSelect := -1;
  135.   for i:=0 to lvDestination.Items.Count-1 do
  136.    if lvDestination.Items[i].Selected then
  137.     begin
  138.       if bFirst and (i>0) then bUpEnabled := True;
  139.       bFirst := False;
  140.       iLastSelect := i;
  141.      end;
  142.    btnUp.Enabled := bUpEnabled;
  143.    btnDown.Enabled := (iLastSelect<>-1) and (iLastSelect<lvDestination.Items.Count-1);
  144. end;
  145.  
  146. function TfrmSelect.GetSelection: String;
  147. var
  148.   i    : integer;
  149.   sItem: String;
  150. begin
  151.   for i:=0 to lvDestination.Items.Count-1 do
  152.    begin
  153.      if lvDestination.Items[i].SubItems.Count=0 then
  154.       begin
  155.         sItem := lvDestination.Items[i].Caption;
  156.         sItem := 'D='+Copy(sItem, Pos('=', sItem)+1, Length(sItem));
  157.       end
  158.      else
  159.       sItem := lvDestination.Items[i].SubItems[0];
  160.      Result := Result + sItem + ';';
  161.    end;
  162.   if Result<>'' then Delete(Result, Length(Result), 1);
  163. end;
  164.  
  165. procedure TfrmSelect.GetDelay(var Sel: String);
  166. var
  167.   P : Integer;
  168. begin
  169.   P := Pos('D=', Sel);
  170.   if P=1 then
  171.    begin
  172.      Delete(Sel, 1, P+1);
  173.      P := Pos(';', Sel);
  174.      lvDestination.Items.Add.Caption := 'Delay='+Copy(Sel, 1, P-1);
  175.      Delete(Sel, 1, P);
  176.    end;
  177. end;
  178.  
  179. function TfrmSelect.NextItem(var Commands: String): String;
  180. var
  181.   P : Integer;
  182. begin
  183.   P := Pos(';', Commands);
  184.   if P>0 then
  185.    begin
  186.      Result := Copy(Commands, 1, P-1);
  187.      Delete(Commands, 1, P);
  188.    end
  189.   else
  190.    begin
  191.      Result := Commands;
  192.      Commands := '';
  193.    end;
  194. end;
  195.  
  196. procedure TfrmSelect.DeleteFromSource(Item: TListItem);
  197. var
  198.   i : integer;
  199. begin
  200.   for i:=0 to lvSource.Items.Count-1 do
  201.    with lvSource.Items[i] do
  202.     if (Caption = Item.Caption) and (SubItems[ITEM_ID]= Item.SubItems[ITEM_ID]) then
  203.      begin
  204.        lvSource.Items.Delete(i);
  205.        Exit;
  206.      end;
  207. end;
  208.  
  209. function TfrmSelect.Execute(List: TListView; InitialSelection: String): Boolean;
  210. var
  211.   i : Integer;
  212.   sItemID: String;
  213. begin
  214.   lvSource.Items.Clear;
  215.   lvDestination.Items.Clear;
  216.   GetDelay(InitialSelection);
  217.   lvSource.Items.Assign(List.Items);
  218.   i := 0;
  219.   while i<lvSource.Items.Count-1 do
  220.    if frmHotkeyEdit.cboActions.Items.IndexOf(lvSource.Items[i].SubItems[ITEM_ACTION])=2 then
  221.     lvSource.Items.Delete(i)
  222.    else
  223.     inc(i);
  224.  
  225.   while InitialSelection<>'' do
  226.    begin
  227.      GetDelay(InitialSelection);
  228.      sItemID := NextItem(InitialSelection);
  229.      while (sItemID<>'') do
  230.       begin
  231.         i := 0;
  232.         while (i<List.Items.Count) do
  233.          if List.Items[i].SubItems[ITEM_ID]=sItemID then
  234.           begin
  235.             lvDestination.Items.Add.Assign(List.Items[i]);
  236.             DeleteFromSource(List.Items[i]);
  237.             i := List.Items.Count;
  238.           end
  239.          else
  240.           inc(i);
  241.         GetDelay(InitialSelection);
  242.         sItemID := NextItem(InitialSelection);
  243.       end;
  244.    end;
  245.   Result := ShowModal = mrOk;
  246. end;
  247.  
  248. procedure TfrmSelect.lvSourceClick(Sender: TObject);
  249. begin
  250.   SetButtons;
  251. end;
  252.  
  253. procedure TfrmSelect.lvDestinationChange(Sender: TObject; Item: TListItem;
  254.   Change: TItemChange);
  255. begin
  256.   if Change=ctState then lvDestinationClick(Sender);
  257. end;
  258.  
  259. procedure TfrmSelect.lvDestinationClick(Sender: TObject);
  260. begin
  261.   if (lvDestination.Selected<>nil) and (lvDestination.Selected.SubItems.Count=0) then
  262.    btnAddDelay.Caption := '&Edit'
  263.   else
  264.    btnAddDelay.Caption := '&Add';
  265.   if btnAddDelay.Caption = '&Edit' then
  266.    with lvDestination.Selected do
  267.     if SubItems.Count=0 then
  268.      begin
  269.        udDelay.Position := StrToIntDef(Copy(Caption, Pos('=', Caption)+1, Length(Caption)), 0);
  270.        edtDelay.Text := IntToStr(udDelay.Position);
  271.      end;
  272.   SetButtons;
  273. end;
  274.  
  275. procedure TfrmSelect.edtDelayExit(Sender: TObject);
  276. begin
  277.   edtDelay.Text := IntToStr(udDelay.Position);
  278. end;
  279.  
  280. procedure TfrmSelect.btnAddDelayClick(Sender: TObject);
  281. begin
  282.   if btnAddDelay.Caption = '&Add' then
  283.    lvDestination.Items.Add.Caption := 'Delay='+edtDelay.Text
  284.   else
  285.    lvDestination.Selected.Caption := 'Delay='+edtDelay.Text;
  286. end;
  287.  
  288. procedure TfrmSelect.btnUpClick(Sender: TObject);
  289. var
  290.   i: Integer;
  291.   OldItem: TListItem;
  292. begin
  293.   i := 1;
  294.   while i<=lvDestination.Items.Count-1 do
  295.    begin
  296.      if lvDestination.Items[i].Selected then
  297.       begin
  298.         OldItem := lvDestination.Items[i];
  299.         with lvDestination.Items.Insert(i-1) do
  300.          begin
  301.            Assign(OldItem);
  302.            Selected := True;
  303.          end;
  304.         OldItem.Free;
  305.       end;
  306.      inc(i);
  307.    end;
  308. end;
  309.  
  310. procedure TfrmSelect.btnDownClick(Sender: TObject);
  311. var
  312.   i : integer;
  313.   OldItem: TListItem;
  314. begin
  315.   i := lvDestination.Items.Count-2;
  316.   while i>=0 do
  317.    begin
  318.      if lvDestination.Items[i].Selected then
  319.       begin
  320.         OldItem := lvDestination.Items[i];
  321.         with lvDestination.Items.Insert(i+2) do
  322.          begin
  323.            Assign(OldItem);
  324.            Selected := True;
  325.          end;
  326.         OldItem.Free;
  327.       end;
  328.      dec(i);
  329.    end;
  330. end;
  331.  
  332. end.
  333.