org.webcat.oda.designer.ognl.OgnlExpressionBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.webcat.oda.designer.ognl.OgnlExpressionBuilder.java

Source

/*==========================================================================*\
 |  $Id: OgnlExpressionBuilder.java,v 1.1 2010/05/11 15:52:46 aallowat Exp $
 |*-------------------------------------------------------------------------*|
 |  Copyright (C) 2006-2008 Virginia Tech
 |
 |  This file is part of Web-CAT.
 |
 |  Web-CAT is free software; you can redistribute it and/or modify
 |  it under the terms of the GNU Affero General Public License as published
 |  by the Free Software Foundation; either version 3 of the License, or
 |  (at your option) any later version.
 |
 |  Web-CAT 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 Affero General Public License
 |  along with Web-CAT; if not, see <http://www.gnu.org/licenses/>.
\*==========================================================================*/

package org.webcat.oda.designer.ognl;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.CompositeRuler;
import org.eclipse.jface.text.source.LineNumberRulerColumn;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.webcat.oda.designer.i18n.Messages;
import org.webcat.oda.designer.impl.WebCATKeyProvider;
import org.webcat.oda.designer.widgets.KeyPathBrowser;

//------------------------------------------------------------------------
/**
 * TODO: real description
 *
 * @author Tony Allevato (Virginia Tech Computer Science)
 * @version $Id: OgnlExpressionBuilder.java,v 1.1 2010/05/11 15:52:46 aallowat Exp $
 */
public class OgnlExpressionBuilder extends TitleAreaDialog {
    //~ Constructor ...........................................................

    // ----------------------------------------------------------
    /**
     *
     * @param parentShell
     * @param rootClass
     * @param initialExpr
     */
    public OgnlExpressionBuilder(Shell parentShell, String rootClass, String initialExpr) {
        super(parentShell);

        expression = initialExpr;
        rootClassName = rootClass;
        keyProvider = new WebCATKeyProvider();

        Font font = JFaceResources.getDefaultFont();
        FontData[] fd = font.getFontData();
        fd[0].setStyle(fd[0].getStyle() | SWT.BOLD);

        boldFont = new Font(parentShell.getDisplay(), fd[0]);
    }

    @Override
    protected void handleShellCloseEvent() {
        keyProvider.dispose();
        boldFont.dispose();

        super.handleShellCloseEvent();
    }

    //~ Methods ...............................................................

    // ----------------------------------------------------------
    /**
     *
     */
    protected void setShellStyle(int newShellStyle) {
        newShellStyle |= SWT.MAX | SWT.RESIZE;
        super.setShellStyle(newShellStyle);
    }

    // ----------------------------------------------------------
    /**
     *
     */
    @Override
    protected Control createContents(Composite parent) {
        Control control = super.createContents(parent);

        setTitle(Messages.EXPR_BUILDER_TITLE);
        setMessage(Messages.EXPR_BUILDER_PROMPT);

        return control;
    }

