提交 316121d0 编写于 作者: S Serge Rider

#5384 FK create dialog: container selector. Nav model refactoring

上级 99a08813
......@@ -296,23 +296,23 @@ public class DBeaverUI implements DBPPlatformUI {
}
@Override
public DBNNode selectObject(Object parentShell, String title, DBNNode rootNode, DBNNode selectedNode, Class<?>[] allowedTypes, Class<?>[] resultTypes, Class<?>[] leafTypes) {
public DBNNode selectObject(@NotNull Object parentShell, String title, DBNNode rootNode, DBNNode selectedNode, Class<?>[] allowedTypes, Class<?>[] resultTypes, Class<?>[] leafTypes) {
Shell shell = (parentShell instanceof Shell ? (Shell)parentShell : UIUtils.getActiveWorkbenchShell());
return BrowseObjectDialog.selectObject(shell, title, rootNode, selectedNode, allowedTypes, resultTypes, leafTypes);
}
@Override
public void openEntityEditor(DBSObject object) {
public void openEntityEditor(@NotNull DBSObject object) {
NavigatorHandlerObjectOpen.openEntityEditor(object);
}
@Override
public void openEntityEditor(DBNNode selectedNode, String defaultPageId) {
public void openEntityEditor(@NotNull DBNNode selectedNode, String defaultPageId) {
NavigatorHandlerObjectOpen.openEntityEditor(selectedNode, defaultPageId, UIUtils.getActiveWorkbenchWindow());
}
@Override
public void openConnectionEditor(DBPDataSourceContainer dataSourceContainer) {
public void openConnectionEditor(@NotNull DBPDataSourceContainer dataSourceContainer) {
UIUtils.syncExec(() ->
NavigatorHandlerObjectOpen.openConnectionEditor(
UIUtils.getActiveWorkbenchWindow(),
......@@ -320,7 +320,7 @@ public class DBeaverUI implements DBPPlatformUI {
}
@Override
public void executeProcess(final DBRProcessDescriptor processDescriptor) {
public void executeProcess(@NotNull final DBRProcessDescriptor processDescriptor) {
processDescriptor.setProcessListener(new DBRProcessListener() {
@Override
public void onProcessStarted() {
......@@ -356,10 +356,11 @@ public class DBeaverUI implements DBPPlatformUI {
}
@Override
public void executeInUI(Runnable runnable) {
public void executeInUI(@NotNull Runnable runnable) {
UIUtils.syncExec(runnable);
}
@NotNull
@Override
public <RESULT> Job createLoadingService(ILoadService<RESULT> loadingService, ILoadVisualizer<RESULT> visualizer) {
return LoadingJob.createService(loadingService, visualizer);
......
......@@ -61,7 +61,7 @@ import org.jkiss.dbeaver.runtime.properties.PropertyCollector;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.controls.ListContentProvider;
import org.jkiss.dbeaver.ui.controls.autorefresh.AutoRefreshControl;
import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.editors.StringEditorInput;
import org.jkiss.dbeaver.ui.editors.SubEditorSite;
import org.jkiss.dbeaver.ui.editors.sql.SQLEditorBase;
......
......@@ -30,7 +30,7 @@ import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService;
import org.jkiss.dbeaver.ui.LoadingJob;
import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
......
......@@ -27,6 +27,7 @@ import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBIcon;
......@@ -35,10 +36,11 @@ import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.impl.DBObjectNameCaseTransformer;
import org.jkiss.dbeaver.model.navigator.*;
import org.jkiss.dbeaver.model.navigator.DBNDataSource;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.*;
import org.jkiss.dbeaver.model.struct.rdb.DBSSchema;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.runtime.ui.UIServiceSQL;
import org.jkiss.dbeaver.tools.transfer.database.*;
......@@ -50,6 +52,7 @@ import org.jkiss.dbeaver.ui.SharedTextColors;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.CustomComboBoxCellEditor;
import org.jkiss.dbeaver.ui.controls.ObjectContainerSelectorPanel;
import org.jkiss.dbeaver.ui.controls.TreeContentProvider;
import org.jkiss.dbeaver.ui.dialogs.ActiveWizardPage;
import org.jkiss.dbeaver.ui.dialogs.EnterNameDialog;
......@@ -64,9 +67,8 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
private static final String TARGET_NAME_BROWSE = "[browse]";
private TreeViewer mappingViewer;
private Label containerIcon;
private Text containerName;
private Button autoAssignButton;
private ObjectContainerSelectorPanel containerPanel;
private static abstract class MappingLabelProvider extends CellLabelProvider {
@Override
......@@ -101,71 +103,49 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
{
// Target container
Composite containerPanel = new Composite(composite, SWT.NONE);
containerPanel.setLayout(new GridLayout(4, false));
containerPanel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
UIUtils.createControlLabel(containerPanel, DTMessages.data_transfer_db_consumer_target_container);
containerIcon = new Label(containerPanel, SWT.NONE);
containerIcon.setImage(DBeaverIcons.getImage(DBIcon.TYPE_UNKNOWN));
containerName = new Text(containerPanel, SWT.BORDER | SWT.READ_ONLY);
containerName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
containerName.setText("");
Button browseButton = new Button(containerPanel, SWT.PUSH);
browseButton.setImage(DBeaverIcons.getImage(DBIcon.TREE_FOLDER));
browseButton.setText("...");
browseButton.addSelectionListener(new SelectionAdapter() {
// Use first source object as cur selection (it's better than nothing)
containerPanel = new ObjectContainerSelectorPanel(composite, DTMessages.data_transfer_db_consumer_target_container) {
@Nullable
@Override
public void widgetSelected(SelectionEvent e)
{
DBPProject activeProject = DBWorkbench.getPlatform().getWorkspace().getActiveProject();
if (activeProject != null) {
final DBNModel navigatorModel = DBWorkbench.getPlatform().getNavigatorModel();
final DBNProject rootNode = navigatorModel.getRoot().getProjectNode(
activeProject);
DBNNode selectedNode = settings.getContainerNode();
if (selectedNode == null && !settings.getDataMappings().isEmpty()) {
// Use first source object as cur selection (it's better than nothing)
DBSDataContainer firstSource = settings.getDataMappings().keySet().iterator().next();
selectedNode = navigatorModel.getNodeByObject(firstSource);
while (selectedNode != null) {
if (selectedNode instanceof DBSWrapper && ((DBSWrapper) selectedNode).getObject() instanceof DBSObjectContainer) {
break;
} else {
selectedNode = selectedNode.getParentNode();
}
protected DBNNode getSelectedNode() {
DBNNode selectedNode = settings.getContainerNode();
if (selectedNode == null && !settings.getDataMappings().isEmpty()) {
// Use first source object as cur selection (it's better than nothing)
DBSDataContainer firstSource = settings.getDataMappings().keySet().iterator().next();
selectedNode = DBWorkbench.getPlatform().getNavigatorModel().getNodeByObject(firstSource);
while (selectedNode != null) {
if (selectedNode instanceof DBSWrapper && ((DBSWrapper) selectedNode).getObject() instanceof DBSObjectContainer) {
break;
} else {
selectedNode = selectedNode.getParentNode();
}
}
DBNNode node = DBWorkbench.getPlatformUI().selectObject(
getShell(),
DTMessages.data_transfer_db_consumer_choose_container,
rootNode.getDatabases(),
selectedNode,
new Class[] {DBSObjectContainer.class},
null, new Class[] { DBSSchema.class });
if (node instanceof DBNDatabaseNode) {
settings.setContainerNode((DBNDatabaseNode) node);
DBNDataSource dataSourceNode = DBNDataSource.getDataSourceNode(node);
containerIcon.setImage(DBeaverIcons.getImage(dataSourceNode == null ? node.getNodeIconDefault() : dataSourceNode.getNodeIconDefault()));
containerName.setText(settings.getContainerFullName());
// Reset mappings
for (DatabaseMappingContainer mappingContainer : settings.getDataMappings().values()) {
if (mappingContainer.getMappingType() != DatabaseMappingType.unspecified) {
try {
mappingContainer.refreshMappingType(getContainer(), DatabaseMappingType.unspecified);
} catch (DBException e1) {
log.error(e1);
}
}
}
return selectedNode;
}
@Override
protected void setSelectedNode(DBNDatabaseNode node) {
settings.setContainerNode(node);
DBNDataSource dataSourceNode = DBNDataSource.getDataSourceNode(node);
setContainerInfo(
dataSourceNode == null ? node.getNodeIconDefault() : dataSourceNode.getNodeIconDefault(),
settings.getContainerFullName());
// Reset mappings
for (DatabaseMappingContainer mappingContainer : settings.getDataMappings().values()) {
if (mappingContainer.getMappingType() != DatabaseMappingType.unspecified) {
try {
mappingContainer.refreshMappingType(getContainer(), DatabaseMappingType.unspecified);
} catch (DBException e1) {
log.error(e1);
}
mappingViewer.refresh();
updatePageCompletion();
}
}
mappingViewer.refresh();
updatePageCompletion();
}
});
};
}
createMappingsTree(composite);
......@@ -454,7 +434,7 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
return new CustomComboBoxCellEditor(
mappingViewer,
mappingViewer.getTree(),
mappingTypes.toArray(new String[mappingTypes.size()]),
mappingTypes.toArray(new String[0]),
SWT.DROP_DOWN | SWT.READ_ONLY);
}
@Override
......@@ -543,7 +523,7 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
CustomComboBoxCellEditor editor = new CustomComboBoxCellEditor(
mappingViewer,
mappingViewer.getTree(),
items.toArray(new String[items.size()]),
items.toArray(new String[0]),
SWT.DROP_DOWN | (allowsCreate ? SWT.NONE : SWT.READ_ONLY));
return editor;
}
......@@ -727,7 +707,7 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
}
DatabaseMappingObject getSelectedMapping()
private DatabaseMappingObject getSelectedMapping()
{
IStructuredSelection selection = (IStructuredSelection) mappingViewer.getSelection();
return selection.isEmpty() ? null : (DatabaseMappingObject) selection.getFirstElement();
......@@ -741,8 +721,9 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
DBNDatabaseNode containerNode = settings.getContainerNode();
if (containerNode != null) {
DBNDataSource dataSourceNode = DBNDataSource.getDataSourceNode(containerNode);
containerIcon.setImage(DBeaverIcons.getImage(dataSourceNode == null ? containerNode.getNodeIconDefault() : dataSourceNode.getNodeIcon()));
containerName.setText(settings.getContainerFullName());
containerPanel.setContainerInfo(
dataSourceNode == null ? containerNode.getNodeIconDefault() : dataSourceNode.getNodeIcon(),
settings.getContainerFullName());
}
if (mappingViewer.getInput() == null) {
......
......@@ -21,7 +21,6 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PrintFigureOperation;
import org.eclipse.draw2d.geometry.Dimension;
......@@ -85,7 +84,7 @@ import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.controls.ProgressLoaderVisualizer;
import org.jkiss.dbeaver.ui.controls.ProgressPageControl;
import org.jkiss.dbeaver.ui.controls.itemlist.ObjectSearcher;
import org.jkiss.dbeaver.ui.navigator.itemlist.ObjectSearcher;
import org.jkiss.dbeaver.ui.dialogs.DialogUtils;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
......
......@@ -32,7 +32,7 @@ import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService;
import org.jkiss.dbeaver.ui.LoadingJob;
import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
......
......@@ -31,7 +31,7 @@ import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService;
import org.jkiss.dbeaver.ui.LoadingJob;
import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
......
......@@ -22,8 +22,8 @@ import org.eclipse.core.runtime.jobs.Job;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.connection.DBPAuthInfo;
import org.jkiss.dbeaver.model.access.DBAPasswordChangeInfo;
import org.jkiss.dbeaver.model.connection.DBPAuthInfo;
import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.dbeaver.model.connection.DBPDriverDependencies;
import org.jkiss.dbeaver.model.navigator.DBNNode;
......@@ -105,7 +105,6 @@ public interface DBPPlatformUI {
/**
* FIXME: this is a hack. We need to call platform (workbench) to refresh part's contexts (enabled commands).
* There is no such thing as part in abstract UI. Need some better solution.
* @part IWorkbenchPart
*/
void refreshPartState(Object part);
}
\ No newline at end of file
......@@ -109,27 +109,27 @@ public class ConsoleUserInterface implements DBPPlatformUI {
}
@Override
public DBNNode selectObject(Object parentShell, String title, DBNNode rootNode, DBNNode selectedNode, Class<?>[] allowedTypes, Class<?>[] resultTypes, Class<?>[] leafTypes) {
public DBNNode selectObject(@NotNull Object parentShell, String title, DBNNode rootNode, DBNNode selectedNode, Class<?>[] allowedTypes, Class<?>[] resultTypes, Class<?>[] leafTypes) {
return null;
}
@Override
public void openEntityEditor(DBSObject object) {
public void openEntityEditor(@NotNull DBSObject object) {
throw new IllegalStateException("Editors not supported in console mode");
}
@Override
public void openEntityEditor(DBNNode selectedNode, String defaultPageId) {
public void openEntityEditor(@NotNull DBNNode selectedNode, String defaultPageId) {
throw new IllegalStateException("Editors not supported in console mode");
}
@Override
public void openConnectionEditor(DBPDataSourceContainer dataSourceContainer) {
public void openConnectionEditor(@NotNull DBPDataSourceContainer dataSourceContainer) {
// do nothing
}
@Override
public void executeProcess(DBRProcessDescriptor processDescriptor) {
public void executeProcess(@NotNull DBRProcessDescriptor processDescriptor) {
try {
processDescriptor.execute();
} catch (DBException e) {
......@@ -138,10 +138,11 @@ public class ConsoleUserInterface implements DBPPlatformUI {
}
@Override
public void executeInUI(Runnable runnable) {
public void executeInUI(@NotNull Runnable runnable) {
runnable.run();
}
@NotNull
@Override
public <RESULT> Job createLoadingService(ILoadService<RESULT> loadingService, ILoadVisualizer<RESULT> visualizer) {
throw new IllegalStateException("Loading jobs not supported in console mode");
......
......@@ -51,7 +51,7 @@ import org.jkiss.dbeaver.ui.LoadingJob;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.ListContentProvider;
import org.jkiss.dbeaver.ui.controls.ProgressPageControl;
import org.jkiss.dbeaver.ui.controls.itemlist.ObjectListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.ObjectListControl;
import org.jkiss.dbeaver.ui.editors.AbstractDatabaseObjectEditor;
import org.jkiss.dbeaver.ui.editors.DatabaseEditorUtils;
import org.jkiss.dbeaver.ui.navigator.NavigatorUtils;
......
......@@ -27,6 +27,7 @@ import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataSourceInfo;
......@@ -44,6 +45,7 @@ import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.CSmartCombo;
import org.jkiss.dbeaver.ui.controls.ObjectContainerSelectorPanel;
import org.jkiss.dbeaver.ui.editors.internal.EditorsMessages;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
......@@ -123,15 +125,16 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
panel.setLayoutData(new GridData(GridData.FILL_BOTH));
{
final Composite tableGroup = UIUtils.createPlaceholder(panel, 2, 5);
final Composite tableGroup = UIUtils.createComposite(panel, 2);
tableGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
UIUtils.createLabelText(tableGroup, EditorsMessages.dialog_struct_edit_fk_label_table, DBUtils.getObjectFullName(foreignKey.getParentObject(), DBPEvaluationContext.UI), SWT.READ_ONLY | SWT.BORDER);
try {
if (ownerTableNode != null) {
createSchemaSelector(tableGroup);
createSchemaSelector(tableGroup);
} else if (foreignKey instanceof DBVEntityForeignKey) {
// Virtual key - add container selector
createContainerSelector(tableGroup);
}
} catch (Throwable e) {
log.debug("Can't create schema selector", e);
......@@ -318,7 +321,23 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
}
private void createContainerSelector(Composite tableGroup) throws DBException {
ObjectContainerSelectorPanel containerPanel = new ObjectContainerSelectorPanel(tableGroup, "Reference table container") {
@Nullable
@Override
protected DBNNode getSelectedNode() {
return DBWorkbench.getPlatform().getNavigatorModel().getNodeByObject(
ownerTableNode != null ? ownerTableNode.getObject() : foreignKey.getDataSource());
}
@Override
protected void setSelectedNode(DBNDatabaseNode node) {
ownerTableNode = node;
setContainerInfo(node.getNodeIconDefault(), node.getNodeFullName());
}
};
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
containerPanel.setLayoutData(gd);
}
private void loadTableList(DBNDatabaseNode newContainerNode) {
......
......@@ -37,7 +37,7 @@ import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService;
import org.jkiss.dbeaver.ui.LoadingJob;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.TreeContentProvider;
import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPanel;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPresentation;
import org.jkiss.utils.CommonUtils;
......
......@@ -28,7 +28,7 @@ import org.jkiss.dbeaver.model.exec.plan.DBCPlanNode;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.ui.LoadingJob;
import org.jkiss.dbeaver.ui.controls.ObjectViewerRenderer;
import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.navigator.actions.NavigatorHandlerObjectOpen;
import org.jkiss.utils.CommonUtils;
......
......@@ -29,8 +29,6 @@ Require-Bundle: org.eclipse.equinox.preferences,
Export-Package: org.jkiss.dbeaver.ui.controls,
org.jkiss.dbeaver.ui.actions,
org.jkiss.dbeaver.ui.actions.datasource,
org.jkiss.dbeaver.ui.controls.itemlist,
org.jkiss.dbeaver.ui.navigator,
org.jkiss.dbeaver.ui.editors.entity,
org.jkiss.dbeaver.ui.editors.entity.handlers,
org.jkiss.dbeaver.ui.editors.entity.properties,
......@@ -40,6 +38,7 @@ Export-Package: org.jkiss.dbeaver.ui.controls,
org.jkiss.dbeaver.ui.navigator.database,
org.jkiss.dbeaver.ui.navigator.database.load,
org.jkiss.dbeaver.ui.navigator.dialogs,
org.jkiss.dbeaver.ui.navigator.itemlist,
org.jkiss.dbeaver.ui.navigator.project,
org.jkiss.dbeaver.ui.preferences,
org.jkiss.dbeaver.ui.project,
......
......@@ -36,7 +36,7 @@ import org.jkiss.dbeaver.model.navigator.*;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.controls.itemlist.ItemListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.ItemListControl;
import org.jkiss.dbeaver.ui.editors.INavigatorEditorInput;
import org.jkiss.dbeaver.ui.editors.NodeEditorInput;
import org.jkiss.dbeaver.ui.navigator.INavigatorModelView;
......
......@@ -35,7 +35,7 @@ import org.jkiss.dbeaver.ui.IRefreshablePart;
import org.jkiss.dbeaver.ui.ISearchContextProvider;
import org.jkiss.dbeaver.ui.controls.ProgressPageControl;
import org.jkiss.dbeaver.ui.controls.folders.TabbedFolderPage;
import org.jkiss.dbeaver.ui.controls.itemlist.ItemListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.ItemListControl;
import org.jkiss.dbeaver.ui.editors.IDatabaseEditor;
import org.jkiss.dbeaver.ui.navigator.INavigatorModelView;
......
......@@ -139,6 +139,9 @@ public class BrowseObjectDialog extends Dialog {
});
if (selectedNode != null) {
treeViewer.setSelection(new StructuredSelection(selectedNode));
if (!(selectedNode instanceof DBNDataSource) || ((DBNDataSource) selectedNode).getDataSourceContainer().isConnected()) {
treeViewer.expandToLevel(selectedNode, 1);
}
selectedObjects.add(selectedNode);
}
treeViewer.addSelectionChangedListener(event -> {
......
......@@ -40,7 +40,7 @@ import org.jkiss.dbeaver.model.runtime.load.AbstractLoadService;
import org.jkiss.dbeaver.model.struct.DBSWrapper;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.controls.ListContentProvider;
import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl;
import org.jkiss.dbeaver.ui.dialogs.AbstractPopupPanel;
import org.jkiss.utils.CommonUtils;
......
......@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.controls.itemlist;
package org.jkiss.dbeaver.ui.navigator.itemlist;
import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.IContentProvider;
......@@ -57,24 +57,21 @@ public abstract class DatabaseObjectListControl<OBJECT_TYPE extends DBPObject> e
private void createContextMenu()
{
NavigatorUtils.createContextMenu(site, getItemsViewer(), new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
IAction copyAction = new Action(WorkbenchMessages.Workbench_copy) {
@Override
public void run()
{
String text = getRenderer().getSelectedText();
if (!CommonUtils.isEmpty(text)) {
UIUtils.setClipboardContents(getDisplay(), TextTransfer.getInstance(), text);
}
NavigatorUtils.createContextMenu(site, getItemsViewer(), manager -> {
IAction copyAction = new Action(WorkbenchMessages.Workbench_copy) {
@Override
public void run()
{
String text = getRenderer().getSelectedText();
if (!CommonUtils.isEmpty(text)) {
UIUtils.setClipboardContents(getDisplay(), TextTransfer.getInstance(), text);
}
};
copyAction.setEnabled(!getSelectionProvider().getSelection().isEmpty());
manager.add(copyAction);
manager.add(new Separator());
fillCustomActions(manager);
}
}
};
copyAction.setEnabled(!getSelectionProvider().getSelection().isEmpty());
manager.add(copyAction);
manager.add(new Separator());
fillCustomActions(manager);
});
}
......
......@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.controls.itemlist;
package org.jkiss.dbeaver.ui.navigator.itemlist;
import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.*;
......
......@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.controls.itemlist;
package org.jkiss.dbeaver.ui.navigator.itemlist;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.widgets.Composite;
......
......@@ -15,7 +15,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.controls.itemlist;
package org.jkiss.dbeaver.ui.navigator.itemlist;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
......
......@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.controls.itemlist;
package org.jkiss.dbeaver.ui.navigator.itemlist;
import org.jkiss.dbeaver.model.DBPNamedObject;
import org.jkiss.dbeaver.model.DBPObject;
......
......@@ -38,7 +38,7 @@ import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.LoadingJob;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.TreeContentProvider;
import org.jkiss.dbeaver.ui.controls.itemlist.NodeListControl;
import org.jkiss.dbeaver.ui.navigator.itemlist.NodeListControl;
import org.jkiss.dbeaver.ui.navigator.INavigatorModelView;
import org.jkiss.dbeaver.ui.search.internal.UISearchMessages;
import org.jkiss.utils.CommonUtils;
......
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
* Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.controls;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.navigator.DBNModel;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.navigator.DBNProject;
import org.jkiss.dbeaver.model.struct.DBSObjectContainer;
import org.jkiss.dbeaver.model.struct.rdb.DBSSchema;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIUtils;
/**
* ObjectContainerSelectorPanel
*/
public abstract class ObjectContainerSelectorPanel extends Composite
{
private final Label containerIcon;
private final Text containerName;
protected ObjectContainerSelectorPanel(Composite parent, String containerTitle) {
super(parent, SWT.NONE);
GridLayout layout = new GridLayout(4, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
this.setLayout(layout);
this.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
UIUtils.createControlLabel(this, containerTitle);
containerIcon = new Label(this, SWT.NONE);
containerIcon.setImage(DBeaverIcons.getImage(DBIcon.TYPE_UNKNOWN));
containerName = new Text(this, SWT.BORDER | SWT.READ_ONLY);
containerName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
containerName.setText("");
Button browseButton = new Button(this, SWT.PUSH);
browseButton.setImage(DBeaverIcons.getImage(DBIcon.TREE_FOLDER));
browseButton.setText("...");
browseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
{
DBPProject activeProject = DBWorkbench.getPlatform().getWorkspace().getActiveProject();
if (activeProject != null) {
final DBNModel navigatorModel = DBWorkbench.getPlatform().getNavigatorModel();
final DBNProject rootNode = navigatorModel.getRoot().getProjectNode(activeProject);
DBNNode selectedNode = getSelectedNode();
DBNNode node = DBWorkbench.getPlatformUI().selectObject(
getShell(),
containerTitle,
rootNode.getDatabases(),
selectedNode,
new Class[] {DBSObjectContainer.class},
null, new Class[] { DBSSchema.class });
if (node instanceof DBNDatabaseNode) {
setSelectedNode((DBNDatabaseNode) node);
}
}
}
});
}
public void setContainerInfo(DBPImage image, String name) {
containerIcon.setImage(DBeaverIcons.getImage(image));
containerName.setText(name);
}
protected abstract void setSelectedNode(DBNDatabaseNode node);
@Nullable
protected abstract DBNNode getSelectedNode();
}
\ No newline at end of file
......@@ -31,7 +31,6 @@ import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.internal.UIMessages;
import org.jkiss.dbeaver.ui.internal.UINavigatorMessages;
import org.jkiss.utils.CommonUtils;
import java.util.ArrayList;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册