{ fpGUI - Free Pascal GUI Toolkit Copyright (C) 2006 - 2008 See the file AUTHORS.txt, included in this distribution, for details of the copyright. See the file COPYING.modifiedLGPL, included in this distribution, for details about redistributing fpGUI. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Description: The main uiDesigner forms. } unit vfdforms; {$mode objfpc}{$H+} interface uses Classes, SysUtils, fpg_base, fpg_widget, gui_form, gui_label, gui_edit, gui_button, gui_listbox, gui_combobox, gui_trackbar, gui_checkbox; type TVFDDialog = class(TfpgForm) protected procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); override; end; TInsertCustomForm = class(TVFDDialog) public l1, l2: TfpgLabel; edClass: TfpgEdit; edName: TfpgEdit; btnOK: TfpgButton; btnCancel: TfpgButton; procedure AfterCreate; override; procedure OnButtonClick(Sender: TObject); end; TNewFormForm = class(TVFDDialog) private procedure OnedNameKeyPressed(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: boolean); public l1: TfpgLabel; edName: TfpgEdit; btnOK: TfpgButton; btnCancel: TfpgButton; procedure AfterCreate; override; procedure OnButtonClick(Sender: TObject); end; TEditPositionForm = class(TVFDDialog) private procedure edPosKeyPressed(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: boolean); public lbPos: TfpgLabel; edPos: TfpgEdit; btnOK: TfpgButton; btnCancel: TfpgButton; procedure AfterCreate; override; procedure OnButtonClick(Sender: TObject); end; TWidgetOrderForm = class(TVFDDialog) public {@VFD_HEAD_BEGIN: WidgetOrderForm} l1: TfpgLabel; list: TfpgListBox; btnOK: TfpgButton; btnCancel: TfpgButton; btnUp: TfpgButton; btnDown: TfpgButton; {@VFD_HEAD_END: WidgetOrderForm} constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure AfterCreate; override; procedure OnButtonClick(Sender: TObject); end; TfrmVFDSetup = class(TfpgForm) private procedure LoadSettings; procedure SaveSettings; procedure btnOKClick(Sender: TObject); public {@VFD_HEAD_BEGIN: frmVFDSetup} lb1: TfpgLabel; chlGrid: TfpgComboBox; btnOK: TfpgButton; btnCancel: TfpgButton; lblRecentFiles: TfpgLabel; tbMRUFileCount: TfpgTrackBar; cbFullPath: TfpgCheckBox; lblName1: TfpgLabel; lblName2: TfpgLabel; eDefaultExt: TfpgEdit; lblName3: TfpgLabel; cbUndoOnExit: TfpgCheckBox; {@VFD_HEAD_END: frmVFDSetup} procedure AfterCreate; override; procedure BeforeDestruction; override; end; implementation uses fpg_main, gui_iniutils, fpg_constants, vfdprops; // used to get Object Inspector defaults { TInsertCustomForm } procedure TInsertCustomForm.AfterCreate; begin inherited; WindowPosition := wpScreenCenter; WindowTitle := 'Insert Custom Widget'; SetPosition(0, 0, 300, 100); l1 := CreateLabel(self, 8, 4, 'Class name:'); edClass := CreateEdit(self, 8, 24, 150, 0); edClass.Text := 'Tfpg'; l2 := CreateLabel(self, 8, 48, 'Name:'); edName := CreateEdit(self, 8, 68, 150, 0); btnOK := CreateButton(self, 180, 20, 100, 'OK', @OnButtonClick); btnCancel := CreateButton(self, 180, 52, 100, 'Cancel', @OnButtonClick); end; procedure TInsertCustomForm.OnButtonClick(Sender: TObject); begin if Sender = btnOK then ModalResult := 1 else ModalResult := 2; end; { TNewFormForm } procedure TNewFormForm.OnedNameKeyPressed(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: boolean); begin if (KeyCode = keyEnter) or (KeyCode = keyPEnter) then btnOK.Click; end; procedure TNewFormForm.AfterCreate; begin inherited AfterCreate; WindowPosition := wpScreenCenter; SetPosition(0, 0, 286, 66); WindowTitle := 'New Form'; l1 := CreateLabel(self, 8, 8, 'Form name:'); edName := CreateEdit(self, 8, 28, 180, 0); edName.Text := 'frm'; edName.OnKeyPress := @OnedNameKeyPressed; btnOK := CreateButton(self, 196, 8, 80, rsOK, @OnButtonClick); btnCancel := CreateButton(self, 196, 36, 80, rsCancel, @OnButtonClick); end; procedure TNewFormForm.OnButtonClick(Sender: TObject); begin if Sender = btnOK then ModalResult := 1 else ModalResult := 2; end; { TEditPositionForm } procedure TEditPositionForm.edPosKeyPressed(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: boolean); begin if (KeyCode = keyEnter) or (KeyCode = keyPEnter) then btnOK.Click; end; procedure TEditPositionForm.AfterCreate; begin inherited AfterCreate; WindowPosition := wpScreenCenter; Width := 186; Height := 66; WindowTitle := 'Position'; Sizeable := False; lbPos := CreateLabel(self, 8, 8, 'Pos: '); edPos := CreateEdit(self, 8, 28, 80, 0); edPos.OnKeyPress := @edPosKeyPressed; btnOK := CreateButton(self, 98, 8, 80, rsOK, @OnButtonClick); btnCancel := CreateButton(self, 98, 36, 80, rsCancel, @OnButtonClick); end; procedure TEditPositionForm.OnButtonClick(Sender: TObject); begin if Sender = btnOK then ModalResult := 1 else ModalResult := 2; end; { TWidgetOrderForm } constructor TWidgetOrderForm.Create(AOwner: TComponent); begin inherited Create(AOwner); Name := 'WidgetOrderForm'; gINI.ReadFormState(self); end; destructor TWidgetOrderForm.Destroy; begin gINI.WriteFormState(self); inherited Destroy; end; procedure TWidgetOrderForm.AfterCreate; begin inherited AfterCreate; {@VFD_BODY_BEGIN: WidgetOrderForm} Name := 'WidgetOrderForm'; SetPosition(534, 173, 312, 258); WindowTitle := 'Widget order'; WindowPosition := wpScreenCenter; l1 := TfpgLabel.Create(self); with l1 do begin Name := 'l1'; SetPosition(4, 4, 108, 16); FontDesc := '#Label1'; Text := 'Form widget order:'; end; list := TfpgListBox.Create(self); with list do begin Name := 'list'; SetPosition(4, 24, 220, 228); Anchors := [anLeft,anRight,anTop,anBottom]; FontDesc := '#List'; TabOrder := 1; end; btnOK := TfpgButton.Create(self); with btnOK do begin Name := 'btnOK'; SetPosition(232, 24, 75, 24); Anchors := [anRight,anTop]; Text := 'OK'; FontDesc := '#Label1'; ImageName := 'stdimg.ok'; TabOrder := 2; OnClick := @OnButtonClick; end; btnCancel := TfpgButton.Create(self); with btnCancel do begin Name := 'btnCancel'; SetPosition(232, 52, 75, 24); Anchors := [anRight,anTop]; Text := 'Cancel'; FontDesc := '#Label1'; ImageName := 'stdimg.cancel'; TabOrder := 3; OnClick := @OnButtonClick; end; btnUp := TfpgButton.Create(self); with btnUp do begin Name := 'btnUp'; SetPosition(232, 108, 75, 24); Anchors := [anRight,anTop]; Text := 'Up'; FontDesc := '#Label1'; ImageName := ''; TabOrder := 4; OnClick := @OnButtonClick; end; btnDown := TfpgButton.Create(self); with btnDown do begin Name := 'btnDown'; SetPosition(232, 136, 75, 24); Anchors := [anRight,anTop]; Text := 'Down'; FontDesc := '#Label1'; ImageName := ''; TabOrder := 5; OnClick := @OnButtonClick; end; {@VFD_BODY_END: WidgetOrderForm} end; procedure TWidgetOrderForm.OnButtonClick(Sender: TObject); var i: integer; n: integer; myilev: integer; function IdentLevel(astr: string): integer; var s: string; f: integer; begin Result := 0; s := astr; f := 1; while (f <= length(s)) and (s[f] = ' ') do begin Inc(Result); Inc(f); end; end; begin if Sender = btnOK then ModalResult := 1 else if Sender = btnCancel then ModalResult := 2 else begin // up / down i := list.FocusItem; if i < 0 then Exit; myilev := IdentLevel(list.Items[i]); if Sender = btnUP then begin if (i > 0) and (IdentLevel(list.Items[i - 1]) = myilev) then begin list.Items.Move(i, i - 1); n := i; while (n < list.Items.Count) and (IdentLevel(list.Items[n]) > myilev) do begin list.Items.Move(n, n - 1); Inc(n); end; list.FocusItem := i - 1; end; end else if Sender = btnDOWN then if (i < list.Items.Count-1) then begin n := i; while (n < list.Items.Count) and (IdentLevel(list.Items[n]) > myilev) do Inc(n); if (i = n) and (i < list.Items.Count-1) and (IdentLevel(list.Items[i]) > myilev) then Exit; if (n > list.Items.Count-1) then Exit; //==> while (n >= i) do begin list.Items.Move(n, n + 1); Dec(n); end; list.FocusItem := i + 1; end; end; end; { TVFDDialogBase } procedure TVFDDialog.HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); begin if keycode = keyEscape then begin ModalResult := 2; consumed := True; end; inherited HandleKeyPress(keycode, shiftstate, consumed); end; procedure TfrmVFDSetup.LoadSettings; begin chlGrid.FocusItem := gINI.ReadInteger('Options', 'GridResolution', 2); tbMRUFileCount.Position := gINI.ReadInteger('Options', 'MRUFileCount', 4); cbFullPath.Checked := gINI.ReadBool('Options', 'ShowFullPath', True); eDefaultExt.Text := gINI.ReadString('Options', 'DefaultFileExt', '.pas'); cbUndoOnExit.Checked := gINI.ReadBool('Options', 'UndoOnExit', UndoOnPropExit); end; procedure TfrmVFDSetup.SaveSettings; begin gINI.WriteInteger('Options', 'GridResolution', chlGrid.FocusItem); gINI.WriteInteger('Options', 'MRUFileCount', tbMRUFileCount.Position); gINI.WriteBool('Options', 'ShowFullPath', cbFullPath.Checked); gINI.WriteString('Options', 'DefaultFileExt', eDefaultExt.Text); gINI.WriteBool('Options', 'UndoOnExit', cbUndoOnExit.Checked); end; procedure TfrmVFDSetup.btnOKClick(Sender: TObject); begin SaveSettings; ModalResult := 1; end; procedure TfrmVFDSetup.AfterCreate; begin {@VFD_BODY_BEGIN: frmVFDSetup} Name := 'frmVFDSetup'; SetPosition(394, 399, 253, 225); WindowTitle := 'General settings'; WindowPosition := wpScreenCenter; gINI.ReadFormState(self); lb1 := TfpgLabel.Create(self); with lb1 do begin Name := 'lb1'; SetPosition(28, 28, 116, 16); FontDesc := '#Label1'; Text := 'Grid resolution:'; end; chlGrid := TfpgComboBox.Create(self); with chlGrid do begin Name := 'chlGrid'; SetPosition(140, 24, 88, 22); FontDesc := '#List'; Items.Add('1'); Items.Add('4'); Items.Add('8'); TabOrder := 1; FocusItem := 0; end; btnOK := TfpgButton.Create(self); with btnOK do begin Name := 'btnOK'; SetPosition(93, 195, 75, 24); Anchors := [anRight,anBottom]; Text := 'OK'; FontDesc := '#Label1'; ImageName := 'stdimg.ok'; TabOrder := 6; OnClick := @btnOKClick; end; btnCancel := TfpgButton.Create(self); with btnCancel do begin Name := 'btnCancel'; SetPosition(172, 195, 75, 24); Anchors := [anRight,anBottom]; Text := 'Cancel'; FontDesc := '#Label1'; ImageName := 'stdimg.cancel'; ModalResult := -1; TabOrder := 7; end; lblRecentFiles := TfpgLabel.Create(self); with lblRecentFiles do begin Name := 'lblRecentFiles'; SetPosition(28, 92, 124, 16); FontDesc := '#Label1'; Text := 'Recent files count:'; end; tbMRUFileCount := TfpgTrackBar.Create(self); with tbMRUFileCount do begin Name := 'tbMRUFileCount'; SetPosition(156, 84, 76, 30); Max := 10; Min := 2; Position := 4; ShowPosition := True; TabOrder := 3; end; cbFullPath := TfpgCheckBox.Create(self); with cbFullPath do begin Name := 'cbFullPath'; SetPosition(24, 112, 204, 20); FontDesc := '#Label1'; TabOrder := 4; Text := 'Show the full file path'; end; lblName1 := TfpgLabel.Create(self); with lblName1 do begin Name := 'lblName1'; SetPosition(8, 8, 176, 16); FontDesc := '#Label2'; Text := 'Form designer'; end; lblName2 := TfpgLabel.Create(self); with lblName2 do begin Name := 'lblName2'; SetPosition(8, 72, 232, 16); FontDesc := '#Label2'; Text := 'Open Recent menu settings'; end; eDefaultExt := TfpgEdit.Create(self); with eDefaultExt do begin Name := 'eDefaultExt'; SetPosition(28, 160, 68, 22); TabOrder := 5; Text := ''; FontDesc := '#Edit1'; end; lblName3 := TfpgLabel.Create(self); with lblName3 do begin Name := 'lblName3'; SetPosition(12, 140, 152, 16); FontDesc := '#Label2'; Text := 'Default file extension'; end; cbUndoOnExit := TfpgCheckBox.Create(self); with cbUndoOnExit do begin Name := 'cbUndoOnExit'; SetPosition(24, 48, 204, 18); FontDesc := '#Label1'; TabOrder := 2; Text := 'Undo on property editor exit'; end; {@VFD_BODY_END: frmVFDSetup} LoadSettings; end; procedure TfrmVFDSetup.BeforeDestruction; begin gINI.WriteFormState(self); inherited BeforeDestruction; end; end.