org.eclipsetrader.ui.internal.charts.views.ChartViewDropTarget.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipsetrader.ui.internal.charts.views.ChartViewDropTarget.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.charts.views;

import java.util.Iterator;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.internal.dialogs.PropertyDialog;
import org.eclipse.ui.internal.dialogs.PropertyPageContributorManager;
import org.eclipse.ui.internal.dialogs.PropertyPageManager;
import org.eclipsetrader.ui.charts.BaseChartViewer;
import org.eclipsetrader.ui.charts.ChartCanvas;
import org.eclipsetrader.ui.charts.ChartRowViewItem;
import org.eclipsetrader.ui.charts.ChartView;
import org.eclipsetrader.ui.charts.ChartViewItem;
import org.eclipsetrader.ui.charts.IChartEditorListener;
import org.eclipsetrader.ui.charts.IChartObject;
import org.eclipsetrader.ui.charts.IChartObjectFactory;
import org.eclipsetrader.ui.charts.IEditableChartObject;
import org.eclipsetrader.ui.internal.UIActivator;

@SuppressWarnings("restriction")
public class ChartViewDropTarget extends DropTargetAdapter {

    Shell shell;
    BaseChartViewer viewer;
    ChartView view;

    public ChartViewDropTarget(BaseChartViewer viewer) {
        this.shell = viewer.getControl().getShell();
        this.viewer = viewer;
    }

    public void setView(ChartView view) {
        this.view = view;
    }

    /* (non-Javadoc)
     * @see org.eclipse.swt.dnd.DropTargetAdapter#drop(org.eclipse.swt.dnd.DropTargetEvent)
     */
    @Override
    public void drop(DropTargetEvent event) {
        ChartRowViewItem rowItem = null;

        ChartCanvas[] chartCanvas = viewer.getChildren();
        for (int i = 0; i < chartCanvas.length; i++) {
            Rectangle bounds = chartCanvas[i].getCanvas().getBounds();
            if (bounds.contains(chartCanvas[i].getCanvas().toControl(event.x, event.y))) {
                rowItem = (ChartRowViewItem) view.getItems()[i];
                break;
            }
        }

        String[] factories = (String[]) event.data;
        for (int i = 0; i < factories.length; i++) {
            final IChartObjectFactory factory = UIActivator.getDefault().getChartObjectFactory(factories[i]);
            if (factory != null) {
                final IChartObject chartObject = factory.createObject(null);
                if (chartObject instanceof IEditableChartObject) {
                    viewer.getEditor().addListener(new IChartEditorListener() {

                        @Override
                        public void applyEditorValue() {
                            viewer.getEditor().removeListener(this);

                            IChartObject[] currentObject = viewer.getSelectedChartCanvas().getChartObject();
                            int index = viewer.getSelectedChartCanvasIndex();

                            if (index != -1) {
                                IChartObject[] newObject = new IChartObject[currentObject.length + 1];
                                System.arraycopy(currentObject, 0, newObject, 0, currentObject.length);
                                newObject[currentObject.length] = chartObject;

                                viewer.getSelectedChartCanvas().setChartObject(newObject);

                                ((ChartRowViewItem) view.getItems()[index]).addFactory(factory);
                                viewer.setSelection(new StructuredSelection(chartObject));
                            }
                        }

                        @Override
                        public void cancelEditor() {
                            viewer.getEditor().removeListener(this);
                        }
                    });
                    viewer.activateEditor((IEditableChartObject) chartObject);
                } else {
                    boolean addToNewRow = false;
                    IConfigurationElement configurationElement = UIActivator.getDefault()
                            .getChartObjectConfiguration(factories[i]);
                    if (!"false".equals(configurationElement.getAttribute("exclusive"))) {
                        addToNewRow = true;
                    }

                    PropertyPageManager pageManager = new PropertyPageManager();
                    if (addToNewRow) {
                        ChartRowViewItem newRowItem = new ChartRowViewItem(view, factory.getName());
                        ChartViewItem viewItem = new ChartViewItem(newRowItem, factory);
                        newRowItem.addChildItem(viewItem);

                        PropertyPageContributorManager.getManager().contribute(pageManager, viewItem);
                        Iterator<?> pages = pageManager.getElements(PreferenceManager.PRE_ORDER).iterator();
                        if (pages.hasNext()) {
                            PropertyDialog dlg = PropertyDialog.createDialogOn(shell, null, viewItem);
                            if (dlg.open() == Window.OK) {
                                view.addRowAfter(rowItem, newRowItem);
                            }
                        }
                    } else {
                        ChartViewItem viewItem = new ChartViewItem(rowItem, factory);
                        PropertyPageContributorManager.getManager().contribute(pageManager, viewItem);
                        Iterator<?> pages = pageManager.getElements(PreferenceManager.PRE_ORDER).iterator();
                        if (pages.hasNext()) {
                            PropertyDialog dlg = PropertyDialog.createDialogOn(shell, null, viewItem);
                            if (dlg.open() == Window.OK) {
                                rowItem.addChildItem(viewItem);
                            }
                        }
                    }
                }
            }
        }
    }
}