mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 02:40:00 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			655 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			655 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
unit fMain;
 | 
						|
(* Documentation manager GUI.
 | 
						|
  View/Edit configuration, packages
 | 
						|
  Add/Import packages
 | 
						|
  Create/Update skeletons
 | 
						|
  Create documentation (final, test)
 | 
						|
*)
 | 
						|
 | 
						|
{$mode objfpc}{$H+}
 | 
						|
 | 
						|
interface
 | 
						|
 | 
						|
uses
 | 
						|
  Classes, SysUtils, FileUtil, SynHighlighterXML, SynEdit, Forms, Controls,
 | 
						|
  Graphics, Dialogs, Menus, StdCtrls, ComCtrls, ExtCtrls,
 | 
						|
  uManager;
 | 
						|
 | 
						|
type
 | 
						|
 | 
						|
  { TMain }
 | 
						|
 | 
						|
  TMain = class(TForm)
 | 
						|
    buMakeDoc: TButton;
 | 
						|
    buNewProfile: TButton;
 | 
						|
    buRefresh: TButton;
 | 
						|
    buShowLog: TButton;
 | 
						|
    buTest: TButton;
 | 
						|
    cbFormat: TComboBox;
 | 
						|
    cbProfile: TComboBox;
 | 
						|
    edDescrDir: TEdit;
 | 
						|
    edDescrLaz: TEdit;
 | 
						|
    edLog: TEdit;
 | 
						|
    edOutput: TEdit;
 | 
						|
    edOS: TEdit;
 | 
						|
    edCPU: TEdit;
 | 
						|
    edLang: TEdit;
 | 
						|
    edMoDir: TEdit;
 | 
						|
    edDefOut: TEdit;
 | 
						|
    edUnit: TEdit;
 | 
						|
    GroupBox1: TGroupBox;
 | 
						|
    gbAltDir: TGroupBox;
 | 
						|
    Label2: TLabel;
 | 
						|
    Label3: TLabel;
 | 
						|
    Label4: TLabel;
 | 
						|
    Label5: TLabel;
 | 
						|
    Label6: TLabel;
 | 
						|
    Label7: TLabel;
 | 
						|
    edBackend: TMemo;
 | 
						|
    Label8: TLabel;
 | 
						|
    Label9: TLabel;
 | 
						|
    optUpd: TCheckGroup;
 | 
						|
    Panel1: TPanel;
 | 
						|
    StatusBar1: TStatusBar;
 | 
						|
    swAll: TRadioButton;
 | 
						|
    swOutput: TRadioButton;
 | 
						|
    swDefOut: TRadioButton;
 | 
						|
    swDocOpts: TCheckGroup;
 | 
						|
    Label1: TLabel;
 | 
						|
    dlgSelLpk: TOpenDialog;
 | 
						|
    edINI: TMemo;
 | 
						|
    lbPackages: TComboBox;
 | 
						|
    lbUnits: TListBox;
 | 
						|
    MainMenu1: TMainMenu;
 | 
						|
    MenuItem1: TMenuItem;
 | 
						|
    mnImportLpk: TMenuItem;
 | 
						|
    mnPackage: TMenuItem;
 | 
						|
    mnConfig: TMenuItem;
 | 
						|
    MenuItem3: TMenuItem;
 | 
						|
    mnExit: TMenuItem;
 | 
						|
    dlgSelRoot: TSelectDirectoryDialog;
 | 
						|
    swShowUpdate: TCheckBox;
 | 
						|
    swSingle: TRadioButton;
 | 
						|
    swSortNodes: TCheckBox;
 | 
						|
    ViewFinal: TTabSheet;
 | 
						|
    ViewINI: TTabSheet;
 | 
						|
    Units: TPageControl;
 | 
						|
    edXML: TSynEdit;
 | 
						|
    SynXMLSyn1: TSynXMLSyn;
 | 
						|
    ViewXML: TTabSheet;
 | 
						|
    ViewUnits: TTabSheet;
 | 
						|
    procedure buMakeDocClick(Sender: TObject);
 | 
						|
    procedure buNewProfileClick(Sender: TObject);
 | 
						|
    procedure buRefreshClick(Sender: TObject);
 | 
						|
    procedure buTestClick(Sender: TObject);
 | 
						|
    procedure cbFormatSelect(Sender: TObject);
 | 
						|
    procedure cbProfileSelect(Sender: TObject);
 | 
						|
    procedure edLogChange(Sender: TObject);
 | 
						|
    procedure edOSExit(Sender: TObject);
 | 
						|
    procedure edXMLExit(Sender: TObject);
 | 
						|
    procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
 | 
						|
    procedure FormCreate(Sender: TObject);
 | 
						|
    procedure FormResize(Sender: TObject);
 | 
						|
    procedure lbBackendExit(Sender: TObject);
 | 
						|
    procedure lbPackagesClick(Sender: TObject);
 | 
						|
    procedure lbUnitsClick(Sender: TObject);
 | 
						|
    procedure lbUnitsDblClick(Sender: TObject);
 | 
						|
    procedure mnConfigClick(Sender: TObject);
 | 
						|
    procedure mnExitClick(Sender: TObject);
 | 
						|
    procedure mnImportLpkClick(Sender: TObject);
 | 
						|
    procedure optUpdItemClick(Sender: TObject; Index: integer);
 | 
						|
    procedure swShowUpdateChange(Sender: TObject);
 | 
						|
    procedure swSingleClick(Sender: TObject);
 | 
						|
  private
 | 
						|
    LogName: string;
 | 
						|
    LogFile: TStream;
 | 
						|
    Profile: string;
 | 
						|
    procedure ProjectsChanged(Sender: TObject);
 | 
						|
    procedure LogToFile(Sender: TObject; const msg: string);
 | 
						|
    procedure LogToMsgBox(Sender: TObject; const msg: string);
 | 
						|
    procedure LogStart;
 | 
						|
    procedure LogDone;
 | 
						|
    procedure ShowUpdate;
 | 
						|
  {$IFDEF v0}
 | 
						|
    procedure OnParseImport(Sender: TObject; var ASource, ALink: string);
 | 
						|
  {$ELSE}
 | 
						|
  {$ENDIF}
 | 
						|
    procedure SaveOptions;
 | 
						|
    procedure GetOptions;
 | 
						|
    procedure GetEngines;
 | 
						|
    procedure GetProfile;
 | 
						|
    procedure SelectFormat(AFmt: string);
 | 
						|
    procedure FormatSelected;
 | 
						|
  public
 | 
						|
    CurPkg: TDocPackage;
 | 
						|
    CurUnit: string;
 | 
						|
    procedure UpdateDocs;
 | 
						|
  end;
 | 
						|
 | 
						|
