/*
* This file is part of the OpenSCADA project
* Copyright (C) 2006-2010 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.testing.views;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.set.WritableSet;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.openscada.ae.Event;
import org.openscada.core.subscription.SubscriptionState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EventQueryView extends AbstractEventQueryViewPart
{
private final static Logger logger = LoggerFactory.getLogger ( EventQueryView.class );
public static final String VIEW_ID = "org.openscada.ae.ui.testing.views.EventQueryView";
private Label stateLabel;
private final Set<Event> eventSet = new HashSet<Event> ();
final WritableSet events;
private TableViewer viewer;
public EventQueryView ()
{
this.events = new WritableSet ( SWTObservables.getRealm ( Display.getDefault () ) );
}
@Override
protected Realm getRealm ()
{
return this.events.getRealm ();
}
@Override
public void createPartControl ( final Composite parent )
{
final GridLayout layout = new GridLayout ( 1, false );
layout.horizontalSpacing = layout.verticalSpacing = 0;
layout.marginHeight = layout.marginWidth = 0;
parent.setLayout ( layout );
this.stateLabel = new Label ( parent, SWT.NONE );
this.stateLabel.setLayoutData ( new GridData ( SWT.FILL, SWT.FILL, true, false ) );
final Composite wrapper = new Composite ( parent, SWT.NONE );
wrapper.setLayoutData ( new GridData ( SWT.FILL, SWT.FILL, true, true ) );
this.viewer = EventViewHelper.createTableViewer ( wrapper, getViewSite (), this.events );
hookContextMenu ();
addSelectionListener ();
}
private void hookContextMenu ()
{
final MenuManager menuMgr = new MenuManager ( "#PopupMenu", VIEW_ID );
menuMgr.setRemoveAllWhenShown ( true );
menuMgr.addMenuListener ( new IMenuListener () {
public void menuAboutToShow ( final IMenuManager manager )
{
fillContextMenu ( manager );
}
} );
final Menu menu = menuMgr.createContextMenu ( this.viewer.getControl () );
this.viewer.getControl ().setMenu ( menu );
getSite ().registerContextMenu ( menuMgr, this.viewer );
}
private void fillContextMenu ( final IMenuManager manager )
{
// Other plug-ins can contribute there actions here
manager.add ( new Separator () );
manager.add ( new Separator ( IWorkbenchActionConstants.MB_ADDITIONS ) );
}
@Override
public void setFocus ()
{
this.viewer.getControl ().setFocus ();
}
@Override
protected void clear ()
{
super.clear ();
scheduleJob ( new Runnable () {
public void run ()
{
EventQueryView.this.eventSet.clear ();
EventQueryView.this.events.clear ();
EventQueryView.this.stateLabel.setText ( "<no query selected>" );
}
} );
}
@Override
protected void handleDataChanged ( final Event[] addedEvents )
{
scheduleJob ( new Runnable () {
public void run ()
{
performDataChanged ( addedEvents );
}
} );
}
protected void performDataChanged ( final Event[] addedEvents )
{
try
{
this.events.setStale ( true );
for ( final Event event : addedEvents )
{
this.events.add ( event );
}
}
finally
{
this.events.setStale ( false );
}
try
{
this.viewer.getTable ().setTopIndex ( 0 );
}
catch ( final IllegalArgumentException e )
{
// failed to scroll up
logger.debug ( "Failed to scroll up", e );
}
}
@Override
public void handleStatusChanged ( final SubscriptionState status )
{
triggerStateUpdate ( status );
}
private void triggerStateUpdate ( final SubscriptionState status )
{
if ( this.stateLabel.isDisposed () )
{
return;
}
scheduleJob ( new Runnable () {
public void run ()
{
performEventStatusUpdate ( status );
}
} );
}
protected void performEventStatusUpdate ( final SubscriptionState status )
{
if ( this.stateLabel.isDisposed () )
{
return;
}
this.stateLabel.setText ( status.toString () );
switch ( status )
{
case DISCONNECTED:
case GRANTED:
this.events.clear ();
this.eventSet.clear ();
break;
}
}
}