org.goko.viewer.jogl.GCodeViewer3D.java Source code

Java tutorial

Introduction

Here is the source code for org.goko.viewer.jogl.GCodeViewer3D.java

Source

/*******************************************************************************
 *    This file is part of Goko.
 *
 *   Goko is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   Goko is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with Goko.  If not, see <http://www.gnu.org/licenses/>.
 *******************************************************************************/
package org.goko.viewer.jogl;

import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;

import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.di.PersistState;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.opengl.GLData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.wb.swt.ResourceManager;
import org.goko.common.GkUiComponent;
import org.goko.core.common.exception.GkException;
import org.goko.core.controller.ICoordinateSystemAdapter;
import org.goko.core.gcode.bean.commands.EnumCoordinateSystem;
import org.goko.core.gcode.service.IGCodeService;
import org.goko.viewer.jogl.camera.AbstractCamera;
import org.goko.viewer.jogl.model.GCodeViewer3DController;
import org.goko.viewer.jogl.model.GCodeViewer3DModel;
import org.goko.viewer.jogl.service.IJoglViewerService;

import com.jogamp.opengl.util.Animator;

public class GCodeViewer3D extends GkUiComponent<GCodeViewer3DController, GCodeViewer3DModel> {
    @Inject
    IGCodeService gcodeService;
    @Inject
    IJoglViewerService viewerService;

    /** Widget that displays OpenGL content. */
    private GokoJoglCanvas glcanvas;
    private Animator animator;
    private static final String VIEWER_ENABLED = "org.goko.gcode.viewer.enabled";
    private static final String VIEWER_GRID_ENABLED = "org.goko.gcode.viewer.gridEnabled";
    private static final String VIEWER_LOCK_CAMERA_ON_TOOL = "org.goko.gcode.viewer.lockCameraOnTool";
    private static final String VIEWER_COORDINATE_SYSTEM_ENABLED = "org.goko.gcode.viewer.coordinateSystemEnabled";

    /**
     * Part constructor
     *
     * @param context
     *            IEclipseContext
     * @throws GkException
     */
    @Inject
    public GCodeViewer3D(IEclipseContext context) throws GkException {
        super(new GCodeViewer3DController(new GCodeViewer3DModel()));
        ContextInjectionFactory.inject(getController(), context);
        getController().initialize();
    }

