/*******************************************************************************
 * Copyright (c) 2000, 2004 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.tests.internal;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.SubContributionItem;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.WorkbenchWindow;
import org.eclipse.ui.tests.harness.util.ActionUtil;
import org.eclipse.ui.tests.harness.util.FileUtil;
import org.eclipse.ui.tests.harness.util.UITestCase;

/**
 * This class contains tests for text selection action enablement
 */
public class TextSelectionActionExpressionTest extends UITestCase {
    protected IWorkbenchWindow fWindow;

    protected IWorkbenchPage fPage;

    public TextSelectionActionExpressionTest(String testName) {
        super(testName);
    }

    protected void doSetUp() throws Exception {
        super.doSetUp();
        fWindow = openTestWindow();
        fPage = fWindow.getActivePage();
    }

    public void testAnyTextAction() throws Throwable {
        // Setup.
        ExtendedTextEditor editor = showTextEditor("anyText.exttxt");
        MenuManager mgr = getActionMenuManager(editor);

        // Test empty selection.
        selectAndUpdateMenu(editor, "", mgr);
        testAction(mgr, "anyText", true);

        // Test full selection.
        selectAndUpdateMenu(editor, "bob", mgr);
        testAction(mgr, "anyText", true);

        // Activate another view.
        fPage.showView(IPageLayout.ID_BOOKMARKS);
        testAction(mgr, "anyText", false);

        // Activate editor.
        // Test old selection.
        fPage.activate(editor);
        testAction(mgr, "anyText", true);

        // Test empty selection.
        selectAndUpdateMenu(editor, "", mgr);
        testAction(mgr, "anyText", true);
    }

    public void testEmptyTextAction() throws Throwable {
        // Setup.
        ExtendedTextEditor editor = showTextEditor("emptyText.exttxt");
        MenuManager mgr = getActionMenuManager(editor);

        // Test empty selection.
        selectAndUpdateMenu(editor, "", mgr);
        testAction(mgr, "emptyText", true);

        // Test full selection.
        selectAndUpdateMenu(editor, "bob", mgr);
        testAction(mgr, "emptyText", false);

        // Activate another view.
        fPage.showView(IPageLayout.ID_BOOKMARKS);
        testAction(mgr, "emptyText", false);

        // Activate editor.
        // Test old selection.
        fPage.activate(editor);
        testAction(mgr, "emptyText", false);

        // Test empty selection.
        selectAndUpdateMenu(editor, "", mgr);
        testAction(mgr, "emptyText", true);
    }

    public void testHelloTextAction() throws Throwable {
        // Setup.
        ExtendedTextEditor editor = showTextEditor("helloText.exttxt");
        MenuManager mgr = getActionMenuManager(editor);

        // Test empty selection.
        selectAndUpdateMenu(editor, "", mgr);
        testAction(mgr, "helloText", false);

        // Test wrong selection.
        selectAndUpdateMenu(editor, "bob", mgr);
        testAction(mgr, "helloText", false);

        // Test right selection.
        selectAndUpdateMenu(editor, "Hello", mgr);
        testAction(mgr, "helloText", true);

        // Activate another view.
        fPage.showView(IPageLayout.ID_BOOKMARKS);
        testAction(mgr, "helloText", false);

        // Activate editor.
        // Test old selection.
        fPage.activate(editor);
        testAction(mgr, "helloText", true);

        // Test wrong selection.
        selectAndUpdateMenu(editor, "bob", mgr);
        testAction(mgr, "helloText", false);
    }

    /**
     * Creates the list view.
     */
    private ExtendedTextEditor showTextEditor(String fileName) throws Throwable {
        IProject proj = FileUtil
                .createProject("TextSelectionActionExpressionTest");
        IFile file = FileUtil.createFile(fileName, proj);
        return (ExtendedTextEditor) IDE.openEditor(fPage, file, true);
    }

    /**
     * Select an object and fire about to show.
     */
    private void selectAndUpdateMenu(ExtendedTextEditor editor, String str,
            MenuManager mgr) throws Throwable {
        editor.setText(str);
        fPage.saveEditor(editor, false);
        ActionUtil.fireAboutToShow(mgr);
    }

    /**
     * Returns the menu manager containing the actions.
     */
    private MenuManager getActionMenuManager(ExtendedTextEditor editor)
            throws Throwable {
        fPage
                .showActionSet("org.eclipse.ui.tests.internal.TextSelectionActions");
        WorkbenchWindow win = (WorkbenchWindow) fWindow;
        IContributionItem item = win.getMenuBarManager().find(
                "org.eclipse.ui.tests.internal.TextSelectionMenu");
        while (item instanceof SubContributionItem) {
            item = ((SubContributionItem) item).getInnerItem();
            if (item instanceof MenuManager)
                return (MenuManager) item;
        }
        fail("Unable to find menu manager");
        return null;
    }

    /**
     * Tests the enablement / visibility of an action.
     */
    private void testAction(MenuManager mgr, String action, boolean expected)
            throws Throwable {
        assertEquals(action, expected, ActionUtil.getActionWithLabel(mgr,
                action).isEnabled());
    }
}
