/* Copyright (c) 2009 The Regents of the University of California. All rights reserved. Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that the above copyright notice and the following two paragraphs appear in all copies of this software. IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.. */ /* * BrowseNotes.java * * Created on Nov 20, 2010, 10:12:05 AM */ package org.clothocad.tool.grapevine; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.List; import javax.swing.ListModel; import javax.swing.SwingWorker; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.text.Position; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import org.clothocore.api.core.Collector; import org.clothocore.api.data.Collection; import org.clothocore.api.data.Lab; import org.clothocore.api.data.Note; import org.clothocore.api.data.ObjBase; import org.clothocore.api.data.ObjLink; import org.clothocore.api.data.ObjType; import org.clothocore.api.data.Person; import org.clothocore.api.plugin.ClothoConnection; import org.clothocore.api.plugin.ClothoConnection.ClothoQuery; /** * * @author jcanderson */ public class BrowseNotes extends javax.swing.JDialog { /** Creates new form BrowseNotes */ public BrowseNotes(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); populateData(); } private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); allNoteList = new javax.swing.JList(); jScrollPane2 = new javax.swing.JScrollPane(); root = new DefaultMutableTreeNode("Labs"); collectionTree = new javax.swing.JTree(root); cancelButton = new javax.swing.JButton(); openButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); allNoteList.setModel(new javax.swing.AbstractListModel() { String[] strings = {}; @Override public int getSize() { return strings.length; } @Override public Object getElementAt(int i) { return strings[i]; } }); jScrollPane1.setViewportView(allNoteList); jScrollPane2.setViewportView(collectionTree); collectionTree.setVisible(false); collectionTree.setExpandsSelectedPaths(true); cancelButton.setText("Cancel"); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setVisible(false); } }); openButton.setText("Quick Add"); openButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { Collection acoll = Collector.getCurrentUser().getHerCollection(); Note anote = new Note("New Note", Collector.getCurrentUser(), null); acoll.addObject(anote); new NoteEditor(anote); setVisible(false); } catch(Exception err) { } } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(248, 248, 248) .addComponent(openButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(cancelButton)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 222, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cancelButton) .addComponent(openButton)) .addContainerGap()) ); pack(); } private void populateData() { new SwingWorker() { ArrayList<ObjLink> links; @Override protected Object doInBackground() throws Exception { links = Collector.getAllLinksOf(ObjType.NOTE); return null; } @Override public void done() { allNoteList.setModel(new javax.swing.AbstractListModel() { @Override public int getSize() { return links.size(); } @Override public Object getElementAt(int i) { return links.get(i); } }); allNoteList.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if(e.getClickCount()==2) { System.out.println("double clicked list"); try { ObjLink link = (ObjLink) allNoteList.getSelectedValue(); Note anote = Collector.getNote(link.uuid); new NoteEditor(anote); } catch(Exception err) { err.printStackTrace(); } } } }); } }.execute(); new SwingWorker() { ArrayList<ObjLink> labs; @Override protected Object doInBackground() throws Exception { labs = Collector.getAllLinksOf(ObjType.LAB); return null; } @Override public void done() { for(ObjLink alab : labs) { LabNode childLab = new LabNode(alab); root.add(childLab); } collectionTree.expandRow(0); collectionTree.addTreeExpansionListener(new TreeExpansionListener() { @Override public void treeExpanded(TreeExpansionEvent event) { try { ObjBaseNode obn = (ObjBaseNode) event.getPath().getLastPathComponent(); obn.expand(); } catch(Exception e) { } } @Override public void treeCollapsed(TreeExpansionEvent event) { } }); collectionTree.addMouseListener(new TreeListener()); collectionTree.setVisible(true); } }.execute(); } abstract class ObjBaseNode extends DefaultMutableTreeNode { public ObjBaseNode(String name) { super(name); } public TreePath getTreePath() { TreeNode[] ptr = getPath(); TreePath path = new TreePath(ptr); return path; } abstract void expand(); //VARIABLES// boolean isExpanded = false; } class LabNode extends ObjBaseNode { public LabNode(ObjLink alab) { super(alab.name); dummynode = new DefaultMutableTreeNode("Loading..."); DefaultTreeModel model = (DefaultTreeModel)collectionTree.getModel(); MutableTreeNode node = (MutableTreeNode) LabNode.this; model.insertNodeInto(dummynode, node, 0); mylink = alab; } @Override public void expand() { if(isExpanded) { return; } new SwingWorker() { @Override protected Object doInBackground() throws Exception { ClothoConnection conn = Collector.getDefaultConnection(); ClothoQuery mainquery = conn.createQuery( ObjType.PERSON ); ClothoQuery seqquery = mainquery.createAssociationQuery( Person.Fields.LAB ); seqquery.eq( Lab.Fields.NAME, mylink.name ); peoples = mainquery.getResults(); for(ObjBase obj: peoples) { System.out.println(obj.getName()); } return null; } @Override public void done() { DefaultTreeModel model = (DefaultTreeModel)collectionTree.getModel(); MutableTreeNode node = (MutableTreeNode) LabNode.this; for(ObjBase obj : peoples) { Person aperson = (Person) obj; CollectionNode pnode = new CollectionNode(aperson); model.insertNodeInto(pnode, node, node.getChildCount()); } model.removeNodeFromParent(dummynode); collectionTree.expandPath(LabNode.this.getTreePath()); isExpanded = true; } }.execute(); } //VARIABLES// ObjLink mylink; DefaultMutableTreeNode dummynode; List<ObjBase> peoples; } class NoteNode extends ObjBaseNode { /** * Constructor for an existing Note node * @param anote */ public NoteNode(Note anote) { super(anote.getName()); mynote = anote; } /** * Constructor for if it's a new Note node * @param string * @param mycoll */ public NoteNode(String string, Collection mycoll) { super(string); newline = true; tocollection= mycoll; } @Override public void expand() { } public void launchViewer() { if(newline) { Note newnote = new Note("New Note", Collector.getCurrentUser(), null); tocollection.addObject(newnote); new NoteEditor(newnote); } else { new NoteEditor(mynote); } } //VARIABLES// Note mynote; Collection tocollection; boolean newline = false; } class CollectionNode extends ObjBaseNode { public CollectionNode(Person aperson) { super(aperson.getHerCollection().getName()); mycoll = aperson.getHerCollection(); newNoteNode = new NoteNode("Add new Note here", mycoll); add(newNoteNode); } public CollectionNode(Collection acoll) { super(acoll.getName()); mycoll = acoll; newNoteNode = new NoteNode("Add new Note here", mycoll); add(newNoteNode); } @Override public void expand() { if(isExpanded) { return; } new SwingWorker() { @Override protected Object doInBackground() throws Exception { allcolls = (ArrayList<Collection>) mycoll.getAll(ObjType.COLLECTION); allnotes = (ArrayList<Note>) mycoll.getAll(ObjType.NOTE); return null; } @Override public void done() { DefaultTreeModel model = (DefaultTreeModel)collectionTree.getModel(); MutableTreeNode node = (MutableTreeNode) CollectionNode.this; for(Collection acoll : allcolls) { CollectionNode pnode = new CollectionNode(acoll); model.insertNodeInto(pnode, node, node.getChildCount()); } for(Note anote : allnotes) { NoteNode pnode = new NoteNode(anote); model.insertNodeInto(pnode, node, node.getChildCount()); } validate(); repaint(); isExpanded = true; } }.execute(); } //VARIABLES// Collection mycoll; NoteNode newNoteNode; ArrayList<Collection> allcolls; ArrayList<Note> allnotes; } class TreeListener implements MouseListener { @Override public void mouseClicked(MouseEvent e) { if(e.getClickCount()==2) { try { TreePath path = collectionTree.getSelectionPath(); TreeNode node = (TreeNode) path.getLastPathComponent(); NoteNode cnode = (NoteNode) node; cnode.launchViewer(); } catch(Exception err) { } } } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } } /*----------------- variables -----------------*/ private javax.swing.JButton cancelButton; private javax.swing.JList allNoteList; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTree collectionTree; private javax.swing.JButton openButton; private DefaultMutableTreeNode root; }