var
 | 
						|
  Main: TMain;
 | 
						|
 | 
						|
implementation
 | 
						|
 | 
						|
uses
 | 
						|
  fConfig, fLogView, fUpdateView,
 | 
						|
  //dwlinear,
 | 
						|
  fEditor,
 | 
						|
  dWriter;
 | 
						|
 | 
						|
{$R *.lfm}
 | 
						|
 | 
						|
{ TMain }
 | 
						|
 | 
						|
procedure TMain.FormCreate(Sender: TObject);
 | 
						|
var
 | 
						|
  r: TRect;
 | 
						|
  s: string;
 | 
						|
  l: TStringList;
 | 
						|
begin
 | 
						|
{$IFDEF FCLAdds}
 | 
						|
{$ELSE}
 | 
						|
  gbAltDir.Visible := False;
 | 
						|
{$ENDIF}
 | 
						|
  Manager := TFPDocManager.Create(self);
 | 
						|
  Manager.OnChange := @ProjectsChanged;
 | 
						|
  if not Manager.LoadConfig(GetCurrentDir) then begin
 | 
						|
  //query root directory
 | 
						|
    if not dlgSelRoot.Execute then
 | 
						|
      exit;
 | 
						|
    if not Manager.LoadConfig(dlgSelRoot.FileName, True) then begin
 | 
						|
      //InitConfig(dlgSelRoot.FileName); ?
 | 
						|
      mnConfigClick(self); //does an UpdateDocs
 | 
						|
      exit; //nothing to init from?
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
//init...
 | 
						|
  if Manager.Config.SectionExists('GUI') then begin
 | 
						|
    s := Manager.Config.ReadString('GUI', 'position', '');
 | 
						|
    if s <> '' then begin
 | 
						|
      l := TStringList.Create;
 | 
						|
      try
 | 
						|
        l.DelimitedText := s;
 | 
						|
        if l.Count = 4 then begin
 | 
						|
          //SetBounds(l[0], l[1], );
 | 
						|
          r.Left := StrToInt(l[0]);
 | 
						|
          r.Top := StrToInt(l[1]);
 | 
						|
          r.Right := StrToInt(l[2]);
 | 
						|
          r.Bottom:= StrToInt(l[3]);
 | 
						|
          BoundsRect := r;
 | 
						|
        end;
 | 
						|
      finally
 | 
						|
        l.Free;
 | 
						|
      end;
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
  //UpdateDocs; //package objects seem to be missing?
 | 
						|
  GetEngines;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.FormResize(Sender: TObject);
 | 
						|
