/* TagStyleTreeModel.java created 2007-11-10 * */ package org.signalml.app.model.tag; import org.apache.log4j.Logger; import org.signalml.app.view.tag.TagIconProducer; import org.signalml.domain.tag.StyledTagSet; import org.signalml.domain.tag.TagStyleEvent; import org.signalml.domain.tag.TagStyleListener; import org.signalml.plugin.export.signal.SignalSelectionType; import org.signalml.plugin.export.signal.TagStyle; import org.signalml.plugin.export.view.AbstractTreeModel; /** TagStyleTreeModel * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class TagStyleTreeModel extends AbstractTreeModel implements TagStyleListener { protected static final Logger logger = Logger.getLogger(TagStyleTreeModel.class); private static final String ROOT_NODE = "tagStyleTree.root"; private StyledTagSet tagSet; private TagIconProducer iconProducer; private TagTypeTreeNode[] tagTypeTreeNodes; public TagStyleTreeModel() { super(); iconProducer = new TagIconProducer(); } public StyledTagSet getTagSet() { return tagSet; } public void setTagSet(StyledTagSet tagSet) { if (this.tagSet != tagSet) { this.tagSet = tagSet; if (this.tagSet != null) { this.tagSet.removeTagStyleListener(this); } if (tagSet != null) { tagSet.addTagStyleListener(this); } tagTypeTreeNodes = null; fireTreeStructureChanged(this, new Object[] { ROOT_NODE }); } } public TagIconProducer getIconProducer() { return iconProducer; } @Override public int getChildCount(Object parent) { if (tagSet != null) { if (parent == ROOT_NODE) { return SignalSelectionType.values().length; } if (parent instanceof TagTypeTreeNode) { return tagSet.getTagStyleCount(((TagTypeTreeNode) parent).getType()); } } return 0; } @Override public Object getChild(Object parent, int index) { if (parent == ROOT_NODE) { return getTagTypeTreeNode(index); } if (parent instanceof TagTypeTreeNode) { return tagSet.getStyleAt(((TagTypeTreeNode) parent).getType(), index); } return null; } @Override public int getIndexOfChild(Object parent, Object child) { if (parent == ROOT_NODE) { SignalSelectionType type = ((TagTypeTreeNode) child).getType(); return type.ordinal(); } if (parent instanceof TagTypeTreeNode) { return tagSet.indexOfStyle((TagStyle) child); } return -1; } @Override public Object getRoot() { return ROOT_NODE; } @Override public boolean isLeaf(Object node) { return (node instanceof TagStyle); } public Object[] getTagStylePath(TagStyle style) { if (style == null) { return new Object[] { ROOT_NODE }; } else { return new Object[] { ROOT_NODE, getTagTypeTreeNode(style.getType().ordinal()), style }; } } private TagTypeTreeNode[] getTagTypeTreeNodes() { if (tagTypeTreeNodes == null) { tagTypeTreeNodes = new TagTypeTreeNode[3]; SignalSelectionType[] types = SignalSelectionType.values(); for (int i=0; i<types.length; i++) { tagTypeTreeNodes[i] = new TagTypeTreeNode(tagSet, types[i]); } } return tagTypeTreeNodes; } private TagTypeTreeNode getTagTypeTreeNode(int index) { return getTagTypeTreeNodes()[index]; } public Object[] getTagStyleParentPath(SignalSelectionType type) { return new Object[] { ROOT_NODE, getTagTypeTreeNode(type.ordinal()) }; } @Override public void tagStyleAdded(TagStyleEvent e) { TagStyle style = e.getTagStyle(); fireTreeNodesInserted( this, getTagStyleParentPath(style.getType()), new int[] { e.getInTypeIndex() }, new Object[] { style } ); } @Override public void tagStyleChanged(TagStyleEvent e) { TagStyle style = e.getTagStyle(); iconProducer.reset(style); // this may rearange styles if name is changed fireTreeStructureChanged(this, getTagStyleParentPath(style.getType())); } @Override public void tagStyleRemoved(TagStyleEvent e) { TagStyle style = e.getTagStyle(); iconProducer.reset(style); fireTreeNodesRemoved( this, getTagStyleParentPath(style.getType()), new int[] { e.getInTypeIndex() }, new Object[] { style } ); } }