Move the android package from the main trunk/src directory to trunk/android/src.
[debian/openrocket] / android / src / net / sf / openrocket / android / motor / BurnPlotFragment.java
1 package net.sf.openrocket.android.motor;\r
2 \r
3 import java.util.Vector;\r
4 \r
5 import net.sf.openrocket.R;\r
6 import android.app.Activity;\r
7 import android.graphics.Color;\r
8 import android.graphics.PointF;\r
9 import android.os.Bundle;\r
10 import android.support.v4.app.Fragment;\r
11 import android.util.Log;\r
12 import android.view.LayoutInflater;\r
13 import android.view.MotionEvent;\r
14 import android.view.ScaleGestureDetector;\r
15 import android.view.View;\r
16 import android.view.View.OnTouchListener;\r
17 import android.view.ViewGroup;\r
18 \r
19 import com.androidplot.xy.BoundaryMode;\r
20 import com.androidplot.xy.LineAndPointFormatter;\r
21 import com.androidplot.xy.LineAndPointRenderer;\r
22 import com.androidplot.xy.SimpleXYSeries;\r
23 import com.androidplot.xy.XYPlot;\r
24 import com.androidplot.xy.YValueMarker;\r
25 \r
26 public class BurnPlotFragment extends Fragment implements OnTouchListener {\r
27 \r
28         private final static String TAG = "BurnPlotFragment";\r
29 \r
30         private XYPlot mySimpleXYPlot;\r
31         private SimpleXYSeries mySeries;\r
32         private PointF minXY;\r
33         private PointF maxXY;\r
34         \r
35         private float absMinX;\r
36         private float absMaxX;\r
37         private float minNoError;\r
38         private float maxNoError;\r
39 \r
40         private ScaleGestureDetector mScaleDetector;\r
41         private float mScaleFactor = 1.f;\r
42 \r
43         public static BurnPlotFragment initializeBurnPlotHelper( Motor motor ) {\r
44                 BurnPlotFragment h = new BurnPlotFragment();\r
45 \r
46                 Bundle args = new Bundle();\r
47                 args.putSerializable("Motor", motor);\r
48                 h.setArguments(args);\r
49                 return h;\r
50         }\r
51 \r
52         @Override\r
53         public void onAttach(Activity activity) {\r
54                 super.onAttach(activity);\r
55                 Log.d(TAG,"onAttach");\r
56         }\r
57 \r
58         @Override\r
59         public void onCreate(Bundle savedInstanceState) {\r
60                 Log.d(TAG,"onCreate");\r
61                 super.onCreate(savedInstanceState);\r
62         }\r
63 \r
64         @Override\r
65         public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
66                         Bundle savedInstanceState) {\r
67                 Log.d(TAG,"onCreateView");\r
68                 View v = inflater.inflate(R.layout.motor_burn, container, false);\r
69                 mySimpleXYPlot = (XYPlot) v.findViewById(R.id.xyplot);\r
70                 mySimpleXYPlot.setOnTouchListener(this);\r
71                 mScaleDetector = new ScaleGestureDetector(v.getContext(), new ScaleListener());\r
72                 //              Motor motor = getMotor();\r
73                 //              init(motor);\r
74                 return v;\r
75         }\r
76 \r
77         void init( Motor motor ) {\r
78 \r
79                 mySimpleXYPlot.setUserDomainOrigin(0);\r
80                 mySimpleXYPlot.setUserRangeOrigin(0);\r
81                 mySimpleXYPlot.setRangeLabel("impuse (n)");\r
82                 mySimpleXYPlot.setDomainLabel("time (s)");\r
83                 mySimpleXYPlot.addMarker(new YValueMarker(motor.getAvgThrust(),"average" ));\r
84                 mySimpleXYPlot.disableAllMarkup();\r
85 \r
86                 Vector<Double> data = null;\r
87                 try {\r
88                         data = motor.getBurndata();\r
89                 } catch ( Exception ex ) {\r
90                 }\r
91                 if ( data == null || data.size() == 0 ) {\r
92                         data = new Vector<Double>();\r
93                         data.add(0.0);\r
94                         data.add(0.0);\r
95                         data.add(1.0);\r
96                         data.add(1.0);\r
97                 }\r
98                 Log.d("plot","data = " + data.toString());\r
99 \r
100                 mySeries = new SimpleXYSeries(data, SimpleXYSeries.ArrayFormat.XY_VALS_INTERLEAVED,motor.getName());\r
101 \r
102                 mySimpleXYPlot.addSeries(mySeries, LineAndPointRenderer.class,\r
103                                 new LineAndPointFormatter(Color.rgb(0, 255, 0), Color.rgb(200, 0, 0), null));\r
104 \r
105                 //Set of internal variables for keeping track of the boundaries\r
106                 mySimpleXYPlot.calculateMinMaxVals();\r
107                 \r
108                 mySimpleXYPlot.redraw();\r
109 \r
110                 minXY=new PointF(mySimpleXYPlot.getCalculatedMinX().floatValue(),mySimpleXYPlot.getCalculatedMinY().floatValue());\r
111                 maxXY=new PointF(mySimpleXYPlot.getCalculatedMaxX().floatValue(),mySimpleXYPlot.getCalculatedMaxY().floatValue());\r
112 \r
113                 absMinX = minXY.x;\r
114                 absMaxX = maxXY.x;\r
115                 \r
116                 minNoError = Math.round(mySeries.getX(1).floatValue() +2);\r
117                 maxNoError = Math.round(mySeries.getX(mySeries.size() -1).floatValue()) - 2.0f;\r
118         }\r
119 \r
120         private float mPosX;\r
121         private float mPosY;\r
122 \r
123         private float mLastTouchX;\r
124         private float mLastTouchY;\r
125 \r
126         private int mActivePointerId = -1;\r
127 \r
128         @Override\r
129         public boolean onTouch(View arg0, MotionEvent event) {\r
130                 mScaleDetector.onTouchEvent(event);\r
131 \r
132                 final int action = event.getAction();\r
133                 switch ( action & MotionEvent.ACTION_MASK ) {\r
134                 case MotionEvent.ACTION_DOWN: {\r
135                         final float x = event.getX();\r
136                         final float y = event.getY();\r
137 \r
138                         mLastTouchX = x;\r
139                         mLastTouchY = y;\r
140 \r
141                         mActivePointerId = event.getPointerId(0);\r
142                         break;\r
143                 }\r
144                 \r
145                 case MotionEvent.ACTION_MOVE: {\r
146                         final int pointerIndex = event.findPointerIndex(mActivePointerId);\r
147                         final float x = event.getX(pointerIndex);\r
148                         final float y = event.getY(pointerIndex);\r
149 \r
150                         if (!mScaleDetector.isInProgress()) {\r
151                                 final float dx = x - mLastTouchX;\r
152                                 final float dy = y - mLastTouchY;\r
153                         \r
154                                 mPosX += dx;\r
155                                 mPosY += dy;\r
156                                 scroll(dx);\r
157                                 // do scroll.\r
158                         \r
159                         }\r
160                         mLastTouchX = x;\r
161                         mLastTouchY = y;\r
162                         \r
163                         break;\r
164                 }\r
165                 \r
166                 case MotionEvent.ACTION_UP: {\r
167                         mActivePointerId = -1;\r
168                         break;\r
169                 }\r
170                 \r
171                 case MotionEvent.ACTION_CANCEL: {\r
172                         mActivePointerId = -1;\r
173                         break;\r
174                 }\r
175                 \r
176                 case MotionEvent.ACTION_POINTER_UP: {\r
177                         final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;\r
178                         final int pointerId = event.getPointerId(pointerIndex);\r
179                         if (pointerId == mActivePointerId) {\r
180                                 // This was our active pointer going up.  choose a new active pointer and adjust accordingly.\r
181                                 final int newPointerIndex = pointerIndex ==0 ? 1:0;\r
182                                 mLastTouchX = event.getX(newPointerIndex);\r
183                                 mLastTouchY = event.getY(newPointerIndex);\r
184                                 mActivePointerId = event.getPointerId(newPointerIndex);\r
185                         }\r
186                         break;\r
187                 }\r
188                 }       \r
189                 return true;\r
190         }\r
191 \r
192         private void zoom(float scale) {\r
193                 Log.d(TAG,"zoom by " + scale);\r
194                 float domainSpan = absMaxX      - absMinX;\r
195                 Log.d(TAG,"domainSpan = " + domainSpan);\r
196                 float domainMidPoint = absMaxX          - domainSpan / 2.0f;\r
197                 Log.d(TAG,"domainMidPoint = " + domainMidPoint);\r
198                 float offset = domainSpan / scale;\r
199                 Log.d(TAG,"offset " + offset);\r
200                 minXY.x=domainMidPoint- offset;\r
201                 Log.d(TAG,"min X " + minXY.x);\r
202                 maxXY.x=domainMidPoint+offset;\r
203                 Log.d(TAG,"max X " + maxXY.x);\r
204                 checkBoundaries();\r
205                 mySimpleXYPlot.setDomainBoundaries(minXY.x, maxXY.x, BoundaryMode.AUTO);\r
206                 mySimpleXYPlot.redraw();\r
207         }\r
208 \r
209         private void scroll(float pan) {\r
210                 float domainSpan = maxXY.x      - minXY.x;\r
211                 float step = domainSpan / mySimpleXYPlot.getWidth();\r
212                 float offset = pan * step;\r
213                 minXY.x+= offset;\r
214                 maxXY.x+= offset;\r
215                 checkBoundaries();\r
216                 mySimpleXYPlot.setDomainBoundaries(minXY.x, maxXY.x, BoundaryMode.AUTO);\r
217                 mySimpleXYPlot.redraw();\r
218         }\r
219 \r
220         private void checkBoundaries() {\r
221                 \r
222                 if ( minXY.x < absMinX) \r
223                         minXY.x = absMinX;\r
224 //              else if ( minXY.x > maxNoError )\r
225 //                      minXY.x = maxNoError;\r
226                 \r
227                 if ( maxXY.x > absMaxX)\r
228                         maxXY.x = absMaxX;\r
229 //              else if ( maxXY.x < minNoError)\r
230 //                      maxXY.x = minNoError;\r
231         }\r
232         private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {\r
233                 @Override\r
234                 public boolean onScale( ScaleGestureDetector detector ) {\r
235                         mScaleFactor *= detector.getScaleFactor();\r
236 \r
237                         mScaleFactor = Math.max(1.0f, Math.min(mScaleFactor, 5.0f));\r
238                         zoom(mScaleFactor);\r
239                         return true;\r
240                 }\r
241         }\r
242 }\r
243 \r