/*
* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/

/**
 * import midp classes.
 */
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
 * This class is to test all the StringItem tests
 */

public class FormStringItemTests extends Form implements CommandListener, ItemCommandListener
{

    //referemce to the parent MIDlet
    private Midp_StringItem_01 m = null;

    //the form to add the StringItems
    private Form stringItemForm = null;

    //the label to create the StringItem
    private TextField label = null;

    //the text to create the StringItem
    private TextField text = null;

    //the text to create the StringItem
    private TextField width = null;
    //the text to create the StringItem
    private TextField height = null;

    //the StringItem to test
    private StringItem si = null;

    private ChoiceGroup cg = null;
    private String[] cgTypes = {"LAYOUT_DEFAULT","LAYOUT_LEFT","LAYOUT_RIGHT","LAYOUT_CENTER","LAYOUT_TOP","LAYOUT_BOTTOM",
                                "LAYOUT_VCENTER","LAYOUT_NEWLINE_BEFORE","LAYOUT_NEWLINE_AFTER","LAYOUT_SHRINK","LAYOUT_VSHRINK",
                                "LAYOUT_EXPAND","LAYOUT_VEXPAND"
                               };

    //the command to go back to the main screen
    private Command cmdBack = new Command("Back", Command.BACK, 1);

    //the command to create the StringItem with the entered label and text
    private Command cmdCreate = new Command("Create", Command.SCREEN, 1);

    //the command to create the StringItem with the entered label and text and with focus
    private Command cmdCreateHL = new Command("Create as Hyperlink", Command.SCREEN, 1);

    //the command to create the StringItem with the entered label and text and with focus
    private Command cmdCreateButton = new Command("Create as Button", Command.SCREEN, 1);

    //the command to unlock the Item
    private Command cmdUnlock = new Command("Unlock", Command.SCREEN, 1);
    //the command for the item
    private Command cmdItem = new Command("Item cmd", Command.ITEM, 1);

    //the command to remove/restore the item command or the first item
    private Command cmdRemoveCommand = new Command("Remove command", Command.SCREEN, 1);
    private Command cmdRestoreCommand = new Command("Restore command", Command.SCREEN, 1);
    private Command cmdRemoveItem = new Command("Remove first item", Command.SCREEN, 1);

    //Command for adding the itemcommandlisteners for the stringitems in layout tests
    private Command cmdAddListeners = new Command("Add listeners", Command.SCREEN, 1);

    //the command for layout test
    private Command cmdLayout = new Command("Layout Test", Command.SCREEN, 1);
    //the command for layout test
    private Command cmdLayoutButton = new Command("Layout Button Test", Command.SCREEN, 1);
    //the command for layout test
    private Command cmdLayoutHL = new Command("Layout Hyperlink Test", Command.SCREEN, 1);
    //the command for layout test
    private Command cmdVLayout = new Command("Vertical Layout Test", Command.SCREEN, 1);
    //the command for layout test
    private Command cmdVLayoutHL = new Command("Vertical Layout Hyperlink Test", Command.SCREEN, 1);
    //the command for layout test
    private Command cmdVLayoutButton = new Command("Vertical Layout Button Test", Command.SCREEN, 1);
    //the command for adding a StringItem with long text
    private Command cmdLongText = new Command("Long text layout test", Command.SCREEN, 1);

    private Command cmdNext = new Command("Next", Command.SCREEN, 1);
    private Command cmdExit = new Command("Exit", Command.EXIT, 1);

    static int change = -1;

    public FormStringItemTests(Midp_StringItem_01 m)
    {
        //set the name of the form to be the name of MIDlet
        super(m.getClass().getName());
        this.m = m;

        //create TextFields
        label = new TextField("Label:", null, 200, TextField.ANY);
        text = new TextField("Text:", null, 200, TextField.ANY);
        width = new TextField("Set preferred width:", null, 5, TextField.NUMERIC);
        height = new TextField("Set preferred height:", null, 5, TextField.NUMERIC);
        cg = new ChoiceGroup("Layout:",ChoiceGroup.EXCLUSIVE,cgTypes,null);
        append(label);
        append(text);
        append(width);
        append(height);
        append(cg);
        addCommand(cmdCreate);
        addCommand(cmdCreateHL);
        addCommand(cmdCreateButton);
        addCommand(cmdLayout);
        addCommand(cmdLayoutHL);
        addCommand(cmdLayoutButton);
        addCommand(cmdVLayout);
        addCommand(cmdVLayoutHL);
        addCommand(cmdVLayoutButton);
        addCommand(cmdLongText);
        addCommand(cmdExit);
        setCommandListener(this);

        Display.getDisplay(m).setCurrent(this);

        //create StringItemForm
        stringItemForm = new Form("StringItem");
        stringItemForm.addCommand(cmdBack);
        stringItemForm.setCommandListener(this);
    }

