OSDN Git Service

T29631
[everfolder/source.git] / source / workspace / EverFolder / src / com / yuji / ef / EverFolderActivity.java
index b718e1f..b97e7b2 100644 (file)
@@ -8,21 +8,19 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.res.Resources;
 import android.database.sqlite.SQLiteDatabase;
 import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.graphics.PixelFormat;
 import android.os.Bundle;
 import android.text.Editable;
 import android.text.TextWatcher;
-import android.util.DisplayMetrics;
 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.inputmethod.InputMethodManager;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.LinearLayout;
@@ -36,54 +34,77 @@ 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 {
+public class EverFolderActivity extends BaseActivity implements LockListener {
        private enum ScreenStatus {
-               Normal, AddNode, RenameNode
+               Normal, AddNode, DeleteNode, RenameNode
        };
 
+       private EditPrefUtil pref = new EditPrefUtil(this);
+
        private LinearLayout msgLayout;
        private LinearLayout msgButtonLayout;
        private Button msgOkButton;
        private Button msgCancelButton;
-       private EditText mainMsgEditText;
+       private EditText msgEditText;
 
        private IconFrameLayout layout;
        private TextView confirmMsg;
        private IconScrollView scrollView;
+       private LinearLayout buttonLayout;
        private Button leftButton;
        private Button rightButton;
-       // private Button addButton;
-       // private Button deleteButton;
 
        private ScreenStatus status;
        private NodeComparator nodeComparator = new NodeComparator();
+       private BitmapCacheFactory bitmapFactory = BitmapCacheFactory.getInstance();
        private Node top = null;
        private int indent = 0;
+       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.compareTo(Constant.ACTION_UPDATE) == 0) {
-                               LockDao lockDao = (LockDao) LockDao.getInstance();
-                               lock = lockDao.lock(EverFolderActivity.this,
-                                               Constant.LOCK_UPDATE_NOTE);
-                               if (lock) {
-                                       updateList();
+                       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();
                                }
-                               setStatus();
                        }
                }
        };
