mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 05:11:34 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			920 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			920 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| {$mode objfpc}
 | |
| {$h+}
 | |
| unit frmmain;
 | |
| 
 | |
| interface
 | |
| 
 | |
| uses
 | |
|   gtk,gdk,fpgtk,fpgtkext,pgEditor,frmlink,sysutils,classes,fpdeopts;
 | |
| 
 | |
| Const
 | |
|   DefaultTooltips = True;
 | |
|   DefaultToolBarStyle = GTK_TOOLBAR_ICONS;
 | |
|   DefaultToolbarRelief = GTK_RELIEF_NONE;
 | |
|   SFileTemplate = 'template.xml';
 | |
| 
 | |
| Type
 | |
|   TNodeType = (ntfile,ntPackage,ntModule,ntElement,ntTopic);
 | |
| 
 | |
|   TMainForm = Class(TFPGtkWindow)
 | |
|   Private
 | |
|     FRecent : TStrings;
 | |
|     FPages : TFPGtkNoteBook;
 | |
|     FVBox : TFPGTKVBox;
 | |
|     FMenu : TFpGTKMenuBar;
 | |
|     FNewImage,
 | |
|     FOpenImage,
 | |
|     FSaveImage,
 | |
|     FSaveAsImage,
 | |
|     FNewPackageImage,
 | |
|     FNewModuleImage,
 | |
|     FNewTopicImage,
 | |
|     FNewElementImage,
 | |
|     FBoldImage,
 | |
|     FUnderlineImage,
 | |
|     FItalicsImage,
 | |
|     FParagraphImage,
 | |
|     FVarImage,
 | |
|     FLinkImage,
 | |
|     FRemarkImage,
 | |
|     FTableImage : TFPGtkPixmap;
 | |
|     FHelpMenu,
 | |
|     FExtraMenu,
 | |
|     FInsertMenu,
 | |
|     FFormatMenu,
 | |
|     FFileMenu : TFPGtkMenuItem;
 | |
|     FToolbarFrame : TFPGtkFrame;
 | |
|     FFormatToolBar,
 | |
|     FToolsToolBar,
 | |
|     FMainToolBar : TFPGtkToolbar;
 | |
|     FFileOpen,
 | |
|     FFileNew,
 | |
|     FFileNewFromFile,
 | |
|     FFileSave,
 | |
|     FFileSaveAs,
 | |
|     FFileRecent,
 | |
|     FFileClose,
 | |
|     FFileExit,
 | |
|     FInsertPackage,
 | |
|     FInsertModule,
 | |
|     FInsertTopic,
 | |
|     FInsertElement,
 | |
|     FInsertLink,
 | |
|     FInsertTable,
 | |
|     FFormatParagraph,
 | |
|     FFormatBold,
 | |
|     FFormatItalic,
 | |
|     FFormatUnderline,
 | |
|     FFormatRemark,
 | |
|     FFormatVariable,
 | |
|     FFormatCode,
 | |
|     FFormatFile,
 | |
|     FExtraoptions,
 | |
|     FHelpAbout : TFPGtkMenuItem;
 | |
|     // Utility functions
 | |
|     Function  FormatMenuItem(ACaption : String; tt : TTagType) : TFPgtkMenuItem;
 | |
|     Function  FormatMenuItem(ACaption : String; tt : TTagType; Accel : PAccelKeyDef) : TFPgtkMenuItem;
 | |
|     // Editor functions.
 | |
|     procedure BuildReopenList;
 | |
|     Procedure AddTorecent(FN : String);
 | |
|     Procedure OpenFile(FN : String);
 | |
|     Procedure SaveEditorAs(E : TEditorPage);
 | |
|     Procedure SaveEditor(E : TEditorPage);
 | |
|     Function  CloseEditor(E : TEditorPage) : Boolean;
 | |
|     Procedure LoadCommandLine;
 | |
|     Procedure LoadRecent;
 | |
|     Procedure SaveRecent;
 | |
|     Procedure CreateForm;
 | |
|     Function  CreatePage : TEditorPage;
 | |
|     Function  Currenteditor : TEditorPage;
 | |
|     Function  AllowClose : Boolean;
 | |
|     // Callbacks
 | |
|     Procedure TagClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure FileReopen(Sender: TFPGTKObject;data : Pointer);
 | |
|     Procedure FileOpenClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure FileNewClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure FileNewFromFileClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure FileSaveAsClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure FileSaveClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure FileExitClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure FileCloseClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure OptionsClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure HelpAboutClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure InsertNodeClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure LinkClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure TableClick(Sender : TFPGtkObject; Data : Pointer);
 | |
|     Procedure GetLinkData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
 | |
|     Procedure GetTableData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
 | |
|     Procedure GetNodeData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
 | |
|     Procedure GetSkeletonData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
 | |
