org.dawnsci.marketplace.ui.editors.DescriptionSection.java Source code

Java tutorial

Introduction

Here is the source code for org.dawnsci.marketplace.ui.editors.DescriptionSection.java

Source

/*****************************************************************************
 * Copyright (c) 2016 Diamond Light Source Ltd.
 * 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:
 *    Torkild U. Resheim - initial API and implementation
 ****************************************************************************/
package org.dawnsci.marketplace.ui.editors;

import java.util.Iterator;

import org.dawnsci.marketplace.MarketplacePackage.Literals;
import org.dawnsci.marketplace.Node;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.databinding.EMFObservables;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.source.AnnotationModel;
import org.eclipse.jface.text.source.IAnnotationAccess;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.mylyn.commons.workbench.editors.CommonTextSupport;
import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
import org.eclipse.mylyn.wikitext.markdown.core.MarkdownLanguage;
import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewer;
import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewerConfiguration;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.texteditor.AnnotationPreference;
import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess;
import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;
import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;

public class DescriptionSection extends SectionPart {

    private MarkupSourceViewer markupViewer;
    private IEditorSite site;
    private Node solution;

    public DescriptionSection(Composite parent, FormToolkit toolkit, int style, IEditorSite site) {
        super(parent, toolkit, style);
        this.site = site;
        createClient(getSection(), toolkit);
    }

    /**
     * Fill the section.
     */
    private void createClient(Section section, FormToolkit toolkit) {
        Composite container = toolkit.createComposite(section);

        section.setClient(container);

        container.setLayout(new GridLayout());

        MarkupLanguage language = new MarkdownLanguage();
        markupViewer = new MarkupSourceViewer(container, null, SWT.WRAP | SWT.V_SCROLL, language);
        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        markupViewer.getControl().setLayoutData(gridData);

        MarkupSourceViewerConfiguration configuration = new MarkupSourceViewerConfiguration(
                EditorsUI.getPreferenceStore());

        Font font = JFaceResources.getTextFont();
        markupViewer.getTextWidget().setFont(font);

        configuration.setMarkupLanguage(language);
        markupViewer.configure(configuration);
        markupViewer.setEditable(true);

        markupViewer.getTextWidget().setData("textViewer", markupViewer);
        markupViewer.getTextWidget().setData(MarkupLanguage.class.getName(), language);
        markupViewer.getTextWidget().setData(ISourceViewer.class.getName(), markupViewer);

        // install common text support such as content assist
        IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
        CommonTextSupport textSupport = new CommonTextSupport(handlerService);
        textSupport.install(markupViewer, true);

        getSite().setSelectionProvider(markupViewer.getSelectionProvider());
        configure(markupViewer, new Document());
    }

    private void configure(MarkupSourceViewer viewer, Document document) {
        AnnotationModel annotationModel = new AnnotationModel();
        viewer.showAnnotations(false);
        viewer.showAnnotationsOverview(false);
        IAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess();
        final SourceViewerDecorationSupport support = new SourceViewerDecorationSupport(viewer, null,
                annotationAccess, EditorsUI.getSharedTextColors());
        Iterator<?> e = new MarkerAnnotationPreferences().getAnnotationPreferences().iterator();
        while (e.hasNext()) {
            support.setAnnotationPreference((AnnotationPreference) e.next());
        }
        support.install(EditorsUI.getPreferenceStore());
        viewer.getTextWidget().addDisposeListener(new DisposeListener() {
            @Override
            public void widgetDisposed(DisposeEvent e) {
                support.uninstall();
            }
        });
        viewer.setDocument(document, annotationModel);
    }

    private IEditorSite getSite() {
        return site;
    }

    @Override
    public boolean setFormInput(Object input) {
        this.solution = (Node) input;
        initDataBindings();
        return true;
    }

    protected DataBindingContext initDataBindings() {
        DataBindingContext bindingContext = new DataBindingContext();
        //
        IObservableValue observeTextTxtLogoFilePathObserveWidget = WidgetProperties.text(SWT.Modify)
                .observe(markupViewer.getTextWidget());
        IObservableValue solutionImageObserveValue = EMFObservables.observeValue(solution, Literals.NODE__RAW_BODY);
        bindingContext.bindValue(observeTextTxtLogoFilePathObserveWidget, solutionImageObserveValue, null, null);
        //
        return bindingContext;
    }

}