/* BookTreeModel.java created 2007-09-11 * */ package org.signalml.app.model.book; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.signalml.app.document.BookDocument; import org.signalml.app.document.DocumentManager; import org.signalml.app.document.DocumentManagerEvent; import org.signalml.app.document.DocumentManagerListener; import org.signalml.app.document.ManagedDocumentType; import org.signalml.plugin.export.signal.Document; import org.signalml.plugin.export.view.AbstractTreeModel; /** BookTreeModel * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class BookTreeModel extends AbstractTreeModel implements DocumentManagerListener, PropertyChangeListener { // note - this doesn't implement book listeners - it is assumed that books // shown using this model do not changed private static final String ROOT_NODE = "bookTree.root"; private DocumentManager documentManager; public DocumentManager getDocumentManager() { return documentManager; } public void setDocumentManager(DocumentManager documentManager) { this.documentManager = documentManager; } @Override public Object getRoot() { return ROOT_NODE; } @Override public int getChildCount(Object parent) { if (parent == ROOT_NODE) { return documentManager.getDocumentCount(ManagedDocumentType.BOOK); } else if (parent instanceof BookDocument) { return ((BookDocument) parent).getBook().getChannelCount(); } else if (parent instanceof BookChannelTreeNode) { return ((BookChannelTreeNode) parent).getBook().getSegmentCount(); } else if (parent instanceof BookSegmentTreeNode) { return ((BookSegmentTreeNode) parent).getAtomCount(); } return 0; } @Override public Object getChild(Object parent, int index) { if (parent == ROOT_NODE) { return documentManager.getDocumentAt(ManagedDocumentType.BOOK, index); } else if (parent instanceof BookDocument) { return new BookChannelTreeNode(((BookDocument) parent).getBook(), index); } else if (parent instanceof BookChannelTreeNode) { BookChannelTreeNode channel = (BookChannelTreeNode) parent; return new BookSegmentTreeNode(channel.getBook(), channel.getChannelIndex(), index); } else if (parent instanceof BookSegmentTreeNode) { return new BookAtomTreeNode(((BookSegmentTreeNode) parent).getSegment().getAtomAt(index), index); } return null; } @Override public int getIndexOfChild(Object parent, Object child) { if (parent == ROOT_NODE && (child instanceof Document)) { return documentManager.getIndexOfDocument(ManagedDocumentType.BOOK, ((Document) child)); } else if (parent instanceof BookDocument && child instanceof BookChannelTreeNode) { return ((BookChannelTreeNode) child).getChannelIndex(); } else if (parent instanceof BookChannelTreeNode && child instanceof BookSegmentTreeNode) { return ((BookSegmentTreeNode) child).getSegmentIndex(); } else if (parent instanceof BookSegmentTreeNode && child instanceof BookAtomTreeNode) { return ((BookAtomTreeNode) child).getIndex(); } return -1; } @Override public boolean isLeaf(Object node) { if (node == ROOT_NODE) { return false; } else if (node instanceof BookDocument) { return false; } else if (node instanceof BookChannelTreeNode) { return false; } else if (node instanceof BookSegmentTreeNode) { return false; } return true; } @Override public void propertyChange(PropertyChangeEvent evt) { // ignored } @Override public void documentAdded(DocumentManagerEvent e) { Document document = e.getDocument(); if (document instanceof BookDocument) { BookDocument bookDocument = (BookDocument) document; bookDocument.addPropertyChangeListener(this); fireTreeNodesInserted(this, new Object[] { ROOT_NODE }, new int[] { e.getInTypeIndex() }, new Object[] { bookDocument }); } } @Override public void documentRemoved(DocumentManagerEvent e) { Document document = e.getDocument(); if (document instanceof BookDocument) { BookDocument bookDocument = (BookDocument) document; bookDocument.removePropertyChangeListener(this); fireTreeNodesRemoved(this, new Object[] { ROOT_NODE }, new int[] { e.getInTypeIndex() }, new Object[] { bookDocument }); } } @Override public void documentPathChanged(DocumentManagerEvent e) { Document document = e.getDocument(); if (document instanceof BookDocument) { BookDocument bookDocument = (BookDocument) document; fireTreeNodesChanged(this, new Object[] { ROOT_NODE }, new int[] { e.getInTypeIndex() }, new Object[] { bookDocument }); } } }