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

import java.util.List;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.dialogs.IWorkingSetPage;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.dialogs.WorkingSetNewWizard;
import org.eclipse.ui.internal.dialogs.WorkingSetTypePage;
import org.eclipse.ui.internal.registry.WorkingSetDescriptor;
import org.eclipse.ui.internal.registry.WorkingSetRegistry;
import org.eclipse.ui.tests.harness.util.ArrayUtil;
import org.eclipse.ui.tests.harness.util.DialogCheck;

/**
 * Tests the WorkingSetNewWizard.
 * Tests input validation, presence of type page and correct edit page
 * and wizard page texts.
 */
public class UINewWorkingSetWizardAuto extends UIWorkingSetWizardsAuto {

    public UINewWorkingSetWizardAuto(String name) {
        super(name);
    }

    protected void doSetUp() throws Exception {
        fWizard = getWorkbench().getWorkingSetManager().createWorkingSetNewWizard(null);
        super.doSetUp();
    }

    public void testTypePage() throws Throwable {
        IWizardPage page = fWizardDialog.getCurrentPage();
        WorkingSetDescriptor[] descriptors = getEditableWorkingSetDescriptors();
        
        // the first page must be the type selection page iff there is more than one working set type
        assertEquals(descriptors.length > 1, (page instanceof WorkingSetTypePage));

        /*
         * Should have at least resourceWorkingSetPage and MockWorkingSet
         */
        assertTrue(descriptors.length >= 2);
        if (page instanceof WorkingSetTypePage) {
            WorkingSetTypePage typePage = (WorkingSetTypePage) page;
            List widgets = getWidgets((Composite) page.getControl(),
                    Table.class);
            Table table = (Table) widgets.get(0);
            /*
             * Test initial page state
             */
            assertEquals(descriptors.length, table.getItemCount());
            assertTrue(typePage.canFlipToNextPage() == false);
            assertTrue(fWizard.canFinish() == false);
            /*
             * Test page state with page complete input
             */
            table.setSelection(descriptors.length - 1);
            table.notifyListeners(SWT.Selection, new Event());
            assertTrue(typePage.canFlipToNextPage());
            assertTrue(fWizard.canFinish() == false);

            /*
             * Check page texts 
             */
            DialogCheck.assertDialogTexts(fWizardDialog, this);
        }
    }

    public void testEditPage() throws Throwable {
        WorkingSetRegistry registry = WorkbenchPlugin.getDefault()
                .getWorkingSetRegistry();
        IWizardPage page = fWizardDialog.getCurrentPage();
        IWizardPage defaultEditPage = registry.getDefaultWorkingSetPage();
        String defaultEditPageClassName = defaultEditPage.getClass().getName();
        WorkingSetDescriptor[] descriptors = getEditableWorkingSetDescriptors();
        
        // the first page must be the type selection page iff there is more than one working set type
        assertEquals(descriptors.length > 1, (page instanceof WorkingSetTypePage));

        if (page instanceof WorkingSetTypePage) {
            /*
             * Select the default (Resource) working set type
             * and advance to edit page.
             */
            List widgets = getWidgets((Composite) page.getControl(),
                    Table.class);
            Table table = (Table) widgets.get(0);
            TableItem[] items = table.getItems();
            String workingSetName = null;
            for (int descriptorIndex = 0; descriptorIndex < descriptors.length; descriptorIndex++) {
                WorkingSetDescriptor descriptor = descriptors[descriptorIndex];
                if (defaultEditPageClassName.equals(descriptor
                        .getPageClassName())) {
                    workingSetName = descriptor.getName();
                    break;
                }
            }
            assertNotNull(workingSetName);
            boolean found = false;
            for (int i = 0; i < items.length; i++) {
                if (items[i].getText().equals(workingSetName)) {
                    table.setSelection(i);
                    found = true;
                    break;
                }
            }
            assertTrue(found);
            fWizardDialog.showPage(fWizard.getNextPage(page));
        }
        page = fWizardDialog.getCurrentPage();
        assertTrue(page instanceof IWorkingSetPage);

        /*
         * Verify that correct working set edit page is displayed
         */
        assertTrue(page.getClass() == defaultEditPage.getClass());
        /*
         * Test initial page state
         */
        assertFalse(page.canFlipToNextPage());
        assertFalse(fWizard.canFinish());
        assertNull(page.getErrorMessage());
        assertNull(page.getMessage());
        
        /*
         * Test page state with partial page input
         */
        setTextWidgetText(WORKING_SET_NAME_1, page);
        assertFalse(page.canFlipToNextPage());
        assertTrue(fWizard.canFinish());  // allow for empty sets
        assertNull(page.getErrorMessage());
        assertNotNull(page.getMessage());

        /*
         * Test page state with page complete input
         */
        checkTreeItems();
        assertFalse(page.canFlipToNextPage());
        assertTrue(fWizard.canFinish());
        assertNull(page.getErrorMessage());
        assertNull(page.getMessage());

        fWizard.performFinish();
        IWorkingSet workingSet = ((WorkingSetNewWizard) fWizard).getSelection();
        IAdaptable[] workingSetItems = workingSet.getElements();
        assertEquals(WORKING_SET_NAME_1, workingSet.getName());

        List widgets = getWidgets((Composite) page.getControl(), Tree.class);
        Tree tree = (Tree) widgets.get(0);
        assertEquals(workingSetItems.length, tree.getItemCount());
        assertTrue(ArrayUtil.contains(workingSetItems, p1));
        assertTrue(ArrayUtil.contains(workingSetItems, p2));

        /*
         * Check page texts 
         */
        DialogCheck.assertDialogTexts(fWizardDialog, this);
    }
}

