frmmain.pp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919
  1. {$mode objfpc}
  2. {$h+}
  3. unit frmmain;
  4. interface
  5. uses
  6. gtk,gdk,fpgtk,fpgtkext,pgEditor,frmlink,sysutils,classes,fpdeopts;
  7. Const
  8. DefaultTooltips = True;
  9. DefaultToolBarStyle = GTK_TOOLBAR_ICONS;
  10. DefaultToolbarRelief = GTK_RELIEF_NONE;
  11. SFileTemplate = 'template.xml';
  12. Type
  13. TNodeType = (ntfile,ntPackage,ntModule,ntElement,ntTopic);
  14. TMainForm = Class(TFPGtkWindow)
  15. Private
  16. FRecent : TStrings;
  17. FPages : TFPGtkNoteBook;
  18. FVBox : TFPGTKVBox;
  19. FMenu : TFpGTKMenuBar;
  20. FNewImage,
  21. FOpenImage,
  22. FSaveImage,
  23. FSaveAsImage,
  24. FNewPackageImage,
  25. FNewModuleImage,
  26. FNewTopicImage,
  27. FNewElementImage,
  28. FBoldImage,
  29. FUnderlineImage,
  30. FItalicsImage,
  31. FParagraphImage,
  32. FVarImage,
  33. FLinkImage,
  34. FRemarkImage,
  35. FTableImage : TFPGtkPixmap;
  36. FHelpMenu,
  37. FExtraMenu,
  38. FInsertMenu,
  39. FFormatMenu,
  40. FFileMenu : TFPGtkMenuItem;
  41. FToolbarFrame : TFPGtkFrame;
  42. FFormatToolBar,
  43. FToolsToolBar,
  44. FMainToolBar : TFPGtkToolbar;
  45. FFileOpen,
  46. FFileNew,
  47. FFileNewFromFile,
  48. FFileSave,
  49. FFileSaveAs,
  50. FFileRecent,
  51. FFileClose,
  52. FFileExit,
  53. FInsertPackage,
  54. FInsertModule,
  55. FInsertTopic,
  56. FInsertElement,
  57. FInsertLink,
  58. FInsertTable,
  59. FFormatParagraph,
  60. FFormatBold,
  61. FFormatItalic,
  62. FFormatUnderline,
  63. FFormatRemark,
  64. FFormatVariable,
  65. FFormatCode,
  66. FFormatFile,
  67. FExtraoptions,
  68. FHelpAbout : TFPGtkMenuItem;
  69. // Utility functions
  70. Function FormatMenuItem(ACaption : String; tt : TTagType) : TFPgtkMenuItem;
  71. Function FormatMenuItem(ACaption : String; tt : TTagType; Accel : PAccelKeyDef) : TFPgtkMenuItem;
  72. // Editor functions.
  73. procedure BuildReopenList;
  74. Procedure AddTorecent(FN : String);
  75. Procedure OpenFile(FN : String);
  76. Procedure SaveEditorAs(E : TEditorPage);
  77. Procedure SaveEditor(E : TEditorPage);
  78. Function CloseEditor(E : TEditorPage) : Boolean;
  79. Procedure LoadCommandLine;
  80. Procedure LoadRecent;
  81. Procedure SaveRecent;
  82. Procedure CreateForm;
  83. Function CreatePage : TEditorPage;
  84. Function Currenteditor : TEditorPage;
  85. Function AllowClose : Boolean;
  86. // Callbacks
  87. Procedure TagClick(Sender : TFPGtkObject; Data : Pointer);
  88. Procedure FileReopen(Sender: TFPGTKObject;data : Pointer);
  89. Procedure FileOpenClick(Sender : TFPGtkObject; Data : Pointer);
  90. Procedure FileNewClick(Sender : TFPGtkObject; Data : Pointer);
  91. Procedure FileNewFromFileClick(Sender : TFPGtkObject; Data : Pointer);
  92. Procedure FileSaveAsClick(Sender : TFPGtkObject; Data : Pointer);
  93. Procedure FileSaveClick(Sender : TFPGtkObject; Data : Pointer);
  94. Procedure FileExitClick(Sender : TFPGtkObject; Data : Pointer);
  95. Procedure FileCloseClick(Sender : TFPGtkObject; Data : Pointer);
  96. Procedure OptionsClick(Sender : TFPGtkObject; Data : Pointer);
  97. Procedure HelpAboutClick(Sender : TFPGtkObject; Data : Pointer);
  98. Procedure InsertNodeClick(Sender : TFPGtkObject; Data : Pointer);
  99. Procedure LinkClick(Sender : TFPGtkObject; Data : Pointer);
  100. Procedure TableClick(Sender : TFPGtkObject; Data : Pointer);
  101. Procedure GetLinkData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  102. Procedure GetTableData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  103. Procedure GetNodeData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  104. Procedure GetSkeletonData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  105. Procedure DialogSetFilename(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  106. Function OnDeleteEvent(Sender:TFPgtkWidget; Event:PGdkEvent; data:pointer): boolean;
  107. Public
  108. Constructor create;
  109. Destructor Destroy; override;
  110. end;
  111. Const
  112. NodeNames : Array[TNodeType] of String
  113. = ('file','package','module','element','topic');
  114. implementation
  115. uses fpdemsg,frmnewnode,frmtable,frmmakeskel,process,frmOptions,frmAbout,inifiles,xpms;
  116. Function TMainForm.CreatePage : TEditorPage;
  117. begin
  118. Result:=TEditorPage.Create;
  119. Result.FileNameLabel:=TFPgtkLabel.Create(SNewDocument);
  120. FPages.AppendPage(Result, REsult.FileNameLabel);
  121. FPages.Page:=Result;
  122. end;
  123. Function PixmapFromFile (FN : String; Const ImgArray : Array of string) :TFPGtkPixmap;
  124. begin
  125. Result:=TFPGtkPixmap.CReate;
  126. {$ifdef debug}
  127. writeln('loading ','bitmaps'+directoryseparator+FN);
  128. {$endif}
  129. If FileExists('bitmaps'+directoryseparator+FN) then
  130. Result.LoadFromFile('bitmaps'+directoryseparator+FN)
  131. else
  132. Result.loadFromArray(ImgArray);
  133. end;
  134. Function TMainForm.FormatMenuItem(ACaption : String; tt : TTagType) : TFPgtkMenuItem;
  135. begin
  136. Result:=NewMenuItem(ACaption,FormatHint(ACaption),'',@TagClick,Pointer(tt));
  137. end;
  138. Function TMainForm.FormatMenuItem(ACaption : String; tt : TTagType; Accel : PAccelKeyDef) : TFPgtkMenuItem;
  139. begin
  140. Result:=NewMenuItem(ACaption,FormatHint(ACaption),'',Accel,@TagClick,Pointer(tt));
  141. end;
  142. Procedure TMainForm.CreateForm;
  143. Var
  144. V : TFPGtkHBox;
  145. FAccelGroup: Integer;
  146. begin
  147. Title:=SFPDE;
  148. FAccelGroup:=AccelGroupNew;
  149. { File menu }
  150. {$ifdef debug}
  151. Writeln('Menu');
  152. {$endif}
  153. //anAG : integer; aKey : guint; aMods
  154. FFileOpen:=NewMenuItem(SMenuOpen,'','',MakeAccelKeyDef(Self,FaccelGroup,GDK_O,[amcontrol]),@FileOpenClick,Nil);
  155. FFileNew:=NewMenuItem(SMenuNew,'','',MakeAccelKeyDef(Self,FaccelGroup,GDK_N,[amcontrol]),@FileNewClick,Nil);
  156. FFileNewFromFile:=NewMenuItem(SMenuNewFromSource,'','',@FileNewFromFileClick,Nil);
  157. FFileSave:=NewMenuItem(SMenuSave,'','',MakeAccelKeyDef(Self,FaccelGroup,GDK_S,[amcontrol]),@FileSaveClick,Nil);
  158. FFileSaveAs:=NewMenuItem(SMenuSaveAs,'','',@FileSaveAsClick,Nil);
  159. FFileRecent:=NewSubMenu(SMenuRecent,'','',[]);
  160. FFileClose:=NewMenuItem(SMenuClose,'','',MakeAccelKeyDef(Self,FaccelGroup,GDK_W,[amcontrol]),@FileCLoseClick,Nil);
  161. FFileExit:=NewMenuItem(SMenuExit,'','',MakeAccelKeyDef(Self,FaccelGroup,GDK_Q,[amcontrol]),@FileExitClick,Nil);
  162. FFileMenu:=NewSubMenu(SMenuFile,'','',[FFileNew,FFileNewFromFile,FFileOpen,FFileRecent,FFileSave,FFileSaveAs,FFileClose,NewLine,FFileExit]);
  163. { Insert menu }
  164. FInsertPackage:=NewMenuItem(SMenuInsertPackage,SHintInsertPackage,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_P,[amcontrol]),@InsertNodeClick,Pointer(ntpackage));
  165. FInsertModule:=NewMenuItem(SMenuInsertModule,SHintInsertModule,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_M,[amcontrol]),@InsertNodeClick,Pointer(ntmodule));
  166. FInsertTopic:=NewMenuItem(SMenuInsertTopic,SHintInsertTopic,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_M,[amcontrol]),@InsertNodeClick,Pointer(ntTopic));
  167. FInsertElement:=NewMenuItem(SMenuInsertElement,SHintInsertElement,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_E,[amcontrol]),@InsertNodeClick,Pointer(ntElement));
  168. FinsertLink:=NewMenuItem(SMenuInsertLink,SHintInsertLink,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_L,[amcontrol]),@LinkClick,Nil);
  169. FinsertTable:=NewMenuItem(SMenuInsertTable,SHintInsertTable,'',MakeAccelKeyDef(Self,FaccelGroup,GDK_T,[amcontrol]),@TableClick,Nil);
  170. FInsertMenu:=NewSubMenu(SMenuInsert,'','',[FInsertPackage,FInsertModule,FInsertElement,NewLine,FInsertLink,FinsertTable]);
  171. { Format menu }
  172. FFormatBold:=FormatMenuItem(SMenuFormatBold,ttBold,MakeAccelKeyDef(Self,FaccelGroup,GDK_B,[amcontrol]));
  173. FFormatItalic:=FormatMenuItem(SMenuFormatItalics,ttItalic,MakeAccelKeyDef(Self,FaccelGroup,GDK_I,[amcontrol]));
  174. FFormatUnderline:=FormatMenuItem(SMenuFormatUnderline,ttUnderline,MakeAccelKeyDef(Self,FaccelGroup,GDK_U,[amcontrol]));
  175. FFormatVariable:=FormatMenuItem(SMenuFormatVariable,ttVariable,MakeAccelKeyDef(Self,FaccelGroup,GDK_R,[amcontrol]));
  176. FFormatFile:=FormatMenuItem(SMenuFormatFile,ttFile);
  177. FFormatParagraph:=FormatMenuItem(SMenuFormatParagraph,ttParagraph);
  178. FFormatRemark:=FormatMenuItem(SMenuFormatRemark,ttRemark);
  179. FFormatCode:=FormatMenuItem(SMenuFormatCode,ttCode);
  180. FFormatMenu:=NewSubMenu(SMenuFormat,'','',[FFormatBold,FFormatItalic,FFormatUnderline,FFormatVariable,FFormatFile,
  181. NewLine,FFormatParagraph,FFormatRemark,FFormatCode]);
  182. { Extra menu }
  183. FExtraOptions:=NewMenuItem(SMenuExtraOptions,SHMenuExtraOptions,'',@OptionsClick,Nil);
  184. FExtraMenu:=NewSubMenu(SMenuExtra,'','',[FExtraOptions]);
  185. { Help menu }
  186. FHelpAbout:=NewMenuItem(SMenuHelpAbout,SHMenuHelpAbout,'',@HelpAboutClick,Nil);
  187. FHelpMenu:=NewSubMenu(SMenuHelp,'','',[FHelpAbout]);
  188. FMenu:=NewMenuBar([FFileMenu,FInsertMenu,FFormatMenu,FExtraMenu,FHelpMenu]);
  189. {$ifdef debug}
  190. Writeln('Toolbar pixmaps');
  191. {$endif}
  192. { Tool bar bitmaps }
  193. FNewImage:=PixMapFromFile('new.xpm',ImgNew);
  194. FOpenImage:=PixmapFromFile('open.xpm',ImgOpen);
  195. FSaveImage:=PixmapFromFile('save.xpm',ImgSave);
  196. FSaveAsImage:=PixMapFromFile('saveas.xpm',ImgSaveAs);
  197. FNewPackageImage:=PixMapFromFile('newpackage.xpm',ImgNewPackage);
  198. FNewModuleImage:=PixMapFromFile('newmodule.xpm',ImgNewModule);
  199. FNewTopicImage:=PixMapFromFile('newtopic.xpm',ImgNewTopic);
  200. FNewElementImage:=PixMapFromFile('newelement.xpm',ImgNewElement);
  201. FBoldImage:=PixMapFromFile('bold.xpm',ImgBold);
  202. FUnderlineImage:=PixMapFromFile('underline.xpm',ImgUnderline);
  203. FItalicsImage:=PixMapFromFile('italic.xpm',ImgItalic);
  204. FParagraphImage:=PixMapFromFile('para.xpm',ImgPara);
  205. FVarImage:=PixMapFromFile('var.xpm',ImgVar);
  206. FRemarkImage:=PixMapFromFile('remark.xpm',ImgRemark);
  207. FLinkImage:=PixMapFromFile('link.xpm',ImgLink);
  208. FTableImage:=PixMapFromFile('table.xpm',ImgTable);
  209. { Tool bars }
  210. {$ifdef debug}
  211. Writeln('Main toolbar');
  212. {$endif}
  213. FMainToolBar:=TFPGtkToolbar.Create;
  214. With FMainToolbar do
  215. begin
  216. Style:=DefaultToolbarStyle;
  217. ButtonRelief:=DefaultToolbarRelief;
  218. EnableTooltips:=DefaultTooltips;
  219. // AppendElement (ButtonType:TGtkToolbarChildType; PrevRadioBut:TFPgtkWidget; Text:string; TooltipText:string; TooltipPrivate:string; Icon:TFPgtkWidget; CallBack:TFPgtkSignalProcedure; data:pointer) : TFPgtkWidget;
  220. AppendItem(SMenuNew,SHintFileNew,'',FNewImage,@FileNewClick,Nil);
  221. AppendItem(SMenuOpen,SHintFileOpen,'',FOpenImage,@FileOpenClick,Nil);
  222. AppendItem(SmenuSave,SHintFileSave,'',FSaveImage,@FileSaveClick,Nil);
  223. AppendItem(SMenuSaveAs,SHintFileSaveAs,'',FSaveAsImage,@FileSaveAsClick,Nil);
  224. AppendSpace;
  225. AppendItem(SMenuInsertPackage,SHintInsertPackage,'',FNewPackageImage,@InsertNodeClick,Pointer(ntPackage));
  226. AppendItem(SMenuInsertModule,SHintInsertModule,'',FNewModuleImage,@InsertNodeClick,Pointer(ntModule));
  227. AppendItem(SMenuInsertTopic,SHintInsertTopic,'',FNewTopicImage,@InsertNodeClick,Pointer(ntTopic));
  228. AppendItem(SMenuInsertEleMent,SHintInsertElement,'',FNewElementImage,@InsertNodeClick,Pointer(ntElement));
  229. AppendSpace;
  230. end;
  231. {$ifdef debug}
  232. Writeln('Format Toolbars');
  233. {$endif}
  234. FFormatToolBar:=TFPGtkToolbar.Create;
  235. With FFormatToolbar do
  236. begin
  237. Style:=DefaultToolBarStyle;
  238. ButtonRelief:=DefaultToolbarRelief;
  239. EnableTooltips:=DefaultTooltips;
  240. AppendItem(SMenuFormatParaGraph,Format(SMarkSelection,[SMenuFormatParaGraph]),'',FParagraphImage,@TagClick,Pointer(ttParagraph));
  241. AppendItem(SMenuFormatBold,Format(SMarkSelection,[SMenuFormatBold]),'',FBoldImage,@TagClick,Pointer(ttBold));
  242. AppendItem(SMenuFormatItalics,Format(SMarkSelection,[SMenuFormatItalics]),'',FItalicsImage,@TagClick,Pointer(ttItalic));
  243. AppendItem(SMenuFormatUnderline,Format(SMarkSelection,[SMenuFormatUnderline]),'',FUnderlineImage,@TagClick,Pointer(ttUnderline));
  244. AppendItem(SMenuFormatVariable,Format(SMarkSelection,[SMenuFormatVariable]),'',FVarImage,@TagClick,Pointer(ttVariable));
  245. AppendItem(SmenuFormatRemark,Format(SMarkSelection,[SmenuFormatRemark]),'',FRemarkImage,@TagClick,Pointer(ttRemark));
  246. FFormatToolbar.AppendSpace;
  247. end;
  248. {$ifdef debug}
  249. Writeln('Tools toolbar');
  250. {$endif}
  251. FToolsToolBar:=TFPGtkToolbar.Create;
  252. With FToolsToolbar do
  253. begin
  254. Style:=DefaultToolBarStyle;
  255. ButtonRelief:=DefaultToolBarRelief;
  256. EnableTooltips:=DefaultToolTips;
  257. AppendItem(SMenuInsertLink,SHintInsertLink,'',FlinkImage,@LinkCLick,Nil);
  258. AppendItem(SMenuInsertTable,SHintInsertTable,'',FTableImage,@TableClick,Nil);
  259. AppendSpace;
  260. end;
  261. {$ifdef debug}
  262. Writeln('end Toolbars');
  263. {$endif}
  264. V:=TFPGtkHBox.Create;
  265. V.PackStart(FMainToolbar,False,False,2);
  266. V.PackStart(FFormatToolBar,False,False,2);
  267. V.Packstart(FToolsToolbar,True,True,2);
  268. FToolbarFrame:=TFPGtkFrame.Create;
  269. FtoolbarFrame.Add(V);
  270. { Pages }
  271. FPages:=TFPGtkNotebook.Create;
  272. { Place everything on form }
  273. FVBox:=TFPGTKVBox.create;
  274. FVBox.PackStart(FMenu,false, true, 0);
  275. FVBox.PackStart(FToolBarFrame,false, true, 0);
  276. FVBox.PackStart(FPages,true, true, 0);
  277. Self.add(FVBox);
  278. setusize(640,480);
  279. ConnectDeleteEvent(@OnDeleteEvent,Nil);
  280. end;
  281. Constructor TMainForm.create;
  282. begin
  283. FRecent:=TStringList.Create;
  284. Inherited Create(gtk_window_dialog);
  285. CreateForm;
  286. LoadCommandLine;
  287. LoadOptions;
  288. LoadRecent;
  289. end;
  290. Destructor TMainForm.Destroy;
  291. begin
  292. SaveRecent;
  293. FRecent.Free;
  294. Inherited;
  295. end;
  296. Procedure TMainForm.LoadCommandLine;
  297. Var
  298. I : Integer;
  299. begin
  300. I:=1;
  301. While I<=ParamCount do
  302. begin
  303. If FileExists(ParamStr(i)) then
  304. OpenFile(Paramstr(I));
  305. Inc(I);
  306. end;
  307. end;
  308. Procedure TMainForm.LoadRecent;
  309. Var
  310. I,Count : Integer;
  311. S : String;
  312. begin
  313. FRecent.Clear;
  314. With TInifile.Create(GetoptionFileName) do
  315. begin
  316. Count:=ReadInteger('Recent','Count',0);
  317. For I:=1 to Count do
  318. begin
  319. S:=ReadString('Recent','File'+IntToStr(i),'');
  320. If S<>'' then
  321. FRecent.Add(S);
  322. end;
  323. end;
  324. BuildReopenList;
  325. end;
  326. Procedure TMainForm.SaveRecent;
  327. Var
  328. I,Count : Integer;
  329. S : String;
  330. begin
  331. With TInifile.Create(GetoptionFileName) do
  332. try
  333. EraseSection('Recent');
  334. WriteInteger('Recent','Count',FRecent.Count);
  335. For I:=1 to FRecent.Count do
  336. WriteString('Recent','File'+IntToStr(i),FRecent[i-1]);
  337. UpdateFile;
  338. Finally
  339. Free;
  340. end;
  341. end;
  342. {
  343. Menu handlers
  344. }
  345. Procedure TMainForm.DialogSetFilename(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  346. type
  347. PString = ^AnsiString;
  348. begin
  349. PString(Data)^:=(Sender as TFPgtkFileSelection).Filename;
  350. end;
  351. Procedure TMainForm.AddTorecent(FN : String);
  352. Var
  353. Index : Integer;
  354. begin
  355. FN:=ExpandFileName(FN);
  356. With FRecent do
  357. begin
  358. Index:=IndexOf(FN);
  359. If Index<>-1 then
  360. Delete(Index);
  361. Insert(0,FN);
  362. While Count>MaxRecentUsed do
  363. Delete(Count-1);
  364. end;
  365. BuildReopenList;
  366. end;
  367. Procedure TMainForm.OpenFile(FN : String);
  368. Var
  369. EFN : String;
  370. begin
  371. IF (FN<>'') then
  372. begin
  373. If FileExists(FN) then
  374. With CreatePage do
  375. begin
  376. LoadFromFile(FN);
  377. AddToRecent(Fn);
  378. end;
  379. end;
  380. end;
  381. Procedure TMainForm.FileOpenClick(Sender : TFPGtkObject; Data : Pointer);
  382. var
  383. fs : TFPgtkFileSelection;
  384. FN : String;
  385. begin
  386. fs := TFPgtkFileSelection.Create (gtk_window_dialog);
  387. FN:='';
  388. with fs do
  389. begin
  390. Title:=SOpenFileTitle;
  391. OKButton.ConnectClicked (@(CloseWithResult), inttopointer(drOk));
  392. CancelButton.ConnectClicked (@(CloseWindow), nil);
  393. if execute (nil, @FN, @DialogSetFilename) = drOk then
  394. OpenFile(FN);
  395. end;
  396. end;
  397. Procedure TMainForm.FileNewClick(Sender : TFPGtkObject; Data : Pointer);
  398. Const
  399. template = '<?xml version="1.0" encoding="ISO-8859-1"?>'+LineEnding+
  400. '<fpdoc-descriptions>'+LineEnding+
  401. '</fpdoc-descriptions>'+LineEnding;
  402. Var
  403. S : TStringStream;
  404. begin
  405. With CreatePage do
  406. begin
  407. If FileExists(SFileTemplate) then
  408. LoadFromFile(SFileTemplate)
  409. else
  410. begin
  411. S:=TStringStream.Create(Template);
  412. Try
  413. LoadFromStream(S)
  414. finally
  415. S.Free;
  416. end;
  417. end;
  418. end;
  419. end;
  420. Type
  421. TSkeletonData = Record
  422. InputFile,
  423. OutputFile,
  424. PackageName,
  425. AdditionalOptions : String;
  426. DisableArguments,
  427. DisableResults,
  428. DisablePrivate,
  429. DisableProtected,
  430. DisableSeeAlso,
  431. DisableErrors : Boolean;
  432. end;
  433. PSkeletonData = ^TSkeletonData;
  434. Procedure TMainForm.GetSkeletonData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  435. begin
  436. With (Sender as TMakeSkelForm), PSkeletonData(Data)^ do
  437. begin
  438. InputFile:=FInputFile.FileName;
  439. OutputFile:=FOutputFile.FileName;
  440. PackageName:=FPackageName.Text;
  441. AdditionalOptions:=FadditionalOptions.Text;
  442. DisableArguments:=FDisableArguments.Active;
  443. DisableResults:=FDisableResults.Active;
  444. DisablePrivate:=FDisablePrivate.Active;
  445. DisableProtected:=FDisableProtected.Active;
  446. DisableSeeAlso:=FDisableSeeAlso.Active;
  447. DisableErrors:=FDisableErrors.Active;
  448. end;
  449. end;
  450. Function CreateSkeletonFile(Const S : TSkeletonData) : Boolean;
  451. Var
  452. Cmd : String;
  453. begin
  454. With S do
  455. begin
  456. cmd:='makeskel ';
  457. cmd:=cmd+format('--input=''%s %s''',[Inputfile,Additionaloptions]);
  458. cmd:=cmd+' --output='+OutputFile;
  459. cmd:=cmd+' --package='+PackageName;
  460. If DisableErrors then
  461. cmd:=cmd+' --disable-errors';
  462. If DisableSeeAlso then
  463. cmd:=cmd+' --disable-seealso';
  464. If DisableProtected then
  465. cmd:=cmd+' --disable-protected'
  466. else if DisablePrivate then
  467. cmd:=cmd+' --disable-private';
  468. If DisableResults then
  469. cmd:=cmd+' --disable-function-results';
  470. If DisableArguments then
  471. cmd:=cmd+' --disable-arguments';
  472. Writeln(cmd);
  473. With TProcess.Create(Nil) do
  474. try
  475. CommandLine:=cmd;
  476. options:=[poWaitOnExit];
  477. Execute;
  478. If (ExitStatus<>0) then
  479. begin
  480. If FileExists(OutputFile) then
  481. Result:=MessageDlg(SSkelErrorWithFile,[ExitStatus],mtWarning,mbYesNo,0)=mrYes
  482. else
  483. begin
  484. MessageDlg(SSkelErrorWithoutFile,[ExitStatus],mtError,[mbOk],0);
  485. Result:=False;
  486. end;
  487. end
  488. else
  489. Result:=FileExists(OutputFile);
  490. finally
  491. Free;
  492. end;
  493. end;
  494. end;
  495. Procedure TMainForm.FileNewFromFileClick(Sender : TFPGtkObject; Data : Pointer);
  496. Var
  497. SkeletonData : TSkeletonData;
  498. CmdLine : String;
  499. begin
  500. With TMakeSkelform.Create do
  501. begin
  502. Title:=SMakeSkelFromSource;
  503. If Execute(Nil,@SkeletonData,@GetSkeletonData)=drOK Then
  504. If CreateSkeletonFile(SkeletonData) then
  505. OpenFile(SkeletonData.OutPutFile)
  506. end;
  507. end;
  508. Procedure TMainForm.SaveEditor(E : TEditorPage);
  509. begin
  510. With E do
  511. begin
  512. if (FileName=SNewDocument) then
  513. SaveEditorAs(E)
  514. else
  515. SaveToFile(FileName);
  516. end;
  517. end;
  518. Procedure TMainForm.SaveEditorAs(E : TEditorPage);
  519. var
  520. fs : TFPgtkFileSelection;
  521. FN : String;
  522. begin
  523. fs := TFPgtkFileSelection.Create (gtk_window_dialog);
  524. FN:='';
  525. with fs do
  526. begin
  527. Title:=SSaveFileTitle;
  528. OKButton.ConnectClicked (@(CloseWithResult), inttopointer(drOk));
  529. CancelButton.ConnectClicked (@(CloseWindow), nil);
  530. FileName:=E.FileName;
  531. if execute (nil, @FN, @DialogSetFilename) = drOk then
  532. begin
  533. IF (FN<>'') then
  534. begin
  535. If ExtractFileExt(FN)='' then
  536. FN:=FN+DefaultExtension;
  537. E.SaveToFile(FN);
  538. AddToRecent(FN);
  539. end;
  540. end;
  541. end;
  542. end;
  543. Function TMainForm.CloseEditor(E : TEditorPage) : Boolean;
  544. begin
  545. Result:=Not E.Modified;
  546. If Not Result then
  547. Case MessageDlg(SFileModified,[E.FileName],mtConfirmation,mbYesNoCancel,0) of
  548. mrYes : begin
  549. SaveEditor(E);
  550. E.Free;
  551. Result:=True;
  552. end;
  553. mrNo : begin
  554. E.Free;
  555. Result:=True;
  556. end;
  557. end
  558. else
  559. E.Free;
  560. end;
  561. Procedure TMainForm.FileSaveClick(Sender : TFPGtkObject; Data : Pointer);
  562. begin
  563. If Assigned(CurrentEditor) then
  564. SaveEditor(CurrentEditor);
  565. end;
  566. Procedure TMainForm.FileSaveAsClick(Sender : TFPGtkObject; Data : Pointer);
  567. begin
  568. If Assigned(CurrentEditor) then
  569. SaveEditorAs(CurrentEditor);
  570. end;
  571. Procedure TMainForm.FileExitClick(Sender : TFPGtkObject; Data : Pointer);
  572. begin
  573. If AllowClose then
  574. Close;//(Sender,Data);
  575. end;
  576. Procedure TMainForm.FileCloseClick(Sender : TFPGtkObject; Data : Pointer);
  577. begin
  578. If Assigned(CurrentEditor) then
  579. CloseEditor(CurrentEditor)
  580. else
  581. Writeln('No current editor to close') ;
  582. end;
  583. Function TMainForm.Currenteditor : TEditorPage;
  584. begin
  585. With FPages do
  586. Result:=(Page as TEditorPage);
  587. end;
  588. Procedure TMainForm.GetNodeData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  589. type
  590. PString = ^AnsiString;
  591. begin
  592. With (Sender as TNewNodeForm) do
  593. PString(Data)^:=FENodeName.Text;
  594. end;
  595. Procedure TMainForm.InsertNodeClick(Sender : TFPGtkObject; Data : Pointer);
  596. Var
  597. S : AnsiString;
  598. Nt : TNodeType;
  599. begin
  600. If (CurrentEditor<>Nil) then
  601. begin
  602. With TNewNodeForm.Create do
  603. begin
  604. nt:=TNodeType(Data);
  605. S:=SNew+' '+NodeNames[nt];
  606. Case nt of
  607. ntPackage : S:=S+SForFile+ExtractFileName(CurrentEditor.FileName);
  608. ntModule: If (CurrentEditor.CurrentPackage<>Nil) then
  609. S:=S+SForPackage+CurrentEditor.CurrentPackage['name'];
  610. ntElement: begin
  611. If (CurrentEditor.CurrentModule<>Nil) then
  612. S:=S+SForModule+CurrentEditor.CurrentModule['name'];
  613. If Assigned(CurrentEditor.CurrentElement) then
  614. FENodeName.Selection:=CurrentEditor.CurrentElement['name'];
  615. end;
  616. ntTopic : begin
  617. if (CurrentEditor.CurrentTopic<>Nil) then
  618. S:=S+SForTopic+CurrentEditor.CurrentPackage['name']
  619. else if (CurrentEditor.CurrentModule<>Nil) then
  620. S:=S+SForModule+CurrentEditor.CurrentModule['name']
  621. else if (CurrentEditor.CurrentPackage<>Nil) then
  622. S:=S+SForPackage+CurrentEditor.CurrentPackage['name']
  623. end;
  624. end;
  625. Title:=S;
  626. S:='';
  627. If Execute(Nil,@S,@GetNodeData)=drOK Then
  628. Case nt of
  629. ntPackage : CurrentEditor.NewPackage(S);
  630. ntModule : CurrentEditor.NewModule(S);
  631. ntElement : CurrentEditor.NewElement(S);
  632. ntTopic : CurrentEditor.NewTopic(S);
  633. end;
  634. end;
  635. end;
  636. end;
  637. Procedure TMainForm.TagClick(Sender : TFPGtkObject; Data : Pointer);
  638. begin
  639. CurrentEditor.InsertTag(TTagType(Data));
  640. end;
  641. Type
  642. TLinkData = Record
  643. LText,LTarget : String;
  644. end;
  645. PLinkData = ^TLinkData;
  646. TTableData = Record
  647. Cols,Rows : Integer;
  648. UseHeader : Boolean;
  649. end;
  650. PTableData = ^TTableData;
  651. Procedure TMainForm.GetLinkData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  652. begin
  653. With (Sender as TLinkForm),PlinkData(Data)^ do
  654. begin
  655. LText:=FlinkText.Text;
  656. LTarget:=FLinkTarget.Entry.Text;
  657. end;
  658. end;
  659. Procedure TMainForm.GetTableData(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  660. begin
  661. With (Sender as TTableForm),PTableData(Data)^ do
  662. begin
  663. Rows:=FTableRows.AsInteger;
  664. Cols:=FTableCols.AsInteger;
  665. UseHeader:=FUSeHeader.Active;
  666. end;
  667. end;
  668. Procedure TMainForm.LinkClick(Sender : TFPGtkObject; Data : Pointer);
  669. Var
  670. LinkData : TLinkData;
  671. S : TstringList;
  672. L : TFPgtkListItemGroup;
  673. begin
  674. If Assigned(CurrentEditor) then
  675. begin
  676. L:=TFpGtkListItemGroup.Create;
  677. Try
  678. S:=TStringList.Create;
  679. Try
  680. S.Sorted:=True;
  681. CurrentEditor.GetElementList(S);
  682. L.FillFromList(S);
  683. finally
  684. S.Free;
  685. end;
  686. With TLinkForm.Create do
  687. begin
  688. Title:=SInsertLink;
  689. FLinkText.Text:=CurrentEditor.CurrentSelection;
  690. FLinkTarget.List.AppendItems(L);
  691. If Execute(Nil,@LinkData,@GetLinkData)=drOK Then
  692. With LinkData do
  693. CurrentEditor.InsertLink(LTarget,LText);
  694. end;
  695. finally
  696. L.Free;
  697. end;
  698. end;
  699. end;
  700. Procedure TMainForm.TableClick(Sender : TFPGtkObject; Data : Pointer);
  701. Var
  702. TableData : TTableData;
  703. begin
  704. With TTableForm.Create do
  705. begin
  706. Title:=SInsertTable;
  707. FTableRows.AsInteger:=3;
  708. FTableCols.AsInteger:=3;
  709. If Execute(Nil,@TableData,@GetTableData)=drOK Then
  710. With TableData do
  711. CurrentEditor.InsertTable(Cols,Rows,UseHeader);
  712. end;
  713. end;
  714. Function TMainForm.AllowClose : Boolean;
  715. Var
  716. P : TFPgtkWidget;
  717. begin
  718. P:=FPages.Page;
  719. Result:=True;
  720. While (P<>Nil) and Result do
  721. begin
  722. Result:=CloseEditor(P as TEditorPage);
  723. P:=FPages.Page;
  724. end;
  725. end;
  726. Function TMainForm.OnDeleteEvent(Sender:TFPgtkWidget; Event:PGdkEvent; data:pointer): boolean;
  727. begin
  728. Result:=Not AllowClose;
  729. end;
  730. Procedure TMainForm.OptionsClick(Sender : TFPGtkObject; Data : Pointer);
  731. begin
  732. With TOptionsForm.Create do
  733. Execute(Nil,Nil,Nil);
  734. end;
  735. Procedure TMainForm.HelpAboutClick(Sender : TFPGtkObject; Data : Pointer);
  736. begin
  737. With TAboutForm.Create do
  738. Execute(Nil,Nil,Nil);
  739. end;
  740. Type
  741. TRecentMenuItem = Class (TFPGtkMenuItem)
  742. FileName : String;
  743. end;
  744. Procedure TMainForm.FileReopen(Sender: TFPGTKObject;data : Pointer);
  745. begin
  746. OpenFile((Sender as TRecentMenuItem).FileName);
  747. end;
  748. procedure TMainForm.BuildReopenList;
  749. Function NewRecentMenuItem (Nr : Integer;AFileName : string) : TRecentMenuItem;
  750. begin
  751. If Nr<10 then
  752. result := TRecentMenuItem.CreateWithLabel('_'+IntToStr(Nr)+' '+AFileName)
  753. else
  754. result := TRecentMenuItem.CreateWithLabel(AFileName);
  755. result.FileName:=AFileName;
  756. Result.ConnectActivate(@FileReopen,Nil);
  757. end;
  758. var I : integer;
  759. mi : TFPgtkMenuItem;
  760. begin
  761. with FRecent do
  762. begin
  763. with FFileRecent do
  764. begin
  765. if assigned(SubMenu) then
  766. SubMenu.Free;
  767. SubMenu := TFPgtkMenu.Create;
  768. with (submenu as TFPgtkMenu) do
  769. for I := FRecent.count-1 downto 0 do
  770. begin
  771. mi := NewRecentMenuItem (I,FRecent[I]);
  772. Append (mi);
  773. end;
  774. end;
  775. end;
  776. end;
  777. end.