org.jkiss.dbeaver.ui.dialogs.data.ValueViewDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.jkiss.dbeaver.ui.dialogs.data.ValueViewDialog.java

Source

/*
 * DBeaver - Universal Database Manager
 * Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License (version 2)
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
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.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) {
                valueController.updateValue(value);
            }

            @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 IContributionManager getEditBar() {
                return null;
            }

            @Override
            public void showMessage(String message, boolean error) {
            }
        });
        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);
            }
            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 {

    }
}