/*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at http://www.netbeans.org/cddl.html
* or http://www.netbeans.org/cddl.txt.
*
* When distributing Covered Code, include this CDDL Header Notice in each file
* and include the License file at http://www.netbeans.org/cddl.txt.
* If applicable, add the following below the CDDL Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*/
package com.nanosn.netbeans.gwtxml;
import com.nanosn.netbeans.gwtxml.gwtmodule.Module;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.Writer;
import org.netbeans.api.xml.cookies.CheckXMLCookie;
import org.netbeans.api.xml.cookies.ValidateXMLCookie;
import org.netbeans.modules.schema2beans.Schema2BeansException;
import org.netbeans.modules.xml.multiview.DesignMultiViewDesc;
import org.netbeans.modules.xml.multiview.XmlMultiViewDataObject;
import org.netbeans.modules.xml.multiview.XmlMultiViewDataSynchronizer;
import org.netbeans.spi.xml.cookies.CheckXMLSupport;
import org.netbeans.spi.xml.cookies.DataObjectAdapters;
import org.netbeans.spi.xml.cookies.ValidateXMLSupport;
import org.openide.ErrorManager;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataObjectExistsException;
import org.openide.loaders.MultiFileLoader;
import org.openide.nodes.CookieSet;
import org.openide.nodes.Node;
import org.openide.util.NbBundle;
import org.xml.sax.InputSource;
public class GwtXmlDataObject extends XmlMultiViewDataObject {
private static final long serialVersionUID = 1;
private ModelSynchronizer modelSynchronizer;
Module module;
public GwtXmlDataObject(FileObject pf,
MultiFileLoader loader) throws DataObjectExistsException,
IOException {
super(pf, loader);
modelSynchronizer = new ModelSynchronizer(this);
InputSource in = DataObjectAdapters.inputSource(this);
CheckXMLCookie checkCookie = new CheckXMLSupport(in);
CookieSet cookies = getCookieSet();
cookies.add(checkCookie);
ValidateXMLCookie validateCookie = new ValidateXMLSupport(in);
cookies.add(validateCookie);
try {
parseDocument();
}
catch (IOException ex) {
System.out.println("ex=" + ex); // NOI18N
}
}
@Override
protected Node createNodeDelegate() {
//TODO
return new GwtModuleDataNode(this);
}
private void parseDocument() throws IOException {
if (module == null) {
module = getModule();
}
else {
java.io.InputStream is = getEditorSupport().getInputStream();
Module newModule = null;
try {
newModule = Module.createGraph(is);
}
catch (RuntimeException ex) {
System.out.println("runtime error " + ex); // NOI18N
}
if (newModule != null) {
module.merge(newModule,
org.netbeans.modules.schema2beans.BaseBean.MERGE_UPDATE);
}
}
}
public Module getModule() throws IOException {
if (module == null) {
final FileObject fo = getPrimaryFile();
InputStream is = fo.getInputStream();
try {
module = Module.createGraph(is, false);
} finally {
is.close();
}
}
return module;
}
@Override
protected DesignMultiViewDesc[] getMultiViewDesc() {
return new DesignMultiViewDesc[]{
new GeneralView(this), // new CompilerView(this)
};
}
// <editor-fold desc="DesignView Class">
private static class GeneralView extends DesignMultiViewDesc {
private static final long serialVersionUID = 1;
GeneralView(GwtXmlDataObject dObj) {
super(dObj, NbBundle.getMessage(
GwtXmlDataObject.class, "GENERAL")); // NOI18N
}
public org.netbeans.core.spi.multiview.MultiViewElement createElement() {
GwtXmlDataObject dObj = (GwtXmlDataObject) getDataObject();
// if (type==TYPE_TOOLBAR) return new BookToolBarMVElement(dObj);
// else return new BookTreePanelMVElement(dObj);
return new GwtxmlToolBarMultiViewElement(dObj);
}
public java.awt.Image getIcon() {
return org.openide.util.ImageUtilities.loadImage("org/netbeans/modules/gwt4nb/gwticon.png"); // NOI18N
}
public String preferredID() {
return "gwtxml_multiview_design"; // NOI18N
}
}
private static class CompilerView extends DesignMultiViewDesc {
private static final long serialVersionUID = 1;
CompilerView(GwtXmlDataObject dObj) {
super(dObj, NbBundle.getMessage(
GwtXmlDataObject.class, "COMPILER")); // NOI18N
}
public org.netbeans.core.spi.multiview.MultiViewElement createElement() {
GwtXmlDataObject dObj = (GwtXmlDataObject) getDataObject();
// if (type==TYPE_TOOLBAR) return new BookToolBarMVElement(dObj);
// else return new BookTreePanelMVElement(dObj);
return new GwtxmlToolBarMultiViewElement(dObj);
}
public java.awt.Image getIcon() {
return org.openide.util.ImageUtilities.loadImage(
"org/netbeans/modules/gwt4nb/gwticon.png"); // NOI18N
}
public String preferredID() {
return "gwtxml_multiview_compiler"; // NOI18N
}
}
// </editor-fold>
public void modelUpdatedFromUI() {
modelSynchronizer.requestUpdateData();
}
@Override
protected String getPrefixMark() {
return null;
}
// <editor-fold desc="Model Synchronizer Class">
private class ModelSynchronizer extends XmlMultiViewDataSynchronizer {
private static final long serialVersionUID = 1;
public ModelSynchronizer(XmlMultiViewDataObject dataObject) {
super(dataObject, 500);
}
protected boolean mayUpdateData(boolean allowDialog) {
return true;
}
protected void updateDataFromModel(Object model, org.openide.filesystems.FileLock lock, boolean modify) {
if (model == null) {
return;
}
try {
Writer out = new StringWriter();
((Module) model).write(out);
out.close();
getDataCache().setData(lock, out.toString(), modify);
}
catch (IOException e) {
ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e);
}
catch (Schema2BeansException e) {
ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e);
}
}
protected Object getModel() {
try {
return getModule();
}
catch (IOException e) {
ErrorManager.getDefault().notify(org.openide.ErrorManager.INFORMATIONAL, e);
return null;
}
}
protected void reloadModelFromData() {
try {
parseDocument();
}
catch (IOException e) {
ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e);
}
}
}
// </editor-fold>
}