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