/*******************************************************************************
 * Copyright (c) 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.commands;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.commands.ExecutionException;
import org.eclipse.ui.commands.ICommand;
import org.eclipse.ui.commands.IWorkbenchCommandSupport;
import org.eclipse.ui.commands.NotHandledException;
import org.eclipse.ui.tests.harness.util.UITestCase;

/**
 * A test for whether the select all handler will send a selection event.
 * 
 * @since 3.1
 */
public final class Bug74982Test extends UITestCase {

    /**
     * Whether the selection event has been fired.
     */
    private boolean selectionEventFired = false;

    /**
     * Constructs a new instance of <code>Bug74982Test</code>.
     * 
     * @param name
     *            The name of the test
     */
    public Bug74982Test(final String name) {
        super(name);
    }

    /**
     * Tests that the <code>SelectAllHandler</code> triggers a selection
     * event. Creates a dialog with a text widget, gives the text widget focus,
     * and then calls the select all command. This should then call the
     * <code>SelectAllHandler</code> and trigger a selection event.
     * 
     * @throws ExecutionException
     *             If the <code>SelectAllHandler</code> is broken in some way.
     * @throws NotHandledException
     *             If the dialog does not have focus, or if the
     *             <code>WorkbenchCommandSupport</code> class is broken in
     *             some way.
     */
    public final void testSelectAllHandlerSendsSelectionEvent()
            throws ExecutionException, NotHandledException {
        // Create a dialog with a text widget.
        final Shell dialog = new Shell(fWorkbench.getActiveWorkbenchWindow()
                .getShell());
        dialog.setLayout(new GridLayout());
        final Text text = new Text(dialog, SWT.SINGLE);
        text.setText("Mooooooooooooooooooooooooooooo");
        text.setLayoutData(new GridData());
        text.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                selectionEventFired = true;
            }
        });

        // Open the dialog and give the text widget focus.
        dialog.pack();
        dialog.open();
        text.setFocus();

        // Spin the event loop to make sure focus is set-up properly.
        final Display display = fWorkbench.getDisplay();
        while (display.readAndDispatch()) {
        	// Do nothing
        }

        // Get the select all command and execute it.
        final IWorkbenchCommandSupport commandSupport = fWorkbench
                .getCommandSupport();
        final ICommand selectAllCommand = commandSupport.getCommandManager()
                .getCommand("org.eclipse.ui.edit.selectAll");
        selectAllCommand.execute(null);

        // Check to see if the selection event has been fired.
        assertTrue(
                "The selection event was not fired when the SelectAllHandler was used.",
                selectionEventFired);
    }
}
