diff options
author | graemeg <graemeg@ae50a9b5-8222-0410-bf8d-8a13f76226bf> | 2008-08-26 16:47:53 +0000 |
---|---|---|
committer | graemeg <graemeg@ae50a9b5-8222-0410-bf8d-8a13f76226bf> | 2008-08-26 16:47:53 +0000 |
commit | 483eda5909cf21a06f3011857a12f47ae676ffef (patch) | |
tree | eb8bf9cc2e6a6a02e7ea79db1540a7c48d7dc827 /uidesigner/vfdpropeditgrid.pas | |
parent | a88f8e00c7094d32411871d3993654f326563e3b (diff) | |
download | fpGUI-483eda5909cf21a06f3011857a12f47ae676ffef.tar.xz |
* Moved the UI Designer from the examples/apps directory to the root directory.
* Updated some build scripts
Diffstat (limited to 'uidesigner/vfdpropeditgrid.pas')
-rw-r--r-- | uidesigner/vfdpropeditgrid.pas | 541 |
1 files changed, 541 insertions, 0 deletions
diff --git a/uidesigner/vfdpropeditgrid.pas b/uidesigner/vfdpropeditgrid.pas new file mode 100644 index 00000000..209b1d59 --- /dev/null +++ b/uidesigner/vfdpropeditgrid.pas @@ -0,0 +1,541 @@ +{ + 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: + Property editor for grid columns. +} + +unit vfdpropeditgrid; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, + SysUtils, + gfxbase, + gfx_widget, + gui_form, + gui_label, + gui_edit, + gui_button, + gui_listbox, + gui_memo, + gui_combobox, + gui_customgrid, + gui_basegrid, + gui_grid, + gui_checkbox, + vfdforms, + vfdwidgetclass, + vfdprops, + vfdformparser; + +type + + TPropertyDBColumns = class(TVFDWidgetProperty) + public + function ParseSourceLine(wg: TfpgWidget; const line: string): boolean; override; + function GetPropertySource(wg: TfpgWidget; const ident: string): string; override; + function GetValueText(wg: TfpgWidget): string; override; + function CreateEditor(AOwner: TComponent): TVFDPropertyEditor; override; + procedure OnExternalEdit(wg: TfpgWidget); override; + end; + + + // A normal grid's column information now become rows of data. + TColumnsGrid = class(TfpgCustomGrid) + protected + function GetRowCount: Integer; override; + procedure DrawCell(ARow, ACol: Integer; ARect: TfpgRect; AFlags: TfpgGridDrawState); override; + public + dbgrid: TfpgStringGrid; + constructor Create(AOwner: TComponent); override; + end; + + + TColumnEditForm = class(TfpgForm) + private + procedure GridRowChange(Sender: TObject; row: Integer); + procedure EditChange(Sender: TObject); + procedure NewButtonClick(Sender: TObject); + procedure DeleteButtonClick(Sender: TObject); + procedure CloseButtonClick(Sender: TObject); + procedure UpDownButtonClick(Sender: TObject); + procedure SaveColumn(row: integer); + public + {@VFD_HEAD_BEGIN: ColumnEditForm} + lbLabel1: TfpgLabel; + grid: TColumnsGrid; + lbLabel2: TfpgLabel; + lbLabel3: TfpgLabel; + lbLabel6: TfpgLabel; + lbLabel5: TfpgLabel; + lbCOLNO: TfpgLabel; + edTITLE: TfpgEdit; + edCOLWIDTH: TfpgEdit; + chlALIGN: TfpgComboBox; + btnNew: TfpgButton; + btnDelete: TfpgButton; + btnUP: TfpgButton; + btnDOWN: TfpgButton; + btnClose: TfpgButton; + {@VFD_HEAD_END: ColumnEditForm} + + dbgrid: TfpgStringGrid; + procedure AfterCreate; override; + end; + + +implementation + + +procedure EditStringGridColumns(agrid: TfpgStringGrid); +var + frm: TColumnEditForm; +begin + frm := TColumnEditForm.Create(nil); + frm.dbgrid := agrid; + frm.grid.dbgrid := agrid; + frm.ShowModal; + frm.Free; +end; + +{ TColumnEditForm } + +procedure TColumnEditForm.AfterCreate; +begin + {@VFD_BODY_BEGIN: ColumnEditForm} + Name := 'ColumnEditForm'; + SetPosition(270, 267, 511, 269); + WindowTitle := 'Column editor'; + Sizeable := False; + + lbLabel1 := TfpgLabel.Create(self); + with lbLabel1 do + begin + Name := 'lbLabel1'; + SetPosition(8, 4, 110, 16); + Text := 'String Grid columns:'; + FontDesc := '#Label1'; + AutoSize := True; + end; + + grid := TColumnsGrid.Create(self); + with grid do + begin + Name := 'grid'; + SetPosition(8, 24, 328, 204); + OnRowChange := @GridRowChange; + end; + + lbLabel2 := TfpgLabel.Create(self); + with lbLabel2 do + begin + Name := 'lbLabel2'; + SetPosition(344, 24, 56, 16); + Text := 'Column:'; + FontDesc := '#Label1'; + AutoSize := True; + end; + + lbLabel3 := TfpgLabel.Create(self); + with lbLabel3 do + begin + Name := 'lbLabel3'; + SetPosition(344, 56, 34, 16); + Text := 'Title:'; + FontDesc := '#Label1'; + AutoSize := True; + end; + + lbLabel6 := TfpgLabel.Create(self); + with lbLabel6 do + begin + Name := 'lbLabel6'; + SetPosition(344, 100, 88, 16); + Text := 'Column width:'; + FontDesc := '#Label1'; + AutoSize := True; + end; + + lbLabel5 := TfpgLabel.Create(self); + with lbLabel5 do + begin + Name := 'lbLabel5'; + SetPosition(344, 144, 83, 16); + Text := 'Alignment:'; + FontDesc := '#Label1'; + AutoSize := True; + end; + + lbCOLNO := TfpgLabel.Create(self); + with lbCOLNO do + begin + Name := 'lbCOLNO'; + SetPosition(404, 24, 54, 16); + Text := '--'; + FontDesc := '#Label1'; + AutoSize := True; + end; + + edTITLE := TfpgEdit.Create(self); + with edTITLE do + begin + Name := 'edTITLE'; + SetPosition(344, 72, 160, 22); + Text := ''; + FontDesc := '#Edit1'; + OnChange := @EditChange; + end; + + edCOLWIDTH := TfpgEdit.Create(self); + with edCOLWIDTH do + begin + Name := 'edCOLWIDTH'; + SetPosition(344, 116, 160, 22); + Text := ''; + FontDesc := '#Edit1'; + OnChange := @EditChange; + end; + + chlALIGN := TfpgComboBox.Create(self); + with chlALIGN do + begin + Name := 'chlALIGN'; + SetPosition(344, 162, 160, 22); + Items.Add('Left'); + Items.Add('Right'); + Items.Add('Center'); + FontDesc := '#List'; + OnChange := @EditChange; + end; + + btnNew := TfpgButton.Create(self); + with btnNew do + begin + Name := 'btnNew'; + SetPosition(8, 236, 75, 24); + Text := 'New'; + FontDesc := '#Label1'; + ImageName := ''; + ModalResult := 0; + OnClick := @NewButtonClick; + end; + + btnDelete := TfpgButton.Create(self); + with btnDelete do + begin + Name := 'btnDelete'; + SetPosition(86, 236, 75, 24); + Text := 'Delete'; + FontDesc := '#Label1'; + ImageName := ''; + ModalResult := 0; + OnClick := @DeleteButtonClick; + end; + + btnUP := TfpgButton.Create(self); + with btnUP do + begin + Name := 'btnUP'; + SetPosition(182, 236, 75, 24); + Text := 'UP'; + FontDesc := '#Label1'; + ImageName := ''; + ModalResult := 0; + OnClick := @UpDownButtonClick; + end; + + btnDOWN := TfpgButton.Create(self); + with btnDOWN do + begin + Name := 'btnDOWN'; + SetPosition(260, 236, 75, 24); + Text := 'DOWN'; + FontDesc := '#Label1'; + ImageName := ''; + ModalResult := 0; + OnClick := @UpDownButtonClick; + end; + + btnClose := TfpgButton.Create(self); + with btnClose do + begin + Name := 'btnClose'; + SetPosition(428, 236, 75, 24); + Text := 'Close'; + FontDesc := '#Label1'; + ImageName := 'stdimg.close'; + ModalResult := 0; + OnClick := @CloseButtonClick; + end; + + {@VFD_BODY_END: ColumnEditForm} +end; + +procedure TColumnEditForm.GridRowChange(Sender: TObject; row: Integer); +var + i: integer; + c: TfpgStringColumn; +begin + c := dbgrid.Columns[row]; + if c = nil then + Exit; + + try + // disable event handlers + edTITLE.OnChange := nil; + edCOLWIDTH.OnChange := nil; + chlALIGN.OnChange := nil; + + lbCOLNO.Text := IntToStr(row); + edTITLE.Text := c.Title; + edCOLWIDTH.Text := IntToStr(c.Width); + case c.Alignment of + taRightJustify: + i := 1; + taCenter: + i := 2 + else + i := 0; + end; + chlALIGN.FocusItem := i; + finally + // enable event handlers again. + edTITLE.OnChange := @EditChange; + edCOLWIDTH.OnChange := @EditChange; + chlALIGN.OnChange := @EditChange; + end; +end; + +procedure TColumnEditForm.SaveColumn(row: integer); +var + c: TfpgStringColumn; +begin + c := dbgrid.Columns[row]; + if c = nil then + Exit; + + c.Title := edTITLE.Text; + c.Width := StrToIntDef(edCOLWIDTH.Text, 30); + case chlALIGN.FocusItem of + 1: c.Alignment := taRightJustify; + 2: c.Alignment := taCenter; + else + c.Alignment := taLeftJustify; + end; + + grid.RePaint; + dbgrid.Update; +end; + +procedure TColumnEditForm.EditChange(Sender: TObject); +begin + if grid.FocusRow < 0 then + Exit; + SaveColumn(grid.FocusRow) +end; + +procedure TColumnEditForm.NewButtonClick(Sender: TObject); +begin + dbgrid.AddColumn('New', 50, taLeftJustify); + grid.FocusRow := grid.RowCount; + grid.Update; + GridRowChange(Sender, grid.FocusRow); +end; + +procedure TColumnEditForm.DeleteButtonClick(Sender: TObject); +begin + dbgrid.DeleteColumn(grid.FocusRow); + grid.Update; +end; + +procedure TColumnEditForm.CloseButtonClick(Sender: TObject); +begin + Close; +end; + +procedure TColumnEditForm.UpDownButtonClick(Sender: TObject); +begin + if Sender = btnUP then + begin + if grid.FocusRow > 0 then + begin + dbgrid.MoveColumn(grid.FocusRow - 1, grid.FocusRow - 2); + grid.FocusRow := grid.FocusRow - 1; + grid.Update; + end; + end + else if grid.FocusRow < grid.RowCount-1 then + begin + dbgrid.MoveColumn(grid.FocusRow - 1, grid.FocusRow); + grid.FocusRow := grid.FocusRow + 1; + grid.Update; + end; +end; + + +{ TColumnsGrid } + +function TColumnsGrid.GetRowCount: Integer; +begin + try + // Yes, it must be ColumnCount and *not* RowCount! + Result := dbgrid.ColumnCount; + except + Result := inherited GetColumnCount; + end; +end; + +procedure TColumnsGrid.DrawCell(ARow, ACol: Integer; ARect: TfpgRect; AFlags: TfpgGridDrawState); +var + s: string; + x: integer; + c: TfpgStringColumn; +begin +// writeln('ARow=', ARow, ' ACol=', ACol); + c := dbgrid.Columns[ARow{ - 1}]; + if c = nil then + begin +// writeln(' TColumnsGrid.DrawCell -> exit early because c = nil'); + Exit; + end; +// writeln(' ... we passed the nil test'); + x := ARect.Left + 1; + + case ACol of + 0: s := IntToStr(ARow); + 1: s := c.Title; + 2: s := IntToStr(c.Width); + 3: case c.Alignment of + taRightJustify: + s := 'Right'; + taCenter: + s := 'Center'; + else + s := 'Left'; + end; + else + s := '?'; + end; + + Canvas.DrawString(x, ARect.Top + 1, s); +end; + +constructor TColumnsGrid.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + RowSelect := True; + ColumnCount := 0; + RowCount := 0; + AddColumn('Col.', 30); + AddColumn('Title', 80); + AddColumn('Width', 40); + AddColumn('Align', 50); +end; + +{ TPropertyDBColumns } + +function TPropertyDBColumns.CreateEditor(AOwner: TComponent): TVFDPropertyEditor; +begin + Result := TExternalPropertyEditor.Create(AOwner, self); +end; + +function TPropertyDBColumns.GetValueText(wg: TfpgWidget): string; +begin + with TfpgStringGrid(wg) do + Result := '[' + IntToStr(ColumnCount) + ' columns]'; +end; + +procedure TPropertyDBColumns.OnExternalEdit(wg: TfpgWidget); +begin + if not Assigned(wg) then + raise Exception.Create('TPropertyDBColumns.OnExternalEdit(wg) - wg widget may not be nil.'); + if not (wg is TfpgStringGrid) then + raise Exception.Create('TPropertyDBColumns.OnExternalEdit(wg) - wg widget is not a TfpgStringGrid.'); + EditStringGridColumns(TfpgStringGrid(wg)); +end; + +function TPropertyDBColumns.ParseSourceLine(wg: TfpgWidget; const line: string): boolean; +var + c: TfpgStringColumn; + s: string; + sval: string; +begin + s := line; + Result := False; + if UpperCase(GetIdentifier(s)) <> UpperCase('ADDCOLUMN') then + Exit; + + c := TfpgStringColumn.Create; + + Result := CheckSymbol(s, '('); + + if Result then + c.Title := GetStringValue(s); + Result := Result and CheckSymbol(s, ','); + if Result then + c.Width := GetIntValue(s); + Result := Result and CheckSymbol(s, ','); + if Result then + begin + sval := UpperCase(GetIdentifier(s)); + if sval = 'TARIGHTJUSTIFY' then + c.Alignment := taRightJustify + else if sval = 'TACENTER' then + c.Alignment := taCenter + else + c.Alignment := taLeftJustify; + end; + + Result := Result and CheckSymbol(s, ')'); + Result := Result and CheckSymbol(s, ';'); + + if Result then + TfpgStringGrid(wg).AddColumn(c.Title, c.Width, c.Alignment); + + c.Free; +end; + +function TPropertyDBColumns.GetPropertySource(wg: TfpgWidget; const ident: string): string; +var + f: integer; + c: TfpgStringColumn; + alstr: string; +begin + Result := ''; + with TfpgStringGrid(wg) do + begin + for f := 0 to ColumnCount-1 do + begin + c := Columns[f]; + case c.Alignment of + taRightJustify: + alstr := 'taRightJustify'; + taCenter: + alstr := 'taCenter'; + else + alstr := 'taLeftJustify'; + end; + Result := Result + ident + + 'AddColumn(' + QuotedStr(c.Title) + ', ' + + IntToStr(c.Width) + ', ' + + alstr + ');' + LineEnding; + end; { for } + end; { with } +end; + +end. + |