mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-10-31 05:03:17 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1291 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			1291 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| { Copyright (C) 2006 Mattias Gaertner
 | |
| 
 | |
|   This source is free software; you can redistribute it and/or modify it under
 | |
|   the terms of the GNU General Public License as published by the Free
 | |
|   Software Foundation; either version 2 of the License, or (at your option)
 | |
|   any later version.
 | |
| 
 | |
|   This code is distributed in the hope that it will be useful, but WITHOUT ANY
 | |
|   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | |
|   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 | |
|   details.
 | |
| 
 | |
|   A copy of the GNU General Public License is available on the World Wide Web
 | |
|   at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
 | |
|   to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
 | |
|   Boston, MA 02110-1335, USA.
 | |
| }
 | |
| unit H2PasDlg;
 | |
| 
 | |
| {$mode objfpc}{$H+}
 | |
| 
 | |
| interface
 | |
| 
 | |
| uses
 | |
|   Classes, SysUtils, LCLProc, LCLType, LResources, Forms, Controls, Graphics,
 | |
|   Dialogs, ComCtrls, Buttons, StdCtrls, ExtCtrls,
 | |
|   LazConfigStorage, LazFileUtils, LazFileCache, SynEdit,
 | |
|   FileProcs, IDEMsgIntf, MenuIntf, IDECommands, BaseIDEIntf,
 | |
|   IDEDialogs, LazIDEIntf, SrcEditorIntf, IDEExternToolIntf, CompOptsIntf,
 | |
|   IDETextConverter, H2PasStrConsts, H2PasConvert, IDETextConvListEdit;
 | |
| 
 | |
| type
 | |
| 
 | |
|   { TH2PasDialog }
 | |
| 
 | |
|   TH2PasDialog = class(TForm)
 | |
|     MergeAllCHeadersExceptCurrentButton: TButton;
 | |
|     MergeFileCheckBox: TCheckBox;
 | |
|     FileInfoMemo: TMemo;
 | |
|     FileStateImageList: TImageList;
 | |
|     MoveFileDownButton: TButton;
 | |
|     MoveFileUpButton: TButton;
 | |
|     ConvertAndBuildButton: TButton;
 | |
|     FileInfoGroupBox: TGroupBox;
 | |
|     MainPageControl: TPageControl;
 | |
|     AddIncludedCHeaderFilesButton: TButton;
 | |
| 
 | |
|     // c header files
 | |
|     FilesTabSheet: TTabSheet;
 | |
|     CHeaderFilesSplitter1: TSplitter;
 | |
|     AddCHeadersButton: TButton;
 | |
|     DisableAllCHeadersButton: TButton;
 | |
|     EnableAllCHeadersButton: TButton;
 | |
|     DeleteCHeadersButton: TButton;
 | |
|     CHeaderFilesCheckTreeView: TTreeView;
 | |
| 
 | |
|     // pre h2pas
 | |
|     PreH2PasTabSheet: TTabSheet;
 | |
|     PreH2PasGroupBox: TGroupBox;
 | |
|     PreH2PasEdit: TTextConvListEditor;
 | |
| 
 | |
|     // h2pas
 | |
|     h2pasOptionsTabSheet: TTabSheet;
 | |
|     h2pasOptionsCheckGroup: TCheckGroup;
 | |
|     LibnameEdit: TEdit;
 | |
|     LibNameLabel: TLabel;
 | |
|     OutputExtEdit: TEdit;
 | |
|     OutputExtLabel: TLabel;
 | |
|     OutputDirEdit: TEdit;
 | |
|     OutputDirLabel: TLabel;
 | |
|     OutputDirBrowseButton: TButton;
 | |
| 
 | |
|     // post h2pas
 | |
|     PostH2PasTabSheet: TTabSheet;
 | |
|     PostH2PasGroupBox: TGroupBox;
 | |
|     PostH2PasEdit: TTextConvListEditor;
 | |
| 
 | |
|     // settings
 | |
|     SettingsTabSheet: TTabSheet;
 | |
|     h2pasFilenameBrowseButton: TButton;
 | |
|     H2PasFilenameEdit: TEdit;
 | |
|     H2PasFilenameLabel: TLabel;
 | |
|     NewSettingsButton: TButton;
 | |
|     SaveSettingsAsButton: TButton;
 | |
|     OpenLastProjectOnStartCheckBox: TCheckBox;
 | |
| 
 | |
|     // buttons at bottom
 | |
|     OpenSettingsButton: TButton;
 | |
|     SaveSettingsButton: TButton;
 | |
|     ConvertButton: TButton;
 | |
|     CloseButton: TButton;
 | |
| 
 | |
|     procedure AddCHeadersButtonClick(Sender: TObject);
 | |
|     procedure AddIncludedCHeaderFilesButtonClick(Sender: TObject);
 | |
|     procedure CHeaderFilesCheckTreeViewDblClick(Sender: TObject);
 | |
