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

import org.eclipse.ui.IPageListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.tests.harness.util.UITestCase;

/**
 * Tests the IPageListener class.
 */
public class IPageListenerTest extends UITestCase implements IPageListener {
    private IWorkbenchWindow fWindow;

    private int eventsReceived = 0;

    final private int OPEN = 0x01;

    final private int CLOSE = 0x02;

    final private int ACTIVATE = 0x04;

    private IWorkbenchPage pageMask;

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

    protected void doSetUp() throws Exception {
        super.doSetUp();
        fWindow = openTestWindow();
        fWindow.addPageListener(this);
    }

    protected void doTearDown() throws Exception {
        fWindow.removePageListener(this);
        super.doTearDown();
    }

    /**
     * Tests the pageOpened method.
     */
    public void testPageOpened() throws Throwable {
        /*
         * Commented out because until test case can be updated to work
         * with new window/page/perspective implementation
         * 
         // From Javadoc: "Notifies this listener that the given page has been opened."
         
         // Test open page.
         eventsReceived = 0;
         IWorkbenchPage page = fWindow.openPage(EmptyPerspective.PERSP_ID,
         fWorkspace);
         assertEquals(eventsReceived, OPEN|ACTIVATE);
         
         // Close page.
         page.close();
         */
    }

    /**
     * Tests the pageClosed method.
     */
    public void testPageClosed() throws Throwable {
        /*
         * Commented out because until test case can be updated to work
         * with new window/page/perspective implementation
         * 
         // From Javadoc: "Notifies this listener that the given page has been closed."
         
         // Open page.
         IWorkbenchPage page = fWindow.openPage(EmptyPerspective.PERSP_ID,
         fWorkspace);
         
         // Test close page.
         eventsReceived = 0;
         pageMask = page;
         page.close();
         assertEquals(eventsReceived, CLOSE);
         */
    }

    /**
     * Tests the pageActivated method.
     */
    public void testPageActivate() throws Throwable {
        /*
         * Commented out because until test case can be updated to work
         * with new window/page/perspective implementation
         * 
         // From Javadoc: "Notifies this listener that the given page has been activated."
         
         // Add pages.
         IWorkbenchPage page1 = fWindow.openPage(EmptyPerspective.PERSP_ID,
         fWorkspace);
         IWorkbenchPage page2 = fWindow.openPage(EmptyPerspective.PERSP_ID,
         fWorkspace);
         
         // Test activation of page 1.
         eventsReceived = 0;
         pageMask = page1;
         fWindow.setActivePage(page1);
         assertEquals(eventsReceived, ACTIVATE);

         // Test activation of page 2.
         eventsReceived = 0;		
         pageMask = page2;
         fWindow.setActivePage(page2);
         assertEquals(eventsReceived, ACTIVATE);
         
         // Cleanup.
         page1.close();
         page2.close();
         */
    }

    /**
     * @see IPageListener#pageActivated(IWorkbenchPage)
     */
    public void pageActivated(IWorkbenchPage page) {
        if (pageMask == null || page == pageMask)
            eventsReceived |= ACTIVATE;
    }

    /**
     * @see IPageListener#pageClosed(IWorkbenchPage)
     */
    public void pageClosed(IWorkbenchPage page) {
        if (pageMask == null || page == pageMask)
            eventsReceived |= CLOSE;
    }

    /**
     * @see IPageListener#pageOpened(IWorkbenchPage)
     */
    public void pageOpened(IWorkbenchPage page) {
        if (pageMask == null || page == pageMask)
            eventsReceived |= OPEN;
    }

}
