Hello co-testers, hello Ketan Padegaonkar,

it's time to keep my promise and show you the code for the SWT
replacements. I simply pasted them into the mail. You can use it under
the same license terms, as SWTBot itself.  If want  the code in a more
suitable form (zipped eclipse project...), drop me a mail.

The first code is the core of this replacement - it is a static
factory, that your application code can use to show dialogs.

===================== Code Listing NativeDialogFactory
======================================


/*******************************************************************************
 * Copyright (c) 2009 Jan Petranek.
 * 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
 *
 
*******************************************************************************/

import org.apache.log4j.Logger;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;

/**
 * The Class NativeDialogFactory is a configurable Dialog factory.
 *
 * By default, it handles user dialogs with native dialogs (SWT).
 * When the state is set to  TESTING, it displays stand-in dialogs.
 * Those stand-ins may be way simpler than the native widgets,
 * but they are accessible by SWTBot.
 *
 * @author Jan Petranek
 */
public class NativeDialogFactory {

        /** The Log4j logger instance. */
        static final Logger logger = 
Logger.getLogger(NativeDialogFactory.class);

        /**
         * The Enumeration DialogState, used to indicate the mode of operation.
         */
        public enum OperationMode {

                /** The DEFAULT state, for normal operation. */
                DEFAULT,
                /** The TESTING state, used to indicate SWTBot-Testing needs
stand-in dialogs. */
                TESTING
        };

        /** The mode of operation. */
        private static OperationMode mode = OperationMode.DEFAULT;

        /**
         * Sets the  operation mode.
         *
         * @param state the desired operation mode
         */
        public static void setMode(OperationMode mode) {
                NativeDialogFactory.mode = mode;
        }

        /**
         * Gets the operation mode.
         *
         * @return the current operation mode
         */
        public static OperationMode getMode() {
                return mode;
        }

        /**
         * Shows a file selection dialog.
         *
         * In default mode, this displays a native file selection dialog.
         * In testing mode, a simple InputDialog is displayed, where the path
can be entered as a String.
         *
         * @param shell the parent shell
         * @param text title for the file selection dialog
         * @param style the style of the file dialog, applies only to native
dialogs (SWT.SAVE| SWT.OPEN | SWT.MULTI)
         *
         * @return a String with the selected file name. It is still up to
the user to check, if the
         * filename is valid. When the user has aborted the file selection,
this returns null.
         *
         */
        public static String fileSelectionDialog(Shell shell, String text, int 
style) {
                switch (getMode()) {

                case DEFAULT: {
                        // File standard dialog
                        FileDialog fileDialog = new FileDialog(shell, style);
                        fileDialog.setText(text);
                        return fileDialog.open();
                }
                case TESTING: {
                        InputDialog fileDialog = new InputDialog(shell, text,
                                        "Select a file", "", new 
DummyInputValidator());
                        fileDialog.open();
                        return fileDialog.getValue();
                }

                default:
                        final String msg = "Reached default case in
NativeDialogFactory.fileSelectionDialog, this is a bug, unknown state
"
                                        + getMode();
                        logger.warn(msg);
                        throw new RuntimeException(msg);

                }

        }

        /**
         * Show message box.
         *
         * In default mode, a native MessageBox is used.
         * In testing mode, we use a MessageDialog, showing the same title and 
message.
         *      
         * @param messageText the text of the message
         * @param title the title
         * @param iconStyle the icon style
         * @param shell the parent shell
         */
        public static void showMessageBox(Shell shell, String messageText,
                        final String title, final int iconStyle) {
                if (shell == null) {
                        logger
                                        .fatal("Shell not yet instantiated, 
cannot display error message");
                } else {
                        switch (getMode()) {
                        case DEFAULT: {
                                MessageBox messageBox = new MessageBox(shell, 
iconStyle);
                                messageBox.setMessage(messageText);

                                messageBox.setText(title);

                                messageBox.open();
                                break;
                        }
                        case TESTING: {
                                MessageDialog messagDialog = new 
MessageDialog(shell, title,
                                                null, messageText, iconStyle, 
new String[] { "OK" }, 0);
                                messagDialog.open();
                                break;
                        }
                        default:
                                final String msg = "Reached default case in 
NativeDialogFactory,
this is a bug, unknown state "
                                                + getMode();
                                logger.warn(msg);
                                throw new RuntimeException(msg);
                        }
                }
        }
}
================== END LISTING =============================================

Within the same package, I placed a basic Input validator, simply
because the dialogs need one
(100% SWT-Boilerplate code ;-)

=================== LISTING DummyInputEvaluator ==============================

import org.eclipse.jface.dialogs.IInputValidator;

/**
 * The DummyInputValidator will accept any input.
 *
 * @author Jan Petranek
 *
 */
public class DummyInputValidator implements IInputValidator {

        /**
         * Always accepts the input.
         *
         * @param newText
         *            text to accept
         * @return always returns null
         * @see 
org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String)
         */
        public String isValid(String newText) {

                return null;
        }
}
================== END LISTING =============================================

The next snippet shows you how you can use the file selection dialog
within your application code

=================== LISTING SaveAsHandler ==============================

public class SaveAsHandler extends AbstractHandler implements IHandler {


        public Object execute(ExecutionEvent event) throws ExecutionException {

                        // File standard dialog
                String selected = NativeDialogFactory.fileSelectionDialog(
                                SingletonHolder.getShell(), "Save as...", 
SWT.SAVE);

                if (selected == null) {
                        logger.info("File selection aborted");
                        return null;
                }

                File file = new File(selected);
        
                // if the file exists, check for writeability

                if (!file.exists() || (file.exists() && file.canWrite())) {
                    // whatever you do with the selected file ...
================== END LISTING =============================================

Last, but not least, a code snippet with the test code:

=================== LISTING MyFirstTest ==============================
        @Test
        public void testSaveAsUsingMockDialog() throws Exception {
                // name of file where to save to
                String destinationFile = "/tmp/created.file";

                // set the operation mode to testing
                
NativeDialogFactory.setMode(NativeDialogFactory.OperationMode.TESTING);

                bot.menu("File").menu("Save As...").click();

                // assert we see the Save As Dialog by checking the title:
                assertEquals("Dialog title for Save As Dialog", "Save as...", 
bot
                                .activeShell().getText());

                // enter the file name
                // our factory will use a simple dialog, where we can
                // set the file name into the text box
                bot.text().setText(destinationFile);

                // assert we see an "OK"-Button at position 0 and push it
                assertEquals("Button in File Dialog", "OK", 
bot.button(0).getText());
                bot.button(0).click();

                // check the message saying that our file was saved
                assertEquals("We should see a message saying the file was 
saved",
                                "File saved", bot.activeShell().getText());

                // assert we see an "OK"-Button at position 0 and push it
                assertEquals("Button in Message Dialog", "OK", 
bot.button(0).getText());
                bot.button(0).click();
        }
================== END LISTING =============================================

That's it for today, have a nice weekend,

Jan Petranek
_______________________________________________
swtbot-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/swtbot-dev

Reply via email to