|     procedure CHeaderFilesCheckTreeViewMouseDown(Sender: TOBject;
 | |
|       Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 | |
|     procedure CHeaderFilesCheckTreeViewSelectionChanged(Sender: TObject);
 | |
|     procedure CloseButtonClick(Sender: TObject);
 | |
|     procedure ConvertAndBuildButtonClick(Sender: TObject);
 | |
|     procedure ConvertButtonClick(Sender: TObject);
 | |
|     procedure DeleteCHeadersButtonClick(Sender: TObject);
 | |
|     procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
 | |
|     procedure FormCreate(Sender: TObject);
 | |
|     procedure FormDestroy(Sender: TObject);
 | |
|     procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
 | |
|     procedure H2PasFilenameEditEditingDone(Sender: TObject);
 | |
|     procedure LibnameEditEditingDone(Sender: TObject);
 | |
|     procedure MergeAllCHeadersExceptCurrentButtonClick(Sender: TObject);
 | |
|     procedure MergeFileCheckBoxEditingDone(Sender: TObject);
 | |
|     procedure MoveFileDownButtonClick(Sender: TObject);
 | |
|     procedure MoveFileUpButtonClick(Sender: TObject);
 | |
|     procedure NewSettingsButtonClick(Sender: TObject);
 | |
|     procedure OpenLastProjectOnStartCheckBoxChange(Sender: TObject);
 | |
|     procedure OpenSettingsButtonClick(Sender: TObject);
 | |
|     procedure OutputDirBrowseButtonClick(Sender: TObject);
 | |
|     procedure OutputDirEditEditingDone(Sender: TObject);
 | |
|     procedure OutputExtEditEditingDone(Sender: TObject);
 | |
|     procedure PostH2PasEditModified(Sender: TObject);
 | |
|     procedure PreH2PasEditModified(Sender: TObject);
 | |
|     procedure SaveSettingsAsButtonClick(Sender: TObject);
 | |
|     procedure SaveSettingsButtonClick(Sender: TObject);
 | |
|     procedure EnableAllCHeadersButtonClick(Sender: TObject);
 | |
|     procedure DisableAllCHeadersButtonClick(Sender: TObject);
 | |
|     procedure h2pasFilenameBrowseButtonClick(Sender: TObject);
 | |
|     procedure h2pasOptionsCheckGroupItemClick(Sender: TObject; Index: LongInt);
 | |
|     procedure OnShowSrcEditSection(Sender: TObject);
 | |
|     procedure OnAddSearchAndReplaceBeforeH2PasClick(Sender: TObject);
 | |
|   private
 | |
|     FConverter: TH2PasConverter;
 | |
|     FSrcEditAddSearchReplaceMenuItem: TIDEMenuCommand;
 | |
|     FSrcEditSection: TIDEMenuSection;
 | |
|     
 | |
|     function GetProject: TH2PasProject;
 | |
|     
 | |
|     procedure UpdateAll(ScanIncludes: boolean);
 | |
|     procedure UpdateProjectChanged(ScanIncludes: boolean); // show project settings
 | |
|     procedure UpdateCaption;
 | |
|     procedure UpdateFileInfo;
 | |
|     procedure ClearMessages;
 | |
|     procedure CreateLazarusMenuItems;
 | |
|     function GetNodeFilename(Node: TTreeNode): string;
 | |
|     function GetCurrentCHeaderFile: TH2PasFile;
 | |
|     procedure MoveCurrentFile(Offset: integer);
 | |
|     function GetFileNodeStateIndex(aFile: TH2PasFile): Integer;
 | |
|     procedure MarkAllCHeadersExceptCurrentToMerge;
 | |
| 
 | |
|     // project settings
 | |
|     procedure UpdateFilesPage(ScanIncludes: boolean);
 | |
|     procedure UpdateH2PasPage;
 | |
|     procedure UpdateConvertPage;
 | |
|     // global settings
 | |
|     procedure UpdateSettingsPage;
 | |
|     
 | |
|     function ShowSelectDirDialog(const Title: string;
 | |
|                                  var ADirectory: string): boolean;
 | |
|     function ShowOpenFileDialog(const Title: string;
 | |
|                                 var AFilename: string): boolean;
 | |
|     // IDE events
 | |
|     function OnIDESavedAll(Sender: TObject): TModalResult;
 | |
|   public
 | |
|     function Convert: TModalResult;
 | |
|     procedure ShowH2PasError;
 | |
| 
 | |
|     function SaveSettings: TModalResult;
 | |
|     function SaveGlobalSettings: TModalResult;
 | |
|     function LoadGlobalSettings: TModalResult;
 | |
|     function SaveProject(const Filename: string; Flags: TSaveFlags): TModalResult;
 | |
|     function OpenProject(const Filename: string; Flags: TOpenFlags): TModalResult;
 | |
|     property Converter: TH2PasConverter read FConverter;
 | |
|     property Project: TH2PasProject read GetProject;
 | |
|     property SrcEditSection: TIDEMenuSection read FSrcEditSection;
 | |
|     property SrcEditAddSearchReplaceMenuItem: TIDEMenuCommand
 | |
|                                           read FSrcEditAddSearchReplaceMenuItem;
 | |
|   end;
 | |
| 
 | |
| var
 | |
|   H2PasDialog: TH2PasDialog = nil;
 | |
|   CmdH2PasTool: TIDECommand = nil;
 | |
| 
 | |
| procedure ExecuteH2PasTool(Sender: TObject);
 | |
| 
 | |
| 
 | |
| procedure Register;
 | |
| 
 | |
| implementation
 | |
| 
 | |
| {$R h2pasdlg.lfm}
 | |
| 
 | |
| procedure ExecuteH2PasTool(Sender: TObject);
 | |
| begin
 | |
|   if H2PasDialog=nil then
 | |
|     H2PasDialog:=TH2PasDialog.Create(Application);
 | |
|   H2PasDialog.ShowOnTop;
 | |
| end;
 | |
| 
 | |
| procedure Register;
 | |
| var
 | |
|   Key: TIDEShortCut;
 | |
|   Cat: TIDECommandCategory;
 | |
| begin
 | |
|   // register IDE shortcut and menu item
 | |
|   Key := IDEShortCut(VK_UNKNOWN,[],VK_UNKNOWN,[]);
 | |
|   Cat:=IDECommandList.FindCategoryByName(CommandCategoryToolMenuName);
 | |
|   CmdH2PasTool := RegisterIDECommand(Cat,
 | |
|          'H2Pas ...', h2pCreateUnitsFromCHeaderFiles, Key, nil, @ExecuteH2PasTool);
 | |
|   RegisterIDEMenuCommand(itmSecondaryTools, 'H2PasTool', h2pH2Pas, nil, nil,
 | |
|                          CmdH2PasTool);
 | |
| 
 | |
|   // register text converter tools
 | |
|   TextConverterToolClasses.RegisterClass(TPreH2PasTools);
 | |
|   TextConverterToolClasses.RegisterClass(TRemoveCPlusPlusExternCTool);
 | |
|   TextConverterToolClasses.RegisterClass(TRemoveEmptyCMacrosTool);
 | |
|   TextConverterToolClasses.RegisterClass(TReplaceEdgedBracketPairWithStar);
 | |
|   TextConverterToolClasses.RegisterClass(TReplaceMacro0PointerWithNULL);
 | |
|   TextConverterToolClasses.RegisterClass(TConvertFunctionTypesToPointers);
 | |
|   TextConverterToolClasses.RegisterClass(TConvertEnumsToTypeDef);
 | |
|   TextConverterToolClasses.RegisterClass(TCommentComplexCMacros);
 | |
|   TextConverterToolClasses.RegisterClass(TCommentComplexCFunctions);
 | |
|   TextConverterToolClasses.RegisterClass(TAddMissingMacroBrackets);
 | |
| 
 | |
|   TextConverterToolClasses.RegisterClass(TPostH2PasTools);
 | |
|   TextConverterToolClasses.RegisterClass(TReplaceUnitFilenameWithUnitName);
 | |
|   TextConverterToolClasses.RegisterClass(TRemoveIncludeDirectives);
 | |
|   TextConverterToolClasses.RegisterClass(TRemoveDoubleSemicolons);
 | |
|   TextConverterToolClasses.RegisterClass(TRemoveSystemTypes);
 | |
|   TextConverterToolClasses.RegisterClass(TRemoveRedefinedPointerTypes);
 | |
|   TextConverterToolClasses.RegisterClass(TRemoveEmptyTypeVarConstSections);
 | |
|   TextConverterToolClasses.RegisterClass(TFixH2PasMissingIFDEFsInUnit);
 | |
|   TextConverterToolClasses.RegisterClass(TReduceCompilerDirectivesInUnit);
 | |
|   TextConverterToolClasses.RegisterClass(TReplaceImplicitTypes);
 | |
|   TextConverterToolClasses.RegisterClass(TFixArrayOfParameterType);
 | |
|   TextConverterToolClasses.RegisterClass(TAddMissingPointerTypes);
 | |
|   TextConverterToolClasses.RegisterClass(TRemoveRedefinitionsInUnit);
 | |
|   TextConverterToolClasses.RegisterClass(TFixAliasDefinitionsInUnit);
 | |
|   TextConverterToolClasses.RegisterClass(TReplaceConstFunctionsInUnit);
 | |
|   TextConverterToolClasses.RegisterClass(TReplaceTypeCastFunctionsInUnit);
 | |
|   TextConverterToolClasses.RegisterClass(TFixForwardDefinitions);
 | |
|   TextConverterToolClasses.RegisterClass(TAddToUsesSection);
 | |
| 
 | |
|   // register h2pas output parser
 | |
|   ExternalToolList.RegisterParser(TH2PasParser);
 | |
| end;
 | |
| 
 | |
| { TH2PasDialog }
 | |
| 
 | |
| procedure TH2PasDialog.FormCreate(Sender: TObject);
 | |
| begin
 | |
|   Caption:=h2pCHeaderFileConverter;
 | |
|   FilesTabSheet.Caption := h2pCHeaderFiles;
 | |
|     AddCHeadersButton.Caption := h2pAddHFiles;
 | |
|     DeleteCHeadersButton.Caption := h2pDeleteSelectedHFiles;
 | |
|     EnableAllCHeadersButton.Caption := h2pEnableAllHFiles;
 | |
|     DisableAllCHeadersButton.Caption := h2pDisableAllHFiles;
 | |
|     MoveFileDownButton.Caption := h2pMoveFileDown;
 | |
|     MoveFileUpButton.Caption := h2pMoveFileUp;
 | |
|     FileInfoGroupBox.Caption := h2pFileInformation;
 | |
|     AddIncludedCHeaderFilesButton.Caption := h2pAddIncludedHFiles;
 | |
|     MergeAllCHeadersExceptCurrentButton.Caption := h2pMergeAllButThis;
 | |
|   MergeFileCheckBox.Caption := h2pMergeFile;
 | |
|   h2pasOptionsTabSheet.Caption := h2pH2pasOptions;
 | |
|     h2pasOptionsCheckGroup.Caption := h2pOptions;
 | |
|     with h2pasOptionsCheckGroup.Items do begin
 | |
|       Add(h2pDUseExternalForAllProcedures);
 | |
|       Add(h2pDUseExternalLibnameNameFunc__nameForFunctions);
 | |
|       Add(h2pEConstantsInsteadOfEnumerationTypeForCEnums);
 | |
|       Add(h2pCCompactOutputmodeLessSpacesAndEmptyLines);
 | |
|       Add(h2pICreateAnIncludeFileInsteadOfAUnit);
 | |
|       Add(h2pPUseLetterPForPointerTypesInsteadOf);
 | |
|       Add(h2pPrPackAllRecords1ByteAlignment);
 | |
|       Add(h2pPUseProcVarsForImports);
 | |
|       Add(h2pSStripComments);
 | |
|       Add(h2pSStripCommentsAndInfo);
 | |
|       Add(h2pTPrependTypedefTypesWithT);
 | |
|       Add(h2pTPrependTypedefTypesWithTAndRemove__);
 | |
|       Add(h2pVReplacePointerParametersByVar);
 | |
|       Add(h2pWHandleSpecialWin32Macros);
 | |
|       Add(h2pXHandleSYS__TRAPOfThePalmOSHeaderFiles);
 | |
|       Add(h2pCUseTypesInCtypesUnit);
 | |
|     end;
 | |
|     OutputExtLabel.Caption := h2pOutputExtensionOfNewFile;
 | |
|     OutputDirLabel.Caption := h2pOutputDirectory;
 | |
|     LibNameLabel.Caption := h2pLLibraryName;
 | |
|   PreH2PasTabSheet.Caption := h2pBeforeH2pas;
 | |
|     PreH2PasGroupBox.Caption := h2pConversionsBeforeRunningH2pas;
 | |
|   PostH2PasTabSheet.Caption := h2pAfterH2pas;
 | |
|     PostH2PasGroupBox.Caption := h2pConversionsAfterRunningH2pas;
 | |
|   SettingsTabSheet.Caption := h2pSettings;
 | |
|     H2PasFilenameLabel.Caption := h2pH2pasProgramPath;
 | |
|     OpenLastProjectOnStartCheckBox.Caption := h2pOpenLastSettingsOnStart;
 | |
|     SaveSettingsAsButton.Caption := h2pSaveSettingsAs;
 | |
|     NewSettingsButton.Caption := h2pNewClearSettings;
 | |
|   OpenSettingsButton.Caption := h2pOpenSettings;
 | |
|   SaveSettingsButton.Caption := h2pSaveSettings;
 | |
|   ConvertButton.Caption := h2pRunH2pas;
 | |
|   ConvertAndBuildButton.Caption := h2pRunH2pasAndCompile;
 | |
|   CloseButton.Caption := h2pClose;
 | |
|   
 | |
|   PreH2PasEdit:=TTextConvListEditor.Create(Self);
 | |
|   with PreH2PasEdit do
 | |
|   begin
 | |
|     Name:='PreH2PasEdit';
 | |
|     Align:=alClient;
 | |
|     OnModified:=@PreH2PasEditModified;
 | |
|     Dock(PreH2PasGroupBox, Rect(0, 0, 0, 0));
 | |
|     Visible:=true;// Note: it's a form, and visible default is false
 | |
|   end;
 | |
| 
 | |
|   PostH2PasEdit:=TTextConvListEditor.Create(Self);
 | |
|   with PostH2PasEdit do begin
 | |
|     Name:='PostH2PasEdit';
 | |
|     Align:=alClient;
 | |
|     OnModified:=@PostH2PasEditModified;
 | |
|     Dock(PostH2PasGroupBox, Rect(0, 0, 0, 0));
 | |
|     Visible:=true;// Note: it's a form, and visible default is false
 | |
|   end;
 | |
| 
 | |
|   LazarusIDE.AddHandlerOnSavedAll(@OnIDESavedAll);
 | |
|   CreateLazarusMenuItems;
 | |
| 
 | |
|   // create converter
 | |
|   FConverter:=TH2PasConverter.Create;
 | |
|   LoadGlobalSettings;
 | |
|   
 | |
|   // create project
 | |
|   if Converter.AutoOpenLastProject
 | |
|   and FileExistsUTF8(Converter.CurrentProjectFilename) then
 | |
|     OpenProject(Converter.CurrentProjectFilename,[]);
 | |
|   if Project=nil then begin
 | |
|     Converter.Project:=TH2PasProject.Create;
 | |
|     PreH2PasEdit.ListOfTools:=Project.PreH2PasTools;
 | |
|     PostH2PasEdit.ListOfTools:=Project.PostH2PasTools;
 | |
|   end;
 | |
| 
 | |
|   UpdateAll(false);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.FormCloseQuery(Sender: TObject; var CanClose: boolean);
 | |
| var
 | |
|   DlgResult: TModalResult;
 | |
| begin
 | |
|   //DebugLn(['TH2PasDialog.FormCloseQuery Converter.Modified=',Converter.Modified,' Project.Modified=',Project.Modified]);
 | |
|   if Converter.Modified
 | |
|   or ((Project<>nil) and (Project.Modified)) then begin
 | |
|     DlgResult := QuestionDlg(h2pSaveChanges,
 | |
|       h2pSaveSettings2, mtConfirmation,
 | |
|       [mrYes, h2pSaveAndExit, mrNo, h2pDiscardChangesAndExit,
 | |
|        mrCancel, h2pDoNotExit], 0);
 | |
|     case DlgResult of
 | |
|     mrYes: CanClose:=SaveSettings=mrOk;
 | |
|     mrNo: ;
 | |
|     else CanClose:=false;
 | |
|     end;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.CloseButtonClick(Sender: TObject);
 | |
| begin
 | |
|   Close;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.ConvertAndBuildButtonClick(Sender: TObject);
 | |
| begin
 | |
|   if Convert=mrOk then
 | |
|     LazarusIDE.DoBuildProject(crCompile,[]);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.ConvertButtonClick(Sender: TObject);
 | |
| begin
 | |
|   Convert;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.DeleteCHeadersButtonClick(Sender: TObject);
 | |
| var
 | |
|   DeleteFiles: TStringList;
 | |
|   Node: TTreeNode;
 | |
| begin
 | |
|   DeleteFiles:=TStringList.Create;
 | |
|   Node:=CHeaderFilesCheckTreeView.GetFirstMultiSelected;
 | |
|   while Node<>nil do begin
 | |
|     if Node.Parent=nil then begin
 | |
|       // top lvl node is a .h file
 | |
|       DeleteFiles.Add(GetNodeFilename(Node));
 | |
|     end;
 | |
|     Node:=Node.GetNextMultiSelected;
 | |
|   end;
 | |
|   if DeleteFiles.Count>0 then begin
 | |
|     if QuestionDlg(h2pConfirmRemoval,
 | |
|       Format(h2pDeleteTheseHFilesFromList, [#13, #13, DeleteFiles.Text]),
 | |
|       mtConfirmation, [mrYes, h2pRemoveAllFiles, mrCancel], 0) = mrYes
 | |
|     then begin
 | |
|       Project.DeleteFiles(DeleteFiles);
 | |
|     end;
 | |
|     UpdateFilesPage(true);
 | |
|   end;
 | |
|   DeleteFiles.Free;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.AddCHeadersButtonClick(Sender: TObject);
 | |
| var
 | |
|   OpenDialog: TOpenDialog;
 | |
| begin
 | |
|   OpenDialog:=TOpenDialog.Create(nil);
 | |
|   try
 | |
|     InitIDEFileDialog(OpenDialog);
 | |
|     OpenDialog.Title := h2pAddHFiles2;
 | |
|     OpenDialog.Options:=OpenDialog.Options+[ofAllowMultiSelect,ofFileMustExist];
 | |
|     OpenDialog.Filter := Format(h2pCHeaderFileHHAllFiles, [FileMask]);
 | |
|     if OpenDialog.Execute then begin
 | |
|       Project.AddFiles(OpenDialog.Files);
 | |
|       UpdateFilesPage(true);
 | |
|     end;
 | |
|   finally
 | |
|     StoreIDEFileDialog(OpenDialog);
 | |
|     OpenDialog.Free;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.CHeaderFilesCheckTreeViewMouseDown(Sender: TOBject;
 | |
|   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 | |
| var
 | |
|   Node: TTreeNode;
 | |
|   StateIconLeft: LongInt;
 | |
|   AFilename: String;
 | |
|   CurFile: TH2PasFile;
 | |
| begin
 | |
|   if (Button=mbLeft) and (Shift=[]) then ;
 | |
|   Node:=CHeaderFilesCheckTreeView.GetNodeAt(X,Y);
 | |
|   if (Node=nil) or (Node.Parent<>nil) then exit;
 | |
|   StateIconLeft:=Node.DisplayStateIconLeft;
 | |
|   if (x>=StateIconLeft) and (x<StateIconLeft+FileStateImageList.Width) then
 | |
|   begin
 | |
|     AFilename:=GetNodeFilename(Node);
 | |
|     CurFile:=Project.CHeaderFileWithFilename(AFilename);
 | |
|     if CurFile=nil then exit;
 | |
|     CurFile.Enabled:=not CurFile.Enabled;
 | |
|     Node.StateIndex:=GetFileNodeStateIndex(CurFile);
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.AddIncludedCHeaderFilesButtonClick(Sender: TObject);
 | |
| var
 | |
|   AFile: TH2PasFile;
 | |
|   sl: TStringList;
 | |
|   i: Integer;
 | |
|   IncFile: TH2PasFileCInclude;
 | |
|   CurFilename: String;
 | |
|   j: Integer;
 | |
|   s: String;
 | |
| begin
 | |
|   AFile:=GetCurrentCHeaderFile;
 | |
|   if AFile=nil then exit;
 | |
|   AFile.ReadCIncludes(false);
 | |
|   sl:=TStringList.Create;
 | |
|   try
 | |
|     for i:=0 to AFile.CIncludeCount-1 do begin
 | |
|       IncFile:=AFile.CIncludes[i];
 | |
|       CurFilename:=IncFile.Filename;
 | |
|       if CurFilename='' then continue;
 | |
|       // .h file found in include directories
 | |
|       if Project.CHeaderFileWithFilename(CurFilename)<>nil then continue;
 | |
|       // .h file not yet in project
 | |
|       j:=sl.Count-1;
 | |
|       while (j>=0) and (CompareFilenames(CurFilename,sl[j])<>0) do dec(j);
 | |
|       if j>=0 then continue;
 | |
|       // .h file not yet in list
 | |
|       sl.Add(CurFilename);
 | |
|     end;
 | |
|     if sl.Count>0 then begin
 | |
|       s:='';
 | |
|       for i:=0 to sl.Count-1 do begin
 | |
|         CurFilename:=Project.ShortenFilename(sl[i]);
 | |
|         s:=s+#13+CurFilename;
 | |
|       end;
 | |
|       if QuestionDlg(h2pAddHFiles3,
 | |
|         Format(h2pAddTheseHFilesToH2pasProject, [#13, s, #13]),
 | |
|         mtConfirmation,[mrYes,mrNo],0)=mrYes
 | |
|       then begin
 | |
|         Project.AddFiles(sl);
 | |
|         Project.ReadAllCIncludes(true);
 | |
|         UpdateFilesPage(false);
 | |
|       end;
 | |
|     end;
 | |
|   finally
 | |
|     sl.Free;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.CHeaderFilesCheckTreeViewDblClick(Sender: TObject);
 | |
| var
 | |
|   CurFile: TH2PasFile;
 | |
| begin
 | |
|   CurFile:=GetCurrentCHeaderFile;
 | |
|   if CurFile<>nil then
 | |
|     LazarusIDE.DoOpenEditorFile(CurFile.Filename,-1, -1,[]);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.CHeaderFilesCheckTreeViewSelectionChanged(Sender: TObject);
 | |
| begin
 | |
|   UpdateFileInfo;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.FormDestroy(Sender: TObject);
 | |
| begin
 | |
|   PreH2PasEdit.ListOfTools:=nil;
 | |
|   PostH2PasEdit.ListOfTools:=nil;
 | |
|   FreeAndNil(FConverter);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.FormKeyDown(Sender: TObject; var Key: Word;
 | |
|   Shift: TShiftState);
 | |
| begin
 | |
|   if (Key=VK_ESCAPE) and (Shift=[]) then begin
 | |
|     ModalResult:=mrCancel;
 | |
|     Key:=VK_UNKNOWN;
 | |
|   end;
 | |
|   if (Key=VK_S) and (Shift=[ssCtrl]) then begin
 | |
|     SaveSettings;
 | |
|     Key:=VK_UNKNOWN;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.H2PasFilenameEditEditingDone(Sender: TObject);
 | |
| begin
 | |
|   Converter.h2pasFilename:=H2PasFilenameEdit.Text;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.LibnameEditEditingDone(Sender: TObject);
 | |
| begin
 | |
|   if Project<>nil then
 | |
|     Project.Libname:=LibnameEdit.Text;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.MergeAllCHeadersExceptCurrentButtonClick(Sender: TObject);
 | |
| begin
 | |
|   MarkAllCHeadersExceptCurrentToMerge;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.MergeFileCheckBoxEditingDone(Sender: TObject);
 | |
| var
 | |
|   CurFile: TH2PasFile;
 | |
| begin
 | |
|   if Project=nil then exit;
 | |
|   CurFile:=GetCurrentCHeaderFile;
 | |
|   if CurFile=nil then exit;
 | |
|   CurFile.Merge:=MergeFileCheckBox.Checked;
 | |
|   UpdateFileInfo;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.MoveFileDownButtonClick(Sender: TObject);
 | |
| begin
 | |
|   MoveCurrentFile(1);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.MoveFileUpButtonClick(Sender: TObject);
 | |
| begin
 | |
|   MoveCurrentFile(-1);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.NewSettingsButtonClick(Sender: TObject);
 | |
| begin
 | |
|   Project.Filename:='';
 | |
|   Project.Clear(true);
 | |
|   UpdateAll(true);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.OpenLastProjectOnStartCheckBoxChange(Sender: TObject);
 | |
| begin
 | |
|   Converter.AutoOpenLastProject:=OpenLastProjectOnStartCheckBox.Checked;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.OpenSettingsButtonClick(Sender: TObject);
 | |
| var
 | |
|   OpenDialog: TOpenDialog;
 | |
| begin
 | |
|   OpenDialog:=TOpenDialog.Create(nil);
 | |
|   try
 | |
|     InitIDEFileDialog(OpenDialog);
 | |
|     OpenDialog.Title := h2pOpenProjectH2p;
 | |
|     OpenDialog.Options:=OpenDialog.Options+[ofFileMustExist];
 | |
|     OpenDialog.Filter := Format(h2pH2pasProjectH2pH2pAllFiles, [FileMask]);
 | |
|     if OpenDialog.Execute then begin
 | |
|       OpenProject(OpenDialog.FileName,[]);
 | |
|     end;
 | |
|   finally
 | |
|     StoreIDEFileDialog(OpenDialog);
 | |
|     OpenDialog.Free;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.OutputDirBrowseButtonClick(Sender: TObject);
 | |
| var
 | |
|   ADirectory: String;
 | |
| begin
 | |
|   ADirectory:=OutputDirEdit.Text;
 | |
|   if not ShowSelectDirDialog(h2pOutputDirectory, ADirectory) then exit;
 | |
|   Project.OutputDirectory:=Project.ShortenFilename(ADirectory);
 | |
|   OutputDirEdit.Text:=Project.OutputDirectory;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.OutputDirEditEditingDone(Sender: TObject);
 | |
| begin
 | |
|   Project.OutputDirectory:=OutputDirEdit.Text;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.OutputExtEditEditingDone(Sender: TObject);
 | |
| begin
 | |
|   Project.OutputExt:=OutputExtEdit.Text;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.PostH2PasEditModified(Sender: TObject);
 | |
| begin
 | |
|   Project.Modified:=true;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.PreH2PasEditModified(Sender: TObject);
 | |
| begin
 | |
|   Project.Modified:=true;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.SaveSettingsAsButtonClick(Sender: TObject);
 | |
| begin
 | |
|   SaveProject('',[sfSaveAs]);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.SaveSettingsButtonClick(Sender: TObject);
 | |
| begin
 | |
|   SaveProject('',[]);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.EnableAllCHeadersButtonClick(Sender: TObject);
 | |
| var
 | |
|   i: Integer;
 | |
| begin
 | |
|   CHeaderFilesCheckTreeView.BeginUpdate;
 | |
|   for i:=0 to CHeaderFilesCheckTreeView.Items.TopLvlCount-1 do
 | |
|     CHeaderFilesCheckTreeView.Items.TopLvlItems[i].StateIndex:=1;
 | |
|   for i:=0 to Project.CHeaderFileCount-1 do
 | |
|     Project.CHeaderFiles[i].Enabled:=true;
 | |
|   CHeaderFilesCheckTreeView.EndUpdate;
 | |
|   UpdateFileInfo;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.DisableAllCHeadersButtonClick(Sender: TObject);
 | |
| var
 | |
|   i: Integer;
 | |
| begin
 | |
|   CHeaderFilesCheckTreeView.BeginUpdate;
 | |
|   for i:=0 to CHeaderFilesCheckTreeView.Items.TopLvlCount-1 do
 | |
|     CHeaderFilesCheckTreeView.Items.TopLvlItems[i].StateIndex:=0;
 | |
|   for i:=0 to Project.CHeaderFileCount-1 do
 | |
|     Project.CHeaderFiles[i].Enabled:=false;
 | |
|   CHeaderFilesCheckTreeView.EndUpdate;
 | |
|   UpdateFileInfo;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.h2pasFilenameBrowseButtonClick(Sender: TObject);
 | |
| var
 | |
|   AFilename: String;
 | |
| begin
 | |
|   AFilename:=H2PasFilenameEdit.Text;
 | |
|   if not ShowOpenFileDialog(h2pFilenameOfH2pasProgram, AFilename) then exit;
 | |
|   Converter.h2pasFilename:=AFilename;
 | |
|   H2PasFilenameEdit.Text:=Converter.h2pasFilename;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.h2pasOptionsCheckGroupItemClick(Sender: TObject;
 | |
|   Index: LongInt);
 | |
| var
 | |
|   s: string;
 | |
|   p: Integer;
 | |
|   OptionStr: String;
 | |
|   NewValue: boolean;
 | |
| begin
 | |
|   if Index<0 then exit;
 | |
|   NewValue:=h2pasOptionsCheckGroup.Checked[Index];
 | |
|   s:=h2pasOptionsCheckGroup.Items[Index];
 | |
|   p:=2;
 | |
|   while (p<=length(s)) and (s[p]<>' ') do inc(p);
 | |
|   OptionStr:=copy(s,2,p-2);
 | |
|   
 | |
|   if length(OptionStr)=1 then begin
 | |
|     case OptionStr[1] of
 | |
|     'd': Project.UseExternal:=NewValue;
 | |
|     'D': Project.UseExternalLibname:=NewValue;
 | |
|     'e': Project.ConstantsInsteadOfEnums:=NewValue;
 | |
|     'c': Project.CompactOutputmode:=NewValue;
 | |
|     'i': Project.CreateIncludeFile:=NewValue;
 | |
|     'p': Project.PforPointers:=NewValue;
 | |
|     'P': Project.UseProcVarsForImport:=NewValue;
 | |
|     's': Project.StripComments:=NewValue;
 | |
|     'S': Project.StripCommentsAndInfo:=NewValue;
 | |
|     't': Project.TforTypedefs:=NewValue;
 | |
|     'T': Project.TforTypedefsRemoveUnderscore:=NewValue;
 | |
|     'v': Project.VarParams:=NewValue;
 | |
|     'w': Project.Win32Header:=NewValue;
 | |
|     'x': Project.PalmOSSYSTrap:=NewValue;
 | |
|     'C': Project.UseCTypes:=NewValue;
 | |
|     else
 | |
|       raise Exception.Create(Format(h2pTH2PasDialogH2pasOptionsCheckGroupItemClickUnknown, [OptionStr]));
 | |
|     end;
 | |
|   end else begin
 | |
|     if OptionStr='pr' then
 | |
|       Project.PackAllRecords:=NewValue;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.OnShowSrcEditSection(Sender: TObject);
 | |
| var
 | |
|   SrcEdit: TSourceEditorInterface;
 | |
| begin
 | |
|   SrcEdit:=SourceEditorManagerIntf.ActiveEditor;
 | |
|   SrcEditSection.Visible:=(SrcEdit<>nil)
 | |
|                           and Converter.FileIsRelated(SrcEdit.FileName);
 | |
|   //DebugLn(['TH2PasDialog.OnShowSrcEditSection ',SrcEditSection.Visible]);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.OnAddSearchAndReplaceBeforeH2PasClick(Sender: TObject);
 | |
| var
 | |
|   Tool: TCustomTextConverterTool;
 | |
|   SrcEdit: TSourceEditorInterface;
 | |
|   s: String;
 | |
| begin
 | |
|   //DebugLn(['TH2PasDialog.OnAddSearchAndReplaceBeforeH2PasClick']);
 | |
|   SrcEdit:=SourceEditorManagerIntf.ActiveEditor;
 | |
|   if SrcEdit=nil then exit;
 | |
|   MainPageControl.ActivePage:=PreH2PasTabSheet;
 | |
|   ShowOnTop;
 | |
|   // get current source editor selection or line
 | |
|   s:=SrcEdit.Selection;
 | |
|   if s='' then
 | |
|     s:=SrcEdit.CurrentLineText;
 | |
|   // add a search and replace tool
 | |
|   Tool:=PreH2PasEdit.CreateTool(TTextReplaceTool);
 | |
|   TTextReplaceTool(Tool).SearchFor:=s;
 | |
|   if (System.Pos(#10,s)>0) or (System.Pos(#13,s)>0) then
 | |
|     TTextReplaceTool(Tool).Options:=TTextReplaceTool(Tool).Options+[trtMultiLine];
 | |
|   PreH2PasEdit.PropertyGrid.RefreshPropertyValues;
 | |
|   //DebugLn(['TH2PasDialog.OnAddSearchAndReplaceBeforeH2PasClick ',s]);
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.GetProject: TH2PasProject;
 | |
| begin
 | |
|   Result:=Converter.Project;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.UpdateAll(ScanIncludes: boolean);
 | |
| begin
 | |
|   UpdateCaption;
 | |
|   UpdateFilesPage(ScanIncludes);
 | |
|   UpdateH2PasPage;
 | |
|   UpdateConvertPage;
 | |
|   UpdateSettingsPage;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.UpdateProjectChanged(ScanIncludes: boolean);
 | |
| begin
 | |
|   UpdateCaption;
 | |
|   UpdateFilesPage(ScanIncludes);
 | |
|   UpdateH2PasPage;
 | |
|   UpdateConvertPage;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.UpdateCaption;
 | |
| var
 | |
|   s: String;
 | |
| begin
 | |
|   s:=h2pCHeaderFileConverter;
 | |
|   if Project<>nil then
 | |
|     s:=s+' - '+ExtractFileNameOnly(Project.Filename);
 | |
|   Caption:=s;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.UpdateFileInfo;
 | |
| var
 | |
|   AFile: TH2PasFile;
 | |
|   s: String;
 | |
|   Filename: String;
 | |
|   OutputFilename: String;
 | |
|   i: Integer;
 | |
|   IncFile: TH2PasFileCInclude;
 | |
| begin
 | |
|   AFile:=GetCurrentCHeaderFile;
 | |
|   if AFile<>nil then begin
 | |
|     Filename:=AFile.Filename;
 | |
|     s := Format(h2pFile, [Filename]);
 | |
|     if not FileExistsCached(Filename) then
 | |
|       s := s + #13 + h2pERRORFileNotFound2;
 | |
|     if AFile.MergedBy<>nil then begin
 | |
|       OutputFilename:=AFile.MergedBy.GetOutputFilename;
 | |
|       s := s + #13 + Format(h2pMergedInto, [OutputFilename]);
 | |
|     end else begin
 | |
|       OutputFilename:=AFile.GetOutputFilename;
 | |
|       s := s + #13 + Format(h2pOutput, [OutputFilename]);
 | |
|     end;
 | |
| 
 | |
|     AFile.ReadCIncludes(false);
 | |
|     if AFile.CIncludeCount>0 then begin
 | |
|       s := s + #13#13 + h2pIncludes;
 | |
|       for i:=0 to AFile.CIncludeCount-1 do begin
 | |
|         IncFile:=AFile.CIncludes[i];
 | |
|         s:=s+#13+Project.ShortenFilename(IncFile.Filename)+':'+IntToStr(IncFile.SrcPos.Y);
 | |
|       end;
 | |
|       AddIncludedCHeaderFilesButton.Enabled:=true;
 | |
|     end else begin
 | |
|       AddIncludedCHeaderFilesButton.Enabled:=false;
 | |
|     end;
 | |
| 
 | |
|     if AFile.CIncludedByCount>0 then begin
 | |
|       s := s + #13#13 + h2pIncludedBy;
 | |
|       for i:=0 to AFile.CIncludedByCount-1 do begin
 | |
|         IncFile:=AFile.CIncludedBy[i];
 | |
|         s:=s+#13+Project.ShortenFilename(IncFile.Owner.Filename)+':'+IntToStr(IncFile.SrcPos.Y);
 | |
|       end;
 | |
|     end;
 | |
| 
 | |
|     FileInfoMemo.Caption:=s;
 | |
| 
 | |
|     MergeFileCheckBox.Checked:=AFile.Merge;
 | |
|     MergeFileCheckBox.Enabled:=true;
 | |
|   end else begin
 | |
|     FileInfoMemo.Caption := h2pNoFileSelected;
 | |
|     MergeFileCheckBox.Enabled:=false;
 | |
|     AddIncludedCHeaderFilesButton.Enabled:=false;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.ClearMessages;
 | |
| begin
 | |
|   IDEMessagesWindow.Clear;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.CreateLazarusMenuItems;
 | |
| begin
 | |
|   // add a context menu to the source editor. It will be freed by ide automatically
 | |
|   fSrcEditSection:=RegisterIDESubMenu(SrcEditMenuSectionFirstStatic,
 | |
|                                       h2pH2pasProject, 'h2pas', nil, nil);
 | |
|   fSrcEditSection.AddHandlerOnShow(@OnShowSrcEditSection);
 | |
|   // add a menu item to easily create a Search and replace from the current
 | |
|   // selection or line of the source editor.
 | |
|   fSrcEditAddSearchReplaceMenuItem:=RegisterIDEMenuCommand(SrcEditSection,
 | |
|       'Add "search and replace" tool before H2Pas',
 | |
|       h2pAddSearchAndReplaceToolBeforeH2pas,
 | |
|       @OnAddSearchAndReplaceBeforeH2PasClick);
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.GetNodeFilename(Node: TTreeNode): string;
 | |
| var
 | |
|   p: LongInt;
 | |
| begin
 | |
|   Result:=Node.Text;
 | |
|   p:=System.Pos('(',Result);
 | |
|   if p>0 then
 | |
|     Result:=copy(Result,1,p-2);
 | |
|   Result:=Project.LongenFilename(Result);
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.GetCurrentCHeaderFile: TH2PasFile;
 | |
| var
 | |
|   AFilename: String;
 | |
|   Node: TTreeNode;
 | |
| begin
 | |
|   Result:=nil;
 | |
|   Node:=CHeaderFilesCheckTreeView.Selected;
 | |
|   if (Node=nil) or (Node.Parent<>nil) then exit;
 | |
|   AFilename:=GetNodeFilename(Node);
 | |
|   Result:=Project.CHeaderFileWithFilename(AFilename);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.MoveCurrentFile(Offset: integer);
 | |
| var
 | |
|   Index: LongInt;
 | |
|   AFilename: String;
 | |
|   NewIndex: Integer;
 | |
|   Node: TTreeNode;
 | |
| begin
 | |
|   if Offset=0 then begin
 | |
|     DebugLn(['TH2PasDialog.MoveCurrentFile Offset=0']);
 | |
|     exit;
 | |
|   end;
 | |
|   Node:=CHeaderFilesCheckTreeView.Selected;
 | |
|   if (Node=nil) or (Node.Parent<>nil) then exit;
 | |
|   AFilename:=GetNodeFilename(Node);
 | |
|   Index:=Project.CHeaderFileIndexWithFilename(AFilename);
 | |
|   if Index<0 then begin
 | |
|     DebugLn(['TH2PasDialog.MoveCurrentFile not found: Filename=',AFilename]);
 | |
|     exit;
 | |
|   end;
 | |
|   NewIndex:=Index+Offset;
 | |
|   if (NewIndex<0) or (NewIndex>=Project.CHeaderFileCount) then begin
 | |
|     DebugLn(['TH2PasDialog.MoveCurrentFile out of bounds: NewIndex=',NewIndex]);
 | |
|     exit;
 | |
|   end;
 | |
|   Project.CHeaderFileMove(Index,NewIndex);
 | |
|   CHeaderFilesCheckTreeView.ConsistencyCheck;
 | |
|   Node.Index:=NewIndex;
 | |
|   CHeaderFilesCheckTreeView.ConsistencyCheck;
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.GetFileNodeStateIndex(aFile: TH2PasFile): Integer;
 | |
| begin
 | |
|   if aFile=nil then
 | |
|     Result:=0
 | |
|   else if aFile.Enabled then
 | |
|     Result:=1
 | |
|   else
 | |
|     Result:=0;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.MarkAllCHeadersExceptCurrentToMerge;
 | |
| var
 | |
|   CurFile: TH2PasFile;
 | |
|   i: Integer;
 | |
|   OtherFile: TH2PasFile;
 | |
| begin
 | |
|   if Project=nil then exit;
 | |
|   CurFile:=GetCurrentCHeaderFile;
 | |
|   if CurFile=nil then exit;
 | |
|   for i:=0 to Project.CHeaderFileCount-1 do begin
 | |
|     OtherFile:=Project.CHeaderFiles[i];
 | |
|     OtherFile.Merge:=OtherFile<>CurFile;
 | |
|   end;
 | |
|   UpdateFileInfo;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.UpdateFilesPage(ScanIncludes: boolean);
 | |
| var
 | |
|   i: Integer;
 | |
|   CurFile: TH2PasFile;
 | |
|   OldSelection: TStringList;
 | |
|   s: String;
 | |
|   OldExpandedState: TTreeNodeExpandedState;
 | |
|   Node: TTreeNode;
 | |
|   OldSelected: String;
 | |
|   j: Integer;
 | |
| begin
 | |
|   if ScanIncludes and (Project<>nil) then
 | |
|     Project.ReadAllCIncludes(false);
 | |
|   CHeaderFilesCheckTreeView.BeginUpdate;
 | |
|   OldSelection:=nil;
 | |
|   OldExpandedState:=TTreeNodeExpandedState.Create(CHeaderFilesCheckTreeView);
 | |
|   try
 | |
|     // remember old selection
 | |
|     OldSelected:='';
 | |
|     if CHeaderFilesCheckTreeView.Selected<>nil then
 | |
|       OldSelected:=CHeaderFilesCheckTreeView.Selected.Text;
 | |
|     OldSelection:=TStringList.Create;
 | |
|     Node:=CHeaderFilesCheckTreeView.GetFirstMultiSelected;
 | |
|     while Node<>nil do begin
 | |
|       //DebugLn(['TH2PasDialog.UpdateFilesPage Node.Text="',Node.Text,'" Index=',Node.Index]);
 | |
|       OldSelection.Add(Node.GetTextPath);
 | |
|       Node:=Node.GetNextMultiSelected;
 | |
|     end;
 | |
|     
 | |
|     // clear
 | |
|     CHeaderFilesCheckTreeView.Items.Clear;
 | |
|     
 | |
|     // fill
 | |
|     for i:=0 to Project.CHeaderFileCount-1 do begin
 | |
|       CurFile:=Project.CHeaderFiles[i];
 | |
|       s:=Project.ShortenFilename(CurFile.Filename);
 | |
|       if CurFile.CIncludedByCount>0 then
 | |
|         s := Format(h2pIncludedBy2, [s, IntToStr(CurFile.CIncludedByCount)]);
 | |
|       Node:=CHeaderFilesCheckTreeView.Items.Add(nil,s);
 | |
|       Node.MultiSelected:=OldSelection.IndexOf(Node.GetTextPath)>=0;
 | |
|       Node.Selected:=Node.Text=OldSelected;
 | |
|       Node.StateIndex:=GetFileNodeStateIndex(CurFile);
 | |
|       for j:=0 to CurFile.CIncludeCount-1 do begin
 | |
| 
 | |
|       end;
 | |
|     end;
 | |
| 
 | |
|     // restore expanded state
 | |
|     OldExpandedState.Apply(CHeaderFilesCheckTreeView);
 | |
|   finally
 | |
|     OldExpandedState.Free;
 | |
|     OldSelection.Free;
 | |
|     CHeaderFilesCheckTreeView.EndUpdate;
 | |
|   end;
 | |
| 
 | |
|   UpdateFileInfo;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.UpdateH2PasPage;
 | |
| 
 | |
|   procedure Check(const Option: string; NewValue: boolean);
 | |
|   var
 | |
|     i: Integer;
 | |
|     s: string;
 | |
|   begin
 | |
|     for i:=0 to h2pasOptionsCheckGroup.Items.Count-1 do begin
 | |
|       s:=h2pasOptionsCheckGroup.Items[i];
 | |
|       if copy(s,1,length(Option)+1)=Option+' ' then
 | |
|         h2pasOptionsCheckGroup.Checked[i]:=NewValue;
 | |
|     end;
 | |
|   end;
 | |
| 
 | |
| begin
 | |
|   Check('-d',Project.UseExternal);
 | |
|   Check('-D',Project.UseExternalLibname);
 | |
|   Check('-e',Project.ConstantsInsteadOfEnums);
 | |
|   Check('-c',Project.CompactOutputmode);
 | |
|   Check('-i',Project.CreateIncludeFile);
 | |
|   Check('-p',Project.PforPointers);
 | |
|   Check('-pr',Project.PackAllRecords);
 | |
|   Check('-P',Project.UseProcVarsForImport);
 | |
|   Check('-s',Project.StripComments);
 | |
|   Check('-S',Project.StripCommentsAndInfo);
 | |
|   Check('-t',Project.TforTypedefs);
 | |
|   Check('-T',Project.TforTypedefsRemoveUnderscore);
 | |
|   Check('-v',Project.VarParams);
 | |
|   Check('-w',Project.Win32Header);
 | |
|   Check('-x',Project.PalmOSSYSTrap);
 | |
|   Check('-C',Project.UseCTypes);
 | |
|   
 | |
|   LibnameEdit.Text:=Project.Libname;
 | |
|   OutputExtEdit.Text:=Project.OutputExt;
 | |
|   OutputDirEdit.Text:=Project.OutputDirectory;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.UpdateConvertPage;
 | |
| begin
 | |
|   ClearMessages;
 | |
|   PreH2PasEdit.ListOfTools:=Project.PreH2PasTools;
 | |
|   PreH2PasEdit.UpdateAll;
 | |
|   PostH2PasEdit.ListOfTools:=Project.PostH2PasTools;
 | |
|   PostH2PasEdit.UpdateAll;
 | |
|   //DebugLn(['TH2PasDialog.UpdateConvertPage PreH2PasEdit.ListOfTools=',PreH2PasEdit.ListOfTools.COmponentCount]);
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.UpdateSettingsPage;
 | |
| begin
 | |
|   H2PasFilenameEdit.Text:=Converter.h2pasFilename;
 | |
|   OpenLastProjectOnStartCheckBox.Checked:=Converter.AutoOpenLastProject;
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.ShowSelectDirDialog(const Title: string;
 | |
|   var ADirectory: string): boolean;
 | |
| var
 | |
|   SelectDirDialog: TSelectDirectoryDialog;
 | |
| begin
 | |
|   Result:=false;
 | |
|   SelectDirDialog:=TSelectDirectoryDialog.Create(nil);
 | |
|   try
 | |
|     InitIDEFileDialog(SelectDirDialog);
 | |
|     SelectDirDialog.Title:=Title;
 | |
|     if (ADirectory<>'')
 | |
|     and (FilenameIsAbsolute(ADirectory)) then
 | |
|       SelectDirDialog.InitialDir:=ADirectory;
 | |
|     if SelectDirDialog.Execute then begin
 | |
|       ADirectory:=SelectDirDialog.FileName;
 | |
|       Result:=true;
 | |
|     end;
 | |
|   finally
 | |
|     StoreIDEFileDialog(SelectDirDialog);
 | |
|     SelectDirDialog.Free;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.ShowOpenFileDialog(const Title: string;
 | |
|   var AFilename: string): boolean;
 | |
| var
 | |
|   OpenDialog: TOpenDialog;
 | |
| begin
 | |
|   Result:=false;
 | |
|   OpenDialog:=TOpenDialog.Create(nil);
 | |
|   try
 | |
|     InitIDEFileDialog(OpenDialog);
 | |
|     OpenDialog.Title:=Title;
 | |
|     if (AFilename<>'')
 | |
|     and (FilenameIsAbsolute(AFilename)) then
 | |
|       OpenDialog.InitialDir:=ExtractFilePath(AFilename);
 | |
|     if AFilename<>'' then
 | |
|       OpenDialog.Filename:=ExtractFileName(AFilename);
 | |
|     if OpenDialog.Execute then begin
 | |
|       AFilename:=OpenDialog.FileName;
 | |
|       Result:=true;
 | |
|     end;
 | |
|   finally
 | |
|     StoreIDEFileDialog(OpenDialog);
 | |
|     OpenDialog.Free;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.OnIDESavedAll(Sender: TObject): TModalResult;
 | |
| begin
 | |
|   Result:=SaveSettings;
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.Convert: TModalResult;
 | |
| begin
 | |
|   Result:=mrCancel;
 | |
| 
 | |
|   if not Project.HasEnabledFiles then begin
 | |
|     IDEMessageDialog(h2pNothingToDo,
 | |
|       h2pPleaseEnableAtLeastOneCHeaderFileThatIsNotMerged,
 | |
|       mtInformation,[mbOk],'');
 | |
|     Result:=mrOK;
 | |
|     exit;
 | |
|   end;
 | |
|   
 | |
|   // save settings
 | |
|   if SaveSettings<>mrOk then begin
 | |
|     DebugLn(['TH2PasDialog.Convert SaveSettings failed']);
 | |
|     exit;
 | |
|   end;
 | |
|   
 | |
|   // save IDE files
 | |
|   if LazarusIDE.DoSaveProject([])<>mrOK then begin
 | |
|     DebugLn(['TH2PasDialog.Convert LazarusIDE.DoSaveProject failed']);
 | |
|     exit;
 | |
|   end;
 | |
|   LazarusIDE.SaveSourceEditorChangesToCodeCache(nil);
 | |
|   
 | |
|   Result:=Converter.Execute;
 | |
|   if Result<>mrOk then begin
 | |
|     ShowH2PasError;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure TH2PasDialog.ShowH2PasError;
 | |
| begin
 | |
|   LazarusIDE.DoJumpToCompilerMessage(true);
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.SaveSettings: TModalResult;
 | |
| begin
 | |
|   Result:=SaveGlobalSettings;
 | |
|   if Result<>mrOk then exit;
 | |
|   if (Project<>nil) and Project.Modified then
 | |
|     Result:=SaveProject('',[]);
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.SaveGlobalSettings: TModalResult;
 | |
| var
 | |
|   Config: TConfigStorage;
 | |
| begin
 | |
|   Result:=mrCancel;
 | |
|   try
 | |
|     Config:=GetIDEConfigStorage('h2pastool.xml',false);
 | |
|     try
 | |
|       Converter.WindowBounds:=BoundsRect;
 | |
|       Converter.Save(Config);
 | |
|       Config.WriteToDisk;
 | |
|     finally
 | |
|       Config.Free;
 | |
|     end;
 | |
|     Result:=mrOk;
 | |
|   except
 | |
|     on E: Exception do begin
 | |
|       MessageDlg(h2pWriteError,
 | |
|         Format(h2pErrorWritingGlobalConfig, [#13, E.Message]), mtError, [mbCancel], 0);
 | |
|     end;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.LoadGlobalSettings: TModalResult;
 | |
| var
 | |
|   Config: TConfigStorage;
 | |
| begin
 | |
|   Result:=mrCancel;
 | |
|   try
 | |
|     Config:=GetIDEConfigStorage('h2pastool.xml',true);
 | |
|     try
 | |
|       Converter.Load(Config);
 | |
|       if (Converter.WindowBounds.Left>-10)
 | |
|       and (Converter.WindowBounds.Right<Screen.Width+10)
 | |
|       and (Converter.WindowBounds.Top>-10)
 | |
|       and (Converter.WindowBounds.Bottom<Screen.Height+10)
 | |
|       and (Converter.WindowBounds.Right-Converter.WindowBounds.Left>100)
 | |
|       and (Converter.WindowBounds.Bottom-Converter.WindowBounds.Top>50)
 | |
|       then
 | |
|         BoundsRect:=Converter.WindowBounds;
 | |
|       UpdateSettingsPage;
 | |
|     finally
 | |
|       Config.Free;
 | |
|     end;
 | |
|     Result:=mrOk;
 | |
|   except
 | |
|     on E: Exception do begin
 | |
|       MessageDlg(h2pReadError,
 | |
|         Format(h2pErrorReadingGlobalConfig, [#13, E.Message]), mtError, [mbCancel], 0);
 | |
|     end;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.SaveProject(const Filename: string; Flags: TSaveFlags
 | |
|   ): TModalResult;
 | |
| var
 | |
|   NewFilename: String;
 | |
|   SaveDialog: TSaveDialog;
 | |
|   NewPath: String;
 | |
| begin
 | |
|   Result:=mrCancel;
 | |
|   if Project=nil then exit(mrOk);
 | |
|   NewFilename:=Filename;
 | |
|   if NewFilename='' then
 | |
|     NewFilename:=Project.Filename;
 | |
|     
 | |
|   // choose a filename
 | |
|   if (not FilenameIsAbsolute(NewFilename))
 | |
|   or (sfSaveAs in Flags) then begin
 | |
|     SaveDialog:=TSaveDialog.Create(nil);
 | |
|     try
 | |
|       InitIDEFileDialog(SaveDialog);
 | |
|       SaveDialog.Title := h2pSaveProjectAsH2p;
 | |
|       //choose a nice default name
 | |
|       if NewFilename='' then
 | |
|         NewFilename:='project1.h2p';
 | |
|       SaveDialog.FileName:=NewFilename;
 | |
|       SaveDialog.Filter := Format(h2pH2pasProjectH2pH2pAllFiles, [FileMask]);
 | |
|       NewPath:=ExtractFilePath(NewFilename);
 | |
|       if NewPath<>'' then
 | |
|         SaveDialog.InitialDir:=NewPath;
 | |
|       if (not SaveDialog.Execute) then exit;
 | |
|       NewFilename:=SaveDialog.FileName;
 | |
|       if NewFilename='' then exit;
 | |
|       // append default file extension
 | |
|       if ExtractFileExt(NewFilename)='' then
 | |
|         NewFilename:=NewFilename+'.h2p';
 | |
|       // warn if overwriting
 | |
|       if FileExistsUTF8(NewFilename) then begin
 | |
|         if QuestionDlg(h2pReplaceFile,
 | |
|           Format(h2pTheFileAlreadyExists, [NewFilename, #13]),
 | |
|           mtConfirmation, [mrOk, h2pOverwrite, mrCancel, h2pCancel], 0) <> mrOk
 | |
|         then exit;
 | |
|       end;
 | |
|     finally
 | |
|       StoreIDEFileDialog(SaveDialog);
 | |
|       SaveDialog.Free;
 | |
|     end;
 | |
|   end;
 | |
|   
 | |
|   // save
 | |
|   try
 | |
|     DebugLn(['TH2PasDialog.SaveProject saving project']);
 | |
|     Converter.SaveProject(NewFilename);
 | |
|     Result:=mrOk;
 | |
|   except
 | |
|     on E: Exception do begin
 | |
|       MessageDlg(h2pWriteError,
 | |
|         Format(h2pErrorWritingGlobalConfig, [#13, E.Message]), mtError, [mbCancel], 0);
 | |
|     end;
 | |
|   end;
 | |
|   UpdateCaption;
 | |
| end;
 | |
| 
 | |
| function TH2PasDialog.OpenProject(const Filename: string; Flags: TOpenFlags
 | |
|   ): TModalResult;
 | |
| var
 | |
|   NewFilename: String;
 | |
| begin
 | |
|   Result:=mrCancel;
 | |
|   NewFilename:=ExpandFileNameUTF8(TrimFilename(Filename));
 | |
|   if not FileExistsUTF8(NewFilename) then begin
 | |
|     if ofOnlyIfExists in Flags then begin
 | |
|       MessageDlg(h2pFileNotFound,
 | |
|         Format(h2pFileNotFound2, [NewFilename]), mtError, [mbCancel], 0);
 | |
|       exit;
 | |
|     end;
 | |
|   end;
 | |
|   
 | |
|   // create new project
 | |
|   if Project=nil then
 | |
|     Converter.Project:=TH2PasProject.Create;
 | |
| 
 | |
|   if FileExistsUTF8(NewFilename) then begin
 | |
|     // load
 | |
|     try
 | |
|       Converter.LoadProject(NewFilename);
 | |
|       Result:=mrOk;
 | |
|     except
 | |
|       on E: Exception do begin
 | |
|         MessageDlg(h2pReadError,
 | |
|           Format(h2pErrorReadingProjectFromFile, [#13, NewFilename, #13, #13, E.Message]), mtError, [mbCancel], 0);
 | |
|       end;
 | |
|     end;
 | |
|   end else begin
 | |
|     // new project
 | |
|     Project.Clear(true);
 | |
|     Converter.CurrentProjectFilename:=NewFilename;
 | |
|     Project.Filename:=NewFilename;
 | |
|   end;
 | |
|   
 | |
|   UpdateProjectChanged(true);
 | |
| end;
 | |
| 
 | |
| end.
 | |
| 
 | |
| 
 | 
