summaryrefslogtreecommitdiff
path: root/uidesigner/vfdpropeditgrid.pas
diff options
context:
space:
mode:
authorgraemeg <graemeg@ae50a9b5-8222-0410-bf8d-8a13f76226bf>2008-08-26 16:47:53 +0000
committergraemeg <graemeg@ae50a9b5-8222-0410-bf8d-8a13f76226bf>2008-08-26 16:47:53 +0000
commit483eda5909cf21a06f3011857a12f47ae676ffef (patch)
treeeb8bf9cc2e6a6a02e7ea79db1540a7c48d7dc827 /uidesigner/vfdpropeditgrid.pas
parenta88f8e00c7094d32411871d3993654f326563e3b (diff)
downloadfpGUI-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.pas541
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.
+