TableDemo.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;

import java.sql.SQLException;

import com.itmill.toolkit.data.util.QueryContainer;
import com.itmill.toolkit.demo.util.SampleDatabase;
import com.itmill.toolkit.event.Action;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.Label;
import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Table;
import com.itmill.toolkit.ui.Window;

/**
 * Similar to QueryContainerDemo
 
 @author IT Mill Ltd.
 @since 4.0.0
 
 */
public class TableDemo extends com.itmill.toolkit.Application implements
        Action.Handler {

    private static final String ACTION_DESCRIPTION = "Use right mouse button to initiate "
            "actions menu.<br />Note: on Opera use meta key "
            "and left mouse button.";

    private static final String TABLE_CAPTION = SampleDatabase.ROWCOUNT
            " dynamically loaded rows from example SQL table";

    // Table component where SQL rows are attached (using QueryContainer)
    private final Table table = new Table();

    // Label which displays last performed action against table row
    private final Label tableLastAction = new Label(
            "No action selected for table.");

    // Database provided with sample data
    private SampleDatabase sampleDatabase;

    // Example Actions for table
    private final Action ACTION1 = new Action("Upload");

    private final Action ACTION2 = new Action("Download");

    private final Action ACTION3 = new Action("Show history");

    private final Action[] actions = new Action[] { ACTION1, ACTION2, ACTION3 };

    // Button which is used to disable or enable table
    // note: when button click event occurs, tableEnabler() method is called
    private final Button tableEnabler = new Button("Disable table", this,
            "tableEnabler");

    // Button which is used to hide or show table
    // note: when button click event occurs, tableVisibility() method is called
    private final Button tableVisibility = new Button("Hide table", this,
            "tableVisibility");

    // Button which is used to hide or show table
    // note: when button click event occurs, tableVisibility() method is called
    private final Button tableCaption = new Button("Hide caption", this,
            "tableCaption");

    /**
     * Initialize Application. Demo components are added to main window.
     */
    public void init() {
        final Window main = new Window("Table demo");
        setMainWindow(main);

        // create demo database
        sampleDatabase = new SampleDatabase();

        // Main window contains heading, two buttons, table and label
        main
                .addComponent(new Label(
                        "<h1>Table demo</h1>"
                                "<b>Rows are loaded from the server as they are needed.<br />"
                                "Try scrolling the table to see it in action.</b><br />"
                                + ACTION_DESCRIPTION, Label.CONTENT_XHTML));
        final OrderedLayout layout = new OrderedLayout(
                OrderedLayout.ORIENTATION_HORIZONTAL);
        layout.addComponent(tableVisibility);
        layout.addComponent(tableEnabler);
        layout.addComponent(tableCaption);
        main.addComponent(layout);
        main.addComponent(table);
        main.addComponent(tableLastAction);

        // initialize demo components
        initTable();
    }

    /**
     * Populates table component with all rows from employee table.
     
     */
    private void initTable() {
        // init table
        table.setCaption(TABLE_CAPTION);
        table.setPageLength(10);
        table.setSelectable(true);
        table.setRowHeaderMode(Table.ROW_HEADER_MODE_INDEX);
        table.setColumnCollapsingAllowed(true);
        table.setColumnReorderingAllowed(true);
        table.setSelectable(true);
        // this class handles table actions (see handleActions method below)
        table.addActionHandler(this);
        table.setDescription(ACTION_DESCRIPTION);

        // populate Toolkit table component with test SQL table rows
        try {
            final QueryContainer qc = new QueryContainer(
                    "SELECT * FROM employee", sampleDatabase.getConnection());
            table.setContainerDataSource(qc);
        catch (final SQLException e) {
            e.printStackTrace();
        }
        // define which columns should be visible on Table component
        table.setVisibleColumns(new Object[] { "FIRSTNAME""LASTNAME",
                "TITLE""UNIT" });
        table.setItemCaptionPropertyId("ID");
    }

    public void tableVisibility() {
        if (table.isVisible()) {
            tableVisibility.setCaption("Show table");
            table.setVisible(false);
            tableEnabler.setEnabled(false);
            tableCaption.setEnabled(false);
        else {
            tableVisibility.setCaption("Hide table");
            table.setVisible(true);
            tableEnabler.setEnabled(true);
            tableCaption.setEnabled(true);
        }
    }

    public void tableEnabler() {
        if (table.isEnabled()) {
            tableEnabler.setCaption("Enable table");
            table.setEnabled(false);
        else {
            tableEnabler.setCaption("Disable table");
            table.setEnabled(true);
        }
    }

    public void tableCaption() {
        if (table.getCaption().equals("")) {
            table.setCaption(TABLE_CAPTION);
            tableCaption.setCaption("Hide caption");
        else {
            table.setCaption("");
            tableCaption.setCaption("Show caption");
        }
    }

    /**
     * URIHandler Return example actions
     */
    public Action[] getActions(Object target, Object sender) {
        return actions;
    }

    /**
     * Executed by right mouse button on table or tree component.
     */
    public void handleAction(Action action, Object sender, Object target) {
        if (sender == table) {
            tableLastAction.setValue("Last action clicked was '"
                    + action.getCaption() "' on item " + target);
        }
    }

}