com.vectrace.MercurialEclipse.synchronize.actions.PathAwareAction.java Source code

Java tutorial

Introduction

Here is the source code for com.vectrace.MercurialEclipse.synchronize.actions.PathAwareAction.java

Source

/*******************************************************************************
 * Copyright (c) 2005-2010 VecTrace (Zingo Andersen) 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:
 * John Peberdy   implementation
 *******************************************************************************/
package com.vectrace.MercurialEclipse.synchronize.actions;

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

import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration;
import org.eclipse.team.ui.synchronize.SynchronizeModelAction;

import com.vectrace.MercurialEclipse.model.PathFromChangeSet;

/**
 * An action that can operate on folder nodes in "compressed tree" or "tree" mode in the synchronize
 * view.
 *
 * @see PathFromChangeSet
 */
public abstract class PathAwareAction extends SynchronizeModelAction {

    public PathAwareAction(String text, ISynchronizePageConfiguration configuration,
            ISelectionProvider selectionProvider) {
        super(text, configuration, selectionProvider);
    }

    // operations

    /**
     * @see org.eclipse.ui.actions.BaseSelectionListenerAction#getStructuredSelection()
     * @deprecated Use {@link #getNormalizedSelection()}
     */
    @Override
    @Deprecated
    public IStructuredSelection getStructuredSelection() {
        return super.getStructuredSelection();
    }

    /**
     * @return Selected items with tree nodes replaced with their children.
     */
    protected Object[] getNormalizedSelection() {
        return normalize(super.getStructuredSelection().toArray());
    }

    @Override
    protected boolean updateSelection(IStructuredSelection selection) {
        // TODO: why do we calculate this only if parent says it should be disabled?
        if (!super.updateSelection(selection)) {
            Object[] array = normalize(selection.toArray());
            for (Object object : array) {
                if (!isSupported(object)) {
                    return false;
                }
            }
            return true;
        }
        return true;
    }

    /**
     * Whether the action should be enabled for this object.
     *
     * @param object
     *            The object to check. Note: Will never be a PathFromChangeSet.
     * @return False to disable the action
     */
    protected abstract boolean isSupported(Object object);

    /**
     * Depending on the synchronize presentation mode there may be {@link PathFromChangeSet}s
     * present in selection, but actions need not operate on them. This method replaces such path
     * nodes with their children.
     *
     * @param selection
     *            The selection to normalize. May be null.
     * @return Normalized copy of selection. Not null.
     */
    public static Object[] normalize(Object[] selection) {
        if (selection != null) {
            return normalize(selection, new ArrayList<Object>(selection.length)).toArray();
        }

        return new Object[0];
    }

    /**
     * @param selection
     *            Selection to normalize
     * @param l
     *            (Output) All the elements of selection are added to this, replacing path nodes
     *            with their children
     * @return l
     */
    private static List<Object> normalize(Object[] selection, List<Object> l) {
        for (int i = 0; i < selection.length; i++) {
            if (selection[i] instanceof PathFromChangeSet) {
                normalize(((PathFromChangeSet) selection[i]).getChildren(), l);
            } else {
                l.add(selection[i]);
            }
        }

        return l;
    }
}