/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.core.internal.dom; import static org.xmind.core.internal.dom.DOMConstants.ATTR_HIDDEN; import static org.xmind.core.internal.dom.DOMConstants.ATTR_ID; import static org.xmind.core.internal.dom.DOMConstants.ATTR_NAME; import static org.xmind.core.internal.dom.DOMConstants.ATTR_SINGLETON; import static org.xmind.core.internal.dom.DOMConstants.TAG_MARKER; import java.util.List; import java.util.Properties; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xmind.core.Core; import org.xmind.core.event.ICoreEventListener; import org.xmind.core.event.ICoreEventRegistration; import org.xmind.core.event.ICoreEventSource; import org.xmind.core.event.ICoreEventSupport; import org.xmind.core.internal.MarkerGroup; import org.xmind.core.marker.IMarker; import org.xmind.core.marker.IMarkerSheet; import org.xmind.core.util.DOMUtils; public class MarkerGroupImpl extends MarkerGroup implements ICoreEventSource { private Element implementation; private MarkerSheetImpl ownedSheet; public MarkerGroupImpl(Element implementation, MarkerSheetImpl ownedSheet) { this.implementation = DOMUtils.addIdAttribute(implementation); this.ownedSheet = ownedSheet; } public Element getImplementation() { return implementation; } public <T> T getAdapter(Class<T> adapter) { if (ICoreEventSource.class.equals(adapter)) return adapter.cast(this); if (adapter.isAssignableFrom(Element.class)) return adapter.cast(implementation); return super.getAdapter(adapter); } public boolean equals(Object obj) { if (obj == this) return true; if (obj == null || !(obj instanceof MarkerGroupImpl)) return false; MarkerGroupImpl that = (MarkerGroupImpl) obj; return this.implementation == that.implementation; } public int hashCode() { return implementation.hashCode(); } public String toString() { return DOMUtils.toString(implementation); } public String getName() { String name = implementation.getAttribute(ATTR_NAME); if (name.startsWith("%")) { //$NON-NLS-1$ Properties properties = ownedSheet.getProperties(); if (properties != null) { String key = name.substring(1); name = properties.getProperty(key, name); } } return name; } public IMarkerSheet getOwnedSheet() { return ownedSheet; } public IMarkerSheet getParent() { Node p = implementation.getParentNode(); if (p == ownedSheet.getSheetElement()) { return ownedSheet; } return null; } public boolean isSingleton() { return Boolean .parseBoolean(implementation.getAttribute(ATTR_SINGLETON)); } public boolean isHidden() { return Boolean.parseBoolean(implementation.getAttribute(ATTR_HIDDEN)); } public void setName(String name) { String oldName = implementation.hasAttribute(ATTR_NAME) ? getName() : null; DOMUtils.setAttribute(implementation, ATTR_NAME, name); String newName = implementation.hasAttribute(ATTR_NAME) ? getName() : null; fireValueChange(Core.Name, oldName, newName); } public void setSingleton(boolean singleton) { DOMUtils.setAttribute(implementation, ATTR_SINGLETON, Boolean.toString(singleton)); } public void setHidden(boolean hidden) { DOMUtils.setAttribute(implementation, ATTR_HIDDEN, Boolean.toString(hidden)); } public String getId() { return implementation.getAttribute(ATTR_ID); } public List<IMarker> getMarkers() { return DOMUtils.getChildList(implementation, TAG_MARKER, ownedSheet.getElementAdapterProvider()); } /* * (non-Javadoc) * @see org.xmind.core.marker.IMarkerGroup#isEmpty() */ public boolean isEmpty() { return !implementation.hasChildNodes(); } public void addMarker(IMarker marker) { Element m = ((MarkerImpl) marker).getImplementation(); Node n = implementation.appendChild(m); if (n != null) { int index = DOMUtils.getElementIndex(implementation, TAG_MARKER, m); if (index >= 0) { if (getParent() != null) fireIndexedTargetChange(Core.MarkerAdd, marker, index); } } } public void removeMarker(IMarker marker) { Element m = ((MarkerImpl) marker).getImplementation(); if (m != null && m.getParentNode() == implementation) { int index = DOMUtils.getElementIndex(implementation, TAG_MARKER, m); if (index >= 0) { Node n = implementation.removeChild(m); if (n != null) { if (getParent() != null) fireIndexedTargetChange(Core.MarkerRemove, marker, index); } } } } public ICoreEventRegistration registerCoreEventListener(String type, ICoreEventListener listener) { return getCoreEventSupport().registerCoreEventListener(this, type, listener); } private void fireValueChange(String type, Object oldValue, Object newValue) { getCoreEventSupport().dispatchValueChange(this, type, oldValue, newValue); } private void fireIndexedTargetChange(String type, Object target, int index) { getCoreEventSupport().dispatchIndexedTargetChange(this, type, target, index); } public ICoreEventSupport getCoreEventSupport() { return ownedSheet.getCoreEventSupport(); } }