    /**
     *  This method handles command invocations.
     *
     *@param  c  This is the command responsible for the event.
     *@param  s  Should be equal to this.
     */
    public void commandAction(Command c, Displayable s)
    {
        if (c == cmdBack)
        {
            label.setString(null);
            text.setString(null);
            Display.getDisplay(m).setCurrent(this);
        }
        else if (c == cmdLongText)
        {
            String longString = "This is a really long string. Check that you can successfully" +
                                " read the last line (congratulations).\n" +
                                "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas" +
                                " tempor nisl in quam aliquet eu posuere eros tempor. Vivamus felis" +
                                " urna, hendrerit id fringilla eu, feugiat blandit tellus. Curabitur" +
                                " scelerisque tempus ante, eu convallis ligula ultrices nec. Nullam" +
                                " vulputate aliquet ullamcorper. Lorem ipsum dolor sit amet," +
                                " consectetur adipiscing elit. Proin at odio vel urna luctus dignissim" +
                                " a quis urna. Lorem ipsum dolor sit amet, consectetur adipiscing elit." +
                                " Phasellus aliquet luctus eros vitae aliquam. Suspendisse ut magna a" +
                                " ipsum fermentum imperdiet. Maecenas eu nunc sed metus placerat" +
                                " adipiscing. Duis lacus lacus, vestibulum id vestibulum a, tempus at" +
                                " nulla. Proin sagittis nibh vitae dui interdum varius. Cras purus" +
                                " nulla, lobortis eu laoreet a, ultricies vitae sem. Integer aliquam" +
                                " ultricies metus. Nulla nec dignissim mi. Nullam risus augue, egestas" +
                                " vitae facilisis eu, adipiscing eu turpis. Nulla convallis semper" +
                                " lobortis. Nullam eget lacus nunc. Nam ipsum lectus, mattis in mollis" +
                                " eu, tristique nec nibh. Nam pellentesque euismod est, a laoreet turpis" +
                                " pulvinar bibendum. Sed malesuada lacus eu ante luctus ut faucibus odio" +
                                " tristique. Donec quis mi ante. Praesent a porta velit. Duis tincidunt" +
                                " velit eget sapien viverra pulvinar.\n" +
                                "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas" +
                                " tempor nisl in quam aliquet eu posuere eros tempor. Vivamus felis" +
                                " urna, hendrerit id fringilla eu, feugiat blandit tellus. Curabitur" +
                                " scelerisque tempus ante, eu convallis ligula ultrices nec. Nullam" +
                                " vulputate aliquet ullamcorper. Lorem ipsum dolor sit amet," +
                                " consectetur adipiscing elit. Proin at odio vel urna luctus dignissim" +
                                " a quis urna. Lorem ipsum dolor sit amet, consectetur adipiscing elit." +
                                " Phasellus aliquet luctus eros vitae aliquam. Suspendisse ut magna a" +
                                " ipsum fermentum imperdiet. Maecenas eu nunc sed metus placerat" +
                                " adipiscing. Duis lacus lacus, vestibulum id vestibulum a, tempus at" +
                                " nulla. Proin sagittis nibh vitae dui interdum varius. Cras purus" +
                                " nulla, lobortis eu laoreet a, ultricies vitae sem. Integer aliquam" +
                                " ultricies metus. Nulla nec dignissim mi. Nullam risus augue, egestas" +
                                " vitae facilisis eu, adipiscing eu turpis. Nulla convallis semper" +
                                " lobortis. Nullam eget lacus nunc. Nam ipsum lectus, mattis in mollis" +
                                " eu, tristique nec nibh. Nam pellentesque euismod est, a laoreet turpis" +
                                " pulvinar bibendum. Sed malesuada lacus eu ante luctus ut faucibus odio" +
                                " tristique. Donec quis mi ante. Praesent a porta velit. Duis tincidunt" +
                                " velit eget sapien viverra pulvinar.\n" +
                                "Now, congratulations if you can read this final line!";
            si = new StringItem("The StringItem", longString);
            stringItemForm.append(si);
            Display.getDisplay(m).setCurrent(stringItemForm);
        }
        else if (c == cmdNext)
        {
            change++;
            changeForm();
        }
        else if (c == cmdRemoveCommand)
        {
            Item item = null;
            item = stringItemForm.get(0);
            item.removeCommand(cmdUnlock);
            item.removeCommand(cmdItem);
        }
        else if (c == cmdRestoreCommand)
        {
            Item item = null;
            item = stringItemForm.get(0);
            item.addCommand(cmdUnlock);
            item.setDefaultCommand(cmdItem);
        }
        else if (c == cmdRemoveItem)
        {
            stringItemForm.delete(0);
        }
        else if (c == cmdLayout)
        {

            layoutTest(Item.PLAIN);

        }
        else if (c == cmdLayoutHL)
        {

            layoutTest(Item.HYPERLINK);

        }
        else if (c == cmdLayoutButton)
        {

            layoutTest(Item.BUTTON);

        }
        else if (c == cmdVLayout)
        {

            verticalLayoutTest(Item.PLAIN);

        }
        else if (c == cmdVLayoutHL)
        {

            verticalLayoutTest(Item.HYPERLINK);

        }
        else if (c == cmdVLayoutButton)
        {

            verticalLayoutTest(Item.BUTTON);

        }
        else if (c == cmdAddListeners)
        {
            int size = stringItemForm.size();
            for (int i = 0; i < size; i++)
            {
                Item item = null;
                item = stringItemForm.get(i);
                item.setItemCommandListener(this);
            }
        }
        else if (c == cmdExit)
        {
            m.destroyApp(false);
            m.notifyDestroyed();
        }
        else
        {
            String l = label.getString();
            String t = text.getString();
            int index = cg.getSelectedIndex();
            String lo = cg.getString(index);
            int layout = 0;

            if (c == cmdCreate)
                si = new StringItem(l, t);
            else if (c == cmdCreateHL)
            {
                si = new StringItem(l, t, Item.HYPERLINK);
                si.setDefaultCommand(cmdItem);
            }
            else if (c == cmdCreateButton)
            {
                si = new StringItem(l, t, Item.BUTTON);
                si.setDefaultCommand(cmdItem);
            }

            if (lo.equals(cgTypes[0]))
            {
                layout = Item.LAYOUT_DEFAULT;
            }
            else if (lo.equals(cgTypes[1]))
            {
                layout = Item.LAYOUT_LEFT;
            }
            else if (lo.equals(cgTypes[2]))
            {
                layout = Item.LAYOUT_RIGHT;
            }
            else if (lo.equals(cgTypes[3]))
            {
                layout = Item.LAYOUT_CENTER;
            }
            else if (lo.equals(cgTypes[4]))
            {
                layout = Item.LAYOUT_TOP;
            }
            else if (lo.equals(cgTypes[5]))
            {
                layout = Item.LAYOUT_BOTTOM;
            }
            else if (lo.equals(cgTypes[6]))
            {
                layout = Item.LAYOUT_VCENTER;
            }
            else if (lo.equals(cgTypes[7]))
            {
                layout = Item.LAYOUT_NEWLINE_BEFORE;
            }
            else if (lo.equals(cgTypes[8]))
            {
                layout = Item.LAYOUT_NEWLINE_AFTER;
            }
            else if (lo.equals(cgTypes[9]))
            {
                layout = Item.LAYOUT_SHRINK;
            }
            else if (lo.equals(cgTypes[10]))
            {
                layout = Item.LAYOUT_VSHRINK;
            }
            else if (lo.equals(cgTypes[11]))
            {
                layout = Item.LAYOUT_EXPAND;
            }
            else if (lo.equals(cgTypes[12]))
            {
                layout = Item.LAYOUT_VEXPAND;
            }
            si.setItemCommandListener(this);
            si.setLayout(layout);
            setSize(width.getString(),height.getString());
            stringItemForm.append(si);
            stringItemForm.addCommand(cmdRemoveCommand);
            stringItemForm.addCommand(cmdRestoreCommand);
            stringItemForm.addCommand(cmdRemoveItem);
            Display.getDisplay(m).setCurrent(stringItemForm);
        }
    }
    public void commandAction(Command c, Item i)
    {
        if (c == cmdBack)
        {
            label.setString(null);
            text.setString(null);
            Display.getDisplay(m).setCurrent(this);
        }
        else if (c == cmdUnlock)
        {
            i.setPreferredSize(-1,-1);
        }
        else if (c == cmdItem)
        {
            i.setLabel(i.getLabel() + ".");
        }
    }
    private void setSize(String width, String height)
    {
        if (width.equals("") && height.equals(""))
        {
            si.setPreferredSize(-1,-1);
        }
        else if (height.equals(""))
        {
            si.setPreferredSize(Integer.parseInt(width),-1);
        }
        else if (width.equals(""))
        {
            si.setPreferredSize(-1,Integer.parseInt(height));
        }
        else
        {
            si.setPreferredSize(Integer.parseInt(width),Integer.parseInt(height));
        }
    }
    private void layoutTest(int mode)
    {
        stringItemForm.deleteAll();
        stringItemForm.addCommand(cmdAddListeners);
        si = new StringItem("Default Layout","StringItem",mode);

        StringItem si2 = new StringItem("Layout Right","StringItem",mode);
        si2.setLayout(StringItem.LAYOUT_RIGHT);

        StringItem si3 = new StringItem("Layout Left","StringItem",mode);
        si3.setLayout(StringItem.LAYOUT_LEFT);

        StringItem si4 = new StringItem("Layout Center","StringItem",mode);
        si4.setLayout(StringItem.LAYOUT_CENTER);

        StringItem si5 = new StringItem("Layout Expand","StringItem",mode);
        si5.setLayout(StringItem.LAYOUT_EXPAND | StringItem.LAYOUT_NEWLINE_BEFORE);
        si5.setDefaultCommand(cmdBack);

        if (mode != Item.PLAIN)
        {
            si.setDefaultCommand(cmdBack);
            si2.setDefaultCommand(cmdBack);
            si3.setDefaultCommand(cmdBack);
            si4.setDefaultCommand(cmdBack);
        }
        stringItemForm.append(si);
        stringItemForm.append(si2);
        stringItemForm.append(si3);
        stringItemForm.append(si4);
        stringItemForm.append(si5);

        Display.getDisplay(m).setCurrent(stringItemForm);
    }

