/*******************************************************************************
 * Copyright (c) 2000, 2005 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 Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.views.navigator;

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
import org.eclipse.ui.views.framelist.BackAction;
import org.eclipse.ui.views.framelist.ForwardAction;
import org.eclipse.ui.views.framelist.FrameList;
import org.eclipse.ui.views.framelist.GoIntoAction;
import org.eclipse.ui.views.framelist.UpAction;

/**
 * This is the action group for the goto actions.
 */
public class GotoActionGroup extends ResourceNavigatorActionGroup {

    private BackAction backAction;

    private ForwardAction forwardAction;

    private GoIntoAction goIntoAction;

    private UpAction upAction;

    private GotoResourceAction goToResourceAction;

    public GotoActionGroup(IResourceNavigator navigator) {
        super(navigator);
    }

    public void fillContextMenu(IMenuManager menu) {
        IStructuredSelection selection = (IStructuredSelection) getContext()
                .getSelection();
        if (selection.size() == 1) {
            if (ResourceSelectionUtil.allResourcesAreOfType(selection,
                    IResource.FOLDER)) {
                menu.add(goIntoAction);
            } else {
                IStructuredSelection resourceSelection = ResourceSelectionUtil
                        .allResources(selection, IResource.PROJECT);
                if (resourceSelection != null && !resourceSelection.isEmpty()) {
                    IProject project = (IProject) resourceSelection
                            .getFirstElement();
                    if (project.isOpen())
                        menu.add(goIntoAction);
                }
            }
        }
    }

    public void fillActionBars(IActionBars actionBars) {
        actionBars.setGlobalActionHandler(IWorkbenchActionConstants.GO_INTO,
                goIntoAction);
        actionBars.setGlobalActionHandler(ActionFactory.BACK.getId(),
                backAction);
        actionBars.setGlobalActionHandler(ActionFactory.FORWARD.getId(),
                forwardAction);
        actionBars.setGlobalActionHandler(IWorkbenchActionConstants.UP,
                upAction);
        actionBars.setGlobalActionHandler(
                IWorkbenchActionConstants.GO_TO_RESOURCE, goToResourceAction);

        IToolBarManager toolBar = actionBars.getToolBarManager();
        toolBar.add(backAction);
        toolBar.add(forwardAction);
        toolBar.add(upAction);
    }

    protected void makeActions() {
        FrameList frameList = navigator.getFrameList();
        goIntoAction = new GoIntoAction(frameList);
        backAction = new BackAction(frameList);
        forwardAction = new ForwardAction(frameList);
        upAction = new UpAction(frameList);
        goToResourceAction = new GotoResourceAction(navigator,
                ResourceNavigatorMessages.GoToResource_label);
    }

    public void updateActionBars() {
        ActionContext context = getContext();
        boolean enable = false;

        // Fix for bug 26126. Resource change listener could call
        // updateActionBars without a context being set.
        // This should never happen because resource navigator sets
        // context immediately after this group is created.
        if (context != null) {
            IStructuredSelection selection = (IStructuredSelection) context
                    .getSelection();

            if (selection.size() == 1) {
                Object object = selection.getFirstElement();
                if (object instanceof IProject) {
                    enable = ((IProject) object).isOpen();
                } else if (object instanceof IFolder) {
                    enable = true;
                }
            }
        }
        goIntoAction.setEnabled(enable);
        // the rest of the actions update by listening to frame list changes
    }
}
