/*******************************************************************************
 * 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.navigator;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.part.ISetSelectionTarget;
import org.eclipse.ui.tests.harness.util.ActionUtil;
import org.eclipse.ui.tests.harness.util.FileUtil;
import org.eclipse.ui.tests.harness.util.UITestCase;
import org.eclipse.ui.views.navigator.ResourceNavigator;

public class ResourceNavigatorTest extends UITestCase {
    private IWorkbenchPage activePage;

    private IWorkbenchWindow workbenchWindow;

    private IViewPart view;

    private IProject p1;

    private IProject p2;

    private IFile f1;

    private IFile f2;

    /**
     * Constructor for ResourceNavigatorTest.
     * @param testName
     */
    public ResourceNavigatorTest(String testName) {
        super(testName);
    }

    protected void doSetUp() throws Exception {
        super.doSetUp();
        workbenchWindow = openTestWindow();
        activePage = workbenchWindow.getActivePage();
    }

    private void setupView() throws Throwable {
        view = activePage.showView("org.eclipse.ui.views.ResourceNavigator");
    }

    private void setupResources() throws Throwable {
        if (p1 == null) {
            p1 = FileUtil.createProject("TP1");
            f1 = null;
        }
        if (p2 == null) {
            p2 = FileUtil.createProject("TP2");
            f2 = null;
        }
        if (f1 == null)
            f1 = FileUtil.createFile("f1.txt", p1);
        if (f2 == null)
            f2 = FileUtil.createFile("f2.txt", p2);
    }

    public void fixTestGlobalBookmarkAction() throws Throwable {
        setupView();
        setupResources();

        // Select a file
        IStructuredSelection sel = new StructuredSelection(f1);
        ((ResourceNavigator) view).selectReveal(sel);

        // Remember the previous marker count on the file
        int oldCount = (f1.findMarkers(IMarker.BOOKMARK, true,
                IResource.DEPTH_INFINITE)).length;

        // Now try the bookmark action
        ActionUtil.runActionUsingPath(this, workbenchWindow,
                IWorkbenchActionConstants.M_EDIT + '/'
                        + IWorkbenchActionConstants.BOOKMARK);

        // Make sure the resource was bookmarked
        int newCount = (f1.findMarkers(IMarker.BOOKMARK, true,
                IResource.DEPTH_INFINITE)).length;
        assertTrue(
                "Selected file was not bookmarked via Edit->Bookmark action.",
                oldCount + 1 == newCount);
    }

    /*	
     * This test should be moved to an interactive test suite as this
     * test causes a dialog to popup when the resource is deleted by
     * the delete action
     * 
     public void testGlobalDeleteAction() throws Throwable {
     setupView();
     setupResources();

     // Select a file
     IStructuredSelection sel = new StructuredSelection(f1);
     ((ResourceNavigator) view).selectReveal(sel);
     
     // Now try the delete action
     ActionUtil.runActionUsingPath(this, workbenchWindow, IWorkbenchActionConstants.M_EDIT + '/' + IWorkbenchActionConstants.DELETE);
     
     // Make sure the resource was deleted
     assertTrue("Selected file was not deleted via Edit->Delete action.", p1.findMember(f1.getName()) == null);
     f1 = null;
     }
     */

    public void testSelectReveal() throws Throwable {
        setupView();
        setupResources();

        ISetSelectionTarget part = (ISetSelectionTarget) view;
        TreeViewer tree = ((ResourceNavigator) view).getViewer();

        // Set the selection in the navigator
        IStructuredSelection sel1 = new StructuredSelection(f1);
        part.selectReveal(sel1);
        // Get the selection the tree has
        IStructuredSelection treeSel1 = (IStructuredSelection) tree
                .getSelection();
        assertTrue("First selection wrong size, should be only one.", treeSel1
                .size() == 1);
        IResource resource1 = (IResource) treeSel1.getFirstElement();
        assertTrue("First selection contains wrong file resource.", resource1
                .equals(f1));

        // Set the selection in the navigator
        IStructuredSelection sel2 = new StructuredSelection(p2);
        part.selectReveal(sel2);
        // Get the selection the tree has
        IStructuredSelection treeSel2 = (IStructuredSelection) tree
                .getSelection();
        assertTrue("Second selection wrong size, should be only one.", treeSel2
                .size() == 1);
        IResource resource2 = (IResource) treeSel2.getFirstElement();
        assertTrue("Second selection contains wrong project resource.",
                resource2.equals(p2));
    }

    public void testWorkingSet() throws Throwable {
        setupView();
        setupResources();

        ResourceNavigator navigator = ((ResourceNavigator) view);
        IWorkingSetManager workingSetManager = fWorkbench
                .getWorkingSetManager();
        IWorkingSet workingSet = workingSetManager.createWorkingSet("ws1",
                new IAdaptable[] { f1 });

        assertNull(navigator.getWorkingSet());

        navigator.setWorkingSet(workingSet);
        assertEquals(workingSet, navigator.getWorkingSet());

        navigator.setWorkingSet(null);
        assertNull(navigator.getWorkingSet());

        FileUtil.createFile("f11.txt", p1);
        navigator.setWorkingSet(workingSet);
        TreeViewer viewer = navigator.getTreeViewer();
        viewer.expandAll();
        TreeItem[] items = viewer.getTree().getItems();
        assertEquals(p1, items[0].getData());
        items = items[0].getItems();
        assertEquals(f1, items[0].getData());
    }
}

