* Factor more code out of each database object editors into parent TDBObjectEditor.

* Use this chance to add a confirmation dialog when leaving the editors, to ask the user if he wants to save modifications. Fixes issue #1524.
* Also, enhance Mainform.RefreshTreeDB in a way that it does not trigger the OnFocusChange event. Important for the editors when saving changes.
This commit is contained in:
Ansgar Becker
2009-12-14 23:55:36 +00:00
parent cbedf0d163
commit dd398bb101
7 changed files with 213 additions and 147 deletions

View File

@ -1056,6 +1056,20 @@ procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
filename : String;
begin
// Destroy editors and dialogs. Must be done before connection gets closed, as some destructors do SQL stuff.
FreeAndNil(RoutineEditor);
FreeAndNil(TableToolsDialog);
FreeAndNil(UserManagerForm);
FreeAndNil(ViewEditor);
FreeAndNil(SelectDBObjectForm);
FreeAndNil(SQLHelpForm);
FreeAndNil(OptionsForm);
FreeAndNil(SessionManager);
FreeAndNil(TableEditor);
FreeAndNil(TriggerEditor);
FreeAndNil(CreateDatabaseForm);
// Close database connection
DoDisconnect;
OpenRegistry;
@ -1086,18 +1100,6 @@ begin
SaveListSetup(ListCommandStats);
SaveListSetup(ListTables);
FreeAndNil(RoutineEditor);
FreeAndNil(TableToolsDialog);
FreeAndNil(UserManagerForm);
FreeAndNil(ViewEditor);
FreeAndNil(SelectDBObjectForm);
FreeAndNil(SQLHelpForm);
FreeAndNil(OptionsForm);
FreeAndNil(SessionManager);
FreeAndNil(TableEditor);
FreeAndNil(TriggerEditor);
FreeAndNil(CreateDatabaseForm);
debug('mem: clearing query and browse data.');
SetLength(DataGridResult.Rows, 0);
SetLength(DataGridResult.Columns, 0);
@ -6286,15 +6288,39 @@ end;
procedure TMainForm.RefreshTreeDB(db: WideString);
var
oldActiveDatabase: WideString;
dbnode: PVirtualNode;
DBNode, FNode: PVirtualNode;
oldSelectedTable: TListNode;
TableHereHadFocus: Boolean;
Results: TMySQLQuery;
FocusChangeEvent: procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex) of object;
begin
oldActiveDatabase := ActiveDatabase;
DBtree.ClearSelection;
oldSelectedTable := SelectedTable;
DBNode := FindDBNode(db);
FNode := DBtree.FocusedNode;
TableHereHadFocus := FNode.Parent = DBNode;
// Suspend focus changing event, to avoid tab jumping
FocusChangeEvent := DBtree.OnFocusChanged;
DBtree.OnFocusChanged := nil;
// Refresh db node
RefreshDbTableList(db);
DBTree.ReinitNode(dbnode, true);
DBtree.InvalidateChildren(dbnode, false);
ActiveDatabase := oldActiveDatabase;
DBTree.ReinitNode(DBNode, true);
DBtree.InvalidateChildren(DBNode, false);
// Set focus on previously focused table node
if TableHereHadFocus then begin
Results := FetchDbTableList(db);
while not Results.Eof do begin
// Need to check if table was renamed, in which case oldSelectedTable is no longer available
if (Results.Col(DBO_NAME) = oldSelectedTable.Text)
and (GetDBObjectType(Results) = oldSelectedTable.NodeType) then begin
SelectDBObject(oldSelectedTable.Text, oldSelectedTable.NodeType);
break;
end;
Results.Next;
end;
end;
// Reactivate focus changing event
DBtree.OnFocusChanged := FocusChangeEvent;
end;