/* * Copyright (c) 2004-2011 Marco Maccaferri 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: * Marco Maccaferri - initial API and implementation */ package org.eclipsetrader.ui.internal.markets; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.Observable; import java.util.Observer; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.GroupMarker; 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.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; import org.eclipsetrader.core.internal.markets.Market; import org.eclipsetrader.core.internal.markets.MarketService; import org.eclipsetrader.core.markets.IMarket; import org.eclipsetrader.core.markets.IMarketStatusListener; import org.eclipsetrader.core.markets.MarketStatusEvent; import org.eclipsetrader.ui.SelectionProvider; import org.eclipsetrader.ui.UIConstants; import org.eclipsetrader.ui.internal.UIActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; public class MarketsView extends ViewPart { Display display; TableViewer viewer; private Image marketIcon; Action newMarketAction; Action deleteAction; MarketService marketService; private Runnable timedRunnable = new Runnable() { @Override public void run() { if (!viewer.getControl().isDisposed()) { viewer.update((Object[]) viewer.getInput(), null); int delay = (int) (60000 - System.currentTimeMillis() % 60000); Display.getCurrent().timerExec(delay, timedRunnable); } } }; private Observer serviceObserver = new Observer() { @Override public void update(Observable o, Object arg) { display.asyncExec(new Runnable() { @Override public void run() { if (!viewer.getControl().isDisposed()) { refreshInput(); } } }); } }; private IMarketStatusListener marketStatusListener = new IMarketStatusListener() { @Override public void marketStatusChanged(MarketStatusEvent event) { final IMarket market = event.getMarket(); display.asyncExec(new Runnable() { @Override public void run() { if (!viewer.getControl().isDisposed()) { viewer.update(market, null); } } }); } }; private PropertyChangeListener propertyChangeListener = new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { display.asyncExec(new Runnable() { @Override public void run() { if (!viewer.getControl().isDisposed()) { if (IMarket.PROP_NAME.equals(evt.getPropertyName())) { viewer.refresh(); } else { viewer.update(evt.getSource(), null); } } } }); } }; public MarketsView() { } /* (non-Javadoc) * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite) */ @Override public void init(IViewSite site) throws PartInitException { super.init(site); BundleContext context = UIActivator.getDefault().getBundle().getBundleContext(); ServiceReference serviceReference = context.getServiceReference(MarketService.class.getName()); marketService = (MarketService) context.getService(serviceReference); context.ungetService(serviceReference); site.setSelectionProvider(new SelectionProvider()); marketIcon = UIActivator.getDefault().getImageRegistry().get(UIConstants.MARKET_OBJECT); newMarketAction = new NewMarketAction(site.getShell()); deleteAction = new Action("Delete") { @Override public void run() { IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); for (Object obj : selection.toArray()) { if (obj instanceof Market) { Market market = (Market) obj; marketService.deleteMarket(market); PropertyChangeSupport propertyChangeSupport = (PropertyChangeSupport) market.getAdapter(PropertyChangeSupport.class); if (propertyChangeSupport != null) { propertyChangeSupport.removePropertyChangeListener(propertyChangeListener); } } } } }; deleteAction.setImageDescriptor(UIActivator.getDefault().getImageRegistry().getDescriptor(UIConstants.DELETE_ICON)); deleteAction.setDisabledImageDescriptor(UIActivator.getDefault().getImageRegistry().getDescriptor(UIConstants.DELETE_DISABLED_ICON)); deleteAction.setEnabled(false); } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) */ @Override public void createPartControl(Composite parent) { display = parent.getDisplay(); createViewer(parent); createContextMenu(); refreshInput(); viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { getViewSite().getSelectionProvider().setSelection(event.getSelection()); IStructuredSelection selection = (IStructuredSelection) event.getSelection(); deleteAction.setEnabled(!selection.isEmpty()); } }); marketService.addMarketStatusListener(marketStatusListener); marketService.addObserver(serviceObserver); int delay = (int) (60000 - System.currentTimeMillis() % 60000); Display.getCurrent().timerExec(delay, timedRunnable); } protected void createViewer(Composite parent) { viewer = new TableViewer(parent, SWT.MULTI | SWT.FULL_SELECTION); viewer.getTable().setHeaderVisible(true); viewer.getTable().setLinesVisible(false); TableColumn tableColumn = new TableColumn(viewer.getTable(), SWT.NONE); tableColumn.setText("Market"); tableColumn.setWidth(150); tableColumn = new TableColumn(viewer.getTable(), SWT.NONE); tableColumn.setText("State"); tableColumn.setWidth(150); tableColumn = new TableColumn(viewer.getTable(), SWT.NONE); tableColumn.setText("Message"); tableColumn.setWidth(250); viewer.setLabelProvider(new MarketLabelProvider(marketIcon)); viewer.setComparator(new ViewerComparator()); viewer.setContentProvider(new ArrayContentProvider()); } protected void refreshInput() { IMarket[] input = marketService.getMarkets(); for (IMarket market : input) { PropertyChangeSupport propertyChangeSupport = (PropertyChangeSupport) market.getAdapter(PropertyChangeSupport.class); if (propertyChangeSupport != null) { propertyChangeSupport.removePropertyChangeListener(propertyChangeListener); propertyChangeSupport.addPropertyChangeListener(propertyChangeListener); } } viewer.setInput(input); } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { viewer.getControl().setFocus(); } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#dispose() */ @Override public void dispose() { Display.getCurrent().timerExec(-1, timedRunnable); marketService.deleteObserver(serviceObserver); marketService.removeMarketStatusListener(marketStatusListener); super.dispose(); } protected void createContextMenu() { MenuManager menuMgr = new MenuManager("#popupMenu", "popupMenu"); //$NON-NLS-1$ //$NON-NLS-2$ menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(IMenuManager menuManager) { MenuManager newMenu = new MenuManager("New", "group.new"); { newMenu.add(new Separator("top")); //$NON-NLS-1$ newMenu.add(newMarketAction); newMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); newMenu.add(new Separator("bottom")); //$NON-NLS-1$ } menuManager.add(newMenu); menuManager.add(new GroupMarker("group.goto")); menuManager.add(new Separator("group.open")); menuManager.add(new GroupMarker("group.openWith")); menuManager.add(new Separator("group.show")); menuManager.add(new Separator("group.edit")); menuManager.add(new GroupMarker("group.reorganize")); menuManager.add(new GroupMarker("group.port")); menuManager.add(new Separator("group.generate")); menuManager.add(new Separator("group.search")); menuManager.add(new Separator("group.build")); menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); menuManager.add(new Separator("group.properties")); menuManager.appendToGroup("group.reorganize", deleteAction); } }); viewer.getControl().setMenu(menuMgr.createContextMenu(viewer.getControl())); getSite().registerContextMenu(menuMgr, getSite().getSelectionProvider()); } }