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

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.ui.texteditor.IDocumentProvider;

/**
 * This class is an example of the implementation of a simple parser.
 */
public class UserFileParser {
    /**
     * Return the fabricated result for this example.
     *
     */
    private static IAdaptable getFabricatedResult() {
        // returns fabricated input. 
        GroupElement root = new GroupElement(
                MessageUtil.getString("Everybody"), null); //$NON-NLS-1$
        GroupElement userGroup = root.createSubGroup(MessageUtil
                .getString("Company_Inc")); //$NON-NLS-1$
        GroupElement ottGroup = userGroup.createSubGroup(MessageUtil
                .getString("Waterloo_Lab")); //$NON-NLS-1$
        userGroup.createSubGroup(MessageUtil.getString("Toronto_Lab")); //$NON-NLS-1$
        userGroup.createSubGroup(MessageUtil.getString("Hamilton_Lab")); //$NON-NLS-1$
        userGroup.createSubGroup(MessageUtil.getString("London_Lab")); //$NON-NLS-1$
        userGroup.createSubGroup(MessageUtil.getString("Grimsby_Lab")); //$NON-NLS-1$
        GroupElement uiTeam = ottGroup.createSubGroup(MessageUtil
                .getString("Team1")); //$NON-NLS-1$
        //
        UserElement user1 = uiTeam.createUser("richard"); //$NON-NLS-1$
        user1.setFullName(new Name(MessageUtil.getString("Richard_Zokol"))); //$NON-NLS-1$
        user1.setEmailAddress(new EmailAddress(MessageUtil
                .getString("rzokol@company.com"))); //$NON-NLS-1$
        user1.setPhoneNumber("x789"); //$NON-NLS-1$
        user1
                .setAddress(new Address(
                        new StreetAddress(232, MessageUtil
                                .getString("Champlain")), MessageUtil.getString("Hull"), new Integer(5), MessageUtil.getString("A1B2C3"))); //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
        user1.setBirthday(new Birthday(18, 1, 1981));
        user1.setCoop(new Boolean(true));
        user1.setHairColor(new RGB(0, 0, 0));
        user1.setEyeColor(new RGB(0, 0, 0));
        //
        UserElement user2 = uiTeam.createUser("george"); //$NON-NLS-1$
        user2.setFullName(new Name(MessageUtil.getString("George_Knudson"))); //$NON-NLS-1$
        user2.setEmailAddress(new EmailAddress(MessageUtil
                .getString("gknudson@company.com"))); //$NON-NLS-1$
        user2.setPhoneNumber("x678"); //$NON-NLS-1$
        user2
                .setAddress(new Address(
                        new StreetAddress(),
                        MessageUtil.getString("Toronto"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
        user2.setBirthday(new Birthday(7, 5, 1978));
        user2.setCoop(new Boolean(true));
        user2.setHairColor(new RGB(0, 0, 0));
        user2.setEyeColor(new RGB(0, 0, 0));

        //
        UserElement user3 = uiTeam.createUser("arnold"); //$NON-NLS-1$
        user3.setFullName(new Name(MessageUtil.getString("Arnold_Palmer"))); //$NON-NLS-1$
        user3.setEmailAddress(new EmailAddress(MessageUtil
                .getString("apalmer@company.com"))); //$NON-NLS-1$
        user3.setPhoneNumber("x567"); //$NON-NLS-1$
        user3
                .setAddress(new Address(
                        new StreetAddress(),
                        MessageUtil.getString("Ottawa"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
        user3.setBirthday(new Birthday(11, 23, 1962));
        user3.setHairColor(new RGB(0, 0, 0));
        user3.setEyeColor(new RGB(0, 0, 0));

        //
        UserElement user4 = uiTeam.createUser("lee"); //$NON-NLS-1$
        user4.setFullName(new Name(MessageUtil.getString("Lee_Trevino"))); //$NON-NLS-1$
        user4.setEmailAddress(new EmailAddress(MessageUtil
                .getString("ltrevino@company.com"))); //$NON-NLS-1$
        user4.setPhoneNumber("x456"); //$NON-NLS-1$
        user4
                .setAddress(new Address(
                        new StreetAddress(),
                        MessageUtil.getString("Ottawa"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
        //
        UserElement user5 = uiTeam.createUser("tiger"); //$NON-NLS-1$
        user5.setFullName(new Name(MessageUtil.getString("Tiger_Woods"))); //$NON-NLS-1$
        user5.setEmailAddress(new EmailAddress(MessageUtil
                .getString("twoods@company.com"))); //$NON-NLS-1$
        user5.setPhoneNumber("x345"); //$NON-NLS-1$
        user5
                .setAddress(new Address(
                        new StreetAddress(),
                        MessageUtil.getString("Ottawa"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
        //
        UserElement user6 = uiTeam.createUser("jack"); //$NON-NLS-1$
        user6.setFullName(new Name(MessageUtil.getString("Jack_Nicklaus"))); //$NON-NLS-1$
        user6.setEmailAddress(new EmailAddress(MessageUtil
                .getString("jnicklaus@company.com"))); //$NON-NLS-1$
        user6.setPhoneNumber("x234 "); //$NON-NLS-1$
        user6
                .setAddress(new Address(
                        new StreetAddress(),
                        MessageUtil.getString("Ottawa"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
        //
        UserElement greg = uiTeam.createUser("weslock"); //$NON-NLS-1$
        greg.setFullName(new Name(MessageUtil.getString("Weslock"))); //$NON-NLS-1$
        greg.setEmailAddress(new EmailAddress(MessageUtil
                .getString("weslock@company.com"))); //$NON-NLS-1$
        greg.setPhoneNumber("x123"); //$NON-NLS-1$
        greg
                .setAddress(new Address(
                        new StreetAddress(),
                        MessageUtil.getString("Ottawa"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$

        return root;
    }

    /**
     * Parse the input given by the argument. For this example we do no parsing and return
     * a fabricated result.
     *
     */
    public IAdaptable parse(IDocumentProvider documentProvider) {

        return getFabricatedResult();
    }
}
