From: MRSa Date: Wed, 3 May 2023 12:14:40 +0000 (+0900) Subject: xml形式のデータインポート時にお知らせ表示することにした。 X-Git-Url: http://git.osdn.net/view?p=gokigen%2FMeMoMa.git;a=commitdiff_plain;h=26ac420348523009cece8922ebde65fb2deb39be xml形式のデータインポート時にお知らせ表示することにした。 --- diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/Main.kt b/app/src/main/java/jp/sourceforge/gokigen/memoma/Main.kt index 3ef5fac..24681d7 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/Main.kt +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/Main.kt @@ -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 index f5772d2..0000000 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.java +++ /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 index 0000000..32604ea --- /dev/null +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/MeMoMaListener.kt @@ -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(R.id.HomeButton)).setOnClickListener(this) + (parent.findViewById(R.id.ExpandButton)).setOnClickListener(this) + (parent.findViewById(R.id.CreateObjectButton)).setOnClickListener(this) + (parent.findViewById(R.id.DeleteObjectButton)).setOnClickListener(this) + (parent.findViewById(R.id.LineStyleButton)).setOnClickListener(this) + (parent.findViewById(R.id.SaveButton)).setOnClickListener(this) + (parent.findViewById(R.id.GraphicView)).setOnTouchListener(this) + + // スライドバーが動かされた時の処理 + val seekbar = parent.findViewById(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(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(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(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(R.id.CreateObjectButton) + val 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) + } + } + + /** + * オブジェクトが選択された(長押しで!) + * + */ + 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(R.id.ZoomInOut) + objectDrawer.resetScaleAndLocation(zoomBar) + + // 画面を再描画する + redrawSurfaceview() + + // ファイル名選択ダイアログを開く + showInfoMessageEditDialog() + } + + /** + * 画面を再描画する + * + */ + private fun redrawSurfaceview() { + try { + val surfaceView = parent.findViewById(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, 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(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 diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivity.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivity.java index 19f5c8a..1b3c769 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivity.java +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivity.java @@ -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 { // リスナクラスを生成する diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivityListener.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivityListener.java index 6b7d8fa..8ced7fc 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivityListener.java +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/extension/ExtensionActivityListener.java @@ -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(); diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/MeMoMaDataFileHolder.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/MeMoMaDataFileHolder.java index ac5585c..6c48b49 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/MeMoMaDataFileHolder.java +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/holders/MeMoMaDataFileHolder.java @@ -24,13 +24,13 @@ public class MeMoMaDataFileHolder extends ArrayAdapter implements Filena * */ public MeMoMaDataFileHolder(Context context, int textViewRscId, String extension) - { - super(context, textViewRscId); + { + super(context, textViewRscId); this.context = context; fileExtension = extension; - } - - /** + } + + /** * ファイル一覧を生成する。 * */ diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaDataInOutManager.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaDataInOutManager.java index ae32006..051740e 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaDataInOutManager.java +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaDataInOutManager.java @@ -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(); // 選択したアイテムをロードする! diff --git a/app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileImportCsvProcess.java b/app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileImportCsvProcess.java index b2ee38b..4a6b161 100644 --- a/app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileImportCsvProcess.java +++ b/app/src/main/java/jp/sourceforge/gokigen/memoma/io/MeMoMaFileImportCsvProcess.java @@ -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 implements MeMoMaFileSavingProcess.ISavingStatusHolder, MeMoMaFileSavingProcess.IResultReceiver { @@ -65,7 +55,6 @@ public class MeMoMaFileImportCsvProcess extends AsyncTaskXMLファイルから取り込み… XMLファイルとして出力… データの削除… + 図形がないため、保存しません + XMLファイルから取り込みしたデータは、メイン画面で改めて選択をお願いします。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fdd3381..33eea74 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -77,4 +77,7 @@ Import from XML… Export from XML… Delete Content… + Object is empty, not saved. + Please select again the data imported from the XML file on the main screen. +