/*******************************************************************************
 * Copyright (c) 2000, 2006 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
    }
}
