fpc/packages/extra/fpgtk/editor/gtkeditor.pp
2002-10-31 08:20:20 +00:00

1436 lines
45 KiB
ObjectPascal

{$mode objfpc}{$h+}
unit GtkEditor;
interface
{__$define debug}
uses sysutils, classes,
glib, gdk, gtk, FPGtk, FPgtkExt,
buttonrow, ObjectDef, SettingsRec;
type
TGtkEditorWindow = class (TFPgtkWindow)
private
FSettings : TSettingsRec;
{ widgets in the window }
// visual arrangement
LObjects, LProperties, LParams : TFPgtkScrollCList;
BrObjects, BrProperties, BrParams : TButtonRow;
PObject, PProperty, PParam : TFPgtkHPaned;
FDefinition, FObject, FProperty : TFPgtkFrame;
FParam : TFPgtkBox;
// definition
DUnitName, DGtkPrefix, DUsesList : TFPgtkentry;
// object
OName, OInherit, OGtkName, OGtkFuncName, OCreateParams : TFPgtkentry;
OCreateObject, OWithPointer : TFPgtkToggleButton;
// property
PType : TFPgtkOptionMenu; // Or TFPgtkCombo
Bladen : TFPgtkNotebook;
BDefinition, BParameter, BRead, BWrite, BFunction, BCode : TFPgtkWidget;
// definition
PName, PPascalType, PGtkName : TFPgtkEntry;
PSection : TFPgtkOptionMenu; // Or TFPgtkCombo
// parameter
ParamName, ParamPascalType : TFPgtkentry;
ParamType : TFPgtkOptionmenu; // Or TFPgtkCombo
ParamConvert : TFPgtkToggleButton;
// read
PRType : TFPgtkOptionMenu;
PRGtkName : TFPgtkEntry;
PRCode : TFPgtkScrollText;
PRConvert : TFPgtkToggleButton;
// write
PWType : TFPgtkOptionMenu;
PWGtkName : TFPgtkEntry;
PWCode : TFPgtkScrollText;
PWConvert : TFPgtkToggleButton;
// function
POverride, PVirtual, PDynamic,
PAbstract, PCDecl, POverload,
PReintroduce : TFPgtkTogglebutton;
PFCode : TFPgtkScrollText;
// Code
PCode : TFPgtkScrollText;
{ CollectionItems that are currently shown }
ciObject : TObjectItem;
ciProperty : TPropertyItem;
ciParameter : TParameterItem;
{ Defs Property }
FDefs : TObjectDefs;
{ entry saving procedures/signals }
// Definition
procedure ChangedDUsesList (Sender:TFPgtkObject; data:pointer);
procedure ChangedDUnitName (Sender:TFPgtkObject; data:pointer);
procedure ChangedDGtkPrefix (Sender:TFPgtkObject; data:pointer);
// Object
procedure ChangedOName (Sender:TFPgtkObject; data:pointer);
procedure ChangedOInherit (Sender:TFPgtkObject; data:pointer);
procedure ChangedOGtkName (Sender:TFPgtkObject; data:pointer);
procedure ChangedOGtkFuncName (Sender:TFPgtkObject; data:pointer);
procedure ChangedOCreateParams (Sender:TFPgtkObject; data:pointer);
procedure ChangedOCreateObject (Sender:TFPgtkObject; data:pointer);
procedure ChangedOWithPointer (Sender:TFPgtkObject; data:pointer);
// Property
procedure ChangedPType (Sender:TFPgtkObject; data:pointer);
procedure ChangedPName (Sender:TFPgtkObject; data:pointer);
procedure ChangedPPascalType (Sender:TFPgtkObject; data:pointer);
procedure ChangedPGtkName (Sender:TFPgtkObject; data:pointer);
procedure ChangedPSection (Sender:TFPgtkObject; data:pointer);
// parameter
procedure ChangedParamName (Sender:TFPgtkObject; data:pointer);
procedure ChangedParamPascalType (Sender:TFPgtkObject; data:pointer);
procedure ChangedParamType (Sender:TFPgtkObject; data:pointer);
procedure ChangedParamConvert (Sender:TFPgtkObject; data:pointer);
// read
procedure ChangedPRType (Sender:TFPgtkObject; data:pointer);
procedure ChangedPRConvert (Sender:TFPgtkObject; data:pointer);
// write
procedure ChangedPWType (Sender:TFPgtkObject; data:pointer);
procedure ChangedPWGtkName (Sender:TFPgtkObject; data:pointer);
procedure ChangedPWCode (Sender:TFPgtkObject; data:pointer);
procedure ChangedPWConvert (Sender:TFPgtkObject; data:pointer);
// function
procedure ChangedPFuncType (Sender:TFPgtkObject; data:pointer);
// Code
procedure ChangedPCode (Sender:TFPgtkObject; data:pointer);
{ Showing procedures }
RefreshingParam, RefreshingProperty, RefreshingObject, RefreshingDefinition : boolean;
PropPixs : array [0..13] of PGdkPixmap;
PropMasks : array [0..13] of PGdkBitmap;
procedure CreatePixMaps;
procedure PropertyIcon (Item:TCollectionItem; var Pixmap:PGdkPixMap; var mask:PGdkBitmap);
procedure EnDisablePages (pt : TPropType);
procedure RefreshParam (Selected : TCollectionItem; NeedFocus:boolean);
procedure RefreshProperty (Selected : TCollectionItem; NeedFocus:boolean);
procedure RefreshObject (Selected : TCollectionItem; NeedFocus:boolean);
procedure RefreshDefinition;
procedure ObjectDisplayChanged;
procedure PropertyDisplayChanged;
procedure ParamDisplayChanged;
procedure ComposeWindow;
{ File and menu handling }
FFileName : string;
HasAFile : boolean;
FReopenList : TStrings;
MenuEditObject, MenuEditProperty, MenuEditParameter,
MenuFileReopen : TFPgtkMenuItem;
AccelGroup : integer;
procedure NewFilename (NewName : string);
procedure BuildReopenList;
procedure DataRead (filename : string);
procedure DataWrite (filename : string);
procedure Generate;
{ Menu signals }
procedure FileNew (Sender : TFPgtkObject; data : pointer);
procedure FileOpen (Sender : TFPgtkObject; data : pointer);
procedure FileSave (Sender : TFPgtkObject; data : pointer);
procedure FileSaveAs (Sender : TFPgtkObject; data : pointer);
procedure FileExit (Sender : TFPgtkObject; data : pointer);
procedure ToolsGenerate (Sender : TFPgtkObject; data : pointer);
procedure ToolsOptions (Sender : TFPgtkObject; data : pointer);
procedure HelpInfo (Sender : TFPgtkObject; data : pointer);
procedure HelpAbout (Sender : TFPgtkObject; data : pointer);
procedure ToolbarReopen (Sender : TFpgtkObject; data : pointer);
{ Dialog Procedures }
procedure DialogSetFilename (Sender:TFPgtkWindow;
aDialogResult:pointer; Action:integer; initiator:TFPgtkObject);
procedure FileReopen (Sender : TFPgtkObject; data : pointer);
{ Settings procedures }
procedure ReadSettings;
procedure WriteSettings (Sender : TFPgtkObject; data : pointer);
public
constructor create;
destructor Destroy; override;
end;
implementation
uses XPMs, GtkDefTexts, inifiles, ProgWin;
Type
TRightLabel = class (TFPgtkLabel)
public
constructor create(aText : string);
end;
constructor TRightLabel.Create (aText : string);
begin
inherited create (aText);
XAlign := 1;
end;
{ TGtkEditorWindow }
{ *** Creation of window *** }
const
gtk_all = gtk_fill + gtk_expand + gtk_Shrink;
gtk_NoExp = gtk_fill + gtk_shrink;
constructor TGtkEditorWindow.Create;
begin
inherited Create (Gtk_Window_TopLevel);
SetUSize (800, 500);
MenuFileReopen := nil;
MenuEditObject := nil;
MenuEditProperty := nil;
MenuEditParameter := nil;
Title := sEditorTitle;
ciObject := nil;
ciProperty := nil;
ciParameter := nil;
FDefs := nil;
CreatePixmaps;
ComposeWindow;
FReopenList := TStringList.Create;
ReadSettings;
ConnectDestroy (@WriteSettings, @FSettings);
end;
destructor TGtkEditorWindow.Destroy;
begin
FReopenList.Free;
end;
procedure TGtkEditorWindow.ComposeWindow;
var b, b1 : TFPgtkBox;
t : TFPgtkTable;
m : TFPgtkMenuBar;
mlist : TFPgtkItemGroup;
F : TFPgtkFrame;
tb : TFPgtkToolbar;
//pm : TFPgtkPixmap;
but : TFPgtkButton;
AG : PGtkAccelGroup;
begin
AccelGroup := AccelGroupNew;
AG := AccelGroups[AccelGroup];
b := TFPgtkVBox.Create;
Add (b);
//writeln ('------->> Menu');
MenuEditObject := NewSubMenu (smEditObject, '', '', nil, []);
MenuEditProperty := NewSubMenu (smEditProperty, '', '', nil, []);
MenuEditParameter := NewSubMenu (smEditParameter, '', '', nil, []);
MenuFileReopen := NewSubMenu (smFileReopen, '', '', nil, []);
m := NewMenuBar ([
NewSubMenu (smFile, '', '', MakeAccelKeyDef(AG,Gdk_F,[amAlt]), [
NewMenuItem (smFileNew, '', '', MakeAccelKeyDef(AG,Gdk_N,[amControl]), @FileNew, nil),
NewMenuItem (smFileOpen, '', '', MakeAccelKeyDef(AG,Gdk_L,[amControl]), @FileOpen, nil),
MenuFileReopen,
NewMenuItem (smFileSave, '', '', MakeAccelKeyDef(AG,Gdk_S,[amControl]), @FileSave, nil),
NewMenuItem (smFileSaveAs, '', '', MakeAccelKeyDef(AG,Gdk_A,[amControl]), @FileSaveAs, nil),
NewLine,
NewMenuItem (smFileExit, '', '', MakeAccelKeyDef(AG,Gdk_W,[amControl]), @FileExit, nil)]),
NewSubMenu (smEdit, '', '', MakeAccelKeyDef(AG,Gdk_E,[amAlt]), [
MenuEditObject, MenuEditProperty, MenuEditParameter]),
NewSubMenu (smTools, '', '', MakeAccelKeyDef(AG,Gdk_T,[amAlt]), [
NewMenuItem (smToolsGenerate, '', '', MakeAccelKeyDef(AG,Gdk_G,[amControl]), @ToolsGenerate, nil),
NewMenuItem (smToolsOptions, '', '', MakeAccelKeyDef(AG,Gdk_O,[amControl]), @ToolsOptions, nil)]),
NewSubMenu (smHelp, '', '', MakeAccelKeyDef(AG,Gdk_H,[amAlt]), [
NewMenuItem (smHelpInfo, '', '', MakeAccelKeyDef(AG,Gdk_I,[amControl]), @HelpInfo, nil),
NewMenuItem (smHelpAbout, '', '', MakeAccelKeyDef(AG,Gdk_B,[amControl]), @HelpAbout, nil)])
]);
b.PackStart (m, false, false, 0);
//writeln ('------->> Toolbar');
tb := TFPgtkToolbar.Create;
b.PackStart (tb, false, false, 0);
b.Packstart (TFPgtkHSeparator.Create, false, false, 0);
with tb do
begin
ButtonRelief := Gtk_Relief_None;
AppendSpace;
AppendItem ('', RemoveUnderscore(smFileNew), '', XPMFileNew, @FileNew, nil);
AppendSpace;
AppendItem ('', RemoveUnderscore(smFileOpen), '', XPMFileOpen, @FileOpen, nil);
but := TFPgtkButton.Create;
with but do
begin
ConnectClicked (@ToolbarReopen, nil);
Add (TFPgtkArrow.Create(GTK_Arrow_Down, GTK_Shadow_Out));
CanFocus := False;
ReliefStyle := GTK_RELIEF_NONE;
SetUsize (15, 22);
end;
AppendWidget (but, RemoveUnderscore(smFileReopen), '');
AppendSpace;
AppendItem ('', RemoveUnderscore(smFileSave), '', XPMFileSave, @FileSave, nil);
AppendSpace;
AppendItem ('', RemoveUnderscore(smToolsGenerate), '', XPMGenerate, @ToolsGenerate, nil);
end;
//writeln ('------->> Panels and lists');
FDefinition := TFPgtkFrame.Create;
FDefinition.Text := sComponent;
b.PackStart (FDefinition, false, true, 0);
PObject := TFPgtkHPaned.Create;
b.packStart (PObject, true, true, 0);
LObjects := TFPgtkScrollCList.Create (1);
LObjects.SetUsize (120,40);
b1 := TFPgtkVBox.Create;
BrObjects := TButtonRow.Create;
BrObjects.Title := 'Objects buttonrow';
b1.PackEnd (BrObjects, false, false, 0);
b1.PackEnd (LObjects);
PObject.Add1 (b1);
b := TFPgtkVBox.create;
PObject.Add2 (b);
FObject := TFPgtkFrame.Create;
FObject.Text := SObject;
b.PackStart (FObject, false, true, 0);
PProperty := TFPgtkHPaned.Create;
B.PackStart (PProperty, true, true, 0);
LProperties := TFpgtkScrollCList.Create (2);
LProperties.SetUSize (180,30);
b1 := TFPgtkVBox.Create;
BrProperties := TButtonRow.Create;
BrProperties.Title := 'Properties buttonrow';
b1.PackEnd (BrProperties, false, false, 0);
b1.PackEnd (LProperties);
PProperty.Add1 (b1);
FProperty := TFPgtkFrame.Create;
FProperty.Text := SProperty;
PProperty.Add2 (FProperty);
PProperty.ComputePosition (40, 20, 20);
PObject.ComputePosition (40, 20, 20);
//writeln ('------->> Definition');
t := TFPgtkTable.create (6,1);
t.ColSpacings := 3;
t.attach (TFPgtkLabel.Create(sUnitName), 0,1, 0,1, gtk_NoExp, gtk_fill, 3,0);
DUnitName := TFPgtkEntry.create;
DUnitName.ConnectChanged (@ChangedDUnitName, nil);
t.attach (DUnitName, 1,2, 0,1, gtk_all, gtk_fill, 0,0);
t.attach (TFPgtkLabel.Create (sGtkPrefix), 2,3, 0,1, gtk_NoExp, gtk_fill, 3,0);
DGtkPrefix := TFPgtkentry.create;
DGtkPrefix.ConnectChanged (@ChangedDGtkPrefix, nil);
t.attach (DGtkPrefix, 3,4, 0,1, gtk_all, gtk_fill, 0,0);
t.attach (TFPgtkLabel.Create(sUsesList), 4,5, 0,1, gtk_NoExp, gtk_fill, 3,0);
DUsesList := TFPgtkEntry.create;
DUsesList.ConnectChanged (@ChangedDUsesList, nil);
t.attach (DUsesList, 5,6, 0,1, gtk_all, gtk_fill, 0,0);
FDefinition.Add (t);
//writeln ('------->> Object');
t := tFPgtkTable.Create (5,3);
t.ColSpacings := 3;
FObject.Add (t);
t.attach (TRightLabel.create(sName), 0,1, 0,1, gtk_noExp, gtk_fill, 3,0);
OName := TFPgtkentry.create;
OName.ConnectChanged (@ChangedOName, nil);
t.attach (OName, 1,2, 0,1);
t.attach (TRightLabel.create(sInherits), 0,1, 1,2, gtk_noExp, gtk_fill, 3,0);
OInherit := TFPgtkentry.create;
OInherit.ConnectChanged (@ChangedOInherit, nil);
t.attach (OInherit, 1,2, 1,2);
t.attach (TRightLabel.create(sGtkName), 0,1, 2,3, gtk_noExp, gtk_fill, 3,0);
OGtkName := TFPgtkentry.create;
OGtkName.ConnectChanged (@ChangedOGtkName, nil);
t.attach (OGtkName, 1,2, 2,3);
t.SetOneColSpacing (1,7);
OCreateObject := TFPgtkCheckedButton.createWithLabel (sCreateObject);
OCreateObject.ConnectClicked (@ChangedOCreateObject, nil);
t.attach (OCreateObject, 3,4, 0,1);
OWithPointer := TFPgtkCheckedButton.createWithLabel (sWithPointer);
OWithPointer.ConnectClicked (@ChangedOWithPointer, nil);
t.attach (OWithPointer, 4,5, 0,1);
t.attach (TRightLabel.create(sCreateParams), 2,3, 1,2, gtk_noExp, gtk_fill, 3,0);
OCreateParams := TFPgtkentry.create;
OCreateParams.ConnectChanged (@ChangedOCreateParams, nil);
t.attach (OCreateParams, 3,5, 1,2, gtk_all, gtk_fill, 0,0);
t.attach (TRightLabel.create(sGtkFunctionName), 2,3, 2,3, gtk_noExp, gtk_fill, 3,0);
OGtkFuncName := TFPgtkentry.create;
OGtkFuncName.ConnectChanged (@ChangedOGtkFuncName, nil);
t.attach (OGtkFuncName, 3,5, 2,3, gtk_all, gtk_fill, 0,0);
//writeln ('------->> Property');
mlist := TFPgtkItemGroup.Create (TFPgtkMenuItem);
b := TFPgtkVBox.Create;
FProperty.Add (b);
b1 := TFPgtkHBox.Create;
b.PackStart (b1, false, true, 0);
b1.PackStart (TFPgtkLabel.Create(sType), false, true, 3);
mlist.FillFromArray ([sField, sProperty,sFunction,sProcedure,sSignal,sHelperproc,
sHelperFunc,sSignalType,sDeclarations,sTypeDecl,sConstructor,
sDestructor, sInitialization, sFinalization]);
PType := TFPgtkOptionMenu.Create;
with PType do
begin
menu := TFPgtkMenu.Create;
setUsize (70, 26);
AppendMenuItemGroup (menu, mlist, @ChangedPType, nil);
end;
mlist.Clear;
b1.PackStart (PType, true, true,0);
bladen := TFPgtkNotebook.Create;
// bladen.Homogenous := True;
// bladen.Scrollable := false;
b.PackStart (bladen, true, true, 0);
// defintion
//writeln ('------->> Property Definition');
t := TFPgtkTable.Create (2, 4);
t.attach (TRightLabel.Create(sName), 0,1, 0,1, gtk_noExp, gtk_fill, 3,0);
PName := TFPgtkEntry.create;
PName.ConnectChanged (@ChangedPName, nil);
t.attach (PName, 1,2, 0,1);
t.attach (TRightLabel.Create(sPascalType), 0,1, 1,2, gtk_noExp, gtk_fill, 3,0);
PPascalType := TFPgtkEntry.create;
PPascalType.ConnectChanged (@ChangedPPascalType, nil);
t.attach (PPascalType, 1,2, 1,2);
t.attach (TRightLabel.Create(sSection), 0,1, 2,3, gtk_noExp, gtk_fill, 3,0);
PSection := TFPgtkOptionMenu.create;
mlist.FillFromArray ([sPrivate, sProtected, sPublic, sPublished]);
with PSection do
begin
menu := TFPgtkMenu.Create;
AppendMenuItemGroup (menu, mlist, @ChangedPSection, nil);
setUsize (60,26);
end;
mlist.Clear;
t.attach (PSection, 1,2, 2,3);
t.attach (TRightLabel.Create(sGtkName), 0,1, 3,4, gtk_noExp, gtk_fill, 3,0);
PGtkName := TFPgtkEntry.create;
PGtkName.ConnectChanged (@ChangedPGtkName, nil);
t.attach (PGtkName, 1,2, 3,4);
b1 := TFPgtkVBox.Create;
b1.Packstart (t, false, false, 0);
BDefinition := b1;
bladen.AppendPage (b1, TFPgtkLabel.Create(sDefinition));
// parameter
//writeln ('------->> Property Parameter');
PParam := TFPgtkHPaned.Create;
bladen.AppendPage (PParam, TFPgtkLabel.Create(sParameters));
BParameter := PParam;
LParams := TFPgtkScrollCList.Create(1);
LParams.setusize (120,30);
b1 := TFPgtkVBox.Create;
BrParams := TButtonRow.Create;
BrParams.Title := 'Parameters buttonrow';
b1.PackEnd (BrParams, false, false, 0);
b1.PackEnd (LParams);
PParam.Add1 (b1);
FParam := TFPgtkVBox.Create;
PParam.Add2 (FParam);
t := TFPgtkTable.Create (3,4);
FParam.Packstart (t, false, false, 0);
t.attach (TRightLabel.Create(sName), 0,1, 0,1, gtk_noExp, gtk_fill, 3,0);
ParamName := TFPgtkentry.Create;
ParamName.ConnectChanged (@ChangedParamName, nil);
t.attach (ParamName, 1,3, 0,1);
t.attach (TRightLabel.Create(sPascalType), 0,1, 1,2, gtk_noExp, gtk_fill, 3,0);
ParamPascalType := TFPgtkentry.Create;
ParamPascalType.ConnectChanged (@ChangedParamPascalType, nil);
t.attach (ParamPascalType, 1,3, 1,2);
t.attach (TRightLabel.Create(sType), 0,1, 2,3, gtk_noExp, gtk_fill, 3,0);
ParamType := TFPgtkOptionmenu.Create;
t.attach (ParamType, 1,3, 2,3);
with ParamType do
begin
Menu := TFPgtkMenu.Create;
mList.FillFromArray ([sNothing, sVar, sConst]);
AppendMenuItemGroup (menu, mlist, @ChangedParamType, nil);
setusize (50, 26);
end;
mlist.Clear;
ParamConvert := TFPgtkCheckedButton.CreateWithLabel(sConvert);
ParamConvert.ConnectClicked (@ChangedParamConvert, nil);
t.attach (ParamConvert, 1,2, 3,4, gtk_noExp, gtk_Fill, 0,0);
// Read
//writeln ('------->> Property Read');
t := TFPgtkTable.Create (3,3);
bladen.AppendPage (t, TFPgtkLabel.Create(sRead));
BRead := t;
t.Attach (TRightLabel.Create(sType), 0,1, 0,1, gtk_noExp, gtk_fill, 3,0);
PRtype := TFPgtkOptionMenu.Create;
with PRType do
begin
Menu := TFPgtkMenu.Create;
mlist.FillFromArray ([sGtkFunction, sObjectField, sObjectFunction,SField, sFunction,
sNotImplemented, sGtkMacro, sExistingFunc]);
AppendMenuItemGroup (Menu, mlist, @ChangedPRType, nil);
SetUsize (60,26);
end;
mlist.Clear;
t.attach (PRtype, 1,2, 0,1, gtk_all, gtk_noExp, 0,0);
PRConvert := TFPgtkCheckedButton.CreateWithLabel (sConvert);
PRConvert.ConnectClicked (@ChangedPRConvert, nil);
PRConvert.TheLabel.XAlign := 0.0;
t.attach (PRConvert, 2,3, 0,1, gtk_all, gtk_noExp, 0,0);
t.Attach (TRightLabel.Create(sGtkName), 0,1, 1,2, gtk_noExp, gtk_fill, 3,0);
PRGtkName := TFPgtkEntry.Create;
PRGtkName.ConnectChanged (@ChangedPGtkName, nil);
t.attach (PRGtkName, 1,3, 1,2, gtk_all, gtk_noExp, 0,0);
t.Attach (TRightLabel.Create(sCode), 0,1, 2,3, gtk_noExp, gtk_fill, 3,0);
PRCode := TFPgtkScrollText.Create;
PRCode.TheText.ConnectChanged (@ChangedPCode, nil);
t.attach (PRCode, 1,3, 2,3);
// Write
//writeln ('------->> Property Write');
t := TFPgtkTable.Create (3,3);
BWrite := t;
bladen.AppendPage (t, TFPgtkLabel.Create(sWrite));
t.Attach (TRightLabel.Create(sType), 0,1, 0,1, gtk_noExp, gtk_fill, 3,0);
PWtype := TFPgtkOptionMenu.Create;
with PWType do
begin
Menu := TFPgtkMenu.Create;
mlist.FillFromArray ([sGtkProcedure, sObjectField, sObjectProcedure,SField, sProcedure,
sNotImplemented, sGtkMacro, sExistingProc]);
AppendMenuItemGroup (Menu, mlist, @ChangedPWType, nil);
SetUsize (60,26);
end;
mlist.Clear;
t.attach (PWtype, 1,2, 0,1, gtk_all, gtk_noExp, 0,0);
PWConvert := TFPgtkCheckedButton.CreateWithLabel (sConvert);
PWConvert.ConnectClicked (@ChangedPWConvert, nil);
PWConvert.TheLabel.XAlign := 0.0;
t.attach (PWConvert, 2,3, 0,1, gtk_all, gtk_noExp, 0,0);
t.Attach (TRightLabel.Create(sGtkName), 0,1, 1,2, gtk_noExp, gtk_fill, 3,0);
PWGtkName := TFPgtkEntry.Create;
PWGtkName.ConnectChanged (@ChangedPWGtkName, nil);
t.attach (PWGtkName, 1,3, 1,2, gtk_all, gtk_noExp, 0,0);
t.Attach (TRightLabel.Create(sCode), 0,1, 2,3, gtk_noExp, gtk_fill, 3,0);
PWCode := TFPgtkScrollText.Create;
PWCode.TheText.ConnectChanged (@ChangedPWCode, nil);
t.attach (PWCode, 1,3, 2,3);
// Function
//writeln ('------->> Property Function');
t := TFPgtkTable.Create (2,2);
BFunction := t;
bladen.AppendPage (t, TFPgtkLabel.Create(sFunction));
t.Attach (TFPgtkLabel.Create(sCode), 1,2, 0,1, gtk_NoExp, gtk_NoExp, 7,0);
PFCode := TFPgtkScrollText.Create;
PFCode.TheText.ConnectChanged (@ChangedPCode, nil);
t.Attach (PFCode, 1,2, 1,2, gtk_all, gtk_all, 0,0);
f := TFPgtkFrame.Create;
f.Border := 3;
f.Text := sTypes;
t.Attach (f, 0,1, 0,2, gtk_NoExp, gtk_NoExp, 0,0);
b1 := TFPgtkVBox.Create;
f.Add (b1);
b1.border := 2;
POverride := TFPgtkCheckedButton.CreateWithLabel (sOverride);
POverride.ConnectClicked (@ChangedPFuncType, inttopointer(0));
b1.PackStart (POverride, false, false, 0);
PVirtual := TFPgtkCheckedButton.CreateWithLabel (sVirtual);
PVirtual.ConnectClicked (@ChangedPFuncType, inttopointer(1));
b1.PackStart (PVirtual, false, false, 0);
PDynamic := TFPgtkCheckedButton.CreateWithLabel (sDynamic);
PDynamic.ConnectClicked (@ChangedPFuncType, inttopointer(2));
b1.PackStart (PDynamic, false, false, 0);
PAbstract := TFPgtkCheckedButton.CreateWithLabel (sAbstract);
PAbstract.ConnectClicked (@ChangedPFuncType, inttopointer(3));
b1.PackStart (PAbstract, false, false, 0);
PCDecl := TFPgtkCheckedButton.CreateWithLabel (sCDecl);
PCDecl.ConnectClicked (@ChangedPFuncType, inttopointer(4));
b1.PackStart (PCDecl, false, false, 0);
POverload := TFPgtkCheckedButton.CreateWithLabel (sOverload);
POverload.ConnectClicked (@ChangedPFuncType, inttopointer(5));
b1.PackStart (POverload, false, false, 0);
PReintroduce := TFPgtkCheckedButton.CreateWithLabel (sReintroduce);
PReintroduce.ConnectClicked (@ChangedPFuncType, inttopointer(6));
b1.PackStart (PReintroduce, false, false, 0);
// Code
//writeln ('------->> Property Code');
PCode := TFPgtkScrollText.Create;
BCode := PCode;
PCode.TheText.ConnectChanged (@ChangedPCode, nil);
bladen.AppendPage (PCode, TFPgtkLabel.Create(sCode));
// Configuring buttonrows
//writeln ('------->> Configure Buttonrows');
BrParams.Configure (LParams.CList, nil, @RefreshParam,
MenuEditParameter.SubMenu,
AG, Gdk_Mod1_Mask+Gdk_Shift_Mask);
BrProperties.Configure (LProperties.Clist, @PropertyIcon, @RefreshProperty,
MenuEditProperty.SubMenu,
AG, Gdk_Control_Mask+Gdk_Shift_Mask);
BrObjects.Configure (LObjects.CList, nil, @RefreshObject,
MenuEditObject.SubMenu, AG, 0);
//writeln ('------->> Einde ComposeWindow');
end;
{ *** Procedures to show parts in the window (when selecting items) *** }
{ Showing procedures }
procedure TGtkEditorWindow.RefreshDefinition;
begin
RefreshingDefinition := True;
try
if assigned (FDefs) then
with FDefs do
begin
DUnitName.text := UnitName;
DGtkPrefix.Text := GtkPrefix;
DUsesList.Text := UsesList;
BrObjects.ChangeCollection (Definition);
end
else
begin
DUnitName.text := '';
DGtkPrefix.Text := '';
DUsesList.Text := '';
BrObjects.ChangeCollection (nil);
end;
finally
RefreshingDefinition := False;
end;
end;
procedure TGtkEditorWindow.RefreshObject (Selected : TCollectionItem; NeedFocus:boolean);
begin
RefreshingObject := True;
try
ciObject := TObjectItem(Selected);
if assigned (ciObject) then
with ciObject do
begin
FObject.Sensitive := true;
OName.Text := Name;
OInherit.Text := Inherit;
OGtkName.Text := GtkName;
OGtkFuncName.Text := GtkFuncName;
OCreateParams.Text := CreateParams;
OCreateObject.Active := CreateObject;
OWithPointer.Active := WithPointer;
BrProperties.ChangeCollection (Props);
end
else
begin
FObject.Sensitive := false;
OName.Clear;
OInherit.Clear;
OGtkName.Clear;
OGtkFuncName.Clear;
OCreateParams.Clear;
OCreateObject.Active := False;
OWithPointer.Active := False;
BrProperties.ChangeCollection (nil);
end;
if NeedFocus then
with OName do
begin
SelectRegion (0, -1);
GrabFocus;
end;
finally
RefreshingObject := false;
end;
end;
procedure TGtkEditorWindow.CreatePixmaps;
procedure GdkPixmap (Data : array of string; var pm : PGdkPixmap; var bm : PGdkBitmap);
var ppdata : ppgchar;
begin
ppdata := ArrayToPPgchar(Data);
pm := gdk_pixmap_colormap_create_from_xpm_d (nil, Colormap, @bm, nil, ppdata);
freemem (ppdata, sizeof (pchar) * (high(data)-low(data)+1));
end;
begin
GdkPixmap (XPMPropField, PropPixs[0], PropMasks[0]);
GdkPixmap (XPMPropProperty, PropPixs[1], PropMasks[1]);
GdkPixmap (XPMPropFunction, PropPixs[2], PropMasks[2]);
GdkPixmap (XPMPropProcedure, PropPixs[3], PropMasks[3]);
GdkPixmap (XPMPropSignal, PropPixs[4], PropMasks[4]);
GdkPixmap (XPMPropHelperProc, PropPixs[5], PropMasks[5]);
GdkPixmap (XPMPropHelperFunc, PropPixs[6], PropMasks[6]);
GdkPixmap (XPMPropSignalType, PropPixs[7], PropMasks[7]);
GdkPixmap (XPMPropDeclar, PropPixs[8], PropMasks[8]);
GdkPixmap (XPMPropTypeDecl, PropPixs[9], PropMasks[9]);
GdkPixmap (XPMPropConstr, PropPixs[10], PropMasks[10]);
GdkPixmap (XPMPropDestr, PropPixs[11], PropMasks[11]);
GdkPixmap (XPMPropInitial, PropPixs[12], PropMasks[12]);
GdkPixmap (XPMPropFinal, PropPixs[13], PropMasks[13]);
end;
procedure TGtkEditorWindow.PropertyIcon (Item:TCollectionItem; var Pixmap:PGdkPixMap; var mask:PGdkBitmap);
var r : integer;
begin
r := ord((Item as TPropertyItem).propType);
Pixmap := PropPixs[r];
Mask := PropMasks[r];
end;
procedure TGtkEditorWindow.EnDisablePages (pt : TPropType);
begin
BDefinition.Visible := pt in [ptField,ptProperty,ptFunction,ptProcedure,ptSignal,
ptHelperProc,ptHelperFunc,ptSignalType,ptDeclarations,ptTypeDecl,
ptConstructor,ptDestructor];
BParameter.visible := pt in [ptProperty,ptFunction,ptProcedure,
ptHelperProc,ptHelperFunc,ptSignalType,ptConstructor,ptDestructor];
BFunction.Visible := pt in [ptFunction,ptProcedure,ptHelperProc,ptHelperFunc,
ptConstructor,ptDestructor];
BRead.Visible := pt in [ptProperty];
BWrite.Visible := pt in [ptProperty];
BCode.visible := pt in [ptDeclarations,ptTypeDecl,ptInitialization,ptFinalization];
end;
procedure TGtkEditorWindow.RefreshProperty (Selected : TCollectionItem; NeedFocus:boolean);
var r : byte;
s : string;
begin
RefreshingProperty := True;
try
ciProperty := selected as TPropertyItem;
if assigned (ciProperty) then
with ciProperty do
begin
s := Code.Text;
FProperty.Sensitive := true;
r := ord (PropType);
PType.SetHistory (r);
EnDisablePages (PropType);
// definition
PName.Text := Name;
PPascalType.Text := PascalType;
PGtkName.Text := GtkName;
PSection.SetHistory (Ord(Section));
// read
PRType.SetHistory (Ord(ReadFuncType));
PRGtkName.Text := GtkName;
PRCode.Text := s;
PRConvert.Active := ReadConvert;
// write
PWType.SetHistory (Ord(WriteProcType));
PWGtkName.Text := WriteGtkName;
PWCode.Text := WriteCode.Text;
PWConvert.Active := WriteConvert;
// function
POverride.active := ptOverride in ProcTypes;
PVirtual.active := ptVirtual in ProcTypes;
PDynamic.active := ptDynamic in ProcTypes;
PAbstract.active := ptAbstract in ProcTypes;
PCDecl.active := ptCDecl in ProcTypes;
POverload.active := ptOverload in ProcTypes;
PReintroduce.active := ptReintroduce in ProcTypes;
PFCode.Text := s;
// Code
PCode.Text := s;
// Parameters
BrParams.ChangeCollection (Parameters);
end
else
begin
FProperty.Sensitive := false;
PType.Clear;
// definition
PName.Clear;
PPascalType.Clear;
PGtkName.Clear;
PSection.Clear;
// read
PRType.Clear;
PRGtkName.Clear;
PRCode.Clear;
PRConvert.Active := false;
// write
PWType.Clear;
PWGtkName.Clear;
PWCode.Clear;
PWConvert.Active := False;
// function
POverride.active := False;
PVirtual.active := False;
PDynamic.active := False;
PAbstract.active := False;
PCDecl.active := False;
POverload.active := False;
PReintroduce.active := False;
PFCode.Clear;
// Code
PCode.Clear;
// Parameters
BrParams.ChangeCollection (nil);
end;
finally
RefreshingProperty := false;
end;
if NeedFocus then
with PName do
begin
Bladen.PageIndex := 0;
SelectRegion (0, -1);
GrabFocus;
end;
end;
procedure TGtkEditorWindow.RefreshParam (Selected : TCollectionItem; NeedFocus:boolean);
begin
RefreshingParam := True;
try
ciParameter := Selected as TParameterItem;
if assigned (ciParameter) then
with ciParameter do
begin
FParam.Sensitive := true;
ParamName.text := name;
ParamPascalType.text := PascalType;
self.ParamType.SetHistory (Ord(ParamType));
ParamConvert.Active := Convert;
end
else
begin
FParam.Sensitive := false;
ParamName.Clear;
ParamPascalType.Clear;
self.ParamType.Clear;
ParamConvert.Active := False;
end;
if NeedFocus then
with ParamName do
begin
selectRegion (0, -1);
GrabFocus;
end;
finally
RefreshingParam := False;
end;
end;
procedure TGtkEditorWindow.ObjectDisplayChanged;
begin
with BrObjects do
if (SelectedRow >= 0) and assigned(ciObject) then
LObjects.Clist.CellText[SelectedRow,0] := ciObject.DisplayName;
end;
procedure TGtkEditorWindow.PropertyDisplayChanged;
var r : integer;
begin
with BrProperties do
if (SelectedRow >= 0) and assigned(ciProperty) then
begin
LProperties.CList.CellText[SelectedRow,1] := ciProperty.DisplayName;
r := ord(ciProperty.PropType);
LProperties.CList.SetPixMap (SelectedRow, 0, PropPixs[r], PropMasks[r]);
end;
end;
procedure TGtkEditorWindow.ParamDisplayChanged;
begin
with BrParams do
if (SelectedRow >= 0) and assigned(ciParameter) then
LParams.CList.CellText[SelectedRow,0] := ciParameter.DisplayName;
end;
{ entry saving procedures/signals }
// Definition
procedure TGtkEditorWindow.ChangedDUsesList (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingDefinition then Exit;
if assigned (FDefs) then
FDefs.UsesList := DUsesList.Text;
end;
procedure TGtkEditorWindow.ChangedDUnitName (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingDefinition then Exit;
if assigned (FDefs) then
FDefs.UnitName := DUnitName.Text;
end;
procedure TGtkEditorWindow.ChangedDGtkPrefix (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingDefinition then Exit;
if assigned (FDefs) then
FDefs.GtkPrefix := DGtkPrefix.Text;
end;
// Object
procedure TGtkEditorWindow.ChangedOName (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingObject then Exit;
if assigned(ciObject) then
begin
ciObject.Name := OName.Text;
ObjectDisplayChanged;
end;
end;
procedure TGtkEditorWindow.ChangedOInherit (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingObject then Exit;
if assigned(ciObject) then
ciObject.Inherit := OInherit.Text;
end;
procedure TGtkEditorWindow.ChangedOGtkName (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingObject then Exit;
if assigned(ciObject) then
ciObject.GtkName := OGtkName.Text;
end;
procedure TGtkEditorWindow.ChangedOGtkFuncName (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingObject then Exit;
if assigned(ciObject) then
ciObject.GtkFuncName := OGtkFuncName.Text;
end;
procedure TGtkEditorWindow.ChangedOCreateParams (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingObject then Exit;
if assigned(ciObject) then
ciObject.CreateParams := OCreateParams.Text;
end;
procedure TGtkEditorWindow.ChangedOCreateObject (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingObject then Exit;
if assigned(ciObject) then
ciObject.CreateObject := OCreateObject.active;
end;
procedure TGtkEditorWindow.ChangedOWithPointer (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingObject then Exit;
if assigned(ciObject) then
ciObject.WithPointer := OWithpointer.active;
end;
// Property
procedure TGtkEditorWindow.ChangedPType (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
begin
ciProperty.PropType := TPropType(Pointertoint(data));
PropertyDisplayChanged;
EnDisablePages (ciProperty.PropType);
end;
end;
procedure TGtkEditorWindow.ChangedPName (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
begin
ciProperty.Name := PName.Text;
PropertyDisplayChanged;
end;
end;
procedure TGtkEditorWindow.ChangedPPascalType (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
ciProperty.PascalType := PPascalType.Text;
end;
procedure TGtkEditorWindow.ChangedPGtkName (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
ciProperty.GtkName := (Sender as TFpgtkEntry).Text;
end;
procedure TGtkEditorWindow.ChangedPSection (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
begin
ciProperty.Section := TInterfaceSection(Pointertoint(data));
PropertyDisplayChanged;
end;
end;
procedure TGtkEditorWindow.ChangedPCode (Sender:TFPgtkObject; data:pointer);
var s : string;
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
s := (Sender as TFPgtkText).Text;
ciProperty.Code.Text := s;
end;
// read
procedure TGtkEditorWindow.ChangedPRType (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
ciProperty.ReadfuncType := TPropFuncType(Pointertoint(data));
end;
procedure TGtkEditorWindow.ChangedPRConvert (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
ciProperty.ReadConvert := PRConvert.Active;
end;
// write
procedure TGtkEditorWindow.ChangedPWType (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
begin
ciProperty.WriteProcType := TPropFuncType(Pointertoint(data));
end;
end;
procedure TGtkEditorWindow.ChangedPWGtkName (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
ciProperty.WriteGtkName := PWGtkName.Text;
end;
procedure TGtkEditorWindow.ChangedPWCode (Sender:TFPgtkObject; data:pointer);
var s : string;
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
begin
s := PWCode.Text;
ciProperty.WriteCode.Text := s;
end;
end;
procedure TGtkEditorWindow.ChangedPWConvert (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
ciProperty.WriteConvert := PWConvert.active;
end;
// function
procedure TGtkEditorWindow.ChangedPFuncType (Sender:TFPgtkObject; data:pointer);
var pt : TProcType;
begin
if RefreshingProperty then Exit;
if assigned(ciProperty) then
with ciProperty do
begin
pt := TProcType(pointertoint(data));
if (Sender as TFPgtkToggleButton).Active then
ProcTypes := Proctypes + [pt]
else
ProcTypes := Proctypes - [pt];
end;
end;
// parameter
procedure TGtkEditorWindow.ChangedParamName (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingParam then Exit;
if assigned (ciParameter) then
begin
ciParameter.Name := ParamName.Text;
ParamDisplayChanged;
end;
end;
procedure TGtkEditorWindow.ChangedParamPascalType (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingParam then Exit;
if assigned (ciParameter) then
ciParameter.PascalType := ParamPascalType.Text;
end;
procedure TGtkEditorWindow.ChangedParamType (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingParam then Exit;
if assigned (ciParameter) then
ciParameter.ParamType := TParamType (Pointertoint(data));
end;
procedure TGtkEditorWindow.ChangedParamConvert (Sender:TFPgtkObject; data:pointer);
begin
if RefreshingParam then Exit;
if assigned (ciParameter) then
ciParameter.Convert := ParamConvert.Active;
end;
{ *** Menu procedures *** }
procedure TGtkEditorWindow.BuildReopenList;
var r : integer;
mi : TFPgtkMenuItem;
begin
with FReopenList do
begin
while (count > FSettings.MRUCount) do
Delete (0);
with MenuFileReopen do
begin
if assigned(SubMenu) then
SubMenu.Free;
SubMenu := TFPgtkMenu.Create;
with (submenu as TFPgtkMenu) do
for r := FReopenList.count-1 downto 0 do
begin
mi := NewMenuItem (FReopenList[r], '', '', nil, @FileReopen, mi);
Append (mi);
end;
end;
end;
end;
procedure TGtkEditorWindow.NewFilename (NewName : string);
var r : integer;
begin
if NewName = '' then
Title := sEditorTitle
else
Title := sEditorTitle + ' - ' + NewName;
FFilename := NewName;
with FReopenList do
begin
r := IndexOf (NewName);
if r >= 0 then
Delete (r);
Add (NewName);
BuildReopenList;
end;
end;
procedure TGtkEditorWindow.DataWrite (filename : string);
var
BinStream : TMemoryStream;
StrStream : TFileStream;
l : TStrings;
begin
StrStream := TFileStream.Create(filename, fmCreate);
try
case FSettings.FileFormat of
ffComponentText :
begin
BinStream := TMemoryStream.Create;
try
BinStream.WriteComponent(FDefs);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
finally
BinStream.Free
end;
end;
ffComonentBin :
StrStream.WriteComponent(FDefs);
ffHomeText :
begin
l := TStringList.Create;
try
l.capacity := FDefs.definition.count * 5;
FDefs.Save (l);
l.SaveToStream (StrStream);
finally
l.Free;
end;
end;
end;
HasAFile := True;
NewFilename (filename);
finally
StrStream.Free;
end;
end;
procedure TGtkEditorWindow.DataRead (filename : string);
var FStream : TFileStream;
MStream : TMemoryStream;
s : string[6];
l : TStrings;
begin
if fileExists (filename) then
begin
FStream := TFileStream.Create(filename, fmOpenRead);
try
FStream.Readbuffer (s[1],6);
s[0] := #6;
FStream.Seek (0, soFromBeginning);
if not assigned (FDefs) then
FDefs := TObjectDefs.Create (nil);
if s = 'object' then
begin
MStream := TMemoryStream.Create;
try
ObjectTextToBinary(FStream, MStream);
MStream.Seek(0, soFromBeginning);
MStream.ReadComponent(FDefs);
finally
MStream.Free;
end;
end
else if s = 'defini' then
begin
l := TStringList.Create;
try
l.LoadFromStream (FStream);
FDefs.Load (l);
finally
l.Free;
end;
end
else
FStream.ReadComponent (FDefs);
finally
FStream.Free;
end;
HasAFile := True;
newFileName (filename);
end
else
ShowMessage ('Error', 'Can''t find file "'+filename+'"');
end;
procedure TGtkEditorWindow.Generate;
var TheFile : TStringList;
Prog : TProgressWindow;
begin
TheFile := TStringList.Create;
try
TheFile.beginUpdate;
if FSettings.ShowProgress then
begin
Prog := TProgressWindow.Create;
try
Prog.Show;
FDefs.Write (TheFile, @(Prog.StepIt), @(Prog.SetMax));
Prog.Hide;
finally
Prog.Free;
end;
end
else
FDefs.Write (TheFile, nil, nil);
TheFile.EndUpdate;
Thefile.SaveToFile (FDefs.UnitName+'.'+FSettings.Extention);
finally
TheFile.Free;
end;
end;
{ Menu signals }
procedure TGtkEditorWindow.FileNew (Sender : TFPgtkObject; data : pointer);
begin
FDefs.Free;
FDefs := TObjectDefs.Create (nil);
FFileName := '';
RefreshDefinition;
end;
procedure TGtkEditorWindow.DialogSetFilename (Sender:TFPgtkWindow;
aDialogResult:pointer; Action:integer; initiator:TFPgtkObject);
begin
if Action = drOk then
FFilename := (Sender as TFPgtkFileSelection).Filename;
end;
procedure TGtkEditorWindow.FileOpen (Sender : TFPgtkObject; data : pointer);
var fs : TFPgtkFileSelection;
begin
fs := TFPgtkFileSelection.Create (gtk_window_dialog);
with fs do
begin
Title := 'Select file to open';
OKButton.ConnectClicked (@(fs.CloseWithResult), inttopointer(drOk));
CancelButton.ConnectClicked (@(fs.CloseWindow), nil);
Filename := FFilename;
if execute (nil, nil, @DialogSetFilename) = drOk then
begin
DataRead (FFilename);
RefreshDefinition;
end;
end;
end;
procedure TGtkEditorWindow.FileReopen (Sender : TFPgtkObject; data : pointer);
begin
with (Sender as TFPgtkMenuItem) do
begin
DataRead (Text);
RefreshDefinition;
end;
end;
procedure TGtkEditorWindow.ToolbarReopen (Sender : TFpgtkObject; data : pointer);
begin
(MenuFileReopen.submenu as TFPgtkMenu).Popup (0);
end;
procedure TGtkEditorWindow.FileSave (Sender : TFPgtkObject; data : pointer);
begin
if FFilename = '' then
FileSaveAs (Sender, data)
else
DataWrite (FFilename);
end;
procedure TGtkEditorWindow.FileSaveAs (Sender : TFPgtkObject; data : pointer);
var fs : TFPgtkFileSelection;
begin
fs := TFPgtkFileSelection.Create (gtk_window_dialog);
with fs do
begin
Title := 'Give filename to save';
OKButton.ConnectClicked (@(fs.CloseWithResult), inttopointer(drOk));
CancelButton.ConnectClicked (@(fs.CloseWindow), nil);
Filename := FFilename;
if execute (nil, nil, @DialogSetFilename) = drOk then
DataWrite (FFilename);
end;
end;
procedure TGtkEditorWindow.FileExit (Sender : TFPgtkObject; data : pointer);
begin
If FSettings.SaveOnClose then
FileSave (Sender, data);
Close;
end;
procedure TGtkEditorWindow.ToolsGenerate (Sender : TFPgtkObject; data : pointer);
begin
Generate;
end;
procedure TGtkEditorWindow.ToolsOptions (Sender : TFPgtkObject; data : pointer);
begin
with TSettingsDialog.Create do
Execute (nil, @FSettings, nil);
end;
procedure TGtkEditorWindow.HelpInfo (Sender : TFPgtkObject; data : pointer);
begin
ShowMessage (sInfoTitle, sInfoMessage);
end;
procedure TGtkEditorWindow.HelpAbout (Sender : TFPgtkObject; data : pointer);
var d : TFPgtkDialog;
b : TFPgtkButton;
box : TFPgtkBox;
AG : integer;
begin
d := TFPgtkDialog.Create;
with d do
begin
title := sAboutTitle;
box := TFPgtkVBox.Create;
with Box do
begin
border := 15;
PackStart (TFPgtkLabel.Create (sAbout1));
PackStart (TFPgtkLabel.Create (sAbout2));
PackStart (TFPgtkHSeparator.Create, false, false, 8);
PackStart (TFPgtkLabel.Create (sAboutVersion));
PackStart (TFPgtkLabel.Create (sAboutDesigner));
end;
vbox.Packstart (box, true, false, 0);
with ActionArea do
begin
b := TFPgtkButton.CreateWithLabel (sOk);
b.ConnectClicked (@(d.CloseWindow), nil);
Packstart (b);
end;
AG := AccelGroupNew;
AcceleratorAdd (AG, b, sgClicked, gdk_Return, 0, TGTKAccelFlags(0));
AcceleratorAdd (AG, b, sgClicked, gdk_Cancel, 0, TGTKAccelFlags(0));
Execute (nil, nil, nil);
end;
end;
const
secSettings = 'Settings';
keySaveOnExit = 'SaveOnExit';
keyFileFormat = 'TextFormat';
keyMRUCount = 'MRUCount';
keyExtention = 'Extention';
keyProgressWindow = 'ShowProgress';
secMRU = 'Last open files';
keyFile = 'File';
keyCount = 'Count';
procedure TGtkEditorWindow.ReadSettings;
var c, r : integer;
s : string;
begin
with FSettings do
with TMemInifile.Create(ChangeFileExt(paramstr(0), '.ini')) do
try
saveonclose := readbool (SecSettings, keySaveOnExit, true);
Fileformat := TFileFormat(readinteger (secSettings, keyFileFormat, 2));
Extention := readstring (secSettings, keyExtention, '.pp');
MRUCount := readinteger (secSettings, keyMRUCount, 5);
ShowProgress := readbool (SecSettings, keyProgressWindow, true);
FReopenList.capacity := MRUCount;
c := ReadInteger (secMRU, keyCount, 0);
for r := 0 to c-1 do
begin
s := readstring(secMRU, keyFile+inttostr(r), '');
if s <> '' then
FReopenlist.Add (s);
end;
BuildReopenList;
finally
free;
end;
end;
procedure TGtkEditorWindow.WriteSettings (Sender : TFPgtkObject; data : pointer);
var r : integer;
begin
with PSettingsRec(data)^, TMemInifile.Create (ChangeFileExt(paramstr(0), '.ini')) do
try
writebool (SecSettings, keySaveOnExit, saveonclose);
writeinteger (secSettings, keyFileFormat, Ord(FileFormat));
writestring (secSettings, keyExtention, Extention);
writeinteger (secSettings, keyMRUCount, MRUCount);
writebool (SecSettings, keyProgressWindow, ShowProgress);
writeinteger (secMRU, keyCount, FReopenlist.count);
UpdateFile;
for r := 0 to FReopenList.count-1 do
writestring (secMRU, keyFile+inttostr(r), FReopenList[r]);
finally
free;
end;
end;
end.