/*******************************************************************************
* 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.Arrays;
import java.util.List;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.riena.example.client.views.MessageMarkerSubModuleView;
import org.eclipse.riena.navigation.IApplicationNode;
import org.eclipse.riena.navigation.ui.controllers.ApplicationController;
import org.eclipse.riena.navigation.ui.controllers.SubModuleController;
import org.eclipse.riena.ui.core.marker.ErrorMessageMarker;
import org.eclipse.riena.ui.core.marker.ValidationTime;
import org.eclipse.riena.ui.ridgets.IMessageBoxRidget;
import org.eclipse.riena.ui.ridgets.IMultipleChoiceRidget;
import org.eclipse.riena.ui.ridgets.IStatuslineRidget;
import org.eclipse.riena.ui.ridgets.ITextRidget;
import org.eclipse.riena.ui.ridgets.marker.IMessageMarkerViewer;
import org.eclipse.riena.ui.ridgets.marker.MessageBoxMessageMarkerViewer;
import org.eclipse.riena.ui.ridgets.marker.StatuslineMessageMarkerViewer;
import org.eclipse.riena.ui.ridgets.marker.TooltipMessageMarkerViewer;
import org.eclipse.riena.ui.ridgets.validation.MinLength;
import org.eclipse.riena.ui.ridgets.validation.ValidationFailure;
import org.eclipse.riena.ui.ridgets.validation.ValidationRuleStatus;
/**
* Controller for the {@link MessageMarkerSubModuleView} example.
*/
public class MessageMarkerSubModuleController extends SubModuleController {
private MessageBoxMessageMarkerViewer messageBoxMessageMarkerViewer;
private IMultipleChoiceRidget activeViewers;
@Override
public void configureRidgets() {
super.configureRidgets();
final MessageMarkerExampleBean bean = new MessageMarkerExampleBean();
final ITextRidget alwaysMarked = getRidget(ITextRidget.class, "alwaysMarked"); //$NON-NLS-1$
alwaysMarked.addMarker(new ErrorMessageMarker("This textfield is inadequate in every way.")); //$NON-NLS-1$
alwaysMarked.bindToModel(bean, "alwaysMarkedText"); //$NON-NLS-1$
alwaysMarked.updateFromModel();
final ITextRidget sometimesMarked = getRidget(ITextRidget.class, "sometimesMarked"); //$NON-NLS-1$
sometimesMarked.addValidationRule(new MinLength(3), ValidationTime.ON_UPDATE_TO_MODEL);
sometimesMarked.addValidationMessage("Textfield contains less than 3 characters."); //$NON-NLS-1$
sometimesMarked.bindToModel(bean, "sometimesMarkedText"); //$NON-NLS-1$
sometimesMarked.updateFromModel();
final ITextRidget sometimesMarkedMultipleRules = getRidget(ITextRidget.class, "sometimesMarkedMultipleRules"); //$NON-NLS-1$
final StartsWithA startsWithA = new StartsWithA();
final EndsWithZ endsWithZ = new EndsWithZ();
sometimesMarkedMultipleRules.addValidationRule(startsWithA, ValidationTime.ON_UPDATE_TO_MODEL);
sometimesMarkedMultipleRules.addValidationRule(endsWithZ, ValidationTime.ON_UPDATE_TO_MODEL);
sometimesMarkedMultipleRules.addValidationMessage("Text must begin with an A.", startsWithA); //$NON-NLS-1$
sometimesMarkedMultipleRules.addValidationMessage("Text must end with a Z.", endsWithZ); //$NON-NLS-1$
sometimesMarkedMultipleRules.bindToModel(bean, "sometimesMarkedMultipleRulesText"); //$NON-NLS-1$
sometimesMarkedMultipleRules.updateFromModel();
// 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.addRidget(alwaysMarked);
statuslineMessageMarkerViewer.addRidget(sometimesMarked);
statuslineMessageMarkerViewer.addRidget(sometimesMarkedMultipleRules);
// Show error messages as a tool tip, when hovering over the text
final TooltipMessageMarkerViewer tooltipMessageMarkerViewer = new TooltipMessageMarkerViewer();
tooltipMessageMarkerViewer.addRidget(alwaysMarked);
tooltipMessageMarkerViewer.addRidget(sometimesMarked);
tooltipMessageMarkerViewer.addRidget(sometimesMarkedMultipleRules);
// Show error messages in a message box
final IMessageBoxRidget messageBoxRidget = getRidget(IMessageBoxRidget.class, "messageBox"); //$NON-NLS-1$
messageBoxRidget.setType(IMessageBoxRidget.Type.ERROR);
messageBoxRidget.setTitle("Problems Summary"); //$NON-NLS-1$
messageBoxRidget.setOptions(IMessageBoxRidget.OPTIONS_OK);
messageBoxMessageMarkerViewer = new MessageBoxMessageMarkerViewer(messageBoxRidget);
messageBoxMessageMarkerViewer.addRidget(alwaysMarked);
messageBoxMessageMarkerViewer.addRidget(sometimesMarked);
messageBoxMessageMarkerViewer.addRidget(sometimesMarkedMultipleRules);
final MessageMarkerViewers viewers = new MessageMarkerViewers();
viewers.addViewer(statuslineMessageMarkerViewer, "Statusline"); //$NON-NLS-1$
viewers.addViewer(tooltipMessageMarkerViewer, "Tooltip"); //$NON-NLS-1$
viewers.addViewer(messageBoxMessageMarkerViewer, "MessageBox"); //$NON-NLS-1$
viewers.setSelectedViewers(Arrays.asList(new IMessageMarkerViewer[] { statuslineMessageMarkerViewer,
tooltipMessageMarkerViewer }));
activeViewers = getRidget(IMultipleChoiceRidget.class, "activeViewers"); //$NON-NLS-1$
activeViewers.bindToModel(viewers.getViewers(), viewers.getViewerLabels(), viewers, "selectedViewers"); //$NON-NLS-1$
activeViewers.updateFromModel();
}
// helping classes
//////////////////
public class MessageMarkerViewers {
private final List<IMessageMarkerViewer> viewers = new ArrayList<IMessageMarkerViewer>();
private final List<String> viewerLabels = new ArrayList<String>();
private List<IMessageMarkerViewer> selectedViewers = new ArrayList<IMessageMarkerViewer>();
public void addViewer(final IMessageMarkerViewer viewer, final String label) {
viewers.add(viewer);
viewerLabels.add(label);
updateViewers();
}
public List<IMessageMarkerViewer> getViewers() {
return viewers;
}
public List<String> getViewerLabels() {
return viewerLabels;
}
public List<IMessageMarkerViewer> getSelectedViewers() {
return selectedViewers;
}
public void setSelectedViewers(final List<IMessageMarkerViewer> selectedViewers) {
this.selectedViewers = selectedViewers;
updateViewers();
if (this.selectedViewers.contains(messageBoxMessageMarkerViewer)) {
this.selectedViewers.remove(messageBoxMessageMarkerViewer);
activeViewers.updateFromModel();
}
}
private void updateViewers() {
for (final IMessageMarkerViewer viewer : viewers) {
viewer.setVisible(false);
}
for (final IMessageMarkerViewer viewer : selectedViewers) {
viewer.setVisible(true);
}
}
}
public static class MessageMarkerExampleBean {
private String alwaysMarkedText = "Hopeless"; //$NON-NLS-1$
private String sometimesMarkedText = "123"; //$NON-NLS-1$
private String sometimesMarkedMultipleRulesText = "A to Z"; //$NON-NLS-1$
public String getAlwaysMarkedText() {
return alwaysMarkedText;
}
public void setAlwaysMarkedText(final String alwaysMarkedText) {
this.alwaysMarkedText = alwaysMarkedText;
}
public String getSometimesMarkedText() {
return sometimesMarkedText;
}
public void setSometimesMarkedText(final String sometimesMarkedText) {
this.sometimesMarkedText = sometimesMarkedText;
}
public String getSometimesMarkedMultipleRulesText() {
return sometimesMarkedMultipleRulesText;
}
public void setSometimesMarkedMultipleRulesText(final String sometimesMarkedMultipleRulesText) {
this.sometimesMarkedMultipleRulesText = sometimesMarkedMultipleRulesText;
}
}
private static class StartsWithA implements IValidator {
public IStatus validate(final Object value) {
if (value == null) {
return ValidationRuleStatus.ok();
}
if (value instanceof String) {
final String string = (String) value;
if (string.toLowerCase().startsWith("a")) { //$NON-NLS-1$
return ValidationRuleStatus.ok();
}
return ValidationRuleStatus.error(false, "Value does not start with A."); //$NON-NLS-1$
}
throw new ValidationFailure(getClass().getName() + " can only validate objects of type " //$NON-NLS-1$
+ String.class.getName());
}
}
private static class EndsWithZ implements IValidator {
public IStatus validate(final Object value) {
if (value == null) {
return ValidationRuleStatus.ok();
}
if (value instanceof String) {
final String string = (String) value;
if (string.toLowerCase().endsWith("z")) { //$NON-NLS-1$
return ValidationRuleStatus.ok();
}
return ValidationRuleStatus.error(false, "Value does not end with Z."); //$NON-NLS-1$
}
throw new ValidationFailure(getClass().getName() + " can only validate objects of type " //$NON-NLS-1$
+ String.class.getName());
}
}
}