/*
* RHQ Management Platform
* Copyright (C) 2005-2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.coregui.client.components.sorter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.gwt.event.shared.HandlerRegistration;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.grid.HoverCustomizer;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordDropEvent;
import com.smartgwt.client.widgets.grid.events.RecordDropHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.SectionStack;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import org.rhq.coregui.client.util.enhanced.EnhancedVLayout;
/**
* @author Ian Springer
*/
public class ReorderableList extends EnhancedVLayout {
protected ListGridRecord[] initialSelection;
protected HLayout hlayout;
protected ListGrid listGrid;
/** an icon displayed next to each item in the list grids, or null if no icon should be displayed */
private String itemIcon;
/** the item title (i.e. display name), which should be plural and capitalized, e.g. "Resource Groups", "Roles". */
private String itemTitle;
private String nameFieldTitle = MSG.common_title_name();
private Set<ListOrderChangedHandler> listOrderChangedHandlers = new HashSet<ListOrderChangedHandler>();
private boolean isReadOnly;
private HoverCustomizer nameHoverCustomizer;
private DataSource dataSource;
private Criteria criteria;
public ReorderableList(ListGridRecord[] records, String itemTitle, String itemIcon) {
this(false, records, itemTitle, itemIcon, null, null, null);
}
public ReorderableList(ListGridRecord[] records, String itemTitle, String itemIcon,
HoverCustomizer nameHoverCustomizer) {
this(false, records, itemTitle, itemIcon, nameHoverCustomizer, null, null);
}
public ReorderableList(ListGridRecord[] records, String itemTitle, String itemIcon,
HoverCustomizer nameHoverCustomizer, DataSource dataSource, Criteria criteria) {
this(false, records, itemTitle, itemIcon, nameHoverCustomizer, dataSource, criteria);
}
public ReorderableList(boolean isReadOnly, ListGridRecord[] records, String itemTitle, String itemIcon,
HoverCustomizer nameHoverCustomizer) {
this(isReadOnly, records, itemTitle, itemIcon, nameHoverCustomizer, null, null);
}
public ReorderableList(boolean isReadOnly, ListGridRecord[] records, String itemTitle, String itemIcon,
HoverCustomizer nameHoverCustomizer, DataSource dataSource, Criteria criteria) {
super();
this.isReadOnly = isReadOnly;
setWidth100();
setMargin(7);
this.hlayout = new HLayout();
this.listGrid = new ListGrid();
this.initialSelection = records;
this.listGrid.setRecords(records);
if (this.isReadOnly) {
this.listGrid.setSelectionType(SelectionStyle.NONE);
}
this.itemTitle = itemTitle;
this.itemIcon = itemIcon;
this.nameHoverCustomizer = nameHoverCustomizer;
this.dataSource = dataSource;
this.criteria = criteria;
}
/**
* Returns the {@link com.smartgwt.client.data.Record record}s in the order currently specified by the user.
*
* @return the {@link com.smartgwt.client.data.Record record}s in the order currently specified by the user
*/
public ListGridRecord[] getRecords() {
return this.listGrid.getRecords();
}
/**
*
*/
public void setRecords(ListGridRecord[] records) {
this.initialSelection = records;
this.listGrid.setRecords(records);
}
@Override
protected void onInit() {
super.onInit();
this.listGrid.setWidth(300);
this.listGrid.setHeight(250);
this.listGrid.setCanReorderRecords(true);
// TODO: Change cursor to hand or something like that when user hovers over a record in the grid.
this.listGrid.setLoadingMessage(MSG.common_msg_loading());
this.listGrid.setEmptyMessage(MSG.common_msg_noItemsToShow());
this.listGrid.addRecordDropHandler(new RecordDropHandler() {
@Override
public void onRecordDrop(RecordDropEvent event) {
notifyListOrderChangedHandlers();
}
});
List<ListGridField> fields = new ArrayList<ListGridField>();
String itemIcon = getItemIcon();
if (itemIcon != null) {
ListGridField iconField = new ListGridField("icon", 25);
iconField.setType(ListGridFieldType.ICON);
iconField.setCellIcon(itemIcon);
iconField.setShowDefaultContextMenu(false);
fields.add(iconField);
}
ListGridField nameField = new ListGridField(getNameField(), this.nameFieldTitle);
if (null != this.nameHoverCustomizer) {
nameField.setShowHover(true);
nameField.setHoverCustomizer(this.nameHoverCustomizer);
}
fields.add(nameField);
if (dataSource != null) {
this.listGrid.setDataSource(dataSource, fields.toArray(new ListGridField[fields.size()]));
this.listGrid.setAutoFetchData(true);
} else {
this.listGrid.setFields(fields.toArray(new ListGridField[fields.size()]));
}
if (criteria != null) {
this.listGrid.setInitialCriteria(criteria);
}
if (getItemTitle() != null) {
SectionStack itemsStack = buildItemsSectionStack();
this.hlayout.addMember(itemsStack);
} else {
this.hlayout.addMember(this.listGrid);
}
addMember(this.hlayout);
}
private SectionStack buildItemsSectionStack() {
SectionStack itemsSectionStack = new SectionStack();
itemsSectionStack.setWidth(300);
itemsSectionStack.setHeight(250);
SectionStackSection itemsSection = new SectionStackSection(getItemTitle());
itemsSection.setCanCollapse(false);
itemsSection.setExpanded(true);
itemsSection.setItems(this.listGrid);
itemsSectionStack.addSection(itemsSection);
return itemsSectionStack;
}
private void notifyListOrderChangedHandlers() {
for (ListOrderChangedHandler handler : this.listOrderChangedHandlers) {
handler.onListOrderChanged(new ListOrderChangedEvent(this.listGrid.getSelectedRecords()));
}
}
public void reset() {
this.listGrid.setData(this.initialSelection);
}
public HandlerRegistration addListOrderChangedHandler(final ListOrderChangedHandler handler) {
this.listOrderChangedHandlers.add(handler);
return new HandlerRegistration() {
@Override
public void removeHandler() {
listOrderChangedHandlers.remove(handler);
}
};
}
protected String getNameField() {
return "name";
}
public void setNameFieldTitle(String nameFieldTitle) {
this.nameFieldTitle = nameFieldTitle;
}
public String getItemTitle() {
return itemTitle;
}
protected String getItemIcon() {
return itemIcon;
}
}