/*
* EuroCarbDB, a framework for carbohydrate bioinformatics
*
* Copyright (c) 2006-2009, Eurocarb project, or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
* A copy of this license accompanies this distribution in the file LICENSE.txt.
*
* 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 Lesser General Public License
* for more details.
*
* Last commit: $Rev: 1930 $ by $Author: david@nixbioinf.org $ on $Date:: 2010-07-29 #$
*/
/**
@author Alessio Ceroni (a.ceroni@imperial.ac.uk)
*/
package org.eurocarbdb.application.glycoworkbench.plugin;
import org.eurocarbdb.application.glycoworkbench.plugin.reporting.*;
import org.eurocarbdb.application.glycoworkbench.*;
import org.eurocarbdb.application.glycanbuilder.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.awt.print.*;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.Range;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYBarDataset;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.chart.annotations.XYShapeAnnotation;
import org.jfree.chart.annotations.XYTextAnnotation;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYBarRenderer;
public class AnnotationReportApplet extends JApplet implements ActionListener, MouseListener, AnnotationReportCanvas.SelectionChangeListener, BaseDocument.DocumentChangeListener {
// singletons
private ActionManager theActionManager;
private JMenuBar theMenuBar;
private JToolBar theToolBar;
private AnnotationReportCanvas theCanvas;
private JScrollPane theScrollPane;
private ButtonGroup display_button_group = null;
protected HashMap<String,ButtonModel> display_models = null;
public AnnotationReportApplet() {
}
public void paint(Graphics g) {
super.paint(g);
// Draw a 2-pixel border
g.setColor(Color.black);
int width = getSize().width; // Width of the applet.
int height = getSize().height; // Height of the applet.
g.drawRect(0,0,width-1,height-1);
g.drawRect(1,1,width-3,height-3);
}
public Insets getInsets() {
return new Insets(2,2,2,2);
}
public void init() {
super.init();
LogUtils.setGraphicalReport(true);
// create singletons
theActionManager = new ActionManager();
// create interface
createUI();
}
public void start() {
super.start();
}
public void stop() {
super.stop();
}
public void destroy() {
super.destroy();
}
public void createUI() {
// set the layout
getContentPane().setLayout(new BorderLayout());
// set singletons
theCanvas = new AnnotationReportCanvas(new AnnotationReportDocument(),false);
theCanvas.getDocument().addDocumentChangeListener(this);
// initialize the action set
createActions();
// set the MenuBar
theMenuBar = createMenuBar();
setJMenuBar(theMenuBar);
// set the toolbars
UIManager.getDefaults().put("ToolTip.hideAccelerator",Boolean.TRUE);
theToolBar = createToolBar();
getContentPane().add(theToolBar,BorderLayout.NORTH);
// set the drawing pane
theScrollPane = new JScrollPane(theCanvas);
theCanvas.setScrollPane(theScrollPane);
getContentPane().add(theScrollPane,BorderLayout.CENTER);
// finish setting up
theCanvas.addMouseListener( this );
theCanvas.addSelectionChangeListener(this);
setSize(900,700);
updateActions();
}
private void createActions() {
//file
theActionManager.add("print",FileUtils.defaultThemeManager.getImageIcon("print"),"Print...",KeyEvent.VK_P, "ctrl P",this);
//edit
theActionManager.add("undo",FileUtils.defaultThemeManager.getImageIcon("undo"),"Undo",KeyEvent.VK_U, "ctrl Z",this);
theActionManager.add("redo",FileUtils.defaultThemeManager.getImageIcon("redo"),"Redo", KeyEvent.VK_R, "ctrl Y",this);
theActionManager.add("cut",FileUtils.defaultThemeManager.getImageIcon("cut"),"Cut",KeyEvent.VK_T, "ctrl X",this);
theActionManager.add("copy",FileUtils.defaultThemeManager.getImageIcon("copy"),"Copy",KeyEvent.VK_C, "ctrl C",this);
theActionManager.add("delete",FileUtils.defaultThemeManager.getImageIcon("delete"),"Delete",KeyEvent.VK_DELETE, "",this);
theActionManager.add("screenshot",FileUtils.defaultThemeManager.getImageIcon("screenshot"),"Screenshot",KeyEvent.VK_PRINTSCREEN, "PRINTSCREEN",this);
theActionManager.add("selectall",FileUtils.defaultThemeManager.getImageIcon("selectall"),"Select all",KeyEvent.VK_A, "ctrl A",this);
theActionManager.add("selectnone",FileUtils.defaultThemeManager.getImageIcon("selectnone"),"Select none",KeyEvent.VK_E, "ESCAPE",this);
theActionManager.add("enlarge",FileUtils.defaultThemeManager.getImageIcon("enlarge"),"Enlarge selected structures",-1, "",this);
theActionManager.add("resetsize",FileUtils.defaultThemeManager.getImageIcon("resetsize"),"Reset size of selected structures to default value",-1, "",this);
theActionManager.add("shrink",FileUtils.defaultThemeManager.getImageIcon("shrink"),"Shrink selected structures",-1, "",this);
theActionManager.add("ungroup",FileUtils.defaultThemeManager.getImageIcon("ungroup"),"Ungroup selected structures",-1, "",this);
theActionManager.add("group",FileUtils.defaultThemeManager.getImageIcon("group"),"Group selected structures",-1, "",this);
theActionManager.add("placestructures",FileUtils.defaultThemeManager.getImageIcon("placestructures"),"Automatic place all structures",-1, "",this);
// view
theActionManager.add("zoomnone",FileUtils.defaultThemeManager.getImageIcon("zoomnone"),"Reset zoom",-1, "",this);
theActionManager.add("zoomin",FileUtils.defaultThemeManager.getImageIcon("zoomin"),"Zoom in",-1, "",this);
theActionManager.add("zoomout",FileUtils.defaultThemeManager.getImageIcon("zoomout"),"Zoom out",-1, "",this);
theActionManager.add("notation=" + GraphicOptions.NOTATION_CFG, ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3), "CFG notation", KeyEvent.VK_C, "", this);
theActionManager.add("notation=" + GraphicOptions.NOTATION_CFGBW, ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3), "CFG black and white notation", KeyEvent.VK_B, "", this);
theActionManager.add("notation=" + GraphicOptions.NOTATION_CFGLINK, ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3), "CFG with linkage placement notation", KeyEvent.VK_L, "", this);
theActionManager.add("notation=" + GraphicOptions.NOTATION_UOXF, ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3), "UOXF notation", KeyEvent.VK_O, "", this);
theActionManager.add("notation=" + GraphicOptions.NOTATION_TEXT, ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3), "Text only notation", KeyEvent.VK_T, "", this);
theActionManager.add("display=" + GraphicOptions.DISPLAY_COMPACT, ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3), "compact view", KeyEvent.VK_O, "", this);
theActionManager.add("display=" + GraphicOptions.DISPLAY_NORMAL, ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3), "normal view", KeyEvent.VK_N, "", this);
theActionManager.add("display=" + GraphicOptions.DISPLAY_NORMALINFO, ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3), "normal view with linkage info", KeyEvent.VK_I, "", this);
theActionManager.add("display=" + GraphicOptions.DISPLAY_CUSTOM, ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3), "custom view with user settings", KeyEvent.VK_K, "", this);
theActionManager.add("orientation",getOrientationIcon(),"Change orientation",-1,"",this);
theActionManager.add("displaysettings",ThemeManager.getEmptyIcon(ICON_SIZE.TINY),"Change structure display settings",KeyEvent.VK_S,"",this);
theActionManager.add("reportsettings",ThemeManager.getEmptyIcon(ICON_SIZE.TINY),"Change report display settings",KeyEvent.VK_R,"",this);
}
private void updateActions() {
theActionManager.get("undo").setEnabled(theCanvas.getDocument().getUndoManager().canUndo());
theActionManager.get("redo").setEnabled(theCanvas.getDocument().getUndoManager().canRedo());
theActionManager.get("cut").setEnabled(theCanvas.hasSelection());
theActionManager.get("copy").setEnabled(theCanvas.hasSelection());
theActionManager.get("delete").setEnabled(theCanvas.hasSelection());
theActionManager.get("enlarge").setEnabled(theCanvas.hasSelection());
theActionManager.get("resetsize").setEnabled(theCanvas.hasSelection());
theActionManager.get("shrink").setEnabled(theCanvas.hasSelection());
theActionManager.get("group").setEnabled(theCanvas.canGroupSelections());
theActionManager.get("orientation").putValue(Action.SMALL_ICON,getOrientationIcon());
}
private JMenu createExportDrawingMenu() {
JMenu export_menu = new JMenu("Export to graphical formats");
export_menu.setIcon(FileUtils.defaultThemeManager.getImageIcon("export"));
for(Map.Entry<String,String> e : SVGUtils.getExportFormats().entrySet() )
export_menu.add(theActionManager.get("export="+e.getKey()));
return export_menu;
}
private JMenu createFileMenu() {
JMenu file_menu = new JMenu("File");
file_menu.add(theActionManager.get("print"));
return file_menu;
}
private JMenu createEditMenu() {
JMenu edit_menu = new JMenu("Edit");
edit_menu.setMnemonic(KeyEvent.VK_E);
edit_menu.add(theActionManager.get("undo"));
edit_menu.add(theActionManager.get("redo"));
edit_menu.addSeparator();
edit_menu.add(theActionManager.get("cut"));
edit_menu.add(theActionManager.get("copy"));
edit_menu.add(theActionManager.get("delete"));
edit_menu.add(theActionManager.get("screenshot"));
edit_menu.addSeparator();
edit_menu.add(theActionManager.get("selectall"));
edit_menu.add(theActionManager.get("selectnone"));
edit_menu.addSeparator();
edit_menu.add(theActionManager.get("enlarge"));
edit_menu.add(theActionManager.get("resetsize"));
edit_menu.add(theActionManager.get("shrink"));
edit_menu.addSeparator();
edit_menu.add(theActionManager.get("group"));
edit_menu.add(theActionManager.get("ungroup"));
edit_menu.addSeparator();
edit_menu.add(theActionManager.get("placestructures"));
return edit_menu;
}
private JMenu createViewMenu() {
GraphicOptions view_opt = theCanvas.getWorkspace().getGraphicOptions();
JMenu view_menu = new JMenu("View");
view_menu.setMnemonic(KeyEvent.VK_V);
// zoom
view_menu.add(theActionManager.get("zoomnone"));
view_menu.add(theActionManager.get("zoomin"));
view_menu.add(theActionManager.get("zoomout"));
view_menu.addSeparator();
// notation
JRadioButtonMenuItem last = null;
ButtonGroup groupn = new ButtonGroup();
view_menu.add(last = new JRadioButtonMenuItem(theActionManager.get("notation=" + GraphicOptions.NOTATION_CFG)));
last.setSelected(view_opt.NOTATION.equals(GraphicOptions.NOTATION_CFG));
groupn.add(last);
view_menu.add(last = new JRadioButtonMenuItem(theActionManager.get("notation=" + GraphicOptions.NOTATION_CFGBW)));
last.setSelected(view_opt.NOTATION.equals(GraphicOptions.NOTATION_CFGBW));
groupn.add(last);
view_menu.add(last = new JRadioButtonMenuItem(theActionManager.get("notation=" + GraphicOptions.NOTATION_CFGLINK)));
last.setSelected(view_opt.NOTATION.equals(GraphicOptions.NOTATION_CFGLINK));
groupn.add(last);
view_menu.add(last = new JRadioButtonMenuItem(theActionManager.get("notation=" + GraphicOptions.NOTATION_UOXF)));
last.setSelected(view_opt.NOTATION.equals(GraphicOptions.NOTATION_UOXF));
groupn.add(last);
view_menu.add(last = new JRadioButtonMenuItem(theActionManager.get("notation=" + GraphicOptions.NOTATION_TEXT)));
last.setSelected(view_opt.NOTATION.equals(GraphicOptions.NOTATION_TEXT));
groupn.add(last);
view_menu.addSeparator();
// display
display_button_group = new ButtonGroup();
display_models = new HashMap<String,ButtonModel>();
view_menu.add(last = new JRadioButtonMenuItem(theActionManager.get("display=" + GraphicOptions.DISPLAY_COMPACT)));
last.setSelected(view_opt.DISPLAY.equals(GraphicOptions.DISPLAY_COMPACT));
display_models.put(GraphicOptions.DISPLAY_COMPACT,last.getModel());
display_button_group.add(last);
view_menu.add(last = new JRadioButtonMenuItem(theActionManager.get("display=" + GraphicOptions.DISPLAY_NORMAL)));
last.setSelected(view_opt.DISPLAY.equals(GraphicOptions.DISPLAY_NORMAL));
display_models.put(GraphicOptions.DISPLAY_NORMAL,last.getModel());
display_button_group.add(last);
view_menu.add(last = new JRadioButtonMenuItem(theActionManager.get("display=" + GraphicOptions.DISPLAY_NORMALINFO)));
last.setSelected(view_opt.DISPLAY.equals(GraphicOptions.DISPLAY_NORMALINFO));
display_models.put(GraphicOptions.DISPLAY_NORMALINFO,last.getModel());
display_button_group.add(last);
view_menu.add(last = new JRadioButtonMenuItem(theActionManager.get("display=" + GraphicOptions.DISPLAY_CUSTOM)));
last.setSelected(view_opt.DISPLAY.equals(GraphicOptions.DISPLAY_CUSTOM));
display_models.put(GraphicOptions.DISPLAY_CUSTOM,last.getModel());
display_button_group.add(last);
//view_menu.add( lastcb = new JCheckBoxMenuItem(theActionManager.get("showinfo")) );
//lastcb.setState(view_opt.SHOW_INFO);
view_menu.addSeparator();
// orientation
view_menu.add(theActionManager.get("orientation"));
view_menu.addSeparator();
view_menu.add(theActionManager.get("displaysettings"));
view_menu.add(theActionManager.get("reportsettings"));
return view_menu;
}
private JMenuBar createMenuBar() {
JMenuBar menubar = new JMenuBar();
menubar.add(createFileMenu());
menubar.add(createEditMenu());
menubar.add(createViewMenu());
return menubar;
}
protected JPopupMenu createPopupMenu() {
JPopupMenu menu = new JPopupMenu();
menu.add(theActionManager.get("zoomnone"));
menu.add(theActionManager.get("zoomin"));
menu.add(theActionManager.get("zoomout"));
menu.addSeparator();
menu.add(theActionManager.get("cut"));
menu.add(theActionManager.get("copy"));
menu.add(theActionManager.get("delete"));
menu.addSeparator();
menu.add(theActionManager.get("enlarge"));
menu.add(theActionManager.get("resetsize"));
menu.add(theActionManager.get("shrink"));
menu.addSeparator();
menu.add(theActionManager.get("group"));
menu.add(theActionManager.get("ungroup"));
return menu;
}
private JToolBar createToolBar() {
JToolBar toolbar = new JToolBar();
toolbar.setFloatable(false);
toolbar.add(theActionManager.get("print"));
toolbar.addSeparator();
toolbar.add(theActionManager.get("undo"));
toolbar.add(theActionManager.get("redo"));
toolbar.addSeparator();
toolbar.add(theActionManager.get("cut"));
toolbar.add(theActionManager.get("copy"));
toolbar.add(theActionManager.get("delete"));
toolbar.add(theActionManager.get("screenshot"));
toolbar.addSeparator();
toolbar.add(theActionManager.get("enlarge"));
toolbar.add(theActionManager.get("resetsize"));
toolbar.add(theActionManager.get("shrink"));
toolbar.addSeparator();
toolbar.add(theActionManager.get("zoomnone"));
toolbar.add(theActionManager.get("zoomin"));
toolbar.add(theActionManager.get("zoomout"));
toolbar.addSeparator();
toolbar.add(theActionManager.get("orientation"));
return toolbar;
}
// actions
public void setDocument(String src) {
try {
theCanvas.getDocument().fromXMLString(src);
}
catch(Exception e) {
LogUtils.report(e);
theCanvas.getDocument().init();
}
}
public void setDocument(byte[] src) {
try {
theCanvas.getDocument().fromXMLString(src);
}
catch(Exception e) {
LogUtils.report(e);
theCanvas.getDocument().init();
}
}
public String getDocument() {
return theCanvas.getDocument().toXMLString();
}
public void onZoomNone() {
theCanvas.setScale(1.);
}
public void onZoomIn() {
theCanvas.setScale(theCanvas.getScale()*1.5);
}
public void onZoomOut() {
theCanvas.setScale(theCanvas.getScale()*0.667);
}
public void onUndo() {
try {
theCanvas.getDocument().getUndoManager().undo();
}
catch(Exception e) {
LogUtils.report(e);
}
}
public void onRedo() {
try {
theCanvas.getDocument().getUndoManager().redo();
}
catch(Exception e) {
LogUtils.report(e);
}
}
public void setNotation(String notation) {
theCanvas.getWorkspace().setNotation(notation);
theCanvas.updateView();
}
public void setDisplay(String display) {
theCanvas.getWorkspace().setDisplay(display);
theCanvas.updateView();
}
public void onChangeOrientation() {
theCanvas.getWorkspace().getGraphicOptions().ORIENTATION = (theCanvas.getWorkspace().getGraphicOptions().ORIENTATION+1)%4;
theCanvas.updateView();
}
private Icon getOrientationIcon() {
int orientation = theCanvas.getWorkspace().getGraphicOptions().ORIENTATION;
if( orientation==GraphicOptions.LR )
return FileUtils.defaultThemeManager.getImageIcon("lr");
if( orientation==GraphicOptions.RL )
return FileUtils.defaultThemeManager.getImageIcon("rl");
if( orientation==GraphicOptions.TB )
return FileUtils.defaultThemeManager.getImageIcon("tb");
if( orientation==GraphicOptions.BT )
return FileUtils.defaultThemeManager.getImageIcon("bt");
return null;
}
public void onChangeDisplaySettings() {
GraphicOptions options = theCanvas.getWorkspace().getGraphicOptions();
GraphicOptionsDialog dlg = new GraphicOptionsDialog(null,options);
dlg.setVisible(true);
if( dlg.getReturnStatus().equals("OK") ) {
theCanvas.getWorkspace().setDisplay(options.DISPLAY);
display_button_group.setSelected(display_models.get(options.DISPLAY),true);
theCanvas.repaint();
}
}
public void onChangeReportSettings() {
AnnotationReportOptionsDialog dlg = new AnnotationReportOptionsDialog(null,theCanvas.getAnnotationReportOptions());
dlg.setVisible(true);
if( dlg.getReturnStatus().equals("OK") )
theCanvas.updateView();
}
public void onPrint() {
try {
PrinterJob pj = theCanvas.getWorkspace().getPrinterJob();
if( pj!=null ) {
pj.setPrintable(theCanvas);
if( pj.printDialog() )
theCanvas.print(pj);
}
}
catch(Exception e) {
LogUtils.report(e);
}
}
// events
public void actionPerformed(ActionEvent e) {
String action = GlycanAction.getAction(e);
String param = GlycanAction.getParam(e);
if( action.equals("print") )
onPrint();
else if( action.equals("undo") )
onUndo();
else if( action.equals("redo") )
onRedo();
else if( action.equals("cut") )
theCanvas.cut();
else if( action.equals("copy") )
theCanvas.copy();
else if( action.equals("delete") )
theCanvas.delete();
else if( action.equals("screenshot") )
theCanvas.getScreenshot();
else if( action.equals("selectall") )
theCanvas.selectAll();
else if( action.equals("selectnone") )
theCanvas.resetSelection();
else if( action.equals("enlarge") )
theCanvas.rescaleSelections(6./5.);
else if( action.equals("resetsize") )
theCanvas.resetSelectionsScale();
else if( action.equals("shrink") )
theCanvas.rescaleSelections(5./6.);
else if( action.equals("group") )
theCanvas.groupSelections();
else if( action.equals("ungroup") )
theCanvas.ungroupSelections();
else if( action.equals("placestructures") )
theCanvas.placeStructures();
// display
if( action.equals("zoomnone") )
onZoomNone();
else if( action.equals("zoomin") )
onZoomIn();
else if( action.equals("zoomout") )
onZoomOut();
else if( action.equals("notation") )
setNotation(param);
else if( action.equals("display") )
setDisplay(param);
else if( action.equals("displaysettings") )
onChangeDisplaySettings();
else if( action.equals("reportsettings") )
onChangeReportSettings();
else if( action.equals("orientation") )
onChangeOrientation();
updateActions();
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
if( MouseUtils.isPopupTrigger(e) ) {
theCanvas.enforceSelection(e.getPoint());
createPopupMenu().show(theCanvas, e.getX(), e.getY());
}
}
public void mouseReleased(MouseEvent e) {
if( MouseUtils.isPopupTrigger(e) ) {
theCanvas.enforceSelection(e.getPoint());
createPopupMenu().show(theCanvas, e.getX(), e.getY());
}
}
public void mouseClicked(MouseEvent e) {
}
public void selectionChanged(AnnotationReportCanvas.SelectionChangeEvent e) {
updateActions();
}
public void documentInit(BaseDocument.DocumentChangeEvent e) {
updateActions();
}
public void documentChanged(BaseDocument.DocumentChangeEvent e) {
updateActions();
}
}