gtkeditor.pp 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435
  1. {$mode objfpc}{$h+}
  2. unit GtkEditor;
  3. interface
  4. {__$define debug}
  5. uses sysutils, classes,
  6. glib, gdk, gtk, FPGtk, FPgtkExt,
  7. buttonrow, ObjectDef, SettingsRec;
  8. type
  9. TGtkEditorWindow = class (TFPgtkWindow)
  10. private
  11. FSettings : TSettingsRec;
  12. { widgets in the window }
  13. // visual arrangement
  14. LObjects, LProperties, LParams : TFPgtkScrollCList;
  15. BrObjects, BrProperties, BrParams : TButtonRow;
  16. PObject, PProperty, PParam : TFPgtkHPaned;
  17. FDefinition, FObject, FProperty : TFPgtkFrame;
  18. FParam : TFPgtkBox;
  19. // definition
  20. DUnitName, DGtkPrefix, DUsesList : TFPgtkentry;
  21. // object
  22. OName, OInherit, OGtkName, OGtkFuncName, OCreateParams : TFPgtkentry;
  23. OCreateObject, OWithPointer : TFPgtkToggleButton;
  24. // property
  25. PType : TFPgtkOptionMenu; // Or TFPgtkCombo
  26. Bladen : TFPgtkNotebook;
  27. BDefinition, BParameter, BRead, BWrite, BFunction, BCode : TFPgtkWidget;
  28. // definition
  29. PName, PPascalType, PGtkName : TFPgtkEntry;
  30. PSection : TFPgtkOptionMenu; // Or TFPgtkCombo
  31. // parameter
  32. ParamName, ParamPascalType : TFPgtkentry;
  33. ParamType : TFPgtkOptionmenu; // Or TFPgtkCombo
  34. ParamConvert : TFPgtkToggleButton;
  35. // read
  36. PRType : TFPgtkOptionMenu;
  37. PRGtkName : TFPgtkEntry;
  38. PRCode : TFPgtkScrollText;
  39. PRConvert : TFPgtkToggleButton;
  40. // write
  41. PWType : TFPgtkOptionMenu;
  42. PWGtkName : TFPgtkEntry;
  43. PWCode : TFPgtkScrollText;
  44. PWConvert : TFPgtkToggleButton;
  45. // function
  46. POverride, PVirtual, PDynamic,
  47. PAbstract, PCDecl, POverload,
  48. PReintroduce : TFPgtkTogglebutton;
  49. PFCode : TFPgtkScrollText;
  50. // Code
  51. PCode : TFPgtkScrollText;
  52. { CollectionItems that are currently shown }
  53. ciObject : TObjectItem;
  54. ciProperty : TPropertyItem;
  55. ciParameter : TParameterItem;
  56. { Defs Property }
  57. FDefs : TObjectDefs;
  58. { entry saving procedures/signals }
  59. // Definition
  60. procedure ChangedDUsesList (Sender:TFPgtkObject; data:pointer);
  61. procedure ChangedDUnitName (Sender:TFPgtkObject; data:pointer);
  62. procedure ChangedDGtkPrefix (Sender:TFPgtkObject; data:pointer);
  63. // Object
  64. procedure ChangedOName (Sender:TFPgtkObject; data:pointer);
  65. procedure ChangedOInherit (Sender:TFPgtkObject; data:pointer);
  66. procedure ChangedOGtkName (Sender:TFPgtkObject; data:pointer);
  67. procedure ChangedOGtkFuncName (Sender:TFPgtkObject; data:pointer);
  68. procedure ChangedOCreateParams (Sender:TFPgtkObject; data:pointer);
  69. procedure ChangedOCreateObject (Sender:TFPgtkObject; data:pointer);
  70. procedure ChangedOWithPointer (Sender:TFPgtkObject; data:pointer);
  71. // Property
  72. procedure ChangedPType (Sender:TFPgtkObject; data:pointer);
  73. procedure ChangedPName (Sender:TFPgtkObject; data:pointer);
  74. procedure ChangedPPascalType (Sender:TFPgtkObject; data:pointer);
  75. procedure ChangedPGtkName (Sender:TFPgtkObject; data:pointer);
  76. procedure ChangedPSection (Sender:TFPgtkObject; data:pointer);
  77. // parameter
  78. procedure ChangedParamName (Sender:TFPgtkObject; data:pointer);
  79. procedure ChangedParamPascalType (Sender:TFPgtkObject; data:pointer);
  80. procedure ChangedParamType (Sender:TFPgtkObject; data:pointer);
  81. procedure ChangedParamConvert (Sender:TFPgtkObject; data:pointer);
  82. // read
  83. procedure ChangedPRType (Sender:TFPgtkObject; data:pointer);
  84. procedure ChangedPRConvert (Sender:TFPgtkObject; data:pointer);
  85. // write
  86. procedure ChangedPWType (Sender:TFPgtkObject; data:pointer);
  87. procedure ChangedPWGtkName (Sender:TFPgtkObject; data:pointer);
  88. procedure ChangedPWCode (Sender:TFPgtkObject; data:pointer);
  89. procedure ChangedPWConvert (Sender:TFPgtkObject; data:pointer);
  90. // function
  91. procedure ChangedPFuncType (Sender:TFPgtkObject; data:pointer);
  92. // Code
  93. procedure ChangedPCode (Sender:TFPgtkObject; data:pointer);
  94. { Showing procedures }
  95. RefreshingParam, RefreshingProperty, RefreshingObject, RefreshingDefinition : boolean;
  96. PropPixs : array [0..13] of PGdkPixmap;
  97. PropMasks : array [0..13] of PGdkBitmap;
  98. procedure CreatePixMaps;
  99. procedure PropertyIcon (Item:TCollectionItem; var Pixmap:PGdkPixMap; var mask:PGdkBitmap);
  100. procedure EnDisablePages (pt : TPropType);
  101. procedure RefreshParam (Selected : TCollectionItem; NeedFocus:boolean);
  102. procedure RefreshProperty (Selected : TCollectionItem; NeedFocus:boolean);
  103. procedure RefreshObject (Selected : TCollectionItem; NeedFocus:boolean);
  104. procedure RefreshDefinition;
  105. procedure ObjectDisplayChanged;
  106. procedure PropertyDisplayChanged;
  107. procedure ParamDisplayChanged;
  108. procedure ComposeWindow;
  109. { File and menu handling }
  110. FFileName : string;
  111. HasAFile : boolean;
  112. FReopenList : TStrings;
  113. MenuEditObject, MenuEditProperty, MenuEditParameter,
  114. MenuFileReopen : TFPgtkMenuItem;
  115. AccelGroup : integer;
  116. procedure NewFilename (NewName : string);
  117. procedure BuildReopenList;
  118. procedure DataRead (filename : string);
  119. procedure DataWrite (filename : string);
  120. procedure Generate;
  121. { Menu signals }
  122. procedure FileNew (Sender : TFPgtkObject; data : pointer);
  123. procedure FileOpen (Sender : TFPgtkObject; data : pointer);
  124. procedure FileSave (Sender : TFPgtkObject; data : pointer);
  125. procedure FileSaveAs (Sender : TFPgtkObject; data : pointer);
  126. procedure FileExit (Sender : TFPgtkObject; data : pointer);
  127. procedure ToolsGenerate (Sender : TFPgtkObject; data : pointer);
  128. procedure ToolsOptions (Sender : TFPgtkObject; data : pointer);
  129. procedure HelpInfo (Sender : TFPgtkObject; data : pointer);
  130. procedure HelpAbout (Sender : TFPgtkObject; data : pointer);
  131. procedure ToolbarReopen (Sender : TFpgtkObject; data : pointer);
  132. { Dialog Procedures }
  133. procedure DialogSetFilename (Sender:TFPgtkWindow;
  134. aDialogResult:pointer; Action:integer; initiator:TFPgtkObject);
  135. procedure FileReopen (Sender : TFPgtkObject; data : pointer);
  136. { Settings procedures }
  137. procedure ReadSettings;
  138. procedure WriteSettings (Sender : TFPgtkObject; data : pointer);
  139. public
  140. constructor create;
  141. destructor Destroy; override;
  142. end;
  143. implementation
  144. uses XPMs, GtkDefTexts, inifiles, ProgWin;
  145. Type
  146. TRightLabel = class (TFPgtkLabel)
  147. public
  148. constructor create(aText : string);
  149. end;
  150. constructor TRightLabel.Create (aText : string);
  151. begin
  152. inherited create (aText);
  153. XAlign := 1;
  154. end;
  155. { TGtkEditorWindow }
  156. { *** Creation of window *** }
  157. const
  158. gtk_all = gtk_fill + gtk_expand + gtk_Shrink;
  159. gtk_NoExp = gtk_fill + gtk_shrink;
  160. constructor TGtkEditorWindow.Create;
  161. begin
  162. inherited Create (Gtk_Window_TopLevel);
  163. SetUSize (800, 500);
  164. MenuFileReopen := nil;
  165. MenuEditObject := nil;
  166. MenuEditProperty := nil;
  167. MenuEditParameter := nil;
  168. Title := sEditorTitle;
  169. ciObject := nil;
  170. ciProperty := nil;
  171. ciParameter := nil;
  172. FDefs := nil;
  173. CreatePixmaps;
  174. ComposeWindow;
  175. FReopenList := TStringList.Create;
  176. ReadSettings;
  177. ConnectDestroy (@WriteSettings, @FSettings);
  178. end;
  179. destructor TGtkEditorWindow.Destroy;
  180. begin
  181. FReopenList.Free;
  182. end;
  183. procedure TGtkEditorWindow.ComposeWindow;
  184. var b, b1 : TFPgtkBox;
  185. t : TFPgtkTable;
  186. m : TFPgtkMenuBar;
  187. mlist : TFPgtkItemGroup;
  188. F : TFPgtkFrame;
  189. tb : TFPgtkToolbar;
  190. //pm : TFPgtkPixmap;
  191. but : TFPgtkButton;
  192. AG : PGtkAccelGroup;
  193. begin
  194. AccelGroup := AccelGroupNew;
  195. AG := AccelGroups[AccelGroup];
  196. b := TFPgtkVBox.Create;
  197. Add (b);
  198. //writeln ('------->> Menu');
  199. MenuEditObject := NewSubMenu (smEditObject, '', '', nil, []);
  200. MenuEditProperty := NewSubMenu (smEditProperty, '', '', nil, []);
  201. MenuEditParameter := NewSubMenu (smEditParameter, '', '', nil, []);
  202. MenuFileReopen := NewSubMenu (smFileReopen, '', '', nil, []);
  203. m := NewMenuBar ([
  204. NewSubMenu (smFile, '', '', MakeAccelKeyDef(AG,Gdk_F,[amAlt]), [
  205. NewMenuItem (smFileNew, '', '', MakeAccelKeyDef(AG,Gdk_N,[amControl]), @FileNew, nil),
  206. NewMenuItem (smFileOpen, '', '', MakeAccelKeyDef(AG,Gdk_L,[amControl]), @FileOpen, nil),
  207. MenuFileReopen,
  208. NewMenuItem (smFileSave, '', '', MakeAccelKeyDef(AG,Gdk_S,[amControl]), @FileSave, nil),
  209. NewMenuItem (smFileSaveAs, '', '', MakeAccelKeyDef(AG,Gdk_A,[amControl]), @FileSaveAs, nil),
  210. NewLine,
  211. NewMenuItem (smFileExit, '', '', MakeAccelKeyDef(AG,Gdk_W,[amControl]), @FileExit, nil)]),
  212. NewSubMenu (smEdit, '', '', MakeAccelKeyDef(AG,Gdk_E,[amAlt]), [
  213. MenuEditObject, MenuEditProperty, MenuEditParameter]),
  214. NewSubMenu (smTools, '', '', MakeAccelKeyDef(AG,Gdk_T,[amAlt]), [
  215. NewMenuItem (smToolsGenerate, '', '', MakeAccelKeyDef(AG,Gdk_G,[amControl]), @ToolsGenerate, nil),
  216. NewMenuItem (smToolsOptions, '', '', MakeAccelKeyDef(AG,Gdk_O,[amControl]), @ToolsOptions, nil)]),
  217. NewSubMenu (smHelp, '', '', MakeAccelKeyDef(AG,Gdk_H,[amAlt]), [
  218. NewMenuItem (smHelpInfo, '', '', MakeAccelKeyDef(AG,Gdk_I,[amControl]), @HelpInfo, nil),
  219. NewMenuItem (smHelpAbout, '', '', MakeAccelKeyDef(AG,Gdk_B,[amControl]), @HelpAbout, nil)])
  220. ]);
  221. b.PackStart (m, false, false, 0);
  222. //writeln ('------->> Toolbar');
  223. tb := TFPgtkToolbar.Create;
  224. b.PackStart (tb, false, false, 0);
  225. b.Packstart (TFPgtkHSeparator.Create, false, false, 0);
  226. with tb do
  227. begin
  228. ButtonRelief := Gtk_Relief_None;
  229. AppendSpace;
  230. AppendItem ('', RemoveUnderscore(smFileNew), '', XPMFileNew, @FileNew, nil);
  231. AppendSpace;
  232. AppendItem ('', RemoveUnderscore(smFileOpen), '', XPMFileOpen, @FileOpen, nil);
  233. but := TFPgtkButton.Create;
  234. with but do
  235. begin
  236. ConnectClicked (@ToolbarReopen, nil);
  237. Add (TFPgtkArrow.Create(GTK_Arrow_Down, GTK_Shadow_Out));
  238. CanFocus := False;
  239. ReliefStyle := GTK_RELIEF_NONE;
  240. SetUsize (15, 22);
  241. end;
  242. AppendWidget (but, RemoveUnderscore(smFileReopen), '');
  243. AppendSpace;
  244. AppendItem ('', RemoveUnderscore(smFileSave), '', XPMFileSave, @FileSave, nil);
  245. AppendSpace;
  246. AppendItem ('', RemoveUnderscore(smToolsGenerate), '', XPMGenerate, @ToolsGenerate, nil);
  247. end;
  248. //writeln ('------->> Panels and lists');
  249. FDefinition := TFPgtkFrame.Create;
  250. FDefinition.Text := sComponent;
  251. b.PackStart (FDefinition, false, true, 0);
  252. PObject := TFPgtkHPaned.Create;
  253. b.packStart (PObject, true, true, 0);
  254. LObjects := TFPgtkScrollCList.Create (1);
  255. LObjects.SetUsize (120,40);
  256. b1 := TFPgtkVBox.Create;
  257. BrObjects := TButtonRow.Create;
  258. BrObjects.Title := 'Objects buttonrow';
  259. b1.PackEnd (BrObjects, false, false, 0);
  260. b1.PackEnd (LObjects);
  261. PObject.Add1 (b1);
  262. b := TFPgtkVBox.create;
  263. PObject.Add2 (b);
  264. FObject := TFPgtkFrame.Create;
  265. FObject.Text := SObject;
  266. b.PackStart (FObject, false, true, 0);
  267. PProperty := TFPgtkHPaned.Create;
  268. B.PackStart (PProperty, true, true, 0);
  269. LProperties := TFpgtkScrollCList.Create (2);
  270. LProperties.SetUSize (180,30);
  271. b1 := TFPgtkVBox.Create;
  272. BrProperties := TButtonRow.Create;
  273. BrProperties.Title := 'Properties buttonrow';
  274. b1.PackEnd (BrProperties, false, false, 0);
  275. b1.PackEnd (LProperties);
  276. PProperty.Add1 (b1);
  277. FProperty := TFPgtkFrame.Create;
  278. FProperty.Text := SProperty;
  279. PProperty.Add2 (FProperty);
  280. PProperty.ComputePosition (40, 20, 20);
  281. PObject.ComputePosition (40, 20, 20);
  282. //writeln ('------->> Definition');
  283. t := TFPgtkTable.create (6,1);
  284. t.ColSpacings := 3;
  285. t.attach (TFPgtkLabel.Create(sUnitName), 0,1, 0,1, gtk_NoExp, gtk_fill, 3,0);
  286. DUnitName := TFPgtkEntry.create;
  287. DUnitName.ConnectChanged (@ChangedDUnitName, nil);
  288. t.attach (DUnitName, 1,2, 0,1, gtk_all, gtk_fill, 0,0);
  289. t.attach (TFPgtkLabel.Create (sGtkPrefix), 2,3, 0,1, gtk_NoExp, gtk_fill, 3,0);
  290. DGtkPrefix := TFPgtkentry.create;
  291. DGtkPrefix.ConnectChanged (@ChangedDGtkPrefix, nil);
  292. t.attach (DGtkPrefix, 3,4, 0,1, gtk_all, gtk_fill, 0,0);
  293. t.attach (TFPgtkLabel.Create(sUsesList), 4,5, 0,1, gtk_NoExp, gtk_fill, 3,0);
  294. DUsesList := TFPgtkEntry.create;
  295. DUsesList.ConnectChanged (@ChangedDUsesList, nil);
  296. t.attach (DUsesList, 5,6, 0,1, gtk_all, gtk_fill, 0,0);
  297. FDefinition.Add (t);
  298. //writeln ('------->> Object');
  299. t := tFPgtkTable.Create (5,3);
  300. t.ColSpacings := 3;
  301. FObject.Add (t);
  302. t.attach (TRightLabel.create(sName), 0,1, 0,1, gtk_noExp, gtk_fill, 3,0);
  303. OName := TFPgtkentry.create;
  304. OName.ConnectChanged (@ChangedOName, nil);
  305. t.attach (OName, 1,2, 0,1);
  306. t.attach (TRightLabel.create(sInherits), 0,1, 1,2, gtk_noExp, gtk_fill, 3,0);
  307. OInherit := TFPgtkentry.create;
  308. OInherit.ConnectChanged (@ChangedOInherit, nil);
  309. t.attach (OInherit, 1,2, 1,2);
  310. t.attach (TRightLabel.create(sGtkName), 0,1, 2,3, gtk_noExp, gtk_fill, 3,0);
  311. OGtkName := TFPgtkentry.create;
  312. OGtkName.ConnectChanged (@ChangedOGtkName, nil);
  313. t.attach (OGtkName, 1,2, 2,3);
  314. t.SetOneColSpacing (1,7);
  315. OCreateObject := TFPgtkCheckedButton.createWithLabel (sCreateObject);
  316. OCreateObject.ConnectClicked (@ChangedOCreateObject, nil);
  317. t.attach (OCreateObject, 3,4, 0,1);
  318. OWithPointer := TFPgtkCheckedButton.createWithLabel (sWithPointer);
  319. OWithPointer.ConnectClicked (@ChangedOWithPointer, nil);
  320. t.attach (OWithPointer, 4,5, 0,1);
  321. t.attach (TRightLabel.create(sCreateParams), 2,3, 1,2, gtk_noExp, gtk_fill, 3,0);
  322. OCreateParams := TFPgtkentry.create;
  323. OCreateParams.ConnectChanged (@ChangedOCreateParams, nil);
  324. t.attach (OCreateParams, 3,5, 1,2, gtk_all, gtk_fill, 0,0);
  325. t.attach (TRightLabel.create(sGtkFunctionName), 2,3, 2,3, gtk_noExp, gtk_fill, 3,0);
  326. OGtkFuncName := TFPgtkentry.create;
  327. OGtkFuncName.ConnectChanged (@ChangedOGtkFuncName, nil);
  328. t.attach (OGtkFuncName, 3,5, 2,3, gtk_all, gtk_fill, 0,0);
  329. //writeln ('------->> Property');
  330. mlist := TFPgtkItemGroup.Create (TFPgtkMenuItem);
  331. b := TFPgtkVBox.Create;
  332. FProperty.Add (b);
  333. b1 := TFPgtkHBox.Create;
  334. b.PackStart (b1, false, true, 0);
  335. b1.PackStart (TFPgtkLabel.Create(sType), false, true, 3);
  336. mlist.FillFromArray ([sField, sProperty,sFunction,sProcedure,sSignal,sHelperproc,
  337. sHelperFunc,sSignalType,sDeclarations,sTypeDecl,sConstructor,
  338. sDestructor, sInitialization, sFinalization]);
  339. PType := TFPgtkOptionMenu.Create;
  340. with PType do
  341. begin
  342. menu := TFPgtkMenu.Create;
  343. setUsize (70, 26);
  344. AppendMenuItemGroup (menu, mlist, @ChangedPType, nil);
  345. end;
  346. mlist.Clear;
  347. b1.PackStart (PType, true, true,0);
  348. bladen := TFPgtkNotebook.Create;
  349. // bladen.Homogenous := True;
  350. // bladen.Scrollable := false;
  351. b.PackStart (bladen, true, true, 0);
  352. // defintion
  353. //writeln ('------->> Property Definition');
  354. t := TFPgtkTable.Create (2, 4);
  355. t.attach (TRightLabel.Create(sName), 0,1, 0,1, gtk_noExp, gtk_fill, 3,0);
  356. PName := TFPgtkEntry.create;
  357. PName.ConnectChanged (@ChangedPName, nil);
  358. t.attach (PName, 1,2, 0,1);
  359. t.attach (TRightLabel.Create(sPascalType), 0,1, 1,2, gtk_noExp, gtk_fill, 3,0);
  360. PPascalType := TFPgtkEntry.create;
  361. PPascalType.ConnectChanged (@ChangedPPascalType, nil);
  362. t.attach (PPascalType, 1,2, 1,2);
  363. t.attach (TRightLabel.Create(sSection), 0,1, 2,3, gtk_noExp, gtk_fill, 3,0);
  364. PSection := TFPgtkOptionMenu.create;
  365. mlist.FillFromArray ([sPrivate, sProtected, sPublic, sPublished]);
  366. with PSection do
  367. begin
  368. menu := TFPgtkMenu.Create;
  369. AppendMenuItemGroup (menu, mlist, @ChangedPSection, nil);
  370. setUsize (60,26);
  371. end;
  372. mlist.Clear;
  373. t.attach (PSection, 1,2, 2,3);
  374. t.attach (TRightLabel.Create(sGtkName), 0,1, 3,4, gtk_noExp, gtk_fill, 3,0);
  375. PGtkName := TFPgtkEntry.create;
  376. PGtkName.ConnectChanged (@ChangedPGtkName, nil);
  377. t.attach (PGtkName, 1,2, 3,4);
  378. b1 := TFPgtkVBox.Create;
  379. b1.Packstart (t, false, false, 0);
  380. BDefinition := b1;
  381. bladen.AppendPage (b1, TFPgtkLabel.Create(sDefinition));
  382. // parameter
  383. //writeln ('------->> Property Parameter');
  384. PParam := TFPgtkHPaned.Create;
  385. bladen.AppendPage (PParam, TFPgtkLabel.Create(sParameters));
  386. BParameter := PParam;
  387. LParams := TFPgtkScrollCList.Create(1);
  388. LParams.setusize (120,30);
  389. b1 := TFPgtkVBox.Create;
  390. BrParams := TButtonRow.Create;
  391. BrParams.Title := 'Parameters buttonrow';
  392. b1.PackEnd (BrParams, false, false, 0);
  393. b1.PackEnd (LParams);
  394. PParam.Add1 (b1);
  395. FParam := TFPgtkVBox.Create;
  396. PParam.Add2 (FParam);
  397. t := TFPgtkTable.Create (3,4);
  398. FParam.Packstart (t, false, false, 0);
  399. t.attach (TRightLabel.Create(sName), 0,1, 0,1, gtk_noExp, gtk_fill, 3,0);
  400. ParamName := TFPgtkentry.Create;
  401. ParamName.ConnectChanged (@ChangedParamName, nil);
  402. t.attach (ParamName, 1,3, 0,1);
  403. t.attach (TRightLabel.Create(sPascalType), 0,1, 1,2, gtk_noExp, gtk_fill, 3,0);
  404. ParamPascalType := TFPgtkentry.Create;
  405. ParamPascalType.ConnectChanged (@ChangedParamPascalType, nil);
  406. t.attach (ParamPascalType, 1,3, 1,2);
  407. t.attach (TRightLabel.Create(sType), 0,1, 2,3, gtk_noExp, gtk_fill, 3,0);
  408. ParamType := TFPgtkOptionmenu.Create;
  409. t.attach (ParamType, 1,3, 2,3);
  410. with ParamType do
  411. begin
  412. Menu := TFPgtkMenu.Create;
  413. mList.FillFromArray ([sNothing, sVar, sConst]);
  414. AppendMenuItemGroup (menu, mlist, @ChangedParamType, nil);
  415. setusize (50, 26);
  416. end;
  417. mlist.Clear;
  418. ParamConvert := TFPgtkCheckedButton.CreateWithLabel(sConvert);
  419. ParamConvert.ConnectClicked (@ChangedParamConvert, nil);
  420. t.attach (ParamConvert, 1,2, 3,4, gtk_noExp, gtk_Fill, 0,0);
  421. // Read
  422. //writeln ('------->> Property Read');
  423. t := TFPgtkTable.Create (3,3);
  424. bladen.AppendPage (t, TFPgtkLabel.Create(sRead));
  425. BRead := t;
  426. t.Attach (TRightLabel.Create(sType), 0,1, 0,1, gtk_noExp, gtk_fill, 3,0);
  427. PRtype := TFPgtkOptionMenu.Create;
  428. with PRType do
  429. begin
  430. Menu := TFPgtkMenu.Create;
  431. mlist.FillFromArray ([sGtkFunction, sObjectField, sObjectFunction,SField, sFunction,
  432. sNotImplemented, sGtkMacro, sExistingFunc]);
  433. AppendMenuItemGroup (Menu, mlist, @ChangedPRType, nil);
  434. SetUsize (60,26);
  435. end;
  436. mlist.Clear;
  437. t.attach (PRtype, 1,2, 0,1, gtk_all, gtk_noExp, 0,0);
  438. PRConvert := TFPgtkCheckedButton.CreateWithLabel (sConvert);
  439. PRConvert.ConnectClicked (@ChangedPRConvert, nil);
  440. PRConvert.TheLabel.XAlign := 0.0;
  441. t.attach (PRConvert, 2,3, 0,1, gtk_all, gtk_noExp, 0,0);
  442. t.Attach (TRightLabel.Create(sGtkName), 0,1, 1,2, gtk_noExp, gtk_fill, 3,0);
  443. PRGtkName := TFPgtkEntry.Create;
  444. PRGtkName.ConnectChanged (@ChangedPGtkName, nil);
  445. t.attach (PRGtkName, 1,3, 1,2, gtk_all, gtk_noExp, 0,0);
  446. t.Attach (TRightLabel.Create(sCode), 0,1, 2,3, gtk_noExp, gtk_fill, 3,0);
  447. PRCode := TFPgtkScrollText.Create;
  448. PRCode.TheText.ConnectChanged (@ChangedPCode, nil);
  449. t.attach (PRCode, 1,3, 2,3);
  450. // Write
  451. //writeln ('------->> Property Write');
  452. t := TFPgtkTable.Create (3,3);
  453. BWrite := t;
  454. bladen.AppendPage (t, TFPgtkLabel.Create(sWrite));
  455. t.Attach (TRightLabel.Create(sType), 0,1, 0,1, gtk_noExp, gtk_fill, 3,0);
  456. PWtype := TFPgtkOptionMenu.Create;
  457. with PWType do
  458. begin
  459. Menu := TFPgtkMenu.Create;
  460. mlist.FillFromArray ([sGtkProcedure, sObjectField, sObjectProcedure,SField, sProcedure,
  461. sNotImplemented, sGtkMacro, sExistingProc]);
  462. AppendMenuItemGroup (Menu, mlist, @ChangedPWType, nil);
  463. SetUsize (60,26);
  464. end;
  465. mlist.Clear;
  466. t.attach (PWtype, 1,2, 0,1, gtk_all, gtk_noExp, 0,0);
  467. PWConvert := TFPgtkCheckedButton.CreateWithLabel (sConvert);
  468. PWConvert.ConnectClicked (@ChangedPWConvert, nil);
  469. PWConvert.TheLabel.XAlign := 0.0;
  470. t.attach (PWConvert, 2,3, 0,1, gtk_all, gtk_noExp, 0,0);
  471. t.Attach (TRightLabel.Create(sGtkName), 0,1, 1,2, gtk_noExp, gtk_fill, 3,0);
  472. PWGtkName := TFPgtkEntry.Create;
  473. PWGtkName.ConnectChanged (@ChangedPWGtkName, nil);
  474. t.attach (PWGtkName, 1,3, 1,2, gtk_all, gtk_noExp, 0,0);
  475. t.Attach (TRightLabel.Create(sCode), 0,1, 2,3, gtk_noExp, gtk_fill, 3,0);
  476. PWCode := TFPgtkScrollText.Create;
  477. PWCode.TheText.ConnectChanged (@ChangedPWCode, nil);
  478. t.attach (PWCode, 1,3, 2,3);
  479. // Function
  480. //writeln ('------->> Property Function');
  481. t := TFPgtkTable.Create (2,2);
  482. BFunction := t;
  483. bladen.AppendPage (t, TFPgtkLabel.Create(sFunction));
  484. t.Attach (TFPgtkLabel.Create(sCode), 1,2, 0,1, gtk_NoExp, gtk_NoExp, 7,0);
  485. PFCode := TFPgtkScrollText.Create;
  486. PFCode.TheText.ConnectChanged (@ChangedPCode, nil);
  487. t.Attach (PFCode, 1,2, 1,2, gtk_all, gtk_all, 0,0);
  488. f := TFPgtkFrame.Create;
  489. f.Border := 3;
  490. f.Text := sTypes;
  491. t.Attach (f, 0,1, 0,2, gtk_NoExp, gtk_NoExp, 0,0);
  492. b1 := TFPgtkVBox.Create;
  493. f.Add (b1);
  494. b1.border := 2;
  495. POverride := TFPgtkCheckedButton.CreateWithLabel (sOverride);
  496. POverride.ConnectClicked (@ChangedPFuncType, inttopointer(0));
  497. b1.PackStart (POverride, false, false, 0);
  498. PVirtual := TFPgtkCheckedButton.CreateWithLabel (sVirtual);
  499. PVirtual.ConnectClicked (@ChangedPFuncType, inttopointer(1));
  500. b1.PackStart (PVirtual, false, false, 0);
  501. PDynamic := TFPgtkCheckedButton.CreateWithLabel (sDynamic);
  502. PDynamic.ConnectClicked (@ChangedPFuncType, inttopointer(2));
  503. b1.PackStart (PDynamic, false, false, 0);
  504. PAbstract := TFPgtkCheckedButton.CreateWithLabel (sAbstract);
  505. PAbstract.ConnectClicked (@ChangedPFuncType, inttopointer(3));
  506. b1.PackStart (PAbstract, false, false, 0);
  507. PCDecl := TFPgtkCheckedButton.CreateWithLabel (sCDecl);
  508. PCDecl.ConnectClicked (@ChangedPFuncType, inttopointer(4));
  509. b1.PackStart (PCDecl, false, false, 0);
  510. POverload := TFPgtkCheckedButton.CreateWithLabel (sOverload);
  511. POverload.ConnectClicked (@ChangedPFuncType, inttopointer(5));
  512. b1.PackStart (POverload, false, false, 0);
  513. PReintroduce := TFPgtkCheckedButton.CreateWithLabel (sReintroduce);
  514. PReintroduce.ConnectClicked (@ChangedPFuncType, inttopointer(6));
  515. b1.PackStart (PReintroduce, false, false, 0);
  516. // Code
  517. //writeln ('------->> Property Code');
  518. PCode := TFPgtkScrollText.Create;
  519. BCode := PCode;
  520. PCode.TheText.ConnectChanged (@ChangedPCode, nil);
  521. bladen.AppendPage (PCode, TFPgtkLabel.Create(sCode));
  522. // Configuring buttonrows
  523. //writeln ('------->> Configure Buttonrows');
  524. BrParams.Configure (LParams.CList, nil, @RefreshParam,
  525. MenuEditParameter.SubMenu,
  526. AG, Gdk_Mod1_Mask+Gdk_Shift_Mask);
  527. BrProperties.Configure (LProperties.Clist, @PropertyIcon, @RefreshProperty,
  528. MenuEditProperty.SubMenu,
  529. AG, Gdk_Control_Mask+Gdk_Shift_Mask);
  530. BrObjects.Configure (LObjects.CList, nil, @RefreshObject,
  531. MenuEditObject.SubMenu, AG, 0);
  532. //writeln ('------->> Einde ComposeWindow');
  533. end;
  534. { *** Procedures to show parts in the window (when selecting items) *** }
  535. { Showing procedures }
  536. procedure TGtkEditorWindow.RefreshDefinition;
  537. begin
  538. RefreshingDefinition := True;
  539. try
  540. if assigned (FDefs) then
  541. with FDefs do
  542. begin
  543. DUnitName.text := UnitName;
  544. DGtkPrefix.Text := GtkPrefix;
  545. DUsesList.Text := UsesList;
  546. BrObjects.ChangeCollection (Definition);
  547. end
  548. else
  549. begin
  550. DUnitName.text := '';
  551. DGtkPrefix.Text := '';
  552. DUsesList.Text := '';
  553. BrObjects.ChangeCollection (nil);
  554. end;
  555. finally
  556. RefreshingDefinition := False;
  557. end;
  558. end;
  559. procedure TGtkEditorWindow.RefreshObject (Selected : TCollectionItem; NeedFocus:boolean);
  560. begin
  561. RefreshingObject := True;
  562. try
  563. ciObject := TObjectItem(Selected);
  564. if assigned (ciObject) then
  565. with ciObject do
  566. begin
  567. FObject.Sensitive := true;
  568. OName.Text := Name;
  569. OInherit.Text := Inherit;
  570. OGtkName.Text := GtkName;
  571. OGtkFuncName.Text := GtkFuncName;
  572. OCreateParams.Text := CreateParams;
  573. OCreateObject.Active := CreateObject;
  574. OWithPointer.Active := WithPointer;
  575. BrProperties.ChangeCollection (Props);
  576. end
  577. else
  578. begin
  579. FObject.Sensitive := false;
  580. OName.Clear;
  581. OInherit.Clear;
  582. OGtkName.Clear;
  583. OGtkFuncName.Clear;
  584. OCreateParams.Clear;
  585. OCreateObject.Active := False;
  586. OWithPointer.Active := False;
  587. BrProperties.ChangeCollection (nil);
  588. end;
  589. if NeedFocus then
  590. with OName do
  591. begin
  592. SelectRegion (0, -1);
  593. GrabFocus;
  594. end;
  595. finally
  596. RefreshingObject := false;
  597. end;
  598. end;
  599. procedure TGtkEditorWindow.CreatePixmaps;
  600. procedure GdkPixmap (Data : array of string; var pm : PGdkPixmap; var bm : PGdkBitmap);
  601. var ppdata : ppgchar;
  602. begin
  603. ppdata := ArrayToPPgchar(Data);
  604. pm := gdk_pixmap_colormap_create_from_xpm_d (nil, Colormap, @bm, nil, ppdata);
  605. freemem (ppdata, sizeof (pchar) * (high(data)-low(data)+1));
  606. end;
  607. begin
  608. GdkPixmap (XPMPropField, PropPixs[0], PropMasks[0]);
  609. GdkPixmap (XPMPropProperty, PropPixs[1], PropMasks[1]);
  610. GdkPixmap (XPMPropFunction, PropPixs[2], PropMasks[2]);
  611. GdkPixmap (XPMPropProcedure, PropPixs[3], PropMasks[3]);
  612. GdkPixmap (XPMPropSignal, PropPixs[4], PropMasks[4]);
  613. GdkPixmap (XPMPropHelperProc, PropPixs[5], PropMasks[5]);
  614. GdkPixmap (XPMPropHelperFunc, PropPixs[6], PropMasks[6]);
  615. GdkPixmap (XPMPropSignalType, PropPixs[7], PropMasks[7]);
  616. GdkPixmap (XPMPropDeclar, PropPixs[8], PropMasks[8]);
  617. GdkPixmap (XPMPropTypeDecl, PropPixs[9], PropMasks[9]);
  618. GdkPixmap (XPMPropConstr, PropPixs[10], PropMasks[10]);
  619. GdkPixmap (XPMPropDestr, PropPixs[11], PropMasks[11]);
  620. GdkPixmap (XPMPropInitial, PropPixs[12], PropMasks[12]);
  621. GdkPixmap (XPMPropFinal, PropPixs[13], PropMasks[13]);
  622. end;
  623. procedure TGtkEditorWindow.PropertyIcon (Item:TCollectionItem; var Pixmap:PGdkPixMap; var mask:PGdkBitmap);
  624. var r : integer;
  625. begin
  626. r := ord((Item as TPropertyItem).propType);
  627. Pixmap := PropPixs[r];
  628. Mask := PropMasks[r];
  629. end;
  630. procedure TGtkEditorWindow.EnDisablePages (pt : TPropType);
  631. begin
  632. BDefinition.Visible := pt in [ptField,ptProperty,ptFunction,ptProcedure,ptSignal,
  633. ptHelperProc,ptHelperFunc,ptSignalType,ptDeclarations,ptTypeDecl,
  634. ptConstructor,ptDestructor];
  635. BParameter.visible := pt in [ptProperty,ptFunction,ptProcedure,
  636. ptHelperProc,ptHelperFunc,ptSignalType,ptConstructor,ptDestructor];
  637. BFunction.Visible := pt in [ptFunction,ptProcedure,ptHelperProc,ptHelperFunc,
  638. ptConstructor,ptDestructor];
  639. BRead.Visible := pt in [ptProperty];
  640. BWrite.Visible := pt in [ptProperty];
  641. BCode.visible := pt in [ptDeclarations,ptTypeDecl,ptInitialization,ptFinalization];
  642. end;
  643. procedure TGtkEditorWindow.RefreshProperty (Selected : TCollectionItem; NeedFocus:boolean);
  644. var r : byte;
  645. s : string;
  646. begin
  647. RefreshingProperty := True;
  648. try
  649. ciProperty := selected as TPropertyItem;
  650. if assigned (ciProperty) then
  651. with ciProperty do
  652. begin
  653. s := Code.Text;
  654. FProperty.Sensitive := true;
  655. r := ord (PropType);
  656. PType.SetHistory (r);
  657. EnDisablePages (PropType);
  658. // definition
  659. PName.Text := Name;
  660. PPascalType.Text := PascalType;
  661. PGtkName.Text := GtkName;
  662. PSection.SetHistory (Ord(Section));
  663. // read
  664. PRType.SetHistory (Ord(ReadFuncType));
  665. PRGtkName.Text := GtkName;
  666. PRCode.Text := s;
  667. PRConvert.Active := ReadConvert;
  668. // write
  669. PWType.SetHistory (Ord(WriteProcType));
  670. PWGtkName.Text := WriteGtkName;
  671. PWCode.Text := WriteCode.Text;
  672. PWConvert.Active := WriteConvert;
  673. // function
  674. POverride.active := ptOverride in ProcTypes;
  675. PVirtual.active := ptVirtual in ProcTypes;
  676. PDynamic.active := ptDynamic in ProcTypes;
  677. PAbstract.active := ptAbstract in ProcTypes;
  678. PCDecl.active := ptCDecl in ProcTypes;
  679. POverload.active := ptOverload in ProcTypes;
  680. PReintroduce.active := ptReintroduce in ProcTypes;
  681. PFCode.Text := s;
  682. // Code
  683. PCode.Text := s;
  684. // Parameters
  685. BrParams.ChangeCollection (Parameters);
  686. end
  687. else
  688. begin
  689. FProperty.Sensitive := false;
  690. PType.Clear;
  691. // definition
  692. PName.Clear;
  693. PPascalType.Clear;
  694. PGtkName.Clear;
  695. PSection.Clear;
  696. // read
  697. PRType.Clear;
  698. PRGtkName.Clear;
  699. PRCode.Clear;
  700. PRConvert.Active := false;
  701. // write
  702. PWType.Clear;
  703. PWGtkName.Clear;
  704. PWCode.Clear;
  705. PWConvert.Active := False;
  706. // function
  707. POverride.active := False;
  708. PVirtual.active := False;
  709. PDynamic.active := False;
  710. PAbstract.active := False;
  711. PCDecl.active := False;
  712. POverload.active := False;
  713. PReintroduce.active := False;
  714. PFCode.Clear;
  715. // Code
  716. PCode.Clear;
  717. // Parameters
  718. BrParams.ChangeCollection (nil);
  719. end;
  720. finally
  721. RefreshingProperty := false;
  722. end;
  723. if NeedFocus then
  724. with PName do
  725. begin
  726. Bladen.PageIndex := 0;
  727. SelectRegion (0, -1);
  728. GrabFocus;
  729. end;
  730. end;
  731. procedure TGtkEditorWindow.RefreshParam (Selected : TCollectionItem; NeedFocus:boolean);
  732. begin
  733. RefreshingParam := True;
  734. try
  735. ciParameter := Selected as TParameterItem;
  736. if assigned (ciParameter) then
  737. with ciParameter do
  738. begin
  739. FParam.Sensitive := true;
  740. ParamName.text := name;
  741. ParamPascalType.text := PascalType;
  742. self.ParamType.SetHistory (Ord(ParamType));
  743. ParamConvert.Active := Convert;
  744. end
  745. else
  746. begin
  747. FParam.Sensitive := false;
  748. ParamName.Clear;
  749. ParamPascalType.Clear;
  750. self.ParamType.Clear;
  751. ParamConvert.Active := False;
  752. end;
  753. if NeedFocus then
  754. with ParamName do
  755. begin
  756. selectRegion (0, -1);
  757. GrabFocus;
  758. end;
  759. finally
  760. RefreshingParam := False;
  761. end;
  762. end;
  763. procedure TGtkEditorWindow.ObjectDisplayChanged;
  764. begin
  765. with BrObjects do
  766. if (SelectedRow >= 0) and assigned(ciObject) then
  767. LObjects.Clist.CellText[SelectedRow,0] := ciObject.DisplayName;
  768. end;
  769. procedure TGtkEditorWindow.PropertyDisplayChanged;
  770. var r : integer;
  771. begin
  772. with BrProperties do
  773. if (SelectedRow >= 0) and assigned(ciProperty) then
  774. begin
  775. LProperties.CList.CellText[SelectedRow,1] := ciProperty.DisplayName;
  776. r := ord(ciProperty.PropType);
  777. LProperties.CList.SetPixMap (SelectedRow, 0, PropPixs[r], PropMasks[r]);
  778. end;
  779. end;
  780. procedure TGtkEditorWindow.ParamDisplayChanged;
  781. begin
  782. with BrParams do
  783. if (SelectedRow >= 0) and assigned(ciParameter) then
  784. LParams.CList.CellText[SelectedRow,0] := ciParameter.DisplayName;
  785. end;
  786. { entry saving procedures/signals }
  787. // Definition
  788. procedure TGtkEditorWindow.ChangedDUsesList (Sender:TFPgtkObject; data:pointer);
  789. begin
  790. if RefreshingDefinition then Exit;
  791. if assigned (FDefs) then
  792. FDefs.UsesList := DUsesList.Text;
  793. end;
  794. procedure TGtkEditorWindow.ChangedDUnitName (Sender:TFPgtkObject; data:pointer);
  795. begin
  796. if RefreshingDefinition then Exit;
  797. if assigned (FDefs) then
  798. FDefs.UnitName := DUnitName.Text;
  799. end;
  800. procedure TGtkEditorWindow.ChangedDGtkPrefix (Sender:TFPgtkObject; data:pointer);
  801. begin
  802. if RefreshingDefinition then Exit;
  803. if assigned (FDefs) then
  804. FDefs.GtkPrefix := DGtkPrefix.Text;
  805. end;
  806. // Object
  807. procedure TGtkEditorWindow.ChangedOName (Sender:TFPgtkObject; data:pointer);
  808. begin
  809. if RefreshingObject then Exit;
  810. if assigned(ciObject) then
  811. begin
  812. ciObject.Name := OName.Text;
  813. ObjectDisplayChanged;
  814. end;
  815. end;
  816. procedure TGtkEditorWindow.ChangedOInherit (Sender:TFPgtkObject; data:pointer);
  817. begin
  818. if RefreshingObject then Exit;
  819. if assigned(ciObject) then
  820. ciObject.Inherit := OInherit.Text;
  821. end;
  822. procedure TGtkEditorWindow.ChangedOGtkName (Sender:TFPgtkObject; data:pointer);
  823. begin
  824. if RefreshingObject then Exit;
  825. if assigned(ciObject) then
  826. ciObject.GtkName := OGtkName.Text;
  827. end;
  828. procedure TGtkEditorWindow.ChangedOGtkFuncName (Sender:TFPgtkObject; data:pointer);
  829. begin
  830. if RefreshingObject then Exit;
  831. if assigned(ciObject) then
  832. ciObject.GtkFuncName := OGtkFuncName.Text;
  833. end;
  834. procedure TGtkEditorWindow.ChangedOCreateParams (Sender:TFPgtkObject; data:pointer);
  835. begin
  836. if RefreshingObject then Exit;
  837. if assigned(ciObject) then
  838. ciObject.CreateParams := OCreateParams.Text;
  839. end;
  840. procedure TGtkEditorWindow.ChangedOCreateObject (Sender:TFPgtkObject; data:pointer);
  841. begin
  842. if RefreshingObject then Exit;
  843. if assigned(ciObject) then
  844. ciObject.CreateObject := OCreateObject.active;
  845. end;
  846. procedure TGtkEditorWindow.ChangedOWithPointer (Sender:TFPgtkObject; data:pointer);
  847. begin
  848. if RefreshingObject then Exit;
  849. if assigned(ciObject) then
  850. ciObject.WithPointer := OWithpointer.active;
  851. end;
  852. // Property
  853. procedure TGtkEditorWindow.ChangedPType (Sender:TFPgtkObject; data:pointer);
  854. begin
  855. if RefreshingProperty then Exit;
  856. if assigned(ciProperty) then
  857. begin
  858. ciProperty.PropType := TPropType(Pointertoint(data));
  859. PropertyDisplayChanged;
  860. EnDisablePages (ciProperty.PropType);
  861. end;
  862. end;
  863. procedure TGtkEditorWindow.ChangedPName (Sender:TFPgtkObject; data:pointer);
  864. begin
  865. if RefreshingProperty then Exit;
  866. if assigned(ciProperty) then
  867. begin
  868. ciProperty.Name := PName.Text;
  869. PropertyDisplayChanged;
  870. end;
  871. end;
  872. procedure TGtkEditorWindow.ChangedPPascalType (Sender:TFPgtkObject; data:pointer);
  873. begin
  874. if RefreshingProperty then Exit;
  875. if assigned(ciProperty) then
  876. ciProperty.PascalType := PPascalType.Text;
  877. end;
  878. procedure TGtkEditorWindow.ChangedPGtkName (Sender:TFPgtkObject; data:pointer);
  879. begin
  880. if RefreshingProperty then Exit;
  881. if assigned(ciProperty) then
  882. ciProperty.GtkName := (Sender as TFpgtkEntry).Text;
  883. end;
  884. procedure TGtkEditorWindow.ChangedPSection (Sender:TFPgtkObject; data:pointer);
  885. begin
  886. if RefreshingProperty then Exit;
  887. if assigned(ciProperty) then
  888. begin
  889. ciProperty.Section := TInterfaceSection(Pointertoint(data));
  890. PropertyDisplayChanged;
  891. end;
  892. end;
  893. procedure TGtkEditorWindow.ChangedPCode (Sender:TFPgtkObject; data:pointer);
  894. var s : string;
  895. begin
  896. if RefreshingProperty then Exit;
  897. if assigned(ciProperty) then
  898. s := (Sender as TFPgtkText).Text;
  899. ciProperty.Code.Text := s;
  900. end;
  901. // read
  902. procedure TGtkEditorWindow.ChangedPRType (Sender:TFPgtkObject; data:pointer);
  903. begin
  904. if RefreshingProperty then Exit;
  905. if assigned(ciProperty) then
  906. ciProperty.ReadfuncType := TPropFuncType(Pointertoint(data));
  907. end;
  908. procedure TGtkEditorWindow.ChangedPRConvert (Sender:TFPgtkObject; data:pointer);
  909. begin
  910. if RefreshingProperty then Exit;
  911. if assigned(ciProperty) then
  912. ciProperty.ReadConvert := PRConvert.Active;
  913. end;
  914. // write
  915. procedure TGtkEditorWindow.ChangedPWType (Sender:TFPgtkObject; data:pointer);
  916. begin
  917. if RefreshingProperty then Exit;
  918. if assigned(ciProperty) then
  919. begin
  920. ciProperty.WriteProcType := TPropFuncType(Pointertoint(data));
  921. end;
  922. end;
  923. procedure TGtkEditorWindow.ChangedPWGtkName (Sender:TFPgtkObject; data:pointer);
  924. begin
  925. if RefreshingProperty then Exit;
  926. if assigned(ciProperty) then
  927. ciProperty.WriteGtkName := PWGtkName.Text;
  928. end;
  929. procedure TGtkEditorWindow.ChangedPWCode (Sender:TFPgtkObject; data:pointer);
  930. var s : string;
  931. begin
  932. if RefreshingProperty then Exit;
  933. if assigned(ciProperty) then
  934. begin
  935. s := PWCode.Text;
  936. ciProperty.WriteCode.Text := s;
  937. end;
  938. end;
  939. procedure TGtkEditorWindow.ChangedPWConvert (Sender:TFPgtkObject; data:pointer);
  940. begin
  941. if RefreshingProperty then Exit;
  942. if assigned(ciProperty) then
  943. ciProperty.WriteConvert := PWConvert.active;
  944. end;
  945. // function
  946. procedure TGtkEditorWindow.ChangedPFuncType (Sender:TFPgtkObject; data:pointer);
  947. var pt : TProcType;
  948. begin
  949. if RefreshingProperty then Exit;
  950. if assigned(ciProperty) then
  951. with ciProperty do
  952. begin
  953. pt := TProcType(pointertoint(data));
  954. if (Sender as TFPgtkToggleButton).Active then
  955. ProcTypes := Proctypes + [pt]
  956. else
  957. ProcTypes := Proctypes - [pt];
  958. end;
  959. end;
  960. // parameter
  961. procedure TGtkEditorWindow.ChangedParamName (Sender:TFPgtkObject; data:pointer);
  962. begin
  963. if RefreshingParam then Exit;
  964. if assigned (ciParameter) then
  965. begin
  966. ciParameter.Name := ParamName.Text;
  967. ParamDisplayChanged;
  968. end;
  969. end;
  970. procedure TGtkEditorWindow.ChangedParamPascalType (Sender:TFPgtkObject; data:pointer);
  971. begin
  972. if RefreshingParam then Exit;
  973. if assigned (ciParameter) then
  974. ciParameter.PascalType := ParamPascalType.Text;
  975. end;
  976. procedure TGtkEditorWindow.ChangedParamType (Sender:TFPgtkObject; data:pointer);
  977. begin
  978. if RefreshingParam then Exit;
  979. if assigned (ciParameter) then
  980. ciParameter.ParamType := TParamType (Pointertoint(data));
  981. end;
  982. procedure TGtkEditorWindow.ChangedParamConvert (Sender:TFPgtkObject; data:pointer);
  983. begin
  984. if RefreshingParam then Exit;
  985. if assigned (ciParameter) then
  986. ciParameter.Convert := ParamConvert.Active;
  987. end;
  988. { *** Menu procedures *** }
  989. procedure TGtkEditorWindow.BuildReopenList;
  990. var r : integer;
  991. mi : TFPgtkMenuItem;
  992. begin
  993. with FReopenList do
  994. begin
  995. while (count > FSettings.MRUCount) do
  996. Delete (0);
  997. with MenuFileReopen do
  998. begin
  999. if assigned(SubMenu) then
  1000. SubMenu.Free;
  1001. SubMenu := TFPgtkMenu.Create;
  1002. with (submenu as TFPgtkMenu) do
  1003. for r := FReopenList.count-1 downto 0 do
  1004. begin
  1005. mi := NewMenuItem (FReopenList[r], '', '', nil, @FileReopen, mi);
  1006. Append (mi);
  1007. end;
  1008. end;
  1009. end;
  1010. end;
  1011. procedure TGtkEditorWindow.NewFilename (NewName : string);
  1012. var r : integer;
  1013. begin
  1014. if NewName = '' then
  1015. Title := sEditorTitle
  1016. else
  1017. Title := sEditorTitle + ' - ' + NewName;
  1018. FFilename := NewName;
  1019. with FReopenList do
  1020. begin
  1021. r := IndexOf (NewName);
  1022. if r >= 0 then
  1023. Delete (r);
  1024. Add (NewName);
  1025. BuildReopenList;
  1026. end;
  1027. end;
  1028. procedure TGtkEditorWindow.DataWrite (filename : string);
  1029. var
  1030. BinStream : TMemoryStream;
  1031. StrStream : TFileStream;
  1032. l : TStrings;
  1033. begin
  1034. StrStream := TFileStream.Create(filename, fmCreate);
  1035. try
  1036. case FSettings.FileFormat of
  1037. ffComponentText :
  1038. begin
  1039. BinStream := TMemoryStream.Create;
  1040. try
  1041. BinStream.WriteComponent(FDefs);
  1042. BinStream.Seek(0, soFromBeginning);
  1043. ObjectBinaryToText(BinStream, StrStream);
  1044. finally
  1045. BinStream.Free
  1046. end;
  1047. end;
  1048. ffComonentBin :
  1049. StrStream.WriteComponent(FDefs);
  1050. ffHomeText :
  1051. begin
  1052. l := TStringList.Create;
  1053. try
  1054. l.capacity := FDefs.definition.count * 5;
  1055. FDefs.Save (l);
  1056. l.SaveToStream (StrStream);
  1057. finally
  1058. l.Free;
  1059. end;
  1060. end;
  1061. end;
  1062. HasAFile := True;
  1063. NewFilename (filename);
  1064. finally
  1065. StrStream.Free;
  1066. end;
  1067. end;
  1068. procedure TGtkEditorWindow.DataRead (filename : string);
  1069. var FStream : TFileStream;
  1070. MStream : TMemoryStream;
  1071. s : string[6];
  1072. l : TStrings;
  1073. begin
  1074. if fileExists (filename) then
  1075. begin
  1076. FStream := TFileStream.Create(filename, fmOpenRead);
  1077. try
  1078. FStream.Readbuffer (s[1],6);
  1079. s[0] := #6;
  1080. FStream.Seek (0, soFromBeginning);
  1081. if not assigned (FDefs) then
  1082. FDefs := TObjectDefs.Create (nil);
  1083. if s = 'object' then
  1084. begin
  1085. MStream := TMemoryStream.Create;
  1086. try
  1087. ObjectTextToBinary(FStream, MStream);
  1088. MStream.Seek(0, soFromBeginning);
  1089. MStream.ReadComponent(FDefs);
  1090. finally
  1091. MStream.Free;
  1092. end;
  1093. end
  1094. else if s = 'defini' then
  1095. begin
  1096. l := TStringList.Create;
  1097. try
  1098. l.LoadFromStream (FStream);
  1099. FDefs.Load (l);
  1100. finally
  1101. l.Free;
  1102. end;
  1103. end
  1104. else
  1105. FStream.ReadComponent (FDefs);
  1106. finally
  1107. FStream.Free;
  1108. end;
  1109. HasAFile := True;
  1110. newFileName (filename);
  1111. end
  1112. else
  1113. ShowMessage ('Error', 'Can''t find file "'+filename+'"');
  1114. end;
  1115. procedure TGtkEditorWindow.Generate;
  1116. var TheFile : TStringList;
  1117. Prog : TProgressWindow;
  1118. begin
  1119. TheFile := TStringList.Create;
  1120. try
  1121. TheFile.beginUpdate;
  1122. if FSettings.ShowProgress then
  1123. begin
  1124. Prog := TProgressWindow.Create;
  1125. try
  1126. Prog.Show;
  1127. FDefs.Write (TheFile, @(Prog.StepIt), @(Prog.SetMax));
  1128. Prog.Hide;
  1129. finally
  1130. Prog.Free;
  1131. end;
  1132. end
  1133. else
  1134. FDefs.Write (TheFile, nil, nil);
  1135. TheFile.EndUpdate;
  1136. Thefile.SaveToFile (FDefs.UnitName+'.'+FSettings.Extention);
  1137. finally
  1138. TheFile.Free;
  1139. end;
  1140. end;
  1141. { Menu signals }
  1142. procedure TGtkEditorWindow.FileNew (Sender : TFPgtkObject; data : pointer);
  1143. begin
  1144. FDefs.Free;
  1145. FDefs := TObjectDefs.Create (nil);
  1146. FFileName := '';
  1147. RefreshDefinition;
  1148. end;
  1149. procedure TGtkEditorWindow.DialogSetFilename (Sender:TFPgtkWindow;
  1150. aDialogResult:pointer; Action:integer; initiator:TFPgtkObject);
  1151. begin
  1152. if Action = drOk then
  1153. FFilename := (Sender as TFPgtkFileSelection).Filename;
  1154. end;
  1155. procedure TGtkEditorWindow.FileOpen (Sender : TFPgtkObject; data : pointer);
  1156. var fs : TFPgtkFileSelection;
  1157. begin
  1158. fs := TFPgtkFileSelection.Create (gtk_window_dialog);
  1159. with fs do
  1160. begin
  1161. Title := 'Select file to open';
  1162. OKButton.ConnectClicked (@(fs.CloseWithResult), inttopointer(drOk));
  1163. CancelButton.ConnectClicked (@(fs.CloseWindow), nil);
  1164. Filename := FFilename;
  1165. if execute (nil, nil, @DialogSetFilename) = drOk then
  1166. begin
  1167. DataRead (FFilename);
  1168. RefreshDefinition;
  1169. end;
  1170. end;
  1171. end;
  1172. procedure TGtkEditorWindow.FileReopen (Sender : TFPgtkObject; data : pointer);
  1173. begin
  1174. with (Sender as TFPgtkMenuItem) do
  1175. begin
  1176. DataRead (Text);
  1177. RefreshDefinition;
  1178. end;
  1179. end;
  1180. procedure TGtkEditorWindow.ToolbarReopen (Sender : TFpgtkObject; data : pointer);
  1181. begin
  1182. (MenuFileReopen.submenu as TFPgtkMenu).Popup (0);
  1183. end;
  1184. procedure TGtkEditorWindow.FileSave (Sender : TFPgtkObject; data : pointer);
  1185. begin
  1186. if FFilename = '' then
  1187. FileSaveAs (Sender, data)
  1188. else
  1189. DataWrite (FFilename);
  1190. end;
  1191. procedure TGtkEditorWindow.FileSaveAs (Sender : TFPgtkObject; data : pointer);
  1192. var fs : TFPgtkFileSelection;
  1193. begin
  1194. fs := TFPgtkFileSelection.Create (gtk_window_dialog);
  1195. with fs do
  1196. begin
  1197. Title := 'Give filename to save';
  1198. OKButton.ConnectClicked (@(fs.CloseWithResult), inttopointer(drOk));
  1199. CancelButton.ConnectClicked (@(fs.CloseWindow), nil);
  1200. Filename := FFilename;
  1201. if execute (nil, nil, @DialogSetFilename) = drOk then
  1202. DataWrite (FFilename);
  1203. end;
  1204. end;
  1205. procedure TGtkEditorWindow.FileExit (Sender : TFPgtkObject; data : pointer);
  1206. begin
  1207. If FSettings.SaveOnClose then
  1208. FileSave (Sender, data);
  1209. Close;
  1210. end;
  1211. procedure TGtkEditorWindow.ToolsGenerate (Sender : TFPgtkObject; data : pointer);
  1212. begin
  1213. Generate;
  1214. end;
  1215. procedure TGtkEditorWindow.ToolsOptions (Sender : TFPgtkObject; data : pointer);
  1216. begin
  1217. with TSettingsDialog.Create do
  1218. Execute (nil, @FSettings, nil);
  1219. end;
  1220. procedure TGtkEditorWindow.HelpInfo (Sender : TFPgtkObject; data : pointer);
  1221. begin
  1222. ShowMessage (sInfoTitle, sInfoMessage);
  1223. end;
  1224. procedure TGtkEditorWindow.HelpAbout (Sender : TFPgtkObject; data : pointer);
  1225. var d : TFPgtkDialog;
  1226. b : TFPgtkButton;
  1227. box : TFPgtkBox;
  1228. AG : integer;
  1229. begin
  1230. d := TFPgtkDialog.Create;
  1231. with d do
  1232. begin
  1233. title := sAboutTitle;
  1234. box := TFPgtkVBox.Create;
  1235. with Box do
  1236. begin
  1237. border := 15;
  1238. PackStart (TFPgtkLabel.Create (sAbout1));
  1239. PackStart (TFPgtkLabel.Create (sAbout2));
  1240. PackStart (TFPgtkHSeparator.Create, false, false, 8);
  1241. PackStart (TFPgtkLabel.Create (sAboutVersion));
  1242. PackStart (TFPgtkLabel.Create (sAboutDesigner));
  1243. end;
  1244. vbox.Packstart (box, true, false, 0);
  1245. with ActionArea do
  1246. begin
  1247. b := TFPgtkButton.CreateWithLabel (sOk);
  1248. b.ConnectClicked (@(d.CloseWindow), nil);
  1249. Packstart (b);
  1250. end;
  1251. AG := AccelGroupNew;
  1252. AcceleratorAdd (AG, b, sgClicked, gdk_Return, 0, TGTKAccelFlags(0));
  1253. AcceleratorAdd (AG, b, sgClicked, gdk_Cancel, 0, TGTKAccelFlags(0));
  1254. Execute (nil, nil, nil);
  1255. end;
  1256. end;
  1257. const
  1258. secSettings = 'Settings';
  1259. keySaveOnExit = 'SaveOnExit';
  1260. keyFileFormat = 'TextFormat';
  1261. keyMRUCount = 'MRUCount';
  1262. keyExtention = 'Extention';
  1263. keyProgressWindow = 'ShowProgress';
  1264. secMRU = 'Last open files';
  1265. keyFile = 'File';
  1266. keyCount = 'Count';
  1267. procedure TGtkEditorWindow.ReadSettings;
  1268. var c, r : integer;
  1269. s : string;
  1270. begin
  1271. with FSettings do
  1272. with TMemInifile.Create(ChangeFileExt(paramstr(0), '.ini')) do
  1273. try
  1274. saveonclose := readbool (SecSettings, keySaveOnExit, true);
  1275. Fileformat := TFileFormat(readinteger (secSettings, keyFileFormat, 2));
  1276. Extention := readstring (secSettings, keyExtention, '.pp');
  1277. MRUCount := readinteger (secSettings, keyMRUCount, 5);
  1278. ShowProgress := readbool (SecSettings, keyProgressWindow, true);
  1279. FReopenList.capacity := MRUCount;
  1280. c := ReadInteger (secMRU, keyCount, 0);
  1281. for r := 0 to c-1 do
  1282. begin
  1283. s := readstring(secMRU, keyFile+inttostr(r), '');
  1284. if s <> '' then
  1285. FReopenlist.Add (s);
  1286. end;
  1287. BuildReopenList;
  1288. finally
  1289. free;
  1290. end;
  1291. end;
  1292. procedure TGtkEditorWindow.WriteSettings (Sender : TFPgtkObject; data : pointer);
  1293. var r : integer;
  1294. begin
  1295. with PSettingsRec(data)^, TMemInifile.Create (ChangeFileExt(paramstr(0), '.ini')) do
  1296. try
  1297. writebool (SecSettings, keySaveOnExit, saveonclose);
  1298. writeinteger (secSettings, keyFileFormat, Ord(FileFormat));
  1299. writestring (secSettings, keyExtention, Extention);
  1300. writeinteger (secSettings, keyMRUCount, MRUCount);
  1301. writebool (SecSettings, keyProgressWindow, ShowProgress);
  1302. writeinteger (secMRU, keyCount, FReopenlist.count);
  1303. UpdateFile;
  1304. for r := 0 to FReopenList.count-1 do
  1305. writestring (secMRU, keyFile+inttostr(r), FReopenList[r]);
  1306. finally
  1307. free;
  1308. end;
  1309. end;
  1310. end.