|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.xml.core; import java.beans.*; import javax.xml.transform.Source; import org.xml.sax.*; import org.openide.awt.HtmlBrowser; import org.openide.filesystems.*; import org.openide.loaders.*; import org.openide.util.*; import org.openide.nodes.*; import org.openide.cookies.*; import org.openide.actions.*; import org.openide.windows.CloneableOpenSupport; import org.openide.util.actions.SystemAction; import org.netbeans.modules.xml.core.text.TextEditorSupport; import org.netbeans.modules.xml.core.sync.*; import org.netbeans.modules.xml.core.cookies.*; import org.netbeans.modules.xml.core.settings.*; import org.netbeans.spi.xml.cookies.*; /** Object that provides main functionality for xml document. * Instance holds all synchronization related state information. * This class is final only for performance reasons, * can be unfinaled if desired. * * @author Libor Kramolis */ public final class XMLDataObject extends org.openide.loaders.XMLDataObject implements XMLDataObjectLook, PropertyChangeListener { /** Serial Version UID */ private static final long serialVersionUID = 9153823984913876866L; /** Default XML Mime Type. */ public static final String MIME_TYPE = "text/xml"; // NOI18N /** Synchronization implementation delegate. */ private XMLSyncSupport sync; /** Cookie Manager */ private final DataObjectCookieManager cookieManager; // // init // /** Create new XMLDataObject * * @param fo the primary file object * @param loader loader of this data object */ public XMLDataObject (final FileObject fo, MultiFileLoader loader) throws DataObjectExistsException { super (fo, loader); CookieSet set = getCookieSet(); set.add (cookieManager = new DataObjectCookieManager (this, set)); sync = new XMLSyncSupport(this); TextEditorSupport.TextEditorSupportFactory editorFactory = TextEditorSupport.findEditorSupportFactory (this, MIME_TYPE); editorFactory.registerCookies (set); CookieSet.Factory viewCookieFactory = new ViewCookieFactory(); set.add (ViewCookie.class, viewCookieFactory); InputSource is = DataObjectAdapters.inputSource (this); // add check and validate cookies set.add (new CheckXMLSupport (is)); set.add (new ValidateXMLSupport (is)); // add TransformableCookie Source source = DataObjectAdapters.source (this); set.add (new TransformableSupport (source)); // add Scenario support set.add (new ScenarioSupport (this)); new CookieManager (this, set, XMLCookieFactoryCreator.class); this.addPropertyChangeListener (this); //??? - strange be aware of firing cycles } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * DATAOBJECT stuff * cookie management * node delegate * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /** */ protected Node createNodeDelegate () { if ( Util.THIS.isLoggable() ) /* then */ Util.THIS.debug ("--> XMLDataObject.createNodeDelegate: this = " + this); DataNodeCreator dataNodeCreator = (DataNodeCreator) Lookup.getDefault().lookup (DataNodeCreator.class); Node dataNode = null; if ( Util.THIS.isLoggable() ) /* then */ Util.THIS.debug ("-*- XMLD O .createNodeDelegate: dataNodeCreator = " + dataNodeCreator); if ( dataNodeCreator != null ) { dataNode = dataNodeCreator.createDataNode (this); } else { dataNode = new XMLDataNode (this); } if ( Util.THIS.isLoggable() ) /* then */ Util.THIS.debug ("<-- XMLDataObject.createNodeDelegate: dataNode = " + dataNode); return dataNode; } /** * Get 'semantics' node delegate from superclass. */ Node createDefaultNodeDelegate () { return super.createNodeDelegate(); //it is a FilterNode } // it is called by super class constructor protected EditorCookie createEditorCookie () { return null; } /** Delegate to super with possible debug messages. */ public void setModified (boolean state) { if ( Util.THIS.isLoggable() ) /* then */ Util.THIS.debug ("XMLDataObject:setModified: state = " + state); // NOI18N super.setModified (state); } /** Delegate to super with possible debug messages. */ public org.openide.nodes.Node.Cookie getCookie(Class klass) { Node.Cookie cake = null; boolean change = false; if (SaveCookie.class.equals (klass) ) { if ( Util.THIS.isLoggable() ) /* then */ Util.THIS.debug ("XMLDataObject::getCookie");//, new RuntimeException ("Save cookie check")); // NOI18N } // take lock to prevent deadlock on cookie set that can be called // from other thread during cookie removal synchronized (this) { cake = super.getCookie (klass); if ( ( cake == null ) && ( CloneableOpenSupport.class == klass ) ) { //!!! HACK -- backward compatibility cake = super.getCookie (OpenCookie.class); } } if ( Util.THIS.isLoggable() ) /* then */ Util.THIS.debug ("XMLDataOObject::getCookie: class = " + klass + " => " + cake); // NOI18N return cake; } public DataObjectCookieManager getCookieManager() { return cookieManager; } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * UPDATE section * handles updating one representation by changed another one * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // // from XMLDataObjectLook // public void updateTextDocument () { // EditorCookie es = (EditorCookie)getCookie (EditorCookie.class); // if (es != null) { // es.close(); // } // } /** TREE -> TEXT * Updates document by content of parsed tree based on the * last document version. * Note: the tree is always maximum valid part of document. * It takes parsed tree as primary data model. IT MUST CHANGE * tree must contain an error element. */ public synchronized void updateDocument () { //!!! to be implemented without dependency on tree Thread.dumpStack(); // sync.representationChanged(TreeDocument.class); //!!! } public Synchronizator getSyncInterface() { return sync; } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * LISTENERS section * handlers of various listeners attached by this DataObject * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /** * File was externaly modified, detected by OpenIDE DataObject. */ public void propertyChange (PropertyChangeEvent e) { if ( Util.THIS.isLoggable() ) /* then */ Util.THIS.debug ("event " + e.getPropertyName()); // NOI18N if (org.openide.loaders.XMLDataObject.PROP_DOCUMENT.equals (e.getPropertyName())) { // filter out uninteresting events if (e.getOldValue() == e.getNewValue()) return; //e.g. null == null sync.representationChanged(FileObject.class); } } public HelpCtx getHelpCtx() { //return new HelpCtx(XMLDataObject.class); return HelpCtx.DEFAULT_HELP; } // // class XMLDataNode // /** * */ public static class XMLDataNode extends DataNode { /** Create new XMLDataNode. */ public XMLDataNode (XMLDataObject obj) { super (obj, Children.LEAF); setIconBase ("org/netbeans/modules/xml/core/resources/xmlObject"); // NOI18N setShortDescription (Util.THIS.getString ("PROP_XMLDataNode_description")); } public SystemAction getDefaultAction() { CoreSettings settings = CoreSettings.getDefault(); SystemAction actions[] = getActions(); SystemAction system = SystemAction.get (EditAction.class); return settings.getDefaultAction (actions, system); } } // end of class XMLDataNode // // class ViewCookieFactory // /** * */ private class ViewCookieFactory implements CookieSet.Factory { /** Creates new Cookie */ public Node.Cookie createCookie (Class klass) { if (klass == ViewCookie.class) { return new ViewSupport (XMLDataObject.this.getPrimaryEntry()); } else { return null; } } } // end of class ViewCookieFactory // // class ViewSupport // /** * */ private static final class ViewSupport implements ViewCookie { /** entry */ private MultiDataObject.Entry primary; /** Constructs new ViewSupport */ public ViewSupport (MultiDataObject.Entry primary) { this.primary = primary; } /** */ public void view () { try { HtmlBrowser.URLDisplayer.getDefault().showURL(primary.getFile().getURL()); } catch (FileStateInvalidException e) { } } } // end of class ViewSupport // // interface DataNodeCreator // /** * */ public static interface DataNodeCreator { /** */ public DataNode createDataNode (XMLDataObject xmlDO); } // end of interface DataNodeCreator // // interface XMLCookieFactoryCreator // /** * */ public static interface XMLCookieFactoryCreator extends CookieFactoryCreator { } // end: interface XMLCookieFactoryCreator } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.