/* * 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(); } }