/*
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 FEATUREY
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 FEATUREICULAR 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..
*/
/*
* spreaditFeatures.java
*
* Created on Aug 4, 2010, 9:03:45 AM
*/
package org.clothocad.tool.spreaditfeatures;
import java.awt.Rectangle;
import org.clothocad.tool.spreaditfeatures.helpers.HTMLColors;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
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.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
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.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.NucSeq;
import org.clothocore.api.data.ObjBase;
import org.clothocore.api.data.ObjLink;
import org.clothocore.api.data.ObjType;
import org.clothocore.api.data.Feature;
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.dnd.RefreshEvent.Condition;
import org.clothocore.api.plugin.ClothoConnection;
import org.clothocore.api.plugin.ClothoConnection.ClothoQuery;
import org.clothocad.tool.spreaditfeatures.colors.ColorPicker;
import org.clothocad.tool.spreaditfeatures.helpers.ButtonEditor;
import org.clothocad.tool.spreaditfeatures.helpers.ColorRenderer;
import org.clothocore.util.basic.ImageSource;
import org.clothocore.util.basic.ObjBasePopup;
import org.clothocore.util.buttons.TransparentButton;
import org.jdesktop.swingx.JXTable;
/**
*
* @author J. Christopher Anderson
*/
public class spreaditFeatures extends javax.swing.JFrame {
/** Creates new changeFormat spreaditFeatures */
public spreaditFeatures(Collection coll) {
super("Spreadit Features: " + getStringName(coll));
setIconImage(ImageSource.getTinyLogo());
_prefs = Preferences.userNodeForPackage(spreaditFeatures.class);
_Collection = coll;
refreshOBO = new refresher();
_Collection.isRepresentedBy(refreshOBO, this);
new ObjBasePopup(getContentPane(), _Collection);
_title = new String[] { "Name", "Sequence", "RG", "Author", "For Color", "Rev Color", "Families", "Notes"};
initComponents();
//prefs
int wide = _prefs.getInt("spreaditFeaturesWidth", 600);
int high = _prefs.getInt("spreaditFeaturesHeight", 650);
setSize(wide,high);
setVisible(true);
ExcelAdapter myAd = new ExcelAdapter(table);
new Thread() {
@Override
public void run() {
parseFeatures();
//prefs
setWidths();
}
}.start();
cpx = new ColorPicker();
cpx.setVisible(false);
getLayeredPane().add(cpx,2);
}
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("spreaditFeaturesColumn" + 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();
}
if(evt.isCondition(Condition.COLLECTION_ADD) || evt.isCondition(Condition.COLLECTION_REMOVE) ) {
new Thread() {
@Override
public void run() {
parseFeatures();
}
}.start();
}
}
}
private void parseFeatures() {
new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
ArrayList<Feature> inlist = (ArrayList<Feature>) _Collection.getAll(ObjType.FEATURE);
allFeatures = sortList(inlist);
_data = new String [allFeatures.size()][8];
return null;
}
@Override
public void done() {
edtRelay();
}
}.execute();
}
private void edtRelay() {
//Set the table model
finalTableModel = new DefaultTableModel(_data, _title);
table.setModel(finalTableModel);
//Put in special renderers for various columns
table.setDefaultRenderer(java.lang.Object.class, new ColorRenderer(this));
//Put in icon/note chooser for Button column
TableColumn column = table.getColumnModel().getColumn(7);
column.setCellEditor( new ButtonEditor(this));
//Put in the data and listeners
System.out.println(allFeatures.size());
obrlist.clear();
for(int i=0; i<allFeatures.size(); i++ ) {
final Feature currFeat = allFeatures.get(i);
if(currFeat==null) {
continue;
}
final int index = i;
ObjBaseObserver obr = new ObjBaseObserver() {
@Override
public void update(ObjBase obj, final RefreshEvent evt) {
if(obj==null) {
return;
}
refreshValues((Feature) obj, evt);
}
};
obrlist.add(obr);
currFeat.isObservedBy(obr);
obr.update(currFeat, new RefreshEvent(currFeat, Condition.UNKNOWN));
ObjBaseObserver nucobr = new ObjBaseObserver() {
@Override
public void update(ObjBase obj, final RefreshEvent evt) {
if(obj==null) {
return;
}
if(evt.isCondition(Condition.SEQUENCE_CHANGED)) {
table.setValueAt(((NucSeq) obj).toString(), index, 1);
}
}
};
obrlist.add(nucobr);
currFeat.getSeq().isObservedBy(nucobr);
nucobr.update(currFeat.getSeq(), new RefreshEvent(currFeat.getSeq(), Condition.SEQUENCE_CHANGED));
isInitiated = true;
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
table.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
Feature changedFeature = allFeatures.get(e.getFirstRow());
Object ovalue = finalTableModel.getValueAt(e.getFirstRow(), e.getColumn());
String value = null;
try {
value = (String) ovalue;
} catch(Exception er) {
}
if(value==null) {
try {
value = Integer.toString((Integer) ovalue);
} catch(Exception er) {
}
}
if(value==null) {
try {
value = Short.toString((Short) ovalue);
} catch(Exception er) {
}
}
processFeatureChange(changedFeature, e.getFirstRow(), e.getColumn(), value);
}
});
table.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed( MouseEvent e ) {
if(e.getModifiers()==4) {
//Start editing mode on all the buttons so that they are right-clickable
for(int row = 0; row< table.getRowCount(); row++) {
table.editCellAt(row, 7);
}
if(table.getSelectedRows().length>1) {
return;
}
int index = table.getSelectedRow();
Feature feat = null;
try {
feat = allFeatures.get(index);
} catch (Exception err) {
return;
}
if(feat==null) {
return;
}
final Feature aFeature = feat;
boolean pointup = false;
int rowcount = table.getRowCount();
if(index > rowcount/2) {
pointup = true;
}
Rectangle over4 = table.getCellRect(index, 4, true);
if(over4.contains(e.getPoint())) {
int posx = over4.x+10;
if(pointup) {
int posy = over4.y + 40 - ColorPicker.getOffset();
cpx.setLocation(posx, posy);
} else {
int posy = over4.y + 53;
cpx.setLocation(posx, posy);
}
cpx.setVisible(true);
cpx.feature = aFeature;
cpx.isForward = true;
return;
}
Rectangle over5 = table.getCellRect(index, 5, true);
if(over5.contains(e.getPoint())) {
int posx = over5.x+10;
if(pointup) {
int posy = over5.y + 40 - ColorPicker.getOffset();
cpx.setLocation(posx, posy);
} else {
int posy = over5.y + 53;
cpx.setLocation(posx, posy);
}
cpx.setVisible(true);
cpx.feature = aFeature;
cpx.isForward = false;
return;
}
ObjBasePopup obp = new ObjBasePopup(table, aFeature, e.getPoint());
obp.addMenuItem("Remove from Collection", new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
_Collection.removeItem(aFeature);
}
});
cpx.setVisible(false);
} else {
cpx.setVisible(false);
}
}
});
}
});
}
private void refreshValues(Feature currFeat, RefreshEvent evt) {
int index = allFeatures.indexOf(currFeat);
String isbasicstring = "c";
if(evt.isCondition(Condition.UNKNOWN)
|| evt.isCondition(Condition.NAME_CHANGED)) {
table.setValueAt(currFeat.getName(), index, 0);
}
if(evt.isCondition(Condition.UNKNOWN)
|| evt.isCondition(Condition.RISK_GROUP_CHANGED)) {
table.setValueAt(currFeat.getRiskGroup(), index, 2);
}
if(evt.isCondition(Condition.UNKNOWN)
|| evt.isCondition(Condition.AUTHOR_CHANGED)) {
table.setValueAt(currFeat.getAuthor().getName(), index, 3);
}
if(evt.isCondition(Condition.UNKNOWN)
|| evt.isCondition(Condition.COLOR_CHANGED)) {
table.setValueAt(Integer.toString(currFeat.getForwardColor().getRGB()), index, 4);
table.setValueAt(Integer.toString(currFeat.getReverseColor().getRGB()), index, 5);
}
if(evt.isCondition(Condition.UNKNOWN)
|| evt.isCondition(Condition.SEARCHTAG_ADDED)
|| evt.isCondition(Condition.SEARCHTAG_REMOVED)) {
table.setValueAt(writeKeywords(currFeat), index, 6);
}
}
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.NAME;
break;
case 1:
sortmode = sortBy.SEQUENCE;
break;
case 2:
sortmode = sortBy.RISK_GROUP;
break;
case 3:
sortmode = sortBy.AUTHOR;
break;
case 4:
sortmode = sortBy.FOR_COLOR;
break;
case 5:
sortmode = sortBy.REV_COLOR;
break;
case 6:
sortmode = sortBy.FAMILY;
break;
default:
return;
}
if(sortmode.equals(sortByChoice)) {
reverseit = !reverseit;
} else {
reverseit = false;
}
setSortMode(sortmode);
}
}
}
public void setSortMode(sortBy choice) {
sortByChoice = choice;
parseFeatures();
}
private ArrayList<Feature> sortList(ArrayList<Feature> inlist) {
ArrayList<Feature> out = new ArrayList<Feature>();
try {
Comparator comparator = new Comparator() {
@Override
public int compare( Object o1, Object o2 ) {
Feature feature1 = (Feature) o1;
Feature feature2 = (Feature) o2;
switch(sortByChoice) {
case NAME:
String i1 = feature1.getName();
String i2 = feature2.getName();
if ( reverseit ) {
return i2.compareTo( i1 );
} else {
return i1.compareTo( i2 );
}
case FOR_COLOR:
Integer fi1 = feature1.getForwardColor().getRGB();
Integer fi2 = feature2.getForwardColor().getRGB();
if ( reverseit ) {
return fi2.compareTo( fi1 );
} else {
return fi1.compareTo( fi2 );
}
case REV_COLOR:
Integer ri1 = feature1.getReverseColor().getRGB();
Integer ri2 = feature2.getReverseColor().getRGB();
if ( reverseit ) {
return ri2.compareTo( ri1 );
} else {
return ri1.compareTo( ri2 );
}
case SEQUENCE:
String os1 = feature1.getSeq().getSeq();
String os2 = feature2.getSeq().getSeq();
if ( reverseit ) {
return os2.compareTo( os1 );
} else {
return os1.compareTo( os2 );
}
case AUTHOR:
String a1 = feature1.getAuthor().getName();
String a2 = feature2.getAuthor().getName();
if ( reverseit ) {
return a2.compareTo( a1 );
} else {
return a1.compareTo( a2 );
}
default:
return 1;
}
}
};
java.util.Collections.sort( inlist, comparator );
for ( Feature p : inlist ) {
out.add( p );
}
} catch(Exception e) {
e.printStackTrace();
}
return out;
}
private String writeKeywords(Feature afeat) {
ArrayList<String> tags = afeat.getSearchTags();
StringBuffer sb = new StringBuffer();
for(int i=0; i<tags.size(); i++) {
sb.append(tags.get(i));
if(i<tags.size()-1) {
sb.append(", ");
}
}
return sb.toString();
}
private void initComponents() {
scroller = new javax.swing.JScrollPane();
table = new JXTable();
//prefs
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getTableHeader().addMouseListener(new headerListener());
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
_prefs.putInt("spreaditFeaturesWidth", getWidth());
_prefs.putInt("spreaditFeaturesHeight", 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("spreaditFeaturesColumn" + i, columnWidths[i]);
}
}
});
//prefs
table.getColumnModel().addColumnModelListener(new TableColumnModelListener() {
@Override
public void columnAdded(TableColumnModelEvent e) {
}
@Override
public void columnRemoved(TableColumnModelEvent e) {
}
@Override
public void columnMoved(TableColumnModelEvent e) {
}
@Override
public void columnMarginChanged(ChangeEvent e) {
List<TableColumn> cols = table.getColumns();
for(int i=0; i<cols.size(); i++) {
columnWidths[i] = cols.get(i).getWidth();
}
}
@Override
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 Feature Collection");
newcoll.changeDescription("Temporary Collection of Features");
new spreaditFeatures(newcoll);
}
});
fileMenu.add(newWindow);
JMenuItem addFeature = new JMenuItem();
addFeature.setText("Add Feature");
addFeature.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
addFeature.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
featureEnterer dialog = new featureEnterer(myself, true);
Feature afeat = dialog.getFeature();
if(afeat!=null) {
_Collection.addObject(afeat);
System.out.println("basic Feature added");
}
}
});
fileMenu.add(addFeature);
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);
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");
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) {
Feature selectFeat = allFeatures.get(i);
selectFeat.saveDefault();
}
}
});
selectMenu.add(save);
setJMenuBar(menuBar);
}
private void searchSeq(String tags) {
try {
//Query the database
ClothoConnection c = Collector.getDefaultConnection();
ClothoQuery mainQuery = c.createQuery( ObjType.FEATURE );
ClothoQuery seqQuery = mainQuery.createAssociationQuery( Feature.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 Features for " + tags);
for(ObjBase aFeature : results) {
outcoll.addObject(aFeature);
}
new spreaditFeatures(outcoll);
} catch( Exception e) {
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.FEATURE );
mainQuery.contains( Feature.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 Features for " + tags);
for(ObjBase aFeature : nameresults) {
outcoll.addObject(aFeature);
}
new spreaditFeatures(outcoll);
} catch( Exception e) {
}
}
private void processFeatureChange(Feature aFeature, int row, int column, String val) {
switch(column) {
case 0:
if(aFeature.getName().equals(val)) {
return;
}
aFeature.changeName(val);
table.setValueAt(aFeature.getName(), row, column);
break;
case 1:
if(aFeature.getSeq().toString().equals(val)) {
return;
}
aFeature.changeSequence(val);
table.setValueAt(aFeature.getSeq().toString(), row, column);
break;
case 2:
String srg = Short.toString(aFeature.getRiskGroup());
if(srg.equals(val)) {
return;
}
try {
aFeature.changeRiskGroup(Short.parseShort(val));
} catch(Exception err) {
table.setValueAt(srg, row, column);
}
break;
case 3:
if(aFeature.getAuthor().getName().equals(val)) {
return;
}
Person aPerson = Person.retrieveByName(val);
if(aPerson!=null) {
aFeature.changeAuthor(aPerson);
} else {
table.setValueAt(aFeature.getAuthor().getName(), row, column);
}
break;
case 4:
if(Integer.toString(aFeature.getForwardColor().getRGB()).equals(val)) {
System.out.println("Value is unchanged");
return;
}
//If the user typed in a non-color, revert it
Color incolor = null;
try {
incolor = HTMLColors.getColor(val);
} catch(Exception e) {
}
if(incolor==null) {
try {
int icol = Integer.parseInt(val);
incolor = new Color(icol);
} catch(Exception e) {
}
}
if(incolor==null) {
System.out.println("Spreadit Features: That was an invalid forward color");
table.setValueAt(Integer.toString(aFeature.getForwardColor().getRGB()), row, column);
return;
}
//If it's unchanged, return
if(aFeature.getForwardColor().getRGB() == incolor.getRGB()) {
System.out.println("Spreadit Features: forward color isn't really changed");
table.setValueAt(Integer.toString(aFeature.getForwardColor().getRGB()), row, column);
return;
}
//Otherwise, they entered a new valid color, so change it
System.out.println("Spreadit Features: Changeing the forward color");
aFeature.changeForwardColor(incolor);
cpx.modColors(incolor);
break;
case 5:
if(Integer.toString(aFeature.getReverseColor().getRGB()).equals(val)) {
System.out.println("Value is unchanged");
return;
}
//If the user typed in a non-color, revert it
Color in2color = null;
try {
in2color = HTMLColors.getColor(val);
} catch(Exception e) {
}
if(in2color==null) {
try {
int icol = Integer.parseInt(val);
in2color = new Color(icol);
} catch(Exception e) {
}
}
if(in2color==null) {
System.out.println("Spreadit Features: That was an invalid reverse color");
table.setValueAt(Integer.toString(aFeature.getReverseColor().getRGB()), row, column);
return;
}
//If it's unchanged, return
if(aFeature.getReverseColor().getRGB() == in2color.getRGB()) {
System.out.println("Spreadit Features: reverse color isn't really changed");
table.setValueAt(Integer.toString(aFeature.getReverseColor().getRGB()), row, column);
return;
}
//Otherwise, they entered a new valid color, so change it
System.out.println("Spreadit Features: Changeing the forward color");
aFeature.changeReverseColor(in2color);
cpx.modColors(in2color);
break;
case 6:
if(val.equals("")) {
return;
}
table.setValueAt("", 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);
}
public Feature getFeatureAt(int row) {
return allFeatures.get(row);
}
/**-----------------
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<Feature> allFeatures;
private DefaultTableModel finalTableModel;
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 Feature chosenFeature;
private Plasmid chosenPlasmid;
private ObjBasePopup popper;
private JTextField vectorOfPlasmidCalc;
private JTextField featureOfPlasmidCalc;
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 {NAME, SEQUENCE, AUTHOR, RISK_GROUP, FOR_COLOR, REV_COLOR, FAMILY};
private sortBy sortByChoice = sortBy.NAME;
private boolean reverseit = false;
ColorPicker cpx;
}