// $HeadURL$
// $Id$
//
// Copyright © 2006, 2010, 2011, 2012 by the President and Fellows of Harvard College.
//
// Screensaver is an open-source project developed by the ICCB-L and NSRB labs
// at Harvard Medical School. This software is distributed under the terms of
// the GNU General Public License.
package edu.harvard.med.screensaver.ui.arch.datatable;
import java.util.List;
import org.apache.log4j.Logger;
import edu.harvard.med.screensaver.model.users.ScreensaverUserRole;
import edu.harvard.med.screensaver.ui.arch.datatable.column.TableColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.model.DataTableModel;
import edu.harvard.med.screensaver.ui.arch.util.UISelectOneBean;
import edu.harvard.med.screensaver.ui.arch.view.aspects.UICommand;
/**
* DataTable subclass that adds methods for editing, saving, and canceling
* pending edits.
*
* @param E the type of each row's data object
* @author <a mailto="andrew_tolopko@hms.harvard.edu">Andrew Tolopko</a>
* @author <a mailto="john_sullivan@hms.harvard.edu">John Sullivan</a>
*/
// TODO: replace implementation with AbstractEntitableBackingBean
public abstract class EditableDataTable<R> extends DataTable<R>
{
private static final Logger log = Logger.getLogger(EditableDataTable.class);
private ScreensaverUserRole _editingRole;
private boolean _editMode;
private Boolean _hasEditableColumns;
public EditableDataTable()
{
super();
}
@Override
public void initialize(DataTableModel<R> dataTableModel,
List<? extends TableColumn<R,?>> columns,
UISelectOneBean<Integer> rowsPerPageSelector,
boolean useReorderListWidget)
{
super.initialize(dataTableModel, columns, rowsPerPageSelector, useReorderListWidget);
_editMode = false;
}
public <T> void setCellValue(Object value)
{
if (log.isDebugEnabled()) {
log.debug("setting value on " + getRowData() + " from column " +
getColumnManager().getCurrentColumn().getName() + ": " + value);
}
((TableColumn<R,T>) getColumnManager().getCurrentColumn()).setCellValue(getRowData(), (T) value);
}
public boolean isEditMode()
{
return _editMode;
}
public ScreensaverUserRole getEditingRole()
{
return _editingRole;
}
public void setEditingRole(ScreensaverUserRole editingRole)
{
_editingRole = editingRole;
_hasEditableColumns = null; // force re-calc
}
public boolean isEditable()
{
return getHasEditableColumns() && getScreensaverUser().isUserInRole(_editingRole);
}
public boolean getHasEditableColumns()
{
if (_hasEditableColumns == null) {
initializeHasEditableColumns(getColumnManager().getAllColumns());
}
return _hasEditableColumns;
}
@UICommand
/* final (CGLIB2 restriction) */public String edit()
{
setEditMode(true);
doEdit();
return REDISPLAY_PAGE_ACTION_RESULT;
}
// protected instance methods
protected void doEdit()
{}
@UICommand
/* final (CGLIB2 restriction) */public String save()
{
setEditMode(false);
doSave();
return REDISPLAY_PAGE_ACTION_RESULT;
}
protected void doSave()
{}
/* final (CGLIB2 restriction) */public String cancel()
{
setEditMode(false);
doCancel();
return REDISPLAY_PAGE_ACTION_RESULT;
}
protected void doCancel()
{}
private void initializeHasEditableColumns(List<? extends TableColumn<R,?>> columns)
{
_hasEditableColumns = false;
for (TableColumn<R,?> column : columns) {
if (column.isEditable()) {
_hasEditableColumns = true;
break;
}
}
}
protected void setEditMode(boolean isEditMode)
{
_editMode = isEditMode;
}
}