var
 | 
						|
  r: TRect;
 | 
						|
begin
 | 
						|
  r := BoundsRect;
 | 
						|
  Manager.Config.WriteString('GUI', 'position', Format('%d,%d,%d,%d',[r.Left, r.Top, r.Right, r.Bottom]));
 | 
						|
end;
 | 
						|
 | 
						|
// --------------- events ------------------
 | 
						|
 | 
						|
procedure TMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 | 
						|
begin
 | 
						|
//is this really required?
 | 
						|
  CanClose := True; //make compiler happy
 | 
						|
  //Manager.SaveConfig; //what if fails?
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.mnExitClick(Sender: TObject);
 | 
						|
begin
 | 
						|
  Close;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.swShowUpdateChange(Sender: TObject);
 | 
						|
begin
 | 
						|
  if swShowUpdate.Checked then
 | 
						|
    ShowUpdate;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.LogStart;
 | 
						|
begin
 | 
						|
  Screen.Cursor := crHourGlass;
 | 
						|
  if LogName = '' then
 | 
						|
    edLog.Text := Manager.RootDir + 'doclog.txt';
 | 
						|
  LogFile.Free;
 | 
						|
  LogFile := TFileStream.Create(LogName, fmCreate); //fmWrite
 | 
						|
  Manager.OnLog := @LogToFile;
 | 
						|
  StatusBar1.SimpleText := 'Starting ...';
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.LogDone;
 | 
						|
begin
 | 
						|
  if not assigned(LogFile) then
 | 
						|
    exit;
 | 
						|
  FreeAndNil(LogFile);
 | 
						|
  Manager.OnLog := @LogToMsgBox;
 | 
						|
//view messages
 | 
						|
  LogView.Caption := 'View ' + LogName;
 | 
						|
  LogView.edLog.Lines.LoadFromFile(LogName); //direct log???
 | 
						|
  LogView.Show;
 | 
						|
  Screen.Cursor := crDefault;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.ShowUpdate;
 | 
						|
var
 | 
						|
  v: TUpdateView;
 | 
						|
  fn: string;
 | 
						|
begin
 | 
						|
  if not swShowUpdate.Checked then
 | 
						|
    exit;
 | 
						|
  if lbUnits.ItemIndex < 0 then
 | 
						|
    exit;
 | 
						|
  fn := 'upd.' + edUnit.Text + '.xml';
 | 
						|
  if not FileExists(fn) then
 | 
						|
    exit;
 | 
						|
//problem with files kept open???
 | 
						|
  if UpdateView = nil then
 | 
						|
    v := TUpdateView.Create(self)
 | 
						|
  else
 | 
						|
    v := UpdateView;
 | 
						|
  v.Caption := 'Update of ' + edUnit.Text;
 | 
						|
  v.edUpdate.Lines.LoadFromFile(fn);
 | 
						|
  v.Show;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.LogToFile(Sender: TObject; const msg: string);
 | 
						|
var
 | 
						|
  s: string;
 | 
						|
begin
 | 
						|
  if assigned(LogFile) then begin
 | 
						|
    s := msg + LineEnding;
 | 
						|
    LogFile.WriteBuffer(s[1], Length(s));
 | 
						|
  //give immediate feedback
 | 
						|
    StatusBar1.SimpleText := msg;
 | 
						|
    Application.ProcessMessages;
 | 
						|
  end
 | 
						|
  else
 | 
						|
    LogToMsgBox(Sender, msg);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.LogToMsgBox(Sender: TObject; const msg: string);
 | 
						|
