// $Id: Explorer.java,v 1.23 2005/01/25 21:24:16 moreland Exp $ // // Copyright 2000-2004 The Regents of the University of California. // All Rights Reserved. // // Permission to use, copy, modify and distribute any part of this // Molecular Biology Toolkit (MBT) // for educational, research and non-profit purposes, without fee, and without // a written agreement is hereby granted, provided that the above copyright // notice, this paragraph and the following three paragraphs appear in all // copies. // // Those desiring to incorporate this MBT into commercial products // or use for commercial purposes should contact the Technology Transfer & // Intellectual Property Services, University of California, San Diego, 9500 // Gilman Drive, Mail Code 0910, La Jolla, CA 92093-0910, Ph: (858) 534-5815, // FAX: (858) 534-7345, E-MAIL:invent@ucsd.edu. // // IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR // DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING // LOST PROFITS, ARISING OUT OF THE USE OF THIS MBT, EVEN IF THE // UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // THE MBT PROVIDED HEREIN IS ON AN "AS IS" BASIS, AND THE // UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, // UPDATES, ENHANCEMENTS, OR MODIFICATIONS. THE UNIVERSITY OF CALIFORNIA MAKES // NO REPRESENTATIONS AND EXTENDS NO WARRANTIES OF ANY KIND, EITHER IMPLIED OR // EXPRESS, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, OR THAT THE USE OF THE // MBT WILL NOT INFRINGE ANY PATENT, TRADEMARK OR OTHER RIGHTS. // // For further information, please see: http://mbt.sdsc.edu // // History: // $Log: Explorer.java,v $ // Revision 1.23 2005/01/25 21:24:16 moreland // Added menus that globally change the current rendering style. // // Revision 1.22 2004/10/22 23:23:46 moreland // Finished and enabled code for printing the 3D/StructureViewer content. // Added a menu item and code to control 3D/StructureViewer depth queueing. // // Revision 1.21 2004/07/08 00:42:02 moreland // Integreated Dave's new StylesEditorDialog from the gui package. // // Revision 1.20 2004/05/13 17:37:47 moreland // Increased inspector frame size to accommodate new StructureInfo data. // // Revision 1.19 2004/04/27 18:18:34 moreland // Added edu.sdsc.vis.viewers.Java3dCheck calls to check for Java3D installation. // // Revision 1.18 2004/04/21 23:19:02 moreland // Added Java3dCheck code. // // Revision 1.17 2004/04/08 23:55:06 moreland // Updated copyright to new UCSD wording. // // Revision 1.16 2004/03/09 17:28:22 moreland // Added check to prevent call to System.exit() when running as an applet. // // Revision 1.15 2004/01/31 00:39:01 moreland // Updated for release. // // Revision 1.14 2003/12/20 00:32:05 moreland // StyleEditor window size increased to accomodate longer combo box items. // // Revision 1.13 2003/12/12 22:46:29 moreland // Added editable element styles. // // Revision 1.12 2003/12/09 20:52:42 moreland // Enabled preliminary Styles and Selection GUI hooks. // // Revision 1.11 2003/11/10 19:14:57 moreland // Added preliminary (disabled) features for printing, exporting images, // and editing formatting styles. // // Revision 1.10 2003/07/14 21:31:17 moreland // Added "Image Save" feature (see File menu). // // Revision 1.9 2003/07/07 16:20:01 moreland // Delay loading PDB ID codes until idCode PopupMenu is first shown. // // Revision 1.8 2003/05/23 20:42:57 moreland // Integrated PDB-ID loader GUI above TreeViewer instead of a separate window. // // Revision 1.7 2003/05/20 22:17:50 moreland // Enabled PDB ID codes to automatically load in the background via a thread. // // Revision 1.6 2003/05/19 18:15:55 moreland // Added FTP-based PDB ID list interface. // // Revision 1.5 2003/05/16 23:34:42 moreland // Increased sizes of TreeViewer (in split) and overall Explorer window. // // Revision 1.4 2003/05/16 23:17:00 moreland // Enabled "enter" key in PDB ID load text field to trigger loadButton.doClick. // // Revision 1.3 2003/05/16 23:01:10 moreland // Changed Inspector menu from a checkbox to a standard menu item. // Added several menu accelerator keys. // Added RCSB PDB ID loader interface. // Added "Close All" menu item. // // Revision 1.2 2003/05/15 23:44:54 moreland // Cleaned up code a bit for a preliminary release to obuzko. // // Revision 1.1 2003/05/15 22:42:45 moreland // An application which incorporates more MBT GUI layer components. // // Revision 1.0 2003/05/05 16:06:13 moreland // First version. // // Core import java.applet.*; import java.util.*; import java.io.*; import java.net.*; // GUI import java.awt.*; import java.awt.image.*; import javax.imageio.*; import java.awt.event.*; import javax.swing.event.*; import javax.swing.*; import javax.swing.filechooser.FileFilter; // Printing import java.awt.print.*; import javax.print.*; // MBT import edu.sdsc.mbt.*; import edu.sdsc.mbt.io.*; import edu.sdsc.mbt.viewables.*; import edu.sdsc.mbt.viewers.*; import edu.sdsc.mbt.gui.*; import edu.sdsc.mbt.util.*; /** * Implements an application which incorporates a more complete set of * MBT GUI layer components such as a menubar, TreeViewer, etc... *

