frmmain.pp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. {$mode objfpc}
  2. {$h+}
  3. unit frmmain;
  4. interface
  5. uses gdk,gtk,fpgtk,fpgtkext,classes,sysutils;
  6. Type
  7. TMainForm = Class(TFPGtkWindow)
  8. FModified : Boolean;
  9. FFileName : String;
  10. FUnitName : String;
  11. FLanguageID : Integer;
  12. FSubLanguageID : Integer;
  13. FVerbose,
  14. FCreateMsg,
  15. FCreatePas,
  16. FCreateRC,
  17. FEscapePath : Boolean;
  18. FMsgLabel : TFPgtkLabel;
  19. FMsgList : TFPgtkScrollList;
  20. FMsgVBox,
  21. FVBox : TFPGtkVBox;
  22. FVPaned : TFPgtkVPaned;
  23. FFile,
  24. FFileNew,
  25. FFileOpen,
  26. FFileSave,
  27. FFileSaveAs,
  28. FFileExit,
  29. FEdit,
  30. FEditCut,
  31. FEditCopy,
  32. FEditPaste,
  33. FProject,
  34. FProjectCompile,
  35. FProjectOptions,
  36. FHelp,
  37. FHelpAbout : TFPGtkMenuItem;
  38. FMainMenu : TFPGtkMenuBar;
  39. FEditor : TFPGtkScrollText;
  40. Procedure CreateWindow;
  41. Function CheckSaved : Boolean;
  42. Procedure SetCaption;
  43. Function GetFileName(ATitle : String) : String;
  44. // Callback functions.
  45. Procedure DialogSetFilename(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  46. Procedure SaveOptions(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  47. Function OnDeleteEvent(Sender:TFPgtkWidget; Event:PGdkEvent; data:pointer): boolean;
  48. Procedure FileNewClick(Sender : TFPGtkObject; Data : Pointer);
  49. Procedure FileSaveClick(Sender : TFPgtkObject; Data : Pointer);
  50. Procedure FileSaveAsClick(Sender : TFPGtkObject; Data : Pointer);
  51. Procedure FileOpenClick(Sender : TFPGtkObject; Data : Pointer);
  52. Procedure FileExitClick(Sender : TFPgtkObject ; Data : Pointer);
  53. Procedure EditCCPClick(Sender : TFPGtkObject; Data : Pointer);
  54. Procedure ProjectCompileClick(Sender : TFPGtkObject; Data : Pointer);
  55. Procedure ProjectOptionsClick(Sender : TFPGtkObject; Data : Pointer);
  56. Procedure HelpAboutClick(Sender : TFPGtkObject; Data : Pointer);
  57. Procedure EditorChanged(Sender : TFPgtkObject; Data : Pointer);
  58. Procedure DoError(Sender : TObject; Msg : String);
  59. Procedure DoVerbose(Sender : TObject; Msg : String);
  60. Public
  61. Constructor Create;
  62. Procedure Compile;
  63. Procedure SetOptions;
  64. Procedure LoadFromFile(FN : String);
  65. Procedure SaveToFile(FN : String);
  66. Procedure NewFile;
  67. Procedure EditCut;
  68. Procedure EditCopy;
  69. Procedure EditPaste;
  70. Property Modified : Boolean Read FModified;
  71. Property FileName : String Read FFileName;
  72. end;
  73. Implementation
  74. uses frmabout,frmoptions,msgcomp;
  75. ResourceString
  76. SMenuFile = '_File';
  77. SMenuFileNew = '_New';
  78. SMenuFileOpen = '_Open';
  79. SMenuFileSave = '_Save';
  80. SMenuFileSaveAs = 'Save _as';
  81. SMenuFileExit = 'E_xit';
  82. SMenuEdit = '_Edit';
  83. SMenuEditCut = 'C_ut';
  84. SMenuEditCopy = '_Copy';
  85. SMenuEditPaste = '_Paste';
  86. SMenuProject = '_Project';
  87. SMenuProjectCompile = '_Compile';
  88. SMenuProjectoptions = '_Options';
  89. SMenuHelp = '_Help';
  90. SMenuHelpAbout = '_About';
  91. SCaption = 'Free Pascal message compiler';
  92. SFileModified = 'File has changed. Save changes ?';
  93. SSaveFile = 'Save file as';
  94. SOpenFile = 'Select file to open';
  95. SModified = '(modified)';
  96. SCompilerMessages = 'Compile messages';
  97. SErrsCompiling = 'Encountered %d errors while compiling.';
  98. SSuccesCompiling = 'Succesfully compiled messages.';
  99. SErrUnexpected = 'The following unexpected error occurred when compiling:%s';
  100. { ---------------------------------------------------------------------
  101. Form Creation
  102. ---------------------------------------------------------------------}
  103. Constructor TMainForm.Create;
  104. begin
  105. Inherited create (gtk_window_dialog);
  106. FCreateMsg:=True;
  107. FCreatePas:=True;
  108. FCreateRC:=True;
  109. FEscapePath:=True;
  110. FVerbose:=True;
  111. Createwindow;
  112. If ParamCount>0 then
  113. LoadFromFile(Paramstr(1));
  114. end;
  115. Procedure TMainForm.CreateWindow;
  116. Var
  117. FAccelGroup : Integer;
  118. begin
  119. FVBox:=TFPgtkVBox.Create;
  120. FAccelGroup:=AccelGroupNew;
  121. FFileNew:=NewMenuItem(SMenuFileNew,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_N,[amcontrol]),@FileNewClick,Nil);
  122. FFileOpen:=NewMenuItem(SMenuFileOpen,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_O,[amcontrol]),@FileOpenClick,Nil);
  123. FFileSave:=NewMenuItem(SMenuFileSave,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_S,[amcontrol]),@FileSaveClick,Nil);
  124. FFileSaveAs:=NewMenuItem(SMenuFileSaveAs,'','', @FileSaveAsClick,Nil);
  125. FFileExit:=NewMenuItem(SMenuFileExit,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_Q,[amcontrol]),@FileExitClick,Nil);
  126. FFile:=NewSubMenu(SmenuFile,'','',[FFileNew,FFileOpen,FFileSave,FFileSaveAs,NewLine,FFileExit]);
  127. FEditCut:=NewMenuItem(SMenuEditCut,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_X,[amcontrol]),@EditCCPClick,Nil);
  128. FEditCopy:=NewMenuItem(SMenuEditCopy,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_C,[amcontrol]),@EditCCPClick,Nil);
  129. FEditPaste:=NewMenuItem(SMenuEditPaste,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_V,[amcontrol]),@EditCCPClick,Nil);
  130. FEdit:=NewSubMenu(SMenuEdit,'','',[FEditCut,FEditCopy,FEditPaste]);
  131. FProjectCompile:=NewMenuItem(SMenuProjectCompile,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_F9,[amcontrol]),@ProjectCompileClick,Nil);
  132. FProjectOptions:=NewMenuItem(SMenuProjectOptions,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_F11,[amcontrol,amshift]),@ProjectOptionsClick,Nil);
  133. FProject := NewSubMenu(SMenuProject,'','',[FProjectCompile,FProjectoptions]);
  134. FHelpAbout:=NewMenuItem(SMenuHelpAbout ,'','',@HelpAboutClick,Nil);
  135. FHelp := NewSubMenu(SMenuHelp,'','',[FHelpAbout]);
  136. FMainMenu:=NewMenuBar([FFile,FEdit,FProject,FHelp]);
  137. FEditor:=TFPgtkScrollText.Create;
  138. Feditor.TheText.ConnectChanged(@EditorChanged,Nil);
  139. // Compiling messages
  140. FMsgLabel:=TFPgtkLabel.Create(SCompilerMessages);
  141. FMsgList:=TFPgtkScrollList.Create;
  142. FMsgVBox:=TFPgtkVbox.Create;
  143. FMsgVBox.PackStart(FMsgLabel,False,False,0);
  144. FMsgVBox.PackStart(FMsgList,True,True,0);
  145. FVPaned:=TFPgtkVPaned.Create;
  146. FVPaned.Add1(FEditor);
  147. FVPaned.Add2(FMsgVBox);
  148. FVPaned.Position:=350;
  149. FVBox.PackStart(FmainMenu,False,False,0);
  150. FVBox.PackStart(FVPaned,true, true, 0);
  151. ConnectDeleteEvent(@OnDeleteEvent,Nil);
  152. Add(FVBox);
  153. SetUSize(640,480);
  154. SetCaption;
  155. FEditor.TheText.GrabFocus;
  156. end;
  157. { ---------------------------------------------------------------------
  158. Callback events
  159. ---------------------------------------------------------------------}
  160. Procedure TMainForm.FileNewClick(Sender : TFPGtkObject; Data : Pointer);
  161. begin
  162. If CheckSaved then
  163. NewFile;
  164. end;
  165. Function TMainForm.OnDeleteEvent(Sender:TFPgtkWidget; Event:PGdkEvent; data:pointer): boolean;
  166. begin
  167. Result:=Not CheckSaved;
  168. end;
  169. Procedure TMainForm.FileSaveClick(Sender : TFPgtkObject; Data : Pointer);
  170. begin
  171. If (FFileName='') then
  172. FileSaveAsClick(Sender,Data)
  173. else
  174. SaveToFile(FFileName);
  175. end;
  176. Procedure TMainForm.FileSaveAsClick(Sender : TFPGtkObject; Data : Pointer);
  177. Var
  178. FN : String;
  179. begin
  180. FN:=GetFileName(SSaveFile);
  181. If (FN<>'') then
  182. SavetoFile(FN);
  183. end;
  184. Procedure TMainForm.FileOpenClick(Sender : TFPGtkObject; Data : Pointer);
  185. Var
  186. FN : String;
  187. begin
  188. FN:=GetFileName(SOpenFile);
  189. If (FN<>'') then
  190. LoadFromFile(FN);
  191. end;
  192. Procedure TMainForm.EditorChanged(Sender : TFPgtkObject; Data : Pointer);
  193. begin
  194. If FModified<>True then
  195. begin
  196. FModified:=True;
  197. SetCaption;
  198. end;
  199. end;
  200. Procedure TMainForm.EditCCPClick(Sender : TFPGtkObject; Data : Pointer);
  201. begin
  202. If Sender=FEditCut then
  203. EditCut
  204. else if Sender=FEditCopy then
  205. EditCopy
  206. else
  207. EditPaste;
  208. end;
  209. Procedure TMainForm.FileExitClick(Sender : TFPgtkObject; Data : Pointer);
  210. begin
  211. If CheckSaved then
  212. Close;
  213. end;
  214. Procedure TMainForm.HelpAboutClick(Sender : TFPGtkObject; Data : Pointer);
  215. begin
  216. With TAboutForm.Create do
  217. Execute(Nil,Nil,Nil);
  218. end;
  219. Procedure TMainForm.ProjectCompileClick(Sender : TFPGtkObject; Data : Pointer);
  220. begin
  221. Compile;
  222. end;
  223. Procedure TMainForm.ProjectOptionsClick(Sender : TFPGtkObject; Data : Pointer);
  224. begin
  225. SetOptions;
  226. end;
  227. Procedure TMainform.DoError(Sender : TObject; Msg : String);
  228. begin
  229. FMsgList.list.Add(TFPGtkListItem.CreateWithLabel(Msg));
  230. end;
  231. Procedure TMainform.DoVerbose(Sender : TObject; Msg : String);
  232. begin
  233. FMsgList.list.Add(TFPGtkListItem.CreateWithLabel(Msg));
  234. end;
  235. { ---------------------------------------------------------------------
  236. Auxiliary methods
  237. ---------------------------------------------------------------------}
  238. Procedure TMainForm.SetCaption;
  239. Var
  240. S : String;
  241. begin
  242. S:=SCaption;
  243. If (FFileName<>'') then
  244. S:=S+' : '+ExtractFileName(FFileName);
  245. If FModified then
  246. S:=S+' '+SModified;
  247. Title:=S;
  248. end;
  249. Function TMainForm.CheckSaved : Boolean;
  250. begin
  251. Result:=Not FModified;
  252. If Not Result then
  253. Case MessageDlg(SFileModified,mtInformation,mbYesNoCancel,0) of
  254. mrYes : begin
  255. FileSaveClick(Self,Nil);
  256. Result:=True;
  257. end;
  258. mrNo : Result:=True;
  259. mrCancel : Result:=False;
  260. end;
  261. end;
  262. Function TMainForm.GetFileName(ATitle : String) : String;
  263. var
  264. FS : TFPgtkFileSelection;
  265. begin
  266. Result:='';
  267. FS := TFPgtkFileSelection.Create (gtk_window_dialog);
  268. with FS do
  269. begin
  270. Title:=ATitle;
  271. OKButton.ConnectClicked (@(CloseWithResult), inttopointer(drOk));
  272. CancelButton.ConnectClicked (@(CloseWindow), nil);
  273. if Not execute (nil, @Result, @DialogSetFilename) = drOk then
  274. Result:='';
  275. end;
  276. end;
  277. Procedure TMainForm.DialogSetFilename(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  278. type
  279. PString = ^AnsiString;
  280. begin
  281. PString(Data)^:=(Sender as TFPgtkFileSelection).Filename;
  282. end;
  283. { ---------------------------------------------------------------------
  284. Public methods
  285. ---------------------------------------------------------------------}
  286. Procedure TMainForm.LoadFromFile(FN : String);
  287. Var
  288. S : TStringList;
  289. begin
  290. S:=TStringList.Create;
  291. try
  292. S.LoadFromFile(FN);
  293. FEditor.TheText.Text:=S.Text;
  294. FModified:=False;
  295. Finally
  296. S.Free;
  297. end;
  298. FFileName:=FN;
  299. SetCaption;
  300. end;
  301. Procedure TMainForm.SaveToFile(FN : String);
  302. begin
  303. FFileName:=FN;
  304. FEditor.TheText.Lines.SaveToFile(FN);
  305. FModified:=False;
  306. SetCaption;
  307. end;
  308. Procedure TMainForm.EditCut;
  309. begin
  310. FEditor.TheText.CutClipBoard;
  311. end;
  312. Procedure TMainForm.EditCopy;
  313. begin
  314. FEditor.TheText.CopyCLipBoard;
  315. end;
  316. Procedure TMainForm.EditPaste;
  317. begin
  318. FEditor.TheText.PasteClipBoard;
  319. end;
  320. Procedure TMainForm.NewFile;
  321. begin
  322. Feditor.TheText.Clear;
  323. end;
  324. Procedure TMainForm.Compile;
  325. Var
  326. M,P,R,I : TStream;
  327. S,MsgFileName : String;
  328. Procedure SetupStreams;
  329. begin
  330. I:=TFileStream.Create(FFileName,fmOpenRead);
  331. If FCreatePas then
  332. P:=TFileStream.Create(ChangeFileExt(FFileName,'.pp'),fmCreate);
  333. If FCreateMsg then
  334. begin
  335. MsgFileName:=ChangeFileExt(FFileName,'.msg');
  336. M:=TFileStream.Create(MsgFileName,fmCreate);
  337. end;
  338. If FCreateRC then
  339. R:=TFileStream.Create(ChangeFileExt(FFileName,'.rc'),fmCreate);
  340. end;
  341. Procedure CloseStreams;
  342. begin
  343. M.Free;
  344. P.Free;
  345. R.Free;
  346. I.Free;
  347. end;
  348. begin
  349. FileSaveClick(Self,Nil);
  350. If (FUnitName='') then
  351. FUnitName:=ExtractFileName(FFileName);
  352. FMsgList.List.ClearAll;
  353. Try
  354. SetupStreams;
  355. Try
  356. With TMessageCompiler.Create do
  357. Try
  358. Msg:=M;
  359. MC:=I;
  360. RC:=R;
  361. Pas:=P;
  362. OnError:=@DoError;
  363. If FVerbose then
  364. OnVerbose:=@DoVerbose;
  365. UnitName:=FUnitName;
  366. MessageFileName:=MsgFileName;
  367. EscapeNeeded:=FEscapePath;
  368. If (FLanguageID<>-1) then
  369. LocaleID:=FLanguageID;
  370. If (FSubLanguageID<>-1) then
  371. SubLocaleID:=FSubLanguageID;
  372. If Compile then
  373. DoVerbose(Nil,SSuccesCompiling)
  374. else
  375. begin
  376. S:=Format(SErrsCompiling,[Errors]);
  377. DoVerbose(Nil,S);
  378. MessageDlg(S,mtError,[mbOK],0);
  379. end;
  380. Finally
  381. Free;
  382. end;
  383. Finally
  384. CloseStreams;
  385. end;
  386. except
  387. On E : Exception do
  388. MessageDlg(SErrUnexpected,[E.Message],mtError,[mbOK],0);
  389. end;
  390. end;
  391. Procedure TMainForm.SaveOptions(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
  392. begin
  393. With TOptionsForm(Data) do
  394. begin
  395. FUnitName:=UnitName;
  396. FLanguageID:=StrToIntDef(Trim(Locale),0);
  397. FSubLanguageID:=StrToIntDef(Trim(SubLocale),0);
  398. FVerbose:=Verbose;
  399. FCreateMsg:=CreateMsgFile;
  400. FCreatePas:=CreatePasFile;
  401. FCreateRC:=CreateRCFile;
  402. FEscapePath:=EscapePath;
  403. end;
  404. end;
  405. Procedure TMainForm.SetOptions;
  406. Var
  407. F : TOptionsForm;
  408. begin
  409. If (FUnitName='') and (FFileName<>'') then
  410. FUnitName:=ExtractFileName(FFileName);
  411. F:=TOptionsForm.Create;
  412. With F do
  413. begin
  414. UnitName:=FUnitName;
  415. Locale:=IntToStr(FLanguageID);
  416. SubLocale:=IntToStr(FSubLanguageID);
  417. Verbose:=Fverbose;
  418. CreateMsgFile:=FCreateMsg;
  419. CreatePasFile:=FCreatePas;
  420. CreateRCFile:=FCreateRC;
  421. EscapePath:=FEscapePath;
  422. Execute(Nil,F,@SaveOptions);
  423. end;
  424. end;
  425. end.