/* * 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; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.preference.IPreferenceNode; import org.eclipse.jface.preference.PreferenceManager; import org.eclipse.jface.resource.ImageRegistry; 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.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IWorkbenchPropertyPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.PropertyPage; import org.eclipse.ui.internal.dialogs.PropertyPageContributorManager; import org.eclipse.ui.internal.dialogs.PropertyPageManager; import org.eclipsetrader.core.instruments.ISecurity; import org.eclipsetrader.core.trading.IAlert; import org.eclipsetrader.core.trading.IAlertService; import org.eclipsetrader.ui.internal.UIActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; @SuppressWarnings("restriction") public class AlertPropertyPage extends PropertyPage implements IWorkbenchPropertyPage { TableViewer viewer; Button add; Button delete; CTabFolder folder; IAlertService alertService; List<IAlert> list; PropertyPage[] propertyPages = new PropertyPage[0]; ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { delete.setEnabled(!event.getSelection().isEmpty()); doSelectionChanged((IStructuredSelection) event.getSelection()); } }; public AlertPropertyPage() { this(UIActivator.getDefault().getBundle().getBundleContext()); } protected AlertPropertyPage(BundleContext context) { setTitle(Messages.AlertPropertyPage_Title); ServiceReference serviceReference = context.getServiceReference(IAlertService.class.getName()); if (serviceReference != null) { alertService = (IAlertService) context.getService(serviceReference); context.ungetService(serviceReference); } } /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite) */ @Override protected Control createContents(Composite parent) { Composite content = new Composite(parent, SWT.NONE); GridLayout gridLayout = new GridLayout(2, false); gridLayout.marginWidth = gridLayout.marginHeight = 0; content.setLayout(gridLayout); initializeDialogUnits(content); viewer = new TableViewer(content, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION); viewer.getTable().setHeaderVisible(false); viewer.getTable().setLinesVisible(false); GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1); gridData.heightHint = viewer.getTable().getItemHeight() * 5 + viewer.getTable().getBorderWidth() * 2; viewer.getControl().setLayoutData(gridData); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new AlertLabelProvider()); viewer.addSelectionChangedListener(selectionChangedListener); createButtonsBar(content); folder = new CTabFolder(content, SWT.TOP | SWT.BORDER); folder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); performDefaults(); return content; } protected void createButtonsBar(Composite parent) { Composite content = new Composite(parent, SWT.NONE); GridLayout gridLayout = new GridLayout(1, false); gridLayout.marginWidth = gridLayout.marginHeight = 0; content.setLayout(gridLayout); content.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false)); add = new Button(content, SWT.NONE); add.setImage(getImageRegistry().get(UIActivator.ALERT_ADD_IMAGE)); add.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { doAddNewAlert(); } }); delete = new Button(content, SWT.NONE); delete.setImage(getImageRegistry().get(UIActivator.ALERT_DELETE_IMAGE)); delete.setEnabled(false); delete.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); list.removeAll(selection.toList()); viewer.refresh(); } }); } ImageRegistry getImageRegistry() { return UIActivator.getDefault().getImageRegistry(); } /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#performDefaults() */ @Override protected void performDefaults() { ISecurity security = (ISecurity) getElement().getAdapter(ISecurity.class); IAlert[] alerts = alertService.getAlerts(security); list = new ArrayList<IAlert>(Arrays.asList(alerts)); viewer.setInput(list); } @SuppressWarnings("unchecked") void doSelectionChanged(IStructuredSelection selection) { for (int i = 0; i < propertyPages.length; i++) { propertyPages[i].dispose(); } if (selection.isEmpty()) { propertyPages = new PropertyPage[0]; createTabbedPages(); return; } final Object element = selection.getFirstElement(); PropertyPageManager pageManager = new PropertyPageManager(); PropertyPageContributorManager.getManager().contribute(pageManager, element); IAdaptable adaptableElement = new IAdaptable() { @Override public Object getAdapter(Class adapter) { if (adapter.isAssignableFrom(element.getClass())) { return element; } return null; } }; List<PropertyPage> list = new ArrayList<PropertyPage>(); for (Object nodeObj : pageManager.getElements(PreferenceManager.PRE_ORDER)) { IPreferenceNode node = (IPreferenceNode) nodeObj; node.createPage(); if (node.getPage() instanceof PropertyPage) { PropertyPage page = (PropertyPage) node.getPage(); page.setElement(adaptableElement); list.add(page); } } propertyPages = list.toArray(new PropertyPage[list.size()]); createTabbedPages(); } void createTabbedPages() { CTabItem[] existingItems = folder.getItems(); for (int i = 0; i < existingItems.length; i++) { existingItems[i].dispose(); } if (propertyPages != null) { for (int i = 0; i < propertyPages.length; i++) { propertyPages[i].dispose(); } } for (int i = 0; i < propertyPages.length; i++) { CTabItem tabItem = new CTabItem(folder, SWT.NONE); Composite content = new Composite(folder, SWT.NONE); FillLayout layout = new FillLayout(); layout.marginWidth = layout.marginHeight = 5; content.setLayout(layout); propertyPages[i].createControl(content); tabItem.setText(propertyPages[i].getTitle()); tabItem.setControl(content); } if (folder.getItemCount() != 0) { folder.setSelection(folder.getItem(0)); } folder.getParent().layout(); } /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#performApply() */ @Override protected void performApply() { super.performApply(); viewer.refresh(); } /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#performOk() */ @Override public boolean performOk() { ISecurity security = (ISecurity) getElement().getAdapter(ISecurity.class); if (isControlCreated()) { for (int i = 0; i < propertyPages.length; i++) { propertyPages[i].performOk(); } alertService.setAlerts(security, list.toArray(new IAlert[list.size()])); } return super.performOk(); } void doAddNewAlert() { ISecurity security = (ISecurity) getElement().getAdapter(ISecurity.class); NewAlertWizard wizard = new NewAlertWizard(PlatformUI.getWorkbench(), new StructuredSelection(security)); WizardDialog dlg = new WizardDialog(getShell(), wizard); if (dlg.open() == Window.OK) { performDefaults(); } } }