/******************************************************************************* * 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 org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.BeansObservables; import org.eclipse.core.databinding.observable.value.ComputedValue; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.riena.beans.common.Person; import org.eclipse.riena.beans.common.PersonFactory; import org.eclipse.riena.beans.common.PersonManager; import org.eclipse.riena.beans.common.TypedComparator; import org.eclipse.riena.example.client.views.TextSubModuleView; import org.eclipse.riena.internal.example.client.beans.PersonModificationBean; import org.eclipse.riena.navigation.ISubModuleNode; import org.eclipse.riena.navigation.NavigationArgument; import org.eclipse.riena.navigation.ui.controllers.SubModuleController; import org.eclipse.riena.ui.ridgets.IActionRidget; import org.eclipse.riena.ui.ridgets.IListRidget; import org.eclipse.riena.ui.ridgets.IRidget; import org.eclipse.riena.ui.ridgets.ISelectableRidget; import org.eclipse.riena.ui.ridgets.ITableRidget; import org.eclipse.riena.ui.ridgets.ITextRidget; import org.eclipse.riena.ui.ridgets.IToggleButtonRidget; import org.eclipse.riena.ui.ridgets.annotation.OnActionCallback; import org.eclipse.riena.ui.ridgets.annotation.OnClick; import org.eclipse.riena.ui.ridgets.annotation.OnDoubleClick; import org.eclipse.riena.ui.ridgets.annotation.OnPropertyChange; import org.eclipse.riena.ui.ridgets.listener.ClickEvent; /** * Controller for the {@link TextSubModuleView} example. */ public class ListSubModuleController extends SubModuleController { /** Manages a collection of persons. */ private final PersonManager manager; /** Holds editable data for a person. */ private final PersonModificationBean value; private ITableRidget listPersons; private ITextRidget textFirst; private ITextRidget textLast; private IToggleButtonRidget buttonSort; /** sort count */ private int count = 0; public ListSubModuleController() { this(null); } public ListSubModuleController(final ISubModuleNode navigationNode) { super(navigationNode); manager = new PersonManager(PersonFactory.createPersonList()); manager.setSelectedPerson(manager.getPersons().iterator().next()); value = new PersonModificationBean(); } /** * Binds and updates the ridgets. * * @see org.eclipse.riena.ui.ridgets.IRidgetContainer#configureRidgets() */ @Override public void configureRidgets() { listPersons = getListRidget(); listPersons.setSelectionType(ISelectableRidget.SelectionType.SINGLE); listPersons.setComparator(0, new TypedComparator<String>()); listPersons.setSortedColumn(0); listPersons.bindToModel(manager, "persons", Person.class, new String[] { "listEntry" }, null); //$NON-NLS-1$ //$NON-NLS-2$ listPersons.updateFromModel(); listPersons.bindSingleSelectionToModel(manager, PersonManager.PROPERTY_SELECTED_PERSON); textFirst = getRidget(ITextRidget.class, "textFirst"); //$NON-NLS-1$ textFirst.bindToModel(value, "firstName"); //$NON-NLS-1$ textFirst.updateFromModel(); textLast = getRidget(ITextRidget.class, "textLast"); //$NON-NLS-1$ textLast.bindToModel(value, "lastName"); //$NON-NLS-1$ textLast.updateFromModel(); buttonSort = getRidget(IToggleButtonRidget.class, "buttonSort"); //$NON-NLS-1$ buttonSort.setText("Sort ascending"); //$NON-NLS-1$ buttonSort.setSelected(true); listPersons.setSortedAscending(buttonSort.isSelected()); final IActionRidget buttonAdd = getRidget(IActionRidget.class, "buttonAdd"); //$NON-NLS-1$ buttonAdd.setText("&Add"); //$NON-NLS-1$ final IActionRidget buttonRemove = getRidget(IActionRidget.class, "buttonRemove"); //$NON-NLS-1$ buttonRemove.setText("&Remove"); //$NON-NLS-1$ final IActionRidget buttonSave = getRidget(IActionRidget.class, "buttonSave"); //$NON-NLS-1$ buttonSave.setText("&Save"); //$NON-NLS-1$ final IObservableValue viewerSelection = listPersons.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, buttonRemove, hasSelection); bindEnablementToValue(dbc, buttonSave, hasSelection); if (getNavigationNode().getNavigationArgument() != null) { setValuesFromNavigation(); } } protected ITableRidget getListRidget() { return getRidget(IListRidget.class, "listPersons"); //$NON-NLS-1$ } @OnPropertyChange(ridgetId = "listPersons", propertyName = ITableRidget.PROPERTY_SELECTION) public void selectionChanged() { value.setPerson(manager.getSelectedPerson()); textFirst.updateFromModel(); textLast.updateFromModel(); } @OnActionCallback(ridgetId = "buttonSort") public void sortAction() { final boolean ascending = buttonSort.isSelected(); listPersons.setSortedAscending(ascending); } @OnDoubleClick(ridgetId = "listPersons") @OnActionCallback(ridgetId = "buttonSort") public void dumpDoubleClickedItem() { System.out.println("List of selected item(s): " + listPersons.getSelection()); //$NON-NLS-1$ } @OnClick(ridgetId = "listPersons") public void dumpClickedItem(final ClickEvent clickEvent) { System.out.println("Clicked item: " + listPersons.getSelection()); //$NON-NLS-1$ } @OnActionCallback(ridgetId = "buttonAdd") public void addAction() { final Person newPerson = new Person("Average", "Joe #" + ++count); //$NON-NLS-1$ //$NON-NLS-2$ manager.getPersons().add(newPerson); listPersons.updateFromModel(); manager.setSelectedPerson(newPerson); listPersons.updateSingleSelectionFromModel(); } @OnActionCallback(ridgetId = "buttonRemove") public void removeAction() { final Person selPerson = manager.getSelectedPerson(); if (selPerson != null) { manager.getPersons().remove(selPerson); listPersons.updateFromModel(); manager.setSelectedPerson(null); } } @OnActionCallback(ridgetId = "buttonSave") public void saveAction() { value.update(); listPersons.updateFromModel(); } private void setValuesFromNavigation() { final NavigationArgument navigationArgument = getNavigationNode().getNavigationArgument(); if (navigationArgument.getParameter() instanceof Integer) { final int modelIndex = (Integer) navigationArgument.getParameter(); listPersons.setSelection(modelIndex); } } private void bindEnablementToValue(final DataBindingContext dbc, final IRidget ridget, final IObservableValue value) { dbc.bindValue(BeansObservables.observeValue(ridget, IRidget.PROPERTY_ENABLED), value, null, null); } }