/******************************************************************************* * Copyright (c) 2007, 2014 compeople AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * compeople AG - initial API and implementation *******************************************************************************/ package org.eclipse.riena.example.client.controllers; import java.util.ArrayList; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.BeansObservables; import org.eclipse.core.databinding.observable.list.WritableList; import org.eclipse.core.databinding.observable.value.ComputedValue; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.riena.beans.common.TypedComparator; import org.eclipse.riena.beans.common.WordNode; import org.eclipse.riena.example.client.views.TableSubModuleView; import org.eclipse.riena.navigation.IApplicationNode; import org.eclipse.riena.navigation.ISubModuleNode; import org.eclipse.riena.navigation.ui.controllers.ApplicationController; import org.eclipse.riena.navigation.ui.controllers.SubModuleController; import org.eclipse.riena.ui.core.marker.RowErrorMessageMarker; import org.eclipse.riena.ui.ridgets.IActionListener; import org.eclipse.riena.ui.ridgets.IActionRidget; import org.eclipse.riena.ui.ridgets.IRidget; import org.eclipse.riena.ui.ridgets.ISelectableRidget; import org.eclipse.riena.ui.ridgets.IStatuslineRidget; import org.eclipse.riena.ui.ridgets.ITableRidget; import org.eclipse.riena.ui.ridgets.IToggleButtonRidget; import org.eclipse.riena.ui.ridgets.listener.ISelectionListener; import org.eclipse.riena.ui.ridgets.listener.SelectionEvent; import org.eclipse.riena.ui.ridgets.marker.StatuslineMessageMarkerViewer; import org.eclipse.riena.ui.ridgets.swt.ColumnFormatter; import org.eclipse.riena.ui.ridgets.swt.NumberColumnFormatter; import org.eclipse.riena.ui.swt.StatusMeter; /** * Controller for the {@link TableSubModuleView} example. */ public class TableSubModuleController extends SubModuleController { private IActionRidget buttonRename; private ITableRidget table; private List<WordNode> input; private Color green; private Color darkGreen; public TableSubModuleController() { this(null); final Display display = Display.getCurrent(); green = display.getSystemColor(SWT.COLOR_GREEN); darkGreen = display.getSystemColor(SWT.COLOR_DARK_GREEN); } public TableSubModuleController(final ISubModuleNode navigationNode) { super(navigationNode); } /** * @see org.eclipse.riena.navigation.ui.controllers.SubModuleController#afterBind() */ @Override public void afterBind() { super.afterBind(); // bindModel(); } private void bindModel() { input = createInput(); final String[] columnPropertyNames = { "AQuota", "word", "upperCase", "ACount", "AQuota" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ final String[] columnHeaders = { "S", "Word", "Uppercase", "A Count", "A Quota [%]" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ table.bindToModel(new WritableList(input, WordNode.class), WordNode.class, columnPropertyNames, columnHeaders); table.updateFromModel(); table.setComparator(1, new TypedComparator<String>()); table.setComparator(2, new TypedComparator<Boolean>()); table.setColumnFormatter(4, new NumberColumnFormatter(Float.class, 2) { @Override protected Number getValue(final Object element) { return ((WordNode) element).getAQuota(); } }); table.setColumnSortable(3, false); table.setSelectionType(ISelectableRidget.SelectionType.MULTI); table.setSelection(0); table.setColumnFormatter(0, new ColumnFormatter() { @Override public String getText(final Object element) { return ""; //$NON-NLS-1$ } @Override public String getToolTip(final Object element) { if (((WordNode) element).isUpperCase()) { // return "Uppercase"; //$NON-NLS-1$ return null; } else { final int value = (int) ((WordNode) element).getAQuota(); return "approx. " + value + "%"; //$NON-NLS-1$//$NON-NLS-2$ } } @Override public Color getToolTipForegroundColor(final Object element) { if (((WordNode) element).isUpperCase()) { return Display.getDefault().getSystemColor(SWT.COLOR_BLACK); } else { return Display.getDefault().getSystemColor(SWT.COLOR_BLUE); } } @Override public Color getToolTipBackgroundColor(final Object element) { return Display.getDefault().getSystemColor(SWT.COLOR_WHITE); } // @Override // public Image getToolTipImage(final Object element) { // return LnfManager.getLnf().getImage(LnfKeyConstants.STATUSLINE_INFO_ICON); // } @Override public ImageData getImage(final Object element) { if (((WordNode) element).isUpperCase()) { return StatusMeter.imageFinished().width(16).gradientStartColor(green).gradientEndColor(darkGreen).getImageData(); } else { final int value = (int) ((WordNode) element).getAQuota(); return StatusMeter.imageDefault().width(16).value(value).getImageData(); } } }); // Show error messages in the status line final IApplicationNode application = getNavigationNode().getParentOfType(IApplicationNode.class); final ApplicationController applicationController = (ApplicationController) application.getNavigationNodeController(); final IStatuslineRidget statuslineRidget = applicationController.getStatusline(); final StatuslineMessageMarkerViewer statuslineMessageMarkerViewer = new StatuslineMessageMarkerViewer(statuslineRidget); statuslineMessageMarkerViewer.addMarkerType(RowErrorMessageMarker.class); statuslineMessageMarkerViewer.addRidget(table); } /** * @see org.eclipse.riena.ui.ridgets.IRidgetContainer#configureRidgets() */ @Override public void configureRidgets() { table = getRidget(ITableRidget.class, "table"); //$NON-NLS-1$ table.setNativeToolTip(false); final IToggleButtonRidget buttonPrintSelection = getRidget(IToggleButtonRidget.class, "buttonPrintSelection"); //$NON-NLS-1$ final IActionRidget buttonAddSibling = getRidget(IActionRidget.class, "buttonAddSibling"); //$NON-NLS-1$ buttonRename = getRidget(IActionRidget.class, "buttonRename"); //$NON-NLS-1$ final IActionRidget buttonDelete = getRidget(IActionRidget.class, "buttonDelete"); //$NON-NLS-1$ table.addDoubleClickListener(new IActionListener() { public void callback() { final WordNode node = (WordNode) table.getSingleSelectionObservable().getValue(); if (node != null) { final boolean isUpperCase = !node.isUpperCase(); node.setUpperCase(isUpperCase); } for (final RowErrorMessageMarker marker : table.getMarkersOfType(RowErrorMessageMarker.class)) { if (node.equals(marker.getRowValue())) { table.removeMarker(marker); return; } } final RowErrorMessageMarker remm = new RowErrorMessageMarker(node.getWord() + " has " + node.getACount() //$NON-NLS-1$ + " \"a\"", node); //$NON-NLS-1$ table.addMarker(remm); } }); table.addSelectionListener(new ISelectionListener() { public void ridgetSelected(final SelectionEvent event) { if (buttonPrintSelection.isSelected()) { System.out.println(event); } } }); buttonPrintSelection.setText("&Echo Selection"); //$NON-NLS-1$ buttonPrintSelection.setSelected(true); buttonAddSibling.setText("&Add"); //$NON-NLS-1$ buttonAddSibling.addListener(new IActionListener() { public void callback() { final WordNode newNode = new WordNode("A_NEW_SIBLING"); //$NON-NLS-1$ input.add(newNode); table.updateFromModel(); table.setSelection(newNode); } }); buttonRename.setText("&Modify"); //$NON-NLS-1$ buttonRename.addListener(new IActionListener() { public void callback() { final WordNode node = (WordNode) table.getSingleSelectionObservable().getValue(); if (node != null) { final String newValue = getNewValue(node.getWordIgnoreUppercase()); if (newValue != null) { node.setWord(newValue); } } } }); buttonDelete.setText("&Delete"); //$NON-NLS-1$ buttonDelete.addListener(new IActionListener() { public void callback() { final WordNode node = (WordNode) table.getSingleSelectionObservable().getValue(); input.remove(node); table.updateFromModel(); } }); final IObservableValue viewerSelection = table.getSingleSelectionObservable(); final IObservableValue hasSelection = new ComputedValue(Boolean.TYPE) { @Override protected Object calculate() { return Boolean.valueOf(viewerSelection.getValue() != null); } }; final DataBindingContext dbc = new DataBindingContext(); bindEnablementToValue(dbc, buttonDelete, hasSelection); bindEnablementToValue(dbc, buttonRename, hasSelection); bindModel(); } private void bindEnablementToValue(final DataBindingContext dbc, final IRidget ridget, final IObservableValue value) { dbc.bindValue(BeansObservables.observeValue(ridget, IRidget.PROPERTY_ENABLED), value, null, null); } private String getNewValue(final Object oldValue) { String newValue = null; if (oldValue != null) { final Shell shell = ((Button) buttonRename.getUIControl()).getShell(); final IInputValidator validator = new IInputValidator() { public String isValid(final String newText) { final boolean isValid = newText.trim().length() > 0; return isValid ? null : "Word cannot be empty!"; //$NON-NLS-1$ } }; final InputDialog dialog = new InputDialog(shell, "Modify", "Enter a new word:", String.valueOf(oldValue), //$NON-NLS-1$ //$NON-NLS-2$ validator); final int result = dialog.open(); if (result == Window.OK) { newValue = dialog.getValue(); } } return newValue; } private List<WordNode> createInput() { final String[] words = { "Adventure", "Acclimatisation", "Aardwark", "Binoculars", "Beverage", "Boredom", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ "Ballistics", "Calculation", "Coexistence", "Cinnamon", "Celebration", "Disney", "Dictionary", "Delta", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ "Desperate", "Elf", "Electronics", "Elwood", "Enemy" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ final ArrayList<WordNode> result = new ArrayList<WordNode>(words.length); for (final String word : words) { final WordNode node = new WordNode(word); result.add(node); } result.get(0).setUpperCase(true); result.get(1).setUpperCase(true); return result; } }