/* 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.. */ /* * spreaditParts.java * * Created on Aug 4, 2010, 9:03:45 AM */ package org.clothocad.tool.spreaditparts; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.prefs.Preferences; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.event.ChangeEvent; import javax.swing.event.ListSelectionEvent; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; import javax.swing.event.TableColumnModelEvent; import javax.swing.event.TableColumnModelListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.JTableHeader; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import org.clothocore.api.core.Collector; import org.clothocore.api.data.Collection; import org.clothocore.api.data.Format; import org.clothocore.api.data.NucSeq; import org.clothocore.api.data.ObjBase; import org.clothocore.api.data.ObjLink; import org.clothocore.api.data.ObjType; import org.clothocore.api.data.Part; import org.clothocore.api.data.Person; import org.clothocore.api.data.Plasmid; import org.clothocore.api.data.Vector; import org.clothocore.api.dnd.ObjBaseObserver; import org.clothocore.api.dnd.RefreshEvent; import org.clothocore.api.plugin.ClothoConnection; import org.clothocore.api.plugin.ClothoConnection.ClothoQuery; import org.clothocore.util.basic.ImageSource; import org.clothocore.util.basic.ObjBasePopup; import org.clothocore.util.buttons.TransparentButton; import org.jdesktop.swingx.JXTable; import org.openide.util.ImageUtilities; /** * * @author J. Christopher Anderson */ @SuppressWarnings (value="unchecked") public class spreaditParts extends javax.swing.JFrame { /** Creates new changeFormat spreaditParts */ public spreaditParts(Collection coll) { super("Spreadit Parts: " + getStringName(coll)); setIconImage(ImageSource.getTinyLogo()); _prefs = Preferences.userNodeForPackage(spreaditParts.class); _Collection = coll; refreshOBO = new refresher(); _Collection.isRepresentedBy(refreshOBO, this); new ObjBasePopup(getContentPane(), _Collection); _title = new String[] { "", "Nickname", "Short Description", "Sequence", "Format", "Author", "Status", "RG"}; initComponents(); //prefs int wide = _prefs.getInt("spreaditPartsWidth", 600); int high = _prefs.getInt("spreaditPartsHeight", 650); setSize(wide,high); setVisible(true); ExcelAdapter myAd = new ExcelAdapter(table); new Thread() { @Override public void run() { parseParts(); //prefs setWidths(); } }.start(); } private static String getStringName(Collection c) { if(c!=null) { return c.getName(); } else { return "Error"; } } //prefs private void setWidths() { final List<TableColumn> cols = table.getColumns(); for(int i=0; i<cols.size(); i++) { final int wide = _prefs.getInt("spreaditPartsColumn" + i, cols.get(i).getWidth()); final TableColumn tc = cols.get(i); columnWidths[i] = wide; SwingUtilities.invokeLater(new Runnable() { @Override public void run() { System.out.println("Setting " + tc + " to " + wide); tc.setPreferredWidth(wide); } }); } } private class refresher implements ObjBaseObserver { @Override public void update(ObjBase obj, RefreshEvent evt) { if(obj==null) { dispose(); } new Thread() { @Override public void run() { parseParts(); } }.start(); } } private void parseParts() { new SwingWorker() { @Override protected Object doInBackground() throws Exception { ArrayList<Part> inlist = (ArrayList<Part>) _Collection.getAll(ObjType.PART); allParts = sortList(inlist); _data = new String [allParts.size()][8]; return null; } @Override public void done() { edtRelay(); } }.execute(); } private void edtRelay() { final DefaultTableModel tableModel = new DefaultTableModel(_data, _title) { }; table.setModel(tableModel); table.setDefaultRenderer(java.lang.Object.class, new AvailabilityColorRenderer()); System.out.println(allParts.size()); obrlist.clear(); for(int i=0; i<allParts.size(); i++ ) { final Part currPart = allParts.get(i); if(currPart==null) { continue; } final int index = i; ObjBaseObserver obr = new ObjBaseObserver() { @Override public void update(final ObjBase obj, RefreshEvent evt) { if(obj==null) { return; } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { refreshValues((Part) obj); } }); } }; obrlist.add(obr); currPart.isObservedBy(obr); obr.update(currPart, null); validate(); repaint(); } table.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { Part changedPart = allParts.get(e.getFirstRow()); processPartChange(changedPart, e.getFirstRow(), e.getColumn(), (String) tableModel.getValueAt(e.getFirstRow(), e.getColumn())); } }); table.addMouseListener(new MouseAdapter() { @Override public void mousePressed( MouseEvent e ) { if(e.getModifiers()==4) { if(table.getSelectedRows().length>1) { return; } int index = table.getSelectedRow(); final Part aPart = allParts.get(index); ObjBasePopup obp = new ObjBasePopup(table, aPart, e.getPoint()); obp.addMenuItem("Remove from Collection", new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { _Collection.removeItem(aPart); } }); } } }); isInitiated = true; } private void refreshValues(Part currPart) { int index = allParts.indexOf(currPart); String isbasicstring = "c"; if(currPart.getPartType().equals(Part.partType.Basic)) { isbasicstring = "b"; } table.setValueAt(isbasicstring, index, 0); table.setValueAt(currPart.getName(), index, 1); table.setValueAt(currPart.getShortDescription(), index, 2); table.setValueAt(currPart.getSeq().toString(), index, 3); table.setValueAt(currPart.getFormat().getName(), index, 4); table.setValueAt(currPart.getAuthor().getName(), index, 5); table.setValueAt(findStatus(currPart), index, 6); table.setValueAt(((Short) currPart.getRiskGroup()).toString(), index, 7); } private class headerListener extends MouseAdapter { @Override public void mouseClicked(MouseEvent e) { JTableHeader h = (JTableHeader) e.getSource(); TableColumnModel columnModel = h.getColumnModel(); int viewColumn = h.columnAtPoint(e.getPoint()); int column = columnModel.getColumn(viewColumn).getModelIndex(); if (column != -1) { sortBy sortmode; switch(column) { case 0: sortmode = sortBy.ISBASIC; break; case 1: sortmode = sortBy.NAME; break; case 2: sortmode = sortBy.DESCRIPTION; break; case 3: sortmode = sortBy.SEQUENCE; break; case 4: sortmode = sortBy.FORMAT; break; case 5: sortmode = sortBy.AUTHOR; break; case 7: sortmode = sortBy.RG; break; default: return; } if(sortmode.equals(sortByChoice)) { reverseit = !reverseit; } else { reverseit = false; } setSortMode(sortmode); } } } public void setSortMode(sortBy choice) { sortByChoice = choice; parseParts(); } private ArrayList<Part> sortList(ArrayList<Part> inlist) { ArrayList<Part> out = new ArrayList<Part>(); Comparator comparator = new Comparator() { @Override public int compare( Object o1, Object o2 ) { Part part1 = (Part) o1; Part part2 = (Part) o2; switch(sortByChoice) { case ISBASIC: String ti1 = part1.getPartType().toString(); String ti2 = part2.getPartType().toString(); if ( reverseit ) { return ti2.compareTo( ti1 ); } else { return ti1.compareTo( ti2 ); } case NAME: String i1 = part1.getName(); String i2 = part2.getName(); if ( reverseit ) { return i2.compareTo( i1 ); } else { return i1.compareTo( i2 ); } case DESCRIPTION: String d1 = part1.getShortDescription(); String d2 = part2.getShortDescription(); if ( reverseit ) { return d2.compareTo( d1 ); } else { return d1.compareTo( d2 ); } case SEQUENCE: String s1 = part1.getSeq().getSeq(); String s2 = part2.getSeq().getSeq(); if ( reverseit ) { return s2.compareTo( s1 ); } else { return s1.compareTo( s2 ); } case FORMAT: String f1 = part1.getFormat().getName(); String f2 = part2.getFormat().getName(); if ( reverseit ) { return f2.compareTo( f1 ); } else { return f1.compareTo( f2 ); } case AUTHOR: String a1 = part1.getAuthor().getName(); String a2 = part2.getAuthor().getName(); if ( reverseit ) { return a2.compareTo( a1 ); } else { return a1.compareTo( a2 ); } case RG: String r1 = ((Short) part1.getRiskGroup()).toString(); String r2 = ((Short) part2.getRiskGroup()).toString(); if ( reverseit ) { return r2.compareTo( r1 ); } else { return r1.compareTo( r2 ); } default: return 1; } } }; java.util.Collections.sort( inlist, comparator ); for ( Part p : inlist ) { out.add( p ); } return out; } private String findStatus(Part apart) { ArrayList<String> tags = apart.getSearchTags(); if(tags.contains("works")) { return "works"; } else if(tags.contains("fails")) { return "fails"; } else { return ""; } } private void initComponents() { scroller = new javax.swing.JScrollPane(); table = new JXTable(); //prefs table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); //table.setSearchable(new Searchable()); table.getTableHeader().addMouseListener(new headerListener()); addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { _prefs.putInt("spreaditPartsWidth", getWidth()); _prefs.putInt("spreaditPartsHeight", getHeight()); } }); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.out.println("windowclosing"); List<TableColumn> cols = table.getColumns(); for(int i=0; i<cols.size(); i++) { _prefs.putInt("spreaditPartsColumn" + i, columnWidths[i]); } } }); //prefs table.getColumnModel().addColumnModelListener(new TableColumnModelListener() { public void columnAdded(TableColumnModelEvent e) { } public void columnRemoved(TableColumnModelEvent e) { } public void columnMoved(TableColumnModelEvent e) { } public void columnMarginChanged(ChangeEvent e) { List<TableColumn> cols = table.getColumns(); for(int i=0; i<cols.size(); i++) { columnWidths[i] = cols.get(i).getWidth(); } } public void columnSelectionChanged(ListSelectionEvent e) { } }); getContentPane().setBackground(navyblue); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); String[][] data = new String [][] { {"Data loading..."} }; _data = data; DefaultTableModel tableModel = new DefaultTableModel(_data, new String[] {""}); table.setModel(tableModel); table.setSortable(false); table.getTableHeader().setReorderingAllowed(false); scroller.setViewportView(table); putInMenuBar(); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addComponent(scroller, javax.swing.GroupLayout.DEFAULT_SIZE, 705, Short.MAX_VALUE) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(scroller, javax.swing.GroupLayout.DEFAULT_SIZE, 456, Short.MAX_VALUE) .addContainerGap()) ); pack(); } private void putInMenuBar() { JMenuBar menuBar = new JMenuBar(); menuBar.setBackground(navyblue); JMenu fileMenu = new JMenu(); fileMenu.setText("File"); fileMenu.setForeground(Color.WHITE); menuBar.add(fileMenu); JMenuItem newWindow = new JMenuItem(); newWindow.setText("New window"); final javax.swing.JFrame myself = this; newWindow.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { Collection newcoll = new Collection(); newcoll.changeName("Spreadit part collection"); newcoll.changeDescription("Temporary collection of parts"); new spreaditParts(newcoll); } }); fileMenu.add(newWindow); JMenuItem addBasic = new JMenuItem(); addBasic.setText("Add basic Part"); addBasic.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK)); addBasic.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { basicEnterer dialog = new basicEnterer(myself, true); Part aPart = dialog.getPart(); if(dialog.cancelled) { return; } if(aPart!=null) { _Collection.addObject(aPart); System.out.println("composite Part added"); } else { JOptionPane.showMessageDialog(spreaditParts.this, "Something was wrong with your part, it was rejected. Check that the sequence obeys the Format.", "Basic part failed", JOptionPane.ERROR_MESSAGE); } } }); fileMenu.add(addBasic); JMenuItem addComposite = new JMenuItem(); addComposite.setText("Add composite Part"); addComposite.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK)); addComposite.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { compositeEnterer dialog = new compositeEnterer(myself, true); if(dialog.cancelled) { return; } Part aPart = dialog.getPart(); if(aPart!=null) { _Collection.addObject(aPart); System.out.println("composite Part added"); } else { JOptionPane.showMessageDialog(spreaditParts.this, "Something was wrong with your part, it was rejected. Perhaps these parts cannot be composed together", "Composite part failed", JOptionPane.ERROR_MESSAGE); } } }); fileMenu.add(addComposite); JMenuItem changeColl = new JMenuItem(); changeColl.setText("Change Default Collection"); changeColl.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { //Throw up a dialog and get user to select the collection stored as 'chosen' ArrayList<ObjLink> allColl = Collector.getAllLinksOf(ObjType.COLLECTION); if(allColl.isEmpty()) { return; } Object[] allNames = allColl.toArray(); ObjLink link = (ObjLink) JOptionPane.showInputDialog(null, "Choose one", "Collection", JOptionPane.INFORMATION_MESSAGE, null, allNames, allNames[0]); if(link!=null) { Collection chosen = Collector.getCollection(link.uuid); _prefs.put("launchCollection", chosen.getUUID()); } } }); fileMenu.add(changeColl); JMenuItem changeIcon = new JMenuItem(); changeIcon.setText("Change icon"); changeIcon.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { //DO A FILE CHOOSER AND CHANGE LOGO.PNG TO THE FILE } }); fileMenu.add(changeIcon); JMenuItem closeWindow = new JMenuItem(); closeWindow.setText("Close window"); closeWindow.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W, java.awt.event.InputEvent.CTRL_MASK)); closeWindow.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { myself.dispose(); } }); fileMenu.add(closeWindow); JMenu editMenu = new JMenu(); editMenu.setText("Edit"); editMenu.setForeground(Color.WHITE); menuBar.add(editMenu); JMenuItem selectAll = new JMenuItem(); selectAll.setText("Select all"); selectAll.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_MASK)); selectAll.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { table.selectAll(); } }); editMenu.add(selectAll); JMenuItem find = new JMenuItem(); find.setText("Search name/description"); find.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK)); find.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { String query = JOptionPane.showInputDialog( "What do you want to search for?" ); if(query==null) { return; } searchString(query); } }); editMenu.add(find); JMenuItem findSeq = new JMenuItem(); findSeq.setText("Search sequence"); findSeq.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK)); findSeq.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { String query = JOptionPane.showInputDialog( "What sequence do you want to search for?" ); if(query==null) { return; } searchSeq(query); } }); editMenu.add(findSeq); JMenu selectMenu = new JMenu(); selectMenu.setText("Selection"); selectMenu.setForeground(Color.WHITE); menuBar.add(selectMenu); JMenuItem save = new JMenuItem(); save.setText("Save selected"); save.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK)); save.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { int[] selected = table.getSelectedRows(); for(int i: selected) { Part selectPart = allParts.get(i); selectPart.saveDefault(); } } }); selectMenu.add(save); /* JMenuItem copyall = new JMenuItem(); copyall.setText("Copy selected"); copyall.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { int[] selected = table.getSelectedRows(); copyList.clear(); cutmode = true; copiedWindow = spreaditParts.this; for(int i: selected) { Part selectPart = allParts.get(i); copyList.add(selectPart); } } }); //selectMenu.add(copyall); JMenuItem cutall = new JMenuItem(); cutall.setText("Cut selected"); cutall.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { int[] selected = table.getSelectedRows(); copyList.clear(); cutmode = false; copiedWindow = spreaditParts.this; for(int i: selected) { Part selectPart = allParts.get(i); copyList.add(selectPart); } } }); //selectMenu.add(cutall); JMenuItem pasteselected = new JMenuItem(); pasteselected.setText("Paste selected"); pasteselected.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { for(Part apart: copyList) { _Collection.addObject(apart); } if(copiedWindow!=null) { if(cutmode) { for(Part apart: copyList) { copiedWindow._Collection.removeItem(apart); } } } cutmode = false; } }); //selectMenu.add(pasteselected); */ JPanel plasmidCalculator = new JPanel(); plasmidCalculator.setLayout(null); plasmidCalculator.setBackground(null); plasmidCalculator.setBorder(null); plasmidCalculator.setOpaque(false); menuBar.add(plasmidCalculator); JLabel vectorLabel = new JLabel("Vector:"); vectorLabel.setForeground(Color.WHITE); vectorLabel.setBounds(25, 1, 50, 21); vectorLabel.setFont(labelText); plasmidCalculator.add(vectorLabel); vectorOfPlasmidCalc = new JTextField(); vectorOfPlasmidCalc.setText(""); vectorOfPlasmidCalc.setBounds(80, 1, 75, 21); vectorOfPlasmidCalc.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final String vectorname = vectorOfPlasmidCalc.getText(); if(vectorname.equals("")) { return; } new Thread() { @Override public void run() { chosenVector = Vector.retrieveByName(vectorname); if(chosenVector==null) { Part apart = Part.retrieveByName(vectorname); if(apart!=null) { JOptionPane.showMessageDialog(spreaditParts.this, "It looks like you put a part into the vector field.", "Data is swapped", JOptionPane.ERROR_MESSAGE); } else { JOptionPane.showMessageDialog(spreaditParts.this, "I couldn't find that vector.", "Vector unavailable", JOptionPane.ERROR_MESSAGE); } } runPlasmidCalculator(); } }.start(); } }); } }); plasmidCalculator.add(vectorOfPlasmidCalc); JLabel partLabel = new JLabel("Part:"); partLabel.setForeground(Color.WHITE); partLabel.setBounds(175, 1, 40, 21); partLabel.setFont(labelText); plasmidCalculator.add(partLabel); partOfPlasmidCalc = new JTextField(); partOfPlasmidCalc.setText(""); partOfPlasmidCalc.setBounds(220, 1, 75, 21); partOfPlasmidCalc.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final String partname = partOfPlasmidCalc.getText(); if(partname.equals("")) { return; } new Thread() { @Override public void run() { chosenPart = Part.retrieveByName(partname); if(chosenPart==null) { Vector avect = Vector.retrieveByName(partname); if(avect!=null) { JOptionPane.showMessageDialog(spreaditParts.this, "It looks like you put a vector into the part field.", "Data is swapped", JOptionPane.ERROR_MESSAGE); } else { JOptionPane.showMessageDialog(spreaditParts.this, "I couldn't find that part.", "Part unavailable", JOptionPane.ERROR_MESSAGE); } } runPlasmidCalculator(); } }.start(); } }); } }); plasmidCalculator.add(partOfPlasmidCalc); plasmidIcon = new TransparentButton(ImageSource.getObjectImage(ObjType.PLASMID, 20)); plasmidIcon.setEnterAlpha(0.8f); plasmidIcon.setExitAlpha(1.0f); plasmidIcon.setLocation(310,1); plasmidCalculator.add(plasmidIcon); plasmidIcon.setVisible(false); digestIcon = new TransparentButton(ImageUtilities.loadImageIcon("org/clothocad/tool/spreaditparts/scissors.png", false)); digestIcon.setEnterAlpha(0.8f); digestIcon.setExitAlpha(1.0f); digestIcon.setLocation(332,1); digestIcon.setToolTipText("Calculate plasmid digest"); plasmidCalculator.add(digestIcon); digestIcon.addMouseListener(new MousePopupListener()); createPopupMenu(); digestIcon.setVisible(false); setJMenuBar(menuBar); } private void createPopupMenu() { popup = new JPopupMenu(); //Listener for the second enzyme final ActionListener secondEnzListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JMenuItem chosen = (JMenuItem) e.getSource(); secondEnz = chosen.getText(); System.out.println(firstEnz + " " + secondEnz); plasmidDigester pd = new plasmidDigester(); pd.runDigest(pd.new digItem(chosenPlasmid, firstEnz, secondEnz)); } }; //Listener for the first enzyme MenuAdapter menuListener = new MenuAdapter() { @Override public void menuSelected(MenuEvent e) { JMenu chosen = (JMenu) e.getSource(); firstEnz = chosen.getText(); String[] enzlist2 = new String[] {"EcoRI","XhoI","AlwNI", "BglI", "PstI"}; chosen.removeAll(); for(int i=0; i<enzlist2.length; i++) { JMenuItem item = new JMenuItem(enzlist2[i]); item.addActionListener(secondEnzListener); chosen.add(item); } } }; String[] enzlist1 = new String[] {"EcoRI","BamHI","BglII","XhoI","XbaI", "SpeI", "PstI"}; for(int i=0; i<enzlist1.length; i++) { JMenu item = new JMenu(enzlist1[i]); item.addMenuListener(menuListener); popup.add(item); } } class MenuAdapter implements MenuListener { @Override public void menuSelected(MenuEvent e) { } @Override public void menuDeselected(MenuEvent e) { } @Override public void menuCanceled(MenuEvent e) { } } //Popup listening for digestIcon private class MousePopupListener extends MouseAdapter { @Override public void mousePressed(MouseEvent e) { checkPopup(e); } @Override public void mouseClicked(MouseEvent e) { checkPopup(e); } @Override public void mouseReleased(MouseEvent e) { checkPopup(e); } private void checkPopup(MouseEvent e) { if (e.isPopupTrigger()) { popup.show(digestIcon, e.getX(), e.getY()); } } } private void runPlasmidCalculator() { if(!isInitiated) { System.out.println("runPlasmidCalculator: not initiated"); return; } //If something is null, clear everything if(chosenPart==null || chosenVector==null) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { plasmidIcon.setVisible(false); digestIcon.setVisible(false); } }); chosenPlasmid=null; System.out.println("spreaditParts runPlasmidCalculator: something is null"); return; } //Try to get or create the plasmid chosenPlasmid = Plasmid.retrieveByName(chosenVector.getName() + "-" + chosenPart.getName()); if(chosenPlasmid==null) { System.out.println("runPlasmidCalculator: plasmid by name retrieval failed"); chosenPlasmid = Plasmid.generatePlasmid(chosenPart, chosenVector, Collector.getCurrentUser(), chosenPart.getFormat()); chosenPlasmid.setTransient(); } //Quit if that didn't produce a plasmid if(chosenPlasmid==null) { System.out.println("runPlasmidCalculator: plasmid was null"); return; } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { plasmidIcon.setVisible(true); digestIcon.setVisible(true); } }); ObjBaseObserver obr = new ObjBaseObserver() { @Override public void update(ObjBase obj, RefreshEvent evt) { } }; chosenPlasmid.isRepresentedBy(obr, plasmidIcon); popper = new ObjBasePopup(plasmidIcon,chosenPlasmid); } private void searchSeq(String tags) { try { //Query the database ClothoConnection c = Collector.getDefaultConnection(); ClothoQuery mainQuery = c.createQuery( ObjType.PART ); ClothoQuery seqQuery = mainQuery.createAssociationQuery( Part.Fields.SEQUENCE ); seqQuery.contains( NucSeq.Fields.SEQUENCE, tags, false ); List<ObjBase> results = mainQuery.getResults(); //Wrap the results in a transient collection and launch a viewer Collection outcoll = new Collection(); outcoll.changeName("Find sequence results"); outcoll.changeDescription("Find output from Spreadit Parts for " + tags); for(ObjBase apart : results) { outcoll.addObject(apart); } new spreaditParts(outcoll); } catch( Exception e) { e.printStackTrace(); System.out.println("Sequence find Encountered an error"); } } private void searchString(String tags) { try { //Query the database ClothoConnection c = Collector.getDefaultConnection(); ClothoQuery mainQuery = c.createQuery( ObjType.PART ); mainQuery.contains( Part.Fields.DESCRIPTION, tags, false ); List<ObjBase> descresults = mainQuery.getResults(); c = Collector.getDefaultConnection(); mainQuery = c.createQuery( ObjType.PART ); mainQuery.contains( Part.Fields.NAME, tags, false ); List<ObjBase> nameresults = mainQuery.getResults(); //Wrap the results in a transient collection and launch a viewer Collection outcoll = new Collection(); outcoll.changeName("Find sequence results"); outcoll.changeDescription("Find output from Spreadit Parts for " + tags); for(ObjBase apart : descresults) { outcoll.addObject(apart); } for(ObjBase apart : nameresults) { outcoll.addObject(apart); } new spreaditParts(outcoll); } catch( Exception e) { e.printStackTrace(); } } private void processPartChange(Part aPart, int row, int column, String val) { System.out.println(aPart.getName()); System.out.println(column); switch(column) { case 0: String isbasicstring = "c"; if(aPart.getPartType().equals(Part.partType.Basic)) { isbasicstring = "b"; } if(isbasicstring.equals(val)) { return; } table.setValueAt(isbasicstring, row, column); break; case 1: if(aPart.getName().equals(val)) { return; } aPart.changeName(val); table.setValueAt(aPart.getName(), row, column); break; case 2: if(aPart.getShortDescription().equals(val)) { return; } aPart.changeShortDescription(val); table.setValueAt(aPart.getShortDescription(), row, column); break; case 3: if(aPart.getSeq().toString().equals(val)) { return; } aPart.changeSequence(val); table.setValueAt(aPart.getSeq().toString(), row, column); break; case 4: if(aPart.getFormat().getName().equals(val)) { return; } Format form = Format.retrieveByName(val); aPart.changeFormat(form); table.setValueAt(aPart.getFormat().getName(), row, column); break; case 5: if(aPart.getAuthor().getName().equals(val)) { return; } Person aPerson = Person.retrieveByName(val); aPart.changeAuthor(aPerson); table.setValueAt(aPart.getAuthor().getName(), row, column); break; case 6: System.out.println("changed the find status"); if(findStatus(aPart).equals(val)) { return; } if(val.equals("works")) { aPart.addSearchTag("works"); aPart.removeSearchTag("fails"); } else if(val.equals("fails")) { aPart.removeSearchTag("works"); aPart.addSearchTag("fails"); } table.setValueAt(findStatus(aPart), row, column); break; case 7: if(aPart.getRiskGroup() == Short.parseShort(val)) { return; } short rg = Short.parseShort(val); System.out.println("risk group new is " + rg); aPart.changeRiskGroup(rg); table.setValueAt(((Short) aPart.getRiskGroup()).toString(), row, column); break; } } private void launchPopup(MouseEvent e) { if(table.getSelectedRows().length>1) { System.out.println("Multiple rows selected"); return; } int selection = table.getSelectedRow(); System.out.println("Right click popup on " + selection); } /**----------------- variables -----------------*/ private javax.swing.JScrollPane scroller; private JXTable table; static Color navyblue = new Color(35, 48, 64); private Object[][] _data; private String [] _title; private Collection _Collection; private ArrayList<Part> allParts; static Preferences _prefs; //prefs private int[] columnWidths = new int[8]; List<ObjBaseObserver> obrlist = new ArrayList<ObjBaseObserver>(); refresher refreshOBO; //Plasmid calculator fields private Vector chosenVector; private Part chosenPart; private Plasmid chosenPlasmid; private ObjBasePopup popper; private JTextField vectorOfPlasmidCalc; private JTextField partOfPlasmidCalc; private TransparentButton plasmidIcon; private static Font labelText = new java.awt.Font("Arial", Font.ITALIC, 10); private boolean isInitiated = false; //Digest calculator fields private TransparentButton digestIcon; private JPopupMenu popup; private String firstEnz; private String secondEnz; public enum sortBy {ISBASIC, NAME, DESCRIPTION, SEQUENCE, FORMAT, AUTHOR, RG}; private sortBy sortByChoice = sortBy.NAME; private boolean reverseit = false; }