package com.mycompany;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Set;
import com.vaadin.data.Container.Filter;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.mycompany.data.DataProvider;
import com.mycompany.data.TransactionsContainer;
import com.vaadin.event.Action;
import com.vaadin.event.Action.Handler;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.event.ShortcutAction.KeyCode;
import com.vaadin.event.ShortcutListener;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.Align;
import com.vaadin.ui.Table.ColumnGenerator;
import com.vaadin.ui.Table.TableDragMode;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
public class TransactionsView extends VerticalLayout implements View {
private static final long serialVersionUID = 1L;
Table t;
Object editableId = null;
TransactionsContainer data;
@Override
public void enter(ViewChangeEvent event) {
data = ((MyVaadinUI) getUI()).dataProvider.getTransactions();
setSizeFull();
addStyleName("transactions");
t = new Table() {
@Override
protected String formatPropertyValue(Object rowId, Object colId,
Property<?> property) {
if (colId.equals("Time")) {
SimpleDateFormat df = new SimpleDateFormat();
df.applyPattern("MM/dd/yyyy hh:mm:ss a");
return df
.format(((Calendar) property.getValue()).getTime());
} else if (colId.equals("Price")) {
if (property != null && property.getValue() != null) {
String ret = new DecimalFormat("#.##").format(property
.getValue());
return "$" + ret;
} else {
return "";
}
}
return super.formatPropertyValue(rowId, colId, property);
}
};
t.setSizeFull();
t.addStyleName("borderless");
t.setSelectable(true);
t.setColumnCollapsingAllowed(true);
t.setColumnReorderingAllowed(true);
data.removeAllContainerFilters();
t.setContainerDataSource(data);
sortTable();
t.setColumnAlignment("Seats", Align.RIGHT);
t.setColumnAlignment("Price", Align.RIGHT);
t.setVisibleColumns(new Object[] { "Time", "Country", "City",
"Theater", "Room", "Title", "Seats", "Price" });
t.setFooterVisible(true);
t.setColumnFooter("Time", "Total");
updatePriceFooter();
// Allow dragging items to the reports menu
t.setDragMode(TableDragMode.MULTIROW);
t.setMultiSelect(true);
// EDIT MODE disabled for now
// t.setTableFieldFactory(new DefaultFieldFactory() {
// @Override
// public Field createField(Container container, Object itemId,
// Object propertyId, Component uiContext) {
// boolean editable = itemId.equals(editableId);
// Field f = new TextField();
// f.setCaption(null);
// f.setWidth("100%");
// f.setReadOnly(!editable);
// return f;
// }
// });
// Double click to edit
// t.addItemClickListener(new ItemClickListener() {
// @Override
// public void itemClick(ItemClickEvent event) {
// if (event.getButton() == MouseButton.LEFT
// && event.isDoubleClick()) {
// editableId = event.getItemId();
// t.addStyleName("editable");
// t.setEditable(true);
// } else if (event.getButton() == MouseButton.LEFT) {
// editableId = null;
// t.setEditable(false);
// t.removeStyleName("editable");
// }
// }
// });
HorizontalLayout toolbar = new HorizontalLayout();
toolbar.setWidth("100%");
toolbar.setSpacing(true);
toolbar.setMargin(true);
toolbar.addStyleName("toolbar");
addComponent(toolbar);
Label title = new Label("All Transactions");
title.addStyleName("h1");
title.setSizeUndefined();
toolbar.addComponent(title);
toolbar.setComponentAlignment(title, Alignment.MIDDLE_LEFT);
final TextField filter = new TextField();
filter.addTextChangeListener(new TextChangeListener() {
@Override
public void textChange(final TextChangeEvent event) {
data.removeAllContainerFilters();
data.addContainerFilter(new Filter() {
@Override
public boolean passesFilter(Object itemId, Item item)
throws UnsupportedOperationException {
if (event.getText() == null
|| event.getText().equals("")) {
return true;
}
return filterByProperty("Country", item,
event.getText())
|| filterByProperty("City", item,
event.getText())
|| filterByProperty("Title", item,
event.getText());
}
@Override
public boolean appliesToProperty(Object propertyId) {
if (propertyId.equals("Country")
|| propertyId.equals("City")
|| propertyId.equals("Title"))
return true;
return false;
}
});
}
});
// final ComboBox filter = new ComboBox();
// filter.setNewItemsAllowed(true);
// filter.setNewItemHandler(new NewItemHandler() {
// @Override
// public void addNewItem(String newItemCaption) {
// filter.addItem(newItemCaption);
// }
// });
// filter.addItem("test");
// filter.addItem("finland");
// filter.addItem("paranorman");
// filter.addStyleName("small");
filter.setInputPrompt("Filter");
filter.addShortcutListener(new ShortcutListener("Clear",
KeyCode.ESCAPE, null) {
@Override
public void handleAction(Object sender, Object target) {
filter.setValue("");
data.removeAllContainerFilters();
}
});
toolbar.addComponent(filter);
toolbar.setExpandRatio(filter, 1);
toolbar.setComponentAlignment(filter, Alignment.MIDDLE_LEFT);
// Button refresh = new Button("Refresh");
// refresh.addClickListener(new ClickListener() {
// @Override
// public void buttonClick(ClickEvent event) {
// updatePriceFooter();
// try {
// Thread.sleep(3000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// });
// refresh.addStyleName("small");
// toolbar.addComponent(refresh);
final Button newReport = new Button("Create Report From Selection");
newReport.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
createNewReportFromSelection();
}
});
newReport.setEnabled(false);
newReport.addStyleName("small");
toolbar.addComponent(newReport);
toolbar.setComponentAlignment(newReport, Alignment.MIDDLE_LEFT);
addComponent(t);
setExpandRatio(t, 1);
t.addActionHandler(new Handler() {
private Action report = new Action("Create Report");
private Action discard = new Action("Discard");
private Action details = new Action("Movie details");
@Override
public void handleAction(Action action, Object sender, Object target) {
if (action == report) {
createNewReportFromSelection();
} else if (action == discard) {
Notification.show("Not implemented in this demo");
} else if (action == details) {
Item item = ((Table) sender).getItem(target);
if (item != null) {
Window w = new MovieDetailsWindow(DataProvider
.getMovieForTitle(item.getItemProperty("Title")
.getValue().toString()), null);
UI.getCurrent().addWindow(w);
w.focus();
}
}
}
@Override
public Action[] getActions(Object target, Object sender) {
return new Action[] { details, report, discard };
}
});
t.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
if (t.getValue() instanceof Set) {
Set<Object> val = (Set<Object>) t.getValue();
newReport.setEnabled(val.size() > 0);
} else {
}
}
});
t.setImmediate(true);
// group rows by month
// t.setRowGenerator(new RowGenerator() {
// @Override
// public GeneratedRow generateRow(Table table, Object itemId) {
// if (itemId.toString().startsWith("month")) {
// Date date = (Date) table.getItem(itemId)
// .getItemProperty("timestamp").getValue();
// SimpleDateFormat df = new SimpleDateFormat();
// df.applyPattern("MMMM yyyy");
// GeneratedRow row = new GeneratedRow(df.format(date));
// row.setSpanColumns(true);
// return row;
// }
// return null;
// }
// });
t.addGeneratedColumn("Title", new ColumnGenerator() {
@Override
public Object generateCell(Table source, Object itemId,
Object columnId) {
final String title = source.getItem(itemId)
.getItemProperty(columnId).getValue().toString();
Button titleLink = new Button(title);
titleLink.addStyleName("link");
titleLink.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
Window w = new MovieDetailsWindow(DataProvider
.getMovieForTitle(title), null);
UI.getCurrent().addWindow(w);
}
});
return title;
}
});
}
private void sortTable() {
t.sort(new Object[] { "timestamp" }, new boolean[] { false });
}
private boolean filterByProperty(String prop, Item item, String text) {
if (item == null || item.getItemProperty(prop) == null
|| item.getItemProperty(prop).getValue() == null)
return false;
String val = item.getItemProperty(prop).getValue().toString().trim()
.toLowerCase();
if (val.startsWith(text.toLowerCase().trim()))
return true;
// String[] parts = text.split(" ");
// for (String part : parts) {
// if (val.contains(part.toLowerCase()))
// return true;
//
// }
return false;
}
void createNewReportFromSelection() {
((MyVaadinUI) getUI()).openReports(t);
}
void updatePriceFooter() {
String ret = new DecimalFormat("#.##").format(DataProvider
.getTotalSum());
t.setColumnFooter("Price", "$" + ret);
}
}