/*
* This file is part of the openSCADA project
* Copyright (C) 2006-2012 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.vi.ui.user;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashMap;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.openscada.ui.utils.blink.Blinker;
import org.openscada.ui.utils.blink.Blinker.Handler;
import org.openscada.ui.utils.blink.Blinker.State;
import org.openscada.vi.ui.draw2d.SummaryInformation;
import org.openscada.vi.ui.draw2d.SummaryListener;
import org.openscada.vi.ui.draw2d.VisualInterfaceViewer;
import org.openscada.vi.ui.user.preferences.PreferenceConstants;
public class ViewInstance implements SummaryListener
{
private ToolItem button;
private final ViewManager viewManager;
private VisualInterfaceViewer viewer;
private final ResourceManager manager;
private final Image imageOk;
private final Image imageInvalid;
private final Image imageAlarm;
private final Image imageManual;
private final Image imageBlocked;
private Blinker blinker;
private final Image imageAlarm0;
private final Image imageAlarm1;
private final Composite parent;
private final ViewInstanceDescriptor descriptor;
private final LinkedHashMap<String, Object> scriptObjects;
private final DisposeListener disposeListener;
public ViewInstance ( final ViewManager viewManager, final Composite parent, final ToolBar toolbar, final ViewInstanceDescriptor descriptor, final ResourceManager manager )
{
this.parent = parent;
this.viewManager = viewManager;
this.descriptor = descriptor;
this.manager = manager;
this.imageOk = createImage ( PreferenceConstants.P_IMG_OK );
this.imageInvalid = createImage ( PreferenceConstants.P_IMG_INVALID );
this.imageAlarm = createImage ( PreferenceConstants.P_IMG_ALARM );
this.imageManual = createImage ( PreferenceConstants.P_IMG_MANUAL );
this.imageBlocked = createImage ( PreferenceConstants.P_IMG_BLOCKED );
this.imageAlarm0 = createImage ( PreferenceConstants.P_IMG_ALARM_0 );
this.imageAlarm1 = createImage ( PreferenceConstants.P_IMG_ALARM_1 );
this.disposeListener = new DisposeListener () {
@Override
public void widgetDisposed ( final DisposeEvent e )
{
internalDispose ();
}
};
// create the main button
if ( descriptor.getParentId () == null || descriptor.getParentId ().isEmpty () )
{
this.button = new ToolItem ( toolbar, SWT.RADIO );
this.button.setText ( descriptor.getName () );
this.button.setImage ( this.imageOk );
this.button.addSelectionListener ( new SelectionAdapter () {
@Override
public void widgetSelected ( final org.eclipse.swt.events.SelectionEvent e )
{
showView ( descriptor.getId () );
};
} );
}
else
{
this.button = null;
}
// create the blinker
this.blinker = new Blinker ( new Handler () {
@Override
public void setState ( final State state )
{
handleBlink ( state );
}
} );
// create the visual interface view
this.scriptObjects = new LinkedHashMap<String, Object> ();
this.scriptObjects.put ( "viewManager", viewManager );
reload ();
}
public void reload ()
{
// dispose first
if ( this.viewer != null )
{
if ( this.button != null )
{
this.viewer.removeSummaryListener ( this );
}
// no need to dispose when changing the viewer
this.viewer.removeDisposeListener ( this.disposeListener );
this.viewer.dispose ();
this.viewer = null;
}
// now create
this.viewer = new VisualInterfaceViewer ( this.parent, SWT.NONE, this.descriptor.getUri (), this.scriptObjects, this.descriptor.getProperties () );
this.viewer.setZooming ( this.descriptor.getZooming () );
this.viewer.setLayoutData ( new GridData ( SWT.FILL, SWT.FILL, true, true ) );
if ( this.button != null )
{
this.viewer.addSummaryListener ( this );
}
// re-add listener
this.viewer.addDisposeListener ( this.disposeListener );
this.viewManager.showView ( this.descriptor.getId (), true );
}
private Image createImage ( final String key )
{
try
{
final String uri = Activator.getDefault ().getPreferenceStore ().getString ( key );
return this.manager.createImageWithDefault ( ImageDescriptor.createFromURL ( new URL ( uri ) ) );
}
catch ( final MalformedURLException e )
{
return this.manager.createImageWithDefault ( ImageDescriptor.getMissingImageDescriptor () );
}
}
protected void showView ( final String id )
{
this.viewManager.showView ( id );
}
protected void internalDispose ()
{
if ( this.blinker != null )
{
this.blinker.dispose ();
this.blinker = null;
}
}
public void dispose ()
{
if ( this.button != null )
{
this.viewer.removeSummaryListener ( this );
this.button.dispose ();
this.button = null;
}
if ( this.viewer != null )
{
this.viewer.dispose ();
this.viewer = null;
}
}
public void deactivate ()
{
if ( this.button != null )
{
this.button.setSelection ( false );
}
}
public void activate ()
{
if ( this.button != null )
{
this.button.setSelection ( true );
}
}
public void setFocus ()
{
this.viewer.setFocus ();
}
public Control getControl ()
{
return this.viewer;
}
protected void handleBlink ( final State state )
{
if ( this.button == null )
{
return;
}
switch ( state )
{
case ALARM_0:
this.button.setImage ( this.imageAlarm0 );
break;
case ALARM_1:
this.button.setImage ( this.imageAlarm1 );
break;
case DISCONNECTED:
case ERROR:
this.button.setImage ( this.imageInvalid );
break;
case MANUAL:
this.button.setImage ( this.imageManual );
break;
case BLOCKED:
this.button.setImage ( this.imageBlocked );
break;
case ALARM:
this.button.setImage ( this.imageAlarm );
break;
case OK:
this.button.setImage ( this.imageOk );
break;
}
}
@Override
public void summaryChanged ( final SummaryInformation summary )
{
this.blinker.setState ( summary.isAlarm (), summary.isAckRequired (), summary.isManual (), !summary.isConnected (), summary.isError (), summary.isBlocked () );
}
}