unit MainForm; {$I jvcl.inc} interface uses Windows, Messages, SysUtils, {$IFDEF COMPILER6_UP}Variants, {$ENDIF}Classes, Graphics, Controls, Forms, Dialogs, Menus, JvMenus, ComCtrls, JvToolBar, ToolWin, JvCoolBar, JvStatusBar, ExtCtrls, JvSplitter, StdCtrls, JvListBox, JvCtrls, JvControlBar, ImgList, ActnList, JvComponent, JvBaseDlg, JvBrowseFolder, Mask, JvToolEdit, AppEvnts, Grids, JvGrids, JvFormPlacement, JvAppStorage, JvStringGrid, JvAppXMLStorage, JvExGrids, JvExComCtrls, JvExExtCtrls, JvExStdCtrls, JvComponentBase; type TfrmMain = class(TForm) jmmMain: TJvMainMenu; mnuFile: TMenuItem; jsbStatus: TJvStatusBar; jtbMenus: TJvToolBar; mnuNavigation: TMenuItem; pnlList: TPanel; jspLeft: TJvSplitter; jlbList: TJvListBox; jcbMain: TJvControlBar; jtbTools: TJvToolBar; tbtOpen: TToolButton; tbtSave: TToolButton; aclActions: TActionList; imlActive: TImageList; imlDisabled: TImageList; actExit: TAction; actSave: TAction; actNew: TAction; actPrevPackage: TAction; actNextPackage: TAction; tbtExit: TToolButton; tbtSep: TToolButton; tbtPrevPackage: TToolButton; tbtNextPackage: TToolButton; mnuGenPackages: TMenuItem; mnuOpen: TMenuItem; mnuSave: TMenuItem; mnuPreviousPackage: TMenuItem; mnuNextPackage: TMenuItem; jbfFolder: TJvBrowseForFolderDialog; pnlEdit: TPanel; lblModel: TLabel; aevEvents: TApplicationEvents; ledName: TEdit; ledDescription: TEdit; lblDependencies: TLabel; jsgDependencies: TJvStringGrid; jsgFiles: TJvStringGrid; lblFiles: TLabel; odlAddFiles: TOpenDialog; ledC5PFlags: TEdit; ledC6PFlags: TEdit; actSaveAll: TAction; actAddFiles: TAction; tbtAddFiles: TToolButton; actGenerate: TAction; tbtGenerate: TToolButton; jpmDepPopup: TJvPopupMenu; mnuView: TMenuItem; actMainToolbar: TAction; actKnown: TAction; mnuMainToolbar: TMenuItem; mnuUpD: TMenuItem; mnuDownD: TMenuItem; pnlDepAndFiles: TPanel; sptDepAndFiles: TSplitter; lblName: TLabel; lblDescription: TLabel; lblC5PFlags: TLabel; lblC6PFlags: TLabel; jfsStore: TJvFormStorage; mnuHelp: TMenuItem; mnuKnown: TMenuItem; mnuAbout: TMenuItem; N2: TMenuItem; mnuAddFiles: TMenuItem; N3: TMenuItem; mnuExit: TMenuItem; btnAdvancedBCB: TButton; actOptions: TAction; mnuParameters: TMenuItem; jpmFilesPopup: TJvPopupMenu; actUp: TAction; actDown: TAction; mnuUpF: TMenuItem; mnuDownF: TMenuItem; mnuAddFilesP: TMenuItem; actDelete: TAction; jpmList: TJvPopupMenu; mnuDeletePackageP: TMenuItem; jaxStore: TJvAppXMLFileStorage; pnlOptions: TPanel; shHideOptions: TShape; mnuDeletePackage: TMenuItem; cmbModel: TComboBox; btnEditModel: TButton; btnCLXDescription: TButton; lblGUID: TLabel; btnGenerateGUID: TButton; edtGUID: TEdit; ComboBoxType: TComboBox; procedure ComboBoxTypeSelect(Sender: TObject); procedure actExitExecute(Sender: TObject); procedure actNewExecute(Sender: TObject); procedure aevEventsHint(Sender: TObject); procedure jsgDependenciesGetCellAlignment(Sender: TJvStringGrid; AColumn, ARow: Integer; State: TGridDrawState; var CellAlignment: TAlignment); procedure jsgDependenciesExitCell(Sender: TJvStringGrid; AColumn, ARow: Integer; const EditText: String); procedure actAddFilesExecute(Sender: TObject); procedure actSaveUpdate(Sender: TObject); procedure ledC6PFlagsChange(Sender: TObject); procedure ledC5PFlagsChange(Sender: TObject); procedure jsgDependenciesSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); procedure ledDescriptionChange(Sender: TObject); procedure ledNameChange(Sender: TObject); procedure actSaveExecute(Sender: TObject); procedure actPrevPackageUpdate(Sender: TObject); procedure actNextPackageUpdate(Sender: TObject); procedure jlbListClick(Sender: TObject); procedure actGenerateExecute(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure actPrevPackageExecute(Sender: TObject); procedure actNextPackageExecute(Sender: TObject); procedure actMainToolbarUpdate(Sender: TObject); procedure actMainToolbarExecute(Sender: TObject); procedure actKnownExecute(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure jlbListMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure sptDepAndFilesMoved(Sender: TObject); procedure mnuAboutClick(Sender: TObject); procedure jsgFilesGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String); procedure btnAdvancedBCBClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure actUpExecute(Sender: TObject); procedure actDownExecute(Sender: TObject); procedure actUpUpdate(Sender: TObject); procedure actDownUpdate(Sender: TObject); procedure jdePackagesLocationChange(Sender: TObject); procedure jlbListKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure actDeleteExecute(Sender: TObject); procedure actOptionsExecute(Sender: TObject); procedure actOptionsUpdate(Sender: TObject); procedure btnEditModelClick(Sender: TObject); procedure cmbModelClick(Sender: TObject); procedure btnCLXDescriptionClick(Sender: TObject); procedure edtGUIDChange(Sender: TObject); procedure btnGenerateGUIDClick(Sender: TObject); private { Private declarations } Changed : Boolean; // true if current file has changed ConfigLoadedOk : Boolean; // true if the config loaded ok FOrgValueDep: string; // original value of current column (dependencies list) FOrgValueFiles: string; // original value of current column (files list) FValidOrgDep: Boolean; // True if FOrgValueDep is officially set FValidOrgFiles: Boolean; // True if FOrgValueFiles is officially set FClxDescription: string; // The CLX description of the active package procedure LoadPackagesList; procedure LoadPackage; procedure ClearAll; procedure MoveLine(sg : TStringGrid; direction : Integer); function IsOkToChange : Boolean; public { Public declarations } constructor Create(AOwner : TComponent); override; end; var frmMain: TfrmMain; implementation uses FileUtils, JvSimpleXml, JclFileUtils, JclStrings, TargetDialog, GenerateUtils, KnownTagsForm, FormTypeDialog, ShellApi, AdvancedOptionsForm, GenerationMessagesForm, ActiveX, PackageInformation, {$IFNDEF COMPILER6_UP} ComObj, // For GUID related functions under D5 {$ENDIF COMPILER6_UP} ModelsForm; {$R *.dfm} procedure TfrmMain.actExitExecute(Sender: TObject); begin Application.Terminate; end; procedure TfrmMain.actNewExecute(Sender: TObject); begin ClearAll; end; procedure TfrmMain.aevEventsHint(Sender: TObject); begin jsbStatus.Panels[0].Text:= GetLongHint(Application.Hint); end; procedure TfrmMain.ComboBoxTypeSelect(Sender: TObject); begin Changed := True; end; constructor TfrmMain.Create(AOwner: TComponent); var ErrMsg : string; begin inherited; jaxStore.FileName := StrEnsureSuffix(DirDelimiter, ExtractFilePath(Application.exename)) + 'pgEdit.xml'; // if cmbModel.ItemIndex >-1 then // ConfigLoadedOk := LoadConfig(jaxStore.FileName, cmbModel.Items[cmbModel.ItemIndex], ErrMsg) // else ConfigLoadedOk := LoadConfig(jaxStore.FileName, '', ErrMsg); if not ConfigLoadedOk then begin Application.MessageBox(PChar('Error loading configuration:'#13#10+ #13#10+ ErrMsg), 'Error loading configuration', MB_ICONERROR); Application.Terminate; Exit; end; with jsgDependencies do begin Cells[0, 0] := 'Name'; Cells[1, 0] := 'Targets'; Cells[2, 0] := 'Condition'; ColWidths[0] := 120; ColWidths[1] := 150; ColWidths[2] := 70; end; with jsgFiles do begin Cells[0, 0] := 'Name'; Cells[1, 0] := 'Targets'; Cells[2, 0] := 'Form name'; Cells[3, 0] := 'Condition'; ColWidths[0] := 230; ColWidths[1] := 50; ColWidths[2] := 170; ColWidths[3] := 70; end; jtbMenus.AutoSize := true; end; procedure TfrmMain.jsgDependenciesGetCellAlignment(Sender: TJvStringGrid; AColumn, ARow: Integer; State: TGridDrawState; var CellAlignment: TAlignment); begin if (ARow > 0) then CellAlignment := taLeftJustify else CellAlignment := taCenter; end; procedure TfrmMain.jsgDependenciesExitCell(Sender: TJvStringGrid; AColumn, ARow: Integer; const EditText: String); var row : TStrings; begin if AColumn = 0 then begin if (Sender.RowCount > 2) and (Sender.Cells[0, ARow] = '') and (ARow < Sender.RowCount-1) then Sender.RemoveRow(ARow); end; if (Sender.RowCount > 1) and (Sender.Cells[0, Sender.RowCount-1] <> '') then begin Sender.InsertRow(Sender.RowCount); row := Sender.Rows[ARow]; row[1] := 'all'; Changed := True; end; if (ARow > 0) and (((Sender = jsgDependencies) and FValidOrgDep and (FOrgValueDep <> EditText) or (Sender = jsgFiles) and FValidOrgFiles and (FOrgValueFiles <> EditText))) then Changed := True; end; procedure TfrmMain.actAddFilesExecute(Sender: TObject); var i : Integer; Name : string; PackagesDir : string; FormName : string; FormType : string; Dir : string; row : TStrings; dfm : textfile; pas : textfile; line : string; begin if odlAddFiles.Execute then begin if PathIsAbsolute(PackagesLocation) then PackagesDir := PackagesLocation else PackagesDir := PathNoInsideRelative(StrEnsureSuffix(DirDelimiter, StartupDir)+PackagesLocation); for i := 0 to odlAddFiles.Files.Count-1 do begin row := jsgFiles.InsertRow(jsgFiles.RowCount-1); Name := odlAddFiles.Files[i]; Dir := GetRelativePath(PackagesDir, ExtractFilePath(Name)); row[0] := '..' + DirDelimiter + StrEnsureSuffix(DirDelimiter, Dir) + ExtractFileName(Name); row[1] := 'all'; // try to find if there is a dfm associated with the file // if there is one, open it and read the first line to get the // name of the form inside it if FileExists(ChangeFileExt(Name, '.dfm')) then begin AssignFile(dfm, ChangeFileExt(Name, '.dfm')); Reset(dfm); ReadLn(dfm, line); CloseFile(dfm); FormName := Copy(line, Pos(' ', line)+1, Pos(':', line)-Pos(' ', line)-1); FormType := ''; // open the pas file and look for the declaration of the // class associated with that form to get its base type AssignFile(pas, Name); Reset(pas); while (FormType = '') and not Eof(pas) do begin ReadLn(pas, line); line := Trim(line); if Copy(line, 2, Length(FormName)+9) = FormName + ' = class(' then begin FormType := Copy(line, Pos('class(', line)+6, Length(line)); FormType := Copy(FormType, 1, Length(FormType)-1); end; end; CloseFile(pas); frmFormType.EnsureCorrectType(FormType, ChangeFileExt(row[0], '.dfm'), line); // if the form type is TForm or TJvForm then ignore it // else include it in the row if (FormType = 'TForm') or (FormType = 'TJvForm') or (FormType = '') then row[2] := FormName else row[2] := FormName + ': ' + FormType; end; end; odlAddFiles.InitialDir := '..' + DirDelimiter + Dir; Changed := True; end; end; procedure TfrmMain.actSaveUpdate(Sender: TObject); begin actSave.Enabled := (ledName.Text <> '') and Changed; end; procedure TfrmMain.ledC6PFlagsChange(Sender: TObject); begin Changed := True; end; procedure TfrmMain.ledC5PFlagsChange(Sender: TObject); begin Changed := True; end; procedure TfrmMain.jsgDependenciesSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); begin FOrgValueDep := jsgDependencies.Cells[ACol, ARow]; end; procedure TfrmMain.ledDescriptionChange(Sender: TObject); begin Changed := True; end; procedure TfrmMain.ledNameChange(Sender: TObject); begin Changed := True; end; procedure TfrmMain.edtGUIDChange(Sender: TObject); begin Changed := True; end; procedure TfrmMain.LoadPackagesList; var path : string; begin if PathIsAbsolute(PackagesLocation) then path := PackagesLocation else path := PathNoInsideRelative(StrEnsureSuffix(DirDelimiter, StartupDir) + PackagesLocation); EnumeratePackages(path, jlbList.Items); path := StrEnsureSuffix(DirDelimiter, path); { if FileExists(path+'Default-D.xml') then jlbList.Items.Add('Default-D'); if FileExists(path+'Default-R.xml') then jlbList.Items.Add('Default-R'} jlbList.ItemIndex := 0; LoadPackage; end; procedure TfrmMain.actSaveExecute(Sender: TObject); var xml : TJvSimpleXml; i : Integer; j : Integer; FileName : string; propname : string; row : TStrings; rootNode : TJvSimpleXmlElemClassic; requiredNode : TJvSimpleXmlElem; packageNode : TJvSimpleXmlElem; filesNode : TJvSimpleXmlElem; fileNode : TJvSimpleXmlElem; ProjectType: TProjectType; begin if PathIsAbsolute(PackagesLocation) then FileName := PackagesLocation else FileName := PathNoInsideRelative(StrEnsureSuffix(DirDelimiter, StartupDir) + PackagesLocation); ProjectType := TProjectType(ComboBoxType.ItemIndex); FileName := Format('%s%sxml%s%s-%s.xml',[FileName, DirDelimiter, DirDelimiter, ledName.Text, ProjectTypeToChar(ProjectType)]); xml := TJvSimpleXml.Create(nil); try with xml do begin Options := [sxoAutoCreate, sxoAutoIndent]; IndentString := ' '; // create root node Root.Name := 'Package'; rootNode := xml.Root; rootNode.Properties.Add('Name', ledName.Text); case ProjectType of ptPackageRun: rootNode.Properties.Add('Design', False); ptPackageDesign: rootNode.Properties.Add('Design', True); else rootNode.Properties.Add('Type', ProjectTypeToChar(ProjectType)); end; // add description, PFLAGS and libs rootNode.Items.Add('Description', ledDescription.Text); if FClxDescription <> '' then rootNode.Items.Add('ClxDescription', FClxDescription); rootNode.Items.Add('GUID', edtGUID.Text); rootNode.Items.Add('C5PFlags', ledC5PFlags.Text); rootNode.Items.Add('C6PFlags', ledC6PFlags.Text); rootNode.Items.Add('C5Libs', frmAdvancedOptions.edtBCB5.Text); rootNode.Items.Add('C6Libs', frmAdvancedOptions.edtBCB6.Text); if frmAdvancedOptions.edtImageBase.Text <> '' then rootNode.Items.Add('ImageBase', frmAdvancedOptions.edtImageBase.Text); if frmAdvancedOptions.edtVersionMajorNumber.Text <> '' then rootNode.Items.Add('VersionMajorNumber', frmAdvancedOptions.edtVersionMajorNumber.Text); if frmAdvancedOptions.edtVersionMinorNumber.Text <> '' then rootNode.Items.Add('VersionMinorNumber', frmAdvancedOptions.edtVersionMinorNumber.Text); if frmAdvancedOptions.edtReleaseNumber.Text <> '' then rootNode.Items.Add('ReleaseNumber', frmAdvancedOptions.edtReleaseNumber.Text); if frmAdvancedOptions.edtBuildNumber.Text <> '' then rootNode.Items.Add('BuildNumber', frmAdvancedOptions.edtBuildNumber.Text); // add required packages requiredNode := rootNode.Items.Add('Requires'); for i := 1 to jsgDependencies.RowCount-2 do begin row := jsgDependencies.Rows[i]; packageNode := requiredNode.Items.Add('Package'); for j := 0 to row.Count - 1 do begin packageNode.Properties.Add(jsgDependencies.Rows[0][j], row[j]); end; end; // add files filesNode := rootNode.Items.Add('Contains'); for i := 1 to jsgFiles.RowCount-2 do begin row := jsgFiles.Rows[i]; fileNode := filesNode.Items.Add('File'); for j := 0 to row.Count - 1 do begin propname := jsgFiles.Rows[0][j]; StrReplace(propname, ' ', '', [rfReplaceAll]); fileNode.Properties.Add(propname, row[j]); end; end; end; // save into file xml.SaveToFile(fileName); finally xml.Free; end; // reload package list i := jlbList.ItemIndex; LoadPackagesList; jlbList.ItemIndex := i; LoadPackage; end; procedure TfrmMain.actPrevPackageUpdate(Sender: TObject); begin actPrevPackage.Enabled := jlbList.ItemIndex > 0; end; procedure TfrmMain.actNextPackageUpdate(Sender: TObject); begin actNextPackage.Enabled := (jlbList.ItemIndex > -1) and (jlbList.ItemIndex < jlbList.Items.Count-1); end; procedure TfrmMain.LoadPackage; var xml : TJvSimpleXml; i : Integer; j : Integer; xmlFileName : string; propname : string; row : TStrings; rootNode : TJvSimpleXmlElemClassic; requiredNode : TJvSimpleXmlElem; packageNode : TJvSimpleXmlElem; filesNode : TJvSimpleXmlElem; fileNode : TJvSimpleXmlElem; savedChanged : Boolean; begin savedChanged := Changed; ClearAll; Changed := savedChanged; if jlbList.ItemIndex < 0 then Exit; if PathIsAbsolute(PackagesLocation) then xmlFileName := PackagesLocation else xmlFileName := PathNoInsideRelative(StrEnsureSuffix(DirDelimiter, StartupDir) + PackagesLocation); xmlFileName := Format('%s%sxml%s%s.xml', [xmlFileName, DirDelimiter, DirDelimiter, jlbList.Items[jlbList.ItemIndex]]); xml := TJvSimpleXml.Create(nil); try with xml do begin Options := [sxoAutoCreate]; LoadFromFile(xmlFileName); // read root node rootNode := xml.Root; ledName.Text := rootNode.Properties.ItemNamed['Name'].Value; xml.Options := xml.Options - [sxoAutoCreate]; if Assigned(rootNode.Properties.ItemNamed['Design']) then begin if rootNode.Properties.ItemNamed['Design'].BoolValue then ComboBoxType.ItemIndex := Integer(ptPackageDesign) else ComboBoxType.ItemIndex := Integer(ptPackageRun); end else ComboBoxType.ItemIndex := Integer(CharToProjectType(rootNode.Properties.ItemNamed['Type'].Value[1])); xml.Options := xml.Options + [sxoAutoCreate]; // read description, PFLAGS, GUID, and libs ledDescription.Text := rootNode.Items.ItemNamed['Description'].Value; ledC5PFlags.Text := rootNode.Items.ItemNamed['C5PFlags'].Value; ledC6PFlags.Text := rootNode.Items.ItemNamed['C6PFlags'].Value; if Assigned(rootNode.Items.ItemNamed['GUID']) then edtGUID.Text := rootNode.Items.ItemNamed['GUID'].Value; frmAdvancedOptions.edtBCB5.Text := rootNode.Items.ItemNamed['C5Libs'].Value; frmAdvancedOptions.edtBCB6.Text := rootNode.Items.ItemNamed['C6Libs'].Value; if Assigned(rootNode.Items.ItemNamed['ClxDescription']) then FClxDescription := rootNode.Items.ItemNamed['ClxDescription'].Value; if Assigned(RootNode.Items.ItemNamed['ImageBase']) then // do not localize frmAdvancedOptions.edtImageBase.Text := RootNode.Items.Value('ImageBase'); if Assigned(RootNode.Items.ItemNamed['VersionMajorNumber']) then // do not localize frmAdvancedOptions.edtVersionMajorNumber.Text := RootNode.Items.Value('VersionMajorNumber'); if Assigned(RootNode.Items.ItemNamed['VersionMinorNumber']) then // do not localize frmAdvancedOptions.edtVersionMinorNumber.Text := RootNode.Items.Value('VersionMinorNumber'); if Assigned(RootNode.Items.ItemNamed['ReleaseNumber']) then // do not localize frmAdvancedOptions.edtReleaseNumber.Text := RootNode.Items.Value('ReleaseNumber'); if Assigned(RootNode.Items.ItemNamed['BuildNumber']) then // do not localize frmAdvancedOptions.edtBuildNumber.Text := RootNode.Items.Value('BuildNumber'); // read required packages requiredNode := rootNode.Items.ItemNamed['Requires']; jsgDependencies.RowCount := requiredNode.Items.Count + 2; jsgDependencies.Rows[jsgDependencies.RowCount-1].Text := ''; jsgDependencies.FixedRows := 1; for i := 0 to requiredNode.Items.Count - 1 do begin row := jsgDependencies.Rows[i+1]; packageNode := requiredNode.Items[i]; for j := 0 to row.Count - 1 do begin row[j] := packageNode.Properties.ItemNamed[jsgDependencies.Rows[0][j]].Value; end; end; // read files filesNode := rootNode.Items.ItemNamed['Contains']; jsgFiles.RowCount := filesNode.Items.Count + 2; jsgFiles.FixedRows := 1; jsgFiles.Rows[jsgFiles.RowCount-1].Text := ''; for i := 0 to filesNode.Items.Count - 1 do begin row := jsgFiles.Rows[i+1]; fileNode := filesNode.Items[i]; for j := 0 to row.Count - 1 do begin propname := jsgFiles.Rows[0][j]; StrReplace(propname, ' ', '', [rfReplaceAll]); row[j] := fileNode.Properties.ItemNamed[propname].Value; end; end; end; Changed := False; finally xml.Free; end; end; procedure TfrmMain.jlbListClick(Sender: TObject); begin LoadPackage; end; procedure TfrmMain.actGenerateExecute(Sender: TObject); var path : string; targets : TStringList; i : Integer; ErrMsg : string; begin if IsOkToChange then begin if PathIsAbsolute(PackagesLocation) then path := PackagesLocation else path := PathNoInsideRelative(StrEnsureSuffix(DirDelimiter, StartupDir) + PackagesLocation); frmTargets.Path := path; if frmTargets.ShowModal = mrOk then begin targets := TStringList.Create; try for i := 0 to frmTargets.clbBuilds.Items.Count - 1 do begin with frmTargets.clbBuilds do begin if Checked[i] then targets.Add(Items[i]); end; end; frmGenMessages.Show; Generate(jlbList.Items, targets, AddMessage, jaxStore.FileName, cmbModel.Items[cmbModel.ItemIndex], ErrMsg); finally targets.Free; end; end; end; end; procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Shift = [ssCtrl] then begin case Key of VK_UP: begin if actPrevPackage.Enabled then actPrevPackage.Execute; Key := 0; end; VK_DOWN: begin if actNextPackage.Enabled then actNextPackage.Execute; Key := 0; end; end; end; end; procedure TfrmMain.actPrevPackageExecute(Sender: TObject); begin if IsOkToChange then begin jlbList.ItemIndex := jlbList.ItemIndex - 1; LoadPackage; end; end; procedure TfrmMain.actNextPackageExecute(Sender: TObject); begin if IsOkToChange then begin jlbList.ItemIndex := jlbList.ItemIndex + 1; LoadPackage; end; end; procedure TfrmMain.actMainToolbarUpdate(Sender: TObject); begin actMainToolbar.Checked := jtbTools.Visible; end; procedure TfrmMain.actMainToolbarExecute(Sender: TObject); begin jtbTools.Visible := actMainToolbar.Checked; end; procedure TfrmMain.actKnownExecute(Sender: TObject); begin frmKnownTags.ShowModal; end; function TfrmMain.IsOkToChange: Boolean; begin if Changed then begin Result := True; case Application.MessageBox( 'The values for this package have changed.'#13#10 + 'Do you want to save before the next action ?', 'Package has changed', MB_ICONQUESTION or MB_YESNOCANCEL) of MRYES: actSave.Execute; MRCANCEL: Result := False; end; end else Result := True; end; procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := IsOkToChange; end; procedure TfrmMain.jlbListMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then IsOkToChange; end; procedure TfrmMain.sptDepAndFilesMoved(Sender: TObject); begin lblDependencies.Top := pnlDepAndFiles.Top + (jsgDependencies.Height - lblDependencies.Height) div 2; lblFiles.Top := pnlDepAndFiles.Top + pnlDepAndFiles.Height - jsgFiles.Height + (jsgFiles.Height - lblFiles.Height) div 2; end; procedure TfrmMain.mnuAboutClick(Sender: TObject); begin ShowMessage( 'Jedi Package Generator'#13#10+ #13#10+ '(c) 2003-2005 Olivier Sannier for the Jedi group'); end; procedure TfrmMain.jsgFilesGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String); begin if Sender = jsgDependencies then begin FOrgValueDep := Value; FValidOrgDep := True; end else if Sender = jsgFiles then begin FOrgValueFiles := Value; FValidOrgFiles := True; end; end; procedure TfrmMain.btnAdvancedBCBClick(Sender: TObject); begin frmAdvancedOptions.ShowModal; end; procedure TfrmMain.FormShow(Sender: TObject); var ErrMsg : string; begin if not Application.Terminated then begin // force the models to be loaded in appropriate form and // load the names in the combo box frmModels.LoadModels(jaxStore.FileName, ConfigLoadedOk); cmbModel.Items.Assign(frmModels.cmbModels.Items); jfsStore.RestoreFormPlacement; if cmbModel.ItemIndex >-1 then ConfigLoadedOk := LoadConfig(jaxStore.FileName, cmbModel.Items[cmbModel.ItemIndex], ErrMsg) else ConfigLoadedOk := LoadConfig(jaxStore.FileName, '', ErrMsg); if not ConfigLoadedOk then begin Application.MessageBox(PChar('Error loading configuration:'#13#10+ #13#10+ ErrMsg), 'Error loading configuration', MB_ICONERROR); Application.Terminate; Exit; end; // Load the list of packages LoadPackagesList; end; end; procedure TfrmMain.MoveLine(sg : TStringGrid; direction : Integer); var tmpRow : TStrings; RowIndex : Integer; begin RowIndex := sg.Row; if not ((RowIndex + direction = 0) or (RowIndex + direction = sg.RowCount - 1)) then begin tmpRow := TStringList.Create; try tmpRow.Assign(sg.Rows[RowIndex]); sg.Rows[RowIndex] := sg.Rows[RowIndex + direction]; sg.Rows[RowIndex + direction] := tmpRow; Changed := True; sg.Row := RowIndex + direction; finally tmpRow.Free; end; end; end; procedure TfrmMain.actUpExecute(Sender: TObject); begin if ActiveControl is TInPlaceEdit then begin MoveLine((ActiveControl as TInPlaceEdit).Parent as TStringGrid, -1); end; end; procedure TfrmMain.actDownExecute(Sender: TObject); begin if ActiveControl is TInPlaceEdit then begin MoveLine((ActiveControl as TInPlaceEdit).Parent as TStringGrid, +1); end; end; procedure TfrmMain.actUpUpdate(Sender: TObject); var curRow : Integer; sg : TStringGrid; begin if ActiveControl is TInPlaceEdit then begin sg := ((ActiveControl as TInPlaceEdit).Parent as TStringGrid); curRow := sg.Row ; actUp.Enabled := (curRow > 1) and (curRow < sg.RowCount-1); end; end; procedure TfrmMain.actDownUpdate(Sender: TObject); var sg : TStringGrid; begin if ActiveControl is TInPlaceEdit then begin sg := ((ActiveControl as TInPlaceEdit).Parent as TStringGrid); actDown.Enabled := sg.Row < sg.RowCount-2; end; end; procedure TfrmMain.jdePackagesLocationChange(Sender: TObject); begin LoadPackagesList; end; procedure TfrmMain.ClearAll; begin // empty everything ledName.Text := ''; ledDescription.Text := ''; ComboBoxType.ItemIndex := Integer(ptPackageRun); edtGUID.Text := ''; ledC5PFlags.Text := ''; ledC6PFlags.Text := ''; jsgDependencies.Rows[1].Text := ''; jsgDependencies.RowCount := 2; jsgFiles.Rows[1].Text := ''; jsgFiles.RowCount := 2; end; procedure TfrmMain.jlbListKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_DELETE: actDelete.Execute; end; end; procedure TfrmMain.actDeleteExecute(Sender: TObject); var path : string; begin if (jlbList.ItemIndex > -1) and (Application.MessageBox(PChar( 'You are about to delete '+jlbList.Items[jlbList.ItemIndex]+#13#10+ 'Are you sure you want to do that ?'), 'Deleting a package', MB_ICONQUESTION or MB_YESNO) = MRYES) then begin if PathIsAbsolute(PackagesLocation) then path := PackagesLocation else path := PathNoInsideRelative(StrEnsureSuffix(DirDelimiter, StartupDir) + PackagesLocation); path := StrEnsureSuffix(DirDelimiter, path) + 'xml' + DirDelimiter + jlbList.Items[jlbList.ItemIndex] + '.xml'; if not DeleteFile(path) then Application.MessageBox(PChar('Unable to delete ' + path), 'Error', MB_ICONERROR); LoadPackagesList; end; end; procedure TfrmMain.actOptionsExecute(Sender: TObject); begin pnlOptions.Visible := not pnlOptions.Visible; end; procedure TfrmMain.actOptionsUpdate(Sender: TObject); begin actOptions.Checked := pnlOptions.Visible; end; procedure TfrmMain.btnEditModelClick(Sender: TObject); begin frmModels.EditIndex := cmbModel.ItemIndex; if frmModels.ShowModal = mrOk then begin cmbModel.ItemIndex := frmModels.cmbModels.ItemIndex; LoadPackagesList; jaxStore.Reload; end; end; procedure TfrmMain.cmbModelClick(Sender: TObject); var ErrMsg : string; begin if not LoadConfig(jaxStore.FileName, cmbModel.Items[cmbModel.ItemIndex], ErrMsg) then Application.MessageBox(PChar(ErrMsg), 'Error loading configuration', MB_ICONERROR) else LoadPackagesList; end; procedure TfrmMain.btnCLXDescriptionClick(Sender: TObject); begin if (FClxDescription = '') and (cmbModel.Items[cmbModel.ItemIndex] = 'JVCL') then begin FClxDescription := ledDescription.Text; StrReplace(FClxDescription, 'JVCL ', 'JVCLX ', [rfReplaceAll]); end; if InputQuery('CLX Description', 'Please indicate the CLX Description', FClxDescription) then Changed := True; end; procedure TfrmMain.btnGenerateGUIDClick(Sender: TObject); var GeneratedGUID : TGUID; begin // Generate a GUID for the package CoCreateGUID(GeneratedGUID); edtGUID.Text := GUIDToString(GeneratedGUID); end; end.