mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 09:39:32 +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.
 |