begin
 | 
						|
  ShowMessage(msg);
 | 
						|
end;
 | 
						|
 | 
						|
{$IFDEF v0}
 | 
						|
procedure TMain.OnParseImport(Sender: TObject; var ASource, ALink: string);
 | 
						|
var
 | 
						|
  i: integer;
 | 
						|
  pn: string;
 | 
						|
begin
 | 
						|
(* Provide ASource-->content file, ALink depends on format.
 | 
						|
  ASource can be a package name (only), or a CSV spec.
 | 
						|
  Sender is Manager.
 | 
						|
An extended model could store a list of required packages,
 | 
						|
and provide the list of imports.
 | 
						|
*)
 | 
						|
  i := Pos(',', ASource);
 | 
						|
  if i > 0 then
 | 
						|
    exit; //default format, handled by caller
 | 
						|
  pn := ExtractFileNameOnly(ASource);
 | 
						|
  ASource := Manager.RootDir + pn + '.xct';
 | 
						|
  //if Manager.Options.??? - where's the output format?
 | 
						|
  ALink := '../' + pn + '/';
 | 
						|
end;
 | 
						|
{$ELSE}
 | 
						|
{$ENDIF}
 | 
						|
 | 
						|
type
 | 
						|
  SkelOpts = (
 | 
						|
    soDecl, soOverrides, soErrors, soSeeAlso, soArgs, soResults,
 | 
						|
    soPriv, soProt, soClassSep
 | 
						|
  );
 | 
						|
procedure TMain.SaveOptions;
 | 
						|
begin
 | 
						|
  Manager.Options.WriteDeclaration := not optUpd.Checked[ord(soDecl)];
 | 
						|
  Manager.Options.DisableOverride := optUpd.Checked[ord(soOverrides)];
 | 
						|
  Manager.Options.DisableErrors := optUpd.Checked[ord(soErrors)];
 | 
						|
  Manager.Options.DisableSeealso := optUpd.Checked[ord(soSeeAlso)];
 | 
						|
  Manager.Options.DisableArguments := optUpd.Checked[ord(soArgs)];
 | 
						|
  Manager.Options.DisableFunctionResults := optUpd.Checked[ord(soResults)];
 | 
						|
  Manager.Options.ShowPrivate := not optUpd.Checked[ord(soPriv)];
 | 
						|
  Manager.Options.DisableProtected := optUpd.Checked[ord(soProt)];
 | 
						|
  Manager.Options.EmitClassSeparator := not optUpd.Checked[ord(soClassSep)];
 | 
						|
  Manager.Options.SortNodes := swSortNodes.Checked;
 | 
						|
  Manager.Options.Modified := True; //assume!
 | 
						|
//Backend
 | 
						|
  //if cbFormat.Caption = '' then exit; //no valid options
 | 
						|
  if cbFormat.ItemIndex < 0 then
 | 
						|
    SelectFormat('html');
 | 
						|
  Manager.Options.Backend := cbFormat.Items.Names[cbFormat.ItemIndex];
 | 
						|
  Manager.Options.StopOnParseError := swDocOpts.Checked[0];
 | 
						|
  Manager.Options.WarnNoNode := swDocOpts.Checked[1];
 | 
						|
  Manager.Options.HideProtected := swDocOpts.Checked[2];
 | 
						|
  Manager.Options.ShowPrivate := swDocOpts.Checked[3];
 | 
						|
  Manager.Options.InterfaceOnly := swDocOpts.Checked[4];
 | 
						|
  Manager.Options.DontTrim := swDocOpts.Checked[5];
 | 
						|
  Manager.Options.Verbose := swDocOpts.Checked[6];
 | 
						|
  Manager.Options.OSTarget := edOS.Text;
 | 
						|
  Manager.Options.CPUTarget := edCPU.Text;
 | 
						|
  Manager.Options.Language := edLang.Text;
 | 
						|
  Manager.Options.MoDir := edMoDir.Text;
 | 
						|
  Manager.Options.BackendFromPairs(edBackend.Lines);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.GetOptions;
 | 
						|
