org.eclipsetrader.ui.internal.trading.AlertPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipsetrader.ui.internal.trading.AlertPropertyPage.java

Source

/*
 * 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();
        }
    }
}