/*
* 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];
}
}