/*
 * Created on 2006/12/02
 *
 *
 * Copyright(c) 2006 Yoshimasa Matsumoto
 */
package netwatcher.networkcamera.gui;

import java.util.logging.Logger;

import netjfwatcher.common.view.NodeTree;
import netjfwatcher.common.view.NodeTreeGroup;
import netjfwatcher.engine.model.action.ListenerNodeListTree;
import netjfwatcher.engine.model.action.ActionBuilderAlarmList.ActionOpenEditorPartPersonalNodeAlarm;
import netjfwatcher.engine.model.action.ActionBuilderNodeOperation.ActionNodeOperation;
import netjfwatcher.engine.model.action.ActionBuilderNodeOperation.ActionShowNodeView;
import netjfwatcher.engine.nodecontrol.NodeKind;
import netjfwatcher.engine.nodemaneger.list.NodeListTreeView;
import netjfwatcher.engine.socket.info.NodeInformation;
import netwatcherrcpnetworkcamera.actions.ActionBuilderNetworkCamera;
import netwatcherrcpnetworkcamera.actions.ActionBuilderNetworkCamera.ActionNetworkCamera;

import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IWorkbenchActionConstants;


public class NetworkCameratTreeView extends NodeListTreeView {
    /* ロギング */
    private static Logger logger = null;

    /* Network Camera ノード関連のアクション */
    private ActionBuilderNetworkCamera networkCameraAction = new ActionBuilderNetworkCamera();
    /**
     * ノードTreeを表示するViewクラスインスタンスを生成します。
     *
     */
    public NetworkCameratTreeView() {
        logger = Logger.getLogger(this.getClass().getName());
    }

    /**
     * データベースからノード監視情報リストを読み込んでTree表示
     * します。
     *
     */
    protected void initShow() {
        /* ((ActionReloadNodeTreeDatabase) actionNodeTree.
         * actionReloadNodeTreeDatabase()).setNodeTree();
        */
    }

    /**
     * コンテキストメニューを生成します。
     *
     */
    public void createContextMenu() {
        /* メニューマネージャ生成 */
        MenuManager mm = new MenuManager();
        mm.setRemoveAllWhenShown(true);

        /* メニューリスナーをセット */
        mm.addMenuListener(
            new IMenuListener() {
                public void menuAboutToShow(IMenuManager manager) {
                    fillContextMenu(manager);
                }
            });

        Menu menu = mm.createContextMenu(nodeListTreeViewer.getControl());
        nodeListTreeViewer.getControl().setMenu(menu);
        getSite().registerContextMenu(mm, nodeListTreeViewer);
    }



    /**
     * メニューバーを設定します。
     * preWindowOpen後に呼ばれます。
     * ノードTree上のノードを選択している場合と選択していない場合で
     * メニューを変えます。
     *
     * @param manager IMenuManager
     */
    protected void fillContextMenu(IMenuManager manager) {
        /* ノードTree読み込みアクションセット */
        manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));

        /* ノードTree再読み込み */
        manager.add(getActionNodeTreeBuilder().actionReloadNodeTreeDatabase());

        /* ノードTreeソート */
        manager.add(getActionNodeTreeBuilder().actionSortNodeTreeDatabase());

        /*
         * Treeのノードを選択しているかチェック
         */
        if (nodeListTreeViewer.getTree().getSelection() != null) {
            TreeItem[] treeItem = nodeListTreeViewer.getTree().getSelection();

            if ((treeItem != null) && (treeItem.length > 0)) {
                for (
                    int nodeTreeSelectNo = 0;
                        nodeTreeSelectNo < treeItem.length;
                        nodeTreeSelectNo++) {
                    if (
                        treeItem[nodeTreeSelectNo].getData() instanceof NodeTreeGroup) {
                        /* Group選択時 */
                        nodeListTreeViewer.getTree().deselectAll();
                    } else if (
                        treeItem[nodeTreeSelectNo].getData() instanceof NodeTree) {
                        NodeInformation targetNodeInfo =
                            ((NodeTree) treeItem[nodeTreeSelectNo].getData())
                            .getNodeInfo();

                        /* ノード構成定義メニュー追加 */
                        ((ActionShowNodeView) actionBuilderNodeOperation
                        .getActionShowNodeView()).setNodeInfo(targetNodeInfo);
                        manager.add(
                            actionBuilderNodeOperation.getActionShowNodeView());

                        /* ノードAlarmメニュー追加 */
                        ((ActionOpenEditorPartPersonalNodeAlarm) actinAlarm
                        .getActionOpenEditorPartPersonalNodeAlarm())
                        .setNodeInfo(targetNodeInfo);
                        manager.add(
                            actinAlarm.getActionOpenEditorPartPersonalNodeAlarm());


                        /* ノード追加・編集・削除メニュー追加 */
                        ((ActionNodeOperation) actionBuilderNodeOperation
                        .getActionNodeOperation()).setNodeInfo(targetNodeInfo);
                        manager.add(
                            actionBuilderNodeOperation.getActionNodeOperation());


                        
                        if(targetNodeInfo.getNodeKind().equals(NodeKind.CAMERA)) {
                        	/* Network Cameraメニュー追加 */
                            ((ActionNetworkCamera) networkCameraAction.getActionNetworkCamera())
                            .setNodeInfo(targetNodeInfo);
                            manager.add(networkCameraAction.getActionNetworkCamera());
                        }
                    } else {
                        /* Groupでもノードでもない時 */
                        nodeListTreeViewer.getTree().deselectAll();
                    }
                }
            } else {
                /* Tree未選択時 */
                manager.add(
                    actionBuilderNodeOperation.getActionNodeOperation());
            }
        }

        /* SNMP統計情報ビュー表示 */
        manager.add(snmpAction.getActionSnmpStatistics());

        /* 全ノードAlarmビュー表示 */
        manager.add(actinAlarm.getActionShowAllNodeAlarmListTable());
        /* ノード検出ビュー表示 */
        manager.add(actionBuilderNodeDetect.getActionNodeDetectView());
    }

    /**
     * ノードTree Viewの選択リスナーを設定します。
     *
     */
    protected void setupNodeTreeViewListener() {
        /*
         * Node Tree Viewにリスナー登録
         * リスナーの処理としては、
         * テーブルViewにフィード一覧で選択したエレメントを入力値として設定
         *
         */
        nodeListTreeViewer.addSelectionChangedListener(
            new ListenerNodeListTree(false));
    }
}
