fpgtkext.pp 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157
  1. {
  2. This file is part of the fpgtk package
  3. Copyright (c) 1999-2000 by Michael van Canney, Sebastian Guenther
  4. fpgtk application object
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$mode objfpc}{$h+}
  12. unit FPgtkExt;
  13. interface
  14. {$IFDEF FPC_DOTTEDUNITS}
  15. uses Fpgtk, Api.Gtk1.Gtk, Api.Gtk1.Gdk, Api.Gtk1.Glib, System.SysUtils, System.Classes;
  16. {$ELSE FPC_DOTTEDUNITS}
  17. uses FPgtk, gtk, gdk, glib, sysutils, classes;
  18. {$ENDIF FPC_DOTTEDUNITS}
  19. { ==== Application object ==== }
  20. type
  21. TFPgtkApplication = class
  22. Private
  23. FMainwindow : TFPgtkWindow;
  24. FMainDestroysignal : guint;
  25. procedure SetMainWindow (Value:TFPgtkWindow);
  26. procedure MainDestroyed (Sender:TFPgtkObject; data:pointer);
  27. Public
  28. constructor Create;
  29. destructor Destroy; override;
  30. procedure Run;
  31. property Mainwindow : TFPgtkWindow read FMainwindow write SetMainwindow;
  32. end;
  33. var
  34. Application : TFPgtkApplication;
  35. { ==== Extra Widgets ==== }
  36. type
  37. TFPgtkFileEntry = class (TFPgtkHBox)
  38. private
  39. FEdit : TFPgtkEntry;
  40. FButton : TFPgtkButton;
  41. FImage : TFPgtkPixmap;
  42. procedure OpenFileSelection (Sender : TFPgtkObject; data : pointer);
  43. procedure CloseFileSelection (Sender:TFPgtkWindow; DialogResult:pointer;
  44. Action:integer; initiator:TFPgtkObject);
  45. procedure SetFilename (Value : ansistring);
  46. function GetFilename : ansistring;
  47. public
  48. constructor create;
  49. property Edit : TFPgtkEntry read FEdit;
  50. property Button : TFPgtkButton read FButton;
  51. property Image : TFPgtkPixmap read FImage;
  52. property Filename : ansistring read GetFilename write SetFilename;
  53. end;
  54. TFPgtkCheckedButton = class (TFPgtkToggleButton)
  55. private
  56. FChecked, FUnchecked : TFPgtkPixmap;
  57. procedure ChangeCheck (Sender:TFPgtkObject; data:pointer);
  58. public
  59. constructor Create;
  60. constructor CreateWithLabel (aText:ansistring);
  61. constructor CreateWithLabel (aText:ansistring; AccelGroup : PGtkAccelGroup);
  62. end;
  63. { ==== Widget who needs a scrollwindow ==== }
  64. type
  65. TFPgtkScrollText = class (TFPgtkScrolledWindow)
  66. private
  67. FText : TFPgtkText;
  68. procedure SetTooltip (Value : ansistring);
  69. function GetTooltip : ansistring;
  70. function GetUdpatePolicy : TGtkUpdateType;
  71. procedure SetUpdatePolicy (Value : TGtkUpdateType);
  72. function GetText : ansistring;
  73. procedure SetText (Value : ansistring);
  74. function GetLines : TStrings;
  75. public
  76. constructor create;
  77. procedure Clear;
  78. property TheText : TFPgtkText read FText;
  79. property Tooltip : ansistring read GetTooltip write SetTooltip;
  80. property UpdatePolicy : TGtkUpdateType read GetUdpatePolicy write SetUpdatePolicy;
  81. property Text : ansistring read GetText write SetText;
  82. property Lines : TStrings read GetLines;
  83. end;
  84. TFPgtkScrollList = class (TFPgtkScrolledWindow)
  85. private
  86. FList : TFPgtkList;
  87. public
  88. constructor create;
  89. property List : TFPgtkList read FList;
  90. end;
  91. TFPgtkScrollCList = class (TFPgtkScrolledWindow)
  92. private
  93. FCList : TFPgtkCList;
  94. public
  95. constructor create (CountColumns : integer);
  96. property CList : TFPgtkCList read FCList;
  97. end;
  98. TFPgtkScrollTree = class (TFPgtkScrolledWindow)
  99. private
  100. FTree : TFPgtkTree;
  101. public
  102. constructor create;
  103. property Tree : TFPgtkTree read FTree;
  104. end;
  105. { ==== Message dialogs ==== }
  106. type
  107. TModalResult = Low(Integer)..High(Integer);
  108. TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation, mtCustom);
  109. TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,
  110. mbAll, mbNoToAll, mbYesToAll, mbHelp);
  111. TMsgDlgButtons = set of TMsgDlgBtn;
  112. const
  113. mbYesNo = [mbYes,mbNo];
  114. mbYesNoCancel = [mbYes, mbNo, mbCancel];
  115. mbOKCancel = [mbOK, mbCancel];
  116. mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];
  117. mrNone = 0;
  118. mrOK = mrNone + 1;
  119. mrCancel = mrNone + 2;
  120. mrAbort = mrNone + 3;
  121. mrRetry = mrNone + 4;
  122. mrIgnore = mrNone + 5;
  123. mrYes = mrNone + 6;
  124. mrNo = mrNone + 7;
  125. mrAll = mrNone + 8;
  126. mrNoToAll = mrNone + 9;
  127. mrYesToAll = mrNone + 10;
  128. function MessageDlg(const aMsg: ansistring; DlgType: TMsgDlgType;
  129. Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
  130. function MessageDlg(const Fmt: ansistring; Args : Array of const; DlgType: TMsgDlgType;
  131. Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
  132. procedure ShowMessage (const aTitle, aMessage : ansistring);
  133. { ==== Menu handling ==== }
  134. type
  135. TAccelKeyDef = record
  136. Key : guint;
  137. Mods : TGdkModifierType;
  138. AG : PGtkAccelGroup;
  139. end;
  140. PAccelKeyDef = ^TAccelKeyDef;
  141. TAccelModifier = (amShift, amLock, amControl, amMod1, amMod2, amMod3, amMod4,
  142. amMod5, amButton1, amButton2, amButton3, amButton4, amButton5,
  143. amRelease);
  144. TAccelModifiersSet = set of TAccelModifier;
  145. const
  146. amAlt = amMod1;
  147. gdk_Alt_mask = gdk_mod1_Mask;
  148. DefaultAccelFlags : TGtkAccelFlags = GTK_ACCEL_VISIBLE;
  149. function RemoveUnderscore (s : ansistring) : ansistring;
  150. function ConvertAccelModifier (amSet : TAccelModifiersSet) : TGdkModifierType;
  151. function ConvertModifierType (Mods : TGdkModifierType) : TAccelModifiersSet;
  152. function MakeAccelKeyDef (aWindow : TFPgtkWindow; anAG : integer; aKey : guint; aMods : TGdkModifierType) : PAccelKeyDef; overload;
  153. function MakeAccelKeyDef (aWindow : TFPgtkWindow; anAG : integer; aKey : guint; aMods : TAccelModifiersSet) : PAccelKeyDef; overload;
  154. function MakeAccelKeyDef (anAG : PGtkAccelGroup; aKey : guint; aMods : TGdkModifierType) : PAccelKeyDef; overload;
  155. function MakeAccelKeyDef (anAG : PGtkAccelGroup; aKey : guint; aMods : TAccelModifiersSet) : PAccelKeyDef; overload;
  156. function NewMenuBar (items : array of TFPgtkMenuItem) : TFPgtkMenuBar;
  157. function NewMenu (ATitle : ansistring; items : array of TFPgtkMenuItem) : TFPgtkMenu;
  158. function NewMenuItem (ACaption, AToolTip, AprivText : ansistring; Accelerator : PAccelKeyDef;
  159. ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem; overload;
  160. function NewMenuItem (ACaption, AToolTip, AprivText : ansistring;
  161. ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem; overload;
  162. function NewMenuItem (ACaption : ansistring; Accelerator : PAccelKeyDef;
  163. ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem; overload;
  164. function NewMenuItem (ACaption : ansistring; ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem; overload;
  165. function NewMenuItem (ACaption : ansistring) : TFPgtkMenuItem; overload;
  166. function NewLine : TFPgtkMenuItem;
  167. function NewTearOffMenu : TFPgtkTearOffMenuItem;
  168. function NewSubMenu (ACaption, ATooltip, AprivText : ansistring; Accelerator : PAccelKeyDef;
  169. Items : array of TFPgtkMenuItem) : TFPgtkMenuItem; Overload;
  170. function NewSubMenu (ACaption, ATooltip, AprivText : ansistring;
  171. Items : array of TFPgtkMenuItem) : TFPgtkMenuItem; Overload;
  172. function NewSubMenu (ACaption : ansistring; Accelerator : PAccelKeyDef;
  173. Items : array of TFPgtkMenuItem) : TFPgtkMenuItem; Overload;
  174. function NewSubMenu (ACaption : ansistring; Items : array of TFPgtkMenuItem) : TFPgtkMenuItem; Overload;
  175. function NewCheckMenuItem (ACaption, AToolTip, AprivText : ansistring; Accelerator : PAccelKeyDef;
  176. ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem; Overload;
  177. function NewCheckMenuItem (ACaption, AToolTip, AprivText : ansistring;
  178. ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem; Overload;
  179. function NewCheckMenuItem (ACaption : ansistring; Accelerator : PAccelKeyDef;
  180. ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem; Overload;
  181. function NewCheckMenuItem (ACaption : ansistring; ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem; Overload;
  182. procedure InsertMenuItemGroup (InMenu : TFPgtkMenuShell; position : integer; MenuItems : TFPgtkItemGroup); Overload;
  183. procedure InsertMenuItemGroup (InMenu : TFPgtkMenuShell; position : integer;
  184. MenuItems : TFPgtkItemGroup; ActivateProc : TFPgtkSignalFunction; ActivateData : pointer); Overload;
  185. procedure AppendMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup); Overload;
  186. procedure AppendMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup;
  187. ActivateProc : TFPgtkSignalFunction; ActivateData : pointer); Overload;
  188. procedure PrependMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup); Overload;
  189. procedure PrependMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup;
  190. ActivateProc : TFPgtkSignalFunction; ActivateData : pointer); Overload;
  191. implementation
  192. resourcestring
  193. rsNothingToRun = 'No main window defined, nothing to do...';
  194. rsErrorTitle = 'Error occurred';
  195. rsMessageTitle = 'Message';
  196. sErrWrongItemType = 'Items in list are not from TFPgtkMenuItem class.';
  197. { TFPgtkApplication }
  198. constructor TFPgtkApplication.Create;
  199. begin
  200. gtk_init (@argc, @argv);
  201. inherited create;
  202. FMainWindow := nil;
  203. end;
  204. destructor TFPgtkApplication.Destroy;
  205. begin
  206. if assigned (FMainWindow) then
  207. FMainWindow.Free;
  208. gtk_Exit (0);
  209. inherited;
  210. end;
  211. procedure TFPgtkApplication.SetMainWindow (Value : TFPgtkWindow);
  212. begin
  213. if FMainWindow <> Value then
  214. begin
  215. if assigned (FMainWindow) and (FMainDestroySignal > 0) then
  216. FMainWindow.signalDisconnect (FMainDestroySignal);
  217. FMainWindow := Value;
  218. if Assigned (Value) then
  219. FMainDestroySignal := FMainWindow.ConnectDestroy (@MainDestroyed, nil);
  220. end;
  221. end;
  222. procedure TFPgtkApplication.MainDestroyed (Sender:TFPgtkObject; data:pointer);
  223. begin
  224. FMainWindow := nil;
  225. FMainDestroySignal := 0;
  226. gtk_main_quit;
  227. end;
  228. procedure TFPgtkApplication.Run;
  229. begin
  230. if assigned (FMainWindow) then
  231. while assigned (FMainWindow) do
  232. try
  233. FMainWindow.execute (nil, nil, nil);
  234. //gtk_main;
  235. FreeFPgtkObjects (nil);
  236. except
  237. on e : exception do
  238. ShowMessage (rsErrorTitle, e.message);
  239. end
  240. else
  241. ShowMessage (rsMessageTitle, rsNothingToRun);
  242. end;
  243. { TFPgtkScrollText }
  244. constructor TFPgtkScrollText.create;
  245. begin
  246. inherited create (nil,nil);
  247. FText := TFPgtkText.Create;
  248. Add (FText);
  249. HPolicy := Gtk_Policy_Never;
  250. end;
  251. function TFPgtkScrollText.GetTooltip : ansistring;
  252. begin
  253. result := inherited Tooltip;
  254. end;
  255. procedure TFPgtkScrollText.SetTooltip (Value : ansistring);
  256. begin
  257. TheText.Tooltip := Value;
  258. inherited Tooltip := Value;
  259. end;
  260. function TFPgtkScrollText.GetUdpatePolicy : TGtkUpdateType;
  261. begin
  262. result := VScrollbar.UpdatePolicy;
  263. end;
  264. procedure TFPgtkScrollText.Clear;
  265. begin
  266. if assigned(TheText) then
  267. TheText.Clear;
  268. end;
  269. procedure TFPgtkScrollText.SetUpdatePolicy (Value : TGtkUpdateType);
  270. begin
  271. VScrollbar.UpdatePolicy := Value;
  272. {$ifndef gtkwin}
  273. HScrollbar.UpdatePolicy := Value;
  274. {$endif}
  275. end;
  276. function TFPgtkScrollText.GetText : ansistring;
  277. begin
  278. if assigned(TheText) then
  279. begin
  280. result := TheText.Text;
  281. end
  282. else
  283. begin
  284. result := '';
  285. end;
  286. end;
  287. procedure TFPgtkScrollText.SetText (Value : ansistring);
  288. begin
  289. if assigned (TheText) then
  290. TheText.Text := Value;
  291. end;
  292. function TFPgtkScrollText.GetLines : TStrings;
  293. begin
  294. if assigned (TheText) then
  295. result := TheText.Lines
  296. else
  297. result := nil;
  298. end;
  299. { TFPgtkScrollList }
  300. constructor TFPgtkScrollList.create;
  301. begin
  302. inherited create (nil, nil);
  303. setusize (100, 40);
  304. FList := TFPgtkList.Create;
  305. AddWithViewport (FList);
  306. end;
  307. { TFPgtkScrollCList }
  308. constructor TFPgtkScrollCList.create (CountColumns : integer);
  309. begin
  310. inherited create (nil, nil);
  311. setusize (100, 40);
  312. FCList := TFPgtkCList.Create (CountColumns);
  313. Add (FCList);
  314. end;
  315. { TFPgtkScrollTree }
  316. constructor TFPgtkScrollTree.create;
  317. begin
  318. inherited create (nil, nil);
  319. FTree := TFPgtkTree.Create;
  320. AddWithViewport (FTree);
  321. FTree.Show;
  322. end;
  323. { Menu functions }
  324. function RemoveUnderscore (s : ansistring) : ansistring;
  325. begin
  326. result := stringreplace (s, '_', '', [rfReplaceAll]);
  327. end;
  328. type
  329. TFPgtkMenuItemType = class of TFPgtkMenuItem;
  330. function MakeAccelKeyDef (aWindow : TFPgtkWindow; anAG : integer; aKey : guint; aMods : TGdkModifierType) : PAccelKeyDef;
  331. begin
  332. new (result);
  333. with result^ do
  334. begin
  335. AG := aWindow.AccelGroups[anAG];
  336. Key := aKey;
  337. Mods := aMods;
  338. end;
  339. end;
  340. function MakeAccelKeyDef (aWindow : TFPgtkWindow; anAG : integer; aKey : guint; aMods : TAccelModifiersSet) : PAccelKeyDef;
  341. begin
  342. new (result);
  343. with result^ do
  344. begin
  345. AG := aWindow.AccelGroups[anAG];
  346. Key := aKey;
  347. Mods := ConvertAccelModifier (aMods);
  348. end;
  349. end;
  350. function MakeAccelKeyDef (anAG : PGtkAccelGroup; aKey : guint; aMods : TGdkModifierType) : PAccelKeyDef;
  351. begin
  352. new (result);
  353. with result^ do
  354. begin
  355. AG := anAG;
  356. Key := aKey;
  357. Mods := aMods;
  358. end;
  359. end;
  360. function MakeAccelKeyDef (anAG : PGtkAccelGroup; aKey : guint; aMods : TAccelModifiersSet) : PAccelKeyDef;
  361. begin
  362. new (result);
  363. with result^ do
  364. begin
  365. AG := anAG;
  366. Key := aKey;
  367. Mods := ConvertAccelModifier (aMods);
  368. end;
  369. end;
  370. function ConvertAccelModifier (amSet : TAccelModifiersSet) : TGdkModifierType;
  371. var am : TAccelModifier;
  372. begin
  373. result := 0;
  374. for am := low(TAccelModifier) to high (TAccelModifier) do
  375. if am in amSet then
  376. result := result + (1 shl ord(am));
  377. end;
  378. function ConvertModifierType (Mods : TGdkModifierType) : TAccelModifiersSet;
  379. var am : TAccelModifier;
  380. begin
  381. result := [];
  382. for am := low(TAccelModifier) to high (TAccelModifier) do
  383. if (Mods and (1 shl ord(am))) <> 0 then
  384. result := result + [am];
  385. end;
  386. function NewMenuBar (items : array of TFPgtkMenuItem) : TFPgtkMenuBar;
  387. var r : integer;
  388. begin
  389. result := TFPgtkMenuBar.Create;
  390. with result do
  391. for r := low(items) to high (items) do
  392. append (items[r]);
  393. end;
  394. function NewMenu (ATitle : ansistring; items : array of TFPgtkMenuItem) : TFPgtkMenu;
  395. var r : integer;
  396. AG : PGtkAccelGroup;
  397. m : TFPgtkMenuItem;
  398. begin
  399. result := TFPgtkMenu.Create;
  400. with result do
  401. begin
  402. Title := ATitle;
  403. ag := AccelGroup;
  404. for r := low(items) to high(items) do
  405. begin
  406. m := items[r];
  407. Append (m);
  408. if m.AccelKey <> 0 then
  409. m.AcceleratorAdd (AG, sgActivateItem, m.AccelKey, 0, TGtkAccelFlags(0));
  410. end;
  411. end;
  412. end;
  413. function CreateMenuItem (Atype : TFPgtkMenuItemType; ACaption, ATooltip,
  414. APrivText : ansistring; Accelerator : PAccelKeyDef) : TFPgtkMenuItem;
  415. begin
  416. result := AType.CreateWithLabel (ACaption);
  417. if (ATooltip <> '') or (APrivText <> '') then
  418. result.Tooltip := ComposeTooltip (ATooltip, APrivText);
  419. if assigned(accelerator) then
  420. begin
  421. with Accelerator^ do
  422. result.AcceleratorAdd (AG, sgActivateItem, Key, Mods, DefaultAccelFlags);
  423. dispose (Accelerator);
  424. end;
  425. end;
  426. function NewMenuItem (ACaption, AToolTip, AprivText : ansistring; Accelerator : PAccelKeyDef;
  427. ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem;
  428. begin
  429. result := CreateMenuItem (TFPgtkMenuItem, ACaption, ATooltip, APrivtext, Accelerator);
  430. if assigned (ActivateFunc) then
  431. result.ConnectActivate (ActivateFunc, AData);
  432. end;
  433. function NewMenuItem (ACaption, AToolTip, AprivText : ansistring;
  434. ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem;
  435. begin
  436. result := NewMenuItem (aCaption, aTooltip, aPrivText, nil, ActivateFunc, aData);
  437. end;
  438. function NewMenuItem (ACaption : ansistring; Accelerator : PAccelKeyDef;
  439. ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem;
  440. begin
  441. result := NewMenuItem (aCaption, '', '', Accelerator, ActivateFunc, aData);
  442. end;
  443. function NewMenuItem (ACaption : ansistring; ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem;
  444. begin
  445. result := NewMenuItem (aCaption, '', '', nil, ActivateFunc, aData);
  446. end;
  447. function NewMenuItem (ACaption : ansistring) : TFPgtkMenuItem;
  448. begin
  449. result := NewMenuItem (aCaption, '', '', nil, nil, nil);
  450. end;
  451. function NewLine : TFPgtkMenuItem;
  452. begin
  453. result := TFPgtkMenuItem.Create;
  454. end;
  455. function NewTearOffMenu : TFPgtkTearOffMenuItem;
  456. begin
  457. result := TFPgtkTearOffMenuItem.create;
  458. end;
  459. function NewSubMenu (ACaption, ATooltip, AprivText : ansistring; Accelerator : PAccelKeyDef;
  460. Items : array of TFPgtkMenuItem) : TFPgtkMenuItem;
  461. begin
  462. result := CreateMenuItem (TFPgtkMenuItem, ACaption, ATooltip, APrivText, Accelerator);
  463. result.SetSubmenu (NewMenu ('', Items));
  464. end;
  465. function NewSubMenu (ACaption, ATooltip, AprivText : ansistring;
  466. Items : array of TFPgtkMenuItem) : TFPgtkMenuItem;
  467. begin
  468. result := NewSubMenu (aCaption, aTooltip, aPrivText, nil, Items);
  469. end;
  470. function NewSubMenu (ACaption : ansistring; Accelerator : PAccelKeyDef;
  471. Items : array of TFPgtkMenuItem) : TFPgtkMenuItem;
  472. begin
  473. result := NewSubMenu (aCaption, '', '', Accelerator, Items);
  474. end;
  475. function NewSubMenu (ACaption : ansistring; Items : array of TFPgtkMenuItem) : TFPgtkMenuItem;
  476. begin
  477. result := NewSubMenu (aCaption, '', '', nil, Items);
  478. end;
  479. function NewCheckMenuItem (ACaption, AToolTip, AprivText : ansistring; Accelerator : PAccelKeyDef;
  480. ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem;
  481. begin
  482. result := TFPgtkCheckMenuItem(CreateMenuItem (TFPgtkCheckMenuItem, ACaption, ATooltip, APrivText, Accelerator));
  483. if assigned (ToggledFunc) then
  484. Result.ConnectToggled (ToggledFunc, AData);
  485. end;
  486. function NewCheckMenuItem (ACaption, AToolTip, AprivText : ansistring;
  487. ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem;
  488. begin
  489. result := NewCheckMenuItem (aCaption, aToolTip, aPrivText, nil, ToggledFunc, AData);
  490. end;
  491. function NewCheckMenuItem (ACaption : ansistring; Accelerator : PAccelKeyDef;
  492. ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem;
  493. begin
  494. result := NewCheckMenuItem (aCaption, '', '', Accelerator, ToggledFunc, AData);
  495. end;
  496. function NewCheckMenuItem (ACaption : ansistring; ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem;
  497. begin
  498. result := NewCheckMenuItem (aCaption, '', '', nil, ToggledFunc, AData);
  499. end;
  500. procedure InsertMenuItemGroup (InMenu : TFPgtkMenuShell; position : integer; MenuItems : TFPgtkItemGroup);
  501. begin
  502. InsertMenuItemGroup (InMenu, position, MenuItems, nil, nil);
  503. end;
  504. procedure InsertMenuItemGroup (InMenu : TFPgtkMenuShell; position : integer;
  505. MenuItems : TFPgtkItemGroup; ActivateProc : TFPgtkSignalFunction; ActivateData : pointer);
  506. var r : integer;
  507. begin
  508. if (MenuItems.count > 0) then
  509. if (MenuItems.items[0] is TFPgtkMenuItem) then
  510. with InMenu do
  511. for r := MenuItems.count-1 downto 0 do
  512. begin
  513. if assigned(ActivateProc) then
  514. if assigned (ActivateData) then
  515. TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, ActivateData)
  516. else
  517. TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, inttopointer(r));
  518. Insert (TFPgtkMenuItem(MenuItems.items[r]), position);
  519. end
  520. else
  521. raise FPgtkException.Create (sErrWrongItemType);
  522. end;
  523. procedure AppendMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup);
  524. begin
  525. AppendMenuItemGroup (InMenu, MenuItems, nil, nil);
  526. end;
  527. procedure AppendMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup;
  528. ActivateProc : TFPgtkSignalFunction; ActivateData : pointer);
  529. var r : integer;
  530. begin
  531. if (MenuItems.count > 0) then
  532. if MenuItems.items[0] is TFPgtkMenuItem then
  533. with InMenu do
  534. for r := 0 to MenuItems.count-1 do
  535. begin
  536. if assigned(ActivateProc) then
  537. if assigned (ActivateData) then
  538. TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, ActivateData)
  539. else
  540. TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, inttopointer(r));
  541. Append (TFPgtkMenuItem(MenuItems.items[r]));
  542. end
  543. else
  544. raise FPgtkException.Create (sErrWrongItemType);
  545. end;
  546. procedure PrependMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup);
  547. begin
  548. PrependMenuItemGroup (InMenu, MenuItems, nil, nil);
  549. end;
  550. procedure PrependMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup;
  551. ActivateProc : TFPgtkSignalFunction; ActivateData : pointer);
  552. var r : integer;
  553. begin
  554. if (MenuItems.count > 0) then
  555. if MenuItems.items[0] is TFPgtkMenuItem then
  556. with InMenu do
  557. for r := MenuItems.count-1 downto 0 do
  558. begin
  559. if assigned(ActivateProc) then
  560. if assigned (ActivateData) then
  561. TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, ActivateData)
  562. else
  563. TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, inttopointer(r));
  564. Prepend (TFPgtkMenuItem(MenuItems.items[r]));
  565. end
  566. else
  567. raise FPgtkException.Create (sErrWrongItemType);
  568. end;
  569. { TFileEntryDialog }
  570. type
  571. TFileEntryDialog = class (TFPgtkFileSelection)
  572. public
  573. constructor create (AType:TGtkWindowType);
  574. procedure DoDialogInit (InitData : pointer); override;
  575. end;
  576. PFileEntryData = ^TFileEntryData;
  577. TFileEntryData = record
  578. aFilename : ansistring;
  579. end;
  580. constructor TFileEntryDialog.Create (AType:TGtkWindowType);
  581. begin
  582. inherited;
  583. OKButton.ConnectClicked (@CloseWithResult, inttopointer(drOk));
  584. CancelButton.ConnectClicked (@CloseWindow, nil);
  585. end;
  586. procedure TFileEntryDialog.DoDialogInit (InitData : pointer);
  587. begin
  588. with PFileEntryData(InitData)^ do
  589. Filename := aFilename;
  590. end;
  591. { TFPgtkFileEntry }
  592. const
  593. FileEntryXPM =
  594. '16 13 4 1'#13#10+
  595. '. c None'#13#10+ // no color
  596. '# c #000000'#13#10+ // black
  597. 'y c #ffff00'#13#10+ // yellow
  598. 'g c #AFAF00'#13#10+ // grayed yellow
  599. '.......#####....'#13#10+
  600. '............#.#.'#13#10+
  601. '.............##.'#13#10+
  602. '..####......###.'#13#10+
  603. '##yyyy#####.....'#13#10+
  604. '#yyyyyyyyy#.....'#13#10+
  605. '#yyyyyyyyy#.....'#13#10+
  606. '#yyyy###########'#13#10+
  607. '#yyy#ggggggggg#.'#13#10+
  608. '#yy#ggggggggg#..'#13#10+
  609. '#y#ggggggggg#...'#13#10+
  610. '##ggggggggg#....'#13#10+
  611. '###########.....';
  612. var
  613. DefFileEntryPixmap : PGdkPixmap;
  614. DefFileEntryBitmask : PGdkBitmap;
  615. constructor TFPgtkFileEntry.create;
  616. begin
  617. inherited;
  618. FEdit := TFPgtkEntry.Create;
  619. FButton := TFPgtkButton.Create;
  620. FImage := TFPgtkPixMap.Create;
  621. with FImage do
  622. if assigned (DefFileEntryPixmap) then
  623. SetPixmap (DefFileEntryPixmap, DefFileEntryBitmask)
  624. else
  625. begin
  626. loadfromtext (FileEntryXPM);
  627. GetPixmap (DefFileEntryPixmap, DefFileEntryBitmask);
  628. end;
  629. with FButton do
  630. begin
  631. Add (FImage);
  632. ConnectClicked (@OpenFileSelection, self);
  633. end;
  634. PackStart (FEdit, true, true, 0);
  635. PackStart (FButton, false, true, 0);
  636. end;
  637. procedure TFPgtkFileEntry.SetFilename (Value : ansistring);
  638. begin
  639. FEdit.Text := Value;
  640. end;
  641. function TFPgtkFileEntry.GetFilename : ansistring;
  642. begin
  643. result := FEdit.Text;
  644. end;
  645. procedure TFPgtkFileEntry.OpenFileSelection (Sender : TFPgtkObject; data : pointer);
  646. var d : TFileEntryData;
  647. begin
  648. d.aFilename := Filename;
  649. with TFileEntryDialog.Create(gtk_window_dialog) do
  650. Execute (nil, @d, @CloseFileSelection);
  651. end;
  652. procedure TFPgtkFileEntry.CloseFileSelection (Sender:TFPgtkWindow; DialogResult:pointer;
  653. Action:integer; initiator:TFPgtkObject);
  654. begin
  655. if action = drOk then
  656. Filename := (Sender as TFileEntryDialog).Filename;
  657. end;
  658. { TFPgtkCheckedButton }
  659. const
  660. XPMChecked : array [0..17] of ansistring = (
  661. '15 13 4 1',
  662. '. c None', // None
  663. '# c #000000', // Black
  664. '- c #FFFFFF', // White
  665. 'o c #0000FF', // Blue
  666. '..............o',
  667. '.............o-',
  668. '............o-.',
  669. '..########.o-..',
  670. '..#......#o-...',
  671. '..#......o-....',
  672. '..o-....oo-....',
  673. '.ooo-..oo-.....',
  674. '..ooo-oo-#.....',
  675. '..#oooo-.#.....',
  676. '..##ooo-##.....',
  677. '.....o-........',
  678. '...............');
  679. XPMUnChecked : array [0..17] of ansistring = (
  680. '15 13 4 1',
  681. '. c None', // None
  682. '# c #000000', // Black
  683. '- c #FFFFFF', // White
  684. 'o c #0000FF', // Blue
  685. '...............',
  686. '...............',
  687. '...............',
  688. '..########.....',
  689. '..#......#.....',
  690. '..#......#.....',
  691. '..#......#.....',
  692. '..#......#.....',
  693. '..#......#.....',
  694. '..#......#.....',
  695. '..########.....',
  696. '...............',
  697. '...............');
  698. var
  699. DefChecked, DefUnchecked : PGdkPixmap;
  700. DefCheckedBM, DefUncheckedBM : PGdkBitmap;
  701. procedure TFPgtkCheckedButton.ChangeCheck (Sender:TFPgtkObject; data:pointer);
  702. var b : boolean;
  703. begin
  704. b := Active;
  705. FChecked.visible := b;
  706. FUnchecked.visible := not b;
  707. end;
  708. constructor TFPgtkCheckedButton.CreateWithLabel (aText:ansistring);
  709. begin
  710. create;
  711. Text := aText;
  712. end;
  713. constructor TFPgtkCheckedButton.CreateWithLabel (aText:ansistring; AccelGroup : PGtkAccelGroup);
  714. begin
  715. create;
  716. Text := aText;
  717. if (AccelKey <> 0) and assigned(AccelGroup) then
  718. AcceleratorAdd (AccelGroup, sgClicked, AccelKey, DefaultButtonModifiers, GTK_ACCEL_Visible);
  719. end;
  720. constructor TFPgtkCheckedButton.create;
  721. begin
  722. inherited;
  723. DrawIndicator := False;
  724. AddContainer := TFPgtkHBox.Create;
  725. Add (AddContainer);
  726. FChecked := TFPgtkPixMap.Create;
  727. with FChecked do
  728. if assigned (DefChecked) then
  729. SetPixmap (DefChecked, DefCheckedBM)
  730. else
  731. begin
  732. loadfromArray (XPMChecked);
  733. GetPixmap (DefChecked, DefCheckedBM);
  734. end;
  735. FUnchecked := TFPgtkPixMap.Create;
  736. with FUnchecked do
  737. if assigned (DefUnchecked) then
  738. SetPixmap (DefUnchecked, DefUncheckedBM)
  739. else
  740. begin
  741. loadfromArray (XPMUnchecked);
  742. GetPixmap (DefUnchecked, DefUncheckedBM);
  743. end;
  744. with TFPgtkBox(AddContainer) do
  745. begin
  746. PackStart (FChecked, false, false, 0);
  747. PackStart (FUnChecked, false, false, 0);
  748. end;
  749. ChangeCheck (self, nil);
  750. ConnectToggled (@ChangeCheck, nil);
  751. end;
  752. { ShowMessage }
  753. resourcestring
  754. rsOk = ' Ok ';
  755. function MessageWindow (aTitle, aMessage : ansistring) : TFPgtkWindow;
  756. var b : TFPgtkBox;
  757. but : TFPgtkButton;
  758. l : TFPgtkLabel;
  759. AG : integer;
  760. bb : TFPgtkButtonBox;
  761. begin
  762. result := TFPgtkWindow.create (gtk_window_dialog);
  763. result.setDefaultSize (200,25);
  764. result.title := aTitle;
  765. AG := result.AccelGroupNew;
  766. b := TFPgtkVBox.create;
  767. b.Homogeneous := false;
  768. b.border := 15;
  769. b.spacing := 15;
  770. l := TFPgtkLabel.Create (aMessage);
  771. b.Packstart (l, true, true, 0); // Text to show
  772. bb := TFPgtkHButtonBox.create;
  773. bb.Layout := GTK_BUTTONBOX_DEFAULT_STYLE;
  774. b.PackEnd (bb, false, false, 0);
  775. but := TFPgtkButton.CreateWithLabel (rsOk); // Ok button to close
  776. but.ConnectClicked (@(result.CloseWindow), nil);
  777. result.AcceleratorAdd (AG, but, sgClicked, gdk_Cancel, 0, TGTKAccelFlags(0));
  778. result.AcceleratorAdd (AG, but, sgClicked, gdk_Return, 0, TGTKAccelFlags(0));
  779. bb.add (but);
  780. result.Add (b);
  781. end;
  782. procedure ShowMessage (const aTitle, aMessage : ansistring);
  783. begin
  784. with MessageWindow (aTitle, aMessage) do
  785. Execute (nil, nil, nil);
  786. end;
  787. { MessageDialog }
  788. type
  789. TMessageDialogWindow = Class(TFPgtkWindow)
  790. FImage : TFPGtkPixMap;
  791. FLabel : TFPGtkLabel;
  792. FLTable : TFPgtkTable;
  793. FVBox : TFPgtkVBox;
  794. FButtonBox: TFPgtkButtonBox;
  795. Constructor Create(AMsg:ansistring; DlgType:TMsgDlgType; Buttons: TMsgDlgButtons);
  796. Procedure CreateButtons(Buttons: TMsgDlgButtons);
  797. end;
  798. const
  799. IMGInfo : Array[1..37] of ansistring = ('32 32 4 1',
  800. '. c None',
  801. ' c None',
  802. 'a c #ffffff', //#c3c3c3',
  803. '# c #0000ff',
  804. '............#######.............',
  805. '.........###aaaaaaa###..........',
  806. '.......##aaaaaaaaaaaaa##........',
  807. '......#aaaaaaa###aaaaaaa#.......',
  808. '.....#aaaaaaa#####aaaaaaa#......',
  809. '....#aaaaaaa#######aaaaaaa#.....',
  810. '...#aaaaaaaa#######aaaaaaaa#....',
  811. '..#aaaaaaaaa#######aaaaaaaaa#...',
  812. '..#aaaaaaaaaa#####aaaaaaaaaa#...',
  813. '.#aaaaaaaaaaaa###aaaaaaaaaaaa#..',
  814. '.#aaaaaaaaaaaaaaaaaaaaaaaaaaa#..',
  815. '.#aaaaaaaaaaa#####aaaaaaaaaaa#..',
  816. '#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
  817. '#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
  818. '#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
  819. '#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
  820. '#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
  821. '#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
  822. '#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
  823. '.#aaaaaaaaaaa#####aaaaaaaaaaa#..',
  824. '.#aaaaaaaaaaa#####aaaaaaaaaaa#..',
  825. '.#aaaaaaaaaa#######aaaaaaaaaa#..',
  826. '..#aaaaaaaaa#######aaaaaaaaa#...',
  827. '..#aaaaaaaaa#######aaaaaaaaa#...',
  828. '...#aaaaaaaaaaaaaaaaaaaaaaa#....',
  829. '....#aaaaaaaaaaaaaaaaaaaaa#.....',
  830. '.....#aaaaaaaaaaaaaaaaaaa#......',
  831. '......#aaaaaaaaaaaaaaaaa#.......',
  832. '.......##aaaaaaaaaaaaa##........',
  833. '.........###aaaaaaa###..........',
  834. '............#######.............',
  835. '................................');
  836. IMGWarning :Array[1..37] of ansistring = ('32 32 4 1',
  837. '# c #000000',
  838. 'b c #9c999c',
  839. '. c None',
  840. 'a c #ffff00',
  841. '.............###................',
  842. '............#aaa#...............',
  843. '...........#aaaaa#b.............',
  844. '...........#aaaaa#bb............',
  845. '..........#aaaaaaa#bb...........',
  846. '..........#aaaaaaa#bb...........',
  847. '.........#aaaaaaaaa#bb..........',
  848. '.........#aaaaaaaaa#bb..........',
  849. '........#aaaaaaaaaaa#bb.........',
  850. '........#aaaa###aaaa#bb.........',
  851. '.......#aaaa#####aaaa#bb........',
  852. '.......#aaaa#####aaaa#bb........',
  853. '......#aaaaa#####aaaaa#bb.......',
  854. '......#aaaaa#####aaaaa#bb.......',
  855. '.....#aaaaaa#####aaaaaa#bb......',
  856. '.....#aaaaaa#####aaaaaa#bb......',
  857. '....#aaaaaaaa###aaaaaaaa#bb.....',
  858. '....#aaaaaaaa###aaaaaaaa#bb.....',
  859. '...#aaaaaaaaa###aaaaaaaaa#bb....',
  860. '...#aaaaaaaaaa#aaaaaaaaaa#bb....',
  861. '..#aaaaaaaaaaa#aaaaaaaaaaa#bb...',
  862. '..#aaaaaaaaaaaaaaaaaaaaaaa#bb...',
  863. '.#aaaaaaaaaaaa##aaaaaaaaaaa#bb..',
  864. '.#aaaaaaaaaaa####aaaaaaaaaa#bb..',
  865. '#aaaaaaaaaaaa####aaaaaaaaaaa#bb.',
  866. '#aaaaaaaaaaaaa##aaaaaaaaaaaa#bb.',
  867. '#aaaaaaaaaaaaaaaaaaaaaaaaaaa#bbb',
  868. '#aaaaaaaaaaaaaaaaaaaaaaaaaaa#bbb',
  869. '.#aaaaaaaaaaaaaaaaaaaaaaaaa#bbbb',
  870. '..#########################bbbbb',
  871. '....bbbbbbbbbbbbbbbbbbbbbbbbbbb.',
  872. '.....bbbbbbbbbbbbbbbbbbbbbbbbb..');
  873. IMGError : Array[1..37] of ansistring = ('32 32 4 1',
  874. '. c None',
  875. 'b c #808080',
  876. '# c #c00000',
  877. 'a c #ffffff',
  878. '................................',
  879. '................................',
  880. '................................',
  881. '............#######.............',
  882. '...........###########..........',
  883. '........###############.........',
  884. '.......##################.......',
  885. '......####################......',
  886. '.....###aa############aa###.....',
  887. '.....###aaa##########aaa###.....',
  888. '....#####aaa########aaa#####....',
  889. '....######aaa######aaa######....',
  890. '...########aaa####aaa########...',
  891. '...#########aaa##aaa#########b..',
  892. '...##########aaaaaa##########b..',
  893. '...###########aaaa###########b..',
  894. '...###########aaaa###########b..',
  895. '...##########aaaaaa##########b..',
  896. '...#########aaa##aaa#########b..',
  897. '...########aaa####aaa#######bb..',
  898. '....######aaa######aaa######bb..',
  899. '.....####aaa########aaa#####bb..',
  900. '.....###aaa##########aaa###bbb..',
  901. '.....###aa############aa##bbb...',
  902. '......####################bb....',
  903. '.......##################bb.....',
  904. '.........###############bb......',
  905. '..........###########bbbb.......',
  906. '.............#######bbb.........',
  907. '................................',
  908. '................................',
  909. '................................');
  910. IMGConfirmation : Array[1..37] of ansistring = ('32 32 4 1',
  911. '. c None',
  912. 'b c #808080',
  913. 'a c #c00000',
  914. '# c #ffffff',
  915. '................................',
  916. '................................',
  917. '................................',
  918. '................................',
  919. '.............######.............',
  920. '..........###########...........',
  921. '.........##############.........',
  922. '........################........',
  923. '.......##################.......',
  924. '......########aaaaa#######......',
  925. '.....########aaaaaaa#######.....',
  926. '.....#######aa#####aa######.....',
  927. '.....#######a######aa#######....',
  928. '....###############aa#######b...',
  929. '....###############aa#######bb..',
  930. '....##############aa########bb..',
  931. '....#############aa#########bb..',
  932. '....############aa##########bb..',
  933. '....###########aa###########bb..',
  934. '.....##########aa##########bbb..',
  935. '.....##########aa##########bbb..',
  936. '.....##########aa##########bb...',
  937. '......#########aa#########bb....',
  938. '.......##################bbb....',
  939. '........#######aa#######bbb.....',
  940. '.........######aa######bbb......',
  941. '...........###########bbb.......',
  942. '.............######bbbbb........',
  943. '................................',
  944. '................................',
  945. '................................',
  946. '................................');
  947. Constructor TMessageDialogWindow.Create(AMsg : ansistring;DlgType:TMsgDlgType;Buttons: TMsgDlgButtons);
  948. const
  949. OH = GTK_FILL OR GTK_EXPAND;
  950. begin
  951. Inherited Create(GTK_WINDOW_DIALOG);
  952. FVBox:=TFPGtkVBox.Create;
  953. FVBox.Spacing:=4;
  954. FVBox.Border:=8;
  955. Add(FVBox);
  956. FLTable:=TFpgtkTable.Create(10,1);
  957. if DlgType <> mtCustom then
  958. begin
  959. FImage:=TFPGtkPixMap.Create;
  960. With FImage do
  961. Case DlgType of
  962. mtInformation : LoadFromArray(Imginfo);
  963. mtWarning : LoadFromArray(imgWarning);
  964. mtConfirmation : LoadFromArray(imgConfirmation);
  965. mtError : LoadFromArray(imgError);
  966. end;
  967. FLTable.Attach(FImage,1,2,0,1,OH,OH,0,0);
  968. end;
  969. FLabel:=TFPGtkLabel.Create(Amsg);
  970. FLTable.Attach(FLabel,4,9,0,1,OH,OH,0,0);
  971. FButtonBox:=TFPgtkHButtonBox.Create;
  972. with FButtonBox do
  973. begin
  974. Layout := GTK_BUTTONBOX_DEFAULT_STYLE;
  975. spacing := 4;
  976. end;
  977. CreateButtons(Buttons);
  978. FVBox.PackStart(FLTable,false,False,8);
  979. FVBox.PackStart(FButtonBox,false,False,8);
  980. end;
  981. Const
  982. ButtonText : Array[TMsgDlgBtn] of ansistring =
  983. ('Yes', 'No', 'OK', 'Cancel','Abort', 'Retry', 'Ignore',
  984. 'All', 'NoToAll', 'YesToAll', 'Help');
  985. ButtonResult : array [TMsgDlgbtn] of TModalResult =
  986. (mrYes, mrNo, mrOK, mrCAncel, mrAbort, mrRetry, mrIgnore,
  987. mrAll, mrNoToAll, mrYesToAll, 0);
  988. Procedure TMessageDialogWindow.CreateButtons(Buttons: TMsgDlgButtons);
  989. Var
  990. b : TMsgDlgBtn;
  991. bw : TFPGtkButton;
  992. begin
  993. For B:=Low(TMsgDlgBtn) to high(TMsgDlgBtn) do
  994. If b in Buttons then
  995. begin
  996. BW:=TFPGtkButton.CreateWithLabel(ButtonText[b]);
  997. BW.ConnectClicked(@CloseWithResult,IntToPointer(ButtonResult[b]));
  998. BW.Setusize(50,25);
  999. FButtonBox.PackStart(BW,False,False,4);
  1000. end;
  1001. end;
  1002. function MessageDlg(const aMsg: ansistring; DlgType: TMsgDlgType;
  1003. Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
  1004. begin
  1005. With TMessageDialogWindow.Create(AMsg,DlgType,Buttons) do
  1006. Result:=Execute(Nil,Nil,Nil);
  1007. end;
  1008. function MessageDlg(const Fmt: ansistring; Args : Array of const; DlgType: TMsgDlgType;
  1009. Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
  1010. begin
  1011. Result:=MessageDlg(Format(Fmt,Args),Dlgtype,Buttons,HelpCtx);
  1012. end;
  1013. end.