blob: 727329abfd3749d8ec0f3e841f5c7a11b1bbf00d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Jens Lukowski/Innoopract - initial renaming/restructuring
*
*******************************************************************************/
package org.eclipse.wst.dtd.core.internal.document;
import java.io.File;
import java.util.Iterator;
import java.util.Vector;
import org.eclipse.wst.dtd.core.internal.DTDFile;
import org.eclipse.wst.dtd.core.internal.DTDNode;
import org.eclipse.wst.dtd.core.internal.Entity;
import org.eclipse.wst.dtd.core.internal.NodeList;
import org.eclipse.wst.dtd.core.internal.event.IDTDFileListener;
import org.eclipse.wst.dtd.core.internal.event.NodesEvent;
import org.eclipse.wst.dtd.core.internal.provisional.document.DTDModel;
import org.eclipse.wst.dtd.core.internal.util.DTDReferenceUpdater;
import org.eclipse.wst.dtd.core.internal.util.LabelValuePair;
import org.eclipse.wst.sse.core.internal.model.AbstractStructuredModel;
import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
import org.eclipse.wst.sse.core.internal.provisional.events.IStructuredDocumentListener;
import org.eclipse.wst.sse.core.internal.provisional.events.NewDocumentEvent;
import org.eclipse.wst.sse.core.internal.provisional.events.NoChangeEvent;
import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;
import org.eclipse.wst.sse.core.internal.provisional.events.RegionsReplacedEvent;
import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
public final class DTDModelImpl extends AbstractStructuredModel implements IStructuredDocumentListener, DTDModel {
public static boolean deleteFile(String fileName) {
boolean result = false;
// create the temp File object
File file = new File(fileName);
if (file.exists())
result = file.delete();
return result;
}
private DTDFile document;
// private List errorMessages = new ArrayList();
// entity reference names found in the conditional IGNORE sections
private Vector ignoredEntityRefs;
private boolean refreshRequired = false;
protected DTDReferenceUpdater refUpdater = new DTDReferenceUpdater();
public DTDModelImpl() {
super();
document = new DTDFile(this);
document.addDTDFileListener(new IDTDFileListener() {
public void nodeChanged(DTDNode node) {
if (node instanceof Entity) {
Entity entity = (Entity) node;
if (entity.isParameterEntity() && entity.isExternalEntity()) {
// just say they have changed for now
setReferencedModelsChanged();
}
}
}
public void nodesAdded(NodesEvent event) {
checkIfExternalReferencesChanged(event);
}
public void nodesRemoved(NodesEvent event) {
checkIfExternalReferencesChanged(event);
}
});
}
public void beginRecording(Object requester, String label) {
super.beginRecording(requester, label);
// clear reference updater cache
getReferenceUpdater().clearCache();
}
void checkIfExternalReferencesChanged(NodesEvent event) {
Iterator iter = event.getNodes().iterator();
while (iter.hasNext()) {
DTDNode node = (DTDNode) iter.next();
if (node instanceof Entity) {
Entity entity = (Entity) node;
if (entity.isParameterEntity() && entity.isExternalEntity()) {
// just say they have changed for now
setReferencedModelsChanged();
}
}
}
}
//
// The following function helps determine the list of things that
// can be used in a parameter entity reference content
// Optional parameter is to allow the currently used DTDEntity to
// be included in the combobox.
//
public LabelValuePair[] createParmEntityContentItems(Entity entity) {
NodeList entities = getDTDFile().getEntities();
Vector items = new Vector();
if (entity != null) {
String name = "%" + entity.getName() + ";"; //$NON-NLS-1$ //$NON-NLS-2$
items.addElement(new LabelValuePair(name, name));
}
for (Iterator i = entities.getNodes().iterator(); i.hasNext();) {
Entity entityAt = (Entity) i.next();
if (entityAt.isParameterEntity() && entityAt.isExternalEntity()) {
String name = "%" + entityAt.getName() + ";"; //$NON-NLS-1$ //$NON-NLS-2$
items.addElement(new LabelValuePair(name, name));
}
}
LabelValuePair[] comboArray = new LabelValuePair[items.size()];
items.copyInto(comboArray);
return comboArray;
}
public void endRecording(Object requester) {
super.endRecording(requester);
// clear reference updater cache
getReferenceUpdater().clearCache();
}
public DTDFile getDTDFile() {
return document;
}
// Returns entity reference names that are in
// the conditional IGNORE sections.
public Vector getIgnoredEntityRefs() {
if (ignoredEntityRefs == null)
ignoredEntityRefs = new Vector();
return ignoredEntityRefs;
}
public IndexedRegion getIndexedRegion(int offset) {
if (this.document == null)
return null;
// System.out.println("getNode at " + offset + " returning = " +
// this.document.getNodeAt(offset));
return this.document.getNodeAt(offset);
}
public DTDReferenceUpdater getReferenceUpdater() {
return refUpdater;
}
public boolean isReferencedModelsChanged() {
return refreshRequired;
}
public boolean isRefreshRequired() {
return refreshRequired;
}
public void newModel(NewDocumentEvent flatModelEvent) {
document.newModel(flatModelEvent);
// System.out.println("\nnewmodel");
outputStructuredDocument(flatModelEvent);
}
public void noChange(NoChangeEvent flatModelEvent) {
// System.out.println("\nnochange");
outputStructuredDocument(flatModelEvent);
}
public void nodesReplaced(StructuredDocumentRegionsReplacedEvent flatModelEvent) {
// System.out.println("\nnodesreplaced");
document.nodesReplaced(flatModelEvent);
outputStructuredDocument(flatModelEvent);
}
public void outputStructuredDocument(StructuredDocumentEvent flatModelEvent) {
// System.out.println("structuredDocument source = '" +
// flatModelEvent.getStructuredDocument().getText() + "'");
// System.out.println("new String = '" +
// flatModelEvent.getOriginalChanges() +"'");
// System.out.println("deleted String = '" +
// flatModelEvent.getDeletedText() +"'");
// Enumeration e =
// flatModelEvent.getStructuredDocument().getNodes().elements();
// int i = 0;
// for (; e.hasMoreElements(); i++)
// {
// BasicStructuredDocumentRegion node =
// (BasicStructuredDocumentRegion) e.nextElement();
// outputStructuredDocumentRegion(node);
// System.out.println(" " + i +". " + node.hashCode() + " '"
// +node.getText() + "'");
// }
}
public void outputStructuredDocumentRegion(IStructuredDocumentRegion flatNode) {
// int size = flatNode.getNumberOfRegions();
// for (int i = 0; i < size; i++)
// {
// Region region = (Region) flatNode.getRegions().get(i);
// System.out.println(i + ". " + region.getType());
// } // end of for ()
}
public void regionChanged(RegionChangedEvent flatModelEvent) {
// System.out.println("\nregion changed");
document.regionChanged(flatModelEvent);
// System.out.println("= " +
// flatModelEvent.getStructuredDocumentRegion().getText());
// System.out.println("region changed " +
// flatModelEvent.getRegion().hashCode() + " = " +
// flatModelEvent.getRegion());
outputStructuredDocument(flatModelEvent);
}
public void regionsReplaced(RegionsReplacedEvent flatModelEvent) {
// System.out.println("\nregion replaced");
document.regionsReplaced(flatModelEvent);
outputStructuredDocument(flatModelEvent);
}
public void setReferencedModelsChanged() {
refreshRequired = true;
}
public void setRefreshRequired(boolean value) {
refreshRequired = value;
}
/**
* @param newStructuredDocument
* org.eclipse.wst.sse.core.text.IStructuredDocument
*/
public void setStructuredDocument(IStructuredDocument newStructuredDocument) {
IStructuredDocument oldStructuredDocument = super.getStructuredDocument();
if (newStructuredDocument == oldStructuredDocument)
return; // noting to do
if (oldStructuredDocument != null)
oldStructuredDocument.removeDocumentChangingListener(this);
super.setStructuredDocument(newStructuredDocument);
if (newStructuredDocument != null) {
if (newStructuredDocument.getLength() > 0) {
newModel(new NewDocumentEvent(newStructuredDocument, this));
}
newStructuredDocument.addDocumentChangingListener(this);
}
}
}