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