fpc/packages/extra/fpgtk/fpgtkext.pp
2002-11-21 19:46:29 +00:00

1138 lines
35 KiB
ObjectPascal

{$mode objfpc}{$h+}
unit FPgtkExt;
interface
uses FPgtk, gtk, gdk, glib, sysutils, classes;
{ ==== Application object ==== }
type
TFPgtkApplication = class
Private
FMainwindow : TFPgtkWindow;
FMainDestroysignal : guint;
procedure SetMainWindow (Value:TFPgtkWindow);
procedure MainDestroyed (Sender:TFPgtkObject; data:pointer);
Public
constructor Create;
destructor Destroy; override;
procedure Run;
property Mainwindow : TFPgtkWindow read FMainwindow write SetMainwindow;
end;
var
Application : TFPgtkApplication;
{ ==== Extra Widgets ==== }
type
TFPgtkFileEntry = class (TFPgtkHBox)
private
FEdit : TFPgtkEntry;
FButton : TFPgtkButton;
FImage : TFPgtkPixmap;
procedure OpenFileSelection (Sender : TFPgtkObject; data : pointer);
procedure CloseFileSelection (Sender:TFPgtkWindow; DialogResult:pointer;
Action:integer; initiator:TFPgtkObject);
procedure SetFilename (Value : string);
function GetFilename : string;
public
constructor create;
property Edit : TFPgtkEntry read FEdit;
property Button : TFPgtkButton read FButton;
property Image : TFPgtkPixmap read FImage;
property Filename : string read GetFilename write SetFilename;
end;
TFPgtkCheckedButton = class (TFPgtkToggleButton)
private
FChecked, FUnchecked : TFPgtkPixmap;
procedure ChangeCheck (Sender:TFPgtkObject; data:pointer);
public
constructor Create;
constructor CreateWithLabel (aText:string);
constructor CreateWithLabel (aText:string; AccelGroup : PGtkAccelGroup);
end;
{ ==== Widget who needs a scrollwindow ==== }
type
TFPgtkScrollText = class (TFPgtkScrolledWindow)
private
FText : TFPgtkText;
procedure SetTooltip (Value : string);
function GetTooltip : string;
function GetUdpatePolicy : TGtkUpdateType;
procedure SetUpdatePolicy (Value : TGtkUpdateType);
function GetText : string;
procedure SetText (Value : string);
function GetLines : TStrings;
public
constructor create;
procedure Clear;
property TheText : TFPgtkText read FText;
property Tooltip : string read GetTooltip write SetTooltip;
property UpdatePolicy : TGtkUpdateType read GetUdpatePolicy write SetUpdatePolicy;
property Text : string read GetText write SetText;
property Lines : TStrings read GetLines;
end;
TFPgtkScrollList = class (TFPgtkScrolledWindow)
private
FList : TFPgtkList;
public
constructor create;
property List : TFPgtkList read FList;
end;
TFPgtkScrollCList = class (TFPgtkScrolledWindow)
private
FCList : TFPgtkCList;
public
constructor create (CountColumns : integer);
property CList : TFPgtkCList read FCList;
end;
TFPgtkScrollTree = class (TFPgtkScrolledWindow)
private
FTree : TFPgtkTree;
public
constructor create;
property Tree : TFPgtkTree read FTree;
end;
{ ==== Message dialogs ==== }
type
TModalResult = Low(Integer)..High(Integer);
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation, mtCustom);
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,
mbAll, mbNoToAll, mbYesToAll, mbHelp);
TMsgDlgButtons = set of TMsgDlgBtn;
const
mbYesNo = [mbYes,mbNo];
mbYesNoCancel = [mbYes, mbNo, mbCancel];
mbOKCancel = [mbOK, mbCancel];
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];
mrNone = 0;
mrOK = mrNone + 1;
mrCancel = mrNone + 2;
mrAbort = mrNone + 3;
mrRetry = mrNone + 4;
mrIgnore = mrNone + 5;
mrYes = mrNone + 6;
mrNo = mrNone + 7;
mrAll = mrNone + 8;
mrNoToAll = mrNone + 9;
mrYesToAll = mrNone + 10;
function MessageDlg(const aMsg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
function MessageDlg(const Fmt: string; Args : Array of const; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
procedure ShowMessage (const aTitle, aMessage : string);
{ ==== Menu handling ==== }
type
TAccelKeyDef = record
Key : guint;
Mods : TGdkModifierType;
AG : PGtkAccelGroup;
end;
PAccelKeyDef = ^TAccelKeyDef;
TAccelModifier = (amShift, amLock, amControl, amMod1, amMod2, amMod3, amMod4,
amMod5, amButton1, amButton2, amButton3, amButton4, amButton5,
amRelease);
TAccelModifiersSet = set of TAccelModifier;
const
amAlt = amMod1;
gdk_Alt_mask = gdk_mod1_Mask;
DefaultAccelFlags : TGtkAccelFlags = GTK_ACCEL_VISIBLE;
function RemoveUnderscore (s : string) : string;
function ConvertAccelModifier (amSet : TAccelModifiersSet) : TGdkModifierType;
function ConvertModifierType (Mods : TGdkModifierType) : TAccelModifiersSet;
function MakeAccelKeyDef (aWindow : TFPgtkWindow; anAG : integer; aKey : guint; aMods : TGdkModifierType) : PAccelKeyDef; overload;
function MakeAccelKeyDef (aWindow : TFPgtkWindow; anAG : integer; aKey : guint; aMods : TAccelModifiersSet) : PAccelKeyDef; overload;
function MakeAccelKeyDef (anAG : PGtkAccelGroup; aKey : guint; aMods : TGdkModifierType) : PAccelKeyDef; overload;
function MakeAccelKeyDef (anAG : PGtkAccelGroup; aKey : guint; aMods : TAccelModifiersSet) : PAccelKeyDef; overload;
function NewMenuBar (items : array of TFPgtkMenuItem) : TFPgtkMenuBar;
function NewMenu (ATitle : string; items : array of TFPgtkMenuItem) : TFPgtkMenu;
function NewMenuItem (ACaption, AToolTip, AprivText : string; Accelerator : PAccelKeyDef;
ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem; overload;
function NewMenuItem (ACaption, AToolTip, AprivText : string;
ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem; overload;
function NewMenuItem (ACaption : string; Accelerator : PAccelKeyDef;
ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem; overload;
function NewMenuItem (ACaption : string; ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem; overload;
function NewMenuItem (ACaption : string) : TFPgtkMenuItem; overload;
function NewLine : TFPgtkMenuItem;
function NewTearOffMenu : TFPgtkTearOffMenuItem;
function NewSubMenu (ACaption, ATooltip, AprivText : string; Accelerator : PAccelKeyDef;
Items : array of TFPgtkMenuItem) : TFPgtkMenuItem; Overload;
function NewSubMenu (ACaption, ATooltip, AprivText : string;
Items : array of TFPgtkMenuItem) : TFPgtkMenuItem; Overload;
function NewSubMenu (ACaption : string; Accelerator : PAccelKeyDef;
Items : array of TFPgtkMenuItem) : TFPgtkMenuItem; Overload;
function NewSubMenu (ACaption : string; Items : array of TFPgtkMenuItem) : TFPgtkMenuItem; Overload;
function NewCheckMenuItem (ACaption, AToolTip, AprivText : string; Accelerator : PAccelKeyDef;
ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem; Overload;
function NewCheckMenuItem (ACaption, AToolTip, AprivText : string;
ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem; Overload;
function NewCheckMenuItem (ACaption : string; Accelerator : PAccelKeyDef;
ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem; Overload;
function NewCheckMenuItem (ACaption : string; ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem; Overload;
procedure InsertMenuItemGroup (InMenu : TFPgtkMenuShell; position : integer; MenuItems : TFPgtkItemGroup); Overload;
procedure InsertMenuItemGroup (InMenu : TFPgtkMenuShell; position : integer;
MenuItems : TFPgtkItemGroup; ActivateProc : TFPgtkSignalFunction; ActivateData : pointer); Overload;
procedure AppendMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup); Overload;
procedure AppendMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup;
ActivateProc : TFPgtkSignalFunction; ActivateData : pointer); Overload;
procedure PrependMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup); Overload;
procedure PrependMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup;
ActivateProc : TFPgtkSignalFunction; ActivateData : pointer); Overload;
implementation
resourcestring
rsNothingToRun = 'No main window defined, nothing to do...';
rsErrorTitle = 'Error occured';
rsMessageTitle = 'Message';
sErrWrongItemType = 'Items in list are not from TFPgtkMenuItem class.';
{ TFPgtkApplication }
constructor TFPgtkApplication.Create;
begin
gtk_init (@argc, @argv);
inherited create;
FMainWindow := nil;
end;
destructor TFPgtkApplication.Destroy;
begin
if assigned (FMainWindow) then
FMainWindow.Free;
gtk_Exit (0);
inherited;
end;
procedure TFPgtkApplication.SetMainWindow (Value : TFPgtkWindow);
begin
if FMainWindow <> Value then
begin
if assigned (FMainWindow) and (FMainDestroySignal > 0) then
FMainWindow.signalDisconnect (FMainDestroySignal);
FMainWindow := Value;
if Assigned (Value) then
FMainDestroySignal := FMainWindow.ConnectDestroy (@MainDestroyed, nil);
end;
end;
procedure TFPgtkApplication.MainDestroyed (Sender:TFPgtkObject; data:pointer);
begin
FMainWindow := nil;
FMainDestroySignal := 0;
gtk_main_quit;
end;
procedure TFPgtkApplication.Run;
begin
if assigned (FMainWindow) then
while assigned (FMainWindow) do
try
FMainWindow.execute (nil, nil, nil);
//gtk_main;
FreeFPgtkObjects (nil);
except
on e : exception do
ShowMessage (rsErrorTitle, e.message);
end
else
ShowMessage (rsMessageTitle, rsNothingToRun);
end;
{ TFPgtkScrollText }
constructor TFPgtkScrollText.create;
begin
inherited create (nil,nil);
FText := TFPgtkText.Create;
Add (FText);
HPolicy := Gtk_Policy_Never;
end;
function TFPgtkScrollText.GetTooltip : string;
begin
result := inherited Tooltip;
end;
procedure TFPgtkScrollText.SetTooltip (Value : string);
begin
TheText.Tooltip := Value;
inherited Tooltip := Value;
end;
function TFPgtkScrollText.GetUdpatePolicy : TGtkUpdateType;
begin
result := VScrollbar.UpdatePolicy;
end;
procedure TFPgtkScrollText.Clear;
begin
if assigned(TheText) then
TheText.Clear;
end;
procedure TFPgtkScrollText.SetUpdatePolicy (Value : TGtkUpdateType);
begin
VScrollbar.UpdatePolicy := Value;
{$ifndef gtkwin}
HScrollbar.UpdatePolicy := Value;
{$endif}
end;
function TFPgtkScrollText.GetText : string;
begin
if assigned(TheText) then
begin
result := TheText.Text;
end
else
begin
result := '';
end;
end;
procedure TFPgtkScrollText.SetText (Value : string);
begin
if assigned (TheText) then
TheText.Text := Value;
end;
function TFPgtkScrollText.GetLines : TStrings;
begin
if assigned (TheText) then
result := TheText.Lines
else
result := nil;
end;
{ TFPgtkScrollList }
constructor TFPgtkScrollList.create;
begin
inherited create (nil, nil);
setusize (100, 40);
FList := TFPgtkList.Create;
AddWithViewport (FList);
end;
{ TFPgtkScrollCList }
constructor TFPgtkScrollCList.create (CountColumns : integer);
begin
inherited create (nil, nil);
setusize (100, 40);
FCList := TFPgtkCList.Create (CountColumns);
Add (FCList);
end;
{ TFPgtkScrollTree }
constructor TFPgtkScrollTree.create;
begin
inherited create (nil, nil);
FTree := TFPgtkTree.Create;
AddWithViewport (FTree);
FTree.Show;
end;
{ Menu functions }
function RemoveUnderscore (s : string) : string;
begin
result := stringreplace (s, '_', '', [rfReplaceAll]);
end;
type
TFPgtkMenuItemType = class of TFPgtkMenuItem;
function MakeAccelKeyDef (aWindow : TFPgtkWindow; anAG : integer; aKey : guint; aMods : TGdkModifierType) : PAccelKeyDef;
begin
new (result);
with result^ do
begin
AG := aWindow.AccelGroups[anAG];
Key := aKey;
Mods := aMods;
end;
end;
function MakeAccelKeyDef (aWindow : TFPgtkWindow; anAG : integer; aKey : guint; aMods : TAccelModifiersSet) : PAccelKeyDef;
begin
new (result);
with result^ do
begin
AG := aWindow.AccelGroups[anAG];
Key := aKey;
Mods := ConvertAccelModifier (aMods);
end;
end;
function MakeAccelKeyDef (anAG : PGtkAccelGroup; aKey : guint; aMods : TGdkModifierType) : PAccelKeyDef;
begin
new (result);
with result^ do
begin
AG := anAG;
Key := aKey;
Mods := aMods;
end;
end;
function MakeAccelKeyDef (anAG : PGtkAccelGroup; aKey : guint; aMods : TAccelModifiersSet) : PAccelKeyDef;
begin
new (result);
with result^ do
begin
AG := anAG;
Key := aKey;
Mods := ConvertAccelModifier (aMods);
end;
end;
function ConvertAccelModifier (amSet : TAccelModifiersSet) : TGdkModifierType;
var am : TAccelModifier;
begin
result := 0;
for am := low(TAccelModifier) to high (TAccelModifier) do
if am in amSet then
result := result + (1 shl ord(am));
end;
function ConvertModifierType (Mods : TGdkModifierType) : TAccelModifiersSet;
var am : TAccelModifier;
begin
result := [];
for am := low(TAccelModifier) to high (TAccelModifier) do
if (Mods and (1 shl ord(am))) <> 0 then
result := result + [am];
end;
function NewMenuBar (items : array of TFPgtkMenuItem) : TFPgtkMenuBar;
var r : integer;
begin
result := TFPgtkMenuBar.Create;
with result do
for r := low(items) to high (items) do
append (items[r]);
end;
function NewMenu (ATitle : string; items : array of TFPgtkMenuItem) : TFPgtkMenu;
var r : integer;
AG : PGtkAccelGroup;
m : TFPgtkMenuItem;
begin
result := TFPgtkMenu.Create;
with result do
begin
Title := ATitle;
ag := AccelGroup;
for r := low(items) to high(items) do
begin
m := items[r];
Append (m);
if m.AccelKey <> 0 then
m.AcceleratorAdd (AG, sgActivateItem, m.AccelKey, 0, TGtkAccelFlags(0));
end;
end;
end;
function CreateMenuItem (Atype : TFPgtkMenuItemType; ACaption, ATooltip,
APrivText : string; Accelerator : PAccelKeyDef) : TFPgtkMenuItem;
begin
result := AType.CreateWithLabel (ACaption);
if (ATooltip <> '') or (APrivText <> '') then
result.Tooltip := ComposeTooltip (ATooltip, APrivText);
if assigned(accelerator) then
begin
with Accelerator^ do
result.AcceleratorAdd (AG, sgActivateItem, Key, Mods, DefaultAccelFlags);
dispose (Accelerator);
end;
end;
function NewMenuItem (ACaption, AToolTip, AprivText : string; Accelerator : PAccelKeyDef;
ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem;
begin
result := CreateMenuItem (TFPgtkMenuItem, ACaption, ATooltip, APrivtext, Accelerator);
if assigned (ActivateFunc) then
result.ConnectActivate (ActivateFunc, AData);
end;
function NewMenuItem (ACaption, AToolTip, AprivText : string;
ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem;
begin
result := NewMenuItem (aCaption, aTooltip, aPrivText, nil, ActivateFunc, aData);
end;
function NewMenuItem (ACaption : string; Accelerator : PAccelKeyDef;
ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem;
begin
result := NewMenuItem (aCaption, '', '', Accelerator, ActivateFunc, aData);
end;
function NewMenuItem (ACaption : string; ActivateFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkMenuItem;
begin
result := NewMenuItem (aCaption, '', '', nil, ActivateFunc, aData);
end;
function NewMenuItem (ACaption : string) : TFPgtkMenuItem;
begin
result := NewMenuItem (aCaption, '', '', nil, nil, nil);
end;
function NewLine : TFPgtkMenuItem;
begin
result := TFPgtkMenuItem.Create;
end;
function NewTearOffMenu : TFPgtkTearOffMenuItem;
begin
result := TFPgtkTearOffMenuItem.create;
end;
function NewSubMenu (ACaption, ATooltip, AprivText : string; Accelerator : PAccelKeyDef;
Items : array of TFPgtkMenuItem) : TFPgtkMenuItem;
begin
result := CreateMenuItem (TFPgtkMenuItem, ACaption, ATooltip, APrivText, Accelerator);
result.SetSubmenu (NewMenu ('', Items));
end;
function NewSubMenu (ACaption, ATooltip, AprivText : string;
Items : array of TFPgtkMenuItem) : TFPgtkMenuItem;
begin
result := NewSubMenu (aCaption, aTooltip, aPrivText, nil, Items);
end;
function NewSubMenu (ACaption : string; Accelerator : PAccelKeyDef;
Items : array of TFPgtkMenuItem) : TFPgtkMenuItem;
begin
result := NewSubMenu (aCaption, '', '', Accelerator, Items);
end;
function NewSubMenu (ACaption : string; Items : array of TFPgtkMenuItem) : TFPgtkMenuItem;
begin
result := NewSubMenu (aCaption, '', '', nil, Items);
end;
function NewCheckMenuItem (ACaption, AToolTip, AprivText : string; Accelerator : PAccelKeyDef;
ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem;
begin
result := TFPgtkCheckMenuItem(CreateMenuItem (TFPgtkCheckMenuItem, ACaption, ATooltip, APrivText, Accelerator));
if assigned (ToggledFunc) then
Result.ConnectToggled (ToggledFunc, AData);
end;
function NewCheckMenuItem (ACaption, AToolTip, AprivText : string;
ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem;
begin
result := NewCheckMenuItem (aCaption, aToolTip, aPrivText, nil, ToggledFunc, AData);
end;
function NewCheckMenuItem (ACaption : string; Accelerator : PAccelKeyDef;
ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem;
begin
result := NewCheckMenuItem (aCaption, '', '', Accelerator, ToggledFunc, AData);
end;
function NewCheckMenuItem (ACaption : string; ToggledFunc : TFPgtkSignalFunction; AData : pointer) : TFPgtkCheckMenuItem;
begin
result := NewCheckMenuItem (aCaption, '', '', nil, ToggledFunc, AData);
end;
procedure InsertMenuItemGroup (InMenu : TFPgtkMenuShell; position : integer; MenuItems : TFPgtkItemGroup);
begin
InsertMenuItemGroup (InMenu, position, MenuItems, nil, nil);
end;
procedure InsertMenuItemGroup (InMenu : TFPgtkMenuShell; position : integer;
MenuItems : TFPgtkItemGroup; ActivateProc : TFPgtkSignalFunction; ActivateData : pointer);
var r : integer;
begin
if (MenuItems.count > 0) then
if (MenuItems.items[0] is TFPgtkMenuItem) then
with InMenu do
for r := MenuItems.count-1 downto 0 do
begin
if assigned(ActivateProc) then
if assigned (ActivateData) then
TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, ActivateData)
else
TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, inttopointer(r));
Insert (TFPgtkMenuItem(MenuItems.items[r]), position);
end
else
raise FPgtkException.Create (sErrWrongItemType);
end;
procedure AppendMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup);
begin
AppendMenuItemGroup (InMenu, MenuItems, nil, nil);
end;
procedure AppendMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup;
ActivateProc : TFPgtkSignalFunction; ActivateData : pointer);
var r : integer;
begin
if (MenuItems.count > 0) then
if MenuItems.items[0] is TFPgtkMenuItem then
with InMenu do
for r := 0 to MenuItems.count-1 do
begin
if assigned(ActivateProc) then
if assigned (ActivateData) then
TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, ActivateData)
else
TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, inttopointer(r));
Append (TFPgtkMenuItem(MenuItems.items[r]));
end
else
raise FPgtkException.Create (sErrWrongItemType);
end;
procedure PrependMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup);
begin
PrependMenuItemGroup (InMenu, MenuItems, nil, nil);
end;
procedure PrependMenuItemGroup (InMenu : TFPgtkmenuShell; MenuItems : TFPgtkItemGroup;
ActivateProc : TFPgtkSignalFunction; ActivateData : pointer);
var r : integer;
begin
if (MenuItems.count > 0) then
if MenuItems.items[0] is TFPgtkMenuItem then
with InMenu do
for r := MenuItems.count-1 downto 0 do
begin
if assigned(ActivateProc) then
if assigned (ActivateData) then
TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, ActivateData)
else
TFPgtkMenuItem(MenuItems.items[r]).ConnectActivate (ActivateProc, inttopointer(r));
Prepend (TFPgtkMenuItem(MenuItems.items[r]));
end
else
raise FPgtkException.Create (sErrWrongItemType);
end;
{ TFileEntryDialog }
type
TFileEntryDialog = class (TFPgtkFileSelection)
public
constructor create (AType:TGtkWindowType);
procedure DoDialogInit (InitData : pointer); override;
end;
PFileEntryData = ^TFileEntryData;
TFileEntryData = record
aFilename : string;
end;
constructor TFileEntryDialog.Create (AType:TGtkWindowType);
begin
inherited;
OKButton.ConnectClicked (@CloseWithResult, inttopointer(drOk));
CancelButton.ConnectClicked (@CloseWindow, nil);
end;
procedure TFileEntryDialog.DoDialogInit (InitData : pointer);
begin
with PFileEntryData(InitData)^ do
Filename := aFilename;
end;
{ TFPgtkFileEntry }
const
FileEntryXPM =
'16 13 4 1'#13#10+
'. c None'#13#10+ // no color
'# c #000000'#13#10+ // black
'y c #ffff00'#13#10+ // yellow
'g c #AFAF00'#13#10+ // grayed yellow
'.......#####....'#13#10+
'............#.#.'#13#10+
'.............##.'#13#10+
'..####......###.'#13#10+
'##yyyy#####.....'#13#10+
'#yyyyyyyyy#.....'#13#10+
'#yyyyyyyyy#.....'#13#10+
'#yyyy###########'#13#10+
'#yyy#ggggggggg#.'#13#10+
'#yy#ggggggggg#..'#13#10+
'#y#ggggggggg#...'#13#10+
'##ggggggggg#....'#13#10+
'###########.....';
var
DefFileEntryPixmap : PGdkPixmap;
DefFileEntryBitmask : PGdkBitmap;
constructor TFPgtkFileEntry.create;
begin
inherited;
FEdit := TFPgtkEntry.Create;
FButton := TFPgtkButton.Create;
FImage := TFPgtkPixMap.Create;
with FImage do
if assigned (DefFileEntryPixmap) then
SetPixmap (DefFileEntryPixmap, DefFileEntryBitmask)
else
begin
loadfromtext (FileEntryXPM);
GetPixmap (DefFileEntryPixmap, DefFileEntryBitmask);
end;
with FButton do
begin
Add (FImage);
ConnectClicked (@OpenFileSelection, self);
end;
PackStart (FEdit, true, true, 0);
PackStart (FButton, false, true, 0);
end;
procedure TFPgtkFileEntry.SetFilename (Value : string);
begin
FEdit.Text := Value;
end;
function TFPgtkFileEntry.GetFilename : string;
begin
result := FEdit.Text;
end;
procedure TFPgtkFileEntry.OpenFileSelection (Sender : TFPgtkObject; data : pointer);
var d : TFileEntryData;
begin
d.aFilename := Filename;
with TFileEntryDialog.Create(gtk_window_dialog) do
Execute (nil, @d, @CloseFileSelection);
end;
procedure TFPgtkFileEntry.CloseFileSelection (Sender:TFPgtkWindow; DialogResult:pointer;
Action:integer; initiator:TFPgtkObject);
begin
if action = drOk then
Filename := (Sender as TFileEntryDialog).Filename;
end;
{ TFPgtkCheckedButton }
const
XPMChecked : array [0..17] of ansistring = (
'15 13 4 1',
'. c None', // None
'# c #000000', // Black
'- c #FFFFFF', // White
'o c #0000FF', // Blue
'..............o',
'.............o-',
'............o-.',
'..########.o-..',
'..#......#o-...',
'..#......o-....',
'..o-....oo-....',
'.ooo-..oo-.....',
'..ooo-oo-#.....',
'..#oooo-.#.....',
'..##ooo-##.....',
'.....o-........',
'...............');
XPMUnChecked : array [0..17] of ansistring = (
'15 13 4 1',
'. c None', // None
'# c #000000', // Black
'- c #FFFFFF', // White
'o c #0000FF', // Blue
'...............',
'...............',
'...............',
'..########.....',
'..#......#.....',
'..#......#.....',
'..#......#.....',
'..#......#.....',
'..#......#.....',
'..#......#.....',
'..########.....',
'...............',
'...............');
var
DefChecked, DefUnchecked : PGdkPixmap;
DefCheckedBM, DefUncheckedBM : PGdkBitmap;
procedure TFPgtkCheckedButton.ChangeCheck (Sender:TFPgtkObject; data:pointer);
var b : boolean;
begin
b := Active;
FChecked.visible := b;
FUnchecked.visible := not b;
end;
constructor TFPgtkCheckedButton.CreateWithLabel (aText:string);
begin
create;
Text := aText;
end;
constructor TFPgtkCheckedButton.CreateWithLabel (aText:string; AccelGroup : PGtkAccelGroup);
begin
create;
Text := aText;
if (AccelKey <> 0) and assigned(AccelGroup) then
AcceleratorAdd (AccelGroup, sgClicked, AccelKey, DefaultButtonModifiers, GTK_ACCEL_Visible);
end;
constructor TFPgtkCheckedButton.create;
begin
inherited;
DrawIndicator := False;
AddContainer := TFPgtkHBox.Create;
Add (AddContainer);
FChecked := TFPgtkPixMap.Create;
with FChecked do
if assigned (DefChecked) then
SetPixmap (DefChecked, DefCheckedBM)
else
begin
loadfromArray (XPMChecked);
GetPixmap (DefChecked, DefCheckedBM);
end;
FUnchecked := TFPgtkPixMap.Create;
with FUnchecked do
if assigned (DefUnchecked) then
SetPixmap (DefUnchecked, DefUncheckedBM)
else
begin
loadfromArray (XPMUnchecked);
GetPixmap (DefUnchecked, DefUncheckedBM);
end;
with TFPgtkBox(AddContainer) do
begin
PackStart (FChecked, false, false, 0);
PackStart (FUnChecked, false, false, 0);
end;
ChangeCheck (self, nil);
ConnectToggled (@ChangeCheck, nil);
end;
{ ShowMessage }
resourcestring
rsOk = ' Ok ';
function MessageWindow (aTitle, aMessage : string) : TFPgtkWindow;
var b : TFPgtkBox;
but : TFPgtkButton;
l : TFPgtkLabel;
AG : integer;
bb : TFPgtkButtonBox;
begin
result := TFPgtkWindow.create (gtk_window_dialog);
result.setDefaultSize (200,25);
result.title := aTitle;
AG := result.AccelGroupNew;
b := TFPgtkVBox.create;
b.Homogeneous := false;
b.border := 15;
b.spacing := 15;
l := TFPgtkLabel.Create (aMessage);
b.Packstart (l, true, true, 0); // Text to show
bb := TFPgtkHButtonBox.create;
bb.Layout := GTK_BUTTONBOX_DEFAULT_STYLE;
b.PackEnd (bb, false, false, 0);
but := TFPgtkButton.CreateWithLabel (rsOk); // Ok button to close
but.ConnectClicked (@(result.CloseWindow), nil);
result.AcceleratorAdd (AG, but, sgClicked, gdk_Cancel, 0, TGTKAccelFlags(0));
result.AcceleratorAdd (AG, but, sgClicked, gdk_Return, 0, TGTKAccelFlags(0));
bb.add (but);
result.Add (b);
end;
procedure ShowMessage (const aTitle, aMessage : string);
begin
with MessageWindow (aTitle, aMessage) do
Execute (nil, nil, nil);
end;
{ MessageDialog }
type
TMessageDialogWindow = Class(TFPgtkWindow)
FImage : TFPGtkPixMap;
FLabel : TFPGtkLabel;
FLTable : TFPgtkTable;
FVBox : TFPgtkVBox;
FButtonBox: TFPgtkButtonBox;
Constructor Create(AMsg:String; DlgType:TMsgDlgType; Buttons: TMsgDlgButtons);
Procedure CreateButtons(Buttons: TMsgDlgButtons);
end;
const
IMGInfo : Array[1..37] of string = ('32 32 4 1',
'. c None',
' c None',
'a c #ffffff', //#c3c3c3',
'# c #0000ff',
'............#######.............',
'.........###aaaaaaa###..........',
'.......##aaaaaaaaaaaaa##........',
'......#aaaaaaa###aaaaaaa#.......',
'.....#aaaaaaa#####aaaaaaa#......',
'....#aaaaaaa#######aaaaaaa#.....',
'...#aaaaaaaa#######aaaaaaaa#....',
'..#aaaaaaaaa#######aaaaaaaaa#...',
'..#aaaaaaaaaa#####aaaaaaaaaa#...',
'.#aaaaaaaaaaaa###aaaaaaaaaaaa#..',
'.#aaaaaaaaaaaaaaaaaaaaaaaaaaa#..',
'.#aaaaaaaaaaa#####aaaaaaaaaaa#..',
'#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
'#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
'#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
'#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
'#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
'#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
'#aaaaaaaaaaaa#####aaaaaaaaaaaa#.',
'.#aaaaaaaaaaa#####aaaaaaaaaaa#..',
'.#aaaaaaaaaaa#####aaaaaaaaaaa#..',
'.#aaaaaaaaaa#######aaaaaaaaaa#..',
'..#aaaaaaaaa#######aaaaaaaaa#...',
'..#aaaaaaaaa#######aaaaaaaaa#...',
'...#aaaaaaaaaaaaaaaaaaaaaaa#....',
'....#aaaaaaaaaaaaaaaaaaaaa#.....',
'.....#aaaaaaaaaaaaaaaaaaa#......',
'......#aaaaaaaaaaaaaaaaa#.......',
'.......##aaaaaaaaaaaaa##........',
'.........###aaaaaaa###..........',
'............#######.............',
'................................');
IMGWarning :Array[1..37] of string = ('32 32 4 1',
'# c #000000',
'b c #9c999c',
'. c None',
'a c #ffff00',
'.............###................',
'............#aaa#...............',
'...........#aaaaa#b.............',
'...........#aaaaa#bb............',
'..........#aaaaaaa#bb...........',
'..........#aaaaaaa#bb...........',
'.........#aaaaaaaaa#bb..........',
'.........#aaaaaaaaa#bb..........',
'........#aaaaaaaaaaa#bb.........',
'........#aaaa###aaaa#bb.........',
'.......#aaaa#####aaaa#bb........',
'.......#aaaa#####aaaa#bb........',
'......#aaaaa#####aaaaa#bb.......',
'......#aaaaa#####aaaaa#bb.......',
'.....#aaaaaa#####aaaaaa#bb......',
'.....#aaaaaa#####aaaaaa#bb......',
'....#aaaaaaaa###aaaaaaaa#bb.....',
'....#aaaaaaaa###aaaaaaaa#bb.....',
'...#aaaaaaaaa###aaaaaaaaa#bb....',
'...#aaaaaaaaaa#aaaaaaaaaa#bb....',
'..#aaaaaaaaaaa#aaaaaaaaaaa#bb...',
'..#aaaaaaaaaaaaaaaaaaaaaaa#bb...',
'.#aaaaaaaaaaaa##aaaaaaaaaaa#bb..',
'.#aaaaaaaaaaa####aaaaaaaaaa#bb..',
'#aaaaaaaaaaaa####aaaaaaaaaaa#bb.',
'#aaaaaaaaaaaaa##aaaaaaaaaaaa#bb.',
'#aaaaaaaaaaaaaaaaaaaaaaaaaaa#bbb',
'#aaaaaaaaaaaaaaaaaaaaaaaaaaa#bbb',
'.#aaaaaaaaaaaaaaaaaaaaaaaaa#bbbb',
'..#########################bbbbb',
'....bbbbbbbbbbbbbbbbbbbbbbbbbbb.',
'.....bbbbbbbbbbbbbbbbbbbbbbbbb..');
IMGError : Array[1..37] of string = ('32 32 4 1',
'. c None',
'b c #808080',
'# c #c00000',
'a c #ffffff',
'................................',
'................................',
'................................',
'............#######.............',
'...........###########..........',
'........###############.........',
'.......##################.......',
'......####################......',
'.....###aa############aa###.....',
'.....###aaa##########aaa###.....',
'....#####aaa########aaa#####....',
'....######aaa######aaa######....',
'...########aaa####aaa########...',
'...#########aaa##aaa#########b..',
'...##########aaaaaa##########b..',
'...###########aaaa###########b..',
'...###########aaaa###########b..',
'...##########aaaaaa##########b..',
'...#########aaa##aaa#########b..',
'...########aaa####aaa#######bb..',
'....######aaa######aaa######bb..',
'.....####aaa########aaa#####bb..',
'.....###aaa##########aaa###bbb..',
'.....###aa############aa##bbb...',
'......####################bb....',
'.......##################bb.....',
'.........###############bb......',
'..........###########bbbb.......',
'.............#######bbb.........',
'................................',
'................................',
'................................');
IMGConfirmation : Array[1..37] of string = ('32 32 4 1',
'. c None',
'b c #808080',
'a c #c00000',
'# c #ffffff',
'................................',
'................................',
'................................',
'................................',
'.............######.............',
'..........###########...........',
'.........##############.........',
'........################........',
'.......##################.......',
'......########aaaaa#######......',
'.....########aaaaaaa#######.....',
'.....#######aa#####aa######.....',
'.....#######a######aa#######....',
'....###############aa#######b...',
'....###############aa#######bb..',
'....##############aa########bb..',
'....#############aa#########bb..',
'....############aa##########bb..',
'....###########aa###########bb..',
'.....##########aa##########bbb..',
'.....##########aa##########bbb..',
'.....##########aa##########bb...',
'......#########aa#########bb....',
'.......##################bbb....',
'........#######aa#######bbb.....',
'.........######aa######bbb......',
'...........###########bbb.......',
'.............######bbbbb........',
'................................',
'................................',
'................................',
'................................');
Constructor TMessageDialogWindow.Create(AMsg : String;DlgType:TMsgDlgType;Buttons: TMsgDlgButtons);
const
OH = GTK_FILL OR GTK_EXPAND;
begin
Inherited Create(GTK_WINDOW_DIALOG);
FVBox:=TFPGtkVBox.Create;
FVBox.Spacing:=4;
FVBox.Border:=8;
Add(FVBox);
FLTable:=TFpgtkTable.Create(10,1);
if DlgType <> mtCustom then
begin
FImage:=TFPGtkPixMap.Create;
With FImage do
Case DlgType of
mtInformation : LoadFromArray(Imginfo);
mtWarning : LoadFromArray(imgWarning);
mtConfirmation : LoadFromArray(imgConfirmation);
mtError : LoadFromArray(imgError);
end;
FLTable.Attach(FImage,1,2,0,1,OH,OH,0,0);
end;
FLabel:=TFPGtkLabel.Create(Amsg);
FLTable.Attach(FLabel,4,9,0,1,OH,OH,0,0);
FButtonBox:=TFPgtkHButtonBox.Create;
with FButtonBox do
begin
Layout := GTK_BUTTONBOX_DEFAULT_STYLE;
spacing := 4;
end;
CreateButtons(Buttons);
FVBox.PackStart(FLTable,false,False,8);
FVBox.PackStart(FButtonBox,false,False,8);
end;
Const
ButtonText : Array[TMsgDlgBtn] of string =
('Yes', 'No', 'OK', 'Cancel','Abort', 'Retry', 'Ignore',
'All', 'NoToAll', 'YesToAll', 'Help');
ButtonResult : array [TMsgDlgbtn] of TModalResult =
(mrYes, mrNo, mrOK, mrCAncel, mrAbort, mrRetry, mrIgnore,
mrAll, mrNoToAll, mrYesToAll, 0);
Procedure TMessageDialogWindow.CreateButtons(Buttons: TMsgDlgButtons);
Var
b : TMsgDlgBtn;
bw : TFPGtkButton;
begin
For B:=Low(TMsgDlgBtn) to high(TMsgDlgBtn) do
If b in Buttons then
begin
BW:=TFPGtkButton.CreateWithLabel(ButtonText[b]);
BW.ConnectClicked(@CloseWithResult,IntToPointer(ButtonResult[b]));
BW.Setusize(50,25);
FButtonBox.PackStart(BW,False,False,4);
end;
end;
function MessageDlg(const aMsg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
begin
With TMessageDialogWindow.Create(AMsg,DlgType,Buttons) do
Result:=Execute(Nil,Nil,Nil);
end;
function MessageDlg(const Fmt: string; Args : Array of const; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
begin
Result:=MessageDlg(Format(Fmt,Args),Dlgtype,Buttons,HelpCtx);
end;
end.