|     Procedure DialogSetFilename(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
 | |
|     Function OnDeleteEvent(Sender:TFPgtkWidget; Event:PGdkEvent; data:pointer): boolean;
 | |
|   Public
 | |
|     Constructor create;
 | |
|     Destructor Destroy; override;
 | |
|   end;
 | |
| 
 | |
| Const
 | |
|   NodeNames : Array[TNodeType] of String
 | |
|             = ('file','package','module','element','topic');
 | |
| 
 | |
| implementation
 | |
| 
 | |
| uses fpdemsg,frmnewnode,frmtable,frmmakeskel,process,frmOptions,frmAbout,inifiles,xpms;
 | |
| 
 | |
| 
 | |
| Function TMainForm.CreatePage : TEditorPage;
 | |
| 
 | |
| begin
 | |
|   Result:=TEditorPage.Create;
 | |
|   Result.FileNameLabel:=TFPgtkLabel.Create(SNewDocument);
 | |
|   FPages.AppendPage(Result, REsult.FileNameLabel);
 | |
|   FPages.Page:=Result;
 | |
| end;
 | |
| 
 | |
| Function PixmapFromFile (FN : String; Const ImgArray : Array of string) :TFPGtkPixmap;
 | |
| 
 | |
| begin
 | |
|   Result:=TFPGtkPixmap.CReate;
 | |
| {$ifdef debug}
 | |
|   writeln('loading ','bitmaps'+directoryseparator+FN);
 | |
| {$endif}
 | |
|   If FileExists('bitmaps'+directoryseparator+FN) then
 | |
|     Result.LoadFromFile('bitmaps'+directoryseparator+FN)
 | |
|   else
 | |
|     Result.loadFromArray(ImgArray);
 | |
| 
 | |
| end;
 | |
| 
 | |
| Function TMainForm.FormatMenuItem(ACaption : String; tt : TTagType) : TFPgtkMenuItem;
 | |
| 
 | |
| begin
 | |
|   Result:=NewMenuItem(ACaption,FormatHint(ACaption),'',@TagClick,Pointer(tt));
 | |
| end;
 | |
| 
 | |
| Function TMainForm.FormatMenuItem(ACaption : String; tt : TTagType; Accel : PAccelKeyDef) : TFPgtkMenuItem;
 | |
| 
 | |
| begin
 | |
|   Result:=NewMenuItem(ACaption,FormatHint(ACaption),'',Accel,@TagClick,Pointer(tt));
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.CreateForm;
 | |
| 
 | |
| Var
 | |
|   V : TFPGtkHBox;
 | |
|   FAccelGroup: Integer;
 | |
| 
 | |
| begin
 | |
|   Title:=SFPDE;
 | |
|   FAccelGroup:=AccelGroupNew;
 | |
|   {  File menu }
 | |
| {$ifdef debug}
 | |
|   Writeln('Menu');
 | |
| {$endif}
 | |
| //anAG : integer; aKey : guint; aMods
 | |
|   FFileOpen:=NewMenuItem(SMenuOpen,'','',MakeAccelKeyDef(Self,FaccelGroup,GDK_O,[amcontrol]),@FileOpenClick,Nil);
 | |
|   FFileNew:=NewMenuItem(SMenuNew,'','',MakeAccelKeyDef(Self,FaccelGroup,GDK_N,[amcontrol]),@FileNewClick,Nil);
 | |
|   FFileNewFromFile:=NewMenuItem(SMenuNewFromSource,'','',@FileNewFromFileClick,Nil);
 | |
|   FFileSave:=NewMenuItem(SMenuSave,'','',MakeAccelKeyDef(Self,FaccelGroup,GDK_S,[amcontrol]),@FileSaveClick,Nil);
 | |
|   FFileSaveAs:=NewMenuItem(SMenuSaveAs,'','',@FileSaveAsClick,Nil);
 | |
|   FFileRecent:=NewSubMenu(SMenuRecent,'','',[]);
 | |
|   FFileClose:=NewMenuItem(SMenuClose,'','',MakeAccelKeyDef(Self,FaccelGroup,GDK_W,[amcontrol]),@FileCLoseClick,Nil);
 | |
|   FFileExit:=NewMenuItem(SMenuExit,'','',MakeAccelKeyDef(Self,FaccelGroup,GDK_Q,[amcontrol]),@FileExitClick,Nil);
 | |
|   FFileMenu:=NewSubMenu(SMenuFile,'','',[FFileNew,FFileNewFromFile,FFileOpen,FFileRecent,FFileSave,FFileSaveAs,FFileClose,NewLine,FFileExit]);
 | |
| 
 | |
|   {  Insert menu }
 | |
|   FInsertPackage:=NewMenuItem(SMenuInsertPackage,SHintInsertPackage,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_P,[amcontrol]),@InsertNodeClick,Pointer(ntpackage));
 | |
|   FInsertModule:=NewMenuItem(SMenuInsertModule,SHintInsertModule,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_M,[amcontrol]),@InsertNodeClick,Pointer(ntmodule));
 | |
|   FInsertTopic:=NewMenuItem(SMenuInsertTopic,SHintInsertTopic,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_M,[amcontrol]),@InsertNodeClick,Pointer(ntTopic));
 | |
|   FInsertElement:=NewMenuItem(SMenuInsertElement,SHintInsertElement,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_E,[amcontrol]),@InsertNodeClick,Pointer(ntElement));
 | |
