/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2011 TH4 SYSTEMS GmbH (http://th4-systems.com)
*
* OpenSCADA is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenSCADA is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenSCADA. If not, see
* <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
*/
package org.openscada.ae.ui.views.views;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.graphics.Image;
import org.openscada.ae.Event.Fields;
import org.openscada.ae.ui.views.Activator;
import org.openscada.ae.ui.views.model.DecoratedEvent;
import org.openscada.core.Variant;
public class LabelProviderSupport
{
private enum SpecialDate
{
PAST,
YESTERDAY,
TODAY,
TOMORROW,
FUTURE;
}
private final DateFormat df;
private final DateFormat tf;
public static final NumberFormat nf3 = new DecimalFormat ( Messages.LabelProviderSupport_Format_NF3 );
public static final NumberFormat nf6 = new DecimalFormat ( Messages.LabelProviderSupport_Format_NF6 );
private final Image alarmImage = Activator.getImageDescriptor ( "icons/monitor_alarm.png" ).createImage (); //$NON-NLS-1$
private final Image ackImage = Activator.getImageDescriptor ( "icons/monitor_ack.png" ).createImage (); //$NON-NLS-1$
private final Image emptyImage = Activator.getImageDescriptor ( "icons/monitor_empty.png" ).createImage (); //$NON-NLS-1$
private final Image okImage = Activator.getImageDescriptor ( "icons/monitor_ok.png" ).createImage (); //$NON-NLS-1$
private final Image maualImage = Activator.getImageDescriptor ( "icons/monitor_manual.png" ).createImage (); //$NON-NLS-1$
private final Image disconnectedImage = Activator.getImageDescriptor ( "icons/monitor_disconnected.png" ).createImage (); //$NON-NLS-1$
private final Image userImage = Activator.getImageDescriptor ( "icons/user_icon.gif" ).createImage (); //$NON-NLS-1$
private final Image systemImage = Activator.getImageDescriptor ( "icons/system_icon.gif" ).createImage (); //$NON-NLS-1$
public LabelProviderSupport ( final TimeZone timeZone )
{
this.df = new SimpleDateFormat ( Messages.LabelProviderSupport_DateTimeFormat );
this.df.setTimeZone ( timeZone );
this.tf = new SimpleDateFormat ( Messages.LabelProviderSupport_TimeFormat );
this.tf.setTimeZone ( timeZone );
}
public DateFormat getDf ()
{
return this.df;
}
public DateFormat getTf ()
{
return this.tf;
}
public String toLabel ( final Variant value )
{
if ( value == null )
{
return ""; //$NON-NLS-1$
}
if ( value.isDouble () )
{
final Double v = value.asDouble ( 0.0 );
if ( v < 1000 )
{
return nf6.format ( v );
}
else
{
return nf3.format ( v );
}
}
return value.toLabel ( "" ); //$NON-NLS-1$
}
public String formatDate ( final Date date )
{
if ( date == null )
{
return ""; //$NON-NLS-1$
}
switch ( toSpecial ( date ) )
{
case YESTERDAY:
return String.format ( Messages.LabelProviderSupport_SpecialFormat_Yesterday, this.tf.format ( date ) );
case TODAY:
return String.format ( Messages.LabelProviderSupport_SpecialFormat_Today, this.tf.format ( date ) );
default:
return this.df.format ( date );
}
}
public String toLabel ( final DecoratedEvent event, final String key )
{
return toLabel ( event.getEvent ().getAttributes ().get ( key ) );
}
private SpecialDate toSpecial ( final Date date )
{
return SpecialDate.PAST;
// FIXME: correct implementation later
/*
if ( date == null )
{
return null;
}
final long now = System.currentTimeMillis ();
final long millisInDay = 1000 * 60 * 60 * 24;
final long today = Math.round ( now / ( millisInDay * 1.0d ) ) * millisInDay;
final long yesterday = today - millisInDay;
final long tomorrow = today + millisInDay;
if ( date.getTime () < yesterday )
{
return SpecialDate.PAST;
}
else if ( date.getTime () >= yesterday && date.getTime () < today )
{
return SpecialDate.YESTERDAY;
}
else if ( date.getTime () >= today && date.getTime () < tomorrow )
{
return SpecialDate.TODAY;
}
else if ( date.getTime () >= tomorrow && date.getTime () < tomorrow + millisInDay )
{
return SpecialDate.TOMORROW;
}
else
{
return SpecialDate.FUTURE;
}
*/
}
public void decorateWithActorType ( final DecoratedEvent event, final ViewerCell cell )
{
final String value = Variant.valueOf ( event.getEvent ().getField ( Fields.ACTOR_TYPE ) ).asString ( "" );
if ( "USER".equalsIgnoreCase ( value ) ) //$NON-NLS-1$
{
cell.setImage ( this.userImage );
}
else if ( "SYSTEM".equalsIgnoreCase ( value ) ) //$NON-NLS-1$
{
cell.setImage ( this.systemImage );
}
else
{
cell.setImage ( null );
}
}
public void decorateWithMonitorState ( final DecoratedEvent event, final ViewerCell cell )
{
if ( !event.isActive () )
{
cell.setImage ( null );
}
else
{
switch ( event.getMonitor ().getStatus () )
{
case NOT_OK:
cell.setImage ( this.alarmImage );
break;
case NOT_OK_AKN:
cell.setImage ( this.alarmImage );
break;
case NOT_AKN:
cell.setImage ( this.ackImage );
break;
case NOT_OK_NOT_AKN:
cell.setImage ( this.ackImage );
break;
}
}
}
public void dispose ()
{
this.alarmImage.dispose ();
this.ackImage.dispose ();
this.emptyImage.dispose ();
this.okImage.dispose ();
this.maualImage.dispose ();
this.disconnectedImage.dispose ();
this.userImage.dispose ();
this.systemImage.dispose ();
}
public Image getAlarmImage ()
{
return this.alarmImage;
}
public Image getAckImage ()
{
return this.ackImage;
}
public Image getEmptyImage ()
{
return this.emptyImage;
}
public Image getOkImage ()
{
return this.okImage;
}
public Image getMaualImage ()
{
return this.maualImage;
}
public Image getDisconnectedImage ()
{
return this.disconnectedImage;
}
public Image getUserImage ()
{
return this.userImage;
}
public Image getSystemImage ()
{
return this.systemImage;
}
}