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 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
11
12 /**
13  *   めもまのオブジェクト・ライン・ラベルを描画するメソッド群
14  *   (現在のところ、MeMoMaCanvasDrawerクラスから追い出してきただけ...)
15  * 
16  * @author MRSa
17  *
18  */
19 public class ObjectShapeDrawer
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;
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 void 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     }
149
150     static public float drawObjectLoopStart(Canvas canvas, RectF objectShape, Paint paint)
151     {
152                 // ループ開始図形の描画
153         Path path = new Path();
154         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
155         path.moveTo(objectShape.left + margin, objectShape.top);
156         path.lineTo(objectShape.left, objectShape.centerY());
157         path.lineTo(objectShape.left, objectShape.bottom);
158         path.lineTo(objectShape.right, objectShape.bottom);
159         path.lineTo(objectShape.right, objectShape.centerY());
160         path.lineTo(objectShape.right - margin, objectShape.top);
161         path.lineTo(objectShape.left + margin, objectShape.top);
162         canvas.drawPath(path, paint);
163         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
164     }
165
166     static public float drawObjectLoopEnd(Canvas canvas, RectF objectShape, Paint paint)
167     {
168                 // ループ終了図形の描画
169         Path path = new Path();
170         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
171         path.moveTo(objectShape.left, objectShape.top);
172         path.lineTo(objectShape.left, objectShape.centerY());
173         path.lineTo(objectShape.left + margin, objectShape.bottom);
174         path.lineTo(objectShape.right - margin, objectShape.bottom);
175         path.lineTo(objectShape.right, objectShape.centerY());
176         path.lineTo(objectShape.right, objectShape.top);
177         path.lineTo(objectShape.left, objectShape.top);
178         canvas.drawPath(path, paint);
179         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
180     }
181
182     static public float drawObjectLeftArrow(Canvas canvas, RectF objectShape, Paint paint)
183     {
184                 // 左側矢印図形の描画
185         Path path = new Path();
186         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 4.0f;
187         path.moveTo(objectShape.left + margin, objectShape.top);
188         path.lineTo(objectShape.left, objectShape.centerY());
189         path.lineTo(objectShape.left + margin, objectShape.bottom);
190         path.lineTo(objectShape.right, objectShape.bottom);
191         path.lineTo(objectShape.right, objectShape.top);
192         path.lineTo(objectShape.left + margin, objectShape.top);
193         canvas.drawPath(path, paint);
194         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
195     }
196
197     static public float drawObjectDownArrow(Canvas canvas, RectF objectShape, Paint paint)
198     {
199                 // 下側矢印図形の描画
200         Path path = new Path();
201         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
202         path.moveTo(objectShape.left, objectShape.top);
203         path.lineTo(objectShape.left, objectShape.centerY() + margin);
204         path.lineTo(objectShape.centerX(), objectShape.bottom);
205         path.lineTo(objectShape.right, objectShape.centerY() + margin);
206         path.lineTo(objectShape.right, objectShape.top);
207         path.lineTo(objectShape.left, objectShape.top);
208         canvas.drawPath(path, paint);
209         return (- MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
210     }
211
212     static public float drawObjectUpArrow(Canvas canvas, RectF objectShape, Paint paint)
213     {
214                 // 上側矢印図形の描画
215         Path path = new Path();
216         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f;
217         path.moveTo(objectShape.centerX(), objectShape.top);
218         path.lineTo(objectShape.left, objectShape.centerY() - margin);
219         path.lineTo(objectShape.left, objectShape.bottom);
220         path.lineTo(objectShape.right, objectShape.bottom);
221         path.lineTo(objectShape.right, objectShape.centerY() - margin);
222         path.lineTo(objectShape.centerX(), objectShape.top);
223         canvas.drawPath(path, paint);
224         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
225     }
226
227     static public float drawObjectRightArrow(Canvas canvas, RectF objectShape, Paint paint)
228     {
229                 // 右側矢印図形の描画
230         Path path = new Path();
231         float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 4.0f;
232         path.moveTo(objectShape.left, objectShape.top);
233         path.lineTo(objectShape.left, objectShape.bottom);
234         path.lineTo(objectShape.right - margin, objectShape.bottom);
235         path.lineTo(objectShape.right, objectShape.centerY());
236         path.lineTo(objectShape.right - margin, objectShape.top);
237         path.lineTo(objectShape.left, objectShape.top);
238         canvas.drawPath(path, paint);
239         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
240     }
241
242           /**
243            *    矢印を描画する処理 (ツリー表示時)
244            *
245            */
246         static public void drawArrowTree(Canvas canvas, Paint paint, float x1, float y1, float checkValue, boolean isXaxis)
247     {
248                 float margin = 8.0f;
249                 float direction;
250                 if (isXaxis)
251         {
252                     direction = (checkValue < x1) ? -1.0f : 1.0f;
253             canvas.drawLine(x1, y1, (x1 + direction * margin), (y1 - margin), paint);
254                 canvas.drawLine(x1, y1, (x1 + direction * margin), (y1 + margin), paint);
255                 }
256                 else
257                 {
258                     direction = (checkValue < y1) ? -1.0f : 1.0f;
259                 canvas.drawLine(x1, y1, (x1 - margin), (y1 + direction * margin), paint);
260                 canvas.drawLine(x1, y1, (x1 + margin), (y1 + direction * margin), paint);                 
261                 }
262     }
263           /**
264            *    矢印を描画する処理
265            *
266            */
267           static public void drawArrow(Canvas canvas, Paint paint, float x1, float y1, float x2, float y2)
268           {
269           // 矢印線の長さ
270                   float moveX = 14.0f;
271                   
272                   // 接続線の傾きが、どれくらいの角度で入っているか?
273                   float centerDegree = (float) (Math.atan2((y2 - y1) , (x2 - x1))  * 180.0d / Math.PI);
274
275                   // x1, y1 に x2, y2 方向から来た線に合わせた矢印を描画する
276                   // (2本、1本づつ引いて、それを回転行列で回転させている)
277
278                   // 回転行列の準備
279                   Matrix matrix1 = new Matrix();
280                   matrix1.setRotate((centerDegree + 30), x1, y1);
281               Matrix matrix2 = new Matrix();
282                   matrix2.setRotate((centerDegree - 30), x1, y1);
283
284                   // 線分を引いた後、回転行列で回転させる
285                   Path pathLine1 = new Path();
286               pathLine1.moveTo(x1, y1);
287               pathLine1.lineTo(x1 + moveX, y1);
288               pathLine1.transform(matrix1);
289               canvas.drawPath(pathLine1, paint);
290
291                   Path pathLine2 = new Path();
292               pathLine2.moveTo(x1, y1);
293               pathLine2.lineTo(x1 + moveX, y1);
294               pathLine2.transform(matrix2);
295               canvas.drawPath(pathLine2, paint);
296     }
297
298           /**
299              *    オブジェクトのラベルを表示する
300              *
301              */
302       public static void drawTextLabel(Canvas canvas, Paint paint, PositionObject pos, RectF region, int displayObjectInformation, float offsetX, float offsetY)
303       {
304           // タイトルの先頭部分を表示する場合...
305           String labelToShow = pos.getLabel();
306           if (displayObjectInformation == 0)
307           {
308               float width = region.width() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN_WIDTH;
309               int textLen = paint.breakText(pos.getLabel(), true, width, null);  // 省略文字を追加するから、そのぶん減らす
310               labelToShow = labelToShow.substring(0, textLen);
311               if (!labelToShow.equals(pos.getLabel()))
312               {
313                   // truncate した場合には、省略文字を出す。
314                   labelToShow = labelToShow + "...";
315               }
316           }
317
318           if (Paint.Style.valueOf(pos.getPaintStyle()) != Paint.Style.STROKE)
319           {
320               // オブジェクトを塗りつぶすのときは、文字の色を設定する
321               paint.setColor(pos.getLabelColor());
322           }
323
324           // 文字をちょっと影付きにする
325           paint.setStyle(Paint.Style.FILL_AND_STROKE);
326           paint.setShadowLayer(0.7f, 0.7f, 0.7f, Color.DKGRAY);
327
328           // ユーザチェックの描画
329           if (pos.getUserChecked())
330           {
331               canvas.drawText("*", region.centerX(), region.top + (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f), paint);
332           }
333
334           // 強調表示
335           if (pos.getstrokeWidth() != 0.0f)
336           {
337               // そのまま表示すると、読めないので、太さを調整し、アンダーラインを引くことにする
338               paint.setStrokeWidth(0.0f);
339               paint.setSubpixelText(true);
340               paint.setUnderlineText (true);
341           }
342
343           if (displayObjectInformation == 0)
344           {
345               // 1行分しか表示しない場合...そのまま表示して終了する
346               canvas.drawText(labelToShow, (region.left + offsetX),   (region.centerY() + offsetY), paint);
347               return;
348           }
349
350           float tall = paint.getFontMetrics().top + 1.0f;
351           float posX = (region.left + offsetX);
352           float posY =  (region.centerY() + offsetY);
353           float width = region.right - region.left - 12.0f;  // 幅
354
355           int startChar  = 0;
356           int endChar = pos.getLabel().length();
357           do
358           {
359               int textLen = paint.breakText(pos.getLabel(), startChar, endChar, true, width, null);
360               canvas.drawText(labelToShow, startChar, (startChar +textLen), posX, posY, paint);
361
362               posY = posY - tall;
363               startChar = startChar + textLen;
364           } while (startChar < endChar);
365       }
366 }