|   FinsertLink:=NewMenuItem(SMenuInsertLink,SHintInsertLink,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_L,[amcontrol]),@LinkClick,Nil);
 | |
|   FinsertTable:=NewMenuItem(SMenuInsertTable,SHintInsertTable,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_T,[amcontrol]),@TableClick,Nil);
 | |
|   FInsertMenu:=NewSubMenu(SMenuInsert,'','',[FInsertPackage,FInsertModule,FInsertElement,NewLine,FInsertLink,FinsertTable]);
 | |
| 
 | |
|   { Format menu }
 | |
| 
 | |
|   FFormatBold:=FormatMenuItem(SMenuFormatBold,ttBold,MakeAccelKeyDef(Self,FaccelGroup,GDK_B,[amcontrol]));
 | |
|   FFormatItalic:=FormatMenuItem(SMenuFormatItalics,ttItalic,MakeAccelKeyDef(Self,FaccelGroup,GDK_I,[amcontrol]));
 | |
|   FFormatUnderline:=FormatMenuItem(SMenuFormatUnderline,ttUnderline,MakeAccelKeyDef(Self,FaccelGroup,GDK_U,[amcontrol]));
 | |
|   FFormatVariable:=FormatMenuItem(SMenuFormatVariable,ttVariable,MakeAccelKeyDef(Self,FaccelGroup,GDK_R,[amcontrol]));
 | |
|   FFormatFile:=FormatMenuItem(SMenuFormatFile,ttFile);
 | |
|   FFormatParagraph:=FormatMenuItem(SMenuFormatParagraph,ttParagraph);
 | |
|   FFormatRemark:=FormatMenuItem(SMenuFormatRemark,ttRemark);
 | |
|   FFormatCode:=FormatMenuItem(SMenuFormatCode,ttCode);
 | |
|   FFormatMenu:=NewSubMenu(SMenuFormat,'','',[FFormatBold,FFormatItalic,FFormatUnderline,FFormatVariable,FFormatFile,
 | |
|                                              NewLine,FFormatParagraph,FFormatRemark,FFormatCode]);
 | |
| 
 | |
|   { Extra menu }
 | |
|   FExtraOptions:=NewMenuItem(SMenuExtraOptions,SHMenuExtraOptions,'',@OptionsClick,Nil);
 | |
|   FExtraMenu:=NewSubMenu(SMenuExtra,'','',[FExtraOptions]);
 | |
| 
 | |
|   { Help menu }
 | |
|   FHelpAbout:=NewMenuItem(SMenuHelpAbout,SHMenuHelpAbout,'',@HelpAboutClick,Nil);
 | |
|   FHelpMenu:=NewSubMenu(SMenuHelp,'','',[FHelpAbout]);
 | |
| 
 | |
|   FMenu:=NewMenuBar([FFileMenu,FInsertMenu,FFormatMenu,FExtraMenu,FHelpMenu]);
 | |
| {$ifdef debug}
 | |
|   Writeln('Toolbar pixmaps');
 | |
| {$endif}
 | |
| 
 | |
|   { Tool bar bitmaps }
 | |
|   FNewImage:=PixMapFromFile('new.xpm',ImgNew);
 | |
|   FOpenImage:=PixmapFromFile('open.xpm',ImgOpen);
 | |
|   FSaveImage:=PixmapFromFile('save.xpm',ImgSave);
 | |
|   FSaveAsImage:=PixMapFromFile('saveas.xpm',ImgSaveAs);
 | |
|   FNewPackageImage:=PixMapFromFile('newpackage.xpm',ImgNewPackage);
 | |
|   FNewModuleImage:=PixMapFromFile('newmodule.xpm',ImgNewModule);
 | |
|   FNewTopicImage:=PixMapFromFile('newtopic.xpm',ImgNewTopic);
 | |
|   FNewElementImage:=PixMapFromFile('newelement.xpm',ImgNewElement);
 | |
|   FBoldImage:=PixMapFromFile('bold.xpm',ImgBold);
 | |
|   FUnderlineImage:=PixMapFromFile('underline.xpm',ImgUnderline);
 | |
|   FItalicsImage:=PixMapFromFile('italic.xpm',ImgItalic);
 | |
|   FParagraphImage:=PixMapFromFile('para.xpm',ImgPara);
 | |
|   FVarImage:=PixMapFromFile('var.xpm',ImgVar);
 | |
|   FRemarkImage:=PixMapFromFile('remark.xpm',ImgRemark);
 | |
|   FLinkImage:=PixMapFromFile('link.xpm',ImgLink);
 | |
|   FTableImage:=PixMapFromFile('table.xpm',ImgTable);
 | |
| 
 | |
|   { Tool bars }
 | |
| {$ifdef debug}
 | |
|   Writeln('Main toolbar');
 | |
| {$endif}
 | |
| 
 | |
|   FMainToolBar:=TFPGtkToolbar.Create;
 | |
|   With FMainToolbar do
 | |
|     begin
 | |
|     Style:=DefaultToolbarStyle;
 | |
|     ButtonRelief:=DefaultToolbarRelief;
 | |
|     EnableTooltips:=DefaultTooltips;
 | |