@@ -96,6 +117,7 @@ public class EverFolderActivity extends BaseActivity {
                try {
                        IntentFilter intentFilter = new IntentFilter();
                        intentFilter.addAction(Constant.ACTION_UPDATE);
+                       intentFilter.addAction(Constant.ACTION_MESSAGE);
                        registerReceiver(receiver, intentFilter);
 
                        scrollView = (IconScrollView) findViewById(R.id.scrollView);
@@ -103,14 +125,13 @@ public class EverFolderActivity extends BaseActivity {
                        layout.setActivity(this);
                        layout.setScrollView(scrollView);
 
+                       buttonLayout = (LinearLayout) findViewById(R.id.mainButtonLayout);
                        leftButton = (Button) findViewById(R.id.leftButton);
                        rightButton = (Button) findViewById(R.id.rightButton);
-                       // addButton = (Button) findViewById(R.id.addButton);
-                       // deleteButton = (Button) findViewById(R.id.deleteButton);
 
                        msgLayout = (LinearLayout) findViewById(R.id.mainMsgLayout);
                        confirmMsg = (TextView) findViewById(R.id.mainConfirmMsg);
-                       mainMsgEditText = (EditText) findViewById(R.id.mainMsgEditText);
+                       msgEditText = (EditText) findViewById(R.id.mainMsgEditText);
                        msgButtonLayout = (LinearLayout) findViewById(R.id.mainMsgButtonLayout);
                        msgOkButton = (Button) findViewById(R.id.mainMsgOkButton);
                        msgCancelButton = (Button) findViewById(R.id.mainMsgCancelButton);
@@ -127,23 +148,15 @@ public class EverFolderActivity extends BaseActivity {
                                        rightButtonOnClick();
                                }
                        });
-                       // addButton.setOnClickListener(new OnClickListener() {
-                       // @Override
-                       // public void onClick(View v) {
-                       // addButtonOnClick();
-                       // }
-                       // });
-                       // deleteButton.setOnClickListener(new OnClickListener() {
-                       // @Override
-                       // public void onClick(View v) {
-                       // deleteButtonOnClick();
-                       // }
-                       // });
 
-                       mainMsgEditText.addTextChangedListener(new TextWatcher() {
+                       msgEditText.addTextChangedListener(new TextWatcher() {
                                public void afterTextChanged(Editable s) {
-                                       String text = s.toString();
-                                       msgOkButton.setEnabled(text.length() > 0);
+                                       if (status != ScreenStatus.DeleteNode) {
+                                               String text = s.toString();
+                                               msgOkButton.setEnabled(text.length() > 0);
+                                       } else {
+                                               msgOkButton.setEnabled(true);
+                                       }
                                }
 
                                public void beforeTextChanged(CharSequence s, int start,
@@ -160,22 +173,32 @@ public class EverFolderActivity extends BaseActivity {
                        msgOkButton.setOnClickListener(new OnClickListener() {
                                @Override
                                public void onClick(View v) {
-                                       msgOkButtonOnClick();
+                                       msgOkButtonOnClick(v);
                                }
                        });
                        msgCancelButton.setOnClickListener(new OnClickListener() {
                                @Override
                                public void onClick(View v) {
-                                       msgCancelOnClick();
+                                       msgCancelOnClick(v);
                                }
                        });
-                       
+
                        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) {
-                       // TODO
-                       e.printStackTrace();
+                       EfException.msg(R.string.ErrorSystem, e);
                }
        }
 
@@ -184,12 +207,18 @@ public class EverFolderActivity extends BaseActivity {
                boolean ret = super.onCreateOptionsMenu(menu);
                int index = 0;
 
-               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "カット");
-               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "ペースト");
-               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "追加");
-               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "削除");
-               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "リネーム");
-               menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "設定");
+               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;
        }
 