begin
 | 
						|
  optUpd.Checked[ord(soDecl)] := not Manager.Options.WriteDeclaration;
 | 
						|
  optUpd.Checked[ord(soOverrides)] := Manager.Options.DisableOverride;
 | 
						|
  optUpd.Checked[ord(soErrors)] := Manager.Options.DisableErrors;
 | 
						|
  optUpd.Checked[ord(soSeeAlso)] := Manager.Options.DisableSeealso;
 | 
						|
  optUpd.Checked[ord(soArgs)] := Manager.Options.DisableArguments;
 | 
						|
  optUpd.Checked[ord(soResults)] := Manager.Options.DisableFunctionResults;
 | 
						|
  optUpd.Checked[ord(soPriv)] := not Manager.Options.ShowPrivate;
 | 
						|
  optUpd.Checked[ord(soProt)] := Manager.Options.DisableProtected;
 | 
						|
  optUpd.Checked[ord(soClassSep)] := not Manager.Options.EmitClassSeparator;
 | 
						|
  swSortNodes.Checked := Manager.Options.SortNodes;
 | 
						|
//backend
 | 
						|
  if Profile = '' then begin
 | 
						|
    Profile:=Manager.Profile;
 | 
						|
    cbProfile.Items.CommaText := Manager.Profiles;
 | 
						|
    cbProfile.Caption := Profile;
 | 
						|
  end;
 | 
						|
  GetProfile;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.GetProfile;
 | 
						|
begin
 | 
						|
  //if Profile = AName then exit; //nothing changed?
 | 
						|
  //Manager.Profile := AName;
 | 
						|
  //cbFormat.Caption := Manager.Options.Backend; //select from CB?
 | 
						|
  SelectFormat(Manager.Options.Backend);
 | 
						|
  swDocOpts.Checked[0] := Manager.Options.StopOnParseError;
 | 
						|
  swDocOpts.Checked[1] := Manager.Options.WarnNoNode;
 | 
						|
  swDocOpts.Checked[2] := Manager.Options.HideProtected;
 | 
						|
  swDocOpts.Checked[3] := Manager.Options.ShowPrivate;
 | 
						|
  swDocOpts.Checked[4] := Manager.Options.InterfaceOnly;
 | 
						|
  swDocOpts.Checked[5] := Manager.Options.DontTrim;
 | 
						|
//these should be global options?
 | 
						|
  edOS.Text := Manager.Options.OSTarget;
 | 
						|
  edCPU.Text := Manager.Options.CPUTarget;
 | 
						|
  edLang.Text := Manager.Options.Language;
 | 
						|
  edMoDir.Text := Manager.Options.MoDir;
 | 
						|
//backend options
 | 
						|
  Manager.Options.BackendToPairs(edBackend.Lines);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.edLogChange(Sender: TObject);
 | 
						|
begin
 | 
						|
  LogName:=edLog.Text;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.edOSExit(Sender: TObject);
 | 
						|
var
 | 
						|
  ed: TEdit absolute Sender;
 | 
						|
begin
 | 
						|
  if ed.Modified then begin
 | 
						|
    SaveOptions;
 | 
						|
    ed.Modified := False;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.lbBackendExit(Sender: TObject);
 | 
						|
begin
 | 
						|
//Modified never True???
 | 
						|
  if edBackend.Modified then begin
 | 
						|
    SaveOptions;
 | 
						|
    edBackend.Modified := False;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.cbFormatSelect(Sender: TObject);
 | 
						|
begin
 | 
						|
  SaveOptions;
 | 
						|
  FormatSelected;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.SelectFormat(AFmt: string);
 | 
						|
var
 | 
						|
  i: integer;
 | 
						|
begin
 | 
						|
  i := cbFormat.Items.IndexOfName(AFmt);
 | 
						|
  if i < 0 then
 | 
						|
    i := cbFormat.Items.Count - 1;
 | 
						|
  cbFormat.ItemIndex := i;
 | 
						|
  FormatSelected;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.FormatSelected;
 | 
						|
var
 | 
						|
  s: string;
 | 
						|
begin
 | 
						|
  if assigned(Manager.Package) then
 | 
						|
    s := Manager.RootDir + Manager.Package.Name
 | 
						|
  else
 | 
						|
    s := '';
 | 
						|
  edDefOut.Text := s;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.GetEngines;
 | 
						|
begin
 | 
						|