| // AppendElement (ButtonType:TGtkToolbarChildType; PrevRadioBut:TFPgtkWidget; Text:string; TooltipText:string; TooltipPrivate:string; Icon:TFPgtkWidget; CallBack:TFPgtkSignalProcedure; data:pointer) : TFPgtkWidget;
 | |
|     AppendItem(SMenuNew,SHintFileNew,'',FNewImage,@FileNewClick,Nil);
 | |
|     AppendItem(SMenuOpen,SHintFileOpen,'',FOpenImage,@FileOpenClick,Nil);
 | |
|     AppendItem(SmenuSave,SHintFileSave,'',FSaveImage,@FileSaveClick,Nil);
 | |
|     AppendItem(SMenuSaveAs,SHintFileSaveAs,'',FSaveAsImage,@FileSaveAsClick,Nil);
 | |
|     AppendSpace;
 | |
|     AppendItem(SMenuInsertPackage,SHintInsertPackage,'',FNewPackageImage,@InsertNodeClick,Pointer(ntPackage));
 | |
|     AppendItem(SMenuInsertModule,SHintInsertModule,'',FNewModuleImage,@InsertNodeClick,Pointer(ntModule));
 | |
|     AppendItem(SMenuInsertTopic,SHintInsertTopic,'',FNewTopicImage,@InsertNodeClick,Pointer(ntTopic));
 | |
|     AppendItem(SMenuInsertEleMent,SHintInsertElement,'',FNewElementImage,@InsertNodeClick,Pointer(ntElement));
 | |
|     AppendSpace;
 | |
|     end;
 | |
| {$ifdef debug}
 | |
|   Writeln('Format Toolbars');
 | |
| {$endif}
 | |
| 
 | |
|   FFormatToolBar:=TFPGtkToolbar.Create;
 | |
|   With FFormatToolbar do
 | |
|     begin
 | |
|     Style:=DefaultToolBarStyle;
 | |
|     ButtonRelief:=DefaultToolbarRelief;
 | |
|     EnableTooltips:=DefaultTooltips;
 | |
|     AppendItem(SMenuFormatParaGraph,Format(SMarkSelection,[SMenuFormatParaGraph]),'',FParagraphImage,@TagClick,Pointer(ttParagraph));
 | |
|     AppendItem(SMenuFormatBold,Format(SMarkSelection,[SMenuFormatBold]),'',FBoldImage,@TagClick,Pointer(ttBold));
 | |
|     AppendItem(SMenuFormatItalics,Format(SMarkSelection,[SMenuFormatItalics]),'',FItalicsImage,@TagClick,Pointer(ttItalic));
 | |
|     AppendItem(SMenuFormatUnderline,Format(SMarkSelection,[SMenuFormatUnderline]),'',FUnderlineImage,@TagClick,Pointer(ttUnderline));
 | |
|     AppendItem(SMenuFormatVariable,Format(SMarkSelection,[SMenuFormatVariable]),'',FVarImage,@TagClick,Pointer(ttVariable));
 | |
|     AppendItem(SmenuFormatRemark,Format(SMarkSelection,[SmenuFormatRemark]),'',FRemarkImage,@TagClick,Pointer(ttRemark));
 | |
|     FFormatToolbar.AppendSpace;
 | |
|     end;
 | |
| {$ifdef debug}
 | |
|   Writeln('Tools toolbar');
 | |
| {$endif}
 | |
| 
 | |
|   FToolsToolBar:=TFPGtkToolbar.Create;
 | |
|   With FToolsToolbar do
 | |
|     begin
 | |
|     Style:=DefaultToolBarStyle;
 | |
|     ButtonRelief:=DefaultToolBarRelief;
 | |
|     EnableTooltips:=DefaultToolTips;
 | |
|     AppendItem(SMenuInsertLink,SHintInsertLink,'',FlinkImage,@LinkCLick,Nil);
 | |
|     AppendItem(SMenuInsertTable,SHintInsertTable,'',FTableImage,@TableClick,Nil);
 | |
|     AppendSpace;
 | |
|     end;
 | |
| 
 | |
| {$ifdef debug}
 | |
|   Writeln('end Toolbars');
 | |
| {$endif}
 | |
| 
 | |
|   V:=TFPGtkHBox.Create;
 | |
|   V.PackStart(FMainToolbar,False,False,2);
 | |
|   V.PackStart(FFormatToolBar,False,False,2);
 | |
|   V.Packstart(FToolsToolbar,True,True,2);
 | |
| 
 | |
|   FToolbarFrame:=TFPGtkFrame.Create;
 | |
|   FtoolbarFrame.Add(V);
 | |
| 
 | |
|   { Pages }
 | |
| 
 | |
|   FPages:=TFPGtkNotebook.Create;
 | |
| 
 | |
|   { Place everything on form }
 | |
|   FVBox:=TFPGTKVBox.create;
 | |
|   FVBox.PackStart(FMenu,false, true, 0);
 | |
|   FVBox.PackStart(FToolBarFrame,false, true, 0);
 | |
|   FVBox.PackStart(FPages,true, true, 0);
 | |
|   Self.add(FVBox);
 | |
|   setusize(640,480);
 | |
