/*******************************************************************************
* 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.client.controller.test;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.riena.beans.common.Person;
import org.eclipse.riena.beans.common.PersonFactory;
import org.eclipse.riena.beans.common.TestBean;
import org.eclipse.riena.beans.common.WordNode;
import org.eclipse.riena.navigation.INavigationNode;
import org.eclipse.riena.navigation.model.SimpleNavigationNodeAdapter;
import org.eclipse.riena.navigation.ui.controllers.SubModuleController;
import org.eclipse.riena.ui.core.marker.AttentionMarker;
import org.eclipse.riena.ui.core.marker.ValidationTime;
import org.eclipse.riena.ui.ridgets.IActionListener;
import org.eclipse.riena.ui.ridgets.IActionRidget;
import org.eclipse.riena.ui.ridgets.IComboRidget;
import org.eclipse.riena.ui.ridgets.IDateTextRidget;
import org.eclipse.riena.ui.ridgets.IDateTimeRidget;
import org.eclipse.riena.ui.ridgets.IDecimalTextRidget;
import org.eclipse.riena.ui.ridgets.IGroupedTreeTableRidget;
import org.eclipse.riena.ui.ridgets.IListRidget;
import org.eclipse.riena.ui.ridgets.IMarkableRidget;
import org.eclipse.riena.ui.ridgets.IMultipleChoiceRidget;
import org.eclipse.riena.ui.ridgets.INumericTextRidget;
import org.eclipse.riena.ui.ridgets.IRidget;
import org.eclipse.riena.ui.ridgets.ISelectableRidget;
import org.eclipse.riena.ui.ridgets.ISingleChoiceRidget;
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.ITreeRidget;
import org.eclipse.riena.ui.ridgets.tree2.ITreeNode;
import org.eclipse.riena.ui.ridgets.tree2.TreeNode;
import org.eclipse.riena.ui.ridgets.validation.MinLength;
import org.eclipse.riena.ui.ridgets.validation.ValidationRuleStatus;
/**
* Controller for the {@link MarkerSubModuleView} example.
*/
public class MarkerSubModuleController extends SubModuleController {
/**
* @see org.eclipse.riena.ui.ridgets.IRidgetContainer#configureRidgets()
*/
@Override
public void configureRidgets() {
final ITextRidget textName = getRidget(ITextRidget.class, "textName"); //$NON-NLS-1$
textName.setText("Chateau Schaedelbrummer"); //$NON-NLS-1$
final IDecimalTextRidget textPrice = getRidget(IDecimalTextRidget.class, "textPrice"); //$NON-NLS-1$
textPrice.setGrouping(true);
textPrice.setText(NumberFormat.getInstance().format(-29.99));
final INumericTextRidget textAmount = getRidget(INumericTextRidget.class, "textAmount"); //$NON-NLS-1$
textAmount.setSigned(false);
textAmount.setGrouping(true);
textAmount.setText("1001"); //$NON-NLS-1$
final IDateTextRidget textDate = getRidget(IDateTextRidget.class, "textDate"); //$NON-NLS-1$
textDate.setFormat(IDateTextRidget.FORMAT_DDMMYYYY);
textDate.setText("04.12.2008"); //$NON-NLS-1$
final IDateTimeRidget dtDate = getRidget(IDateTimeRidget.class, "dtDate"); //$NON-NLS-1$
final DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); //$NON-NLS-1$
try {
final Date date = dateFormat.parse("04.12.2008"); //$NON-NLS-1$
dtDate.setDate(date);
} catch (final ParseException e) {
dtDate.setDate(new Date());
}
final IDateTextRidget dtPicker = getRidget(IDateTextRidget.class, "dtPicker"); //$NON-NLS-1$
dtPicker.setFormat(IDateTextRidget.FORMAT_DDMMYYYY);
dtPicker.setText("04.12.2008"); //$NON-NLS-1$
final IComboRidget comboAge = getRidget(IComboRidget.class, "comboAge"); //$NON-NLS-1$
final List<String> ages = Arrays.asList(new String[] { "<none>", "young", "moderate", "aged", "old" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
comboAge.bindToModel(new WritableList(ages, String.class), String.class, null, new WritableValue());
comboAge.updateFromModel();
comboAge.setEmptySelectionItem("<none>"); //$NON-NLS-1$
comboAge.setSelection(1);
final IComboRidget comboStyle = getRidget(IComboRidget.class, "comboStyle"); //$NON-NLS-1$
final List<String> styles = Arrays.asList(new String[] { "<none>", "Bordeaux", "Beaujolaix", "Merlot", "Pinot Noire", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
"Syrah" }); //$NON-NLS-1$
comboStyle.bindToModel(new WritableList(styles, String.class), String.class, null, new WritableValue());
comboStyle.updateFromModel();
comboStyle.setEmptySelectionItem("<none>"); //$NON-NLS-1$
comboStyle.setSelection(1);
final IComboRidget comboSize = getRidget(IComboRidget.class, "ccomboSize"); //$NON-NLS-1$
final List<String> sizes = Arrays.asList(new String[] { "<none>", "xs", "s", "m", "l", "xl" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
comboSize.bindToModel(new WritableList(sizes, String.class), String.class, null, new WritableValue());
comboSize.updateFromModel();
comboSize.setEmptySelectionItem("<none>"); //$NON-NLS-1$
comboSize.setSelection(1);
final ISingleChoiceRidget choiceType = getRidget(ISingleChoiceRidget.class, "choiceType"); //$NON-NLS-1$
choiceType.bindToModel(Arrays.asList("red", "white", "rose"), (List<String>) null, new TestBean(), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TestBean.PROPERTY);
choiceType.updateFromModel();
choiceType.setSelection("red"); //$NON-NLS-1$
final IMultipleChoiceRidget choiceFlavor = getRidget(IMultipleChoiceRidget.class, "choiceFlavor"); //$NON-NLS-1$
choiceFlavor.bindToModel(Arrays.asList("dry", "sweet", "sour", "spicy"), (List<String>) null, new TestBean(), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
TestBean.PROPERTY);
choiceFlavor.updateFromModel();
choiceFlavor.setSelection(Arrays.asList("dry", "spicy")); //$NON-NLS-1$ //$NON-NLS-2$
final IListRidget listPersons = getRidget(IListRidget.class, "listPersons"); //$NON-NLS-1$
listPersons.setSelectionType(ISelectableRidget.SelectionType.SINGLE);
listPersons.bindToModel(createPersonList(), Person.class, "listEntry"); //$NON-NLS-1$
listPersons.updateFromModel();
final ITableRidget tablePersons = getRidget(ITableRidget.class, "tablePersons"); //$NON-NLS-1$
tablePersons.setSelectionType(ISelectableRidget.SelectionType.SINGLE);
String[] colValues = new String[] { "lastname", "firstname" }; //$NON-NLS-1$ //$NON-NLS-2$
final String[] colHeaders = new String[] { "Last Name", "First Name" }; //$NON-NLS-1$ //$NON-NLS-2$
tablePersons.bindToModel(createPersonList(), Person.class, colValues, colHeaders);
tablePersons.updateFromModel();
final ITreeRidget treePersons = getRidget(ITreeRidget.class, "treePersons"); //$NON-NLS-1$
treePersons.setSelectionType(ISelectableRidget.SelectionType.SINGLE);
treePersons.bindToModel(createTreeRoots(), ITreeNode.class, ITreeNode.PROPERTY_CHILDREN, ITreeNode.PROPERTY_PARENT, ITreeNode.PROPERTY_VALUE);
treePersons.updateFromModel();
final IGroupedTreeTableRidget treeWCols = getRidget(IGroupedTreeTableRidget.class, "treeWCols"); //$NON-NLS-1$
treeWCols.setSelectionType(ISelectableRidget.SelectionType.MULTI);
treeWCols.setGroupingEnabled(true);
colValues = new String[] { "word", "ACount" }; //$NON-NLS-1$ //$NON-NLS-2$
final String[] colHeaders2 = new String[] { "Word", "#A" }; //$NON-NLS-1$ //$NON-NLS-2$
treeWCols.bindToModel(createTreeTableRoots(), WordNode.class, ITreeNode.PROPERTY_CHILDREN, ITreeNode.PROPERTY_PARENT, colValues, colHeaders2);
treeWCols.updateFromModel();
final IActionRidget buttonPush = getRidget(IActionRidget.class, "buttonPush"); //$NON-NLS-1$
final IToggleButtonRidget buttonToggleA = getRidget(IToggleButtonRidget.class, "buttonToggleA"); //$NON-NLS-1$
final IToggleButtonRidget buttonToggleB = getRidget(IToggleButtonRidget.class, "buttonToggleB"); //$NON-NLS-1$
buttonToggleA.setSelected(true);
final IToggleButtonRidget buttonRadioA = getRidget(IToggleButtonRidget.class, "buttonRadioA"); //$NON-NLS-1$
final IToggleButtonRidget buttonRadioB = getRidget(IToggleButtonRidget.class, "buttonRadioB"); //$NON-NLS-1$
buttonRadioA.setSelected(true);
final IToggleButtonRidget buttonCheckA = getRidget(IToggleButtonRidget.class, "buttonCheckA"); //$NON-NLS-1$
final IToggleButtonRidget buttonCheckB = getRidget(IToggleButtonRidget.class, "buttonCheckB"); //$NON-NLS-1$
buttonCheckA.setSelected(true);
final IRidget[] markables = new IRidget[] { textName, textPrice, textAmount, textDate, dtDate, dtPicker, comboAge, comboStyle, comboSize, choiceType,
choiceFlavor, listPersons, tablePersons, treePersons, treeWCols, buttonToggleA, buttonToggleB, buttonPush, buttonRadioA, buttonRadioB,
buttonCheckA, buttonCheckB };
final IToggleButtonRidget checkMandatory = getRidget(IToggleButtonRidget.class, "checkMandatory"); //$NON-NLS-1$
final IToggleButtonRidget checkError = getRidget(IToggleButtonRidget.class, "checkError"); //$NON-NLS-1$
final IToggleButtonRidget checkDisabled = getRidget(IToggleButtonRidget.class, "checkDisabled"); //$NON-NLS-1$
final IToggleButtonRidget checkOutput = getRidget(IToggleButtonRidget.class, "checkOutput"); //$NON-NLS-1$
final IToggleButtonRidget checkHidden = getRidget(IToggleButtonRidget.class, "checkHidden"); //$NON-NLS-1$
final IToggleButtonRidget checkHiddenParent = getRidget(IToggleButtonRidget.class, "checkHiddenParent"); //$NON-NLS-1$
checkMandatory.addListener(new IActionListener() {
public void callback() {
final boolean isMandatory = checkMandatory.isSelected();
for (final IRidget ridget : markables) {
if (ridget instanceof IMarkableRidget) {
((IMarkableRidget) ridget).setMandatory(isMandatory);
} else {
final String name = ridget.getClass().getSimpleName();
System.out.println("No mandatory marker support on " + name); //$NON-NLS-1$
}
}
if (isMandatory) {
textName.setText(""); //$NON-NLS-1$
textPrice.setText(""); //$NON-NLS-1$
textAmount.setText(null);
textDate.setText(null);
dtPicker.setText(null);
comboAge.setSelection("<none>"); //$NON-NLS-1$
comboStyle.setSelection("<none>"); //$NON-NLS-1$
comboSize.setSelection("<none>"); //$NON-NLS-1$
choiceType.setSelection(null);
choiceFlavor.setSelection(null);
listPersons.setSelection((Object) null);
tablePersons.setSelection((Object) null);
treePersons.setSelection((Object) null);
treeWCols.setSelection((Object) null);
buttonToggleA.setSelected(false);
buttonToggleB.setSelected(false);
buttonRadioA.setSelected(false);
buttonRadioB.setSelected(false);
buttonCheckA.setSelected(false);
buttonCheckB.setSelected(false);
}
}
});
checkError.addListener(new IActionListener() {
private final IValidator alwaysWrong = new AlwaysWrongValidator();
public void callback() {
final boolean isError = checkError.isSelected();
for (final IRidget ridget : markables) {
if (ridget instanceof IMarkableRidget) {
((IMarkableRidget) ridget).setErrorMarked(isError);
}
}
// using this "always wrong" validator for purposes of this
// demo. It prevents the error marker being removed from the
// text field on the next revalidation (i.e. when the user
// types).
if (isError) {
textName.addValidationRule(alwaysWrong, ValidationTime.ON_UI_CONTROL_EDIT);
textPrice.addValidationRule(alwaysWrong, ValidationTime.ON_UI_CONTROL_EDIT);
textAmount.addValidationRule(alwaysWrong, ValidationTime.ON_UI_CONTROL_EDIT);
textDate.addValidationRule(alwaysWrong, ValidationTime.ON_UI_CONTROL_EDIT);
} else {
textName.removeValidationRule(alwaysWrong);
textPrice.removeValidationRule(alwaysWrong);
textAmount.removeValidationRule(alwaysWrong);
textDate.removeValidationRule(alwaysWrong);
}
}
});
checkDisabled.addListener(new DisabledActionListener(markables, checkDisabled));
checkOutput.addListener(new OutputActionListener(markables, checkOutput));
checkHidden.addListener(new HiddenActionListener(checkHidden, markables));
checkHiddenParent.addListener(new HiddenParentActionListener(checkHiddenParent, markables));
getNavigationNode().addSimpleListener(new SimpleNavigationNodeAdapter() {
@Override
public void afterActivated(final INavigationNode<?> node) {
super.afterDeactivated(node);
final Collection<AttentionMarker> markers = node.getMarkersOfType(AttentionMarker.class);
for (final AttentionMarker marker : markers) {
node.removeMarker(marker);
}
}
});
final ITextRidget ridget = getRidget(ITextRidget.class, "seite2Text"); //$NON-NLS-1$
ridget.addValidationRule(new MinLength(3), ValidationTime.ON_UI_CONTROL_EDIT);
}
// helping methods
// ////////////////
private WritableList createPersonList() {
return new WritableList(PersonFactory.createPersonList(), Person.class);
}
private ITreeNode[] createTreeRoots() {
final ITreeNode rootA = new TreeNode("A"); //$NON-NLS-1$
new TreeNode(rootA, new Person("Albinus", "Albert")); //$NON-NLS-1$ //$NON-NLS-2$
new TreeNode(rootA, new Person("Aurelius", "Mark")); //$NON-NLS-1$ //$NON-NLS-2$
final ITreeNode rootB = new TreeNode("B"); //$NON-NLS-1$
new TreeNode(rootB, new Person("Barker", "Clyve")); //$NON-NLS-1$ //$NON-NLS-2$
new TreeNode(rootB, new Person("Barclay", "Bob")); //$NON-NLS-1$ //$NON-NLS-2$
return new ITreeNode[] { rootA, rootB };
}
private WordNode[] createTreeTableRoots() {
final WordNode rootA = new WordNode("A"); //$NON-NLS-1$
final WordNode rootB = new WordNode("B"); //$NON-NLS-1$
new WordNode(rootA, "Astoria"); //$NON-NLS-1$
new WordNode(rootA, "Ashland"); //$NON-NLS-1$
new WordNode(rootA, "Aurora"); //$NON-NLS-1$
new WordNode(rootA, "Alpine"); //$NON-NLS-1$
new WordNode(rootB, "Boring"); //$NON-NLS-1$
new WordNode(rootB, "Bend"); //$NON-NLS-1$
new WordNode(rootB, "Beaverton"); //$NON-NLS-1$
new WordNode(rootB, "Bridgeport"); //$NON-NLS-1$
return new WordNode[] { rootA, rootB };
}
// helping classes
// ////////////////
private static final class DisabledActionListener implements IActionListener {
private final IRidget[] markables;
private final IToggleButtonRidget checkDisabled;
private DisabledActionListener(final IRidget[] markables, final IToggleButtonRidget checkDisabled) {
this.markables = markables;
this.checkDisabled = checkDisabled;
}
public void callback() {
final boolean isEnabled = !checkDisabled.isSelected();
for (final IRidget ridget : markables) {
ridget.setEnabled(isEnabled);
}
}
}
private static final class OutputActionListener implements IActionListener {
private final IRidget[] markables;
private final IToggleButtonRidget checkOutput;
private OutputActionListener(final IRidget[] markables, final IToggleButtonRidget checkOutput) {
this.markables = markables;
this.checkOutput = checkOutput;
}
public void callback() {
final boolean isOutput = checkOutput.isSelected();
for (final IRidget ridget : markables) {
if (ridget instanceof IMarkableRidget) {
((IMarkableRidget) ridget).setOutputOnly(isOutput);
} else {
final String name = ridget.getClass().getSimpleName();
System.out.println("No output marker support on " + name); //$NON-NLS-1$
}
}
}
}
private static final class HiddenActionListener implements IActionListener {
private final IToggleButtonRidget checkHidden;
private final IRidget[] markables;
private HiddenActionListener(final IToggleButtonRidget checkHidden, final IRidget[] markables) {
this.checkHidden = checkHidden;
this.markables = markables;
}
public void callback() {
final boolean isVisible = !checkHidden.isSelected();
for (final IRidget ridget : markables) {
ridget.setVisible(isVisible);
}
}
}
private static final class HiddenParentActionListener implements IActionListener {
private final IToggleButtonRidget checkHiddenParent;
private final IRidget[] markables;
private HiddenParentActionListener(final IToggleButtonRidget checkHiddenParent, final IRidget[] markables) {
this.checkHiddenParent = checkHiddenParent;
this.markables = markables;
}
public void callback() {
final Composite parent = ((Control) markables[0].getUIControl()).getParent();
final boolean isVisible = !checkHiddenParent.isSelected();
parent.setVisible(isVisible);
}
}
/**
* Validator that always returns an error status.
*/
private static final class AlwaysWrongValidator implements IValidator {
public IStatus validate(final Object value) {
return ValidationRuleStatus.error(false, ""); //$NON-NLS-1$
}
}
}