org.hibernate.eclipse.console.AbstractQueryEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.eclipse.console.AbstractQueryEditor.java

Source

/*******************************************************************************
 * Copyright (c) 2007-2009 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributor:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.hibernate.eclipse.console;

import java.io.File;
import java.text.MessageFormat;

import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.ControlContribution;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IShowEditorInput;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.dialogs.SaveAsDialog;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.hibernate.console.ConsoleConfiguration;
import org.hibernate.console.KnownConfigurations;
import org.hibernate.console.QueryInputModel;
import org.hibernate.eclipse.console.actions.ClearAction;
import org.hibernate.eclipse.console.actions.ExecuteQueryAction;
import org.hibernate.eclipse.console.actions.StickResTabAction;
import org.jboss.tools.hibernate.runtime.spi.IService;

public abstract class AbstractQueryEditor extends TextEditor implements QueryEditor, IShowEditorInput {

    private ToolBarManager tbm;
    private ExecuteQueryAction execAction = null;
    private ClearAction clearAction = null;
    private StickResTabAction stickResTabAction = null;
    private QueryInputModel queryInputModel;

    private String defPartName;
    private Image defTitleImage;
    private Image connectedTitleImage;

    // to enable execution of queries from files - hack for HBX-744
    private String consoleConfigurationName;

    protected boolean pinToOneResTab = false;

    final public boolean askUserForConfiguration(String name) {
        String out = NLS.bind(HibernateConsoleMessages.AbstractQueryEditor_do_you_want_open_session_factory, name);
        return MessageDialog.openQuestion(
                HibernateConsolePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(),
                HibernateConsoleMessages.AbstractQueryEditor_open_session_factory, out);
    }

    final public ConsoleConfiguration getConsoleConfiguration() {
        return KnownConfigurations.getInstance().find(getConsoleConfigurationName());
    }

    final public String getConsoleConfigurationName() {
        //TODO: these should be stored as resource info
        if (getEditorInput() instanceof QueryEditorInput) {
            QueryEditorInput hei = (QueryEditorInput) getEditorInput();
            return hei.getConsoleConfigurationName();
        } else {
            return consoleConfigurationName;
        }
    }

    final public void setConsoleConfigurationName(String name) {
        if (getEditorInput() instanceof QueryEditorInput) {
            QueryEditorInput hei = (QueryEditorInput) getEditorInput();
            hei.setConsoleConfigurationName(name);
            hei.setQuery(getEditorText());
            hei.resetName();
        }
        this.consoleConfigurationName = name;

        showEditorInput(getEditorInput());
    }

    protected void updateExecButton() {
        /*if (getSourceViewer() != null ){
           execAction.setEnabled(getConsoleConfigurationName().trim().length() != 0
           && getSourceViewer().getDocument().get().trim().length() > 0);
        } else {
           execAction.setEnabled(false);
        }*/
        execAction.setEnabled(getQueryString().trim().length() > 0 && getConsoleConfigurationName().length() != 0);
    }

    public void showEditorInput(IEditorInput editorInput) {

        try {
            doSetInput(editorInput);
            updateExecButton();
        } catch (CoreException e) {
            HibernateConsolePlugin.getDefault().logErrorMessage(
                    HibernateConsoleMessages.AbstractQueryEditor_could_not_show_query_editor_input, e);
        }
    }

    final public void doSave(IProgressMonitor progressMonitor) {
        // super.doSave(progressMonitor);
        QueryEditorInput hei = null;
        if (getEditorInput() instanceof QueryEditorInput) {
            hei = (QueryEditorInput) getEditorInput();
            hei.setQuery(getEditorText());
        }
        IDocumentProvider p = getDocumentProvider();
        if (p != null && p.isDeleted(getEditorInput())) {
            if (isSaveAsAllowed()) {
                // 1GEUSSR: ITPUI:ALL - User should never loose changes made in the editors.
                // Changed Behavior to make sure that if called inside a regular save (because
                // of deletion of input element) there is a way to report back to the caller.
                performSaveAs(progressMonitor);

            } else {
                Shell shell = getSite().getShell();
                String title = HibernateConsoleMessages.AbstractQueryEditor_cannot_save;
                String msg = HibernateConsoleMessages.AbstractQueryEditor_the_file_has_been_deleted_or_is_not_accessible;
                MessageDialog.openError(shell, title, msg);
            }
        } else {
            performSave(false, progressMonitor);
        }
    }

    protected void doSetInput(IEditorInput input) throws CoreException {
        super.doSetInput(input);
    }

    final public String getEditorText() {
        IEditorInput editorInput = getEditorInput();
        IDocumentProvider docProvider = getDocumentProvider();
        IDocument doc = docProvider.getDocument(editorInput);
        return doc.get();
    }

    public String getQueryString() {
        return getEditorText();
    }

    /**
     * Dispose of resources held by this editor.
     *
     * @see IWorkbenchPart#dispose()
     */
    final public void dispose() {
        super.dispose();
        if (tbm != null)
            tbm.dispose();
    }

    final protected void createToolbar(Composite parent) {
        ToolBar bar = new ToolBar(parent, SWT.HORIZONTAL);
        bar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        tbm = new ToolBarManager(bar);
        execAction = new ExecuteQueryAction(this);
        clearAction = new ClearAction(this);
        stickResTabAction = new StickResTabAction(this);

        ActionContributionItem item = new ActionContributionItem(execAction);
        tbm.add(item);

        item = new ActionContributionItem(clearAction);
        tbm.add(item);

        ControlContribution cc = new ConfigurationCombo("hql-target", this); //$NON-NLS-1$
        tbm.add(cc);

        tbm.add(new Separator());

        cc = new ComboContribution("maxResults") { //$NON-NLS-1$

            SelectionAdapter selectionAdapter = new SelectionAdapter() {

                public void widgetSelected(SelectionEvent e) {
                    Integer maxResults = null;

                    try {
                        maxResults = new Integer(getText());
                    } catch (NumberFormatException e1) {
                        maxResults = null;
                    }
                    getQueryInputModel().setMaxResults(maxResults);
                }

            };

            protected Control createControl(Composite parent) {

                Control control = super.createControl(parent);

                comboControl.addModifyListener(new ModifyListener() {

                    public void modifyText(ModifyEvent e) {
                        Integer maxResults = null;

                        try {
                            maxResults = new Integer(getText());
                        } catch (NumberFormatException e1) {
                            maxResults = null;
                        }
                        getQueryInputModel().setMaxResults(maxResults);
                    }
                });
                return control;
            }

            protected int getComboWidth() {
                return 75;
            }

            protected String getLabelText() {
                return HibernateConsoleMessages.AbstractQueryEditor_max_results;
            }

            protected boolean isReadOnly() {
                return false;
            }

            protected SelectionListener getSelectionAdapter() {
                return selectionAdapter;
            }

            void populateComboBox() {
                comboControl.getDisplay().syncExec(new Runnable() {

                    public void run() {
                        String[] items = new String[] { "", "10", "20", "30", "50" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
                        comboControl.setItems(items);
                    }

                });

            }

        };
        tbm.add(cc);

        tbm.add(new Separator());
        item = new ActionContributionItem(stickResTabAction);
        tbm.add(item);

        tbm.update(true);

    }

    protected void initializeKeyBindingScopes() {
        setKeyBindingScopes(new String[] { "org.hibernate.eclipse.console.hql" }); //$NON-NLS-1$
    }

    public QueryInputModel getQueryInputModel() {
        if (queryInputModel == null) {
            IService service = getConsoleConfiguration().getHibernateExtension().getHibernateService();
            queryInputModel = new QueryInputModel(service);
        }
        return queryInputModel;
    }

    public void showConnected(IEditorPart editor) {
        defPartName = getPartName();
        defTitleImage = getTitleImage();
        setPartName(defPartName + "->" + editor.getTitle()); //$NON-NLS-1$
        if (connectedTitleImage == null) {
            connectedTitleImage = HibernateConsolePlugin.getImageDescriptor(getConnectedImageFilePath())
                    .createImage();
        }
        setTitleImage(connectedTitleImage);
    }

    public void showDisconnected() {
        setPartName(defPartName);
        if (defTitleImage != null && !defTitleImage.isDisposed()) {
            setTitleImage(defTitleImage);
        } else {
            setTitleImage(null);
        }
        connectedTitleImage.dispose();
    }

    protected abstract String getConnectedImageFilePath();

    /**
     * returns file extension for "Save As" dialog
     */
    protected abstract String getSaveAsFileExtension();

    /**
     * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#performSaveAs(IProgressMonitor)
     * the same method except line: "dialog.setOriginalName(getSaveAsFileExtension());"
     */
    protected void performSaveAs(IProgressMonitor progressMonitor) {
        Shell shell = getSite().getShell();
        final IEditorInput input = getEditorInput();

        IDocumentProvider provider = getDocumentProvider();
        final IEditorInput newInput;

        if (input instanceof IURIEditorInput && !(input instanceof IFileEditorInput)) {
            FileDialog dialog = new FileDialog(shell, SWT.SAVE);
            IPath oldPath = URIUtil.toPath(((IURIEditorInput) input).getURI());
            if (oldPath != null) {
                dialog.setFileName(oldPath.lastSegment());
                dialog.setFilterPath(oldPath.toOSString());
            }

            String path = dialog.open();
            if (path == null) {
                if (progressMonitor != null)
                    progressMonitor.setCanceled(true);
                return;
            }

            // Check whether file exists and if so, confirm overwrite
            final File localFile = new File(path);
            if (localFile.exists()) {
                MessageDialog overwriteDialog = new MessageDialog(shell,
                        HibernateConsoleMessages.AbstractQueryEditor_save_as, null,
                        MessageFormat.format(
                                HibernateConsoleMessages.AbstractQueryEditor_already_exists_do_you_want_to_replace_it,
                                path),
                        MessageDialog.WARNING,
                        new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL }, 1); // 'No' is the default
                if (overwriteDialog.open() != Window.OK) {
                    if (progressMonitor != null) {
                        progressMonitor.setCanceled(true);
                        return;
                    }
                }
            }

            IFileStore fileStore;
            try {
                fileStore = EFS.getStore(localFile.toURI());
            } catch (CoreException ex) {
                HibernateConsolePlugin.getDefault().log(ex.getStatus());
                String title = HibernateConsoleMessages.AbstractQueryEditor_problems_during_save_as;
                String msg = MessageFormat.format(
                        HibernateConsoleMessages.AbstractQueryEditor_save_could_not_be_completed, ex.getMessage());
                MessageDialog.openError(shell, title, msg);
                return;
            }

            IFile file = getWorkspaceFile(fileStore);
            if (file != null)
                newInput = new FileEditorInput(file);
            else
                newInput = new FileStoreEditorInput(fileStore);

        } else {
            SaveAsDialog dialog = new SaveAsDialog(shell);

            IFile original = (input instanceof IFileEditorInput) ? ((IFileEditorInput) input).getFile() : null;
            if (original != null) {
                dialog.setOriginalFile(original);
            } else {
                dialog.setOriginalName(getSaveAsFileExtension());
            }

            dialog.create();

            if (provider.isDeleted(input) && original != null) {
                String message = MessageFormat.format(
                        HibernateConsoleMessages.AbstractQueryEditor_the_original_file_has_been_deleted_or_is_not_accessible,
                        original.getName());
                dialog.setErrorMessage(null);
                dialog.setMessage(message, IMessageProvider.WARNING);
            }

            if (dialog.open() == Window.CANCEL) {
                if (progressMonitor != null)
                    progressMonitor.setCanceled(true);
                return;
            }

            IPath filePath = dialog.getResult();
            if (filePath == null) {
                if (progressMonitor != null)
                    progressMonitor.setCanceled(true);
                return;
            }

            IWorkspace workspace = ResourcesPlugin.getWorkspace();
            IFile file = workspace.getRoot().getFile(filePath);
            newInput = new FileEditorInput(file);

        }

        if (provider == null) {
            // editor has programmatically been  closed while the dialog was open
            return;
        }

        boolean success = false;
        try {

            provider.aboutToChange(newInput);
            provider.saveDocument(progressMonitor, newInput, provider.getDocument(input), true);
            success = true;

        } catch (CoreException x) {
            final IStatus status = x.getStatus();
            if (status == null || status.getSeverity() != IStatus.CANCEL) {
                String title = HibernateConsoleMessages.AbstractQueryEditor_problems_during_save_as;
                String msg = MessageFormat.format(
                        HibernateConsoleMessages.AbstractQueryEditor_save_could_not_be_completed, x.getMessage());
                MessageDialog.openError(shell, title, msg);
            }
        } finally {
            provider.changed(newInput);
            if (success)
                setInput(newInput);
        }

        if (progressMonitor != null)
            progressMonitor.setCanceled(!success);
    }

    /**
     * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#getWorkspaceFile(IFileStore)
     * the same PROTECTED method instead of PRIVATE
     */
    protected IFile getWorkspaceFile(IFileStore fileStore) {
        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
        IFile[] files = workspaceRoot.findFilesForLocationURI(fileStore.toURI());
        if (files != null && files.length == 1)
            return files[0];
        return null;
    }

    public boolean initTextAndToolTip(String text) {
        if (execAction != null) {
            execAction.initTextAndToolTip(text);
            return true;
        }
        return false;
    }

    public boolean getPinToOneResTab() {
        return pinToOneResTab;
    }

    public void setPinToOneResTab(boolean pinToOneResTab) {
        this.pinToOneResTab = pinToOneResTab;
    }
}