OSDN Git Service

パッケージの整理を開始。文字フォントを塗りつぶすように変更すうr。
[gokigen/MeMoMa.git] / app / src / main / java / jp / sourceforge / gokigen / memoma / MeMoMaListener.java
1 package jp.sourceforge.gokigen.memoma;
2
3 import android.app.Activity;
4 import android.app.AlertDialog;
5 import android.app.Dialog;
6 import android.content.DialogInterface;
7 import android.content.Intent;
8 import android.content.SharedPreferences;
9 import android.graphics.Color;
10 import android.graphics.PorterDuff.Mode;
11 import android.graphics.drawable.BitmapDrawable;
12 import android.net.Uri;
13 import android.os.Bundle;
14 import android.preference.PreferenceManager;
15 import android.support.v7.app.AppCompatActivity;
16 import android.util.Log;
17 import android.view.KeyEvent;
18 import android.view.Menu;
19 import android.view.MenuItem;
20 import android.view.MotionEvent;
21 import android.view.View;
22 import android.view.View.OnClickListener;
23 import android.view.View.OnKeyListener;
24 import android.view.View.OnTouchListener;
25 import android.widget.ImageButton;
26 import android.widget.SeekBar;
27
28 import jp.sourceforge.gokigen.memoma.dialogs.ConfirmationDialog;
29 import jp.sourceforge.gokigen.memoma.dialogs.CreditDialog;
30 import jp.sourceforge.gokigen.memoma.dialogs.TextEditDialog;
31 import jp.sourceforge.gokigen.memoma.drawers.MeMoMaCanvasDrawer;
32 import jp.sourceforge.gokigen.memoma.extension.ExtensionActivity;
33 import jp.sourceforge.gokigen.memoma.fileio.MeMoMaDataInOutManager;
34 import jp.sourceforge.gokigen.memoma.holders.LineStyleHolder;
35 import jp.sourceforge.gokigen.memoma.holders.MeMoMaConnectLineHolder;
36 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
37 import jp.sourceforge.gokigen.memoma.holders.OperationModeHolder;
38
39 /**
40  *   メモま! のメイン画面処理
41  *   
42  * @author MRSa
43  */
44 public class MeMoMaListener implements OnClickListener, OnTouchListener, OnKeyListener, IObjectSelectionReceiver, ConfirmationDialog.IResultReceiver, ObjectDataInputDialog.IResultReceiver, ItemSelectionDialog.ISelectionItemReceiver, TextEditDialog.ITextEditResultReceiver, ObjectAligner.IAlignCallback, SelectLineShapeDialog.IResultReceiver
45 {
46             public static final int MENU_ID_PREFERENCES = (Menu.FIRST + 1);    // 設定画面の表示
47             public static final int MENU_ID_ABOUT_GOKIGEN = (Menu.FIRST + 2);  // アプリケーションの情報表示
48             public static final int MENU_ID_NEW = (Menu.FIRST + 3);                     // 新規作成
49             public static final int MENU_ID_EXTEND= (Menu.FIRST + 4);                   // 拡張機能
50             public static final int MENU_ID_ALIGN = (Menu.FIRST + 5);                     // オブジェクトの整列
51             public static final int MENU_ID_INSERT_PICTURE = (Menu.FIRST + 6);   // 画像の指定
52             public static final int MENU_ID_OPERATION = (Menu.FIRST + 7);           // 操作コマンド
53             public static final int MENU_ID_RENAME = (Menu.FIRST + 8);                // リネーム
54             public static final int MENU_ID_CAPTURE = (Menu.FIRST + 9);              // 画像のキャプチャ
55             public static final int MENU_ID_SHARE = (Menu.FIRST + 10);              // 画像の共有
56             
57
58             private AppCompatActivity parent = null;  // 親分
59             private TextEditDialog editTextDialog = null;   // テキスト編集用ダイアログ
60             private MeMoMaCanvasDrawer objectDrawer = null; // 画像の表示
61             private MeMoMaObjectHolder objectHolder = null;  // オブジェクトの保持クラス
62             private MeMoMaConnectLineHolder lineHolder =null;  // オブジェクト間の接続状態保持クラス
63             //private SelectFeatureListener featureListener = null;  // 機能選択用のリスナ
64             
65             private MeMoMaDataInOutManager dataInOutManager = null;
66             
67             private OperationModeHolder drawModeHolder = null;
68             private LineStyleHolder lineStyleHolder = null;
69             
70             private ConfirmationDialog confirmationDialog = null;
71             
72             private ObjectDataInputDialog objectDataInputDialog = null;
73             
74             private SelectLineShapeDialog lineSelectionDialog = null;
75             
76             private ItemSelectionDialog itemSelectionDialog = null;
77             private ObjectOperationCommandHolder commandHolder = null;
78             
79             private boolean isEditing = false;
80             private Integer  selectedObjectKey = 0;
81             private Integer  objectKeyToDelete = 0;
82             private Integer selectedContextKey = 0;
83
84             /**
85              *  コンストラクタ
86              * @param argument
87              */
88             public MeMoMaListener(AppCompatActivity argument, MeMoMaDataInOutManager inoutManager)
89             {
90                 parent = argument;
91                 dataInOutManager = inoutManager;
92                 lineHolder = new MeMoMaConnectLineHolder();
93                 objectHolder = new MeMoMaObjectHolder(argument, lineHolder);
94                 editTextDialog = new TextEditDialog(parent, R.drawable.icon);
95                 //lineHolder = new MeMoMaConnectLineHolder();
96                 //featureListener = new SelectFeatureListener(parent);
97                 drawModeHolder = new OperationModeHolder(parent);
98
99                 lineStyleHolder = new LineStyleHolder(parent);
100                 lineStyleHolder.prepare();
101
102                 // 新規作成時の確認ダイアログについて
103                 confirmationDialog = new ConfirmationDialog(argument);          
104             confirmationDialog.prepare(this, android.R.drawable.ic_dialog_alert, parent.getString(R.string.createnew_title), parent.getString(R.string.createnew_message));             
105
106             // オブジェクトのデータ入力ダイアログを生成
107             objectDataInputDialog = new ObjectDataInputDialog(argument, objectHolder);
108             objectDataInputDialog.setResultReceiver(this);
109             
110             // 接続線の形状と太さを選択するダイアログを生成
111             lineSelectionDialog = new SelectLineShapeDialog(argument, lineStyleHolder);
112             lineSelectionDialog.setResultReceiver(this);
113             
114             // アイテム選択ダイアログを生成
115             commandHolder = new ObjectOperationCommandHolder(argument);
116             itemSelectionDialog = new ItemSelectionDialog(argument);
117             itemSelectionDialog.prepare(this,  commandHolder, parent.getString(R.string.object_operation));
118             
119                 // 描画クラスの生成
120                 objectDrawer = new MeMoMaCanvasDrawer(argument, objectHolder, lineStyleHolder, this);
121
122                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
123                 String colorString = preferences.getString("backgroundColor", "0xff004000");
124                 objectDrawer.setBackgroundColor(colorString);
125
126             }
127
128             /**
129              *  がっつりこのクラスにイベントリスナを接続する
130              * 
131              */
132             public void prepareListener()
133             {
134                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
135
136                 // 表示位置リセットボタン
137                 final ImageButton homeButton = (ImageButton) parent.findViewById(R.id.HomeButton);
138                 homeButton.setOnClickListener(this);
139
140                 // 拡張ボタン
141                 final ImageButton expandButton = (ImageButton) parent.findViewById(R.id.ExpandButton);
142                 expandButton.setOnClickListener(this);
143
144                 // 作成ボタン
145                 final ImageButton createObjectButton = (ImageButton) parent.findViewById(R.id.CreateObjectButton);
146                 createObjectButton.setOnClickListener(this);
147
148                 final ImageButton deleteObjectButton = (ImageButton) parent.findViewById(R.id.DeleteObjectButton);
149             deleteObjectButton.setOnClickListener(this);
150
151                 // 線の形状切り替えボタン
152                 final ImageButton lineStyleButton = (ImageButton) parent.findViewById(R.id.LineStyleButton);
153                 lineStyleButton.setOnClickListener(this);
154
155                 // データ保存ボタン
156                 final ImageButton saveButton = (ImageButton) parent.findViewById(R.id.SaveButton);
157                 saveButton.setOnClickListener(this);
158
159                 // 画面描画クラス
160                 final GokigenSurfaceView surfaceView = (GokigenSurfaceView) parent.findViewById(R.id.GraphicView);
161                 surfaceView.setOnTouchListener(this);
162                                 
163                 // スライドバーが動かされた時の処理
164                 final SeekBar seekbar = (SeekBar) parent.findViewById(R.id.ZoomInOut);
165                 seekbar.setOnSeekBarChangeListener(objectDrawer);
166                 int progress = preferences.getInt("zoomProgress", 50);
167                 seekbar.setProgress(progress);
168
169                 // 「実行中」の表示を消す
170                 parent.setProgressBarIndeterminateVisibility(false);
171                 
172             //// 起動時にデータを読み出す           
173                 prepareMeMoMaInfo();
174             }
175
176             /**
177              *  終了準備
178              */
179             public void finishListener()
180             {
181                 // 終了時に状態を保存する
182             saveData(true);
183             }
184
185             /**
186              *  スタート準備
187              */
188             public void prepareToStart()
189             {
190                 //  設定に記録されているデータを画面に反映させる
191                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
192
193                 // 描画オブジェクトの形状を設定する
194                 //int objectStyle = Integer.parseInt(preferences.getString("drawStyle", "0"));
195
196                 // ラインの形状を取得し、設定する
197                 setLineStyle();
198
199                 // 操作モードを画面に反映させる
200                 updateButtons(Integer.parseInt(preferences.getString("operationMode", "0")));
201
202                 // 条件に合わせて、描画クラスを変更する
203                 final GokigenSurfaceView surfaceView = (GokigenSurfaceView) parent.findViewById(R.id.GraphicView);
204                 surfaceView.setCanvasDrawer(objectDrawer);
205
206                 // 背景画像(の名前)を設定しておく
207                 String backgroundString = preferences.getString("backgroundUri", "");
208             objectDrawer.setBackgroundUri(backgroundString);
209             }
210
211             /**
212              *  終了準備
213              */
214             public void shutdown()
215             {
216                 
217             }
218             
219             /**
220              *  他画面から戻ってきたとき...
221              * @param requestCode
222              * @param resultCode
223              * @param data
224              */
225             public void onActivityResult(int requestCode, int resultCode, Intent data)
226             {
227                 if ((requestCode == MENU_ID_INSERT_PICTURE)&&(resultCode == Activity.RESULT_OK))
228                 {
229                     try
230                     {
231                         // 取得したuri を preferenceに記録する
232                         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
233                         Uri backgroundUri = data.getData();
234                         SharedPreferences.Editor editor = preferences.edit();
235                         editor.putString("backgroundUri", backgroundUri.toString());
236                         editor.commit();
237                         
238                         // 背景画像イメージの更新処理
239                         updateBackgroundImage(backgroundUri.toString());
240                         
241                             System.gc();
242                     }
243                     catch (Exception ex)
244                     {
245                         Log.v(Main.APP_IDENTIFIER, "Ex:" + ex.toString() + " " + ex.getMessage());
246                     }
247                     return;
248                 }
249                 else if (requestCode == MENU_ID_PREFERENCES)
250             {
251                         // 背景色、背景画像の設定を行う。
252                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
253                 String colorString = preferences.getString("backgroundColor", "0xff004000");
254                 objectDrawer.setBackgroundColor(colorString);
255
256                 // 背景画像イメージの更新処理
257                 String backgroundString = preferences.getString("backgroundUri", "");
258                 updateBackgroundImage(backgroundString);
259
260                 Log.v(Main.APP_IDENTIFIER, "RETURENED PREFERENCES " + backgroundString);
261
262             }
263                 else if (requestCode == MENU_ID_EXTEND)
264                 {
265                         // その他...今開いているファイルを読みなおす
266                     dataInOutManager.loadFile((String) parent.getTitle());
267                 }
268                 else
269                 {
270                         // 画面表示の準備を実行...
271                         //prepareToStart();
272                         return;
273                 }
274             // 画面の再描画を指示する
275             redrawSurfaceview();
276             }
277
278             /**
279              *    背景画像イメージの更新処理
280              * 
281              */
282             private void updateBackgroundImage(String uri)
283             {
284              // 背景画像イメージの更新処理         
285             GokigenSurfaceView graphView = (GokigenSurfaceView) parent.findViewById(R.id.GraphicView);
286
287             // ビットマップを設定する
288             objectDrawer.updateBackgroundBitmap(uri, graphView.getWidth(), graphView.getHeight());
289
290             // 画面の再描画指示
291             graphView.doDraw();
292             }
293             
294             
295             /**
296              *   クリックされたときの処理
297              */
298             public void onClick(View v)
299             {
300                  int id = v.getId();
301
302                  //Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onClick() " + id);
303                  if (id == R.id.MeMoMaInfo)
304                  {
305                          // テキスト編集ダイアログを表示する
306                  showInfoMessageEditDialog();
307                  }
308                  else if (id == R.id.LineStyleButton)
309                  {
310                          // ライン形状を変えるダイアログで変更するように変更する
311                          selectLineShapeDialog();
312                  }
313                  else if (id == R.id.ExpandButton)
314                  {
315                          // 拡張メニューを呼び出す
316                          callExtendMenu();
317                  }
318                  else if ((id == R.id.DeleteObjectButton)||(id == R.id.CreateObjectButton))
319                  {
320                          // 削除ボタン or 作成ボタンが押された時の処理
321                          updateButtons(drawModeHolder.updateOperationMode(id));
322                  }
323                  else if (id == R.id.HomeButton)
324                  {
325                          /**  表示位置をリセットする **/
326                          // 表示倍率と並行移動についてリセットする
327                          objectDrawer.resetScaleAndLocation((SeekBar) parent.findViewById(R.id.ZoomInOut));
328                          
329                          // 画面の再描画を指示する
330                          redrawSurfaceview();
331             }
332                 else if (id == R.id.SaveButton)
333                 {
334                         // データ保存が指示された!
335                         saveData(true);
336                 }
337             }
338
339             /**
340              *   触られたときの処理
341              * 
342              */
343             public boolean onTouch(View v, MotionEvent event)
344             {
345                 int id = v.getId();
346                 // int action = event.getAction();
347
348                 //Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onTouch() " + id);
349
350                 if (id == R.id.GraphicView)
351                 {
352                         // 画面をタッチした!
353                     ((GokigenSurfaceView) v).onTouchEvent(event);
354                     return (true);
355                 }
356                 return (false);
357             }
358
359             /**
360              *  キーを押したときの操作
361              */
362             public boolean onKey(View v, int keyCode, KeyEvent event)
363             {
364                 int action = event.getAction();
365                 if ((action == KeyEvent.ACTION_DOWN)&&(keyCode == KeyEvent.KEYCODE_DPAD_CENTER))
366                 {
367                         //
368                 }
369
370                 Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onKey() ");
371                 return (false);
372             }
373
374             /**
375              *   メニューへのアイテム追加
376              * @param menu
377              * @return
378              */
379             public Menu onCreateOptionsMenu(Menu menu)
380             {
381             // 新規作成
382                 MenuItem menuItem = menu.add(Menu.NONE, MENU_ID_NEW, Menu.NONE, parent.getString(R.string.createnew));
383                 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);   /*  for Android 3.1  */
384                 menuItem.setIcon(android.R.drawable.ic_menu_add);    // 丸プラス
385
386                 // 画像の共有
387                 menuItem = menu.add(Menu.NONE, MENU_ID_SHARE, Menu.NONE, parent.getString(R.string.shareContent));
388                 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);   /*  for Android 3.1  */
389                 menuItem.setIcon(android.R.drawable.ic_menu_share);
390
391                 // 画像のキャプチャ
392                 menuItem = menu.add(Menu.NONE, MENU_ID_CAPTURE, Menu.NONE, parent.getString(R.string.capture_data));
393                 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);   /*  for Android 3.1  */
394                 menuItem.setIcon(android.R.drawable.ic_menu_crop);    // オブジェクトのキャプチャ
395
396                 // オブジェクトの整列
397                 menuItem = menu.add(Menu.NONE, MENU_ID_ALIGN, Menu.NONE, parent.getString(R.string.align_data));
398                 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
399                 menuItem.setIcon(android.R.drawable.ic_menu_rotate);    // オブジェクトの整列
400
401                 // タイトルの変更
402                 menuItem = menu.add(Menu.NONE, MENU_ID_RENAME, Menu.NONE, parent.getString(R.string.rename_title));
403                 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
404                 menuItem.setIcon(android.R.drawable.ic_menu_edit);    // タイトルの変更
405
406                 // 壁紙の選択
407                 menuItem = menu.add(Menu.NONE, MENU_ID_INSERT_PICTURE, Menu.NONE, parent.getString(R.string.background_data));
408                 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
409                 menuItem.setIcon(android.R.drawable.ic_menu_gallery);    // 壁紙の選択
410
411                 // 拡張メニュー
412                 menuItem = menu.add(Menu.NONE, MENU_ID_EXTEND, Menu.NONE, parent.getString(R.string.extend_menu));
413                 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
414                 menuItem.setIcon(android.R.drawable.ic_menu_share);    // 拡張メニュー...
415
416                 // 設定
417                 menuItem = menu.add(Menu.NONE, MENU_ID_PREFERENCES, Menu.NONE, parent.getString(R.string.preference_name));
418                 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
419                 menuItem.setIcon(android.R.drawable.ic_menu_preferences);
420
421             // クレジット情報の表示
422                 menuItem = menu.add(Menu.NONE, MENU_ID_ABOUT_GOKIGEN, Menu.NONE, parent.getString(R.string.about_gokigen));
423                 menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);   /*  for Android 3.1  */
424                 menuItem.setIcon(android.R.drawable.ic_menu_info_details);
425
426                 return (menu);
427             }
428
429             /**
430              *   メニュー表示前の処理
431              * @param menu
432              * @return
433              */
434             public void onPrepareOptionsMenu(Menu menu)
435             {
436                 menu.findItem(MENU_ID_NEW).setVisible(true);
437                 menu.findItem(MENU_ID_SHARE).setVisible(true);
438                 menu.findItem(MENU_ID_CAPTURE).setVisible(true);
439                 menu.findItem(MENU_ID_ALIGN).setVisible(true);
440                 menu.findItem(MENU_ID_RENAME).setVisible(true);
441                 menu.findItem(MENU_ID_INSERT_PICTURE).setVisible(true);
442                 menu.findItem(MENU_ID_EXTEND).setVisible(true);
443                 menu.findItem(MENU_ID_PREFERENCES).setVisible(true);
444                 menu.findItem(MENU_ID_ABOUT_GOKIGEN).setVisible(true);
445                 return;
446             }
447
448             /**
449              *   メニューのアイテムが選択されたときの処理
450              * @param item
451              * @return
452              */
453             public boolean onOptionsItemSelected(MenuItem item)
454             {
455                 boolean result = false;
456                 switch (item.getItemId())
457                 {
458                   case MENU_ID_PREFERENCES:
459                     showPreference();
460                         result = true;
461                         break;
462
463                   case MENU_ID_ABOUT_GOKIGEN:
464                         showAboutGokigen();
465                         result = true;
466                         break;
467
468                   case MENU_ID_NEW:
469                         createNewScreen();
470                         result = true;
471                         break;
472
473                   case MENU_ID_EXTEND:
474                         // 拡張メニューを呼び出す
475                         callExtendMenu();
476                         result = true;
477                         break;
478
479                   case MENU_ID_ALIGN:
480                 // オブジェクトの整列を行う
481                         alignData();
482                 result = true;
483                         break;
484
485                   case MENU_ID_RENAME:
486                         // タイトル名の変更  (テキスト編集ダイアログを表示する)
487                     showInfoMessageEditDialog();
488                         result = true;
489                         break;
490
491                   case MENU_ID_INSERT_PICTURE:
492                     // 背景画像の設定を行う
493                         insertPicture();
494                     result = true;
495                             break;
496
497                   case MENU_ID_CAPTURE:
498                         // 画面キャプチャを指示された場合...
499                         doCapture(false);
500                         result = true;
501                         break;
502
503                   case MENU_ID_SHARE:
504                         // 画面キャプチャ&共有を指示された場合...
505                         doCapture(true);
506                         result = true;
507                         break;
508
509                   case android.R.id.home:
510                         /** アイコンが押された時の処理... **/
511                         // テキスト編集ダイアログを表示する
512                     showInfoMessageEditDialog();
513                             result = true;
514                             break;
515
516                   default:
517                         result = false;
518                         break;
519                 }
520                 return (result);
521             }
522
523             /**
524              *  画像ファイルの挿入 (データファイルの更新)
525              * 
526              */
527             private void insertPicture()
528             {
529                 Intent intent = new Intent();
530                 intent.setType("image/*");
531                 intent.setAction(Intent.ACTION_GET_CONTENT);
532                 parent.startActivityForResult(intent, MENU_ID_INSERT_PICTURE);
533             }
534
535             /**
536              *    画面キャプチャの実施
537              * 
538              * @param isShare
539              */
540             private void doCapture(boolean isShare)
541             {
542                 // 画面のスクリーンショットをとる処理を実行する
543                 dataInOutManager.doScreenCapture((String) parent.getTitle(), objectHolder, objectDrawer, isShare);
544
545                 // 画面を再描画する
546             redrawSurfaceview();
547             }
548
549             /**
550              *   アプリの情報を表示する
551              * 
552              */
553             private void showAboutGokigen()
554             {
555                 // アプリの情報(クレジット)を表示する!
556                 parent.showDialog(R.id.info_about_gokigen);
557             }
558
559             /**
560              *   拡張メニューを呼び出す
561              * 
562              */
563             private void callExtendMenu()
564             {
565                 // 現在表示中のデータをファイルに保存する
566                 dataInOutManager.saveFile((String) parent.getTitle(), true);
567                 
568                 // 現在読み込んでいるファイルのファイル名を生成する
569                 String fullPath = dataInOutManager.getDataFileFullPath((String) parent.getTitle(), ".xml");
570                 
571             //  ここで拡張メニューを呼び出す              
572                 // (渡すデータを作って Intentとする)
573                 Intent intent = new Intent();
574                 
575                 intent.setAction(ExtensionActivity.MEMOMA_EXTENSION_LAUNCH_ACTIVITY);
576                 intent.putExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_FULLPATH, fullPath);
577                 intent.putExtra(ExtensionActivity.MEMOMA_EXTENSION_DATA_TITLE, (String) parent.getTitle());
578
579                 // データ表示用Activityを起動する
580                 parent.startActivityForResult(intent, MENU_ID_EXTEND);
581             }
582
583             /**
584              *    データの読み込みを行う
585              * 
586              */
587             private void prepareMeMoMaInfo()
588             {
589                 //  設定に記録されているデータを画面のタイトルに反映させる
590                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
591                 String memomaInfo = preferences.getString("MeMoMaInfo", parent.getString(R.string.app_name));
592                 parent.setTitle(memomaInfo);
593
594                 // アクションバーとファイル名の準備
595                         android.support.v7.app.ActionBar bar = parent.getSupportActionBar();
596                 if (bar != null)
597                 {
598                                 dataInOutManager.prepare(objectHolder, bar, memomaInfo);
599                         }
600
601             //dataInOutManager.loadFile((String) parent.getTitle());
602             }
603
604             /**
605              *   データの保存を行う
606              *   
607              *   
608              *   @param forceOverwrite  trueの時は、ファイル名が確定していたときは(確認せずに)上書き保存を自動で行う。
609              *   
610              */
611             private void saveData(boolean forceOverwrite)
612             {
613             dataInOutManager.saveFile((String) parent.getTitle(), forceOverwrite);
614             }
615
616             /**
617              *   データの整列を行う
618              * 
619              */
620             private void alignData()
621             {
622                 ObjectAligner aligner = new ObjectAligner(parent, this);
623                 aligner.execute(objectHolder);
624             }
625             
626             /**
627              *    メッセージ編集ダイアログを表示する
628              * 
629              */
630             private void showInfoMessageEditDialog()
631             {
632                 parent.showDialog(R.id.editTextArea);                   
633             }
634
635             /**
636              *   新規作成が指示されたとき...全部クリアして作りなおして良いか確認する。
637              * 
638              */
639             private void createNewScreen()
640             {
641                 parent.showDialog(R.id.confirmation);
642             }
643             
644             /**
645              *    接続線の設定ダイアログを表示する
646              */
647             private void selectLineShapeDialog()
648             {
649                 // 接続線の設定ダイアログを表示する...
650                 parent.showDialog(R.id.selectline_dialog);
651             }
652
653             /**
654              *    メッセージ編集ダイアログの表示を準備する
655              * 
656              */
657             private void prepareInfoMessageEditDialog(Dialog dialog)
658             {
659                 String message = (String) parent.getTitle();
660                 editTextDialog.prepare(dialog, this, parent.getString(R.string.dataTitle), message, true);
661             }
662
663             /**
664              *    メッセージ編集ダイアログの表示を準備する
665              * 
666              */
667             private void prepareConfirmationDialog(Dialog dialog)
668             {
669                 // Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::prepareConfirmationDialog() " );
670             }
671
672             /**
673              *    オブジェクト入力用ダイアログの表示を準備する
674              * 
675              */
676             private void prepareObjectInputDialog(Dialog dialog)
677             {
678                 Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::prepareObjectInputDialog(), key: " + selectedObjectKey);
679                 
680                 //  ダイアログの準備を行う
681                 objectDataInputDialog.prepareObjectInputDialog(dialog, selectedObjectKey);
682                 
683             }
684
685             /**
686              *   アイテム選択ダイアログの表示を準備する
687              * 
688              * @param dialog
689              */
690             private void prepareItemSelectionDialog(Dialog dialog)
691             {
692                 // アイテム選択ダイアログの表示設定
693                 // (動的変更時。。。今回は固定なので何もしない)
694             }
695
696             /**
697              *    接続線選択用ダイアログの表示を準備する
698              * 
699              */
700             private void prepareLineSelectionDialog(Dialog dialog)
701             {
702                 Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::prepareLineSelectionDialog(), key: " + selectedObjectKey);
703                 
704                 //  ダイアログの準備を行う
705                 lineSelectionDialog.prepareSelectLineShapeDialog(dialog, selectedObjectKey);
706             }
707
708             /**
709              *  設定画面を表示する処理
710              */
711             private void showPreference()
712             {
713                 try
714                 {
715                     // 設定画面を呼び出す
716                     Intent prefIntent = new Intent(parent,jp.sourceforge.gokigen.memoma.Preference.class);
717                     parent.startActivityForResult(prefIntent, MENU_ID_PREFERENCES);
718                 }
719                 catch (Exception e)
720                 {
721                      // 例外発生...なにもしない。
722                          //updater.showMessage("ERROR", MainUpdater.SHOWMETHOD_DONTCARE);
723                 }
724             }
725
726         /**
727          *    接続線の形状を反映させる
728          * 
729          */
730             private void setLineStyle()
731             {
732                 int buttonId = LineStyleHolder.getLineShapeImageId(lineStyleHolder.getLineStyle(), lineStyleHolder.getLineShape());
733                 final ImageButton lineStyleObj = (ImageButton) parent.findViewById(R.id.LineStyleButton);
734                 lineStyleObj.setImageResource(buttonId);        
735             }
736
737             /**
738              *    オブジェクトが生成された!
739              * 
740              */
741             public void objectCreated()
742             {
743              // ここで動作モードを移動モードに戻す。
744                  drawModeHolder.changeOperationMode(OperationModeHolder.OPERATIONMODE_MOVE);
745                  updateButtons(OperationModeHolder.OPERATIONMODE_MOVE);
746
747            // 画面を再描画する
748            redrawSurfaceview();
749             }
750
751             /**
752              *    空き領域がタッチされた!
753              * 
754              */
755             public int touchedVacantArea()
756             {
757                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
758                 return (Integer.parseInt(preferences.getString("operationMode", "0")));
759             }
760
761             /**
762              *    空き領域でタッチが離された!
763              * 
764              */
765             public int touchUppedVacantArea()
766             {
767                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
768                 return (Integer.parseInt(preferences.getString("operationMode", "0")));
769             }
770
771             /**
772              *    オブジェクトを本当に削除して良いか確認した後に、オブジェクトを削除する。
773              * 
774              * @param key
775              */
776             private void removeObject(Integer key)
777             {
778                 // 本当に消して良いか、確認をするダイアログを表示して、OKが押されたら消す。
779                  AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(parent);
780                  alertDialogBuilder.setTitle(parent.getString(R.string.deleteconfirm_title));
781                  alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert);
782                  alertDialogBuilder.setMessage(parent.getString(R.string.deleteconfirm_message));
783
784                  // 削除するオブジェクトのキーを覚えこむ。
785                  objectKeyToDelete = key;
786
787                  // OKボタンの生成
788                  alertDialogBuilder.setPositiveButton(parent.getString(R.string.confirmYes), new DialogInterface.OnClickListener()
789              {
790                   public void onClick(DialogInterface dialog, int id)
791                   {
792                             //  削除モードの時... 確認後削除だけど、今は確認なしで削除を行う。
793                                 objectHolder.removePosition(objectKeyToDelete);
794                                 
795                                 // 削除するオブジェクトに接続されている線もすべて削除する
796                                 objectHolder.getConnectLineHolder().removeAllConnection(objectKeyToDelete);
797                                 
798                                 // ダイアログを閉じる
799                            dialog.dismiss();
800
801                            // ここで動作モードを削除モードから移動モードに戻す。
802                            drawModeHolder.changeOperationMode(OperationModeHolder.OPERATIONMODE_MOVE);
803                            updateButtons(OperationModeHolder.OPERATIONMODE_MOVE);
804                         
805
806                            // 画面を再描画する
807                            redrawSurfaceview();
808                   }
809               });
810                  
811                  // Cancelボタンの生成
812                  alertDialogBuilder.setNegativeButton(parent.getString(R.string.confirmNo), new DialogInterface.OnClickListener()
813              {
814                  public void onClick(DialogInterface dialog, int id)
815                  {
816                          dialog.cancel();
817                  }
818              });
819                 
820                  // ダイアログはキャンセル可能に設定する
821                  alertDialogBuilder.setCancelable(true);
822
823                  // ダイアログを表示する
824                  AlertDialog alertDialog = alertDialogBuilder.create();
825                  alertDialog.show();
826
827                  return;
828             }
829
830             /**
831              *    オブジェクトを複製する
832              * 
833              * @param key
834              */
835             private void duplicateObject(Integer key)
836             {
837                 // 選択中オブジェクトを複製する
838                 objectHolder.duplicatePosition(key);
839
840                 // 画面を再描画する
841            redrawSurfaceview();
842             }       
843
844             /**
845              *    オブジェクトを拡大する
846              * 
847              * @param key
848              */
849             private void expandObject(Integer key)
850             {
851                 // 選択中オブジェクトを拡大する
852                 objectHolder.expandObjectSize(key);
853
854                 // 画面を再描画する
855            redrawSurfaceview();
856             }       
857             /**
858              *    オブジェクトを縮小する
859              * 
860              * @param key
861              */
862             private void shrinkObject(Integer key)
863             {
864                 // 選択中オブジェクトを縮小する
865                 objectHolder.shrinkObjectSize(key);
866
867                 // 画面を再描画する
868            redrawSurfaceview();
869             }
870
871              private void setButtonBorder(ImageButton button, boolean isHighlight)
872               {
873                 try
874                 {
875                       BitmapDrawable btnBackgroundShape = (BitmapDrawable)button.getBackground();
876                       if (isHighlight == true)
877                       {
878 //                              btnBackgroundShape.setColorFilter(Color.rgb(51, 181, 229), Mode.LIGHTEN);
879                         btnBackgroundShape.setColorFilter(Color.BLUE, Mode.LIGHTEN);
880                       }
881                       else
882                       {
883                         btnBackgroundShape.setColorFilter(Color.BLACK, Mode.LIGHTEN);
884                       } 
885                 }
886                 catch (Exception ex)
887                 {
888                         // 
889                         Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::setButtonBorder(): " + ex.toString());
890                 }
891               }      
892
893              /**
894              *   ボタンを更新する
895              * 
896              */
897             private void updateButtons(int mode)
898             {
899                 final ImageButton createObjectButton = (ImageButton) parent.findViewById(R.id.CreateObjectButton);
900                 final ImageButton deleteObjectButton = (ImageButton) parent.findViewById(R.id.DeleteObjectButton);
901
902                 if (mode == OperationModeHolder.OPERATIONMODE_DELETE)
903                 {
904                         setButtonBorder(createObjectButton, false);
905                         setButtonBorder(deleteObjectButton, true);
906                 }
907                 else if (mode == OperationModeHolder.OPERATIONMODE_CREATE)
908                 {
909                         setButtonBorder(createObjectButton, true);
910                         setButtonBorder(deleteObjectButton, false);                     
911                 }
912                 else // if (mode == OperationModeHolder.OPERATIONMODE_MOVE)
913                 {
914                         setButtonBorder(createObjectButton, false);
915                         setButtonBorder(deleteObjectButton, false);                     
916                 }
917             }
918
919             
920             /**
921              *   オブジェクトが選択された(長押しで!)
922              * 
923              */
924             public void objectSelectedContext(Integer key)
925             {
926                 Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::objectSelectedContext(),  key:" + key);
927                 selectedContextKey = key;
928
929                 // オブジェクトのアイテム選択ダイアログを表示する...
930                 parent.showDialog(MENU_ID_OPERATION);
931
932             }
933             
934             
935             /**
936              *   オブジェクトが選択された!
937              * 
938              */
939             public boolean objectSelected(Integer key)
940             {
941                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
942                 int operationMode = Integer.parseInt(preferences.getString("operationMode", "0"));
943                 if (operationMode == OperationModeHolder.OPERATIONMODE_DELETE)
944                 {
945                         // オブジェクトを削除する
946                         removeObject(key);
947                         
948                         return (true);
949                 }
950                 //if ((operationMode == OperationModeHolder.OPERATIONMODE_MOVE)||
951                 //              (operationMode == OperationModeHolder.OPERATIONMODE_CREATE))
952                 {
953                         // 選択されたオブジェクトを記憶する
954                         selectedObjectKey = key;
955                         Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::objectSelected() key : " + key);
956
957                         // オブジェクトの詳細設定ダイアログを表示する...
958                         parent.showDialog(R.id.objectinput_dialog);
959                 }
960                 return (true);
961             }
962             
963             /**
964              *  ダイアログの生成
965              * 
966              */
967             public Dialog onCreateDialog(int id)
968             {
969             if (id == R.id.info_about_gokigen)
970             {
971                 // クレジットダイアログを表示
972                     CreditDialog dialog = new CreditDialog(parent);
973                     return (dialog.getDialog());
974             }
975             if (id == R.id.editTextArea)
976             {
977                         // 変更するテキストを表示
978                 return (editTextDialog.getDialog());
979             }
980             if (id == R.id.confirmation)
981             {
982                 // 確認するメッセージを表示する
983                 return (confirmationDialog.getDialog());
984             }
985             if (id == R.id.objectinput_dialog)
986             {
987                 // オブジェクト入力のダイアログを表示する
988                 return (objectDataInputDialog.getDialog());
989             }
990             if (id == MENU_ID_OPERATION)
991             {
992                 // アイテム選択ダイアログの準備を行う
993                 return (itemSelectionDialog.getDialog());
994             }
995             if (id == R.id.selectline_dialog)
996             {
997                 // 接続線選択ダイアログの準備を行う
998                 return (lineSelectionDialog.getDialog());
999             }
1000                 return (null);
1001             }
1002
1003             /**
1004              *  ダイアログ表示の準備
1005              * 
1006              */
1007             public void onPrepareDialog(int id, Dialog dialog)
1008             {
1009             if (id == R.id.editTextArea)
1010             {
1011                 // 変更するデータを表示する
1012                 prepareInfoMessageEditDialog(dialog);
1013                 return;
1014             }
1015             if (id == R.id.confirmation)
1016             {
1017                 // 確認ダイアログを表示する。
1018                 prepareConfirmationDialog(dialog);
1019                 return;
1020             }
1021             if (id == R.id.objectinput_dialog)
1022             {
1023                 // オブジェクト入力のダイアログを表示する
1024                 prepareObjectInputDialog(dialog);
1025             }
1026             if (id == MENU_ID_OPERATION)
1027             {
1028                 // オブジェクト操作選択のダイアログを表示する
1029                 prepareItemSelectionDialog(dialog);
1030             }
1031             if (id == R.id.selectline_dialog)
1032             {
1033                 // 接続線選択のダイアログを表示する
1034                 prepareLineSelectionDialog(dialog);
1035             }
1036             }
1037
1038         /**
1039          *    新規状態に変更する。
1040          * 
1041          */
1042         public void acceptConfirmation()
1043         {
1044             //
1045                 Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::acceptConfirmation()");
1046                 
1047                 // オブジェクトデータをクリアする。
1048             objectHolder.removeAllPositions();  // オブジェクトの保持クラス
1049             objectHolder.getConnectLineHolder().removeAllLines();  // オブジェクト間の接続状態保持クラス
1050
1051                 // 画面の倍率と表示位置を初期状態に戻す
1052                 if (objectDrawer != null)
1053                 {
1054                 final SeekBar zoomBar = (SeekBar) parent.findViewById(R.id.ZoomInOut);
1055                         objectDrawer.resetScaleAndLocation(zoomBar);
1056                 }
1057
1058                 /**
1059                 // 題名を "無題"に変更し、関係情報をクリアする
1060                 String newName = parent.getString(R.string.no_name);
1061                 parent.setTitle(newName);
1062                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
1063             SharedPreferences.Editor editor = preferences.edit();
1064             editor.putString("MeMoMaInfo", newName);
1065             editor.commit();
1066             **/
1067             
1068                 // 画面を再描画する
1069             redrawSurfaceview();
1070
1071             // ファイル名選択ダイアログを開く
1072             showInfoMessageEditDialog();
1073
1074         }
1075
1076         /**
1077          *   画面を再描画する
1078          * 
1079          */
1080         private void redrawSurfaceview()
1081         {
1082                 final GokigenSurfaceView surfaceview = (GokigenSurfaceView) parent.findViewById(R.id.GraphicView);
1083                 surfaceview.doDraw();           
1084         }
1085         
1086         /**
1087          *    不許可。何もしない。
1088          * 
1089          */
1090         public  void rejectConfirmation()
1091         {
1092                 Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::rejectConfirmation()");
1093         }
1094
1095         /**
1096          *   オブジェクトが整列された時の処理
1097          * 
1098          */
1099         public void objectAligned()
1100         {
1101             // 画面の再描画を指示する
1102             redrawSurfaceview();                
1103         }
1104         
1105         /**
1106          *   オブジェクト編集ダイアログが閉じられた時の処理
1107          * 
1108          */
1109         public void finishObjectInput()
1110         {
1111             // 画面の再描画を指示する
1112             redrawSurfaceview();
1113         }
1114         
1115         /**
1116          *   オブジェクト編集ダイアログが閉じられた時の処理
1117          * 
1118          */
1119         public void cancelObjectInput()
1120         {
1121             // 何もしない  
1122         }
1123         
1124         
1125         /**
1126          *   現在編集中かどうかを知る
1127          * 
1128          * @return
1129          */
1130         public boolean isEditing()
1131         {
1132                 return (isEditing);
1133         }
1134
1135         /**
1136          *   現在編集中のフラグを更新する
1137          * 
1138          * @param value
1139          */
1140         public void setIsEditing(boolean value)
1141         {
1142                 isEditing = value;
1143         }
1144
1145         /**
1146          *   アイテムが選択された!
1147          * 
1148          */
1149         public void itemSelected(int index, String itemValue)
1150         {
1151             //
1152                 Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::itemSelected() : " + itemValue + " [" + index + "]");
1153                 
1154                 if (index == ObjectOperationCommandHolder.OBJECTOPERATION_DELETE)
1155                 {
1156                         // オブジェクト削除の確認
1157                         removeObject(selectedContextKey);
1158                 }
1159                 else if (index == ObjectOperationCommandHolder.OBJECTOPERATION_DUPLICATE)
1160                 {
1161                         // オブジェクトの複製
1162                         duplicateObject(selectedContextKey);                    
1163                 }
1164                 else if (index == ObjectOperationCommandHolder.OBJECTOPERATION_SIZEBIGGER)
1165                 {
1166                         // オブジェクトの拡大
1167                         expandObject(selectedContextKey);
1168                 }
1169                 else if (index == ObjectOperationCommandHolder.OBJECTOPERATION_SIZESMALLER)
1170                 {
1171                         // オブジェクトの縮小
1172                         shrinkObject(selectedContextKey);
1173                 }
1174         }
1175
1176         /**
1177          *    (今回未使用)
1178          * 
1179          */
1180         public void itemSelectedMulti(String[] items, boolean[] status)
1181         {
1182                 
1183         }
1184         public void canceledSelection()
1185         {
1186                 
1187         }
1188         
1189         public void onSaveInstanceState(Bundle outState)
1190         {
1191             /* ここで状態を保存 */ 
1192             //Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onSaveInstanceState()");
1193         }
1194         
1195         public void onRestoreInstanceState(Bundle savedInstanceState)
1196         {
1197                 /* ここで状態を復元 */
1198             Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::onRestoreInstanceState()");
1199         }
1200
1201         public boolean finishTextEditDialog(String message)
1202         {
1203                 if ((message == null)||(message.length() == 0))
1204                 {
1205                 // データが入力されていなかったので、何もしない。
1206                         return (false);
1207                 }
1208                 
1209                 // 文字列を記録
1210                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
1211             SharedPreferences.Editor editor = preferences.edit();
1212             editor.putString("MeMoMaInfo", message);
1213             editor.commit();
1214
1215             // タイトルに設定
1216             parent.setTitle(message);
1217
1218             // 保存シーケンスを一度走らせる 
1219             saveData(true);
1220
1221             // ファイル選択リストの更新
1222             dataInOutManager.updateFileList(message, parent.getSupportActionBar());
1223
1224             return (true);
1225         }
1226         public boolean cancelTextEditDialog()
1227         {
1228             return (false);
1229         }
1230
1231         /**
1232          *    接続線
1233          * 
1234          */
1235         public void finishSelectLineShape(int style, int shape, int thickness)
1236         {
1237                 int buttonId = LineStyleHolder.getLineShapeImageId(style, shape);
1238             final ImageButton lineStyleObj = (ImageButton) parent.findViewById(R.id.LineStyleButton);
1239             lineStyleObj.setImageResource(buttonId);    
1240             //Log.v(Main.APP_IDENTIFIER, "MeMoMaListener::finishSelectLineShape() buttonId:" + buttonId);
1241         }
1242
1243         /**
1244          * 
1245          * 
1246          */
1247         public void cancelSelectLineShape()
1248         {
1249                 
1250         }
1251 }