    @PostConstruct
    public void createPartControl(Composite superCompositeParent, IEclipseContext context, MPart part)
            throws GkException {
        Composite compositeParent = new Composite(superCompositeParent, SWT.NONE);
        GLData gldata = new GLData();
        gldata.doubleBuffer = true;
        GridLayout gl_compositeParent = new GridLayout(1, false);
        gl_compositeParent.verticalSpacing = 0;
        gl_compositeParent.marginWidth = 0;
        gl_compositeParent.marginHeight = 0;
        compositeParent.setLayout(gl_compositeParent);

        final ToolBar toolBar = new ToolBar(compositeParent, SWT.FLAT | SWT.RIGHT);

        glcanvas = viewerService.createCanvas(compositeParent);

        final ToolItem btnEnableView = new ToolItem(toolBar, SWT.CHECK);
        btnEnableView.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                getController().setRenderEnabled(btnEnableView.getSelection());
            }
        });
        btnEnableView.setToolTipText("Enable/disable 3D view");
        btnEnableView.setWidth(32);
        btnEnableView.setHotImage(
                ResourceManager.getPluginImage("org.goko.gcode.viewer", "resources/icons/activated.png"));
        btnEnableView
                .setImage(ResourceManager.getPluginImage("org.goko.gcode.viewer", "resources/icons/activated.png"));

        final ToolItem btnEnableGrid = new ToolItem(toolBar, SWT.CHECK);
        btnEnableGrid.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                try {
                    getController().setShowGrid(btnEnableGrid.getSelection());
                } catch (GkException ex) {
                    displayError(ex);
                }
            }
        });
        btnEnableGrid.setToolTipText("Show/hide grid");
        btnEnableGrid.setImage(ResourceManager.getPluginImage("org.goko.gcode.viewer", "resources/icons/grid.png"));
        getController().addSelectionBinding(btnEnableGrid, "showGrid");

        final ToolItem btnEnableBounds = new ToolItem(toolBar, SWT.CHECK);
        btnEnableBounds.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                try {
                    getController().setDisplayBounds(btnEnableBounds.getSelection());
                } catch (GkException ex) {
                    displayError(ex);
                }
            }
        });
        btnEnableBounds.setToolTipText("Show/hide bounds");
        btnEnableBounds.setImage(
                ResourceManager.getPluginImage("org.goko.gcode.viewer", "resources/icons/show-bound.png"));
        getController().addSelectionBinding(btnEnableBounds, "enabled");

        getController().addSelectionBinding(btnEnableView, "enabled");
        final ICoordinateSystemAdapter csAdapter = viewerService.getCoordinateSystemAdapter();
        if (csAdapter != null) {
            final Menu coordinateSystemMenu = new Menu(toolBar.getShell(), SWT.POP_UP);
            final MenuItem csItemAll = new MenuItem(coordinateSystemMenu, SWT.PUSH);
            csItemAll.setText("Show all");
            csItemAll.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    try {
                        for (final EnumCoordinateSystem cs : csAdapter.getCoordinateSystem()) {
                            viewerService.setCoordinateSystemEnabled(cs, true);
                            getDataModel().getCoordinateSystemEnabled().put(cs.name(), true);
                        }
                    } catch (GkException e1) {
                        displayError(e1);
                    }
                };
            });
            MenuItem csItemNone = new MenuItem(coordinateSystemMenu, SWT.PUSH);
            csItemNone.setText("Hide all");
            csItemNone.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    try {
                        for (final EnumCoordinateSystem cs : csAdapter.getCoordinateSystem()) {
                            viewerService.setCoordinateSystemEnabled(cs, false);
                            getDataModel().getCoordinateSystemEnabled().put(cs.name(), false);
                        }
                    } catch (GkException e1) {
                        displayError(e1);
                    }
                };
            });
            MenuItem csItemSeparator = new MenuItem(coordinateSystemMenu, SWT.SEPARATOR);
            // Create the menu for CS display
            for (final EnumCoordinateSystem cs : csAdapter.getCoordinateSystem()) {
                final MenuItem item = new MenuItem(coordinateSystemMenu, SWT.CHECK);
                item.setText(cs.name());
                viewerService.setCoordinateSystemEnabled(cs, true);
                getDataModel().getCoordinateSystemEnabled().put(cs.name(), true);
                item.addSelectionListener(new SelectionAdapter() {
                    @Override
                    public void widgetSelected(SelectionEvent e) {
                        viewerService.setCoordinateSystemEnabled(cs, item.getSelection());
                        getDataModel().getCoordinateSystemEnabled().put(cs.name(), item.getSelection());
                    };
                });
                {
                    IObservableValue modelObservable = Observables
                            .observeMapEntry(getDataModel().getCoordinateSystemEnabled(), cs.name());
                    IObservableValue controlObservable = WidgetProperties.selection().observe(item);

                    UpdateValueStrategy policy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
                    getController().getBindingContext().bindValue(controlObservable, modelObservable, null, policy);
                }
            }

            final ToolItem tltmDropdownItem = new ToolItem(toolBar, SWT.DROP_DOWN);
            tltmDropdownItem.setToolTipText("Show/hide coordinates systems");
            tltmDropdownItem.setImage(
                    ResourceManager.getPluginImage("org.goko.gcode.viewer", "resources/icons/show-cs.png"));
            tltmDropdownItem.addListener(SWT.Selection, new Listener() {
                @Override
                public void handleEvent(Event event) {
                    Rectangle rect = tltmDropdownItem.getBounds();
                    Point pt = new Point(rect.x, rect.y + rect.height);
                    pt = toolBar.toDisplay(pt);
                    coordinateSystemMenu.setLocation(pt.x, pt.y);
                    coordinateSystemMenu.setVisible(true);
                }
            });
        }

        ToolItem toolItem = new ToolItem(toolBar, SWT.SEPARATOR);

        ToolItem btnZoomExtent = new ToolItem(toolBar, SWT.NONE);
        btnZoomExtent.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                try {
                    getController().zoomToFit();
                } catch (GkException ex) {
                    displayError(ex);
                }
            }
        });
        btnZoomExtent.setToolTipText("Zoom extents");
        btnZoomExtent.setWidth(32);
        btnZoomExtent.setImage(
                ResourceManager.getPluginImage("org.goko.gcode.viewer", "resources/icons/layer-resize.png"));

        final ToolItem btnView = new ToolItem(toolBar, SWT.DROP_DOWN);
        btnView.setImage(
                ResourceManager.getPluginImage("org.goko.gcode.viewer", "resources/icons/projection-screen.png"));
        btnView.setToolTipText("Change view");
        final Menu viewMenu = new Menu(toolBar.getShell(), SWT.POP_UP);

        for (AbstractCamera camera : viewerService.getSupportedCamera()) {
            MenuItem btnCamera = new MenuItem(viewMenu, SWT.PUSH);
            btnCamera.setText(camera.getLabel());
            final String cameraId = camera.getId();

            btnCamera.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {
                    try {
                        viewerService.setActiveCamera(cameraId);
                    } catch (GkException e1) {
                        displayError(e1);
                    }
                }
            });
        }

        btnView.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                Rectangle rect = btnView.getBounds();
                Point pt = new Point(rect.x, rect.y + rect.height);
                pt = toolBar.toDisplay(pt);
                viewMenu.setLocation(pt.x, pt.y);
                viewMenu.setVisible(true);
            }
        });
        ToolItem toolItem_1 = new ToolItem(toolBar, SWT.SEPARATOR);

        final ToolItem btnKeyboardJog = new ToolItem(toolBar, SWT.CHECK);
        btnKeyboardJog.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                glcanvas.setKeyboardJogEnabled(btnKeyboardJog.getSelection());
            }
        });
        btnKeyboardJog.setToolTipText("Enable/disable keyboard jogging");
        btnKeyboardJog.setImage(
                ResourceManager.getPluginImage("org.goko.gcode.viewer", "resources/icons/keyboard--arrow.png"));

        glcanvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        animator = new Animator();

        animator.add(glcanvas);
        animator.start();

        ContextInjectionFactory.inject(glcanvas, context);

        // glcanvas.setMenu(initContextualMenu(composite));

        Map<String, String> state = part.getPersistedState();
        String viewerEnabledStr = state.get(VIEWER_ENABLED);
        if (StringUtils.isNotEmpty(viewerEnabledStr)) {
            getDataModel().setEnabled(BooleanUtils.toBoolean(viewerEnabledStr));
            getController().setRenderEnabled(BooleanUtils.toBoolean(viewerEnabledStr));
        }
        String gridEnabledStr = state.get(VIEWER_GRID_ENABLED);
        if (StringUtils.isNotEmpty(gridEnabledStr)) {
            getDataModel().setShowGrid(BooleanUtils.toBoolean(gridEnabledStr));
            getController().setShowGrid(BooleanUtils.toBoolean(gridEnabledStr));
        }
        String lockCameraToolStr = state.get(VIEWER_LOCK_CAMERA_ON_TOOL);
        if (StringUtils.isNotEmpty(lockCameraToolStr)) {
            getDataModel().setFollowTool(BooleanUtils.toBoolean(lockCameraToolStr));
            getController().setLockCameraOnTool(BooleanUtils.toBoolean(lockCameraToolStr));
        }
        String csEnabledStr = state.get(VIEWER_COORDINATE_SYSTEM_ENABLED);
        if (StringUtils.isNotEmpty(csEnabledStr)) {
            getDataModel().setShowCoordinateSystem(BooleanUtils.toBoolean(csEnabledStr));
            getController().setShowCoordinateSystem(BooleanUtils.toBoolean(csEnabledStr));
        }
    }

    // protected Menu initContextualMenu(Control composite) throws GkException{
    // final Menu menu = new Menu(composite);
    //
    // MenuItem mntmNewSubmenu = new MenuItem(menu, SWT.CASCADE);
    // mntmNewSubmenu.setText("Camera");
    //
    // Menu cameraSubmenu = new Menu(mntmNewSubmenu);
    // mntmNewSubmenu.setMenu(cameraSubmenu);
    // List<AbstractCamera> cameras = viewerService.getSupportedCamera();
    // for (final AbstractCamera abstractCamera : cameras) {
    // MenuItem cameraItem = new MenuItem(cameraSubmenu, SWT.NONE);
    // cameraItem.setText(abstractCamera.getLabel());
    // cameraItem.addSelectionListener(new SelectionAdapter() {
    // @Override
    // public void widgetSelected(SelectionEvent e) {
    // try {
    // viewerService.setActiveCamera(abstractCamera.getId());
    // } catch (GkException exception) {
    // displayMessage(exception);
    // }
    // }
    // });
    // }
    // return menu;
    // }

    @PreDestroy
    public void dispose(MPart part) {
        if (animator != null && animator.isStarted()) {
            animator.stop();
        }
    }

    @PersistState
    public void persist(MPart part) {
        if (getDataModel() != null) {
            part.getPersistedState().put(VIEWER_ENABLED, String.valueOf(getDataModel().isEnabled()));
            part.getPersistedState().put(VIEWER_GRID_ENABLED, String.valueOf(getDataModel().isShowGrid()));
            part.getPersistedState().put(VIEWER_LOCK_CAMERA_ON_TOOL, String.valueOf(getDataModel().isFollowTool()));
            part.getPersistedState().put(VIEWER_COORDINATE_SYSTEM_ENABLED,
                    String.valueOf(getDataModel().isShowCoordinateSystem()));
        }
    }

    @Focus
    public void setFocus() {
        // TODO Set the focus to control
    }
}