//should separate: writers (format) and settings!
 | 
						|
  dWriter.EnumWriters(cbFormat.Items);
 | 
						|
  cbProfile.Items.CommaText := Manager.Profiles;
 | 
						|
  cbProfile.Caption := Manager.Profile; //select???
 | 
						|
  cbProfileSelect(cbProfile);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.ProjectsChanged(Sender: TObject);
 | 
						|
begin
 | 
						|
  UpdateDocs; //immediately or delayed (OnIdle?)
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.UpdateDocs;
 | 
						|
var
 | 
						|
  i: integer;
 | 
						|
begin
 | 
						|
  lbPackages.Clear;
 | 
						|
  for i := 0 to Manager.Packages.Count - 1 do begin
 | 
						|
    if (Manager.Packages.ValueFromIndex[i] <> '')
 | 
						|
    and (Manager.Packages.Objects[i] <> nil) then
 | 
						|
      lbPackages.AddItem(Manager.Packages.Names[i], Manager.Packages.Objects[i]);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.mnConfigClick(Sender: TObject);
 | 
						|
begin
 | 
						|
  Manager.BeginUpdate;
 | 
						|
  if not assigned(CfgWizard) then
 | 
						|
    CfgWizard := TCfgWizard.Create(self);
 | 
						|
  if CfgWizard.ShowModal <> mrCancel then begin
 | 
						|
    //all done
 | 
						|
  end;
 | 
						|
  Manager.EndUpdate;
 | 
						|
end;
 | 
						|
 | 
						|
// ---------------- pages ------------------
 | 
						|
 | 
						|
procedure TMain.lbPackagesClick(Sender: TObject);
 | 
						|
var
 | 
						|
  i: integer;
 | 
						|
  pkg: TDocPackage;
 | 
						|
  fn: string;
 | 
						|
begin
 | 
						|
  i := lbPackages.ItemIndex; //clicked?
 | 
						|
  pkg := lbPackages.Items.Objects[i] as TDocPackage;
 | 
						|
  if pkg = nil then
 | 
						|
    exit; //not really created?
 | 
						|
  Manager.Package := pkg;
 | 
						|
  edDefOut.Text := Manager.RootDir + pkg.Name;
 | 
						|
  fn := pkg.ProjectFile; //initialized where?
 | 
						|
  edDescrDir.Text := pkg.DescrDir; //value?
 | 
						|
  edDescrLaz.Text := pkg.AltDir;
 | 
						|
  if fn <> '' then begin
 | 
						|
    if FileExists(fn) then
 | 
						|
      edXML.Lines.LoadFromFile(fn)
 | 
						|
    else
 | 
						|
      edXML.Lines.Clear;
 | 
						|
  end;
 | 
						|
  fn := pkg.IniFileName;
 | 
						|
  if FileExists(fn) then
 | 
						|
    edINI.Lines.LoadFromFile(fn);
 | 
						|
  //load units...
 | 
						|
  lbUnits.Items.BeginUpdate;
 | 
						|
  lbUnits.Clear;
 | 
						|
{$IFDEF old}
 | 
						|
  for i := 0 to pkg.Units.Count - 1 do begin
 | 
						|
    //fn := Manager.UnitName(pkg.Inputs, i);
 | 
						|
    fn := pkg.Units.Names[i];
 | 
						|
    lbUnits.AddItem(fn, nil);
 | 
						|
  end;
 | 
						|
{$ELSE}
 | 
						|
  pkg.EnumUnits(lbUnits.Items);
 | 
						|
{$ENDIF}
 | 
						|
  lbUnits.Sorted := True;
 | 
						|
  lbUnits.Items.EndUpdate;
 | 
						|
//remember selection
 | 
						|
  CurPkg := pkg;
 | 
						|
  CurUnit:='';
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.mnImportLpkClick(Sender: TObject);
 | 
						|
var
 | 
						|
  pkName: string;
 | 
						|
begin
 | 
						|
  if not dlgSelLpk.Execute then
 | 
						|
    exit;
 | 
						|
  pkName:=dlgSelLpk.FileName;
 | 
						|
  Manager.ImportLpk(pkName);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.optUpdItemClick(Sender: TObject; Index: integer);
 | 
						|
begin
 | 
						|
  SaveOptions;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.edXMLExit(Sender: TObject);
 | 
						|