|   ConnectDeleteEvent(@OnDeleteEvent,Nil);
 | |
| end;
 | |
| 
 | |
| Constructor TMainForm.create;
 | |
| 
 | |
| begin
 | |
|   FRecent:=TStringList.Create;
 | |
|   Inherited Create(gtk_window_dialog);
 | |
|   CreateForm;
 | |
|   LoadCommandLine;
 | |
|   LoadOptions;
 | |
|   LoadRecent;
 | |
| end;
 | |
| 
 | |
| Destructor TMainForm.Destroy;
 | |
| 
 | |
| begin
 | |
|   SaveRecent;
 | |
|   FRecent.Free;
 | |
|   Inherited;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.LoadCommandLine;
 | |
| 
 | |
| Var
 | |
|   I : Integer;
 | |
| 
 | |
| begin
 | |
|   I:=1;
 | |
|   While I<=ParamCount do
 | |
|     begin
 | |
|     If FileExists(ParamStr(i)) then
 | |
|       OpenFile(Paramstr(I));
 | |
|     Inc(I);
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| Procedure TMainForm.LoadRecent;
 | |
| 
 | |
| Var
 | |
|   I,Count : Integer;
 | |
|   S : String;
 | |
| 
 | |
| begin
 | |
|   FRecent.Clear;
 | |
|   With TInifile.Create(GetoptionFileName) do
 | |
|     begin
 | |
|     Count:=ReadInteger('Recent','Count',0);
 | |
|     For I:=1 to Count do
 | |
|       begin
 | |
|       S:=ReadString('Recent','File'+IntToStr(i),'');
 | |
|       If S<>'' then
 | |
|         FRecent.Add(S);
 | |
|       end;
 | |
|     end;
 | |
|   BuildReopenList;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.SaveRecent;
 | |
| 
 | |
| Var
 | |
|   I,Count : Integer;
 | |
|   S : String;
 | |
| 
 | |
| begin
 | |
|   With TInifile.Create(GetoptionFileName) do
 | |
|     try
 | |
|       EraseSection('Recent');
 | |
|       WriteInteger('Recent','Count',FRecent.Count);
 | |
|       For I:=1 to FRecent.Count do
 | |
|         WriteString('Recent','File'+IntToStr(i),FRecent[i-1]);
 | |
|       UpdateFile;
 | |
|     Finally
 | |
|       Free;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| {
 | |
|   Menu handlers
 | |
| }
 | |
| 
 | |
| 
 | |
