com.generalrobotix.ui.view.Grx3DView.java Source code

Java tutorial

Introduction

Here is the source code for com.generalrobotix.ui.view.Grx3DView.java

Source

/*
 * Copyright (c) 2008, AIST, the University of Tokyo and General Robotix Inc.
 * All rights reserved. This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution, and is
 * available at http://www.eclipse.org/legal/epl-v10.html
 * Contributors:
 * General Robotix Inc.
 * National Institute of Advanced Industrial Science and Technology (AIST) 
 */
/*
 *  Grx3DView.java
 *
 *  Copyright (C) 2007 GeneralRobotix, Inc.
 *  All Rights Reserved
 *
 *  @author Yuichiro Kawasumi (General Robotix, Inc.)
 */

package com.generalrobotix.ui.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.GridLayout;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.PopupMenu;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import javax.swing.*;
import javax.media.j3d.*;
import javax.vecmath.*;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContext;
//import org.omg.PortableServer.POAPackage.ObjectNotActive;
//import org.omg.PortableServer.POAPackage.ServantAlreadyActive;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;
import org.eclipse.jface.dialogs.MessageDialog;

//import com.sun.j3d.utils.pickfast.PickCanvas;
import com.sun.j3d.utils.universe.SimpleUniverse;

import jp.go.aist.hrp.simulator.*;
import jp.go.aist.hrp.simulator.OnlineViewerPackage.OnlineViewerException;

import com.generalrobotix.ui.*;
import com.generalrobotix.ui.util.*;
import com.generalrobotix.ui.util.AxisAngle4d;
import com.generalrobotix.ui.item.GrxCollisionPairItem;
import com.generalrobotix.ui.item.GrxLinkItem;
import com.generalrobotix.ui.item.GrxModelItem;
import com.generalrobotix.ui.item.GrxSensorItem;
import com.generalrobotix.ui.item.GrxSimulationItem;
import com.generalrobotix.ui.item.GrxWorldStateItem;
import com.generalrobotix.ui.item.GrxWorldStateItem.CharacterStateEx;
import com.generalrobotix.ui.item.GrxWorldStateItem.WorldStateEx;
import com.generalrobotix.ui.view.tdview.*;
import com.generalrobotix.ui.view.vsensor.Camera_impl;

@SuppressWarnings("serial") //$NON-NLS-1$
public class Grx3DView extends GrxBaseView implements ThreeDDrawable {
    public static final String TITLE = "3DView"; //$NON-NLS-1$
    //  java3D 1.4.1??      
    public static final GraphicsConfiguration graphicsConfiguration = SimpleUniverse.getPreferredConfiguration();
    // items
    private GrxWorldStateItem currentWorld_ = null;
    private List<GrxModelItem> currentModels_ = new ArrayList<GrxModelItem>();
    private List<GrxCollisionPairItem> currentCollisionPairs_ = new ArrayList<GrxCollisionPairItem>();
    private WorldStateEx currentState_ = null;
    private GrxSimulationItem simItem_ = null;
    private final static int VIEW = 0;
    private final static int EDIT = 1;
    private final static int SIMULATION = 2;
    private int viewMode_ = VIEW;
    private double dAngle_ = Math.toRadians(0.1);

    // for scene graph
    private static VirtualUniverse universe_;
    private javax.media.j3d.Locale locale_;
    private BranchGroup bgRoot_;
    private BranchGroup unclickableBgRoot_;

    private BranchGroup rulerBg_;
    private float LineWidth_ = 1.0f;
    private float colprop = 10.0f;
    private float coldiff = 0.1f;

    // for view
    private Canvas3D canvas_;
    private Canvas3D offscreen_;
    private View view_;
    private TransformGroup tgView_;
    private Transform3D t3dViewHome_ = new Transform3D();
    private ViewInfo info_;
    private BehaviorManager behaviorManager_ = new BehaviorManager(manager_);
    private Background backGround_ = new Background(0.0f, 0.0f, 0.0f);
    private double[] default_eye = new double[] { 2.0, 2.0, 0.8 };
    private double[] default_lookat = new double[] { 0.0, 0.0, 0.8 };
    private double[] default_upward = new double[] { 0.0, 0.0, 1.0 };

    // for recording movie
    private RecordingManager recordingMgr_;
    private String lastMovieFileName;

    // UI objects
    private ObjectToolBar objectToolBar_ = new ObjectToolBar();
    private ViewToolBar viewToolBar_ = new ViewToolBar(this);
    private JButton btnHomePos_ = new JButton(new ImageIcon(getClass().getResource("/resources/images/home.png"))); //$NON-NLS-1$
    private JToggleButton btnFloor_ = new JToggleButton(
            new ImageIcon(getClass().getResource("/resources/images/floor.png"))); //$NON-NLS-1$
    private JToggleButton btnCollision_ = new JToggleButton(
            new ImageIcon(getClass().getResource("/resources/images/collision.png"))); //$NON-NLS-1$
    private JToggleButton btnDistance_ = new JToggleButton(
            new ImageIcon(getClass().getResource("/resources/images/distance.png"))); //$NON-NLS-1$
    private JToggleButton btnIntersection_ = new JToggleButton(
            new ImageIcon(getClass().getResource("/resources/images/proximity.png"))); //$NON-NLS-1$
    private JToggleButton btnCoM_ = new JToggleButton(
            new ImageIcon(getClass().getResource("/resources/images/com.png"))); //$NON-NLS-1$
    private JToggleButton btnCoMonFloor_ = new JToggleButton(
            new ImageIcon(getClass().getResource("/resources/images/com_z0.png"))); //$NON-NLS-1$
    private JToggleButton btnRec_ = new JToggleButton(
            new ImageIcon(getClass().getResource("/resources/images/record.png"))); //$NON-NLS-1$
    private JButton btnPlayer_ = new JButton(
            new ImageIcon(getClass().getResource("/resources/images/movie_player.png"))); //$NON-NLS-1$
    private JButton btnRestore_ = new JButton(new ImageIcon(getClass().getResource("/resources/images/undo.png"))); //$NON-NLS-1$
    private JToggleButton btnBBdisp_ = new JToggleButton(
            new ImageIcon(getClass().getResource("/resources/images/AABB.png")));

    private JLabel lblMode_ = new JLabel(MessageBundle.get("Grx3DView.label.view")); //$NON-NLS-1$
    private JLabel lblTarget_ = new JLabel(""); //$NON-NLS-1$
    private JLabel lblValue_ = new JLabel(""); //$NON-NLS-1$

    private Shape3D collision_;
    private Shape3D distance_;
    private Vector<GrxLinkItem> intersectingLinks_;

    private boolean showActualState_ = true;

    // for "Linux resize problem"
    Frame frame_;
    Composite comp;