    // ----------------------------------------------------------
    /**
     *
     */
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);
        createToolbar(composite);

        SashForm sash = new SashForm(composite, SWT.VERTICAL | SWT.SMOOTH);
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        sash.setLayoutData(gd);

        createEditor(sash);
        createBrowser(sash);

        sash.setWeights(new int[] { 50, 50 });

        editor.getControl().setFocus();

        return composite;
    }

    // ----------------------------------------------------------
    private SelectionAdapter selectionAdapterForTemplate(final String template) {
        return new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                OgnlBuilderTemplates.insertTemplate(editor, template);
                editor.getControl().setFocus();
            }
        };
    }

    // ----------------------------------------------------------
    private void addTemplateButton(String title, String tooltip, String template) {
        ToolItem toolItem = new ToolItem(templateBar, SWT.PUSH);
        toolItem.setText(title);
        toolItem.setToolTipText(tooltip);
        toolItem.addSelectionListener(selectionAdapterForTemplate(template));
    }

    // ----------------------------------------------------------
    private void addTemplateSeparator() {
        new ToolItem(templateBar, SWT.SEPARATOR);
    }

    // ----------------------------------------------------------
    private void createTemplateMenu() {
        mathTemplateMenu = new Menu(templateBar);

        MenuItem item;

        item = new MenuItem(mathTemplateMenu, SWT.PUSH);
        item.setText("min"); //$NON-NLS-1$
        item.addSelectionListener(selectionAdapterForTemplate(OgnlBuilderTemplates.TEMPLATE_MIN));

        item = new MenuItem(mathTemplateMenu, SWT.PUSH);
        item.setText("max"); //$NON-NLS-1$
        item.addSelectionListener(selectionAdapterForTemplate(OgnlBuilderTemplates.TEMPLATE_MAX));

        item = new MenuItem(mathTemplateMenu, SWT.PUSH);
        item.setText("floor"); //$NON-NLS-1$
        item.addSelectionListener(selectionAdapterForTemplate(OgnlBuilderTemplates.TEMPLATE_FLOOR));

        item = new MenuItem(mathTemplateMenu, SWT.PUSH);
        item.setText("ceil"); //$NON-NLS-1$
        item.addSelectionListener(selectionAdapterForTemplate(OgnlBuilderTemplates.TEMPLATE_CEIL));

        item = new MenuItem(mathTemplateMenu, SWT.PUSH);
        item.setText("round"); //$NON-NLS-1$
        item.addSelectionListener(selectionAdapterForTemplate(OgnlBuilderTemplates.TEMPLATE_ROUND));

        item = new MenuItem(mathTemplateMenu, SWT.PUSH);
        item.setText("abs"); //$NON-NLS-1$
        item.addSelectionListener(selectionAdapterForTemplate(OgnlBuilderTemplates.TEMPLATE_ABS));

        item = new MenuItem(mathTemplateMenu, SWT.PUSH);
        item.setText("signum"); //$NON-NLS-1$
        item.addSelectionListener(selectionAdapterForTemplate(OgnlBuilderTemplates.TEMPLATE_SIGNUM));
    }

    // ----------------------------------------------------------
    /**
     *
     * @param parent
     */
    private void createToolbar(Composite parent) {
        GridData gd;

        Composite composite = new Composite(parent, SWT.NONE);
        gd = new GridData(SWT.FILL, SWT.TOP, true, false);
        GridLayout layout = new GridLayout(2, false);
        composite.setLayout(layout);

        Label label = new Label(composite, SWT.NONE);
        label.setText(Messages.EXPR_BUILDER_OGNL_TEMPLATES);
        gd = new GridData(SWT.FILL, SWT.CENTER, true, false);

        templateBar = new ToolBar(composite, SWT.FLAT | SWT.WRAP | SWT.TRAIL);
        gd = new GridData(SWT.FILL, SWT.TOP, true, true);
        templateBar.setLayoutData(gd);

        createTemplateMenu();

        final ToolItem toolItem = new ToolItem(templateBar, SWT.PUSH);
        toolItem.setText(Messages.EXPR_BUILDER_MATH);
        toolItem.setToolTipText(Messages.EXPR_BUILDER_MATH_TOOLTIP);
        toolItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                Point pt = templateBar.toDisplay(toolItem.getBounds().x,
                        toolItem.getBounds().y + toolItem.getBounds().height);
                mathTemplateMenu.setLocation(pt);
                mathTemplateMenu.setVisible(true);
            }
        });

        addTemplateSeparator();

        addTemplateButton(Messages.EXPR_BUILDER_LIST, Messages.EXPR_BUILDER_LIST_TOOLTIP,
                OgnlBuilderTemplates.TEMPLATE_LIST);

        addTemplateButton(Messages.EXPR_BUILDER_MAP, Messages.EXPR_BUILDER_MAP_TOOLTIP,
                OgnlBuilderTemplates.TEMPLATE_MAP);

        addTemplateSeparator();

        addTemplateButton(Messages.EXPR_BUILDER_SELECT_ALL, Messages.EXPR_BUILDER_SELECT_ALL_TOOLTIP,
                OgnlBuilderTemplates.TEMPLATE_SELECT_ALL);

        addTemplateButton(Messages.EXPR_BUILDER_SELECT_FIRST, Messages.EXPR_BUILDER_SELECT_FIRST_TOOLTIP,
                OgnlBuilderTemplates.TEMPLATE_SELECT_FIRST);

        addTemplateButton(Messages.EXPR_BUILDER_SELECT_LAST, Messages.EXPR_BUILDER_SELECT_LAST_TOOLTIP,
                OgnlBuilderTemplates.TEMPLATE_SELECT_LAST);

        addTemplateSeparator();

        addTemplateButton(Messages.EXPR_BUILDER_LAMBDA, Messages.EXPR_BUILDER_LAMBDA_TOOLTIP,
                OgnlBuilderTemplates.TEMPLATE_LAMBDA);
    }

    // ----------------------------------------------------------
    /**
     *
     * @param parent
     */
    private void createEditor(Composite parent) {
        GridLayout layout = new GridLayout();
        layout.marginWidth = layout.marginHeight = 0;

        Composite composite = new Composite(parent, SWT.BORDER | SWT.LEFT_TO_RIGHT);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        composite.setLayout(layout);

        CompositeRuler ruler = new CompositeRuler();
        ruler.addDecorator(0, new LineNumberRulerColumn());

        editor = new SourceViewer(composite, ruler, SWT.H_SCROLL | SWT.V_SCROLL);
        editor.configure(
                new OgnlSourceViewerConfiguration(new OgnlSyntaxContext(rootClassName, keyProvider, keyProvider)));

        if (expression != null) {
            OgnlEditorInput editorInput = new OgnlEditorInput(expression);
            OgnlDocumentProvider documentProvider = new OgnlDocumentProvider();

            try {
                documentProvider.connect(editorInput);
            } catch (CoreException e) {
                e.printStackTrace();
            }

            IDocument document = documentProvider.getDocument(editorInput);
            editor.setDocument(document);
        }

        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.heightHint = 144;
        editor.getControl().setLayoutData(gd);
    }

    // ----------------------------------------------------------
    /**
     *
     * @param parent
     */
    private void createBrowser(Composite parent) {
        GridLayout layout = new GridLayout();
        layout.marginWidth = layout.marginHeight = 0;

        Composite composite = new Composite(parent, SWT.BORDER | SWT.LEFT_TO_RIGHT);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        composite.setLayout(layout);

        GridData gd;

        Composite keyPathComposite = new Composite(composite, SWT.NONE);
        layout = new GridLayout(2, false);
        keyPathComposite.setLayout(layout);
        gd = new GridData(SWT.FILL, SWT.FILL, true, false);
        keyPathComposite.setLayoutData(gd);

        Label label = new Label(keyPathComposite, SWT.NONE);
        label.setFont(boldFont);
        label.setText(Messages.EXPR_BUILDER_CURRENT_KEY_PATH);
        gd = new GridData(SWT.LEFT, SWT.CENTER, false, false);
        label.setLayoutData(gd);

        selectedKeyPathLabel = new Label(keyPathComposite, SWT.NONE);
        gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
        selectedKeyPathLabel.setLayoutData(gd);

        browser = new KeyPathBrowser(composite, SWT.BORDER);
        gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.heightHint = 144;
        browser.setLayoutData(gd);
        browser.addSelectionListener(new SelectionListener() {
            public void widgetDefaultSelected(SelectionEvent e) {
                Point range = editor.getSelectedRange();

                try {
                    editor.getDocument().replace(range.x, range.y, browser.getSelectedKeyPath());
                    editor.getControl().setFocus();
                } catch (BadLocationException e1) {
                    // Ignore exception.
                }
            }

            public void widgetSelected(SelectionEvent e) {
                selectedKeyPathLabel.setText(browser.getSelectedKeyPath());
            }
        });

        browser.setKeyProvider(keyProvider);
        browser.setKeyLabelProvider(keyProvider);
        browser.setRootClassName(rootClassName);
    }

    // ----------------------------------------------------------
    /**
     *
     */
    protected void okPressed() {
        expression = editor.getTextWidget().getText().trim();
        super.okPressed();
    }

    // ----------------------------------------------------------
    /**
     * Gets the OGNL expression entered into the expression builder.
     *
     * @return the expression entered into the builder
     */
    public String getExpression() {
        return expression;
    }

    //~ Static/instance variables .............................................

    private Font boldFont;
    private ToolBar templateBar;
    private Menu mathTemplateMenu;
    private SourceViewer editor;
    private Label selectedKeyPathLabel;
    private String rootClassName;
    private WebCATKeyProvider keyProvider;
    private KeyPathBrowser browser;
    private String expression;
}