Refactor grid editors unit: Implement a base class with all stuff which was implemented redundant previously and let all other editors descend from this class. Saves ~300 lines of code and makes implementing new editors easier.

Additionally this implements tabbing through edited fields for all grid editors. And it fixes issue #1266, issue #1267, issue #1253, issue #1178, issue #1155, issue #825 and issue #566 .
This commit is contained in:
Ansgar Becker
2009-07-20 23:07:28 +00:00
parent 21b60479f6
commit 886f67cb62
4 changed files with 464 additions and 869 deletions

File diff suppressed because it is too large Load Diff

View File

@ -8008,37 +8008,44 @@ end;
procedure TMainForm.DataGridCreateEditor(Sender: TBaseVirtualTree; Node:
PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink);
var
MemoEditor: TMemoEditorLink;
VT: TVirtualStringTree;
HexEditor: THexEditorLink;
DateTimeEditor: TDateTimeEditorLink;
EnumEditor: TEnumEditorLink;
SetEditor: TSetEditorLink;
InplaceEditor: TInplaceEditorLink;
TypeCat: TDatatypeCategoryIndex;
begin
VT := Sender as TVirtualStringTree;
TypeCat := FDataGridResult.Columns[Column].DatatypeCat;
if TypeCat = dtcText then begin
InplaceEditor := TInplaceEditorLink.Create(Sender as TVirtualStringTree);
InplaceEditor := TInplaceEditorLink.Create(VT);
InplaceEditor.DataType := FDataGridResult.Columns[Column].Datatype;
InplaceEditor.MaxLength := FDataGridResult.Columns[Column].MaxLength;
InplaceEditor.ButtonVisible := true;
InplaceEditor.ButtonVisible := True;
EditLink := InplaceEditor;
end else if (TypeCat = dtcBinary) and prefEnableBinaryEditor then begin
MemoEditor := TMemoEditorLink.Create;
MemoEditor.MaxLength := FDataGridResult.Columns[Column].MaxLength;
EditLink := MemoEditor;
HexEditor := THexEditorLink.Create(VT);
HexEditor.DataType := FDataGridResult.Columns[Column].Datatype;
HexEditor.MaxLength := FDataGridResult.Columns[Column].MaxLength;
EditLink := HexEditor;
end else if (TypeCat = dtcTemporal) and prefEnableDatetimeEditor then begin
DateTimeEditor := TDateTimeEditorLink.Create(Sender as TVirtualStringTree);
DateTimeEditor := TDateTimeEditorLink.Create(VT);
DateTimeEditor.DataType := FDataGridResult.Columns[Column].Datatype;
EditLink := DateTimeEditor;
end else if (TypeCat = dtcIntegerNamed) and prefEnableEnumEditor then begin
EnumEditor := TEnumEditorLink.Create;
EnumEditor := TEnumEditorLink.Create(VT);
EnumEditor.DataType := FDataGridResult.Columns[Column].Datatype;
EnumEditor.ValueList := FDataGridResult.Columns[Column].ValueList;
EditLink := EnumEditor;
end else if (TypeCat = dtcSetNamed) and prefEnableSetEditor then begin
SetEditor := TSetEditorLink.Create;
SetEditor := TSetEditorLink.Create(VT);
SetEditor.DataType := FDataGridResult.Columns[Column].Datatype;
SetEditor.ValueList := FDataGridResult.Columns[Column].ValueList;
EditLink := SetEditor;
end else begin
InplaceEditor := TInplaceEditorLink.Create(Sender as TVirtualStringTree);
InplaceEditor := TInplaceEditorLink.Create(VT);
InplaceEditor.DataType := FDataGridResult.Columns[Column].Datatype;
InplaceEditor.ButtonVisible := False;
EditLink := InplaceEditor;
end;

View File

@ -327,20 +327,22 @@ end;
procedure TfrmRoutineEditor.listParametersCreateEditor(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink);
var
VT: TVirtualStringTree;
EnumEditor: TEnumEditorLink;
i: Integer;
begin
VT := Sender as TVirtualStringTree;
if Column = 1 then
EditLink := TStringEditLink.Create
else if Column = 2 then begin
EnumEditor := TEnumEditorLink.Create;
EnumEditor := TEnumEditorLink.Create(VT);
EnumEditor.AllowCustomText := True;
EnumEditor.ValueList := TWideStringList.Create;
for i:=Low(Datatypes) to High(Datatypes) do
EnumEditor.ValueList.Add(Datatypes[i].Name);
EditLink := EnumEditor;
end else if Column = 3 then begin
EnumEditor := TEnumEditorLink.Create;
EnumEditor := TEnumEditorLink.Create(VT);
EnumEditor.ValueList := TWideStringList.Create;
EnumEditor.ValueList.Add('IN');
EnumEditor.ValueList.Add('OUT');

View File

@ -1136,26 +1136,28 @@ end;
procedure TfrmTableEditor.listColumnsCreateEditor(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink);
var
VT: TVirtualStringTree;
EnumEditor: TEnumEditorLink;
DefaultEditor: TColumnDefaultEditorLink;
DatatypeEditor: TDatatypeEditorLink;
Props: TWideStringlist;
begin
// Start cell editor
VT := Sender as TVirtualStringTree;
case Column of
2: begin // Datatype pulldown
DatatypeEditor := TDatatypeEditorLink.Create(Sender as TVirtualStringTree);
DatatypeEditor := TDatatypeEditorLink.Create(VT);
DatatypeEditor.Datatype := dtDateTime;
EditLink := DataTypeEditor;
end;
8: begin // Collation pulldown
EnumEditor := TEnumEditorLink.Create;
EnumEditor := TEnumEditorLink.Create(VT);
EnumEditor.ValueList := TWideStringList.Create;
Mainform.GetCollations(EnumEditor.ValueList);
EditLink := EnumEditor;
end;
6: begin
DefaultEditor := TColumnDefaultEditorLink.Create;
DefaultEditor := TColumnDefaultEditorLink.Create(VT);
Props := TWideStringlist(Columns.Objects[Node.Index]);
DefaultEditor.DefaultText := Props[Column-2];
DefaultEditor.DefaultType := GetColumnDefaultType(DefaultEditor.DefaultText);
@ -1486,20 +1488,22 @@ end;
procedure TfrmTableEditor.treeIndexesCreateEditor(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink);
var
VT: TVirtualStringTree;
EnumEditor: TEnumEditorLink;
Level: Cardinal;
begin
// Start cell editor
VT := Sender as TVirtualStringTree;
Level := (Sender as TVirtualStringtree).GetNodeLevel(Node);
if (Level = 0) and (Column = 1) then begin
// Index type pulldown
EnumEditor := TEnumEditorLink.Create;
EnumEditor := TEnumEditorLink.Create(VT);
EnumEditor.ValueList := TWideStringList.Create;
EnumEditor.ValueList.CommaText := PKEY +','+ KEY +','+ UKEY +','+ FKEY +','+ SKEY;
EditLink := EnumEditor;
end else if (Level = 1) and (Column = 0) then begin
// Column names pulldown
EnumEditor := TEnumEditorLink.Create;
EnumEditor := TEnumEditorLink.Create(VT);
EnumEditor.ValueList := Columns;
EnumEditor.AllowCustomText := True; // Allows adding a subpart in index parts: "TextCol(20)"
EditLink := EnumEditor;