package org.xmind.core.internal.dom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.w3c.dom.Element;
import org.xmind.core.Core;
import org.xmind.core.ISettingEntry;
import org.xmind.core.ISheet;
import org.xmind.core.IWorkbook;
import org.xmind.core.event.CoreEvent;
import org.xmind.core.internal.ElementRegistry;
import org.xmind.core.internal.SheetSettings;
import org.xmind.core.util.DOMUtils;
/**
* @author Jason Wong
* @since 3.6.50
*/
public class SheetSettingsImpl extends SheetSettings {
private Element implementation;
private SheetImpl ownedSheet;
private ElementRegistry elementRegistry;
public SheetSettingsImpl(Element implementation, SheetImpl ownedSheet) {
super();
this.implementation = implementation;
this.ownedSheet = ownedSheet;
}
/*
* (non-Javadoc)
*
* @see org.xmind.core.ISheetSettings#getPaths()
*/
public Set<String> getPaths() {
HashSet<String> paths = new HashSet<String>();
Element e = DOMUtils.getFirstChildElementByTag(implementation,
DOMConstants.TAG_SHEET_SETTINGS);
if (e == null)
return paths;
collectPaths(paths, e, null);
return paths;
}
private void collectPaths(Set<String> paths, Element p, String path) {
Iterator<Element> childIt = DOMUtils.childElementIter(p);
if (childIt.hasNext()) {
while (childIt.hasNext()) {
Element c = childIt.next();
String subTag = c.getTagName();
String subPath = path == null ? subTag : path + SEP + subTag;
collectPaths(paths, c, subPath);
}
} else {
if (path != null) {
paths.add(path);
}
}
}
public List<ISettingEntry> getEntries(String path) {
if (path == null || "".equals(path)) //$NON-NLS-1$
return Collections.emptyList();
Element e = DOMUtils.getFirstChildElementByTag(implementation,
DOMConstants.TAG_SHEET_SETTINGS);
if (e == null)
return Collections.emptyList();
String[] keys = path.split(SEP);
if (keys.length > 0) {
String endKey = keys[keys.length - 1];
Element c = null;
for (String key : keys) {
if (key != endKey) {
c = DOMUtils.getFirstChildElementByTag(e, key);
if (c == null)
break;
e = c;
} else {
List<ISettingEntry> entries = new ArrayList<ISettingEntry>();
Iterator<Element> es = DOMUtils.childElementIterByTag(e,
key);
while (es.hasNext()) {
Element entryEle = es.next();
ISettingEntry entry = getEntry(entryEle, path);
if (entry != null)
entries.add(entry);
}
return entries;
}
}
}
return Collections.emptyList();
}
protected SettingEntryImpl getEntry(Element entryEle, String path) {
if (elementRegistry != null) {
Object entry = elementRegistry.getElement(entryEle);
if (entry != null && entry instanceof ISettingEntry)
return (SettingEntryImpl) entry;
}
SettingEntryImpl entry = new SettingEntryImpl(entryEle, path,
ownedSheet);
getElementRegistry().registerByKey(entryEle, entry);
return entry;
}
public ISettingEntry createEntry(String path) {
if (path != null) {
String[] keys = path.split(SEP);
if (keys.length > 0) {
String tag = keys[keys.length - 1];
Element entryEle = implementation.getOwnerDocument()
.createElement(tag);
SettingEntryImpl entry = new SettingEntryImpl(entryEle, path,
ownedSheet);
getElementRegistry().registerByKey(entryEle, entry);
return entry;
}
}
return null;
}
public void addEntry(ISettingEntry entry) {
SettingEntryImpl entryImpl = (SettingEntryImpl) entry;
String path = entryImpl.getPath();
String[] keys = path.split(SEP);
String lastKey = keys[keys.length - 1];
Element p = DOMUtils.ensureChildElement(implementation,
DOMConstants.TAG_SHEET_SETTINGS);
for (String key : keys) {
if (key != lastKey) {
p = DOMUtils.ensureChildElement(p, key);
} else {
p.appendChild(entryImpl.getImplementation());
for (String attrKey : entry.getAttributeKeys()) {
CoreEvent event = new CoreEvent(ownedSheet,
Core.SheetSettings, attrKey, null,
entry.getAttribute(attrKey));
event.setData(path);
ownedSheet.getCoreEventSupport().dispatch(ownedSheet,
event);
}
}
}
}
public void removeEntry(ISettingEntry entry) {
Element settingsEle = DOMUtils.getFirstChildElementByTag(implementation,
DOMConstants.TAG_SHEET_SETTINGS);
if (settingsEle == null)
return;
String path = entry.getPath();
Element entryEle = ((SettingEntryImpl) entry).getImplementation();
settingsEle.removeChild(entryEle);
for (String attrKey : entry.getAttributeKeys()) {
CoreEvent event = new CoreEvent(ownedSheet, Core.SheetSettings,
attrKey, entry.getAttribute(attrKey), null);
event.setData(path);
ownedSheet.getCoreEventSupport().dispatch(ownedSheet, event);
}
}
protected Element getImplementation() {
return implementation;
}
public ElementRegistry getElementRegistry() {
if (elementRegistry == null) {
elementRegistry = new ElementRegistry();
}
return elementRegistry;
}
public ISheet getOwnedSheet() {
return ownedSheet;
}
public IWorkbook getOwnedWorkbook() {
return ownedSheet.getOwnedWorkbook();
}
public boolean isOrphan() {
return DOMUtils.isOrphanNode(implementation);
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj == null || !(obj instanceof SheetSettingsImpl))
return false;
SheetSettingsImpl that = (SheetSettingsImpl) obj;
return that.implementation == this.implementation;
}
@Override
public int hashCode() {
return implementation.hashCode();
}
@Override
public String toString() {
return DOMUtils.toString(implementation);
}
}