OSDN Git Service

一部のワーニングを修正。
[gokigen/MeMoMa.git] / app / src / main / java / jp / sourceforge / gokigen / memoma / drawers / ObjectShapeDrawer.java
1 package jp.sourceforge.gokigen.memoma.drawers;
2
3 import android.graphics.Canvas;
4 import android.graphics.Color;
5 import android.graphics.Matrix;
6 import android.graphics.Paint;
7 import android.graphics.Path;
8 import android.graphics.RectF;
9 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
10
11 /**
12  *   めもまのオブジェクト・ライン・ラベルを描画するメソッド群
13  *   (現在のところ、MeMoMaCanvasDrawerクラスから追い出してきただけ...)
14  * 
15  * @author MRSa
16  *
17  */
18 public class ObjectShapeDrawer
19 {
20
21
22     static public float drawObjectOval(Canvas canvas, RectF objectShape, Paint paint)
23     {
24         // 楕円形の描画
25         canvas.drawOval(objectShape, paint);
26
27         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2);
28     }
29
30     static public float drawObjectRect(Canvas canvas, RectF objectShape, Paint paint)
31     {
32                 // 四角形を描画する
33         canvas.drawRect(objectShape, paint);
34         return (0.0f);
35     }
36
37     static public float drawObjectRoundRect(Canvas canvas, RectF objectShape, Paint paint)
38     {
39                 // 丸角四角形の描画
40         canvas.drawRoundRect(objectShape, MeMoMaObjectHolder.ROUNDRECT_CORNER_RX, MeMoMaObjectHolder.ROUNDRECT_CORNER_RY, paint);
41
42         return (0.0f);
43     }
44
45     static public float drawObjectDiamond(Canvas canvas, RectF objectShape, Paint paint)
46     {
47                 // 菱形の描画
48         Path path = new Path();
49         path.moveTo(objectShape.centerX(), objectShape.top);
50         path.lineTo(objectShape.left, objectShape.centerY());
51         path.lineTo(objectShape.centerX(), objectShape.bottom);
52         path.lineTo(objectShape.right, objectShape.centerY());
53         path.lineTo(objectShape.centerX(), objectShape.top);
54         canvas.drawPath(path, paint);
55         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2);
56     }
57
58     static public float drawObjectKeyboard(Canvas canvas, RectF objectShape, Paint paint)
59     {
60                 // 台形(キーボード型)の描画
61         Path path = new Path();
62         path.moveTo(objectShape.left, objectShape.centerY() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
63         path.lineTo(objectShape.left, objectShape.bottom);
64         path.lineTo(objectShape.right, objectShape.bottom);
65         path.lineTo(objectShape.right, objectShape.top);
66         path.lineTo(objectShape.left, objectShape.centerY() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
67         canvas.drawPath(path, paint);
68         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
69     }
70
71     static public float drawObjectParallelogram(Canvas canvas, RectF objectShape, Paint paint)
72     {
73                 // 平行四辺形の描画
74         Path path = new Path();
75         path.moveTo(objectShape.left + MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN, objectShape.top);
76         path.lineTo(objectShape.left, objectShape.bottom);
77         path.lineTo(objectShape.right - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN, objectShape.bottom);
78         path.lineTo(objectShape.right, objectShape.top);
79         path.lineTo(objectShape.left + MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN, objectShape.top);
80         canvas.drawPath(path, paint);
81         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
82     }
83
84     static public float drawObjectHexagonal(Canvas canvas, RectF objectShape, Paint paint)
85     {
86                 // 六角形の描画
87         Path path = new Path();
88         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
89         path.moveTo(objectShape.left + margin, objectShape.top);
90         path.lineTo(objectShape.left, objectShape.centerY());
91         path.lineTo(objectShape.left + margin, objectShape.bottom);
92         path.lineTo(objectShape.right - margin, objectShape.bottom);
93         path.lineTo(objectShape.right, objectShape.centerY());
94         path.lineTo(objectShape.right - margin, objectShape.top);
95         path.lineTo(objectShape.left + margin, objectShape.top);
96         canvas.drawPath(path, paint);
97         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
98     }
99
100     static public float drawObjectPaper(Canvas canvas, RectF objectShape, Paint paint)
101     {
102                 // 書類の形の描画
103         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 3.0f;
104         Path path = new Path();
105         path.moveTo(objectShape.left, objectShape.top);
106         path.lineTo(objectShape.left, objectShape.bottom - margin);
107         path.cubicTo((objectShape.left + objectShape.centerX()) / 2.0f , objectShape.bottom, (objectShape.right + objectShape.centerX()) / 2.0f, objectShape.bottom - margin, objectShape.right, objectShape.bottom - margin);
108         path.lineTo(objectShape.right, objectShape.top);
109         path.lineTo(objectShape.left, objectShape.top);
110         canvas.drawPath(path, paint);
111         return ( - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
112     }
113
114     static public float drawObjectDrum(Canvas canvas, RectF objectShape, Paint paint, Paint.Style paintStyle)
115     {
116                 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 1.0f;
117                 // 円柱の描画
118         Path path = new Path();
119         path.moveTo(objectShape.left, objectShape.top);
120         path.arcTo(new RectF(objectShape.left, objectShape.top,objectShape.right, objectShape.top + margin), 180.0f, 359.999f, true);
121         path.lineTo(objectShape.left, objectShape.bottom - (margin / 2.0f));
122         path.arcTo(new RectF(objectShape.left, objectShape.bottom - margin, objectShape.right, objectShape.bottom), 180.0f, -180.0f, true);
123         path.lineTo(objectShape.right, objectShape.top + (margin / 2.0f));
124         if (paintStyle != Paint.Style.STROKE)
125         {
126                 // 塗りつぶし用に線の領域を追加する
127             path.arcTo(new RectF(objectShape.left, objectShape.top, objectShape.right, objectShape.top + margin), 180.0f, 180.0f, true);
128             path.lineTo(objectShape.left, objectShape.bottom - (margin / 2.0f));
129             path.arcTo(new RectF(objectShape.left, objectShape.bottom - margin, objectShape.right, objectShape.bottom), 180.0f, -180.0f, true);
130         }
131         canvas.drawPath(path, paint);
132         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
133     }
134
135     static public float drawObjectCircle(Canvas canvas, RectF objectShape, Paint paint)
136     {
137                 // 円を描画する
138         canvas.drawCircle(objectShape.centerX(), objectShape.centerY(), ((objectShape.right - objectShape.left)/ 2.0f), paint);
139         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
140     }
141
142     static public float drawObjectNoRegion(Canvas canvas, RectF objectShape, Paint paint)
143     {
144                 // 何も表示しないとわからないので、ラベルが無いときには枠を表示する
145         paint.setColor(Color.DKGRAY);
146         canvas.drawRect(objectShape, paint);
147         paint.setColor(Color.WHITE);
148         return (0.0f);
149     }
150
151     static public float drawObjectLoopStart(Canvas canvas, RectF objectShape, Paint paint)
152     {
153                 // ループ開始図形の描画
154         Path path = new Path();
155         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
156         path.moveTo(objectShape.left + margin, objectShape.top);
157         path.lineTo(objectShape.left, objectShape.centerY());
158         path.lineTo(objectShape.left, objectShape.bottom);
159         path.lineTo(objectShape.right, objectShape.bottom);
160         path.lineTo(objectShape.right, objectShape.centerY());
161         path.lineTo(objectShape.right - margin, objectShape.top);
162         path.lineTo(objectShape.left + margin, objectShape.top);
163         canvas.drawPath(path, paint);
164         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
165     }
166
167     static public float drawObjectLoopEnd(Canvas canvas, RectF objectShape, Paint paint)
168     {
169                 // ループ終了図形の描画
170         Path path = new Path();
171         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
172         path.moveTo(objectShape.left, objectShape.top);
173         path.lineTo(objectShape.left, objectShape.centerY());
174         path.lineTo(objectShape.left + margin, objectShape.bottom);
175         path.lineTo(objectShape.right - margin, objectShape.bottom);
176         path.lineTo(objectShape.right, objectShape.centerY());
177         path.lineTo(objectShape.right, objectShape.top);
178         path.lineTo(objectShape.left, objectShape.top);
179         canvas.drawPath(path, paint);
180         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
181     }
182
183     static public float drawObjectLeftArrow(Canvas canvas, RectF objectShape, Paint paint)
184     {
185                 // 左側矢印図形の描画
186         Path path = new Path();
187         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 4.0f;
188         path.moveTo(objectShape.left + margin, objectShape.top);
189         path.lineTo(objectShape.left, objectShape.centerY());
190         path.lineTo(objectShape.left + margin, objectShape.bottom);
191         path.lineTo(objectShape.right, objectShape.bottom);
192         path.lineTo(objectShape.right, objectShape.top);
193         path.lineTo(objectShape.left + margin, objectShape.top);
194         canvas.drawPath(path, paint);
195         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
196     }
197
198     static public float drawObjectDownArrow(Canvas canvas, RectF objectShape, Paint paint)
199     {
200                 // 下側矢印図形の描画
201         Path path = new Path();
202         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
203         path.moveTo(objectShape.left, objectShape.top);
204         path.lineTo(objectShape.left, objectShape.centerY() + margin);
205         path.lineTo(objectShape.centerX(), objectShape.bottom);
206         path.lineTo(objectShape.right, objectShape.centerY() + margin);
207         path.lineTo(objectShape.right, objectShape.top);
208         path.lineTo(objectShape.left, objectShape.top);
209         canvas.drawPath(path, paint);
210         return (- MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
211     }
212
213     static public float drawObjectUpArrow(Canvas canvas, RectF objectShape, Paint paint)
214     {
215                 // 上側矢印図形の描画
216         Path path = new Path();
217         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f;
218         path.moveTo(objectShape.centerX(), objectShape.top);
219         path.lineTo(objectShape.left, objectShape.centerY() - margin);
220         path.lineTo(objectShape.left, objectShape.bottom);
221         path.lineTo(objectShape.right, objectShape.bottom);
222         path.lineTo(objectShape.right, objectShape.centerY() - margin);
223         path.lineTo(objectShape.centerX(), objectShape.top);
224         canvas.drawPath(path, paint);
225         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
226     }
227
228     static public float drawObjectRightArrow(Canvas canvas, RectF objectShape, Paint paint)
229     {
230                 // 右側矢印図形の描画
231         Path path = new Path();
232         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 4.0f;
233         path.moveTo(objectShape.left, objectShape.top);
234         path.lineTo(objectShape.left, objectShape.bottom);
235         path.lineTo(objectShape.right - margin, objectShape.bottom);
236         path.lineTo(objectShape.right, objectShape.centerY());
237         path.lineTo(objectShape.right - margin, objectShape.top);
238         path.lineTo(objectShape.left, objectShape.top);
239         canvas.drawPath(path, paint);
240         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
241     }
242
243     static public void drawLineStraight(Canvas canvas)
244     {
245         
246     }
247           /**
248            *    矢印を描画する処理 (ツリー表示時)
249            *
250            */
251         static public void drawArrowTree(Canvas canvas, Paint paint, float x1, float y1, float checkValue, boolean isXaxis)
252     {
253                 float margin = 8.0f;
254                 float direction;
255                 if (isXaxis)
256         {
257                     direction = (checkValue < x1) ? -1.0f : 1.0f;
258             canvas.drawLine(x1, y1, (x1 + direction * margin), (y1 - margin), paint);
259                 canvas.drawLine(x1, y1, (x1 + direction * margin), (y1 + margin), paint);
260                 }
261                 else
262                 {
263                     direction = (checkValue < y1) ? -1.0f : 1.0f;
264                 canvas.drawLine(x1, y1, (x1 - margin), (y1 + direction * margin), paint);
265                 canvas.drawLine(x1, y1, (x1 + margin), (y1 + direction * margin), paint);                 
266                 }
267     }
268           /**
269            *    矢印を描画する処理
270            *
271            */
272           static public void drawArrow(Canvas canvas, Paint paint, float x1, float y1, float x2, float y2)
273           {
274           // 矢印線の長さ
275                   float moveX = 14.0f;
276                   
277                   // 接続線の傾きが、どれくらいの角度で入っているか?
278                   float centerDegree = (float) (Math.atan2((y2 - y1) , (x2 - x1))  * 180.0d / Math.PI);
279
280                   // x1, y1 に x2, y2 方向から来た線に合わせた矢印を描画する
281                   // (2本、1本づつ引いて、それを回転行列で回転させている)
282
283                   // 回転行列の準備
284                   Matrix matrix1 = new Matrix();
285                   matrix1.setRotate((centerDegree + 30), x1, y1);
286               Matrix matrix2 = new Matrix();
287                   matrix2.setRotate((centerDegree - 30), x1, y1);
288
289                   // 線分を引いた後、回転行列で回転させる
290                   Path pathLine1 = new Path();
291               pathLine1.moveTo(x1, y1);
292               pathLine1.lineTo(x1 + moveX, y1);
293               pathLine1.transform(matrix1);
294               canvas.drawPath(pathLine1, paint);
295
296                   Path pathLine2 = new Path();
297               pathLine2.moveTo(x1, y1);
298               pathLine2.lineTo(x1 + moveX, y1);
299               pathLine2.transform(matrix2);
300               canvas.drawPath(pathLine2, paint);
301     }
302
303           /**
304              *    オブジェクトのラベルを表示する
305              *
306              */
307             public static void drawTextLabel(Canvas canvas, Paint paint, MeMoMaObjectHolder.PositionObject pos, RectF region, int displayObjectInformation, float offsetX, float offsetY)
308             {
309                 // タイトルの先頭部分を表示する場合...
310                 String labelToShow = pos.label;
311                 if (displayObjectInformation == 0)
312                 {
313                 float width = region.width() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN_WIDTH;
314                 int textLen = paint.breakText(pos.label, true, width, null);  // 省略文字を追加するから、そのぶん減らす
315                 labelToShow = labelToShow.substring(0, textLen);
316                 if (!labelToShow.equals(pos.label))
317                 {
318                         // truncate した場合には、省略文字を出す。
319                         labelToShow = labelToShow + "...";
320                 }
321                 }
322
323                 if (Paint.Style.valueOf(pos.paintStyle) != Paint.Style.STROKE)
324                 {
325                     // オブジェクトを塗りつぶすのときは、文字の色を設定する
326                     paint.setColor(pos.labelColor);
327                 }
328                 
329                 // 文字をちょっと影付きにする
330             paint.setStyle(Paint.Style.FILL_AND_STROKE);
331                 paint.setShadowLayer(0.7f, 0.7f, 0.7f, Color.DKGRAY);
332                 
333                 // ユーザチェックの描画
334                 if (pos.userChecked)
335                 {
336                         canvas.drawText("*", region.centerX(), region.top + (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f), paint);
337                }
338                 
339                 // 強調表示
340                 if (pos.strokeWidth != 0.0f)
341                 {
342                         // そのまま表示すると、読めないので、太さを調整し、アンダーラインを引くことにする
343                         paint.setStrokeWidth(0.0f);
344                     paint.setSubpixelText(true);
345                     paint.setUnderlineText (true);
346                 }
347
348                 if (displayObjectInformation == 0)
349                 {            
350                         // 1行分しか表示しない場合...そのまま表示して終了する
351                     canvas.drawText(labelToShow, (region.left + offsetX),   (region.centerY() + offsetY), paint);
352                     return;
353                 }
354                 
355                 float tall = paint.getFontMetrics().top + 1.0f;
356                 float posX = (region.left + offsetX);
357                 float posY =  (region.centerY() + offsetY);
358                 float width = region.right - region.left - 12.0f;  // 幅
359
360                 int startChar  = 0;
361                 int endChar = pos.label.length();
362                 do
363                 {
364                     int textLen = paint.breakText(pos.label, startChar, endChar, true, width, null);
365                     canvas.drawText(labelToShow, startChar, (startChar +textLen), posX, posY, paint);
366
367                     posY = posY - tall;
368                     startChar = startChar + textLen;
369                 } while (startChar < endChar);  
370             }
371 }