I have a window which contains master detail data. In this window there is some master data (omitted from sample) , and then a list grid with child items. From this window there is button to open a second window to get available data displayed in another list grid inside this second window.
The list grid in the second window has a record click handler to return the chosen record to the list grid in the first window.
The first time a record is selected it displays in the grid in the originating window by itself. Then when you open the second window again to get another record, and click a different record, you get duplicates in the first window. Please note, primary keys are set up in the datasources, and complaints are appropriately made when the same record attempts to be added again.
To recreate, run the sample, click the "press me" button, then click the "Add Item" button, then click the "NAME 1" record. Then click "Add Item" again and click the "NAME 2" record.
Very very grateful for any replies. I will take constructive criticism happily :)
Here's the code :-
The list grid in the second window has a record click handler to return the chosen record to the list grid in the first window.
The first time a record is selected it displays in the grid in the originating window by itself. Then when you open the second window again to get another record, and click a different record, you get duplicates in the first window. Please note, primary keys are set up in the datasources, and complaints are appropriately made when the same record attempts to be added again.
To recreate, run the sample, click the "press me" button, then click the "Add Item" button, then click the "NAME 1" record. Then click "Add Item" again and click the "NAME 2" record.
Very very grateful for any replies. I will take constructive criticism happily :)
Here's the code :-
Code:
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.*;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.fields.DataSourceIntegerField;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.types.*;
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.HeaderDoubleClickEvent;
import com.smartgwt.client.widgets.grid.events.HeaderDoubleClickHandler;
import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class App implements EntryPoint {
List<ItemDetailDto> itemDetailDtos = new ArrayList<ItemDetailDto>();
List<ItemDetailDto> itemDetailDtosChosenFromSecondWindow;
com.smartgwt.client.widgets.Window addInvoiceWindow;
com.smartgwt.client.widgets.Window itemListWindow;
ListGrid itemsForInvoiceGrid = new ListGrid();
ListGrid itemsListGrid = new ListGrid();
ItemsForInvoiceDataSource itemsForInvoiceDataSource;
ItemListDataSource itemListDataSource;
com.smartgwt.client.widgets.Button addItemButton;
public void onModuleLoad() {
itemListDataSource = new ItemListDataSource();
itemsForInvoiceDataSource = new ItemsForInvoiceDataSource();
createItemsForInvoiceGrid();
createItemsListGrid();
createButtons();
createTwoTestRecords();
com.smartgwt.client.widgets.Button startButton = new com.smartgwt.client.widgets.Button();
startButton.setTitle("Press Me");
startButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
@Override
public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
showAddInvoiceDialog();
}
});
RootPanel.get().add(startButton);
}
private void createButtons(){
addItemButton = new com.smartgwt.client.widgets.Button();
addItemButton.setTitle("Add Item");
addItemButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
@Override
public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
itemsForInvoiceDataSource.setTestData(null);
itemsForInvoiceDataSource.invalidateCache();
itemListDataSource.invalidateCache();
itemListDataSource.setTestData(null);
showItemListDialog();
}
});
}
private VLayout createAddInvoiceLayout(){
VLayout mainLayout = new VLayout();
HLayout buttonLayout = new HLayout();
buttonLayout.setPadding(20);
buttonLayout.setAlign(Alignment.LEFT);
buttonLayout.setWidth(300);
HLayout itemLayout = new HLayout();
itemLayout.addMember(itemsForInvoiceGrid);
itemLayout.setPadding(20);
itemLayout.setAlign(Alignment.LEFT);
itemLayout.setWidth(300);
HLayout addItemLayout = new HLayout();
addItemLayout.addMember(addItemButton);
addItemLayout.setPadding(20);
addItemLayout.setAlign(Alignment.LEFT);
addItemLayout.setWidth(300);
mainLayout.addMember(addItemLayout);
mainLayout.addMember(itemLayout);
mainLayout.addMember(buttonLayout);
return mainLayout;
}
private VLayout createItemListLayout(){
VLayout mainLayout = new VLayout();
HLayout itemLayout = new HLayout();
itemLayout.addMember(itemsListGrid);
itemLayout.setPadding(20);
itemLayout.setAlign(Alignment.LEFT);
itemLayout.setWidth(300);
mainLayout.addMember(itemLayout);
return mainLayout;
}
private void createItemsForInvoiceGrid() {
ListGridField itemName = new ListGridField("itemName", "Item Name");
ListGridField itemCode = new ListGridField("itemCode", "Item Code");
ListGridField itemDescription = new ListGridField("itemDescription", "Item Description");
ListGridField amount = new ListGridField("amount", "Amount");
ListGridField id = new ListGridField("id", "ID");
itemsForInvoiceGrid.setFields(id, itemCode, itemName, itemDescription, amount);
itemsForInvoiceGrid.setHeight(250);
itemsForInvoiceGrid.setWidth(800);
itemsForInvoiceGrid.setTitle("Invoices");
itemsForInvoiceGrid.setDataSource(itemsForInvoiceDataSource);
itemsForInvoiceGrid.setAutoFetchData(true);
itemsForInvoiceGrid.setShowFilterEditor(true);
itemsForInvoiceGrid.setCanSelectAll(true);
itemsForInvoiceGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
itemsForInvoiceGrid.setSelectionType(SelectionStyle.SIMPLE);
itemsForInvoiceGrid.setModalEditing(false);
itemsForInvoiceGrid.setPreventDuplicates(true);
itemsForInvoiceGrid.setDataFetchMode(FetchMode.LOCAL);
itemsForInvoiceGrid.setShowAllRecords(true);
itemsForInvoiceGrid.setShowRowNumbers(true);
itemsForInvoiceGrid.setCanFocus(true);
itemsForInvoiceGrid.setCanResizeFields(true);
itemsForInvoiceGrid.setAlternateRecordStyles(true);
itemsForInvoiceGrid.setShowGridSummary(true);
itemsForInvoiceGrid.setShowGroupSummary(true);
itemsForInvoiceGrid.addHeaderDoubleClickHandler(new HeaderDoubleClickHandler() {
@Override
public void onHeaderDoubleClick(HeaderDoubleClickEvent event) {
// method stub
}
});
}
private void createItemsListGrid() {
ListGridField itemName = new ListGridField("itemName", "Item Name");
ListGridField itemCode = new ListGridField("itemCode", "Item Code");
ListGridField itemDescription = new ListGridField("itemDescription", "Item Description");
ListGridField amount = new ListGridField("amount", "Amount");
ListGridField test = new ListGridField("test", "Test");
ListGridField id = new ListGridField("id", "ID");
itemsListGrid.setFields(id, itemCode, itemName, itemDescription, amount, test);
itemsListGrid.setHeight(250);
itemsListGrid.setWidth(800);
itemsListGrid.setTitle("Items");
itemsListGrid.setDataSource(itemListDataSource);
itemsListGrid.setAutoFetchData(true);
itemsListGrid.setShowFilterEditor(true);
itemsListGrid.setCanSelectAll(true);
itemsListGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
itemsListGrid.setSelectionType(SelectionStyle.SIMPLE);
itemsListGrid.setModalEditing(false);
itemsListGrid.setPreventDuplicates(true);
itemsListGrid.setDataFetchMode(FetchMode.LOCAL);
itemsListGrid.setShowAllRecords(true);
itemsListGrid.setShowRowNumbers(true);
itemsListGrid.setCanFocus(true);
itemsListGrid.setCanResizeFields(true);
itemsListGrid.setAlternateRecordStyles(true);
itemsListGrid.setShowGridSummary(true);
itemsListGrid.setShowGroupSummary(true);
itemsListGrid.addRecordClickHandler(new RecordClickHandler() {
public void onRecordClick(RecordClickEvent event) {
if (!(event.getFieldNum() == 0)) {
if (itemDetailDtosChosenFromSecondWindow == null) {
itemDetailDtosChosenFromSecondWindow = new ArrayList<ItemDetailDto>();
}
ItemDetailDto itemDetailDto = new ItemDetailDto();
itemDetailDto.setAmount(event.getRecord().getAttribute("itemAmount") == null ? null : new BigDecimal(event.getRecord().getAttribute("itemAmount")));
itemDetailDto.setCode(event.getRecord().getAttribute("itemCode"));
itemDetailDto.setName(event.getRecord().getAttribute("itemName"));
itemDetailDto.setDescription(event.getRecord().getAttribute("itemDescription"));
itemDetailDto.setId(Long.valueOf(event.getRecord().getAttribute("id")));
itemDetailDtosChosenFromSecondWindow.add(itemDetailDto);
itemsForInvoiceDataSource.setTestData(null);
itemsForInvoiceDataSource.invalidateCache();
itemListDataSource.invalidateCache();
itemListDataSource.setTestData(null);
itemListWindow.destroy();
setItemsForInvoiceComponents();
}
}
});
itemsListGrid.addHeaderDoubleClickHandler(new HeaderDoubleClickHandler() {
@Override
public void onHeaderDoubleClick(HeaderDoubleClickEvent event) {
// method stub
}
});
}
class ItemListDataSource extends DataSource {
public ItemListDataSource() {
setID("itemListDataSource");
setClientOnly(true);
DataSourceIntegerField id = new DataSourceIntegerField("id");
id.setPrimaryKey(true);
id.setHidden(true);
DataSourceTextField itemName = new DataSourceTextField("itemName", "Item Name");
itemName.setAttribute("width", "10%");
DataSourceTextField itemCode = new DataSourceTextField("itemCode", "Item Code");
itemCode.setAttribute("width", "10%");
DataSourceTextField amount = new DataSourceTextField("amount", "Amount");
amount.setAttribute("width", "10%");
DataSourceTextField itemDescription = new DataSourceTextField("itemDescription", "Item Description");
itemDescription.setAttribute("width", "50%");
DataSourceTextField test = new DataSourceTextField("test", "Test");
test.setAttribute("width", "50%");
setFields(id, itemName, itemCode, itemDescription, amount, test);
}
}
class ItemsForInvoiceDataSource extends DataSource {
public ItemsForInvoiceDataSource() {
setID("itemForInvoiceDataSource");
setClientOnly(true);
DataSourceIntegerField id = new DataSourceIntegerField("id");
id.setPrimaryKey(true);
id.setHidden(true);
DataSourceTextField itemName = new DataSourceTextField("itemName", "Item Name");
itemName.setAttribute("width", "10%");
DataSourceTextField itemCode = new DataSourceTextField("itemCode", "Item Code");
itemCode.setAttribute("width", "10%");
DataSourceTextField amount = new DataSourceTextField("amount", "Amount");
amount.setAttribute("width", "10%");
DataSourceTextField itemDescription = new DataSourceTextField("itemDescription", "Item Description");
itemDescription.setAttribute("width", "50%");
setFields(id, itemName, itemCode, itemDescription, amount);
}
}
public void showAddInvoiceDialog() {
addInvoiceWindow = new com.smartgwt.client.widgets.Window();
addInvoiceWindow.setWidth(950);
addInvoiceWindow.setHeight(800);
addInvoiceWindow.setTitle("Add Invoice");
addInvoiceWindow.setShowMinimizeButton(false);
addInvoiceWindow.setIsModal(true);
addInvoiceWindow.setShowModalMask(true);
addInvoiceWindow.centerInPage();
addInvoiceWindow.setScrollbarSize(0);
addInvoiceWindow.setAlign(Alignment.LEFT);
addInvoiceWindow.addItem(createAddInvoiceLayout());
addInvoiceWindow.show();
}
private void showItemListDialog() {
itemListWindow = new com.smartgwt.client.widgets.Window();
itemListWindow.setWidth(850);
itemListWindow.setHeight(430);
itemListWindow.setTitle("Item List");
itemListWindow.setShowMinimizeButton(false);
itemListWindow.setIsModal(true);
itemListWindow.setShowModalMask(true);
itemListWindow.centerInPage();
itemListWindow.setScrollbarSize(0);
itemListWindow.setAlign(Alignment.LEFT);
itemListWindow.addItem(createItemListLayout());
itemListWindow.show();
setItemListComponents();
}
private void setItemsForInvoiceComponents() {
for (ItemDetailDto itemDetailDto : itemDetailDtosChosenFromSecondWindow) {
ListGridRecord record = new ListGridRecord();
record.setAttribute("itemCode", itemDetailDto.getCode());
record.setAttribute("itemName", itemDetailDto.getName());
record.setAttribute("itemDescription", itemDetailDto.getDescription());
record.setAttribute("amount", itemDetailDto.getAmount() == null ? null : itemDetailDto.getAmount().toPlainString());
record.setAttribute("id", itemDetailDto.getId().intValue());
itemsForInvoiceDataSource.addData(record);
}
itemsForInvoiceGrid.redraw();
}
private void setItemListComponents() {
for (ItemDetailDto itemDetailDto : itemDetailDtos) {
ListGridRecord record = new ListGridRecord();
record.setAttribute("itemCode", itemDetailDto.getCode());
record.setAttribute("itemName", itemDetailDto.getName());
record.setAttribute("itemDescription", itemDetailDto.getDescription());
record.setAttribute("amount", itemDetailDto.getAmount() == null ? null : itemDetailDto.getAmount().toPlainString());
record.setAttribute("id", itemDetailDto.getId().intValue());
itemListDataSource.addData(record);
}
itemsListGrid.redraw();
}
void createTwoTestRecords(){
ItemDetailDto itemDetailDto1 = new ItemDetailDto();
itemDetailDto1.setAmount(new BigDecimal("100"));
itemDetailDto1.setCode("CODE 1");
itemDetailDto1.setName("NAME 1");
itemDetailDto1.setDescription("DESCRIPTION 1");
itemDetailDto1.setId(1L);
itemDetailDtos.add(itemDetailDto1);
ItemDetailDto itemDetailDto2 = new ItemDetailDto();
itemDetailDto2.setAmount(new BigDecimal("200"));
itemDetailDto2.setCode("CODE 2");
itemDetailDto2.setName("NAME 2");
itemDetailDto2.setDescription("DESCRIPTION 2");
itemDetailDto2.setId(2L);
itemDetailDtos.add(itemDetailDto2);
}
class ItemDetailDto {
private Long id;
private String code;
private String description;
private String name;
private BigDecimal amount;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
}
}