    private void verticalLayoutTest(int mode)
    {
        stringItemForm.deleteAll();
        si = new StringItem("Default","String",mode);
        Spacer sp = new Spacer(10, this.getHeight());
        if (mode != Item.PLAIN)
        {
            si.setDefaultCommand(cmdBack);
        }
        stringItemForm.addCommand(cmdNext);

        stringItemForm.append(si);
        stringItemForm.append(sp);
        Display.getDisplay(m).setCurrent(stringItemForm);
    }
    private void changeForm()
    {

        switch (change)
        {
        case -1:
            stringItemForm.setTitle("Default");
            si.setLabel("Default");
            si.setLayout(StringItem.LAYOUT_DEFAULT);
            break;
        case 0:
            stringItemForm.setTitle("Default(75,75)");
            si.setPreferredSize(75,75);
            break;
        case 1:
            stringItemForm.setTitle("Top");
            si.setPreferredSize(-1,-1);
            si.setLabel("Top");
            si.setLayout(StringItem.LAYOUT_TOP);
            break;
        case 2:
            stringItemForm.setTitle("Top(75,75)");
            si.setPreferredSize(75,75);
            break;
        case 3:
            stringItemForm.setTitle("Vcenter");
            si.setPreferredSize(-1,-1);
            si.setLabel("VCenter");
            si.setLayout(StringItem.LAYOUT_VCENTER);
            break;
        case 4:
            stringItemForm.setTitle("Vcenter(75,75)");
            si.setPreferredSize(75,75);
            break;
        case 5:
            stringItemForm.setTitle("Bottom");
            si.setPreferredSize(-1,-1);
            si.setLabel("Bottom");
            si.setLayout(StringItem.LAYOUT_BOTTOM);
            break;
        case 6:
            stringItemForm.setTitle("Bottom(75,75)");
            si.setPreferredSize(75,75);
            break;
        case 7:
            stringItemForm.setTitle("Vexpand");
            si.setPreferredSize(-1,-1);
            si.setLabel("Vexpand");
            si.setLayout(StringItem.LAYOUT_VEXPAND);
            break;
        case 8:
            change = -1;
            changeForm();
            return;
        }
    }
}
