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

View File

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

View File

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