Repository from CVS
https://osdn.net/cvs/view/gokigen/MeMoMa/
Révision | 0dd8f398368a0061855a50eadcc55eaffd305881 (tree) |
---|---|
l'heure | 2018-07-24 00:21:39 |
Auteur | MRSa <mrsa@myad...> |
Commiter | MRSa |
オブジェクトの移動を1つ戻せるようにした。
@@ -33,10 +33,8 @@ import jp.sourceforge.gokigen.memoma.dialogs.TextEditDialog; | ||
33 | 33 | import jp.sourceforge.gokigen.memoma.drawers.GokigenSurfaceView; |
34 | 34 | import jp.sourceforge.gokigen.memoma.drawers.MeMoMaCanvasDrawer; |
35 | 35 | import jp.sourceforge.gokigen.memoma.extension.ExtensionActivity; |
36 | -import jp.sourceforge.gokigen.memoma.holders.OperationHistoryHolder; | |
37 | 36 | import jp.sourceforge.gokigen.memoma.io.MeMoMaDataInOutManager; |
38 | 37 | import jp.sourceforge.gokigen.memoma.holders.LineStyleHolder; |
39 | -import jp.sourceforge.gokigen.memoma.holders.MeMoMaConnectLineHolder; | |
40 | 38 | import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder; |
41 | 39 | import jp.sourceforge.gokigen.memoma.holders.OperationModeHolder; |
42 | 40 | import jp.sourceforge.gokigen.memoma.operations.IObjectSelectionReceiver; |
@@ -69,8 +67,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
69 | 67 | private TextEditDialog editTextDialog; // テキスト編集用ダイアログ |
70 | 68 | private MeMoMaCanvasDrawer objectDrawer; // 画像の表示 |
71 | 69 | private MeMoMaObjectHolder objectHolder; // オブジェクトの保持クラス |
72 | - private MeMoMaConnectLineHolder lineHolder; // オブジェクト間の接続状態保持クラス | |
73 | - private OperationHistoryHolder historyHolder; // 操作履歴保持クラス | |
74 | 70 | //private SelectFeatureListener featureListener = null; // 機能選択用のリスナ |
75 | 71 | |
76 | 72 | private MeMoMaDataInOutManager dataInOutManager; |
@@ -79,15 +75,10 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
79 | 75 | private LineStyleHolder lineStyleHolder; |
80 | 76 | |
81 | 77 | private ConfirmationDialog confirmationDialog; |
82 | - | |
83 | 78 | private ObjectDataInputDialog objectDataInputDialog; |
84 | - | |
85 | 79 | private SelectLineShapeDialog lineSelectionDialog; |
86 | - | |
87 | 80 | private ItemSelectionDialog itemSelectionDialog; |
88 | - private ObjectOperationCommandHolder commandHolder; | |
89 | 81 | |
90 | - private boolean isEditing = false; | |
91 | 82 | private Integer selectedObjectKey = 0; |
92 | 83 | private Integer objectKeyToDelete = 0; |
93 | 84 | private Integer selectedContextKey = 0; |
@@ -100,12 +91,8 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
100 | 91 | { |
101 | 92 | parent = argument; |
102 | 93 | dataInOutManager = inoutManager; |
103 | - historyHolder = new OperationHistoryHolder(); | |
104 | - lineHolder = new MeMoMaConnectLineHolder(historyHolder); | |
105 | - objectHolder = new MeMoMaObjectHolder(argument, lineHolder, historyHolder); | |
94 | + objectHolder = new MeMoMaObjectHolder(argument); | |
106 | 95 | editTextDialog = new TextEditDialog(parent, R.drawable.icon); |
107 | - //lineHolder = new MeMoMaConnectLineHolder(); | |
108 | - //featureListener = new SelectFeatureListener(parent); | |
109 | 96 | drawModeHolder = new OperationModeHolder(parent); |
110 | 97 | |
111 | 98 | lineStyleHolder = new LineStyleHolder(parent); |
@@ -124,7 +111,7 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
124 | 111 | lineSelectionDialog.setResultReceiver(this); |
125 | 112 | |
126 | 113 | // アイテム選択ダイアログを生成 |
127 | - commandHolder = new ObjectOperationCommandHolder(argument); | |
114 | + ObjectOperationCommandHolder commandHolder = new ObjectOperationCommandHolder(argument); | |
128 | 115 | itemSelectionDialog = new ItemSelectionDialog(argument); |
129 | 116 | itemSelectionDialog.prepare(this, commandHolder, parent.getString(R.string.object_operation)); |
130 | 117 |
@@ -366,7 +353,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
366 | 353 | { |
367 | 354 | int id = v.getId(); |
368 | 355 | // int action = event.getAction(); |
369 | - | |
370 | 356 | //Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onTouch() " + id); |
371 | 357 | |
372 | 358 | if (id == R.id.GraphicView) |
@@ -386,10 +372,8 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
386 | 372 | int action = event.getAction(); |
387 | 373 | if ((action == KeyEvent.ACTION_DOWN)&&(keyCode == KeyEvent.KEYCODE_DPAD_CENTER)) |
388 | 374 | { |
389 | - // | |
390 | 375 | Log.v(Main.APP_IDENTIFIER, "KEY ENTER"); |
391 | 376 | } |
392 | - | |
393 | 377 | Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onKey() "); |
394 | 378 | return (false); |
395 | 379 | } |
@@ -461,7 +445,7 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
461 | 445 | public void onPrepareOptionsMenu(Menu menu) |
462 | 446 | { |
463 | 447 | menu.findItem(MENU_ID_NEW).setVisible(true); |
464 | - menu.findItem(MENU_ID_UNDO).setVisible(false); | |
448 | + menu.findItem(MENU_ID_UNDO).setVisible(objectHolder.isHistoryExist()); | |
465 | 449 | menu.findItem(MENU_ID_SHARE).setVisible(true); |
466 | 450 | menu.findItem(MENU_ID_CAPTURE).setVisible(true); |
467 | 451 | menu.findItem(MENU_ID_ALIGN).setVisible(true); |
@@ -559,7 +543,13 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
559 | 543 | */ |
560 | 544 | private boolean undoOperation() |
561 | 545 | { |
562 | - return (false); | |
546 | + // undo処理を実行する | |
547 | + boolean ret = objectHolder.undo(); | |
548 | + | |
549 | + // 画面を再描画する | |
550 | + redrawSurfaceview(); | |
551 | + | |
552 | + return (ret); | |
563 | 553 | } |
564 | 554 | |
565 | 555 | /** |
@@ -647,7 +637,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
647 | 637 | { |
648 | 638 | dataInOutManager.prepare(objectHolder, bar, memomaInfo); |
649 | 639 | } |
650 | - | |
651 | 640 | //dataInOutManager.loadFile((String) parent.getTitle()); |
652 | 641 | } |
653 | 642 |
@@ -729,7 +718,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
729 | 718 | |
730 | 719 | // ダイアログの準備を行う |
731 | 720 | objectDataInputDialog.prepareObjectInputDialog(dialog, selectedObjectKey); |
732 | - | |
733 | 721 | } |
734 | 722 | |
735 | 723 | /** |
@@ -1100,13 +1088,10 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
1100 | 1088 | // 画面の倍率と表示位置を初期状態に戻す |
1101 | 1089 | if (objectDrawer != null) |
1102 | 1090 | { |
1103 | - final SeekBar zoomBar = (SeekBar) parent.findViewById(R.id.ZoomInOut); | |
1091 | + final SeekBar zoomBar = parent.findViewById(R.id.ZoomInOut); | |
1104 | 1092 | objectDrawer.resetScaleAndLocation(zoomBar); |
1105 | 1093 | } |
1106 | 1094 | |
1107 | - // 操作履歴をクリアする | |
1108 | - historyHolder.reset(); | |
1109 | - | |
1110 | 1095 | /* |
1111 | 1096 | // 題名を "無題"に変更し、関係情報をクリアする |
1112 | 1097 | String newName = parent.getString(R.string.no_name); |
@@ -1122,7 +1107,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
1122 | 1107 | |
1123 | 1108 | // ファイル名選択ダイアログを開く |
1124 | 1109 | showInfoMessageEditDialog(); |
1125 | - | |
1126 | 1110 | } |
1127 | 1111 | |
1128 | 1112 | /** |
@@ -1131,8 +1115,15 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
1131 | 1115 | */ |
1132 | 1116 | private void redrawSurfaceview() |
1133 | 1117 | { |
1134 | - final GokigenSurfaceView surfaceview = parent.findViewById(R.id.GraphicView); | |
1135 | - surfaceview.doDraw(); | |
1118 | + try | |
1119 | + { | |
1120 | + final GokigenSurfaceView surfaceView = parent.findViewById(R.id.GraphicView); | |
1121 | + surfaceView.doDraw(); | |
1122 | + } | |
1123 | + catch (Exception e) | |
1124 | + { | |
1125 | + e.printStackTrace(); | |
1126 | + } | |
1136 | 1127 | } |
1137 | 1128 | |
1138 | 1129 | /** |
@@ -1173,27 +1164,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
1173 | 1164 | // 何もしない |
1174 | 1165 | } |
1175 | 1166 | |
1176 | - | |
1177 | - /** | |
1178 | - * 現在編集中かどうかを知る | |
1179 | - * | |
1180 | - * | |
1181 | - */ | |
1182 | - public boolean isEditing() | |
1183 | - { | |
1184 | - return (isEditing); | |
1185 | - } | |
1186 | - | |
1187 | - /** | |
1188 | - * 現在編集中のフラグを更新する | |
1189 | - * | |
1190 | - * | |
1191 | - */ | |
1192 | - public void setIsEditing(boolean value) | |
1193 | - { | |
1194 | - isEditing = value; | |
1195 | - } | |
1196 | - | |
1197 | 1167 | /** |
1198 | 1168 | * アイテムが選択された! |
1199 | 1169 | * |
@@ -1274,7 +1244,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
1274 | 1244 | |
1275 | 1245 | // ファイル選択リストの更新 |
1276 | 1246 | dataInOutManager.updateFileList(message, parent.getSupportActionBar()); |
1277 | - | |
1278 | 1247 | } |
1279 | 1248 | catch (Exception e) |
1280 | 1249 | { |
@@ -1282,6 +1251,7 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
1282 | 1251 | } |
1283 | 1252 | return (true); |
1284 | 1253 | } |
1254 | + | |
1285 | 1255 | public boolean cancelTextEditDialog() |
1286 | 1256 | { |
1287 | 1257 | return (false); |
@@ -1296,16 +1266,14 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi | ||
1296 | 1266 | int buttonId = LineStyleHolder.getLineShapeImageId(style, shape); |
1297 | 1267 | final ImageButton lineStyleObj =parent.findViewById(R.id.LineStyleButton); |
1298 | 1268 | lineStyleObj.setImageResource(buttonId); |
1299 | - //Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::finishSelectLineShape() buttonId:" + buttonId); | |
1269 | + // Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::finishSelectLineShape() buttonId:" + buttonId); | |
1300 | 1270 | } |
1301 | 1271 | |
1302 | 1272 | /** |
1303 | 1273 | * |
1304 | - * | |
1305 | 1274 | */ |
1306 | 1275 | public void cancelSelectLineShape() |
1307 | 1276 | { |
1308 | 1277 | |
1309 | 1278 | } |
1310 | - | |
1311 | 1279 | } |
@@ -70,10 +70,9 @@ public class ExtensionActivityListener implements OnClickListener, MeMoMaFileLo | ||
70 | 70 | */ |
71 | 71 | ExtensionActivityListener(Activity argument) |
72 | 72 | { |
73 | - OperationHistoryHolder historyHolder = new OperationHistoryHolder(); | |
74 | 73 | parent = argument; |
75 | 74 | fileUtility = new ExternalStorageFileUtility(Main.APP_BASEDIR); |
76 | - objectHolder = new MeMoMaObjectHolder(parent, new MeMoMaConnectLineHolder(historyHolder), historyHolder); | |
75 | + objectHolder = new MeMoMaObjectHolder(parent); | |
77 | 76 | } |
78 | 77 | /** |
79 | 78 | * 起動時にデータを準備する |
@@ -29,6 +29,8 @@ interface IOperationHistoryHolder | ||
29 | 29 | |
30 | 30 | void addHistory(int key, ChangeKind kind, Object object); |
31 | 31 | void reset(); |
32 | - void undo(); | |
32 | + | |
33 | + boolean undo(); | |
34 | + boolean isHistoryExist(); | |
33 | 35 | |
34 | 36 | } |
@@ -63,21 +63,21 @@ public class MeMoMaObjectHolder | ||
63 | 63 | |
64 | 64 | public static final float FONTSIZE_DEFAULT = 12.0f; |
65 | 65 | |
66 | - private MeMoMaConnectLineHolder connectLineHolder = null; | |
66 | + private final MeMoMaConnectLineHolder connectLineHolder; | |
67 | 67 | |
68 | - private Hashtable<Integer, PositionObject> objectPoints = null; | |
68 | + private Hashtable<Integer, PositionObject> objectPoints; | |
69 | 69 | private Integer serialNumber = 1; |
70 | 70 | private String dataTitle = ""; |
71 | 71 | private String background = ""; |
72 | 72 | private Context parent; |
73 | 73 | private final IOperationHistoryHolder historyHolder; |
74 | 74 | |
75 | - public MeMoMaObjectHolder(Context context, MeMoMaConnectLineHolder lineHolder, IOperationHistoryHolder historyHolder) | |
75 | + public MeMoMaObjectHolder(Context context) | |
76 | 76 | { |
77 | - objectPoints = new Hashtable<>(); | |
78 | - connectLineHolder = lineHolder; | |
79 | - parent = context; | |
80 | - this.historyHolder = historyHolder; | |
77 | + historyHolder = new OperationHistoryHolder(this); | |
78 | + connectLineHolder = new MeMoMaConnectLineHolder(historyHolder); | |
79 | + objectPoints = new Hashtable<>(); | |
80 | + parent = context; | |
81 | 81 | } |
82 | 82 | |
83 | 83 | /** |
@@ -87,9 +87,27 @@ public class MeMoMaObjectHolder | ||
87 | 87 | */ |
88 | 88 | public boolean isEmpty() |
89 | 89 | { |
90 | - return (((connectLineHolder == null)||(objectPoints == null))||(objectPoints.isEmpty())); | |
90 | + return ((objectPoints == null))||(objectPoints.isEmpty()); | |
91 | 91 | } |
92 | - | |
92 | + | |
93 | + /** | |
94 | + * 履歴の有無があるか (trueの場合、履歴あり) | |
95 | + * | |
96 | + */ | |
97 | + public boolean isHistoryExist() | |
98 | + { | |
99 | + return (historyHolder.isHistoryExist()); | |
100 | + } | |
101 | + | |
102 | + /** | |
103 | + * 「ひとつ戻す」処理 | |
104 | + * | |
105 | + */ | |
106 | + public boolean undo() | |
107 | + { | |
108 | + return (historyHolder.undo()); | |
109 | + } | |
110 | + | |
93 | 111 | public MeMoMaConnectLineHolder getConnectLineHolder() |
94 | 112 | { |
95 | 113 | return (connectLineHolder); |
@@ -145,6 +163,9 @@ public class MeMoMaObjectHolder | ||
145 | 163 | { |
146 | 164 | objectPoints.clear(); |
147 | 165 | serialNumber = 1; |
166 | + | |
167 | + // 操作履歴をクリアする | |
168 | + historyHolder.reset(); | |
148 | 169 | } |
149 | 170 | |
150 | 171 | public void setSerialNumber(int id) |
@@ -1,31 +1,85 @@ | ||
1 | 1 | package jp.sourceforge.gokigen.memoma.holders; |
2 | 2 | |
3 | -import android.content.Context; | |
3 | +import android.graphics.RectF; | |
4 | +import android.support.annotation.NonNull; | |
4 | 5 | import android.util.Log; |
5 | 6 | |
6 | 7 | public class OperationHistoryHolder implements IOperationHistoryHolder |
7 | 8 | { |
8 | 9 | private final String TAG = toString(); |
10 | + private final MeMoMaObjectHolder objectHolder; | |
9 | 11 | |
10 | - public OperationHistoryHolder() | |
11 | - { | |
12 | + private RectF previousRect = null; | |
13 | + private int previousKey = -1; | |
12 | 14 | |
15 | + public OperationHistoryHolder(@NonNull MeMoMaObjectHolder objectHolder) | |
16 | + { | |
17 | + this.objectHolder = objectHolder; | |
13 | 18 | } |
14 | 19 | |
20 | + @Override | |
15 | 21 | public void addHistory(int key, ChangeKind kind, Object object) |
16 | 22 | { |
17 | 23 | Log.v(TAG, "addHistory() KEY : " + key + " KIND : " + kind.toString() + " OBJ : " + object.toString()); |
24 | + | |
25 | + try | |
26 | + { | |
27 | + if (kind == ChangeKind.RECTANGLE) | |
28 | + { | |
29 | + // オブジェクトが移動したとき、1つだけ記録する | |
30 | + previousKey = key; | |
31 | + previousRect = (RectF) object; | |
32 | + Log.v(TAG, " id : " + previousKey + "(" + previousRect.left + "," + previousRect.top + ")-(" + previousRect.right + "," + previousRect.bottom + ")"); | |
33 | + } | |
34 | + else | |
35 | + { | |
36 | + previousKey = -1; | |
37 | + previousRect = null; | |
38 | + } | |
39 | + } | |
40 | + catch (Exception e) | |
41 | + { | |
42 | + e.printStackTrace(); | |
43 | + } | |
18 | 44 | } |
19 | 45 | |
46 | + @Override | |
20 | 47 | public void reset() |
21 | 48 | { |
22 | 49 | Log.v(TAG, "Histry Reset() "); |
23 | - | |
50 | + previousKey = -1; | |
51 | + previousRect = null; | |
24 | 52 | } |
25 | 53 | |
26 | - public void undo() | |
54 | + @Override | |
55 | + public boolean undo() | |
27 | 56 | { |
57 | + boolean ret = false; | |
28 | 58 | Log.v(TAG, "undo() "); |
59 | + try | |
60 | + { | |
61 | + PositionObject pos = objectHolder.getPosition(previousKey); | |
62 | + if (pos != null) | |
63 | + { | |
64 | + // 移動したオブジェクトを戻す | |
65 | + pos.setRect(previousRect); | |
29 | 66 | |
67 | + // undo を実行したら、履歴を消す | |
68 | + previousKey = -1; | |
69 | + previousRect = null; | |
70 | + ret = true; | |
71 | + } | |
72 | + } | |
73 | + catch (Exception e) | |
74 | + { | |
75 | + e.printStackTrace(); | |
76 | + } | |
77 | + return (ret); | |
78 | + } | |
79 | + | |
80 | + @Override | |
81 | + public boolean isHistoryExist() | |
82 | + { | |
83 | + return (previousKey != -1); | |
30 | 84 | } |
31 | 85 | } |