/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 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.ui.dialogs.data;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IWorkbenchPartSite;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.DBPMessageType;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.DBDValueHandler;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.struct.*;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.dialogs.ColumnInfoPanel;
import org.jkiss.dbeaver.ui.data.*;
import org.jkiss.dbeaver.ui.data.managers.BaseValueManager;
import org.jkiss.utils.CommonUtils;
/**
* ValueViewDialog
*
* @author Serge Rider
*/
public abstract class ValueViewDialog extends Dialog implements IValueEditorStandalone {
private static final Log log = Log.getLog(ValueViewDialog.class);
private static int dialogCount = 0;
public static final String SETTINGS_SECTION_DI = "ValueViewDialog";
private IValueController valueController;
private Object editedValue;
private boolean columnInfoVisible = true;
private ColumnInfoPanel columnPanel;
private final IDialogSettings dialogSettings;
private boolean opened;
protected ValueViewDialog(IValueController valueController) {
super(valueController.getValueSite().getShell());
setShellStyle(SWT.SHELL_TRIM);
this.valueController = valueController;
dialogSettings = UIUtils.getDialogSettings(SETTINGS_SECTION_DI);
if (dialogSettings.get(getInfoVisiblePrefId()) != null) {
columnInfoVisible = dialogSettings.getBoolean(getInfoVisiblePrefId());
}
dialogCount++;
}
@Override
public void createControl() {
}
protected IDialogSettings getDialogSettings()
{
return dialogSettings;
}
@Nullable
protected IValueEditor createPanelEditor(final Composite placeholder)
throws DBException
{
IValueEditor editor = valueController.getValueManager().createEditor(new IValueController() {
@NotNull
@Override
public DBCExecutionContext getExecutionContext() {
return valueController.getExecutionContext();
}
@Override
public String getValueName()
{
return valueController.getValueName();
}
@Override
public DBSTypedObject getValueType()
{
return valueController.getValueType();
}
@Override
public Object getValue()
{
return valueController.getValue();
}
@Override
public void updateValue(Object value, boolean updatePresentation)
{
valueController.updateValue(value, updatePresentation);
}
@Override
public DBDValueHandler getValueHandler()
{
return valueController.getValueHandler();
}
@Override
public IValueManager getValueManager() {
return valueController.getValueManager();
}
@Override
public EditType getEditType()
{
return EditType.PANEL;
}
@Override
public boolean isReadOnly()
{
return valueController.isReadOnly();
}
@Override
public IWorkbenchPartSite getValueSite()
{
return valueController.getValueSite();
}
@Override
public Composite getEditPlaceholder()
{
return placeholder;
}
@Override
public void refreshEditor() {
valueController.refreshEditor();
}
@Override
public void showMessage(String message, DBPMessageType messageType)
{
}
});
if (editor != null) {
editor.createControl();
}
return editor;
}
public IValueController getValueController() {
return valueController;
}
@Override
public void showValueEditor() {
if (!opened) {
open();
} else {
getShell().setFocus();
}
}
@Override
public void closeValueEditor() {
this.valueController = null;
this.setReturnCode(CANCEL);
this.close();
}
@Override
protected Control createDialogArea(Composite parent)
{
/*
SashForm sash = new SashForm(parent, SWT.VERTICAL);
sash.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite dialogGroup = (Composite)super.createDialogArea(sash);
dialogGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
new ColumnInfoPanel(dialogGroup, SWT.BORDER, getValueController());
Composite editorGroup = (Composite) super.createDialogArea(sash);
editorGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
//editorGroup.setLayout(new GridLayout(1, false));
return editorGroup;
*/
Composite dialogGroup = (Composite)super.createDialogArea(parent);
if (valueController instanceof IAttributeController) {
final Link columnHideLink = new Link(dialogGroup, SWT.NONE);
columnHideLink.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
{
columnInfoVisible = !columnInfoVisible;
dialogSettings.put(getInfoVisiblePrefId(), columnInfoVisible);
initColumnInfoVisibility(columnHideLink);
getShell().layout();
int width = getShell().getSize().x;
getShell().setSize(width, getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
}
});
columnPanel = new ColumnInfoPanel(dialogGroup, SWT.BORDER, valueController);
columnPanel.setLayoutData(new GridData(GridData.FILL_BOTH));
initColumnInfoVisibility(columnHideLink);
}
return dialogGroup;
}
private void initColumnInfoVisibility(Link columnHideLink)
{
columnPanel.setVisible(columnInfoVisible);
((GridData)columnPanel.getLayoutData()).exclude = !columnInfoVisible;
columnHideLink.setText("Column Info: (<a>" + (columnInfoVisible ? "hide" : "show") + "</a>)");
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
// create OK and Cancel buttons by default
createButton(parent, IDialogConstants.OK_ID, CoreMessages.dialog_value_view_button_save, true)
.setEnabled(!valueController.isReadOnly());
boolean required = false;//valueController.getValueType() instanceof DBSAttributeBase && ((DBSAttributeBase) valueController.getValueType()).isRequired();
createButton(parent, IDialogConstants.IGNORE_ID, CoreMessages.dialog_value_view_button_sat_null, false)
.setEnabled(!valueController.isReadOnly() && !DBUtils.isNullValue(valueController.getValue()) && !required);
createButton(parent, IDialogConstants.CANCEL_ID, CoreMessages.dialog_value_view_button_cancel, false);
}
@Override
protected void initializeBounds()
{
super.initializeBounds();
Shell shell = getShell();
String sizeString = dialogSettings.get(getDialogSizePrefId());
if (!CommonUtils.isEmpty(sizeString) && sizeString.contains(":")) {
int divPos = sizeString.indexOf(':');
shell.setSize(new Point(
Integer.parseInt(sizeString.substring(0, divPos)),
Integer.parseInt(sizeString.substring(divPos + 1))));
shell.layout();
}
Monitor primary = shell.getMonitor();
Rectangle bounds = primary.getBounds ();
Rectangle rect = shell.getBounds ();
int x = bounds.x + (bounds.width - rect.width) / 2;
int y = bounds.y + (bounds.height - rect.height) / 3;
x += dialogCount * 20;
y += dialogCount * 20;
shell.setLocation(x, y);
}
private String getInfoVisiblePrefId()
{
return getClass().getSimpleName() + "-" +
CommonUtils.escapeIdentifier(getValueController().getValueType().getTypeName()) +
"-columnInfoVisible";
}
private String getDialogSizePrefId()
{
return getClass().getSimpleName() + "-" +
CommonUtils.escapeIdentifier(getValueController().getValueType().getTypeName()) +
"-dialogSize";
}
@Override
public final int open()
{
try {
opened = true;
int result = super.open();
if (result == IDialogConstants.OK_ID) {
getValueController().updateValue(editedValue, true);
}
return result;
} finally {
dialogCount--;
this.valueController = null;
}
}
@Override
protected void okPressed()
{
try {
editedValue = extractEditorValue();
super.okPressed();
}
catch (Exception e) {
UIUtils.showErrorDialog(getShell(), CoreMessages.dialog_value_view_dialog_error_updating_title, CoreMessages.dialog_value_view_dialog_error_updating_message, e);
super.cancelPressed();
}
}
@Override
protected void buttonPressed(int buttonId) {
Point size = getShell().getSize();
String sizeString = size.x + ":" + size.y;
dialogSettings.put(getDialogSizePrefId(), sizeString);
if (buttonId == IDialogConstants.IGNORE_ID) {
if (!valueController.isReadOnly()) {
editedValue = BaseValueManager.makeNullValue(valueController);
}
super.okPressed();
} else {
super.buttonPressed(buttonId);
}
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
if (valueController instanceof IAttributeController) {
DBSAttributeBase meta = ((IAttributeController)valueController).getBinding();
shell.setText(meta.getName());
}
}
@Override
public void contributeActions(@NotNull IContributionManager manager, @NotNull IValueController controller) throws DBCException {
}
}