de.tub.tfs.muvitor.actions.MuvitorToggleGridAction.java Source code

Java tutorial

Introduction

Here is the source code for de.tub.tfs.muvitor.actions.MuvitorToggleGridAction.java

Source

/*******************************************************************************
 * Copyright (c) 2010-2015 Henshin developers. All rights reserved. 
 * This program and the accompanying materials
 * are 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:
 *     TU Berlin, University of Luxembourg, SES S.A.
 *******************************************************************************/
package de.tub.tfs.muvitor.actions;

import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.internal.GEFMessages;
import org.eclipse.gef.ui.actions.GEFActionConstants;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.gef.ui.actions.ToggleGridAction;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPart;

import de.tub.tfs.muvitor.ui.MuvitorActivator;
import de.tub.tfs.muvitor.ui.MuvitorConstants;

/**
 * An action that toggles the grid. This action keeps the
 * {@link org.eclipse.gef.SnapToGrid#PROPERTY_GRID_VISIBLE visibility} and
 * {@link org.eclipse.gef.SnapToGrid#PROPERTY_GRID_ENABLED enabled} properties
 * in sync, i.e., it toggles both at the same time. This action can handle the
 * case where these properties are not set on the given viewer initially. This
 * class is a generalization of {@link ToggleGridAction} to handle several
 * viewers.
 * 
 * @author "Tony Modica"
 */
@SuppressWarnings("restriction")
public class MuvitorToggleGridAction extends SelectionAction {

    /**
     * the viewer containing the currently selected GraphicalEditPart
     */
    private EditPartViewer viewer;

    /**
     * Constructor.
     */
    public MuvitorToggleGridAction(final IWorkbenchPart part) {
        super(part, AS_CHECK_BOX);
        setToolTipText(GEFMessages.ToggleGrid_Tooltip);
        setText(GEFMessages.ToggleGrid_Label);
        setId(GEFActionConstants.TOGGLE_GRID_VISIBILITY);
        setImageDescriptor(MuvitorActivator.getImageDescriptor(MuvitorConstants.ICON_GRID_16));
    }

    /**
     * @see org.eclipse.jface.action.IAction#run()
     */
    @Override
    public void run() {
        // when invoking directly, a viewer must be set manually!
        if (viewer == null) {
            return;
        }
        final Boolean val = Boolean.valueOf(!isChecked());
        viewer.setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE, val);
        viewer.setProperty(SnapToGrid.PROPERTY_GRID_ENABLED, val);
        setChecked(val.booleanValue());
    }

    /**
     * This setter allows universal usage of this action. Just call the
     * constructor with <code>null</code> and set the viewer manually.
     * 
     * @param viewer
     */
    public void setViewer(final EditPartViewer viewer) {
        this.viewer = viewer;
        final Boolean val = (Boolean) viewer.getProperty(SnapToGrid.PROPERTY_GRID_ENABLED);
        setChecked(val == null ? false : val.booleanValue());
    }

    /**
     * This action is enabled if some graphical edit part is currently selected
     * from which a viewer can be determined.
     */
    @Override
    protected boolean calculateEnabled() {
        if (getSelection() == null) {
            return false;
        }
        if (getSelection() instanceof IStructuredSelection) {
            final IStructuredSelection selection = (IStructuredSelection) getSelection();
            for (final Object selectedObject : selection.toList()) {
                if (selectedObject instanceof GraphicalEditPart) {
                    final EditPartViewer selectedViewer = ((GraphicalEditPart) selectedObject).getViewer();
                    if (selectedViewer != null) {
                        setViewer(selectedViewer);
                        return true;
                    }
                }
            }
        }
        return false;
    }
}