eu.esdihumboldt.hale.ui.style.dialog.XMLStylePage3.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.ui.style.dialog.XMLStylePage3.java

Source

/*
 * Copyright (c) 2012 Data Harmonisation Panel
 * 
 * All rights reserved. This program and the accompanying materials are made
 * available under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     HUMBOLDT EU Integrated Project #030962
 *     Data Harmonisation Panel <http://www.dhpanel.eu>
 */
package eu.esdihumboldt.hale.ui.style.dialog;

import java.io.StringReader;

import javax.xml.transform.TransformerException;

import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.jface.text.source.CompositeRuler;
import org.eclipse.jface.text.source.LineNumberRulerColumn;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.styling.SLDParser;
import org.geotools.styling.SLDTransformer;
import org.geotools.styling.Style;
import org.geotools.styling.StyleFactory;

import eu.esdihumboldt.hale.ui.style.internal.Messages;

/**
 * Page for editing a style as XML
 * 
 * @author Simon Templer
 * @partner 01 / Fraunhofer Institute for Computer Graphics Research
 */
public class XMLStylePage3 extends FeatureStylePage {

    private final StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(null);

    private SourceViewer viewer;

    private boolean changed = false;

    /**
     * Create a XML style editor page
     * 
     * @param parent the parent dialog
     */
    public XMLStylePage3(FeatureStyleDialog parent) {
        super(parent, Messages.XMLStylePage3_SuperTitle);
    }

    /**
     * @see IDialogPage#createControl(Composite)
     */
    @Override
    public void createControl(Composite parent) {
        changed = false;

        final Display display = parent.getDisplay();

        FillLayout fillLayout = new FillLayout();
        fillLayout.type = SWT.VERTICAL;
        parent.setLayout(fillLayout);

        CompositeRuler ruler = new CompositeRuler(3);
        LineNumberRulerColumn lineNumbers = new LineNumberRulerColumn();
        lineNumbers.setBackground(display.getSystemColor(SWT.COLOR_GRAY)); // SWT.COLOR_INFO_BACKGROUND));
        lineNumbers.setForeground(display.getSystemColor(SWT.COLOR_BLACK)); // SWT.COLOR_INFO_FOREGROUND));
        lineNumbers.setFont(JFaceResources.getTextFont());
        ruler.addDecorator(0, lineNumbers);

        viewer = new SourceViewer(parent, ruler, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);

        viewer.getTextWidget().setFont(JFaceResources.getTextFont());

        SourceViewerConfiguration conf = new SourceViewerConfiguration();
        viewer.configure(conf);

        SLDTransformer trans = new SLDTransformer();
        trans.setIndentation(2);
        String xml;
        try {
            xml = trans.transform(getParent().getStyle());
        } catch (TransformerException e) {
            xml = "Error: " + e.getMessage(); //$NON-NLS-1$
        }
        IDocument doc = new Document();
        doc.set(xml);
        doc.addDocumentListener(new IDocumentListener() {

            @Override
            public void documentChanged(DocumentEvent event) {
                changed = true;
            }

            @Override
            public void documentAboutToBeChanged(DocumentEvent event) {
                // ignore
            }
        });
        viewer.setInput(doc);

        setControl(viewer.getControl());
    }

    /**
     * @see FeatureStylePage#getStyle(boolean)
     */
    @Override
    public Style getStyle(boolean force) throws Exception {
        if (viewer == null || (!force && !changed)) {
            return null;
        }

        IDocument doc = viewer.getDocument();

        SLDParser parser = new SLDParser(styleFactory, new StringReader(doc.get()));
        Style[] styles = parser.readXML();

        return styles[0];
    }

}