Code:
protected JTable createTable() {
glazedTableModel = new GlazedTableModel(getFinalList(),
columnPropertyNames, getId()) {
protected boolean isEditable(Object row, int column) {
return false;
}
};
table = getComponentFactory().createTable(glazedTableModel);
EventSelectionModel selectionModel = new EventSelectionModel(getFinalList());
selectionModel.addListSelectionListener(
new ListSelectionListenerSupport() {
protected void onNoSelection() {
// getStatusBar().setMessage("");
}
protected void onSingleSelection(int i) {
// Project project = (Project) eventSelectionModel.getSelected().get(0);
// String statusBarMessage = getMessage(VIEW_ID + ".singleSelection.statusBarMessage",
// new Object[]{project.getCode()});
// getStatusBar().setMessage(statusBarMessage);
}
protected void onMultiSelection(int[] ints) {
// String statusBarMessage = getMessage(VIEW_ID + ".multiSelection.statusBarMessage");
// getStatusBar().setMessage(statusBarMessage);
}
public void valueChanged(ListSelectionEvent e) {
// updateStatusBar();
}
});
table.setSelectionModel(selectionModel);
table.setSelectionMode(EventSelectionModel.SINGLE_SELECTION);
TableComparatorChooser tableSorter = new TableComparatorChooser(table, sortedList, true);
tableSorter.clearComparator();
tableSorter.appendComparator(0, 0, false);
table.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
// If the user right clicks on a row other than the selection,
// then move the selection to the current row
int rowUnderMouse = table.rowAtPoint(e.getPoint());
if (e.getButton() == MouseEvent.BUTTON3 && !table.isRowSelected(rowUnderMouse)) {
// Select the row under the mouse
if (rowUnderMouse != -1) {
table.getSelectionModel().setSelectionInterval(rowUnderMouse, rowUnderMouse);
}
}
}
public void mouseClicked(MouseEvent e) {
// Handle double click
if (e.getClickCount() == 2
&& e.getButton() == MouseEvent.BUTTON1
&& editCommand.isEnabled()) {
editCommand.execute();
}
}
});
// table.addMouseListener(new PopupMenuMouseListener() {
// protected JPopupMenu getPopupMenu() {
// return createPopupContextMenu();
// }
// });
return table;
}
protected void initSelectionGuards() {
ValueModel selectionHolder = getSelectionHolder();
new ListSingleSelectionGuard(selectionHolder, editCommand);
new ListSingleSelectionGuard(selectionHolder, deleteCommand);
}
protected ValueModel getSelectionHolder() {
return new ListSelectionValueModelAdapter(table.getSelectionModel());
}
private P getSelectedPersistable() {
int row = table.getSelectedRow();
P p;
if (row < 0) {
p = null;
} else {
p = (P) glazedTableModel.getElementAt(row);
}
return p;
}
/**
* Refreshes all persitables without removing unremoved persitables.
* This is important for the list selection.
*/
protected void refreshBaseList() {
List<? extends Persistable> persistableList = find();
// Don't just clear the baseList, instead do a smart replace
baseList.retainAll(persistableList); // remove all removed
for (Persistable persistable : persistableList) {
if (baseList.contains(persistable)) {
baseList.set(baseList.indexOf(persistable), persistable); // update all updated
} else {
baseList.add(persistable); // add all added
}
}
}
protected void newPersistable() {
P p = prepareNew();
newOrEditPersistable(p);
}
protected void editPersistable() {
P p = getSelectedPersistable();
newOrEditPersistable(p);
}
/**
* @TODO Duplicate code with:
* be.kahosl.thot.swingui.project.relation.RelationForm.newOrganization()
* be.kahosl.thot.swingui.semestermission.task.TaskListForm.newOrEditTask()
*/
protected void newOrEditPersistable(final P p) {
String dialogId = getId() + ".dialog";
String title = getMessage(dialogId + ".title", new Object[]{p});
final TreeCompositeDialogPage treeCompositeDialogPage = new TreeCompositeDialogPage(dialogId);
treeCompositeDialogPage.setTitle(title);
final HierarchicalFormModel formModel = FormModelHelper.createCompoundFormModel(p);
List<Form> formList = createForms(formModel);
addForms(treeCompositeDialogPage, treeCompositeDialogPage, formList);
TitledPageApplicationDialog dialog = new TitledPageApplicationDialog(treeCompositeDialogPage,
getActiveWindow().getControl()) {
protected boolean onFinish() {
formModel.commit();
saveOrUpdate(p);
return true;
}
};
dialog.setTitle(title);
try {
dialog.showDialog();
} finally {
// Force a refresh, even if an exception occured
refreshBaseList();
}
}
private void addForms(TreeCompositeDialogPage treeCompositeDialogPage, DialogPage parentDialogPage,
List<Form> formList) {
for (Form form : formList) {
DialogPage dialogPage = (treeCompositeDialogPage == parentDialogPage)
? treeCompositeDialogPage.addForm(form)
: treeCompositeDialogPage.addForm(parentDialogPage, form);
if (form instanceof TreeNodeForm) {
TreeNodeForm treeNodeForm = (TreeNodeForm) form;
List<Form> childFormList = treeNodeForm.getChildFormList();
addForms(treeCompositeDialogPage, dialogPage, childFormList);
}
}
}
protected void deletePersistable() {
final P persistable = getSelectedPersistable();
String title = getMessage(getId() + ".confirmDelete.title");
String message = getMessage(getId() + ".confirmDelete.message", new Object[]{persistable});
ConfirmationDialog dialog = new ConfirmationDialog(title, message) {
protected void onConfirm() {
delete(persistable);
getApplicationContext().publishEvent(
new LifecycleApplicationEvent(LifecycleApplicationEvent.DELETED, persistable));
}
};
try {
dialog.showDialog();
} finally {
// Force a refresh, even if an exception occured
this.refreshBaseList();
}
}
public abstract List<P> find();
public abstract P prepareNew();
public abstract void saveOrUpdate(P p);
public abstract void delete(P p);
/**
* Most cases will overwrite this with a method that returns a List of normal Forms.,
* but sometimes a TreeNodeForm will be used which wraps a list of child forms.
*/
protected abstract List<Form> createForms(HierarchicalFormModel formModel);
}