//=====================================================================
// File: AnalysisView.java
// Class: AnalysisView
// Package: AFLPgui
//
// Author: James J. Benham
// Date: August 11, 1998
// Contact: james_benham@hmc.edu
//
// Genographer v1.0 - Computer assisted scoring of gels.
// Copyright (C) 1998 Montana State University
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; version 2
// of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// The GNU General Public License is distributed in the file GPL
//=====================================================================
package AFLPgui;
import java.awt.Choice;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.ScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import AFLPcore.AnalysisMgr;
import AFLPcore.AnalysisOp;
import AFLPcore.Bin;
import AFLPcore.DataList;
import AFLPcore.FeatureList;
import AFLPcore.Gel;
import AFLPcore.Lane;
/**
* This class is responsible for displaying methods to analyze a gel
* and the results of the analysis. The analysis output is text, so
* it is simply displayed in a text area. A choice box is provided to
* switch between the different analysis methods. In addition to the
* main panel, which contains the TextArea
, this class has
* a ButtonBar
with controls and a Bar
to
* display its status. These should be displayed by whichever object is
* displaying this. Also, this class expects to be contained by a
* ScrollPane
. (To change this, modify the paint method.)
*
* @author James J. Benham
* @version 1.0.0
* @date August 11, 1998
*/
public class AnalysisView extends Panel implements ItemListener
{
//Button bar stuff
private static final int HORZ_SPACE = 5;
private static final int CHOICE_WIDTH = 160;
// Info Bar component parameters
private static int LABEL_H_INSET = 5;
private static int LABEL_V_INSET = 3;
private static int LABEL_WIDTH = 600;
private static int LABEL_HEIGHT = 18;
// Text Area borders
private static int H_BORDER = 10;
private static int V_BORDER = 10;
private TextArea outputArea;
private ButtonBar buttonBar;
private Bar infoBar;
private Label infoLabel;
private Choice methodChoice;
private String selection;
private String output;
private Gel gel;
private Frame topWindow;
/**
* Create a new analysis view with the specified parent window. The
* parent window is used as a parameter for dialog box.
*
* @param parentWin the window that contains this class
*/
public AnalysisView(Frame parentWin)
{
setLayout(null);
setSize(420, 420);
outputArea = new TextArea();
add(outputArea);
outputArea.setBounds(10, 10, 400, 400);
topWindow = parentWin;
// createButtonBar sets the selection
createButtonBar();
createInfoBar();
}
/**
* This runs whatever analysis operation is selected, or the default
* if none has been choosen yet. The output from that method is then
* displayed in a text area.
*
* @param gel the gel to analyze
*/
public void init(Gel gel)
{
this.gel = gel;
AnalysisOp currentMethod;
currentMethod = (AnalysisOp) FeatureList.getAnalysisMgr().get(selection);
output = currentMethod.analyze(gel);
outputArea.setText(output);
infoLabel.setText("Finished running " + selection);
}
/**
* Gives the text currently displayed in the output text area.
*
* @return the text
*/
public String getText()
{
return outputArea.getText();
}
/**
* Called to handle item events. It watches for the selection box
* for the analysis method to change, and when it does, it
* re-runs the analysis.
*/
public void itemStateChanged(ItemEvent e)
{
if(e.getSource() == methodChoice)
{
selection = methodChoice.getSelectedItem();
init(gel);
}
}
/**
* This is used to resize the text area. Note: it assumes that the
* text area is contained by a ScrollPane
. The size is
* set so that it mostly fills the display area. No actually drawing is
* handled here. Instead, the super is called.
*
* @param g the graphics object that represents the drawable area of
* this component.
*
* @see java.awt.ScrollPane
*/
public void paint(Graphics g)
{
//get some size stuff
ScrollPane parent = (ScrollPane) getParent();
Dimension containerSize = parent.getViewportSize();
setLocation(0, 0);
setSize(containerSize);
int height = (containerSize.height - 2*V_BORDER -
parent.getHScrollbarHeight());
int width = (containerSize.width - 2*H_BORDER -
parent.getVScrollbarWidth());
outputArea.setBounds(H_BORDER, V_BORDER, width, height);
//parent.validate();
// do all the real work
super.paint(g);
}
/**
* Gives the button bar used by this class.
*
* @return a button bar with components specific to this class, as
* wells as the standard new, open, save, and print buttons.
*/
public ButtonBar getButtonBar()
{
return buttonBar;
}
/**
* Creates the button bar associated with viewing the analysis.
* It adds a choice box to the four buttons defined in the ButtonBar
* class. The choice box is used to select the method of analysis
*/
private void createButtonBar()
{
buttonBar = new ButtonBar();
buttonBar.setBounds(0, 0, 640, 32);
// Let the parent window handle the action event for the orignal
// button bar components
buttonBar.sendActionEventsTo((ActionListener) topWindow);
methodChoice = new Choice();
AnalysisMgr mgr = FeatureList.getAnalysisMgr();
String names[] = mgr.getNames();
for(int i=0; i < names.length; i++)
methodChoice.add(names[i]);
selection = mgr.getDefaultName();
methodChoice.select(selection);
buttonBar.add(methodChoice);
int startX = buttonBar.getFreeHorzPos();
methodChoice.setBounds(startX + HORZ_SPACE, ButtonBar.VERT_INSET,
CHOICE_WIDTH, ButtonBar.BUTTON_HEIGHT);
startX += CHOICE_WIDTH + HORZ_SPACE;
methodChoice.addItemListener(this);
}
/**
* Gives the label that this class uses to provide status information.
*
* @return a bar containing the label described above.
*/
public Bar getInfoBar()
{
return infoBar;
}
/**
* Creates the status bar, which contains a label used to provide
* info about this class to the user.
*/
private void createInfoBar()
{
// create the label
infoLabel = new Label("Analysis Info....");
// create the bar, no bottom border.
infoBar = new Bar(true, false);
infoBar.setLayout(null);
infoBar.add(infoLabel);
infoLabel.setBounds(LABEL_H_INSET, LABEL_V_INSET,
LABEL_WIDTH, LABEL_HEIGHT);
infoBar.setBounds(0, 0, 600, FragmentMap.BAR_HEIGHT);
}
}