/* WorkspaceTreeModel.java created 2007-09-11
*
*/
package org.signalml.app.model.workspace;
import javax.swing.tree.TreePath;
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.app.document.mrud.MRUDEntry;
import org.signalml.app.document.mrud.MRUDRegistry;
import org.signalml.app.document.mrud.MRUDRegistryEvent;
import org.signalml.app.document.mrud.MRUDRegistryListener;
import org.signalml.plugin.export.signal.Document;
import org.signalml.plugin.export.view.AbstractTreeModel;
import static org.signalml.app.util.i18n.SvarogI18n._;
/** WorkspaceTreeModel
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class WorkspaceTreeModel extends AbstractTreeModel implements DocumentManagerListener, MRUDRegistryListener {
/* extends DefaultTreeModel */
private static final String ROOT_NODE = _("Workspace");
private static final String OPEN_DOCUMENTS_NODE = _("Open documents");
private static final String OPEN_SIGNALS_NODE = _("Open signals");
private static final String OPEN_MONITORS_NODE = _("Open monitors");
private static final String OPEN_BOOKS_NODE = _("Open books");
private static final String OPEN_TAGS_NODE = _("Open tags");
private static final String RECENT_DOCUMENTS_NODE = _("Documents");
private static final String RECENT_SIGNALS_NODE = _("Signals");
private static final String RECENT_MONITORS_NODE = _("Monitors");
private static final String RECENT_BOOKS_NODE = _("Books");
private static final String RECENT_TAGS_NODE = _("Tags");
private static final String[] ROOT_NODE_CHILDREN = new String[] {
OPEN_DOCUMENTS_NODE,
RECENT_DOCUMENTS_NODE
};
private static final String[] OPEN_NODE_CHILDREN = new String[] {
OPEN_SIGNALS_NODE,
OPEN_MONITORS_NODE,
OPEN_BOOKS_NODE,
OPEN_TAGS_NODE
};
private static final String[] RECENT_NODE_CHILDREN = new String[] {
RECENT_SIGNALS_NODE,
RECENT_MONITORS_NODE,
RECENT_BOOKS_NODE,
RECENT_TAGS_NODE
};
private static final ManagedDocumentType[] OPEN_TYPES = new ManagedDocumentType[] {
ManagedDocumentType.SIGNAL,
ManagedDocumentType.MONITOR,
ManagedDocumentType.BOOK,
ManagedDocumentType.TAG
};
private static final ManagedDocumentType[] RECENT_TYPES = new ManagedDocumentType[] {
ManagedDocumentType.SIGNAL,
ManagedDocumentType.MONITOR,
ManagedDocumentType.BOOK,
ManagedDocumentType.TAG
};
private DocumentManager documentManager;
private MRUDRegistry mrudRegistry;
public DocumentManager getDocumentManager() {
return documentManager;
}
public void setDocumentManager(DocumentManager documentManager) {
this.documentManager = documentManager;
}
public MRUDRegistry getMrudRegistry() {
return mrudRegistry;
}
public void setMrudRegistry(MRUDRegistry mrudRegistry) {
this.mrudRegistry = mrudRegistry;
}
public Object getRoot() {
return ROOT_NODE;
}
public int getChildCount(Object parent) {
if (parent == ROOT_NODE) {
return ROOT_NODE_CHILDREN.length;
}
else if (parent == OPEN_DOCUMENTS_NODE) {
return OPEN_TYPES.length;
}
else if (parent == RECENT_DOCUMENTS_NODE) {
return RECENT_TYPES.length;
} else if (parent == OPEN_SIGNALS_NODE) {
return documentManager.getDocumentCount(ManagedDocumentType.SIGNAL);
} else if (parent == OPEN_MONITORS_NODE) {
return documentManager.getDocumentCount(ManagedDocumentType.MONITOR);
} else if (parent == OPEN_BOOKS_NODE) {
return documentManager.getDocumentCount(ManagedDocumentType.BOOK);
} else if (parent == OPEN_TAGS_NODE) {
return documentManager.getDocumentCount(ManagedDocumentType.TAG);
} else if (parent == RECENT_SIGNALS_NODE) {
return mrudRegistry.getMRUDEntryCount(ManagedDocumentType.SIGNAL);
} else if (parent == RECENT_MONITORS_NODE) {
return mrudRegistry.getMRUDEntryCount(ManagedDocumentType.MONITOR);
} else if (parent == RECENT_BOOKS_NODE) {
return mrudRegistry.getMRUDEntryCount(ManagedDocumentType.BOOK);
} else if (parent == RECENT_TAGS_NODE) {
return mrudRegistry.getMRUDEntryCount(ManagedDocumentType.TAG);
}
return 0;
}
public Object getChild(Object parent, int index) {
if (parent == ROOT_NODE) {
return ROOT_NODE_CHILDREN[index];
}
else if (parent == OPEN_DOCUMENTS_NODE) {
return OPEN_NODE_CHILDREN[index];
}
else if (parent == RECENT_DOCUMENTS_NODE) {
return RECENT_NODE_CHILDREN[index];
} else if (parent == OPEN_SIGNALS_NODE) {
return documentManager.getDocumentAt(ManagedDocumentType.SIGNAL, index);
} else if (parent == OPEN_MONITORS_NODE) {
return documentManager.getDocumentAt(ManagedDocumentType.MONITOR, index);
} else if (parent == OPEN_BOOKS_NODE) {
return documentManager.getDocumentAt(ManagedDocumentType.BOOK, index);
} else if (parent == OPEN_TAGS_NODE) {
return documentManager.getDocumentAt(ManagedDocumentType.TAG, index);
} else if (parent == RECENT_SIGNALS_NODE) {
return mrudRegistry.getMRUDEntryAt(ManagedDocumentType.SIGNAL, index);
} else if (parent == RECENT_MONITORS_NODE) {
return mrudRegistry.getMRUDEntryAt(ManagedDocumentType.MONITOR, index);
} else if (parent == RECENT_BOOKS_NODE) {
return mrudRegistry.getMRUDEntryAt(ManagedDocumentType.BOOK, index);
} else if (parent == RECENT_TAGS_NODE) {
return mrudRegistry.getMRUDEntryAt(ManagedDocumentType.TAG, index);
}
return null;
}
public int getIndexOfChild(Object parent, Object child) {
if (parent == ROOT_NODE) {
return getArrayIndex(ROOT_NODE_CHILDREN, child);
}
else if (parent == OPEN_DOCUMENTS_NODE && (child instanceof String)) {
for (int i = 0; i<OPEN_TYPES.length; i++) {
if (child == OPEN_NODE_CHILDREN[i]) {
return i;
}
}
}
else if (parent == RECENT_DOCUMENTS_NODE && (child instanceof String)) {
for (int i = 0; i<RECENT_TYPES.length; i++) {
if (child == RECENT_NODE_CHILDREN[i]) {
return i;
}
}
} else if (parent == OPEN_SIGNALS_NODE && (child instanceof Document)) {
return documentManager.getIndexOfDocument(ManagedDocumentType.SIGNAL, (Document) child);
} else if (parent == OPEN_MONITORS_NODE && (child instanceof Document)) {
return documentManager.getIndexOfDocument(ManagedDocumentType.MONITOR, (Document) child);
} else if (parent == OPEN_BOOKS_NODE && (child instanceof Document)) {
return documentManager.getIndexOfDocument(ManagedDocumentType.BOOK, (Document) child);
} else if (parent == OPEN_TAGS_NODE && (child instanceof Document)) {
return documentManager.getIndexOfDocument(ManagedDocumentType.TAG, (Document) child);
} else if (parent == RECENT_SIGNALS_NODE && (child instanceof MRUDEntry)) {
return mrudRegistry.getIndexOfMRUDEntry(ManagedDocumentType.SIGNAL, (MRUDEntry) child);
} else if (parent == RECENT_MONITORS_NODE && (child instanceof MRUDEntry)) {
return mrudRegistry.getIndexOfMRUDEntry(ManagedDocumentType.MONITOR, (MRUDEntry) child);
} else if (parent == RECENT_BOOKS_NODE && (child instanceof MRUDEntry)) {
return mrudRegistry.getIndexOfMRUDEntry(ManagedDocumentType.BOOK, (MRUDEntry) child);
} else if (parent == RECENT_TAGS_NODE && (child instanceof MRUDEntry)) {
return mrudRegistry.getIndexOfMRUDEntry(ManagedDocumentType.TAG, (MRUDEntry) child);
}
return -1;
}
public boolean isLeaf(Object parent) {
if (parent instanceof String) {
return false;
}
return true;
}
private int getArrayIndex(Object[] arr, Object o) {
for (int i=0; i<arr.length; i++) {
if (arr[i] == o) {
return i;
}
}
return -1;
}
public TreePath getTreePathToRoot(Document document) {
return new TreePath(getObjectPathToRoot(document));
}
public Object[] getObjectPathToRoot(Document document) {
ManagedDocumentType type = ManagedDocumentType.getForClass(document.getClass());
if (type == null) {
return new Object[0];
}
return new Object[] {
ROOT_NODE,
OPEN_DOCUMENTS_NODE,
OPEN_NODE_CHILDREN[getArrayIndex(OPEN_TYPES, type)],
document
};
}
public Object[] getObjectPathToRootFromParent(Document document) {
ManagedDocumentType type = ManagedDocumentType.getForClass(document.getClass());
if (type == null) {
return new Object[0];
}
return new Object[] {
ROOT_NODE,
OPEN_DOCUMENTS_NODE,
OPEN_NODE_CHILDREN[getArrayIndex(OPEN_TYPES, type)]
};
}
public Object[] getObjectPathToRootFromParent(MRUDEntry entry) {
ManagedDocumentType type = entry.getDocumentType();
if (type == null) {
return new Object[0];
}
return new Object[] {
ROOT_NODE,
RECENT_DOCUMENTS_NODE,
RECENT_NODE_CHILDREN[getArrayIndex(RECENT_TYPES, type)]
};
}
public Object getParentObject(Document document) {
ManagedDocumentType type = ManagedDocumentType.getForClass(document.getClass());
if (type == null) {
return new Object[0];
}
return OPEN_NODE_CHILDREN[getArrayIndex(OPEN_TYPES, type)];
}
@Override
public void documentAdded(DocumentManagerEvent e) {
Document document = e.getDocument();
fireTreeNodesInserted(
this,
getObjectPathToRootFromParent(document),
new int[] { e.getInTypeIndex() },
new Object[] { document }
);
}
@Override
public void documentRemoved(DocumentManagerEvent e) {
Document document = e.getDocument();
fireTreeNodesRemoved(
this,
getObjectPathToRootFromParent(document),
new int[] { e.getInTypeIndex() },
new Object[] { document }
);
}
@Override
public void documentPathChanged(DocumentManagerEvent e) {
Document document = e.getDocument();
fireTreeNodesChanged(
this,
getObjectPathToRootFromParent(document),
new int[] { e.getInTypeIndex() },
new Object[] { document }
);
}
@Override
public void mrudEntryRegistered(MRUDRegistryEvent e) {
MRUDEntry entry = e.getEntry();
fireTreeNodesInserted(
this,
getObjectPathToRootFromParent(entry),
new int[] { e.getInTypeIndex() },
new Object[] { entry }
);
}
@Override
public void mrudEntryRemoved(MRUDRegistryEvent e) {
MRUDEntry entry = e.getEntry();
fireTreeNodesRemoved(
this,
getObjectPathToRootFromParent(entry),
new int[] { e.getInTypeIndex() },
new Object[] { entry }
);
}
}