OSDN Git Service

T29631
[everfolder/source.git] / source / workspace / EverFolder / src / com / yuji / ef / EverFolderActivity.java
index 42825d4..b97e7b2 100644 (file)
 package com.yuji.ef;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
-import android.content.res.Resources;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.sqlite.SQLiteDatabase;
 import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.graphics.PixelFormat;
-import android.graphics.Point;
-import android.graphics.Rect;
 import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
 import android.view.Gravity;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.WindowManager;
-import android.view.animation.Animation;
-import android.view.animation.Animation.AnimationListener;
-import android.view.animation.AnimationUtils;
+import android.view.inputmethod.InputMethodManager;
 import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
 
+import com.yuji.ef.common.CommonUtil;
+import com.yuji.ef.common.Constant;
+import com.yuji.ef.dao.DatabaseHelper;
 import com.yuji.ef.dao.DirNode;
 import com.yuji.ef.dao.FileNode;
+import com.yuji.ef.dao.LockDao;
 import com.yuji.ef.dao.Node;
+import com.yuji.ef.dao.Node.Status;
+import com.yuji.ef.dao.NodeCacheDao;
+import com.yuji.ef.dao.NodeComparator;
 import com.yuji.ef.dao.NodeDao;
+import com.yuji.ef.dao.NodeDaoImpl;
+import com.yuji.ef.dao.RootNode;
+import com.yuji.ef.exception.EfError;
+import com.yuji.ef.exception.EfException;
+import com.yuji.ef.pref.EditPrefUtil;
 import com.yuji.ef.utility.BaseActivity;