* @author John L. Moreland */ public class Explorer extends Applet { // GUI protected JFrame explorerFrame = null; protected Container explorerFrameContainer = null; private StatusPanel statusPanel = null; private JMenuItem toolsInspectorItem = null; private final JComboBox pdbIdList = new JComboBox( ); private Vector idCodes = null; // Viewers private StructureViewer structureViewer = null; private TreeViewer treeViewer = null; // Runtime properties (options or parameters) private Properties properties = new Properties( ); // Applet private Applet applet = null; // Document StructureDocument structureDocument = null; // // Entry Points // /** * The main program entry point when invoked as an application. */ public static void main( String[] args ) { Explorer explorer = new Explorer(); if ( args != null ) { for ( int i=0; i 0 ); pdbIdList.setModel( new DefaultComboBoxModel( idCodes ) ); pdbIdList.setCursor( oldCursor ); } /** * Save an image file of the 3D StructureViewer rendering. */ public void saveImage( ) { // http://java.sun.com/j2se/1.4.1/docs/guide/imageio/spec/imageio_guideTOC.fm.html int width = structureViewer.getWidth( ); int height = structureViewer.getHeight( ); // Ask the user for file name, image file format, and image size. ImageFileManager imageFileManager = new ImageFileManager( explorerFrame ); File file = imageFileManager.save( width, height ); if ( file == null ) return; // User canceled the save. width = imageFileManager.getSaveWidth( ); height = imageFileManager.getSaveHeight( ); // Ask the StructureViewer to produce a BufferedImage object // at the specified resolution. BufferedImage bufferedImage = structureViewer.getBufferedImage( width, height ); // Save the image. imageFileManager.save( bufferedImage, file ); } /** * Save a series of images using a horizontal rotation left and right of * the current view. This can be used for generating stereo pairs or * higher image counts for lenticular image or hologram generation. * * @param imageCount How many images will be generated. * @param sweepAngle The number of degrees swept by the camera. */ public void saveImages( int imageCount, double sweepAngle ) { if ( imageCount <= 0 ) return; if ( sweepAngle <= 0.0 ) return; double halfSweep = sweepAngle / 2.0; double sweepStep = sweepAngle / (double) (imageCount - 1); int width = structureViewer.getWidth( ); int halfWidth = width / 2; int height = structureViewer.getHeight( ); int halfHeight = height / 2; int circleRadius = halfHeight; double pixelsPerDegree = (double) circleRadius / 90.0; final int matrixSize = 16; double newMatrix[] = new double[matrixSize]; double oldMatrix[] = new double[matrixSize]; System.err.println( "Explorer.saveImages: " + "imageCount = " + imageCount + ", sweepAngle = " + sweepAngle + ", sweepStep = " + sweepStep + ", width = " + width + ", halfWidth = " + halfWidth + ", height = " + height + ", halfHeight = " + halfHeight + ", pixelsPerDegree = " + pixelsPerDegree ); structureViewer.getViewpoint( oldMatrix ); edu.sdsc.vis.viewers.VirtualSphere vs = new edu.sdsc.vis.viewers.VirtualSphere( ); vs.setCircle( halfWidth, halfHeight, circleRadius ); javax.media.j3d.Transform3D transform3D = new javax.media.j3d.Transform3D( ); for ( int i=0; i= 0 ) { // Get the printable page's size information. int pageX = (int) pageFormat.getImageableX( ); int pageY = (int) pageFormat.getImageableY( ); int pageW = (int) pageFormat.getImageableWidth( ); int pageH = (int) pageFormat.getImageableHeight( ); float pageAspect = (float) pageW / (float) pageH; // Get the veiwer's size information. int viewerW = structureViewer.getWidth( ); int viewerH = structureViewer.getHeight( ); float viewerAspect = (float) viewerW / (float) viewerH; // Get an image that's the same aspect ratio as viewed, // but at a "good" resolution for printing. int imageW = 1024; // Max resolution int imageH = 1024; // Max resolution if ( viewerAspect >= 1.0 ) { imageH = (int) ((float) imageW / pageAspect); } else { imageW = (int) ((float) imageH * pageAspect); } BufferedImage bufferedImage = structureViewer.getBufferedImage( imageW, imageH ); graphics.drawImage( bufferedImage, pageX, pageY, pageW, pageH, Color.white, null ); return Printable.PAGE_EXISTS; } else { return Printable.NO_SUCH_PAGE; } } }; // Make sure we have a printerJob, and // get the Page SetUp (PageFormat) without a dialog box... pageSetup( false ); // Prepare the print job. Book book = new Book( ); book.append( svPrintable, pageFormat ); printerJob.setPageable( book ); // If we have a graphics head, show a Print dialog... try { if ( ! printerJob.printDialog() ) return; } catch( HeadlessException e ) { // Go ahead and print without the print dialog prompt. } // Print. try { printerJob.print( ); } catch( PrinterException e ) { Status.output( Status.LEVEL_ERROR, "Explorer.print: " + e ); } } private StyleEditorDialog styleEditorDialog = null; /** * Show or hide the Styles editor frame. */ public void showStyleEditorDialog( ) { if ( styleEditorDialog == null ) styleEditorDialog = new StyleEditorDialog( structureDocument ); styleEditorDialog.show( ); } private DepthCueDialog depthCueDialog = null; /** * Show or hide the StructureViewer depth queueing dialog. */ public void showStructureViewerDepthDialog( ) { if ( depthCueDialog == null ) depthCueDialog = new DepthCueDialog( explorerFrame, structureViewer ); depthCueDialog.show( ); } private JFrame structureViewerPrefsFrame = null; /** * Show or hide the Structure Viewer Preferences frame. */ public void showStructureViewerPrefsFrame( ) { if ( structureViewerPrefsFrame == null ) { // Open a Structure Viewer Preferences panel in a frame structureViewerPrefsFrame = new JFrame( "Structure Viewer Preferences" ); Container structureViewerPrefsContainer = structureViewerPrefsFrame.getContentPane( ); structureViewerPrefsFrame.setSize( 300, 100 ); StructureViewerPrefs structureViewerPrefs = new StructureViewerPrefs( structureViewer ); structureViewerPrefsContainer.add( structureViewerPrefs ); } structureViewerPrefsFrame.setVisible( true ); } /** * Set the navigation behavior type. */ public void setNavigationType( int type ) { structureViewer.setNavigationType( type ); } /** * Get the navigation behavior type. */ public int getNavigationType( ) { return structureViewer.getNavigationType( ); } /** * Select everything in the document. */ public void selectAll( ) { int structureCount = structureDocument.getStructureCount( ); for ( int s=0; s