OSDN Git Service

xml形式のデータインポート時にお知らせ表示することにした。
authorMRSa <mrsa@myad.jp>
Wed, 3 May 2023 12:14:40 +0000 (21:14 +0900)
committerMRSa <mrsa@myad.jp>
Wed, 3 May 2023 12:14:40 +0000 (21:14 +0900)
15 files changed:
app/src/main/java/jp/sourceforge/gokigen/memoma/Main.kt
app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.java [deleted file]
app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.kt [new file with mode: 0644]
app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivity.java
app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivityListener.java
app/src/main/java/jp/sourceforge/gokigen/memoma/holders/MeMoMaDataFileHolder.java
app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaDataInOutManager.java
app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileImportCsvProcess.java
app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileLoadingProcess.java
app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileSavingEngine.java
app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileSavingProcess.java
app/src/main/java/jp/sourceforge/gokigen/memoma/io/ObjectLayoutCaptureExporter.java
app/src/main/java/jp/sourceforge/gokigen/memoma/operations/SelectLineShapeDialog.java
app/src/main/res/values-ja/strings.xml
app/src/main/res/values/strings.xml

index 3ef5fac..24681d7 100644 (file)
@@ -209,7 +209,7 @@ class Main : AppCompatActivity()
      * ダイアログ表示の準備
      *
      */
-    override fun onCreateDialog(id: Int): Dialog
+    override fun onCreateDialog(id: Int): Dialog?
     {
         return listener.onCreateDialog(id)
     }
diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.java
deleted file mode 100644 (file)
index f5772d2..0000000
+++ /dev/null
@@ -1,1279 +0,0 @@
-package jp.sourceforge.gokigen.memoma;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.graphics.Color;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.drawable.BitmapDrawable;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnKeyListener;
-import android.view.View.OnTouchListener;
-import android.widget.ImageButton;
-import android.widget.SeekBar;
-
-import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.preference.PreferenceManager;
-
-import jp.sourceforge.gokigen.memoma.dialogs.ConfirmationDialog;
-import jp.sourceforge.gokigen.memoma.dialogs.CreditDialog;
-import jp.sourceforge.gokigen.memoma.dialogs.ItemSelectionDialog;
-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.io.MeMoMaDataInOutManager;
-import jp.sourceforge.gokigen.memoma.holders.LineStyleHolder;
-import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
-import jp.sourceforge.gokigen.memoma.holders.OperationModeHolder;
-import jp.sourceforge.gokigen.memoma.operations.IObjectSelectionReceiver;
-import jp.sourceforge.gokigen.memoma.operations.ObjectAligner;
-import jp.sourceforge.gokigen.memoma.operations.ObjectDataInputDialog;
-import jp.sourceforge.gokigen.memoma.operations.ObjectOperationCommandHolder;
-import jp.sourceforge.gokigen.memoma.operations.SelectLineShapeDialog;
-import jp.sourceforge.gokigen.memoma.preference.Preference;
-
-/**
- *   メモま! のメイン画面処理
- *   
- * @author MRSa
- */
-public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyListener, IObjectSelectionReceiver, ConfirmationDialog.IResultReceiver, ObjectDataInputDialog.IResultReceiver, ItemSelectionDialog.ISelectionItemReceiver, TextEditDialog.ITextEditResultReceiver, ObjectAligner.IAlignCallback, SelectLineShapeDialog.IResultReceiver
-{
-    private final String TAG = toString();
-
-    private static final int MENU_ID_PREFERENCES = (Menu.FIRST + 1);    // 設定画面の表示
-    private static final int MENU_ID_ABOUT_GOKIGEN = (Menu.FIRST + 2);  // アプリケーションの情報表示
-    private static final int MENU_ID_NEW = (Menu.FIRST + 3);                     // 新規作成
-    private static final int MENU_ID_EXTEND= (Menu.FIRST + 4);                   // 拡張機能
-    private static final int MENU_ID_ALIGN = (Menu.FIRST + 5);                     // オブジェクトの整列
-    private static final int MENU_ID_INSERT_PICTURE = (Menu.FIRST + 6);   // 画像の指定
-    private static final int MENU_ID_OPERATION = (Menu.FIRST + 7);           // 操作コマンド
-    private static final int MENU_ID_RENAME = (Menu.FIRST + 8);                // リネーム
-    private static final int MENU_ID_CAPTURE = (Menu.FIRST + 9);              // 画像のキャプチャ
-    private static final int MENU_ID_SHARE = (Menu.FIRST + 10);              // 画像の共有
-    private static final int MENU_ID_UNDO = (Menu.FIRST + 11);              // 処理の UNDO
-
-    private final AppCompatActivity parent;  // 親分
-    private final TextEditDialog editTextDialog;   // テキスト編集用ダイアログ
-    private final MeMoMaCanvasDrawer objectDrawer; // 画像の表示
-    private final MeMoMaObjectHolder objectHolder;  // オブジェクトの保持クラス
-    private final MeMoMaDataInOutManager dataInOutManager;
-    private final OperationModeHolder drawModeHolder;
-    private final LineStyleHolder lineStyleHolder;
-
-    private final ConfirmationDialog confirmationDialog;
-    private final ObjectDataInputDialog objectDataInputDialog;
-    private final SelectLineShapeDialog lineSelectionDialog;
-    private final ItemSelectionDialog itemSelectionDialog;
-
-    private Integer  selectedObjectKey = 0;
-    private Integer  objectKeyToDelete = 0;
-    private Integer selectedContextKey = 0;
-
-    /**
-     *  コンストラクタ
-     *
-     */
-    MeMoMaListener(AppCompatActivity argument, MeMoMaDataInOutManager inoutManager)
-    {
-        parent = argument;
-        dataInOutManager = inoutManager;
-        objectHolder = new MeMoMaObjectHolder(argument);
-        editTextDialog = new TextEditDialog(parent, R.drawable.icon);
-        drawModeHolder = new OperationModeHolder(parent);
-
-        lineStyleHolder = new LineStyleHolder(parent);
-        lineStyleHolder.prepare();
-
-        // 新規作成時の確認ダイアログについて
-        confirmationDialog = new ConfirmationDialog(argument);
-        confirmationDialog.prepare(this, android.R.drawable.ic_dialog_alert, parent.getString(R.string.createnew_title), parent.getString(R.string.createnew_message));
-
-        // オブジェクトのデータ入力ダイアログを生成
-        objectDataInputDialog = new ObjectDataInputDialog(argument, objectHolder);
-        objectDataInputDialog.setResultReceiver(this);
-
-        // 接続線の形状と太さを選択するダイアログを生成
-        lineSelectionDialog = new SelectLineShapeDialog(argument, lineStyleHolder);
-        lineSelectionDialog.setResultReceiver(this);
-
-        // アイテム選択ダイアログを生成
-        ObjectOperationCommandHolder commandHolder = new ObjectOperationCommandHolder(argument);
-        itemSelectionDialog = new ItemSelectionDialog(argument);
-        itemSelectionDialog.prepare(this,  commandHolder, parent.getString(R.string.object_operation));
-
-        // 描画クラスの生成
-        objectDrawer = new MeMoMaCanvasDrawer(argument, objectHolder, lineStyleHolder, this);
-
-        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-        String colorString = preferences.getString("backgroundColor", "0xff004000");
-        objectDrawer.setBackgroundColor(colorString);
-
-    }
-
-    /**
-     *  がっつりこのクラスにイベントリスナを接続する
-     *
-     */
-    public void prepareListener()
-    {
-        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-
-        // 表示位置リセットボタン
-        final ImageButton homeButton = parent.findViewById(R.id.HomeButton);
-        homeButton.setOnClickListener(this);
-
-        // 拡張ボタン
-        final ImageButton expandButton = parent.findViewById(R.id.ExpandButton);
-        expandButton.setOnClickListener(this);
-
-        // 作成ボタン
-        final ImageButton createObjectButton = parent.findViewById(R.id.CreateObjectButton);
-        createObjectButton.setOnClickListener(this);
-
-        final ImageButton deleteObjectButton = parent.findViewById(R.id.DeleteObjectButton);
-        deleteObjectButton.setOnClickListener(this);
-
-        // 線の形状切り替えボタン
-        final ImageButton lineStyleButton = parent.findViewById(R.id.LineStyleButton);
-        lineStyleButton.setOnClickListener(this);
-
-        // データ保存ボタン
-        final ImageButton saveButton = parent.findViewById(R.id.SaveButton);
-        saveButton.setOnClickListener(this);
-
-        // 画面描画クラス
-        final GokigenSurfaceView surfaceView = parent.findViewById(R.id.GraphicView);
-        surfaceView.setOnTouchListener(this);
-
-        // スライドバーが動かされた時の処理
-        final SeekBar seekbar =parent.findViewById(R.id.ZoomInOut);
-        seekbar.setOnSeekBarChangeListener(objectDrawer);
-        int progress = preferences.getInt("zoomProgress", 50);
-        seekbar.setProgress(progress);
-
-        // 「実行中」の表示を消す
-        parent.setProgressBarIndeterminateVisibility(false);
-
-        // 起動時にデータを読み出す
-        prepareMeMoMaInfo();
-    }
-
-    /**
-     *  終了準備
-     */
-    public void finishListener()
-    {
-        // 終了時に状態を保存する
-        saveData(true);
-    }
-
-    /**
-     *  スタート準備
-     */
-    public void prepareToStart()
-    {
-        //  設定に記録されているデータを画面に反映させる
-        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-
-        // 描画オブジェクトの形状を設定する
-        //int objectStyle = Integer.parseInt(preferences.getString("drawStyle", "0"));
-
-        // ラインの形状を取得し、設定する
-        setLineStyle();
-
-        // 操作モードを画面に反映させる
-        updateButtons(Integer.parseInt(preferences.getString("operationMode", "0")));
-
-        // 条件に合わせて、描画クラスを変更する
-        final GokigenSurfaceView surfaceView = parent.findViewById(R.id.GraphicView);
-        surfaceView.setCanvasDrawer(objectDrawer);
-
-        // 背景画像(の名前)を設定しておく
-        String backgroundString = preferences.getString("backgroundUri", "");
-        objectDrawer.setBackgroundUri(backgroundString);
-    }
-
-    /**
-     *  終了準備
-     */
-    public void shutdown()
-    {
-
-    }
-
-    /**
-     *  他画面から戻ってきたとき...
-     *
-     */
-    public void onActivityResult(int requestCode, int resultCode, Intent data)
-    {
-        if ((requestCode == MENU_ID_INSERT_PICTURE)&&(resultCode == Activity.RESULT_OK))
-        {
-            try
-            {
-                // 取得したuri を preferenceに記録する
-                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-                Uri backgroundUri = data.getData();
-                if (backgroundUri != null)
-                {
-                    try
-                    {
-                        if (Build.VERSION.SDK_INT >= 19)
-                        {
-                            parent.getContentResolver().takePersistableUriPermission(backgroundUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
-                        }
-                        SharedPreferences.Editor editor = preferences.edit();
-                        editor.putString("backgroundUri", backgroundUri.toString());
-                        editor.apply();
-                    }
-                    catch (Exception e)
-                    {
-                        e.printStackTrace();
-                    }
-                    // 背景画像イメージの更新処理
-                    updateBackgroundImage(backgroundUri.toString());
-                }
-                System.gc();
-            }
-            catch (Exception ex)
-            {
-                Log.v(TAG, "Ex:" + ex.getMessage());
-                ex.printStackTrace();
-            }
-            return;
-        }
-        else if (requestCode == MENU_ID_PREFERENCES)
-        {
-            // 背景色、背景画像の設定を行う。
-            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-            String colorString = preferences.getString("backgroundColor", "0xff004000");
-            objectDrawer.setBackgroundColor(colorString);
-
-            // 背景画像イメージの更新処理
-            String backgroundString = preferences.getString("backgroundUri", "");
-            updateBackgroundImage(backgroundString);
-
-            Log.v(TAG, "RETURENED PREFERENCES " + backgroundString);
-
-        }
-        else if (requestCode == MENU_ID_EXTEND)
-        {
-            // その他...今開いているファイルを読みなおす
-            dataInOutManager.loadFile((String) parent.getTitle());
-        }
-        else
-        {
-            // 画面表示の準備を実行...
-            //prepareToStart();
-            return;
-        }
-        // 画面の再描画を指示する
-        redrawSurfaceview();
-    }
-
-    /**
-     *    背景画像イメージの更新処理
-     *
-     */
-    private void updateBackgroundImage(String uri)
-    {
-        // 背景画像イメージの更新処理
-        GokigenSurfaceView graphView = parent.findViewById(R.id.GraphicView);
-
-        // ビットマップを設定する
-        objectDrawer.updateBackgroundBitmap(uri, graphView.getWidth(), graphView.getHeight());
-
-        // 画面の再描画指示
-        graphView.doDraw();
-    }
-
-
-    /**
-     *   クリックされたときの処理
-     */
-    public void onClick(View v)
-    {
-        int id = v.getId();
-
-        //Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onClick() " + id);
-        if (id == R.id.MeMoMaInfo)
-        {
-            // テキスト編集ダイアログを表示する
-            showInfoMessageEditDialog();
-        }
-        else if (id == R.id.LineStyleButton)
-        {
-            // ライン形状を変えるダイアログで変更するように変更する
-            selectLineShapeDialog();
-        }
-        else if (id == R.id.ExpandButton)
-        {
-            // 拡張メニューを呼び出す
-            callExtendMenu();
-        }
-        else if ((id == R.id.DeleteObjectButton)||(id == R.id.CreateObjectButton))
-        {
-            // 削除ボタン or 作成ボタンが押された時の処理
-            updateButtons(drawModeHolder.updateOperationMode(id));
-        }
-        else if (id == R.id.HomeButton)
-        {
-            //  表示位置をリセットする
-            // 表示倍率と並行移動についてリセットする
-            objectDrawer.resetScaleAndLocation((SeekBar) parent.findViewById(R.id.ZoomInOut));
-
-            // 画面の再描画を指示する
-            redrawSurfaceview();
-        }
-        else if (id == R.id.SaveButton)
-        {
-            // データ保存が指示された!
-            saveData(true);
-        }
-    }
-
-    /**
-     *   触られたときの処理
-     *
-     */
-    public boolean onTouch(View v, MotionEvent event)
-    {
-        int id = v.getId();
-        // int action = event.getAction();
-        //Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onTouch() " + id);
-
-        if (id == R.id.GraphicView)
-        {
-            // 画面をタッチした!
-            v.onTouchEvent(event);
-            return (true);
-        }
-        return (false);
-    }
-
-    /**
-     *  キーを押したときの操作
-     */
-    public boolean onKey(View v, int keyCode, KeyEvent event)
-    {
-        int action = event.getAction();
-        if ((action == KeyEvent.ACTION_DOWN)&&(keyCode == KeyEvent.KEYCODE_DPAD_CENTER))
-        {
-            Log.v(TAG, "KEY ENTER");
-        }
-        Log.v(TAG, "MeMoMaListener::onKey() ");
-        return (false);
-    }
-
-    /**
-     *   メニューへのアイテム追加
-     *
-     */
-    public Menu onCreateOptionsMenu(Menu menu)
-    {
-        // 新規作成
-        MenuItem menuItem = menu.add(Menu.NONE, MENU_ID_NEW, Menu.NONE, parent.getString(R.string.createnew));
-        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);   /*  for Android 3.1  */
-        menuItem.setIcon(android.R.drawable.ic_menu_add);    // 丸プラス
-
-        // 画像の共有
-        menuItem = menu.add(Menu.NONE, MENU_ID_SHARE, Menu.NONE, parent.getString(R.string.shareContent));
-        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);   /*  for Android 3.1  */
-        menuItem.setIcon(android.R.drawable.ic_menu_share);
-
-        // 画像のキャプチャ
-        menuItem = menu.add(Menu.NONE, MENU_ID_CAPTURE, Menu.NONE, parent.getString(R.string.capture_data));
-        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);   /*  for Android 3.1  */
-        menuItem.setIcon(android.R.drawable.ic_menu_crop);    // オブジェクトのキャプチャ
-
-        // 処理のUNDO
-        menuItem = menu.add(Menu.NONE, MENU_ID_UNDO, Menu.NONE, parent.getString(R.string.undo_operation));
-        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
-        menuItem.setIcon(android.R.drawable.ic_menu_revert);
-
-        // オブジェクトの整列
-        menuItem = menu.add(Menu.NONE, MENU_ID_ALIGN, Menu.NONE, parent.getString(R.string.align_data));
-        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
-        menuItem.setIcon(android.R.drawable.ic_menu_rotate);    // オブジェクトの整列
-
-        // タイトルの変更
-        menuItem = menu.add(Menu.NONE, MENU_ID_RENAME, Menu.NONE, parent.getString(R.string.rename_title));
-        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
-        menuItem.setIcon(android.R.drawable.ic_menu_edit);    // タイトルの変更
-
-        // 壁紙の選択
-        menuItem = menu.add(Menu.NONE, MENU_ID_INSERT_PICTURE, Menu.NONE, parent.getString(R.string.background_data));
-        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
-        menuItem.setIcon(android.R.drawable.ic_menu_gallery);    // 壁紙の選択
-
-        // 拡張メニュー
-        menuItem = menu.add(Menu.NONE, MENU_ID_EXTEND, Menu.NONE, parent.getString(R.string.extend_menu));
-        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
-        menuItem.setIcon(android.R.drawable.ic_menu_share);    // 拡張メニュー...
-
-        // 設定
-        menuItem = menu.add(Menu.NONE, MENU_ID_PREFERENCES, Menu.NONE, parent.getString(R.string.preference_name));
-        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
-        menuItem.setIcon(android.R.drawable.ic_menu_preferences);
-
-        // クレジット情報の表示
-        menuItem = menu.add(Menu.NONE, MENU_ID_ABOUT_GOKIGEN, Menu.NONE, parent.getString(R.string.about_gokigen));
-        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
-        menuItem.setIcon(android.R.drawable.ic_menu_info_details);
-
-        return (menu);
-    }
-
-    /**
-     *   メニュー表示前の処理
-     *
-     *
-     */
-    public void onPrepareOptionsMenu(Menu menu)
-    {
-        menu.findItem(MENU_ID_NEW).setVisible(true);
-        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);
-        menu.findItem(MENU_ID_RENAME).setVisible(true);
-        menu.findItem(MENU_ID_INSERT_PICTURE).setVisible(true);
-        menu.findItem(MENU_ID_EXTEND).setVisible(true);
-        menu.findItem(MENU_ID_PREFERENCES).setVisible(true);
-        menu.findItem(MENU_ID_ABOUT_GOKIGEN).setVisible(true);
-    }
-
-    /**
-     *   メニューのアイテムが選択されたときの処理
-     *
-     *
-     */
-    public boolean onOptionsItemSelected(MenuItem item)
-    {
-        boolean result;
-        switch (item.getItemId())
-        {
-            case MENU_ID_PREFERENCES:
-                showPreference();
-                result = true;
-                break;
-
-            case MENU_ID_ABOUT_GOKIGEN:
-                showAboutGokigen();
-                result = true;
-                break;
-
-            case MENU_ID_NEW:
-                createNewScreen();
-                result = true;
-                break;
-
-            case MENU_ID_EXTEND:
-                // 拡張メニューを呼び出す
-                callExtendMenu();
-                result = true;
-                break;
-
-            case MENU_ID_ALIGN:
-                // オブジェクトの整列を行う
-                alignData();
-                result = true;
-                break;
-
-            case MENU_ID_RENAME:
-                // タイトル名の変更  (テキスト編集ダイアログを表示する)
-                showInfoMessageEditDialog();
-                result = true;
-                break;
-
-            case MENU_ID_INSERT_PICTURE:
-                // 背景画像の設定を行う
-                insertPicture();
-                result = true;
-                break;
-
-            case MENU_ID_CAPTURE:
-                // 画面キャプチャを指示された場合...
-                doCapture(false);
-                result = true;
-                break;
-
-            case MENU_ID_SHARE:
-                // 画面キャプチャ&共有を指示された場合...
-                doCapture(true);
-                result = true;
-                break;
-
-            case android.R.id.home:
-                // アイコンが押された時の処理...
-                // テキスト編集ダイアログを表示する
-                showInfoMessageEditDialog();
-                result = true;
-                break;
-
-            case MENU_ID_UNDO:
-                // UNDO処理...
-                result = undoOperation();
-                break;
-
-            default:
-                result = false;
-                break;
-        }
-        return (result);
-    }
-
-
-    /**
-     *   操作を1つ戻す(Undo 処理)
-     *
-     */
-    private boolean undoOperation()
-    {
-        // undo処理を実行する
-        boolean ret = objectHolder.undo();
-
-        // 画面を再描画する
-        redrawSurfaceview();
-
-        return (ret);
-    }
-
-    /**
-     *  画像ファイルの挿入 (データファイルの更新)
-     *
-     */
-    private void insertPicture()
-    {
-        Intent intent;
-        if (Build.VERSION.SDK_INT >= 19) {
-            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
-            intent.addCategory(Intent.CATEGORY_OPENABLE);
-            intent.setType("image/*");
-            //intent.setAction(Intent.ACTION_GET_CONTENT);
-        } else {
-            intent = new Intent();
-            intent.setType("image/*");
-            intent.setAction(Intent.ACTION_GET_CONTENT);
-        }
-        parent.startActivityForResult(intent, MENU_ID_INSERT_PICTURE);
-    }
-
-    /**
-     *    画面キャプチャの実施
-     *
-     *
-     */
-    private void doCapture(boolean isShare)
-    {
-        // 画面のスクリーンショットをとる処理を実行する
-        dataInOutManager.doScreenCapture((String) parent.getTitle(), objectHolder, objectDrawer, isShare);
-
-        // 画面を再描画する
-        redrawSurfaceview();
-    }
-
-    /**
-     *   アプリの情報を表示する
-     *
-     */
-    private void showAboutGokigen()
-    {
-        // アプリの情報(クレジット)を表示する!
-        parent.showDialog(R.id.info_about_gokigen);
-    }
-
-    /**
-     *   拡張メニューを呼び出す
-     *
-     */
-    private void callExtendMenu()
-    {
-        // 現在表示中のデータをファイルに保存する
-        dataInOutManager.saveFile((String) parent.getTitle(), true);
-
-        // 現在読み込んでいるファイルのファイル名を生成する
-        String fullPath = dataInOutManager.getDataFileFullPath((String) parent.getTitle(), ".xml");
-
-        //  ここで拡張メニューを呼び出す
-        // (渡すデータを作って Intentとする)
-        Intent intent = new Intent();
-
-        intent.setAction(ExtensionActivity.MEMOMA_EXTENSION_LAUNCH_ACTIVITY);
-        intent.putExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_FULLPATH, fullPath);
-        intent.putExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_TITLE, (String) parent.getTitle());
-
-        // データ表示用Activityを起動する
-        parent.startActivityForResult(intent, MENU_ID_EXTEND);
-        //parent.startActivity(intent);
-    }
-
-    /**
-     *    データの読み込みを行う
-     *
-     */
-    private void prepareMeMoMaInfo()
-    {
-        //  設定に記録されているデータを画面のタイトルに反映させる
-        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-        String memomaInfo = preferences.getString("MeMoMaInfo", parent.getString(R.string.app_name));
-        parent.setTitle(memomaInfo);
-
-        // アクションバーとファイル名の準備
-        ActionBar bar = parent.getSupportActionBar();
-        if (bar != null)
-        {
-            dataInOutManager.prepare(objectHolder, bar, memomaInfo);
-        }
-        //dataInOutManager.loadFile((String) parent.getTitle());
-    }
-
-    /**
-     *   データの保存を行う
-     *
-     *
-     *   @param forceOverwrite  trueの時は、ファイル名が確定していたときは(確認せずに)上書き保存を自動で行う。
-     *
-     */
-    private void saveData(boolean forceOverwrite)
-    {
-        dataInOutManager.saveFile((String) parent.getTitle(), forceOverwrite);
-    }
-
-    /**
-     *   データの整列を行う
-     *
-     */
-    private void alignData()
-    {
-        ObjectAligner aligner = new ObjectAligner(parent, this);
-        aligner.execute(objectHolder);
-    }
-
-    /**
-     *    メッセージ編集ダイアログを表示する
-     *
-     */
-    private void showInfoMessageEditDialog()
-    {
-        parent.showDialog(R.id.editTextArea);
-    }
-
-    /**
-     *   新規作成が指示されたとき...全部クリアして作りなおして良いか確認する。
-     *
-     */
-    private void createNewScreen()
-    {
-        parent.showDialog(R.id.confirmation);
-    }
-
-    /**
-     *    接続線の設定ダイアログを表示する
-     */
-    private void selectLineShapeDialog()
-    {
-        // 接続線の設定ダイアログを表示する...
-        parent.showDialog(R.id.selectline_dialog);
-    }
-
-    /**
-     *    メッセージ編集ダイアログの表示を準備する
-     *
-     */
-    private void prepareInfoMessageEditDialog(Dialog dialog)
-    {
-        String message = (String) parent.getTitle();
-        editTextDialog.prepare(dialog, this, parent.getString(R.string.dataTitle), message, true);
-    }
-
-    /**
-     *    メッセージ編集ダイアログの表示を準備する
-     *
-     */
-    private void prepareConfirmationDialog(Dialog dialog)
-    {
-        // Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::prepareConfirmationDialog() " );
-    }
-
-    /**
-     *    オブジェクト入力用ダイアログの表示を準備する
-     *
-     */
-    private void prepareObjectInputDialog(Dialog dialog)
-    {
-        Log.v(TAG, "MeMoMaListener::prepareObjectInputDialog(), key: " + selectedObjectKey);
-
-        //  ダイアログの準備を行う
-        objectDataInputDialog.prepareObjectInputDialog(dialog, selectedObjectKey);
-    }
-
-    /**
-     *   アイテム選択ダイアログの表示を準備する
-     *
-     *
-     */
-    private void prepareItemSelectionDialog(Dialog dialog)
-    {
-        // アイテム選択ダイアログの表示設定
-        // (動的変更時。。。今回は固定なので何もしない)
-    }
-
-    /**
-     *    接続線選択用ダイアログの表示を準備する
-     *
-     */
-    private void prepareLineSelectionDialog(Dialog dialog)
-    {
-        Log.v(TAG, "MeMoMaListener::prepareLineSelectionDialog(), key: " + selectedObjectKey);
-
-        //  ダイアログの準備を行う
-        lineSelectionDialog.prepareSelectLineShapeDialog(dialog, selectedObjectKey);
-    }
-
-    /**
-     *  設定画面を表示する処理
-     */
-    private void showPreference()
-    {
-        try
-        {
-            // 設定画面を呼び出す
-            Intent prefIntent = new Intent(parent,Preference.class);
-            parent.startActivityForResult(prefIntent, MENU_ID_PREFERENCES);
-        }
-        catch (Exception e)
-        {
-            // 例外発生...なにもしない。
-            e.printStackTrace();
-            //updater.showMessage("ERROR", MainUpdater.SHOWMETHOD_DONTCARE);
-        }
-    }
-
-    /**
-     *    接続線の形状を反映させる
-     *
-     */
-    private void setLineStyle()
-    {
-        int buttonId = LineStyleHolder.getLineShapeImageId(lineStyleHolder.getLineStyle(), lineStyleHolder.getLineShape());
-        final ImageButton lineStyleObj = parent.findViewById(R.id.LineStyleButton);
-        lineStyleObj.setImageResource(buttonId);
-    }
-
-    /**
-     *    オブジェクトが生成された!
-     *
-     */
-    public void objectCreated()
-    {
-        // ここで動作モードを移動モードに戻す。
-        drawModeHolder.changeOperationMode(OperationModeHolder.OPERATIONMODE_MOVE);
-        updateButtons(OperationModeHolder.OPERATIONMODE_MOVE);
-
-        // 画面を再描画する
-        redrawSurfaceview();
-    }
-
-    /**
-     *    空き領域がタッチされた!
-     *
-     */
-    public int touchedVacantArea()
-    {
-        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-        return (Integer.parseInt(preferences.getString("operationMode", "0")));
-    }
-
-    /**
-     *    空き領域でタッチが離された!
-     *
-     */
-    public int touchUppedVacantArea()
-    {
-        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-        return (Integer.parseInt(preferences.getString("operationMode", "0")));
-    }
-
-    /**
-     *    オブジェクトを本当に削除して良いか確認した後に、オブジェクトを削除する。
-     *
-     *
-     */
-    private void removeObject(Integer key)
-    {
-        // 本当に消して良いか、確認をするダイアログを表示して、OKが押されたら消す。
-        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(parent);
-        alertDialogBuilder.setTitle(parent.getString(R.string.deleteconfirm_title));
-        alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert);
-        alertDialogBuilder.setMessage(parent.getString(R.string.deleteconfirm_message));
-
-        // 削除するオブジェクトのキーを覚えこむ。
-        objectKeyToDelete = key;
-
-        // OKボタンの生成
-        alertDialogBuilder.setPositiveButton(parent.getString(R.string.confirmYes), new DialogInterface.OnClickListener()
-        {
-            public void onClick(DialogInterface dialog, int id)
-            {
-                //  削除モードの時... 確認後削除だけど、今は確認なしで削除を行う。
-                objectHolder.removePosition(objectKeyToDelete);
-
-                // 削除するオブジェクトに接続されている線もすべて削除する
-                objectHolder.getConnectLineHolder().removeAllConnection(objectKeyToDelete);
-
-                // ダイアログを閉じる
-                dialog.dismiss();
-
-                // ここで動作モードを削除モードから移動モードに戻す。
-                drawModeHolder.changeOperationMode(OperationModeHolder.OPERATIONMODE_MOVE);
-                updateButtons(OperationModeHolder.OPERATIONMODE_MOVE);
-
-
-                // 画面を再描画する
-                redrawSurfaceview();
-            }
-        });
-
-        // Cancelボタンの生成
-        alertDialogBuilder.setNegativeButton(parent.getString(R.string.confirmNo), new DialogInterface.OnClickListener()
-        {
-            public void onClick(DialogInterface dialog, int id)
-            {
-                dialog.cancel();
-            }
-        });
-
-        // ダイアログはキャンセル可能に設定する
-        alertDialogBuilder.setCancelable(true);
-
-        // ダイアログを表示する
-        AlertDialog alertDialog = alertDialogBuilder.create();
-        alertDialog.show();
-    }
-
-    /**
-     *    オブジェクトを複製する
-     *
-     *
-     */
-    private void duplicateObject(Integer key)
-    {
-        // 選択中オブジェクトを複製する
-        objectHolder.duplicatePosition(key);
-
-        // 画面を再描画する
-        redrawSurfaceview();
-    }
-
-    /**
-     *    オブジェクトを拡大する
-     *
-     *
-     */
-    private void expandObject(Integer key)
-    {
-        // 選択中オブジェクトを拡大する
-        objectHolder.expandObjectSize(key);
-
-        // 画面を再描画する
-        redrawSurfaceview();
-    }
-    /**
-     *    オブジェクトを縮小する
-     *
-     *
-     */
-    private void shrinkObject(Integer key)
-    {
-        // 選択中オブジェクトを縮小する
-        objectHolder.shrinkObjectSize(key);
-
-        // 画面を再描画する
-        redrawSurfaceview();
-    }
-
-    private void setButtonBorder(ImageButton button, boolean isHighlight)
-    {
-        try
-        {
-            BitmapDrawable btnBackgroundShape = (BitmapDrawable)button.getBackground();
-            if (isHighlight)
-            {
-//                             btnBackgroundShape.setColorFilter(Color.rgb(51, 181, 229), Mode.LIGHTEN);
-                btnBackgroundShape.setColorFilter(Color.BLUE, Mode.LIGHTEN);
-            }
-            else
-            {
-                btnBackgroundShape.setColorFilter(Color.BLACK, Mode.LIGHTEN);
-            }
-        }
-        catch (Exception ex)
-        {
-            //
-            Log.v(TAG, "MeMoMaListener::setButtonBorder(): " + ex.toString());
-        }
-    }
-
-    /**
-     *   ボタンを更新する
-     *
-     */
-    private void updateButtons(int mode)
-    {
-        final ImageButton createObjectButton = parent.findViewById(R.id.CreateObjectButton);
-        final ImageButton deleteObjectButton = parent.findViewById(R.id.DeleteObjectButton);
-
-        if (mode == OperationModeHolder.OPERATIONMODE_DELETE)
-        {
-            setButtonBorder(createObjectButton, false);
-            setButtonBorder(deleteObjectButton, true);
-        }
-        else if (mode == OperationModeHolder.OPERATIONMODE_CREATE)
-        {
-            setButtonBorder(createObjectButton, true);
-            setButtonBorder(deleteObjectButton, false);
-        }
-        else // if (mode == OperationModeHolder.OPERATIONMODE_MOVE)
-        {
-            setButtonBorder(createObjectButton, false);
-            setButtonBorder(deleteObjectButton, false);
-        }
-    }
-
-
-    /**
-     *   オブジェクトが選択された(長押しで!)
-     *
-     */
-    public void objectSelectedContext(Integer key)
-    {
-        Log.v(TAG, "MeMoMaListener::objectSelectedContext(),  key:" + key);
-        selectedContextKey = key;
-
-        // オブジェクトのアイテム選択ダイアログを表示する...
-        parent.showDialog(MENU_ID_OPERATION);
-
-    }
-
-
-    /**
-     *   オブジェクトが選択された!
-     *
-     */
-    public boolean objectSelected(Integer key)
-    {
-        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-        int operationMode = Integer.parseInt(preferences.getString("operationMode", "0"));
-        if (operationMode == OperationModeHolder.OPERATIONMODE_DELETE)
-        {
-            // オブジェクトを削除する
-            removeObject(key);
-
-            return (true);
-        }
-        //if ((operationMode == OperationModeHolder.OPERATIONMODE_MOVE)||
-        //             (operationMode == OperationModeHolder.OPERATIONMODE_CREATE))
-        {
-            // 選択されたオブジェクトを記憶する
-            selectedObjectKey = key;
-            Log.v(TAG, "MeMoMaListener::objectSelected() key : " + key);
-
-            // オブジェクトの詳細設定ダイアログを表示する...
-            parent.showDialog(R.id.objectinput_dialog);
-        }
-        return (true);
-    }
-
-    /**
-     *  ダイアログの生成
-     *
-     */
-    public Dialog onCreateDialog(int id)
-    {
-        if (id == R.id.info_about_gokigen)
-        {
-            // クレジットダイアログを表示
-            CreditDialog dialog = new CreditDialog(parent);
-            return (dialog.getDialog());
-        }
-        if (id == R.id.editTextArea)
-        {
-            // 変更するテキストを表示
-            return (editTextDialog.getDialog());
-        }
-        if (id == R.id.confirmation)
-        {
-            // 確認するメッセージを表示する
-            return (confirmationDialog.getDialog());
-        }
-        if (id == R.id.objectinput_dialog)
-        {
-            // オブジェクト入力のダイアログを表示する
-            return (objectDataInputDialog.getDialog());
-        }
-        if (id == MENU_ID_OPERATION)
-        {
-            // アイテム選択ダイアログの準備を行う
-            return (itemSelectionDialog.getDialog());
-        }
-        if (id == R.id.selectline_dialog)
-        {
-            // 接続線選択ダイアログの準備を行う
-            return (lineSelectionDialog.getDialog());
-        }
-        return (null);
-    }
-
-    /**
-     *  ダイアログ表示の準備
-     *
-     */
-    public void onPrepareDialog(int id, Dialog dialog)
-    {
-        if (id == R.id.editTextArea)
-        {
-            // 変更するデータを表示する
-            prepareInfoMessageEditDialog(dialog);
-            return;
-        }
-        if (id == R.id.confirmation)
-        {
-            // 確認ダイアログを表示する。
-            prepareConfirmationDialog(dialog);
-            return;
-        }
-        if (id == R.id.objectinput_dialog)
-        {
-            // オブジェクト入力のダイアログを表示する
-            prepareObjectInputDialog(dialog);
-        }
-        if (id == MENU_ID_OPERATION)
-        {
-            // オブジェクト操作選択のダイアログを表示する
-            prepareItemSelectionDialog(dialog);
-        }
-        if (id == R.id.selectline_dialog)
-        {
-            // 接続線選択のダイアログを表示する
-            prepareLineSelectionDialog(dialog);
-        }
-    }
-
-    /**
-     *    新規状態に変更する。
-     *
-     */
-    public void acceptConfirmation()
-    {
-        //
-        Log.v(TAG, "MeMoMaListener::acceptConfirmation()");
-
-        // オブジェクトデータをクリアする。
-        objectHolder.removeAllPositions();  // オブジェクトの保持クラス
-        objectHolder.getConnectLineHolder().removeAllLines();  // オブジェクト間の接続状態保持クラス
-
-        // 画面の倍率と表示位置を初期状態に戻す
-        if (objectDrawer != null)
-        {
-            final SeekBar zoomBar = parent.findViewById(R.id.ZoomInOut);
-            objectDrawer.resetScaleAndLocation(zoomBar);
-        }
-
-               /*
-               // 題名を "無題"に変更し、関係情報をクリアする
-               String newName = parent.getString(R.string.no_name);
-               parent.setTitle(newName);
-               SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-            SharedPreferences.Editor editor = preferences.edit();
-            editor.putString("MeMoMaInfo", newName);
-            editor.commit();
-            */
-
-        // 画面を再描画する
-        redrawSurfaceview();
-
-        // ファイル名選択ダイアログを開く
-        showInfoMessageEditDialog();
-    }
-
-    /**
-     *   画面を再描画する
-     *
-     */
-    private void redrawSurfaceview()
-    {
-        try
-        {
-            final GokigenSurfaceView surfaceView = parent.findViewById(R.id.GraphicView);
-            surfaceView.doDraw();
-        }
-        catch (Exception e)
-        {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     *    不許可。何もしない。
-     *
-     */
-    public  void rejectConfirmation()
-    {
-        Log.v(TAG, "MeMoMaListener::rejectConfirmation()");
-    }
-
-    /**
-     *   オブジェクトが整列された時の処理
-     *
-     */
-    public void objectAligned()
-    {
-        // 画面の再描画を指示する
-        redrawSurfaceview();
-    }
-
-    /**
-     *   オブジェクト編集ダイアログが閉じられた時の処理
-     *
-     */
-    public void finishObjectInput()
-    {
-        // 画面の再描画を指示する
-        redrawSurfaceview();
-    }
-
-    /**
-     *   オブジェクト編集ダイアログが閉じられた時の処理
-     *
-     */
-    public void cancelObjectInput()
-    {
-        // 何もしない
-    }
-
-    /**
-     *   アイテムが選択された!
-     *
-     */
-    public void itemSelected(int index, String itemValue)
-    {
-        //
-        Log.v(TAG, "MeMoMaListener::itemSelected() : " + itemValue + " [" + index + "]");
-
-        if (index == ObjectOperationCommandHolder.OBJECTOPERATION_DELETE)
-        {
-            // オブジェクト削除の確認
-            removeObject(selectedContextKey);
-        }
-        else if (index == ObjectOperationCommandHolder.OBJECTOPERATION_DUPLICATE)
-        {
-            // オブジェクトの複製
-            duplicateObject(selectedContextKey);
-        }
-        else if (index == ObjectOperationCommandHolder.OBJECTOPERATION_SIZEBIGGER)
-        {
-            // オブジェクトの拡大
-            expandObject(selectedContextKey);
-        }
-        else if (index == ObjectOperationCommandHolder.OBJECTOPERATION_SIZESMALLER)
-        {
-            // オブジェクトの縮小
-            shrinkObject(selectedContextKey);
-        }
-    }
-
-    /**
-     *    (今回未使用)
-     *
-     */
-    public void itemSelectedMulti(String[] items, boolean[] status)
-    {
-
-    }
-    public void canceledSelection()
-    {
-
-    }
-
-    public void onSaveInstanceState(Bundle outState)
-    {
-        /* ここで状態を保存 */
-        Log.v(TAG, "MeMoMaListener::onSaveInstanceState() : " + outState.toString() );
-    }
-
-    public void onRestoreInstanceState(Bundle savedInstanceState)
-    {
-        /* ここで状態を復元 */
-        Log.v(TAG, "MeMoMaListener::onRestoreInstanceState() : " + savedInstanceState.toString());
-    }
-
-    public void finishTextEditDialog(String message)
-    {
-        if ((message == null)||(message.length() == 0))
-        {
-            // データが入力されていなかったので、何もしない。
-            return;
-        }
-
-        try
-        {
-            // 文字列を記録
-            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-            SharedPreferences.Editor editor = preferences.edit();
-            editor.putString("MeMoMaInfo", message);
-            editor.apply();
-
-            // タイトルに設定
-            parent.setTitle(message);
-
-            // 保存シーケンスを一度走らせる
-            saveData(true);
-
-            // ファイル選択リストの更新
-            dataInOutManager.updateFileList(message, parent.getSupportActionBar());
-        }
-        catch (Exception e)
-        {
-            e.printStackTrace();
-        }
-    }
-
-    public void cancelTextEditDialog()
-    {
-    }
-
-    /**
-     *    接続線
-     *
-     */
-    public void finishSelectLineShape(int style, int shape, int thickness)
-    {
-        int buttonId = LineStyleHolder.getLineShapeImageId(style, shape);
-        final ImageButton lineStyleObj =parent.findViewById(R.id.LineStyleButton);
-        lineStyleObj.setImageResource(buttonId);
-    }
-
-    /**
-     *
-     */
-    public void cancelSelectLineShape()
-    {
-
-    }
-}
diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.kt b/app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.kt
new file mode 100644 (file)
index 0000000..32604ea
--- /dev/null
@@ -0,0 +1,1180 @@
+package jp.sourceforge.gokigen.memoma
+
+import android.app.Activity
+import android.app.AlertDialog
+import android.app.Dialog
+import android.content.Intent
+import android.graphics.Color
+import android.graphics.PorterDuff
+import android.graphics.drawable.BitmapDrawable
+import android.os.Build
+import android.os.Bundle
+import android.util.Log
+import android.view.KeyEvent
+import android.view.Menu
+import android.view.MenuItem
+import android.view.MotionEvent
+import android.view.View
+import android.view.View.OnTouchListener
+import android.widget.ImageButton
+import android.widget.SeekBar
+import androidx.appcompat.app.AppCompatActivity
+import androidx.preference.PreferenceManager
+import jp.sourceforge.gokigen.memoma.dialogs.ConfirmationDialog
+import jp.sourceforge.gokigen.memoma.dialogs.CreditDialog
+import jp.sourceforge.gokigen.memoma.dialogs.ItemSelectionDialog
+import jp.sourceforge.gokigen.memoma.dialogs.ItemSelectionDialog.ISelectionItemReceiver
+import jp.sourceforge.gokigen.memoma.dialogs.TextEditDialog
+import jp.sourceforge.gokigen.memoma.dialogs.TextEditDialog.ITextEditResultReceiver
+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.LineStyleHolder
+import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder
+import jp.sourceforge.gokigen.memoma.holders.OperationModeHolder
+import jp.sourceforge.gokigen.memoma.io.MeMoMaDataInOutManager
+import jp.sourceforge.gokigen.memoma.operations.IObjectSelectionReceiver
+import jp.sourceforge.gokigen.memoma.operations.ObjectAligner
+import jp.sourceforge.gokigen.memoma.operations.ObjectAligner.IAlignCallback
+import jp.sourceforge.gokigen.memoma.operations.ObjectDataInputDialog
+import jp.sourceforge.gokigen.memoma.operations.ObjectOperationCommandHolder
+import jp.sourceforge.gokigen.memoma.operations.SelectLineShapeDialog
+import jp.sourceforge.gokigen.memoma.preference.Preference
+
+/**
+ * メモま! のメイン画面処理
+ *
+ * @author MRSa
+ */
+class MeMoMaListener internal constructor(private val parent: AppCompatActivity, private val dataInOutManager: MeMoMaDataInOutManager) :
+    View.OnClickListener, OnTouchListener, View.OnKeyListener,
+    IObjectSelectionReceiver, ConfirmationDialog.IResultReceiver,
+    ObjectDataInputDialog.IResultReceiver,
+    ISelectionItemReceiver, ITextEditResultReceiver, IAlignCallback,
+    SelectLineShapeDialog.IResultReceiver
+{
+    private val editTextDialog: TextEditDialog = TextEditDialog(parent, R.drawable.icon)
+    private val objectDrawer: MeMoMaCanvasDrawer
+    private val objectHolder: MeMoMaObjectHolder = MeMoMaObjectHolder(parent)
+    private val drawModeHolder: OperationModeHolder = OperationModeHolder(parent)
+    private val lineStyleHolder: LineStyleHolder = LineStyleHolder(parent)
+    private val confirmationDialog: ConfirmationDialog
+    private val objectDataInputDialog: ObjectDataInputDialog
+    private val lineSelectionDialog: SelectLineShapeDialog
+    private val itemSelectionDialog: ItemSelectionDialog
+    private var selectedObjectKey = 0
+    private var objectKeyToDelete = 0
+    private var selectedContextKey = 0
+
+    /**
+     * コンストラクタ
+     *
+     */
+    init
+    {
+        lineStyleHolder.prepare()
+
+        // 確認ダイアログ
+        confirmationDialog = ConfirmationDialog(parent)
+        confirmationDialog.prepare(
+            this,
+            android.R.drawable.ic_dialog_alert,
+            parent.getString(R.string.createnew_title),
+            parent.getString(R.string.createnew_message)
+        )
+
+        // オブジェクトのデータ入力ダイアログを生成
+        objectDataInputDialog = ObjectDataInputDialog(parent, objectHolder)
+        objectDataInputDialog.setResultReceiver(this)
+
+        // 接続線の形状と太さを選択するダイアログを生成
+        lineSelectionDialog = SelectLineShapeDialog(parent, lineStyleHolder)
+        lineSelectionDialog.setResultReceiver(this)
+
+        // アイテム選択ダイアログを生成
+        val commandHolder = ObjectOperationCommandHolder(parent)
+        itemSelectionDialog = ItemSelectionDialog(parent)
+        itemSelectionDialog.prepare(
+            this,
+            commandHolder,
+            parent.getString(R.string.object_operation)
+        )
+
+        // 描画クラスの生成
+        objectDrawer = MeMoMaCanvasDrawer(parent, objectHolder, lineStyleHolder, this)
+        val colorString = (PreferenceManager.getDefaultSharedPreferences(parent)).getString("backgroundColor", "0xff004000")
+        objectDrawer.setBackgroundColor(colorString)
+    }
+
+    /**
+     * がっつりこのクラスにイベントリスナを接続する
+     *
+     */
+    fun prepareListener()
+    {
+        // ボタンクリック時のイベントを受信する設定...
+        (parent.findViewById<ImageButton>(R.id.HomeButton)).setOnClickListener(this)
+        (parent.findViewById<ImageButton>(R.id.ExpandButton)).setOnClickListener(this)
+        (parent.findViewById<ImageButton>(R.id.CreateObjectButton)).setOnClickListener(this)
+        (parent.findViewById<ImageButton>(R.id.DeleteObjectButton)).setOnClickListener(this)
+        (parent.findViewById<ImageButton>(R.id.LineStyleButton)).setOnClickListener(this)
+        (parent.findViewById<ImageButton>(R.id.SaveButton)).setOnClickListener(this)
+        (parent.findViewById<GokigenSurfaceView>(R.id.GraphicView)).setOnTouchListener(this)
+
+        // スライドバーが動かされた時の処理
+        val seekbar = parent.findViewById<SeekBar>(R.id.ZoomInOut)
+        seekbar.setOnSeekBarChangeListener(objectDrawer)
+
+        val preferences = PreferenceManager.getDefaultSharedPreferences(parent)
+        val progress = preferences.getInt("zoomProgress", 50)
+        seekbar.progress = progress
+
+        // 「実行中」の表示を消す
+        parent.setProgressBarIndeterminateVisibility(false)
+
+        // 起動時にデータを読み出す
+        prepareMeMoMaInfo()
+    }
+
+    /**
+     * 終了準備
+     */
+    fun finishListener()
+    {
+        // 終了時に状態を保存する
+        saveData(true)
+    }
+
+    /**
+     * スタート準備
+     */
+    fun prepareToStart()
+    {
+        //  設定に記録されているデータを画面に反映させる
+        val preferences = PreferenceManager.getDefaultSharedPreferences(parent)
+
+        // ラインの形状を取得し、設定する
+        setLineStyle()
+
+        // 操作モードを画面に反映させる
+        updateButtons((preferences.getString("operationMode", "0")?:"0").toInt())
+
+        // 条件に合わせて、描画クラスを変更する
+        (parent.findViewById<GokigenSurfaceView>(R.id.GraphicView)).setCanvasDrawer(objectDrawer)
+
+        // 背景画像(の名前)を設定しておく
+        val backgroundString = preferences.getString("backgroundUri", "")
+        objectDrawer.setBackgroundUri(backgroundString)
+    }
+
+    /**
+     * 終了準備
+     */
+    fun shutdown()
+    {
+        // 保存シーケンスを走らせる
+        saveData(true)
+    }
+
+    /**
+     * 他画面から戻ってきたとき...
+     *
+     */
+    fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
+    {
+        if ((requestCode == MENU_ID_INSERT_PICTURE) && (resultCode == Activity.RESULT_OK))
+        {
+            try
+            {
+                // 取得したuri を preferenceに記録する
+                val preferences = PreferenceManager.getDefaultSharedPreferences(parent)
+                val backgroundUri = data?.data
+                if (backgroundUri != null)
+                {
+                    try
+                    {
+                        if (Build.VERSION.SDK_INT >= 19)
+                        {
+                            parent.contentResolver.takePersistableUriPermission(
+                                backgroundUri,
+                                Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+                            )
+                        }
+                        val editor = preferences.edit()
+                        editor.putString("backgroundUri", backgroundUri.toString())
+                        editor.apply()
+                    }
+                    catch (e: Exception)
+                    {
+                        e.printStackTrace()
+                    }
+                    // 背景画像イメージの更新処理
+                    updateBackgroundImage(backgroundUri.toString())
+                }
+                System.gc()
+            }
+            catch (ex: Exception)
+            {
+                Log.v(TAG, "Ex:" + ex.message)
+                ex.printStackTrace()
+            }
+            return
+        }
+        else if (requestCode == MENU_ID_PREFERENCES)
+        {
+            // 背景色、背景画像の設定を行う。
+            val preferences = PreferenceManager.getDefaultSharedPreferences(parent)
+            val colorString = preferences.getString("backgroundColor", "0xff004000")
+            objectDrawer.setBackgroundColor(colorString)
+
+            // 背景画像イメージの更新処理
+            val backgroundString = preferences.getString("backgroundUri", "")
+            updateBackgroundImage(backgroundString)
+            Log.v(TAG, "RETURENED PREFERENCES $backgroundString")
+        }
+        else if (requestCode == MENU_ID_EXTEND)
+        {
+            // その他...今開いているファイルを読みなおす
+            dataInOutManager.loadFile(parent.title as String)
+        }
+        else
+        {
+            // 画面表示の準備を実行...
+            //prepareToStart();
+            return
+        }
+        // 画面の再描画を指示する
+        redrawSurfaceview()
+    }
+
+    /**
+     * 背景画像イメージの更新処理
+     *
+     */
+    private fun updateBackgroundImage(uri: String?)
+    {
+        // 背景画像イメージの更新処理
+        val graphView = parent.findViewById<GokigenSurfaceView>(R.id.GraphicView)
+
+        // ビットマップを設定する
+        objectDrawer.updateBackgroundBitmap(uri, graphView.width, graphView.height)
+
+        // 画面の再描画指示
+        graphView.doDraw()
+    }
+
+    /**
+     * クリックされたときの処理
+     */
+    override fun onClick(v: View)
+    {
+        val id = v.id
+        when (id)
+        {
+            R.id.MeMoMaInfo -> {
+                showInfoMessageEditDialog()  // テキスト編集ダイアログを表示する
+            }
+            R.id.LineStyleButton -> {
+                selectLineShapeDialog() // ライン形状を変えるダイアログ
+            }
+            R.id.ExpandButton -> {
+                callExtendMenu()      // 拡張メニューを呼び出す
+            }
+            R.id.DeleteObjectButton, R.id.CreateObjectButton -> {
+                // 削除ボタン or 作成ボタンが押された時の処理
+                updateButtons(drawModeHolder.updateOperationMode(id))
+            }
+            R.id.HomeButton -> {
+                //  表示位置、表示倍率と並行移動についてリセットする
+                objectDrawer.resetScaleAndLocation(parent.findViewById(R.id.ZoomInOut))
+
+                // 画面の再描画を指示する
+                redrawSurfaceview()
+            }
+            R.id.SaveButton -> {
+                // データ保存が指示された!
+                saveData(true)
+            }
+        }
+    }
+
+    /**
+     * 触られたときの処理
+     *
+     */
+    override fun onTouch(v: View, event: MotionEvent): Boolean
+    {
+        val id = v.id
+        if (id == R.id.GraphicView)
+        {
+            // 画面をタッチした!
+            v.onTouchEvent(event)
+            return true
+        }
+        return false
+    }
+
+    /**
+     * キーを押したときの操作
+     */
+    override fun onKey(v: View, keyCode: Int, event: KeyEvent): Boolean
+    {
+/*
+        val action = event.action
+        if (action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
+        {
+            //Log.v(TAG, "KEY ENTER")
+        }
+        //Log.v(TAG, "MeMoMaListener::onKey() ")
+*/
+        return false
+    }
+
+    /**
+     * メニューへのアイテム追加
+     *
+     */
+    fun onCreateOptionsMenu(menu: Menu): Menu
+    {
+        // 新規作成
+        var menuItem =
+            menu.add(Menu.NONE, MENU_ID_NEW, Menu.NONE, parent.getString(R.string.createnew))
+        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) /*  for Android 3.1  */
+        menuItem.setIcon(android.R.drawable.ic_menu_add) // 丸プラス
+
+        // 画像の共有
+        menuItem =
+            menu.add(Menu.NONE, MENU_ID_SHARE, Menu.NONE, parent.getString(R.string.shareContent))
+        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) /*  for Android 3.1  */
+        menuItem.setIcon(android.R.drawable.ic_menu_share)
+
+        // 画像のキャプチャ
+        menuItem =
+            menu.add(Menu.NONE, MENU_ID_CAPTURE, Menu.NONE, parent.getString(R.string.capture_data))
+        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) /*  for Android 3.1  */
+        menuItem.setIcon(android.R.drawable.ic_menu_crop) // オブジェクトのキャプチャ
+
+        // 処理のUNDO
+        menuItem =
+            menu.add(Menu.NONE, MENU_ID_UNDO, Menu.NONE, parent.getString(R.string.undo_operation))
+        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) /*  for Android 3.1  */
+        menuItem.setIcon(android.R.drawable.ic_menu_revert)
+
+        // オブジェクトの整列
+        menuItem =
+            menu.add(Menu.NONE, MENU_ID_ALIGN, Menu.NONE, parent.getString(R.string.align_data))
+        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) /*  for Android 3.1  */
+        menuItem.setIcon(android.R.drawable.ic_menu_rotate) // オブジェクトの整列
+
+        // タイトルの変更
+        menuItem =
+            menu.add(Menu.NONE, MENU_ID_RENAME, Menu.NONE, parent.getString(R.string.rename_title))
+        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) /*  for Android 3.1  */
+        menuItem.setIcon(android.R.drawable.ic_menu_edit) // タイトルの変更
+
+        // 壁紙の選択
+        menuItem = menu.add(
+            Menu.NONE,
+            MENU_ID_INSERT_PICTURE,
+            Menu.NONE,
+            parent.getString(R.string.background_data)
+        )
+        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) /*  for Android 3.1  */
+        menuItem.setIcon(android.R.drawable.ic_menu_gallery) // 壁紙の選択
+
+        // 拡張メニュー
+        menuItem =
+            menu.add(Menu.NONE, MENU_ID_EXTEND, Menu.NONE, parent.getString(R.string.extend_menu))
+        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) /*  for Android 3.1  */
+        menuItem.setIcon(android.R.drawable.ic_menu_share) // 拡張メニュー...
+
+        // 設定
+        menuItem = menu.add(
+            Menu.NONE,
+            MENU_ID_PREFERENCES,
+            Menu.NONE,
+            parent.getString(R.string.preference_name)
+        )
+        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) /*  for Android 3.1  */
+        menuItem.setIcon(android.R.drawable.ic_menu_preferences)
+
+        // クレジット情報の表示
+        menuItem = menu.add(
+            Menu.NONE,
+            MENU_ID_ABOUT_GOKIGEN,
+            Menu.NONE,
+            parent.getString(R.string.about_gokigen)
+        )
+        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER) /*  for Android 3.1  */
+        menuItem.setIcon(android.R.drawable.ic_menu_info_details)
+
+        return menu
+    }
+
+    /**
+     * メニュー表示前の処理
+     *
+     *
+     */
+    fun onPrepareOptionsMenu(menu: Menu)
+    {
+        menu.findItem(MENU_ID_NEW).isVisible = true
+        menu.findItem(MENU_ID_UNDO).isVisible = objectHolder.isHistoryExist
+        menu.findItem(MENU_ID_SHARE).isVisible = true
+        menu.findItem(MENU_ID_CAPTURE).isVisible = true
+        menu.findItem(MENU_ID_ALIGN).isVisible = true
+        menu.findItem(MENU_ID_RENAME).isVisible = true
+        menu.findItem(MENU_ID_INSERT_PICTURE).isVisible = true
+        menu.findItem(MENU_ID_EXTEND).isVisible = true
+        menu.findItem(MENU_ID_PREFERENCES).isVisible = true
+        menu.findItem(MENU_ID_ABOUT_GOKIGEN).isVisible = true
+    }
+
+    /**
+     * メニューのアイテムが選択されたときの処理
+     *
+     *
+     */
+    fun onOptionsItemSelected(item: MenuItem): Boolean
+    {
+        val result: Boolean = when (item.itemId)
+        {
+            MENU_ID_PREFERENCES -> {
+                showPreference()
+                true
+            }
+
+            MENU_ID_ABOUT_GOKIGEN -> {
+                showAboutGokigen()
+                true
+            }
+
+            MENU_ID_NEW -> {
+                createNewScreen()
+                true
+            }
+
+            MENU_ID_EXTEND -> {
+                callExtendMenu()  // 拡張メニューを呼び出す
+                true
+            }
+
+            MENU_ID_ALIGN -> {
+                alignData()  // オブジェクトの整列を行う
+                true
+            }
+
+            MENU_ID_RENAME, android.R.id.home -> {
+                // アイコンが押された時の処理...
+                // テキスト編集ダイアログを表示する
+                // タイトル名の変更  (テキスト編集ダイアログを表示する)
+                showInfoMessageEditDialog()
+                true
+            }
+
+            MENU_ID_INSERT_PICTURE -> {
+                // 背景画像の設定を行う
+                insertPicture()
+                true
+            }
+
+            MENU_ID_CAPTURE -> {
+                // 画面キャプチャを指示された場合...
+                doCapture(false)
+                true
+            }
+
+            MENU_ID_SHARE -> {
+                // 画面キャプチャ&共有を指示された場合...
+                doCapture(true)
+                true
+            }
+            MENU_ID_UNDO -> {
+                undoOperation() // UNDO
+            }
+            else -> false
+        }
+        return result
+    }
+
+    /**
+     * 操作を1つ戻す(Undo 処理)
+     */
+    private fun undoOperation(): Boolean
+    {
+        val ret = objectHolder.undo()  // undo処理を実行する
+        redrawSurfaceview()  // 画面を再描画する
+        return ret
+    }
+
+    /**
+     * 画像ファイルの挿入 (データファイルの更新)
+     */
+    private fun insertPicture()
+    {
+        val intent: Intent
+        if (Build.VERSION.SDK_INT >= 19)
+        {
+            intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
+            intent.addCategory(Intent.CATEGORY_OPENABLE)
+            intent.type = "image/*"
+            //intent.setAction(Intent.ACTION_GET_CONTENT);
+        }
+        else
+        {
+            intent = Intent()
+            intent.type = "image/*"
+            intent.action = Intent.ACTION_GET_CONTENT
+        }
+        parent.startActivityForResult(intent, MENU_ID_INSERT_PICTURE)
+    }
+
+    /**
+     * 画面キャプチャの実施
+     */
+    private fun doCapture(isShare: Boolean)
+    {
+        // 画面のスクリーンショットをとる処理を実行する
+        dataInOutManager.doScreenCapture(
+            parent.title as String,
+            objectHolder,
+            objectDrawer,
+            isShare
+        )
+
+        // 画面を再描画する
+        redrawSurfaceview()
+    }
+
+    /**
+     * アプリの情報を表示する
+     *
+     */
+    private fun showAboutGokigen()
+    {
+        // アプリの情報(クレジット)を表示する!
+        parent.showDialog(R.id.info_about_gokigen)
+    }
+
+    /**
+     * 拡張メニューを呼び出す
+     *
+     */
+    private fun callExtendMenu()
+    {
+        val dataTitle = parent.title as String
+
+        // 現在表示中のデータをファイルに保存する
+        dataInOutManager.saveFile(dataTitle, true)
+
+        // Preferenceにもデータタイトル名称を記録する
+        setPreferenceDataTitle(dataTitle)
+
+        // 現在読み込んでいるファイルのファイル名を生成する
+        val fullPath = dataInOutManager.getDataFileFullPath(dataTitle, ".xml")
+
+        //  ここで拡張メニューを呼び出す
+        // (渡すデータを作って Intentとする)
+        val intent = Intent()
+        intent.action = ExtensionActivity.MEMOMA_EXTENSION_LAUNCH_ACTIVITY
+        intent.putExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_FULLPATH, fullPath)
+        intent.putExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_TITLE, dataTitle)
+
+        // データ表示用Activityを起動する
+        parent.startActivityForResult(intent, MENU_ID_EXTEND)
+        //parent.startActivity(intent);
+    }
+
+    private fun setPreferenceDataTitle(title: String)
+    {
+        try
+        {
+            val preferences = PreferenceManager.getDefaultSharedPreferences(parent)
+            val editor = preferences.edit()
+            editor.putString("content_data_title", title)
+            editor.apply()
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    /**
+     * データの読み込みを行う
+     *
+     */
+    private fun prepareMeMoMaInfo()
+    {
+        //  設定に記録されているデータを画面のタイトルに反映させる
+        val preferences = PreferenceManager.getDefaultSharedPreferences(parent)
+        val memomaInfo = preferences.getString("MeMoMaInfo", parent.getString(R.string.app_name))
+        parent.title = memomaInfo
+
+        // アクションバーとファイル名の準備
+        val bar = parent.supportActionBar
+        if (bar != null)
+        {
+            dataInOutManager.prepare(objectHolder, bar, memomaInfo)
+        }
+        //dataInOutManager.loadFile((String) parent.getTitle());
+    }
+
+    /**
+     * データの保存を行う
+     *
+     *
+     * @param forceOverwrite  trueの時は、ファイル名が確定していたときは(確認せずに)上書き保存を自動で行う。
+     */
+    private fun saveData(forceOverwrite: Boolean)
+    {
+        dataInOutManager.saveFile(parent.title as String, forceOverwrite)
+    }
+
+    /**
+     * データの整列を行う
+     */
+    private fun alignData()
+    {
+        val aligner = ObjectAligner(parent, this)
+        aligner.execute(objectHolder)
+    }
+
+    /**
+     * メッセージ編集ダイアログを表示する
+     */
+    private fun showInfoMessageEditDialog()
+    {
+        parent.showDialog(R.id.editTextArea)
+    }
+
+    /**
+     * 新規作成が指示されたとき...全部クリアして作りなおして良いか確認する。
+     */
+    private fun createNewScreen()
+    {
+        parent.showDialog(R.id.confirmation)
+    }
+
+    /**
+     * 接続線の設定ダイアログを表示する
+     */
+    private fun selectLineShapeDialog()
+    {
+        // 接続線の設定ダイアログを表示する...
+        parent.showDialog(R.id.selectline_dialog)
+    }
+
+    /**
+     * メッセージ編集ダイアログの表示を準備する
+     *
+     */
+    private fun prepareInfoMessageEditDialog(dialog: Dialog)
+    {
+        val message = parent.title as String
+        editTextDialog.prepare(dialog, this, parent.getString(R.string.dataTitle), message, true)
+    }
+
+    /**
+     * メッセージ編集ダイアログの表示を準備する
+     */
+    private fun prepareConfirmationDialog(dialog: Dialog)
+    {
+        // Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::prepareConfirmationDialog() " );
+    }
+
+    /**
+     * オブジェクト入力用ダイアログの表示を準備する
+     */
+    private fun prepareObjectInputDialog(dialog: Dialog)
+    {
+        Log.v(
+            TAG,
+            "MeMoMaListener::prepareObjectInputDialog(), key: $selectedObjectKey"
+        )
+
+        //  ダイアログの準備を行う
+        objectDataInputDialog.prepareObjectInputDialog(dialog, selectedObjectKey)
+    }
+
+    /**
+     * アイテム選択ダイアログの表示を準備する
+     */
+    private fun prepareItemSelectionDialog(dialog: Dialog)
+    {
+        // アイテム選択ダイアログの表示設定
+        // (動的変更時。。。今回は固定なので何もしない)
+    }
+
+    /**
+     * 接続線選択用ダイアログの表示を準備する
+     *
+     */
+    private fun prepareLineSelectionDialog(dialog: Dialog)
+    {
+        Log.v(
+            TAG,
+            "MeMoMaListener::prepareLineSelectionDialog(), key: $selectedObjectKey"
+        )
+
+        //  ダイアログの準備を行う
+        lineSelectionDialog.prepareSelectLineShapeDialog(dialog, selectedObjectKey)
+    }
+
+    /**
+     * 設定画面を表示する処理
+     */
+    private fun showPreference()
+    {
+        try
+        {
+            // 設定画面を呼び出す
+            val prefIntent = Intent(parent, Preference::class.java)
+            parent.startActivityForResult(prefIntent, MENU_ID_PREFERENCES)
+        }
+        catch (e: Exception)
+        {
+            // 例外発生...なにもしない。
+            e.printStackTrace()
+            //updater.showMessage("ERROR", MainUpdater.SHOWMETHOD_DONTCARE);
+        }
+    }
+
+    /**
+     * 接続線の形状を反映させる
+     *
+     */
+    private fun setLineStyle()
+    {
+        val buttonId = LineStyleHolder.getLineShapeImageId(
+            lineStyleHolder.lineStyle,
+            lineStyleHolder.lineShape
+        )
+        val lineStyleObj = parent.findViewById<ImageButton>(R.id.LineStyleButton)
+        lineStyleObj.setImageResource(buttonId)
+    }
+
+    /**
+     * オブジェクトが生成された!
+     */
+    override fun objectCreated()
+    {
+        // ここで動作モードを移動モードに戻す。
+        drawModeHolder.changeOperationMode(OperationModeHolder.OPERATIONMODE_MOVE)
+        updateButtons(OperationModeHolder.OPERATIONMODE_MOVE)
+
+        // 画面を再描画する
+        redrawSurfaceview()
+    }
+
+    /**
+     * 空き領域がタッチされた!
+     */
+    override fun touchedVacantArea(): Int
+    {
+        val preferences = PreferenceManager.getDefaultSharedPreferences(parent)
+        return preferences.getString("operationMode", "0")!!.toInt()
+    }
+
+    /**
+     * 空き領域でタッチが離された!
+     */
+    override fun touchUppedVacantArea(): Int
+    {
+        val preferences = PreferenceManager.getDefaultSharedPreferences(parent)
+        return preferences.getString("operationMode", "0")!!.toInt()
+    }
+
+    /**
+     * オブジェクトを本当に削除して良いか確認した後に、オブジェクトを削除する。
+     */
+    private fun removeObject(key: Int) {
+        // 本当に消して良いか、確認をするダイアログを表示して、OKが押されたら消す。
+        val alertDialogBuilder = AlertDialog.Builder(parent)
+        alertDialogBuilder.setTitle(parent.getString(R.string.deleteconfirm_title))
+        alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert)
+        alertDialogBuilder.setMessage(parent.getString(R.string.deleteconfirm_message))
+
+        // 削除するオブジェクトのキーを覚えこむ。
+        objectKeyToDelete = key
+
+        // OKボタンの生成
+        alertDialogBuilder.setPositiveButton(
+            parent.getString(R.string.confirmYes)
+        ) { dialog, id -> //  削除モードの時... 確認後削除だけど、今は確認なしで削除を行う。
+            objectHolder.removePosition(objectKeyToDelete)
+
+            // 削除するオブジェクトに接続されている線もすべて削除する
+            objectHolder.connectLineHolder.removeAllConnection(objectKeyToDelete)
+
+            // ダイアログを閉じる
+            dialog.dismiss()
+
+            // ここで動作モードを削除モードから移動モードに戻す。
+            drawModeHolder.changeOperationMode(OperationModeHolder.OPERATIONMODE_MOVE)
+            updateButtons(OperationModeHolder.OPERATIONMODE_MOVE)
+
+
+            // 画面を再描画する
+            redrawSurfaceview()
+        }
+
+        // Cancelボタンの生成
+        alertDialogBuilder.setNegativeButton(
+            parent.getString(R.string.confirmNo)
+        ) { dialog, id -> dialog.cancel() }
+
+        // ダイアログはキャンセル可能に設定する
+        alertDialogBuilder.setCancelable(true)
+
+        // ダイアログを表示する
+        val alertDialog = alertDialogBuilder.create()
+        alertDialog.show()
+    }
+
+    /**
+     * オブジェクトを複製する
+     *
+     *
+     */
+    private fun duplicateObject(key: Int) {
+        // 選択中オブジェクトを複製する
+        objectHolder.duplicatePosition(key)
+
+        // 画面を再描画する
+        redrawSurfaceview()
+    }
+
+    /**
+     * オブジェクトを拡大する
+     *
+     *
+     */
+    private fun expandObject(key: Int) {
+        // 選択中オブジェクトを拡大する
+        objectHolder.expandObjectSize(key)
+
+        // 画面を再描画する
+        redrawSurfaceview()
+    }
+
+    /**
+     * オブジェクトを縮小する
+     *
+     *
+     */
+    private fun shrinkObject(key: Int) {
+        // 選択中オブジェクトを縮小する
+        objectHolder.shrinkObjectSize(key)
+
+        // 画面を再描画する
+        redrawSurfaceview()
+    }
+
+    private fun setButtonBorder(button: ImageButton, isHighlight: Boolean) {
+        try {
+            val btnBackgroundShape = button.background as BitmapDrawable
+            if (isHighlight) {
+//                             btnBackgroundShape.setColorFilter(Color.rgb(51, 181, 229), Mode.LIGHTEN);
+                btnBackgroundShape.setColorFilter(Color.BLUE, PorterDuff.Mode.LIGHTEN)
+            } else {
+                btnBackgroundShape.setColorFilter(Color.BLACK, PorterDuff.Mode.LIGHTEN)
+            }
+        } catch (ex: Exception) {
+            //
+            Log.v(TAG, "MeMoMaListener::setButtonBorder(): $ex")
+        }
+    }
+
+    /**
+     * ボタンを更新する
+     *
+     */
+    private fun updateButtons(mode: Int) {
+        val createObjectButton = parent.findViewById<ImageButton>(R.id.CreateObjectButton)
+        val deleteObjectButton = parent.findViewById<ImageButton>(R.id.DeleteObjectButton)
+        if (mode == OperationModeHolder.OPERATIONMODE_DELETE) {
+            setButtonBorder(createObjectButton, false)
+            setButtonBorder(deleteObjectButton, true)
+        } else if (mode == OperationModeHolder.OPERATIONMODE_CREATE) {
+            setButtonBorder(createObjectButton, true)
+            setButtonBorder(deleteObjectButton, false)
+        } else  // if (mode == OperationModeHolder.OPERATIONMODE_MOVE)
+        {
+            setButtonBorder(createObjectButton, false)
+            setButtonBorder(deleteObjectButton, false)
+        }
+    }
+
+    /**
+     * オブジェクトが選択された(長押しで!)
+     *
+     */
+    override fun objectSelectedContext(key: Int) {
+        Log.v(TAG, "MeMoMaListener::objectSelectedContext(),  key:$key")
+        selectedContextKey = key
+
+        // オブジェクトのアイテム選択ダイアログを表示する...
+        parent.showDialog(MENU_ID_OPERATION)
+    }
+
+    /**
+     * オブジェクトが選択された!
+     *
+     */
+    override fun objectSelected(key: Int): Boolean {
+        val preferences = PreferenceManager.getDefaultSharedPreferences(parent)
+        val operationMode = preferences.getString("operationMode", "0")!!.toInt()
+        if (operationMode == OperationModeHolder.OPERATIONMODE_DELETE) {
+            // オブジェクトを削除する
+            removeObject(key)
+            return true
+        }
+        //if ((operationMode == OperationModeHolder.OPERATIONMODE_MOVE)||
+        //             (operationMode == OperationModeHolder.OPERATIONMODE_CREATE))
+        run {
+
+            // 選択されたオブジェクトを記憶する
+            selectedObjectKey = key
+            Log.v(TAG, "MeMoMaListener::objectSelected() key : $key")
+
+            // オブジェクトの詳細設定ダイアログを表示する...
+            parent.showDialog(R.id.objectinput_dialog)
+        }
+        return true
+    }
+
+    /**
+     * ダイアログの生成
+     *
+     */
+    fun onCreateDialog(id: Int): Dialog?
+    {
+        if (id == R.id.info_about_gokigen) {
+            // クレジットダイアログを表示
+            val dialog = CreditDialog(parent)
+            return dialog.dialog
+        }
+        if (id == R.id.editTextArea) {
+            // 変更するテキストを表示
+            return editTextDialog.dialog
+        }
+        if (id == R.id.confirmation) {
+            // 確認するメッセージを表示する
+            return confirmationDialog.dialog
+        }
+        if (id == R.id.objectinput_dialog) {
+            // オブジェクト入力のダイアログを表示する
+            return objectDataInputDialog.dialog
+        }
+        if (id == MENU_ID_OPERATION) {
+            // アイテム選択ダイアログの準備を行う
+            return itemSelectionDialog.dialog
+        }
+        return if (id == R.id.selectline_dialog) {
+            // 接続線選択ダイアログの準備を行う
+            lineSelectionDialog.dialog
+        } else null
+    }
+
+    /**
+     * ダイアログ表示の準備
+     *
+     */
+    fun onPrepareDialog(id: Int, dialog: Dialog) {
+        if (id == R.id.editTextArea) {
+            // 変更するデータを表示する
+            prepareInfoMessageEditDialog(dialog)
+            return
+        }
+        if (id == R.id.confirmation) {
+            // 確認ダイアログを表示する。
+            prepareConfirmationDialog(dialog)
+            return
+        }
+        if (id == R.id.objectinput_dialog) {
+            // オブジェクト入力のダイアログを表示する
+            prepareObjectInputDialog(dialog)
+        }
+        if (id == MENU_ID_OPERATION) {
+            // オブジェクト操作選択のダイアログを表示する
+            prepareItemSelectionDialog(dialog)
+        }
+        if (id == R.id.selectline_dialog) {
+            // 接続線選択のダイアログを表示する
+            prepareLineSelectionDialog(dialog)
+        }
+    }
+
+    /**
+     * 新規状態に変更する。
+     *
+     */
+    override fun acceptConfirmation() {
+        //
+        Log.v(TAG, "MeMoMaListener::acceptConfirmation()")
+
+        // 現在のデータを保管する
+        saveData(true);
+
+        // オブジェクトデータをクリアする。
+        objectHolder.removeAllPositions() // オブジェクトの保持クラス
+        objectHolder.connectLineHolder.removeAllLines() // オブジェクト間の接続状態保持クラス
+
+        // 画面の倍率と表示位置を初期状態に戻す
+        val zoomBar = parent.findViewById<SeekBar>(R.id.ZoomInOut)
+        objectDrawer.resetScaleAndLocation(zoomBar)
+
+        // 画面を再描画する
+        redrawSurfaceview()
+
+        // ファイル名選択ダイアログを開く
+        showInfoMessageEditDialog()
+    }
+
+    /**
+     * 画面を再描画する
+     *
+     */
+    private fun redrawSurfaceview() {
+        try {
+            val surfaceView = parent.findViewById<GokigenSurfaceView>(R.id.GraphicView)
+            surfaceView.doDraw()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    /**
+     * 不許可。何もしない。
+     *
+     */
+    override fun rejectConfirmation() {
+        Log.v(TAG, "MeMoMaListener::rejectConfirmation()")
+    }
+
+    /**
+     * オブジェクトが整列された時の処理
+     *
+     */
+    override fun objectAligned() {
+        // 画面の再描画を指示する
+        redrawSurfaceview()
+    }
+
+    /**
+     * オブジェクト編集ダイアログが閉じられた時の処理
+     *
+     */
+    override fun finishObjectInput() {
+        // 画面の再描画を指示する
+        redrawSurfaceview()
+    }
+
+    /**
+     * オブジェクト編集ダイアログが閉じられた時の処理
+     *
+     */
+    override fun cancelObjectInput() {
+        // 何もしない
+    }
+
+    /**
+     * アイテムが選択された!
+     *
+     */
+    override fun itemSelected(index: Int, itemValue: String) {
+        //
+        Log.v(TAG, "MeMoMaListener::itemSelected() : $itemValue [$index]")
+        if (index == ObjectOperationCommandHolder.OBJECTOPERATION_DELETE) {
+            // オブジェクト削除の確認
+            removeObject(selectedContextKey)
+        } else if (index == ObjectOperationCommandHolder.OBJECTOPERATION_DUPLICATE) {
+            // オブジェクトの複製
+            duplicateObject(selectedContextKey)
+        } else if (index == ObjectOperationCommandHolder.OBJECTOPERATION_SIZEBIGGER) {
+            // オブジェクトの拡大
+            expandObject(selectedContextKey)
+        } else if (index == ObjectOperationCommandHolder.OBJECTOPERATION_SIZESMALLER) {
+            // オブジェクトの縮小
+            shrinkObject(selectedContextKey)
+        }
+    }
+
+    /**
+     * (今回未使用)
+     *
+     */
+    override fun itemSelectedMulti(items: Array<String>, status: BooleanArray) {}
+    override fun canceledSelection() {}
+    fun onSaveInstanceState(outState: Bundle) {
+        /* ここで状態を保存 */
+        Log.v(TAG, "MeMoMaListener::onSaveInstanceState() : $outState")
+    }
+
+    fun onRestoreInstanceState(savedInstanceState: Bundle) {
+        /* ここで状態を復元 */
+        Log.v(TAG, "MeMoMaListener::onRestoreInstanceState() : $savedInstanceState")
+    }
+
+    override fun finishTextEditDialog(message: String) {
+        if (message.isEmpty())
+        {
+            // データが入力されていなかったので、何もしない。
+            return
+        }
+        try
+        {
+            // 文字列を記録
+            val preferences = PreferenceManager.getDefaultSharedPreferences(parent)
+            val editor = preferences.edit()
+            editor.putString("MeMoMaInfo", message)
+            editor.apply()
+
+            // タイトルに設定
+            parent.title = message
+
+            // 保存シーケンスを一度走らせる
+            saveData(true)
+
+            // ファイル選択リストの更新
+            dataInOutManager.updateFileList(message, parent.supportActionBar)
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun cancelTextEditDialog() {}
+
+    /**
+     * 接続線
+     *
+     */
+    override fun finishSelectLineShape(style: Int, shape: Int, thickness: Int) {
+        val buttonId = LineStyleHolder.getLineShapeImageId(style, shape)
+        val lineStyleObj = parent.findViewById<ImageButton>(R.id.LineStyleButton)
+        lineStyleObj.setImageResource(buttonId)
+    }
+
+    /**
+     *
+     */
+    override fun cancelSelectLineShape() {}
+
+    companion object {
+        private val TAG = MeMoMaListener::class.java.simpleName
+        private const val MENU_ID_PREFERENCES = Menu.FIRST + 1 // 設定画面の表示
+        private const val MENU_ID_ABOUT_GOKIGEN = Menu.FIRST + 2 // アプリケーションの情報表示
+        private const val MENU_ID_NEW = Menu.FIRST + 3 // 新規作成
+        private const val MENU_ID_EXTEND = Menu.FIRST + 4 // 拡張機能
+        private const val MENU_ID_ALIGN = Menu.FIRST + 5 // オブジェクトの整列
+        private const val MENU_ID_INSERT_PICTURE = Menu.FIRST + 6 // 画像の指定
+        private const val MENU_ID_OPERATION = Menu.FIRST + 7 // 操作コマンド
+        private const val MENU_ID_RENAME = Menu.FIRST + 8 // リネーム
+        private const val MENU_ID_CAPTURE = Menu.FIRST + 9 // 画像のキャプチャ
+        private const val MENU_ID_SHARE = Menu.FIRST + 10 // 画像の共有
+        private const val MENU_ID_UNDO = Menu.FIRST + 11 // 処理の UNDO
+    }
+}
\ No newline at end of file
index 19f5c8a..1b3c769 100644 (file)
@@ -2,6 +2,7 @@ package jp.sourceforge.gokigen.memoma.extension;
 
 import android.content.Intent;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 
@@ -15,6 +16,7 @@ import jp.sourceforge.gokigen.memoma.R;
  */
 public class ExtensionActivity extends AppCompatActivity
 {
+    private final String TAG = toString();
        // 起動コード
     public static final String MEMOMA_EXTENSION_LAUNCH_ACTIVITY = "jp.sfjp.gokigen.memoma.extension.activity";
 
@@ -30,6 +32,7 @@ public class ExtensionActivity extends AppCompatActivity
     {
           super.onCreate(savedInstanceState);
 
+          Log.v(TAG, "ExtensionActivity::onCreate()");
           try
           {
               // リスナクラスを生成する
index 6b7d8fa..8ced7fc 100644 (file)
@@ -28,6 +28,7 @@ import android.widget.ListView;
 import android.widget.Toast;
 
 import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatActivity;
 
 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
@@ -79,15 +80,40 @@ public class ExtensionActivityListener  implements OnClickListener, MeMoMaFileLo
     {
         try
         {
+            String dataTitle = myIntent.getStringExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_TITLE);
+
+            SharedPreferences preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(parent);
+            String prefTitleString = preferences.getString("content_data_title", "");
+            if (prefTitleString.length() > 0)
+            {
+                // Preferenceに タイトル名が記録されていたら、上書きする
+                dataTitle = prefTitleString;
+            }
             // Intentで拾ったデータを読み出す (初期化データ)
-               objectHolder.setDataTitle(myIntent.getStringExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_TITLE));
-         }
+            objectHolder.setDataTitle(dataTitle);
+        }
         catch (Exception ex)
         {
             Log.v(TAG, "Exception :" + ex.getMessage());
-        }        
+        }
     }
 
+    private void setPreferenceString(String title)
+    {
+        try
+        {
+            SharedPreferences preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(parent);
+            SharedPreferences.Editor editor = preferences.edit();
+            editor.putString("content_data_title", title);
+            editor.apply();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+
     /**
      *  がっつりこのクラスにイベントリスナを接続する
      */
@@ -103,7 +129,7 @@ public class ExtensionActivityListener  implements OnClickListener, MeMoMaFileLo
      */
     public void finishListener()
     {
-
+        //setPreferenceString("");
     }
 
     /**
@@ -148,7 +174,7 @@ public class ExtensionActivityListener  implements OnClickListener, MeMoMaFileLo
      */
     public void shutdown()
     {
-       
+        //setPreferenceString("");
     }
 
     private void imporObjectFromCsv(final Uri uri)
@@ -353,7 +379,7 @@ public class ExtensionActivityListener  implements OnClickListener, MeMoMaFileLo
      */
     public boolean onOptionsItemSelected(MenuItem item)
     {
-       boolean result;
+        boolean result;
         switch (item.getItemId())
         {
             case MENU_ID_EXPORT -> {
@@ -387,7 +413,7 @@ public class ExtensionActivityListener  implements OnClickListener, MeMoMaFileLo
             }
             default -> result = false;
         }
-       return (result);
+        return (result);
     }
 
     /**
@@ -562,7 +588,7 @@ public class ExtensionActivityListener  implements OnClickListener, MeMoMaFileLo
      *    ファイルのロード結果を受け取る
      * 
      */
-    public void onLoadedResult(String detail)
+    public void onLoadedResult(boolean isError, String detail)
     {
                Log.v(TAG, "ExtensionActivityListener::onLoadedResult() '"  + objectHolder.getDataTitle() +"' : " + detail);
 
@@ -687,11 +713,26 @@ public class ExtensionActivityListener  implements OnClickListener, MeMoMaFileLo
 
     private void onImportedResultXml(String detail)
     {
-        Log.v(TAG, "ExtensionActivityListener::onImportedResultXml() '"  + objectHolder.getDataTitle() +"' : " + detail);
-
-        // インポートしたことを伝達する
-        String outputMessage = parent.getString(R.string.import_xml) + " " + objectHolder.getDataTitle() + " " + detail;
-        Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
+        String title = objectHolder.getDataTitle();
+        Log.v(TAG, "ExtensionActivityListener::onImportedResultXml() '"  + title + "' : " + detail);
+
+        // インポート時の注意事項ダイアログを表示する
+        parent.runOnUiThread(() -> {
+            //  ダイアログで情報を表示する。
+            new AlertDialog.Builder(parent)
+                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setTitle(parent.getString(R.string.import_xml) + " (" + objectHolder.getDataTitle() + ")")
+                    .setMessage(parent.getString(R.string.import_xml_information))
+                    .setPositiveButton(parent.getString(R.string.confirmYes), null)
+                    .show();
+
+            // インポートしたことを伝達する
+            String outputMessage = parent.getString(R.string.import_xml) + " " + objectHolder.getDataTitle() + " " + detail;
+            Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
+        });
+
+        // タイトルを更新
+        setPreferenceString(title);
 
         // 一覧のリストを作りなおす
         onLoadingProcess();
index ac5585c..6c48b49 100644 (file)
@@ -24,13 +24,13 @@ public class MeMoMaDataFileHolder extends ArrayAdapter<String> implements Filena
         * 
         */
     public MeMoMaDataFileHolder(Context context, int textViewRscId, String extension)
-    {
-       super(context, textViewRscId);
+       {
+               super(context, textViewRscId);
                this.context = context;
                fileExtension = extension;
-    }
-    
-    /**
+       }
+
+       /**
      *    ファイル一覧を生成する。
      * 
      */
index ae32006..051740e 100644 (file)
@@ -107,7 +107,7 @@ public class MeMoMaDataInOutManager implements MeMoMaFileSavingProcess.ISavingSt
 
                // 同期型でファイルを保存する。。。
                String message = saveFileSynchronous();
-               onSavedResult(message);
+               onSavedResult((message.length() != 0), message);
        }
 
        /**
@@ -133,11 +133,15 @@ public class MeMoMaDataInOutManager implements MeMoMaFileSavingProcess.ISavingSt
        /**
         *    保存終了時の処理
         */
-    public  void onSavedResult(String detail)
+    public  void onSavedResult(boolean isError, String detail)
     {
         // 保存したことを伝達する
                String outputMessage = parent.getString(R.string.save_data) + " " + objectHolder.getDataTitle() + " " + detail;
-        Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();      
+               if (isError)
+               {
+                       Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
+               }
+               Log.v(TAG, outputMessage);
 
                // ファイルリスト更新 ... (ここでやっちゃあ、AsyncTaskにしている意味ないなあ...)
         dataFileHolder.updateFileList(objectHolder.getDataTitle());
@@ -146,11 +150,15 @@ public class MeMoMaDataInOutManager implements MeMoMaFileSavingProcess.ISavingSt
     /**
         *    読み込み終了時の処理
         */
-    public  void onLoadedResult(String detail)
+    public  void onLoadedResult(boolean isError, String detail)
     {
         // 読み込みしたことを伝達する
                String outputMessage = parent.getString(R.string.load_data) + " " + objectHolder.getDataTitle() + " " + detail;
-        Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
+               if (isError)
+               {
+                       Toast.makeText(parent, outputMessage, Toast.LENGTH_SHORT).show();
+               }
+               Log.v(TAG, outputMessage);
 
        // 画面を再描画する
        final GokigenSurfaceView surfaceview = parent.findViewById(R.id.GraphicView);
@@ -235,16 +243,13 @@ public class MeMoMaDataInOutManager implements MeMoMaFileSavingProcess.ISavingSt
 
                // 同期型で現在のファイルを保存する。。。
                String message = saveFileSynchronous();
-               if (message.length() != 0)
-               {
-            onSavedResult(message);
-               }
-               
-       // 選択したファイル名をタイトルに反映し、またPreferenceにも記憶する
-        parent.setTitle(data);
-       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
-        SharedPreferences.Editor editor = preferences.edit();
-        editor.putString("MeMoMaInfo", data);
+               onSavedResult((message.length() != 0), message);
+
+               // 選択したファイル名をタイトルに反映し、またPreferenceにも記憶する
+               parent.setTitle(data);
+               SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
+               SharedPreferences.Editor editor = preferences.edit();
+               editor.putString("MeMoMaInfo", data);
                editor.apply();
 
                // 選択したアイテムをロードする!
index b2ee38b..4a6b161 100644 (file)
@@ -6,26 +6,16 @@ import java.io.FileReader;
 import android.app.ProgressDialog;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.net.Uri;
 import android.os.AsyncTask;
 import android.preference.PreferenceManager;
 import android.util.Log;
 
-import jp.sourceforge.gokigen.memoma.Main;
 import jp.sourceforge.gokigen.memoma.R;
 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
 
 /**
  *  データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
- *  
- *  AsyncTask
- *    MeMoMaObjectHolder : 実行時に渡すクラス(Param)
- *    Integer    : 途中経過を伝えるクラス(Progress)
- *    String     : 処理結果を伝えるクラス(Result)
- *    
- * @author MRSa
- *
  */
 public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, Integer, String> implements MeMoMaFileSavingProcess.ISavingStatusHolder, MeMoMaFileSavingProcess.IResultReceiver
 {
@@ -65,7 +55,6 @@ public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
        
     /**
      *  非同期処理実施前の前処理
-     * 
      */
     @Override
     protected void onPreExecute()
@@ -73,10 +62,7 @@ public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
     }
 
     /**
-     *    1レコード分のデータを読み込む。 
-     * 
-     * @param buf
-     * @return
+     *    1レコード分のデータを読み込む。
      */
     private String readRecord(BufferedReader buf )
     {
@@ -107,9 +93,6 @@ public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
 
     /**
      *   1レコード分のデータを区切る
-     * 
-     * 
-     * @param dataLine
      */
     private void parseRecord(String dataLine,  MeMoMaObjectHolder objectHolder)
     {
@@ -193,7 +176,6 @@ public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
     
     /**
      *    (CSV形式の)データを読み込んで格納する。
-     *
      */
     private String importFromCsvFile(String fileName, MeMoMaObjectHolder objectHolder)
     {
@@ -230,25 +212,24 @@ public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
      */
     @Override
     protected String doInBackground(MeMoMaObjectHolder... datas)
-    {          
+    {
         // ファイル名の設定 ... (拡張子なし)
-       String fileName = context.getFilesDir() + "/exported/" + targetFileName;
+        String fileName = context.getFilesDir() + "/exported/" + targetFileName;
 
-       // データを読み込む
+        // データを読み込む
         String result = importFromCsvFile(fileName, datas[0]);
 
         // データを保存する
-       MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(context, backgroundUri, userCheckboxString);
-       String message = savingEngine.saveObjects(datas[0]);
+        MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(context, backgroundUri, userCheckboxString);
+        String message = savingEngine.saveObjects(datas[0]);
 
         System.gc();
 
-               return (result + " " + message);
+        return (result + " " + message);
     }
 
     /**
      *  非同期処理の進捗状況の更新
-     * 
      */
        @Override
        protected void onProgressUpdate(Integer... values)
@@ -273,7 +254,7 @@ public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
        }
        catch (Exception ex)
        {
-               Log.v(TAG, "MeMoMaFileImportCsvProcess::onPostExecute() : " + ex.toString());
+               Log.v(TAG, "MeMoMaFileImportCsvProcess::onPostExecute() : " + ex.getMessage());
        }
        // プログレスダイアログを消す
        importingDialog.dismiss();
@@ -281,7 +262,7 @@ public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
        return;
     }
     
-    public void onSavedResult(String detail)
+    public void onSavedResult(boolean isError, String detail)
     {
         fileSavedResult = detail;
     }
@@ -298,9 +279,6 @@ public class MeMoMaFileImportCsvProcess extends AsyncTask<MeMoMaObjectHolder, In
 
     /**
      *    結果報告用のインタフェース(積極的に使う予定はないけど...)
-     *    
-     * @author MRSa
-     *
      */
     public interface IResultReceiver
     {
index f8cdf86..d484d0c 100644 (file)
@@ -278,9 +278,13 @@ public class MeMoMaFileLoadingProcess extends AsyncTask<MeMoMaObjectHolder, Inte
                 File inputFile = new File(fileName);
                 if (!inputFile.exists())
                 {
-                        // ファイルがなかったときには、「ファイルなし」と報告する。
-                        resultMessage = "ERR>File not found.";
-                        return (resultMessage);
+                 // ファイルが見つからないときは、存在しないファイルを生成する
+                 if (!inputFile.createNewFile())
+                 {
+                     // ファイルの新規作成が失敗したときには、「ファイルなし」と報告する。
+                     resultMessage = "ERR>File not found.";
+                     return (resultMessage);
+                 }
                 }
                 // ファイルの読み込み
                 FileReader reader = new FileReader(inputFile);
@@ -381,7 +385,7 @@ public class MeMoMaFileLoadingProcess extends AsyncTask<MeMoMaObjectHolder, Inte
 
             if (receiver != null)
             {
-               receiver.onLoadedResult(result);
+               receiver.onLoadedResult(!(result.isEmpty()), result);
             }
        }
        catch (Exception ex)
@@ -402,6 +406,6 @@ public class MeMoMaFileLoadingProcess extends AsyncTask<MeMoMaObjectHolder, Inte
        void onLoadingProcess();
        
         /**  保存結果の報告 **/
-        void onLoadedResult(String detail);
+        void onLoadedResult(boolean isError, String detail);
     }
 }
index d27b461..3f4e41e 100644 (file)
@@ -12,6 +12,7 @@ import android.util.Log;
 import android.util.Xml;
 
 import jp.sourceforge.gokigen.memoma.Main;
+import jp.sourceforge.gokigen.memoma.R;
 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
 import jp.sourceforge.gokigen.memoma.holders.ObjectConnector;
 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
@@ -47,7 +48,7 @@ public class MeMoMaFileSavingEngine
        String resultMessage = "";
         try
         {
-            FileWriter writer = new FileWriter(new File(fileName + ".xml"));           
+            FileWriter writer = new FileWriter(fileName + ".xml");
             XmlSerializer serializer = Xml.newSerializer();
 
             serializer.setOutput(writer);
@@ -235,14 +236,32 @@ public class MeMoMaFileSavingEngine
        if (objectHolder.getDataTitle().length() == 0)
         {
                Log.v(TAG, "MeMoMaFileSavingEngine::saveObjects() : specified file name is illegal, save aborted. : " + objectHolder.getDataTitle() );
-
                return ("");
         }
 
         if (objectHolder.isEmpty())
         {
+            try
+            {
+                // ファイルの存在を確認
+                String fileName = context.getFilesDir() + "/" + objectHolder.getDataTitle() + ".xml";
+                File checkFile = new File(fileName);
+                if (!checkFile.exists())
+                {
+                    // ファイルが存在しない場合、新規ファイルを作成する
+                    if (checkFile.createNewFile())
+                    {
+                        Log.v(TAG, "create New File.");
+                        return (context.getString(R.string.createnew));
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
             // データがない場合は保存しない
-            return("Data is empty, not saved.");
+            return(context.getString(R.string.none_object));
         }
 
        // データを保管する (ファイル名の設定は、拡張子なし
index 4038551..f7c3763 100644 (file)
@@ -112,12 +112,12 @@ public class MeMoMaFileSavingProcess extends AsyncTask<MeMoMaObjectHolder, Integ
        {
             if (receiver != null)
             {
-               receiver.onSavedResult(result);
+               receiver.onSavedResult(!(result.isEmpty()), result);
             }
        }
        catch (Exception ex)
        {
-               Log.v(TAG, "MeMoMaFileSavingProcess::onPostExecute() : " + ex.toString());
+               Log.v(TAG, "MeMoMaFileSavingProcess::onPostExecute() : " + ex.getMessage());
        }
        // プログレスダイアログを消す
        savingDialog.dismiss();
@@ -133,7 +133,7 @@ public class MeMoMaFileSavingProcess extends AsyncTask<MeMoMaObjectHolder, Integ
     public interface IResultReceiver
     {
         // 保存結果の報告
-               void onSavedResult(String detail);
+               void onSavedResult(boolean isError, String detail);
     }
 
     /**
index cdd5d66..c5a2c23 100644 (file)
@@ -77,7 +77,7 @@ public class ObjectLayoutCaptureExporter extends AsyncTask<String, Integer, Stri
         this.context = context;
         receiver = resultReceiver;
         objectHolder = holder;
-       canvasDrawer = drawer;
+        canvasDrawer = drawer;
 
         // 現在の画面サイズを取得
         Display display = context.getWindowManager().getDefaultDisplay();
index 65e1a45..a90425b 100644 (file)
@@ -12,7 +12,6 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.ImageButton;
 
-import jp.sourceforge.gokigen.memoma.Main;
 import jp.sourceforge.gokigen.memoma.R;
 import jp.sourceforge.gokigen.memoma.holders.LineStyleHolder;
 
@@ -463,19 +462,19 @@ public class SelectLineShapeDialog implements ImageButton.OnClickListener
      */
     public void onClick(View v)
     {
-       int id = v.getId();
-       
-       // 押されたボタンが接続線の太さだった場合...
+        int id = v.getId();
+
+        // 押されたボタンが接続線の太さだった場合...
         if ((id == R.id.btnLineThicknessThin)||(id == R.id.btnLineThicknessMiddle)||(id == R.id.btnLineThicknessHeavy))
         {
-               updateButtonHighlightLineThickness(id);
-               updateLineThickness(id);
-               return;
+            updateButtonHighlightLineThickness(id);
+            updateLineThickness(id);
+            return;
         }
 
         // 線の形状を更新した場合...
         updateButtonHighlightLineShape(id);
-       updateLineStyle(id);
+        updateLineStyle(id);
     }
 
     public interface IResultReceiver
index fc0b617..aea47e6 100644 (file)
@@ -77,4 +77,6 @@
     <string name="import_xml">XMLファイルから取り込み&#8230;</string>
     <string name="export_xml">XMLファイルとして出力&#8230;</string>
     <string name="delete_content">データの削除&#8230;</string>
+    <string name="none_object">図形がないため、保存しません</string>
+    <string name="import_xml_information">XMLファイルから取り込みしたデータは、メイン画面で改めて選択をお願いします。</string>
 </resources>
index fdd3381..33eea74 100644 (file)
@@ -77,4 +77,7 @@
     <string name="import_xml">Import from XML&#8230;</string>
     <string name="export_xml">Export from XML&#8230;</string>
     <string name="delete_content">Delete Content&#8230;</string>
+    <string name="none_object">Object is empty, not saved.</string>
+    <string name="import_xml_information">Please select again the data imported from the XML file on the main screen.</string>
+
 </resources>