private synchronized void handleAction( List al, Object event )
private void handleAction( List al, Object event )
	private synchronized void handleAction( List al, Object event )	{		if ( al == null || event == null )		{			return;		}		ShapedAction sa;		Shape sh;		Action ac;		Point p = null;		if ( event instanceof MouseEvent )		{			p = ( (MouseEvent) event ).getPoint( );		}		if ( event instanceof KeyEvent )		{			// TODO filter key ?		}		boolean bFound = false;		// POLL EACH EVENT REGISTERED FOR MOUSE CLICKS		LOOP: for ( int i = 0; i < al.size( ); i++ )		{			sa = (ShapedAction) al.get( i );			sh = sa.getShape( );			if ( p == null || sh.contains( p ) )			{				ac = sa.getAction( );				final StructureSource src = (StructureSource) sa.getSource( );				switch ( ac.getType( ).getValue( ) )				{					case ActionType.URL_REDIRECT :						final URLValue uv = (URLValue) ac.getValue( );						logger.log( ILogger.INFORMATION,								Messages.getString( "info.redirect.url", lcl ) //$NON-NLS-1$										+ uv.getBaseUrl( ) );						DeviceUtil.openURL( uv.getBaseUrl( ) );						break;					case ActionType.SHOW_TOOLTIP :						if ( sa != saTooltip )						{							hideTooltip( );						}						saTooltip = sa;						bFound = true;						showTooltip( saTooltip );						break;					case ActionType.TOGGLE_VISIBILITY :						if ( src.getType( ) == StructureType.SERIES )						{							final Series seRT = (Series) src.getSource( );							logger.log( ILogger.INFORMATION,									Messages.getString( "info.toggle.visibility", //$NON-NLS-1$											lcl )											+ seRT );							Series seDT = null;							try							{								seDT = findDesignTimeSeries( seRT );							}							catch ( ChartException oosx )							{								logger.log( oosx );								return;							}							seDT.setVisible( !seDT.isVisible( ) );							iun.regenerateChart( );						}						break;					case ActionType.HIGHLIGHT :						bFound = true;						boolean newRegion = saHighlighted == null;						if ( !newRegion )						{							if ( p == null									|| !saHighlighted.getShape( ).contains( p ) )							{								newRegion = true;							}						}						if ( newRegion )						{							saHighlighted = sa;							toggleHighlight( sa );							break LOOP;						}						break;					case ActionType.CALL_BACK :						if ( iun instanceof ICallBackNotifier )						{							final CallBackValue cv = (CallBackValue) ac.getValue( );							( (ICallBackNotifier) iun ).callback( event,									sa.getSource( ),									cv );						}						else						{							logger.log( ILogger.WARNING,									Messages.getString( "info.improper.callback.notifier", //$NON-NLS-1$											new Object[]{												iun											},											lcl ) );						}						break;				}			}		}		if ( !bFound && saTooltip != null )		{			hideTooltip( );			saTooltip = null;		}		if ( !bFound && saHighlighted != null )		{			saHighlighted = null;		}	}