@@ -197,6 +226,11 @@ public class EverFolderActivity extends BaseActivity {
        public boolean onMenuOpened(int featureId, Menu menu) {
                boolean ret = super.onMenuOpened(featureId, menu);
 
+               // #29304
+               if (menu == null) {
+                       return false;
+               }
+
                MenuItem item;
 
                boolean cutButtonFlag = false;
@@ -206,30 +240,32 @@ public class EverFolderActivity extends BaseActivity {
                boolean renameButtonFlag = false;
                boolean confButtonFlag = true;
 
-               LabelIconView target = layout.getSelectedTarget();
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
-               long id = -1;
-               Node node = null;
-               if (target != null) {
-                       id = target.getNodeId();
-                       node = dao.searchById(id);
-               }
+               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)) {
-                       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;
+                       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;
@@ -249,6 +285,13 @@ public class EverFolderActivity extends BaseActivity {
                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) {
@@ -320,7 +363,7 @@ public class EverFolderActivity extends BaseActivity {
        }
 
        private void dummy() {
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
+               NodeDaoImpl dao = (NodeDaoImpl) NodeCacheDao.getInstance();
                List<Node> list = dao.search();
                for (Node node : list) {
                        System.out.println(node.toString());
@@ -334,12 +377,13 @@ public class EverFolderActivity extends BaseActivity {
                try {
                        b = dao.lock(this, "key");
                        b = dao.lock(this, "key");
-                       dao.unlock(new Object(), "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) {
                        e.printStackTrace();
@@ -352,18 +396,7 @@ public class EverFolderActivity extends BaseActivity {
        }
 
        private void selectMenuDelete() {
-               FolderUtil util = FolderUtil.getInstance();
-               LabelIconView target = layout.getSelectedTarget();
-               long id = target.getNodeId();
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
-               Node node = dao.searchById(id);
-               if (node != null) {
-                       util.deleteNode(node);
-                       // TODO 三角マークも消さないといけないのでは
-                       layout.removeView(target);
-                       updateList();
-                       setStatus();
-               }
+               setStatus(ScreenStatus.DeleteNode);
        }
 
        private void selectMenuRename() {
@@ -373,11 +406,11 @@ public class EverFolderActivity extends BaseActivity {
                }
 
                long id = target.getNodeId();
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
                Node node = dao.searchById(id);
                if (node != null) {
                        String text = node.getName();
-                       mainMsgEditText.setText(text);
+                       msgEditText.setText(text);
                        setStatus(ScreenStatus.RenameNode);
                }
        }
@@ -411,45 +444,48 @@ public class EverFolderActivity extends BaseActivity {
        }
 
        private void updateList() {
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
                top = dao.searchRoot();
                if (top == null) {
-                       // TODO
+                       // データ0件(データ未更新)
+                       return;
                }
-               layout.removeAllViews();
                updateList(top);
-               layout.refresh();
        }
 
        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 = 80;
-               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) {
@@ -457,8 +493,7 @@ public class EverFolderActivity extends BaseActivity {
                        // }
                        view.setNodeId(node.getId());
                }
-               ScaleUtil scaleUtil = ScaleUtil.getInstance();
-               viewY += M * scaleUtil.getScaledDensity();
+               viewY += M;
 
                if (node.getStatus() != Node.Status.OPEN) {
                        return;
@@ -469,9 +504,19 @@ public class EverFolderActivity extends BaseActivity {
                }
 
                List<Node> list = new ArrayList<Node>();
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
+               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);
@@ -498,40 +543,102 @@ public class EverFolderActivity extends BaseActivity {
                params.y = y;
                v.setLayoutParams(params);
 
-               // LabelIconView siv = v.getStatusImageView();
-               // if (siv != null) {
-               // layout.addView(siv, false);
-               // }
-
                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();
+
+               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) {
-               // updateList();
-               // setStatus();
+               isResult = true;
                isInit = true;
        }
 
        @Override
        protected void onStart() {
                super.onStart();
+       }
 
-               LockDao lockDao = (LockDao) LockDao.getInstance();
-               lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
+       @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;
 
                if (isInit) {
-                       status = ScreenStatus.Normal;
-
-                       if (lock) {
-                               updateList();
-                       } else {
-                               layout.removeAllViews();
-                       }
+                       layout.setVisibility(View.INVISIBLE);
                        setStatus();
-                       isInit = false;
                } else {
+                       // #29589
+                       //// #29421
+                       //updateList();
+                       layout.setVisibility(View.INVISIBLE);
                        setStatus();
                }
        }
@@ -543,7 +650,13 @@ public class EverFolderActivity extends BaseActivity {
                lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
                lock = false;
 
+               if (lockHandler != null){
+                       lockHandler.cancel();
+                       lockHandler = null;
+               }
+               
                super.onPause();
+               isInCycle = false;
        }
 
        private void leftButtonOnClick() {
@@ -573,72 +686,68 @@ public class EverFolderActivity extends BaseActivity {
                }
        }
 
-       // private void addButtonOnClick() {
-       // setStatus(ScreenStatus.AddNode);
-       // }
-       //
-       // private void deleteButtonOnClick() {
-       // FolderUtil util = FolderUtil.getInstance();
-       // LabelIconView target = layout.getSelectedTarget();
-       // long id = target.getNodeId();
-       // NodeDao dao = (NodeDao) NodeDao.getInstance();
-       // Node node = dao.searchById(id);
-       // if (node != null) {
-       // util.deleteNode(node);
-       // // TODO 三角マークも消さないといけないのでは
-       // layout.removeView(target);
-       // updateList();
-       // setStatus();
-       // }
-       // }
-
-       private void msgOkButtonOnClick() {
+       private void msgOkButtonOnClick(View v) {
                FolderUtil util = FolderUtil.getInstance();
                LabelIconView target = layout.getSelectedTarget();
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
 
                if (status == ScreenStatus.AddNode) {
                        long id = target.getNodeId();
                        Node parent = dao.searchById(id);
                        if (parent != null) {
-                               String text = mainMsgEditText.getText().toString();
+                               String text = msgEditText.getText().toString();
                                DirNode node = new DirNode(text, null);
                                util.addDirNode(parent, node);
-                               updateList();
-                               setStatus(ScreenStatus.Normal);
                        }
+                       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 = mainMsgEditText.getText().toString();
+                               String text = msgEditText.getText().toString();
 
                                dao.updateName(node, text);
-                               updateList();
-                               setStatus(ScreenStatus.Normal);
                        }
+                       layout.setCutTarget(null, false);
                }
+
+               closeIME(v);
+
+               layout.clearTarget();
+               updateList();
+               setStatus(ScreenStatus.Normal);
        }
 
-       private void msgCancelOnClick() {
+       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) NodeDao.getInstance();
+                       NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
 
                        if (srcId < 0) {
-                               // TODO
+                               throw new EfException(EfError.NOT_FOUND);
                        }
                        if (dstId < 0) {
-                               // TODO
-                       }
-
-                       if (!isMovable(srcId, dstId)) {
-                               return;
+                               throw new EfException(EfError.NOT_FOUND);
                        }
 
                        Node src = dao.searchById(srcId);
@@ -653,35 +762,35 @@ public class EverFolderActivity extends BaseActivity {
                                // 同じ場所に移動
                                return;
                        }
+                       if (!isFileNode(src) && !isMovable(srcId, dstId)) {
+                               // 再帰的な移動
+                               return;
+                       }
 
                        Node sp = dao.searchById(src.getParent());
                        if (sp == null) {
-                               // TODO
+                               throw new EfException(EfError.NOT_FOUND);
                        }
                        Node dp = null;
-                       if (src.getParent() == dst.getParent()) {
+                       if (src.getParent() == dst.getParent() || dst.getParent() < 0) {
                                dp = sp;
                        } else {
                                dp = dao.searchById(dst.getParent());
                        }
                        if (dp == null) {
-                               // TODO
+                               throw new EfException(EfError.NOT_FOUND);
                        }
 
-                       // TODO DBへのアクセス
-                       // sp.remove(src.getId());
                        SQLiteDatabase db = DatabaseHelper.getInstance()
                                        .getSQLiteDatabase();
                        db.beginTransaction();
                        try {
-                               dao.remoteChildrenIdNT(sp, src.getId());
+                               dao.removeChildrenIdNT(sp, src.getId());
                                if (dst instanceof DirNode) {
-                                       // dst.add(src.getId());
                                        dao.updateParentNT(src, dst.getId());
                                        dao.addChildrenIdNT(dst, src.getId());
                                } else if (dst instanceof FileNode) {
-                                       // dp.add(src.getId());
-                                       dao.updateParentNT(src, dst.getId());
+                                       dao.updateParentNT(src, dp.getId());
                                        dao.addChildrenIdNT(dp, src.getId());
                                }
 
@@ -689,13 +798,15 @@ public class EverFolderActivity extends BaseActivity {
                        } finally {
                                db.endTransaction();
                        }
+               } catch (EfException e) {
+                       EfException.msg(R.string.ErrorSystem, e);
                } finally {
                        updateList();
                }
        }
 
        private boolean isMovable(long srcId, long dstId) {
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
 
                while (dstId >= 0) {
                        if (srcId == dstId) {
@@ -703,7 +814,7 @@ public class EverFolderActivity extends BaseActivity {
                        }
                        Node node = dao.searchById(dstId);
                        if (node == null) {
-                               // TODO エラー
+                               // ERROR
                                return false;
                        }
                        if (!(node instanceof DirNode)) {
@@ -715,25 +826,31 @@ public class EverFolderActivity extends BaseActivity {
        }
 
        public void execute(long id) {
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
+               try {
+                       NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
 
-               Node node = dao.searchById(id);
-               if (node == null) {
-                       // TODO
-               }
-               node.toggleStatus();
-               Status status = node.getStatus();
+                       Node node = dao.searchById(id);
+                       if (node == null) {
+                               throw new EfException(EfError.NOT_FOUND);
+                       }
+                       node.toggleStatus();
+                       Status status = node.getStatus();
 
-               dao.updateStatus(node, status);
+                       dao.updateStatus(node, status);
 
-               removeAllNodeView();
-               updateList();
+                       updateList();
+               } catch (EfException e) {
+                       EfException.msg(R.string.ErrorSystem, e);
+               }
        }
 
        public void executeView(long id) {
-               NodeDao dao = (NodeDao) NodeDao.getInstance();
+               NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
 
                Node node = dao.searchById(id);
+               if (!isFileNode(node)) {
+                       return;
+               }
                String guid = node.getGuid();
 
                EvernoteIntentUtil util = EvernoteIntentUtil.getInstance();
@@ -759,64 +876,73 @@ public class EverFolderActivity extends BaseActivity {
                        }
 
                        if (!lock) {
-                               msgLayout.setVisibility(View.VISIBLE);
-                               confirmMsg.setText("データ更新中"); // TODO
-                               mainMsgEditText.setVisibility(View.GONE);
+                               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);
-                               // mainMsgEditText.setText("");
 
                                boolean leftButtonFlag = true;
                                boolean rightButtonFlag = true;
-                               // boolean addButtonFlag = true;
-                               // boolean deleteButtonFlag = true;
 
                                if (indent <= 0) {
                                        leftButtonFlag = false;
                                }
 
-                               // LabelIconView target = layout.getSelectedTarget();
-                               // NodeDao dao = (NodeDao) NodeDao.getInstance();
-                               // long id = -1;
-                               // Node node = null;
-                               // if (target != null) {
-                               // id = target.getNodeId();
-                               // node = dao.searchById(id);
-                               // }
-                               // if (target == null || node == null || !(node instanceof
-                               // DirNode))
-                               // {
-                               // addButtonFlag = false;
-                               // }
-                               // if (target == null || (node != null && node instanceof
-                               // RootNode))
-                               // {
-                               // deleteButtonFlag = false;
-                               // }
+                               layout.setElabledTouchEvent(true);
 
                                leftButton.setEnabled(leftButtonFlag);
                                rightButton.setEnabled(rightButtonFlag);
-                               // addButton.setEnabled(addButtonFlag);
-                               // deleteButton.setEnabled(deleteButtonFlag);
                        } else if (status == ScreenStatus.AddNode) {
                                msgLayout.setVisibility(View.VISIBLE);
-                               mainMsgEditText.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);
-                               mainMsgEditText.setText("");
+                               confirmMsg.setText(getString(R.string.mainDeleteMsg));
+
+                               layout.setElabledTouchEvent(false);
+
+                               leftButton.setEnabled(false);
+                               rightButton.setEnabled(false);
                        } else if (status == ScreenStatus.RenameNode) {
                                msgLayout.setVisibility(View.VISIBLE);
-                               mainMsgEditText.setVisibility(View.VISIBLE);
+                               msgEditText.setVisibility(View.VISIBLE);
                                msgButtonLayout.setVisibility(View.VISIBLE);
-                               String text = mainMsgEditText.getText().toString();
+                               confirmMsg.setText(getString(R.string.mainRenameMsg));
+
+                               layout.setElabledTouchEvent(false);
+
+                               leftButton.setEnabled(false);
+                               rightButton.setEnabled(false);
                        }
-               } catch (Throwable e) {
-                       // TODO
-                       e.printStackTrace();
+               } catch (Exception e) {
+                       EfException.msg(R.string.ErrorSystem, e);
                }
        }
+
 }
\ No newline at end of file