com.risevision.ui.client.common.widgets.grid.ScrollingGridWidget.java Source code

Java tutorial

Introduction

Here is the source code for com.risevision.ui.client.common.widgets.grid.ScrollingGridWidget.java

Source

// Copyright  2010 - May 2014 Rise Vision Incorporated.
// Use of this software is governed by the GPLv3 license
// (reproduced in the LICENSE file).

package com.risevision.ui.client.common.widgets.grid;

import java.util.HashMap;
import java.util.Map;

import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.dom.client.ScrollEvent;
import com.google.gwt.event.dom.client.ScrollHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.client.ui.HTMLTable.ColumnFormatter;
import com.risevision.common.client.utils.RiseUtils;
import com.risevision.ui.client.common.controller.CommonHeaderController;
import com.risevision.ui.client.common.controller.SelectedCompanyController;
import com.risevision.ui.client.common.info.ScrollingGridInfo;
import com.risevision.ui.client.common.widgets.SpacerWidget;

public class ScrollingGridWidget extends Composite implements ClickHandler {

    private VerticalPanel mainPanel = new VerticalPanel();
    private TextBox searchTextBox = new TextBox();
    //   private RiseListBox categoryListBox = new RiseListBox();
    private Anchor searchLink = new Anchor("Search");
    private Grid headerTable;
    private ScrollPanel scrollingBodyPanel = new ScrollPanel();
    private FlexTable bodyFlexTable = new FlexTable();
    //   private HorizontalPanel pagingPanel = new HorizontalPanel();
    private ScrollingGridInfo gridInfo;

    private Command dataCommand = null;
    private int currentCommand;
    private String currentKey;
    private boolean currentCheckBoxValue;

    private boolean lastColumnShortened = false;

    private HandlerRegistration handlerRegistration;

    private ResizeHandler resizeHandler = new ResizeHandler() {
        @Override
        public void onResize(ResizeEvent event) {
            resize();
        }
    };

    /*
     * Be careful with saving UI components in datastructures like this: if you
     * remove a button from the app, make sure you also remove its reference
     * from buttonMap HashMap to avoid memory leaks.
     */
    private Map<Widget, String> actionMap = new HashMap<Widget, String>();
    private String[][] header;

    public ScrollingGridInfo getGridInfo() {
        return gridInfo;
    }

    public int getCurrentCommand() {
        return currentCommand;
    }

    public String getCurrentKey() {
        return currentKey;
    }

    //   public void setCurrentKey(String key) {
    //      this.currentKey = key;
    //   }

    public boolean getCurrentCheckBoxValue() {
        return currentCheckBoxValue;
    }

    public ScrollingGridWidget(Command dataCommand, ScrollingGridInfo gridInfo, String[][] header) {
        this(dataCommand, gridInfo, header, true);
    }

    public ScrollingGridWidget(Command dataCommand, ScrollingGridInfo gridInfo, String[][] header,
            boolean enableSearch) {
        this.dataCommand = dataCommand;
        this.gridInfo = gridInfo;

        if (enableSearch) {
            searchLink.addClickHandler(this);
            actionMap.put(searchLink, ScrollingGridInfo.SEARCHACTION + "");

            HorizontalPanel searchPanel = new HorizontalPanel();

            AbsolutePanel searchTextBoxPanel = new AbsolutePanel();
            searchTextBoxPanel.add(searchTextBox);

            createClearableTextBox(searchTextBoxPanel);

            searchPanel.add(searchTextBoxPanel);
            searchPanel.add(new SpacerWidget());
            searchPanel.add(searchLink);

            searchPanel.getElement().getStyle().setPaddingBottom(6, Unit.PX);

            mainPanel.add(searchPanel);
        }

        headerTable = new Grid(1, header.length);
        mainPanel.add(headerTable);

        scrollingBodyPanel.add(bodyFlexTable);

        mainPanel.add(scrollingBodyPanel);
        //      mainPanel.add(pagingPanel);

        this.header = header;
        styleControls();
        setHeader();
        initHandlers();

        initWidget(mainPanel);
    }

