From: <ni...@us...> - 2008-08-31 13:41:48
|
Revision: 9831 http://jmol.svn.sourceforge.net/jmol/?rev=9831&view=rev Author: nicove Date: 2008-08-31 13:41:36 +0000 (Sun, 31 Aug 2008) Log Message: ----------- Code cleanup Modified Paths: -------------- trunk/Jmol/src/JmolApplet.java trunk/Jmol/src/org/jmol/applet/Jmol.java Modified: trunk/Jmol/src/JmolApplet.java =================================================================== --- trunk/Jmol/src/JmolApplet.java 2008-08-31 13:29:10 UTC (rev 9830) +++ trunk/Jmol/src/JmolApplet.java 2008-08-31 13:41:36 UTC (rev 9831) @@ -37,10 +37,11 @@ public class JmolApplet extends org.jmol.appletwrapper.AppletWrapper implements JmolAppletInterface { - public void finalize() throws Throwable { - //System.out.println("JmolApplet finalize " + this); - super.finalize(); - } + //protected void finalize() throws Throwable { + // System.out.println("JmolApplet finalize " + this); + // super.finalize(); + //} + public JmolApplet() { super("org.jmol.applet.Jmol", "jmol75x29x8.gif", 3, preloadClasses); //System.out.println("JmolApplet constructor " + this); Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-08-31 13:29:10 UTC (rev 9830) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-08-31 13:41:36 UTC (rev 9831) @@ -185,10 +185,10 @@ this.appletWrapper = appletWrapper; } - public void finalize() throws Throwable { - //System.out.println("Jmol finalize " + this); - super.finalize(); - } + //protected void finalize() throws Throwable { + // System.out.println("Jmol finalize " + this); + // super.finalize(); + //} public void init() { htmlName = getParameter("name"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-11-25 20:08:05
|
Revision: 10364 http://jmol.svn.sourceforge.net/jmol/?rev=10364&view=rev Author: hansonr Date: 2008-11-25 20:07:58 +0000 (Tue, 25 Nov 2008) Log Message: ----------- version=11.7.13_dev # new feature: sync * stereo Modified Paths: -------------- trunk/Jmol/src/JmolApplet.java trunk/Jmol/src/org/jmol/api/JmolAppletInterface.java trunk/Jmol/src/org/jmol/api/JmolViewer.java trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/appletwrapper/AppletWrapper.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/StateManager.java trunk/Jmol/src/org/jmol/viewer/StatusManager.java trunk/Jmol/src/org/jmol/viewer/TransformManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/JmolApplet.java =================================================================== --- trunk/Jmol/src/JmolApplet.java 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/JmolApplet.java 2008-11-25 20:07:58 UTC (rev 10364) @@ -31,6 +31,8 @@ * */ +import java.awt.Graphics; + import org.jmol.api.JmolAppletInterface; import netscape.javascript.JSObject; @@ -169,6 +171,11 @@ wrappedApplet.syncScript("" + script); } + public Graphics setStereoGraphics(boolean isStereo) { + return (wrappedApplet == null ? null : + wrappedApplet.setStereoGraphics(isStereo)); + } + public String scriptNoWait(String script) { if (wrappedApplet != null) return "" + (wrappedApplet.scriptNoWait("" + script)); Modified: trunk/Jmol/src/org/jmol/api/JmolAppletInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolAppletInterface.java 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/org/jmol/api/JmolAppletInterface.java 2008-11-25 20:07:58 UTC (rev 10364) @@ -23,6 +23,8 @@ */ package org.jmol.api; +import java.awt.Graphics; + import netscape.javascript.JSObject; /** @@ -35,6 +37,7 @@ public interface JmolAppletInterface { + public Graphics setStereoGraphics(boolean isStereo); public String getPropertyAsString(String infoType); public String getPropertyAsString(String infoType, String paramInfo); public String getPropertyAsJSON(String infoType); @@ -50,7 +53,7 @@ public String scriptCheck(String script); public String scriptWait(String script); public String scriptWait(String script, String statusParams); - public void syncScript(String script); + public void syncScript(String script); /** * @deprecated Modified: trunk/Jmol/src/org/jmol/api/JmolViewer.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolViewer.java 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/org/jmol/api/JmolViewer.java 2008-11-25 20:07:58 UTC (rev 10364) @@ -27,7 +27,9 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.Event; +import java.awt.Graphics; import java.awt.Image; +import java.awt.Rectangle; import java.net.URL; import java.util.BitSet; import java.util.Properties; @@ -84,6 +86,17 @@ } /** + * an added class for rendering stereo in two independent applets + * + * @param gLeft + * @param gRight + * @param size + * @param clip + */ + abstract public void renderScreenImage(Graphics gLeft, Graphics gRight, Dimension size, + Rectangle clip); + + /** * OK, but safer to assign htmlName, URL bases, comandOptions, and statusListener now. * * @deprecated Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-11-25 20:07:58 UTC (rev 10364) @@ -220,6 +220,7 @@ } public void destroy() { + gRight = null; JmolAppletRegistry.checkOut(fullName); viewer.setModeMouse(JmolConstants.MOUSE_NONE); viewer = null; @@ -234,6 +235,11 @@ return appletWrapper.getParameter(paramName); } + public Graphics setStereoGraphics(boolean isStereo) { + isStereoSlave = isStereo; + return (isStereo ? appletWrapper.getGraphics() : null); + } + boolean isSigned; JmolAdapter modelAdapter; @@ -471,21 +477,22 @@ } public boolean showPaintTime = false; - public void paint(Graphics g) { //paint is invoked for system-based updates (obscurring, for example) //Opera has a bug in relation to displaying the Java Console. - update(g, "paint "); } private boolean isUpdating; public void update(Graphics g) { - //update is called in response to repaintManager's repaint() request. + //update is called in response to repaintManager's repaint() request. update(g, "update"); } + protected Graphics gRight; + protected boolean isStereoSlave; + private void update(Graphics g, String source) { if (viewer == null) // it seems that this can happen at startup sometimes return; @@ -510,7 +517,9 @@ viewer.repaintView(); } else { //System.out.println("UPDATE1: " + source + " " + Thread.currentThread()); - viewer.renderScreenImage(g, size, null);//rectClip); + //System.out.println(fullName + " update gRight = " + gRight); + if (!isStereoSlave) + viewer.renderScreenImage(g, gRight, size, null);//rectClip); //System.out.println("UPDATE2: " + source + " " + Thread.currentThread()); } @@ -1203,6 +1212,10 @@ return ""; } StringBuffer sb = (isSync ? null : new StringBuffer()); + boolean getGraphics = (isSync && script.equals(Viewer.SYNC_GRAPHICS_MESSAGE)); + boolean setNoGraphics = (isSync && script.equals(Viewer.SYNC_NO_GRAPHICS_MESSAGE)); + if (getGraphics) + gRight = null; for (int i = 0; i < nApplets; i++) { String theApplet = (String) apps.elementAt(i); JmolAppletInterface app = (JmolAppletInterface) JmolAppletRegistry.htRegistry @@ -1210,6 +1223,10 @@ if (Logger.debugging) Logger.debug(fullName + " sending to " + theApplet + ": " + script); try { + if (getGraphics || setNoGraphics) { + gRight = app.setStereoGraphics(getGraphics); + return ""; + } if (isSync) app.syncScript(script); else Modified: trunk/Jmol/src/org/jmol/appletwrapper/AppletWrapper.java =================================================================== --- trunk/Jmol/src/org/jmol/appletwrapper/AppletWrapper.java 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/org/jmol/appletwrapper/AppletWrapper.java 2008-11-25 20:07:58 UTC (rev 10364) @@ -59,7 +59,6 @@ private int clockBaseline; private int clockWidth; - private static int MINIMUM_ELAPSED_SECONDS = 1; private static String fontFace = "sansserif"; Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-11-25 20:07:58 UTC (rev 10364) @@ -5263,7 +5263,7 @@ break; case 3: applet = parameterAsString(1); - text = parameterAsString(2); + text = (tokAt(2) == Token.stereo ? Viewer.SYNC_GRAPHICS_MESSAGE : parameterAsString(2)); break; } if (isSyntaxCheck) Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-11-25 20:07:58 UTC (rev 10364) @@ -3,6 +3,7 @@ version=11.7.13_dev +# new feature: sync * stereo # bug fix: applet improperly reporting status of "quiet" commands # bug fix: stereo not in state # bug fix: stereoDegrees parameter not reported correctly Modified: trunk/Jmol/src/org/jmol/viewer/StateManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StateManager.java 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/org/jmol/viewer/StateManager.java 2008-11-25 20:07:58 UTC (rev 10364) @@ -756,7 +756,7 @@ + ";unitcellcolor;windowcentered;zerobasedxyzrasmol;zoomenabled" + // saved in the hash table but not considered part of the state: - ";scriptqueue;scriptreportinglevel;syncscript;syncmouse;currentlocalpath;defaultdirectorylocal" + ";scriptqueue;scriptreportinglevel;syncscript;syncmouse;syncstereo;currentlocalpath;defaultdirectorylocal" + // more settable Jmol variables ";ambient;bonds;colorrasmol;diffuse;frank;hetero;hidenotselected" @@ -1242,6 +1242,7 @@ setParameterValue("strandCountForMeshRibbon", strandCountForMeshRibbon); setParameterValue("syncMouse", false); setParameterValue("syncScript", false); + setParameterValue("syncStereo", false); setParameterValue("testFlag1", testFlag1); setParameterValue("testFlag2", testFlag2); setParameterValue("testFlag3", testFlag3); Modified: trunk/Jmol/src/org/jmol/viewer/StatusManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2008-11-25 20:07:58 UTC (rev 10364) @@ -298,12 +298,14 @@ boolean drivingSync = false; boolean isSynced = false; boolean syncDisabled = false; + boolean stereoSync = false; final static int SYNC_OFF = 0; final static int SYNC_DRIVER = 1; final static int SYNC_SLAVE = 2; final static int SYNC_DISABLE = 3; final static int SYNC_ENABLE = 4; + final static int SYNC_STEREO = 5; void setSyncDriver(int syncMode) { @@ -311,7 +313,12 @@ // 0 off // 1 driving on as driver // 2 sync turn on, but set as slave + // 5 stereo //System.out.println(viewer.getHtmlName() +" setting mode=" + syncMode); + if (stereoSync && syncMode != SYNC_ENABLE) { + syncSend(Viewer.SYNC_NO_GRAPHICS_MESSAGE, "*"); + stereoSync = false; + } switch (syncMode) { case SYNC_ENABLE: if (!syncDisabled) @@ -321,6 +328,11 @@ case SYNC_DISABLE: syncDisabled = true; break; + case SYNC_STEREO: + drivingSync = true; + isSynced = true; + stereoSync = true; + break; case SYNC_DRIVER: drivingSync = true; isSynced = true; Modified: trunk/Jmol/src/org/jmol/viewer/TransformManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2008-11-25 20:07:58 UTC (rev 10364) @@ -169,7 +169,7 @@ JmolConstants.getStereoModeName(stereoMode) : Escape.escapeColor(stereoColors[0]) + " " + Escape.escapeColor(stereoColors[1])) - + " " + viewer.getStereoDegrees()); + + " " + stereoDegrees); if (!isNavigationMode && !zoomEnabled) StateManager.appendCmd(commands, "zoom off"); commands.append(" slab ").append(slabPercentSetting).append(";depth ") @@ -2026,12 +2026,12 @@ this.stereoMode = stereoMode; } - float stereoDegrees; // set in state manager - float stereoRadians = 5 * radiansPerDegree; + float stereoDegrees = Float.NaN; // set in state manager + float stereoRadians; void setStereoDegrees(float stereoDegrees) { this.stereoDegrees = stereoDegrees; - this.stereoRadians = stereoDegrees * radiansPerDegree; + stereoRadians = stereoDegrees * radiansPerDegree; } boolean stereoFrame; @@ -2040,12 +2040,10 @@ synchronized Matrix3f getStereoRotationMatrix(boolean stereoFrame) { this.stereoFrame = stereoFrame; - if (stereoFrame) { - matrixTemp3.rotY(-stereoRadians); - matrixStereo.mul(matrixTemp3, matrixRotate); - } else { - matrixStereo.set(matrixRotate); - } + if (!stereoFrame) + return matrixRotate; + matrixTemp3.rotY(-stereoRadians); + matrixStereo.mul(matrixTemp3, matrixRotate); return matrixStereo; } Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-11-24 21:10:40 UTC (rev 10363) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-11-25 20:07:58 UTC (rev 10364) @@ -3154,7 +3154,7 @@ dim.width = Math.min(dim.width, maximumSize); int height = dim.height; int width = dim.width; - if (getStereoMode() == JmolConstants.STEREO_DOUBLE) + if (transformManager.stereoMode == JmolConstants.STEREO_DOUBLE) width = (width + 1) / 2; if (dimScreen.width == width && dimScreen.height == height) return; @@ -3224,8 +3224,14 @@ return data; } - public void renderScreenImage(Graphics g, Dimension size, Rectangle clip) { + public void renderScreenImage(Graphics gLeft, Graphics gRight, + Dimension size, Rectangle clip) { // from paint/update event + // gRight is for second stereo applet + // when this is the stereoSlave, no rendering occurs through this applet + // directly, only from the other applet. + // this is for relatively specialized geoWall-type installations + if (creatingImage) return; if (isTainted || getSlabEnabled()) @@ -3233,23 +3239,24 @@ isTainted = false; if (size != null) setScreenDimension(size); - int stereoMode = getStereoMode(); - switch (stereoMode) { - case JmolConstants.STEREO_DOUBLE: - render1(g, getImage(true), dimScreen.width, 0); - case JmolConstants.STEREO_NONE: - render1(g, getImage(false), 0, 0); - break; - case JmolConstants.STEREO_REDCYAN: - case JmolConstants.STEREO_REDBLUE: - case JmolConstants.STEREO_REDGREEN: - case JmolConstants.STEREO_CUSTOM: - render1(g, getStereoImage(stereoMode), 0, 0); - break; + if (gRight == null) { + Image image = getScreenImage(); + if (transformManager.stereoMode == JmolConstants.STEREO_DOUBLE) { + render1(gLeft, image, dimScreen.width, 0); + image = getImage(false); + } + render1(gLeft, image, 0, 0); + } else { + render1(gRight, getImage(true), 0, 0); + render1(gLeft, getImage(false), 0, 0); } repaintView(); } + public void renderScreenImage(Graphics g, Dimension size, Rectangle clip) { + renderScreenImage(g, null, size, clip); + } + private Image getImage(boolean isDouble) { g3d.beginRendering(transformManager.getStereoRotationMatrix(isDouble)); render(); @@ -3305,22 +3312,9 @@ } public Image getScreenImage() { - boolean isStereo = false; - //setRectClip(null); - int stereoMode = getStereoMode(); - switch (stereoMode) { - case JmolConstants.STEREO_DOUBLE: - // this allows for getting both eye views in two images - // because you can adjust using "stereo -2.5", then "stereo +2.5" - isStereo = true; - break; - case JmolConstants.STEREO_REDCYAN: - case JmolConstants.STEREO_REDBLUE: - case JmolConstants.STEREO_REDGREEN: - case JmolConstants.STEREO_CUSTOM: - return getStereoImage(stereoMode); - } - return getImage(isStereo); + return (transformManager.stereoMode <= JmolConstants.STEREO_DOUBLE ? + getImage(transformManager.stereoMode == JmolConstants.STEREO_DOUBLE) + : getStereoImage(transformManager.stereoMode)); } /** @@ -5962,14 +5956,6 @@ transformManager.setStereoMode(stereoMode); } - int getStereoMode() { - return transformManager.stereoMode; - } - - float getStereoDegrees() { - return transformManager.stereoDegrees; - } - // ////////////////////////////////////////////////////////////// // // ////////////////////////////////////////////////////////////// @@ -6532,13 +6518,32 @@ case 1: statusManager.syncingScripts = TF; break; + case 2: + statusManager.syncSend(TF ? SYNC_GRAPHICS_MESSAGE : SYNC_NO_GRAPHICS_MESSAGE, "*"); + if (Float.isNaN(transformManager.stereoDegrees)) + setFloatProperty("stereoDegrees", TransformManager.DEFAULT_STEREO_DEGREES); + if (TF) { + setBooleanProperty("syncMouse", false); + setBooleanProperty("syncScript", false); + } + return; } // if turning both off, sync the orientation now if (!statusManager.syncingScripts && !statusManager.syncingMouse) refresh(-1, "set sync"); } + public final static String SYNC_GRAPHICS_MESSAGE = "GET_GRAPHICS"; + public final static String SYNC_NO_GRAPHICS_MESSAGE = "SET_GRAPHICS_OFF"; + public void syncScript(String script, String applet) { + if (script.equalsIgnoreCase(SYNC_GRAPHICS_MESSAGE)) { + statusManager.setSyncDriver(StatusManager.SYNC_STEREO); + statusManager.syncSend(script, applet); + setBooleanProperty("syncMouse", false); + setBooleanProperty("syncScript", false); + return; + } // * : all applets // > : all OTHER applets // . : just me @@ -6551,7 +6556,7 @@ return; } if (script.equalsIgnoreCase("on")) { - statusManager.setSyncDriver(StatusManager.SYNC_DRIVER); + statusManager.setSyncDriver(StatusManager.SYNC_DRIVER); return; } if (script.equalsIgnoreCase("off")) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-12-03 18:49:46
|
Revision: 11844 http://jmol.svn.sourceforge.net/jmol/?rev=11844&view=rev Author: hansonr Date: 2009-12-03 18:48:29 +0000 (Thu, 03 Dec 2009) Log Message: ----------- version=11.9.10_dev Jmol-SparshUI # code: JmolSparshClientAdapter allows for restarting gesture server (in the case, # for example, if it was closed by an applet page being flushed). # code: SparshUI interface extension to allow input device option to consume a # set of events or not. Modified Paths: -------------- trunk/Jmol/src/com/sparshui/client/Client.java trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java trunk/Jmol/src/com/sparshui/client/ServerConnection.java trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java trunk/Jmol/src/com/sparshui/server/ClientConnection.java trunk/Jmol/src/com/sparshui/server/GestureServer.java trunk/Jmol/src/com/sparshui/server/Group.java trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java trunk/Jmol/src/com/sparshui/server/TouchPoint.java trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/TransformManager.java trunk/Jmol/src/org/jmol/viewer/TransformManager11.java Modified: trunk/Jmol/src/com/sparshui/client/Client.java =================================================================== --- trunk/Jmol/src/com/sparshui/client/Client.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/com/sparshui/client/Client.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -48,7 +48,8 @@ /** * This method processes events from the Gesture Server. It * should handle each event by sending it to the appropriate - * group specified by groupID. + * group specified by groupID. If groupID == Integer.MAX_VALUE + * and event is null, then the server connection has been lost. * * @param groupID * The group that this event was detected on. Modified: trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java =================================================================== --- trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -45,6 +45,11 @@ public boolean processRequest(Client client) { try { // Read the message type + // SparshUI client waits here for server message: + // byte TYPE + // int LENGTH + // byte[] DATA + int type = recvType(); // Read the length of the message int length = _in.readInt(); Modified: trunk/Jmol/src/com/sparshui/client/ServerConnection.java =================================================================== --- trunk/Jmol/src/com/sparshui/client/ServerConnection.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/com/sparshui/client/ServerConnection.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -47,7 +47,7 @@ */ //@override public void run() { - Thread.currentThread().setName("SparshUI ServerConnection"); + Thread.currentThread().setName("SparshUI Client->ServerConnection"); while(_socket.isConnected()) { if (!_protocol.processRequest(_client)) //BH -- must allow for server failure break; Modified: trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java =================================================================== --- trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -4,6 +4,7 @@ import java.awt.Dimension; import java.awt.Point; import java.awt.Toolkit; +import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; @@ -43,17 +44,28 @@ private Component _display; + private DataInputStream _in; private DataOutputStream _out; public JmolTouchSimulator() { } public void dispose() { - try { - _out.close(); - } catch (Exception e) { - - } + try { + _in.close(); + } catch (Exception e) { + + } + try { + _out.close(); + } catch (Exception e) { + + } + try { + _timer.cancel(); + } catch (Exception e) { + + } } /* (non-Javadoc) @@ -65,6 +77,7 @@ _timer = new Timer(); try { Socket socket = new Socket(address, NetworkConfiguration.PORT); + _in = new DataInputStream(socket.getInputStream()); _out = new DataOutputStream(socket.getOutputStream()); _out.writeByte(ConnectionType.INPUT_DEVICE); return true; @@ -160,7 +173,17 @@ _events.clear(); _touchID = 0; } - + + /** + * protocol modified by Bob Hanson for Jmol to demonstrate + * extended SparshUI protocol to include a return from the + * server indicating whether or not to consume this event. + * + * server return == (byte) 1 --> do consume this event + * server return == (byte) 0 --> do not consume this event + * + * @param e + */ protected void dispatchTouchEvent(TouchData e) { Toolkit tk = Toolkit.getDefaultToolkit(); Dimension dim = tk.getScreenSize(); @@ -172,6 +195,9 @@ _out.writeFloat(((float) e.x / (float) dim.width)); _out.writeFloat(((float) e.y / (float) dim.height)); _out.writeByte((byte) e.type); + boolean doConsume = (_in.readByte() == 1); + if (Logger.debugging) + System.out.println("[JmolTouchSimulator] doConsume=" + doConsume); } catch (IOException e1) { System.err.println("Failed to send event to server."); } Modified: trunk/Jmol/src/com/sparshui/server/ClientConnection.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/ClientConnection.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/com/sparshui/server/ClientConnection.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -5,8 +5,6 @@ import java.util.HashMap; import java.util.Vector; -import com.sparshui.common.Location; - /** * Represents a network connection to a client. * @@ -49,7 +47,7 @@ */ boolean processBirth(TouchPoint touchPoint) throws IOException { - int groupID = getGroupID(touchPoint.getLocation()); + int groupID = getGroupID(touchPoint); int jmolFlags = (groupID & 0xF0000000); if (jmolFlags != 0) { switch (jmolFlags) { @@ -86,12 +84,12 @@ /** * - * @param location + * @param touchPoint * @return groupId * @throws IOException */ - private int getGroupID(Location location) throws IOException { - return _protocol.getGroupID(location); + private int getGroupID(TouchPoint touchPoint) throws IOException { + return _protocol.getGroupID(touchPoint); } /** Modified: trunk/Jmol/src/com/sparshui/server/GestureServer.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureServer.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/com/sparshui/server/GestureServer.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -3,12 +3,14 @@ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; +import java.util.HashMap; import java.util.Vector; import org.jmol.api.JmolGestureServerInterface; import org.jmol.util.Logger; import com.sparshui.common.ConnectionType; +import com.sparshui.common.Location; import com.sparshui.common.NetworkConfiguration; /** @@ -61,38 +63,6 @@ } /** - * Process a touch point birth by getting the groupID and gestures for the - * touch point. - * - * @param touchPoint - * The new touch point. - */ - void processBirth(TouchPoint touchPoint) { - Vector clients_to_remove = null; - for (int i = 0; i < _clients.size(); i++) { - ClientConnection client = (ClientConnection) _clients.get(i); - // Return if the client claims the touch point - try { - if (client.processBirth(touchPoint)) - break; - } catch (IOException e) { - // This occurs if there is a communication error - // with the client. In this case, we will want - // to remove the client. - if (clients_to_remove == null) - clients_to_remove = new Vector(); - clients_to_remove.add(client); - } - } - if (clients_to_remove == null) - return; - for (int i = 0; i < clients_to_remove.size(); i++) { - _clients.remove(clients_to_remove.elementAt(i)); - Logger.info("[GestureServer] Client Disconnected"); - } - } - - /** * */ private void openSocket() { @@ -159,4 +129,69 @@ Logger.info("[GestureServer] InputDeviceConnection Accepted"); new InputDeviceConnection(this, socket); } + + /** + * This method was tucked into InputDeviceConnection but really has to + * do more with server-to-client interaction, so I moved it here. BH + * + * @param inputDeviceTouchPoints container for this input device's touchPoints + * @param id + * @param location + * @param state + * @return doConsume; + */ + boolean processTouchPoint(HashMap inputDeviceTouchPoints, int id, Location location, + int state) { + Integer iid = new Integer(id); + if(inputDeviceTouchPoints.containsKey(iid)) { + TouchPoint touchPoint = (TouchPoint) inputDeviceTouchPoints.get(iid); + if (touchPoint.isValid()) + synchronized(touchPoint) { + touchPoint.update(location, state); + } + return true; + } + TouchPoint touchPoint = new TouchPoint(location); + boolean doConsume = processBirth(touchPoint); + inputDeviceTouchPoints.put(iid, touchPoint); + return doConsume; + } + + /** + * Process a touch point birth by getting the groupID and gestures for the + * touch point. + * + * @param touchPoint + * The new touch point. + * @return doConsume + * + */ + private boolean processBirth(TouchPoint touchPoint) { + Vector clients_to_remove = null; + boolean doConsume = false; + for (int i = 0; i < _clients.size(); i++) { + ClientConnection client = (ClientConnection) _clients.get(i); + // Return if the client claims the touch point + try { + doConsume = client.processBirth(touchPoint); + if (doConsume) + break; + } catch (IOException e) { + // This occurs if there is a communication error + // with the client. In this case, we will want + // to remove the client. + if (clients_to_remove == null) + clients_to_remove = new Vector(); + clients_to_remove.add(client); + } + } + if (clients_to_remove != null) + for (int i = 0; i < clients_to_remove.size(); i++) { + _clients.remove(clients_to_remove.elementAt(i)); + Logger.info("[GestureServer] Client Disconnected"); + } + return doConsume; + } + + } Modified: trunk/Jmol/src/com/sparshui/server/Group.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/Group.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/com/sparshui/server/Group.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -57,49 +57,54 @@ } /** - * Update the given touch point that belongs to this group. - * - * @param changedPoint - * The changed touch point. - */ - public synchronized void update(TouchPoint changedPoint) { - Vector events = new Vector(); + * Update the given touch point that belongs to this group. + * + * @param changedPoint + * The changed touch point. + */ + public synchronized void update(TouchPoint changedPoint) { + Vector events = new Vector(); - if (changedPoint.getState() == TouchState.BIRTH) { - _touchPoints.add(changedPoint); - } + if (changedPoint.getState() == TouchState.BIRTH) { + _touchPoints.add(changedPoint); + } - Vector clonedPoints = new Vector(); - for (int i = 0; i < _touchPoints.size(); i++) { - TouchPoint touchPoint = (TouchPoint) _touchPoints.get(i); - synchronized (touchPoint) { - TouchPoint clonedPoint = (TouchPoint) touchPoint.clone(); - clonedPoints.add(clonedPoint); - } - } + // until this is implemented somewhere, why go to the trouble? -- BH + + boolean passTouchPoints = false; + Vector clonedPoints = null; + + if (passTouchPoints) { + clonedPoints = new Vector(); + for (int i = 0; i < _touchPoints.size(); i++) { + TouchPoint touchPoint = (TouchPoint) _touchPoints.get(i); + synchronized (touchPoint) { + TouchPoint clonedPoint = (TouchPoint) touchPoint.clone(); + clonedPoints.add(clonedPoint); + } + } + } + if (changedPoint.getState() == TouchState.DEATH) { + _touchPoints.remove(changedPoint); + } - if (changedPoint.getState() == TouchState.DEATH) { - _touchPoints.remove(changedPoint); - } + for (int i = 0; i < _gestures.size(); i++) { + Gesture gesture = (Gesture) _gestures.get(i); + // System.out.println(_gestures.size()); + // System.out.println("Gesture allowed: " + gesture.getName()); + events.addAll(gesture.processChange(clonedPoints, changedPoint)); + // System.out.println("Got some events - size: " + events.size()); + } - for (int i = 0; i < _gestures.size(); i++) { - Gesture gesture = (Gesture) _gestures.get(i); - //System.out.println(_gestures.size()); - //System.out.println("Gesture allowed: " + gesture.getName()); - events.addAll(gesture.processChange(clonedPoints, changedPoint)); - //System.out.println("Got some events - size: " + events.size()); - } + try { + _clientProtocol.processEvents(_id, events); + } catch (IOException e) { + /* + * Do nothing here. We're ignoring the error because the client will get + * killed on the next touch point birth and we do not have a reference to + * the client or the server from group to avoid circular references. + */ + } + } - try { - _clientProtocol.processEvents(_id, events); - } catch (IOException e) { - /* - * Do nothing here. We're ignoring the error because - * the client will get killed on the next touch point - * birth and we do not have a reference to the client - * or the server from group to avoid circular references. - */ - } - } - } Modified: trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -1,6 +1,7 @@ package com.sparshui.server; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.HashMap; @@ -31,6 +32,8 @@ * */ private DataInputStream _in; + private DataOutputStream _out; + /** * @@ -38,7 +41,7 @@ private HashMap _touchPoints; private Vector _flaggedids; - + /** * Create a new input device connection with the given * gesture server and socket. @@ -52,31 +55,16 @@ public InputDeviceConnection(GestureServer gestureServer, Socket socket) throws IOException { _gestureServer = gestureServer; _socket = socket; - _in = new DataInputStream(socket.getInputStream()); + _in = new DataInputStream(socket.getInputStream()); + _out = new DataOutputStream(socket.getOutputStream()); _touchPoints = new HashMap(); _flaggedids = new Vector(); startListening(); } /** - * Create a new touch point. - * @param location * - * @param x - * @param y - * @param state - * @return TouchPoint */ - private TouchPoint createTouchPoint(Location location) { - TouchPoint touchPoint = new TouchPoint(location); - _gestureServer.processBirth(touchPoint); - //System.out.println("[InputDeviceConnection] Successful Create Location: " + location.toString()); - return touchPoint; - } - - /** - * - */ private void removeDeadTouchPoints() { for (int i = 0; i < _flaggedids.size(); i++) { Integer id = (Integer)_flaggedids.get(i); @@ -94,31 +82,13 @@ } /** - * @param id - * @param location - * @param state * */ - private void processTouchPoint(int id, Location location, int state) { - Integer iid = new Integer(id); - if(_touchPoints.containsKey(iid)) { - TouchPoint touchPoint = (TouchPoint) _touchPoints.get(iid); - synchronized(touchPoint) { - touchPoint.update(location, state); - } - } else { - //System.out.println("[InputDeviceConnection] Creating new touch point"); - _touchPoints.put(iid, createTouchPoint(location)); - } - } - - /** - * - */ private void receiveData() { try { while(!_socket.isInputShutdown()) { - readTouchPoints(); + boolean doConsume = readTouchPoints(_in.readInt()); + _out.write((byte) (doConsume ? 1 : 0)); } } catch (IOException e) { //System.err.println("Error reading touch point from input device."); @@ -130,51 +100,39 @@ /** * + * @return doConsume * @throws IOException */ - private void readTouchPoint() throws IOException { + private boolean readTouchPoint() throws IOException { int id = _in.readInt(); float x = _in.readFloat(); float y = _in.readFloat(); Location location = new Location(x, y); int state = (int)_in.readByte(); - processTouchPoint(id, location, state); - - // DEBUG - //System.out.println("[InputDeviceConnection] ID: " + id + " STATE: " +state.name() + - // " X: " + x + " Y: " + y); - - if (state == TouchState.DEATH) { + boolean doConsume = _gestureServer.processTouchPoint(_touchPoints, id, location, state); + if (state == TouchState.DEATH) flagTouchPointForRemoval(id); - } + return doConsume; } /** * + * @param count + * @return doConsume * @throws IOException */ - private void readTouchPoints() throws IOException { - //int count = _in.readInt(); - + private boolean readTouchPoints(int count) throws IOException { // With Count - int count = _in.readInt(); if(count < 0) { _in.close(); - return; + return false; } + boolean doConsume = false; //System.out.println("Reading '"+count+"' Input Events."); - for(int i = 0; i < count; i++) { - readTouchPoint(); - } + for(int i = 0; i < count; i++) + doConsume |= readTouchPoint(); removeDeadTouchPoints(); - - /* - // Without Count - while(true) { - readTouchPoint(); - removeDeadTouchPoints(); - } - */ + return doConsume; } /** @@ -182,7 +140,7 @@ */ private void startListening() { Thread thread = new Thread(this); - thread.setName("SparshUI InputDeviceConnection"); + thread.setName("SparshUI Server->InputDeviceConnection"); thread.start(); } @@ -193,19 +151,5 @@ public void run() { receiveData(); } - - /* - public float readFloat() throws IOException{ - return Float.intBitsToFloat(readInt()); - } - - public int readInt() throws IOException{ - int n = 0; - for(int i = 0; i < 4; i++) { - n += _in.read() << (i*8); - } - return n; - } - */ } Modified: trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -8,7 +8,6 @@ import com.sparshui.common.ClientProtocol; import com.sparshui.common.Event; -import com.sparshui.common.Location; import com.sparshui.common.utils.Converter; /** @@ -32,6 +31,7 @@ super(socket); _buffer = new ByteArrayOutputStream(); _bufferOut = new DataOutputStream(_buffer); + Thread.currentThread().setName("SparshUI Server->ClientConnection"); } /** @@ -79,19 +79,20 @@ * 4 bytes - x coordinate * 4 bytes - y coordinate * - * @param location + * @param touchPoint * The data point for the group to retrieve from * @return The Group ID * @throws IOException * If an error occurs during communication with the client. */ - public int getGroupID(Location location) throws IOException { + public int getGroupID(TouchPoint touchPoint) throws IOException { byte[] tempFloat = new byte[4]; // Event Type + sendType(MessageType.GET_GROUP_ID); - Converter.floatToByteArray(tempFloat, 0, location.getX()); + Converter.floatToByteArray(tempFloat, 0, touchPoint.getLocation().getX()); _bufferOut.write(tempFloat); - Converter.floatToByteArray(tempFloat, 0, location.getY()); + Converter.floatToByteArray(tempFloat, 0, touchPoint.getLocation().getY()); _bufferOut.write(tempFloat); // Send the length, x and y coordinates Modified: trunk/Jmol/src/com/sparshui/server/TouchPoint.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/TouchPoint.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/com/sparshui/server/TouchPoint.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -48,7 +48,19 @@ private Group _group; /** + * The GestureServer needs to know whether an incoming + * touchPoint is bound to a client or not so that it + * can tell the input device whether or not to + * consume the event. * + * @return whether a client is bound to this touchPoint + * + */ + public boolean isValid() { + return (_group != null); + } + /** + * * @param location */ public TouchPoint(Location location) { Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -176,6 +176,7 @@ return; if (event == null) { dispose(); + client.processEvent(Integer.MAX_VALUE, -1, -1, -1, null, -1); return; } int id = 0; Modified: trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -48,18 +48,26 @@ ActionManagerMT(Viewer viewer, boolean isSimulated) { super(viewer); - - if (isSimulated) - Logger.error("ActionManagerMT -- for now just using touch simulation.\nPress CTRL-LEFT and then draw two traces on the window."); - - Component display = viewer.getDisplay(); adapter = (JmolSparshAdapter) Interface .getOptionInterface("multitouch.sparshui.JmolSparshClientAdapter"); + groupID = ((int) (Math.random() * 0xFFFFFF)) << 4; + Logger.info("ActionManagerMT SparshUI groupID=" + groupID); + startSparshUIService(isSimulated); + setBinding(binding); + } + + private void startSparshUIService(boolean isSimulated) { if (adapter == null) return; + if (simulator != null) { // a restart + simulator.dispose(); + simulator = null; + } + if (isSimulated) + Logger.error("ActionManagerMT -- for now just using touch simulation.\nPress CTRL-LEFT and then draw two traces on the window."); + + Component display = viewer.getDisplay(); adapter.setSparshClient(display, this); - groupID = ((int) (Math.random() * 0xFFFFFF)) << 4; - Logger.info("ActionManagerMT SparshUI groupID=" + groupID); if (isSimulated) { simulator = (JmolTouchSimulatorInterface) Interface .getInterface("com.sparshui.inputdevice.JmolTouchSimulator"); @@ -68,7 +76,6 @@ simulator.startSimulator(display); } } - setBinding(binding); } protected void setBinding(Binding newBinding) { @@ -115,6 +122,7 @@ //these must match those in com.sparshui.common.messages.events.EventType // reproduced here so there are no references to that code in applet module + public static final int SERVICE_LOST = -1; public static final int DRAG_EVENT = 0; public static final int ROTATE_EVENT = 1; public static final int SPIN_EVENT = 2; @@ -174,6 +182,9 @@ + Integer.toHexString(groupID) + " eventType=" + eventType + "(" + getEventName(eventType) + ") iData=" + iData + " pt=" + pt); switch (eventType) { + case SERVICE_LOST: + startSparshUIService(simulator != null); + break; case ZOOM_EVENT: float scale = pt.z; if (scale == -1 || scale == 1) { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-12-03 18:48:29 UTC (rev 11844) @@ -3,6 +3,10 @@ version=11.9.10_dev +# code: JmolSparshClientAdapter allows for restarting gesture server (in the case, +# for example, if it was closed by an applet page being flushed). +# code: SparshUI interface extension to allow input device option to consume a +# set of events or not. # bug fix: NWChem reader not reading files with lower-case-only atom names # bug fix: code - viewer.getDisplayModelIndex() not used properly when background model is present # new feature: draw intersection $isosurfaceID PLANE|HKL [plane definition] Modified: trunk/Jmol/src/org/jmol/viewer/TransformManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -139,7 +139,7 @@ rotateX((float) Math.PI); } viewer.saveOrientation("default"); - if (isNavigationMode) + if (mode == MODE_NAVIGATION) setNavigationMode(true); } @@ -169,7 +169,7 @@ if (!isWindowCentered()) StateManager.appendCmd(commands, "set windowCentered false"); StateManager.appendCmd(commands, "set cameraDepth " + cameraDepth); - if (isNavigationMode) + if (mode == MODE_NAVIGATION) StateManager.appendCmd(commands, "set navigationMode true"); StateManager.appendCmd(commands, viewer.getBoundBoxCommand(false)); StateManager.appendCmd(commands, "center " @@ -182,11 +182,11 @@ : Escape.escapeColor(stereoColors[0]) + " " + Escape.escapeColor(stereoColors[1])) + " " + stereoDegrees); - if (!isNavigationMode && !zoomEnabled) + if (mode != MODE_NAVIGATION && !zoomEnabled) StateManager.appendCmd(commands, "zoom off"); commands.append(" slab ").append(slabPercentSetting).append(";depth ") .append(depthPercentSetting).append( - slabEnabled && !isNavigationMode ? ";slab on" : "").append(";\n"); + slabEnabled && mode != MODE_NAVIGATION ? ";slab on" : "").append(";\n"); if (zShadeEnabled) commands.append(" set zShade;\n"); if (slabPlane != null) @@ -198,7 +198,7 @@ commands.append(getSpinState(true)).append("\n"); if (viewer.modelSetHasVibrationVectors() && vibrationOn) StateManager.appendCmd(commands, "vibration ON"); - if (isNavigationMode) { + if (mode == MODE_NAVIGATION) { commands.append(getNavigationState()); if (depthPlane != null || slabPlane != null) commands.append(" slab on;\n"); @@ -249,6 +249,8 @@ protected final Point3f fixedRotationOffset = new Point3f(); protected final Point3f fixedRotationCenter = new Point3f(); + protected final Point3f perspectiveOffset = new Point3f(); + protected final Point3f perspectiveShiftXY = new Point3f(); private final Point3f rotationCenterDefault = new Point3f(); private float rotationRadiusDefault; @@ -527,6 +529,7 @@ * TRANSLATIONS ****************************************************************/ protected final Point3f fixedTranslation = new Point3f(); + float xTranslationFraction = 0.5f; float yTranslationFraction = 0.5f; @@ -589,7 +592,7 @@ } void translateToZPercent(float percent) { - if (!isNavigationMode) + if (mode != MODE_NAVIGATION) return; setNavigationDepthPercent(0, percent); } @@ -650,7 +653,7 @@ info.put("transYPercent", new Float(getTranslationYPercent())); info.put("zoom", new Float(zoomPercent)); info.put("modelRadius", new Float(modelRadius)); - if (isNavigationMode) { + if (mode == MODE_NAVIGATION) { info.put("navigationCenter", "navigate center " + Escape.escape(navigationCenter)); info.put("navigationOffsetXPercent", new Float( @@ -1244,10 +1247,17 @@ private final Point3f point3fVibrationTemp = new Point3f(); protected boolean navigating = false; - protected boolean isNavigationMode = false; + protected final static int MODE_STANDARD = 0; + protected final static int MODE_NAVIGATION = 1; + protected final static int MODE_PERSPECTIVE_CENTER = 2; + protected int mode = MODE_STANDARD; + protected int defaultMode = MODE_STANDARD; void setNavigationMode(boolean TF) { - isNavigationMode = (TF && canNavigate()); + if (TF && canNavigate()) + mode = MODE_NAVIGATION; + else + mode = defaultMode; resetNavigationPoint(true); } @@ -1267,7 +1277,7 @@ } calcCameraFactors(); calcTransformMatrix(); - if (isNavigationMode) + if (mode == MODE_NAVIGATION) calcNavigationPoint(); else calcSlabAndDepthValues(); @@ -1278,7 +1288,7 @@ zoomPercentSetting = 5; if (zoomPercentSetting > MAXIMUM_ZOOM_PERCENTAGE) zoomPercentSetting = MAXIMUM_ZOOM_PERCENTAGE; - return (zoomEnabled || isNavigationMode ? zoomPercentSetting : 100); + return (zoomEnabled || mode == MODE_NAVIGATION ? zoomPercentSetting : 100); } /** @@ -1431,10 +1441,16 @@ void unTransformPoint(Point3f screenPt, Point3f coordPt) { //draw move2D pointT.set(screenPt); - if (isNavigationMode) { + switch (mode) { + case MODE_NAVIGATION: pointT.x -= navigationOffset.x; pointT.y -= navigationOffset.y; - } else { + break; + case MODE_PERSPECTIVE_CENTER: + pointT.x -= perspectiveOffset.x; + pointT.y -= perspectiveOffset.y; + break; + case MODE_STANDARD: pointT.x -= fixedRotationOffset.x; pointT.y -= fixedRotationOffset.y; } @@ -1443,9 +1459,15 @@ pointT.x /= factor; pointT.y /= factor; } - if (isNavigationMode) { + switch (mode) { + case MODE_NAVIGATION: pointT.x += navigationShiftXY.x; pointT.y += navigationShiftXY.y; + break; + case MODE_PERSPECTIVE_CENTER: + pointT.x += perspectiveShiftXY.x; + pointT.y += perspectiveShiftXY.y; + break; } matrixUnTransform(pointT, coordPt); } @@ -1611,7 +1633,7 @@ aaStepCenter.scale(1f / totalSteps); float pixelScaleDelta = (targetPixelScale - startPixelScale); float rotationRadiusDelta = (targetRotationRadius - startRotationRadius); - if (navCenter != null && isNavigationMode) { + if (navCenter != null && mode == MODE_NAVIGATION) { aaStepNavCenter.set(navCenter); aaStepNavCenter.sub(navigationCenter); aaStepNavCenter.scale(1f / totalSteps); @@ -1650,7 +1672,7 @@ setRotation(matrixStep); if (center != null) fixedRotationCenter.add(aaStepCenter); - if (navCenter != null && isNavigationMode) { + if (navCenter != null && mode == MODE_NAVIGATION) { Point3f pt = new Point3f(navigationCenter); pt.add(aaStepNavCenter); navigate(0, pt); @@ -1693,7 +1715,7 @@ translateToYPercent(yTrans); } setRotation(matrixEnd); - if (navCenter != null && isNavigationMode) { + if (navCenter != null && mode == MODE_NAVIGATION) { navigationCenter.set(navCenter); if (!Float.isNaN(xNav) && !Float.isNaN(yNav)) navTranslatePercent(0, xNav, yNav); @@ -1811,7 +1833,7 @@ truncate2(sb, modelRadius); sb.append(";"); } - if (isNavigationMode) { + if (mode == MODE_NAVIGATION) { sb.append("navigate 0 center ").append(Escape.escape(navigationCenter)); sb.append(";navigate 0 translate"); truncate2(sb, getNavigationOffsetPercent('X')); Modified: trunk/Jmol/src/org/jmol/viewer/TransformManager11.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TransformManager11.java 2009-12-02 19:55:31 UTC (rev 11843) +++ trunk/Jmol/src/org/jmol/viewer/TransformManager11.java 2009-12-03 18:48:29 UTC (rev 11844) @@ -78,7 +78,7 @@ // conversion factor Angstroms --> pixels // so that "full window" is visualRange - scalePixelsPerAngstrom = (scale3D && !perspectiveDepth && !isNavigationMode ? + scalePixelsPerAngstrom = (scale3D && !perspectiveDepth && mode != MODE_NAVIGATION ? 72 / scale3DAngstromsPerInch : screenPixelCount / visualRange); //(s/m) // model radius in pixels @@ -91,7 +91,7 @@ // + " spC " + screenPixelCount + " vR " + visualRange //+ " sDPPA " + scaleDefaultPixelsPerAngstrom); - if (!isNavigationMode) { + if (mode != MODE_NAVIGATION) { // nonNavigation mode -- to match Jmol 10.2 at midplane (caffeine.xyz) //flag that we have left navigation mode zoomFactor = Float.MAX_VALUE; @@ -162,25 +162,37 @@ // at this point coordinates are centered on rotation center + + switch (mode) { + case MODE_NAVIGATION: + // move nav center to 0; refOffset = Nav - Rot + point3fScreenTemp.x -= navigationShiftXY.x; + point3fScreenTemp.y -= navigationShiftXY.y; + break; + case MODE_PERSPECTIVE_CENTER: + point3fScreenTemp.x -= perspectiveShiftXY.x; + point3fScreenTemp.y -= perspectiveShiftXY.y; + break; + } if (perspectiveDepth) { - if (isNavigationMode) { - // move nav center to 0; refOffset = Nav - Rot - point3fScreenTemp.x -= navigationShiftXY.x; - point3fScreenTemp.y -= navigationShiftXY.y; - } // apply perspective factor float factor = getPerspectiveFactor(z); point3fScreenTemp.x *= factor; point3fScreenTemp.y *= factor; } - - //now move the center point to where it needs to be - if (isNavigationMode) { + switch (mode) { + case MODE_NAVIGATION: point3fScreenTemp.x += navigationOffset.x; point3fScreenTemp.y += navigationOffset.y; - } else { + break; + case MODE_PERSPECTIVE_CENTER: + point3fScreenTemp.x += perspectiveOffset.x; + point3fScreenTemp.y += perspectiveOffset.y; + break; + case MODE_STANDARD: point3fScreenTemp.x += fixedRotationOffset.x; point3fScreenTemp.y += fixedRotationOffset.y; + break; } if (Float.isNaN(point3fScreenTemp.x) && !haveNotifiedNaN) { @@ -210,7 +222,7 @@ void setScreenParameters(int screenWidth, int screenHeight, boolean useZoomLarge, boolean antialias, boolean resetSlab, boolean resetZoom) { - Point3f pt = (isNavigationMode ? new Point3f(navigationCenter) : null); + Point3f pt = (mode == MODE_NAVIGATION ? new Point3f(navigationCenter) : null); Point3f ptoff = new Point3f(navigationOffset); ptoff.x = ptoff.x / width; ptoff.y = ptoff.y / height; @@ -316,7 +328,7 @@ depthValue = Integer.MAX_VALUE; if (!slabEnabled) return; - zSlabValue = slabValue = (isNavigationMode ? -100 : 0) + (int) (referencePlaneOffset - navigationSlabOffset); + zSlabValue = slabValue = (mode == MODE_NAVIGATION ? -100 : 0) + (int) (referencePlaneOffset - navigationSlabOffset); zDepthValue = depthValue = zValueFromPercent(depthPercentSetting); viewer.getGlobalSettings().setParameterValue("navigationDepth",getNavigationDepthPercent()); @@ -355,7 +367,7 @@ // Point3f navigationCenter) { //fixedRotationCenter, navigationOffset, navigationCenter - isNavigationMode = false; + mode = defaultMode; //get the rotation center's Z offset and move X and Y to 0,0 transformPoint(fixedRotationCenter, pointT); pointT.x -= navigationOffset.x; @@ -368,7 +380,7 @@ //now untransform that point to give the center that would //deliver this fixedModel position matrixUnTransform(pointT, navigationCenter); - isNavigationMode = true; + mode = MODE_NAVIGATION; } boolean canNavigate() { @@ -383,11 +395,12 @@ //no release from navigation mode if too far zoomed in! - if (zoomPercent < 5 && !isNavigationMode) { - isNavigationMode = perspectiveDepth = true; + if (zoomPercent < 5 && mode != MODE_NAVIGATION) { + perspectiveDepth = true; + mode = MODE_NAVIGATION; return; } - if (isNavigationMode) { + if (mode == MODE_NAVIGATION) { navMode = NAV_MODE_RESET; slabPercentSetting = 0; perspectiveDepth = true; @@ -395,8 +408,7 @@ slabPercentSetting = 100; } if (doResetSlab) - slabEnabled = isNavigationMode; - + slabEnabled = (mode == MODE_NAVIGATION); zoomFactor = Float.MAX_VALUE; zoomPercentSetting = zoomPercent; } @@ -422,7 +434,7 @@ synchronized void navigate(int keyCode, int modifiers) { // 0 0 here means "key released" - if (!isNavigationMode) + if (mode != MODE_NAVIGATION) return; if (keyCode == 0) { nHits = 0; @@ -894,7 +906,7 @@ } protected String getNavigationState() { - if (!isNavigationMode) + if (mode != MODE_NAVIGATION) return ""; return "# navigation state;\nnavigate 0 center " + Escape.escape(getNavigationCenter()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-12-05 07:17:07
|
Revision: 11860 http://jmol.svn.sourceforge.net/jmol/?rev=11860&view=rev Author: hansonr Date: 2009-12-05 07:17:01 +0000 (Sat, 05 Dec 2009) Log Message: ----------- Sparsh -- no need (yet) for communication relating to consume Modified Paths: -------------- trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java =================================================================== --- trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java 2009-12-05 07:11:45 UTC (rev 11859) +++ trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java 2009-12-05 07:17:01 UTC (rev 11860) @@ -4,7 +4,7 @@ import java.awt.Dimension; import java.awt.Point; import java.awt.Toolkit; -import java.io.DataInputStream; +//import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; @@ -44,7 +44,7 @@ private Component _display; - private DataInputStream _in; + //private DataInputStream _in; private DataOutputStream _out; public JmolTouchSimulator() { @@ -52,7 +52,7 @@ public void dispose() { try { - _in.close(); + //_in.close(); } catch (Exception e) { } @@ -77,7 +77,7 @@ _timer = new Timer(); try { Socket socket = new Socket(address, NetworkConfiguration.PORT); - _in = new DataInputStream(socket.getInputStream()); + //_in = new DataInputStream(socket.getInputStream()); _out = new DataOutputStream(socket.getOutputStream()); _out.writeByte(ConnectionType.INPUT_DEVICE); return true; @@ -195,9 +195,9 @@ _out.writeFloat(((float) e.x / (float) dim.width)); _out.writeFloat(((float) e.y / (float) dim.height)); _out.writeByte((byte) e.type); - boolean doConsume = (_in.readByte() == 1); - if (Logger.debugging) - System.out.println("[JmolTouchSimulator] doConsume=" + doConsume); + //boolean doConsume = (_in.readByte() == 1); + //if (Logger.debugging) + // System.out.println("[JmolTouchSimulator] doConsume=" + doConsume); } catch (IOException e1) { System.err.println("Failed to send event to server."); } Modified: trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java 2009-12-05 07:11:45 UTC (rev 11859) +++ trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java 2009-12-05 07:17:01 UTC (rev 11860) @@ -1,7 +1,7 @@ package com.sparshui.server; import java.io.DataInputStream; -import java.io.DataOutputStream; +//import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.HashMap; @@ -32,7 +32,7 @@ * */ private DataInputStream _in; - private DataOutputStream _out; + //private DataOutputStream _out; /** @@ -56,7 +56,7 @@ _gestureServer = gestureServer; _socket = socket; _in = new DataInputStream(socket.getInputStream()); - _out = new DataOutputStream(socket.getOutputStream()); + //_out = new DataOutputStream(socket.getOutputStream()); _touchPoints = new HashMap(); _flaggedids = new Vector(); startListening(); @@ -87,8 +87,8 @@ private void receiveData() { try { while(!_socket.isInputShutdown()) { - boolean doConsume = readTouchPoints(_in.readInt()); - _out.write((byte) (doConsume ? 1 : 0)); + /*boolean doConsume = */ readTouchPoints(_in.readInt()); + //_out.write((byte) (doConsume ? 1 : 0)); } } catch (IOException e) { //System.err.println("Error reading touch point from input device."); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-12-05 07:11:45 UTC (rev 11859) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-12-05 07:17:01 UTC (rev 11860) @@ -1,7 +1,7 @@ # Developers: to add a description of changes you have made, # add it on a line starting with # below the "version=..." line -version=11.9.10_dev +version=11.9.10 # bug fix: zoom/zoomTo does not refresh transform parameters # new feature: -<matrix> transpose This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-12-09 06:27:54
|
Revision: 11880 http://jmol.svn.sourceforge.net/jmol/?rev=11880&view=rev Author: hansonr Date: 2009-12-09 05:58:25 +0000 (Wed, 09 Dec 2009) Log Message: ----------- Modified Paths: -------------- trunk/Jmol/src/com/sparshui/common/messages/events/DblClkEvent.java trunk/Jmol/src/com/sparshui/gestures/unused_gestures.zip trunk/Jmol/src/com/sparshui/server/TouchPoint.java trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java Removed Paths: ------------- trunk/Jmol/src/com/sparshui/gestures/StandardDynamicGesture.java trunk/Jmol/src/com/sparshui/gestures/TouchGesture.java Modified: trunk/Jmol/src/com/sparshui/common/messages/events/DblClkEvent.java =================================================================== --- trunk/Jmol/src/com/sparshui/common/messages/events/DblClkEvent.java 2009-12-09 05:32:27 UTC (rev 11879) +++ trunk/Jmol/src/com/sparshui/common/messages/events/DblClkEvent.java 2009-12-09 05:58:25 UTC (rev 11880) @@ -2,6 +2,7 @@ import com.sparshui.common.Event; import com.sparshui.common.utils.Converter; +import com.sparshui.server.TouchPoint; /* * @@ -45,6 +46,14 @@ _time = System.currentTimeMillis(); } + public DblClkEvent(TouchPoint tp) { + _id = tp.getID(); + _x = tp.getLocation().getX(); + _y = tp.getLocation().getY(); + _state = tp.getState(); + _time = tp.getTime(); + } + public int getTouchID() { return _id; } Deleted: trunk/Jmol/src/com/sparshui/gestures/StandardDynamicGesture.java =================================================================== --- trunk/Jmol/src/com/sparshui/gestures/StandardDynamicGesture.java 2009-12-09 05:32:27 UTC (rev 11879) +++ trunk/Jmol/src/com/sparshui/gestures/StandardDynamicGesture.java 2009-12-09 05:58:25 UTC (rev 11880) @@ -1,171 +0,0 @@ -package com.sparshui.gestures; - -import java.util.HashMap; -import java.util.Vector; - -import com.sparshui.common.Location; -import com.sparshui.common.TouchState; -import com.sparshui.server.TouchPoint; - -/** - * This is a class to ease implementation of standard dynamic - * gestures. Standard dynamic gestures can inherit from this class - * and this class takes care of managing the list of touchpoints - * that belong to this gesture. Subclasses need only implement - * the processBirth, processMove, and processDeath methods to - * perform gesture processing. - * - * @author Jay Roltgen - */ -public abstract class StandardDynamicGesture implements Gesture { - - protected HashMap _knownPoints; - protected HashMap _traceData; - protected Location _oldCentroid; - protected Location _newCentroid; - protected float _sumX, _sumY; - - /** - * - */ - protected StandardDynamicGesture() { - _knownPoints = new HashMap(); - _traceData = new HashMap(); - _oldCentroid = new Location(0, 0); - _newCentroid = new Location(0, 0); - } - - /** - * Get the name of this gesture. - * - * @return - * The name of this gesture. - */ - //@override - public abstract String getName(); - - //@override - public Vector processChange(Vector touchPoints, - TouchPoint changedPoint) { - Vector events = null; - - switch(changedPoint.getState()) { - case TouchState.BIRTH: - events = handleBirth(changedPoint); - break; - case TouchState.MOVE: - events = handleMove(changedPoint); - break; - case TouchState.DEATH: - //System.out.println("calling handledeath"); - events = handleDeath(changedPoint); - //System.out.println(events); - break; - } - - return (events != null) ? events : new Vector(); - } - - /** - * - * @param touchPoint - * @return TouchData - */ - protected TouchData createTouchData(TouchPoint touchPoint) { - return new TouchData(touchPoint.getLocation()); - } - - /** - * - * @param touchData - * @return Vector - */ - protected abstract Vector processBirth(TouchData touchData); - - /** - * - * @param touchData - * @return Vector - */ - protected abstract Vector processMove(TouchData touchData); - - /** - * - * @param touchData - * @return Vector - */ - protected abstract Vector processDeath(TouchData touchData); - - /** - * - * @param touchPoint - * @return Vector - */ - private Vector handleBirth(TouchPoint touchPoint) { - TouchData touchData = createTouchData(touchPoint); - _knownPoints.put(new Integer(touchPoint.getID()), touchData); - moveCentroid(touchData.getLocation().getX(), touchData.getLocation().getY()); - return processBirth(touchData); - } - - /** - * - * @param touchPoint - * @return Vector - */ - private Vector handleMove(TouchPoint touchPoint) { - TouchData touchData = (TouchData) _knownPoints.get(new Integer(touchPoint.getID())); - touchData.setLocation(touchPoint.getLocation()); - moveCentroid( - touchData.getLocation().getX() - touchData.getOldLocation().getX(), - touchData.getLocation().getY() - touchData.getOldLocation().getY() - ); - return processMove(touchData); - } - - /** - * - * @param touchPoint - * @return Vector - */ - private Vector handleDeath(TouchPoint touchPoint) { - Integer iid = new Integer(touchPoint.getID()); - TouchData touchData = (TouchData) _knownPoints.get(iid); - touchData.setLocation(touchPoint.getLocation()); - _knownPoints.remove(iid); - moveCentroid(-touchData.getOldLocation().getX(), -touchData.getOldLocation().getY()); - return processDeath(touchData); - } - /** - * - * @param dx - * @param dy - */ - private void moveCentroid(float dx, float dy) { - _sumX += dx; - _sumY += dy; - _oldCentroid = _newCentroid; - _newCentroid = new Location(_sumX / _knownPoints.size(), _sumY / _knownPoints.size()); - } - - /** - * - */ - public class TouchData { - private Location _location; - private Location _oldLocation; - public TouchData(Location location) { - _oldLocation = _location = location; - } - public Location getLocation() { - return _location; - } - public Location getOldLocation() { - return _oldLocation; - } - public void setLocation(Location location) { - _oldLocation = _location; - _location = location; - } - } -} Deleted: trunk/Jmol/src/com/sparshui/gestures/TouchGesture.java =================================================================== --- trunk/Jmol/src/com/sparshui/gestures/TouchGesture.java 2009-12-09 05:32:27 UTC (rev 11879) +++ trunk/Jmol/src/com/sparshui/gestures/TouchGesture.java 2009-12-09 05:58:25 UTC (rev 11880) @@ -1,27 +0,0 @@ -package com.sparshui.gestures; - -import java.util.Vector; - -import com.sparshui.common.messages.events.TouchEvent; -import com.sparshui.server.TouchPoint; - -public class TouchGesture implements Gesture { - - //@override - public Vector processChange(Vector touchPoints, TouchPoint changedTouchPoint) { - Vector retEvents = new Vector(); - retEvents.add(new TouchEvent(changedTouchPoint)); - return retEvents; - } - - //@override - public String getName() { - return "TouchGesture"; - } - - //@override - public int getGestureType() { - return GestureType.TOUCH_GESTURE; - } - -} Modified: trunk/Jmol/src/com/sparshui/gestures/unused_gestures.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/src/com/sparshui/server/TouchPoint.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/TouchPoint.java 2009-12-09 05:32:27 UTC (rev 11879) +++ trunk/Jmol/src/com/sparshui/server/TouchPoint.java 2009-12-09 05:58:25 UTC (rev 11880) @@ -115,7 +115,11 @@ return _state; } - /** + public void setState(int state) { + _state = state; + } + + /** * Set the group for this touch point. * * @param group @@ -164,5 +168,11 @@ public Object clone() { return new TouchPoint(this); } + public boolean isNear(TouchPoint tp) { + // figure 1000 x 800 screen, so 1/1000 is about 1 pixel. + // let's allow for +/- 5 pixels here, or about 0.005 screen widths. + return (Math.abs(_location.getX() - tp._location.getX()) < 0.005 + && Math.abs(_location.getY() - tp._location.getY()) < 0.005); + } } Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java 2009-12-09 05:32:27 UTC (rev 11879) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java 2009-12-09 05:58:25 UTC (rev 11880) @@ -56,7 +56,18 @@ case TouchState.MOVE: if (_nCurrent > 1) return retEvents; - nMoves++; + switch (++nMoves) { + case 2: + if (changedTouchPoint.getTime() - birth.getTime() > 500) { + // long (1/2 sec) pause and drag == double-click-drag ==> _translate + TouchPoint tp = new TouchPoint(birth); + tp.setState(TouchState.DEATH); + retEvents.add(new TouchEvent(tp)); + tp.setState(TouchState.BIRTH); + retEvents.add(new TouchEvent(tp)); + } + break; + } break; case TouchState.DEATH: if (--_nCurrent > 0) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-12-09 06:40:17
|
Revision: 11883 http://jmol.svn.sourceforge.net/jmol/?rev=11883&view=rev Author: hansonr Date: 2009-12-09 06:40:05 +0000 (Wed, 09 Dec 2009) Log Message: ----------- version=11.9.11_dev # code: Jmol/SparshUI multitouch refinements Modified Paths: -------------- trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java trunk/Jmol/src/com/sparshui/common/TouchState.java trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java Removed Paths: ------------- trunk/Jmol/src/com/sparshui/common/messages/events/DblClkEvent.java Modified: trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java =================================================================== --- trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java 2009-12-09 06:00:13 UTC (rev 11882) +++ trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java 2009-12-09 06:40:05 UTC (rev 11883) @@ -127,9 +127,9 @@ case EventType.ZOOM_EVENT: event = new ZoomEvent(newData); break; - case EventType.DBLCLK_EVENT: - event = new DblClkEvent(newData); - break; +// case EventType.DBLCLK_EVENT: +// event = new ClickEvent(newData); +// break; case EventType.FLICK_EVENT: event = new FlickEvent(newData); break; Modified: trunk/Jmol/src/com/sparshui/common/TouchState.java =================================================================== --- trunk/Jmol/src/com/sparshui/common/TouchState.java 2009-12-09 06:00:13 UTC (rev 11882) +++ trunk/Jmol/src/com/sparshui/common/TouchState.java 2009-12-09 06:40:05 UTC (rev 11883) @@ -21,4 +21,6 @@ * */ public final static int MOVE = 2; + + public final static int CLICK = 3; } Deleted: trunk/Jmol/src/com/sparshui/common/messages/events/DblClkEvent.java =================================================================== --- trunk/Jmol/src/com/sparshui/common/messages/events/DblClkEvent.java 2009-12-09 06:00:13 UTC (rev 11882) +++ trunk/Jmol/src/com/sparshui/common/messages/events/DblClkEvent.java 2009-12-09 06:40:05 UTC (rev 11883) @@ -1,130 +0,0 @@ -package com.sparshui.common.messages.events; - -import com.sparshui.common.Event; -import com.sparshui.common.utils.Converter; -import com.sparshui.server.TouchPoint; - -/* - * - * adapted by Bob Hanson for Jmol 11/29/2009 to include time and state - * - */ -public class DblClkEvent implements Event { - private static final long serialVersionUID = -1643892133742179717L; - - //@override - public int getEventType() { - return EventType.DBLCLK_EVENT; - } - - private int _id; - private float _x; - private float _y; - private long _time; - private int _state; - - //default constructor - public DblClkEvent() { - _id = 0; - _x = 0; - _y = 0; - } - - //specific constructor - /** - * - * @param id - * @param x - * @param y - * @param state - */ - public DblClkEvent(int id, float x, float y, int state) { - _id = id; - _x = x; - _y = y; - _state = state; - _time = System.currentTimeMillis(); - } - - public DblClkEvent(TouchPoint tp) { - _id = tp.getID(); - _x = tp.getLocation().getX(); - _y = tp.getLocation().getY(); - _state = tp.getState(); - _time = tp.getTime(); - } - - public int getTouchID() { - return _id; - } - - public int getState() { - return _state; - } - - public long getTime() { - return _time; - } - - public float getX() { - return _x; - } - - public float getY() { - return _y; - } - - public void setX(float x) { - _x = x; - } - - public void setY(float y) { - _y = y; - } - - /** - * Constructs a new DlbClkEvent from a serialized version - * - 4 bytes : id - * - 4 bytes : x - * - 4 bytes : y - * - 4 bytes : state - * - 8 bytes : time - * - 24 bytes total - * - * @param data the serialized version of touchEvent - */ - public DblClkEvent(byte[] data) { - if (data.length < 24) { - System.err.println("An error occurred while deserializing a DblClkEvent."); - } else { - _id = Converter.byteArrayToInt(data, 0); - _x = Converter.byteArrayToFloat(data, 4); - _y = Converter.byteArrayToFloat(data, 8); - _state = Converter.byteArrayToInt(data, 12); - _time = Converter.byteArrayToLong(data, 16); - } - } - - /** - * Constructs the data packet with this event data. Message format for this - * event: - * - 4 bytes : event type - * - 4 bytes : id - * - 4 bytes : x - * - 4 bytes : y - * - 4 bytes : state - * - 8 bytes : time - * - 28 bytes total - * @return serialized data - */ - public byte[] serialize() { - byte[] data = new byte[28]; - Converter.intToByteArray(data, 0, getEventType()); - Converter.intToByteArray(data, 4, _id); - Converter.floatToByteArray(data, 8, _x); - Converter.floatToByteArray(data, 12, _y); - Converter.intToByteArray(data, 16, _state); - Converter.longToByteArray(data, 20, _time); - return data; - } -} Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2009-12-09 06:00:13 UTC (rev 11882) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2009-12-09 06:40:05 UTC (rev 11883) @@ -48,7 +48,6 @@ import com.sparshui.common.Event; import com.sparshui.common.Location; import com.sparshui.common.NetworkConfiguration; -import com.sparshui.common.messages.events.DblClkEvent; import com.sparshui.common.messages.events.DragEvent; import com.sparshui.common.messages.events.FlickEvent; import com.sparshui.common.messages.events.RelativeDragEvent; @@ -240,12 +239,6 @@ fixXY(((ZoomEvent) event).getCenter().getX(), ((ZoomEvent) event).getCenter().getY()); ptTemp.z = ((ZoomEvent) event).getScale(); break; - case ActionManagerMT.DBLCLK_EVENT: - id = ((DblClkEvent) event).getTouchID(); - fixXY(((DblClkEvent) event).getX(), ((DblClkEvent) event).getY()); - iData = ((DblClkEvent) event).getState(); - time = ((DblClkEvent) event).getTime(); - break; case ActionManagerMT.FLICK_EVENT: fixXY(((FlickEvent) event).getXdirection(), ((FlickEvent) event).getYdirection()); ptTemp.z = ((FlickEvent) event).getSpeedLevel(); Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java 2009-12-09 06:00:13 UTC (rev 11882) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java 2009-12-09 06:40:05 UTC (rev 11883) @@ -3,7 +3,6 @@ import java.util.Vector; import com.sparshui.common.TouchState; -import com.sparshui.common.messages.events.DblClkEvent; import com.sparshui.common.messages.events.TouchEvent; import com.sparshui.gestures.Gesture; import com.sparshui.gestures.GestureType; @@ -18,6 +17,7 @@ */ public class SingleTouchGesture implements Gesture { + private static final long MAXIMUM_CLICK_TIME = 200; private int _nCurrent = 0; private TouchPoint birth; private int nMoves; @@ -46,7 +46,6 @@ System.out.println("SingleTouchGesture processChange1 " + _nCurrent + " state=" + changedTouchPoint.getState()); Vector retEvents = new Vector(); - boolean isDoubleClick = false; switch (changedTouchPoint.getState()) { case TouchState.BIRTH: if (++_nCurrent > 1) @@ -59,14 +58,8 @@ return retEvents; switch (++nMoves) { case 2: - if (changedTouchPoint.getTime() - birth.getTime() > 500) { - // long (1/2 sec) pause and drag == double-click-drag ==> _translate - TouchPoint tp = new TouchPoint(birth); - tp.setState(TouchState.DEATH); - retEvents.add(new TouchEvent(tp)); - tp.setState(TouchState.BIRTH); - retEvents.add(new TouchEvent(tp)); - } + if (checkClick(changedTouchPoint, retEvents, false)) + return retEvents; break; } break; @@ -74,15 +67,38 @@ if (--_nCurrent > 0) return retEvents; _nCurrent = 0; - // single fingers only here - // look for a long click --> dbl-click (not right-click) - isDoubleClick = (nMoves <= 2 && birth.isNear(changedTouchPoint) - && changedTouchPoint.getTime() - birth.getTime() > 500 /* ms */); + if (nMoves < 2 && checkClick(changedTouchPoint, retEvents, true)) + return retEvents; break; } retEvents.add(new TouchEvent(changedTouchPoint)); - if (isDoubleClick) - retEvents.add(new DblClkEvent(changedTouchPoint)); return retEvents; } + + private boolean checkClick(TouchPoint tpNew, Vector retEvents, + boolean isDeath) { + TouchPoint tp; + long dt = tpNew.getTime() - birth.getTime(); + boolean isSingleClick = (isDeath && dt < MAXIMUM_CLICK_TIME); + if (dt < 500 && !isSingleClick) + return false; + nMoves += 2; + // long (1/2 sec) pause and drag == double-click-drag ==> _translate + tp = new TouchPoint(birth); + tp.setState(TouchState.DEATH); + retEvents.add(new TouchEvent(tp)); + tp.setState(TouchState.CLICK); + retEvents.add(new TouchEvent(tp)); + if (isSingleClick) + return true; + tp.setState(TouchState.BIRTH); + retEvents.add(new TouchEvent(tp)); + if (!isDeath) + return true; + tp.setState(TouchState.DEATH); + retEvents.add(new TouchEvent(tp)); + tp.setState(TouchState.CLICK); + retEvents.add(new TouchEvent(tp)); + return true; + } } Modified: trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2009-12-09 06:00:13 UTC (rev 11882) +++ trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2009-12-09 06:40:05 UTC (rev 11883) @@ -144,10 +144,11 @@ public final static int DBLCLK_EVENT = 5; public final static int FLICK_EVENT = 6; public final static int RELATIVE_DRAG_EVENT = 7; + public static final int CLICK_EVENT = 8; private final static String[] eventNames = new String[] { "drag", "rotate", "spin", "touch", "zoom", - "double-click", "flick", "relative-drag", + "double-click", "flick", "relative-drag", "click" }; // these must be the same as in com.sparshui.common.TouchState @@ -155,6 +156,7 @@ public final static int BIRTH = 0; public final static int DEATH = 1; public final static int MOVE = 2; + public final static int CLICK = 3; private static String getEventName(int i) { @@ -211,10 +213,6 @@ case SERVICE_LOST: startSparshUIService(simulator != null); break; - case DBLCLK_EVENT: - // always comes after a mouse press/release sequence - mouseClicked(time, (int) pt.x, (int) pt.y, Binding.LEFT, 2); - break; case TOUCH_EVENT: haveMultiTouchInput = true; switch(iData) { @@ -232,6 +230,9 @@ mouseDown = false; super.mouseReleased(time, (int) pt.x, (int) pt.y, Binding.LEFT); break; + case CLICK: + // always follows DEATH when found + mouseClicked(time, (int) pt.x, (int) pt.y, Binding.LEFT, 1); } break; case ZOOM_EVENT: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-12-10 16:47:15
|
Revision: 11887 http://jmol.svn.sourceforge.net/jmol/?rev=11887&view=rev Author: hansonr Date: 2009-12-10 16:47:04 +0000 (Thu, 10 Dec 2009) Log Message: ----------- multitouch Modified Paths: -------------- trunk/Jmol/src/com/sparshui/common/Location.java trunk/Jmol/src/com/sparshui/common/messages/events/TouchEvent.java trunk/Jmol/src/com/sparshui/server/GestureServer.java trunk/Jmol/src/com/sparshui/server/TouchPoint.java trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java trunk/Jmol/src/org/jmol/viewer/ActionManager.java trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java trunk/Jmol/src/org/jmol/viewer/TransformManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/com/sparshui/common/Location.java =================================================================== --- trunk/Jmol/src/com/sparshui/common/Location.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/com/sparshui/common/Location.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -60,7 +60,10 @@ } public String toString() { - return "x = " + _x + ", y = " + _y + "(" + pixelLocation(this).getX() + " " + pixelLocation(this).getY() + ")"; + return "x = " + _x + ", y = " + _y + + (_x < 1 && _x > 0 ? "(" + + pixelLocation(this).getX() + " " + pixelLocation(this).getY() + ")" + : ""); } Modified: trunk/Jmol/src/com/sparshui/common/messages/events/TouchEvent.java =================================================================== --- trunk/Jmol/src/com/sparshui/common/messages/events/TouchEvent.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/com/sparshui/common/messages/events/TouchEvent.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -96,12 +96,10 @@ if (data.length < 24) { System.err.println("An error occurred while deserializing a TouchEvent."); } else { - System.out.println("TouchEvent decode1 " + data.length); _id = Converter.byteArrayToInt(data, 0); _x = Converter.byteArrayToFloat(data, 4); _y = Converter.byteArrayToFloat(data, 8); _state = Converter.byteArrayToInt(data, 12); - System.out.println("TouchEvent decode2 " + data.length); _time = Converter.byteArrayToLong(data, 16); } } Modified: trunk/Jmol/src/com/sparshui/server/GestureServer.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureServer.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/com/sparshui/server/GestureServer.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -127,11 +127,10 @@ if (port == NetworkConfiguration.DEVICE_PORT) { Logger.info("[GestureServer] Accepting device connections"); acceptConnection(_mySocket.accept()); - } else { - Logger.info("[GestureServer] Accepting client connections"); - acceptConnection(_mySocket.accept()); return; // only one of these } + Logger.info("[GestureServer] Accepting client connections"); + acceptConnection(_mySocket.accept()); } catch (IOException e) { Logger.error("[GestureServer] Failed to establish connection on port " + port); e.printStackTrace(); @@ -209,8 +208,8 @@ boolean processTouchPoint(HashMap inputDeviceTouchPoints, int id, Location location, long time, int state) { if (Logger.debugging) { - Logger.info("[GestureServer] processTouchPoint " + id + " " + location - + " " + time + " " + state); + Logger.info("[GestureServer] processTouchPoint id=" + id + " state=" + state + " " + location + + " " + time); } Integer iid = new Integer(id); if (inputDeviceTouchPoints.containsKey(iid)) { @@ -223,7 +222,7 @@ } return true; } - TouchPoint touchPoint = new TouchPoint(location, time); + TouchPoint touchPoint = new TouchPoint(id, location, time); inputDeviceTouchPoints.put(iid, touchPoint); return processBirth(touchPoint); } Modified: trunk/Jmol/src/com/sparshui/server/TouchPoint.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/TouchPoint.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/com/sparshui/server/TouchPoint.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -13,12 +13,12 @@ /** * Used to assign a globally unique id to a new touch point. */ - private static int nextID = 0; + //private static int nextID = 0; /** * */ - private static Object idLock = new Object(); + //private static Object idLock = new Object(); /** * @@ -61,13 +61,15 @@ } /** * + * @param id * @param location * @param time */ - public TouchPoint(Location location, long time) { - synchronized(idLock) { - _id = nextID++; - } + public TouchPoint(int id, Location location, long time) { + //synchronized(idLock) { + // _id = nextID++; + //} + _id = id; // for debugging, I need the exact match with device points _location = location; _time = time; _state = TouchState.BIRTH; Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -114,7 +114,9 @@ gestureServer = (JmolGestureServerInterface) Interface .getInterface("com.sparshui.server.GestureServer"); gestureServer.startGestureServer(); - if (!isSimulation) + if (true || isSimulation) { + Logger.info("JmolSparshClientAdapter skipping driver startup"); + } else { try { String driver = (new File("JmolMultiTouchDriver.exe")).getAbsolutePath(); Logger.info("JmolSparshClientAdapter starting " + driver); @@ -130,6 +132,7 @@ } catch (Exception e) { System.out.println(e.getMessage()); } + } int port = NetworkConfiguration.CLIENT_PORT; try { actionManager = client; // ActionManagerMT @@ -233,7 +236,6 @@ fixXY(((TouchEvent) event).getX(), ((TouchEvent) event).getY()); iData = ((TouchEvent) event).getState(); time = ((TouchEvent) event).getTime(); - System.out.println("JmolSparshClientAdapter received time: " + time); break; case ActionManagerMT.ZOOM_EVENT: fixXY(((ZoomEvent) event).getCenter().getX(), ((ZoomEvent) event).getCenter().getY()); Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -2,6 +2,8 @@ import java.util.Vector; +import org.jmol.util.Logger; + import com.sparshui.common.TouchState; import com.sparshui.common.messages.events.TouchEvent; import com.sparshui.gestures.Gesture; @@ -43,8 +45,8 @@ */ // @override public Vector processChange(Vector touchPoints, TouchPoint changedTouchPoint) { - System.out.println("SingleTouchGesture processChange1 " + _nCurrent - + " state=" + changedTouchPoint.getState()); + if (Logger.debugging) + Logger.info("\nSingle id=" + changedTouchPoint.getID() + " state=" + changedTouchPoint.getState() + " ncurrent=" + _nCurrent + " nMoves=" + nMoves); Vector retEvents = new Vector(); switch (changedTouchPoint.getState()) { case TouchState.BIRTH: @@ -71,6 +73,8 @@ return retEvents; break; } + if (Logger.debugging) + Logger.info("Single creating new touch event"); retEvents.add(new TouchEvent(changedTouchPoint)); return retEvents; } Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -62,8 +62,9 @@ protected Location _offsetCentroid = null; private Vector _traces1 = new Vector(); private Vector _traces2 = new Vector(); + private int _id1 = -1; + private int _id2 = -1; private int _nTraces = 0; - private int _nCurrent = 0; private float _scale; private float _rotation; private float _distance0; @@ -83,8 +84,11 @@ //@override public Vector processChange(Vector touchPoints, TouchPoint changedPoint) { + return processChangeSync(touchPoints, changedPoint); + } + private synchronized Vector processChangeSync(Vector touchPoints, + TouchPoint changedPoint) { Vector events = null; - switch(changedPoint.getState()) { case TouchState.BIRTH: events = processBirth(changedPoint); @@ -93,50 +97,53 @@ events = processMove(changedPoint); break; case TouchState.DEATH: - events = processDeath(); + events = processDeath(changedPoint); break; } - return (events != null) ? events : new Vector(); } // @override protected Vector processBirth(TouchPoint touchPoint) { - _nCurrent++; Location location = touchPoint.getLocation(); - System.out.println("TwoPointGesture birth ntraces:" + _nTraces + " ncurrent:" + _nCurrent); + int id = touchPoint.getID(); + System.out.println("TwoPointGesture birth ntraces:" + _nTraces + " ids:" + _id1+","+_id2+ " id:" + id); switch (_nTraces) { case 0: - _traces1 = new Vector(); + _traces1.clear(); _traces1.add(Location.pixelLocation(location)); + _id1 = id; + _nTraces = 1; break; case 1: - _traces2 = new Vector(); + _traces2.clear(); _traces2.add(Location.pixelLocation(location)); + _id2 = id; + Object o = _traces1.lastElement(); + _traces1.clear(); + _traces1.add(o); + _nTraces = 2; break; - default: - _myType = ActionManagerMT.INVALID_GESTURE; } - _nTraces++; return null; } // @override protected Vector processMove(TouchPoint touchPoint) { - System.out.println("TwoPointGesture move ntraces:" + _nTraces + " ncurrent:" + _nCurrent); + int id = touchPoint.getID(); + if (id != _id1 && id != _id2) { + + } + System.out.println("TwoPointGesture move ntraces:" + _nTraces + " ids:" + _id1+","+_id2+ " id:" + touchPoint.getID()); Vector events = new Vector(); - if (_nTraces != 2) + if (!updateLocations(touchPoint)) return events; - Location location = Location.pixelLocation(touchPoint.getLocation()); - updateLocations(location); - if (_nCurrent < 2) - return events; if (_myType == ActionManagerMT.INVALID_GESTURE) checkType(); if (_myType == ActionManagerMT.INVALID_GESTURE || !updateCentroid()) return events; - location = Location.screenLocation(_offsetCentroid); + Location location = Location.screenLocation(_offsetCentroid); Event event = null; switch (_myType) { case ActionManagerMT.ZOOM_GESTURE: @@ -155,45 +162,70 @@ } // @override - protected Vector processDeath() { - _nCurrent--; - System.out.println("TwoPointGesture death ntraces:" + _nTraces + " ncurrent:" + _nCurrent); - if (_nCurrent <= 0) { - _nTraces = _nCurrent = 0; - _traces1 = null; - _traces2 = null; - _v00 = null; - _myType = ActionManagerMT.INVALID_GESTURE; + protected Vector processDeath(TouchPoint touchPoint) { + System.out.println("TwoPointGesture death ntraces:" + _nTraces + " ids:" + + _id1 + "," + _id2 + " id:" + touchPoint.getID()); + if (--_nTraces == 1) { + int id = touchPoint.getID(); + if (id == _id1) { + _id1 = _id2; + Vector v = _traces1; + _traces1 = _traces2; + _traces2 = v; + _traces2.clear(); + _id2 = -1; + } else if (id == _id2) { + _traces2.clear(); + _id2 = -1; + } else { + _nTraces = 0; + } + } + if (_nTraces == 0) { + _traces1.clear(); + _traces2.clear(); + _id1 = _id2 = -1; } + _v00 = null; + _myType = ActionManagerMT.INVALID_GESTURE; return null; } - private void updateLocations(Location location) { - boolean id1 = (_nCurrent < 2 - || location.distance2((Location) _traces1.lastElement()) <= location - .distance2((Location) _traces2.lastElement())); - if (id1) { + private boolean updateLocations(TouchPoint touchPoint) { + Location location = Location.pixelLocation(touchPoint.getLocation()); + int id = touchPoint.getID(); + if (id == _id1) { + //System.out.println("TwoPointGesture updateLocation 1: " + id + " " + //+ location); _traces1.add(location); + } else if (id == _id2) { + //System.out.println("TwoPointGesture updateLocation 2: " + id + " " + // + location); + _traces2.add(location); } else { - _traces2.add(location); + //System.out.println("TwoPointGesture updateLocation NOT: " + id); + return false; } - if (_nCurrent == 2) { - // weight centroid to the branch that is not moving - // this works for zoom or rotation - if (_v00 == null) { - Location l1 = (Location) _traces1.firstElement(); - Location l2 = (Location) _traces2.firstElement(); - _v00 = new Vector3f(l2.getX() - l1.getX(), l2.getY() - l1.getY(), 0); - _distance0 = _v00.length(); - _v00.normalize(); - } - } + if (_nTraces < 2) + return false; + // weight centroid to the branch that is not moving + // this works for zoom or rotation + if (_v00 != null) + return true; + Location l1 = (Location) _traces1.firstElement(); + Location l2 = (Location) _traces2.firstElement(); + _v00 = new Vector3f(l2.getX() - l1.getX(), l2.getY() - l1.getY(), 0); + _distance0 = _v00.length(); + _v00.normalize(); + //System.out.println("TwoPointGesture updateLocation _v00 and _distance0: " + // + _v00 + " " + _distance0); + return true; } private void checkType() { - System.out.println("TwoPointGesture type=" + _myType + " _v00=" + _v00 - + "\n traces sizes: " + _traces1.size() + " " + _traces2.size()); - if (_traces1.size() < 10 || _traces2.size() < 10) + //System.out.println("TwoPointGesture type=" + _myType + " _v00=" + _v00 + // + "\n traces sizes: " + _traces1.size() + " " + _traces2.size()); + if (_traces1.size() < 5 || _traces2.size() < 5) return; Location loc10 = (Location) _traces1.firstElement(); Location loc20 = (Location) _traces2.firstElement(); @@ -205,24 +237,20 @@ - loc20.getY(), 0); float d1 = v1.length(); float d2 = v2.length(); + if (d1 <= 2 || d2 <= 2) + return; v1.normalize(); v2.normalize(); float cos01 = Math.abs(_v00.dot(v1)); float cos02 = Math.abs(_v00.dot(v2)); float cos12 = v1.dot(v2); - if (d1 < 2 || d2 < 2 || Math.abs(cos12) > 0.90) { - if (d1 >= 2 && d2 >= 2 && cos12 > 0.9) { - // two co-aligned motions - _myType = ActionManagerMT.MULTI_POINT_DRAG_GESTURE; - } else if (d1 < 2 && cos02 < 0.80 || d2 < 2 && cos01 < 0.80 || cos01 < 0.80 - && cos02 < 0.80) { - // two oppositely directed but offset motions - _myType = ActionManagerMT.ROTATE_GESTURE; - } else if (d1 < 2 && cos02 > 0.9 || d2 < 2 && cos01 > 0.9 || cos01 > 0.9 - && cos02 > 0.9) { - // to classic zoom motions - _myType = ActionManagerMT.ZOOM_GESTURE; - } + System.out.println("2pg cos12=" + cos12); + if (cos12 > 0.9) { + // two co-aligned motions + _myType = ActionManagerMT.MULTI_POINT_DRAG_GESTURE; + } else if (cos12 < -0.8) { + // to classic zoom motions + _myType = ActionManagerMT.ZOOM_GESTURE; } //if (Logger.debugging) Logger.info("TwoPointGesture type=" + _myType + " _v00=" + _v00 @@ -264,6 +292,7 @@ if (Math.abs(d1 - _distance0) < 2) return false; _scale = (d1 < _distance0 ? -1 : 1); + _distance0 = d1; float w1 = d2 / (d1 + d2); float w2 = 1 - w1; _offsetCentroid = new Location(loc10.getX() * w1 + loc20.getX() * w2, Modified: trunk/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -727,7 +727,9 @@ } if (isBound(action, ACTION_rotate)) { - viewer.rotateXYBy(deltaX, deltaY); + float degX = ((float) deltaX) / viewer.getScreenWidth() * 180; + float degY = ((float) deltaY) / viewer.getScreenHeight() * 180; + viewer.rotateXYBy(degX, degY); return; } @@ -738,8 +740,10 @@ } if (viewer.allowRotateSelected() && isBound(action, ACTION_rotateSelected)) { + float degX = ((float) deltaX) / viewer.getScreenWidth() * 180; + float degY = ((float) deltaY) / viewer.getScreenHeight() * 180; checkMotion(Viewer.CURSOR_MOVE); - viewer.rotateMolecule(deltaX, deltaY); + viewer.rotateMolecule(degX, degY); return; } if (drawMode && ( @@ -1388,8 +1392,8 @@ return 0; MotionPoint mp1 = getNode(ptNext - 1 - nPointsPrevious); MotionPoint mp0 = getNode(ptNext - nPoints - nPointsPrevious); - float dx = mp1.x - mp0.x; - float dy = mp1.y - mp0.y; + float dx = ((float) (mp1.x - mp0.x)) / viewer.getScreenWidth() * 180; + float dy = ((float) (mp1.y - mp0.y)) / viewer.getScreenHeight() * 180; float speed = (float) Math.sqrt(dx * dx + dy * dy) / (mp1.time - mp0.time); return speed; } Modified: trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -92,6 +92,7 @@ super.setBinding(newBinding); binding.unbindMouseAction(Binding.RIGHT); if (simulator != null && binding != null) { + binding.unbindJmolAction(ACTION_center); binding.unbind(Binding.CTRL + Binding.LEFT + Binding.SINGLE_CLICK, null); binding.bind(Binding.CTRL + Binding.LEFT + Binding.SINGLE_CLICK, ACTION_multiTouchSimulation); } @@ -232,19 +233,19 @@ break; case CLICK: // always follows DEATH when found - mouseClicked(time, (int) pt.x, (int) pt.y, Binding.LEFT, 1); + super.mouseClicked(time, (int) pt.x, (int) pt.y, Binding.LEFT, 1); } break; case ZOOM_EVENT: float scale = pt.z; if (scale == -1 || scale == 1) { pt.z = Float.NaN; - zoomByFactor((int)scale, (int) pt.x, (int) pt.y); + zoomByFactor((int)scale, Integer.MAX_VALUE, Integer.MAX_VALUE);//(int) pt.x, (int) pt.y); } break; case ROTATE_EVENT: checkMotion(Viewer.CURSOR_MOVE); - viewer.rotateZBy((int) pt.z, (int) pt.x, (int) pt.y); + viewer.rotateZBy((int) pt.z, Integer.MAX_VALUE, Integer.MAX_VALUE);//(int) pt.x, (int) pt.y); break; case DRAG_EVENT: if (iData == 2) { @@ -277,6 +278,8 @@ } void mouseClicked(long time, int x, int y, int mods, int count) { + if (haveMultiTouchInput) + return; super.mouseClicked(time, x, y, mods, count); } Modified: trunk/Jmol/src/org/jmol/viewer/TransformManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -334,7 +334,7 @@ rotateAboutPointsInternal(pt2, pt1, 10 * speed, Float.NaN, false, true, null, true); } - void rotateXYBy(int xDelta, int yDelta, BitSet bsAtoms) { + void rotateXYBy(float xDelta, float yDelta, BitSet bsAtoms) { // from mouse action rotateXRadians(yDelta * JmolConstants.radiansPerDegree, bsAtoms); rotateYRadians(xDelta * JmolConstants.radiansPerDegree, bsAtoms); Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2009-12-09 19:24:34 UTC (rev 11886) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2009-12-10 16:47:04 UTC (rev 11887) @@ -68,9 +68,12 @@ import java.awt.Image; import java.awt.Dimension; import java.awt.MediaTracker; +import java.awt.Point; import java.awt.Rectangle; import java.awt.Component; import java.awt.Event; +import java.awt.Toolkit; +import java.awt.image.MemoryImageSource; import java.util.Hashtable; import java.util.BitSet; import java.util.Properties; @@ -236,7 +239,8 @@ private boolean jvm11orGreater = false; private boolean jvm12orGreater = false; private boolean jvm14orGreater = false; - + private boolean multiTouch = false; + private Viewer(Component display, JmolAdapter modelAdapter, String commandOptions) { // use allocateViewer if (Logger.debugging) { @@ -253,7 +257,7 @@ && strJavaVersion.compareTo("1.1.5") <= 0 && "Mac OS".equals(strOSName))); jvm12orGreater = (strJavaVersion.compareTo("1.2") >= 0); jvm14orGreater = (strJavaVersion.compareTo("1.4") >= 0); - boolean multiTouch = (commandOptions != null && commandOptions.contains("-multitouch")); + multiTouch = (commandOptions != null && commandOptions.contains("-multitouch")); stateManager = new StateManager(this); g3d = new Graphics3D(display); colorManager = new ColorManager(this, g3d); @@ -262,10 +266,18 @@ transformManager = new TransformManager11(this); selectionManager = new SelectionManager(this); if (display != null) { - if (multiTouch) + if (multiTouch) { + int[] pixels = new int[1]; + Image image = Toolkit.getDefaultToolkit().createImage( + new MemoryImageSource(1, 1, pixels, 0, 1)); + Cursor transparentCursor = + Toolkit.getDefaultToolkit().createCustomCursor + (image, new Point(0, 0), "invisibleCursor"); + display.setCursor(transparentCursor); actionManager = new ActionManagerMT(this, commandOptions); - else + } else { actionManager = new ActionManager(this); + } if (jvm14orGreater) mouseManager = new MouseManager14(display, this, actionManager); else if (jvm11orGreater) @@ -881,7 +893,7 @@ + (x == Integer.MAX_VALUE ? "" : " " + x + " " + y)); } - void rotateXYBy(int xDelta, int yDelta) { + void rotateXYBy(float xDelta, float yDelta) { // mouseSinglePressDrag if (mouseEnabled) transformManager.rotateXYBy(xDelta, yDelta, null); @@ -906,7 +918,7 @@ + (x == Integer.MAX_VALUE ? "" : " " + x + " " + y): ""); } - void rotateMolecule(int deltaX, int deltaY) { + void rotateMolecule(float deltaX, float deltaY) { if (isJmolDataFrame()) return; if (mouseEnabled) { @@ -4167,7 +4179,7 @@ private int currentCursor = CURSOR_DEFAULT; public void setCursor(int cursor) { - if (currentCursor == cursor || display == null) + if (multiTouch || currentCursor == cursor || display == null) return; int c; switch (currentCursor = cursor) { @@ -7607,11 +7619,11 @@ break; case 4: if (key.equals("rotateXYBy")) - rotateXYBy(Parser.parseInt(tokens[2]), Parser.parseInt(tokens[3])); + rotateXYBy(Parser.parseFloat(tokens[2]), Parser.parseFloat(tokens[3])); else if (key.equals("translateXYBy")) translateXYBy(Parser.parseInt(tokens[2]), Parser.parseInt(tokens[3])); else if (key.equals("rotateMolecule")) - rotateMolecule(Parser.parseInt(tokens[2]), Parser.parseInt(tokens[3])); + rotateMolecule(Parser.parseFloat(tokens[2]), Parser.parseFloat(tokens[3])); break; case 5: if (key.equals("spinXYBy")) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-12-14 04:06:51
|
Revision: 11896 http://jmol.svn.sourceforge.net/jmol/?rev=11896&view=rev Author: hansonr Date: 2009-12-14 04:06:43 +0000 (Mon, 14 Dec 2009) Log Message: ----------- version=11.9.11_dev # new feature: -Msparshui, -Msparshui-simulated for application # multiTouchSparshUI=true or multiTouchSparshUI-simulated=true for applet # requires prior starting of JmolMultiTouchDriver.exe, currently set up # only for HP TouchSmart computer. # Uses a modified SparshUI interface over port 5946 (client) and 5947 (device). # Multi-touch gestures include a two-finger drag to translate and a two-finger # spread/pinch to zoom in/out. # In addition, a one-finger flick starts spinning. Modified Paths: -------------- trunk/Jmol/src/com/sparshui/server/GestureServer.java trunk/Jmol/src/com/sparshui/server/Group.java trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java trunk/Jmol/src/org/jmol/viewer/ActionManager.java trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Added Paths: ----------- trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java Removed Paths: ------------- trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java Modified: trunk/Jmol/src/com/sparshui/server/GestureServer.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureServer.java 2009-12-13 20:56:40 UTC (rev 11895) +++ trunk/Jmol/src/com/sparshui/server/GestureServer.java 2009-12-14 04:06:43 UTC (rev 11896) @@ -38,7 +38,12 @@ public GestureServer() { // for reflection + Logger.info(this + " constructed"); } + + public void finalize() { + Logger.debug(this + " finalized"); + } public GestureServer(int port, GestureServer main) { this.port = port; Modified: trunk/Jmol/src/com/sparshui/server/Group.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/Group.java 2009-12-13 20:56:40 UTC (rev 11895) +++ trunk/Jmol/src/com/sparshui/server/Group.java 2009-12-14 04:06:43 UTC (rev 11896) @@ -70,11 +70,13 @@ if (state == TouchState.BIRTH) _touchPoints.add(changedPoint); + /* System.out.print("Group _touchPoints "); for (int i = 0; i < _touchPoints.size(); i++) { System.out.print(" / " + i + ": " + (TouchPoint) _touchPoints.get(i)); } System.out.println(); + */ Vector clonedPoints = null; /* @@ -94,6 +96,7 @@ // System.out.println("Got some events - size: " + events.size()); } + // moved to after processing. if (state == TouchState.DEATH) _touchPoints.remove(changedPoint); Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2009-12-13 20:56:40 UTC (rev 11895) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2009-12-14 04:06:43 UTC (rev 11896) @@ -237,7 +237,7 @@ options += "-threaded"; if (isSigned && getBooleanValue("multiTouchSparshUI-simulated", false)) options += "-multitouch-sparshui-simulated"; - else if (isSigned && getBooleanValue("multiTouchSparshUI", false)) + else if (isSigned && getBooleanValue("multiTouchSparshUI", false)) // true for testing JmolAppletSignedMT.jar options += "-multitouch-sparshui"; String s = getValue("MaximumSize", null); if (s != null) Modified: trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java 2009-12-13 20:56:40 UTC (rev 11895) +++ trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java 2009-12-14 04:06:43 UTC (rev 11896) @@ -41,6 +41,7 @@ native void nativeMethod(); // should report "In C\nIn Java\n" public void dispose() { + //TODO } public void setMultiTouchClient(Viewer viewer, JmolMultiTouchClient client, @@ -48,6 +49,7 @@ try { // in principle, we could set up our own device driver here // and probably talk to it using ports. SparshUI is easier. + //TODO nativeMethod(); } catch (Exception e) { System.out.println("JmolJniClientAdapter error -- nativeMethod"); @@ -55,7 +57,8 @@ } public void callback() { - // from nativeMethod + // from nativeMethod -- test of callback to Java from C++ + //TODO System.out.println("In Java"); } Copied: trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java (from rev 11895, trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java) =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java (rev 0) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java 2009-12-14 04:06:43 UTC (rev 11896) @@ -0,0 +1,125 @@ +package org.jmol.multitouch.sparshui; + +import java.util.Vector; + +import org.jmol.util.Logger; + +import com.sparshui.common.TouchState; +import com.sparshui.common.messages.events.TouchEvent; +import com.sparshui.gestures.Gesture; +import com.sparshui.gestures.GestureType; +import com.sparshui.server.TouchPoint; + +/** + * SINGLE_POINT_GESTURE + * + * only passes single-touch gestures. + * allows detection of click and double-click + * + * + */ +public class SinglePointGesture implements Gesture { + + private static final long MAXIMUM_CLICK_TIME = 200; + private int _nCurrent, _nMoves, _myId; + private TouchPoint _birth; + + // @override + public String getName() { + return "SinglePointGesture"; + } + + // @override + public int getGestureType() { + return GestureType.TOUCH_GESTURE; + } + + /** + * + * incorporates double-click gesture + * + * @param touchPoints + * @param changedTouchPoint + * @return Vector of Events + * + */ + // @override + public Vector processChange(Vector touchPoints, TouchPoint changedTouchPoint) { + Vector retEvents = new Vector(); + int nPoints = touchPoints.size(); + if (Logger.debugging) { + Logger.info("\nSinglePointGesture " + _myId + " nPoints: " + nPoints); + } + // idea here is to prevent single-touch action during/after a multi-touch action. + // most multi-touch operations, though, start with a single-touch action. So + // what we do is to clear that initial action if two fingers are down. + if (nPoints > 1) { + if (_myId != Integer.MAX_VALUE) { + _myId = Integer.MAX_VALUE; + _nMoves = 1000; + _nCurrent = 0; + // indicate to clear all single-point mouse activity + retEvents.add(new TouchEvent()); + } + return retEvents; + } + int id = changedTouchPoint.getID(); + if (Logger.debugging) + Logger.info("\nSinglePointGesture id=" + id + " state=" + + changedTouchPoint.getState() + " ncurrent=" + _nCurrent + + " nMoves=" + _nMoves); + switch (changedTouchPoint.getState()) { + case TouchState.BIRTH: + _myId = id; + _birth = new TouchPoint(changedTouchPoint); + _nCurrent = 1; + _nMoves = 0; + break; + case TouchState.MOVE: + if (id != _myId) + return retEvents; + switch (++_nMoves) { + case 2: + if (checkClick(changedTouchPoint, retEvents, false)) + return retEvents; + break; + } + break; + case TouchState.DEATH: + if (id != _myId) + return retEvents; + _nCurrent = 0; + if (_nMoves < 2 && checkClick(changedTouchPoint, retEvents, true)) + return retEvents; + break; + } + retEvents.add(new TouchEvent(changedTouchPoint)); + return retEvents; + } + + private boolean checkClick(TouchPoint tpNew, Vector retEvents, boolean isDeath) { + TouchPoint tp; + long dt = tpNew.getTime() - _birth.getTime(); + boolean isSingleClick = (isDeath && dt < MAXIMUM_CLICK_TIME); + if (dt < 500 && !isSingleClick) + return false; + _nMoves += 2; + // long (1/2 sec) pause and drag == double-click-drag ==> _translate + tp = new TouchPoint(_birth); + tp.setState(TouchState.DEATH); + retEvents.add(new TouchEvent(tp)); + tp.setState(TouchState.CLICK); + retEvents.add(new TouchEvent(tp)); + if (isSingleClick) + return true; + tp.setState(TouchState.BIRTH); + retEvents.add(new TouchEvent(tp)); + if (!isDeath) + return true; + tp.setState(TouchState.DEATH); + retEvents.add(new TouchEvent(tp)); + tp.setState(TouchState.CLICK); + retEvents.add(new TouchEvent(tp)); + return true; + } +} Property changes on: trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java ___________________________________________________________________ Added: svn:mime-type + text/plain Deleted: trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java 2009-12-13 20:56:40 UTC (rev 11895) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/SingleTouchGesture.java 2009-12-14 04:06:43 UTC (rev 11896) @@ -1,124 +0,0 @@ -package org.jmol.multitouch.sparshui; - -import java.util.Vector; - -import org.jmol.util.Logger; - -import com.sparshui.common.TouchState; -import com.sparshui.common.messages.events.TouchEvent; -import com.sparshui.gestures.Gesture; -import com.sparshui.gestures.GestureType; -import com.sparshui.server.TouchPoint; - -/** - * SINGLE_TOUCH_GESTURE - * - * only passes single-touch gestures. - * - * - */ -public class SingleTouchGesture implements Gesture { - - private static final long MAXIMUM_CLICK_TIME = 200; - private int _nCurrent, _nMoves, _myId; - private TouchPoint _birth; - - // @override - public String getName() { - return "SingleTouchGesture"; - } - - // @override - public int getGestureType() { - return GestureType.TOUCH_GESTURE; - } - - /** - * - * incorporates double-click gesture - * - * @param touchPoints - * @param changedTouchPoint - * @return Vector of Events - * - */ - // @override - public Vector processChange(Vector touchPoints, TouchPoint changedTouchPoint) { - Vector retEvents = new Vector(); - int nPoints = touchPoints.size(); - if (Logger.debugging) { - Logger.info("\nSingle " + _myId + " nPoints: " + nPoints); - } - // idea here is to prevent single-touch action during/after a multi-touch action. - // most multi-touch operations, though, start with a single-touch action. So - // what we do is to clear that initial action. - if (nPoints > 1) { - if (_myId != Integer.MAX_VALUE) { - _myId = Integer.MAX_VALUE; - _nMoves = 1000; - _nCurrent = 0; - // indicate to clear all single-point mouse activity - retEvents.add(new TouchEvent()); - } - return retEvents; - } - int id = changedTouchPoint.getID(); - if (Logger.debugging) - Logger.info("\nSingle id=" + id + " state=" - + changedTouchPoint.getState() + " ncurrent=" + _nCurrent - + " nMoves=" + _nMoves); - switch (changedTouchPoint.getState()) { - case TouchState.BIRTH: - _myId = id; - _birth = new TouchPoint(changedTouchPoint); - _nCurrent = 1; - _nMoves = 0; - break; - case TouchState.MOVE: - if (id != _myId) - return retEvents; - switch (++_nMoves) { - case 2: - if (checkClick(changedTouchPoint, retEvents, false)) - return retEvents; - break; - } - break; - case TouchState.DEATH: - if (id != _myId) - return retEvents; - _nCurrent = 0; - if (_nMoves < 2 && checkClick(changedTouchPoint, retEvents, true)) - return retEvents; - break; - } - retEvents.add(new TouchEvent(changedTouchPoint)); - return retEvents; - } - - private boolean checkClick(TouchPoint tpNew, Vector retEvents, boolean isDeath) { - TouchPoint tp; - long dt = tpNew.getTime() - _birth.getTime(); - boolean isSingleClick = (isDeath && dt < MAXIMUM_CLICK_TIME); - if (dt < 500 && !isSingleClick) - return false; - _nMoves += 2; - // long (1/2 sec) pause and drag == double-click-drag ==> _translate - tp = new TouchPoint(_birth); - tp.setState(TouchState.DEATH); - retEvents.add(new TouchEvent(tp)); - tp.setState(TouchState.CLICK); - retEvents.add(new TouchEvent(tp)); - if (isSingleClick) - return true; - tp.setState(TouchState.BIRTH); - retEvents.add(new TouchEvent(tp)); - if (!isDeath) - return true; - tp.setState(TouchState.DEATH); - retEvents.add(new TouchEvent(tp)); - tp.setState(TouchState.CLICK); - retEvents.add(new TouchEvent(tp)); - return true; - } -} Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java 2009-12-13 20:56:40 UTC (rev 11895) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java 2009-12-14 04:06:43 UTC (rev 11896) @@ -26,28 +26,28 @@ * about the ID of the incoming points from the input device but instead * operating from position on the screen. * + * v00 from pt(1,0) to pt(2,0) + * * ZOOM IN: <---- x -----> (at any angle) * ZOOM OUT: ----> x <----- (at any angle) * * ROTATE CW: ^ | - * | x | (at any angle) + * | x | (at any angle, not implemented) * | V * * ROTATE CCW: | ^ - * | x | (at any angle) + * | x | (at any angle, not implemented) * V | * * 2-point drag: * * ---------> - * x (Jmol will recognize horizontal as "next frame") + * x (any direction) * ---------> * - * It should work with any simple two-point touchpad. + * Bob Hanson 12/13/2009 * - * Bob Hanson 11/29/2009 * - * */ public class TwoPointGesture implements Gesture /*extends StandardDynamicGesture*/ { Modified: trunk/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2009-12-13 20:56:40 UTC (rev 11895) +++ trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2009-12-14 04:06:43 UTC (rev 11896) @@ -552,7 +552,7 @@ dragged.setCurrent(); setFocus(); int action = Binding.getMouseAction(pressedCount, mods); - Logger.error("ActionManager mousePressed count " + pressedCount + " action " + action); + //Logger.error("ActionManager mousePressed count " + pressedCount + " action " + action); dragGesture.setAction(action, time); if (Binding.getModifiers(action) != 0) { action = viewer.notifyMouseClicked(x, y, action); @@ -593,7 +593,7 @@ dragged.setCurrent(); exitMeasurementMode(); int action = Binding.getMouseAction(pressedCount, mods); - Logger.error("ActionManager mouseDragged count " + pressedCount + " action " + action); + //Logger.error("ActionManager mouseDragged count " + pressedCount + " action " + action); dragGesture.add(action, x, y, time); checkAction(action, x, y, deltaX, deltaY, time, 1); } @@ -605,7 +605,7 @@ viewer.setInMotion(false); viewer.setCursor(Viewer.CURSOR_DEFAULT); int action = Binding.getMouseAction(pressedCount, mods); - Logger.error("ActionManager mouseReleased count " + pressedCount + " action " + action); + //Logger.error("ActionManager mouseReleased count " + pressedCount + " action " + action); dragGesture.add(action, x, y, time); boolean isRbAction = isRubberBandSelect(action); if (isRbAction) { @@ -870,7 +870,7 @@ // points are always picked up first, then atoms // so that atom picking can be superceded by draw picking int action = Binding.getMouseAction(clickedCount, mods); - Logger.error("ActionManager mouseClicked count " + clickedCount + " action " + action); + //Logger.error("ActionManager mouseClicked count " + clickedCount + " action " + action); if (action != 0) { action = viewer.notifyMouseClicked(x, y, action); if (action == 0) Modified: trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2009-12-13 20:56:40 UTC (rev 11895) +++ trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2009-12-14 04:06:43 UTC (rev 11896) @@ -129,8 +129,8 @@ // adaptation to allow user-defined gesture types - public final static String TWO_POINT_GESTURE = "org.jmol.multitouch.sparshui.TwoPointGesture"; - public final static String SINGLE_TOUCH_GESTURE = "org.jmol.multitouch.sparshui.SingleTouchGesture"; + private final static String TWO_POINT_GESTURE = "org.jmol.multitouch.sparshui.TwoPointGesture"; + private final static String SINGLE_POINT_GESTURE = "org.jmol.multitouch.sparshui.SinglePointGesture"; //these must match those in com.sparshui.common.messages.events.EventType // reproduced here so there are no references to that code in applet module @@ -178,7 +178,7 @@ //list.add(new Integer(DBLCLK_GESTURE)); list.add(TWO_POINT_GESTURE); if (simulator == null) - list.add(SINGLE_TOUCH_GESTURE); + list.add(SINGLE_POINT_GESTURE); //list.add(new Integer(ZOOM_GESTURE)); //list.add(new Integer(FLICK_GESTURE)); //list.add(new Integer(RELATIVE_DRAG_GESTURE)); @@ -237,13 +237,14 @@ case CLICK: // always follows DEATH when found super.mouseClicked(time, (int) pt.x, (int) pt.y, Binding.LEFT, 1); + break; } break; case ZOOM_EVENT: float scale = pt.z; if (scale == -1 || scale == 1) { pt.z = Float.NaN; - zoomByFactor((int)scale, Integer.MAX_VALUE, Integer.MAX_VALUE);//(int) pt.x, (int) pt.y); + zoomByFactor((int)scale, Integer.MAX_VALUE, Integer.MAX_VALUE);//(int) pt.x, (int) pt.y); } break; case ROTATE_EVENT: Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-12-13 20:56:40 UTC (rev 11895) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-12-14 04:06:43 UTC (rev 11896) @@ -3,6 +3,15 @@ version=11.9.11_dev +# new feature: -Msparshui, -Msparshui-simulated for application +# multiTouchSparshUI=true or multiTouchSparshUI-simulated=true for applet +# requires prior starting of JmolMultiTouchDriver.exe, currently set up +# only for HP TouchSmart computer. +# Uses a modified SparshUI interface over port 5946 (client) and 5947 (device). +# Multi-touch gestures include a two-finger drag to translate and a two-finger +# spread/pinch to zoom in/out. +# In addition, a one-finger flick starts spinning. +# # bug fix: compiler can crash on incomplete statements # bug fix: FILTER "biomolecule ..." option broken in LOAD command. # code: Jmol/SparshUI multitouch refinements This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-01-27 02:07:59
|
Revision: 12239 http://jmol.svn.sourceforge.net/jmol/?rev=12239&view=rev Author: hansonr Date: 2010-01-27 02:07:49 +0000 (Wed, 27 Jan 2010) Log Message: ----------- version=11.9.23_dev # new feature: PDB trajectory for concatenated PDB files (no "MODEL" line) # bug fix: pdb reader trajectory error # bug fix: multitouch applet activation via display.hasFocus() # working properly except you can't just jump from one # page to another if applets are producing the SparshUI server Modified Paths: -------------- trunk/Jmol/src/com/sparshui/server/GestureServer.java trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/com/sparshui/server/GestureServer.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureServer.java 2010-01-27 02:02:12 UTC (rev 12238) +++ trunk/Jmol/src/com/sparshui/server/GestureServer.java 2010-01-27 02:07:49 UTC (rev 12239) @@ -156,8 +156,10 @@ return; int type = socket.getInputStream().read(); if (type == ConnectionType.CLIENT) { + Logger.info("[GestureServer] client connection established on port " + port); acceptClientConnection(socket); } else if (type == ConnectionType.INPUT_DEVICE) { + Logger.info("[GestureServer] device connection established on port " + port); acceptInputDeviceConnection(socket); } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java 2010-01-27 02:02:12 UTC (rev 12238) +++ trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java 2010-01-27 02:07:49 UTC (rev 12239) @@ -71,6 +71,7 @@ private int[] chainAtomCounts; private int nUNK; private int nRes; + private boolean isMultiModel; // MODEL ... final private static String lineOptions = "ATOM " + //0 @@ -103,8 +104,8 @@ htFormul.clear(); currentGroup3 = null; boolean iHaveModel = false; - boolean iHaveModelStatement = false; boolean iHaveLine = false; + int serial = 0; StringBuffer pdbHeader = (getHeader ? new StringBuffer() : null); try { while (iHaveLine || readLine() != null) { @@ -113,17 +114,21 @@ .indexOf(line.substring(0, 6))) >> 3; boolean isAtom = (ptOption == 0 || ptOption == 1); boolean isModel = (ptOption == 2); + if (isAtom) + serial = parseInt(line, 6, 11); + boolean isNewModel = (isTrajectory && !isMultiModel && isAtom && serial == 1); if (getHeader) { if (isAtom || isModel) getHeader = false; else pdbHeader.append(line).append('\n'); } - if (isModel) { + if (isModel || isNewModel) { + isMultiModel = isModel; getHeader = false; - iHaveModelStatement = true; // PDB is different -- targets actual model number - int modelNo = getModelNumber(); + int modelNo = (isNewModel ? modelNumber + 1: getModelNumber()); + System.out.println(modelNo); modelNumber = (bsModels == null ? modelNo : modelNumber + 1); if (!doGetModel(modelNumber)) { if (isLastModel(modelNumber) && iHaveModel) @@ -133,7 +138,8 @@ } iHaveModel = true; atomSetCollection.connectAll(maxSerial); - applySymmetryAndSetTrajectory(); + if (atomCount > 0) + applySymmetryAndSetTrajectory(); //supposedly MODEL is only for NMR model(modelNo); continue; @@ -146,11 +152,11 @@ * supports this. So you can't concatinate PDB files the way * you can CIF files. --Bob Hanson 8/30/06 */ - if (iHaveModelStatement && !iHaveModel) + if (isMultiModel && !iHaveModel) continue; if (isAtom) { getHeader = false; - atom(); + atom(serial); continue; } switch (ptOption) { @@ -459,14 +465,12 @@ private String lastAtomData; private int lastAtomIndex; - private void atom() { - boolean isHetero = line.startsWith("HETATM"); - char charAlternateLocation = line.charAt(16); - + private void atom(int serial) { // get the group so that we can check the formul - int serial = parseInt(line, 6, 11); if (serial > maxSerial) maxSerial = serial; + boolean isHetero = line.startsWith("HETATM"); + char charAlternateLocation = line.charAt(16); char chainID = line.charAt(21); if (chainAtomCounts != null) chainAtomCounts[chainID]++; Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2010-01-27 02:02:12 UTC (rev 12238) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2010-01-27 02:07:49 UTC (rev 12239) @@ -280,6 +280,7 @@ // we look to see if it was loaded using LOAD ... "..." COORD .... int ptFile = (htParams.containsKey("ptFile") ? ((Integer) htParams .get("ptFile")).intValue() : -1); + isTrajectory = htParams.containsKey("isTrajectory"); if (ptFile > 0 && htParams.containsKey("firstLastSteps")) { Object val = ((Vector) htParams.get("firstLastSteps")) .elementAt(ptFile - 1); @@ -291,7 +292,6 @@ templateAtomCount = ((Integer) htParams.get("templateAtomCount")) .intValue(); } else if (htParams.containsKey("firstLastStep")) { - isTrajectory = htParams.containsKey("isTrajectory"); firstLastStep = (int[]) htParams.get("firstLastStep"); } else if (htParams.containsKey("bsModels")) { isTrajectory = htParams.containsKey("isTrajectory"); Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2010-01-27 02:02:12 UTC (rev 12238) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2010-01-27 02:07:49 UTC (rev 12239) @@ -76,7 +76,12 @@ // methods Jmol needs -- from viewer.ActionManagerMT + boolean doneHere; + public void dispose() { + + System.out.println("JmolSparshClientAdapter -- dispose"); + doneHere = true; try { if (serverConnection != null) { serverConnection.close(); @@ -177,6 +182,7 @@ int errorType = groupID; switch (errorType) { case ActionManagerMT.SERVICE_LOST: + System.out.println("JmolSparshAdapter service lost event...disposing "); dispose(); break; case ActionManagerMT.DRIVER_NONE: Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-01-27 02:02:12 UTC (rev 12238) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-01-27 02:07:49 UTC (rev 12239) @@ -11048,7 +11048,7 @@ if (tok == Token.image) { pt++; } else if (tok == Token.frame) { - if (args[++pt].tok == Token.expressionBegin + if (pt + 1 < argCount && args[++pt].tok == Token.expressionBegin || args[pt].tok == Token.bitset) { bsFrames = expression(args, pt, 0, true, false, true, true); pt = iToken + 1; Modified: trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2010-01-27 02:02:12 UTC (rev 12238) +++ trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2010-01-27 02:07:49 UTC (rev 12239) @@ -105,8 +105,12 @@ super.clear(); } + boolean doneHere; + void dispose() { + System.out.println("ActionManagerMT -- dispose"); // per applet/application instance + doneHere = true; adapter.dispose(); if (simulator != null) simulator.dispose(); @@ -186,7 +190,8 @@ } public int getGroupID(int x, int y) { - int gid = (!viewer.isApplet() && !viewer.getDisplay().hasFocus() + System.out.println("ActionManagerMT" + this + " hasfocus? " + viewer.getDisplay().hasFocus() ); + int gid = (!viewer.getDisplay().hasFocus() || x < 0 || y < 0 || x >= viewer.getScreenWidth() || y >= viewer.getScreenHeight() ? 0 : groupID); if (resetNeeded) { @@ -210,7 +215,8 @@ Logger.error("SparshUI reports no driver present"); break; case SERVICE_LOST: - startSparshUIService(simulator != null); + if (!doneHere) + startSparshUIService(simulator != null); break; case TOUCH_EVENT: haveMultiTouchInput = true; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-01-27 02:02:12 UTC (rev 12238) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-01-27 02:07:49 UTC (rev 12239) @@ -3,6 +3,12 @@ version=11.9.23_dev +# new feature: PDB trajectory for concatenated PDB files (no "MODEL" line) +# bug fix: pdb reader trajectory error +# bug fix: multitouch applet activation via display.hasFocus() +# working properly except you can't just jump from one +# page to another if applets are producing the SparshUI server + # -------------------------------------------------------------- #version=11.9.22 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-02-10 13:13:31
|
Revision: 12362 http://jmol.svn.sourceforge.net/jmol/?rev=12362&view=rev Author: hansonr Date: 2010-02-10 13:13:23 +0000 (Wed, 10 Feb 2010) Log Message: ----------- version=11.9.27_dev # bug fix: isosurface cavity broken # new feature: frank may be turned off by local signed applet # new feature: _multiTouchServer and _multiTouchClient flags Modified Paths: -------------- trunk/Jmol/src/com/sparshui/server/GestureServer.java trunk/Jmol/src/org/jmol/api/JmolGestureServerInterface.java trunk/Jmol/src/org/jmol/api/JmolMultiTouchAdapter.java trunk/Jmol/src/org/jmol/export/_PovrayExporter.java trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClientAdapter.java trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java trunk/Jmol/src/org/jmol/util/FastBitSet.java trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Removed Paths: ------------- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/PovraySaver.java Modified: trunk/Jmol/src/com/sparshui/server/GestureServer.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureServer.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/com/sparshui/server/GestureServer.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -117,9 +117,11 @@ else _mySocket = main._deviceSocket = new ServerSocket(port); Logger.info("[GestureServer] Socket Open: " + port); + myState = JmolGestureServerInterface.OK; } catch (IOException e) { Logger.error("[GestureServer] Failed to open a server socket."); e.printStackTrace(); + myState = 0; } } @@ -175,6 +177,8 @@ main._clients.add(cc); if (main.ic == null) { cc.processError(EventType.DRIVER_NONE); + } else { + myState |= JmolGestureServerInterface.HAS_CLIENT; } } @@ -186,6 +190,7 @@ private void acceptInputDeviceConnection(Socket socket) throws IOException { Logger.info("[GestureServer] Input device connection accepted"); main.ic = new InputDeviceConnection(this, socket); + myState |= JmolGestureServerInterface.HAS_DRIVER; } /** @@ -197,6 +202,7 @@ Logger .error("[GestureServer] sending clients message that input device was lost."); main.ic = null; + myState &= ~JmolGestureServerInterface.HAS_DRIVER; processBirth(null); } @@ -273,4 +279,9 @@ return isClaimed; } + private int myState; + public int getState() { + return myState; + } + } Modified: trunk/Jmol/src/org/jmol/api/JmolGestureServerInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolGestureServerInterface.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/jmol/api/JmolGestureServerInterface.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -1,7 +1,10 @@ package org.jmol.api; public interface JmolGestureServerInterface { - + public final static int OK = 1; + public final static int HAS_CLIENT = 2; + public final static int HAS_DRIVER = 4; public abstract void startGestureServer(); public abstract void dispose(); + public abstract int getState(); } Modified: trunk/Jmol/src/org/jmol/api/JmolMultiTouchAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolMultiTouchAdapter.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/jmol/api/JmolMultiTouchAdapter.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -33,6 +33,7 @@ * */ public void dispose(); - public void setMultiTouchClient(Viewer viewer, JmolMultiTouchClient client, boolean isSimulation); + public boolean setMultiTouchClient(Viewer viewer, JmolMultiTouchClient client, boolean isSimulation); public void mouseMoved(int x, int y); + public boolean isServer(); } Modified: trunk/Jmol/src/org/jmol/export/_PovrayExporter.java =================================================================== --- trunk/Jmol/src/org/jmol/export/_PovrayExporter.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/jmol/export/_PovrayExporter.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -57,7 +57,11 @@ output("//\n"); output("// This script was generated on " + getExportDate() + "\n"); output("// ******************************************************\n"); + try { output(viewer.getWrappedState(true)); + } catch (Exception e) { + // tough luck + } output("\n"); output("// ******************************************************\n"); output("// Declare the resolution, camera, and light sources.\n"); Modified: trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClientAdapter.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClientAdapter.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -40,15 +40,21 @@ protected JmolMultiTouchClient actionManager; protected Component display; + protected boolean isServer; + public boolean isServer() { + return isServer; + } + // methods Jmol needs -- from viewer.ActionManagerMT public abstract void dispose(); - public void setMultiTouchClient(Viewer viewer, JmolMultiTouchClient client, + public boolean setMultiTouchClient(Viewer viewer, JmolMultiTouchClient client, boolean isSimulation) { this.display = viewer.getDisplay(); actionManager = client; // ActionManagerMT + return true; } private static int screenWidth, screenHeight; Modified: trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -33,6 +33,7 @@ // not implemented. A stub only for a potential Java Native Interface. // not currently in applet.classes + // would need to set isServer flag static { System.loadLibrary("JmolMultiTouchJNI"); @@ -44,16 +45,18 @@ //TODO } - public void setMultiTouchClient(Viewer viewer, JmolMultiTouchClient client, + public boolean setMultiTouchClient(Viewer viewer, JmolMultiTouchClient client, boolean isSimulation) { try { // in principle, we could set up our own device driver here // and probably talk to it using ports. SparshUI is easier. //TODO nativeMethod(); + return true; } catch (Exception e) { System.out.println("JmolJniClientAdapter error -- nativeMethod"); } + return false; } public void callback() { Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -23,7 +23,7 @@ */ package org.jmol.multitouch.sparshui; -import java.io.File; +//import java.io.File; import java.io.IOException; import java.net.UnknownHostException; import java.util.List; @@ -100,13 +100,21 @@ } private JmolGestureServerInterface gestureServer; - public void setMultiTouchClient(Viewer viewer, JmolMultiTouchClient client, + public boolean setMultiTouchClient(Viewer viewer, JmolMultiTouchClient client, boolean isSimulation) { super.setMultiTouchClient(viewer, client, isSimulation); String err; gestureServer = (JmolGestureServerInterface) Interface .getInterface("com.sparshui.server.GestureServer"); gestureServer.startGestureServer(); + try { + Thread.sleep(1000); + } catch (InterruptedException e1) { + // ignore + } + isServer = ((gestureServer.getState() & JmolGestureServerInterface.OK) != 0); + + /* if (true || isSimulation) { Logger.info("JmolSparshClientAdapter skipping driver startup"); } else { @@ -126,11 +134,12 @@ System.out.println(e.getMessage()); } } +*/ int port = NetworkConfiguration.CLIENT_PORT; try { serverConnection = new ClientServerConnection("127.0.0.1", this); Logger.info("SparshUI connection established at 127.0.0.1 port " + port); - return; + return true; } catch (UnknownHostException e) { err = e.getMessage(); } catch (IOException e) { @@ -139,6 +148,7 @@ actionManager = null; Logger.error("Cannot create SparshUI connection at 127.0.0.1 port " + port + ": " + err); + return false; } // methods the Sparsh server needs -- from com.sparshui.client.ClientToServerProtocol Modified: trunk/Jmol/src/org/jmol/util/FastBitSet.java =================================================================== --- trunk/Jmol/src/org/jmol/util/FastBitSet.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/jmol/util/FastBitSet.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -151,7 +151,7 @@ public int length() { int i = bitmapGetMinimumWordCount(bitmap); - return (i << F_ADDRESS_BITS_PER_WORD) - numberOfLeadingZeros(bitmap[i - 1]); + return (i == 0 ? 0 : (i << F_ADDRESS_BITS_PER_WORD) - numberOfLeadingZeros(bitmap[i - 1])); } public int nextSetBit(int fromIndex) { Modified: trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -78,7 +78,9 @@ if (isSimulated) Logger.error("ActionManagerMT -- for now just using touch simulation.\nPress CTRL-LEFT and then draw two traces on the window."); - adapter.setMultiTouchClient(viewer, this, isSimulated); + boolean isClient = adapter.setMultiTouchClient(viewer, this, isSimulated); + boolean isServer = adapter.isServer(); + viewer.setMultiTouch(isServer, isClient); if (isSimulated) { simulator = (JmolTouchSimulatorInterface) Interface .getInterface("com.sparshui.inputdevice.JmolTouchSimulator"); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-02-10 13:13:23 UTC (rev 12362) @@ -3,6 +3,10 @@ version=11.9.27_dev +# new feature: frank may be turned off by local signed applet +# new feature: _multiTouchServer and _multiTouchClient flags +# bug fix: isosurface cavity broken +# code: FastBitSet implemented for isosurface and dots # bug fix: exit command exits Jmol instead of just the script or previous scripts # bug fix: load sometimes not properly accounting for unique axis information # bug fix: web export- dimension spinners now show dimensions of chosen instance Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -381,6 +381,7 @@ private boolean listCommands = false; private boolean useCommandThread = false; private boolean isSignedApplet = false; + private boolean isSignedAppletLocal = false; private boolean isDataOnly = false; private String appletContext; @@ -416,6 +417,8 @@ logFilePath = TextFormat.simpleReplace(logFilePath, "file:/", ""); if (logFilePath.indexOf("//") >= 0) logFilePath = null; + else + isSignedAppletLocal = true; } else { logFilePath = null; } @@ -2802,7 +2805,7 @@ } public String getWrappedState(boolean isImage) { - if (isImage && !global.imageState) + if (isImage && !global.imageState || !global.preserveState) return ""; // we remove local file references in the embedded states for images return JmolConstants.embedScript(FileManager.setScriptFileReferences( @@ -2816,6 +2819,8 @@ public final static String STATE_VERSION_STAMP = "# Jmol state version "; public String getStateInfo(String type) { + if (!global.preserveState) + return ""; boolean isAll = (type == null || type.equalsIgnoreCase("all")); StringBuffer s = new StringBuffer(""); StringBuffer sfunc = (isAll ? new StringBuffer("function _setState() {\n") @@ -6410,7 +6415,7 @@ public boolean getShowFrank() { if (isPreviewOnly || isApplet && creatingImage) return false; - return (isSignedApplet || frankOn); + return (isSignedApplet && !isSignedAppletLocal || frankOn); } public boolean isSignedApplet() { @@ -7966,6 +7971,7 @@ * 1) turns UNDO off for the application 2) turns history off 3) prevents * saving of inlinedata for later LOAD "" commands 4) turns off the saving of * changed atom properties 5) does not guarantee accurate state representation + * 6) disallows generation of the state * * It is useful in situations such as web sites where memory is an issue and * there is no need for such. @@ -8047,4 +8053,9 @@ } } + public void setMultiTouch(boolean isServer, boolean isClient) { + global.setParameterValue("_multiTouchServer", isServer); + global.setParameterValue("_multiTouchClient", isClient); + } + } Deleted: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/PovraySaver.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/PovraySaver.java 2010-02-10 06:21:51 UTC (rev 12361) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/PovraySaver.java 2010-02-10 13:13:23 UTC (rev 12362) @@ -1,824 +0,0 @@ -/* $RCSfile$ - * $Author$ - * $Date$ - * $Revision$ - * - * Copyright (C) 2002-2005 The Jmol Development Team - * - * Contact: jmo...@li... - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ -package org.openscience.jmol.app.jmolpanel; -/* -import org.jmol.api.*; -import org.jmol.util.Logger; -import org.jmol.viewer.JmolConstants; - -import java.util.Date; -import java.awt.Color; -import java.text.SimpleDateFormat; -import java.io.OutputStreamWriter; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.OutputStream; - -import javax.vecmath.Point3d; -import javax.vecmath.Point3f; -import javax.vecmath.Matrix4f; -*/ -public class PovraySaver { - - // superceded by org.jmol.export._PovrayExporter - - /* - BufferedWriter bw; - JmolViewer viewer; - boolean allModels; - int screenWidth; - int screenHeight; - - Matrix4f transformMatrix; - - public PovraySaver( - JmolViewer viewer, OutputStream out, - boolean allModels, int width, int height) { - this.bw = new BufferedWriter(new OutputStreamWriter(out), 8192); - this.viewer = viewer; - this.allModels = allModels || (viewer.getDisplayModelIndex() == -1); - this.screenWidth = width; - this.screenHeight = height; - } - - void out(String str) throws IOException { - bw.write(str); - } - - public void writeFrame() throws IOException { - float zoom = viewer.getRotationRadius() * 2; - zoom *= 1.1f; // for some reason I need a little more margin - zoom /= viewer.getZoomPercentFloat() / 100f; - - transformMatrix = viewer.getUnscaledTransformMatrix(); - if ((screenWidth <= 0) || (screenHeight <= 0)) { - screenWidth = viewer.getScreenWidth(); - screenHeight = viewer.getScreenHeight(); - } - int minScreenDimension = - screenWidth < screenHeight ? screenWidth : screenHeight; - - Date now = new Date(); - SimpleDateFormat sdf = - new SimpleDateFormat("EEE, MMMM dd, yyyy 'at' h:mm aaa"); - - String now_st = sdf.format(now); - - out("//******************************************************\n"); - out("// Jmol generated povray script.\n"); - out("//\n"); - out("// This script was generated on :\n"); - out("// " + now_st + "\n"); - out("//******************************************************\n"); - out("\n"); - out("\n"); - out("//******************************************************\n"); - out("// Declare the resolution, camera, and light sources.\n"); - out("//******************************************************\n"); - out("\n"); - out("// NOTE: if you plan to render at a different resolution,\n"); - out("// be sure to update the following two lines to maintain\n"); - out("// the correct aspect ratio.\n" + "\n"); - out("#declare Width = "+ screenWidth + ";\n"); - out("#declare Height = "+ screenHeight + ";\n"); - out("#declare minScreenDimension = " + minScreenDimension + ";\n"); - out("#declare Ratio = Width / Height;\n"); - out("#declare zoom = " + zoom + ";\n"); - // out("#declare wireRadius = 1 / minScreenDimension * zoom;\n"); - out("#declare showAtoms = true;\n"); - out("#declare showBonds = true;\n"); - out("#declare showPolymers = false;\n"); - out("camera{\n"); - out(" location < 0, 0, zoom>\n" + "\n"); - out(" // Ratio is negative to switch povray to\n"); - out(" // a right hand coordinate system.\n"); - out("\n"); - out(" right < -Ratio , 0, 0>\n"); - out(" look_at < 0, 0, 0 >\n"); - out("}\n"); - out("\n"); - - out("background { color " + - povrayColor(viewer.getBackgroundArgb()) + " }\n"); - out("\n"); - - out("light_source { < 0, 0, zoom> " + " rgb <1.0,1.0,1.0> }\n"); - out("light_source { < -zoom, zoom, zoom> " - + " rgb <1.0,1.0,1.0> }\n"); - out("\n"); - out("\n"); - - out("//***********************************************\n"); - out("// macros for common shapes\n"); - out("//***********************************************\n"); - out("\n"); - - writeMacros(); - - out("//***********************************************\n"); - out("// List of all of the atoms\n"); - out("//***********************************************\n"); - out("\n"); - - out("#if (showAtoms)\n"); - if (allModels) { - out("#switch (clock)\n"); - for (int m = 0; m < viewer.getModelCount(); m++) { - out("#range (" + (m + 0.9) + "," + (m + 1.1) + ")\n"); - for (int i = 0; i < viewer.getAtomCount(); i++) { - writeAtom(m, i); - } - out("#break\n"); - } - out("#end\n"); - } else { - int modelIndex = viewer.getDisplayModelIndex(); - if (modelIndex < -1) - modelIndex = -2 - modelIndex; - int n = viewer.getAtomCount(); - for (int i = 0; i < n; i++) - writeAtom(modelIndex, i); - } - out("#end\n"); - - out("\n"); - out("//***********************************************\n"); - out("// The list of bonds\n"); - out("//***********************************************\n"); - out("\n"); - - out("#if (showBonds)\n"); - if (allModels) { - out("#switch (clock)\n"); - for (int m = 0; m < viewer.getModelCount(); m++) { - out("#range (" + (m + 0.9) + "," + (m + 1.1) + ")\n"); - for (int i = 0; i < viewer.getBondCount(); i++) { - writeBond(m, i); - } - out("#break\n"); - } - out("#end\n"); - } else { - int modelIndex = viewer.getDisplayModelIndex(); - if (modelIndex < -1) - modelIndex = -2 - modelIndex; - int n = viewer.getBondCount(); - for (int i = 0; i < n; ++i) - writeBond(modelIndex, i); - } - out("#end\n"); - - out("\n"); - out("//***********************************************\n"); - out("// The list of polymers\n"); - out("//***********************************************\n"); - out("\n"); - - out("#if (showPolymers)\n"); - if (allModels) { - out("#switch (clock)\n"); - for (int m = 0; m < viewer.getModelCount(); m++) { - out("#range (" + (m + 0.9) + "," + (m + 1.1) + ")\n"); - for (int i = 0; i < viewer.getPolymerCountInModel(m); i++) { - writePolymer(m, i); - } - out("#break\n"); - } - out("#end\n"); - } else { - int modelIndex = viewer.getDisplayModelIndex(); - if (modelIndex < -1) - modelIndex = -2 - modelIndex; - int n = viewer.getPolymerCountInModel(modelIndex); - for (int i = 0; i < n; i++) { - writePolymer(modelIndex, i); - } - } - out("#end\n"); - } - - public synchronized void writeFile() { - - try { - writeFrame(); - bw.close(); - } catch (IOException e) { - Logger.error("Got IOException trying to write frame.", e); - } - } - - *//** - * Takes a java colour and returns a String representing the - * colour in povray eg 'rgb<1.0,0.0,0.0>' - * - * @param argb The color to convert - * - * @return A string representaion of the color in povray rgb format. - *//* - protected String povrayColor(int argb) { - return "rgb<" + - getRed(argb) + "," + - getGrn(argb) + "," + - getBlu(argb) + ">"; - } - - void writeMacros() throws IOException { - out("#default { finish {\n" + - " ambient .2 diffuse .6 specular 1 roughness .001 metallic}}\n\n"); - writeMacrosAtom(); - //writeMacrosRing(); - //writeMacrosWire(); - //writeMacrosDoubleWire(); - //writeMacrosTripleWire(); - writeMacrosBond(); - writeMacrosDoubleBond(); - writeMacrosTripleBond(); - writeMacrosHydrogenBond(); - writeMacrosAromaticBond(); - } - void writeMacrosAtom() throws IOException { - out("#macro atom(X,Y,Z,RADIUS,R,G,B)\n" + - " sphere{<X,Y,Z>,RADIUS\n" + - " pigment{rgb<R,G,B>}}\n" + - "#end\n\n"); - } - void writeMacrosRing() throws IOException { - out("#macro ring(X,Y,Z,RADIUS,R,G,B)\n" + - " torus{RADIUS,wireRadius pigment{rgb<R,G,B>}" + - " translate<X,Z,-Y> rotate<90,0,0>}\n" + - "#end\n\n"); - } - void writeMacrosBond() throws IOException { - out("#macro bond1(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R,G,B)\n" + - " cylinder{<X1,Y1,Z1>,<X2,Y2,Z2>,RADIUS\n" + - " pigment{rgb<R,G,B>}}\n" + - " sphere{<X1,Y1,Z1>,RADIUS\n" + - " pigment{rgb<R,G,B>}}\n" + - " sphere{<X2,Y2,Z2>,RADIUS\n" + - " pigment{rgb<R,G,B>}}\n" + - "#end\n\n"); - out("#macro bond2(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#local xc = (X1 + X2) / 2;\n" + - "#local yc = (Y1 + Y2) / 2;\n" + - "#local zc = (Z1 + Z2) / 2;\n" + - " cylinder{<X1,Y1,Z1>,<xc,yc,zc>,RADIUS\n" + - " pigment{rgb<R1,G1,B1>}}\n" + - " cylinder{<xc,yc,zc>,<X2,Y2,Z2>,RADIUS\n" + - " pigment{rgb<R2,G2,B2>}}\n" + - " sphere{<X1,Y1,Z1>,RADIUS\n" + - " pigment{rgb<R1,G1,B1>}}\n" + - " sphere{<X2,Y2,Z2>,RADIUS\n" + - " pigment{rgb<R2,G2,B2>}}\n" + - "#end\n\n"); - } - void writeMacrosDoubleBond() throws IOException { - out("#macro dblbond1(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R,G,B)\n" + - "#local dx = X2 - X1;\n" + - "#local dy = Y2 - Y1;\n" + - "#local mag2d = sqrt(dx*dx + dy*dy);\n" + - "#local separation = 3/2 * RADIUS;\n" + - "#if (dx + dy)\n" + - " #local offX = separation * dy / mag2d;\n" + - " #local offY = separation * -dx / mag2d;\n" + - "#else\n" + - " #local offX = 0;\n" + - " #local offY = separation;\n" + - "#end\n" + - "bond1(X1+offX,Y1+offY,Z1,X2+offX,Y2+offY,Z2,RADIUS,R,G,B)\n" + - "bond1(X1-offX,Y1-offY,Z1,X2-offX,Y2-offY,Z2,RADIUS,R,G,B)\n" + - "#end\n\n"); - out("#macro dblbond2(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#local dx = X2 - X1;\n" + - "#local dy = Y2 - Y1;\n" + - "#local mag2d = sqrt(dx*dx + dy*dy);\n" + - "#local separation = 3/2 * RADIUS;\n" + - "#if (dx + dy)\n" + - " #local offX = separation * dy / mag2d;\n" + - " #local offY = separation * -dx / mag2d;\n" + - "#else\n" + - " #local offX = 0;\n" + - " #local offY = separation;\n" + - "#end\n" + - "bond2(X1+offX,Y1+offY,Z1,X2+offX,Y2+offY,Z2,\n"+ - " RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "bond2(X1-offX,Y1-offY,Z1,X2-offX,Y2-offY,Z2,\n"+ - " RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#end\n\n"); - } - void writeMacrosTripleBond() throws IOException { - out("#macro trpbond1(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R,G,B)\n" + - "#local dx = X2 - X1;\n" + - "#local dy = Y2 - Y1;\n" + - "#local mag2d = sqrt(dx*dx + dy*dy);\n" + - "#local separation = 5/2 * RADIUS;\n" + - "#if (dx + dy)\n" + - " #local offX = separation * dy / mag2d;\n" + - " #local offY = separation * -dx / mag2d;\n" + - "#else\n" + - " #local offX = 0;\n" + - " #local offY = separation;\n" + - "#end\n" + - "bond1(X1+offX,Y1+offY,Z1,X2+offX,Y2+offY,Z2,RADIUS,R,G,B)\n" + - "bond1(X1 ,Y1 ,Z1,X2 ,Y2 ,Z2,RADIUS,R,G,B)\n" + - "bond1(X1-offX,Y1-offY,Z1,X2-offX,Y2-offY,Z2,RADIUS,R,G,B)\n" + - "#end\n\n"); - out("#macro trpbond2(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#local dx = X2 - X1;\n" + - "#local dy = Y2 - Y1;\n" + - "#local mag2d = sqrt(dx*dx + dy*dy);\n" + - "#local separation = 5/2 * RADIUS;\n" + - "#if (dx + dy)\n" + - " #local offX = separation * dy / mag2d;\n" + - " #local offY = separation * -dx / mag2d;\n" + - "#else\n" + - " #local offX = 0;\n" + - " #local offY = separation;\n" + - "#end\n" + - "bond2(X1+offX,Y1+offY,Z1,X2+offX,Y2+offY,Z2,\n"+ - " RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "bond2(X1 ,Y1 ,Z1,X2 ,Y2 ,Z2,\n"+ - " RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "bond2(X1-offX,Y1-offY,Z1,X2-offX,Y2-offY,Z2,\n"+ - " RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#end\n\n"); - } - void writeMacrosHydrogenBond() throws IOException { - out("#macro hbond1(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R,G,B)\n" + - "#local dx = (X2 - X1) / 10;\n" + - "#local dy = (Y2 - Y1) / 10;\n" + - "#local dz = (Z2 - Z1) / 10;\n" + - " cylinder{<X1+dx ,Y1+dy ,Z1+dz >,<X1+3*dx,Y1+3*dy,Z1+3*dz>,RADIUS\n" + - " pigment{rgb<R,G,B>}}\n" + - " cylinder{<X1+4*dx,Y1+4*dy,Z1+4*dz>,<X2-4*dx,Y2-4*dy,Z2-4*dz>,RADIUS\n" + - " pigment{rgb<R,G,B>}}\n" + - " cylinder{<X2-3*dx,Y2-3*dy,Z2-3*dz>,<X2-dx ,Y2-dy ,Z2-dz >,RADIUS\n" + - " pigment{rgb<R,G,B>}}\n" + - "#end\n\n"); - out("#macro hbond2(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#local dx = (X2 - X1) / 10;\n" + - "#local dy = (Y2 - Y1) / 10;\n" + - "#local dz = (Z2 - Z1) / 10;\n" + - "#local xc = (X1 + X2) / 2;\n" + - "#local yc = (Y1 + Y2) / 2;\n" + - "#local zc = (Z1 + Z2) / 2;\n" + - " cylinder{<X1+dx ,Y1+dy ,Z1+dz >,<X1+3*dx,Y1+3*dy,Z1+3*dz>,RADIUS\n" + - " pigment{rgb<R1,G1,B1>}}\n" + - " cylinder{<X1+4*dx,Y1+4*dy,Z1+4*dz>,<xc ,yc ,zc >,RADIUS\n" + - " pigment{rgb<R1,G1,B1>}}\n" + - " cylinder{<xc ,yc ,zc >,<X2-4*dx,Y2-4*dy,Z2-4*dz>,RADIUS\n" + - " pigment{rgb<R2,G2,B2>}}\n" + - " cylinder{<X2-3*dx,Y2-3*dy,Z2-3*dz>,<X2-dx ,Y2-dy ,Z2-dz >,RADIUS\n" + - " pigment{rgb<R2,G2,B2>}}\n" + - "#end\n\n"); - } - void writeMacrosAromaticBond() throws IOException { - out("#macro abond1(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R,G,B)\n" + - "#local dx = (X2 - X1) / 12;\n" + - "#local dy = (Y2 - Y1) / 12;\n" + - "#local dz = (Z2 - Z1) / 12;\n" + - "#local mag2d = sqrt(dx*dx + dy*dy);\n" + - "#local separation = 3/2 * RADIUS;\n" + - "#if (dx + dy)\n" + - " #local offX = separation * dy / mag2d;\n" + - " #local offY = separation * -dx / mag2d;\n" + - "#else\n" + - " #local offX = 0;\n" + - " #local offY = separation;\n" + - "#end\n" + - " bond1(X1+offX,Y1+offY,Z1,X2+offX,Y2+offY,Z2,RADIUS,R,G,B)\n" + - " cylinder{<X1-offX+2*dx,Y1-offY+2*dy,Z1+2*dz>,<X1-offX+5*dx,Y1-offY+5*dy,Z1+5*dz>,RADIUS\n" + - " pigment{rgb<R,G,B>}}" + - " cylinder{<X2-offX-2*dx,Y2-offY-2*dy,Z2-2*dz>,<X2-offX-5*dx,Y2-offY-5*dy,Z2-5*dz>,RADIUS\n" + - " pigment{rgb<R,G,B>}}" + - "#end\n\n"); - out("#macro abond2(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#local dx = (X2 - X1) / 12;\n" + - "#local dy = (Y2 - Y1) / 12;\n" + - "#local dz = (Z2 - Z1) / 12;\n" + - "#local mag2d = sqrt(dx*dx + dy*dy);\n" + - "#local separation = 3/2 * RADIUS;\n" + - "#if (dx + dy)\n" + - " #local offX = separation * dy / mag2d;\n" + - " #local offY = separation * -dx / mag2d;\n" + - "#else\n" + - " #local offX = 0;\n" + - " #local offY = separation;\n" + - "#end\n" + - " bond2(X1+offX,Y1+offY,Z1,X2+offX,Y2+offY,Z2,RADIUS,R1,G1,B1,R2,G2,B2)\n" + - " cylinder{<X1-offX+2*dx,Y1-offY+2*dy,Z1+2*dz>,<X1-offX+3.5*dx,Y1-offY+3.5*dy,Z1+3.5*dz>,RADIUS\n" + - " pigment{rgb<R1,G1,B1>}}" + - " cylinder{<X1-offX+5*dx,Y1-offY+5*dy,Z1+5*dz>,<X1-offX+3.5*dx,Y1-offY+3.5*dy,Z1+3.5*dz>,RADIUS\n" + - " pigment{rgb<R2,G2,B2>}}" + - " cylinder{<X2-offX-5*dx,Y2-offY-5*dy,Z2-5*dz>,<X2-offX-3.5*dx,Y2-offY-3.5*dy,Z2-3.5*dz>,RADIUS\n" + - " pigment{rgb<R1,G1,B1>}}" + - " cylinder{<X2-offX-2*dx,Y2-offY-2*dy,Z2-2*dz>,<X2-offX-3.5*dx,Y2-offY-3.5*dy,Z2-3.5*dz>,RADIUS\n" + - " pigment{rgb<R2,G2,B2>}}" + - "#end\n\n"); - } - void writeMacrosWire() throws IOException { - out("#macro wire1(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R,G,B)\n" + - " cylinder{<X1,Y1,Z1>,<X2,Y2,Z2>,wireRadius\n" + - " pigment{rgb<R,G,B>}}\n" + - "#end\n\n"); - out("#macro wire2(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#local xc = (X1 + X2) / 2;\n" + - "#local yc = (Y1 + Y2) / 2;\n" + - "#local zc = (Z1 + Z2) / 2;\n" + - " cylinder{<X1,Y1,Z1>,<xc,yc,zc>,wireRadius\n" + - " pigment{rgb<R1,G1,B1>}}\n" + - " cylinder{<xc,yc,zc>,<X2,Y2,Z2>,wireRadius\n" + - " pigment{rgb<R2,G2,B2>}}\n" + - "#end\n\n"); - } - void writeMacrosDoubleWire() throws IOException { - out("#macro dblwire1(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R,G,B)\n" + - "#local dx = X2 - X1;\n" + - "#local dy = Y2 - Y1;\n" + - "#local mag2d = sqrt(dx*dx + dy*dy);\n" + - "#local separation = 3/2 * RADIUS;\n" + - "#if (dx + dy)\n" + - " #local offX = separation * dy / mag2d;\n" + - " #local offY = separation * -dx / mag2d;\n" + - "#else\n" + - " #local offX = 0;\n" + - " #local offY = separation;\n" + - "#end\n" + - "wire1(X1+offX,Y1+offY,Z1,X2+offX,Y2+offY,Z2,RADIUS,R,G,B)\n" + - "wire1(X1-offX,Y1-offY,Z1,X2-offX,Y2-offY,Z2,RADIUS,R,G,B)\n" + - "#end\n\n"); - out("#macro dblwire2(X1,Y1,Z1,X2,Y2,Z2,"+ - "RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#local dx = X2 - X1;\n" + - "#local dy = Y2 - Y1;\n" + - "#local mag2d = sqrt(dx*dx + dy*dy);\n" + - "#local separation = 3/2 * RADIUS;\n" + - "#if (dx + dy)\n" + - " #local offX = separation * dy / mag2d;\n" + - " #local offY = separation * -dx / mag2d;\n" + - "#else\n" + - " #local offX = 0;\n" + - " #local offY = separation;\n" + - "#end\n" + - "wire2(X1+offX,Y1+offY,Z1,X2+offX,Y2+offY,Z2,\n"+ - " RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "wire2(X1-offX,Y1-offY,Z1,X2-offX,Y2-offY,Z2,\n"+ - " RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#end\n\n"); - } - void writeMacrosTripleWire() throws IOException { - out("#macro trpwire1(X1,Y1,Z1,X2,Y2,Z2,RADIUS,R,G,B)\n" + - "#local dx = X2 - X1;\n" + - "#local dy = Y2 - Y1;\n" + - "#local mag2d = sqrt(dx*dx + dy*dy);\n" + - "#local separation = 5/2 * RADIUS;\n" + - "#if (dx + dy)\n" + - " #local offX = separation * dy / mag2d;\n" + - " #local offY = separation * -dx / mag2d;\n" + - "#else\n" + - " #local offX = 0;\n" + - " #local offY = separation;\n" + - "#end\n" + - "wire1(X1+offX,Y1+offY,Z1,X2+offX,Y2+offY,Z2,RADIUS,R,G,B)\n" + - "wire1(X1 ,Y1 ,Z1,X2 ,Y2 ,Z2,RADIUS,R,G,B)\n" + - "wire1(X1-offX,Y1-offY,Z1,X2-offX,Y2-offY,Z2,RADIUS,R,G,B)\n" + - "#end\n\n"); - out("#macro trpwire2(X1,Y1,Z1,X2,Y2,Z2,"+ - "RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#local dx = X2 - X1;\n" + - "#local dy = Y2 - Y1;\n" + - "#local mag2d = sqrt(dx*dx + dy*dy);\n" + - "#local separation = 5/2 * RADIUS;\n" + - "#if (dx + dy)\n" + - " #local offX = separation * dy / mag2d;\n" + - " #local offY = separation * -dx / mag2d;\n" + - "#else\n" + - " #local offX = 0;\n" + - " #local offY = separation;\n" + - "#end\n" + - "wire2(X1+offX,Y1+offY,Z1,X2+offX,Y2+offY,Z2,\n"+ - " RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "wire2(X1 ,Y1 ,Z1,X2 ,Y2 ,Z2,\n"+ - " RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "wire2(X1-offX,Y1-offY,Z1,X2-offX,Y2-offY,Z2,\n"+ - " RADIUS,R1,G1,B1,R2,G2,B2)\n" + - "#end\n\n"); - } - - Point3f point1 = new Point3f(); - Point3f point2 = new Point3f(); - - void writeAtom(int modelIndex, int i) throws IOException { - int model = viewer.getAtomModelIndex(i); - if (model != modelIndex) { - return; - } - float radius = (float)viewer.getAtomRadius(i); - if (radius == 0) - return; - transformMatrix.transform(viewer.getAtomPoint3f(i), point1); - float x = (float)point1.x; - float y = (float)point1.y; - float z = (float)point1.z; - int argb = viewer.getAtomArgb(i); - float r = getRed(argb); - float g = getGrn(argb); - float b = getBlu(argb); - out("atom("+x+","+y+","+z+","+radius+","+r+","+g+","+b+")\n"); - } - - void writeBond(int modelIndex, int i) throws IOException { - int model = viewer.getBondModelIndex(i); - if (model != modelIndex) { - return; - } - float radius = (float)viewer.getBondRadius(i); - if (radius == 0) - return; - transformMatrix.transform(viewer.getBondPoint3f1(i), point1); - float x1 = (float)point1.x; - float y1 = (float)point1.y; - float z1 = (float)point1.z; - transformMatrix.transform(viewer.getBondPoint3f2(i), point2); - float x2 = (float)point2.x; - float y2 = (float)point2.y; - float z2 = (float)point2.z; - int argb1 = viewer.getBondArgb1(i); - int argb2 = viewer.getBondArgb2(i); - float r1 = getRed(argb1); - float g1 = getGrn(argb1); - float b1 = getBlu(argb1); - int order = viewer.getBondOrder(i); - - switch (order) { - case 1: - out("bond"); - break; - - case 2: - out("dblbond"); - break; - - case 3: - out("trpbond"); - break; - - case JmolConstants.BOND_AROMATIC: - //out("bond"); - //TODO: Render aromatic bond as in Jmol : a full cylinder and a dashed cylinder - // The problem is to place correctly the two cylinders ! - out("abond"); - break; - - default: - if ((order & JmolConstants.BOND_HYDROGEN_MASK) != 0) { - out("hbond"); - } else { - return; - } - } - - out(argb1 == argb2 ? "1" : "2"); - out("("); - out(x1 + "," + y1 + "," + z1 + ","); - out(x2 + "," + y2 + "," + z2 + ","); - out(radius + ","); - out(r1 + "," + g1 + "," + b1); - if (argb1 != argb2) { - float r2 = getRed(argb2); - float g2 = getGrn(argb2); - float b2 = getBlu(argb2); - out("," + r2 + "," + g2 + "," + b2); - } - out(")\n"); - } - - void writePolymer(int modelIndex, int i) throws IOException { - Point3f[] points = viewer.getPolymerLeadMidPoints(modelIndex, i); - Point3f[] controls = computeControlPoints(points); - if (controls != null) { - out("sphere_sweep {\n"); - out(" b_spline\n"); - out(" " + controls.length + "\n"); - for (int j = 0; j < controls.length; j++) { - Point3f point = controls[j]; - transformMatrix.transform(point, point1); - double d = 0.2; //TODO - out(" <" + point1.x + "," + point1.y + "," + point1.z + ">," + d + "\n"); - } - Color color = Color.BLUE; //TODO - float r = color.getRed() / 255f; - float g = color.getGreen() / 255f; - float b = color.getBlue() / 255f; - out(" pigment{rgb<" + r + "," + g + "," + b + ">}\n"); - out("}\n"); - } - } - - *//** - * Computes the control points of a b-spline that goes through a set of points - * - * @param path Set of n points to go through - * @return Set of n+2 control points - *//* - Point3f[] computeControlPoints(Point3f[] path) { - // NOTE : - // I digged this code out from a program I wrote more than ten years ago - // The program was in C++ and with not many comments - // I don't remember well how it is working - // Hence the lack of explanations in the code :-) - Point3f[] controls = null; - if ((path != null) && (path.length >= 2)) { - - // Determine if it is a closed loop - int length = path.length; - boolean loop = - (path[0].x == path[length - 1].x) && - (path[0].y == path[length - 1].y) && - (path[0].z == path[length - 1].z); - - if (!loop) { - if (length > 2) { - - // Create vectors for computations - Point3d[] values = new Point3d[length + 2]; - Point3d[] results1 = new Point3d[length + 2]; - Point3d[] results2 = new Point3d[length + 2]; - - // Initialize vectors for computations - values[0] = new Point3d(path[0]); - for (int i = 0; i < length; i++) { - values[i + 1] = new Point3d( - 6 * path[i].x, 6 * path[i].y, 6 * path[i].z); - } - values[length + 1] = new Point3d( - values[length].x / 6.0, values[length].y / 6.0, values[length].z / 6.0); - - for (int i = 0; i < length + 2; i++) { - results1[i] = new Point3d(0, 0, 0); - results2[i] = new Point3d(0, 0, 0); - } - results2[0].set(1, 1, 1); - results1[1].set(values[0]); - - // Computation of control points - for (int i = 2; i < length + 2; i++) { - results1[i].x = values[i - 1].x - 4 * results1[i - 1].x - results1[i - 2].x; - results1[i].y = values[i - 1].y - 4 * results1[i - 1].y - results1[i - 2].y; - results1[i].z = values[i - 1].z - 4 * results1[i - 1].z - results1[i - 2].z; - results2[i].x = -4 * results2[i - 1].x - results2[i - 2].x; - results2[i].y = -4 * results2[i - 1].y - results2[i - 2].y; - results2[i].z = -4 * results2[i - 1].z - results2[i - 2].z; - } - double xA = (values[length + 1].x - results1[length].x) / results2[length].x; - double yA = (values[length + 1].y - results1[length].y) / results2[length].y; - double zA = (values[length + 1].z - results1[length].z) / results2[length].z; - - // Creation of the control points array - Point3f[] points = new Point3f[length + 2]; - for (int i = 0; i < length + 2; i++) { - points[i] = new Point3f( - (float) (results1[i].x + xA * results2[i].x), - (float) (results1[i].y + yA * results2[i].y), - (float) (results1[i].z + zA * results2[i].z)); - } - controls = points; - } else { - Point3f[] points = new Point3f[length + 2]; - points[0] = new Point3f( - 2 * path[0].x - path[1].x, - 2 * path[0].y - path[1].y, - 2 * path[0].z - path[1].z); - points[1] = new Point3f(path[0]); - points[2] = new Point3f(path[1]); - points[3] = new Point3f( - 2 * path[1].x - path[0].x, - 2 * path[1].y - path[0].y, - 2 * path[1].z - path[0].z); - controls = points; - } - - } else { - if (length > 3) { - - // Create vectors for computations - Point3d[] values = new Point3d[length + 2]; - Point3d[] results1 = new Point3d[length + 2]; - Point3d[] results2 = new Point3d[length + 2]; - Point3d[] results3 = new Point3d[length + 2]; - Point3f[] points = new Point3f[length + 2]; - - // Initialize vectors for computations - for (int i = 0; i < length - 1; i++) { - values[i] = new Point3d( - 6 * path[i].x, 6 * path[i].y, 6 * path[i].z); - points[i] = new Point3f(0, 0, 0); - results1[i] = new Point3d(0, 0, 0); - results2[i] = new Point3d(0, 0, 0); - results3[i] = new Point3d(0, 0, 0); - } - results2[0].set(1, 1, 1); - results3[0].set(1, 1, 1); - - // Computation of control points - for (int i = 2; i < length - 1; i++) { - results1[i].x = values[i - 2].x - results1[i - 2].x - 4 * results1[i - 1].x; - results1[i].y = values[i - 2].y - results1[i - 2].y - 4 * results1[i - 1].y; - results1[i].z = values[i - 2].z - results1[i - 2].z - 4 * results1[i - 1].z; - results2[i].x = - results2[i - 2].x - 4 * results2[i - 1].x; - results2[i].y = - results2[i - 2].y - 4 * results2[i - 1].y; - results2[i].z = - results2[i - 2].z - 4 * results2[i - 1].z; - results3[i].x = - results3[i - 2].x - 4 * results3[i - 1].x; - results3[i].y = - results3[i - 2].y - 4 * results3[i - 1].y; - results3[i].z = - results3[i - 2].z - 4 * results3[i - 1].z; - } - double ax1 = 1 + results2[length - 3].x + 4 * results2[length - 2].x; - double ay1 = 1 + results2[length - 3].y + 4 * results2[length - 2].y; - double az1 = 1 + results2[length - 3].z + 4 * results2[length - 2].z; - double ax2 = 4 + results2[length - 2].x; - double ay2 = 4 + results2[length - 2].y; - double az2 = 4 + results2[length - 2].z; - double bx1 = 1 + results3[length - 3].x + 4 * results3[length - 2].x; - double by1 = 1 + results3[length - 3].y + 4 * results3[length - 2].y; - double bz1 = 1 + results3[length - 3].z + 4 * results3[length - 2].z; - double bx2 = 1 + results3[length - 2].x; - double by2 = 1 + results3[length - 2].y; - double bz2 = 1 + results3[length - 2].z; - double cx1 = values[length - 3].x - results1[length - 3].x - 4 * results1[length - 2].x; - double cy1 = values[length - 3].y - results1[length - 3].y - 4 * results1[length - 2].y; - double cz1 = values[length - 3].z - results1[length - 3].z - 4 * results1[length - 2].z; - double cx2 = values[length - 2].x - results1[length - 2].x; - double cy2 = values[length - 2].y - results1[length - 2].y; - double cz2 = values[length - 2].z - results1[length - 2].z; - points[0].set( - (float) ((cx1 * bx2 - cx2 * bx1) / (ax1 * bx2 - ax2 * bx1)), - (float) ((cy1 * by2 - cy2 * by1) / (ay1 * by2 - ay2 * by1)), - (float) ((cz1 * bz2 - cz2 * bz1) / (az1 * bz2 - az2 * bz1))); - points[1].set( - (float) ((cx1 * ax2 - cx2 * ax1) / (ax2 * bx1 - ax1 * bx2)), - (float) ((cy1 * ay2 - cy2 * ay1) / (ay2 * by1 - ay1 * by2)), - (float) ((cz1 * az2 - cz2 * az1) / (az2 * bz1 - az1 * bz2))); - for (int i = 2; i < length - 1; i++) { - points[i].set( - (float) (results1[i].x + results2[i].x * points[0].x + results3[i].x * points[1].x), - (float) (results1[i].y + results2[i].y * points[0].y + results3[i].y * points[1].y), - (float) (results1[i].z + results2[i].z * points[0].z + results3[i].z * points[1].z)); - } - points[length - 1] = new Point3f(points[0]); - points[length ] = new Point3f(points[1]); - points[length + 1] = new Point3f(points[2]); - controls = points; - } else { - Point3f[] points = new Point3f[4]; - points[0] = new Point3f( - 2 * path[0].x - path[1].x, - 2 * path[0].y - path[1].y, - 2 * path[0].z - path[1].z); - points[1] = new Point3f(path[0]); - points[2] = new Point3f(path[1]); - points[3] = new Point3f( - 2 * path[1].x - path[0].x, - 2 * path[1].y - path[0].y, - 2 * path[1].z - path[0].z); - controls = points; - } - } - } - return controls; - } - - float getRed(int argb) { - return ((argb >> 16) & 0xFF) / 255f; - } - - float getGrn(int argb) { - return ((argb >> 8) & 0xFF) / 255f; - } - - float getBlu(int argb) { - return (argb & 0xFF) / 255f; - } - -*/ - -} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-02-10 13:44:45
|
Revision: 12363 http://jmol.svn.sourceforge.net/jmol/?rev=12363&view=rev Author: hansonr Date: 2010-02-10 13:44:39 +0000 (Wed, 10 Feb 2010) Log Message: ----------- version=11.9.27_dev # bug fix: nodisplay mode could crash Modified Paths: -------------- trunk/Jmol/src/com/sparshui/server/GestureServer.java trunk/Jmol/src/org/jmol/viewer/ActionManager.java trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/com/sparshui/server/GestureServer.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureServer.java 2010-02-10 13:13:23 UTC (rev 12362) +++ trunk/Jmol/src/com/sparshui/server/GestureServer.java 2010-02-10 13:44:39 UTC (rev 12363) @@ -117,11 +117,11 @@ else _mySocket = main._deviceSocket = new ServerSocket(port); Logger.info("[GestureServer] Socket Open: " + port); - myState = JmolGestureServerInterface.OK; + main.myState = JmolGestureServerInterface.OK; } catch (IOException e) { Logger.error("[GestureServer] Failed to open a server socket."); e.printStackTrace(); - myState = 0; + main.myState = 0; } } @@ -178,7 +178,7 @@ if (main.ic == null) { cc.processError(EventType.DRIVER_NONE); } else { - myState |= JmolGestureServerInterface.HAS_CLIENT; + main.myState |= JmolGestureServerInterface.HAS_CLIENT; } } @@ -190,7 +190,7 @@ private void acceptInputDeviceConnection(Socket socket) throws IOException { Logger.info("[GestureServer] Input device connection accepted"); main.ic = new InputDeviceConnection(this, socket); - myState |= JmolGestureServerInterface.HAS_DRIVER; + main.myState |= JmolGestureServerInterface.HAS_DRIVER; } /** @@ -202,7 +202,7 @@ Logger .error("[GestureServer] sending clients message that input device was lost."); main.ic = null; - myState &= ~JmolGestureServerInterface.HAS_DRIVER; + main.myState &= ~JmolGestureServerInterface.HAS_DRIVER; processBirth(null); } Modified: trunk/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2010-02-10 13:13:23 UTC (rev 12362) +++ trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2010-02-10 13:44:39 UTC (rev 12363) @@ -390,6 +390,17 @@ private boolean isAltKeyReleased = true; private boolean keyProcessing; + protected boolean isMultiTouchClient; + protected boolean isMultiTouchServer; + + boolean isMTClient() { + return isMultiTouchClient; + } + + boolean isMTServer() { + return isMultiTouchServer; + } + void dispose() { clear(); } Modified: trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2010-02-10 13:13:23 UTC (rev 12362) +++ trunk/Jmol/src/org/jmol/viewer/ActionManagerMT.java 2010-02-10 13:44:39 UTC (rev 12363) @@ -78,9 +78,8 @@ if (isSimulated) Logger.error("ActionManagerMT -- for now just using touch simulation.\nPress CTRL-LEFT and then draw two traces on the window."); - boolean isClient = adapter.setMultiTouchClient(viewer, this, isSimulated); - boolean isServer = adapter.isServer(); - viewer.setMultiTouch(isServer, isClient); + isMultiTouchClient = adapter.setMultiTouchClient(viewer, this, isSimulated); + isMultiTouchServer = adapter.isServer(); if (isSimulated) { simulator = (JmolTouchSimulatorInterface) Interface .getInterface("com.sparshui.inputdevice.JmolTouchSimulator"); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-02-10 13:13:23 UTC (rev 12362) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-02-10 13:44:39 UTC (rev 12363) @@ -3,6 +3,7 @@ version=11.9.27_dev +# bug fix: nodisplay mode could crash # new feature: frank may be turned off by local signed applet # new feature: _multiTouchServer and _multiTouchClient flags # bug fix: isosurface cavity broken Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2010-02-10 13:13:23 UTC (rev 12362) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2010-02-10 13:44:39 UTC (rev 12363) @@ -561,12 +561,15 @@ public void initialize() { global = stateManager.getGlobalSettings(global); - setBooleanProperty("_applet", isApplet); - setBooleanProperty("_signedApplet", isSignedApplet); - setBooleanProperty("_useCommandThread", useCommandThread); + global.setParameterValue("_applet", isApplet); + global.setParameterValue("_signedApplet", isSignedApplet); + global.setParameterValue("_useCommandThread", useCommandThread); global.setParameterValue("_width", dimScreen.width); global.setParameterValue("_height", dimScreen.height); - + if (haveDisplay) { + global.setParameterValue("_multiTouchClient", actionManager.isMTClient()); + global.setParameterValue("_multiTouchServer", actionManager.isMTServer()); + } colorManager.resetElementColors(); setObjectColor("background", "black"); setObjectColor("axis1", "red"); @@ -1620,7 +1623,7 @@ } Rectangle getRubberBandSelection() { - return actionManager.getRubberBand(); + return (haveDisplay ? actionManager.getRubberBand() : null); } public boolean isBound(int action, int gesture) { @@ -4319,6 +4322,7 @@ pickingMode = JmolConstants.getPickingMode(mode); if (pickingMode < 0) pickingMode = JmolConstants.PICKING_IDENTIFY; + if (haveDisplay) actionManager.setPickingMode(pickingMode); global.setParameterValue("picking", JmolConstants .getPickingModeName(actionManager.getPickingMode())); @@ -5103,13 +5107,16 @@ boolean found = true; switch (tok) { case Token.gestureswipefactor: - actionManager.setGestureSwipeFactor(value); + if (haveDisplay) + actionManager.setGestureSwipeFactor(value); break; case Token.mousedragfactor: - actionManager.setMouseDragFactor(value); + if (haveDisplay) + actionManager.setMouseDragFactor(value); break; case Token.mousewheelfactor: - actionManager.setMouseWheelFactor(value); + if (haveDisplay) + actionManager.setMouseWheelFactor(value); break; case Token.strutlengthmaximum: // 11.9.21 @@ -7892,9 +7899,8 @@ } public void unBindAction(String desc, String name) { - if (!haveDisplay) - return; - actionManager.unbindAction(desc, name); + if (haveDisplay) + actionManager.unbindAction(desc, name); } public Object getMouseInfo() { @@ -7906,13 +7912,12 @@ } public void setTimeout(String name, int mSec, String script) { - if (!haveDisplay) - return; - actionManager.setTimeout(name, mSec, script); + if (haveDisplay) + actionManager.setTimeout(name, mSec, script); } public String showTimeout(String name) { - return actionManager.showTimeout(name); + return (haveDisplay ? actionManager.showTimeout(name) : ""); } public int getFrontPlane() { @@ -8053,9 +8058,4 @@ } } - public void setMultiTouch(boolean isServer, boolean isClient) { - global.setParameterValue("_multiTouchServer", isServer); - global.setParameterValue("_multiTouchClient", isClient); - } - } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-05-28 12:11:00
|
Revision: 13242 http://jmol.svn.sourceforge.net/jmol/?rev=13242&view=rev Author: hansonr Date: 2010-05-28 12:10:53 +0000 (Fri, 28 May 2010) Log Message: ----------- version=12.0.RC15 # new feature Jmol reads SMILES --> 3D from http://cheminfo.informatics.indiana.edu/rest/thread/d3.py/SMILES # new feature: load SMILES "smilesstring" # new feature: load $smilesString Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/viewer/FileManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/StateManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Added Paths: ----------- trunk/Jmol/src/Thumbs.db trunk/Jmol/src/org/jmol/_documents/Thumbs.db Added: trunk/Jmol/src/Thumbs.db =================================================================== (Binary files differ) Property changes on: trunk/Jmol/src/Thumbs.db ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/Jmol/src/org/jmol/_documents/Thumbs.db =================================================================== (Binary files differ) Property changes on: trunk/Jmol/src/org/jmol/_documents/Thumbs.db ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2010-05-28 02:31:52 UTC (rev 13241) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2010-05-28 12:10:53 UTC (rev 13242) @@ -1023,6 +1023,13 @@ LimitedLineReader(BufferedReader bufferedReader, int readLimit) throws Exception { + // It appears that some web servers cannot handle this. + // All I know is that the Indiana University smi23d server + // returns only one char the SECOND time this is run. + // for some reason the URL connection is not closing? + // but the problem only occurs when this limited buffer is used; + // when you use MOL:: in front of the filename, then it is fine. + // So we do that... bufferedReader.mark(readLimit); buf = new char[readLimit]; cchBuf = Math.max(bufferedReader.read(buf), 0); Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2010-05-28 02:31:52 UTC (rev 13241) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2010-05-28 12:10:53 UTC (rev 13242) @@ -57,7 +57,7 @@ * String characters --> Token token --> Vector ltoken[] --> Token[][] aatokenCompiled[][] * */ - private static final String LOAD_TYPES = "append;data;files;inline;menu;trajectory;models;" + JmolConstants.LOAD_ATOM_DATA_TYPES; + private static final String LOAD_TYPES = "append;data;files;inline;menu;smiles;trajectory;models;" + JmolConstants.LOAD_ATOM_DATA_TYPES; public ScriptCompiler(Viewer viewer) { this.viewer = viewer; @@ -916,7 +916,7 @@ strFormat = strFormat.toLowerCase(); if (Parser.isOneOf(strFormat, LOAD_TYPES)) addTokenToPrefix(new Token(Token.identifier, strFormat)); - else if (strFormat.indexOf("=") == 0) { + else if (strFormat.indexOf("=") == 0 || strFormat.indexOf("$") == 0) { addTokenToPrefix(new Token(Token.string, strFormat)); iHaveQuotedString = true; } @@ -1888,16 +1888,19 @@ return sb.toString(); } - // static String[] loadFormats = { "append", "files", "trajectory", "menu", "models", - // /*ancient:*/ "alchemy", "mol2", "mopac", "nmrpdb", "charmm", "xyz", "mdl", "pdb" }; + // static String[] loadFormats = { "append", "files", "trajectory", "menu", + // "models", + // /*ancient:*/ "alchemy", "mol2", "mopac", "nmrpdb", "charmm", "xyz", "mdl", + // "pdb" }; private boolean lookingAtLoadFormat() { - // just allow a simple word or =xxxx + // just allow a simple word or =xxxx or $CCCC int ichT = ichToken; char ch = '\0'; + boolean allchar = (ichT < cchScript && ((ch = script.charAt(ichT)) == '$' || ch == '=')); while (ichT < cchScript - && ((ch = script.charAt(ichT)) == '=' && ichT == ichToken - || Character.isLetterOrDigit(ch))) + && (Character.isLetterOrDigit(ch = script.charAt(ichT)) || allchar + && (!eol(ch) && !Character.isWhitespace(ch)))) ++ichT; if (ichT == ichToken || !eol(ch) && !isSpaceOrTab(ch)) return false; Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-05-28 02:31:52 UTC (rev 13241) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-05-28 12:10:53 UTC (rev 13242) @@ -7464,6 +7464,7 @@ boolean isAppend = false; boolean appendNew = viewer.getAppendNew(); boolean isInline = false; + boolean isSmiles = false; boolean doLoadFiles = (!isSyntaxCheck || isCmdLine_C_Option); String filter = null; Vector firstLastSteps = null; @@ -7502,6 +7503,7 @@ loadScript.append(" " + modelName); isAppend = (modelName.equalsIgnoreCase("append")); isInline = (modelName.equalsIgnoreCase("inline")); + isSmiles = (modelName.equalsIgnoreCase("smiles")); tokType = (Parser.isOneOf(modelName.toLowerCase(), JmolConstants.LOAD_ATOM_DATA_TYPES) ? Token .getTokFromName(modelName.toLowerCase()) : 0); @@ -7581,6 +7583,8 @@ loadScript.append(" /*file*/").append(Escape.escape(filenames[j])); } } + if (isSmiles) + filename = "$" + filename; } else if (getToken(i + 1).tok == Token.leftbrace || theTok == Token.point3f || theTok == Token.integer || theTok == Token.manifest || theTok == Token.packed @@ -7777,7 +7781,7 @@ else htParams.put("OutputStream", os); } - + if (filenames == null && tokType == 0) { // a single file or string -- complete the loadScript loadScript.append(" "); @@ -7797,7 +7801,7 @@ if (!isSyntaxCheck) viewer.setCursor(Viewer.CURSOR_WAIT); - + errMsg = viewer.loadModelFromFile(null, filename, filenames, null, isAppend, htParams, loadScript, tokType); if (os != null) @@ -7838,14 +7842,14 @@ viewer.setCurrentModelIndex(modelCount); } if (logMessages) - scriptStatusOrBuffer("Successfully loaded:" + - (filenames == null ? htParams.get("fullPathName") - : modelName)); + scriptStatusOrBuffer("Successfully loaded:" + + (filenames == null ? htParams.get("fullPathName") : modelName)); String script = viewer.getDefaultLoadScript(); String msg = ""; if (script.length() > 0) msg += "\nUsing defaultLoadScript: " + script; - String embeddedScript = (String) viewer.getModelSetAuxiliaryInfo().remove("jmolscript"); + String embeddedScript = (String) viewer.getModelSetAuxiliaryInfo().remove( + "jmolscript"); if (embeddedScript != null && viewer.getAllowEmbeddedScripts()) { msg += "\nAdding embedded #jmolscript: " + embeddedScript; script += ";" + embeddedScript; @@ -7855,7 +7859,8 @@ } if (msg.length() > 0) Logger.info(msg); - String siteScript = (String) viewer.getModelSetAuxiliaryInfo().remove("sitescript"); + String siteScript = (String) viewer.getModelSetAuxiliaryInfo().remove( + "sitescript"); if (siteScript != null) script = siteScript + ";" + script; if (script.length() > 0 && !isCmdLine_c_or_C_Option) @@ -14867,15 +14872,10 @@ boolean firstPass = (!surfaceObjectSeen && !planeSeen); if (filename.startsWith("=") && filename.length() > 1) { // Uppsala Electron Density Server (default, at least) - String[] info = viewer.getElectronDensityLoadInfo(); - String server = info[0]; - // String option = (!firstPass || ptWithin > 0 ? null : info[1]); - String strCutoff = (isSyntaxCheck || !firstPass - || !Float.isNaN(cutoff) ? null : info[1]); - String f = filename.substring(1); - filename = FileManager.fixFileNameVariables(server, f); + String[] info = (String[]) viewer.setLoadFormat(filename, '_'); + filename = info[0]; + String strCutoff = (!firstPass || !Float.isNaN(cutoff) ? null : info[1]); if (strCutoff != null) { - strCutoff = FileManager.fixFileNameVariables(strCutoff, f); cutoff = ScriptVariable.fValue(ScriptVariable.getVariable(viewer .evaluateExpression(strCutoff))); if (cutoff > 0) { Modified: trunk/Jmol/src/org/jmol/viewer/FileManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/FileManager.java 2010-05-28 02:31:52 UTC (rev 13241) +++ trunk/Jmol/src/org/jmol/viewer/FileManager.java 2010-05-28 12:10:53 UTC (rev 13242) @@ -204,6 +204,8 @@ StringBuffer loadScript, boolean isAppend) { if (htParams.get("atomDataOnly") == null) setLoadState(htParams); + if (name.indexOf("=") == 0 || name.indexOf('$') == 0) + name = (String) viewer.setLoadFormat(name, name.charAt(0)); int pt = name.indexOf("::"); nameAsGiven = (pt >= 0 ? name.substring(pt + 2) : name); String fileType = (pt >= 0 ? name.substring(0, pt) : null); @@ -797,9 +799,8 @@ File file = null; URL url = null; String[] names = null; - if (name.indexOf("=") == 0) - name = TextFormat.formatString(viewer.getLoadFormat(), "FILE", name - .substring(1)); + if (name.indexOf("=") == 0 || name.indexOf('$') == 0) + name = (String) viewer.setLoadFormat(name, name.charAt(0)); if (name.indexOf(":") < 0 && name.indexOf("/") != 0) name = addDirectory(viewer.getDefaultDirectory(), name); if (appletDocumentBase != null) { @@ -1197,10 +1198,17 @@ : (String) t); } } - if (reader != null) + if (reader != null) { atomSetCollection = viewer.getModelAdapter() .getAtomSetCollectionFromReader(fullPathNameIn, fileTypeIn, reader, htParams); + try { + + reader.close(); + } catch (IOException e) { + // ignore + } + } if (errorMessage != null) { if (!errorMessage.startsWith("NOTE:")) Logger.error("file ERROR: " + fullPathNameIn + "\n" + errorMessage); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-05-28 02:31:52 UTC (rev 13241) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-05-28 12:10:53 UTC (rev 13242) @@ -3,6 +3,10 @@ version=12.0.RC15 +# new feature Jmol reads SMILES --> 3D from http://cheminfo.informatics.indiana.edu/rest/thread/d3.py/SMILES +# new feature: load SMILES "smilesstring" +# new feature: load $smilesString + # code: file reading clean-up in Viewer # bug fix: 12.0.RC6 (4/17) inadvertantly left in "false &&" in if statement in atom iterator broke: # polyhedra 2.0, geosurface, dots, and slows isosurface molecular more than 2-fold Modified: trunk/Jmol/src/org/jmol/viewer/StateManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StateManager.java 2010-05-28 02:31:52 UTC (rev 13241) +++ trunk/Jmol/src/org/jmol/viewer/StateManager.java 2010-05-28 12:10:53 UTC (rev 13242) @@ -583,7 +583,7 @@ + ";axis3color;backgroundcolor;backgroundmodel;bondsymmetryatoms;boundboxcolor;cameradepth" + ";debug;debugscript;defaultlatttice;defaults;diffusepercent;exportdrivers" + ";_filecaching;_filecache;fontcaching;fontscaling;language;loglevel;measureStyleChime" - + ";loadformat;edsurlformat;edsurlcutoff;multiprocessor;navigationmode;" + + ";loadformat;smilesurlformat;edsurlformat;edsurlcutoff;multiprocessor;navigationmode;" + ";perspectivedepth;phongexponent;perspectivemodel;preservestate;refreshing;repaintwaitms;rotationradius" + ";showaxes;showaxis1;showaxis2;showaxis3;showboundbox;showfrank;showunitcell" + ";slabenabled;zshade;zshadepower;specular;specularexponent;specularpercent;specularpower;stateversion" @@ -925,6 +925,7 @@ setParameterValue("slabByAtom", slabByAtom); setParameterValue("smartAromatic", smartAromatic); setParameterValue("smallMoleculeMaxAtoms", smallMoleculeMaxAtoms); + setParameterValue("smilesUrlFormat", smilesUrlFormat); setParameterValue("solventProbe", solventOn); setParameterValue("solventProbeRadius", solventProbeRadius); setParameterValue("specular", specular); @@ -994,7 +995,8 @@ // String _fileCache = ""; boolean forceAutoBond = false; char inlineNewlineChar = '|'; //pseudo static - String loadFormat = "http://www.rcsb.org/pdb/files/%FILE.pdb"; + String loadFormat = "PDB::http://www.rcsb.org/pdb/files/%FILE.pdb"; + String smilesUrlFormat = "MOL::http://cheminfo.informatics.indiana.edu/rest/thread/d3.py/SMILES/%FILE"; String edsUrlFormat = "http://eds.bmc.uu.se/eds/dfs/%LC13/%LCFILE/%LCFILE.omap"; String edsUrlCutoff = "load('http://eds.bmc.uu.se/eds/dfs/%LC13/%LCFILE/%LCFILE.sfdat').lines.find('MAP_SIGMA').split(' ')[2]"; String edsUrlOptions = "within 2.0 {*}"; @@ -1047,6 +1049,7 @@ appendCmd(str, "set forceAutoBond " + forceAutoBond); appendCmd(str, "#set defaultLoadFilter " + Escape.escape(defaultLoadFilter)) ; appendCmd(str, "#set loadFormat " + Escape.escape(loadFormat)); + appendCmd(str, "#set smilesUrlFormat " + Escape.escape(smilesUrlFormat)); appendCmd(str, "#set edsUrlFormat " + Escape.escape(edsUrlFormat)); appendCmd(str, "#set edsUrlCutoff " + Escape.escape(edsUrlCutoff)); // if (autoLoadOrientation) Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2010-05-28 02:31:52 UTC (rev 13241) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2010-05-28 12:10:53 UTC (rev 13242) @@ -4203,8 +4203,18 @@ return global.defaultLoadScript; } - String getLoadFormat() { - return global.loadFormat; + public Object setLoadFormat(String name, char type) { + String f = name.substring(1); + switch(type) { + case '=': + case '$': + return TextFormat.formatString(type == '=' ? global.loadFormat : global.smilesUrlFormat, "FILE", f); + case '_': // isosurface "=...", but we code that type as '-' + String server = FileManager.fixFileNameVariables(global.edsUrlFormat, f); + String strCutoff = FileManager.fixFileNameVariables(global.edsUrlCutoff, f); + return new String[] { server, strCutoff }; + } + return name.substring(1); } public String[] getElectronDensityLoadInfo() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2010-05-29 09:02:03
|
Revision: 13252 http://jmol.svn.sourceforge.net/jmol/?rev=13252&view=rev Author: nicove Date: 2010-05-29 09:01:56 +0000 (Sat, 29 May 2010) Log Message: ----------- Removing Thumbs.db files (they shouldn't be under SVN) Removed Paths: ------------- trunk/Jmol/src/Thumbs.db trunk/Jmol/src/org/jmol/_documents/Thumbs.db Deleted: trunk/Jmol/src/Thumbs.db =================================================================== (Binary files differ) Deleted: trunk/Jmol/src/org/jmol/_documents/Thumbs.db =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-06-06 14:51:34
|
Revision: 13296 http://jmol.svn.sourceforge.net/jmol/?rev=13296&view=rev Author: hansonr Date: 2010-06-06 14:51:26 +0000 (Sun, 06 Jun 2010) Log Message: ----------- BIOSMILES/BIOSMARTS, SMILES generator using {*}.find("SMILES") Modified Paths: -------------- trunk/Jmol/src/JmolSmilesApplet.java trunk/Jmol/src/org/jmol/api/JmolNode.java trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java trunk/Jmol/src/org/jmol/modelset/Atom.java trunk/Jmol/src/org/jmol/modelset/Group.java trunk/Jmol/src/org/jmol/modelsetbio/AminoMonomer.java trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/smiles/SmilesAtom.java trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java trunk/Jmol/src/org/jmol/smiles/SmilesParser.java trunk/Jmol/src/org/jmol/smiles/SmilesSearch.java trunk/Jmol/src/org/jmol/smiles/package.html Added Paths: ----------- trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java Modified: trunk/Jmol/src/JmolSmilesApplet.java =================================================================== --- trunk/Jmol/src/JmolSmilesApplet.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/JmolSmilesApplet.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -28,6 +28,7 @@ import java.awt.Graphics; import java.util.BitSet; +import org.jmol.util.Logger; import org.jmol.smiles.InvalidSmilesException; import org.jmol.smiles.SmilesMatcher; @@ -39,13 +40,40 @@ private static String lastError; + /** + * + * @return last error generated by the find command + * + */ public String getLastError() { return lastError; } + /** + * set debugging on or off + * + * @param TF + */ + public void setDebug(boolean TF) { + Logger.setLogLevel(TF ? Logger.LEVEL_DEBUG : Logger.LEVEL_INFO); + } + + /** + * When used for student answer checking, the student's response + * is the SMILES and the key is the PATTERN -- that is, we seek + * to know if the correct answer (pattern) is IN the student's + * answer (smiles). + * @param pattern + * @param smiles + * @param isSearch + * @param isAll set TRUE if you want a full count + * @return n>0 with isAll TRUE: found n occurances, + * 1: found at least 1, 0: not found, -1: error + */ public int find(String pattern, String smiles, boolean isSearch, boolean isAll) { - System.out.println("find " + pattern + " in " + smiles + " isSearch? " + isSearch + "; isAll? " + isAll); - lastError = null; + System.out.println("find " + pattern + " in " + smiles + " isSearch? " + + isSearch + "; isAll? " + isAll); + lastError = null; int ret = -1; try { SmilesMatcher sm = new SmilesMatcher(); Modified: trunk/Jmol/src/org/jmol/api/JmolNode.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolNode.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/api/JmolNode.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -25,6 +25,7 @@ package org.jmol.api; import java.util.BitSet; +import java.util.Vector; public interface JmolNode { @@ -53,7 +54,7 @@ public String getGroup3(boolean allowNull); public char getChainID(); public int getOffsetResidueAtom(String name, int offset); - public int getCrossLinkLeadAtomIndex(); + public void getCrossLinkLeadAtomIndexes(Vector vReturn); public void setGroupBits(BitSet bs); public boolean isLeadAtom(); public boolean isCrossLinked(JmolNode node); Modified: trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -4,17 +4,18 @@ public interface SmilesMatcherInterface { + public abstract String getLastException(); + public abstract BitSet getSubstructureSet(String smiles, JmolNode[] atoms, int atomCount, BitSet bsSelected, - boolean isSearch, boolean isAll) - throws Exception; + boolean isSearch, boolean isAll); public abstract int[][] getCorrelationMaps(String smiles, JmolNode[] atoms, int atomCount, BitSet bsSelected, - boolean isSearch, boolean isAll) throws Exception; + boolean isSearch, boolean isAll); public abstract BitSet[] getSubstructureSetArray(String smiles, JmolNode[] atoms, int atomCount, - BitSet bsSelected, BitSet bsRequired, BitSet bsNot, BitSet bsAromatic, boolean isSearch, boolean isAll) throws Exception; + BitSet bsSelected, BitSet bsRequired, BitSet bsNot, BitSet bsAromatic, boolean isSearch, boolean isAll); public abstract BitSet[] find(String pattern,/* ...in... */ String smiles, boolean isSearch, boolean isAll); Modified: trunk/Jmol/src/org/jmol/modelset/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Atom.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/modelset/Atom.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -37,6 +37,7 @@ import org.jmol.util.Point3fi; import java.util.BitSet; +import java.util.Vector; import javax.vecmath.Point3f; import javax.vecmath.Tuple3f; @@ -1334,156 +1335,8 @@ return group.isCrossLinked(((Atom) node).getGroup()); } - public int getCrossLinkLeadAtomIndex() { - return group.getCrossLinkLeadAtomIndex(); + public void getCrossLinkLeadAtomIndexes(Vector vReturn) { + group.getCrossLinkLeadAtomIndexes(vReturn); } - /* DEVELOPER NOTE -- ATOM/MODEL DELETION -- - * - * The challenge of atom deletion: - * - * Many data structures involve reference to Atom, atomIndex, Model, or modelIndex - * A first-pass list includes: - -org.jmol.modelset ------------------ - -Atom.atomIndex -Atom.modelIndex -Bond.atom1 -Bond.atom2 -Chain.model -Group.firstAtomIndex -Group.lastAtomIndex -Model.modelIndex -Model.fileIndex -Model.firstAtomIndex -Model.firstMolecule -Model.chains -Model.bioPolymers -Model.auxiliaryInfo - -AtomCollection.atoms -AtomCollection.atomCount -AtomCollection.atomNames -AtomCollection.atomSerials -AtomCollection.bfactor100s -AtomCollection.bspf -AtomCollection.bsHidden -AtomCollection.bsSurface -AtomCollection.nSurfaceAtoms -AtomCollection.clientAtomReferences -AtomCollection.hasBfactorRange -- set false -AtomCollection.occupancies -AtomCollection.partialCharges -AtomCollection.specialAtomIDs -AtomCollection.surfaceDistance100s -- set null -AtomCollection.tainted -AtomCollection.vibrationVectors - -BondCollection.bonds -BondCollection.bondCount - -ModelCollection.averageAtomPoint -ModelCollection.bboxModels -ModelCollection.bboxAtoms -ModelCollection.boxInfo - -ModelCollection.modelNumbers -ModelCollection.models -ModelCollection.modelSetAuxiliaryInfo["group3Lists", "group3Counts, "models"] -ModelCollection.molecules -- just set null -ModelCollection.moleculeCount -ModelCollection.stateScripts ????? -ModelCollection.thisStateModel -- just set -1 -ModelCollection.structures -ModelCollection.structureCount - -ModelSet.shapes (many of these hold references that would need adjusting) - -CellInfo.modelIndex -Measurement.countPlusIndices -MeasurementPending.countPlusIndices -Polymer.leadAtomIndices -- can be set null in BioPolymer.recalculateLeadMidpointsAndWingVectors() - -org.jmol.modelsetbio --------------------- - -org.jmol.popup --------------- - [ would need updating ] - -org.jmol.shape --------------- - -AtomShape.mads -AtomShape.colixes -AtomShape.paletteIDs -AtomShape.bsSizeSet -AtomShape.bsColixSet -AtomShape.atomCount -AtomShape.atoms - -Dots? - -Labels.strings -Labels.formats -Labels.bgcolixes -Labels.fids -Labels.offsets -Measures.measurements - -Mesh.title (sometimes model-based?) -Mesh.atomIndex -Mesh.modelIndex -Mesh.modelFlags -MeshCollection.meshes -MeshCollection.modelCount -MeshCollection.title ? - -Sticks.bsOrderSet -Sticks.bsSizeSet -Sticks.bsColixSet -Sticks.selectedBonds - -TextShape.modelIndex - -org.jmol.shapebio ------------------ - -BioShape.modelIndex -BioShape.leadAtomIndices -BioShapeCollection.atoms -BioShapeRenderer -- all need to be set null - -org.jmol.shapespecial ---------------------- - -Dipole.modelIndex -Dipole.atoms -DrawMesh.drawTypes -DrawMesh.ptCenters -DrawMesh.drawVertexCount -DrawMesh.drawVertexCounts -Draw.modelCount -MolecularOrbital.htModels -Polyhedra.Polyhedrons -Polyhedra.Polyhedron.centralAtom - -org.jmol.viewer ---------------- - -SelectionManager.bsHidden -SelectionManager.bsSelection -SelectionManager.bsSubset -Eval.bsSubset - -org.openscience.jmol.app ------------------------- - -AtomSetChooser ?? - - - * - */ } Modified: trunk/Jmol/src/org/jmol/modelset/Group.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Group.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/modelset/Group.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -31,6 +31,7 @@ import java.util.Hashtable; import java.util.BitSet; +import java.util.Vector; import javax.vecmath.Point3f; import javax.vecmath.Vector3f; @@ -433,7 +434,6 @@ return false; } - public int getCrossLinkLeadAtomIndex() { - return -1; + public void getCrossLinkLeadAtomIndexes(Vector vReturn) { } } Modified: trunk/Jmol/src/org/jmol/modelsetbio/AminoMonomer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/AminoMonomer.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/modelsetbio/AminoMonomer.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -23,6 +23,8 @@ */ package org.jmol.modelsetbio; +import java.util.Vector; + import javax.vecmath.AxisAngle4f; import javax.vecmath.Matrix3f; import javax.vecmath.Point3f; @@ -335,18 +337,19 @@ return tag; } - public int getCrossLinkLeadAtomIndex() { + public void getCrossLinkLeadAtomIndexes(Vector vReturn) { Atom S = getAtomFromOffsetIndex(SG); if (S != null) { Bond[] bonds = S.getBonds(); for (int i = 0; i < bonds.length; i++) { Atom a = bonds[i].getOtherAtom(S); Group g = a.getGroup(); - if (a.getElementNumber() == 16 && g.getGroup1() == 'C') - return g.getLeadAtomIndex(); + if (a.getElementNumber() == 16 && g.getGroup1() == 'C') { + vReturn.add(new Integer(g.getLeadAtomIndex())); + return; + } } } - return -1; } } Modified: trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -49,8 +49,6 @@ super(chain, group3, seqcode, firstAtomIndex, lastAtomIndex); offsets = interestingAtomOffsets; leadAtomIndex = firstAtomIndex + (offsets[0] & 0xFF); - if (leadAtomIndex == 255) - System.out.println("monomer??"); } int monomerIndex; Modified: trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/modelsetbio/NucleicMonomer.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -24,6 +24,7 @@ */ package org.jmol.modelsetbio; +import java.util.Vector; import javax.vecmath.Point3f; import javax.vecmath.Vector3f; @@ -158,7 +159,7 @@ firstAtomIndex, lastAtomIndex, offsets); if (offsets[NP] == -1 && (offsets[0] = offsets[H5T]) == -1) { offsets[0] = offsets[O5Pr]; - leadAtomIndex = firstAtomIndex + offsets[0]; + leadAtomIndex = firstAtomIndex + (offsets[0] & 0xFF); } this.hasRnaO2Prime = offsets[O2Pr] != -1; this.isPyrimidine = offsets[O2] != -1; @@ -383,7 +384,7 @@ return (myN1.isBonded(otherN3)); } - public int getCrossLinkLeadAtomIndex() { + public void getCrossLinkLeadAtomIndexes(Vector vReturn) { Atom N = (isPurine ? getN1() : getN3()); //System.out.println(N.getInfo()); Bond[] bonds = N.getBonds(); @@ -396,9 +397,8 @@ continue; NucleicMonomer m = (NucleicMonomer) g; if ((isPurine ? m.getN3() : m.getN1()) == N2) - return m.getLeadAtomIndex(); + vReturn.add(new Integer(m.getLeadAtomIndex())); } } - return -1; } } Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -6255,12 +6255,16 @@ int atomCount = viewer.getAtomCount(); int[][] maps = viewer.getSmilesMatcher().getCorrelationMaps(smiles, atoms, atomCount, bsA, isSearch, false); + if (maps == null) + evalError(viewer.getSmilesMatcher().getLastException(), null); if (maps.length == 0) return Float.NaN; for (int i = 0; i < maps[0].length; i++) ptsA.add(atoms[maps[0][i]]); maps = viewer.getSmilesMatcher().getCorrelationMaps(smiles, atoms, atomCount, bsB, isSearch, true); + if (maps == null) + evalError(viewer.getSmilesMatcher().getLastException(), null); if (maps.length == 0) return Float.NaN; float lowestStdDev = Float.MAX_VALUE; @@ -6303,15 +6307,18 @@ return new String[] { "" }; return new BitSet(); } + try { if (pattern.length() == 0) { - return viewer.getSmilesMatcher().getBioSmiles( + Object ret = viewer.getSmilesMatcher().getBioSmiles( viewer.getModelSet().atoms, viewer.getAtomCount(), bsSelected, Viewer.getJmolVersion() + " " + viewer.getModelName(viewer.getCurrentModelIndex())); + if (ret == null) + evalError(viewer.getSmilesMatcher().getLastException(), null); + return ret; } - try { boolean asAtoms = true; BitSet[] b; if (bsMatch3D == null) { @@ -6322,6 +6329,9 @@ bsRequired, bsNot, null, isSearch, isAll); else b = viewer.getSmilesMatcher().find(pattern, smiles, isSearch, isAll); + if (b == null) + evalError(viewer.getSmilesMatcher().getLastException(), null); + } else { Vector vReturn = new Vector(); float stddev = getSmilesCorrelation(bsMatch3D, bsSelected, pattern, @@ -6346,8 +6356,7 @@ matches[j] = Escape.escape(b[j], asAtoms); return matches; } catch (Exception e) { - e.printStackTrace(); - evalError(e.getMessage(), null); + evalError(viewer.getSmilesMatcher().getLastException(), null); return null; // unattainable } } Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -1131,10 +1131,13 @@ String smiles = ScriptVariable.sValue(x1); if (bs2 != null) return false; - if (flags.equalsIgnoreCase("mf")) - return bs2 == null - && addX(isSyntaxCheck ? "" : viewer.getSmilesMatcher() - .getMolecularFormula(smiles, isSearch)); + if (flags.equalsIgnoreCase("mf")) { + String mf = (isSyntaxCheck ? "" : viewer.getSmilesMatcher() + .getMolecularFormula(smiles, isSearch)); + if (mf == null) + eval.evalError(viewer.getSmilesMatcher().getLastException(), null); + return addX(mf); + } ret = eval.getSmilesMatches(flags, smiles, null, null, null, null, isSearch, isAll); } Modified: trunk/Jmol/src/org/jmol/smiles/SmilesAtom.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesAtom.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/smiles/SmilesAtom.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -25,6 +25,7 @@ package org.jmol.smiles; import java.util.BitSet; +import java.util.Vector; import javax.vecmath.Point3f; @@ -618,11 +619,10 @@ return bond.isHydrogen(); } - public int getCrossLinkLeadAtomIndex() { + public void getCrossLinkLeadAtomIndexes(Vector vLinks) { for (int k = 0; k < bonds.length; k++) if (bonds[k].bondType == SmilesBond.TYPE_BIO_PAIR) - return bonds[k].getOtherAtom(this).index; - return -1; + vLinks.add(new Integer(bonds[k].getOtherAtom(this).index)); } public String getGroupType() { Added: trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java (rev 0) +++ trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -0,0 +1,336 @@ +/* $RCSfile$ + * $Author: hansonr $ + * $Date: 2010-06-05 21:50:17 -0500 (Sat, 05 Jun 2010) $ + * $Revision: 13295 $ + * + * Copyright (C) 2005 The Jmol Development Team + * + * Contact: jmo...@li... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jmol.smiles; + +import java.util.BitSet; +import java.util.Vector; +import java.util.Hashtable; +import java.util.Enumeration; + +import org.jmol.api.JmolMolecule; +import org.jmol.api.JmolNode; +import org.jmol.api.JmolEdge; +import org.jmol.util.Elements; +import org.jmol.util.Logger; +import org.jmol.smiles.SmilesSearch.VTemp; + +/** + * public method getBioSmiles returns a Jmol BIOSMILES string + * or, if it is not biological, a SMILES string with comment header. + * Square planar and tetrahedral stereochemistry only, not double-bond stereochemistry. + * + */ +public class SmilesGenerator { + + /* + * see package.html for details + * + * Bob Hanson, Jmol 12.0.RC17 2010.06.5 + * + */ + + // generation of SMILES strings + static String getBioSmiles(JmolNode[] atoms, int atomCount, + BitSet bsSelected, String comment) + throws InvalidSmilesException { + StringBuffer sb = new StringBuffer(); + BitSet bs = (BitSet) bsSelected.clone(); + sb.append("//* Jmol BIOSMILES ").append(comment.replace('*', '_')).append( + " *//"); + Hashtable ht = new Hashtable(); + int[] nPairs = new int[1]; + String end = "\n"; + BitSet bsIgnore = new BitSet(); + String lastComponent = null; + String s; + VTemp v = new VTemp(); + Vector vLinks = new Vector(); + try { + int len = 0; + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + JmolNode a = atoms[i]; + String ch = a.getGroup1('?'); + String groupType = a.getGroupType(); + boolean unknown = (ch.equals("?")); + if (end != null) { + sb.append(end); + end = null; + len = 0; + if (groupType.length() > 0) { + char id = a.getChainID(); + if (id != '\0') { + s = "//* chain " + id + " " + groupType + " *// "; + len = s.length(); + sb.append(s); + } + sb.append("~"); + len++; + } else { + s = getSmilesComponent(atoms, atomCount, a, bs, nPairs, v); + if (s.equals(lastComponent)) { + end = ""; + } else { + lastComponent = s; + sb.append(s); + end = ".\n"; + } + continue; + } + } + if (len >= 75) { + sb.append("\n "); + len = 2; + } + if (unknown) { + sb.append("["); + if (groupType.length() > 0) + sb.append(a.getGroup3(false)).append(".0"); + else + sb.append(Elements.elementNameFromNumber(a.getElementNumber())); + sb.append("]"); + } else { + sb.append(ch); + } + len++; + int i0 = a.getOffsetResidueAtom("0", 0); + a.getCrossLinkLeadAtomIndexes(vLinks); + for (int j = 0; j < vLinks.size(); j++) { + s = getRingCache(ht, i0, ((Integer)vLinks.get(j)).intValue(), nPairs); + sb.append(":").append(s); + len += 1 + s.length(); + } + vLinks.clear(); + int i2 = a.getOffsetResidueAtom("0", 1); + a.setGroupBits(bsIgnore); + bs.andNot(bsIgnore); + if (i2 < 0 || !bs.get(i2)) { + if (i2 < 0 && (i2 = bs.nextSetBit(i + 1)) < 0) + break; + if (len > 0) + end = ".\n"; + } + i = i2 - 1; + } + } catch (Exception e) { + return ""; + } + if (!ht.isEmpty()) { + dumpRingKeys(ht, sb); + throw new InvalidSmilesException("//* ?ring error? *//"); + } + s = sb.toString(); + if (s.endsWith(".\n")) + s = s.substring(0, s.length() - 2); + return s; + } + + /** + * + * creates a valid SMILES string from a model. + * TODO: stereochemistry other than square planar and tetrahedral + * + * @param atoms + * @param atomCount + * @param atom + * @param bs + * @param nPairs + * @param vTemp + * @return SMILES + * @throws InvalidSmilesException + */ + private static String getSmilesComponent(JmolNode[] atoms, int atomCount, + JmolNode atom, BitSet bs, int[] nPairs, + VTemp vTemp) + throws InvalidSmilesException { + + if (atom.getElementNumber() == 1 && atom.getEdges().length > 0) + atom = atoms[atom.getBondedAtomIndex(0)]; // don't start with H + BitSet bs2 = (BitSet) bs.clone(); + BitSet bsAromatic = new BitSet(); + int atomIndex = atom.getIndex(); + bs2 = JmolMolecule.getBranchBitSet(atoms, bs2, atomIndex, -1, true); + bs.andNot(bs2); + for (int j = 0; j < atomCount; j++) + if (bs2.get(j)) { + JmolNode a = atoms[j]; + if (a.getElementNumber() == 1 && a.getIsotopeNumber() == 0) + bs2.clear(j); + } + if (bs2.cardinality() > 2) { + SmilesSearch search = SmilesParser.getMolecule("a", true); + search.jmolAtoms = atoms; + search.bsSelected = bs2; + search.jmolAtomCount = atomCount; + search.setRingData(null); + bsAromatic = search.getBsAromatic(); + } + Hashtable ht = new Hashtable(); + StringBuffer sb1 = new StringBuffer(); + BitSet bs0 = (BitSet) bs2.clone(); + getSmiles(sb1, null, atom, bs0, bs2, ht, nPairs, bsAromatic, vTemp); + while (bs2.cardinality() > 0 && !ht.isEmpty()) { + Enumeration e = ht.keys(); + e.hasMoreElements(); + atomIndex = ((Integer) ((Object[]) ht.get(e.nextElement()))[1]) + .intValue(); + sb1.append("."); + getSmiles(sb1, null, atoms[atomIndex], bs0, bs2, ht, nPairs, bsAromatic, + vTemp); + } + if (!ht.isEmpty()) { + dumpRingKeys(ht, sb1); + throw new InvalidSmilesException("//* ?ring error? *//"); + } + return sb1.toString(); + } + + private static void getSmiles(StringBuffer sb, JmolNode prevAtom, + JmolNode atom, BitSet bs0, BitSet bs, + Hashtable ht, int[] nPairs, BitSet bsAromatic, + VTemp vTemp) { + int atomIndex = atom.getIndex(); + if (!bs.get(atomIndex)) + return; + bs.clear(atomIndex); + int atomicNumber = atom.getElementNumber(); + int nH = 0; + Vector v = new Vector(); + JmolEdge bond0 = null; + JmolEdge bondPrev = null; + int prevIndex = (prevAtom == null ? -1 : prevAtom.getIndex()); + JmolEdge[] bonds = atom.getEdges(); + JmolNode aH = null; + boolean isAromatic = bsAromatic.get(atomIndex); + int stereoFlag = (isAromatic ? 10 : 0); + JmolNode[] stereo = new JmolNode[7]; + if (bonds != null) + for (int i = bonds.length; --i >= 0;) { + JmolEdge bond = bonds[i]; + if (!bond.isCovalent()) + continue; + if (bond.getCovalentOrder() != 1) + stereoFlag = 10; + JmolNode atom1 = bonds[i].getOtherAtom(atom); + int index1 = atom1.getIndex(); + if (atom1.getElementNumber() == 1 && atom1.getIsotopeNumber() == 0) { + aH = atom1; + nH++; + if (nH > 1) + stereoFlag = 10; + } else if (index1 == prevIndex) + bondPrev = bonds[i]; + else if (bs0.get(index1)) + v.add(bonds[i]); + } + // TODO : more stereochemistry + int valence = atom.getValence(); + int charge = atom.getFormalCharge(); + int isotope = atom.getIsotopeNumber(); + if (bondPrev != null) { + sb.append(SmilesBond.getBondOrderString(bondPrev.getOrder())); + if (stereoFlag < 7) + stereo[stereoFlag++] = prevAtom; + } + if (stereoFlag < 7 && nH == 1) + stereo[stereoFlag++] = aH; + int nMax = 0; + StringBuffer sMore = new StringBuffer(); + for (int i = 0; i < v.size(); i++) { + JmolEdge bond = (JmolEdge) v.get(i); + JmolNode a = bond.getOtherAtom(atom); + int n = a.getCovalentBondCount() - a.getCovalentHydrogenCount(); + if (n == 1 && i < v.size() - (bond0 == null ? 1 : 0)) { + StringBuffer s2 = new StringBuffer(); + s2.append("("); + s2.append(SmilesBond.getBondOrderString(bond.getOrder())); + getSmiles(s2, atom, a, bs0, bs, ht, nPairs, bsAromatic, vTemp); + s2.append(")"); + if (sMore.indexOf(s2.toString()) >= 0) + stereoFlag = 10; + sMore.append(s2); + v.removeElementAt(i--); + if (stereoFlag < 7) + stereo[stereoFlag++] = a; + } else if (n > nMax + && !ht.containsKey(getRingKey(a.getIndex(), atomIndex))) { + nMax = n; + bond0 = bond; + } + } + for (int i = v.size(); --i >= 0;) { + JmolEdge bond = (JmolEdge) v.get(i); + if (bond == bond0) + continue; + JmolNode a = bond.getOtherAtom(atom); + String s = getRingCache(ht, atomIndex, a.getIndex(), nPairs); + sMore.append(SmilesBond.getBondOrderString(bond.getOrder())); + sMore.append(s); + if (stereoFlag < 7) + stereo[stereoFlag++] = a; + } + JmolNode a = (bond0 == null ? null : bond0.getOtherAtom(atom)); + if (a != null && stereoFlag < 7) + stereo[stereoFlag++] = a; + String s = (stereoFlag > 6 ? "" : SmilesSearch.getStereoFlag(atom, stereo, + stereoFlag, vTemp)); + sb.append(SmilesAtom.getAtomLabel(atomicNumber, isotope, valence, charge, + nH, isAromatic, s)); + sb.append(sMore); + if (bond0 != null) + getSmiles(sb, atom, a, bs0, bs, ht, nPairs, bsAromatic, vTemp); + } + + private static String getRingKey(int i0, int i1) { + return Math.min(i0, i1) + "_" + Math.max(i0, i1); + } + + private static String getRingCache(Hashtable ht, int i0, int i1, int[] nPairs) { + String key = getRingKey(i0, i1); + Object[] o = (Object[]) ht.get(key); + String s = (o == null ? null : (String) o[0]); + if (s == null) { + ht.put(key, new Object[] { s = SmilesParser.getRingPointer(++nPairs[0]), + new Integer(i1) }); + if (Logger.debugging) + Logger.debug("adding for " + i0 + " ring key " + nPairs[0] + ": " + key); + } else { + ht.remove(key); + if (Logger.debugging) + Logger.debug("using ring key " + key); + } + return s;// + " _" + key + "_ \n"; + } + + private static void dumpRingKeys(Hashtable ht, StringBuffer sb) { + if (Logger.debugging) { + Logger.debug(sb.toString() + "\n\n"); + Enumeration e = ht.keys(); + while (e.hasMoreElements()) { + Logger.debug("unmatched ring key: " + e.nextElement()); + } + } + + } +} Modified: trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -25,7 +25,6 @@ package org.jmol.smiles; import java.util.BitSet; -import java.util.Hashtable; import java.util.Vector; import org.jmol.api.JmolEdge; @@ -113,7 +112,11 @@ } } - private BitSet[] find(String pattern, SmilesSearch search, boolean isSearch, boolean isAll) throws Exception { + public String getLastException() { + return InvalidSmilesException.getLastError(); + } + + private BitSet[] find(String pattern, SmilesSearch search, boolean isSearch, boolean isAll) { // create a topological model set from smiles // do not worry about stereochemistry -- this // will be handled by SmilesSearch.setSmilesCoordinates @@ -237,13 +240,13 @@ * @param isSearch * @param isAll * @return BitSet indicating which atoms match the pattern. - * @throws Exception - * Raised if <code>smiles</code> is not a valid SMILES pattern. */ public BitSet getSubstructureSet(String smiles, JmolNode[] atoms, int atomCount, BitSet bsSelected, boolean isSearch, - boolean isAll) throws Exception { + boolean isAll) { + InvalidSmilesException.setLastError(null); + try { SmilesSearch search = SmilesParser.getMolecule(smiles, isSearch); search.jmolAtoms = atoms; search.bsSelected = bsSelected; @@ -251,6 +254,12 @@ search.setRingData(null); search.isAll = isAll; return (BitSet) search.search(false); + } catch (Exception e) { + if (InvalidSmilesException.getLastError() == null) + InvalidSmilesException.setLastError(e.getMessage()); + e.printStackTrace(); + return null; + } } /** @@ -266,13 +275,13 @@ * @param isSearch * @param isAll * @return BitSet Array indicating which atoms match the pattern. - * @throws Exception Raised if <code>smiles</code> is not a valid SMILES pattern. */ public BitSet[] getSubstructureSetArray(String smiles, JmolNode[] atoms, int atomCount, BitSet bsSelected, BitSet bsRequired, BitSet bsNot, - BitSet bsAromatic, boolean isSearch, boolean isAll) - throws Exception { + BitSet bsAromatic, boolean isSearch, boolean isAll) { + InvalidSmilesException.setLastError(null); + try { SmilesSearch search = SmilesParser.getMolecule(smiles, isSearch); search.jmolAtoms = atoms; search.jmolAtomCount = Math.abs(atomCount); @@ -289,6 +298,12 @@ for (int i = 0; i < bitsets.length; i++) bitsets[i] = (BitSet) vSubstructures.get(i); return bitsets; + } catch (Exception e) { + if (InvalidSmilesException.getLastError() == null) + InvalidSmilesException.setLastError(e.getMessage()); + e.printStackTrace(); + return null; + } } /** @@ -302,12 +317,13 @@ * @param isSearch * @param isAll * @return a set of atom correlations - * @throws Exception * */ public int[][] getCorrelationMaps(String smiles, JmolNode[] atoms, int atomCount, BitSet bsSelected, - boolean isSearch, boolean isAll) throws Exception { + boolean isSearch, boolean isAll) { + InvalidSmilesException.setLastError(null); + try { SmilesSearch search = SmilesParser.getMolecule(smiles, isSearch); search.jmolAtoms = atoms; search.jmolAtomCount = Math.abs(atomCount); @@ -325,84 +341,36 @@ for (int i = 0; i < maps.length; i++) maps[i] = (int[]) vSubstructures.get(i); return maps; + } catch (Exception e) { + if (InvalidSmilesException.getLastError() == null) + InvalidSmilesException.setLastError(e.getMessage()); + e.printStackTrace(); + return null; } + } + public String getMolecularFormula(String pattern, boolean isSearch) { + InvalidSmilesException.setLastError(null); try { SmilesSearch search = SmilesParser.getMolecule(pattern, isSearch); return search.getMolecularFormula(); } catch (InvalidSmilesException e) { + if (InvalidSmilesException.getLastError() == null) + InvalidSmilesException.setLastError(e.getMessage()); return null; } } public String getBioSmiles(JmolNode[] atoms, int atomCount, BitSet bsSelected, String comment) { - StringBuffer sb = new StringBuffer(); - BitSet bs = (BitSet) bsSelected.clone(); - sb.append("//* Jmol BIOSMILES ").append(comment.replace('*','_')).append(" *//"); - Hashtable ht = new Hashtable(); - int[] nPairs = new int[1]; - String end = "\n"; - BitSet bsIgnore = new BitSet(); - String lastComponent = null; - String s; - SmilesSearch.VTemp v = new SmilesSearch.VTemp(); + InvalidSmilesException.setLastError(null); try { - int len = 0; - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { - JmolNode a = atoms[i]; - String ch = a.getGroup1('?'); - String groupType = a.getGroupType(); - boolean unknown = (ch.equals("?")); - if (end != null) { - sb.append(end); - end = null; - len = 0; - if (!unknown) { - char id = a.getChainID(); - if (id != '\0') - sb.append("//* chain ").append(id).append(" ") - .append(groupType).append(" *// "); - sb.append("~"); - } - if (unknown && groupType.length() == 0) { - s = SmilesParser.getSmilesComponent(atoms, atomCount, a, bs, nPairs, v); - if (s.equals(lastComponent)) { - end = ""; - } else { - lastComponent = s; - sb.append(s); - end = ".\n"; - } - continue; - } - } - sb.append(ch); - len++; - int i0 = a.getOffsetResidueAtom("0", 0); - int i1 = a.getCrossLinkLeadAtomIndex(); - if (i1 >= 0) - sb.append(":").append(SmilesParser.getRingCache(ht, i0, i1, nPairs)); - int i2 = a.getOffsetResidueAtom("0", 1); - a.setGroupBits(bsIgnore); - bs.andNot(bsIgnore); - if (i2 < 0 || !bs.get(i2)) { - if (i2 < 0 && (i2 = bs.nextSetBit(i + 1)) < 0) - break; - if (len > 0) - end = ".\n"; - } - i = i2 - 1; - } - } catch (Exception e) { - return ""; + return SmilesGenerator.getBioSmiles(atoms, atomCount, bsSelected, comment); + } catch (InvalidSmilesException e) { + if (InvalidSmilesException.getLastError() == null) + InvalidSmilesException.setLastError(e.getMessage()); + return null; } - if (!ht.isEmpty()) // unmatched rings - return ""; - s = sb.toString(); - if (s.endsWith(".\n")) - s = s.substring(0, s.length() - 2); - return s; } } Modified: trunk/Jmol/src/org/jmol/smiles/SmilesParser.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesParser.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/smiles/SmilesParser.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -24,16 +24,12 @@ package org.jmol.smiles; -import java.util.BitSet; import java.util.Vector; import java.util.Hashtable; -import java.util.Enumeration; -import org.jmol.api.JmolMolecule; -import org.jmol.api.JmolNode; -import org.jmol.api.JmolEdge; import org.jmol.util.Elements; import org.jmol.util.TextFormat; +import org.jmol.util.Logger; /** * Parses a SMILES String to create a <code>SmilesMolecule</code>. @@ -301,8 +297,8 @@ switch (ch) { case '%': // [ringPoint] - if (getChar(pattern, index + 1) == '0') { // %0nnn% - String subPattern = getSubPattern(pattern, index + 1, ch); + if (getChar(pattern, index + 1) == '(') { // %(nnn) + String subPattern = getSubPattern(pattern, index + 1, '('); getDigits(subPattern, 0, ret); index += subPattern.length() + 3; if (ret[0] < 0) @@ -328,12 +324,14 @@ case '[': case '_': String subPattern = getSubPattern(pattern, index, ch); + index += subPattern.length() + (ch == '[' ? 2 : 0); + if (isBioSequence && ch == '[' && subPattern.indexOf(".") < 0) + subPattern += ".0"; currentAtom = parseAtom(molecule, null, subPattern, currentAtom, bond, true, false, isBranchAtom); if (bond.bondType != SmilesBond.TYPE_UNKNOWN && bond.bondType != SmilesBond.TYPE_NONE) bond.set(null, currentAtom); - index += subPattern.length() + (ch == '[' ? 2 : 0); break; default: // [atomType] @@ -474,7 +472,7 @@ int[] ret = new int[1]; - if (isBioSequence) + if (isBioSequence && pattern.length() == 1) pattern += ".0"; char ch = pattern.charAt(0); @@ -802,7 +800,7 @@ newAtom.setChiralClass(stereoClass); newAtom.setChiralOrder(order); if (getChar(pattern, index) == '?') { - System.out.println("Ignoring '?' in stereochemistry"); + Logger.info("Ignoring '?' in stereochemistry"); index++; } return index; @@ -828,7 +826,7 @@ SmilesBond newBond = (bondSet == null ? (bond == null ? new SmilesBond( currentAtom, null, - (isBioSequence ? (isBranchAtom ? SmilesBond.TYPE_BIO_PAIR + (isBioSequence && currentAtom != null ? (isBranchAtom ? SmilesBond.TYPE_BIO_PAIR : SmilesBond.TYPE_BIO_SEQUENCE) : SmilesBond.TYPE_UNKNOWN), false) : bond) : isPrimitive ? bondSet.addPrimitive() : bondSet.addBondOr()); @@ -1003,7 +1001,7 @@ } static String getRingPointer(int i) { - return (i < 10 ? "" + i : i < 100 ? "%" + i : "%0" + i + "%"); + return (i < 10 ? "" + i : i < 100 ? "%" + i : "%(" + i + ")"); } private static String cleanPattern(String pattern, boolean isSmarts) { @@ -1017,160 +1015,4 @@ return pattern; } - // generation of SMILES string - - static String getSmilesComponent(JmolNode[] atoms, int atomCount, - JmolNode atom, BitSet bs, int[] nPairs, - SmilesSearch.VTemp vTemp) - throws InvalidSmilesException { - // clear all bits of bs - - if (atom.getElementNumber() == 1 && atom.getEdges().length > 0) - atom = atoms[atom.getBondedAtomIndex(0)]; // don't start with H - BitSet bs2 = (BitSet) bs.clone(); - BitSet bsAromatic = new BitSet(); - int atomIndex = atom.getIndex(); - bs2 = JmolMolecule.getBranchBitSet(atoms, bs2, atomIndex, -1, true); - bs.andNot(bs2); - for (int j = 0; j < atomCount; j++) - if (bs2.get(j)) { - JmolNode a = atoms[j]; - if (a.getElementNumber() == 1 && a.getIsotopeNumber() == 0) - bs2.clear(j); - } - if (bs2.cardinality() > 2) { - SmilesSearch search = getMolecule("a", true); - search.jmolAtoms = atoms; - search.bsSelected = bs2; - search.jmolAtomCount = atomCount; - search.setRingData(null); - bsAromatic = search.getBsAromatic(); - } - Hashtable ht = new Hashtable(); - StringBuffer sb1 = new StringBuffer(); - BitSet bs0 = (BitSet) bs2.clone(); - getSmiles(sb1, null, atom, bs0, bs2, ht, nPairs, bsAromatic, vTemp); - while (bs2.cardinality() > 0 && !ht.isEmpty()) { - Enumeration e = ht.keys(); - e.hasMoreElements(); - atomIndex = ((Integer) ((Object[]) ht.get(e.nextElement()))[1]) - .intValue(); - sb1.append("."); - getSmiles(sb1, null, atoms[atomIndex], bs0, bs2, ht, nPairs, bsAromatic, - vTemp); - } - return (ht.isEmpty() ? sb1.toString() : "//* ?ring error? *//"); - } - - private static void getSmiles(StringBuffer sb, JmolNode prevAtom, - JmolNode atom, BitSet bs0, BitSet bs, - Hashtable ht, int[] nPairs, BitSet bsAromatic, - SmilesSearch.VTemp vTemp) { - int atomIndex = atom.getIndex(); - if (!bs.get(atomIndex)) - return; - bs.clear(atomIndex); - int atomicNumber = atom.getElementNumber(); - int nH = 0; - Vector v = new Vector(); - JmolEdge bond0 = null; - JmolEdge bondPrev = null; - int prevIndex = (prevAtom == null ? -1 : prevAtom.getIndex()); - JmolEdge[] bonds = atom.getEdges(); - JmolNode aH = null; - boolean isAromatic = bsAromatic.get(atomIndex); - int stereoFlag = (isAromatic ? 10 : 0); - JmolNode[] stereo = new JmolNode[7]; - if (bonds != null) - for (int i = bonds.length; --i >= 0;) { - JmolEdge bond = bonds[i]; - if (!bond.isCovalent()) - continue; - if (bond.getCovalentOrder() != 1) - stereoFlag = 10; - JmolNode atom1 = bonds[i].getOtherAtom(atom); - int index1 = atom1.getIndex(); - if (atom1.getElementNumber() == 1 && atom1.getIsotopeNumber() == 0) { - aH = atom1; - nH++; - if (nH > 1) - stereoFlag = 10; - } else if (index1 == prevIndex) - bondPrev = bonds[i]; - else if (bs0.get(index1)) - v.add(bonds[i]); - } - // TODO : stereochemistry - int valence = atom.getValence(); - int charge = atom.getFormalCharge(); - int isotope = atom.getIsotopeNumber(); - if (bondPrev != null) { - sb.append(SmilesBond.getBondOrderString(bondPrev.getOrder())); - if (stereoFlag < 7) - stereo[stereoFlag++] = prevAtom; - } - if (stereoFlag < 7 && nH == 1) - stereo[stereoFlag++] = aH; - int nMax = 0; - StringBuffer sMore = new StringBuffer(); - for (int i = 0; i < v.size(); i++) { - JmolEdge bond = (JmolEdge) v.get(i); - JmolNode a = bond.getOtherAtom(atom); - int n = a.getCovalentBondCount() - a.getCovalentHydrogenCount(); - if (n == 1 && i < v.size() - 1) { - StringBuffer s2 = new StringBuffer(); - s2.append("("); - s2.append(SmilesBond.getBondOrderString(bond.getOrder())); - getSmiles(s2, atom, a, bs0, bs, ht, nPairs, bsAromatic, vTemp); - s2.append(")"); - if (sMore.indexOf(s2.toString()) >= 0) - stereoFlag = 10; - sMore.append(s2); - v.removeElementAt(i); - if (stereoFlag < 7) - stereo[stereoFlag++] = a; - } else if (n > nMax - && !ht.containsKey(getRingKey(a.getIndex(), atomIndex))) { - nMax = n; - bond0 = bond; - } - } - for (int i = v.size(); --i >= 0;) { - JmolEdge bond = (JmolEdge) v.get(i); - if (bond == bond0) - continue; - JmolNode a = bond.getOtherAtom(atom); - String s = getRingCache(ht, atomIndex, a.getIndex(), nPairs); - sMore.append(SmilesBond.getBondOrderString(bond.getOrder())); - sMore.append(s); - if (stereoFlag < 7) - stereo[stereoFlag++] = a; - } - JmolNode a = (bond0 == null ? null : bond0.getOtherAtom(atom)); - if (a != null && stereoFlag < 7) - stereo[stereoFlag++] = a; - String s = (stereoFlag > 6 ? "" : SmilesSearch.getStereoFlag(atom, stereo, - stereoFlag, vTemp)); - sb.append(SmilesAtom.getAtomLabel(atomicNumber, isotope, valence, charge, - nH, isAromatic, s)); - sb.append(sMore); - if (bond0 != null) - getSmiles(sb, atom, a, bs0, bs, ht, nPairs, bsAromatic, vTemp); - } - - static String getRingKey(int i0, int i1) { - return Math.min(i0, i1) + "_" + Math.max(i0, i1); - } - - static String getRingCache(Hashtable ht, int i0, int i1, int[] nPairs) { - String key = getRingKey(i0, i1); - Object[] o = (Object[]) ht.get(key); - String s = (o == null ? null : (String) o[0]); - if (s == null) - ht.put(key, new Object[] { s = getRingPointer(++nPairs[0]), - new Integer(i1) }); - else - ht.remove(key); - return s;// + " _" + key + "_ \n"; - } } Modified: trunk/Jmol/src/org/jmol/smiles/SmilesSearch.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesSearch.java 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/smiles/SmilesSearch.java 2010-06-06 14:51:26 UTC (rev 13296) @@ -519,21 +519,28 @@ // For sequences, we go to the next GROUP, either via // the standard sequence or via basepair/cysteine pairing. - int nextGroupAtom = -1; switch (patternBond.bondType) { case SmilesBond.TYPE_BIO_SEQUENCE: - nextGroupAtom = atom.getOffsetResidueAtom(patternAtom.atomName, 1); - break; + int nextGroupAtom = atom.getOffsetResidueAtom(patternAtom.atomName, 1); + if (nextGroupAtom >= 0) { + BitSet bs = new BitSet(); + atom1.setGroupBits(bs); + bsFound.or(bs); + if (!checkMatch(patternAtom, atomNum, nextGroupAtom, firstAtomOnly)) + return false; + bsFound.andNot(bs); + return true; + } case SmilesBond.TYPE_BIO_PAIR: - nextGroupAtom = atom.getCrossLinkLeadAtomIndex(); - break; - } - if (nextGroupAtom >= 0) { + Vector vLinks = new Vector(); + atom.getCrossLinkLeadAtomIndexes(vLinks); BitSet bs = new BitSet(); atom1.setGroupBits(bs); bsFound.or(bs); - if (!checkMatch(patternAtom, atomNum, nextGroupAtom, firstAtomOnly)) - return false; + for (int j = 0; j < vLinks.size(); j++) + if (!checkMatch(patternAtom, atomNum, ((Integer) vLinks.get(j)).intValue(), + firstAtomOnly)) + return false; bsFound.andNot(bs); return true; } @@ -1234,6 +1241,7 @@ * @param atom0 * @param atoms * @param nAtoms + * @param v * @return String */ static String getStereoFlag(JmolNode atom0, JmolNode[] atoms, int nAtoms, VTemp v) { Modified: trunk/Jmol/src/org/jmol/smiles/package.html =================================================================== --- trunk/Jmol/src/org/jmol/smiles/package.html 2010-06-06 02:50:17 UTC (rev 13295) +++ trunk/Jmol/src/org/jmol/smiles/package.html 2010-06-06 14:51:26 UTC (rev 13296) @@ -49,9 +49,28 @@ <h3>General Considerations</h3> <p> <b>format</b> -<ul><li> +<ul> +<li> Allows any amount of white space -- spaces, tabs, new lines. Prior to parsing, all white space is removed. -</li></ul> +</li> +<li> +Comments in the form //*....*// are allowed anywhere within the string. The following example illustrates the use of comments and white space for the BIOSMILES representation of 1d66: +<pre> +$ load 1d66.pdb;calculate hbonds +108 hydrogen bonds +$ print {*}.find("SMILES") +//* Jmol BIOSMILES 12.0.RC17_dev 2010-06-05 17:08 1 *// +//* chain D dna *// ~C:1C:2G:3G:4A:5G:6G:7A:8C:9A:%10G:%11T:%12C:%13C:%14T:%15C:%16C:%17G:%18G:%19. +//* chain E dna *// ~C:%19C:%18G:%17G:%16A:%15G:%14G:%13A:%12C:%11T:%10G:9T:8C:7C:6T:5C:4C:3G:2G:1. +//* chain A protein *// ~EQACDICRLKKLKCSKEKPKCAKCLKNNWECRYSPKTKRSPLTRAHLTEVESRLERL. +//* chain B protein *// ~EQACDICRLKKLKCSKEKPKCAKCLKNNWECRYSPKTKRSPLTRAHLTEVESRLERL. +[Cd][Cd]. +[O] +</pre> + +</li> + +</ul> <b>atom selection</b> @@ -63,16 +82,55 @@ atoms. "CCC" is the same as "[C][C][C]". only unbracketed or bracketed hydrogen atoms such as H[C]C or [H] or [2H] are selected; connected hydrogen atoms as in [CH3] are not selected. -</li><li>Adds { } for selection of one or more subsets of matched atoms. - Simply place { } around any atom or group of atoms that are to be - specifically returned from a search: <b>select search("{C}C=O")</b>, for example, returns all alpha carbons. +</li><li>To select one or more atoms within the found pattern, simply enclose the desired atoms in { }: + <b>select search("{C}C=O")</b>, for example, returns all alpha carbons. -</li><li>Adds "BIOATOM" [residueName.atomName] and "+" (sequential residues) for - searching biomolecular structures: <b>select search("[ALA.*]+[PRO.*]")</b>, for example, returns alanine-glycine or alanine-proline sequences. -<b>select search("[ALA.*]+[GLY.*,PRO.*]")</b> returns alanine-glycine or alanine-proline sequences. +</li></ul> +<b>BIOSMILES/BIOSMARTS</b> -</li><li>Or, simpler "BIOSEQUENCE" notation: <b>select search("~AG")</b> or <b>select search("~A[G,P]")</b>. +<ul> +<li>Jmol 12.0 extends SMILES and SMARTS to biomolecules. The extension involves only a few simple additions: +<br /><br /> +<ol> +<li><b>[residueName.atomName]</b> For selecting specific residue atoms. Wild cards are optional: [ALA.*], [*.*], [*.CA]. The special +designation "0" for an atom name, as in <b>[GLY.0]</b>, indicates the "lead atom" -- the alpha carbon for proteins or the phosphorus atom in nucleic acids. +<br /><br /> +</li><li><b>"~"</b> Tilde (~) indicates a "BIOSEQUENCE" string. The string will be +standard single-character group symbol. For example: <b>select search("~AG")</b> or <b>select search("~A[G,P]")</b>. +This search returns only the "lead atom" -- the 1-letter code is a stand-in for [XXX.0]. Groups may +also be indicated in their standard Jmol notation, [XXX]. These may be mixed. So, for example, <b>G[ALA]C</b>. +The BIOSEQUENCE tilde must be repeated for each component in the search (separated by "."). +<br /><br /></li><li><b>"+" and ":" </b> Jmol's extension adds the + and : bond types for sequences. + indicates "connected groups", and ":" indicates "cross-linked groups". +Recognized cross-linking includes hydrogen bonding between the purine N1 and pyrimidine N3 in nucleic acids and cysteine-cysteine disulfide bonds in proteins. +Cross-linking can be "one-to-one" or "one-to-many". (In the future this could be expanded to carbohydrates.) The standard SMILES branching notation can also be used to represent cross-linking: +In normally hybridized DNA, <b>CCC:GGG</b> would be three CG base-pairs (because the two strands are going in opposite direction). +<br /><br /> +</li><li><b>branches and rings</b> Jmol's extension still allows for standard SMILES branching notation using parentheses. Within BIOSEQUENCES, +branching indicates cross-linking. Thus, above CG stretch could be indicated <b>C(G)C(G)C(G)</b>. + +Ring notation can also be used: C1CC(GGG1) ensures that +the hybridization is as a true set of CG pairs. + +In order to allow for more than 99 branches (or base pairs), we extend the ring % notation by enclosing the number in parentheses. +For example, a section of the large ribosomal unit for PDB code 1EEF reads: +<pre> +//* chain 9 rna *// ~UUAG:%(792)G:%(793)C:%(794)G:%(795)G:%(796)C:%(797)CAC + AG:%(798)C:%(799)G:%(800)G:%(801)U:%(802)G:%(803)G:%(804)G:%(805)GUUGCCUC:%(806) + C:%(807)C:%(808)G:%(809)U:%(810)ACCC:%(811)AUCCCG:%(811)AACA:%(810)C:%(809) + G:%(808)G:%(807)AAG:%(806)AU:%(812)AA:%(812)GC:%(805)C:%(804)C:%(803)A:%(802) + C:%(801)C:%(800)AG:%(799)C:%(798)GUUC:%(813)C:%(814)G:%(815)G:%(816)G:%(817) + GAGUAC:%(818)U:%(819)G:%(820)G:%(821)A:%(822)G:%(823)UG:%(824)C:%(825)GCG + AG:%(825)C:%(824)C:%(823)U:%(822)C:%(821)U:%(820)G:%(819)G:%(818)GAAAC:%(817) + C:%(816)C:%(815)G:%(814)G:%(813)UUCG:%(797)C:%(796)C:%(795)G:%(794)C:%(793) + C:%(792)ACC. +</pre> +<br /><br /> +</li></ol> + + </li></ul> + + <b>aromaticity</b> <ul> @@ -148,17 +206,36 @@ <tr><td>@</td><td>stereochemistry</td></tr> </table> <br/> -In addition, Jmol 3D-BIOSMARTS adds the following primitives and options: +In addition, Jmol 3D-SMARTS adds the following primitives and options: <br/> <br/> <table border="1" cellpadding="5" width="500"> <tr><td>d</td><td>non-hydrogen degree -- number of non-hydrogen connections</td></tr> <tr><td>=</td><td>Jmol atom index, for example: [=23]</td></tr> <tr><td>[number]?</td><td>mass number or undefined (so, for example, [C12?] means any carbon that isn't explicitly C13 or C14</td></tr> -<tr><td>[RES.ATOMNAME]</td><td>residue and atom name, for example [ALA.CA] or [*.P]</td></tr> -<tr><td>[RES.ATOMNAME]+[RES.ATOMNAME]</td><td>adjacent residues, for example [ALA.CA][*.CA]</td></tr> </table> <br/> +<br/> +Jmol BIOSMILES adds the following primitives and options: +<br/> +<br/> +<table border="1" cellpadding="5" width="500"> +<tr><td>[RES.ATOMNAME]</td><td>residue and atom name, for example [ALA.CA]. "0" for atomName indicates the "lead" atom.</td></tr> +<tr><td>~...~...</td><td>BIOSEQUENCE using single-letter or [RES] codes.</td></tr> +<tr><td>%(n)</td><td>ring branching where n may be larger than 99.</td></tr> +</table> +<br/> +<br/> +Jmol BIOSMARTS adds the following primitives and options: +<br/> +<br/> +<table border="1" cellpadding="5" width="500"> +<tr><td>[*.ATOMNAME], [RESIDUE.*], [*.*]</td><td>Wildcards for residues and atom names</td></tr> +<tr><td>[RES.ATOMNAME]+[RES.ATOMNAME]</td><td>atoms in adjacent residues, for example [ALA.CA]+[GLY.N]</td></tr> +<tr><td>[RES.ATOMNAME]:[RES.ATOMNAME]</td><td>atoms in cross-linked residues, for example [CYS.CA]:[CYS.CA]</td></tr> +<tr><td>~...~...</td><td>BIOSEQUENCE notation using single-letter or [RES] codes, including logic: <b>select search("~A:[C,T]")</b></td></tr> +</table> +<br/> </li><li>All primitives that are not element names, <b>*</b>, <b>A</b>, or <b>a</b> must be enclosed in brackets. In addition, the following elements must be enclosed in brackets because their two-letter combination Xy implies the non-aromatic element X attached @@ -271,20 +348,20 @@ [stereoClass] == { "AL" | "TH" | "SP" | "TP" | "OH" } [stereoOrder] == [digits] - [ringPointer] == { "%" [digit][digit] | [digit] | "%0" [digits] "%"} + [ringPointer] == { "%" [digit][digit] | [digit] | "%(" [digits] ")"} # note: all ringPointers must have a second matching ringPointer # and must be preceded by an atomExpression for the # first occurance and either an atomExpression or a bond # for the second occurance # note: Jmol BIOSMARTS extends the possible number of rings to > 100 by - # allowing %0n% + # allowing %(n) [bond] == { "-" | "=" | "#" | "." | "/" | "\\" | ":" | NULL # note: Jmol will not match two totally independent molecular pieces. For example, # Jmol will not math [Na+].[Cl-]. However, "." can be used to clarify a # structure that has "ring" bond notation: # CC1CCC.C1CC is a valid structure. - # note: BIOSEQUENCE uses ":" to indicate "base-paired" - default for branches + # note: BIOSEQUENCE uses ":" to indicate "cross-linked", which is the default for branches </pre> </p> @@ -306,7 +383,9 @@ [smarts] == { [biosequence] | [node] [connections] } [biosequence] == "~" [node] [connections] - # note: in a biosequence, "atom types" are standard 1-letter-code group names + # note: In a biosequence, "atom types" are standard 1-letter-code group names + # or bracketed residues [xxx]. The "~" must be the first character + # in a component and must be repeated for each component (separated by ".") [connections] == [connection] | NULL } [connection] == { [branch] | [bondExpression] [node] } [connections] [branch] == "(" { [smarts] | [bondExpression] [smarts] } ")" @@ -387,18 +466,19 @@ # includes implicit H atoms [x_Prop] == { "x" [digits] | "x" } # ring connectivity -- total ring connections - [bioAtom] == [residueName] "." [atomName] + [bioAtom] == { [residueName] "." [atomName] + # note: BIOSEQUENCE (only) also allows just [residueName], an abbreviation for [residueName] ".0" [residueName] == { "*" | [oneDigitGroupName] | [groupName] | null } # note: null same as "*" [oneDigitGroupName] == (see JmolConstants.predefinedGroup1Names) [groupName] == (any PDB residue name) [atomName] == { "*" | "0" | (any atom name) | null } # note: null same as "*"; "0" refers to "lead atom -- CA for proteins, P for nucleic, or O for carbohydrate - [ringPointer] == { "%" [digit][digit] | [digit] } - # note: all ringPointers must have a second matching ringPointer + [ringPointer] == { [digit] | "%" [digit][digit] | "%(" [digits] ")" } + # note: All ringPointers must have a second matching ringPointer # and must be preceded by an atomExpression for the # first occurance and either an atomExpression or a bondExpression - # for the second occurance + # for the second occurance. [bondExpression] == { [bondOrSet] | [bondOrSet] ";" [bondAndSet] } @@ -420,7 +500,7 @@ # note: a BIOSEQUENCE ends with "." or the end of the string. A new BIOSEQUENCE # can continue with "~" immediately following this "." # note: For a SMARTS search, "." indicates the start of a new subset, not necessarily a - # new molecule. + # new component. </pre> </p> @@ -475,7 +555,7 @@ </p> <p> - -- <a href="mailto:ha...@st...">Bob Hanson</a> 5/19/2010 + -- <a href="mailto:ha...@st...">Bob Hanson</a> last updated 6/6/2010 </p> </body> </html> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-06-12 19:45:44
|
Revision: 13351 http://jmol.svn.sourceforge.net/jmol/?rev=13351&view=rev Author: hansonr Date: 2010-06-12 19:45:38 +0000 (Sat, 12 Jun 2010) Log Message: ----------- version=12.0.RC19_dev # bug fix: application -- set modelkitmode does not feedback to buttons Modified Paths: -------------- trunk/Jmol/src/JmolSmilesApplet.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/DisplayPanel.java trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/Properties/Jmol-resources.properties trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/StatusListener.java Modified: trunk/Jmol/src/JmolSmilesApplet.java =================================================================== --- trunk/Jmol/src/JmolSmilesApplet.java 2010-06-12 19:24:46 UTC (rev 13350) +++ trunk/Jmol/src/JmolSmilesApplet.java 2010-06-12 19:45:38 UTC (rev 13351) @@ -77,7 +77,7 @@ int ret = -1; try { SmilesMatcher sm = new SmilesMatcher(); - BitSet[] result = sm.find(pattern, smiles, isSmarts, !isSmarts, !isAll); + BitSet[] result = sm.find(pattern, smiles, isSmarts, !isAll); if (result == null) lastError = InvalidSmilesException.getLastError(); ret = (result == null ? -1 : result.length); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-06-12 19:24:46 UTC (rev 13350) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-06-12 19:45:38 UTC (rev 13351) @@ -3,6 +3,8 @@ version=12.0.RC19_dev +# bug fix: application -- set modelkitmode does not feedback to buttons + # SMILES/SMARTS options summary: # # examples: @@ -102,8 +104,8 @@ # Note that the multiple waters are not duplicated here. # After calculating hydrogen bonds, the # base pairing is included in the BIOSMILES. The -# code for "base pair" is a colon, ":". //* ... *// -# are comment allowed by the specification. +# code for "base pair" is a colon, ":". +# //* ... *// are comment allowed by the specification. # # $ calculate hbonds # 108 hydrogen bonds Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2010-06-12 19:24:46 UTC (rev 13350) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2010-06-12 19:45:38 UTC (rev 13351) @@ -6152,10 +6152,12 @@ setBondPickingOption("p"); if (isSignedApplet || !isApplet) popupMenu(0, 0, 'm'); + statusManager.setCallbackFunction("modelkit", "ON"); } else { setStringProperty("pickingMode", "ident"); setStringProperty("pickingStyle", "toggle"); setBooleanProperty("bondPicking", false); + statusManager.setCallbackFunction("modelkit", "OFF"); } } Modified: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/DisplayPanel.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/DisplayPanel.java 2010-06-12 19:24:46 UTC (rev 13350) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/DisplayPanel.java 2010-06-12 19:45:38 UTC (rev 13351) @@ -91,6 +91,8 @@ } AbstractButton buttonRotate; + AbstractButton buttonModelkit; + ButtonGroup toolbarButtonGroup = new ButtonGroup(); void setRotateMode() { @@ -99,6 +101,12 @@ viewer.setSelectionHalos(false); } + void setModelkitMode() { + if (buttonModelkit != null) + buttonModelkit.setSelected(true); + viewer.setSelectionHalos(false); + } + public void componentHidden(java.awt.event.ComponentEvent e) { //System.out.println("DisplayPanel.componentHidden"); } Modified: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java 2010-06-12 19:24:46 UTC (rev 13350) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java 2010-06-12 19:45:38 UTC (rev 13351) @@ -597,8 +597,11 @@ boolean isToggle = Boolean.valueOf(isToggleString).booleanValue(); if (isToggle) { b = new JToggleButton(ii); - if (key.equals("rotate")) + System.out.println(key); + if (key.equals("rotateScript")) display.buttonRotate = (JToggleButton) b; + if (key.equals("modelkitScript")) + display.buttonModelkit = (JToggleButton) b; display.toolbarButtonGroup.add(b); String isSelectedString = JmolResourceHandler.getStringX(key + "ToggleSelected"); @@ -799,6 +802,13 @@ return menu; } + void setButtonMode(String string) { + if (string.equals("modelkit")) + display.buttonModelkit.setSelected(true); + else if (string.equals("rotate")) + display.buttonRotate.setSelected(true); + } + private static class ActionChangedListener implements PropertyChangeListener { AbstractButton button; @@ -1318,4 +1328,5 @@ viewer.evalStringQuiet(script); } } + } Modified: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/Properties/Jmol-resources.properties =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/Properties/Jmol-resources.properties 2010-06-12 19:24:46 UTC (rev 13350) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/Properties/Jmol-resources.properties 2010-06-12 19:45:38 UTC (rev 13351) @@ -240,8 +240,8 @@ animateAllScriptImage=allFramesButton.png pickScript=set modelkitmode off;select none;selectionHalos on;set pickingstyle drag;set picking select atom rotateScript=set modelkitmode off;selectionHalos off;set pickingstyle toggle;set picking identify -pickMeasureScript=set modelkitmode off;set picking measure distance;set pickingstyle measure #showMeasurementTable -modelkitScript=set modelkitmode; +pickMeasureScript=set modelkitmode off;selectionHalos off;set picking measure distance;set pickingstyle measure #showMeasurementTable +modelkitScript=set modelkitmode;selectionHalos off; # # AtomSetChooser Modified: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/StatusListener.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/StatusListener.java 2010-06-12 19:24:46 UTC (rev 13350) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/StatusListener.java 2010-06-12 19:45:38 UTC (rev 13351) @@ -158,6 +158,10 @@ } public void setCallbackFunction(String callbackType, String callbackFunction) { + if (callbackType.equals("modelkit")) { + jmol.setButtonMode(callbackFunction.equals("ON") ? "modelkit" : "rotate"); + return; + } if (callbackType.equalsIgnoreCase("menu")) { jmol.setupNewFrame(viewer.getStateInfo()); return; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2010-07-31 14:45:57
|
Revision: 13800 http://jmol.svn.sourceforge.net/jmol/?rev=13800&view=rev Author: nicove Date: 2010-07-31 14:45:51 +0000 (Sat, 31 Jul 2010) Log Message: ----------- Java 1.5 : Generics Modified Paths: -------------- trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/SlaterReader.java Modified: trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java =================================================================== --- trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java 2010-07-31 14:36:26 UTC (rev 13799) +++ trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java 2010-07-31 14:45:51 UTC (rev 13800) @@ -35,8 +35,8 @@ */ public class JmolTouchSimulator implements JmolTouchSimulatorInterface { - private TreeSet _events = new TreeSet(new TouchDataComparator()); - protected HashMap _active = new HashMap(); + private TreeSet<TouchData> _events = new TreeSet<TouchData>(new TouchDataComparator()); + protected HashMap<Integer, TouchData> _active = new HashMap<Integer, TouchData>(); private boolean _recording = false; private int _touchID = 0; private long _when = 0; @@ -164,9 +164,9 @@ } private void dispatchTouchEvents() { - Iterator it = _events.iterator(); + Iterator<TouchData> it = _events.iterator(); while (it.hasNext()) { - TouchData e = (TouchData) it.next(); + TouchData e = it.next(); TouchTimerTask task = new TouchTimerTask(e); _timer.schedule(task, e.delay + 250); } @@ -214,11 +214,9 @@ public long delay; } - protected class TouchDataComparator implements Comparator { + protected class TouchDataComparator implements Comparator<TouchData> { - public int compare(Object oo1, Object oo2) { - TouchData o1 = (TouchData) oo1; - TouchData o2 = (TouchData) oo2; + public int compare(TouchData o1, TouchData o2) { return (o1.delay == o2.delay ? (o1.when < o2.when ? -1 : 1) : o1.delay < o2.delay ? -1 : 1); } @@ -236,7 +234,7 @@ public void run() { Thread.currentThread().setName("JmolTouchSimulator for type " + e.id); dispatchTouchEvent(e); - Integer iid = new Integer(e.id); + Integer iid = Integer.valueOf(e.id); if(e.type == TouchState.DEATH) { _active.remove(iid); } else { Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/SlaterReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/SlaterReader.java 2010-07-31 14:36:26 UTC (rev 13799) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/SlaterReader.java 2010-07-31 14:45:51 UTC (rev 13800) @@ -113,10 +113,8 @@ atomSetCollection.setAtomSetAuxiliaryInfo("moData", moData); } - class SlaterSorter implements Comparator { - public int compare(Object a, Object b) { - SlaterData sd1 = (SlaterData) a; - SlaterData sd2 = (SlaterData) b; + class SlaterSorter implements Comparator<SlaterData> { + public int compare(SlaterData sd1, SlaterData sd2) { return ( sd1.iAtom < sd2.iAtom ? -1 : sd1.iAtom > sd2.iAtom ? 1 : 0); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-06 18:36:20
|
Revision: 13857 http://jmol.svn.sourceforge.net/jmol/?rev=13857&view=rev Author: hansonr Date: 2010-08-06 18:36:13 +0000 (Fri, 06 Aug 2010) Log Message: ----------- sparshui Java 1.5 upgrade Modified Paths: -------------- trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java trunk/Jmol/src/com/sparshui/client/SparshClient.java trunk/Jmol/src/com/sparshui/common/messages/events/FlickEvent.java trunk/Jmol/src/com/sparshui/common/utils/Converter.java trunk/Jmol/src/com/sparshui/gestures/Gesture.java trunk/Jmol/src/com/sparshui/gestures/GestureType.java trunk/Jmol/src/com/sparshui/server/ClientConnection.java trunk/Jmol/src/com/sparshui/server/GestureFactory.java trunk/Jmol/src/com/sparshui/server/GestureServer.java trunk/Jmol/src/com/sparshui/server/Group.java trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClient.java trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java Modified: trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java =================================================================== --- trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -9,6 +9,7 @@ import com.sparshui.common.Location; import com.sparshui.common.messages.events.*; import com.sparshui.common.utils.Converter; +import com.sparshui.gestures.GestureType; /** * ClientToServerProtocol implements the Client side protocol. It is the @@ -179,26 +180,27 @@ */ private void handleGetAllowedGestures(SparshClient client, byte[] data) throws IOException { - List gestureIDs = client.getAllowedGestures(Converter.byteArrayToInt(data)); - int length = (gestureIDs == null ? 0 : gestureIDs.size()); + GestureType gType; + List<GestureType> gestureTypes = client.getAllowedGestures(Converter.byteArrayToInt(data)); + int length = (gestureTypes == null ? 0 : gestureTypes.size()); int blen = length * 4; for (int i = 0; i < length; i++) { - Object gid = gestureIDs.get(i); - if (gid instanceof String) - blen += ((String) gid).length(); + gType = gestureTypes.get(i); + if (gType.sType != null) + blen += gType.sType.length(); } _out.writeInt(blen); // Write the gesture IDs for (int i = 0; i < length; i++) { - Object gid = gestureIDs.get(i); - if (gid instanceof Integer) { - _out.writeInt(((Integer) gid).intValue()); - } else if (gid instanceof String) { - int len = ((String) gid).length(); + gType = gestureTypes.get(i); + if (gType.sType == null) { + _out.writeInt(gType.iType); + } else { + int len = gType.sType.length(); if (len > 0) { _out.writeInt(-len); - _out.write(Converter.stringToByteArray((String) gid)); + _out.write(Converter.stringToByteArray(gType.sType)); } } } Modified: trunk/Jmol/src/com/sparshui/client/SparshClient.java =================================================================== --- trunk/Jmol/src/com/sparshui/client/SparshClient.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/client/SparshClient.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -4,6 +4,7 @@ import com.sparshui.common.Event; import com.sparshui.common.Location; +import com.sparshui.gestures.GestureType; /** * The Client interface must be implemented in all clients wishing @@ -43,7 +44,7 @@ * @return * A list of allowed Gesture IDs */ - public List getAllowedGestures(int groupID); + public List<GestureType> getAllowedGestures(int groupID); /** * This method processes events from the Gesture Server. It Modified: trunk/Jmol/src/com/sparshui/common/messages/events/FlickEvent.java =================================================================== --- trunk/Jmol/src/com/sparshui/common/messages/events/FlickEvent.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/common/messages/events/FlickEvent.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -27,15 +27,20 @@ speedLevel = 0; } + /** + * + * @param absx + * @param absy + */ public FlickEvent(float absx, float absy) { // _absx = absx; // _absy = absy; } public FlickEvent(int _speedLevel, int _xDirection, int _yDirection){ - speedLevel =(float) _speedLevel; - xDirection =(float) _xDirection; - yDirection =(float) _yDirection; + speedLevel = _speedLevel; + xDirection = _xDirection; + yDirection = _yDirection; } Modified: trunk/Jmol/src/com/sparshui/common/utils/Converter.java =================================================================== --- trunk/Jmol/src/com/sparshui/common/utils/Converter.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/common/utils/Converter.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -72,7 +72,7 @@ public static long byteArrayToLong(byte[] data, int i) { return (((long) byteArrayToInt(data, i)) << 32) - | ((long) byteArrayToInt(data, i + 4)) & 0xFFFFFFFFL; + | byteArrayToInt(data, i + 4) & 0xFFFFFFFFL; } public static String byteArrayToString(byte[] bytes) { Modified: trunk/Jmol/src/com/sparshui/gestures/Gesture.java =================================================================== --- trunk/Jmol/src/com/sparshui/gestures/Gesture.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/gestures/Gesture.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -1,7 +1,8 @@ package com.sparshui.gestures; -import java.util.Vector; +import java.util.List; +import com.sparshui.common.Event; import com.sparshui.server.TouchPoint; /** @@ -20,10 +21,10 @@ * @param changedTouchPoint * The touch point that has changed. * @return - * A vector of events that will be delivered to the client. + * An ArrayList of events that will be delivered to the client. * */ - public abstract Vector processChange(Vector touchPoints, + public abstract List<Event> processChange(List<TouchPoint> touchPoints, TouchPoint changedTouchPoint); /** Modified: trunk/Jmol/src/com/sparshui/gestures/GestureType.java =================================================================== --- trunk/Jmol/src/com/sparshui/gestures/GestureType.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/gestures/GestureType.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -7,11 +7,25 @@ * this enum value to a 4-byte network-ordered integer before attempting * to transmit this value over the network. * + * Adapted by Bob Hanson as an implementable class + * * @author Jay Roltgen * */ public class GestureType { + public String sType = null; + public int iType = Integer.MAX_VALUE; + public GestureType(String type) { + // class name, such as "org.jmol.multitouch.sparshui.TwoPointGesture" + sType = type; + } + + public GestureType(int type) { + // built-in SparshUI gestures; not implemented for Jmol + iType = type; + } + public final static int DRAG_GESTURE = 0; public final static int MULTI_POINT_DRAG_GESTURE = 1; public final static int ROTATE_GESTURE = 2; Modified: trunk/Jmol/src/com/sparshui/server/ClientConnection.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/ClientConnection.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/server/ClientConnection.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -3,8 +3,10 @@ import java.io.IOException; import java.net.Socket; import java.util.HashMap; -import java.util.Vector; +import java.util.List; +import com.sparshui.gestures.GestureType; + /** * Represents a network connection to a client. * @@ -21,7 +23,7 @@ /** * */ - private HashMap _groups; + private HashMap<Integer, Group> _groups; /** * Instantiate the connection on the specified socket. @@ -33,7 +35,7 @@ */ ClientConnection(Socket socket) throws IOException { _protocol = new ServerToClientProtocol(socket); - _groups = new HashMap(); + _groups = new HashMap<Integer, Group>(); } /** @@ -53,7 +55,7 @@ switch (jmolFlags) { case 0x10000000: // reset flag - _groups = new HashMap(); + _groups = new HashMap<Integer, Group>(); break; } groupID &= ~jmolFlags; @@ -78,7 +80,7 @@ * @return Vector * @throws IOException */ - private Vector getGestures(int groupID) throws IOException { + private List<GestureType> getGestures(int groupID) throws IOException { return _protocol.getGestures(groupID); } @@ -104,15 +106,15 @@ Group group = null; Integer gid = new Integer(groupID); if (_groups.containsKey(gid)) { - group = (Group) _groups.get(gid); + group = _groups.get(gid); } else { // This is a new group, so get its allowed gestures and construct // System.out.println("[ClientConnection] Getting Group Gestures ID: // " + groupID); // gestureID may be a string indicating a user-defined class to load. - Vector gestureIDs = getGestures(groupID); - group = new Group(groupID, gestureIDs, _protocol); + List<GestureType> gestureTypes = getGestures(groupID); + group = new Group(groupID, gestureTypes, _protocol); _groups.put(gid, group); } Modified: trunk/Jmol/src/com/sparshui/server/GestureFactory.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureFactory.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/server/GestureFactory.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -3,6 +3,7 @@ import org.jmol.util.Logger; import com.sparshui.gestures.Gesture; +import com.sparshui.gestures.GestureType; //import com.sparshui.gestures.Flick; //import com.sparshui.gestures.GestureType; @@ -24,23 +25,21 @@ * * adapted by Bob Hanson for Jmol 11/29/2009 * - * @param gid an Integer or String + * @param gType a GestureType (iType or sType) * * @return A new Gesture of type gestureID */ - static Gesture createGesture(Object gid) { - if (gid instanceof String) { - String name = (String) gid; + static Gesture createGesture(GestureType gType) { + if (gType.sType != null) { try { - return (Gesture) Class.forName(name).newInstance(); + return (Gesture) Class.forName(gType.sType).newInstance(); } catch (Exception e) { - Logger.error("[GestureFactory] Error creating instance for " + name + ": \n" + e.getMessage()); - return null; + Logger.error("[GestureFactory] Error creating instance for " + gType.sType + ": \n" + e.getMessage()); } + return null; } - int gestureID = ((Integer) gid).intValue(); /* unused in Jmol - switch (gestureID) { + switch (gType.iType) { case GestureType.DRAG_GESTURE: return new SinglePointDragGesture(); case GestureType.MULTI_POINT_DRAG_GESTURE: @@ -61,8 +60,8 @@ return new RelativeDragGesture(); } */ - Logger.error("[GestureFactory] Gesture not recognized: " + gestureID); - return null; + Logger.error("[GestureFactory] Gesture not recognized: " + gType.iType); + return null; } } Modified: trunk/Jmol/src/com/sparshui/server/GestureServer.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureServer.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/server/GestureServer.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -3,8 +3,8 @@ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; -import java.util.HashMap; -import java.util.Vector; +import java.util.ArrayList; +import java.util.Hashtable; import org.jmol.api.JmolGestureServerInterface; import org.jmol.util.Logger; @@ -31,7 +31,7 @@ ServerSocket _clientSocket; ServerSocket _deviceSocket; ServerSocket _mySocket; - private Vector _clients = new Vector(); + private ArrayList<ClientConnection> _clients = new ArrayList<ClientConnection>(); private int port; InputDeviceConnection ic = null; @@ -219,7 +219,7 @@ * @param state * @return whether a client has claimed this touchPoint; */ - boolean processTouchPoint(HashMap inputDeviceTouchPoints, int id, + boolean processTouchPoint(Hashtable<Integer, TouchPoint> inputDeviceTouchPoints, int id, Location location, long time, int state) { if (Logger.debugging) { Logger.info("[GestureServer] processTouchPoint id=" + id + " state=" + state + " " + location @@ -227,7 +227,7 @@ } Integer iid = new Integer(id); if (inputDeviceTouchPoints.containsKey(iid)) { - TouchPoint touchPoint = (TouchPoint) inputDeviceTouchPoints.get(iid); + TouchPoint touchPoint = inputDeviceTouchPoints.get(iid); if (!touchPoint.isClaimed()) return false; Logger.debug("[GestureServer] OK"); @@ -251,10 +251,10 @@ * */ private boolean processBirth(TouchPoint touchPoint) { - Vector clients_to_remove = null; + ArrayList<ClientConnection> clients_to_remove = null; boolean isClaimed = false; for (int i = 0; i < main._clients.size(); i++) { - ClientConnection client = (ClientConnection) main._clients.get(i); + ClientConnection client = main._clients.get(i); // Return if the client claims the touch point try { if (touchPoint == null) @@ -268,13 +268,13 @@ // with the client. In this case, we will want // to remove the client. if (clients_to_remove == null) - clients_to_remove = new Vector(); + clients_to_remove = new ArrayList<ClientConnection>(); clients_to_remove.add(client); } } if (clients_to_remove != null) for (int i = 0; i < clients_to_remove.size(); i++) { - main._clients.remove(clients_to_remove.elementAt(i)); + main._clients.remove(clients_to_remove.get(i)); Logger.info("[GestureServer] Client Disconnected"); } return isClaimed; Modified: trunk/Jmol/src/com/sparshui/server/Group.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/Group.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/server/Group.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -1,10 +1,13 @@ package com.sparshui.server; import java.io.IOException; -import java.util.Vector; +import java.util.ArrayList; +import java.util.List; +import com.sparshui.common.Event; import com.sparshui.common.TouchState; import com.sparshui.gestures.Gesture; +import com.sparshui.gestures.GestureType; /** * Represents a group of touch points @@ -16,9 +19,9 @@ public class Group { private int _id; - private Vector _gestureIDs; - private Vector _gestures; - private Vector _touchPoints; + private List<GestureType> _gestureTypes; + private ArrayList<Gesture> _gestures; + private ArrayList<TouchPoint> _touchPoints; private ServerToClientProtocol _clientProtocol; /** @@ -27,21 +30,21 @@ * with one client only. * @param id * - * @param gestureIDs - * The list of gesture IDs or String class names + * @param gestureTypes + * The list of gesture types (integer or String class name) * that this group should process. * @param clientProtocol * Represents the connection to the client. */ - public Group(int id, Vector gestureIDs, + public Group(int id, List<GestureType> gestureTypes, ServerToClientProtocol clientProtocol) { _id = id; - _gestureIDs = gestureIDs; - _gestures = new Vector(); - _touchPoints = new Vector(); + _gestureTypes = gestureTypes; + _gestures = new ArrayList<Gesture>(); + _touchPoints = new ArrayList<TouchPoint>(); _clientProtocol = clientProtocol; - for (int i = 0; i < _gestureIDs.size(); i++) { - Gesture gesture = GestureFactory.createGesture(_gestureIDs.get(i)); + for (int i = 0; i < _gestureTypes.size(); i++) { + Gesture gesture = GestureFactory.createGesture(_gestureTypes.get(i)); if (gesture != null) _gestures.add(gesture); } @@ -63,7 +66,7 @@ * The changed touch point. */ public synchronized void update(TouchPoint changedPoint) { - Vector events = new Vector(); + ArrayList<Event> events = new ArrayList<Event>(); int state = changedPoint.getState(); @@ -78,7 +81,7 @@ System.out.println(); */ - Vector clonedPoints = null; + ArrayList<TouchPoint> clonedPoints = null; /* * // until this is implemented somewhere, why go to the trouble? -- BH * @@ -88,7 +91,7 @@ * clonedPoints.add(clonedPoint); } } */ for (int i = 0; i < _gestures.size(); i++) { - Gesture gesture = (Gesture) _gestures.get(i); + Gesture gesture = _gestures.get(i); // System.out.println(_gestures.size()); // System.out.println("Gesture allowed: " + gesture.getName()); events.addAll(gesture.processChange(clonedPoints == null ? _touchPoints Modified: trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -4,8 +4,8 @@ //import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; -import java.util.HashMap; -import java.util.Vector; +import java.util.ArrayList; +import java.util.Hashtable; import com.sparshui.common.Location; import com.sparshui.common.NetworkConfiguration; @@ -39,9 +39,9 @@ /** * */ - private HashMap _touchPoints; + private Hashtable<Integer, TouchPoint> _touchPoints; - private Vector _flaggedids; + private ArrayList<Integer> _flaggedids; /** * Create a new input device connection with the given @@ -58,8 +58,8 @@ _socket = socket; _in = new DataInputStream(socket.getInputStream()); //_out = new DataOutputStream(socket.getOutputStream()); - _touchPoints = new HashMap(); - _flaggedids = new Vector(); + _touchPoints = new Hashtable<Integer, TouchPoint>(); + _flaggedids = new ArrayList<Integer>(); startListening(); } @@ -68,7 +68,7 @@ */ private void removeDeadTouchPoints() { for (int i = 0; i < _flaggedids.size(); i++) { - Integer id = (Integer)_flaggedids.get(i); + Integer id = _flaggedids.get(i); _touchPoints.remove(id); } _flaggedids.clear(); @@ -141,7 +141,7 @@ int id = _in.readInt(); float x = _in.readFloat(); float y = _in.readFloat(); - int state = (int) _in.readByte(); + int state = _in.readByte(); long time = (len >= 21 ? _in.readLong() : System.currentTimeMillis()); if (len > 21) _in.read(new byte[len - 21]); Modified: trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -4,11 +4,13 @@ import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; -import java.util.Vector; +import java.util.ArrayList; +import java.util.List; import com.sparshui.common.ClientProtocol; import com.sparshui.common.Event; import com.sparshui.common.utils.Converter; +import com.sparshui.gestures.GestureType; /** * Represents the server to client connection. @@ -47,8 +49,8 @@ * @throws IOException * If an error occurs while communication with the client. */ - public Vector getGestures(int groupID) throws IOException { - Vector gestures = new Vector(); + public List<GestureType> getGestures(int groupID) throws IOException { + ArrayList<GestureType> gestures = new ArrayList<GestureType>(); _bufferOut.writeInt(groupID); sendBuffer(MessageType.GET_ALLOWED_GESTURES); @@ -58,10 +60,10 @@ // this is a string descriptor for a class byte[] bytes = new byte[-gestureID]; _in.read(bytes); - gestures.add(Converter.byteArrayToString(bytes)); + gestures.add(new GestureType(Converter.byteArrayToString(bytes))); length -= bytes.length; } else { - gestures.add(new Integer(gestureID)); + gestures.add(new GestureType(gestureID)); } } return gestures; @@ -106,10 +108,10 @@ * @throws IOException * If there is a communication error. */ - public void processEvents(int groupID, Vector events) throws IOException { + public void processEvents(int groupID, ArrayList<Event> events) throws IOException { for (int i = 0; i < events.size(); i++) { _bufferOut.writeInt(groupID); - _bufferOut.write(((Event) events.get(i)).serialize()); + _bufferOut.write(events.get(i).serialize()); sendBuffer(MessageType.EVENT); } } Modified: trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -23,8 +23,8 @@ */ package org.jmol.multitouch; +import java.util.ArrayList; import java.util.List; -import java.util.Vector; import javax.vecmath.Point3f; @@ -35,6 +35,8 @@ import org.jmol.viewer.Viewer; import org.jmol.viewer.binding.Binding; +import com.sparshui.gestures.GestureType; + public class ActionManagerMT extends ActionManager implements JmolMultiTouchClient { ///////////// sparshUI multi-touch client interaction //////////////// @@ -141,10 +143,11 @@ // adaptation to allow user-defined gesture types - private final static String TWO_POINT_GESTURE = "org.jmol.multitouch.sparshui.TwoPointGesture"; - private final static String SINGLE_POINT_GESTURE = "org.jmol.multitouch.sparshui.SinglePointGesture"; + private final static GestureType TWO_POINT_GESTURE = new GestureType("org.jmol.multitouch.sparshui.TwoPointGesture"); + private final static GestureType SINGLE_POINT_GESTURE = new GestureType("org.jmol.multitouch.sparshui.SinglePointGesture"); - //these must match those in com.sparshui.common.messages.events.EventType + // these must match those in com.sparshui.common.messages.events.EventType + // and would have to be implemented in com.sparshui.server.GestureFactory // reproduced here so there are no references to that code in applet module public static final int DRIVER_NONE = -2; @@ -180,11 +183,11 @@ } } - public List getAllowedGestures(int groupID) { + public List<GestureType> getAllowedGestures(int groupID) { //System.out.println("ActionManagerMT getAllowedGestures " + groupID); if (groupID != this.groupID || !viewer.allowMultiTouch()) return null; - Vector list = new Vector(); + ArrayList<GestureType> list = new ArrayList<GestureType>(); //list.add(new Integer(DRAG_GESTURE)); //list.add(new Integer(MULTI_POINT_DRAG_GESTURE)); //list.add(new Integer(SPIN_GESTURE)); Modified: trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClient.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClient.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClient.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -28,6 +28,8 @@ import javax.vecmath.Point3f; +import com.sparshui.gestures.GestureType; + public interface JmolMultiTouchClient { /* @@ -39,7 +41,7 @@ * */ public int getGroupID(int x, int y); - public List getAllowedGestures(int groupID); + public List<GestureType> getAllowedGestures(int groupID); public void processEvent(int groupID, int eventType, int touchID, int iData, Point3f pt, long time); } Modified: trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/org/jmol/multitouch/jni/JmolJniClientAdapter.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -23,13 +23,11 @@ */ package org.jmol.multitouch.jni; -import org.jmol.multitouch.JmolMultiTouchAdapter; import org.jmol.multitouch.JmolMultiTouchClient; import org.jmol.multitouch.JmolMultiTouchClientAdapter; import org.jmol.viewer.Viewer; -public class JmolJniClientAdapter extends JmolMultiTouchClientAdapter implements - JmolMultiTouchAdapter { +public class JmolJniClientAdapter extends JmolMultiTouchClientAdapter { // not implemented. A stub only for a potential Java Native Interface. // not currently in applet.classes Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -45,6 +45,7 @@ import com.sparshui.common.messages.events.RotateEvent; import com.sparshui.common.messages.events.TouchEvent; import com.sparshui.common.messages.events.ZoomEvent; +import com.sparshui.gestures.GestureType; public class JmolSparshClientAdapter extends JmolMultiTouchClientAdapter implements SparshClient { @@ -155,7 +156,7 @@ // methods the Sparsh server needs -- from com.sparshui.client.ClientToServerProtocol - public List getAllowedGestures(int groupID) { + public List<GestureType> getAllowedGestures(int groupID) { return (actionManager == null ? null : actionManager.getAllowedGestures(groupID)); } Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -1,9 +1,10 @@ package org.jmol.multitouch.sparshui; -import java.util.Vector; - +import java.util.ArrayList; +import java.util.List; import org.jmol.util.Logger; +import com.sparshui.common.Event; import com.sparshui.common.TouchState; import com.sparshui.common.messages.events.TouchEvent; import com.sparshui.gestures.Gesture; @@ -44,8 +45,9 @@ * */ // @override - public Vector processChange(Vector touchPoints, TouchPoint changedTouchPoint) { - Vector retEvents = new Vector(); + + public List<Event> processChange(List<TouchPoint> touchPoints, TouchPoint changedTouchPoint) { + ArrayList<Event> retEvents = new ArrayList<Event>(); int nPoints = touchPoints.size(); if (Logger.debugging) { Logger.info("\nSinglePointGesture " + _myId + " nPoints: " + nPoints); @@ -97,7 +99,7 @@ return retEvents; } - private boolean checkClick(TouchPoint tpNew, Vector retEvents, boolean isDeath) { + private boolean checkClick(TouchPoint tpNew, ArrayList<Event> retEvents, boolean isDeath) { TouchPoint tp; long dt = tpNew.getTime() - _birth.getTime(); boolean isSingleClick = (isDeath && dt < MAXIMUM_CLICK_TIME); @@ -122,4 +124,5 @@ retEvents.add(new TouchEvent(tp)); return true; } + } Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java 2010-08-06 18:21:05 UTC (rev 13856) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java 2010-08-06 18:36:13 UTC (rev 13857) @@ -1,6 +1,7 @@ package org.jmol.multitouch.sparshui; -import java.util.Vector; +import java.util.ArrayList; +import java.util.List; import javax.vecmath.Vector3f; @@ -60,8 +61,8 @@ protected Location _offset = null; protected Location _offsetCentroid = null; - private Vector _traces1 = new Vector(); - private Vector _traces2 = new Vector(); + private ArrayList<Location> _traces1 = new ArrayList<Location>(); + private ArrayList<Location> _traces2 = new ArrayList<Location>(); private int _id1 = -1; private int _id2 = -1; private int _nTraces = 0; @@ -82,13 +83,13 @@ } //@override - public Vector processChange(Vector touchPoints, + public List<Event> processChange(List<TouchPoint> touchPoints, TouchPoint changedPoint) { - return processChangeSync(touchPoints, changedPoint); + return processChangeSync(changedPoint); } - private synchronized Vector processChangeSync(Vector touchPoints, - TouchPoint changedPoint) { - Vector events = null; + + private synchronized List<Event> processChangeSync(TouchPoint changedPoint) { + List<Event> events = null; time = changedPoint.getTime(); switch(changedPoint.getState()) { case TouchState.BIRTH: @@ -101,11 +102,11 @@ events = processDeath(changedPoint); break; } - return (events != null) ? events : new Vector(); + return (events != null) ? events : new ArrayList<Event>(); } // @override - protected Vector processBirth(TouchPoint touchPoint) { + protected List<Event> processBirth(TouchPoint touchPoint) { Location location = touchPoint.getLocation(); int id = touchPoint.getID(); switch (_nTraces) { @@ -119,7 +120,7 @@ _traces2.clear(); _traces2.add(Location.pixelLocation(location)); _id2 = id; - Object o = _traces1.lastElement(); + Location o = _traces1.get(_traces1.size() - 1); _traces1.clear(); _traces1.add(o); _nTraces = 2; @@ -131,7 +132,7 @@ } // @override - protected Vector processDeath(TouchPoint touchPoint) { + protected List<Event> processDeath(TouchPoint touchPoint) { int id = touchPoint.getID(); switch (_nTraces) { case 0: @@ -143,7 +144,7 @@ case 2: if (id == _id1) { _id1 = _id2; - Vector v = _traces1; + ArrayList<Location> v = _traces1; _traces1 = _traces2; _traces2 = v; _traces2.clear(); @@ -171,9 +172,9 @@ } // @override - protected Vector processMove(TouchPoint touchPoint) { + protected ArrayList<Event> processMove(TouchPoint touchPoint) { //System.out.println("TwoPointGesture move type:" + _myType + " ntraces:" + _nTraces + " ids:" + _id1+","+_id2+ " id:" + touchPoint.getID() + " sizes: " + _traces1.size() + " " + _traces2.size()); - Vector events = new Vector(); + ArrayList<Event> events = new ArrayList<Event>(); if (!updateLocations(touchPoint)) return events; if (_myType == ActionManagerMT.INVALID_GESTURE) @@ -210,14 +211,14 @@ if (id == _id1) { if (_traces1.size() > 2) { while (_traces1.size() > 2) { - _traces1.removeElementAt(0); + _traces1.remove(0); } } _traces1.add(location); } else if (id == _id2) { if (_traces2.size() > 2) { while (_traces2.size() > 2) { - _traces2.removeElementAt(0); + _traces2.remove(0); } } _traces2.add(location); @@ -229,12 +230,12 @@ } private void checkType() { - Location loc10 = (Location) _traces1.firstElement(); - Location loc11 = (Location) _traces1.lastElement(); + Location loc10 = _traces1.get(0); + Location loc11 = _traces1.get(_traces1.size() - 1); Vector3f v1 = loc10.getVector(loc11); float d1 = v1.length(); - Location loc20 = (Location) _traces2.firstElement(); - Location loc21 = (Location) _traces2.lastElement(); + Location loc20 = _traces2.get(0); + Location loc21 = _traces2.get(_traces2.size() - 1); Vector3f v2 = loc20.getVector(loc21); float d2 = v2.length(); // rooted finger --> zoom (at this position, perhaps?) @@ -263,10 +264,10 @@ } private boolean updateParameters() { - Location loc10 = (Location) _traces1.firstElement(); - Location loc20 = (Location) _traces2.firstElement(); - Location loc11 = (Location) _traces1.lastElement(); - Location loc21 = (Location) _traces2.lastElement(); + Location loc10 = _traces1.get(0); + Location loc20 = _traces2.get(0); + Location loc11 = _traces1.get(_traces1.size() - 1); + Location loc21 = _traces2.get(_traces2.size() - 1); float d1 = loc10.getDistance(loc11); float d2 = loc20.getDistance(loc21); float d12 = loc11.getDistance(loc21); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-01-23 06:32:38
|
Revision: 15022 http://jmol.svn.sourceforge.net/jmol/?rev=15022&view=rev Author: hansonr Date: 2011-01-23 06:32:31 +0000 (Sun, 23 Jan 2011) Log Message: ----------- version=12.1.32_dev # code: ArrayList X ... --> List X Modified Paths: -------------- trunk/Jmol/src/com/sparshui/server/GestureServer.java trunk/Jmol/src/com/sparshui/server/Group.java trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/CifReader.java trunk/Jmol/src/org/jmol/adapter/readers/more/P2nReader.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/MopacGraphfReader.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/script/ScriptVariable.java trunk/Jmol/src/org/jmol/script/Token.java trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java trunk/Jmol/src/org/jmol/util/ArrayUtil.java trunk/Jmol/src/org/jmol/util/CommandHistory.java trunk/Jmol/src/org/jmol/util/Escape.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java Modified: trunk/Jmol/src/com/sparshui/server/GestureServer.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureServer.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/com/sparshui/server/GestureServer.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -5,6 +5,7 @@ import java.net.Socket; import java.util.ArrayList; import java.util.Hashtable; +import java.util.List; import org.jmol.api.JmolGestureServerInterface; import org.jmol.util.Logger; @@ -31,7 +32,7 @@ ServerSocket _clientSocket; ServerSocket _deviceSocket; ServerSocket _mySocket; - private ArrayList<ClientConnection> _clients = new ArrayList<ClientConnection>(); + private List<ClientConnection> _clients = new ArrayList<ClientConnection>(); private int port; InputDeviceConnection ic = null; @@ -251,7 +252,7 @@ * */ private boolean processBirth(TouchPoint touchPoint) { - ArrayList<ClientConnection> clients_to_remove = null; + List<ClientConnection> clients_to_remove = null; boolean isClaimed = false; for (int i = 0; i < main._clients.size(); i++) { ClientConnection client = main._clients.get(i); Modified: trunk/Jmol/src/com/sparshui/server/Group.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/Group.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/com/sparshui/server/Group.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -20,8 +20,8 @@ private int _id; private List<GestureType> _gestureTypes; - private ArrayList<Gesture> _gestures; - private ArrayList<TouchPoint> _touchPoints; + private List<Gesture> _gestures; + private List<TouchPoint> _touchPoints; private ServerToClientProtocol _clientProtocol; /** @@ -66,7 +66,7 @@ * The changed touch point. */ public synchronized void update(TouchPoint changedPoint) { - ArrayList<Event> events = new ArrayList<Event>(); + List<Event> events = new ArrayList<Event>(); int state = changedPoint.getState(); @@ -81,7 +81,7 @@ System.out.println(); */ - ArrayList<TouchPoint> clonedPoints = null; + List<TouchPoint> clonedPoints = null; /* * // until this is implemented somewhere, why go to the trouble? -- BH * Modified: trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -6,6 +6,7 @@ import java.net.Socket; import java.util.ArrayList; import java.util.Hashtable; +import java.util.List; import com.sparshui.common.Location; import com.sparshui.common.NetworkConfiguration; @@ -41,7 +42,7 @@ */ private Hashtable<Integer, TouchPoint> _touchPoints; - private ArrayList<Integer> _flaggedids; + private List<Integer> _flaggedids; /** * Create a new input device connection with the given Modified: trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -50,7 +50,7 @@ * If an error occurs while communication with the client. */ public List<GestureType> getGestures(int groupID) throws IOException { - ArrayList<GestureType> gestures = new ArrayList<GestureType>(); + List<GestureType> gestures = new ArrayList<GestureType>(); _bufferOut.writeInt(groupID); sendBuffer(MessageType.GET_ALLOWED_GESTURES); @@ -108,7 +108,7 @@ * @throws IOException * If there is a communication error. */ - public void processEvents(int groupID, ArrayList<Event> events) throws IOException { + public void processEvents(int groupID, List<Event> events) throws IOException { for (int i = 0; i < events.size(); i++) { _bufferOut.writeInt(groupID); _bufferOut.write(events.get(i).serialize()); Modified: trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/CifReader.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/CifReader.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.BitSet; import java.util.Hashtable; +import java.util.List; import java.util.Map; import javax.vecmath.Point3f; @@ -428,7 +429,7 @@ private Map<String, Float> atomTypes; - private ArrayList<Object[]> bondTypes = new ArrayList<Object[]>(); + private List<Object[]> bondTypes = new ArrayList<Object[]>(); final private static byte ATOM_TYPE_SYMBOL = 0; final private static byte ATOM_TYPE_OXIDATION_NUMBER = 1; Modified: trunk/Jmol/src/org/jmol/adapter/readers/more/P2nReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/more/P2nReader.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/adapter/readers/more/P2nReader.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -25,6 +25,7 @@ package org.jmol.adapter.readers.more; import java.util.ArrayList; +import java.util.List; import org.jmol.adapter.readers.cifpdb.PdbReader; import org.jmol.adapter.smarter.Atom; @@ -39,7 +40,7 @@ public class P2nReader extends PdbReader { - private ArrayList<String> altNames = new ArrayList<String>(); + private List<String> altNames = new ArrayList<String>(); @Override protected void setAdditionalAtomParameters(Atom atom) { Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/MopacGraphfReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/MopacGraphfReader.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/MopacGraphfReader.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Hashtable; +import java.util.List; import java.util.Map; @@ -146,8 +147,8 @@ private float[][] invMatrix; private boolean isNewFormat; - private ArrayList<float[]> orbitalData; - private ArrayList<String> orbitalInfo; + private List<float[]> orbitalData; + private List<String> orbitalInfo; private void readMolecularOrbitals(boolean isBeta) throws Exception { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -582,7 +582,7 @@ this.ib = Math.max(ia, ib); } -// private ArrayList<Face> aFaces; +// private List<Face> aFaces; void addFace(Face f) { if (f == null) { nInvalid++; Modified: trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -187,7 +187,7 @@ //System.out.println("ActionManagerMT getAllowedGestures " + groupID); if (groupID != this.groupID || !viewer.allowMultiTouch()) return null; - ArrayList<GestureType> list = new ArrayList<GestureType>(); + List<GestureType> list = new ArrayList<GestureType>(); //list.add(new Integer(DRAG_GESTURE)); //list.add(new Integer(MULTI_POINT_DRAG_GESTURE)); //list.add(new Integer(SPIN_GESTURE)); Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -47,7 +47,7 @@ // @override public List<Event> processChange(List<TouchPoint> touchPoints, TouchPoint changedTouchPoint) { - ArrayList<Event> retEvents = new ArrayList<Event>(); + List<Event> retEvents = new ArrayList<Event>(); int nPoints = touchPoints.size(); if (Logger.debugging) { Logger.info("\nSinglePointGesture " + _myId + " nPoints: " + nPoints); @@ -99,7 +99,7 @@ return retEvents; } - private boolean checkClick(TouchPoint tpNew, ArrayList<Event> retEvents, boolean isDeath) { + private boolean checkClick(TouchPoint tpNew, List<Event> retEvents, boolean isDeath) { TouchPoint tp; long dt = tpNew.getTime() - _birth.getTime(); boolean isSingleClick = (isDeath && dt < MAXIMUM_CLICK_TIME); Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/TwoPointGesture.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -61,8 +61,8 @@ protected Location _offset = null; protected Location _offsetCentroid = null; - private ArrayList<Location> _traces1 = new ArrayList<Location>(); - private ArrayList<Location> _traces2 = new ArrayList<Location>(); + private List<Location> _traces1 = new ArrayList<Location>(); + private List<Location> _traces2 = new ArrayList<Location>(); private int _id1 = -1; private int _id2 = -1; private int _nTraces = 0; @@ -144,7 +144,7 @@ case 2: if (id == _id1) { _id1 = _id2; - ArrayList<Location> v = _traces1; + List<Location> v = _traces1; _traces1 = _traces2; _traces2 = v; _traces2.clear(); @@ -172,9 +172,9 @@ } // @override - protected ArrayList<Event> processMove(TouchPoint touchPoint) { + protected List<Event> processMove(TouchPoint touchPoint) { //System.out.println("TwoPointGesture move type:" + _myType + " ntraces:" + _nTraces + " ids:" + _id1+","+_id2+ " id:" + touchPoint.getID() + " sizes: " + _traces1.size() + " " + _traces2.size()); - ArrayList<Event> events = new ArrayList<Event>(); + List<Event> events = new ArrayList<Event>(); if (!updateLocations(touchPoint)) return events; if (_myType == ActionManagerMT.INVALID_GESTURE) Modified: trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/script/ScriptCompilationTokenParser.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -208,9 +208,8 @@ } } atokenInfix = new Token[ltokenPostfix.size()]; - for (int i = 0; i < ltokenPostfix.size(); i++) { + for (int i = ltokenPostfix.size(); --i >= 0;) atokenInfix[i] = ltokenPostfix.get(i); - } return true; } Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -417,9 +417,8 @@ private void setAaTokenCompiled() { aatokenCompiled = new Token[lltoken.size()][]; - for (int i = 0; i < lltoken.size(); i++) { + for (int i = lltoken.size(); --i >= 0;) aatokenCompiled[i] = lltoken.get(i); - } } private boolean lookingAtLeadingWhitespace() { @@ -762,9 +761,8 @@ } atokenInfix = new Token[size = ltoken.size()]; - for (int i = 0; i < ltoken.size(); i++) { + for (int i = ltoken.size(); --i >= 0;) atokenInfix[i] = ltoken.get(i); - } if (logMessages) { Logger.debug("token list:"); Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -1608,7 +1608,7 @@ String sValue = null; float[] fvalues = null; Point3f pt; - ArrayList<ScriptVariable> sv = null; + List<ScriptVariable> sv = null; int nValues = 0; if (tokenValue.tok == Token.varray) { sv = ((ScriptVariable) tokenValue).getList(); @@ -1837,9 +1837,9 @@ case Token.variable: return ScriptVariable.getVariable(v); case Token.string: - if (!(v instanceof ArrayList<?>)) + if (!(v instanceof List<?>)) break; - ArrayList<ScriptVariable> sv = (ArrayList<ScriptVariable>) v; + List<ScriptVariable> sv = (ArrayList<ScriptVariable>) v; StringBuffer sb = new StringBuffer(); for (int i = 0; i < sv.size(); i++) sb.append(ScriptVariable.sValue(sv.get(i))).append('\n'); @@ -2263,8 +2263,8 @@ fixed[j] = new ScriptVariable(Token.matrix4f, v); } else if (v instanceof Map<?, ?>) { fixed[j] = new ScriptVariable(Token.hash, v); - } else if (v instanceof ArrayList<?>) { - ArrayList<ScriptVariable> sv = (ArrayList<ScriptVariable>) v; + } else if (v instanceof List<?>) { + List<ScriptVariable> sv = (ArrayList<ScriptVariable>) v; BitSet bs = null; for (int k = 0; k < sv.size(); k++) { ScriptVariable svk = sv.get(k); @@ -3624,7 +3624,7 @@ } if (val instanceof String) val = getStringObjectAsVariable((String) val, null); - if (val instanceof ArrayList<?>) { + if (val instanceof List<?>) { BitSet bs = ScriptVariable.unEscapeBitSetArray((ArrayList<ScriptVariable>)val, true); if (bs != null) val = bs; @@ -4186,11 +4186,11 @@ private Point3f[] getPointArray(int i, int nPoints) throws ScriptException { Point3f[] points = (nPoints < 0 ? null : new Point3f[nPoints]); - ArrayList<Point3f> vp = (nPoints < 0 ? new ArrayList<Point3f>() : null); + List<Point3f> vp = (nPoints < 0 ? new ArrayList<Point3f>() : null); int tok = (i < 0 ? Token.varray : getToken(i++).tok); switch (tok) { case Token.varray: - ArrayList<ScriptVariable> v = ((ScriptVariable) theToken).getList(); + List<ScriptVariable> v = ((ScriptVariable) theToken).getList(); if (nPoints >= 0 && v.size() != nPoints) error(ERROR_invalidArgument); nPoints = v.size(); @@ -9643,7 +9643,7 @@ private Quaternion getQuaternionParameter(int i) throws ScriptException { if (tokAt(i) == Token.varray) { - ArrayList<ScriptVariable> sv = ((ScriptVariable) getToken(i)).getList(); + List<ScriptVariable> sv = ((ScriptVariable) getToken(i)).getList(); Point4f p4 = null; if (sv.size() == 0 || (p4 = ScriptVariable.pt4Value(sv.get(0))) == null) @@ -9660,7 +9660,7 @@ case Token.varray: List<Point3f> data = new ArrayList<Point3f>(); Point3f pt; - ArrayList<ScriptVariable> pts = ((ScriptVariable) t).getList(); + List<ScriptVariable> pts = ((ScriptVariable) t).getList(); for (int j = 0; j < pts.size(); j++) if ((pt = ScriptVariable.ptValue(pts.get(j))) != null) data.add(pt); @@ -12811,7 +12811,7 @@ int ipt = ScriptVariable.iValue(vv); switch (t.tok) { case Token.varray: - ArrayList<ScriptVariable> list = t.getList(); + List<ScriptVariable> list = t.getList(); if (ipt > list.size() || isLast) break; if (ipt <= 0) Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -944,7 +944,7 @@ if (isListf) { data = (float[]) x1.value; } else { - ArrayList<ScriptVariable> list = x1.getList(); + List<ScriptVariable> list = x1.getList(); data = new float[list.size()]; for (int i = list.size(); --i >= 0; ) data[i] = ScriptVariable.fValue(list.get(i)); @@ -1607,8 +1607,8 @@ float[] list1 = null; float[] list2 = null; - ArrayList<ScriptVariable> alist1 = x1.getList(); - ArrayList<ScriptVariable> alist2 = x2.getList(); + List<ScriptVariable> alist1 = x1.getList(); + List<ScriptVariable> alist2 = x2.getList(); if (x1.tok == Token.varray) { len = alist1.size(); @@ -1738,7 +1738,7 @@ float[] m = new float[len * len]; int pt = 0; for (int i = 0; i < len && isMatrix; i++) { - ArrayList<ScriptVariable> list = args[i].getList(); + List<ScriptVariable> list = args[i].getList(); for (int j = 0; j < len; j++) { float x = ScriptVariable.fValue(list.get(j)); if (Float.isNaN(x)) { @@ -3158,7 +3158,7 @@ @SuppressWarnings("unchecked") private static Object getMinMax(Object floatOrSVArray, int tok) { float[] data = null; - ArrayList<ScriptVariable> sv = null; + List<ScriptVariable> sv = null; int ndata = 0; while (true) { if (floatOrSVArray instanceof float[]) { @@ -3166,7 +3166,7 @@ ndata = data.length; if (ndata == 0) break; - } else if (floatOrSVArray instanceof ArrayList<?>) { + } else if (floatOrSVArray instanceof List<?>) { sv = (ArrayList<ScriptVariable>) floatOrSVArray; ndata = sv.size(); if (ndata == 0) @@ -3254,12 +3254,12 @@ @SuppressWarnings("unchecked") private static Object getMinMaxPoint(Object pointOrSVArray, int tok) { Point3f[] data = null; - ArrayList<ScriptVariable> sv = null; + List<ScriptVariable> sv = null; int ndata = 0; if (pointOrSVArray instanceof Quaternion[]) { data = (Point3f[]) pointOrSVArray; ndata = data.length; - } else if (pointOrSVArray instanceof ArrayList<?>) { + } else if (pointOrSVArray instanceof List<?>) { sv = (ArrayList<ScriptVariable>) pointOrSVArray; ndata = sv.size(); } @@ -3351,8 +3351,8 @@ data = new Quaternion[pts.length]; for (int i = 0; i < pts.length; i++) data[i] = new Quaternion(pts[i]); - } else if (quaternionOrSVData instanceof ArrayList<?>) { - ArrayList<ScriptVariable> sv = (ArrayList<ScriptVariable>) quaternionOrSVData; + } else if (quaternionOrSVData instanceof List<?>) { + List<ScriptVariable> sv = (ArrayList<ScriptVariable>) quaternionOrSVData; data = new Quaternion[sv.size()]; for (int i = 0; i < sv.size(); i++) { Point4f pt = ScriptVariable.pt4Value(sv.get(i)); Modified: trunk/Jmol/src/org/jmol/script/ScriptVariable.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptVariable.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/script/ScriptVariable.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -252,7 +252,7 @@ // at least for now, still saving as a string, // but ultimately, that should not be necessary - ArrayList<ScriptVariable> objects = null; + List<ScriptVariable> objects = null; if (x instanceof List) { // will be turned into list List<Object> v = (List<Object>) x; @@ -334,8 +334,8 @@ (Map<String, ScriptVariable>) v.value); break; case varray: - ArrayList<ScriptVariable> o2 = new ArrayList<ScriptVariable>(); - ArrayList<ScriptVariable> o1 = v.getList(); + List<ScriptVariable> o2 = new ArrayList<ScriptVariable>(); + List<ScriptVariable> o1 = v.getList(); for (int i = 0; i < o1.size(); i++) o2.add(o1.get(i)); value = o2; @@ -562,7 +562,7 @@ case varray: case hash: if (x.tok == Token.varray) { - ArrayList<ScriptVariable> sv = ((ScriptVariable) x).getList(); + List<ScriptVariable> sv = ((ScriptVariable) x).getList(); i = x.intValue; if (i <= 0) i = sv.size() - i; @@ -636,7 +636,7 @@ map.put(vx, Boolean.TRUE); if (isEscaped) sb.append("["); - ArrayList<ScriptVariable> sx = vx.getList(); + List<ScriptVariable> sx = vx.getList(); for (int i = 0; i < sx.size(); i++) { if (isEscaped && i > 0) sb.append(","); @@ -691,8 +691,8 @@ public static ScriptVariable concatList(ScriptVariable x1, ScriptVariable x2, boolean asNew) { - ArrayList<ScriptVariable> v1 = x1.getList(); - ArrayList<ScriptVariable> v2 = x2.getList(); + List<ScriptVariable> v1 = x1.getList(); + List<ScriptVariable> v2 = x2.getList(); if (!asNew) { if (v2 == null) v1.add(new ScriptVariable(x2)); @@ -701,7 +701,7 @@ v1.add(v2.get(i)); return x1; } - ArrayList<ScriptVariable> vlist = new ArrayList<ScriptVariable>( + List<ScriptVariable> vlist = new ArrayList<ScriptVariable>( (v1 == null ? 1 : v1.size()) + (v2 == null ? 1 : v2.size())); if (v1 == null) @@ -890,8 +890,8 @@ return new ScriptVariable(string, ""); if (i2 == i1) return ((ScriptVariable) tokenIn).getList().get(i1 - 1); - ArrayList<ScriptVariable> o2 = new ArrayList<ScriptVariable>(); - ArrayList<ScriptVariable> o1 = ((ScriptVariable) tokenIn).getList(); + List<ScriptVariable> o2 = new ArrayList<ScriptVariable>(); + List<ScriptVariable> o1 = ((ScriptVariable) tokenIn).getList(); n = i2 - i1 + 1; for (int i = 0; i < n; i++) o2.add(new ScriptVariable(o1.get(i + i1 - 1))); @@ -922,7 +922,7 @@ } if (selector != 0 && Math.abs(selector) <= len && var.tok == varray) { - ArrayList<ScriptVariable> sv = var.getList(); + List<ScriptVariable> sv = var.getList(); if (sv.size() == len) { float[] data = new float[len]; for (int i = 0; i < len; i++) @@ -1061,7 +1061,7 @@ Object[] of = new Object[] { vd, vf, ve, null, null}; if (var.tok != varray) return sprintf(strFormat, var, of, vd, vf, ve, getS, getP); - ArrayList<ScriptVariable> sv = var.getList(); + List<ScriptVariable> sv = var.getList(); String[] list2 = new String[sv.size()]; for (int i = 0; i < list2.length; i++) list2[i] = sprintf(strFormat, sv.get(i), of, vd, vf, ve, getS, getP); @@ -1124,7 +1124,7 @@ return bsSelect(x); case varray: BitSet bs = new BitSet(); - ArrayList<ScriptVariable> sv = (ArrayList<ScriptVariable>) x.value; + List<ScriptVariable> sv = (ArrayList<ScriptVariable>) x.value; for (int i = 0; i < sv.size(); i++) if (!sv.get(i).unEscapeBitSetArray(bs) && allowNull) return null; @@ -1167,8 +1167,8 @@ case string: return sValue(x).compareTo(sValue(y)); case varray: - ArrayList<ScriptVariable> sx = x.getList(); - ArrayList<ScriptVariable> sy = y.getList(); + List<ScriptVariable> sx = x.getList(); + List<ScriptVariable> sy = y.getList(); if (sx.size() != sy.size()) return (sx.size() < sy.size() ? -1 : 1); int iPt = arrayPt; @@ -1191,7 +1191,7 @@ * @return sorted or reversed array */ public ScriptVariable sortOrReverse(int arrayPt) { - ArrayList<ScriptVariable> x = getList(); + List<ScriptVariable> x = getList(); if (x == null || x.size() < 2) return this; if (arrayPt == Integer.MIN_VALUE) { @@ -1234,7 +1234,7 @@ public static String[] listValue(Token x) { if (x.tok != varray) return new String[] { sValue(x) }; - ArrayList<ScriptVariable> sv = ((ScriptVariable) x).getList(); + List<ScriptVariable> sv = ((ScriptVariable) x).getList(); String[] list = new String[sv.size()]; for (int i = sv.size(); --i >= 0;) list[i] = sValue(sv.get(i)); @@ -1244,7 +1244,7 @@ public static float[] flistValue(Token x, int nMin) { if (x.tok != varray) return new float[] { fValue(x) }; - ArrayList<ScriptVariable> sv = ((ScriptVariable) x).getList(); + List<ScriptVariable> sv = ((ScriptVariable) x).getList(); float[] list; list = new float[Math.max(nMin, sv.size())]; if (nMin == 0) @@ -1271,7 +1271,7 @@ return; } tok = varray; - ArrayList<ScriptVariable> o2 = new ArrayList<ScriptVariable>(dim); + List<ScriptVariable> o2 = new ArrayList<ScriptVariable>(dim); for (int i = 0; i < dim; i++) { float[] a = new float[dim]; if (m3 == null) @@ -1289,7 +1289,7 @@ } @SuppressWarnings("unchecked") - public ArrayList<ScriptVariable> getList() { + public List<ScriptVariable> getList() { return (tok == varray ? (ArrayList<ScriptVariable>) value : null); } } Modified: trunk/Jmol/src/org/jmol/script/Token.java =================================================================== --- trunk/Jmol/src/org/jmol/script/Token.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/script/Token.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -76,7 +76,7 @@ final static int seqcode = 5; final static int hash = 6; // associative array; Hashtable - final static int varray = 7; // ArrayList<ScriptVariable> + final static int varray = 7; // List<ScriptVariable> final static int point3f = 8; final static int point4f = 9; final static int bitset = 10; Modified: trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -685,8 +685,8 @@ private String sortInorganic(JmolNode atom, List<JmolEdge> v) { int atomIndex = atom.getIndex(); int n = v.size(); - ArrayList<JmolEdge[]> axialPairs = new ArrayList<JmolEdge[]>(); - ArrayList<JmolEdge> bonds = new ArrayList<JmolEdge>(); + List<JmolEdge[]> axialPairs = new ArrayList<JmolEdge[]>(); + List<JmolEdge> bonds = new ArrayList<JmolEdge>(); JmolNode a1, a2; JmolEdge bond1, bond2; BitSet bsDone = new BitSet(); Modified: trunk/Jmol/src/org/jmol/util/ArrayUtil.java =================================================================== --- trunk/Jmol/src/org/jmol/util/ArrayUtil.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/util/ArrayUtil.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -257,11 +257,11 @@ } /** - * Helper method for creating a ArrayList<T>[] without warnings. + * Helper method for creating a List<T>[] without warnings. * * @param <T> Type of objects in the list. * @param size Array size. - * @return Array of ArrayList<T> + * @return Array of List<T> */ @SuppressWarnings("unchecked") public static <T> List<T>[] createArrayOfArrayList(int size) { Modified: trunk/Jmol/src/org/jmol/util/CommandHistory.java =================================================================== --- trunk/Jmol/src/org/jmol/util/CommandHistory.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/util/CommandHistory.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -222,8 +222,7 @@ public String removeCommand(int n) { if (n < 0 || n >= nextCommand) return ""; - String str = commandList.get(n); - commandList.remove(n); + String str = commandList.remove(n); nextCommand--; return str; } Modified: trunk/Jmol/src/org/jmol/util/Escape.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Escape.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/util/Escape.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -63,7 +63,7 @@ public static String escape(Object x) { if (x instanceof String) return escape("" + x); - if (x instanceof ArrayList<?>) + if (x instanceof List<?>) return escape((ArrayList<ScriptVariable>) x); if (x instanceof String[]) return escape((String[]) x, true); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-01-23 06:32:31 UTC (rev 15022) @@ -3,6 +3,7 @@ version=12.1.32_dev +# code: ArrayList X ... --> List X # bug fix: If a script such as "test.spt" creates a function # test(), then the next implicit script command "test.spt" will fail # bug fix: implicit script command XXXX.xxx loses case of filename Modified: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java 2011-01-23 06:24:52 UTC (rev 15021) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java 2011-01-23 06:32:31 UTC (rev 15022) @@ -453,7 +453,7 @@ */ public Action[] getActions() { - ArrayList<Action> actions = new ArrayList<Action>(); + List<Action> actions = new ArrayList<Action>(); actions.addAll(Arrays.asList(defaultActions)); actions.addAll(Arrays.asList(display.getActions())); actions.addAll(Arrays.asList(preferencesDialog.getActions())); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-01-23 06:47:07
|
Revision: 15023 http://jmol.svn.sourceforge.net/jmol/?rev=15023&view=rev Author: hansonr Date: 2011-01-23 06:47:00 +0000 (Sun, 23 Jan 2011) Log Message: ----------- code: Hashtable --> Map Modified Paths: -------------- trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java trunk/Jmol/src/com/sparshui/server/ClientConnection.java trunk/Jmol/src/com/sparshui/server/GestureServer.java trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java trunk/Jmol/src/org/jmol/modelset/ModelLoader.java trunk/Jmol/src/org/jmol/util/ArrayUtil.java trunk/Jmol/src/org/jmol/util/ColorEncoder.java Modified: trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java =================================================================== --- trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java 2011-01-23 06:32:31 UTC (rev 15022) +++ trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java 2011-01-23 06:47:00 UTC (rev 15023) @@ -12,6 +12,7 @@ import java.util.Comparator; import java.util.Hashtable; import java.util.Iterator; +import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.TreeSet; @@ -36,7 +37,7 @@ public class JmolTouchSimulator implements JmolTouchSimulatorInterface { private TreeSet<TouchData> _events = new TreeSet<TouchData>(new TouchDataComparator()); - protected Hashtable<Integer, TouchData> _active = new Hashtable<Integer, TouchData>(); + protected Map<Integer, TouchData> _active = new Hashtable<Integer, TouchData>(); private boolean _recording = false; private int _touchID = 0; private long _when = 0; Modified: trunk/Jmol/src/com/sparshui/server/ClientConnection.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/ClientConnection.java 2011-01-23 06:32:31 UTC (rev 15022) +++ trunk/Jmol/src/com/sparshui/server/ClientConnection.java 2011-01-23 06:47:00 UTC (rev 15023) @@ -4,6 +4,7 @@ import java.net.Socket; import java.util.Hashtable; import java.util.List; +import java.util.Map; import com.sparshui.gestures.GestureType; @@ -23,7 +24,7 @@ /** * */ - private Hashtable<Integer, Group> _groups; + private Map<Integer, Group> _groups; /** * Instantiate the connection on the specified socket. Modified: trunk/Jmol/src/com/sparshui/server/GestureServer.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureServer.java 2011-01-23 06:32:31 UTC (rev 15022) +++ trunk/Jmol/src/com/sparshui/server/GestureServer.java 2011-01-23 06:47:00 UTC (rev 15023) @@ -4,8 +4,8 @@ import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; -import java.util.Hashtable; import java.util.List; +import java.util.Map; import org.jmol.api.JmolGestureServerInterface; import org.jmol.util.Logger; @@ -220,7 +220,7 @@ * @param state * @return whether a client has claimed this touchPoint; */ - boolean processTouchPoint(Hashtable<Integer, TouchPoint> inputDeviceTouchPoints, int id, + boolean processTouchPoint(Map<Integer, TouchPoint> inputDeviceTouchPoints, int id, Location location, long time, int state) { if (Logger.debugging) { Logger.info("[GestureServer] processTouchPoint id=" + id + " state=" + state + " " + location Modified: trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java 2011-01-23 06:32:31 UTC (rev 15022) +++ trunk/Jmol/src/com/sparshui/server/InputDeviceConnection.java 2011-01-23 06:47:00 UTC (rev 15023) @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Hashtable; import java.util.List; +import java.util.Map; import com.sparshui.common.Location; import com.sparshui.common.NetworkConfiguration; @@ -40,7 +41,7 @@ /** * */ - private Hashtable<Integer, TouchPoint> _touchPoints; + private Map<Integer, TouchPoint> _touchPoints; private List<Integer> _flaggedids; Modified: trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java 2011-01-23 06:32:31 UTC (rev 15022) +++ trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java 2011-01-23 06:47:00 UTC (rev 15023) @@ -24,6 +24,7 @@ package org.jmol.jvxl.calc; import java.util.Hashtable; +import java.util.Map; import javax.vecmath.Point3f; import javax.vecmath.Point3i; @@ -187,7 +188,7 @@ return 0; } - Hashtable<String, Integer> htPts = new Hashtable<String, Integer>(); + Map<String, Integer> htPts = new Hashtable<String, Integer>(); private class Triangle { int[] pts; Modified: trunk/Jmol/src/org/jmol/modelset/ModelLoader.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2011-01-23 06:32:31 UTC (rev 15022) +++ trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2011-01-23 06:47:00 UTC (rev 15023) @@ -317,7 +317,7 @@ int modelAtomCount = 0; for (int i = baseModelIndex; i < modelCount; atomIndex += modelAtomCount, i++) { modelAtomCount = models[i].bsAtoms.cardinality(); - Map<String, String> atomProperties = (Hashtable<String, String>) getModelAuxiliaryInfo(i, + Map<String, String> atomProperties = (Map<String, String>) getModelAuxiliaryInfo(i, "atomProperties"); if (atomProperties == null) continue; Modified: trunk/Jmol/src/org/jmol/util/ArrayUtil.java =================================================================== --- trunk/Jmol/src/org/jmol/util/ArrayUtil.java 2011-01-23 06:32:31 UTC (rev 15022) +++ trunk/Jmol/src/org/jmol/util/ArrayUtil.java 2011-01-23 06:47:00 UTC (rev 15023) @@ -269,12 +269,12 @@ } /** - * Helper method for creating a Hashtable<K, V>[] without warnings. + * Helper method for creating a Map<K, V>[] without warnings. * * @param <K> Type of object for the keys in the map. * @param <V> Type of object for the values in the map. * @param size Array size. - * @return Array of Hashtable<K, V> + * @return Array of Map<K, V> */ @SuppressWarnings("unchecked") public static <K, V> Map<K, V>[] createArrayOfHashtable(int size) { Modified: trunk/Jmol/src/org/jmol/util/ColorEncoder.java =================================================================== --- trunk/Jmol/src/org/jmol/util/ColorEncoder.java 2011-01-23 06:32:31 UTC (rev 15022) +++ trunk/Jmol/src/org/jmol/util/ColorEncoder.java 2011-01-23 06:47:00 UTC (rev 15023) @@ -479,7 +479,7 @@ } public Map<String, Object> getColorKey() { - Hashtable<String, Object> info = new Hashtable<String, Object>(); + Map<String, Object> info = new Hashtable<String, Object>(); boolean isReverse = isReversed; int segmentCount = getSegmentCount(currentPalette); switch (currentPalette) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-04-08 02:22:11
|
Revision: 15370 http://jmol.svn.sourceforge.net/jmol/?rev=15370&view=rev Author: hansonr Date: 2011-04-08 02:22:05 +0000 (Fri, 08 Apr 2011) Log Message: ----------- version=12.1.42 # code: Swing class instantiation failure caught # bug fix - set picking identifyBond not implemented # bug fix - leaving modelKitMode does not leave bondPickingMode "ident" # new feature: for (var x in [....]) {...} # -- array option Modified Paths: -------------- trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/StatusManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java =================================================================== --- trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java 2011-04-05 21:27:17 UTC (rev 15369) +++ trunk/Jmol/src/com/sparshui/inputdevice/JmolTouchSimulator.java 2011-04-08 02:22:05 UTC (rev 15370) @@ -139,7 +139,12 @@ TouchData te = new TouchData(); te.id = (type == TouchState.BIRTH) ? ++_touchID : _touchID; Point p = new Point(x, y); - SwingUtilities.convertPointToScreen(p, _display); + try { + SwingUtilities.convertPointToScreen(p, _display); + } catch (Throwable e) { + // no Swing + return; + } te.x = p.x; te.y = p.y; //te.x = e.getLocationOnScreen().x; Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2011-04-05 21:27:17 UTC (rev 15369) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2011-04-08 02:22:05 UTC (rev 15370) @@ -263,7 +263,7 @@ try { UIManager.setLookAndFeel(UIManager .getCrossPlatformLookAndFeelClassName()); - } catch (Exception exc) { + } catch (Throwable exc) { System.err.println("Error loading L&F: " + exc); } if (Logger.debugging) { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-04-05 21:27:17 UTC (rev 15369) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-04-08 02:22:05 UTC (rev 15370) @@ -1,8 +1,9 @@ # Developers: to add a description of changes you have made, # add it on a line starting with # below the "version=..." line -version=12.1.42_dev +version=12.1.42 +# code: Swing class instantiation failure caught # bug fix - set picking identifyBond not implemented # bug fix - leaving modelKitMode does not leave bondPickingMode "ident" # new feature: for (var x in [....]) {...} Modified: trunk/Jmol/src/org/jmol/viewer/StatusManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2011-04-05 21:27:17 UTC (rev 15369) +++ trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2011-04-08 02:22:05 UTC (rev 15370) @@ -35,6 +35,7 @@ import java.util.List; import java.util.Map; +import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import org.jmol.api.Interface; @@ -699,5 +700,23 @@ return outputFileName; } + static String prompt(String label, String data, String[] list, + boolean asButtons) { + try { + if (!asButtons) + return JOptionPane.showInputDialog(label, data); + if (data != null) + list = TextFormat.split(data, "|"); + int i = JOptionPane.showOptionDialog(null, label, "Jmol prompt", + JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, + list, list[0]); + // ESCAPE will close the panel with no option selected. + return (data == null ? "" + i : i == JOptionPane.CLOSED_OPTION ? "null" + : list[i]); + } catch (Throwable e) { + return "null"; + } + } + } Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2011-04-05 21:27:17 UTC (rev 15369) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2011-04-08 02:22:05 UTC (rev 15370) @@ -90,7 +90,6 @@ import java.util.Map; import java.util.Properties; -import javax.swing.JOptionPane; import javax.vecmath.Point3f; import javax.vecmath.Tuple3f; import javax.vecmath.Vector3f; @@ -4860,6 +4859,7 @@ void popupMenu(int x, int y, char type) { if (!haveDisplay || !refreshing || isPreviewOnly || global.disablePopupMenu) return; + try { switch (type) { case 'j': getPopupMenu(); @@ -4878,6 +4878,10 @@ } modelkit.show(x, y, type); } + } catch (Throwable e) { + // no Swing -- tough luck! + global.disablePopupMenu = true; + } } public String getMenu(String type) { @@ -5370,8 +5374,8 @@ if (appConsole == null) getProperty("DATA_API", "getAppConsole", Boolean.TRUE); appConsole.setVisible(showConsole); - } catch (Exception e) { - // no console for this client... + } catch (Throwable e) { + // no console for this client... maybe no Swing } } @@ -9530,16 +9534,7 @@ public String prompt(String label, String data, String[] list, boolean asButtons) { - if (!asButtons) - return JOptionPane.showInputDialog(label, data); - if (data != null) - list = TextFormat.split(data, "|"); - int i = JOptionPane.showOptionDialog(null, label, "Jmol prompt", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, - list, list[0]); - // ESCAPE will close the panel with no option selected. - return (data == null ? "" + i : i == JOptionPane.CLOSED_OPTION ? "null" - : list[i]); + return StatusManager.prompt(label, data, list, asButtons); } String getMenuName(int i) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-09-30 12:02:43
|
Revision: 16187 http://jmol.svn.sourceforge.net/jmol/?rev=16187&view=rev Author: hansonr Date: 2011-09-30 12:02:33 +0000 (Fri, 30 Sep 2011) Log Message: ----------- version=12.2.RC8_dev # new feature: JmolSmilesApplet method getRelationship(smiles1, smiles2) Modified Paths: -------------- trunk/Jmol/src/JmolSmilesApplet.java trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/JmolSmilesApplet.java =================================================================== --- trunk/Jmol/src/JmolSmilesApplet.java 2011-09-30 11:12:10 UTC (rev 16186) +++ trunk/Jmol/src/JmolSmilesApplet.java 2011-09-30 12:02:33 UTC (rev 16187) @@ -90,6 +90,17 @@ return ret; } + /** + * compares two SMILES strings + * + * @param smiles1 + * @param smiles2 + * @return IDENTICAL, ENANTIOMERS, DIASTERIOMERS, CONSTITUTIONAL ISOMERS, NONE + */ + public String getRelationship(String smiles1, String smiles2) { + return (new SmilesMatcher()).getRelationship(smiles1, smiles2); + } + @Override public String getAppletInfo() { return "JmolSmilesApplet"; Modified: trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java 2011-09-30 11:12:10 UTC (rev 16186) +++ trunk/Jmol/src/org/jmol/api/SmilesMatcherInterface.java 2011-09-30 12:02:33 UTC (rev 16187) @@ -36,4 +36,9 @@ public abstract String getSmiles(JmolNode[] atoms, int atomCount, BitSet bsSelected, boolean asBioSmiles, boolean allowUnmatchedRings, boolean addCrossLinks, String comment); + + public abstract String getRelationship(String smiles1, String smiles2); + + public abstract String reverseChirality(String smiles); + } Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2011-09-30 11:12:10 UTC (rev 16186) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2011-09-30 12:02:33 UTC (rev 16187) @@ -787,6 +787,8 @@ if (isIsomer) { if (args.length != 3) return false; + if (bs1 == null && bs2 == null) + return addX(viewer.getSmilesMatcher().getRelationship(smiles1, smiles2).toUpperCase()); String mf1 = (bs1 == null ? viewer.getSmilesMatcher() .getMolecularFormula(smiles1, false) : JmolMolecule.getMolecularFormula( viewer.getModelSet().atoms, bs1, false)); @@ -811,12 +813,7 @@ if (s.indexOf("/") >= 0 || s.indexOf("\\") >= 0 || s.indexOf("@") >= 0) { if (smiles1.indexOf("@") >= 0 && (bs2 != null || smiles2.indexOf("@") >= 0)) { // reverse chirality centers - smiles1 = TextFormat.simpleReplace(smiles1, "@@", "!@"); - smiles1 = TextFormat.simpleReplace(smiles1, "@", "@@"); - smiles1 = TextFormat.simpleReplace(smiles1, "!@@", "@"); - smiles1 = TextFormat.simpleReplace(smiles1, "@@SP", "@SP"); - smiles1 = TextFormat.simpleReplace(smiles1, "@@OH", "@OH"); - smiles1 = TextFormat.simpleReplace(smiles1, "@@TB", "@TB"); + smiles1 = viewer.getSmilesMatcher().reverseChirality(smiles1); if (bs2 == null) { check = (viewer.getSmilesMatcher().areEqual(smiles1, smiles2) > 0); } else { Modified: trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java 2011-09-30 11:12:10 UTC (rev 16186) +++ trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java 2011-09-30 12:02:33 UTC (rev 16187) @@ -29,6 +29,7 @@ import org.jmol.api.SmilesMatcherInterface; import org.jmol.util.JmolNode; +import org.jmol.util.TextFormat; /** * Originating author: Nicholas Vervelle @@ -184,6 +185,50 @@ } } + public String getRelationship(String smiles1, String smiles2) { + if (smiles1 == null || smiles2 == null + || smiles1.length() == 0 || smiles2.length() == 0) + return ""; + String mf1 = getMolecularFormula(smiles1, false); + String mf2 = getMolecularFormula(smiles2, false); + if (!mf1.equals(mf2)) + return "none"; + boolean check; + // note: find smiles1 IN smiles2 here + check = (areEqual(smiles2, smiles1) > 0); + if (!check) { + // MF matched, but didn't match SMILES + String s = smiles1 + smiles2; + if (s.indexOf("/") >= 0 || s.indexOf("\\") >= 0 || s.indexOf("@") >= 0) { + if (smiles1.indexOf("@") >= 0 && smiles2.indexOf("@") >= 0) { + // reverse chirality centers + smiles1 = reverseChirality(smiles1); + check = (areEqual(smiles1, smiles2) > 0); + if (check) + return "enantiomers"; + } + // remove all stereochemistry from SMILES string + check = (areEqual("/nostereo/" + smiles2, smiles1) > 0); + if (check) + return "diastereomers"; + } + // MF matches, but not enantiomers or diasteriomers + return "constitutional isomers"; + } + return "identical"; + } + + + public String reverseChirality(String smiles) { + smiles = TextFormat.simpleReplace(smiles, "@@", "!@"); + smiles = TextFormat.simpleReplace(smiles, "@", "@@"); + smiles = TextFormat.simpleReplace(smiles, "!@@", "@"); + smiles = TextFormat.simpleReplace(smiles, "@@SP", "@SP"); + smiles = TextFormat.simpleReplace(smiles, "@@OH", "@OH"); + smiles = TextFormat.simpleReplace(smiles, "@@TB", "@TB"); + return smiles; + } + /** * Returns a bitset matching the pattern within atoms. * Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-09-30 11:12:10 UTC (rev 16186) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-09-30 12:02:33 UTC (rev 16187) @@ -3,6 +3,7 @@ version=12.2.RC8_dev +# new feature: JmolSmilesApplet method getRelationship(smiles1, smiles2) # bug fix: xxx = {*}; xxx.property_x = 3 improperly parsed as a script command # new feature: The Jmol application can now communicate via sockets # with other Jmol applications or specialized servers. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-10-01 11:38:39
|
Revision: 16189 http://jmol.svn.sourceforge.net/jmol/?rev=16189&view=rev Author: hansonr Date: 2011-10-01 11:38:32 +0000 (Sat, 01 Oct 2011) Log Message: ----------- version=12.2.RC8 # PLEASE RELEASE AS 12.2.0 with new branch # new feature: JmolSmilesApplet method (smiles1) # new feature: JmolSmilesApplet method getRelationship(smiles1, smiles2) # bug fix: xxx = {*}; xxx.property_x = 3 improperly parsed as a script command # new feature: The Jmol application can now communicate via sockets # with other Jmol applications or specialized servers. # The SYNC command has been expanded to make this very easy: # # sync -nnnn starts a server on local port nnnn accepting only local connections # sync nnnn "background white" (from another app, generally) would execute that # command on the app acting as a server # # You can also do this from one app frame to another, because they are independent # instances of Jmol. # # Jmol can provide server service to other apps using: # # sync -3000 # [start other app, connecting on 3000] # sync 3000 ..... # # Because once the server is started and another app has connected, # Jmol will send messages to that other app, not itself. # # To test the service within one application, just create the server and send # commands to itself using a negative port number: # # sync -3000;sync -3000 'Mouse: rotateZBy 30' # # Note that in this context the "server" is the one getting commands from the "client" # But the server can also send commands to the client provided the client has given the # appropriate handshake: {"magic":"JmolApp","event":"out"} # # Sent from Jmol (via outSocket): # # {"magic" : "JmolApp", "role" : "out"} (socket initialization for messages TO jmol) # {"magic" : "JmolApp", "role" : "in"} (socket initialization for messages FROM jmol) # {"type" : "script", "event" : "done"} (script completed) # # Sent to Jmol (via inSocket): # # {"type" : "command", "command" : command } (script command request) # {"type" : "content", "id" : id } (load content request) # {"type" : "move", "style" : (see below) } (mouse command request) # {"type" : "quit" } (shut down request) # {"type" : "sync", "sync" : (see below) } (sync command request) # {"type" : "touch", (a raw touch event) # "eventType" : eventType, # "touchID" : touchID, # "iData" : idata, # "time" : time, # "x" : x, "y" : y, "z" : z } # # For details on the "touch" type, see org.jmol.viewer.ActionManagerMT::processEvent # Content is assumed to be in a location determined by the Jmol variable # nioContentPath, with %ID% being replaced by some sort of ID number of tag provided by # the other half of the system. That file contains more JSON code: # # {"startup_script" : scriptFileName, "banner_text" : text } # # An additional option "banner" : "off" turns off the title banner. # The startup script must be in the same directory as the .json file, typically as a .spt file # # Move/sync commands include: # # {"type" : "move", "style" : "rotate", "x" : deltaX, "y", deltaY } # {"type" : "move", "style" : "translate", "x" : deltaX, "y", deltaY } # {"type" : "move", "style" : "zoom", "scale" : scale } (1.0 = 100%) # {"type" : "sync", "sync" : syncText } # # Note that all these moves utilize the Jmol sync functionality originally intended for # applets. So any valid sync command may be used with the "sync" style. These include # essentially all the actions that a user can make with a mouse, including the # following, where the notation <....> represents a number of a given type. These # events interrupt any currently running script, just as with typical mouse actions. # # "centerAt <int:x> <int:y> <float:ptx> <float:pty> <float:ptz>" # -- set {ptx,pty,ptz} at screen (x,y) # "rotateMolecule <float:deltaX> <float:deltaY>" # "rotateXYBy <float:deltaX> <float:deltaY>" # "rotateZBy <int:degrees>" # "rotateZBy <int:degrees> <int:x> <int:y>" (with center reset) # "rotateArcBall <int:x> <int:y> <float:factor>" # "spinXYBy <int:x> <int:y> <float:speed>" # -- a "flick" gesture # "translateXYBy <float:deltaX, float:deltaY>" # "zoomBy <int:pixels>" # "zoomByFactor <float:factor>" # "zoomByFactor <float:factor> <int:x> <int:y>" (with center reset) # # new feature: preliminary QuantumEspresso XML reader # bug fix: getproperty minimizationInfo returns JSON instead of readable string # bug fix: JaguarReader not reading D6 MOs properly # new feature: Jmol Application flags -k and -P # -- -k kiosk mode: like applet, but with a banner across the top # -- -P <port> JSON NIO client mode over port <port> # -- for JSON NIO, use -J or -j to set nioContentPath and nioTerminatorMessage # to the desired values. For example: # Jmol -k -P 31461 -j "nioContentPath='./%ID%/%ID%.json';nioTerminatorMessage='SCRIPT_DONE'" # # code: all references to java.awt and javax.swing isolated to # org.jmol.awt, rg.jmol.export, and org.jmol.multitouch # new feature: Jmol.js adds jmolSwitchToSignedApplet(). # This needed a new <span> tag that is now inserted around the applet. # bug fix: MOLDEN reader not reading spherical basis functions # bug fix: contact command not symmetric # Set A should generally be the ligand. However, consider note: # // check for O--H...N or O...H--N and not considering # // hydrogens and still have a filter # // a bit of asymmetry here: set A may or may not have H atoms added. # // This is particularly important for amines # The issue here is that we do not assume that hydrogens have been # added to ligands. So we make some allowances there. # # bug fix: null pointer exceptions when model with unit cell is appended to model without unit cell # bug fix: CIF reader not implemented with filter "CONF n" # bug fix: unit cell not turned off in state for PDB files loaded with biomolecule # new feature: filter "_Xx" for filtering element Xx # code: refactored Jmol core Swing classes restricted to # applet, console, export, modelkit, multitouch, popup # bug fix: SMILES [#6]-[#6] should not match bonds in benzene, only biphenyl # bug fix: in SMARTS matching of SMILES string, aromatic ring conditions were not matched # TODO: Question about what c=c should do. For now, changing that to NOT match C=C of benzene Modified Paths: -------------- trunk/Jmol/src/JmolSmilesApplet.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/MoldenReader.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/JmolSmilesApplet.java =================================================================== --- trunk/Jmol/src/JmolSmilesApplet.java 2011-09-30 19:31:27 UTC (rev 16188) +++ trunk/Jmol/src/JmolSmilesApplet.java 2011-10-01 11:38:32 UTC (rev 16189) @@ -32,6 +32,18 @@ import org.jmol.smiles.InvalidSmilesException; import org.jmol.smiles.SmilesMatcher; +/* + * JmolSmilesApplet is a small applet that can do interesting things with + * SMILES strings. It is a subset of Jmol with no graphics capability + * + * find(String pattern, String smiles, boolean isSmarts, boolean isAll) + * getLastError() + * getRelationship(String smiles1, String smiles2) + * reverseChiralit(String smiles) + * setDebug(boolean TF) + * + * + */ public class JmolSmilesApplet extends Applet { @Override @@ -101,6 +113,17 @@ return (new SmilesMatcher()).getRelationship(smiles1, smiles2); } + + /** + * reverse the chirality throughout a SMILES string + * + * @param smiles + * @return reversed chirality SMILES string + */ + public String reverseChiralit(String smiles) { + return (new SmilesMatcher()).reverseChirality(smiles); + } + @Override public String getAppletInfo() { return "JmolSmilesApplet"; Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/MoldenReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/MoldenReader.java 2011-09-30 19:31:27 UTC (rev 16188) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/MoldenReader.java 2011-10-01 11:38:32 UTC (rev 16189) @@ -36,7 +36,9 @@ optOnly = checkFilter("OPTONLY"); loadGeometries = !vibOnly && desiredVibrationNumber < 0 && !checkFilter("NOOPT"); loadVibrations = !optOnly && desiredModelNumber < 0 && !checkFilter("NOVIB"); - + + if (checkFilter("NORMALIZED")) + moData.put("isNormalized", Boolean.TRUE); if (checkFilter("ALPHA")) filter = "alpha"; else if (checkFilter("BETA")) Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-09-30 19:31:27 UTC (rev 16188) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-10-01 11:38:32 UTC (rev 16189) @@ -1,8 +1,12 @@ # Developers: to add a description of changes you have made, # add it on a line starting with # below the "version=..." line -version=12.2.RC8_dev +version=12.2.RC8 + +# PLEASE RELEASE AS 12.2.0 with new branch + +# new feature: JmolSmilesApplet method (smiles1) # new feature: JmolSmilesApplet method getRelationship(smiles1, smiles2) # bug fix: xxx = {*}; xxx.property_x = 3 improperly parsed as a script command # new feature: The Jmol application can now communicate via sockets This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-10-03 12:24:28
|
Revision: 16222 http://jmol.svn.sourceforge.net/jmol/?rev=16222&view=rev Author: hansonr Date: 2011-10-03 12:24:19 +0000 (Mon, 03 Oct 2011) Log Message: ----------- JmolApplet was calling org.jmol.console Modified Paths: -------------- trunk/Jmol/src/JmolApplet.java trunk/Jmol/src/org/jmol/api/JmolPromptInterface.java trunk/Jmol/src/org/jmol/applet/ClassPreloader.java trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/console/JmolPrompt.java Modified: trunk/Jmol/src/JmolApplet.java =================================================================== --- trunk/Jmol/src/JmolApplet.java 2011-10-03 11:57:30 UTC (rev 16221) +++ trunk/Jmol/src/JmolApplet.java 2011-10-03 12:24:19 UTC (rev 16222) @@ -31,11 +31,12 @@ * */ +import org.jmol.applet.AppletWrapper; import org.jmol.applet.JmolAppletInterface; import netscape.javascript.JSObject; -public class JmolApplet extends org.jmol.applet.AppletWrapper implements +public class JmolApplet extends AppletWrapper implements JmolAppletInterface { //protected void finalize() throws Throwable { Modified: trunk/Jmol/src/org/jmol/api/JmolPromptInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolPromptInterface.java 2011-10-03 11:57:30 UTC (rev 16221) +++ trunk/Jmol/src/org/jmol/api/JmolPromptInterface.java 2011-10-03 12:24:19 UTC (rev 16222) @@ -5,5 +5,4 @@ public abstract String prompt(String label, String data, String[] list, boolean asButtons); - public abstract void setLookAndFeel(); } Modified: trunk/Jmol/src/org/jmol/applet/ClassPreloader.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/ClassPreloader.java 2011-10-03 11:57:30 UTC (rev 16221) +++ trunk/Jmol/src/org/jmol/applet/ClassPreloader.java 2011-10-03 12:24:19 UTC (rev 16222) @@ -42,7 +42,7 @@ try { int lastCharIndex = className.length() - 1; boolean constructOne = className.charAt(lastCharIndex) == '+'; - //System.out.println("ClassPreloader - " + className); + System.out.println("ClassPreloader - " + className); if (constructOne) className = className.substring(0, lastCharIndex); Class<?> preloadClass = Class.forName(className); Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2011-10-03 11:57:30 UTC (rev 16221) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2011-10-03 12:24:19 UTC (rev 16222) @@ -48,6 +48,8 @@ import java.util.Hashtable; import java.util.Map; +import javax.swing.UIManager; + import netscape.javascript.JSObject; /* @@ -286,10 +288,12 @@ if (menuFile != null) viewer.getProperty("DATA_API", "setMenu", viewer .getFileAsString(menuFile)); - JmolPromptInterface jpi = (JmolPromptInterface) Interface - .getOptionInterface("awt.console.JmolPrompt"); - if (jpi != null) - jpi.setLookAndFeel(); + try { + UIManager.setLookAndFeel(UIManager + .getCrossPlatformLookAndFeelClassName()); + } catch (Throwable exc) { + System.err.println("Error loading L&F: " + exc); + } if (Logger.debugging) { Logger.debug("checking for jsoWindow mayScript=" + mayScript); } Modified: trunk/Jmol/src/org/jmol/console/JmolPrompt.java =================================================================== --- trunk/Jmol/src/org/jmol/console/JmolPrompt.java 2011-10-03 11:57:30 UTC (rev 16221) +++ trunk/Jmol/src/org/jmol/console/JmolPrompt.java 2011-10-03 12:24:19 UTC (rev 16222) @@ -24,7 +24,6 @@ package org.jmol.console; import javax.swing.JOptionPane; -import javax.swing.UIManager; import org.jmol.api.JmolPromptInterface; import org.jmol.util.TextFormat; @@ -58,12 +57,4 @@ } } - public void setLookAndFeel() { - try { - UIManager.setLookAndFeel(UIManager - .getCrossPlatformLookAndFeelClassName()); - } catch (Throwable exc) { - System.err.println("Error loading L&F: " + exc); - } - } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-10-22 23:06:54
|
Revision: 16387 http://jmol.svn.sourceforge.net/jmol/?rev=16387&view=rev Author: hansonr Date: 2011-10-22 23:06:46 +0000 (Sat, 22 Oct 2011) Log Message: ----------- version=12.3.3_dev # code: refactored for Molecular Playground and Jmol Android # -- several System.out. messages present. Modified Paths: -------------- trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java trunk/Jmol/src/com/sparshui/client/SparshClient.java trunk/Jmol/src/com/sparshui/server/ClientConnection.java trunk/Jmol/src/com/sparshui/server/GestureFactory.java trunk/Jmol/src/com/sparshui/server/Group.java trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java trunk/Jmol/src/org/jmol/api/ApiPlatform.java trunk/Jmol/src/org/jmol/awt/Display.java trunk/Jmol/src/org/jmol/awt/Platform.java trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClient.java trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClientAdapter.java trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java trunk/Jmol/src/org/jmol/viewer/ActionManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/molecularplayground/MPJmolApp.java trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JsonNioService.java Added Paths: ----------- trunk/Jmol/src/com/sparshui/GestureType.java Removed Paths: ------------- trunk/Jmol/src/com/sparshui/gestures/GestureType.java Copied: trunk/Jmol/src/com/sparshui/GestureType.java (from rev 16370, trunk/Jmol/src/com/sparshui/gestures/GestureType.java) =================================================================== --- trunk/Jmol/src/com/sparshui/GestureType.java (rev 0) +++ trunk/Jmol/src/com/sparshui/GestureType.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -0,0 +1,48 @@ +package com.sparshui; + +/** + * This class is a place for the enum GestureType to stand. + * If you modify this class, you must also modify the corresponding + * enum in GestureType.h in the C++ Gesture Server. ALWAYS assign + * this enum value to a 4-byte network-ordered integer before attempting + * to transmit this value over the network. + * + * Adapted by Bob Hanson as an implementable class + * + * @author Jay Roltgen + * + */ +public class GestureType { + + public String sType = null; + public int iType = Integer.MAX_VALUE; + public GestureType(String type) { + // class name, such as "org.jmol.multitouch.sparshui.TwoPointGesture" + sType = type; + } + + public GestureType(int type) { + // built-in SparshUI gestures; not implemented for Jmol + iType = type; + } + + public final static int DRAG_GESTURE = 0; + public final static int MULTI_POINT_DRAG_GESTURE = 1; + public final static int ROTATE_GESTURE = 2; + public final static int SPIN_GESTURE = 3; + public final static int TOUCH_GESTURE = 4; + public final static int ZOOM_GESTURE = 5; + public final static int DBLCLK_GESTURE = 6; + public final static int FLICK_GESTURE = 7; + public final static int RELATIVE_DRAG_GESTURE = 8; + + public static final int DRAG_EVENT = 0; + public static final int ROTATE_EVENT = 1; + public static final int SPIN_EVENT = 2; + public final static int TOUCH_EVENT = 3; + public final static int ZOOM_EVENT = 4; + public final static int DBLCLK_EVENT = 5; + public final static int FLICK_EVENT = 6; + public final static int RELATIVE_DRAG_EVENT = 7; + +} Modified: trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java =================================================================== --- trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/com/sparshui/client/ClientToServerProtocol.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -4,12 +4,12 @@ import java.net.Socket; import java.util.List; +import com.sparshui.GestureType; import com.sparshui.common.ClientProtocol; import com.sparshui.common.Event; import com.sparshui.common.Location; import com.sparshui.common.messages.events.*; import com.sparshui.common.utils.Converter; -import com.sparshui.gestures.GestureType; /** * ClientToServerProtocol implements the Client side protocol. It is the Modified: trunk/Jmol/src/com/sparshui/client/SparshClient.java =================================================================== --- trunk/Jmol/src/com/sparshui/client/SparshClient.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/com/sparshui/client/SparshClient.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -2,9 +2,9 @@ import java.util.List; +import com.sparshui.GestureType; import com.sparshui.common.Event; import com.sparshui.common.Location; -import com.sparshui.gestures.GestureType; /** * The Client interface must be implemented in all clients wishing Deleted: trunk/Jmol/src/com/sparshui/gestures/GestureType.java =================================================================== --- trunk/Jmol/src/com/sparshui/gestures/GestureType.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/com/sparshui/gestures/GestureType.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -1,48 +0,0 @@ -package com.sparshui.gestures; - -/** - * This class is a place for the enum GestureType to stand. - * If you modify this class, you must also modify the corresponding - * enum in GestureType.h in the C++ Gesture Server. ALWAYS assign - * this enum value to a 4-byte network-ordered integer before attempting - * to transmit this value over the network. - * - * Adapted by Bob Hanson as an implementable class - * - * @author Jay Roltgen - * - */ -public class GestureType { - - public String sType = null; - public int iType = Integer.MAX_VALUE; - public GestureType(String type) { - // class name, such as "org.jmol.multitouch.sparshui.TwoPointGesture" - sType = type; - } - - public GestureType(int type) { - // built-in SparshUI gestures; not implemented for Jmol - iType = type; - } - - public final static int DRAG_GESTURE = 0; - public final static int MULTI_POINT_DRAG_GESTURE = 1; - public final static int ROTATE_GESTURE = 2; - public final static int SPIN_GESTURE = 3; - public final static int TOUCH_GESTURE = 4; - public final static int ZOOM_GESTURE = 5; - public final static int DBLCLK_GESTURE = 6; - public final static int FLICK_GESTURE = 7; - public final static int RELATIVE_DRAG_GESTURE = 8; - - public static final int DRAG_EVENT = 0; - public static final int ROTATE_EVENT = 1; - public static final int SPIN_EVENT = 2; - public final static int TOUCH_EVENT = 3; - public final static int ZOOM_EVENT = 4; - public final static int DBLCLK_EVENT = 5; - public final static int FLICK_EVENT = 6; - public final static int RELATIVE_DRAG_EVENT = 7; - -} Modified: trunk/Jmol/src/com/sparshui/server/ClientConnection.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/ClientConnection.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/com/sparshui/server/ClientConnection.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -import com.sparshui.gestures.GestureType; +import com.sparshui.GestureType; /** * Represents a network connection to a client. Modified: trunk/Jmol/src/com/sparshui/server/GestureFactory.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/GestureFactory.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/com/sparshui/server/GestureFactory.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -2,8 +2,8 @@ import org.jmol.util.Logger; +import com.sparshui.GestureType; import com.sparshui.gestures.Gesture; -import com.sparshui.gestures.GestureType; //import com.sparshui.gestures.Flick; //import com.sparshui.gestures.GestureType; Modified: trunk/Jmol/src/com/sparshui/server/Group.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/Group.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/com/sparshui/server/Group.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.List; +import com.sparshui.GestureType; import com.sparshui.common.Event; import com.sparshui.common.TouchState; import com.sparshui.gestures.Gesture; -import com.sparshui.gestures.GestureType; /** * Represents a group of touch points Modified: trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java =================================================================== --- trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/com/sparshui/server/ServerToClientProtocol.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -7,10 +7,10 @@ import java.util.ArrayList; import java.util.List; +import com.sparshui.GestureType; import com.sparshui.common.ClientProtocol; import com.sparshui.common.Event; import com.sparshui.common.utils.Converter; -import com.sparshui.gestures.GestureType; /** * Represents the server to client connection. Modified: trunk/Jmol/src/org/jmol/api/ApiPlatform.java =================================================================== --- trunk/Jmol/src/org/jmol/api/ApiPlatform.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/api/ApiPlatform.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -1,5 +1,7 @@ package org.jmol.api; +import javax.vecmath.Point3f; + import org.jmol.g3d.Font3D; import org.jmol.viewer.ActionManager; import org.jmol.viewer.Viewer; @@ -10,6 +12,10 @@ /////// Display + void convertPointFromScreen(Object display, Point3f ptTemp); + + void getFullScreenDimensions(Object display, int[] widthHeight); + boolean hasFocus(Object display); String prompt(String label, String data, String[] list, boolean asButtons); Modified: trunk/Jmol/src/org/jmol/awt/Display.java =================================================================== --- trunk/Jmol/src/org/jmol/awt/Display.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/awt/Display.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -9,6 +9,8 @@ import java.awt.image.MemoryImageSource; import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; +import javax.vecmath.Point3f; import org.jmol.api.JmolViewer; import org.jmol.util.TextFormat; @@ -23,6 +25,17 @@ class Display { + /** + * @param display + * @param widthHeight + * + */ + static void getFullScreenDimensions(Object display, int[] widthHeight) { + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + widthHeight[0] = d.width; + widthHeight[1] = d.height; + } + static boolean hasFocus(Object display) { return ((Component) display).hasFocus(); } @@ -99,5 +112,13 @@ } + public static void convertPointFromScreen(Object display, Point3f ptTemp) { + Point xyTemp = new Point(); + xyTemp.x = (int) ptTemp.x; + xyTemp.y = (int) ptTemp.y; + SwingUtilities.convertPointFromScreen(xyTemp, (Component) display); + ptTemp.set(xyTemp.x, xyTemp.y, Float.NaN); + } + } Modified: trunk/Jmol/src/org/jmol/awt/Platform.java =================================================================== --- trunk/Jmol/src/org/jmol/awt/Platform.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/awt/Platform.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -1,5 +1,7 @@ package org.jmol.awt; +import javax.vecmath.Point3f; + import netscape.javascript.JSObject; import org.jmol.api.ApiPlatform; @@ -20,6 +22,14 @@ ///// Display + public void convertPointFromScreen(Object display, Point3f ptTemp) { + Display.convertPointFromScreen(display, ptTemp); + } + + public void getFullScreenDimensions(Object display, int[] widthHeight) { + Display.getFullScreenDimensions(display, widthHeight); + } + public JmolPopupInterface getMenuPopup(Viewer viewer, String menuStructure, char type) { JmolPopupInterface jmolpopup = (JmolPopupInterface) Interface.getOptionInterface( type == 'j' ? "popup.JmolPopup" : "modelkit.ModelKitPopup"); Modified: trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/multitouch/ActionManagerMT.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -36,7 +36,7 @@ import org.jmol.viewer.Viewer; import org.jmol.viewer.binding.Binding; -import com.sparshui.gestures.GestureType; +import com.sparshui.GestureType; public class ActionManagerMT extends ActionManager implements JmolMultiTouchClient { @@ -60,12 +60,16 @@ boolean isSimulated = (commandOptions.indexOf("-multitouch-sparshui-simulated") >= 0); boolean isJNI = (commandOptions.indexOf("-multitouch-jni") >= 0); boolean isMP = (commandOptions.indexOf("-multitouch-mp") >= 0); - if (isMP) { + boolean isTablet = (commandOptions.indexOf("-multitouch-tab") >= 0); + + if (isMP || isTablet) { haveMultiTouchInput = true; groupID = 0; } else { groupID = ((int) (Math.random() * 0xFFFFFF)) << 4; } + if (isTablet) + return; String className = (isSparsh ? "multitouch.sparshui.JmolSparshClientAdapter" : "multitouch.jni.JmolJniClientAdapter"); adapter = (JmolMultiTouchAdapter) Interface.getOptionInterface(className); Logger.info("ActionManagerMT SparshUI groupID=" + groupID); @@ -359,6 +363,7 @@ @Override protected float getExitRate() { long dt = dragGesture.getTimeDifference(2); + System.out.println("ActionManMT getExitRate " + dt + " " + MININUM_GESTURE_DELAY_MILLISECONDS ); return (dt > (MININUM_GESTURE_DELAY_MILLISECONDS << 3) ? 0 : dragGesture.getSpeedPixelsPerMillisecond(2, 1)); } Modified: trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClient.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClient.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClient.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -28,7 +28,7 @@ import javax.vecmath.Point3f; -import com.sparshui.gestures.GestureType; +import com.sparshui.GestureType; public interface JmolMultiTouchClient { Modified: trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClientAdapter.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/multitouch/JmolMultiTouchClientAdapter.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -23,12 +23,6 @@ */ package org.jmol.multitouch; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Point; -import java.awt.Toolkit; - -import javax.swing.SwingUtilities; import javax.vecmath.Point3f; import org.jmol.util.Logger; @@ -37,8 +31,9 @@ public abstract class JmolMultiTouchClientAdapter implements JmolMultiTouchAdapter { protected JmolMultiTouchClient actionManager; - protected Component display; protected boolean isServer; + private Viewer viewer; + private int[] screen = new int[2]; public boolean isServer() { return isServer; @@ -47,34 +42,26 @@ // methods Jmol needs -- from viewer.ActionManagerMT public abstract void dispose(); - + public boolean setMultiTouchClient(Viewer viewer, JmolMultiTouchClient client, boolean isSimulation) { - this.display = (Component) viewer.getDisplay(); + this.viewer = viewer; actionManager = client; // ActionManagerMT + viewer.getApiPlatform().getFullScreenDimensions(viewer.getDisplay(), screen); + if (Logger.debugging) + Logger.info("screen resolution: " + screen[0] + " x " + screen[1]); return true; } - private static int screenWidth, screenHeight; - static { - Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); - screenWidth = screen.width; - screenHeight = screen.height; - if (Logger.debugging) - Logger.info("screen resolution: " + screenWidth + " x " + screenHeight); - } - public void mouseMoved(int x, int y) { // for debugging purposes //System.out.println("mouseMove " + x + " " + y); } - protected Point xyTemp = new Point(); protected Point3f ptTemp = new Point3f(); protected void fixXY(float x, float y, boolean isAbsolute) { - xyTemp.setLocation(x * screenWidth, y * screenHeight); + ptTemp.set(x * screen[0], y * screen[1], Float.NaN); if (isAbsolute) - SwingUtilities.convertPointFromScreen(xyTemp, display); - ptTemp.set(xyTemp.x, xyTemp.y, Float.NaN); + viewer.getApiPlatform().convertPointFromScreen(viewer.getDisplay(), ptTemp); } } Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/JmolSparshClientAdapter.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -36,6 +36,7 @@ import org.jmol.util.Logger; import org.jmol.viewer.Viewer; +import com.sparshui.GestureType; import com.sparshui.client.SparshClient; import com.sparshui.client.ClientServerConnection; import com.sparshui.common.Event; @@ -45,7 +46,6 @@ import com.sparshui.common.messages.events.RotateEvent; import com.sparshui.common.messages.events.TouchEvent; import com.sparshui.common.messages.events.ZoomEvent; -import com.sparshui.gestures.GestureType; public class JmolSparshClientAdapter extends JmolMultiTouchClientAdapter implements SparshClient { @@ -164,7 +164,7 @@ if (actionManager == null) return 0; fixXY(location.getX(), location.getY(), true); - return (actionManager == null ? 0 : actionManager.getGroupID(xyTemp.x, xyTemp.y)); + return (actionManager == null ? 0 : actionManager.getGroupID((int) ptTemp.x, (int) ptTemp.y)); } /* mouse click: Modified: trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java =================================================================== --- trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/multitouch/sparshui/SinglePointGesture.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -4,11 +4,11 @@ import java.util.List; import org.jmol.util.Logger; +import com.sparshui.GestureType; import com.sparshui.common.Event; import com.sparshui.common.TouchState; import com.sparshui.common.messages.events.TouchEvent; import com.sparshui.gestures.Gesture; -import com.sparshui.gestures.GestureType; import com.sparshui.server.TouchPoint; /** Modified: trunk/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -2058,6 +2058,7 @@ } int add(int action, int x, int y, long time) { + System.out.println("ActionMan gesture add " + action + " " + x + " " + y + " " + time); this.action = action; getNode(ptNext).set(ptNext, x, y, time - time0); ptNext++; @@ -2075,6 +2076,7 @@ public float getSpeedPixelsPerMillisecond(int nPoints, int nPointsPrevious) { nPoints = getPointCount(nPoints, nPointsPrevious); + System.out.println("ActionMan getSpeed " + nPoints + " " + nPointsPrevious); if (nPoints < 2) return 0; MotionPoint mp1 = getNode(ptNext - 1 - nPointsPrevious); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-10-22 23:06:46 UTC (rev 16387) @@ -3,6 +3,8 @@ version=12.3.3_dev +# code: refactored for Molecular Playground and Jmol Android +# -- several System.out. messages present. # bug fix: reading of JVXL files for color density fails to color properly # code: refactoring adapter XML readers # bug fix: .... vdw 100.0% --- should be OK with float there, even if it rounds. Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -423,6 +423,8 @@ htmlName = (i < 0 ? fullName : fullName.substring(0, i)); syncId = (i < 0 ? "" : fullName.substring(i + 1, fullName.length() - 1)); String str = appletContext; + if (str.indexOf("-debug") >= 0) + Logger.setLogLevel(Logger.LEVEL_DEBUG); isPrintOnly = (appletContext.indexOf("-p") >= 0); isApplet = (appletContext.indexOf("-applet") >= 0); if (isApplet) { @@ -448,9 +450,6 @@ if ((i = str.indexOf("-maximumSize ")) >= 0) setMaximumSize(Parser.parseInt(str.substring(i + 13))); - useCommandThread = (str.indexOf("-threaded") >= 0); - if (useCommandThread) - scriptManager.startCommandWatcher(true); } else { // not an applet -- used to pass along command line options g3d.setBackgroundTransparent(str.indexOf("-b") >= 0); @@ -464,6 +463,9 @@ autoExit = (str.indexOf("-x") >= 0); cd("."); } + useCommandThread = (str.indexOf("-threaded") >= 0); + if (useCommandThread) + scriptManager.startCommandWatcher(true); isPreviewOnly = (str.indexOf("#previewOnly") >= 0); setBooleanProperty("_applet", isApplet); setBooleanProperty("_signedApplet", isSignedApplet); @@ -8625,6 +8627,7 @@ @Override public void syncScript(String script, String applet, int port) { + System.out.println("viewer syncscript " + script); if (script != null && script.equalsIgnoreCase(SYNC_GRAPHICS_MESSAGE)) { statusManager.setSyncDriver(StatusManager.SYNC_STEREO); statusManager.syncSend(script, applet, 0); Modified: trunk/Jmol/src/org/molecularplayground/MPJmolApp.java =================================================================== --- trunk/Jmol/src/org/molecularplayground/MPJmolApp.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/molecularplayground/MPJmolApp.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -39,6 +39,10 @@ new MPJmolApp(args.length > 1 ? Integer.parseInt(args[1]) : 31416); } + public MPJmolApp() { + this(31416); + } + public MPJmolApp(int port) { startJsonNioKiosk(port); } @@ -46,7 +50,7 @@ private JsonNioService service; private BannerFrame bannerFrame; private KioskFrame kioskFrame; - + private void startJsonNioKiosk(int port) { KioskPanel kioskPanel = new KioskPanel(); bannerFrame = new BannerFrame(1024, 75); @@ -54,7 +58,7 @@ try { setBannerLabel("click below and type exitJmol[enter] to quit"); jmolViewer - .script("set allowKeyStrokes;set zoomLarge false;set frank off;set antialiasdisplay off"); + .script("set allowgestures;set allowKeyStrokes;set zoomLarge false;set frank off;set antialiasdisplay off"); String path = System.getProperty("user.dir").replace('\\', '/') + "/Content-Cache/%ID%/%ID%.json"; jmolViewer.script("NIOcontentPath=\"" + path + "\";NIOterminatorMessage='MP_DONE'"); Modified: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JsonNioService.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JsonNioService.java 2011-10-22 22:59:12 UTC (rev 16386) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JsonNioService.java 2011-10-22 23:06:46 UTC (rev 16387) @@ -28,7 +28,6 @@ import java.io.FileInputStream; import java.io.IOException; import java.net.InetSocketAddress; -import java.util.Calendar; import javax.vecmath.Point3f; @@ -281,7 +280,7 @@ try { while (!halt) { selectNonBlocking(); - long now = Calendar.getInstance().getTimeInMillis(); + long now = System.currentTimeMillis(); // No commands for 5 seconds = unpause/restore Jmol if (isPaused && now - lastMoveTime > 5000) pauseScript(false); @@ -395,13 +394,20 @@ } } + private int nFast; + private float swipeCutoff = 100; + private int swipeCount = 2; + private float swipeDelayMs = 3000; + private long lastTime; + private long swipeStart; + private float swipeFactor = 30; protected void processMessage(byte[] packet, NIOSocket socket) { try { String msg = new String(packet); + Logger.info("JNIOS received " + msg + " " + + Thread.currentThread().getName()); if (jmolViewer == null) { - Logger.info("JNIOS " + Thread.currentThread().getName() + " received " - + msg); return; } JSONObject json = new JSONObject(msg); @@ -447,11 +453,35 @@ .getString("style")); if (iStyle != 0 && !isPaused) pauseScript(true); - lastMoveTime = Calendar.getInstance().getTimeInMillis(); + lastMoveTime = System.currentTimeMillis(); switch (iStyle) { case 0: // rotate - jmolViewer.syncScript("Mouse: rotateXYBy " + json.getString("x") - + " " + json.getString("y"), "~", 0); + System.out.println("ls " + (lastMoveTime) + " " + swipeStart + " " + (lastMoveTime - swipeStart)); + if (lastMoveTime - swipeStart > swipeDelayMs) { + // it's been a while since the last swipe.... + float dx = (float) json.getDouble("x"); + float dy = (float) json.getDouble("y"); + float dxdy = dx * dx + dy * dy; + // ... send rotation in all cases + System.out.println("JNS - nFast=" + nFast + " " + + dxdy); + msg = "Mouse: rotateXYBy " + dx + " " + dy; + if (dxdy > swipeCutoff) { + if (++nFast > swipeCount) { + // critical number of fast motions reached + // start spinning + swipeStart = lastMoveTime; + msg = "Mouse: spinXYBy " + (int) dx + " " + (int) dy + " " + (Math.sqrt(dxdy) * swipeFactor /(lastMoveTime - lastTime)); + } + } else if (nFast > 0) { + // slow movement detected -- turn off spinning + // and reset the + nFast = 0; + msg = "Mouse: spinXYBy 0 0 0"; + } + jmolViewer.syncScript(msg, "~", 0); + } + lastTime = lastMoveTime; break; case 10: // translate jmolViewer.syncScript("Mouse: translateXYBy " + json.getString("x") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2012-02-03 15:02:56
|
Revision: 16726 http://jmol.svn.sourceforge.net/jmol/?rev=16726&view=rev Author: hansonr Date: 2012-02-03 15:02:44 +0000 (Fri, 03 Feb 2012) Log Message: ----------- looking for finalization problems Modified Paths: -------------- trunk/Jmol/src/JmolApplet.java trunk/Jmol/src/org/jmol/api/JmolPopupInterface.java trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/applet/JmolAppletInterface.java trunk/Jmol/src/org/jmol/applet/JmolAppletRegistry.java trunk/Jmol/src/org/jmol/popup/SwingPopup.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Added Paths: ----------- trunk/Jmol/src/org/jmol/applet/JmolSyncedAppletInterface.java Modified: trunk/Jmol/src/JmolApplet.java =================================================================== --- trunk/Jmol/src/JmolApplet.java 2012-02-03 05:46:29 UTC (rev 16725) +++ trunk/Jmol/src/JmolApplet.java 2012-02-03 15:02:44 UTC (rev 16726) @@ -31,8 +31,10 @@ * */ + import org.jmol.applet.AppletWrapper; import org.jmol.applet.JmolAppletInterface; +import org.jmol.applet.JmolSyncedAppletInterface; import netscape.javascript.JSObject; @@ -217,4 +219,9 @@ return null; } + public void registerApplet(String appletID, JmolSyncedAppletInterface applet) { + if (wrappedApplet != null) + wrappedApplet.registerApplet(appletID, applet); + } + } Modified: trunk/Jmol/src/org/jmol/api/JmolPopupInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolPopupInterface.java 2012-02-03 05:46:29 UTC (rev 16725) +++ trunk/Jmol/src/org/jmol/api/JmolPopupInterface.java 2012-02-03 15:02:44 UTC (rev 16726) @@ -13,5 +13,7 @@ public void show(int x, int y); public void updateComputedMenus(); + + public void dispose(); } Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2012-02-03 05:46:29 UTC (rev 16725) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2012-02-03 15:02:44 UTC (rev 16726) @@ -256,7 +256,7 @@ String ms = getParameter("mayscript"); mayScript = (ms != null) && (!ms.equalsIgnoreCase("false")); - JmolAppletRegistry.checkIn(fullName, appletWrapper); + JmolAppletRegistry.checkIn(fullName, (JmolSyncedAppletInterface) appletWrapper); initWindows(); initApplication(); } @@ -653,29 +653,23 @@ } public void script(String script) { - if (script == null || script.length() == 0) - return; - //System.out.println("Jmol.java script " + script); - scriptProcessor(script, null, SCRIPT_NOWAIT); + scriptNoWait(script); } - public String scriptCheck(String script) { + public String scriptNoWait(String script) { if (script == null || script.length() == 0) return ""; - return scriptProcessor(script, null, SCRIPT_CHECK); + return scriptProcessor(script, null, SCRIPT_NOWAIT); } - public String scriptNoWait(String script) { + public String scriptCheck(String script) { if (script == null || script.length() == 0) return ""; - return scriptProcessor(script, null, SCRIPT_NOWAIT); + return scriptProcessor(script, null, SCRIPT_CHECK); } public String scriptWait(String script) { - if (script == null || script.length() == 0) - return ""; - outputBuffer = null; - return scriptProcessor(script, null, SCRIPT_WAIT); + return scriptWait(script, null); } public String scriptWait(String script, String statusParams) { @@ -1268,7 +1262,7 @@ gRight = null; for (int i = 0; i < nApplets; i++) { String theApplet = apps.get(i); - JmolAppletInterface app = (JmolAppletInterface) JmolAppletRegistry.htRegistry + JmolSyncedAppletInterface app = (JmolSyncedAppletInterface) JmolAppletRegistry.htRegistry .get(theApplet); if (Logger.debugging) Logger.debug(fullName + " sending to " + theApplet + ": " + script); @@ -1293,4 +1287,8 @@ } } + + public void registerApplet(String appletID, JmolSyncedAppletInterface applet) { + JmolAppletRegistry.checkIn(appletID, applet); + } } Modified: trunk/Jmol/src/org/jmol/applet/JmolAppletInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/JmolAppletInterface.java 2012-02-03 05:46:29 UTC (rev 16725) +++ trunk/Jmol/src/org/jmol/applet/JmolAppletInterface.java 2012-02-03 15:02:44 UTC (rev 16726) @@ -33,9 +33,8 @@ * */ -public interface JmolAppletInterface { +public interface JmolAppletInterface extends JmolSyncedAppletInterface { - public Object setStereoGraphics(boolean isStereo); public String getPropertyAsString(String infoType); public String getPropertyAsString(String infoType, String paramInfo); public String getPropertyAsJSON(String infoType); @@ -47,12 +46,9 @@ public String loadNodeId(String nodeId); public String loadDOMNode(JSObject DOMNode); public void script(String script); - public String scriptNoWait(String script); public String scriptCheck(String script); public String scriptWait(String script); - public String scriptWait(String script, String statusParams); public String scriptWaitOutput(String script); - public void syncScript(String script); // Note -- some Macintosh-based browsers cannot distinguish methods // with the same name but with different method signatures Modified: trunk/Jmol/src/org/jmol/applet/JmolAppletRegistry.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/JmolAppletRegistry.java 2012-02-03 05:46:29 UTC (rev 16725) +++ trunk/Jmol/src/org/jmol/applet/JmolAppletRegistry.java 2012-02-03 15:02:44 UTC (rev 16726) @@ -38,7 +38,7 @@ static Map<String, Object> htRegistry = new Hashtable<String, Object>(); - synchronized static void checkIn(String name, Applet applet) { + synchronized static void checkIn(String name, JmolSyncedAppletInterface applet) { cleanRegistry(); if (name != null) { Logger.info("AppletRegistry.checkIn(" + name + ")"); @@ -83,12 +83,12 @@ } synchronized private static void cleanRegistry() { - AppletWrapper app = null; + Applet app = null; boolean closed = true; for (Map.Entry<String, Object> entry : htRegistry.entrySet()) { String theApplet = entry.getKey(); try { - app = (AppletWrapper) (entry.getValue()); + app = (Applet) (entry.getValue()); JSObject theWindow = JSObject.getWindow(app); //System.out.print("checking " + app + " window : "); closed = ((Boolean) theWindow.getMember("closed")).booleanValue(); Added: trunk/Jmol/src/org/jmol/applet/JmolSyncedAppletInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/JmolSyncedAppletInterface.java (rev 0) +++ trunk/Jmol/src/org/jmol/applet/JmolSyncedAppletInterface.java 2012-02-03 15:02:44 UTC (rev 16726) @@ -0,0 +1,22 @@ +package org.jmol.applet; + + +/* + * This interface can be used by any applet to register itself + * with Jmol and thus allow direct applet-applet scripting and + * syncing operations. + * + */ +public interface JmolSyncedAppletInterface { + + public abstract Object setStereoGraphics(boolean isStereo); + + public abstract String scriptWait(String script, String statusParams); + + public abstract String scriptNoWait(String script); + + public abstract void syncScript(String script); + + public abstract void registerApplet(String appletID, JmolSyncedAppletInterface applet); + +} Modified: trunk/Jmol/src/org/jmol/popup/SwingPopup.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/SwingPopup.java 2012-02-03 05:46:29 UTC (rev 16725) +++ trunk/Jmol/src/org/jmol/popup/SwingPopup.java 2012-02-03 15:02:44 UTC (rev 16726) @@ -54,6 +54,12 @@ */ abstract public class SwingPopup extends GenericPopup { + + @Override + public void finalize() { + System.out.println("SwingPopup Finalize " + this); + } + private final static int MENUITEM_HEIGHT = 20; private MenuItemListener mil; @@ -64,6 +70,34 @@ // required by reflection } + public void dispose() { + clearListeners(popupMenu); + clearListeners(frankPopup); + popupMenu = null; + frankPopup = null; + } + + private void clearListeners(Object menu) { + if (menu == null) + return; + Component[] subMenus = (menu instanceof JPopupMenu ? ((JPopupMenu) menu) + .getComponents() : ((JMenu) menu).getPopupMenu().getComponents()); + for (int i = 0; i < subMenus.length; i++) { + Component m = subMenus[i]; + if (m instanceof JMenu) { + clearListeners(((JMenu) m).getPopupMenu()); + } else { + try { + m.removeMouseListener(mfl); + ((AbstractButton) m).removeActionListener(mil); + ((AbstractButton) m).removeItemListener(cmil); + } catch (Exception e) { + // ignore + } + } + } + } + public void show(int x, int y) { // main entry point from Viewer // called via JmolPopupInterface @@ -158,9 +192,10 @@ JMenuItem jmi = new JMenuItem(entry); updateButton(jmi, entry, script); jmi.addActionListener(mil); - jmi.addMouseListener(mfl); - if (id != null && id.startsWith("Focus")) + if (id != null && id.startsWith("Focus")) { + jmi.addMouseListener(mfl); id = ((Component) menu).getName() + "." + id; + } jmi.setName(id == null ? ((Component) menu).getName() + "." : id); addToMenu(menu, jmi); return jmi; Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2012-02-03 05:46:29 UTC (rev 16725) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2012-02-03 15:02:44 UTC (rev 16726) @@ -1738,6 +1738,10 @@ scriptManager.startCommandWatcher(false); scriptManager.interruptQueueThreads(); g3d.destroy(); + if (jmolpopup != null) + jmolpopup.dispose(); + if (modelkitPopup != null) + modelkitPopup.dispose(); try { if (appConsole != null) { appConsole.dispose(); @@ -5693,6 +5697,7 @@ language = GT.getLanguage(); modelkitPopup = null; if (jmolpopup != null) { + jmolpopup.dispose(); jmolpopup = null; getPopupMenu(); } @@ -7775,6 +7780,8 @@ } return scriptEditor; case 120: + if (jmolpopup != null) + jmolpopup.dispose(); jmolpopup = null; return menuStructure = (String) paramInfo; case 140: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |