From 7d76bc5a71cccf70ab7e6c49fd3ea8d9c93f1e8c Mon Sep 17 00:00:00 2001 From: graemeg Date: Thu, 6 Sep 2007 15:25:56 +0000 Subject: * Moved some methods or properties to the public or published area. * Added a new example project. A fpGUI visual form designer. Still not working 100% but it is getting there. --- examples/apps/uidesigner/vfdmain.pas | 438 +++++++++++++++++++++++++++++++++++ 1 file changed, 438 insertions(+) create mode 100644 examples/apps/uidesigner/vfdmain.pas (limited to 'examples/apps/uidesigner/vfdmain.pas') diff --git a/examples/apps/uidesigner/vfdmain.pas b/examples/apps/uidesigner/vfdmain.pas new file mode 100644 index 00000000..90a3564e --- /dev/null +++ b/examples/apps/uidesigner/vfdmain.pas @@ -0,0 +1,438 @@ +{ + fpGUI - Free Pascal GUI Library + + Copyright (C) 2006 - 2007 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: + Main window functionality and designer class. +} + +unit vfdmain; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, + SysUtils, + gfx_widget, + gui_dialogs, + vfdforms, + vfddesigner, + vfdfile, + newformdesigner; + +const + program_version = '0.10'; + +type + + TMainDesigner = class(TObject) + private + procedure SetEditedFileName(const Value: string); + protected + FDesigners: TList; + FFile: TVFDFile; + FEditedFileName: string; + public + GridResolution: integer; + SaveComponentNames: boolean; + selectedform: TFormDesigner; + constructor Create; + destructor Destroy; override; + procedure CreateWindows; + procedure SelectForm(aform: TFormDesigner); + function Designer(index: integer): TFormDesigner; + function DesignerCount: integer; + function NewFormName: string; + procedure CreateParseForm(const FormName, FormHead, FormBody: string); + procedure OnNewForm(Sender: TObject); + procedure OnNewFile(Sender: TObject); + procedure OnSaveFile(Sender: TObject); + procedure OnLoadFile(Sender: TObject); + procedure OnPaletteChange(Sender: TObject); + procedure OnPropTextChange(Sender: TObject); + procedure OnPropNameChange(Sender: TObject); + procedure OnPropPosEdit(Sender: TObject); + procedure OnOtherChange(Sender: TObject); + procedure OnAnchorChange(Sender: TObject); + procedure OnEditWidget(Sender: TObject); + procedure OnEditWidgetOrder(Sender: TObject); + procedure OnExit(Sender: TObject); + procedure OnOptionsClick(Sender: TObject); + property EditedFileName: string read FEditedFileName write SetEditedFileName; + end; + + +var + maindsgn: TMainDesigner; + + +implementation + +uses + vfdformparser; + +{ TMainDesigner } + +procedure TMainDesigner.OnNewFile(Sender: TObject); +var + n: integer; +begin + EditedFileName := ''; + for n := 0 to FDesigners.Count - 1 do + begin + selectedform := nil; + TFormDesigner(FDesigners[n]).Free; + end; + FDesigners.Clear; + OnNewForm(Sender); +end; + + +procedure TMainDesigner.OnLoadFile(Sender: TObject); +var + n, m: integer; + bl, bl2: TVFDFileBlock; + fname: string; + afiledialog: TfpgFileDialog; +begin + fname := EditedFileName; + + if Sender <> maindsgn then + begin + afiledialog := TfpgFileDialog.Create(nil); + afiledialog.Filename := EditedFilename; + afiledialog.WindowTitle := 'Open form file'; + afiledialog.Filter := 'Pascal source files (*.pas;*.inc;*.dpr;*.lpr)|*.pas;*.inc;*.dpr;*.lpr|All Files (*)|*'; + if afiledialog.RunOpenFile then + begin + EditedFileName := aFileDialog.Filename; + fname := EditedFilename; + end + else + fname := ''; + FreeAndNil(aFileDialog); + end; + + if fname = '' then + Exit; + + for n := 0 to FDesigners.Count - 1 do + begin + selectedform := nil; + TFormDesigner(FDesigners[n]).Free; + end; + FDesigners.Clear; + + if not FileExists(fname) then + begin + ShowMessage('File does not exists.', 'Error loading form'); + Exit; + end; + + Writeln('loading file...'); + + FFile.LoadFile(fname); + FFile.GetBlocks; + + for n := 1 to FFile.BlockCount do + begin + bl := FFile.Block(n); + if bl.BlockID = 'VFD_HEAD_BEGIN' then + for m := n + 1 to FFile.BlockCount do + begin + bl2 := FFile.Block(m); + if (bl2.BlockID = 'VFD_BODY_BEGIN') and (bl2.FormName = bl.FormName) then + CreateParseForm(bl.FormName, bl.Data, bl2.Data)// pair has found + //Writeln('Parsing form: ',bl.FormName); + //Writeln(bl.data); + //Writeln(bl2.data); + ; + end; + end; + +end; + +procedure TMainDesigner.OnSaveFile(Sender: TObject); +var + n, i: integer; + fd: TFormDesigner; + fdata: string; + ff: file; + fname, uname: string; + aFileDialog: TfpgFileDialog; +begin + fname := EditedFileName; + + afiledialog := TfpgFileDialog.Create(nil); + afiledialog.Filename := EditedFilename; + afiledialog.WindowTitle := 'Save form source'; + afiledialog.Filter := 'Pascal source files (*.pas;*.inc;*.dpr;*.lpr)|*.pas;*.inc;*.dpr;*.lpr|All Files (*)|*'; + if afiledialog.RunSaveFile then + begin + EditedFileName := aFileDialog.Filename; + fname := EditedFilename; + end + else + fname := ''; + aFileDialog.Free; + + if fname = '' then + Exit; + + EditedFileName := fname; + + if FileExists(fname) then + begin + FFile.LoadFile(fname); + FFile.GetBlocks; + end + else + begin + uname := ExtractFileName(fname); + i := pos('.pas', LowerCase(uname)); + if i > 0 then + uname := copy(uname, 1, i - 1); + FFile.NewFileSkeleton(uname); + end; + + for n := 1 to DesignerCount do + begin + fd := Designer(n); + FFile.SetFormData(fd.Form.Name, fd.GetFormSourceDecl, fd.GetFormSourceImpl); + end; + + fdata := FFile.MergeBlocks; + + AssignFile(ff, fname); + try + Rewrite(ff, 1); + try + BlockWrite(ff, fdata[1], length(fdata)); + finally + CloseFile(ff); + end; + writeln('Form saved.'); + + frmMain.WindowTitle := fname + ' - VFD v' + program_version; + + except + Writeln('Form save I/O failure.'); + end; + +end; + +procedure TMainDesigner.OnAnchorChange(Sender: TObject); +begin + if SelectedForm <> nil then + SelectedForm.OnAnchorChange(Sender); +end; + +procedure TMainDesigner.OnOtherChange(Sender: TObject); +begin + if SelectedForm <> nil then + SelectedForm.OnOtherChange(Sender); +end; + +procedure TMainDesigner.OnPropNameChange(Sender: TObject); +begin + if SelectedForm <> nil then + SelectedForm.OnPropNameChange(Sender); +end; + +procedure TMainDesigner.OnPropPosEdit(Sender: TObject); +begin + if SelectedForm <> nil then + SelectedForm.OnPropPosEdit(Sender); +end; + +procedure TMainDesigner.OnPropTextChange(Sender: TObject); +begin + if SelectedForm <> nil then + SelectedForm.OnPropTextChange(Sender); +end; + +procedure TMainDesigner.OnPaletteChange(Sender: TObject); +begin + +end; + +procedure TMainDesigner.OnNewForm(Sender: TObject); +var + fd: TFormDesigner; + nfrm: TNewFormForm; +begin + Writeln('new form'); + nfrm := TNewFormForm.Create(nil); + if nfrm.ShowModal = 1 then + if nfrm.edName.Text <> '' then + begin + fd := TFormDesigner.Create; + fd.Form.Name := nfrm.edName.Text; + fd.Form.WindowTitle := nfrm.edName.Text; + FDesigners.Add(fd); + fd.Show; + end; + nfrm.Free; +end; + +procedure TMainDesigner.CreateWindows; + //var + // fd : TFormDesigner; +begin + frmMain := TfrmMain.Create(nil); + frmMain.WindowTitle := 'fpGUI Form Designer - v' + program_version; + frmMain.Show; + + frmProperties := TfrmProperties.Create(nil); + frmProperties.Show; + + // fd := TFormDesigner.Create; + // fd.Form.Name := 'frmNewForm'; + // fd.Form.WindowTitle := u8('frmNewForm'); + // FDesigners.Add(fd); + // fd.Show; +end; + +constructor TMainDesigner.Create; +begin + FDesigners := TList.Create; + SelectedForm := nil; + FFile := TVFDFile.Create; + + // options + SaveComponentNames := False; + GridResolution := 4; + + FEditedFileName := ''; +end; + +destructor TMainDesigner.Destroy; +var + n: integer; +begin + for n := 0 to FDesigners.Count - 1 do + TFormDesigner(FDesigners[n]).Free; + FDesigners.Free; + FFile.Free; + inherited; +end; + +procedure TMainDesigner.SelectForm(aform: TFormDesigner); +begin + //Writeln('selected...'); + if (SelectedForm <> nil) and (SelectedForm <> aform) then + SelectedForm.DeSelectAll; + SelectedForm := aform; +end; + +function TMainDesigner.Designer(index: integer): TFormDesigner; +begin + Result := nil; + if (index < 1) or (index > FDesigners.Count) then + Exit; + Result := TFormDesigner(FDesigners[index - 1]); +end; + +function TMainDesigner.DesignerCount: integer; +begin + Result := FDesigners.Count; +end; + +function TMainDesigner.NewFormName: string; +var + n, i: integer; + s: string; +begin + i := 0; + repeat + Inc(i); + s := 'Form' + IntToStr(i); + n := 1; + while (n <= DesignerCount) do + begin + if Designer(n).Form.Name = s then + Break; + Inc(n); + end; + until n > DesignerCount; + Result := s; +end; + +procedure TMainDesigner.CreateParseForm(const FormName, FormHead, FormBody: string); +var + fd: TFormDesigner; + fp: TVFDFormParser; +begin + Writeln('CreateParseForm: ', FormName); + + fp := TVFDFormParser.Create(FormName, FormHead, FormBody); + fd := fp.ParseForm; + fp.Free; + + FDesigners.Add(fd); + fd.Show; +end; + +procedure TMainDesigner.OnEditWidget(Sender: TObject); +begin + if SelectedForm <> nil then + SelectedForm.OnEditWidget(Sender); +end; + +procedure TMainDesigner.OnEditWidgetOrder(Sender: TObject); +begin + if SelectedForm <> nil then + SelectedForm.EditWidgetOrder; +end; + +procedure TMainDesigner.OnExit(Sender: TObject); +begin + halt(0); +end; + +procedure TMainDesigner.OnOptionsClick(Sender: TObject); +var + frm: TfrmVFDSetup; +begin + frm := TfrmVFDSetup.Create(nil); + + case GridResolution of + 1: frm.chlGrid.FocusItem := 1; + 4: frm.chlGrid.FocusItem := 2; + 8: frm.chlGrid.FocusItem := 3; + end; + + if frm.ShowModal > 0 then + case frm.chlGrid.FocusItem of + 1: GridResolution := 1; + 2: GridResolution := 4; + 3: GridResolution := 8; + end; + + frm.Free; +end; + +procedure TMainDesigner.SetEditedFileName(const Value: string); +var + s: string; +begin + FEditedFileName := Value; + s := ExtractFileName(FEditedFileName); + if s = '' then + s := '[new]'; + frmMain.WindowTitle := s + ' - fpGUI uiDesigner ' + program_version; +end; + +end. + -- cgit v1.2.3-70-g09d2