home *** CD-ROM | disk | FTP | other *** search
/ Delphi Programming Unleashed / Delphi_Programming_Unleashed_SAMS_Publishing_1995.iso / misc / explorer / main.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-20  |  13KB  |  479 lines

  1. unit Main;
  2.  
  3. { Program copyright (c) 1995 by Charles Calvert & Steve Teixeira }
  4. { Project Name: EXPLORER }
  5.  
  6. interface
  7.  
  8. uses
  9.   WinTypes, WinProcs, Classes,
  10.   Graphics, Forms, Controls,
  11.   Messages, Menus, FileCtrl,
  12.   Update, About, MakeCls,
  13.   Welcome, Status, Buttons,
  14.   StdCtrls, IniFiles, ExtCtrls;
  15.  
  16. type
  17.   TExplore = class(TForm)
  18.     ListBox1: TListBox;
  19.     ComboBox1: TComboBox;
  20.     EUnitName: TEdit;
  21.     MainMenu1: TMainMenu;
  22.     File1: TMenuItem;
  23.     Options1: TMenuItem;
  24.     Eye: TBitBtn;
  25.     ObjectModel1: TMenuItem;
  26.     VCL1: TMenuItem;
  27.     OWL1: TMenuItem;
  28.     TurboVision1: TMenuItem;
  29.     UpdateObjects1: TMenuItem;
  30.     Exit1: TMenuItem;
  31.     Help1: TMenuItem;
  32.     About1: TMenuItem;
  33.     Contents1: TMenuItem;
  34.     Toolbar: TPanel;
  35.     SpeedButton1: TSpeedButton;
  36.     SpeedButton5: TSpeedButton;
  37.     SpeedButton2: TSpeedButton;
  38.     SpeedButton3: TSpeedButton;
  39.     SpeedButton4: TSpeedButton;
  40.     SpeedButton6: TSpeedButton;
  41.     SpeedButton7: TSpeedButton;
  42.     SpeedButton8: TSpeedButton;
  43.     N1: TMenuItem;
  44.     procedure FormDestroy(Sender: TObject);
  45.     procedure EyeClick(Sender: TObject);
  46.     procedure FormCreate(Sender: TObject);
  47.     procedure Exit1Click(Sender: TObject);
  48.     procedure Options1Click(Sender: TObject);
  49.     procedure UpdateObjects1Click(Sender: TObject);
  50.     procedure About1Click(Sender: TObject);
  51.     procedure VCL1Click(Sender: TObject);
  52.     procedure OWL1Click(Sender: TObject);
  53.     procedure TurboVision1Click(Sender: TObject);
  54.     procedure Contents1Click(Sender: TObject);
  55.     procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
  56.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  57.     procedure FormActivate(Sender: TObject);
  58.   private
  59.     NewUser: Boolean;
  60.     cbBuffer: PChar;
  61.     vclPath: String;
  62.     bpPath: String;
  63.     oePath: String;
  64.     ObjectList: String;
  65.     TextEditor: String;
  66.     ComboId: Word;
  67.     SList: TStringList;
  68.     procedure ResetUI;
  69.     function GetAFile(S: String): String;
  70.     function GetAParent(S: String): String;
  71.     procedure WMCommand(var Msg: TWMCommand); message wm_Command;
  72.     procedure HandleChange;
  73.     procedure HandleFileChange;
  74.     procedure SelectFirstItem;
  75.   end;
  76.  
  77. var
  78.   Explore: TExplore;
  79.  
  80. implementation
  81. uses
  82.   DirStuff, Viewer, SysUtils, ExpIni, Dialogs, StrUtils;
  83.  
  84. {$R *.DFM}
  85.  
  86. function GetClass(S: String): String;
  87. begin
  88.   Result := GetFirstWord(S);
  89. end;
  90.  
  91. function TExplore.GetAFile(S: String): String;
  92. var
  93.   i: Integer;
  94.   Temp: String;
  95.   Parent: String;
  96.   Total: Integer;
  97. begin
  98.   Parent := '';
  99.   Total := SList.Count - 1;
  100.   for i := 0 to Total do begin
  101.     Temp := SList.Strings[i];
  102.     if GetFirstWord(Temp) = S then begin
  103.       Move(Temp[53], Parent[1], 26);
  104.       Parent[0] := Chr(Length(Temp) - 52);
  105.       Parent := StripSpaces(Parent);
  106.       break;
  107.     end;
  108.   end;
  109.   GetAFile := Parent;
  110. end;
  111.  
  112. function TExplore.GetAParent(S: String): String;
  113. var
  114.   i: Integer;
  115.   Temp: String;
  116.   Total: Integer;
  117. begin
  118.   Result := '';
  119.   Total := SList.Count - 1;
  120.   for i := 0 to Total do begin
  121.     Temp := SList.Strings[i];
  122.     if CompareStr(GetFirstWord(Temp), S) = 0 then begin
  123.       Move(Temp[27], Result[1], 26);
  124.       Result[0] := #26;
  125.       Result := StripSpaces(Result);
  126.       break;
  127.     end;
  128.   end;
  129. end;
  130.  
  131. procedure TExplore.HandleChange;
  132. var
  133.   S: String;
  134.   i: Integer;
  135. begin
  136.   ListBox1.Clear;
  137.   S := ComboBox1.Items.Strings[ComboBox1.ItemIndex];
  138.   ListBox1.Items.Add(S);
  139.   EUnitName.Text := GetAFile(S);
  140.   repeat
  141.     S := GetAParent(S);
  142.     ListBox1.Items.Add(S);
  143.   until (S = 'TObject') or (S = '');
  144. end;
  145.  
  146. procedure TExplore.HandleFileChange;
  147. var
  148.   S: String;
  149. begin
  150.   S := ListBox1.Items.Strings[ListBox1.ItemIndex];
  151.   if S = 'TObject' then
  152.     EUnitName.Text := 'SYSTEM.PAS'
  153.   else
  154.     EUnitName.Text := GetAFile(S);
  155. end;
  156.  
  157. procedure TExplore.WMCommand(var Msg: TWMCommand);
  158. begin
  159.   if Msg.ItemId = ComboId then
  160.     if Msg.NotifyCode = lbn_SelChange then
  161.       HandleChange;
  162.  
  163.   if Msg.Ctl = ListBox1.Handle then
  164.     if Msg.NotifyCode = lbn_SelChange then
  165.       HandleFileChange;
  166.   inherited;
  167. end;
  168.  
  169. procedure TExplore.FormDestroy(Sender: TObject);
  170. begin
  171.   IniFile.WriteString('SETTINGS', 'CurrObject', ObjectList);
  172.   IniFile.WriteInteger('SETTINGS', 'XPos', Left);
  173.   IniFile.WriteInteger('SETTINGS', 'YPos', Top);
  174.   FreeMem(cbBuffer, 256);
  175.   IniFile.Free;
  176.   SList.Free;
  177. end;
  178.  
  179. procedure TExplore.EyeClick(Sender: TObject);
  180. var
  181.   Path: String;
  182.   S: String;
  183.   A: array[0..255] of char;
  184.   WERetVal: word;
  185. begin
  186.   if Listbox1.ItemIndex < 0 then
  187.     Listbox1.ItemIndex := 0;
  188.   ListBox1.SetFocus;
  189.   FileViewer.Edit1.Text := ListBox1.Items.Strings[ListBox1.ItemIndex];
  190.   if FileViewer.Edit1.Text = '' then
  191.     FileViewer.Edit1.Text := ListBox1.Items.Strings[0];
  192.   if ObjectList = 'delobj.lst' then begin
  193.     S := UpperCase(EUnitName.Text);
  194.     if (S = 'EXCEPTS.PAS') or (S = 'SYSTEM.PAS') or (S = 'SYSUTILS.PAS') then
  195.       Path := vclPath + 'rtl\sys\'
  196.     else if (S = 'CALENDAR.PAS') or (S = 'COLORGRD.PAS') or (S = 'DIROUTLN.PAS')
  197.             or (S = 'GAUGES.PAS') or (S = 'SPIN.PAS') then
  198.       Path := vclPath + 'samples\'
  199.     else
  200.       Path := vclPath + 'vcl\';
  201.   end
  202.   else if ObjectList = 'owlobj.lst' then
  203.     Path := bpPath+'owl\'
  204.   else if ObjectList = 'tvobj.lst' then begin
  205.     if (S = 'OBJECTS.PAS') or (S = 'VALIDATE.PAS') then
  206.       Path := bpPath+'common\'
  207.     else
  208.       Path := bpPath+'tv\';
  209.   end;
  210.   S := Path + S;
  211.   if not FileExists(S) then
  212.     MessageDlg('Can''t find file, Run Options', mtError, [mbOk], 0)
  213.   else try
  214.     FileViewer.ListBox1.Items.LoadFromFile(S);
  215.     FileViewer.FileName := S;
  216.     FileViewer.Show;
  217.   except
  218.     on E:EOutOfResources do begin
  219.       if MessageDlg('File to large for Viewer.  Load into text editor?',
  220.                     mtError, [mbYes, mbNo], 0) = mrYes then begin
  221.         StrPCopy(A, TextEditor  + ' ' + S);
  222.         WERetVal := WinExec(A, sw_ShowNormal);
  223.         if WERetVal < 32 then
  224.           MessageDlg('Couldn''t spawn editor.  Error code: ' +
  225.                      IntToStr(WERetVal), mtError, [mbOk], 0);
  226.       end;
  227.     end;
  228.   end;
  229. end;
  230.  
  231. procedure TExplore.FormCreate(Sender: TObject);
  232.  
  233.   procedure GetoePath;
  234.   var
  235.     S : String;
  236.     i : Integer;
  237.   begin
  238.     S := ParamStr(0);
  239.     i := integer(S[0]);
  240.     while S[i] <> '\' do
  241.     begin
  242.       dec(S[0]);
  243.       dec(i);
  244.     end;
  245.     oePath := S;
  246.   end;
  247.  
  248. const
  249.   Size = 128;
  250. var
  251.   P: array[0..Size] of Char;
  252.   i: Integer;
  253.   S : String;
  254.   H: Hwnd;
  255. begin
  256.   GetMem(cbBuffer, 256);
  257.   Left := IniFile.ReadInteger('SETTINGS', 'XPos', Left);
  258.   Top := IniFile.ReadInteger('SETTINGS', 'YPos', Top);
  259.   Toolbar.ShowHint := IniFile.ReadBool('SETTINGS', 'BubbleHelp', True);
  260.   vclPath := AddBackSlash(IniFile.ReadString('PATHS', 'vclpath',
  261.                                              'c:\delphi\source\'));
  262.   bpPath  := AddBackSlash(IniFile.ReadString('PATHS', 'bppath', 'c:\bp\rtl\'));
  263.   ObjectList := IniFile.ReadString('SETTINGS', 'CurrObject', 'delobj.lst');
  264.   TextEditor := IniFile.ReadString('SETTINGS', 'TextEditor', 'notepad.exe');
  265.   if ObjectList = 'owlobj.lst' then
  266.   begin
  267.     VCL1.Checked := False;
  268.     OWL1.Checked := True;
  269.     TurboVision1.Checked := False;
  270.     Caption := 'Object Explorer - OWL';
  271.   end
  272.   else if ObjectList = 'tvobj.lst' then
  273.   begin
  274.     VCL1.Checked := False;
  275.     OWL1.Checked := False;
  276.     TurboVision1.Checked := True;
  277.     Caption := 'Object Explorer - TV';
  278.   end;
  279.   GetoePath;
  280.   if not (HasIni and FileExists(oePath+ObjectList)) then begin
  281.     WelcomeDlg := TWelcomeDlg.Create(Self);
  282.     WelcomeDlg.ShowModal;
  283.     WelcomeDlg.Free;
  284.     NewUser := True;
  285.   end;
  286.   SList := TStringList.Create;
  287.   SList.Sorted := True;
  288.   if not NewUser then begin
  289.     SList.LoadFromFile(oePath+ObjectList);
  290.     for i := 0 to SList.Count - 1 do
  291.       ComboBox1.Items.Add(GetClass(SList.Strings[i]));
  292.     if ParamCount > 0 then begin
  293.       i := SendMessage(ComboBox1.Handle, cb_SelectString, 0, Longint(StrPCopy(cbBuffer, ParamStr(1))));
  294.       H := GetDlgItem(ComboBox1.Handle, 1000);
  295.       SendM