From: <ha...@us...> - 2011-10-10 19:37:19
|
Revision: 16301 http://jmol.svn.sourceforge.net/jmol/?rev=16301&view=rev Author: hansonr Date: 2011-10-10 19:37:12 +0000 (Mon, 10 Oct 2011) Log Message: ----------- Modified Paths: -------------- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java Modified: trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java =================================================================== --- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-10 12:25:14 UTC (rev 16300) +++ trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-10 19:37:12 UTC (rev 16301) @@ -60,12 +60,15 @@ imageView = (SurfaceView) findViewById(R.id.imageMolecule); if (viewer == null) { - + updateListener = new AndroidUpdateListener(); + // bit of a chicken and an egg here, but + // we pass the updateListener to viewer, where it will be called + // the "display" and then Platform will get a call asking for an update. + // not sure about the rest of it! viewer = JmolViewer - .allocateViewer(null, new SmarterJmolAdapter(), null, null, null, + .allocateViewer(updateListener, new SmarterJmolAdapter(), null, null, null, "platform=org.openscience.jmolandroid.api.platform", this); - - updateListener = new AndroidUpdateListener(viewer, imageView); + updateListener.set(viewer, imageView); } if (viewer.getAtomCount() > 0 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-10-10 19:38:00
|
Revision: 16302 http://jmol.svn.sourceforge.net/jmol/?rev=16302&view=rev Author: hansonr Date: 2011-10-10 19:37:54 +0000 (Mon, 10 Oct 2011) Log Message: ----------- Modified Paths: -------------- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java Modified: trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java =================================================================== --- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-10 19:37:12 UTC (rev 16301) +++ trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-10 19:37:54 UTC (rev 16302) @@ -67,7 +67,7 @@ // not sure about the rest of it! viewer = JmolViewer .allocateViewer(updateListener, new SmarterJmolAdapter(), null, null, null, - "platform=org.openscience.jmolandroid.api.platform", this); + "platform=org.openscience.jmolandroid.api.Platform", this); updateListener.set(viewer, imageView); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-10-10 19:49:57
|
Revision: 16303 http://jmol.svn.sourceforge.net/jmol/?rev=16303&view=rev Author: hansonr Date: 2011-10-10 19:49:51 +0000 (Mon, 10 Oct 2011) Log Message: ----------- Modified Paths: -------------- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java Modified: trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java =================================================================== --- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-10 19:37:54 UTC (rev 16302) +++ trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-10 19:49:51 UTC (rev 16303) @@ -55,6 +55,9 @@ @Override protected void onResume() { super.onResume(); + + // am I correct that imageView is null if and only if viewer is null? + // otherwise we could have a different imageView in updateListener than here if (imageView == null) imageView = (SurfaceView) findViewById(R.id.imageMolecule); @@ -217,60 +220,69 @@ @Override public String createImage(String fileName, String type, Object textOrBytes, int quality) { + // ignore // TODO Auto-generated method stub return null; } @Override public String eval(String strEval) { + // ignore // TODO Auto-generated method stub return null; } @Override public float[][] functionXY(String functionName, int x, int y) { + // ignore // TODO Auto-generated method stub return null; } @Override public float[][][] functionXYZ(String functionName, int nx, int ny, int nz) { + // ignore // TODO Auto-generated method stub return null; } @Override public Map<String, Object> getRegistryInfo() { + // ignore // TODO Auto-generated method stub return null; } @Override public void resizeInnerPanel(String data) { + // ignore // TODO Auto-generated method stub } @Override public void showUrl(String url) { - // TODO Auto-generated method stub - + // ignore + // TODO Auto-generated method stub } @Override public void notifyCallback(EnumCallback message, Object[] data) { + // probably ignore // TODO Auto-generated method stub } @Override public boolean notifyEnabled(EnumCallback type) { + // probably ignore // TODO Auto-generated method stub return false; } @Override public void setCallbackFunction(String callbackType, String callbackFunction) { + // ignore -- applet only // TODO Auto-generated method stub } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-10-11 13:27:01
|
Revision: 16324 http://jmol.svn.sourceforge.net/jmol/?rev=16324&view=rev Author: hansonr Date: 2011-10-11 13:26:50 +0000 (Tue, 11 Oct 2011) Log Message: ----------- Jmol-Android first pass success -- loads and displays caffeine.xyz Modified Paths: -------------- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java Modified: trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java =================================================================== --- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-11 13:22:02 UTC (rev 16323) +++ trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-11 13:26:50 UTC (rev 16324) @@ -78,6 +78,7 @@ viewer = JmolViewer .allocateViewer(updateListener, new SmarterJmolAdapter(), null, null, null, "platform=org.openscience.jmolandroid.api.Platform", this); + viewer.script("load http://chemapps.stolaf.edu/jmol/docs/examples-12/data/caffeine.xyz"); } Log.w("AMOL","onResume... viewer=" + viewer); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-10-21 04:44:23
|
Revision: 16384 http://jmol.svn.sourceforge.net/jmol/?rev=16384&view=rev Author: hansonr Date: 2011-10-21 04:44:17 +0000 (Fri, 21 Oct 2011) Log Message: ----------- Modified Paths: -------------- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java Modified: trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java =================================================================== --- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-20 22:04:23 UTC (rev 16383) +++ trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-21 04:44:17 UTC (rev 16384) @@ -17,7 +17,6 @@ import android.content.Context; import android.content.Intent; import android.graphics.Canvas; -import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.Menu; @@ -30,32 +29,17 @@ public class JmolActivity extends Activity implements JmolStatusListener { /* - * Mario: + * General signal flow -- two cases: * - * It seems to me we need to subclass ImageView so that we can add the + * I. System calls onDraw(Canvas) for whatever reason. + * Jmol draws onto it * - * onDraw(Canvas) + * II. Jmol gets a user event or script completion or DELAY command + * and needs an update + * Jmol triggers imageView.postInvalidate() + * System calls onDraw(Canvas) * - * method. The sequence should be: * - * - * I. - * System calls onDraw(Canvas) - * Jmol draws onto it - * - * II. - * Jmol gets an event and needs an update - * Jmol sends imageView.invalidate() - * System calls onDraw(Canvas) - * - * - * but I don't see yet how you get that started. - * - * Bob - * - * - * - * */ @@ -97,7 +81,7 @@ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(imageView = new JmolImageView(this.getBaseContext())); + setContentView(imageView = new JmolImageView(getBaseContext())); imageView.setWillNotDraw(false); viewer = null; SCALE_FACTOR = getResources().getDisplayMetrics().density + 0.5f; @@ -154,7 +138,7 @@ if (viewer.getAtomCount() > 0) {// && !updateListener.isShowingDialog()) { imageView.invalidate(); } else { - // this.setTitle(R.string.app_name); + // setTitle(R.string.app_name); if (!opening) { imageView.post(new Runnable() { @Override @@ -173,14 +157,26 @@ @Override public void onBackPressed() { - this.finish(); + finish(); }; + public void dismissDialog() { + // TODO Auto-generated method stub + if (pd == null) + return; + pd.dismiss(); + pd = null; + } + + public void repaint() { + Log.w("Jmol", "JmolActivity repaint " + imageView); + dismissDialog(); + if (imageView != null) + imageView.postInvalidate(); + } + @Override public boolean onTouchEvent(final MotionEvent event) { - // don't process other touch events when zooming - // if (scaleDetector.onTouchEvent(event)) - // return true; final int index = event.findPointerIndex(0); if (index < 0 || updateListener == null) return true; @@ -198,50 +194,17 @@ break; } - // scaleDetector.onTouchEvent(event); + scaleDetector.onTouchEvent(event); if (e != Integer.MIN_VALUE) updateListener.mouseEvent(e, (int) event.getX(index), (int) event.getY(index), Event.MOUSE_LEFT, event.getEventTime()); -/* - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - new AsyncTask<MotionEvent, Void, Void>() { - @Override - protected Void doInBackground(MotionEvent... event) { - updateListener.mouseEvent(Event.MOUSE_DOWN, (int) event[index].getX(), - (int) event[index].getY(), Event.MOUSE_LEFT, event[index].getDownTime()); - return null; - } - }.execute(event); - break; - case MotionEvent.ACTION_MOVE: - new AsyncTask<MotionEvent, Object, Object>() { - @Override - protected Void doInBackground(MotionEvent... event) { - updateListener.mouseEvent(Event.MOUSE_DRAG, (int) event[index].getX(), - (int) event[index].getY(), Event.MOUSE_LEFT, event[index].getDownTime()); - return null; - } - }.execute(event); - break; - case MotionEvent.ACTION_UP: - new AsyncTask<MotionEvent, Object, Object>() { - @Override - protected Void doInBackground(MotionEvent... event) { - updateListener.mouseEvent(Event.MOUSE_UP, (int) event[index].getX(), - (int) event[index].getY(), Event.MOUSE_LEFT, event[index].getDownTime()); - return null; - } - }.execute(event); - break; - } -*/ return true; }; private class PinchZoomScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { + @Override public boolean onScale(final ScaleGestureDetector detector) { Log.w("JMOL", "old zoom=" + viewer.getZoomPercentFloat()); @@ -289,14 +252,14 @@ case R.id.open: File path = Downloader.getAppDir(this); - Intent intent = new Intent(this.getBaseContext(), FileDialog.class); + Intent intent = new Intent(getBaseContext(), FileDialog.class); intent.putExtra(FileDialog.START_PATH, path.getAbsolutePath()); - this.startActivityForResult(intent, REQUEST_OPEN); + startActivityForResult(intent, REQUEST_OPEN); break; case R.id.download: - Intent dnIntent = new Intent(this.getBaseContext(), + Intent dnIntent = new Intent(getBaseContext(), PDBSearchActivity.class); - this.startActivityForResult(dnIntent, REQUEST_OPEN); + startActivityForResult(dnIntent, REQUEST_OPEN); break; case R.id.cpkspacefill: viewer.script("spacefill only;color cpk"); @@ -323,7 +286,7 @@ return true; } - ProgressDialog pd; + private ProgressDialog pd; public synchronized void onActivityResult(final int requestCode, int resultCode, final Intent data) { if (resultCode == Activity.RESULT_OK) { @@ -413,19 +376,4 @@ } - public void dismissDialog() { - // TODO Auto-generated method stub - if (pd == null) - return; - pd.dismiss(); - pd = null; - } - - public void repaint() { - Log.w("Jmol", "JmolActivity repaint " + imageView); - dismissDialog(); - if (imageView != null) - imageView.postInvalidate(); - } - } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-10-23 22:45:37
|
Revision: 16391 http://jmol.svn.sourceforge.net/jmol/?rev=16391&view=rev Author: hansonr Date: 2011-10-23 22:45:29 +0000 (Sun, 23 Oct 2011) Log Message: ----------- JmolAndroid work Modified Paths: -------------- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java Modified: trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java =================================================================== --- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-23 21:52:15 UTC (rev 16390) +++ trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-23 22:45:29 UTC (rev 16391) @@ -140,7 +140,7 @@ super.onResume(); setPaused(false); - setDialog("Loading..."); + // setDialog("Loading..."); Log.w("Jmol", "onResume..." + viewer); // am I correct that imageView is null if and only if viewer is null? @@ -451,15 +451,19 @@ } protected void setDialog(String text) { - dismissDialog(); +// dismissPDialog(); pd = ProgressDialog.show(this, "", text, true); } - protected void dismissDialog() { + protected void dismissPDialog() { // TODO Auto-generated method stub if (pd == null || !resumeComplete) return; - pd.dismiss(); + try { + pd.dismiss(); + } catch (Exception e) { + // ignore + } pd = null; } @@ -468,7 +472,7 @@ // return; // drawTrigger = true; Log.w("Jmol", "JmolActivity repaint " + imageView); - dismissDialog(); + dismissPDialog(); if (paused || updating || viewer == null) return; if (imageView != null) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-10-25 04:06:02
|
Revision: 16401 http://jmol.svn.sourceforge.net/jmol/?rev=16401&view=rev Author: hansonr Date: 2011-10-25 04:05:56 +0000 (Tue, 25 Oct 2011) Log Message: ----------- Jmol android -- note that there appears to be a bug in Android that fires onCreate twice when autoRotate is enabled. Not sure how to get around this. Modified Paths: -------------- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java Modified: trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java =================================================================== --- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-25 01:26:00 UTC (rev 16400) +++ trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-25 04:05:56 UTC (rev 16401) @@ -20,6 +20,10 @@ import android.content.DialogInterface; import android.content.Intent; import android.graphics.Canvas; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; import android.os.Bundle; import android.text.InputType; import android.util.Log; @@ -81,6 +85,8 @@ private AndroidUpdateListener updateListener; private boolean opening; private ScaleGestureDetector scaleDetector; + private JmolSpinDetector spinDetector; + private boolean resumeComplete; public SurfaceView getImageView() { @@ -97,6 +103,16 @@ SCALE_FACTOR = getResources().getDisplayMetrics().density + 0.5f; scaleDetector = new ScaleGestureDetector(this, new PinchZoomScaleListener()); + SensorManager sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE); + boolean gyroExists = (sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null); + if (gyroExists) { + spinDetector = new JmolSpinDetector(); + sm.registerListener(spinDetector, + sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), + SensorManager.SENSOR_DELAY_UI); + + } + } @@ -216,17 +232,35 @@ return true; }; + private class JmolSpinDetector implements SensorEventListener { + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // huh? + } + + @Override + public void onSensorChanged(SensorEvent event) { + if (paused || updating || viewer == null) + return; + if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) { + updateOrientation(event.values[0], event.values[1], event.values[2], event.timestamp); + } + } + } + private class PinchZoomScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(final ScaleGestureDetector detector) { - Log.w("JMOL", "old zoom=" + viewer.getZoomPercentFloat()); + float zoomFactor = detector.getScaleFactor(); + float viewerZoom = viewer.getZoomPercentFloat(); + Log.w("Jmol", "old zoom=" + viewerZoom + " with detector.getScaleFactor=" + zoomFactor); - float zoomFactor = detector.getScaleFactor() - / (viewer.getZoomPercentFloat() / 100.0f); + zoomFactor /= (viewerZoom / 100.0f); viewer.syncScript("Mouse: zoomByFactor " + zoomFactor, "~", 0); - Log.w("JMOL", "changing zoom factor=" + zoomFactor); + Log.w("Jmol", "changing zoom factor=" + zoomFactor); return true; } @@ -240,6 +274,17 @@ updateListener.setScreenDimension(); }; + private final static float gyroThreshold = 1.0f; + private final static float spinFactor = 3; + + protected void updateOrientation(float x, float y, float z, long when) { + float dxyz2 = x * x + y * y; + if (dxyz2 < gyroThreshold) + return; + float speed = (float) (Math.sqrt(dxyz2) * spinFactor); + viewer.syncScript("Mouse: spinXYBy " + (int) x + " " + (int) -y + " " + speed, "=", 0); + } + @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem styleMenu = menu.findItem(R.id.style); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-10-26 04:49:33
|
Revision: 16405 http://jmol.svn.sourceforge.net/jmol/?rev=16405&view=rev Author: hansonr Date: 2011-10-26 04:49:26 +0000 (Wed, 26 Oct 2011) Log Message: ----------- JmolAndroid includes two-thumb-press-and-pan: When you hold the tablet in portrait mode and press with your thumbs near the left and right edges, as you then move around, you see the model from different perspectives. A relatively easy rotation of about 60 degrees per second gets you a natural rotation, and a gentle rocking of the tablet rocks the model in a natural fashion. Modified Paths: -------------- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java Modified: trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java =================================================================== --- trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-25 12:26:24 UTC (rev 16404) +++ trunk/Jmol-Android/src/org/openscience/jmolandroid/JmolActivity.java 2011-10-26 04:49:26 UTC (rev 16405) @@ -1,14 +1,12 @@ package org.openscience.jmolandroid; import java.io.File; -import java.util.Map; import org.jmol.adapter.smarter.SmarterJmolAdapter; import org.jmol.api.Event; -import org.jmol.api.JmolStatusListener; +import org.jmol.api.JmolCallbackListener; import org.jmol.api.JmolViewer; -import org.jmol.constant.EnumCallback; -//import org.jmol.i18n.GT; +import org.jmol.constant.EnumCallback; //import org.jmol.i18n.GT; import org.openscience.jmolandroid.api.AndroidUpdateListener; import org.openscience.jmolandroid.search.Downloader; import org.openscience.jmolandroid.search.PDBSearchActivity; @@ -36,7 +34,7 @@ import android.view.SurfaceView; import android.widget.EditText; -public class JmolActivity extends Activity implements JmolStatusListener { +public class JmolActivity extends Activity implements JmolCallbackListener { /* * General signal flow -- two cases: @@ -51,8 +49,7 @@ * * */ - - + private final static String TEST_SCRIPT = ";load http://chemapps.stolaf.edu/jmol/docs/examples-12/data/caffeine.xyz;"; //labels on; background labels white;spacefill on"; @@ -60,6 +57,8 @@ + TEST_SCRIPT; public static float SCALE_FACTOR; + + private int screenWidth, screenHeight; class JmolImageView extends SurfaceView { @@ -69,25 +68,25 @@ Log.w("Jmol", "JmolImageView " + this); } - @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); + screenWidth = canvas.getWidth(); + screenHeight = canvas.getHeight(); Log.w("Jmol", "JmolActivity onDraw"); - viewer.renderScreenImage(canvas, null, canvas.getWidth(), canvas.getHeight()); -// drawTrigger = false; + viewer.renderScreenImage(canvas, null, screenWidth, screenHeight); + // drawTrigger = false; } } - -// protected boolean drawTrigger; + // protected boolean drawTrigger; private JmolViewer viewer; private JmolImageView imageView; private AndroidUpdateListener updateListener; private boolean opening; private ScaleGestureDetector scaleDetector; private JmolSpinDetector spinDetector; - + private boolean resumeComplete; public SurfaceView getImageView() { @@ -99,7 +98,7 @@ // Ignore orientation change that restarts activity super.onConfigurationChanged(newConfig); } - + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -110,16 +109,14 @@ SCALE_FACTOR = getResources().getDisplayMetrics().density + 0.5f; scaleDetector = new ScaleGestureDetector(this, new PinchZoomScaleListener()); - SensorManager sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE); + SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); boolean gyroExists = (sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null); if (gyroExists) { spinDetector = new JmolSpinDetector(); - sm.registerListener(spinDetector, - sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), + sm.registerListener(spinDetector, sm + .getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_UI); - } - } @@ -143,28 +140,29 @@ //System.exit(0); }; -*/ - + */ + @Override protected void onPause() { Log.w("Jmol", "onPause"); super.onPause(); - setPaused(true); + setPaused(true); } - + @Override protected void onStop() { Log.w("Jmol", "onStop"); super.onStop(); + setPaused(true); } - + @Override protected void onResume() { super.onResume(); setPaused(false); - // setDialog("Loading..."); - + // setDialog("Loading..."); + Log.w("Jmol", "onResume..." + viewer); // am I correct that imageView is null if and only if viewer is null? // otherwise we could have a different imageView in updateListener than here @@ -178,9 +176,16 @@ // we pass the updateListener to viewer, where it will be called // the "display" and then Platform will get a call asking for an update. // not sure about the rest of it! - viewer = JmolViewer.allocateViewer(updateListener, - new SmarterJmolAdapter(), null, null, null, - "-NOTmultitouch-tab platform=org.openscience.jmolandroid.api.Platform", this); + viewer = JmolViewer + .allocateViewer( + updateListener, + new SmarterJmolAdapter(), + null, + null, + null, + "-NOTmultitouch-tab platform=org.openscience.jmolandroid.api.Platform", + null); + viewer.setJmolCallbackListener(this); script(STARTUP_SCRIPT); } else { @@ -212,16 +217,27 @@ finish(); }; + private boolean panLock; + @Override public boolean onTouchEvent(final MotionEvent event) { - scaleDetector.onTouchEvent(event); - if (event.getPointerCount() != 1) + switch (event.getPointerCount()) { + case 1: + break; + case 2: + if (spinDetector != null && isTwoFingerGyroPan(event)) + return panLock = true; + //fall through + default: + scaleDetector.onTouchEvent(event); + // no multitouch needed here. return true; - // no multitouch needed here. + } + panLock = false; final int index = event.findPointerIndex(0); if (index < 0 || updateListener == null) return true; - Log.w("Jmol","onTouchEvent " + index + " " + event); + Log.w("Jmol", "onTouchEvent " + index + " " + event); int e = Integer.MIN_VALUE; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: @@ -234,13 +250,23 @@ e = Event.MOUSE_UP; break; } - + if (e != Integer.MIN_VALUE) - updateListener.mouseEvent(e, (int) event.getX(index), - (int) event.getY(index), Event.MOUSE_LEFT, event.getEventTime()); + updateListener.mouseEvent(e, (int) event.getX(index), (int) event + .getY(index), Event.MOUSE_LEFT, event.getEventTime()); return true; }; + private final static float PAN_THRESHOLD = 0.9f; + + private boolean isTwoFingerGyroPan(MotionEvent event) { + if (event.getAction() != MotionEvent.ACTION_POINTER_2_DOWN) + return false; + float x1 = event.getX(0); + float x2 = event.getX(1); + return (Math.abs(Math.abs(x2 - x1) / screenWidth) > PAN_THRESHOLD); + } + private class JmolSpinDetector implements SensorEventListener { @Override @@ -253,14 +279,15 @@ if (paused || updating || viewer == null) return; if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) { - updateOrientation(event.values[0], event.values[1], event.values[2], event.timestamp); + updateOrientation(event.values[0], event.values[1], event.values[2], + event.timestamp); } - } + } } - + private class PinchZoomScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { - + @Override public boolean onScale(final ScaleGestureDetector detector) { float zoomFactor = detector.getScaleFactor(); @@ -283,15 +310,21 @@ updateListener.setScreenDimension(); }; - private final static float gyroThreshold = 1.0f; - private final static float spinFactor = 3; - + private final static float gyroThreshold = 0.7f; + private final static float spinFactor = 4.5f; + protected void updateOrientation(float x, float y, float z, long when) { float dxyz2 = x * x + y * y; + float speed = (float) (Math.sqrt(dxyz2) * (panLock ? 1 : 1) * spinFactor); + if (panLock) { + viewer.syncScript("Mouse: rotateXYBy " + (int) (-y * speed) + " " + (int) (-x * speed), "=", + 0); + return; + } if (dxyz2 < gyroThreshold) return; - float speed = (float) (Math.sqrt(dxyz2) * spinFactor); - viewer.syncScript("Mouse: spinXYBy " + (int) -y + " " + (int) -x + " " + speed, "=", 0); + viewer.syncScript("Mouse: spinXYBy " + (int) -y + " " + (int) -x + " " + + speed, "=", 0); // landscape mode, so x --> y and y --> -x } @@ -320,13 +353,13 @@ switch (item.getItemId()) { case R.id.mol: prompt(/*GT._*/("Enter a molecule name:"), lastMolecule, 1); - break; + break; case R.id.command: prompt(/*GT._*/("Enter a script command:"), lastCommand, 0); - break; + break; case R.id.pdb: prompt(/*GT._*/("Enter a PDB ID or text:"), lastPDB, 2); - break; + break; case R.id.open: File path = Downloader.getAppDir(this); @@ -360,16 +393,17 @@ } private ProgressDialog pd; + public synchronized void onActivityResult(final int requestCode, int resultCode, final Intent data) { if (resultCode == Activity.RESULT_OK) { if (requestCode == REQUEST_OPEN) { - + setDialog("Opening file..."); - + //updateListener.manageDialog(ProgressDialog.show(this, "", - // "Opening file...", true), (byte) 2); + // "Opening file...", true), (byte) 2); // this is the best way to go -- allows for scripts, surfaces, and models viewer.openFileAsynchronously(data .getStringExtra(FileDialog.RESULT_PATH)); @@ -379,55 +413,6 @@ } @Override - public String createImage(String fileName, String type, Object textOrBytes, - int quality) { - // ignore - // TODO Auto-generated method stub - return null; - } - - @Override - public String eval(String strEval) { - // ignore - // TODO Auto-generated method stub - return null; - } - - @Override - public float[][] functionXY(String functionName, int x, int y) { - // ignore - // TODO Auto-generated method stub - return null; - } - - @Override - public float[][][] functionXYZ(String functionName, int nx, int ny, int nz) { - // ignore - // TODO Auto-generated method stub - return null; - } - - @Override - public Map<String, Object> getRegistryInfo() { - // ignore - // TODO Auto-generated method stub - return null; - } - - @Override - public void resizeInnerPanel(String data) { - // ignore - // TODO Auto-generated method stub - - } - - @Override - public void showUrl(String url) { - // ignore - // TODO Auto-generated method stub - } - - @Override public void notifyCallback(EnumCallback message, Object[] data) { // probably ignore // TODO Auto-generated method stub @@ -449,9 +434,9 @@ } protected int myType; - + private void prompt(String title, String text, int type) { - + myType = type; AlertDialog.Builder alert = new AlertDialog.Builder(this); @@ -464,37 +449,38 @@ input.setSelectAllOnFocus(true); alert.setView(input); - alert.setPositiveButton(/*GT._*/("OK"), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - processUserInput(input.getText().toString()); - } - }); + alert.setPositiveButton(/*GT._*/("OK"), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + processUserInput(input.getText().toString()); + } + }); - alert.setNegativeButton(/*GT._*/("Cancel"), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - // ignore - } - }); - + alert.setNegativeButton(/*GT._*/("Cancel"), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + // ignore + } + }); + alert.show(); } private String lastCommand = "wireframe only"; private String lastMolecule = "acetaminophen"; private String lastPDB = "1crn"; - + protected void processUserInput(String cmd) { switch (myType) { case 1: // mol - script("load \"$" + (lastMolecule = cmd) + "\""); + script("load \"$" + (lastMolecule = cmd) + "\""); break; case 0: // script script(lastCommand = cmd); break; case 2: lastPDB = cmd; - Intent dnIntent = new Intent(getBaseContext(), - PDBSearchActivity.class); + Intent dnIntent = new Intent(getBaseContext(), PDBSearchActivity.class); dnIntent.setAction("jmol::" + cmd); startActivityForResult(dnIntent, REQUEST_OPEN); break; @@ -504,12 +490,12 @@ private void script(String script) { viewer.script(script); } - + protected void setDialog(String text) { -// dismissPDialog(); - pd = ProgressDialog.show(this, "", text, true); + // dismissPDialog(); + pd = ProgressDialog.show(this, "", text, true); } - + protected void dismissPDialog() { // TODO Auto-generated method stub if (pd == null || !resumeComplete) @@ -532,13 +518,12 @@ return; if (imageView != null) //updateCanvas(); // alternative was not nec. after system.exit(0) was removed. - imageView.postInvalidate(); + imageView.postInvalidate(); } - private boolean updating; private boolean paused; - + /* private void updateCanvas() { Log.w("Jmol","updateCanvas paused/updating " + paused + " " + updating); @@ -568,8 +553,11 @@ } */ protected void setPaused(boolean TF) { - paused = TF; - Log.w("Jmol","setPaused " + paused); + paused = TF; + if (paused && viewer != null) { + viewer.syncScript("Mouse: spinXYBy 0 0 0", "+", 0); + } + Log.w("Jmol", "setPaused " + paused); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |