/*******************************************************************************
* 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.ui.ridgets.marker;
import java.io.Serializable;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.riena.core.util.ListenerList;
import org.eclipse.riena.ui.core.marker.ErrorMessageMarker;
import org.eclipse.riena.ui.core.marker.IMessageMarker;
import org.eclipse.riena.ui.ridgets.IBasicMarkableRidget;
/**
* Common functionality of classes visualizing certain types of message markers.
*/
public abstract class AbstractMessageMarkerViewer implements IMessageMarkerViewer {
/**
* Creates a string with all messages of the given markers.
*
* @param messageMarker
* a Collection of message markers; may be null
* @param separator
* a String for separating the message markers; never null
* @return string with all messages
* @since 1.2
*/
public static String constructMessage(final Collection<IMessageMarker> messageMarker, final String separator) {
Assert.isNotNull(separator);
final StringWriter sw = new StringWriter();
if (messageMarker != null) {
for (final IMessageMarker nextMarker : messageMarker) {
if (sw.toString().trim().length() > 0) {
sw.write(separator);
}
if (nextMarker.getMessage() != null) {
sw.write(nextMarker.getMessage());
}
}
}
return sw.toString().trim();
}
private final HashSet<Class<? extends IMessageMarker>> markerTypes;
private final ListenerList<IBasicMarkableRidget> ridgets;
private boolean visible;
public AbstractMessageMarkerViewer() {
markerTypes = new LinkedHashSet<Class<? extends IMessageMarker>>();
ridgets = new ListenerList<IBasicMarkableRidget>(IBasicMarkableRidget.class);
visible = true;
markerTypes.add(ValidationMessageMarker.class);
markerTypes.add(ErrorMessageMarker.class);
}
public void addRidget(final IBasicMarkableRidget markableRidget) {
ridgets.add(markableRidget);
showMessages(markableRidget);
}
public void removeRidget(final IBasicMarkableRidget markableRidget) {
ridgets.remove(markableRidget);
hideMessages(markableRidget);
}
public void addMarkerType(final Class<? extends IMessageMarker> markerClass) {
markerTypes.add(markerClass);
showMessages();
}
public void removeMarkerType(final Class<? extends IMessageMarker> markerClass) {
markerTypes.remove(markerClass);
showMessages();
}
public boolean isVisible() {
return visible;
}
public void setVisible(final boolean visible) {
this.visible = visible;
showMessages();
}
private void showMessages() {
for (final IBasicMarkableRidget ridget : getRidgets()) {
showMessages(ridget);
}
}
/**
* Returns the string that separates the single messages of a composed
* message.
*
* @return separator
* @since 1.2
*/
protected abstract String getMessageSeparator();
protected abstract void showMessages(IBasicMarkableRidget ridget);
protected abstract void hideMessages(IBasicMarkableRidget ridget);
protected Collection<IMessageMarker> getMessageMarker(final IBasicMarkableRidget markableRidget) {
return getMessageMarker(markableRidget, false);
}
protected Collection<IMessageMarker> getMessageMarker(final IBasicMarkableRidget markableRidget,
final boolean pRemove) {
final List<IMessageMarker> result = new ArrayList<IMessageMarker>();
for (final Class<? extends IMessageMarker> nextMessageMarkerType : markerTypes) {
final Collection<? extends IMessageMarker> nextMessageMarkers = markableRidget
.getMarkersOfType(nextMessageMarkerType);
if (nextMessageMarkers != null && nextMessageMarkers.size() > 0) {
result.addAll(nextMessageMarkers);
}
}
if (pRemove) {
for (final IMessageMarker iMessageMarker : result) {
markableRidget.removeMarker(iMessageMarker);
}
}
Collections.sort(result, new MessageMarkerComparator());
return result;
}
protected Collection<IBasicMarkableRidget> getRidgets() {
return Arrays.asList(ridgets.getListeners());
}
protected static final class MessageMarkerComparator implements Comparator<IMessageMarker>, Serializable {
private static final long serialVersionUID = 1L;
public int compare(final IMessageMarker o1, final IMessageMarker o2) {
final String message1 = o1.getMessage();
final String message2 = o2.getMessage();
return message1.compareTo(message2);
}
}
}