/******************************************************************************* * 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.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import org.eclipse.riena.core.util.StringUtils; import org.eclipse.riena.ui.core.marker.IMessageMarker; import org.eclipse.riena.ui.ridgets.IBasicMarkableRidget; import org.eclipse.riena.ui.ridgets.IRidget; /** * Visualizes certain types of message markers by setting the tooltip of the * Ridget. */ public class TooltipMessageMarkerViewer extends AbstractMessageMarkerViewer { private final PropertyChangeListener markerPropertyChangeListener = new MarkerPropertyChangeListener(); private final HashMap<IBasicMarkableRidget, Tooltip> tooltips = new LinkedHashMap<IBasicMarkableRidget, Tooltip>(); @Override public void addRidget(final IBasicMarkableRidget markableRidget) { super.addRidget(markableRidget); markableRidget.addPropertyChangeListener(markerPropertyChangeListener); } @Override public void removeRidget(final IBasicMarkableRidget markableRidget) { markableRidget.removePropertyChangeListener(markerPropertyChangeListener); super.removeRidget(markableRidget); } // protected methods //////////////////// @Override protected void showMessages(final IBasicMarkableRidget markableRidget) { final Collection<IMessageMarker> messageMarker = this.getMessageMarker(markableRidget); final String message = constructMessage(messageMarker, getMessageSeparator()); // show the message only if there is something to show final String current = markableRidget.getToolTipText(); if (message.length() > 0 && isVisible()) { if (!message.equals(current)) { Tooltip tooltip = tooltips.get(markableRidget); if (tooltip == null) { tooltip = new Tooltip(current, message); tooltips.put(markableRidget, tooltip); } else { tooltip.messageTooltip = message; } markableRidget.setToolTipText(message); } } else { hideMessages(markableRidget); } } @Override protected void hideMessages(final IBasicMarkableRidget markableRidget) { if (tooltips.containsKey(markableRidget)) { final String tooltip = tooltips.get(markableRidget).originalTooltip; markableRidget.setToolTipText(tooltip); tooltips.remove(markableRidget); } } @Override protected String getMessageSeparator() { return "\n"; //$NON-NLS-1$ } // helping classes ////////////////// private final class MarkerPropertyChangeListener implements PropertyChangeListener { public void propertyChange(final PropertyChangeEvent evt) { if (evt.getSource() instanceof IBasicMarkableRidget) { if (IBasicMarkableRidget.PROPERTY_MARKER.equals(evt.getPropertyName())) { final IBasicMarkableRidget ridget = (IBasicMarkableRidget) evt.getSource(); showMessages(ridget); } else if (IRidget.PROPERTY_TOOLTIP.equals(evt.getPropertyName())) { final IBasicMarkableRidget ridget = (IBasicMarkableRidget) evt.getSource(); final String newTooltip = (String) evt.getNewValue(); final Tooltip tip = tooltips.get(ridget); if (tip != null && !StringUtils.equals(newTooltip, tip.originalTooltip)) { showMessages(ridget); /* * If the newTooltip is not the messageTooltip, it is * new 'original' tooltip -> Update. */ if (!StringUtils.equals(newTooltip, tip.messageTooltip)) { tip.originalTooltip = newTooltip; } } } } } } /** * Holds two tooltip values (Strings): (a) the original tooltip of the * ridget and (b) the compute message tooltip */ private static final class Tooltip { /** * Tooltip value to use when the 'message' tooltip is removed. May be * null. */ private String originalTooltip; /** Tooltip value for the 'message' tooltip. */ private String messageTooltip; Tooltip(final String originalTooltip, final String messageTooltip) { this.originalTooltip = originalTooltip; this.messageTooltip = messageTooltip; } @Override public String toString() { return String.format("[%s,%s]", originalTooltip, messageTooltip); //$NON-NLS-1$ } } }