begin
 | 
						|
  if edXML.Modified then begin
 | 
						|
    case MessageDlg('Project was changed', 'Save changes?',
 | 
						|
      mtConfirmation, mbYesNoCancel, 0) of
 | 
						|
    mrYes: edXML.Lines.SaveToFile(CurPkg.ProjectFile);
 | 
						|
    mrNo: exit;
 | 
						|
    else
 | 
						|
      edXML.SetFocus;
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
// ------------------- actions ----------------------
 | 
						|
 | 
						|
procedure TMain.lbUnitsClick(Sender: TObject);
 | 
						|
var
 | 
						|
  i: integer;
 | 
						|
begin
 | 
						|
  i := lbUnits.ItemIndex;
 | 
						|
  if i < 0 then
 | 
						|
    CurUnit := ''
 | 
						|
  else
 | 
						|
    CurUnit := lbUnits.Items[i];
 | 
						|
  edUnit.Text := CurUnit; //further depends on swSingle
 | 
						|
  swSingle.Checked := True; //assume test single unit
 | 
						|
  ShowUpdate;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.lbUnitsDblClick(Sender: TObject);
 | 
						|
var
 | 
						|
  u: string;
 | 
						|
begin
 | 
						|
//edit unit description in LazDE form
 | 
						|
//setup unit
 | 
						|
  //CurUnit := lbUnits.Items[lbUnits.ItemIndex]; - already set
 | 
						|
  u := Manager.Package.DescrFileName(CurUnit);
 | 
						|
//create form
 | 
						|
  ModuleEditor := TModuleEditor.CreateFor(u, self);
 | 
						|
//show it
 | 
						|
  ModuleEditor.Show;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.swSingleClick(Sender: TObject);
 | 
						|
begin
 | 
						|
  edUnit.Enabled := swSingle.Checked;
 | 
						|
end;
 | 
						|
 | 
						|
(* FPDoc dry run, with logfile
 | 
						|
*)
 | 
						|
procedure TMain.buTestClick(Sender: TObject);
 | 
						|
var
 | 
						|
  u: string;
 | 
						|
begin
 | 
						|
  LogStart;
 | 
						|
  if swSingle.Checked then
 | 
						|
    u := CurUnit
 | 
						|
  else
 | 
						|
    u := '';
 | 
						|
  Manager.TestRun(CurPkg, u);
 | 
						|
  LogDone;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.cbProfileSelect(Sender: TObject);
 | 
						|
begin
 | 
						|
  Profile:=cbProfile.Caption;
 | 
						|
  Manager.Profile := Profile;
 | 
						|
  GetProfile;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.buRefreshClick(Sender: TObject);
 | 
						|
var
 | 
						|
  u: string;
 | 
						|
begin
 | 
						|
  LogStart;
 | 
						|
  if swSingle.Checked then
 | 
						|
    u := CurUnit
 | 
						|
  else
 | 
						|
    u := '';
 | 
						|
  try
 | 
						|
    try
 | 
						|
      Manager.Update(CurPkg, u);
 | 
						|
    except
 | 
						|
      on e: Exception do
 | 
						|
      LogToFile(self, e.Message);
 | 
						|
    end;
 | 
						|
  finally
 | 
						|
    LogDone;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.buNewProfileClick(Sender: TObject);
 | 
						|
begin
 | 
						|
  Profile := cbProfile.Caption;
 | 
						|
  if Profile = '' then
 | 
						|
    exit; //need name
 | 
						|
  if cbProfile.Items.IndexOf(Profile) < 0 then begin
 | 
						|
    cbProfile.AddItem(Profile, nil);
 | 
						|
    Manager.AddProfile(Profile);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TMain.buMakeDocClick(Sender: TObject);
 | 
						|
var
 | 
						|
  res: boolean;
 | 
						|
begin
 | 
						|
  LogStart;
 | 
						|
  if swDefOut.Checked then
 | 
						|
    res := Manager.MakeDoc(Manager.Package, '', edDefOut.Text)
 | 
						|
  else
 | 
						|
    res := Manager.MakeDoc(Manager.Package, '', edOutput.Text);
 | 
						|
  LogDone;
 | 
						|
  if res then
 | 
						|
    StatusBar1.SimpleText := 'Done :-)'
 | 
						|
  else
 | 
						|
    StatusBar1.SimpleText := 'There were errors, see log';
 | 
						|
end;
 | 
						|
 | 
						|
end.
 | 
						|
 |