提交 4c28e760 编写于 作者: S Serge Rider

#660 Editor object auto-refresh option


Former-commit-id: a7e305fe
上级 cd4c6fbf
......@@ -31,6 +31,7 @@ public final class DBeaverPreferences
public static final String NAVIGATOR_EXPAND_ON_CONNECT = "navigator.expand.on.connect"; //$NON-NLS-1$
public static final String NAVIGATOR_SORT_ALPHABETICALLY = "navigator.sort.case.insensitive"; //$NON-NLS-1$
public static final String NAVIGATOR_SYNC_EDITOR_DATASOURCE = "navigator.sync.editor.datasource"; //$NON-NLS-1$
public static final String NAVIGATOR_REFRESH_EDITORS_ON_OPEN = "navigator.refresh.editor.open"; //$NON-NLS-1$
public static final String NAVIGATOR_GROUP_BY_DRIVER = "navigator.group.by.driver"; //$NON-NLS-1$
public static final String NAVIGATOR_EDITOR_FULL_NAME = "navigator.editor.full-name"; //$NON-NLS-1$
public static final String NAVIGATOR_CONNECTION_DOUBLE_CLICK = "navigator.connection.doubleClick"; //$NON-NLS-1$
......
......@@ -64,6 +64,8 @@ public class DBeaverPreferencesInitializer extends AbstractPreferenceInitializer
PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.NAVIGATOR_EXPAND_ON_CONNECT, false);
PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.NAVIGATOR_SORT_ALPHABETICALLY, false);
PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.NAVIGATOR_SYNC_EDITOR_DATASOURCE, false);
PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.NAVIGATOR_REFRESH_EDITORS_ON_OPEN, false);
PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.NAVIGATOR_GROUP_BY_DRIVER, false);
PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.NAVIGATOR_EDITOR_FULL_NAME, false);
PrefUtils.setDefaultPreferenceValue(store, DBeaverPreferences.NAVIGATOR_CONNECTION_DOUBLE_CLICK, NavigatorViewBase.DoubleClickBehavior.SQL_EDITOR.name());
......
......@@ -31,38 +31,46 @@ import org.eclipse.ui.menus.UIElement;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.DBeaverPreferences;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.edit.DBEObjectEditor;
import org.jkiss.dbeaver.model.navigator.*;
import org.jkiss.dbeaver.model.project.DBPResourceHandler;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.DBSObjectContainer;
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.registry.editor.EntityEditorsRegistry;
import org.jkiss.dbeaver.ui.actions.datasource.DataSourceHandler;
import org.jkiss.dbeaver.ui.editors.EditorUtils;
import org.jkiss.dbeaver.ui.resources.ResourceUtils;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import org.jkiss.dbeaver.ui.navigator.NavigatorUtils;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.actions.datasource.DataSourceHandler;
import org.jkiss.dbeaver.ui.controls.folders.ITabbedFolderContainer;
import org.jkiss.dbeaver.ui.dialogs.connection.EditConnectionDialog;
import org.jkiss.dbeaver.ui.dialogs.connection.EditConnectionWizard;
import org.jkiss.dbeaver.ui.editors.DatabaseEditorInput;
import org.jkiss.dbeaver.ui.editors.DatabaseEditorInputFactory;
import org.jkiss.dbeaver.ui.editors.EditorUtils;
import org.jkiss.dbeaver.ui.editors.entity.EntityEditor;
import org.jkiss.dbeaver.ui.editors.entity.EntityEditorInput;
import org.jkiss.dbeaver.ui.editors.entity.FolderEditor;
import org.jkiss.dbeaver.ui.editors.entity.FolderEditorInput;
import org.jkiss.dbeaver.ui.editors.object.ObjectEditorInput;
import org.jkiss.dbeaver.ui.navigator.NavigatorUtils;
import org.jkiss.dbeaver.ui.resources.ResourceUtils;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.Map;
public class NavigatorHandlerObjectOpen extends NavigatorHandlerObjectBase implements IElementUpdater {
private static final Log log = Log.getLog(NavigatorHandlerObjectOpen.class);
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
final ISelection selection = HandlerUtil.getCurrentSelection(event);
......@@ -169,39 +177,35 @@ public class NavigatorHandlerObjectOpen extends NavigatorHandlerObjectBase imple
DatabaseEditorInputFactory.setLookupEditor(false);
}
IWorkbenchPart oldActivePart = workbenchWindow.getActivePage().getActivePart();
try {
if (selectedNode instanceof DBNDatabaseFolder) {
FolderEditorInput folderInput = new FolderEditorInput((DBNDatabaseFolder)selectedNode);
folderInput.setDefaultPageId(defaultPageId);
setInputAttributes(folderInput, defaultPageId, defaultFolderId, attributes);
return workbenchWindow.getActivePage().openEditor(
folderInput,
FolderEditor.class.getName());
} else if (selectedNode instanceof DBNDatabaseObject) {
DBNDatabaseObject objectNode = (DBNDatabaseObject) selectedNode;
ObjectEditorInput objectInput = new ObjectEditorInput(objectNode);
setInputAttributes(objectInput, defaultPageId, defaultFolderId, attributes);
return workbenchWindow.getActivePage().openEditor(
objectInput,
objectNode.getMeta().getEditorId());
} else if (selectedNode.getObject() != null) {
EntityEditorInput editorInput = new EntityEditorInput(selectedNode);
setInputAttributes(editorInput, defaultPageId, defaultFolderId, attributes);
return workbenchWindow.getActivePage().openEditor(
editorInput,
EntityEditor.class.getName());
} else {
throw new DBException("Don't know how to open object '" + selectedNode.getNodeName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
finally {
// Reactivate navigator
// Actually it still focused but we need to use it's selection
// I think it is an eclipse bug
if (!(oldActivePart instanceof IEditorPart)) {
//workbenchWindow.getActivePage().activate(oldActivePart);
if (selectedNode instanceof DBNDatabaseFolder) {
FolderEditorInput folderInput = new FolderEditorInput((DBNDatabaseFolder)selectedNode);
folderInput.setDefaultPageId(defaultPageId);
setInputAttributes(folderInput, defaultPageId, defaultFolderId, attributes);
return workbenchWindow.getActivePage().openEditor(
folderInput,
FolderEditor.class.getName());
} else if (selectedNode instanceof DBNDatabaseObject) {
DBNDatabaseObject objectNode = (DBNDatabaseObject) selectedNode;
ObjectEditorInput objectInput = new ObjectEditorInput(objectNode);
setInputAttributes(objectInput, defaultPageId, defaultFolderId, attributes);
return workbenchWindow.getActivePage().openEditor(
objectInput,
objectNode.getMeta().getEditorId());
} else if (selectedNode.getObject() != null) {
EntityEditorInput editorInput = new EntityEditorInput(selectedNode);
if (DBeaverCore.getGlobalPreferenceStore().getBoolean(DBeaverPreferences.NAVIGATOR_REFRESH_EDITORS_ON_OPEN)) {
if (selectedNode.getObject() instanceof DBSObjectContainer) {
// do not auto-refresh object containers (too expensive)
} else {
refreshDatabaseNode(selectedNode);
}
}
setInputAttributes(editorInput, defaultPageId, defaultFolderId, attributes);
return workbenchWindow.getActivePage().openEditor(
editorInput,
EntityEditor.class.getName());
} else {
throw new DBException("Don't know how to open object '" + selectedNode.getNodeName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$
}
} catch (Exception ex) {
UIUtils.showErrorDialog(workbenchWindow.getShell(), CoreMessages.actions_navigator_error_dialog_open_entity_title, "Can't open entity '" + selectedNode.getNodeName() + "'", ex);
......@@ -209,6 +213,20 @@ public class NavigatorHandlerObjectOpen extends NavigatorHandlerObjectBase imple
}
}
private static void refreshDatabaseNode(@NotNull DBNDatabaseNode selectedNode) throws InvocationTargetException, InterruptedException {
final DBNDatabaseNode nodeToRefresh = selectedNode;
DBeaverUI.runInProgressService(new DBRRunnableWithProgress() {
@Override
public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
nodeToRefresh.refreshNode(monitor, nodeToRefresh);
} catch (DBException e) {
log.error("Error refreshing database object", e);
}
}
});
}
private static void openConnectionEditor(IWorkbenchWindow workbenchWindow, DataSourceDescriptor dataSourceContainer) {
EditConnectionDialog dialog = new EditConnectionDialog(
workbenchWindow,
......
......@@ -325,7 +325,10 @@ public class EntityEditor extends MultiPageDatabaseEditor
{
return;
}
getCommandContext().resetChanges();
DBECommandContext commandContext = getCommandContext();
if (commandContext != null) {
commandContext.resetChanges();
}
firePropertyChange(IEditorPart.PROP_DIRTY);
}
}
......@@ -391,15 +394,6 @@ public class EntityEditor extends MultiPageDatabaseEditor
ChangesPreviewer changesPreviewer = new ChangesPreviewer(script, allowSave);
UIUtils.runInUI(getSite().getShell(), changesPreviewer);
return changesPreviewer.getResult();
/*
Shell shell = getSite().getShell();
EditTextDialog dialog = new EditTextDialog(shell, "Script", script.toString());
dialog.setTextWidth(0);
dialog.setTextHeight(0);
dialog.setImage(DBIcon.SQL_PREVIEW.getImage());
dialog.open();
*/
}
@Override
......@@ -715,13 +709,13 @@ public class EntityEditor extends MultiPageDatabaseEditor
}
@Override
public Object getAdapter(Class adapter) {
Object activeAdapter = getNestedAdapter(adapter);
public <T> T getAdapter(Class<T> adapter) {
T activeAdapter = getNestedAdapter(adapter);
if (activeAdapter != null) {
return activeAdapter;
}
if (adapter == IPropertySheetPage.class) {
return new PropertyPageStandard();
return adapter.cast(new PropertyPageStandard());
}
return super.getAdapter(adapter);
}
......
......@@ -209,7 +209,12 @@ public abstract class JDBCCompositeCache<
synchronized (objectCache) {
objectCache.clear();
for (OBJECT object : objects) {
List<OBJECT> parentObjects = objectCache.get(getParent(object));
PARENT parent = getParent(object);
List<OBJECT> parentObjects = objectCache.get(parent);
if (parentObjects == null) {
parentObjects = new ArrayList<>();
objectCache.put(parent, objects);
}
parentObjects.add(object);
}
}
......@@ -359,7 +364,7 @@ public abstract class JDBCCompositeCache<
globalCache.addAll(objects);
}
// Add precached objects to global cache too
this.setCache(globalCache);
super.setCache(globalCache);
this.invalidateObjects(monitor, owner, new CacheIterator());
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册