org.eclipse.recommenders.internal.snipmatch.rcp.editors.SnippetSourcePage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.recommenders.internal.snipmatch.rcp.editors.SnippetSourcePage.java

Source

/**
 * Copyright (c) 2010, 2013 Darmstadt University of Technology.
 * All rights reserved. This program and the accompanying materials
 * are 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
 *
 * Contributors:
 *      Marcel Bruch - Initial design and API
 */
package org.eclipse.recommenders.internal.snipmatch.rcp.editors;

import static org.eclipse.jface.databinding.swt.WidgetProperties.text;
import static org.eclipse.recommenders.internal.snipmatch.rcp.Constants.HELP_URL;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.recommenders.injection.InjectionService;
import org.eclipse.recommenders.internal.snipmatch.rcp.l10n.Messages;
import org.eclipse.recommenders.rcp.SharedImages;
import org.eclipse.recommenders.snipmatch.ISnippet;
import org.eclipse.recommenders.snipmatch.Location;
import org.eclipse.recommenders.snipmatch.Snippet;
import org.eclipse.recommenders.snipmatch.rcp.SnippetEditorInput;
import org.eclipse.recommenders.utils.rcp.Browsers;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.forms.AbstractFormPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;

public class SnippetSourcePage extends FormPage {

    private ISnippet snippet;
    private ScrolledForm form;
    private Text textWidget;
    private AbstractFormPart codePart;
    private DataBindingContext context;

    public SnippetSourcePage(FormEditor editor, String id, String title) {
        super(editor, id, title);
    }

    @Override
    protected void createFormContent(IManagedForm managedForm) {
        FormToolkit toolkit = managedForm.getToolkit();
        form = managedForm.getForm();

        createHeader(form);

        toolkit.decorateFormHeading(form.getForm());

        Composite body = form.getBody();
        toolkit.paintBordersFor(body);
        body.setLayout(new FillLayout(SWT.HORIZONTAL));

        codePart = new AbstractFormPart() {
            @Override
            public void initialize(IManagedForm managedForm) {
                super.initialize(managedForm);
                textWidget = managedForm.getToolkit().createText(managedForm.getForm().getBody(), snippet.getCode(),
                        SWT.WRAP | SWT.MULTI);
                textWidget.setFont(JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT));
            }

            @Override
            public void refresh() {
                context.updateTargets();
                super.refresh();
                updateMessage();
            }

            @Override
            public void commit(boolean onSave) {
                if (onSave) {
                    super.commit(onSave);
                }
            }

            @Override
            public void dispose() {
                context.dispose();
                super.dispose();
            }
        };
        managedForm.addPart(codePart);
        context = createDataBindingContext();
    }

    private void createHeader(ScrolledForm form) {
        form.setText(Messages.EDITOR_TITLE_RAW_SOURCE);
        SharedImages sharedImages = InjectionService.getInstance().getInjector().getInstance(SharedImages.class);

        Action showHelpAction = new Action(Messages.EDITOR_TOOLBAR_ITEM_HELP,
                sharedImages.getDescriptor(SharedImages.Images.ELCL_HELP)) {
            @Override
            public void run() {
                Browsers.tryOpenInExternalBrowser(HELP_URL);
            };
        };
        EditorUtils.addActionToForm(form, showHelpAction, Messages.EDITOR_TOOLBAR_ITEM_HELP);
    }

    @Override
    public void setFocus() {
        super.setFocus();
        textWidget.setFocus();
    }

    @Override
    public void init(IEditorSite site, IEditorInput input) {
        snippet = ((SnippetEditorInput) input).getSnippet();
        registerEditorInputListener();
        super.init(site, input);
    }

    private void registerEditorInputListener() {

        getEditor().addPropertyListener(new IPropertyListener() {

            @Override
            public void propertyChanged(Object source, int propId) {
                if (propId == PROP_INPUT) {
                    setInputWithNotify(getEditor().getEditorInput());
                }
            }
        });

    }

    @Override
    protected void setInputWithNotify(IEditorInput input) {
        snippet = ((SnippetEditorInput) input).getSnippet();
        context.dispose();
        context = createDataBindingContext();
        super.setInputWithNotify(input);
    }

    private void updateMessage() {
        final String sourceValid;
        if (snippet.getLocation() == Location.FILE) {
            sourceValid = TextSnippetSourceValidator.isSourceValid(textWidget.getText());
        } else {
            sourceValid = JavaSnippetSourceValidator.isSourceValid(textWidget.getText());
        }
        if (sourceValid.isEmpty()) {
            form.setMessage(null, IMessageProvider.NONE);
        } else {
            form.setMessage(sourceValid, IMessageProvider.ERROR);
        }
    }

    private DataBindingContext createDataBindingContext() {
        DataBindingContext ctx = new DataBindingContext();

        IObservableValue snippetBeanCode = BeanProperties.value(Snippet.class, "code", String.class) //$NON-NLS-1$
                .observe(snippet);
        IObservableValue textWidgetCode = text(SWT.Modify).observe(textWidget);

        ctx.bindValue(textWidgetCode, snippetBeanCode);

        snippetBeanCode.addChangeListener(new IChangeListener() {

            @Override
            public void handleChange(ChangeEvent event) {
                if (!textWidget.getText().equals(snippet.getCode())) {
                    codePart.markStale();
                } else {
                    codePart.markDirty();
                }
                updateMessage();
            }
        });
        return ctx;
    }
}