    public Grx3DView(String name, GrxPluginManager manager, GrxBaseViewPart vp, Composite parent) {
        super(name, manager, vp, parent);
        isScrollable_ = false;

        //----
        // Linux??????
        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=168330

        comp = new Composite(getComposite(), SWT.EMBEDDED);
        frame_ = SWT_AWT.new_Frame(comp);

        comp.addControlListener(new ControlListener() {
            public void controlMoved(ControlEvent e) {
            }

            public void controlResized(ControlEvent e) {
                frame_.setBounds(0, 0, comp.getSize().x, comp.getSize().y);
            }
        });

        //----

        //----
        // JCombo??????
        // http://www.eclipsezone.com/forums/thread.jspa?messageID=92230432&
        // JPanel????AWT?Panel?
        Panel contentPane = new Panel();

        //----

        frame_.add(contentPane);

        contentPane.setLayout(new BorderLayout());
        contentPane.setBackground(Color.lightGray);
        //contentPane.setAlignmentX(JPanel.LEFT_ALIGNMENT);

        lblMode_.setForeground(Color.black);
        lblMode_.setFont(new Font("Monospaced", Font.BOLD, 12)); //$NON-NLS-1$
        lblMode_.setPreferredSize(new Dimension(300, 20));

        lblTarget_.setForeground(Color.white);
        lblTarget_.setFont(new Font("Monospaced", Font.BOLD, 12)); //$NON-NLS-1$
        lblTarget_.setPreferredSize(new Dimension(500, 20));

        lblValue_.setForeground(Color.white);
        lblValue_.setFont(new Font("Monospaced", Font.BOLD, 12)); //$NON-NLS-1$
        lblValue_.setPreferredSize(new Dimension(300, 20));

        JPanel southPanel = new JPanel();
        southPanel.setLayout(new GridLayout(1, 0));
        southPanel.add(lblMode_);
        Box clipPanel = Box.createHorizontalBox();
        JLabel clipDistLabel0 = new JLabel(MessageBundle.get("Grx3DView.label.clipDistance0"));
        JLabel clipDistLabel1 = new JLabel(MessageBundle.get("Grx3DView.label.clipDistance1"));
        final TextField frontText = new TextField(6);
        final TextField backText = new TextField(6);
        frontText.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                String str = frontText.getText();
                try {
                    info_.frontClipDistance = Double.parseDouble(str);
                    view_.setFrontClipDistance(info_.frontClipDistance);
                } catch (NumberFormatException e) {
                    frontText.setText(String.valueOf(info_.frontClipDistance));
                }
            }
        });
        backText.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                String str = backText.getText();
                try {
                    info_.backClipDistance = Double.parseDouble(str);
                    view_.setBackClipDistance(info_.backClipDistance);
                } catch (NumberFormatException e) {
                    backText.setText(String.valueOf(info_.backClipDistance));
                }
            }
        });

        clipPanel.add(clipDistLabel0);
        clipPanel.add(frontText);
        clipPanel.add(clipDistLabel1);
        clipPanel.add(backText);
        southPanel.add(clipPanel);

        canvas_ = new Canvas3D(graphicsConfiguration);
        canvas_.setDoubleBufferEnable(true);
        canvas_.addKeyListener(new ModelEditKeyAdapter());
        _setupSceneGraph();

        frontText.setText(String.valueOf(info_.frontClipDistance));
        backText.setText(String.valueOf(info_.backClipDistance));
        JPanel mainPane = new JPanel(new BorderLayout());
        mainPane.setBackground(Color.black);
        contentPane.add(southPanel, BorderLayout.SOUTH);
        mainPane.add(canvas_, BorderLayout.CENTER);
        contentPane.add(mainPane, BorderLayout.CENTER);

        _setupToolBars();
        contentPane.add(objectToolBar_, BorderLayout.WEST);
        contentPane.add(viewToolBar_, BorderLayout.NORTH);

        collision_ = new Shape3D();
        collision_.setPickable(false);
        collision_.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
        try {
            Appearance app = new Appearance();
            LineAttributes latt = new LineAttributes();
            latt.setLineWidth(LineWidth_);
            app.setLineAttributes(latt);
            collision_.setAppearance(app);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        BranchGroup bg = new BranchGroup();
        bg.addChild(collision_);
        bgRoot_.addChild(bg);

        distance_ = new Shape3D();
        distance_.setPickable(false);
        distance_.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
        try {
            Appearance app = new Appearance();
            LineAttributes latt = new LineAttributes();
            latt.setLineWidth(LineWidth_);
            app.setLineAttributes(latt);
            distance_.setAppearance(app);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        BranchGroup bgDistance = new BranchGroup();
        bgDistance.addChild(distance_);
        bgRoot_.addChild(bgDistance);

        intersectingLinks_ = new Vector<GrxLinkItem>();

        setScrollMinSize(SWT.DEFAULT, SWT.DEFAULT);

        //setup
        behaviorManager_.setThreeDViewer(this);
        behaviorManager_.setViewIndicator(viewToolBar_);
        behaviorManager_.setItem(currentModels_, currentCollisionPairs_);
        behaviorManager_.initDynamicsSimulator();
        behaviorManager_.setOperationMode(BehaviorManager.OPERATION_MODE_NONE);
        behaviorManager_.setViewMode(BehaviorManager.ROOM_VIEW_MODE);
        behaviorManager_.setViewHandlerMode("button_mode_rotation"); //$NON-NLS-1$
        behaviorManager_.replaceWorld(null);
        viewToolBar_.setMode(ViewToolBar.ROOM_MODE);
        viewToolBar_.setOperation(ViewToolBar.ROTATE);

        registerCORBA();

        setUp();
        manager_.registerItemChangeListener(this, GrxModelItem.class);
        manager_.registerItemChangeListener(this, GrxWorldStateItem.class);
        manager_.registerItemChangeListener(this, GrxCollisionPairItem.class);
        manager_.registerItemChangeListener(this, GrxSimulationItem.class);

    }

    public void setUp() {
        Iterator<GrxModelItem> it = currentModels_.iterator();
        while (it.hasNext()) {
            GrxModelItem model = it.next();
            if (model.bgRoot_.isLive())
                model.bgRoot_.detach();
            model.deleteObserver(this);
        }
        currentModels_ = manager_.<GrxModelItem>getSelectedItemList(GrxModelItem.class);
        currentCollisionPairs_ = manager_.<GrxCollisionPairItem>getSelectedItemList(GrxCollisionPairItem.class);
        behaviorManager_.setItem(currentModels_, currentCollisionPairs_);
        it = currentModels_.iterator();
        boolean modelModified = false;
        while (it.hasNext()) {
            GrxModelItem model = it.next();
            bgRoot_.addChild(model.bgRoot_);
            model.setWireFrame(viewToolBar_.isWireFrameSelected());
            modelModified |= model.isModified();
            model.addObserver(this);
        }
        if (modelModified)
            optionButtonEnable(false);
        else
            optionButtonEnable(true);
        if (btnBBdisp_.isSelected()) {
            btnBBdisp_.doClick();
        }

        if (currentWorld_ != null) {
            currentWorld_.deleteObserver(this);
            currentWorld_.deletePosObserver(this);
        }
        currentWorld_ = manager_.<GrxWorldStateItem>getSelectedItem(GrxWorldStateItem.class, null);
        if (currentWorld_ != null) {
            currentState_ = currentWorld_.getValue(currentWorld_.getPosition());
            currentWorld_.addObserver(this);
            currentWorld_.addPosObserver(this);
        } else
            currentState_ = null;
        if (currentState_ == null)
            updateViewSimulator(0);
        else
            updatePosition(currentWorld_, currentWorld_.getPosition());
        showOption();

        if (simItem_ != null)
            simItem_.deleteObserver(this);
        simItem_ = manager_.<GrxSimulationItem>getSelectedItem(GrxSimulationItem.class, null);
        if (simItem_ != null) {
            simItem_.addObserver(this);
            if (simItem_.isSimulating())
                viewMode_ = SIMULATION;
        }
        if (viewMode_ == SIMULATION) {
            disableButton();
            objectToolBar_.setMode(ObjectToolBar.DISABLE_MODE);
        }
    }

    private void _setupSceneGraph() {
        universe_ = new VirtualUniverse();
        locale_ = new javax.media.j3d.Locale(universe_);
        bgRoot_ = new BranchGroup();

        bgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
        bgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
        bgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);

        //locale_.addBranchGraph(_createView());
        bgRoot_.addChild(_createLights());
        bgRoot_.addChild(_createView());
        bgRoot_.compile();
        locale_.addBranchGraph(bgRoot_);

        unclickableBgRoot_ = new BranchGroup();
        unclickableBgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
        unclickableBgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
        unclickableBgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);

        locale_.addBranchGraph(unclickableBgRoot_);
    }

    private BranchGroup _createView() {
        BranchGroup bg = new BranchGroup();
        ViewPlatform platform = new ViewPlatform();
        info_ = new ViewInfo(ViewInfo.VIEW_MODE_ROOM | ViewInfo.FRONT_VIEW, 3.0);
        view_ = new View();
        view_.setScreenScalePolicy(View.SCALE_EXPLICIT);
        view_.setScreenScale(0.1);
        tgView_ = new TransformGroup();

        view_.setPhysicalBody(new PhysicalBody());
        view_.setPhysicalEnvironment(new PhysicalEnvironment());
        view_.setFrontClipPolicy(View.VIRTUAL_EYE);
        view_.setBackClipPolicy(View.VIRTUAL_EYE);
        view_.setFrontClipDistance(info_.frontClipDistance);
        view_.setBackClipDistance(info_.backClipDistance);
        view_.setProjectionPolicy(View.PERSPECTIVE_PROJECTION);
        view_.setFieldOfView(Math.PI / 4);
        view_.addCanvas3D(canvas_);

        tgView_.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
        tgView_.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
        tgView_.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        tgView_.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        tgView_.setCapability(TransformGroup.ALLOW_LOCAL_TO_VWORLD_READ);

        view_.attachViewPlatform(platform);
        tgView_.addChild(platform);
        bg.addChild(tgView_);

        _setViewHomePosition();

        return bg;
    }

    private BranchGroup _createLights() {
        BranchGroup bg = new BranchGroup();
        DirectionalLight[] light = new DirectionalLight[4];
        TransformGroup[] tg = new TransformGroup[4];
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);

        //DirectionalLight dlight = new DirectionalLight(new Color3f(1.0f, 1.0f, 1.0f), new Vector3f(-0.8f, -1.2f, -1.5f));
        //dlight.setInfluencingBounds(bounds);
        //tgView_.addChild(dlight);

        light[0] = new DirectionalLight(true, // lightOn
                new Color3f(0.7f, 0.7f, 0.7f), // color
                new Vector3f(0.0f, 0.0f, -1.0f) // direction
        );

        light[1] = new DirectionalLight(true, // lightOn
                new Color3f(0.4f, 0.4f, 0.4f), // color
                new Vector3f(0.0f, 0.0f, -1.0f) // direction
        );

        light[2] = new DirectionalLight(true, // lightOn
                new Color3f(0.7f, 0.7f, 0.7f), // color
                new Vector3f(0.0f, 0.0f, -1.0f) // direction
        );

        light[3] = new DirectionalLight(true, // lightOn
                new Color3f(0.4f, 0.4f, 0.4f), // color
                new Vector3f(0.0f, 0.0f, -1.0f) // direction
        );

        for (int i = 0; i < 4; i++) {
            light[i].setInfluencingBounds(bounds);
            tg[i] = new TransformGroup();
            bg.addChild(tg[i]);
            tg[i].addChild(light[i]);
        }

        Transform3D transform = new Transform3D();
        Vector3d pos = new Vector3d();
        AxisAngle4d rot = new AxisAngle4d();

        pos.set(10.0, 10.0, 5.0);
        transform.set(pos);
        rot.set(-0.5, 0.5, 0.0, 1.2);
        transform.set(rot);
        tg[0].setTransform(transform);

        pos.set(10.0, -10.0, -5.0);
        transform.set(pos);
        rot.set(0.5, 0.5, 0.0, 3.14 - 1.2);
        transform.set(rot);
        tg[1].setTransform(transform);

        pos.set(-10.0, -10.0, 5.0);
        transform.set(pos);
        rot.set(0.5, -0.5, 0.0, 1.2);
        transform.set(rot);
        tg[2].setTransform(transform);

        pos.set(-10.0, 10.0, -5.0);
        transform.set(pos);
        rot.set(-0.5, -0.5, 0.0, 3.14 - 1.2);
        transform.set(rot);
        tg[3].setTransform(transform);

        // Ambient Light for Alert
        AmbientLight alight = new AmbientLight(new Color3f(1.0f, 1.0f, 1.0f));
        alight.setInfluencingBounds(bounds);
        tg[0].addChild(alight);

        // background
        backGround_.setCapability(Background.ALLOW_COLOR_READ);
        backGround_.setCapability(Background.ALLOW_COLOR_WRITE);
        backGround_.setApplicationBounds(bounds);
        bg.addChild(backGround_);

        return bg;
    }

    private void _setupToolBars() {
        btnHomePos_.setToolTipText(MessageBundle.get("Grx3DView.text.goHomeEyePos")); //$NON-NLS-1$
        btnHomePos_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                tgView_.setTransform(t3dViewHome_);
            }
        });
        btnHomePos_.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent arg0) {
            }

            public void mouseEntered(MouseEvent arg0) {
            }

            public void mouseExited(MouseEvent arg0) {
            }

            public void mousePressed(MouseEvent arg0) {
                if (arg0.getButton() == MouseEvent.BUTTON2 || arg0.getButton() == MouseEvent.BUTTON3) {
                    PopupMenu popupMenu = new PopupMenu();
                    final MenuItem menu0 = new MenuItem(MessageBundle.get("Grx3DView.popupmenu.setHomeEyePos"));
                    menu0.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                            if (arg0.getSource() == menu0) {
                                tgView_.getTransform(t3dViewHome_);
                                final double[] eyeHomePosition = new double[16];
                                t3dViewHome_.get(eyeHomePosition);
                                syncExec(new Runnable() {
                                    public void run() {
                                        setDblAry("eyeHomePosition", eyeHomePosition, 5); //$NON-NLS-1$ //$NON-NLS-2$
                                    }
                                });
                            }
                        }
                    });
                    final MenuItem menu1 = new MenuItem(MessageBundle.get("Grx3DView.popupmenu.restoreDefault"));
                    menu1.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                            if (arg0.getSource() == menu1) {
                                _setViewHomePosition();
                                final double[] eyeHomePosition = new double[16];
                                t3dViewHome_.get(eyeHomePosition);
                                syncExec(new Runnable() {
                                    public void run() {
                                        setDblAry("eyeHomePosition", eyeHomePosition, 5); //$NON-NLS-1$ //$NON-NLS-2$
                                    }
                                });
                            }
                        }
                    });
                    popupMenu.add(menu0);
                    popupMenu.add(menu1);
                    btnHomePos_.add(popupMenu);
                    popupMenu.show(btnHomePos_, arg0.getX(), arg0.getY());
                }
            }

            public void mouseReleased(MouseEvent arg0) {
            }
        });

        btnFloor_.setToolTipText(MessageBundle.get("Grx3DView.text,showZPlane")); //$NON-NLS-1$
        btnFloor_.setSelected(false);
        btnFloor_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                if (btnFloor_.isSelected()) {
                    btnFloor_.setToolTipText(MessageBundle.get("Grx3DView.text.hideZPlane")); //$NON-NLS-1$
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showScale", "true"); //$NON-NLS-1$ //$NON-NLS-2$
                        }
                    });
                    if (bgRoot_.indexOfChild(getRuler()) == -1)
                        bgRoot_.addChild(getRuler());
                } else {
                    btnFloor_.setToolTipText(MessageBundle.get("Grx3DView.text.showZPlane")); //$NON-NLS-1$
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showScale", "false"); //$NON-NLS-1$ //$NON-NLS-2$
                        }
                    });
                    if (bgRoot_.indexOfChild(getRuler()) != -1)
                        getRuler().detach();
                }
            }
        });

        btnCollision_.setToolTipText(MessageBundle.get("Grx3DView.text.showCollision")); //$NON-NLS-1$
        btnCollision_.setSelected(false);
        btnCollision_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                if (btnCollision_.isSelected()) {
                    btnCollision_.setToolTipText(MessageBundle.get("Grx3DView.text.hideCollision")); //$NON-NLS-1$
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showCollision", "true"); //$NON-NLS-1$ //$NON-NLS-2$
                        }
                    });
                    if (viewMode_ == SIMULATION || (viewMode_ == VIEW && currentState_ != null))
                        _showCollision(currentState_.collisions);
                    else
                        _showCollision(behaviorManager_.getCollision());
                } else {
                    btnCollision_.setToolTipText(MessageBundle.get("Grx3DView.text.showCollision")); //$NON-NLS-1$
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showCollision", "false"); //$NON-NLS-1$ //$NON-NLS-2$
                        }
                    });
                    _showCollision(null);
                }
            }
        });

        btnDistance_.setToolTipText(MessageBundle.get("Grx3DView.text.showDistance")); //$NON-NLS-1$
        btnDistance_.setSelected(false);
        btnDistance_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                if (btnDistance_.isSelected()) {
                    btnDistance_.setToolTipText(MessageBundle.get("Grx3DView.text.hideDistance")); //$NON-NLS-1$
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showDistance", "true");
                        }
                    });
                    if (viewMode_ != SIMULATION)
                        _showDistance(behaviorManager_.getDistance());
                } else {
                    btnDistance_.setToolTipText(MessageBundle.get("Grx3DView.text.showDistance")); //$NON-NLS-1$
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showDistance", "false");
                        }
                    });
                    _showDistance(null);
                }
            }
        });

        btnIntersection_.setToolTipText(MessageBundle.get("Grx3DView.text.checkIntersection")); //$NON-NLS-1$
        btnIntersection_.setSelected(false);
        btnIntersection_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                if (btnIntersection_.isSelected()) {
                    btnIntersection_.setToolTipText(MessageBundle.get("Grx3DView.text.nocheckIntersection")); //$NON-NLS-1$
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showIntersection", "true");
                        }
                    });
                    if (viewMode_ != SIMULATION)
                        _showIntersection(behaviorManager_.getIntersection());
                } else {
                    btnIntersection_.setToolTipText(MessageBundle.get("Grx3DView.text.checkIntersection")); //$NON-NLS-1$
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showIntersection", "false");
                        }
                    });
                    _showIntersection(null);
                }
            }
        });

        btnCoM_.setToolTipText(MessageBundle.get("Grx3DView.text.showCom")); //$NON-NLS-1$
        btnCoM_.setSelected(false);
        btnCoM_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                boolean b = btnCoM_.isSelected();
                for (int i = 0; i < currentModels_.size(); i++)
                    currentModels_.get(i).setVisibleCoM(b);
                if (b)
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showCoM", "true");
                        }
                    });
                else
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showCoM", "false");
                        }
                    });
            };
        });

        btnCoMonFloor_.setToolTipText(MessageBundle.get("Grx3DView.text.showcomFloor")); //$NON-NLS-1$
        btnCoMonFloor_.setSelected(false);
        btnCoMonFloor_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                boolean b = btnCoMonFloor_.isSelected();
                for (int i = 0; i < currentModels_.size(); i++)
                    currentModels_.get(i).setVisibleCoMonFloor(b);
                if (b)
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showCoMonFloor", "true");
                        }
                    });
                else
                    syncExec(new Runnable() {
                        public void run() {
                            setProperty("showCoMonFloor", "false");
                        }
                    });
            };
        });

        btnRec_.setToolTipText(MessageBundle.get("Grx3DView.text.record")); //$NON-NLS-1$
        btnRec_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (btnRec_.isSelected()) {
                    if (currentWorld_ != null && currentWorld_.getLogSize() > 0)
                        rec();
                    else
                        btnRec_.setSelected(false);
                } else {
                    btnRec_.setSelected(false);
                }
            }
        });

        btnPlayer_.setToolTipText(MessageBundle.get("Grx3DView.text.moviePlayer")); //$NON-NLS-1$
        btnPlayer_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Display.getDefault().syncExec(new Runnable() {
                    public void run() {
                        new SWTMoviePlayer(getParent().getShell(), lastMovieFileName);
                    }
                });

            }
        });

        final JButton btnCamera = new JButton("C"); //$NON-NLS-1$
        btnCamera.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < currentModels_.size(); i++) {
                    List<Camera_impl> l = currentModels_.get(i).getCameraSequence();
                    for (int j = 0; j < l.size(); j++) {
                        Camera_impl c = l.get(j);
                        c.setVisible(!c.isVisible());
                    }
                }
            }
        });

        btnBBdisp_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                boolean b = btnBBdisp_.isSelected();
                if (b) {
                    List<GrxModelItem> visibleModels = setNumOfAABB();
                    Iterator<GrxModelItem> it = visibleModels.iterator();
                    while (it.hasNext())
                        it.next().setVisibleAABB(b);
                    if (visibleModels.isEmpty())
                        btnBBdisp_.setSelected(false);
                } else
                    for (int i = 0; i < currentModels_.size(); i++)
                        currentModels_.get(i).setVisibleAABB(b);
            }
        });

        viewToolBar_.add(btnHomePos_, 0);
        viewToolBar_.add(btnFloor_, 8);
        viewToolBar_.add(btnCollision_, 9);
        viewToolBar_.add(btnDistance_, 10);
        viewToolBar_.add(btnIntersection_, 11);
        viewToolBar_.add(btnCoM_, 12);
        viewToolBar_.add(btnCoMonFloor_, 13);
        viewToolBar_.add(btnRec_);
        viewToolBar_.add(btnPlayer_);
        viewToolBar_.add(btnCamera);
        viewToolBar_.add(btnBBdisp_);

        btnRestore_.setToolTipText(MessageBundle.get("Grx3DView.text.restoreModel")); //$NON-NLS-1$
        btnRestore_.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < currentModels_.size(); i++) {
                    final GrxModelItem item = currentModels_.get(i);
                    syncExec(new Runnable() {
                        public void run() {
                            item.restoreProperties();
                        }
                    });

                }
                showOption();
            }
        });

        objectToolBar_.add(btnRestore_, 0);
        objectToolBar_.setOrientation(JToolBar.VERTICAL);

        JToolBar bars[] = new JToolBar[] { viewToolBar_, objectToolBar_ };
        for (int i = 0; i < bars.length; i++) {
            JToolBar bar = bars[i];
            bar.setFloatable(false);
            for (int j = 0; j < bar.getComponentCount(); j++) {
                Component c = bar.getComponent(j);
                if (c instanceof AbstractButton) {
                    AbstractButton b = (AbstractButton) c;
                    b.setPreferredSize(GrxBaseView.getDefaultButtonSize());
                    b.setMaximumSize(GrxBaseView.getDefaultButtonSize());
                }
            }
        }

        _registerAction();
    }

    public Canvas3D getCanvas3D() {
        return canvas_;
    }

    public BranchGroup getBranchGroupRoot() {
        return bgRoot_;
    }

    private void _setViewHomePosition() {
        t3dViewHome_.lookAt(new Point3d(default_eye), new Point3d(default_lookat), new Vector3d(default_upward));
        t3dViewHome_.invert();
        tgView_.setTransform(t3dViewHome_);
    }

    public void restoreProperties() {
        super.restoreProperties();
        if (getStr("showScale") == null)
            propertyChanged("showScale", "true");
        if (getStr("showCollision") == null)
            propertyChanged("showCollision", "true");
        if (getStr("showDistance") == null)
            propertyChanged("showDistance", "false");
        if (getStr("showIntersection") == null)
            propertyChanged("showIntersection", "false");
        if (getStr("showCoM") == null)
            propertyChanged("showCoM", "false");
        if (getStr("showCoMonFloor") == null)
            propertyChanged("showCoMonFloor", "false");
        if (getStr("view.mode") == null)
            propertyChanged("view.mode", ViewToolBar.COMBO_SELECT_ROOM);
        if (getStr("showActualState") == null)
            propertyChanged("showActualState", "true");
        if (getStr("eyeHomePosition") == null) {
            final double[] eyeHomePosition = new double[16];
            _setViewHomePosition();
            t3dViewHome_.get(eyeHomePosition);
            syncExec(new Runnable() {
                public void run() {
                    setDblAry("eyeHomePosition", eyeHomePosition, 5); //$NON-NLS-1$ //$NON-NLS-2$
                }
            });
            propertyChanged("eyeHomePosiotion", getProperty("eyeHomePosition"));
        }
    }

    public void registerItemChange(GrxBaseItem item, int event) {
        if (item instanceof GrxModelItem) {
            GrxModelItem modelItem = (GrxModelItem) item;
            switch (event) {
            case GrxPluginManager.SELECTED_ITEM:
                if (!modelItem.bgRoot_.isLive()) {
                    modelItem.setWireFrame(viewToolBar_.isWireFrameSelected());
                    bgRoot_.addChild(modelItem.bgRoot_);
                    currentModels_.add(modelItem);
                    behaviorManager_.setItem(currentModels_, currentCollisionPairs_);
                    if (viewMode_ == VIEW && currentState_ != null) {
                        updateModels(currentState_);
                        updateViewSimulator(currentState_.time);
                    } else
                        updateViewSimulator(0);
                    if (modelItem.isModified())
                        optionButtonEnable(false);
                    showOption();
                    if (btnBBdisp_.isSelected()) {
                        btnBBdisp_.doClick();
                    }
                    modelItem.addObserver(this);
                }
                break;
            case GrxPluginManager.REMOVE_ITEM:
            case GrxPluginManager.NOTSELECTED_ITEM:
                if (modelItem.bgRoot_.isLive()) {
                    modelItem.bgRoot_.detach();
                    currentModels_.remove(modelItem);
                    behaviorManager_.setItem(currentModels_, currentCollisionPairs_);
                    if (modelItem.isModified())
                        optionButtonEnable(true);
                    showOption();
                    modelItem.deleteObserver(this);
                }
                //if(currentModels_.size()==0)
                //   _showCollision(null);
                break;
            default:
                break;
            }
        } else if (item instanceof GrxWorldStateItem) {
            GrxWorldStateItem worldStateItem = (GrxWorldStateItem) item;
            switch (event) {
            case GrxPluginManager.SELECTED_ITEM:
                if (currentWorld_ != worldStateItem) {
                    currentWorld_ = worldStateItem;
                    currentWorld_.addObserver(this);
                    currentWorld_.addPosObserver(this);
                    currentState_ = currentWorld_.getValue();
                    updatePosition(currentWorld_, currentWorld_.getPosition());
                }
                break;
            case GrxPluginManager.REMOVE_ITEM:
            case GrxPluginManager.NOTSELECTED_ITEM:
                if (currentWorld_ == worldStateItem) {
                    currentWorld_.deleteObserver(this);
                    currentWorld_.deletePosObserver(this);
                    currentWorld_ = null;
                    currentState_ = null;
                }
                break;
            default:
                break;
            }
        } else if (item instanceof GrxCollisionPairItem) {
            GrxCollisionPairItem collisionPairItem = (GrxCollisionPairItem) item;
            switch (event) {
            case GrxPluginManager.SELECTED_ITEM:
                if (!currentCollisionPairs_.contains(collisionPairItem)) {
                    currentCollisionPairs_.add(collisionPairItem);
                    behaviorManager_.setItem(currentModels_, currentCollisionPairs_);
                    showOption();
                }
                break;
            case GrxPluginManager.REMOVE_ITEM:
            case GrxPluginManager.NOTSELECTED_ITEM:
                if (currentCollisionPairs_.contains(collisionPairItem)) {
                    currentCollisionPairs_.remove(collisionPairItem);
                    behaviorManager_.setItem(currentModels_, currentCollisionPairs_);
                    showOption();
                }
                break;
            }
        } else if (item instanceof GrxSimulationItem) {
            GrxSimulationItem simItem = (GrxSimulationItem) item;
            switch (event) {
            case GrxPluginManager.SELECTED_ITEM:
                if (simItem_ != simItem) {
                    simItem_ = simItem;
                    simItem_.addObserver(this);
                }
                break;
            case GrxPluginManager.REMOVE_ITEM:
            case GrxPluginManager.NOTSELECTED_ITEM:
                if (simItem_ == simItem) {
                    simItem_.deleteObserver(this);
                    simItem_ = null;
                }
                break;
            default:
                break;
            }
        }
    }

    public void update(GrxBasePlugin plugin, Object... arg) {
        if (simItem_ == plugin) {
            if ((String) arg[0] == "StartSimulation") { //$NON-NLS-1$
                disableButton();
                objectToolBar_.setMode(ObjectToolBar.DISABLE_MODE);
                if ((Boolean) arg[1])
                    showViewSimulator(true);
                viewMode_ = SIMULATION;
            } else if ((String) arg[0] == "StopSimulation") { //$NON-NLS-1$
                objectToolBar_.setMode(ObjectToolBar.OBJECT_MODE);
                enableButton();
                viewMode_ = VIEW;
            }
        } else if (currentModels_.contains(plugin)) {
            if ((String) arg[0] == "PropertyChange") {
                if ((String) arg[1] == "name") {
                    behaviorManager_.setItemChange();
                    showOption();
                }
                if (((String) arg[1]).contains("translation") || ((String) arg[1]).contains("rotation")
                        || ((String) arg[1]).contains("angle"))
                    showOption();
            } else if ((String) arg[0] == "BodyInfoChange") {
                behaviorManager_.setItemChange();
                showOption();
            } else if ((String) arg[0] == "Modified") {
                optionButtonEnable(false);
            } else if ((String) arg[0] == "ClearModified") {
                optionButtonEnable(true);
            }
        } else if (currentWorld_ == plugin) {
            if ((String) arg[0] == "ClearLog") { //$NON-NLS-1$
                currentState_ = null;
            }
        }
    }

    public void updatePosition(GrxBasePlugin plugin, Integer arg_pos) {
        if (currentWorld_ != plugin)
            return;

        if (viewMode_ == VIEW || viewMode_ == SIMULATION) {
            int pos = arg_pos.intValue();
            currentState_ = currentWorld_.getValue(pos);
            if (currentState_ != null) {
                _showCollision(currentState_.collisions);
                updateModels(currentState_);
                updateViewSimulator(currentState_.time);
            }
            if (viewMode_ == VIEW)
                showOptionWithoutCollision();
        }
    }

    private void disableButton() {
        disableOperation();
        if (btnDistance_.isSelected())
            btnDistance_.doClick();
        if (btnIntersection_.isSelected())
            btnIntersection_.doClick();
        btnDistance_.setEnabled(false);
        btnIntersection_.setEnabled(false);
        btnRestore_.setEnabled(false);
        btnRec_.setEnabled(false);
        btnPlayer_.setEnabled(false);
    }

    private void enableButton() {
        btnDistance_.setEnabled(true);
        btnIntersection_.setEnabled(true);
        btnRestore_.setEnabled(true);
        btnRec_.setEnabled(true);
        btnPlayer_.setEnabled(true);
    }

    public void showOption() {
        if (viewMode_ == SIMULATION)
            return;
        if (btnCollision_.isSelected()) {
            _showCollision(behaviorManager_.getCollision());
            behaviorManager_.setMessageSkip(true);
        }
        if (btnDistance_.isSelected()) {
            _showDistance(behaviorManager_.getDistance());
            behaviorManager_.setMessageSkip(true);
        }
        if (btnIntersection_.isSelected()) {
            _showIntersection(behaviorManager_.getIntersection());
        }
        behaviorManager_.setMessageSkip(false);
    }

    private void showOptionWithoutCollision() {
        if (viewMode_ == SIMULATION)
            return;
        if (btnDistance_.isSelected()) {
            _showDistance(behaviorManager_.getDistance());
            behaviorManager_.setMessageSkip(true);
        }
        if (btnIntersection_.isSelected()) {
            _showIntersection(behaviorManager_.getIntersection());
        }
        behaviorManager_.setMessageSkip(false);
    }

    public void showViewSimulator(boolean b) {
        for (int i = 0; i < currentModels_.size(); i++) {
            List<Camera_impl> l = currentModels_.get(i).getCameraSequence();
            for (int j = 0; j < l.size(); j++) {
                Camera_impl c = l.get(j);
                c.setVisible(b);
            }
        }
    }

    public void updateModels(WorldStateEx state) {
        // update models with new WorldState
        for (int i = 0; i < currentModels_.size(); i++) {
            GrxModelItem model = currentModels_.get(i);
            CharacterStateEx charStat = state.get(model.getName());
            if (charStat != null) {
                if (charStat.sensorState != null) {
                    double[] angles;
                    if (showActualState_) {
                        angles = charStat.sensorState.q;
                    } else {
                        angles = charStat.targetState;
                    }
                    model.setCharacterPos(charStat.position, angles);
                    if (charStat.sensorState.range != null && charStat.sensorState.range.length > 0) {
                        List<GrxSensorItem> sensors = model.getSensors("Range"); //$NON-NLS-1$
                        for (int j = 0; j < sensors.size(); j++) {
                            GrxSensorItem sensor = sensors.get(j);
                            if (sensor.isVisible() && sensor.id_ >= 0
                                    && sensor.id_ < charStat.sensorState.range.length) {
                                sensor.updateShapeOfVisibleArea(charStat.sensorState.range[sensor.id_]);
                            }
                        }
                    }
                } else
                    model.setCharacterPos(charStat.position, null);
            }
        }
    }

    private void rec() {
        RecordingDialog dialog = new RecordingDialog(frame_, currentWorld_.getTime(currentWorld_.getLogSize() - 1));
        if (dialog.showModalDialog() != ModalDialog.OK_BUTTON) {
            btnRec_.setSelected(false);
            return;
        }

        Dimension canvasSize = dialog.getImageSize();
        int framerate = 10;
        try {
            framerate = dialog.getFrameRate();
        } catch (Exception NumberFormatException) {
            new ErrorDialog(frame_, MessageBundle.get("Grx3DView.dialog.title.error"), //$NON-NLS-1$
                    MessageBundle.get("Grx3DView.dialog.message.error")).showModalDialog(); //$NON-NLS-1$
            btnRec_.setSelected(false);
            return;
        }
        double playbackRate = dialog.getPlaybackRate();

        GrxDebugUtil.println("ScreenSize: " + canvasSize.width + "x" + canvasSize.height + " (may be)"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

        BufferedImage image = new BufferedImage(canvasSize.width, canvasSize.height, BufferedImage.TYPE_INT_ARGB);
        // ???
        ImageComponent2D buffer = new ImageComponent2D(ImageComponent.FORMAT_RGBA, image, true, false);
        buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);

        // ?
        offscreen_ = new Canvas3D(graphicsConfiguration, true);
        offscreen_.setOffScreenBuffer(buffer);
        view_.addCanvas3D(offscreen_);

        Screen3D screen = canvas_.getScreen3D();
        offscreen_.getScreen3D().setSize(screen.getSize());
        offscreen_.getScreen3D().setPhysicalScreenWidth(screen.getPhysicalScreenWidth());
        offscreen_.getScreen3D().setPhysicalScreenHeight(screen.getPhysicalScreenHeight());

        recordingMgr_ = RecordingManager.getInstance();
        recordingMgr_.setImageSize(canvasSize.width, canvasSize.height);
        recordingMgr_.setFrameRate((float) framerate);

        String fileName = dialog.getFileName();
        if (new File(fileName).exists()) {
            if (!fileOverwriteDialog(fileName)) {
                btnRec_.setSelected(false);
                return;
            }
        }

        lastMovieFileName = pathToURL(fileName);
        ComboBoxDialog cmb = new ComboBoxDialog(frame_, MessageBundle.get("Grx3DView.dialog.title.videoFormat"), //$NON-NLS-1$
                MessageBundle.get("Grx3DView.dialog.message.videoFormat"), //$NON-NLS-1$
                recordingMgr_.preRecord(lastMovieFileName, ImageToMovie.QUICKTIME));
        String format__ = (String) cmb.showComboBoxDialog();
        if (format__ == null) {
            btnRec_.setSelected(false);
            return;
        }

        try {
            if (!recordingMgr_.startRecord(format__)) {
                btnRec_.setSelected(false);
                return;
            }
        } catch (Exception e) {
            GrxDebugUtil.printErr("Grx3DView.rec():", e); //$NON-NLS-1$
            syncExec(new Runnable() {
                public void run() {
                    MessageDialog.openError(comp.getShell(), MessageBundle.get("Grx3DView.dialog.title.error"), //$NON-NLS-1$
                            MessageBundle.get("Grx3DView.dialog.message.recError")); //$NON-NLS-1$
                }
            });
            btnRec_.setSelected(false);
            return;
        }

        disableButton();
        viewMode_ = VIEW;
        objectToolBar_.setMode(ObjectToolBar.DISABLE_MODE);

        final double stepTime = 1.0 / framerate * playbackRate;
        double startTime = dialog.getStartTime();
        double endTime = dialog.getEndTime();
        final int startPosition = currentWorld_.getPositionAt(startTime);
        final int endPosition = currentWorld_.getPositionAt(endTime);
        Thread recThread_ = new Thread() {
            public void run() {
                try {
                    double playRateLogTime_ = currentWorld_.getTime(startPosition);
                    for (int position = startPosition; position <= endPosition; position++) {
                        if (!btnRec_.isSelected())
                            break;
                        double time = currentWorld_.getTime(position);
                        if (time >= playRateLogTime_) {
                            playRateLogTime_ += stepTime;
                            final int _position = position;
                            syncExec(new Runnable() {
                                public void run() {
                                    currentWorld_.setPosition(_position);
                                }
                            });
                            _doRecording();
                        }
                    }
                    stopRecording();
                } catch (Exception e) {
                    syncExec(new Runnable() {
                        public void run() {
                            MessageDialog.openError(comp.getShell(),
                                    MessageBundle.get("Grx3DView.dialog.title.error"), //$NON-NLS-1$
                                    MessageBundle.get("Grx3DView.dialog.message.recException")); //$NON-NLS-1$
                        }
                    });
                    stopRecording();
                    GrxDebugUtil.printErr("Recording Interrupted by Exception:", e); //$NON-NLS-1$
                }
            }
        };

        recThread_.start();
    }

    private void stopRecording() {
        recordingMgr_.endRecord();
        btnRec_.setSelected(false);
        view_.removeCanvas3D(offscreen_);
        syncExec(new Runnable() {
            public void run() {
                MessageDialog.openInformation(comp.getShell(),
                        MessageBundle.get("Grx3DView.dialog.title.Infomation"), //$NON-NLS-1$
                        MessageBundle.get("Grx3DView.dialog.message.recFinish")); //$NON-NLS-1$
            }
        });
        objectToolBar_.setMode(ObjectToolBar.OBJECT_MODE);
        enableButton();
    }

    private boolean ret_;

    private boolean fileOverwriteDialog(final String fileName) {
        if (new File(fileName).isDirectory())
            return false;

        syncExec(new Runnable() {
            public void run() {
                ret_ = MessageDialog.openConfirm(comp.getShell(),
                        MessageBundle.get("Grx3DView.dialog.title.fileExist"), //$NON-NLS-1$
                        fileName + " " + MessageBundle.get("Grx3DView.dialog.message.fileExist")); //$NON-NLS-1$ //$NON-NLS-2$
            }
        });
        if (ret_)
            return true;
        else
            return false;
    }

    private String pathToURL(String path) {
        if (path.startsWith("file:///")) { //$NON-NLS-1$
            //String filePath = path.substring(8);
            path = path.replace(java.io.File.separatorChar, '/');
            return path;
        }
        if (path.startsWith("http://")) { //$NON-NLS-1$
            return path;
        }
        if (!path.startsWith(java.io.File.separator) && (path.indexOf(':') != 1)) {
            path = System.getProperty("user.dir") + java.io.File.separator + path; //$NON-NLS-1$
        }
        if (path.indexOf(':') == 1) {
            path = path.replace(java.io.File.separatorChar, '/');
            return "file:///" + path; //$NON-NLS-1$
        }
        return "file://" + path; //$NON-NLS-1$
    }

    private void _doRecording() {
        offscreen_.renderOffScreenBuffer();
        offscreen_.waitForOffScreenRendering();
        recordingMgr_.pushImage(offscreen_.getOffScreenBuffer().getImage());
    }

    public void _showCollision(Collision[] collisions) {
        collision_.removeAllGeometries();
        if (collisions == null || collisions.length <= 0 || !btnCollision_.isSelected())
            return;

        int length = 0;
        for (int i = 0; i < collisions.length; i++) {
            if (collisions[i].points != null)
                length += collisions[i].points.length;
        }
        if (length > 0) {
            CollisionPoint[] cd = new CollisionPoint[length];
            for (int i = 0, n = 0; i < collisions.length; i++) {
                for (int j = 0; j < collisions[i].points.length; j++)
                    cd[n++] = collisions[i].points[j];
            }

            Point3d[] p3d = new Point3d[cd.length * 2];
            for (int j = 0; j < cd.length; j++) {
                p3d[j * 2] = new Point3d(cd[j].position);

                Vector3d pole = new Vector3d(cd[j].normal);
                pole.normalize();
                float depth = (float) cd[j].idepth * colprop + coldiff;
                p3d[j * 2 + 1] = new Point3d(cd[j].position[0] + pole.x * depth, cd[j].position[1] + pole.y * depth,
                        cd[j].position[2] + pole.z * depth);
            }

            LineArray la = new LineArray(p3d.length, LineArray.COLOR_3 | LineArray.COORDINATES | LineArray.NORMALS);
            la.setCoordinates(0, p3d);

            Vector3f[] v3f = new Vector3f[p3d.length];
            Color3f[] c3f = new Color3f[p3d.length];
            for (int i = 0; i < v3f.length; i++) {
                v3f[i] = new Vector3f(0.0f, 0.0f, 1.0f);
                if ((i % 2) == 0)
                    c3f[i] = new Color3f(0.0f, 0.8f, 0.8f);
                else
                    c3f[i] = new Color3f(0.8f, 0.0f, 0.8f);
            }
            la.setNormals(0, v3f);
            la.setColors(0, c3f);
            collision_.addGeometry(la);
        } else {
            collision_.addGeometry(null);
        }
    }

    private void _showDistance(Distance[] distances) {
        distance_.removeAllGeometries();
        if (distances == null || distances.length <= 0 || !btnDistance_.isSelected())
            return;

        int length = distances.length;

        if (length > 0) {
            Point3d[] p3d = new Point3d[length * 2];
            for (int j = 0; j < length; j++) {
                p3d[j * 2] = new Point3d(distances[j].point0);
                p3d[j * 2 + 1] = new Point3d(distances[j].point1);
            }

            LineArray la = new LineArray(p3d.length, LineArray.COLOR_3 | LineArray.COORDINATES | LineArray.NORMALS);
            la.setCoordinates(0, p3d);

            Vector3f[] v3f = new Vector3f[p3d.length];
            Color3f[] c3f = new Color3f[p3d.length];
            for (int i = 0; i < v3f.length; i++) {
                v3f[i] = new Vector3f(0.0f, 0.0f, 1.0f);
                c3f[i] = new Color3f(1.0f, 0.0f, 0.0f);
            }
            la.setNormals(0, v3f);
            la.setColors(0, c3f);
            distance_.addGeometry(la);
        } else {
            distance_.addGeometry(null);
        }
    }

    @SuppressWarnings("unchecked") //$NON-NLS-1$
    private void _showIntersection(LinkPair[] pairs) {
        if (pairs == null) {
            for (int i = 0; i < intersectingLinks_.size(); i++) {
                intersectingLinks_.get(i).restoreColor();
            }
            intersectingLinks_.clear();
            return;
        } else {
            Map<String, GrxModelItem> modelMap = (Map<String, GrxModelItem>) manager_
                    .getItemMap(GrxModelItem.class);
            Vector<GrxLinkItem> links = new Vector<GrxLinkItem>();
            for (int i = 0; i < pairs.length; i++) {
                GrxModelItem m1 = modelMap.get(pairs[i].charName1);
                if (m1 != null) {
                    GrxLinkItem l = m1.getLink(pairs[i].linkName1);
                    if (l != null) {
                        links.add(l);
                        if (!intersectingLinks_.contains(l)) {
                            l.setColor(java.awt.Color.RED);
                        }
                    }
                }
                GrxModelItem m2 = modelMap.get(pairs[i].charName2);
                if (m2 != null) {
                    GrxLinkItem l = m2.getLink(pairs[i].linkName2);
                    if (l != null)
                        links.add(l);
                    if (!intersectingLinks_.contains(l)) {
                        l.setColor(java.awt.Color.RED);
                    }
                }
            }
            for (int i = 0; i < intersectingLinks_.size(); i++) {
                GrxLinkItem l = intersectingLinks_.get(i);
                if (!links.contains(l)) {
                    l.restoreColor();
                }
            }
            intersectingLinks_ = links;
        }
    }

    public void updateViewSimulator(double time) {
        for (int i = 0; i < currentModels_.size(); i++) {
            List<Camera_impl> l = currentModels_.get(i).getCameraSequence();
            for (int j = 0; j < l.size(); j++) {
                Camera_impl c = l.get(j);
                if (c.isVisible())
                    c.updateView(time);
            }
        }
    }

    public BranchGroup getRuler() {
        if (rulerBg_ == null) {
            rulerBg_ = new BranchGroup();
            rulerBg_.setCapability(BranchGroup.ALLOW_DETACH);
            int n = 40; // number of lines
            Point3d[] p = new Point3d[n * 4];
            double width = n / 2.0;
            for (int i = 0; i < n; i++) {
                p[2 * i] = new Point3d(-width + i, -width, 0.0);
                p[2 * i + 1] = new Point3d(-width + i, width, 0.0);
                p[2 * i + n * 2] = new Point3d(-width, -width + i, 0.0);
                p[2 * i + n * 2 + 1] = new Point3d(width, -width + i, 0.0);
            }
            LineArray geometry = new LineArray(p.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3);
            geometry.setCoordinates(0, p);
            for (int i = 0; i < p.length; i++)
                geometry.setColor(i, new Color3f(Color.white));

            Shape3D shape = new Shape3D(geometry);
            shape.setPickable(false);
            rulerBg_.addChild(shape);
            rulerBg_.compile();
        }
        return rulerBg_;
    }

    public boolean registerCORBA() {
        NamingContext rootnc = GrxCorbaUtil.getNamingContext();

        OnlineViewer_impl olvImpl = new OnlineViewer_impl();
        OnlineViewer olv = olvImpl._this(manager_.orb_);//GrxCorbaUtil.getORB());
        NameComponent[] path1 = { new NameComponent("OnlineViewer", "") }; //$NON-NLS-1$ //$NON-NLS-2$
        ViewSimulator_impl viewImpl = new ViewSimulator_impl();
        ViewSimulator view = viewImpl._this(manager_.orb_);//GrxCorbaUtil.getORB());
        NameComponent[] path2 = { new NameComponent("ViewSimulator", "") }; //$NON-NLS-1$ //$NON-NLS-2$
        // ViewSimulatorFactory_impl  viewImplFactory = new ViewSimulatorFactory_impl();
        // ViewSimulatorFactory viewFactory = viewImplFactory._this(manager_.orb_);//GrxCorbaUtil.getORB());
        // NameComponent[] path3 = {new NameComponent("ViewSimulatorFactory", "")}; //$NON-NLS-1$ //$NON-NLS-2$
        try {
            rootnc.rebind(path1, olv);
            rootnc.rebind(path2, view);
            //rootnc.rebind(path3, viewFactory);
        } catch (Exception ex) {
            GrxDebugUtil.println("3DVIEW : failed to bind to localhost NameService"); //$NON-NLS-1$
            return false;
        }

        GrxDebugUtil.println("3DVIEW : successfully bound to localhost NameService"); //$NON-NLS-1$
        return true;
    }

    public void unregisterCORBA() {
        NamingContext rootnc = GrxCorbaUtil.getNamingContext();
        NameComponent[] path1 = { new NameComponent("OnlineViewer", "") };
        NameComponent[] path2 = { new NameComponent("ViewSimulator", "") };
        // NameComponent[] path3 = {new NameComponent("ViewSimulatorFactory", "")};
        try {
            rootnc.unbind(path1);
            rootnc.unbind(path2);
            //rootnc.unbind(path3);
            GrxDebugUtil.println("3DVIEW : successfully unbound to localhost NameService");
        } catch (Exception ex) {
            GrxDebugUtil.println("3DVIEW : failed to unbind to localhost NameService");
        }
    }

    private class ModelEditKeyAdapter extends KeyAdapter {
        public void keyPressed(KeyEvent arg0) {
            GrxLinkItem li = null;
            GrxBaseItem bitem = manager_.focusedItem();
            if (bitem instanceof GrxLinkItem) {
                li = (GrxLinkItem) bitem;
            } else {
                arg0.consume();
                return;
            }
            GrxModelItem item = li.model();

            KeyStroke ks = KeyStroke.getKeyStrokeForEvent(arg0);
            if (ks == KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0) || ks == KeyStroke.getKeyStroke(KeyEvent.VK_K, 0)) {
                int next = li.jointId_ - 1;
                if (next >= 0) {
                    for (int j = 0; j < item.links_.size(); j++) {
                        if (next == item.links_.get(j).jointId_) {
                            behaviorManager_.setPickTarget(item.links_.get(j).tg_);
                            break;
                        }
                    }
                }
            } else if (ks == KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)
                    || ks == KeyStroke.getKeyStroke(KeyEvent.VK_J, 0)) {
                int next = li.jointId_ + 1;
                for (int j = 0; j < item.links_.size(); j++) {
                    if (next == item.links_.get(j).jointId_) {
                        behaviorManager_.setPickTarget(item.links_.get(j).tg_);
                        break;
                    }
                }
            } else if (ks == KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.SHIFT_MASK)
                    || ks == KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.SHIFT_MASK)) {
                li.jointValue(li.jointValue_ - dAngle_);

                if (li.llimit_[0] < li.ulimit_[0])
                    li.jointValue(Math.max(li.jointValue_, li.llimit_[0]));
                item.calcForwardKinematics();
                item.setProperty(li.getName() + ".angle", String.valueOf(li.jointValue_)); //$NON-NLS-1$

            } else if (ks == KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.SHIFT_MASK)
                    || ks == KeyStroke.getKeyStroke(KeyEvent.VK_L, KeyEvent.SHIFT_MASK)) {
                li.jointValue(li.jointValue_ + dAngle_);
                if (li.llimit_[0] < li.ulimit_[0])
                    li.jointValue(Math.min(li.jointValue_, li.ulimit_[0]));
                item.calcForwardKinematics();
                item.setProperty(li.getName() + ".angle", String.valueOf(li.jointValue_)); //$NON-NLS-1$

            } else if (ks == KeyStroke.getKeyStroke(KeyEvent.VK_H, 0)
                    || ks == KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)) {
                li.jointValue(li.jointValue_ - dAngle_ * 20);
                if (li.llimit_[0] < li.ulimit_[0])
                    li.jointValue(Math.max(li.jointValue_, li.llimit_[0]));
                item.calcForwardKinematics();
                item.setProperty(li.getName() + ".angle", String.valueOf(li.jointValue_)); //$NON-NLS-1$

            } else if (ks == KeyStroke.getKeyStroke(KeyEvent.VK_L, 0)
                    || ks == KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0)) {
                li.jointValue(li.jointValue_ + dAngle_ * 20);
                if (li.llimit_[0] < li.ulimit_[0])
                    li.jointValue(Math.min(li.jointValue_, li.ulimit_[0]));
                item.calcForwardKinematics();
                item.setProperty(li.getName() + ".angle", String.valueOf(li.jointValue_)); //$NON-NLS-1$
            }
            arg0.consume();
        }
    }

    /*
        private class ViewSimulatorFactory_impl extends ViewSimulatorFactoryPOA{
        
          public ViewSimulator create() {
     ViewSimulator_impl viewImpl = new ViewSimulator_impl();
     try {
        manager_.poa_.activate_object(viewImpl);
     } catch (ServantAlreadyActive e) {
        e.printStackTrace();
     } catch (WrongPolicy e) {
        e.printStackTrace();
     }
     return viewImpl._this(manager_.orb_);
          }
        
          public void shutdown() {
          }
               
        }
    */
    private class ViewSimulator_impl extends ViewSimulatorPOA {
        public void destroy() {
            /*
            byte[] id;
            try {
             id = manager_.poa_.servant_to_id(this);
             manager_.poa_.deactivate_object(id);
            } catch (ServantNotActive e) {
                
             e.printStackTrace();
            } catch (WrongPolicy e) {
                
             e.printStackTrace();
            } catch (ObjectNotActive e) {
                
             e.printStackTrace();
            }
            */
        }

        public void getCameraSequence(CameraSequenceHolder arg0) {
            List<Camera_impl> allList = new ArrayList<Camera_impl>();
            for (int i = 0; i < currentModels_.size(); i++) {
                List<Camera_impl> l = currentModels_.get(i).getCameraSequence();
                allList.addAll(l);
            }

            arg0.value = new Camera[allList.size()];
            for (int i = 0; i < allList.size(); i++) {
                try {
                    arg0.value[i] = CameraHelper.narrow(manager_.poa_.servant_to_reference(allList.get(i)));
                } catch (ServantNotActive e) {
                    e.printStackTrace();
                } catch (WrongPolicy e) {
                    e.printStackTrace();
                }
            }
        }

        public void getCameraSequenceOf(String objectName, CameraSequenceHolder arg1) {
            for (int i = 0; i < currentModels_.size(); i++) {
                GrxModelItem item = currentModels_.get(i);
                if (item.getName().equals(objectName)) {
                    List<Camera_impl> l = item.getCameraSequence();
                    arg1.value = new Camera[l.size()];
                    for (int j = 0; j < l.size(); j++) {
                        try {
                            arg1.value[j] = CameraHelper.narrow(manager_.poa_.servant_to_reference(l.get(j)));
                        } catch (ServantNotActive e) {
                            e.printStackTrace();
                        } catch (WrongPolicy e) {
                            e.printStackTrace();
                        }
                    }
                    return;
                }
            }
            arg1.value = new Camera[0];
        }

        public void registerCharacter(final String name, final BodyInfo bInfo) {
            syncExec(new Runnable() {
                public void run() {
                    GrxBaseItem newItem = manager_.createItem(GrxModelItem.class, name);
                    if (newItem != null) {
                        manager_.itemChange(newItem, GrxPluginManager.ADD_ITEM);
                        manager_.setSelectedItem(newItem, true);
                        ((GrxModelItem) newItem).registerCharacter(bInfo);
                        ((GrxModelItem) newItem).setURL(bInfo.url());
                    }
                }
            });
        }

        public void updateScene(WorldState worldState) {
            final WorldStateEx statex = new WorldStateEx(worldState);
            syncExec(new Runnable() {
                public void run() {
                    updateModels(statex);
                    updateViewSimulator(0);
                }
            });
        }
    }

    private class OnlineViewer_impl extends OnlineViewerPOA {
        private double prevTime = 0.0;
        private boolean firstTime_ = true;
        private double logTimeStep_ = 0.0;
        private boolean updateTimer_ = false;
        private GrxBaseItem newItem = null;

        public void clearLog() {
            if (currentWorld_ != null) {
                syncExec(new Runnable() {
                    public void run() {
                        currentWorld_.clearLog();
                    }
                });
                currentState_ = null;
            }
            firstTime_ = true;
        }

        public void load(final String name, String url) throws OnlineViewerException {
            System.out.println(name + ":" + url); //$NON-NLS-1$
            final String url0 = url;
            try {
                URL u = new URL(url);
                final String url_ = u.getFile();
                syncExec(new Runnable() {
                    public void run() {
                        newItem = manager_.loadItem(GrxModelItem.class, name, url_);
                        if (newItem != null) {
                            manager_.itemChange(newItem, GrxPluginManager.ADD_ITEM);
                            manager_.setSelectedItem(newItem, true);
                        }
                    }
                });
            } catch (MalformedURLException e) {
                e.printStackTrace();
                syncExec(new Runnable() {
                    public void run() {
                        MessageDialog.openError(comp.getShell(), MessageBundle.get("Grx3DView.dialog.title.error"), //$NON-NLS-1$
                                MessageBundle.get("OnlineViewer.dialog.message.MalformedURLException")); //$NON-NLS-1$
                    }
                });
                throw new OnlineViewerException("Malformed URL Exception");
            }
            if (newItem == null) {
                syncExec(new Runnable() {
                    public void run() {
                        MessageDialog.openError(comp.getShell(), MessageBundle.get("Grx3DView.dialog.title.error"), //$NON-NLS-1$
                                url0 + MessageBundle.get("OnlineViewer.dialog.message.loadError")); //$NON-NLS-1$
                    }
                });
                throw new OnlineViewerException(url + "cannot be loaded.");
            }
        }

        public boolean getPosture(String name, DblSequenceHolder posture) {
            Object obj = manager_.getItem(GrxModelItem.class, name);
            if (obj != null) {
                GrxModelItem model = (GrxModelItem) obj;
                posture.value = model.getJointValues();
                return true;
            }
            posture.value = new double[0];
            return false;
        }

        public void update(WorldState arg0) {
            final GrxWorldStateItem.WorldStateEx statex = new GrxWorldStateItem.WorldStateEx(arg0);
            if (currentWorld_ == null) {
                syncExec(new Runnable() {
                    public void run() {
                        GrxWorldStateItem item = (GrxWorldStateItem) manager_.createItem(GrxWorldStateItem.class,
                                null);
                        manager_.itemChange(item, GrxPluginManager.ADD_ITEM);
                        manager_.setSelectedItem(item, true);
                    }
                });
            }
            if (firstTime_) {
                firstTime_ = false;
                prevTime = 0.0;
                logTimeStep_ = 0.0;
                String[] chars = statex.characters();
                for (int i = 0; i < chars.length; i++) {
                    GrxModelItem model = (GrxModelItem) manager_.getItem(GrxModelItem.class, chars[i]);
                    BodyInfo bodyInfo = model.getBodyInfo();
                    if (bodyInfo == null)
                        return;
                    currentWorld_.registerCharacter(chars[i], bodyInfo);
                }
                syncExec(new Runnable() {
                    public void run() {
                        if (statex.time > 0) {
                            logTimeStep_ = statex.time;
                            currentWorld_.setDbl("logTimeStep", logTimeStep_); //$NON-NLS-1$
                        }
                    }
                });
            }

            final double stepTime = statex.time - prevTime;
            if (stepTime > 0 && Math.abs(stepTime - logTimeStep_) > 10e-9) {
                logTimeStep_ = stepTime;
                syncExec(new Runnable() {
                    public void run() {
                        currentWorld_.setDbl("logTimeStep", logTimeStep_); //$NON-NLS-1$
                    }
                });
            }

            currentWorld_.addValue(statex.time, statex);
            Thread.yield();
            if (!updateTimer_) {
                java.util.Timer timer = new java.util.Timer();
                timer.schedule(new updateView(), 20);
                updateTimer_ = true;
            }
            prevTime = statex.time;
        }

        public void clearData() {
        }

        public void drawScene(WorldState arg0) {
            GrxWorldStateItem.WorldStateEx statex = new GrxWorldStateItem.WorldStateEx(arg0);
            _showCollision(statex.collisions);
            updateModels(statex);
            updateViewSimulator(statex.time);
        }

        public void setLineScale(float arg0) {
        }

        public void setLineWidth(float arg0) {
        }

        private class updateView extends java.util.TimerTask {
            public void run() {
                updateTimer_ = false;
                final int pos = currentWorld_.getLogSize() - 1;
                syncExec(new Runnable() {
                    public void run() {
                        currentWorld_.setPosition(pos);
                    }
                });
            }
        }

        public void setLogName(final String name) {
            syncExec(new Runnable() {
                public void run() {
                    GrxWorldStateItem item = (GrxWorldStateItem) manager_.getItem(GrxWorldStateItem.class, name);
                    if (item == null) {
                        item = (GrxWorldStateItem) manager_.createItem(GrxWorldStateItem.class, name);
                        manager_.itemChange(item, GrxPluginManager.ADD_ITEM);
                        firstTime_ = true;
                    }
                    manager_.setSelectedItem(item, true);
                }
            });
        }
    }

    public void attach(BranchGroup bg) {
        bgRoot_.addChild(bg);
    }

    public void attachUnclickable(BranchGroup bg) {
        unclickableBgRoot_.addChild(bg);
    }

    public String getFullName() {
        return getName();
    }

    public TransformGroup getTransformGroupRoot() {
        return tgView_;
    }

    public ViewInfo getViewInfo() {
        return info_;
    }

    public void setDirection(int dir) {
    }

    public void setTransform(Transform3D transform) {
        tgView_.setTransform(transform);
    }

    public void setViewMode(int mode) {
    }

    private void _registerAction() {
        GUIAction.ROOM_VIEW.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                info_.setViewMode(ViewInfo.VIEW_MODE_ROOM);
                view_.setProjectionPolicy(View.PERSPECTIVE_PROJECTION);
                behaviorManager_.setViewMode(BehaviorManager.ROOM_VIEW_MODE);
                viewToolBar_.setMode(ViewToolBar.ROOM_MODE);
                syncExec(new Runnable() {
                    public void run() {
                        setProperty("view.mode", ViewToolBar.COMBO_SELECT_ROOM); //$NON-NLS-1$
                    }
                });
            }
        });

        GUIAction.WALK_VIEW.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                info_.setViewMode(ViewInfo.VIEW_MODE_WALK);
                view_.setProjectionPolicy(View.PERSPECTIVE_PROJECTION);
                behaviorManager_.setViewMode(BehaviorManager.WALK_VIEW_MODE);
                viewToolBar_.setMode(ViewToolBar.WALK_MODE);
                syncExec(new Runnable() {
                    public void run() {
                        setProperty("view.mode", ViewToolBar.COMBO_SELECT_WALK); //$NON-NLS-1$
                    }
                });
            }
        });

        GUIAction.FRONT_VIEW.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (info_.getDirection() != ViewInfo.FRONT_VIEW)
                    info_.setDirection(ViewInfo.FRONT_VIEW);
                info_.setViewMode(ViewInfo.VIEW_MODE_PARALLEL);
                view_.setProjectionPolicy(View.PARALLEL_PROJECTION);
                setTransform(info_.getTransform());
                behaviorManager_.setViewMode(BehaviorManager.PARALLEL_VIEW_MODE);
                viewToolBar_.setMode(ViewToolBar.PARALLEL_MODE);
                syncExec(new Runnable() {
                    public void run() {
                        setProperty("view.mode", ViewToolBar.COMBO_SELECT_FRONT); //$NON-NLS-1$
                    }
                });
            }
        });

        GUIAction.BACK_VIEW.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (info_.getDirection() != ViewInfo.BACK_VIEW)
                    info_.setDirection(ViewInfo.BACK_VIEW);
                info_.setViewMode(ViewInfo.VIEW_MODE_PARALLEL);
                view_.setProjectionPolicy(View.PARALLEL_PROJECTION);
                setTransform(info_.getTransform());
                behaviorManager_.setViewMode(BehaviorManager.PARALLEL_VIEW_MODE);
                viewToolBar_.setMode(ViewToolBar.PARALLEL_MODE);
                syncExec(new Runnable() {
                    public void run() {
                        setProperty("view.mode", ViewToolBar.COMBO_SELECT_BACK); //$NON-NLS-1$
                    }
                });
            }
        });

        GUIAction.LEFT_VIEW.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (info_.getDirection() != ViewInfo.LEFT_VIEW)
                    info_.setDirection(ViewInfo.LEFT_VIEW);
                info_.setViewMode(ViewInfo.VIEW_MODE_PARALLEL);
                view_.setProjectionPolicy(View.PARALLEL_PROJECTION);
                setTransform(info_.getTransform());
                behaviorManager_.setViewMode(BehaviorManager.PARALLEL_VIEW_MODE);
                viewToolBar_.setMode(ViewToolBar.PARALLEL_MODE);
                syncExec(new Runnable() {
                    public void run() {
                        setProperty("view.mode", ViewToolBar.COMBO_SELECT_LEFT); //$NON-NLS-1$
                    }
                });
            }
        });

        GUIAction.RIGHT_VIEW.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (info_.getDirection() != ViewInfo.RIGHT_VIEW)
                    info_.setDirection(ViewInfo.RIGHT_VIEW);
                info_.setViewMode(ViewInfo.VIEW_MODE_PARALLEL);
                view_.setProjectionPolicy(View.PARALLEL_PROJECTION);
                setTransform(info_.getTransform());
                behaviorManager_.setViewMode(BehaviorManager.PARALLEL_VIEW_MODE);
                viewToolBar_.setMode(ViewToolBar.PARALLEL_MODE);
                syncExec(new Runnable() {
                    public void run() {
                        setProperty("view.mode", ViewToolBar.COMBO_SELECT_RIGHT); //$NON-NLS-1$
                    }
                });
            }
        });

        GUIAction.TOP_VIEW.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (info_.getDirection() != ViewInfo.TOP_VIEW)
                    info_.setDirection(ViewInfo.TOP_VIEW);
                info_.setViewMode(ViewInfo.VIEW_MODE_PARALLEL);
                view_.setProjectionPolicy(View.PARALLEL_PROJECTION);
                setTransform(info_.getTransform());
                behaviorManager_.setViewMode(BehaviorManager.PARALLEL_VIEW_MODE);
                viewToolBar_.setMode(ViewToolBar.PARALLEL_MODE);
                syncExec(new Runnable() {
                    public void run() {
                        setProperty("view.mode", ViewToolBar.COMBO_SELECT_TOP); //$NON-NLS-1$
                    }
                });
            }
        });

        GUIAction.BOTTOM_VIEW.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (info_.getDirection() != ViewInfo.BOTTOM_VIEW)
                    info_.setDirection(ViewInfo.BOTTOM_VIEW);
                info_.setViewMode(ViewInfo.VIEW_MODE_PARALLEL);
                view_.setProjectionPolicy(View.PARALLEL_PROJECTION);
                setTransform(info_.getTransform());
                behaviorManager_.setViewMode(BehaviorManager.PARALLEL_VIEW_MODE);
                viewToolBar_.setMode(ViewToolBar.PARALLEL_MODE);
                syncExec(new Runnable() {
                    public void run() {
                        setProperty("view.mode", ViewToolBar.COMBO_SELECT_BOTTOM); //$NON-NLS-1$
                    }
                });
            }
        });
        GUIAction.VIEW_ZOOM_MODE.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                behaviorManager_.setViewHandlerMode("button_mode_zoom"); //$NON-NLS-1$
                // viewHandlerMode_[currentViewer_] = "button_mode_zoom";
                viewToolBar_.setOperation(ViewToolBar.ZOOM);
                //objectToolBar_.selectNone();
                //lblMode_.setText("[ VIEW ]");
            }
        });

        GUIAction.VIEW_ROTATION_MODE.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                behaviorManager_.setViewHandlerMode("button_mode_rotation"); //$NON-NLS-1$
                // viewHandlerMode_[currentViewer_] = "button_mode_rotation";
                viewToolBar_.setOperation(ViewToolBar.ROTATE);
                //objectToolBar_.selectNone();
                //lblMode_.setText("[ VIEW ]");
            }
        });

        GUIAction.VIEW_PAN_MODE.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                behaviorManager_.setViewHandlerMode("button_mode_translation"); //$NON-NLS-1$
                // viewHandlerMode_[currentViewer_] = "button_mode_translation";
                viewToolBar_.setOperation(ViewToolBar.PAN);
                //objectToolBar_.selectNone();
                //lblMode_.setText("[ VIEW ]");
            }
        });

        GUIAction.WIRE_FRAME.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Iterator<?> it = manager_.getItemMap(GrxModelItem.class).values().iterator();
                while (it.hasNext()) {
                    ((GrxModelItem) it.next()).setWireFrame(viewToolBar_.isWireFrameSelected());
                }
            }
        });

        GUIAction.BG_COLOR.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // Bring up a color chooser
                /*
                Color3f oldColor = new Color3f();
                backGround_.getColor(oldColor);
                Color c = JColorChooser.showDialog(frame_,
                    MessageBundle.get("dialog.bgcolor"), new Color(
                            oldColor.x, oldColor.y, oldColor.z));
                if (c != null) {
                backGround_.setColor(new Color3f(c));
                }
                */

                Display display = Display.getDefault();
                if (display != null && !display.isDisposed())
                    display.asyncExec(new Runnable() {
                        public void run() {
                            ColorDialog dialog = new ColorDialog(getParent().getShell());
                            RGB color = dialog.open();
                            Color3f c = new Color3f(color.red / 255f, color.green / 255f, color.blue / 255f);
                            backGround_.setColor(new Color3f(c));
                        }
                    });
            }
        });

        GUIAction.CAPTURE.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Display display = Display.getDefault();
                if (display != null && !display.isDisposed())
                    display.asyncExec(new Runnable() {
                        public void run() {
                            FileDialog fdlg = new FileDialog(getParent().getShell(), SWT.SAVE);
                            String[] fe = { "*.png" }; //$NON-NLS-1$
                            fdlg.setFilterExtensions(fe);
                            String fPath = fdlg.open();
                            if (fPath != null) {
                                saveScreenShot(new File(fPath));
                            }
                        }
                    });
            }
        });

        GUIAction.OBJECT_TRANSLATION.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (behaviorManager_.getOperationMode() != BehaviorManager.OBJECT_TRANSLATION_MODE) {
                    behaviorManager_.setOperationMode(BehaviorManager.OBJECT_TRANSLATION_MODE);
                    viewMode_ = EDIT;
                    objectToolBar_.setMode(ObjectToolBar.OBJECT_MODE);
                    lblMode_.setText(MessageBundle.get("Grx3DView.text.editTranslate")); //$NON-NLS-1$
                    showOption();
                }
            }
        });

        GUIAction.OBJECT_ROTATION.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (behaviorManager_.getOperationMode() != BehaviorManager.OBJECT_ROTATION_MODE) {
                    behaviorManager_.setOperationMode(BehaviorManager.OBJECT_ROTATION_MODE);
                    viewMode_ = EDIT;
                    objectToolBar_.setMode(ObjectToolBar.OBJECT_MODE);
                    lblMode_.setText(MessageBundle.get("Grx3DView.text,editRotate")); //$NON-NLS-1$
                    showOption();
                }
            }
        });
        GUIAction.JOINT_ROTATION.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (behaviorManager_.getOperationMode() != BehaviorManager.JOINT_ROTATION_MODE) {
                    behaviorManager_.setOperationMode(BehaviorManager.JOINT_ROTATION_MODE);
                    viewMode_ = EDIT;
                    objectToolBar_.setMode(ObjectToolBar.OBJECT_MODE);
                    lblMode_.setText(MessageBundle.get("Grx3DView.text.editMove")); //$NON-NLS-1$
                    showOption();
                }
            }
        });

        GUIAction.FITTING_SRC.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (behaviorManager_.getOperationMode() != BehaviorManager.FITTING_FROM_MODE) {
                    objectToolBar_.setMode(ObjectToolBar.FITTING_MODE);
                    viewToolBar_.setEnabled(true);
                    behaviorManager_.setOperationMode(BehaviorManager.FITTING_FROM_MODE);
                    viewMode_ = EDIT;
                    lblMode_.setText(MessageBundle.get("Grx3DView.text.editObjectSelect")); //$NON-NLS-1$
                    showOption();
                }
            }
        });

        GUIAction.FITTING_DEST.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (behaviorManager_.getOperationMode() != BehaviorManager.FITTING_TO_MODE) {
                    objectToolBar_.setMode(ObjectToolBar.FITTING_MODE);
                    viewToolBar_.setEnabled(true);
                    behaviorManager_.setOperationMode(BehaviorManager.FITTING_TO_MODE);
                    viewMode_ = EDIT;
                    lblMode_.setText(MessageBundle.get("Grx3DView.text,editObjectDestination")); //$NON-NLS-1$
                    showOption();
                }
            }
        });

        GUIAction.DO_FIT.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //setModelUpdate(false);
                behaviorManager_.fit();
                objectToolBar_.setMode(ObjectToolBar.FITTING_START_MODE);
                viewToolBar_.setEnabled(true);
                behaviorManager_.setOperationMode(BehaviorManager.FITTING_FROM_MODE);
                viewMode_ = EDIT;
                lblMode_.setText(MessageBundle.get("Grx3DView.text.editObjectSelect")); //$NON-NLS-1$
                showOption();
            }
        });

        GUIAction.INV_KINEMA_FROM.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (behaviorManager_.getOperationMode() != BehaviorManager.INV_KINEMA_FROM_MODE) {
                    objectToolBar_.setMode(ObjectToolBar.INV_KINEMA_MODE);
                    behaviorManager_.setOperationMode(BehaviorManager.INV_KINEMA_FROM_MODE);
                    viewMode_ = EDIT;
                    lblMode_.setText(MessageBundle.get("Grx3DView.text.IKbaseLink")); //$NON-NLS-1$
                    showOption();
                }
            }
        });

        GUIAction.INV_KINEMA_TRANS.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (behaviorManager_.getOperationMode() != BehaviorManager.INV_KINEMA_TRANSLATION_MODE) {
                    objectToolBar_.setMode(ObjectToolBar.INV_KINEMA_MODE);
                    behaviorManager_.setOperationMode(BehaviorManager.INV_KINEMA_TRANSLATION_MODE);
                    viewMode_ = EDIT;
                    lblMode_.setText(MessageBundle.get("Grx3DView.text.IKtranslate")); //$NON-NLS-1$
                    showOption();
                }
            }
        });

        GUIAction.INV_KINEMA_ROT.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (behaviorManager_.getOperationMode() != BehaviorManager.INV_KINEMA_ROTATION_MODE) {
                    objectToolBar_.setMode(ObjectToolBar.INV_KINEMA_MODE);
                    behaviorManager_.setOperationMode(BehaviorManager.INV_KINEMA_ROTATION_MODE);
                    viewMode_ = EDIT;
                    lblMode_.setText(MessageBundle.get("Grx3DView.text.IKRotate")); //$NON-NLS-1$
                    showOption();
                }
            }
        });

        GUIAction.OPERATION_DISABLE.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                disableOperation();
                viewMode_ = VIEW;
            }
        });
    }

    public void disableOperation() {
        //setModelUpdate(true);

        behaviorManager_.setOperationMode(BehaviorManager.OPERATION_MODE_NONE);
        objectToolBar_.setMode(ObjectToolBar.OBJECT_MODE);
        objectToolBar_.selectNone();
        viewToolBar_.setEnabled(true);
        lblMode_.setText(MessageBundle.get("Grx3DView.text.view")); //$NON-NLS-1$

        if (currentState_ != null) {
            syncExec(new Runnable() {
                public void run() {
                    updateModels(currentState_);
                    _showCollision(currentState_.collisions);
                }
            });
            updateViewSimulator(currentState_.time);
            showOptionWithoutCollision();
        }
    }

    public void addClickListener(Grx3DViewClickListener listener) {
        behaviorManager_.addClickListener(listener);
    }

    public void removeClickListener(Grx3DViewClickListener listener) {
        behaviorManager_.removeClickListener(listener);
    }

    /*
    private PickCanvas initPickCanvas(int x, int y){
    PickCanvas pickCanvas = new PickCanvas(
            getCanvas3D(),
            getBranchGroupRoot()
        );
        
    pickCanvas.setShapeLocation( x, y );
        
    pickCanvas.setMode(PickInfo.NODE);
        
    PickCone pickCone = (PickCone)pickCanvas.getPickShape();
    Point3d pickOrig = new Point3d();
    Vector3d pickDir = new Vector3d();
    pickCone.getOrigin( pickOrig );
    pickCone.getDirection( pickDir );
    pickCanvas.setShapeRay( pickOrig, pickDir );
        
    // PickInfo?????
    pickCanvas.setFlags(PickInfo.NODE | PickInfo.CLOSEST_INTERSECTION_POINT |PickInfo.SCENEGRAPHPATH |PickInfo.LOCAL_TO_VWORLD );
        
    return pickCanvas;
    }
        
    public Point3d getClickPoint(int x, int y){
    PickCanvas canvas = initPickCanvas(x,y);
    PickInfo pickInfo = canvas.pickClosest();
    if (pickInfo == null) {
        GrxDebugUtil.println("[3DView] PickInfo Null.");
    }
        
    if(pickInfo == null)
        return null;
        
    //???????
    Point3d intersectionPoint = pickInfo.getClosestIntersectionPoint();
    Transform3D ltov = pickInfo.getLocalToVWorld();
    ltov.transform(intersectionPoint);
        
    if( intersectionPoint == null ){
        GrxDebugUtil.println("[3dView] Not Intersect point.");
    }else{
        NumberFormat format = NumberFormat.getInstance();
        format.setMaximumFractionDigits(2);
        GrxDebugUtil.println( "CLICK="+"("
            +format.format(intersectionPoint.x)+","
            +format.format(intersectionPoint.y)+","
            +format.format(intersectionPoint.z)+")" );
    }
        
    return intersectionPoint;
    }
        
    public TransformGroup getClickNode(int x, int y, int type){
    PickCanvas pickCanvas = initPickCanvas(x,y);
    PickInfo pickInfo = pickCanvas.pickClosest();
    if (pickInfo == null) {
        GrxDebugUtil.println("[3DView] PickInfo Null.");
    }
        
    //????
    TransformGroup tg = null;
    try {
        tg = (TransformGroup) pickCanvas.getNode(pickInfo, type );
        if (tg == null)
            GrxDebugUtil.println("[3DView] Node Null.");
    } catch (CapabilityNotSetException ex) {
        ex.printStackTrace();
    }
        
    return tg;
    }
    */

    public void saveScreenShot(File file) {
        if (file == null)
            return;

        //onScreen?
        Raster raster = null;
        // ?? : type int, Alpha:8bit, R:8bit, G:8bit, B:8bit
        BufferedImage bimageRead = new BufferedImage(canvas_.getWidth(), canvas_.getHeight(),
                BufferedImage.TYPE_INT_RGB);
        ImageComponent2D readImage = new ImageComponent2D(ImageComponent.FORMAT_RGB, bimageRead);
        // ??
        raster = new Raster(new Point3f(0.0f, 0.0f, 0.0f), Raster.RASTER_COLOR, 0, 0, bimageRead.getWidth(),
                bimageRead.getHeight(), readImage, null
        //readDepthFloat
        //readDepthInt
        );
        //raster.setCapability(Raster.ALLOW_DEPTH_COMPONENT_READ);
        raster.setCapability(Raster.ALLOW_IMAGE_READ);
        canvas_.getGraphicsContext3D().readRaster(raster);
        // ??
        BufferedImage image = raster.getImage().getImage();

        /*
        //offScreen?
        if(imageChooser_.showSaveDialog(GUIManager.this) == JFileChooser.APPROVE_OPTION ){
        //
        recordingMgr_ = RecordingManager.getInstance();   // ?
        recordingMgr_.setView(viewer_[currentViewer_].getDrawable());
        //
        ImageCamera camera = recordingMgr_.getImageCamera();
        //
        Dimension d = viewer_[currentViewer_].getCanvas3D().getSize();
        camera.setSize(d.width,d.height);
        //??
        java.awt.image.BufferedImage image = camera.getImage();
        */

        //?
        try {
            javax.imageio.ImageIO.write(image, "PNG", file); //$NON-NLS-1$
        } catch (IOException ex) {
            // ???SWT?EDT????SWT.syncExec()???????????
            MessageDialog.openWarning(getParent().getShell(), "", MessageBundle.get("message.ioexception")); //$NON-NLS-1$ //$NON-NLS-2$
        }
    }

    public View getView() {
        return view_;
    }

    private boolean xor(boolean a, boolean b) {
        return (a || b) && (!a || !b);
    }

    public boolean propertyChanged(String key, String value) {
        if (super.propertyChanged(key, value)) {
            return true;
        } else {
            if (key.equals("showScale")) { //$NON-NLS-1$
                if (xor(btnFloor_.isSelected(), value.equals("true")))
                    btnFloor_.doClick();
            } else if (key.equals("showCollision")) { //$NON-NLS-1$   
                if (xor(btnCollision_.isSelected(), value.equals("true")))
                    btnCollision_.doClick();
            } else if (key.equals("showDistance")) { //$NON-NLS-1$
                if (xor(btnDistance_.isSelected(), value.equals("true")))
                    btnDistance_.doClick();
            } else if (key.equals("showIntersection")) { //$NON-NLS-1$
                if (xor(btnIntersection_.isSelected(), value.equals("true")))
                    btnIntersection_.doClick();
            } else if (key.equals("showCoM")) { //$NON-NLS-1$   
                if (xor(btnCoM_.isSelected(), value.equals("true")))
                    btnCoM_.doClick();
            } else if (key.equals("showCoMonFloor")) { //$NON-NLS-1$   
                if (xor(btnCoMonFloor_.isSelected(), value.equals("true")))
                    btnCoMonFloor_.doClick();
            } else if (key.equals("view.mode")) { //$NON-NLS-1$   
                value = viewToolBar_.selectViewMode(value);
            } else if (key.equals("showActualState")) { //$NON-NLS-1$   
                showActualState_ = value.equals("true");
            } else if (key.equals("eyeHomePosition")) { //$NON-NLS-1$   
                double[] eyeHomePosition = getDblAry(value);
                t3dViewHome_.set(eyeHomePosition);
                setTransform(t3dViewHome_);
            } else {
                return false;
            }
            final String key_ = key;
            final String value_ = value;
            syncExec(new Runnable() {
                public void run() {
                    setProperty(key_, value_);
                }
            });
            return true;
        }
    }

    // view ????????
    public void shutdown() {
        showViewSimulator(false);
        behaviorManager_.destroyDynamicsSimulator();
        Iterator<GrxModelItem> it = currentModels_.iterator();
        while (it.hasNext()) {
            GrxModelItem model = it.next();
            model.bgRoot_.detach();
            model.deleteObserver(this);
        }
        manager_.removeItemChangeListener(this, GrxModelItem.class);
        manager_.removeItemChangeListener(this, GrxWorldStateItem.class);
        if (currentWorld_ != null) {
            currentWorld_.deleteObserver(this);
            currentWorld_.deletePosObserver(this);
        }
        manager_.removeItemChangeListener(this, GrxCollisionPairItem.class);
        if (simItem_ != null)
            simItem_.deleteObserver(this);
        manager_.removeItemChangeListener(this, GrxSimulationItem.class);
    }

    public void repaint() {
        view_.repaint();
        objectToolBar_.repaint();
        viewToolBar_.repaint();
    }

    private boolean ans_;

    private List<GrxModelItem> setNumOfAABB() {
        List<GrxModelItem> ret = new ArrayList<GrxModelItem>();
        List<GrxModelItem> models = new ArrayList<GrxModelItem>();
        models.addAll(currentModels_);
        while (!models.isEmpty()) {
            final GrxModelItem model = models.get(0);
            final List<GrxModelItem> sameModels = model.getSameUrlModels();
            boolean flg = false;
            for (int i = 0; i < model.links_.size(); i++) {
                if (model.links_.get(i).getStr("NumOfAABB").equals("original data")) {
                    flg = true;
                    break;
                }
            }
            if (flg) {
                syncExec(new Runnable() {
                    public void run() {
                        ans_ = MessageDialog.openConfirm(comp.getShell(),
                                MessageBundle.get("Grx3DView.dialog.title.confirmation"), //$NON-NLS-1$
                                model.getName() + " " + MessageBundle.get("Grx3DView.dialog.message.setAABBdepth")); //$NON-NLS-1$
                        if (ans_) {
                            for (int i = 0; i < model.links_.size(); i++) {
                                if (model.links_.get(i).getStr("NumOfAABB").equals("original data")) {
                                    model.links_.get(i).setInt("NumOfAABB", 1);
                                    model.setProperty(model.links_.get(i).getName() + ".NumOfAABB", "1");
                                }
                            }
                            model.makeAABBforSameUrlModels();
                        }
                    }
                });
                if (ans_) {
                    ret.addAll(sameModels);
                    ret.add(model);
                }
            } else {
                ret.add(model);
                ret.addAll(sameModels);
            }
            models.removeAll(sameModels);
            models.remove(model);
        }
        return ret;
    }

    private boolean btnStateCollision_ = true;
    private boolean btnStateDistance_ = false;
    private boolean btnStateIntersection_ = false;
    private boolean modelModified_ = false;

    private void optionButtonEnable(boolean enable) {
        if (!modelModified_ && enable)
            return;
        if (modelModified_ && !enable)
            return;
        if (enable) {
            for (GrxModelItem model : currentModels_) {
                if (model.isModified())
                    return;
            }
        }
        if (!enable) {
            btnStateCollision_ = btnCollision_.isSelected();
            btnStateDistance_ = btnDistance_.isSelected();
            btnStateIntersection_ = btnIntersection_.isSelected();
            if (btnCollision_.isSelected())
                btnCollision_.doClick();
            if (btnDistance_.isSelected())
                btnDistance_.doClick();
            if (btnIntersection_.isSelected())
                btnIntersection_.doClick();
            modelModified_ = true;
        }
        btnCollision_.setEnabled(enable);
        btnDistance_.setEnabled(enable);
        btnIntersection_.setEnabled(enable);
        if (enable) {
            if (btnStateCollision_)
                btnCollision_.doClick();
            if (btnStateDistance_)
                btnDistance_.doClick();
            if (btnStateIntersection_)
                btnIntersection_.doClick();
            modelModified_ = false;
        }
    }

    public ValueEditType GetValueEditType(String key) {
        if (key.equals("showCoM") || key.equals("showCoMonFloor") || key.equals("showDistance")
                || key.equals("showIntersection") || key.equals("showCollision") || key.equals("showActualState")
                || key.equals("showScale")) {
            return new ValueEditCombo(booleanComboItem_);
        } else if (key.equals("view.mode")) {
            return new ValueEditCombo(ViewToolBar.VIEW_MODE);
        }
        return super.GetValueEditType(key);
    }
}