OSDN Git Service

オブジェクトの移動を1つ戻せるようにした。
authorMRSa <mrsa@myad.jp>
Mon, 23 Jul 2018 15:21:39 +0000 (00:21 +0900)
committerMRSa <mrsa@myad.jp>
Mon, 23 Jul 2018 15:21:39 +0000 (00:21 +0900)
app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.java
app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivityListener.java
app/src/main/java/jp/sourceforge/gokigen/memoma/holders/IOperationHistoryHolder.java
app/src/main/java/jp/sourceforge/gokigen/memoma/holders/MeMoMaObjectHolder.java
app/src/main/java/jp/sourceforge/gokigen/memoma/holders/OperationHistoryHolder.java

index 6d7a3cb..d548cc9 100644 (file)
@@ -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()
     {
 
     }
-
 }
index 6bfde6b..9b106e8 100644 (file)
@@ -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);
     }
     /**
      *  起動時にデータを準備する
index db296a5..45dbf8c 100644 (file)
@@ -29,6 +29,8 @@ interface IOperationHistoryHolder
 
     void addHistory(int key, ChangeKind kind, Object object);
     void reset();
-    void undo();
+
+    boolean undo();
+    boolean isHistoryExist();
 
 }
index 2c2c2c5..6b0aac5 100644 (file)
@@ -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<Integer, PositionObject> objectPoints = null;
+       private Hashtable<Integer, PositionObject> 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)
index 7d876c1..252bc26 100644 (file)
@@ -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);
     }
 }