From: MRSa Date: Mon, 23 Jul 2018 15:21:39 +0000 (+0900) Subject: オブジェクトの移動を1つ戻せるようにした。 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=0dd8f398368a0061855a50eadcc55eaffd305881;p=gokigen%2FMeMoMa.git オブジェクトの移動を1つ戻せるようにした。 --- diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.java index 6d7a3cb..d548cc9 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.java +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.java @@ -33,10 +33,8 @@ import jp.sourceforge.gokigen.memoma.dialogs.TextEditDialog; import jp.sourceforge.gokigen.memoma.drawers.GokigenSurfaceView; import jp.sourceforge.gokigen.memoma.drawers.MeMoMaCanvasDrawer; import jp.sourceforge.gokigen.memoma.extension.ExtensionActivity; -import jp.sourceforge.gokigen.memoma.holders.OperationHistoryHolder; import jp.sourceforge.gokigen.memoma.io.MeMoMaDataInOutManager; import jp.sourceforge.gokigen.memoma.holders.LineStyleHolder; -import jp.sourceforge.gokigen.memoma.holders.MeMoMaConnectLineHolder; import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder; import jp.sourceforge.gokigen.memoma.holders.OperationModeHolder; import jp.sourceforge.gokigen.memoma.operations.IObjectSelectionReceiver; @@ -69,8 +67,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi private TextEditDialog editTextDialog; // テキスト編集用ダイアログ private MeMoMaCanvasDrawer objectDrawer; // 画像の表示 private MeMoMaObjectHolder objectHolder; // オブジェクトの保持クラス - private MeMoMaConnectLineHolder lineHolder; // オブジェクト間の接続状態保持クラス - private OperationHistoryHolder historyHolder; // 操作履歴保持クラス //private SelectFeatureListener featureListener = null; // 機能選択用のリスナ private MeMoMaDataInOutManager dataInOutManager; @@ -79,15 +75,10 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi private LineStyleHolder lineStyleHolder; private ConfirmationDialog confirmationDialog; - private ObjectDataInputDialog objectDataInputDialog; - private SelectLineShapeDialog lineSelectionDialog; - private ItemSelectionDialog itemSelectionDialog; - private ObjectOperationCommandHolder commandHolder; - private boolean isEditing = false; private Integer selectedObjectKey = 0; private Integer objectKeyToDelete = 0; private Integer selectedContextKey = 0; @@ -100,12 +91,8 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi { parent = argument; dataInOutManager = inoutManager; - historyHolder = new OperationHistoryHolder(); - lineHolder = new MeMoMaConnectLineHolder(historyHolder); - objectHolder = new MeMoMaObjectHolder(argument, lineHolder, historyHolder); + objectHolder = new MeMoMaObjectHolder(argument); editTextDialog = new TextEditDialog(parent, R.drawable.icon); - //lineHolder = new MeMoMaConnectLineHolder(); - //featureListener = new SelectFeatureListener(parent); drawModeHolder = new OperationModeHolder(parent); lineStyleHolder = new LineStyleHolder(parent); @@ -124,7 +111,7 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi lineSelectionDialog.setResultReceiver(this); // アイテム選択ダイアログを生成 - commandHolder = new ObjectOperationCommandHolder(argument); + ObjectOperationCommandHolder commandHolder = new ObjectOperationCommandHolder(argument); itemSelectionDialog = new ItemSelectionDialog(argument); itemSelectionDialog.prepare(this, commandHolder, parent.getString(R.string.object_operation)); @@ -366,7 +353,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi { int id = v.getId(); // int action = event.getAction(); - //Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onTouch() " + id); if (id == R.id.GraphicView) @@ -386,10 +372,8 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi int action = event.getAction(); if ((action == KeyEvent.ACTION_DOWN)&&(keyCode == KeyEvent.KEYCODE_DPAD_CENTER)) { - // Log.v(Main.APP_IDENTIFIER, "KEY ENTER"); } - Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onKey() "); return (false); } @@ -461,7 +445,7 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi public void onPrepareOptionsMenu(Menu menu) { menu.findItem(MENU_ID_NEW).setVisible(true); - menu.findItem(MENU_ID_UNDO).setVisible(false); + menu.findItem(MENU_ID_UNDO).setVisible(objectHolder.isHistoryExist()); menu.findItem(MENU_ID_SHARE).setVisible(true); menu.findItem(MENU_ID_CAPTURE).setVisible(true); menu.findItem(MENU_ID_ALIGN).setVisible(true); @@ -559,7 +543,13 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi */ private boolean undoOperation() { - return (false); + // undo処理を実行する + boolean ret = objectHolder.undo(); + + // 画面を再描画する + redrawSurfaceview(); + + return (ret); } /** @@ -647,7 +637,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi { dataInOutManager.prepare(objectHolder, bar, memomaInfo); } - //dataInOutManager.loadFile((String) parent.getTitle()); } @@ -729,7 +718,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi // ダイアログの準備を行う objectDataInputDialog.prepareObjectInputDialog(dialog, selectedObjectKey); - } /** @@ -1100,13 +1088,10 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi // 画面の倍率と表示位置を初期状態に戻す if (objectDrawer != null) { - final SeekBar zoomBar = (SeekBar) parent.findViewById(R.id.ZoomInOut); + final SeekBar zoomBar = parent.findViewById(R.id.ZoomInOut); objectDrawer.resetScaleAndLocation(zoomBar); } - // 操作履歴をクリアする - historyHolder.reset(); - /* // 題名を "無題"に変更し、関係情報をクリアする String newName = parent.getString(R.string.no_name); @@ -1122,7 +1107,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi // ファイル名選択ダイアログを開く showInfoMessageEditDialog(); - } /** @@ -1131,8 +1115,15 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi */ private void redrawSurfaceview() { - final GokigenSurfaceView surfaceview = parent.findViewById(R.id.GraphicView); - surfaceview.doDraw(); + try + { + final GokigenSurfaceView surfaceView = parent.findViewById(R.id.GraphicView); + surfaceView.doDraw(); + } + catch (Exception e) + { + e.printStackTrace(); + } } /** @@ -1173,27 +1164,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi // 何もしない } - - /** - * 現在編集中かどうかを知る - * - * - */ - public boolean isEditing() - { - return (isEditing); - } - - /** - * 現在編集中のフラグを更新する - * - * - */ - public void setIsEditing(boolean value) - { - isEditing = value; - } - /** * アイテムが選択された! * @@ -1274,7 +1244,6 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi // ファイル選択リストの更新 dataInOutManager.updateFileList(message, parent.getSupportActionBar()); - } catch (Exception e) { @@ -1282,6 +1251,7 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi } return (true); } + public boolean cancelTextEditDialog() { return (false); @@ -1296,16 +1266,14 @@ public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyLi int buttonId = LineStyleHolder.getLineShapeImageId(style, shape); final ImageButton lineStyleObj =parent.findViewById(R.id.LineStyleButton); lineStyleObj.setImageResource(buttonId); - //Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::finishSelectLineShape() buttonId:" + buttonId); + // Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::finishSelectLineShape() buttonId:" + buttonId); } /** * - * */ public void cancelSelectLineShape() { } - } diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivityListener.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivityListener.java index 6bfde6b..9b106e8 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivityListener.java +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivityListener.java @@ -70,10 +70,9 @@ public class ExtensionActivityListener implements OnClickListener, MeMoMaFileLo */ ExtensionActivityListener(Activity argument) { - OperationHistoryHolder historyHolder = new OperationHistoryHolder(); parent = argument; fileUtility = new ExternalStorageFileUtility(Main.APP_BASEDIR); - objectHolder = new MeMoMaObjectHolder(parent, new MeMoMaConnectLineHolder(historyHolder), historyHolder); + objectHolder = new MeMoMaObjectHolder(parent); } /** * 起動時にデータを準備する diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/IOperationHistoryHolder.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/IOperationHistoryHolder.java index db296a5..45dbf8c 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/IOperationHistoryHolder.java +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/IOperationHistoryHolder.java @@ -29,6 +29,8 @@ interface IOperationHistoryHolder void addHistory(int key, ChangeKind kind, Object object); void reset(); - void undo(); + + boolean undo(); + boolean isHistoryExist(); } diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/MeMoMaObjectHolder.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/MeMoMaObjectHolder.java index 2c2c2c5..6b0aac5 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/MeMoMaObjectHolder.java +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/MeMoMaObjectHolder.java @@ -63,21 +63,21 @@ public class MeMoMaObjectHolder public static final float FONTSIZE_DEFAULT = 12.0f; - private MeMoMaConnectLineHolder connectLineHolder = null; + private final MeMoMaConnectLineHolder connectLineHolder; - private Hashtable objectPoints = null; + private Hashtable objectPoints; private Integer serialNumber = 1; private String dataTitle = ""; private String background = ""; private Context parent; private final IOperationHistoryHolder historyHolder; - public MeMoMaObjectHolder(Context context, MeMoMaConnectLineHolder lineHolder, IOperationHistoryHolder historyHolder) + public MeMoMaObjectHolder(Context context) { - objectPoints = new Hashtable<>(); - connectLineHolder = lineHolder; - parent = context; - this.historyHolder = historyHolder; + historyHolder = new OperationHistoryHolder(this); + connectLineHolder = new MeMoMaConnectLineHolder(historyHolder); + objectPoints = new Hashtable<>(); + parent = context; } /** @@ -87,9 +87,27 @@ public class MeMoMaObjectHolder */ public boolean isEmpty() { - return (((connectLineHolder == null)||(objectPoints == null))||(objectPoints.isEmpty())); + return ((objectPoints == null))||(objectPoints.isEmpty()); } - + + /** + * 履歴の有無があるか (trueの場合、履歴あり) + * + */ + public boolean isHistoryExist() + { + return (historyHolder.isHistoryExist()); + } + + /** + * 「ひとつ戻す」処理 + * + */ + public boolean undo() + { + return (historyHolder.undo()); + } + public MeMoMaConnectLineHolder getConnectLineHolder() { return (connectLineHolder); @@ -145,6 +163,9 @@ public class MeMoMaObjectHolder { objectPoints.clear(); serialNumber = 1; + + // 操作履歴をクリアする + historyHolder.reset(); } public void setSerialNumber(int id) diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/OperationHistoryHolder.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/OperationHistoryHolder.java index 7d876c1..252bc26 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/OperationHistoryHolder.java +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/OperationHistoryHolder.java @@ -1,31 +1,85 @@ package jp.sourceforge.gokigen.memoma.holders; -import android.content.Context; +import android.graphics.RectF; +import android.support.annotation.NonNull; import android.util.Log; public class OperationHistoryHolder implements IOperationHistoryHolder { private final String TAG = toString(); + private final MeMoMaObjectHolder objectHolder; - public OperationHistoryHolder() - { + private RectF previousRect = null; + private int previousKey = -1; + public OperationHistoryHolder(@NonNull MeMoMaObjectHolder objectHolder) + { + this.objectHolder = objectHolder; } + @Override public void addHistory(int key, ChangeKind kind, Object object) { Log.v(TAG, "addHistory() KEY : " + key + " KIND : " + kind.toString() + " OBJ : " + object.toString()); + + try + { + if (kind == ChangeKind.RECTANGLE) + { + // オブジェクトが移動したとき、1つだけ記録する + previousKey = key; + previousRect = (RectF) object; + Log.v(TAG, " id : " + previousKey + "(" + previousRect.left + "," + previousRect.top + ")-(" + previousRect.right + "," + previousRect.bottom + ")"); + } + else + { + previousKey = -1; + previousRect = null; + } + } + catch (Exception e) + { + e.printStackTrace(); + } } + @Override public void reset() { Log.v(TAG, "Histry Reset() "); - + previousKey = -1; + previousRect = null; } - public void undo() + @Override + public boolean undo() { + boolean ret = false; Log.v(TAG, "undo() "); + try + { + PositionObject pos = objectHolder.getPosition(previousKey); + if (pos != null) + { + // 移動したオブジェクトを戻す + pos.setRect(previousRect); + // undo を実行したら、履歴を消す + previousKey = -1; + previousRect = null; + ret = true; + } + } + catch (Exception e) + { + e.printStackTrace(); + } + return (ret); + } + + @Override + public boolean isHistoryExist() + { + return (previousKey != -1); } }