/*
* JBoss, Home of Professional Open Source
* Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.jboss.ballroom.client.widgets.tables;
import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import java.util.Collections;
import java.util.List;
/**
* Default cell table (styles).
*
* @author Heiko Braun
* @date 2/22/11
*/
public class DefaultCellTable<T> extends CellTable {
public static final DefaultCellTableResources DEFAULT_CELL_TABLE_RESOURCES =
new DefaultCellTableResources();
private static final String CELLTABLE_EMPTY_DIV = "celltable-empty-div";
private boolean isEnabled = false;
private T lastSelection = null;
public interface RowOverHandler {
void onRowOver(int rowNum);
void onRowOut(int rowNum);
}
private RowOverHandler rowOverHandler = null;
public DefaultCellTable(int pageSize) {
super(pageSize, DEFAULT_CELL_TABLE_RESOURCES);
initDefaults();
}
public DefaultCellTable(int pageSize, ProvidesKey<T> keyProvider) {
super(pageSize, DEFAULT_CELL_TABLE_RESOURCES, keyProvider);
initDefaults();
}
private void initDefaults() {
setStyleName("default-cell-table");
setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
// default empty
setRowCount(0);
setRowData(0, Collections.EMPTY_LIST);
getElement().setAttribute("role", "grid");
getElement().setId("master_detail-master");
setEmptyTableWidget(new HTML("<div class='empty-celltable'>No Items!</div>"));
}
@Override
public void setRowCount(int size, boolean isExact) {
super.setRowCount(size, isExact);
}
@Override
@Deprecated
public void setRowData(int start, List values) {
//setEmpty(values.isEmpty());
super.setRowData(start, values);
}
public boolean isEnabled() {
return isEnabled;
}
int hoveredRow = -1;
@Override
protected void onBrowserEvent2(Event event) {
super.onBrowserEvent2(event);
if(rowOverHandler!=null)
{
EventTarget eventTarget = event.getEventTarget();
String eventType = event.getType();
if("mouseover".equals(eventType))
{
if (!com.google.gwt.dom.client.Element.is(eventTarget)) {
return;
}
final com.google.gwt.dom.client.Element target = event.getEventTarget().cast();
hoveredRow = TableUtils.identifyRow(target);
rowOverHandler.onRowOver(hoveredRow);
}
else if ("mouseout".equals(eventType) )
{
if(hoveredRow>=0)
{
rowOverHandler.onRowOut(hoveredRow);
}
}
}
}
@Override
public void setSelectionModel(SelectionModel selectionModel) {
super.setSelectionModel(selectionModel);
if(selectionModel instanceof SingleSelectionModel)
{
final SingleSelectionModel<T> model = ((SingleSelectionModel<T>)selectionModel);
model.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
lastSelection = model.getSelectedObject();
}
});
}
}
public T getPreviousSelectedEntity() {
return lastSelection;
}
public void setRowOverHandler(RowOverHandler rowOverHandler) {
this.rowOverHandler = rowOverHandler;
}
/**
* In order for the default selection to work, you need to implement
* {@link com.google.gwt.view.client.ProvidesKey} on the cell table.
*/
public void selectDefaultEntity() {
flush();
if(null == getSelectionModel()) return;
ProvidesKey keyProvider = getKeyProvider();
boolean didMatch = false;
if(keyProvider!=null && getPreviousSelectedEntity()!=null)
{
Object prevKey = keyProvider.getKey(getPreviousSelectedEntity());
for(Object entity : getVisibleItems())
{
Object currKey = keyProvider.getKey(entity);
if(prevKey.equals(currKey))
{
getSelectionModel().setSelected(entity, true);
didMatch=true;
break;
}
}
}
if(!didMatch && getVisibleItemCount()>0)
{
lastSelection=null;
getSelectionModel().setSelected(getVisibleItem(0), true);
}
}
}