UpgradingSample.java
/* 
 * Copyright 2008 IT Mill Ltd.
 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 
 * http://www.apache.org/licenses/LICENSE-2.0
 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.itmill.toolkit.demo;

//
// Millstone imports were replaced
//
// import org.millstone.base.Application;
// import org.millstone.base.ui.*;
// import org.millstone.base.data.*;
//
import com.itmill.toolkit.Application;
import com.itmill.toolkit.data.Property;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.CustomComponent;
import com.itmill.toolkit.ui.GridLayout;
import com.itmill.toolkit.ui.Label;
import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Panel;
import com.itmill.toolkit.ui.TextField;
import com.itmill.toolkit.ui.Tree;
import com.itmill.toolkit.ui.Window;

/**
 <p>
 * Example application demonstrating simple user login. This example is from
 * MillStone 3.1.1 examples section. Upgrading from 3.1.1 to 4.0.0 was done by
 * updating imports, also setTheme("corporate") call was added to application
 * init method.
 </p>
 
 @since 3.1.1
 @author IT Mill Ltd.
 */
public class UpgradingSample extends Application implements
        Property.ValueChangeListener {

    /* Menu for navigating inside the application. */
    private final Tree menu = new Tree();

    /* Contents of the website */
    private final String[][] pages = {
            "Welcome""Welcome to our website..." },
            "Products""Public product information." },
            "Contact""Public contact information." },
            "CRM""CRM Database requiring login." },
            "Intranet""Internal information database." } };

    /* Application layout */
    private final GridLayout layout = new GridLayout(21);

    /* Initialize the application */
    public void init() {

        // Create the main window of the application
        final Window main = new Window("Login example", layout);
        setMainWindow(main);

        // Add menu and loginbox to the application
        final OrderedLayout l = new OrderedLayout();
        layout.addComponent(l, 00);
        l.addComponent(menu);
        l.addComponent(new LoginBox());

        // Setup menu
        menu.setStyleName("menu");
        menu.addListener(this);
        menu.setImmediate(true);
        addToMenu(new String[] { "Welcome""Products""Contact" });
    }

    // Overriding usetUser method is a simple way of updating application
    // privileges when the user is changed
    public void setUser(Object user) {
        super.setUser(user);
        if (user != null) {
            addToMenu(new String[] { "CRM""Intranet" });
        }
    }

    public void addToMenu(String[] items) {
        for (int i = 0; i < items.length; i++) {
            menu.addItem(items[i]);
            menu.setChildrenAllowed(items[i]false);
        }
        if (menu.getValue() == null) {
            menu.setValue(items[0]);
        }
    }

    // Handle menu selection and update visible page
    public void valueChange(Property.ValueChangeEvent event) {
        layout.removeComponent(10);
        final String title = (Stringmenu.getValue();
        for (int i = 0; i < pages.length; i++) {
            if (pages[i][0].equals(title)) {
                final Panel p = new Panel(pages[i][0]);
                p.addComponent(new Label(pages[i][1]));
                p.setStyleName("strong");
                layout.addComponent(p, 10);
            }
        }
    }

    // Simple loginbox component for the application
    public class LoginBox extends CustomComponent implements
            Application.UserChangeListener {

        // The components this loginbox is composed of
        private final TextField loginName = new TextField("Name");

        private final Button loginButton = new Button("Enter", this, "login");

        private final Panel loginPanel = new Panel("Login");

        private final Panel statusPanel = new Panel();

        private final Button logoutButton = new Button("Logout",
                UpgradingSample.this, "close");

        private final Label statusLabel = new Label();

        // Initialize login component
        public LoginBox() {

            // Initialize the component
            loginPanel.addComponent(loginName);
            loginPanel.addComponent(loginButton);
            loginPanel.setStyleName("strong");
            loginName.setColumns(8);
            statusPanel.addComponent(statusLabel);
            statusPanel.addComponent(logoutButton);

            // Set the status of the loginbox and show correct
            // components
            updateStatus();

            // Listen application user change events
            UpgradingSample.this.addListener(this);
        }

        // Login into application
        public void login() {
            final String name = (StringloginName.getValue();
            if (name != null && name.length() 0) {
                setUser(name);
            }
            loginName.setValue("");
        }

        // Update login status on application user change events
        public void applicationUserChanged(Application.UserChangeEvent event) {
            updateStatus();
        }

        // Update login status of the component by exposing correct
        // components
        private void updateStatus() {
            statusLabel.setValue("User: " + getUser());
            if (getUser() != null) {
                setCompositionRoot(statusPanel);
            else {
                setCompositionRoot(loginPanel);
            }
        }
    }
}