/* * 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.trading.portfolio; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; 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.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PartInitException; import org.eclipse.ui.dialogs.PropertyDialogAction; import org.eclipse.ui.part.ViewPart; import org.eclipsetrader.core.markets.IMarketService; import org.eclipsetrader.core.trading.ITradingService; 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 PortfolioViewPart extends ViewPart { TreeViewer viewer; PortfolioView view; BundleContext context; ServiceReference tradingServiceReference; ITradingService tradingService; ServiceReference marketServiceReference; IMarketService marketService; Action expandAllAction; Action collapseAllAction; Action refreshAllAction; public PortfolioViewPart() { } /* (non-Javadoc) * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento) */ @Override public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); context = UIActivator.getDefault().getBundle().getBundleContext(); tradingServiceReference = context.getServiceReference(ITradingService.class.getName()); tradingService = (ITradingService) context.getService(tradingServiceReference); marketServiceReference = context.getServiceReference(IMarketService.class.getName()); marketService = (IMarketService) context.getService(marketServiceReference); site.setSelectionProvider(new SelectionProvider()); site.getActionBars().setGlobalActionHandler("properties", new PropertyDialogAction(site, site.getSelectionProvider())); //$NON-NLS-1$ initializeActions(); IToolBarManager toolbarManager = site.getActionBars().getToolBarManager(); toolbarManager.add(new Separator("group.new")); //$NON-NLS-1$ toolbarManager.add(new GroupMarker("group.goto")); //$NON-NLS-1$ toolbarManager.add(new Separator("group.open")); //$NON-NLS-1$ toolbarManager.add(new GroupMarker("group.openWith")); //$NON-NLS-1$ toolbarManager.add(new Separator("group.show")); //$NON-NLS-1$ toolbarManager.add(expandAllAction); toolbarManager.add(collapseAllAction); toolbarManager.add(new Separator("group.edit")); //$NON-NLS-1$ toolbarManager.add(new GroupMarker("group.reorganize")); //$NON-NLS-1$ toolbarManager.add(new GroupMarker("group.port")); //$NON-NLS-1$ toolbarManager.add(new Separator("group.generate")); //$NON-NLS-1$ toolbarManager.add(new Separator("group.search")); //$NON-NLS-1$ toolbarManager.add(new Separator("group.build")); //$NON-NLS-1$ toolbarManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); toolbarManager.add(new Separator("group.properties")); //$NON-NLS-1$ IMenuManager menuManager = site.getActionBars().getMenuManager(); menuManager.add(new Separator("group.new")); //$NON-NLS-1$ menuManager.add(new GroupMarker("group.goto")); //$NON-NLS-1$ menuManager.add(new Separator("group.open")); //$NON-NLS-1$ menuManager.add(new GroupMarker("group.openWith")); //$NON-NLS-1$ menuManager.add(new Separator("group.show")); //$NON-NLS-1$ menuManager.add(new Separator("group.edit")); //$NON-NLS-1$ menuManager.add(new GroupMarker("group.reorganize")); //$NON-NLS-1$ menuManager.add(new GroupMarker("group.port")); //$NON-NLS-1$ menuManager.add(new Separator("group.generate")); //$NON-NLS-1$ menuManager.add(new Separator("group.search")); //$NON-NLS-1$ menuManager.add(new Separator("group.build")); //$NON-NLS-1$ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); menuManager.add(new Separator("group.properties")); //$NON-NLS-1$ site.getActionBars().updateActionBars(); } void initializeActions() { ImageRegistry imageRegistry = UIActivator.getDefault().getImageRegistry(); collapseAllAction = new Action(Messages.PortfolioViewPart_CollapseAll, imageRegistry.getDescriptor(UIConstants.COLLAPSEALL_ICON)) { @Override public void run() { viewer.collapseAll(); } }; expandAllAction = new Action(Messages.PortfolioViewPart_ExpandAll, imageRegistry.getDescriptor(UIConstants.EXPANDALL_ICON)) { @Override public void run() { viewer.expandAll(); } }; } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) */ @Override public void createPartControl(Composite parent) { createViewer(parent); createContextMenu(); viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { getViewSite().getSelectionProvider().setSelection(event.getSelection()); } }); updateView(); } protected void createViewer(Composite parent) { viewer = new TreeViewer(parent, SWT.FULL_SELECTION | SWT.MULTI); viewer.getTree().setHeaderVisible(true); viewer.getTree().setLinesVisible(false); viewer.setContentProvider(new PortfolioContentProvider()); viewer.setSorter(new ViewerSorter()); viewer.setInput(new PortfolioView()); GC gc = new GC(parent); FontMetrics fontMetrics = gc.getFontMetrics(); gc.dispose(); TreeViewerColumn viewerColumn = new TreeViewerColumn(viewer, SWT.RIGHT); viewerColumn.getColumn().setWidth(Dialog.convertWidthInCharsToPixels(fontMetrics, 40)); viewerColumn.setLabelProvider(new ElementLabelProvider()); viewerColumn = new TreeViewerColumn(viewer, SWT.RIGHT); viewerColumn.getColumn().setText(Messages.PortfolioViewPart_Position); viewerColumn.getColumn().setWidth(Dialog.convertWidthInCharsToPixels(fontMetrics, 15)); viewerColumn.setLabelProvider(new PositionLabelProvider()); viewerColumn = new TreeViewerColumn(viewer, SWT.RIGHT); viewerColumn.getColumn().setText(Messages.PortfolioViewPart_Price); viewerColumn.getColumn().setWidth(Dialog.convertWidthInCharsToPixels(fontMetrics, 15)); viewerColumn.setLabelProvider(new PriceLabelProvider()); viewerColumn = new TreeViewerColumn(viewer, SWT.RIGHT); viewerColumn.getColumn().setText(Messages.PortfolioViewPart_PL); viewerColumn.getColumn().setWidth(Dialog.convertWidthInCharsToPixels(fontMetrics, 30)); viewerColumn.setLabelProvider(new GainLabelProvider()); } 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.add(new Separator("group.new")); //$NON-NLS-1$ menuManager.add(new GroupMarker("group.goto")); //$NON-NLS-1$ menuManager.add(new Separator("group.open")); //$NON-NLS-1$ menuManager.add(new GroupMarker("group.openWith")); //$NON-NLS-1$ menuManager.add(new Separator("group.trade")); //$NON-NLS-1$ menuManager.add(new GroupMarker("group.tradeWith")); //$NON-NLS-1$ menuManager.add(new Separator("group.show")); //$NON-NLS-1$ menuManager.add(new Separator("group.edit")); //$NON-NLS-1$ menuManager.add(new GroupMarker("group.reorganize")); //$NON-NLS-1$ menuManager.add(new GroupMarker("group.port")); //$NON-NLS-1$ menuManager.add(new Separator("group.generate")); //$NON-NLS-1$ menuManager.add(new Separator("group.search")); //$NON-NLS-1$ menuManager.add(new Separator("group.build")); //$NON-NLS-1$ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); menuManager.add(new Separator("group.properties")); //$NON-NLS-1$ } }); viewer.getControl().setMenu(menuMgr.createContextMenu(viewer.getControl())); getSite().registerContextMenu(menuMgr, getSite().getSelectionProvider()); } protected void updateView() { Job job = new Job(Messages.PortfolioViewPart_LoadingPortfolio) { @Override protected IStatus run(IProgressMonitor monitor) { view = new PortfolioView(tradingService, marketService); return Status.OK_STATUS; } }; final Display display = viewer.getControl().getDisplay(); job.addJobChangeListener(new JobChangeAdapter() { @Override public void done(IJobChangeEvent event) { if (view != null) { display.asyncExec(new Runnable() { @Override public void run() { if (!viewer.getControl().isDisposed()) { viewer.setInput(view); viewer.expandAll(); } } }); } } }); job.schedule(); } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#dispose() */ @Override public void dispose() { if (context != null) { if (tradingServiceReference != null) { context.ungetService(tradingServiceReference); } if (marketServiceReference != null) { context.ungetService(marketServiceReference); } } super.dispose(); } }