/*
* Copyright (c) 2011, grossmann
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the jo-widgets.org nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL jo-widgets.org BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
package org.jowidgets.examples.common.workbench.demo2.view;
import org.jowidgets.addons.icons.silkicons.SilkIcons;
import org.jowidgets.api.color.Colors;
import org.jowidgets.api.command.IAction;
import org.jowidgets.api.command.IActionBuilder;
import org.jowidgets.api.command.ICommandExecutor;
import org.jowidgets.api.command.IExecutionContext;
import org.jowidgets.api.model.item.IMenuModel;
import org.jowidgets.api.model.table.IDefaultTableColumnBuilder;
import org.jowidgets.api.model.table.IDefaultTableColumnModel;
import org.jowidgets.api.model.table.ITableCellBuilder;
import org.jowidgets.api.model.table.ITableColumnModel;
import org.jowidgets.api.toolkit.Toolkit;
import org.jowidgets.api.widgets.IContainer;
import org.jowidgets.api.widgets.IInputDialog;
import org.jowidgets.api.widgets.IPopupMenu;
import org.jowidgets.api.widgets.ITable;
import org.jowidgets.api.widgets.blueprint.IInputDialogBluePrint;
import org.jowidgets.api.widgets.blueprint.factory.IBluePrintFactory;
import org.jowidgets.common.image.IImageConstant;
import org.jowidgets.common.model.ITableCell;
import org.jowidgets.common.widgets.controller.ITableCellPopupDetectionListener;
import org.jowidgets.common.widgets.controller.ITableCellPopupEvent;
import org.jowidgets.examples.common.workbench.base.AbstractDemoView;
import org.jowidgets.tools.command.ActionBuilder;
import org.jowidgets.tools.content.SingleControlContent;
import org.jowidgets.tools.layout.MigLayoutFactory;
import org.jowidgets.tools.model.item.MenuModel;
import org.jowidgets.tools.model.table.AbstractTableDataModel;
import org.jowidgets.tools.model.table.DefaultTableColumnBuilder;
import org.jowidgets.tools.model.table.DefaultTableColumnModel;
import org.jowidgets.tools.model.table.TableCellBuilder;
import org.jowidgets.validation.IValidationResult;
import org.jowidgets.validation.IValidator;
import org.jowidgets.validation.ValidationResult;
import org.jowidgets.workbench.api.IView;
import org.jowidgets.workbench.api.IViewContext;
public class BigTableView extends AbstractDemoView implements IView {
public static final String ID = BigTableView.class.getName();
public static final String DEFAULT_LABEL = "Big table";
public static final String DEFAULT_TOOLTIP = "Table with a lot of data";
public static final IImageConstant DEFAULT_ICON = SilkIcons.TABLE;
private int rowCount;
private final int columnCount;
private final ITable table;
private final AbstractTableDataModel dataModel;
private final IAction fitColumnsAction;
private final IAction resetPermutationAction;
private final IAction changeRowCountAction;
public BigTableView(final IViewContext context) {
super(ID);
this.rowCount = 2000;
this.columnCount = 20;
this.fitColumnsAction = createFitColumnsAction();
this.resetPermutationAction = createResetPermutationAction();
this.changeRowCountAction = createSetRowCountAction();
context.getToolBar().addAction(changeRowCountAction);
context.getToolBar().addAction(resetPermutationAction);
context.getToolBar().addAction(fitColumnsAction);
final IBluePrintFactory bpf = Toolkit.getBluePrintFactory();
final IContainer container = context.getContainer();
container.setLayout(MigLayoutFactory.growingInnerCellLayout());
final ITableColumnModel columnModel = createColumnModel();
dataModel = createDataModel();
this.table = container.add(bpf.table(columnModel, dataModel), MigLayoutFactory.GROWING_CELL_CONSTRAINTS);
addPopupMenu(table);
}
private ITableColumnModel createColumnModel() {
final IDefaultTableColumnModel columnModel = new DefaultTableColumnModel(columnCount);
for (int columnIndex = 0; columnIndex < columnModel.getColumnCount(); columnIndex++) {
final IDefaultTableColumnBuilder columnBuilder = new DefaultTableColumnBuilder();
columnBuilder.setText("Column " + columnIndex);
columnBuilder.setToolTipText("Tooltip of column " + columnIndex);
columnBuilder.setWidth(100);
columnModel.setColumn(columnIndex, columnBuilder);
}
return columnModel;
}
private AbstractTableDataModel createDataModel() {
return new AbstractTableDataModel() {
@Override
public int getRowCount() {
return rowCount;
}
@Override
public ITableCell getCell(final int rowIndex, final int columnIndex) {
final ITableCellBuilder cellBuilder = new TableCellBuilder();
cellBuilder.setText("Cell (" + rowIndex + " / " + columnIndex + ")");
if (rowIndex % 2 == 0) {
cellBuilder.setBackgroundColor(Colors.DEFAULT_TABLE_EVEN_BACKGROUND_COLOR);
}
return cellBuilder.build();
}
};
}
private void addPopupMenu(final ITable table) {
final IMenuModel menuModel = new MenuModel();
menuModel.addAction(fitColumnsAction);
menuModel.addAction(resetPermutationAction);
menuModel.addAction(changeRowCountAction);
final IPopupMenu popupMenu = table.createPopupMenu();
popupMenu.setModel(menuModel);
table.addTableCellPopupDetectionListener(new ITableCellPopupDetectionListener() {
@Override
public void popupDetected(final ITableCellPopupEvent event) {
popupMenu.show(event.getPosition());
}
});
}
private IAction createFitColumnsAction() {
final IActionBuilder builder = new ActionBuilder();
builder.setText("Fit columns");
builder.setToolTipText("Fits all columns of the table");
builder.setIcon(SilkIcons.ARROW_INOUT);
builder.setCommand(new ICommandExecutor() {
@Override
public void execute(final IExecutionContext executionContext) throws Exception {
table.pack();
}
});
return builder.build();
}
private IAction createResetPermutationAction() {
final IActionBuilder builder = new ActionBuilder();
builder.setText("Reset column order");
builder.setToolTipText("Sets all columns to its origin position");
builder.setIcon(SilkIcons.ARROW_UNDO);
builder.setCommand(new ICommandExecutor() {
@Override
public void execute(final IExecutionContext executionContext) throws Exception {
table.resetColumnPermutation();
}
});
return builder.build();
}
private IAction createSetRowCountAction() {
final IActionBuilder builder = new ActionBuilder();
builder.setText("Set row count");
builder.setToolTipText("Sets the row count to a new value");
builder.setIcon(SilkIcons.TABLE_EDIT);
builder.setCommand(new ICommandExecutor() {
@Override
public void execute(final IExecutionContext executionContext) throws Exception {
final IInputDialog<Integer> inputDialog = createRowCountInputDialog(executionContext);
inputDialog.setVisible(true);
if (inputDialog.isOkPressed()) {
rowCount = inputDialog.getValue();
dataModel.fireDataChanged();
}
inputDialog.dispose();
}
});
return builder.build();
}
private IInputDialog<Integer> createRowCountInputDialog(final IExecutionContext executionContext) {
final IBluePrintFactory bpf = Toolkit.getBluePrintFactory();
final SingleControlContent<Integer> content = new SingleControlContent<Integer>(
"Row count",
bpf.inputFieldIntegerNumber(),
200);
final IInputDialogBluePrint<Integer> inputDialogBp = bpf.inputDialog(content).setExecutionContext(executionContext);
inputDialogBp.setValidator(new IValidator<Integer>() {
@Override
public IValidationResult validate(final Integer validationInput) {
if (validationInput != null && validationInput > 100000000) {
return ValidationResult.error("Row count must be less than '" + 100000000 + "'");
}
if (validationInput != null && validationInput < 0) {
return ValidationResult.error("Row count must be greater than '" + 0 + "'");
}
return ValidationResult.ok();
}
});
inputDialogBp.setMissingInputHint("Please input the new row count!");
inputDialogBp.setResizable(false);
inputDialogBp.setValue(rowCount);
return Toolkit.getActiveWindow().createChildWindow(inputDialogBp);
}
}