    private void createClearableTextBox(AbsolutePanel panel) {
        HTML clearPanel = new HTML("<a class='textbox-clear-button'>Delete</a>");

        clearPanel.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                clearSearch();
            }
        });

        searchTextBox.getElement().getStyle().setPaddingRight(25, Unit.PX);

        panel.add(clearPanel, 434, 4);
    }

    private void styleControls() {
        searchTextBox.setStyleName("rdn-TextBoxLong");

        mainPanel.setStyleName("rdn-TableShort");
        mainPanel.getElement().getStyle().setHeight(100, Unit.PCT);

        headerTable.setCellSpacing(0);
        headerTable.setCellPadding(0);
        headerTable.setStyleName("rdn-GridHeader");
        //      headerTable.getElement().getStyle().setTableLayout(TableLayout.FIXED);
        //      headerTable.getElement().getStyle().setWidth(100, Unit.PCT);
        headerTable.getElement().getStyle().setProperty("maxWidth", "1200px");

        // style the table
        bodyFlexTable.setCellSpacing(0);
        bodyFlexTable.setCellPadding(0);
        bodyFlexTable.setStyleName("rdn-Grid");
        //      bodyFlexTable.getElement().getStyle().setTableLayout(TableLayout.FIXED);
        //      bodyFlexTable.getElement().getStyle().setWidth(100, Unit.PCT);

        scrollingBodyPanel.getElement().getStyle().setOverflow(Overflow.AUTO);
        scrollingBodyPanel.setAlwaysShowScrollBars(false);
        scrollingBodyPanel.addStyleName("jfk-scrollbar");

        resize();

        //      scrollingBodyPanel.getElement().getParentElement().getStyle().setHeight(100, Unit.PCT);
    }

    private void setHeader() {
        int i = 0;
        for (String[] def : header) {
            //         String width = (100 / header.length) + "%";

            if (def[1] != null) {
                if (ScrollingGridInfo.CHECKBOX.equals(def[1])) {
                    CheckBox checkAll = new CheckBox();
                    checkAll.addClickHandler(this);
                    actionMap.put(checkAll, ScrollingGridInfo.CHECKALLACTION + Integer.toString(i));
                    headerTable.setWidget(0, i, checkAll);
                } else {
                    String name = def[0];

                    if (def[1].equals(gridInfo.getSortBy())) {
                        name += " " + gridInfo.getSortDirectionChar();
                    }

                    Anchor sortLink = new Anchor(name);
                    //               sortLink.setStyleName("rdn-GridItemLink");
                    sortLink.addClickHandler(this);
                    actionMap.put(sortLink, ScrollingGridInfo.SORTACTION + def[1]);
                    headerTable.setWidget(0, i, sortLink);
                }
            } else {
                if (def[0] == null || def[0].isEmpty())
                    headerTable.setText(0, i, "");
                else
                    headerTable.setText(0, i, def[0]);
            }

            //         CellFormatter cellFormatter = headerTable.getCellFormatter();
            //         if (def[0] == null || def[0].isEmpty()) {
            //            cellFormatter.setStyleName(0, i, "rdn-GridItemHeaderShort");
            //         }
            //         else {
            //         cellFormatter.setStyleName(0, i, "rdn-GridItemHeader");
            //         }

            if (def.length > 2) {
                ColumnFormatter colFormatter = headerTable.getColumnFormatter();
                colFormatter.setWidth(i, def[2]);
                // for firefox
                CellFormatter cellFormatter = headerTable.getCellFormatter();
                cellFormatter.setWidth(0, i, def[2]);
                //            if (def[2].equals("100%")) {
                //               cellFormatter.getElement(0, i).getStyle().setProperty("maxWidth", "400px");
                //               colFormatter.getElement(i).getStyle().setProperty("maxWidth", "400px");
                //            }
            }

            i++;
        }

        // no style corrresponds to rdn-GridHeader
        //      RowFormatter rowFormatter = headerTable.getRowFormatter();
        //      rowFormatter.setStyleName(0, "rdn-GridHeader");
    }

    private void initHandlers() {
        searchTextBox.addKeyPressHandler(new KeyPressHandler() {
            public void onKeyPress(KeyPressEvent event) {
                if (event.getCharCode() == KeyCodes.KEY_ENTER) {
                    //               if (!searchTextBox.getText().isEmpty()) {
                    updateSearch(searchTextBox.getText());
                    //               }
                }
            }
        });

        scrollingBodyPanel.addScrollHandler(new ScrollHandler() {
            @Override
            public void onScroll(ScrollEvent event) {
                onGridScroll();
            }
        });
    }

    private void resize() {
        scrollingBodyPanel.getElement().getStyle()
                .setHeight(Math.max(CommonHeaderController.getContentHeight() - 60, 400), Unit.PX);
    }

    protected void onAttach() {
        mainPanel.getElement().getParentElement().getStyle().setProperty("maxWidth", "1200px");

        super.onAttach();
    }

    protected void onLoad() {
        searchTextBox.setFocus(true);
        super.onLoad();

        if (resizeHandler != null) {
            resize();

            handlerRegistration = Window.addResizeHandler(resizeHandler);
        }
    }

    protected void onUnload() {
        super.onUnload();

        if (handlerRegistration != null && resizeHandler != null) {
            handlerRegistration.removeHandler();
            handlerRegistration = null;
        }
    }

    public void loadGrid(ScrollingGridInfo gridInfo) {
        this.gridInfo = gridInfo;
        //      if (gridInfo != null && dataCommand != null) {
        //
        //         updatePaging();
        //      }
    }

    public int getRowCount() {
        return bodyFlexTable.getRowCount();
    }

    public void clearSearch() {
        searchTextBox.setText("");

        updateSearch("");
    }

    private void updateSearch(String searchString) {
        if (!(RiseUtils.strIsNullOrEmpty(searchString) && RiseUtils.strIsNullOrEmpty(gridInfo.getSearchFor()))) {
            currentCommand = ScrollingGridInfo.SEARCHACTION;

            gridInfo.setSearchFor(searchString);

            // set paging to first page
            gridInfo.resetPage();

            dataCommand.execute();
        }
        // if both search strings are null, don't reset results
        else {

        }
    }

    public void setGridHeight(String height) {
        if (handlerRegistration != null) {
            handlerRegistration.removeHandler();
            handlerRegistration = null;
        }
        if (resizeHandler != null) {
            resizeHandler = null;
        }

        scrollingBodyPanel.getElement().getStyle().setProperty("height", height);
    }

    public void setText(int row, int column, String text) {
        //      Label textLabel = new Label(text);
        //      try {
        //         String [] colProperties = header[column];
        //         
        //         textLabel.addStyleName("rdn-OverflowElipsis");
        //         textLabel.setWidth(colProperties[2]);
        //      }
        //      catch (Exception e) {
        //         
        //      }
        //      setWidget(row, column, textLabel);

        formatCell(row, column);
        bodyFlexTable.setText(row, column, text);
    }

    public void setAction(int row, int column, String text, int actionType, String id) {
        Anchor actionHyperlink = new Anchor(text);
        actionHyperlink.addClickHandler(this);
        setWidget(row, column, actionHyperlink);
        actionMap.put(actionHyperlink, actionType + id);
    }

    public void setWidget(int row, int column, Widget widget) {
        formatCell(row, column);
        bodyFlexTable.setWidget(row, column, widget);
    }

    public void setAction(int row, int column, String text, String id) {
        setAction(row, column, text, ScrollingGridInfo.SELECTACTION, id);
    }

    public void setHyperlink(int row, int column, String text, String contentId, String id) {
        setHyperlink(row, column, text, contentId, id,
                SelectedCompanyController.getInstance().getSelectedCompanyId());
    }

    public void setHyperlink(int row, int column, String text, String contentId, String id, String companyId) {
        Anchor actionHyperlink = new Anchor(text);
        actionHyperlink.setHref("#" + contentId + "/id=" + id + "?cid=" + companyId);

        setWidget(row, column, actionHyperlink);
    }

    public void setCheckBox(int row, int column, Boolean checked, String id) {
        CheckBox cb = new CheckBox();
        cb.setValue(checked);
        cb.addClickHandler(this);
        setWidget(row, column, cb);
        actionMap.put(cb, ScrollingGridInfo.CHECKACTION + id);
    }

    public CellFormatter getCellFormatter() {
        return bodyFlexTable.getCellFormatter();
    }

    private void formatCell(int row, int column) {
        CellFormatter cellFormatter = bodyFlexTable.getCellFormatter();
        ColumnFormatter columnFormatter = bodyFlexTable.getColumnFormatter();
        //      RowFormatter rowFormatter = bodyFlexTable.getRowFormatter();
        //      cellFormatter.setStyleName(row, column, "rdn-GridItem");

        //      for (int i = 0; i < bodyFlexTable.getCellCount(0); i++){         
        //         cellFormatter.addStyleName(row, i, "rdn-GridItemFooterBottom");
        //         
        //         if (row > 0) {
        //            cellFormatter.removeStyleName(row - 1, i, "rdn-GridItemFooterBottom");
        //         }
        //      }

        //      if (row%2 == 0){
        //         rowFormatter.addStyleName(row, "rdn-GridAlternateRow");
        //      }

        String[] def = header[column];
        if (def != null && def.length > 2 && def[2] != null && !def[2].isEmpty()) {
            cellFormatter.setWidth(row, column, def[2]);
            columnFormatter.setWidth(column, def[2]);
        }

        if (bodyFlexTable.getOffsetWidth() < headerTable.getOffsetWidth()) {
            if (!lastColumnShortened) {
                int width = headerTable.getCellFormatter().getElement(0, header.length - 1).getOffsetWidth();

                headerTable.getColumnFormatter().setWidth(header.length - 1, width + 16 + "px");

                lastColumnShortened = true;
            }
        } else {
            if (lastColumnShortened) {
                int width = headerTable.getCellFormatter().getElement(0, header.length - 1).getOffsetWidth();

                headerTable.getColumnFormatter().setWidth(header.length - 1, width - 16 + "px");

                lastColumnShortened = false;
            }
        }
    }

    // The shared ClickHandler code.
    public void onClick(ClickEvent event) {
        Object sender = event.getSource();
        if (sender instanceof Anchor) {
            Anchor b = (Anchor) sender;
            String keyString = actionMap.get(b);

            if (keyString != null && !keyString.isEmpty()) {
                currentCommand = RiseUtils.strToInt(keyString.substring(0, 1), -1);
                currentKey = keyString.substring(1);

                if (currentCommand == ScrollingGridInfo.SORTACTION) {
                    clearSorting();

                    if (gridInfo.getSortBy() != null && gridInfo.getSortBy().equals(currentKey)
                            && gridInfo.getSortDirection().equals(ScrollingGridInfo.SORT_DOWN)) {
                        gridInfo.setSortDirection(ScrollingGridInfo.SORT_UP);
                    } else {
                        gridInfo.setSortDirection(ScrollingGridInfo.SORT_DOWN);
                    }

                    b.setText(b.getText() + " " + gridInfo.getSortDirectionChar());
                    gridInfo.setSortBy(currentKey);

                    // set paging to first page
                    gridInfo.resetPage();
                }
                //            else if (currentCommand == ScrollingGridInfo.PAGEACTION) {
                //               int key = RiseUtils.strToInt(currentKey, 0);
                //               if (key != 0) {
                //                  gridInfo.setCurrentPage(key);
                //               }
                //            }
                else if (currentCommand == ScrollingGridInfo.SEARCHACTION) {
                    gridInfo.setSearchFor(searchTextBox.getText());

                    // set paging to first page
                    gridInfo.resetPage();
                }

                dataCommand.execute();
            }
        } else if (sender instanceof CheckBox) {
            String keyString = actionMap.get(sender);

            if (keyString != null && !keyString.isEmpty()) {
                currentCommand = RiseUtils.strToInt(keyString.substring(0, 1), -1);
                currentKey = keyString.substring(1);
                currentCheckBoxValue = ((CheckBox) sender).getValue();
                dataCommand.execute();
            }
        }
    }

    private void onGridScroll() {
        double totalRecords = (gridInfo.getPage() + 1) * gridInfo.getPageSize();
        //      double totalRecords = bodyFlexTable.getRowCount();

        if (totalRecords == bodyFlexTable.getRowCount()) {
            double scrollPosition = scrollingBodyPanel.getVerticalScrollPosition()
                    + scrollingBodyPanel.getOffsetHeight();

            // position out of 1
            double position = scrollPosition / bodyFlexTable.getOffsetHeight();

            double recordsLeft = (1 - position) * totalRecords;

            if (recordsLeft < (gridInfo.getPageSize() / 4)) {
                currentCommand = ScrollingGridInfo.PAGEACTION;

                gridInfo.nextPage();

                dataCommand.execute();
            }
        }
    }

    public void clear() {
        searchTextBox.setText("");
        if (gridInfo != null) {
            //         gridInfo.setPageCount(0);
            clearGrid();
            //         gridInfo.setSortBy("");
            //         gridInfo.setDefaultSort();
            gridInfo.setSearchFor("");

            gridInfo.resetPage();
        }
    }

    public void clearGrid() {
        //      updatePaging();
        for (int i = bodyFlexTable.getRowCount() - 1; i >= 0; i--) {
            for (int j = 0; j < bodyFlexTable.getCellCount(0); j++) {
                Widget widget = bodyFlexTable.getWidget(i, j);
                if (widget != null && widget instanceof Anchor) {
                    Anchor link = (Anchor) widget;
                    actionMap.remove(link);
                }
            }
            bodyFlexTable.removeRow(i);
        }
    }

    private void clearSorting() {
        int i = 0;
        for (String[] def : header) {
            if (def[1] != null) {
                if (!ScrollingGridInfo.CHECKBOX.equals(def[1])) {
                    Widget widget = headerTable.getWidget(0, i);
                    if (widget != null && widget instanceof Anchor) {
                        Anchor sortLink = (Anchor) widget;
                        sortLink.setText(def[0]);
                    }
                }
            }

            i++;
        }
    }

    //   private void updatePaging() {
    //      // remove previous widgets
    //      for (int i = 0; i < pagingPanel.getWidgetCount(); i++) {
    //         if (pagingPanel.getWidget(i) instanceof Anchor) {
    //            Anchor link = (Anchor) pagingPanel.getWidget(i);
    //            actionMap.remove(link);
    //         }
    //      }
    //      pagingPanel.clear();
    //
    //      updatePagingHyperlink("<<", gridInfo.getFirstPage());
    //      updatePagingHyperlink("<", gridInfo.getPrevPage());
    //      
    //      for (int i = 1; i <= gridInfo.getPageCount(); i++) {
    //         if (i != gridInfo.getCurrentPage()) {
    //            updatePagingHyperlink(i + "", i);
    //         } else {
    //            Label pageLabel = new Label(i + "");
    //            pageLabel.setStyleName("rdn-GridItemLink");
    //            pagingPanel.add(pageLabel);
    //         }
    //      }
    //
    //      updatePagingHyperlink(">", gridInfo.getNextPage());
    //      updatePagingHyperlink(">>", gridInfo.getLastPage());
    //   }

    //   private void updatePagingHyperlink(String text, Integer key){
    //      Anchor pageHyperlink;
    //      
    //      if (key != 0) {
    //         pageHyperlink = new Anchor(text);
    //         pageHyperlink.setStyleName("rdn-GridItemLink");
    //         pageHyperlink.addClickHandler(this);
    //         pagingPanel.add(pageHyperlink);
    //         actionMap.put(pageHyperlink, ScrollingGridInfo.PAGEACTION + key.toString());
    //         pagingPanel.setSpacing(3);
    //      }
    //   }

    public void checkAll(boolean value) {
        for (Widget w : actionMap.keySet())
            if (w instanceof CheckBox)
                ((CheckBox) w).setValue(value);
    }
}