+import com.yuji.ef.utility.BitmapCacheFactory;
+import com.yuji.ef.utility.EvernoteIntentUtil;
+import com.yuji.ef.utility.FolderUtil;
+import com.yuji.ef.utility.LockHandler;
+import com.yuji.ef.utility.LockListener;
+import com.yuji.ef.utility.ScaleUtil;
+
+public class EverFolderActivity extends BaseActivity implements LockListener {
+       private enum ScreenStatus {
+               Normal, AddNode, DeleteNode, RenameNode
+       };
+
+       private EditPrefUtil pref = new EditPrefUtil(this);
+
+       private LinearLayout msgLayout;
+       private LinearLayout msgButtonLayout;
+       private Button msgOkButton;
+       private Button msgCancelButton;
+       private EditText msgEditText;
 
-public class EverFolderActivity extends BaseActivity /*
-                                                                                                * implements OnTouchListener,
-                                                                                                * OnLongClickListener
-                                                                                                */{
        private IconFrameLayout layout;
+       private TextView confirmMsg;
        private IconScrollView scrollView;
+       private LinearLayout buttonLayout;
        private Button leftButton;
        private Button rightButton;
 
-       private IconImageView target = null;
-       private IconImageView dest = null;
-
+       private ScreenStatus status;
+       private NodeComparator nodeComparator = new NodeComparator();
+       private BitmapCacheFactory bitmapFactory = BitmapCacheFactory.getInstance();
        private Node top = null;
        private int indent = 0;
-
-       private Animation anime;
-       private int startX;
-       private int startY;
-       private int currentX;
-       private int currentY;
-       private int offsetX;
-       private int offsetY;
-       private boolean longClickFlg = false;
+       private int bmpPaddingLeft;
+       private int bmpWidth;
+       private int viewY;
+       private boolean lock = false;
+       private boolean isInit = true;
+       private boolean isInCycle = false;
+       private boolean isResult = false;
+       private LockHandler lockHandler = null;
+       
+       private BroadcastReceiver receiver = new BroadcastReceiver() {
+               @Override
+               public void onReceive(Context context, Intent intent) {
+                       String action = intent.getAction();
+
+                       if (action.equals(Constant.ACTION_MESSAGE)) {
+                               String msg = intent
+                                               .getStringExtra(Constant.ACTION_MESSAGE_MESSAGE);
+                               EfException.msg(EverFolderActivity.this, msg);
+                       } else if (action.equals(Constant.ACTION_UPDATE)) {
+                               if (isInCycle && !lock) {
+                                       LockDao lockDao = (LockDao) LockDao.getInstance();
+                                       lock = lockDao.lock(EverFolderActivity.this,
+                                                       Constant.LOCK_UPDATE_NOTE);
+                                       if (lock) {
+                                               updateList();
+                                               // ほんとは、setStatus()に入れたい
+                                               layout.setVisibility(View.VISIBLE);
+                                       }
+                                       setStatus();
+                               }
+                       }
+               }
+       };
 
        @Override
        public void onCreate(Bundle savedInstanceState) {
@@ -54,17 +115,27 @@ public class EverFolderActivity extends BaseActivity /*
                setContentView(R.layout.main);
 
                try {
+                       IntentFilter intentFilter = new IntentFilter();
+                       intentFilter.addAction(Constant.ACTION_UPDATE);
+                       intentFilter.addAction(Constant.ACTION_MESSAGE);
+                       registerReceiver(receiver, intentFilter);
+
                        scrollView = (IconScrollView) findViewById(R.id.scrollView);
                        layout = (IconFrameLayout) findViewById(R.id.frameLayout);
                        layout.setActivity(this);
                        layout.setScrollView(scrollView);
-                       // layout.setClickable(false);
-                       // layout = new FrameLayout(this);
-                       // setContentView(layout);
 
+                       buttonLayout = (LinearLayout) findViewById(R.id.mainButtonLayout);
                        leftButton = (Button) findViewById(R.id.leftButton);
                        rightButton = (Button) findViewById(R.id.rightButton);
 
+                       msgLayout = (LinearLayout) findViewById(R.id.mainMsgLayout);
+                       confirmMsg = (TextView) findViewById(R.id.mainConfirmMsg);
+                       msgEditText = (EditText) findViewById(R.id.mainMsgEditText);
+                       msgButtonLayout = (LinearLayout) findViewById(R.id.mainMsgButtonLayout);
+                       msgOkButton = (Button) findViewById(R.id.mainMsgOkButton);
+                       msgCancelButton = (Button) findViewById(R.id.mainMsgCancelButton);
+
                        leftButton.setOnClickListener(new OnClickListener() {
                                @Override
                                public void onClick(View v) {
@@ -78,132 +149,378 @@ public class EverFolderActivity extends BaseActivity /*
                                }
                        });
 
-                       Resources r = getResources();
-                       Bitmap bmp1 = BitmapFactory.decodeResource(r, R.drawable.android);
-                       Bitmap bmp2 = BitmapFactory.decodeResource(r, R.drawable.test2);
+                       msgEditText.addTextChangedListener(new TextWatcher() {
+                               public void afterTextChanged(Editable s) {
+                                       if (status != ScreenStatus.DeleteNode) {
+                                               String text = s.toString();
+                                               msgOkButton.setEnabled(text.length() > 0);
+                                       } else {
+                                               msgOkButton.setEnabled(true);
+                                       }
+                               }
+
+                               public void beforeTextChanged(CharSequence s, int start,
+                                               int count, int after) {
 
-                       anime = AnimationUtils.loadAnimation(this, R.anim.sample);
-                       anime.setAnimationListener(new AnimationListener() {
-                               public void onAnimationStart(Animation animation) {
                                }
 
-                               public void onAnimationRepeat(Animation animation) {
+                               public void onTextChanged(CharSequence s, int start,
+                                               int before, int count) {
+
                                }
+                       });
 
-                               public void onAnimationEnd(Animation animation) {
-                                       // if (isBt2Click) {
-                                       // bt2.performClick();
-                                       // isBt2Click = false;
-                                       // }
-                                       target = null;
-                                       dest = null;
+                       msgOkButton.setOnClickListener(new OnClickListener() {
+                               @Override
+                               public void onClick(View v) {
+                                       msgOkButtonOnClick(v);
+                               }
+                       });
+                       msgCancelButton.setOnClickListener(new OnClickListener() {
+                               @Override
+                               public void onClick(View v) {
+                                       msgCancelOnClick(v);
                                }
                        });
 
-                       // target = (ImageView) findViewById(R.id.ImageView01);
-                       // target.setImageBitmap(bmp);
-                       // this.target.setOnTouchListener(this);
-
-                       // int x;
-                       // int y;
-                       // int N = 200;
-                       //
-                       // x = 100;
-                       // y = 0;
-                       // for (int i = 0; i < 4; i++) {
-                       // Bitmap bmp = (i % 2 == 0) ? bmp1 : bmp2;
-                       // //createIconImageView(bmp, x, y);
-                       // createIconImageView(bmp, "TEXT" + i, x, y);
-                       // y += N;
-                       // }
-                       //
-                       // layout.setMinimumHeight(y * 2 + N);
-
-                       // TODO
-//                     top = new DirNode(null, null);
-//                     top.setStatus(Node.Status.OPEN);
-//
-//                     Node node;
-//                     node = new DirNode("ディレクトリ", null);
-//                     top.add(node);
-//                     node.add(new FileNode("ファイルaaa", null));
-//                     node.add(new FileNode("ファイルbb", null));
-//                     node.add(new FileNode("ファイルc", null));
-//
-//                     node = new DirNode("ディレクトリAAA", null);
-//                     top.add(node);
-//                     node.add(new DirNode("directory qqqq", null));
-//                     node.add(new FileNode("ファイルdddddddd", null));
-//                     node.add(new FileNode("ファイルeee", null));
-//
-//                     node = new FileNode("ファイルzzz", null);
-//                     top.add(node);
-
-                       NodeDao dao = (NodeDao) NodeDao.getInstance();
-                       List<Node> tmp = dao.search();
-                       System.out.println(tmp.toString());
-                       top = dao.searchRoot();
-                       if (top == null){
-                               // TODO
-                       }
-                       
-                       updateList(top);
+                       ScaleUtil scaleUtil = ScaleUtil.getInstance();
+                       scaleUtil.init(this);
+
+                       bitmapFactory.init(this);
+                       Node node = new DirNode(null, null);
+                       Bitmap bmp = null;
+                       bmp = bitmapFactory.get(node.getStatusIconId());
+                       bmpPaddingLeft = bmp.getWidth();
+                       bmp = bitmapFactory.get(node.getIconId());
+                       bmpWidth = bmp.getWidth();
+
+                       float fSize = 48 * (1 / 2.0f);
+                       leftButton.setTextSize(fSize);
+                       rightButton.setTextSize(fSize);
+               } catch (Exception e) {
+                       EfException.msg(R.string.ErrorSystem, e);
+               }
+       }
+
+       @Override
+       public boolean onCreateOptionsMenu(Menu menu) {
+               boolean ret = super.onCreateOptionsMenu(menu);
+               int index = 0;
+
+               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE,
+                               getString(R.string.MenuCut));
+               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE,
+                               getString(R.string.MenuPaste));
+               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE,
+                               getString(R.string.MenuAdd));
+               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE,
+                               getString(R.string.MenuDelete));
+               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE,
+                               getString(R.string.MenuRename));
+               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE,
+                               getString(R.string.MenuSetting));
+               return ret;
+       }
+
+       @Override
+       public boolean onMenuOpened(int featureId, Menu menu) {
+               boolean ret = super.onMenuOpened(featureId, menu);
+
+               // #29304
+               if (menu == null) {
+                       return false;
+               }
+
+               MenuItem item;
+
+               boolean cutButtonFlag = false;
+               boolean pastButtonFlag = false;
+               boolean addButtonFlag = false;
+               boolean deleteButtonFlag = false;
+               boolean renameButtonFlag = false;
+               boolean confButtonFlag = true;
+
+               if (status == ScreenStatus.Normal) {
+                       LabelIconView target = layout.getSelectedTarget();
+                       NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
+                       long id = -1;
+                       Node node = null;
+                       if (target != null) {
+                               id = target.getNodeId();
+                               node = dao.searchById(id);
+                       }
+
+                       if (isDirNode(target, node, false) || isFileNode(node)) {
+                               cutButtonFlag = true;
+                       }
+                       if (isDirNode(target, node, true) && isCut()) {
+                               pastButtonFlag = true;
+                       }
+                       if (isDirNode(target, node, true)) {
+                               addButtonFlag = true;
+                       }
+                       if (isDirNode(target, node, false) && !isNoteBook(node)
+                                       && CommonUtil.isNull(node.getChildrenString())) {
+                               deleteButtonFlag = true;
+                       }
+                       if (isDirNode(target, node, false) && !isNoteBook(node)) {
+                               renameButtonFlag = true;
+                       }
+               }
+
+               int index = 0;
+               item = menu.getItem(index++);
+               item.setVisible(cutButtonFlag);
+               item = menu.getItem(index++);
+               item.setVisible(pastButtonFlag);
+               item = menu.getItem(index++);
+               item.setVisible(addButtonFlag);
+               item = menu.getItem(index++);
+               item.setVisible(deleteButtonFlag);
+               item = menu.getItem(index++);
+               item.setVisible(renameButtonFlag);
+               item = menu.getItem(index++);
+               item.setVisible(confButtonFlag);
+
+               return ret;
+       }
+
+       private boolean isFileNode(Node node) {
+               if (node == null || !(node instanceof FileNode)) {
+                       return false;
+               }
+               return true;
+       }
+
+       private boolean isDirNode(LabelIconView target, Node node,
+                       boolean containRoot) {
+               if (target == null) {
+                       return false;
+               }
+               if (node == null) {
+                       return false;
+               }
+               if (!containRoot && (node instanceof RootNode)) {
+                       return false;
+               }
+               if (!(node instanceof DirNode)) {
+                       return false;
+               }
+               return true;
+       }
+
+       private boolean isNoteBook(Node node) {
+               if (node == null) {
+                       return false;
+               }
+               if (CommonUtil.isNull(node.getGuid())) {
+                       return false;
+               }
+               return true;
+       }
+
+       private boolean isCut() {
+               LabelIconView srcTarget = layout.getCutTarget();
+               if (srcTarget == null) {
+                       return false;
+               }
+               return true;
+       }
+
+       @Override
+       public boolean onOptionsItemSelected(MenuItem item) {
+               Intent intent;
+               try {
+                       switch (item.getItemId()) {
+                       case Menu.FIRST + 0:
+                               selectMenuCut();
+                               break;
+                       case Menu.FIRST + 1:
+                               selectMenuPast();
+                               break;
+                       case Menu.FIRST + 2:
+                               selectMenuAdd();
+                               break;
+                       case Menu.FIRST + 3:
+                               selectMenuDelete();
+                               break;
+                       case Menu.FIRST + 4:
+                               selectMenuRename();
+                               break;
+                       case Menu.FIRST + 5:
+                               // dummy();
+                               // dummy2();
+                               intent = new Intent(this, (Class<?>) SettingActivity.class);
+                               startActivityForResult(intent, 0);
+                               break;
+                       default:
+                               break;
+                       }
+               } catch (Exception e) {
+                       terminate(e);
+               }
+               return super.onOptionsItemSelected(item);
+       }
+
+       private void dummy() {
+               NodeDaoImpl dao = (NodeDaoImpl) NodeCacheDao.getInstance();
+               List<Node> list = dao.search();
+               for (Node node : list) {
+                       System.out.println(node.toString());
+               }
+       }
+
+       private void dummy2() {
+               LockDao dao = (LockDao) LockDao.getInstance();
+               boolean b;
+
+               try {
+                       b = dao.lock(this, "key");
+                       b = dao.lock(this, "key");
+                       b = dao.lock(new Object(), "key");
+                       dao.unlock(this, "key");
+                       b = dao.lock(new Object(), "key");
+                       b = dao.lock(this, "key");
+                       b = dao.lock(this, "key");
+                       b = dao.lock(this, "key");
+                       dao.unlock(new Object(), "key");
+
                } catch (Exception e) {
-                       // TODO
                        e.printStackTrace();
                }
+
        }
 
-       private int viewY;
+       private void selectMenuAdd() {
+               setStatus(ScreenStatus.AddNode);
+       }
+
+       private void selectMenuDelete() {
+               setStatus(ScreenStatus.DeleteNode);
+       }
+
+       private void selectMenuRename() {
+               LabelIconView target = layout.getSelectedTarget();
+               if (target == null) {
+                       return;
+               }
+
+               long id = target.getNodeId();
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
+               Node node = dao.searchById(id);
+               if (node != null) {
+                       String text = node.getName();
+                       msgEditText.setText(text);
+                       setStatus(ScreenStatus.RenameNode);
+               }
+       }
+
+       private void selectMenuCut() {
+               LabelIconView target = layout.getSelectedTarget();
+               if (target == null) {
+                       return;
+               }
+
+               layout.setCutTarget(target);
+               layout.refresh();
+       }
+
+       private void selectMenuPast() {
+               LabelIconView srcTarget = layout.getCutTarget();
+               if (srcTarget == null) {
+                       return;
+               }
+
+               LabelIconView dstTarget = layout.getSelectedTarget();
+               if (dstTarget == null) {
+                       return;
+               }
+
+               layout.setCutTarget(null);
+
+               long srcId = srcTarget.getNodeId();
+               long dstId = dstTarget.getNodeId();
+               execute(srcId, dstId);
+       }
+
+       private void updateList() {
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
+               top = dao.searchRoot();
+               if (top == null) {
+                       // データ0件(データ未更新)
+                       return;
+               }
+               updateList(top);
+       }
 
        private void updateList(Node parent) {
-               viewY = 30;
+               viewY = 10;
 
-               // List<Node> list = parent.getChildren();
-               // for (Node node : list){
-               // updateList(node, x);
-               // }
+               scrollView.setVisibility(View.GONE);
+               layout.removeAllViews();
                updateList(parent, 0);
                layout.setMinimumHeight(viewY);
-               layout.invalidate();
+               scrollView.setVisibility(View.VISIBLE);
+               layout.refresh();
+
+               scrollView.invalidate();
        }
 
        private void updateList(Node node, int depth) {
-               int N = 100;
-               int M = 120;
-               int x = N * (depth - indent) + 50;
+               int N = (int) (bmpWidth * 0.6);
+               int M = (int) (bmpWidth * 1.2);
+               int x = N * (depth - indent);
 
                if (depth - indent >= 0
                                && !(depth - indent == 0 && node instanceof FileNode)) {
                        LabelIconView view = new LabelIconView(this);
                        node.setView(view);
 
-                       Resources r = getResources();
                        Bitmap bmp1 = null;
                        int id = node.getStatusIconId();
                        if (id >= 0) {
-                               bmp1 = BitmapFactory.decodeResource(r, node.getStatusIconId());
+                               // DirNode
+                               bmp1 = bitmapFactory.get(node.getStatusIconId());
+                       } else {
+                               // FileNode
+                               x += bmpPaddingLeft;
                        }
-                       Bitmap bmp2 = BitmapFactory.decodeResource(r, node.getIconId());
+                       Bitmap bmp2 = bitmapFactory.get(node.getIconId());
                        createIconImageView(view, bmp1, bmp2, node.getName(), x, viewY);
-                       LabelIconView s = view.getStatusImageView();
-                       if (s != null) {
-                               s.setNode(node);
-                       }
+                       // LabelIconView s = view.getStatusImageView();
+                       // if (s != null) {
+                       // s.setNodeId(node.getId());
+                       // }
+                       view.setNodeId(node.getId());
                }
                viewY += M;
 
                if (node.getStatus() != Node.Status.OPEN) {
                        return;
                }
-               List<Long> list = node.getChildren();
-               if (list == null) {
+               List<Long> idList = node.getChildren();
+               if (idList == null) {
                        return;
                }
-               
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
-               for (Long id : list) {
+
+               List<Node> list = new ArrayList<Node>();
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
+               for (Long id : idList) {
                        Node n = dao.searchById(id);
+                       if (n == null) {
+                               // ERROR
+                               continue;
+                       }
+                       if (n instanceof DirNode) {
+                               DirNode d = (DirNode) n;
+                               if (isNoteBook(d) && !d.isSelected()) {
+                                       continue;
+                               }
+                       }
+                       list.add(n);
+               }
+               Collections.sort(list, nodeComparator);
+               for (Node n : list) {
                        updateList(n, depth + 1);
                }
        }
@@ -228,62 +545,128 @@ public class EverFolderActivity extends BaseActivity /*
 
                layout.addView(v);
                v.layout(x, y, x + v.getWidth(), y + v.getHeight());
+       }
+
+       @Override
+       public void sendLockResult(boolean b) {
+               lock = b;
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
+
+               pref.put(Constant.PREF_UPDATE_DATA, Constant.OFF);
+               pref.update();
 
-               LabelIconView siv = v.getStatusImageView();
-               if (siv != null) {
-                       createIconImageView(siv, null, bmp1, null, x - 50, y);
+               if (isResult) {
+                       if (dao.isEmpty()) {
+                               finish();
+                               return;
+                       }
+               }
+               isResult = false;
+
+               if (dao.isEmpty()) {
+                       if (isInit) {
+                               Intent intent = new Intent(this,
+                                               (Class<?>) SettingActivity.class);
+                               startActivityForResult(intent, 0);
+
+                               isInit = false;
+                       } else {
+                               finish();
+                               isInit = true;
+                       }
+               }
+
+               if (isInCycle) {
+                       if (isInit) {
+                               status = ScreenStatus.Normal;
+
+                               if (lock) {
+                                       layout.setVisibility(View.VISIBLE);
+                                       updateList();
+                               } else {
+                                       layout.removeAllViews();
+                               }
+                               setStatus();
+                               isInit = false;
+                       } else {
+                               if (lock) {
+                                       layout.setVisibility(View.VISIBLE);
+                                       updateList();
+                               }
+                               setStatus();
+                       }
+               } else {
+                       LockDao lockDao = (LockDao) LockDao.getInstance();
+                       lockDao.unlock(EverFolderActivity.this, Constant.LOCK_UPDATE_NOTE);
+                       lock = false;
                }
        }
 
        @Override
+       protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+               isResult = true;
+               isInit = true;
+       }
+
+       @Override
        protected void onStart() {
                super.onStart();
        }
 
-       public void onClickShowButton(View v) {
-               // int size = layout.getChildCount();
-               // for (int i = 0; i < size; i++){
-               // View vv = layout.getChildAt(i);
-               // vv.setVisibility(View.VISIBLE);
-               // }
-               if (target == null) {
-                       return;
+       @Override
+       protected void onResume() {
+               super.onResume();
+               isInCycle = true;
+
+               // #29573
+               // 「強制的のロックを削除するためのフラグ」をOFFに
+               // →起動時の初回のみ削除を試みるため
+               boolean isUnlock = pref.getInt(Constant.PREF_DELETE_LOCK)== Constant.ON;
+               if (isUnlock){
+                       pref.put(Constant.PREF_DELETE_LOCK, Constant.OFF);
+                       pref.update();
                }
+               
+               lockHandler = new LockHandler();
+               lockHandler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
+               lock = false;
 
-               Rect rect = new Rect();
-               Point globalOffset = new Point();
-               target.getGlobalVisibleRect(rect, globalOffset);
-               // currentX = startX;
-               // currentY = startY;
-               currentX = 50;
-               currentY = 50;
-               target.layout(currentX, currentY, currentX + target.getWidth(),
-                               currentY + target.getHeight());
-
-               // TODO
-               target.setAlpha(64);
-               // layout.removeView(target);
-               // layout.addView(target);
-               target.setSelected(true);
-               IconImageView iv = (IconImageView) target;
-               iv.init(currentX, currentY);
-
-               target = null;
+               if (isInit) {
+                       layout.setVisibility(View.INVISIBLE);
+                       setStatus();
+               } else {
+                       // #29589
+                       //// #29421
+                       //updateList();
+                       layout.setVisibility(View.INVISIBLE);
+                       setStatus();
+               }
        }
 
-       public void onClickButton02(View v) {
-               // TODO
-               // Toast.makeText(this, "click", Toast.LENGTH_SHORT).show();
-               // Intent intent = new Intent(DDSampleActivity.this, Next.class);
-               // startActivity(intent);
+       @Override
+       protected void onPause() {
+               // ロック未取得でも解除する(ゴミ掃除)
+               LockDao lockDao = (LockDao) LockDao.getInstance();
+               lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
+               lock = false;
+
+               if (lockHandler != null){
+                       lockHandler.cancel();
+                       lockHandler = null;
+               }
+               
+               super.onPause();
+               isInCycle = false;
        }
 
        private void leftButtonOnClick() {
                moveButtonOnClick(-1);
+               setStatus();
        }
 
        private void rightButtonOnClick() {
-                moveButtonOnClick(1);
+               moveButtonOnClick(1);
+               setStatus();
        }
 
        private void moveButtonOnClick(int dx) {
@@ -299,178 +682,267 @@ public class EverFolderActivity extends BaseActivity /*
                if (mx != 0) {
                        indent += mx;
                        removeAllNodeView();
-                       updateList(top);
+                       updateList();
                }
        }
 
-       public void execute(Node src, Node dst) {
-               removeAllNodeView();
+       private void msgOkButtonOnClick(View v) {
+               FolderUtil util = FolderUtil.getInstance();
+               LabelIconView target = layout.getSelectedTarget();
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
+
+               if (status == ScreenStatus.AddNode) {
+                       long id = target.getNodeId();
+                       Node parent = dao.searchById(id);
+                       if (parent != null) {
+                               String text = msgEditText.getText().toString();
+                               DirNode node = new DirNode(text, null);
+                               util.addDirNode(parent, node);
+                       }
+                       layout.setCutTarget(null, false);
+               } else if (status == ScreenStatus.DeleteNode) {
+                       long id = target.getNodeId();
+                       Node node = dao.searchById(id);
+                       if (node != null) {
+                               util.deleteNode(node);
+                               layout.removeView(target);
+                       }
+                       layout.setCutTarget(null, false);
+               } else if (status == ScreenStatus.RenameNode) {
+                       long id = target.getNodeId();
+                       Node node = dao.searchById(id);
+                       if (node != null) {
+                               String text = msgEditText.getText().toString();
+
+                               dao.updateName(node, text);
+                       }
+                       layout.setCutTarget(null, false);
+               }
+
+               closeIME(v);
+
+               layout.clearTarget();
+               updateList();
+               setStatus(ScreenStatus.Normal);
+       }
+
+       private void msgCancelOnClick(View v) {
+               closeIME(v);
+
+               setStatus(ScreenStatus.Normal);
+       }
+
+       private void closeIME(View v) {
+               InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+               imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
+       }
+
+       public void execute(long srcId, long dstId) {
+               try {
+                       removeAllNodeView();
+
+                       NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
+
+                       if (srcId < 0) {
+                               throw new EfException(EfError.NOT_FOUND);
+                       }
+                       if (dstId < 0) {
+                               throw new EfException(EfError.NOT_FOUND);
+                       }
 
-               // TODO
-//             if (dst instanceof DirNode) {
-//                     src.getParent().remove(src);
-//                     dst.add(src);
-//             } else if (dst instanceof FileNode) {
-//                     src.getParent().remove(src);
-//                     dst.getParent().add(src);
-//             }
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
-               Node sp = dao.searchById(src.getParent());
-               if (sp == null){
-                       // TODO
+                       Node src = dao.searchById(srcId);
+                       Node dst = null;
+                       if (srcId == dstId) {
+                               dst = src;
+                       } else {
+                               dst = dao.searchById(dstId);
+                       }
+
+                       if (dstId == src.getParent()) {
+                               // 同じ場所に移動
+                               return;
+                       }
+                       if (!isFileNode(src) && !isMovable(srcId, dstId)) {
+                               // 再帰的な移動
+                               return;
+                       }
+
+                       Node sp = dao.searchById(src.getParent());
+                       if (sp == null) {
+                               throw new EfException(EfError.NOT_FOUND);
+                       }
+                       Node dp = null;
+                       if (src.getParent() == dst.getParent() || dst.getParent() < 0) {
+                               dp = sp;
+                       } else {
+                               dp = dao.searchById(dst.getParent());
+                       }
+                       if (dp == null) {
+                               throw new EfException(EfError.NOT_FOUND);
+                       }
+
+                       SQLiteDatabase db = DatabaseHelper.getInstance()
+                                       .getSQLiteDatabase();
+                       db.beginTransaction();
+                       try {
+                               dao.removeChildrenIdNT(sp, src.getId());
+                               if (dst instanceof DirNode) {
+                                       dao.updateParentNT(src, dst.getId());
+                                       dao.addChildrenIdNT(dst, src.getId());
+                               } else if (dst instanceof FileNode) {
+                                       dao.updateParentNT(src, dp.getId());
+                                       dao.addChildrenIdNT(dp, src.getId());
+                               }
+
+                               db.setTransactionSuccessful();
+                       } finally {
+                               db.endTransaction();
+                       }
+               } catch (EfException e) {
+                       EfException.msg(R.string.ErrorSystem, e);
+               } finally {
+                       updateList();
                }
-               Node dp = dao.searchById(dst.getParent());
-               if (dp == null){
-                       // TODO
+       }
+
+       private boolean isMovable(long srcId, long dstId) {
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
+
+               while (dstId >= 0) {
+                       if (srcId == dstId) {
+                               return false;
+                       }
+                       Node node = dao.searchById(dstId);
+                       if (node == null) {
+                               // ERROR
+                               return false;
+                       }
+                       if (!(node instanceof DirNode)) {
+                               return true;
+                       }
+                       dstId = node.getParent();
                }
-               
-               // TODO DBへのアクセス
-               if (dst instanceof DirNode) {
-                       sp.remove(src.getId());
-                       dst.add(src.getId());
-               } else if (dst instanceof FileNode) {
-                       sp.remove(src.getId());
-                       dp.add(src.getId());
+               return true;
+       }
+
+       public void execute(long id) {
+               try {
+                       NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
+
+                       Node node = dao.searchById(id);
+                       if (node == null) {
+                               throw new EfException(EfError.NOT_FOUND);
+                       }
+                       node.toggleStatus();
+                       Status status = node.getStatus();
+
+                       dao.updateStatus(node, status);
+
+                       updateList();
+               } catch (EfException e) {
+                       EfException.msg(R.string.ErrorSystem, e);
                }
+       }
 
-               updateList(top);
+       public void executeView(long id) {
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
+
+               Node node = dao.searchById(id);
+               if (!isFileNode(node)) {
+                       return;
+               }
+               String guid = node.getGuid();
+
+               EvernoteIntentUtil util = EvernoteIntentUtil.getInstance();
+               util.viewNote(this, guid);
        }
 
-       public void execute(Node node) {
-               removeAllNodeView();
-               updateList(top);
+       public void targetSelectedChanged(boolean status) {
+               setStatus();
        }
 
        public void removeAllNodeView() {
                layout.removeAllViews();
        }
 
-       // @Override
-       // public boolean onTouch(View v, MotionEvent event) {
-       // int x = (int) event.getRawX();
-       // int y = (int) event.getRawY();
-       //
-       // // FOO
-       // if (!(v instanceof IconImageView)) {
-       // return true;
-       // }
-       // IconImageView obj = (IconImageView) v;
-       //
-       // if (target == null) {
-       // target = obj;
-       //
-       // // scrollView.setOnTouchListener(new OnTouchListener() {
-       // // @Override
-       // // public boolean onTouch(View v, MotionEvent event) {
-       // // return true;
-       // // }
-       // // });
-       // } else if (target != obj) {
-       // return true;
-       // }
-       // if (event.getAction() == MotionEvent.ACTION_MOVE) {
-       // if (!longClickFlg) {
-       // return false;
-       // }
-       // int diffX = offsetX - x;
-       // int diffY = offsetY - y;
-       //
-       // currentX -= diffX;
-       // currentY -= diffY;
-       // // currentX = x;;
-       // // currentY = y;
-       // obj.layout(currentX, currentY, currentX + obj.getWidth(), currentY
-       // + obj.getHeight());
-       //
-       // offsetX = x;
-       // offsetY = y;
-       //
-       // if (dest == null) {
-       // Rect rect = new Rect();
-       // int size = layout.getChildCount();
-       // for (int i = 0; i < size; i++) {
-       // IconImageView vv = (IconImageView) layout.getChildAt(i);
-       // vv.getHitRect(rect);
-       // if (rect.contains(x - layout.getLeft(),
-       // y - layout.getLeft())) {
-       // dest = vv;
-       // dest.setAlpha(32);
-       // break;
-       // }
-       // }
-       // } else {
-       // Rect rect = new Rect();
-       //
-       // dest.getHitRect(rect);
-       // if (!rect.contains(x - layout.getLeft(), y - layout.getLeft())) {
-       // dest.setAlpha(255);
-       // dest = null;
-       // }
-       // }
-       // } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
-       // offsetX = x;
-       // offsetY = y;
-       // // TODO
-       // currentX = obj.getLeft();
-       // currentY = obj.getTop();
-       //
-       // target.setColorFilter(Color.RED, Mode.LIGHTEN);
-       //
-       // scrollView.setScrollable(false);
-       // return false;
-       // } else if (event.getAction() == MotionEvent.ACTION_UP) {
-       // if (!longClickFlg) {
-       // return false;
-       // }
-       // obj.setAnimation(anime);
-       // obj.startAnimation(anime);
-       // // obj.setVisibility(View.GONE);
-       // if (dest == null) {
-       // // 消す場合
-       // // layout.removeView(obj);
-       //
-       // // キャンセル
-       // int srcX = target.getInitX();
-       // int srcY = target.getInitY();
-       // target.layout(srcX, srcY, srcX + target.getWidth(), srcY
-       // + target.getHeight());
-       // target.setAlpha(255);
-       // } else {
-       // int srcX = target.getInitX();
-       // int srcY = target.getInitY();
-       // int dstX = dest.getInitX();
-       // int dstY = dest.getInitY();
-       //
-       // target.layout(dstX, dstY, dstX + target.getWidth(), dstY
-       // + target.getHeight());
-       // target.init(dstX, dstY);
-       // target.setAlpha(255);
-       // dest.layout(srcX, srcY, srcX + dest.getWidth(),
-       // srcY + dest.getHeight());
-       // dest.init(srcX, srcY);
-       // dest.setAlpha(255);
-       // }
-       //
-       // // bt2.getHitRect(rect);
-       // // if (rect.contains(x, y)) {
-       // // isBt2Click = true;
-       // // }
-       // longClickFlg = false;
-       // }
-       //
-       // return true;
-       // }
-       //
-       // @Override
-       // public boolean onLongClick(View view) {
-       // if (!(view instanceof IconImageView)) {
-       // return true;
-       // }
-       // IconImageView v = (IconImageView) view;
-       // v.setAlpha(128);
-       // v.clearColorFilter();
-       //
-       // longClickFlg = true;
-       // return true;
-       // }
+       private void setStatus() {
+               setStatus(status);
+       }
+
+       private void setStatus(ScreenStatus status) {
+               try {
+                       if (this.status != status) {
+                               this.status = status;
+                       }
+
+                       if (!lock) {
+                               int update = pref.getInt(Constant.PREF_UPDATE_DATA);
+
+                               if (update == Constant.ON) {
+                                       msgLayout.setVisibility(View.VISIBLE);
+                                       confirmMsg.setText(getString(R.string.mainUpdateMsg));
+                               } else {
+                                       msgLayout.setVisibility(View.GONE);
+                               }
+                               msgEditText.setVisibility(View.GONE);
+                               msgButtonLayout.setVisibility(View.GONE);
+
+                               leftButton.setEnabled(false);
+                               rightButton.setEnabled(false);
+
+                               status = ScreenStatus.Normal;
+                               return;
+                       }
+
+                       if (status == ScreenStatus.Normal) {
+                               msgLayout.setVisibility(View.GONE);
+
+                               boolean leftButtonFlag = true;
+                               boolean rightButtonFlag = true;
+
+                               if (indent <= 0) {
+                                       leftButtonFlag = false;
+                               }
+
+                               layout.setElabledTouchEvent(true);
+
+                               leftButton.setEnabled(leftButtonFlag);
+                               rightButton.setEnabled(rightButtonFlag);
+                       } else if (status == ScreenStatus.AddNode) {
+                               msgLayout.setVisibility(View.VISIBLE);
+                               msgEditText.setVisibility(View.VISIBLE);
+                               msgButtonLayout.setVisibility(View.VISIBLE);
+                               confirmMsg.setText(getString(R.string.mainAddMsg));
+                               msgEditText.setText("");
+
+                               layout.setElabledTouchEvent(false);
+
+                               leftButton.setEnabled(false);
+                               rightButton.setEnabled(false);
+                       } else if (status == ScreenStatus.DeleteNode) {
+                               msgLayout.setVisibility(View.VISIBLE);
+                               msgEditText.setVisibility(View.GONE);
+                               msgButtonLayout.setVisibility(View.VISIBLE);
+                               confirmMsg.setText(getString(R.string.mainDeleteMsg));
+
+                               layout.setElabledTouchEvent(false);
+
+                               leftButton.setEnabled(false);
+                               rightButton.setEnabled(false);
+                       } else if (status == ScreenStatus.RenameNode) {
+                               msgLayout.setVisibility(View.VISIBLE);
+                               msgEditText.setVisibility(View.VISIBLE);
+                               msgButtonLayout.setVisibility(View.VISIBLE);
+                               confirmMsg.setText(getString(R.string.mainRenameMsg));
+
+                               layout.setElabledTouchEvent(false);
+
+                               leftButton.setEnabled(false);
+                               rightButton.setEnabled(false);
+                       }
+               } catch (Exception e) {
+                       EfException.msg(R.string.ErrorSystem, e);
+               }
+       }
+
 }
\ No newline at end of file