| Procedure TMainForm.DialogSetFilename(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
 | |
| 
 | |
| type
 | |
|   PString = ^AnsiString;
 | |
| 
 | |
| begin
 | |
|   PString(Data)^:=(Sender as TFPgtkFileSelection).Filename;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.AddTorecent(FN : String);
 | |
| 
 | |
| Var
 | |
|   Index : Integer;
 | |
| 
 | |
| begin
 | |
|   FN:=ExpandFileName(FN);
 | |
|   With FRecent do
 | |
|     begin
 | |
|     Index:=IndexOf(FN);
 | |
|     If Index<>-1 then
 | |
|       Delete(Index);
 | |
|     Insert(0,FN);
 | |
|     While Count>MaxRecentUsed do
 | |
|       Delete(Count-1);
 | |
|     end;
 | |
|   BuildReopenList;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.OpenFile(FN : String);
 | |
| 
 | |
| Var
 | |
|   EFN : String;
 | |
| 
 | |
| begin
 | |
|   IF (FN<>'') then
 | |
|     begin
 | |
|     If FileExists(FN) then
 | |
|       With CreatePage do
 | |
|         begin
 | |
|         LoadFromFile(FN);
 | |
|         AddToRecent(Fn);
 | |
|         end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.FileOpenClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| var
 | |
|   fs : TFPgtkFileSelection;
 | |
|   FN : String;
 | |
| begin
 | |
|   fs := TFPgtkFileSelection.Create (gtk_window_dialog);
 | |
|   FN:='';
 | |
|   with fs do
 | |
|     begin
 | |
|     Title:=SOpenFileTitle;
 | |
|     OKButton.ConnectClicked (@(CloseWithResult), inttopointer(drOk));
 | |
|     CancelButton.ConnectClicked (@(CloseWindow), nil);
 | |
|     if execute (nil, @FN, @DialogSetFilename) = drOk then
 | |
|       OpenFile(FN);
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.FileNewClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| Const
 | |
|   template = '<?xml version="1.0" encoding="ISO-8859-1"?>'+LineEnding+
 | |
|              '<fpdoc-descriptions>'+LineEnding+
 | |
|              '</fpdoc-descriptions>'+LineEnding;
 | |
| 
 | |
| Var
 | |
|   S : TStringStream;
 | |
| 
 | |
| begin
 | |
|   With CreatePage do
 | |
|     begin
 | |
|     If FileExists(SFileTemplate) then
 | |
|       LoadFromFile(SFileTemplate)
 | |
|     else
 | |
|       begin
 | |
|       S:=TStringStream.Create(Template);
 | |
|       Try
 | |
|         LoadFromStream(S)
 | |
|       finally
 | |
|         S.Free;
 | |
|       end;
 | |
|       end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Type
 | |
|   TSkeletonData = Record
 | |
|     InputFile,
 | |
|     OutputFile,
 | |
|     PackageName,
 | |
|     AdditionalOptions : String;
 | |
|     DisableArguments,
 | |
|     DisableResults,
 | |
|     DisablePrivate,
 | |
|     DisableProtected,
 | |
|     DisableSeeAlso,
 | |
|     DisableErrors : Boolean;
 | |
|   end;
 | |
|   PSkeletonData = ^TSkeletonData;
 | |
| 
 | |
| Procedure TMainForm.GetSkeletonData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
 | |
| 
 | |
| begin
 | |
|   With (Sender as TMakeSkelForm), PSkeletonData(Data)^ do
 | |
|     begin
 | |
|     InputFile:=FInputFile.FileName;
 | |
|     OutputFile:=FOutputFile.FileName;
 | |
|     PackageName:=FPackageName.Text;
 | |
|     AdditionalOptions:=FadditionalOptions.Text;
 | |
|     DisableArguments:=FDisableArguments.Active;
 | |
|     DisableResults:=FDisableResults.Active;
 | |
|     DisablePrivate:=FDisablePrivate.Active;
 | |
|     DisableProtected:=FDisableProtected.Active;
 | |
|     DisableSeeAlso:=FDisableSeeAlso.Active;
 | |
|     DisableErrors:=FDisableErrors.Active;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Function CreateSkeletonFile(Const S : TSkeletonData) : Boolean;
 | |
| 
 | |
| Var
 | |
|   Cmd : String;
 | |
| 
 | |
| begin
 | |
|   With S do
 | |
|     begin
 | |
|     cmd:='makeskel ';
 | |
|     cmd:=cmd+format('--input=''%s %s''',[Inputfile,Additionaloptions]);
 | |
|     cmd:=cmd+' --output='+OutputFile;
 | |
|     cmd:=cmd+' --package='+PackageName;
 | |
|     If DisableErrors then
 | |
|       cmd:=cmd+' --disable-errors';
 | |
|     If DisableSeeAlso then
 | |
|       cmd:=cmd+' --disable-seealso';
 | |
|     If DisableProtected then
 | |
|       cmd:=cmd+' --disable-protected'
 | |
|     else if DisablePrivate then
 | |
|       cmd:=cmd+' --disable-private';
 | |
|     If DisableResults then
 | |
|       cmd:=cmd+' --disable-function-results';
 | |
|     If DisableArguments then
 | |
|       cmd:=cmd+' --disable-arguments';
 | |
|     Writeln(cmd);
 | |
|     With TProcess.Create(Nil) do
 | |
|       try
 | |
|         CommandLine:=cmd;
 | |
|         options:=[poWaitOnExit];
 | |
|         Execute;
 | |
|         If (ExitStatus<>0) then
 | |
|           begin
 | |
|           If FileExists(OutputFile) then
 | |
|             Result:=MessageDlg(SSkelErrorWithFile,[ExitStatus],mtWarning,mbYesNo,0)=mrYes
 | |
|           else
 | |
|             begin
 | |
|             MessageDlg(SSkelErrorWithoutFile,[ExitStatus],mtError,[mbOk],0);
 | |
|             Result:=False;
 | |
|             end;
 | |
|           end
 | |
|         else
 | |
|           Result:=FileExists(OutputFile);
 | |
|       finally
 | |
|         Free;
 | |
|       end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| Procedure TMainForm.FileNewFromFileClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| Var
 | |
|   SkeletonData : TSkeletonData;
 | |
|   CmdLine : String;
 | |
| 
 | |
| begin
 | |
|   With TMakeSkelform.Create do
 | |
|     begin
 | |
|     Title:=SMakeSkelFromSource;
 | |
|     If Execute(Nil,@SkeletonData,@GetSkeletonData)=drOK Then
 | |
|       If CreateSkeletonFile(SkeletonData) then
 | |
|         OpenFile(SkeletonData.OutPutFile)
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.SaveEditor(E : TEditorPage);
 | |
| 
 | |
| begin
 | |
|   With E do
 | |
|     begin
 | |
|     if (FileName=SNewDocument) then
 | |
|       SaveEditorAs(E)
 | |
|     else
 | |
|       SaveToFile(FileName);
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.SaveEditorAs(E : TEditorPage);
 | |
| 
 | |
| var
 | |
|   fs : TFPgtkFileSelection;
 | |
|   FN : String;
 | |
| 
 | |
| begin
 | |
|   fs := TFPgtkFileSelection.Create (gtk_window_dialog);
 | |
|   FN:='';
 | |
|   with fs do
 | |
|     begin
 | |
|     Title:=SSaveFileTitle;
 | |
|     OKButton.ConnectClicked (@(CloseWithResult), inttopointer(drOk));
 | |
|     CancelButton.ConnectClicked (@(CloseWindow), nil);
 | |
|     FileName:=E.FileName;
 | |
|     if execute (nil, @FN, @DialogSetFilename) = drOk then
 | |
|       begin
 | |
|       IF (FN<>'') then
 | |
|         begin
 | |
|         If ExtractFileExt(FN)='' then
 | |
|           FN:=FN+DefaultExtension;
 | |
|         E.SaveToFile(FN);
 | |
|         AddToRecent(FN);
 | |
|         end;
 | |
|       end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Function TMainForm.CloseEditor(E : TEditorPage) : Boolean;
 | |
| 
 | |
| begin
 | |
|   Result:=Not E.Modified;
 | |
|   If Not Result then
 | |
|     Case MessageDlg(SFileModified,[E.FileName],mtConfirmation,mbYesNoCancel,0) of
 | |
|       mrYes : begin
 | |
|               SaveEditor(E);
 | |
|               E.Free;
 | |
|               Result:=True;
 | |
|               end;
 | |
|       mrNo  : begin
 | |
|               E.Free;
 | |
|               Result:=True;
 | |
|               end;
 | |
|     end
 | |
|   else
 | |
|     E.Free;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.FileSaveClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| begin
 | |
|   If Assigned(CurrentEditor) then
 | |
|     SaveEditor(CurrentEditor);
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.FileSaveAsClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| begin
 | |
|   If Assigned(CurrentEditor) then
 | |
|     SaveEditorAs(CurrentEditor);
 | |
| end;
 | |
| 
 | |
| 
 | |
| Procedure TMainForm.FileExitClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| begin
 | |
|   If AllowClose then
 | |
|     Close;//(Sender,Data);
 | |
| end;
 | |
| 
 | |
| 
 | |
| Procedure TMainForm.FileCloseClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| begin
 | |
|   If Assigned(CurrentEditor) then
 | |
|     CloseEditor(CurrentEditor)
 | |
|   else
 | |
|     Writeln('No current editor to close')  ;
 | |
| end;
 | |
| 
 | |
| Function TMainForm.Currenteditor : TEditorPage;
 | |
| 
 | |
| begin
 | |
|   With FPages do
 | |
|     Result:=(Page as TEditorPage);
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.GetNodeData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
 | |
| 
 | |
| type
 | |
|   PString = ^AnsiString;
 | |
| 
 | |
| begin
 | |
|   With (Sender as TNewNodeForm) do
 | |
|     PString(Data)^:=FENodeName.Text;
 | |
| end;
 | |
| 
 | |
| 
 | |
| Procedure TMainForm.InsertNodeClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| Var
 | |
|   S : AnsiString;
 | |
|   Nt : TNodeType;
 | |
| 
 | |
| begin
 | |
|   If (CurrentEditor<>Nil) then
 | |
|     begin
 | |
|     With TNewNodeForm.Create do
 | |
|       begin
 | |
|       nt:=TNodeType(Data);
 | |
|       S:=SNew+' '+NodeNames[nt];
 | |
|       Case nt of
 | |
|         ntPackage : S:=S+SForFile+ExtractFileName(CurrentEditor.FileName);
 | |
|         ntModule: If (CurrentEditor.CurrentPackage<>Nil) then
 | |
|                      S:=S+SForPackage+CurrentEditor.CurrentPackage['name'];
 | |
|         ntElement: begin
 | |
|                    If (CurrentEditor.CurrentModule<>Nil) then
 | |
|                       S:=S+SForModule+CurrentEditor.CurrentModule['name'];
 | |
|                    If Assigned(CurrentEditor.CurrentElement) then
 | |
|                      FENodeName.Selection:=CurrentEditor.CurrentElement['name'];
 | |
|                    end;
 | |
|         ntTopic : begin
 | |
|                   if (CurrentEditor.CurrentTopic<>Nil) then
 | |
|                       S:=S+SForTopic+CurrentEditor.CurrentPackage['name']
 | |
|                   else if (CurrentEditor.CurrentModule<>Nil) then
 | |
|                      S:=S+SForModule+CurrentEditor.CurrentModule['name']
 | |
|                   else if (CurrentEditor.CurrentPackage<>Nil) then
 | |
|                       S:=S+SForPackage+CurrentEditor.CurrentPackage['name']
 | |
|                   end;
 | |
|       end;
 | |
|       Title:=S;
 | |
|       S:='';
 | |
|       If Execute(Nil,@S,@GetNodeData)=drOK Then
 | |
|         Case nt of
 | |
|           ntPackage : CurrentEditor.NewPackage(S);
 | |
|           ntModule  : CurrentEditor.NewModule(S);
 | |
|           ntElement : CurrentEditor.NewElement(S);
 | |
|           ntTopic   : CurrentEditor.NewTopic(S);
 | |
|         end;
 | |
|       end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.TagClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| begin
 | |
|   CurrentEditor.InsertTag(TTagType(Data));
 | |
| end;
 | |
| 
 | |
| Type
 | |
|   TLinkData = Record
 | |
|     LText,LTarget : String;
 | |
|   end;
 | |
|   PLinkData = ^TLinkData;
 | |
| 
 | |
|   TTableData = Record
 | |
|     Cols,Rows : Integer;
 | |
|     UseHeader : Boolean;
 | |
|   end;
 | |
|   PTableData = ^TTableData;
 | |
| 
 | |
| Procedure TMainForm.GetLinkData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
 | |
| 
 | |
| begin
 | |
|   With (Sender as TLinkForm),PlinkData(Data)^ do
 | |
|     begin
 | |
|     LText:=FlinkText.Text;
 | |
|     LTarget:=FLinkTarget.Entry.Text;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.GetTableData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
 | |
| 
 | |
| begin
 | |
|   With (Sender as TTableForm),PTableData(Data)^ do
 | |
|     begin
 | |
|     Rows:=FTableRows.AsInteger;
 | |
|     Cols:=FTableCols.AsInteger;
 | |
|     UseHeader:=FUSeHeader.Active;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.LinkClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| Var
 | |
|   LinkData : TLinkData;
 | |
|   S : TstringList;
 | |
|   L : TFPgtkListItemGroup;
 | |
| 
 | |
| begin
 | |
|   If Assigned(CurrentEditor) then
 | |
|     begin
 | |
|     L:=TFpGtkListItemGroup.Create;
 | |
|     Try
 | |
|       S:=TStringList.Create;
 | |
|       Try
 | |
|         S.Sorted:=True;
 | |
|         CurrentEditor.GetElementList(S);
 | |
|         L.FillFromList(S);
 | |
|       finally
 | |
|         S.Free;
 | |
|       end;
 | |
|       With TLinkForm.Create do
 | |
|         begin
 | |
|         Title:=SInsertLink;
 | |
|         FLinkText.Text:=CurrentEditor.CurrentSelection;
 | |
|         FLinkTarget.List.AppendItems(L);
 | |
|         If Execute(Nil,@LinkData,@GetLinkData)=drOK Then
 | |
|           With LinkData do
 | |
|           CurrentEditor.InsertLink(LTarget,LText);
 | |
|         end;
 | |
|     finally
 | |
|       L.Free;
 | |
|     end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.TableClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| Var
 | |
|   TableData : TTableData;
 | |
| 
 | |
| begin
 | |
|   With TTableForm.Create do
 | |
|     begin
 | |
|     Title:=SInsertTable;
 | |
|     FTableRows.AsInteger:=3;
 | |
|     FTableCols.AsInteger:=3;
 | |
|     If Execute(Nil,@TableData,@GetTableData)=drOK Then
 | |
|       With TableData do
 | |
|         CurrentEditor.InsertTable(Cols,Rows,UseHeader);
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| Function TMainForm.AllowClose : Boolean;
 | |
| 
 | |
| Var
 | |
|   P : TFPgtkWidget;
 | |
| 
 | |
| begin
 | |
|   P:=FPages.Page;
 | |
|   Result:=True;
 | |
|   While (P<>Nil) and Result do
 | |
|     begin
 | |
|     Result:=CloseEditor(P as TEditorPage);
 | |
|     P:=FPages.Page;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Function TMainForm.OnDeleteEvent(Sender:TFPgtkWidget; Event:PGdkEvent; data:pointer): boolean;
 | |
| 
 | |
| begin
 | |
|   Result:=Not AllowClose;
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.OptionsClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| begin
 | |
|   With TOptionsForm.Create do
 | |
|     Execute(Nil,Nil,Nil);
 | |
| end;
 | |
| 
 | |
| Procedure TMainForm.HelpAboutClick(Sender : TFPGtkObject; Data : Pointer);
 | |
| 
 | |
| begin
 | |
|   With TAboutForm.Create do
 | |
|     Execute(Nil,Nil,Nil);
 | |
| end;
 | |
| 
 | |
| Type
 | |
|   TRecentMenuItem = Class (TFPGtkMenuItem)
 | |
|     FileName : String;
 | |
|   end;
 | |
| 
 | |
| Procedure TMainForm.FileReopen(Sender: TFPGTKObject;data : Pointer);
 | |
| 
 | |
| begin
 | |
|   OpenFile((Sender as TRecentMenuItem).FileName);
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| procedure TMainForm.BuildReopenList;
 | |
| 
 | |
|   Function NewRecentMenuItem (Nr : Integer;AFileName : string) : TRecentMenuItem;
 | |
| 
 | |
|   begin
 | |
|     If Nr<10 then
 | |
|       result := TRecentMenuItem.CreateWithLabel('_'+IntToStr(Nr)+' '+AFileName)
 | |
|     else
 | |
|       result := TRecentMenuItem.CreateWithLabel(AFileName);
 | |
|     result.FileName:=AFileName;
 | |
|     Result.ConnectActivate(@FileReopen,Nil);
 | |
|   end;
 | |
| 
 | |
| var I : integer;
 | |
|     mi : TFPgtkMenuItem;
 | |
| 
 | |
| begin
 | |
|   with FRecent do
 | |
|     begin
 | |
|     with FFileRecent do
 | |
|       begin
 | |
|       if assigned(SubMenu) then
 | |
|         SubMenu.Free;
 | |
|       SubMenu := TFPgtkMenu.Create;
 | |
|       with (submenu as TFPgtkMenu) do
 | |
|         for I := FRecent.count-1 downto 0 do
 | |
|           begin
 | |
|           mi := NewRecentMenuItem (I,FRecent[I]);
 | |
|           Append (mi);
 | |
|           end;
 | |
|       end;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| end.
 | 
