/* 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.. */ package org.clothocad.tool.sequenceanalysistool.gui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import javax.swing.JFrame; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.BevelBorder; import net.iharder.dnd.FileDrop; import org.clothocad.library.sequencelight.nucSeqEditor; import org.clothocore.api.actor.Actor; import org.clothocore.api.actor.data.BooleanToken; import org.clothocore.api.actor.data.ListToken; import org.clothocore.api.actor.data.ObjBaseToken; import org.clothocore.api.actor.data.StringToken; import org.clothocore.api.core.Collator; import org.clothocore.api.core.Collector; import org.clothocore.api.core.wrapper.AlgorithmWrapper; import org.clothocore.api.data.Feature; import org.clothocore.api.data.NucSeq; import org.clothocore.api.data.ObjBase; import org.clothocore.api.data.ObjType; import org.clothocore.api.data.Oligo; import org.clothocore.api.data.Part; import org.clothocore.api.data.Plasmid; import org.clothocore.api.data.Vector; import org.clothocore.util.basic.ImageSource; import org.clothocore.util.buttons.TransparentButton; import org.openide.util.ImageUtilities; /** * * @author J. Christopher Anderson */ public class SeqFrame extends JFrame { public SeqFrame() { super("Sequence Checker"); setIconImage(ImageSource.getTinyLogo()); templateSeq = new NucSeq(""); templateSeq.setTransient(); initComponents(); } public SeqFrame(ObjBase obj) { super("PCR Predictor"); if(obj==null) { return; } switch(obj.getType()) { case NUCSEQ: templateSeq = (NucSeq) obj; break; case PART: TemplateObj = obj; templateSeq = ((Part) obj).getSeq(); break; case PLASMID: TemplateObj = obj; templateSeq = ((Plasmid) obj).getSeq(); break; case VECTOR: TemplateObj = obj; templateSeq = ((Vector) obj).getSeq(); break; case OLIGO: TemplateObj = obj; templateSeq = ((Oligo) obj).getSeq(); break; case FEATURE: TemplateObj = obj; templateSeq = ((Feature) obj).getSeq(); break; } initComponents(); } private void initComponents() { getContentPane().setBackground(navyblue); setLayout(new BorderLayout()); Box headerPanel = new Box(BoxLayout.X_AXIS); headerPanel.setBorder(new BevelBorder(BevelBorder.LOWERED)); add(headerPanel, BorderLayout.NORTH); headerPanel.add(Box.createHorizontalStrut(2)); whiteLabel partlabel = new whiteLabel(partImg); headerPanel.add(partlabel); whiteLabel vectorlabel = new whiteLabel(vectorImg); headerPanel.add(vectorlabel); whiteLabel featurelabel = new whiteLabel(featureImg); headerPanel.add(featurelabel); whiteLabel tmplabel = new whiteLabel(plasmidImg); tmplabel.setText("Retrieve Sequence:"); headerPanel.add(tmplabel); headerPanel.add(Box.createHorizontalStrut(2)); final JTextField tmpfield = new JTextField(); tmpfield.setPreferredSize(new Dimension(100,22)); tmpfield.addFocusListener(new FocusAdapter(){ @Override public void focusLost(FocusEvent e) { if(!Collector.isConnected()) { return; } String text = tmpfield.getText().trim(); if(text==null || text.equals("")) { return; } NucSeq out = null; while(true) { Part outpart = Part.retrieveByName(text); if(outpart!=null) { out = outpart.getSeq(); break; } Vector outvect = Vector.retrieveByName(text); if(outvect!=null) { out = outvect.getSeq(); break; } Feature outfeat = Feature.retrieveByName(text); if(outfeat!=null) { out = outfeat.getSeq(); break; } Plasmid outplas = Plasmid.retrieveByName(text); if(outplas!=null) { out = outplas.getSeq(); break; } break; } if(out==null) { return; } templateSeq.changeSeq(out.getSeq()); } }); headerPanel.add(tmpfield); Box leftpanel = new Box(BoxLayout.Y_AXIS); leftpanel.setBackground(Color.BLUE); add(leftpanel); templateArea = new nucSeqEditor(templateSeq, this); templateArea.setPreferredSize(new Dimension(450,380)); leftpanel.add(templateArea); JPanel lowerpanel = new JPanel(); lowerpanel.setOpaque(false); leftpanel.add(lowerpanel); lowerpanel.setLayout(new BorderLayout()); lowerpanel.setMaximumSize(new Dimension(10000,26)); JButton goButton = new JButton("Run"); goButton.setPreferredSize(new Dimension(100,23)); goButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { runCalc(); } }); lowerpanel.add(goButton, BorderLayout.WEST); buttonPanel = new Box(BoxLayout.X_AXIS); lowerpanel.add(buttonPanel, BorderLayout.CENTER); //Put in the plugin fileDrop new FileDrop( getContentPane(), new FileDrop.Listener() { @Override public void filesDropped( java.io.File[] files ) { pluginDropped( files ); } } ); pack(); setVisible(true); } /** * This is the main thing for running the algorithm */ private void runCalc() { //Get the Actors from a plugin Actor seqActor = null; try { AlgorithmWrapper saa = (AlgorithmWrapper) Collator.getPluginByUUID("org.clothocad.algorithm.seqanalyzer"); System.out.println(saa.getUUID()); seqActor = saa.getAlgorithm().createAlgorithm(); } catch(Exception err) { JOptionPane.showMessageDialog(this, "It appears that the Sequencing algorithm has been uninstalled.", "Algorithm Missing", JOptionPane.ERROR_MESSAGE); } if(seqActor==null) { return; } //Create the tokens for inputs String name = ""; if(TemplateObj!=null) { name = TemplateObj.getName(); } ObjBaseToken seqtoken = new ObjBaseToken(templateSeq); StringToken seqName = new StringToken( name ); ObjBaseToken author = new ObjBaseToken(Collector.getCurrentUser()); ListToken filelist = new ListToken(File.class); BooleanToken throwresult = new BooleanToken(true); //Poupulate the file list ArrayList<File> files = new ArrayList<File>(); for(String filepath : fileNames) { File afile = new File(filepath); if(afile.exists()) { files.add(afile); } } filelist.setData(files); //Install the input ports seqActor.getInputs().get( 0 ).put( seqtoken ); seqActor.getInputs().get( 1 ).put( seqName ); seqActor.getInputs().get( 2 ).put( author ); seqActor.getInputs().get( 3 ).put( filelist ); seqActor.getInputs().get( 4 ).put( throwresult ); //Run it System.out.println( seqActor.run() ); } private void pluginDropped(File[] files) { for(File afile : files) { if(!afile.exists()) { continue; } System.out.println(afile.getName()); fileNames.add(afile.getAbsolutePath()); } putInFiles(); } private void putInFiles() { System.out.println("fileimage width : " + fileImage.getIconWidth()); buttonPanel.removeAll(); buttonPanel.add(Box.createVerticalStrut(15)); for(String str : fileNames) { File afile = new File(str); final String name = afile.getName(); final fileButton tb = new fileButton(afile.getAbsolutePath(), fileImage); buttonPanel.add(tb); tb.setToolTipText(name); tb.setEnterAlpha(0.8f); tb.setExitAlpha(1.0f); tb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { fileNames.remove(tb.filepath); putInFiles(); } }); } validate(); repaint(); } private class fileButton extends TransparentButton { public fileButton(String filep, ImageIcon icon) { super(icon); filepath = filep; } //VARIABLES// public String filepath; } private class whiteLabel extends JLabel { public whiteLabel(String name) { super(name); init(); } public whiteLabel(ImageIcon icon) { super(icon); init(); } private void init() { setForeground(Color.WHITE); setFont(arialItal12); } } /*----------------- variables -----------------*/ private static final Color navyblue = new Color(35, 48, 64); private static final Font arialItal12 = new Font("Arial", Font.ITALIC, 12); nucSeqEditor templateArea; nucSeqEditor prodArea; private Box buttonPanel; private HashSet<String> fileNames = new HashSet<String>(); private static final ImageIcon oligoImg = ImageSource.getObjectImage(ObjType.OLIGO, 17); private static final ImageIcon partImg = ImageSource.getObjectImage(ObjType.PART, 17); private static final ImageIcon vectorImg = ImageSource.getObjectImage(ObjType.VECTOR, 17); private static final ImageIcon featureImg = ImageSource.getObjectImage(ObjType.FEATURE, 17); private static final ImageIcon plasmidImg = ImageSource.getObjectImage(ObjType.PLASMID, 17); private static final ImageIcon fileImage = ImageUtilities.loadImageIcon( "org/clothocad/tool/sequenceanalysistool/gui/abifile.png", false ); NucSeq templateSeq; private ObjBase TemplateObj; }