next.i.view.XTableCell.java Source code

Java tutorial

Introduction

Here is the source code for next.i.view.XTableCell.java

Source

/*
 * Copyright 2011 Vancouver Ywebb Consulting 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 next.i.view;

import next.i.XStyle;
import next.i.controller.XTableController;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;

/**
 * This class defines the attributes and behavior of cells in a table view.
 * 
 * <p>
 * <img class='ai' src='../../../resources/XTableCell.png' />
 * </p>
 */
public class XTableCell extends Composite implements IsWidget, HasClickHandlers {

    private Widget _panel;
    private boolean _isFromController = false;
    private CellData data;

    /**
     * Use this constructor to manually create a XTableCell using CellData.
     */
    public XTableCell(CellData cellData) {
        XTableCell_(cellData);
    }

    public XTableCell(Image westIcon, Label titleLabel, Image eastIcon) {
        XTableCell_(westIcon, titleLabel, eastIcon);
    }

    /**
     * This constructor is used by XTableController to bind the Cell and the View
     * together.
     */
    public XTableCell(final int index, final XTableController tableController, final CellData data) {
        _isFromController = true;

        XTableCell_(data);

        addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                _panel.addStyleName(XStyle.selected.name());
                // Window.alert("selecetd...");
                new Timer() {
                    public void run() {
                        if (tableController != null) {
                            tableController.doOnRowSelected(index, data, XTableCell.this);
                        }
                    }
                }.schedule(10);
            }
        });
    }

    public HandlerRegistration addClickHandler(ClickHandler handler) {
        return addClickHandler_(handler);
    }

    public void showChevron(boolean showChevron) {
        showChevron_(showChevron);
    }

    /**
     * private
     */

    private HandlerRegistration addClickHandler_(ClickHandler handler) {
        return addDomHandler(handler, ClickEvent.getType());
    }

    private void showChevron_(boolean showChevron) {
        if (showChevron) {
            addStyleName(XStyle.chevron.name());

        } else {
            removeStyleName(XStyle.chevron.name());
        }
    }

    private void XTableCell_(CellData cellData) {

        FlexTable xt = new FlexTable();
        _panel = xt;
        initWidget(_panel);
        _panel.setStyleName(XStyle.tableCell.name());
        FlexCellFormatter fcf = xt.getFlexCellFormatter();

        Widget[] westW = cellData.getWestWidgets();
        Widget[] eastW = cellData.getEastWidgets();
        Widget[] textW = cellData.getTextWidgets();

        int colInx = 0;
        int westLen = 0;

        if (westW != null) {
            westLen = westW.length;

            for (Widget w : westW) {
                xt.setWidget(0, colInx, w);
                if (textW != null) {
                    fcf.setRowSpan(0, colInx, textW.length);
                    fcf.setHorizontalAlignment(0, colInx, HasHorizontalAlignment.ALIGN_LEFT);
                    fcf.setVerticalAlignment(0, colInx, HasVerticalAlignment.ALIGN_MIDDLE);
                }
                colInx++;
            }
        }
        if (textW != null) {
            for (int i = 0; i < textW.length; i++) {
                if (i == 0) {
                    xt.setWidget(i, colInx, textW[i]);
                    fcf.setWidth(i, colInx, "99%");
                } else {
                    xt.setWidget(i, colInx - westLen, textW[i]);
                }
            }
            colInx++;
        }
        if (eastW != null) {
            for (Widget w : eastW) {
                xt.setWidget(0, colInx, w);
                if (textW != null) {
                    fcf.setRowSpan(0, colInx, textW.length);
                    fcf.setHorizontalAlignment(0, colInx, HasHorizontalAlignment.ALIGN_RIGHT);
                }
                colInx++;
            }
        }

        // TODO toggle state
        if (!_isFromController) {
            addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {
                    _panel.addStyleName(XStyle.selected.name());
                    new Timer() {
                        public void run() {
                            removeStyleName(XStyle.selected.name());
                        }
                    }.schedule(300);
                }
            });
        }
    }

    private void XTableCell_(Image westIcon, Label titleLabel, Image eastIcon) {
        _panel = new FlowPanel();
        initWidget(_panel);
        _panel.setStyleName(XStyle.tableCell.name());

        // this.title = titleText;

        // if(titleText == null){
        // throw new RuntimeException("titleText == null");
        // }
        // assert (null == titleText) : "titleText can not be null.";

        // Content
        // Label _contentView = new Label(titleText);
        titleLabel.setStyleName(XStyle.tableCellTitle.name());
        ((FlowPanel) _panel).add(titleLabel);

        if (westIcon != null) {
            westIcon.addStyleName(XStyle.tableCellWestImage.name());
            int height = westIcon.getHeight();
            int width = westIcon.getWidth();
            westIcon.getElement().getStyle().setProperty("marginTop", "-" + (height / 2) + "px");
            titleLabel.getElement().getStyle().setProperty("marginLeft", "" + (width + 20) + "px");
            ((FlowPanel) _panel).add(westIcon);
        }

        if (eastIcon != null) {
            ((FlowPanel) _panel).add(eastIcon);
            eastIcon.addStyleName(XStyle.tableCellEastImage.name());
            int height = eastIcon.getHeight();
            eastIcon.getElement().getStyle().setProperty("marginTop", "-" + (height / 2) + "px");
        }

        // TODO toggle state
        if (!_isFromController) {
            addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {
                    _panel.addStyleName(XStyle.selected.name());
                    new Timer() {
                        public void run() {
                            removeStyleName(XStyle.selected.name());
                        }
                    }.schedule(300);
                }
            });
        }
    }

    // @Override
    public CellData getData() {
        return data;
    }

}