提交 b5e22b2e 编写于 作者: S Serge Rider

#5384 FK create dialog: container selector.

上级 316121d0
......@@ -104,7 +104,7 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
{
// Target container
// Use first source object as cur selection (it's better than nothing)
containerPanel = new ObjectContainerSelectorPanel(composite, DTMessages.data_transfer_db_consumer_target_container) {
containerPanel = new ObjectContainerSelectorPanel(composite, DTMessages.data_transfer_db_consumer_target_container, DTMessages.data_transfer_db_consumer_choose_container) {
@Nullable
@Override
protected DBNNode getSelectedNode() {
......
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
*
* 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.model.runtime;
/**
* Abstract value provider
*/
@FunctionalInterface
public interface DBRValueProvider<RESULT, PARAMETER> {
RESULT getValue(PARAMETER parameter);
}
\ No newline at end of file
......@@ -30,13 +30,12 @@ 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;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.DBValueFormatting;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseFolder;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.navigator.meta.DBXTreeNode;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.*;
import org.jkiss.dbeaver.model.struct.rdb.*;
......@@ -87,7 +86,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
private DBSForeignKeyModifyRule[] supportedModifyRules;
private DBSEntityAssociation foreignKey;
private DBSTable curRefTable;
private DBSEntity curRefTable;
private List<DBSEntityConstraint> curConstraints;
private DBNDatabaseNode ownerTableNode;
private Table tableList;
......@@ -321,7 +320,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
}
private void createContainerSelector(Composite tableGroup) throws DBException {
ObjectContainerSelectorPanel containerPanel = new ObjectContainerSelectorPanel(tableGroup, "Reference table container") {
ObjectContainerSelectorPanel containerPanel = new ObjectContainerSelectorPanel(tableGroup, "Reference table container", "Select reference table catalog/schema") {
@Nullable
@Override
protected DBNNode getSelectedNode() {
......@@ -332,7 +331,12 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
@Override
protected void setSelectedNode(DBNDatabaseNode node) {
ownerTableNode = node;
setContainerInfo(node.getNodeIconDefault(), node.getNodeFullName());
if (node == null) {
setContainerInfo(DBIcon.TYPE_UNKNOWN, "");
} else {
setContainerInfo(node.getNodeIconDefault(), node.getNodeFullName());
loadTableList(ownerTableNode);
}
}
};
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
......@@ -342,28 +346,55 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
private void loadTableList(DBNDatabaseNode newContainerNode) {
tableList.removeAll();
final List<DBNDatabaseNode> entities = new ArrayList<>();
try {
for (DBNNode tableNode : newContainerNode.getChildren(new VoidProgressMonitor())) {
if (tableNode instanceof DBNDatabaseNode && ((DBNDatabaseNode) tableNode).getObject() instanceof DBSEntity) {
TableItem tableItem = new TableItem(tableList, SWT.LEFT);
tableItem.setText(tableNode.getNodeName());
tableItem.setImage(DBeaverIcons.getImage(tableNode.getNodeIconDefault()));
tableItem.setData(tableNode);
UIUtils.runInProgressDialog(monitor -> {
try {
loadEntities(monitor, entities, newContainerNode);
} catch (DBException e) {
throw new InvocationTargetException(e);
}
});
} catch (InvocationTargetException e) {
DBWorkbench.getPlatformUI().showError("Error loading tables", "Error during table load", e);
}
for (DBNDatabaseNode entityNode : entities) {
TableItem tableItem = new TableItem(tableList, SWT.LEFT);
tableItem.setText(entityNode.getNodeName());
tableItem.setImage(DBeaverIcons.getImage(entityNode.getNodeIconDefault()));
tableItem.setData(entityNode);
}
}
private void loadEntities(DBRProgressMonitor monitor, List<DBNDatabaseNode> entities, DBNDatabaseNode container) throws DBException {
for (DBNNode childNode : container.getChildren(monitor)) {
if (monitor.isCanceled()) {
break;
}
if (childNode instanceof DBNDatabaseFolder) {
loadEntities(monitor, entities, (DBNDatabaseFolder)childNode);
} else {
if (childNode instanceof DBNDatabaseNode) {
DBSObject object = ((DBNDatabaseNode) childNode).getObject();
// Extr checks. In fact just for PosgreSQL like databases where everything is a table
if (object instanceof DBSEntity && !(object instanceof DBSSequence) && !(object instanceof DBSDataType)) {
entities.add((DBNDatabaseNode) childNode);
}
}
}
} catch (DBException e) {
log.error(e);
}
}
private void handleRefTableSelect(DBNDatabaseNode refTableNode)
{
if (refTableNode != null) {
if (refTableNode.getObject() == curRefTable) {
DBSObject object = refTableNode.getObject();
if (object == curRefTable) {
// The same selection
return;
} else {
curRefTable = (DBSTable) refTableNode.getObject();
} else if (object instanceof DBSEntity) {
curRefTable = (DBSEntity) refTableNode.getObject();
}
if (fkNameText != null) {
fkNameText.setText("FK_" + refTableNode.getObject().getName());
......@@ -376,7 +407,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
curConstraints = new ArrayList<>();
curConstraint = null;
if (refTableNode != null) {
final DBSTable refTable = (DBSTable) refTableNode.getObject();
final DBSEntity refTable = (DBSEntity) refTableNode.getObject();
UIUtils.runInProgressService(monitor -> {
try {
// Cache own table columns
......@@ -386,21 +417,23 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
refTable.getAttributes(monitor);
// Get constraints
final Collection<? extends DBSTableConstraint> constraints = refTable.getConstraints(monitor);
final Collection<? extends DBSEntityConstraint> constraints = refTable.getConstraints(monitor);
if (!CommonUtils.isEmpty(constraints)) {
for (DBSTableConstraint constraint : constraints) {
for (DBSEntityConstraint constraint : constraints) {
if (constraint.getConstraintType().isUnique()) {
curConstraints.add(constraint);
}
}
}
// Get indexes
final Collection<? extends DBSTableIndex> indexes = refTable.getIndexes(monitor);
if (!CommonUtils.isEmpty(indexes)) {
for (DBSTableIndex constraint : indexes) {
if (constraint.getConstraintType().isUnique()) {
curConstraints.add(constraint);
if (refTable instanceof DBSTable) {
// Get indexes
final Collection<? extends DBSTableIndex> indexes = ((DBSTable)refTable).getIndexes(monitor);
if (!CommonUtils.isEmpty(indexes)) {
for (DBSTableIndex constraint : indexes) {
if (constraint.getConstraintType().isUnique()) {
curConstraints.add(constraint);
}
}
}
}
......@@ -589,11 +622,7 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
public void widgetSelected(SelectionEvent e)
{
if (columnsCombo.getSelectionIndex() >= 0) {
fkInfo.ownColumn = ownColumns.get(columnsCombo.getSelectionIndex());
item.setText(0, fkInfo.ownColumn.getName());
item.setImage(0, getColumnIcon(fkInfo.ownColumn));
item.setText(1, fkInfo.ownColumn.getFullTypeName());
updatePageState();
assignForeignKeyRefConstraint(fkInfo, columnsCombo, item);
}
}
});
......@@ -601,6 +630,9 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
@Override
public void focusLost(FocusEvent e)
{
if (columnsCombo.getSelectionIndex() >= 0) {
assignForeignKeyRefConstraint(fkInfo, columnsCombo, item);
}
disposeOldEditor();
}
});
......@@ -608,6 +640,14 @@ public class EditForeignKeyPage extends BaseObjectEditPage {
}
}
private void assignForeignKeyRefConstraint(FKColumnInfo fkInfo, CCombo columnsCombo, TableItem item) {
fkInfo.ownColumn = ownColumns.get(columnsCombo.getSelectionIndex());
item.setText(0, fkInfo.ownColumn.getName());
item.setImage(0, getColumnIcon(fkInfo.ownColumn));
item.setText(1, fkInfo.ownColumn.getFullTypeName());
updatePageState();
}
public boolean isEnabled() {
return true;
}
......
......@@ -104,7 +104,6 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
private final Color hoverBgColor;
private final Color shadowColor;
private final GC sizingGC;
private final Font hintFont;
private String activeDisplayName = ResultSetViewer.DEFAULT_QUERY_TEXT;
......@@ -127,7 +126,6 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
this.hoverBgColor = getDisplay().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW);
this.shadowColor = getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
this.hintFont = UIUtils.modifyFont(getFont(), SWT.ITALIC);
{
this.filterComposite = new Composite(this, SWT.BORDER);
......@@ -163,20 +161,11 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
// Register filters text in focus service
UIUtils.addDefaultEditActionsSupport(viewer.getSite(), this.filtersText);
this.filtersText.addPaintListener(e -> {
/*if (viewer.getModel().hasData())*/ {
final boolean supportsDataFilter = viewer.supportsDataFilter();
if (!supportsDataFilter || (filtersText.isEnabled() && filtersText.getCharCount() == 0 && !filtersText.isFocusControl())) {
e.gc.setForeground(shadowColor);
e.gc.setFont(hintFont);
e.gc.drawText(supportsDataFilter ?
ResultSetMessages.sql_editor_resultset_filter_panel_text_enter_sql_to_filter:
ResultSetMessages.sql_editor_resultset_filter_panel_text_enter_filter_not_support,
2, 0, true);
e.gc.setFont(null);
}
}
});
UIUtils.addEmptyTextHint(this.filtersText, styledText ->
viewer.supportsDataFilter() ?
ResultSetMessages.sql_editor_resultset_filter_panel_text_enter_sql_to_filter:
ResultSetMessages.sql_editor_resultset_filter_panel_text_enter_filter_not_support
);
this.filtersText.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
......@@ -349,7 +338,6 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
historyMenu = null;
}
UIUtils.dispose(sizingGC);
UIUtils.dispose(hintFont);
});
}
......
......@@ -44,6 +44,7 @@ import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
......@@ -1891,4 +1892,29 @@ public class UIUtils {
}
}
}
public static <T extends Control> void addEmptyTextHint(T control, DBRValueProvider<String, T> tipProvider) {
control.addPaintListener(new PaintListener() {
private Font hintFont = UIUtils.modifyFont(control.getFont(), SWT.ITALIC);
{
control.addDisposeListener(e -> hintFont.dispose());
}
@Override
public void paintControl(PaintEvent e) {
String tip = tipProvider.getValue(control);
if (tip != null && (control.isEnabled() && isEmptyTextControl(control) && !control.isFocusControl())) {
e.gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
e.gc.setFont(hintFont);
e.gc.drawText(tip, 2, 0, true);
e.gc.setFont(null);
}
}
});
}
private static boolean isEmptyTextControl(Control control) {
return control instanceof Text ?
((Text) control).getCharCount() == 0 :
control instanceof StyledText && ((StyledText) control).getCharCount() == 0;
}
}
......@@ -18,8 +18,7 @@
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.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
......@@ -49,7 +48,7 @@ public abstract class ObjectContainerSelectorPanel extends Composite
private final Label containerIcon;
private final Text containerName;
protected ObjectContainerSelectorPanel(Composite parent, String containerTitle) {
protected ObjectContainerSelectorPanel(Composite parent, String containerTitle, String containerHint) {
super(parent, SWT.NONE);
GridLayout layout = new GridLayout(4, false);
......@@ -65,30 +64,42 @@ public abstract class ObjectContainerSelectorPanel extends Composite
containerName = new Text(this, SWT.BORDER | SWT.READ_ONLY);
containerName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
containerName.setText("");
if (containerHint != null) {
UIUtils.addEmptyTextHint(containerName, text -> containerHint);
}
Button browseButton = new Button(this, SWT.PUSH);
browseButton.setImage(DBeaverIcons.getImage(DBIcon.TREE_FOLDER));
browseButton.setText("...");
Runnable containerSelector = () -> {
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(),
containerHint != null ? containerHint : containerTitle,
rootNode.getDatabases(),
selectedNode,
new Class[]{DBSObjectContainer.class},
null,//new Class[] { DBSObjectContainer.class },
new Class[]{DBSSchema.class});
if (node instanceof DBNDatabaseNode) {
setSelectedNode((DBNDatabaseNode) node);
}
}
};
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 widgetSelected(SelectionEvent e) {
containerSelector.run();
}
});
containerName.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent e) {
containerSelector.run();
}
});
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册