home *** CD-ROM | disk | FTP | other *** search
/ Softwarová Záchrana 3 / Softwarova-zachrana-3.bin / ArsClip / source.zip / UnitFrmPermanent.pas < prev    next >
Pascal/Delphi Source File  |  2003-02-18  |  15KB  |  574 lines

  1. unit UnitFrmPermanent;
  2. {
  3.     NOTE:
  4.         This beast has gone BYE BYE. See UnitFrmPermanentNew for it's
  5.         replacement.
  6.  
  7.         
  8.  
  9.     Purpose:
  10.         This unit stores/reads/edits the permanent items.
  11.         The form is not a dummy form.
  12.  
  13.     Updates:
  14.         Display '&' without defining an accelerator key in text items
  15.  
  16.         Improved error reporting for corrupt data file
  17.  
  18.         New procedure to show the form with a new item added
  19.  
  20.         Refresh dropdown when saving a new permanent item group.
  21.         Saves before group change and saves before closing.
  22.  
  23.         Crapy, Crappy, Crappy code.
  24.         Changes where not saved before the group was changed.
  25.         Essentially, changes would not be saved at all in some cases.
  26.  
  27.         CRLF wasn't used to count the number of lines in "Text to Paste".
  28. }
  29.  
  30. interface
  31.  
  32. uses
  33.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  34.   Dialogs, StdCtrls, ExtCtrls;
  35.  
  36.  
  37. const DEFAULT_FOLDER = 'Default';
  38.       ADDNEW_FOLDER = '<add new>';
  39.       PERM0_FILE = 'perm0.ini';
  40.       PERM1_FILE = 'perm1.ini';
  41.  
  42. type
  43.   TfrmPermanentOld = class(TForm)
  44.     GroupBox1: TGroupBox;
  45.     txtItemName: TEdit;
  46.     Label1: TLabel;
  47.     mItemText: TMemo;
  48.     btnSave: TButton;
  49.     Panel1: TPanel;
  50.     lbItemName: TListBox;
  51.     lbItemText: TListBox;
  52.     btnUp: TButton;
  53.     btnDown: TButton;
  54.     Label2: TLabel;
  55.     btnDelete: TButton;
  56.     cbGroups: TComboBox;
  57.     labelx: TLabel;
  58.     btnDeleteGroup: TButton;
  59.     Label3: TLabel;
  60.     procedure FormShow(Sender: TObject);
  61.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  62.     procedure txtItemNameChange(Sender: TObject);
  63.     procedure mItemTextChange(Sender: TObject);
  64.     procedure btnSaveClick(Sender: TObject);
  65.     procedure lbItemNameClick(Sender: TObject);
  66.     procedure btnUpClick(Sender: TObject);
  67.     procedure FormCreate(Sender: TObject);
  68.     procedure FormDestroy(Sender: TObject);
  69.     procedure btnDownClick(Sender: TObject);
  70.     procedure btnDeleteClick(Sender: TObject);
  71.     procedure cbGroupsCloseUp(Sender: TObject);
  72.     procedure btnDeleteGroupClick(Sender: TObject);
  73.     procedure cbGroupsClick(Sender: TObject);
  74.   private
  75.     { Private declarations }
  76.     AppPath : string;
  77.     PermPath : string;
  78.     PermFolders : TStringList;
  79.     OverrideBlankItem : boolean;
  80.  
  81.     function GetOldDataFilename (i: integer): string;
  82.     function GetDataFilename (i: integer): string;
  83.     procedure LoadPermanentItems;
  84.     procedure SavePermanentItems;
  85.   public
  86.     { Public declarations }
  87.  
  88.     {item enumeration API}
  89.     function GetCount: integer;
  90.     function GetItemName(i: integer): string;
  91.     function GetItemText(i: integer): string;
  92.     function GetTextFrom(name: string): string;
  93.  
  94.     {permanent items group}
  95.     {for frmConfig}
  96.     procedure PermFoldersRefresh;
  97.     function PermFoldersGetCount : cardinal;
  98.     function PermFoldersGetItem(index : cardinal) : string;
  99.  
  100.     function GetPermanentPath : string;
  101.     procedure SetPermanentPath( path : string );
  102.     procedure ShowWithNewItem(item : string);
  103.   end;
  104.  
  105. var
  106.   frmPermanentOld: TfrmPermanentOld;
  107.  
  108. implementation
  109.  
  110. {$R *.dfm}
  111.  
  112. uses INIFiles;
  113. const PERM_ITEMS = 'Permanent Items';
  114.  
  115.  
  116. {
  117. --======================
  118. -- // Public Inteface //
  119. --======================
  120. }
  121.  
  122. procedure TfrmPermanentOld.ShowWithNewItem(item : string);
  123. begin
  124.     OverrideBlankItem := true;
  125.     mItemText.Text := item;
  126.     self.Show;
  127. end;
  128.  
  129. function TfrmPermanentOld.GetCount: integer;
  130. begin
  131.     result := lbItemName.Count;
  132. end;
  133.  
  134. function TfrmPermanentOld.GetItemName(i: integer): string;
  135. begin
  136.     result := lbItemName.Items[i];
  137. end;
  138.  
  139. function TfrmPermanentOld.GetItemText(i: integer): string;
  140. begin
  141.     result := lbItemText.Items[i];
  142. end;
  143.  
  144. function TfrmPermanentOld.GetTextFrom(name: string): string;
  145. var pos: integer;
  146.     i: integer;
  147. begin
  148.     pos := -1;
  149.     for i := 0 to lbItemname.count - 1 do begin
  150.         if (name = lbItemName.items[i]) then begin
  151.             pos := i;
  152.         end;
  153.     end;
  154.  
  155.     result := lbItemText.items[pos];
  156. end;
  157.  
  158.  
  159. //
  160. //
  161. //
  162. function TfrmPermanentOld.GetPermanentPath : string;
  163. begin
  164.     result := PermPath;
  165. end;
  166.  
  167. procedure TfrmPermanentOld.SetPermanentPath( path : string );
  168. begin
  169.     PermPath := path;
  170.     self.LoadPermanentItems;
  171. end;
  172.  
  173. procedure TfrmPermanentOld.PermFoldersRefresh;
  174. var rec : TSearchRec;
  175.     r : integer;
  176. begin
  177.     //
  178.     // Load the permanent items group
  179.     // Select the current group
  180.     //
  181.     cbGroups.items.clear;
  182.     PermFolders.Clear;
  183.     cbGroups.items.Add(ADDNEW_FOLDER);
  184.     r := FindFirst(AppPath + '*.*', faDirectory, rec);
  185.     while (r = 0) do begin
  186.         if (rec.Attr and faDirectory) > 0 then begin
  187.             if (rec.name <> '.') and (rec.name <> '..') then begin
  188.                 if fileexists(AppPath + rec.name + '\' + PERM0_FILE  ) then begin
  189.                     PermFolders.Add(rec.name);
  190.                     cbGroups.Items.Add(rec.name);
  191.                 end;
  192.                 if lowercase(rec.name) = lowercase(PermPath) then begin
  193.                     cbGroups.ItemIndex := cbGroups.Items.Count - 1;
  194.                 end;
  195.             end;
  196.         end;
  197.         r := FindNext(rec);
  198.     end;
  199.  
  200.     //
  201.     // If no permanent items found, insert the default folder name and select it
  202.     //
  203.     if cbGroups.Items.count = 1 then begin
  204.         cbGroups.Items.Add(DEFAULT_FOLDER);
  205.         cbGroups.ItemIndex := 1;
  206.     end;
  207.  
  208. end;
  209. function TfrmPermanentOld.PermFoldersGetCount : cardinal;
  210. begin
  211.     result := PermFolders.Count;
  212. end;
  213. function TfrmPermanentOld.PermFoldersGetItem(index : cardinal) : string;
  214. begin
  215.     result := PermFolders.Strings[index];
  216. end;
  217.  
  218.  
  219.  
  220. {
  221. --======================
  222. -- // Create/Destroy //
  223. --======================
  224. }
  225. function TfrmPermanentOld.GetOldDataFilename(i: integer): string;
  226. begin
  227.     result := self.AppPath + 'perm' + IntToStr(i) + '.ini';
  228. end;
  229. function TfrmPermanentOld.GetDataFilename(i: integer): string;
  230. begin
  231.     case i of
  232.     0: result := IncludeTrailingPathDelimiter(self.AppPath + PermPath) + PERM0_FILE;
  233.     1: result := IncludeTrailingPathDelimiter(self.AppPath + PermPath) + PERM1_FILE;
  234.     end
  235. end;
  236.  
  237.  
  238.  
  239. procedure TfrmPermanentOld.FormCreate(Sender: TObject);
  240. var    name: string;
  241. begin
  242.     self.PermPath := DEFAULT_FOLDER;
  243.     self.AppPath := ExtractFilePath(application.ExeName);
  244.     self.PermFolders := TStringList.Create;
  245.  
  246.     //
  247.     // make the new Default directory and import and
  248.     // current permanent items
  249.     //
  250.     if not DirectoryExists( self.AppPath + DEFAULT_FOLDER) then begin
  251.         mkdir(self.AppPath + DEFAULT_FOLDER);
  252.  
  253.         name := GetOldDataFilename(0);
  254.         if FileExists(name) then
  255.             copyfile(pchar(name), PChar(GetDataFileName(0)), true);
  256.  
  257.         name := GetOldDataFilename(1);
  258.         if fileExists(name) then
  259.             copyfile(pchar(name), PChar(GetDataFilename(1)), true);
  260.     end;
  261.  
  262.     self.LoadPermanentItems;
  263.     self.PermFoldersRefresh;
  264. end;
  265.  
  266. procedure TfrmPermanentOld.FormDestroy(Sender: TObject);
  267. begin
  268.     //self.SavePermanentItems;
  269.     self.PermFolders.Free;
  270. end;
  271.  
  272.  
  273. {
  274. --======================
  275. -- // Show / Close    //
  276. --======================
  277. }
  278.  
  279. procedure TfrmPermanentOld.FormShow(Sender: TObject);
  280. begin
  281.     //
  282.     // blank out the edit window
  283.     //
  284.     if (lbItemname.ItemIndex = -1) then begin
  285.         txtItemName.Text := '';
  286.         if (not OverrideBlankItem) then begin
  287.             mItemText.Text := '';
  288.         end;
  289.     end;
  290.  
  291.     //
  292.     // disable the up/down buttons (until an item is clicked in the list)
  293.     //
  294.     btnup.Enabled := (lbItemName.itemindex <> -1);
  295.     btndown.Enabled := btnup.enabled;
  296.     btndelete.Enabled := btnup.Enabled;
  297.  
  298.     btnsave.Enabled := false;
  299.  
  300.     self.PermFoldersRefresh;
  301. end;
  302.  
  303. procedure TfrmPermanentOld.FormClose(Sender: TObject;
  304.   var Action: TCloseAction);
  305. begin
  306.     if Trim(cbGroups.Text) = '' then begin
  307.         if PermPath = '' then begin
  308.             cbGroups.Text := DEFAULT_FOLDER;
  309.             PermPath := cbGroups.Text;
  310.         end else begin
  311.             cbGroups.text := PermPath;
  312.         end;
  313.         self.LoadPermanentItems;
  314.     end else begin
  315.         PermPath := trim(cbGroups.text);
  316.     end;
  317.  
  318.  
  319.     self.SavePermanentItems;
  320.     self.PermFoldersRefresh;
  321.     self.ModalResult := 1;
  322. end;
  323.  
  324.  
  325.  
  326.  
  327. {
  328. --==================================
  329. -- // Load/Save Permanent Items //
  330. --==================================
  331. }
  332. procedure TfrmPermanentOld.LoadPermanentItems;
  333. var name, itemText, s : string;
  334.     lineCount : cardinal;
  335.     i : integer;
  336.     tf : textfile;
  337. begin
  338.     //
  339.     // load permanent items
  340.     //
  341.     lbItemName.Items.Clear;
  342.     name := GetDataFilename(0);
  343.     if FileExists(name) then begin
  344.         lbItemName.Items.LoadFromFile(name);
  345.     end;
  346.  
  347.     //
  348.     // abort reading and show message on error
  349.     // always close the file
  350.     //
  351.     lbItemText.Items.Clear;
  352.     name := GetDataFilename(1);
  353.     if FileExists(name) then begin
  354.         AssignFile(tf, name);
  355.         Reset(tf, name);
  356.  
  357.         try
  358.             while not eof(tf) do begin
  359.                 try
  360.                     Readln(tf, s);
  361.                     itemText := '';
  362.                     lineCount := StrToInt(s);
  363.  
  364.                     for i := 0 to lineCount - 1 do begin
  365.                         Readln(tf, s);
  366.                         if (itemText = '') then begin
  367.                             itemText := s;
  368.                         end else begin
  369.                             itemText := itemText + chr(13) + chr(10) + s;
  370.                         end;
  371.                     end;
  372.  
  373.                     lbItemText.Items.Add(itemText);
  374.                 except
  375.                      on E: Exception do begin
  376.                         ShowMessage('The "Permanent Item" file for group ' + PermPath + ' is corrupted - ' + name + #13#10#13#10 +
  377.                                     'Error Message: ' + E.Message);
  378.                         break;
  379.                      end;
  380.                 end;
  381.             end;
  382.         finally
  383.             CloseFile(tf);
  384.         end;
  385.     end;
  386. end;
  387.  
  388. procedure TfrmPermanentOld.SavePermanentItems;
  389. var name: string;
  390.     s : string;
  391.     cnt : cardinal;
  392.  
  393.     i,j: longint;
  394.     tf: textfile;
  395.  
  396.     DoRefresh : boolean;
  397. begin
  398.     PermPath := trim(cbGroups.text);
  399.     if (PermPath = '') then
  400.         EXIT;
  401.  
  402.     DoRefresh := false;
  403.     if not DirectoryExists(AppPath + PermPath) then begin
  404.         mkdir(AppPath + PermPath);
  405.         DoRefresh := true;
  406.     end;
  407.     //
  408.     // save items
  409.     //
  410.     name := GetDataFilename(0);
  411.     lbItemName.Items.SaveToFile(name);
  412.  
  413.     name := GetDataFilename(1);
  414.     AssignFile(tf, name);
  415.     Rewrite(tf);
  416.  
  417.  
  418.     for i := 0 to lbItemText.Count - 1 do begin
  419.         s := lbItemText.Items[i];
  420.  
  421.         cnt := 1;
  422.         for j := 1 to length(s) - 1 do begin
  423.             if (s[j] = #13) and (s[j+1]= #10) then inc(cnt);
  424.         end;
  425.  
  426.         writeln(tf, cnt);
  427.         writeln(tf, s);
  428.     end;
  429.  
  430.     CloseFile(tf);
  431.  
  432.     if (DoRefresh) then begin
  433.         self.PermFoldersRefresh;
  434.     end;
  435. end;
  436.  
  437. {
  438. --
  439. -- Only show the save button when an item name and some item text has been entered
  440. --
  441. }
  442. procedure TfrmPermanentOld.txtItemNameChange(Sender: TObject);
  443. begin
  444.     btnsave.Enabled := (trim(txtitemname.Text) <> '') and (mItemText.Text <> '');
  445. end;
  446.  
  447. procedure TfrmPermanentOld.mItemTextChange(Sender: TObject);
  448. begin
  449.     btnsave.Enabled := (trim(txtitemname.Text) <> '') and (mItemText.Text <> '');
  450. end;
  451.  
  452. procedure TfrmPermanentOld.btnSaveClick(Sender: TObject);
  453. var i: integer;
  454.     pos: integer;
  455. begin
  456.     txtItemName.text := trim(txtItemName.text);
  457.     pos := -1;
  458.     for i := 0 to lbItemName.count -1 do begin
  459.         if (lbItemName.items[i] = txtItemName.Text) then begin
  460.             pos := i;
  461.         end;
  462.  
  463.     end;
  464.  
  465.     if (pos = -1) then begin
  466.         lbItemName.Items.Add( trim(txtItemName.Text) );
  467.         lbItemText.Items.Add( mItemText.Text );
  468.     end else begin
  469.         lbItemText.Items[pos] := mItemText.Text;
  470.     end;
  471.  
  472.     txtItemName.Text := '';
  473.     mItemText.Text := '';
  474. end;
  475.  
  476.  
  477.  
  478. {
  479. Load the edit pane when an item is selected from the lsit
  480. Enable position moving
  481. }
  482.  
  483. procedure TfrmPermanentOld.lbItemNameClick(Sender: TObject);
  484. begin
  485.     btnUp.Enabled := (lbItemName.Count > 0);
  486.     btnDown.Enabled := btnUp.Enabled;
  487.     btnDelete.Enabled := btnUp.Enabled;
  488.  
  489.     txtItemName.text := lbItemName.items[ lbItemName.ItemIndex ];
  490.     mItemText.Text := lbItemText.Items[ lbItemName.ItemIndex ];
  491. end;
  492.  
  493. {
  494. move selected item up or down and keep selected
  495. }
  496. procedure TfrmPermanentOld.btnUpClick(Sender: TObject);
  497. var i: integer;
  498. begin
  499.     i := lbItemName.ItemIndex;
  500.     if (i <> 0) then begin
  501.         lbItemName.Items.Move(i, i - 1);
  502.         lbItemText.Items.Move(i, i - 1);
  503.  
  504.         lbItemName.ItemIndex := i - 1;
  505.     end;
  506. end;
  507. procedure TfrmPermanentOld.btnDownClick(Sender: TObject);
  508. var i: integer;
  509. begin
  510.     i := lbItemName.ItemIndex;
  511.     if (i <> lbItemName.Count -1) then begin
  512.         lbItemName.Items.Move(i, i + 1);
  513.         lbItemText.Items.Move(i, i + 1);
  514.  
  515.         lbItemName.ItemIndex := i + 1;
  516.     end;
  517. end;
  518.  
  519. procedure TfrmPermanentOld.btnDeleteClick(Sender: TObject);
  520. var i: integer;
  521. begin
  522.     i := lbItemName.ItemIndex;
  523.     lbItemName.Items.Delete(i);
  524.     lbItemText.Items.Delete(i);
  525.     txtItemName.Text := '';
  526.     mItemText.Text := '';
  527. end;
  528.  
  529.  
  530. procedure TfrmPermanentOld.cbGroupsCloseUp(Sender: TObject);
  531. begin
  532.     //
  533.     // load an existing group or get ready for a brand new group
  534.     //
  535.     if cbGroups.Items[cbGroups.ItemIndex] = ADDNEW_FOLDER then begin
  536.         lbItemName.Items.clear;
  537.         lbItemText.Items.Clear;
  538.         cbGroups.Text := '';
  539.         cbGroups.SelText := '';
  540.     end else begin
  541.         self.SavePermanentItems;
  542.  
  543.         PermPath := cbGroups.items[cbGroups.ItemIndex];
  544.         self.LoadPermanentItems;
  545.     end;
  546.  
  547. end;
  548.  
  549. procedure TfrmPermanentOld.btnDeleteGroupClick(Sender: TObject);
  550. begin
  551.     //
  552.     // get rid of the data files and remove the folder
  553.     // refresh to show changes
  554.     //
  555.     if DirectoryExists(AppPath + cbGroups.Text) then begin
  556.         deletefile( GetDataFilename(0) );
  557.         deleteFile( GetDataFilename(1) );
  558.         RmDir(AppPath + cbGroups.Text);
  559.  
  560.         cbGroups.Text := '';
  561.         PermPath := '';
  562.         self.PermFoldersRefresh;
  563.         self.LoadPermanentItems;
  564.     end;
  565. end;
  566.  
  567. procedure TfrmPermanentOld.cbGroupsClick(Sender: TObject);
  568. begin
  569.     self.SavePermanentItems;
  570. end;
  571.  
  572. end.
  573.  
  574.