net.enilink.komma.edit.ui.action.CommandActionHandler.java Source code

Java tutorial

Introduction

Here is the source code for net.enilink.komma.edit.ui.action.CommandActionHandler.java

Source

/**
 * <copyright> 
 *
 * Copyright (c) 2002, 2009 IBM Corporation and others.
 * 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: 
 *   IBM - Initial API and implementation
 *
 * </copyright>
 *
 * $Id: CommandActionHandler.java,v 1.6 2008/05/07 19:08:40 emerks Exp $
 */
package net.enilink.komma.edit.ui.action;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;

import net.enilink.komma.common.command.ICommand;
import net.enilink.komma.common.command.UnexecutableCommand;
import net.enilink.komma.edit.domain.IEditingDomain;
import net.enilink.komma.edit.domain.IEditingDomainProvider;

/*
 * This base action class implements an action by creating a command and delegating to it;
 * it's main use is as a base class for action handlers.
 */
public class CommandActionHandler extends AbstractActionHandler {
    /**
     * This keeps track of the command delegate that is created by
     * {@link #createCommand}.
     */
    protected ICommand command;

    /**
     * This keeps track of the editing domain of the action.
     */
    protected IEditingDomain domain;

    /**
     * This constructs and instance in this editing domain.
     */
    public CommandActionHandler(IWorkbenchPage page) {
        super(page);
    }

    /**
     * This constructs and instance in this editing domain.
     */
    public CommandActionHandler(IWorkbenchPage page, String label) {
        super(page);
        setText(label);
    }

    /**
     * This default implementation simply returns
     * {@link org.eclipse.emf.common.command.UnexecutableCommand#INSTANCE}.
     */
    public ICommand createCommand(Collection<?> selection) {
        return UnexecutableCommand.INSTANCE;
    }

    @Override
    protected void doRun(IProgressMonitor progressMonitor) {
        try {
            domain.getCommandStack().execute(command, progressMonitor, null);
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    /**
     * This returns the action's domain.
     */
    public IEditingDomain getEditingDomain() {
        return domain;
    }

    @Override
    protected boolean isSelectionListener() {
        return true;
    }

    @Override
    public void refresh() {
        setEnabled(domain != null && updateSelection(getStructuredSelection()));
    }

    /**
     * This sets the action's domain.
     */
    public void setEditingDomain(IEditingDomain domain) {
        this.domain = domain;
    }

    /**
     * When the selection changes, this will call {@link #createCommand} with
     * the appropriate collection of selected objects.
     */
    protected boolean updateSelection(IStructuredSelection selection) {
        if (selection == null) {
            return false;
        }
        List<?> list = selection.toList();
        Collection<Object> collection = new ArrayList<Object>(list);
        command = createCommand(collection);
        return command.canExecute();
    }

    @Override
    protected void setWorkbenchPart(IWorkbenchPart workbenchPart) {
        super.setWorkbenchPart(workbenchPart);
        IEditingDomainProvider provider = null;
        if (workbenchPart != null) {
            provider = workbenchPart.getAdapter(IEditingDomainProvider.class);
        }
        if (provider != null) {
            setEditingDomain(provider.getEditingDomain());
        } else {
            // ensures that action is disabled for parts without editing domain
            setEditingDomain(null);
        }
    }
}