/** * Copyright (c) 2016 committers of YAKINDU 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: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.sct.examples.wizard.drop; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTException; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IPageListener; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IPartService; import org.eclipse.ui.IPerspectiveDescriptor; import org.eclipse.ui.IPerspectiveListener; import org.eclipse.ui.IWindowListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.IWorkbenchWindow; /** * Copied from * {@link org.eclipse.epp.internal.mpc.ui.wizards.MarketplaceDropAdapter}. * */ public class DropWorkbenchChangeListener implements IPartListener2, IPageListener, IPerspectiveListener, IWindowListener { private IDropTargetInstaller dropTargetInstaller = getDropTargetInstaller(); protected IDropTargetInstaller getDropTargetInstaller() { return new ExampleDropTargetInstaller(); } @Override public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) { pageChanged(page); } @Override public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) { } @Override public void pageActivated(IWorkbenchPage page) { pageChanged(page); } @Override public void pageClosed(IWorkbenchPage page) { } @Override public void pageOpened(IWorkbenchPage page) { pageChanged(page); } protected void pageChanged(IWorkbenchPage page) { if (page == null) { return; } IWorkbenchWindow workbenchWindow = page.getWorkbenchWindow(); windowChanged(workbenchWindow); } @Override public void windowActivated(IWorkbenchWindow window) { windowChanged(window); } protected void windowChanged(IWorkbenchWindow window) { if (window == null) { return; } Shell shell = window.getShell(); runUpdate(shell); } @Override public void windowDeactivated(IWorkbenchWindow window) { } @Override public void windowClosed(IWorkbenchWindow window) { } @Override public void windowOpened(IWorkbenchWindow window) { hookWindow(window); } protected void hookWindow(IWorkbenchWindow window) { if (window == null) { return; } window.addPageListener(this); window.addPerspectiveListener(this); IPartService partService = (IPartService) window.getService(IPartService.class); partService.addPartListener(this); windowChanged(window); } @Override public void partOpened(IWorkbenchPartReference partRef) { partUpdate(partRef); } @Override public void partActivated(IWorkbenchPartReference partRef) { partUpdate(partRef); } @Override public void partBroughtToTop(IWorkbenchPartReference partRef) { partUpdate(partRef); } @Override public void partVisible(IWorkbenchPartReference partRef) { } @Override public void partClosed(IWorkbenchPartReference partRef) { partUpdate(partRef); } @Override public void partDeactivated(IWorkbenchPartReference partRef) { partUpdate(partRef); } @Override public void partHidden(IWorkbenchPartReference partRef) { partUpdate(partRef); } @Override public void partInputChanged(IWorkbenchPartReference partRef) { } protected void partUpdate(IWorkbenchPartReference partRef) { if (partRef == null) { return; } IWorkbenchPage page = partRef.getPage(); pageChanged(page); } protected void runUpdate(final Shell shell) { if (shell == null || shell.isDisposed()) { return; } Display display = shell.getDisplay(); if (display == null || display.isDisposed()) { return; } try { display.asyncExec(new Runnable() { public void run() { if (!shell.isDisposed()) { dropTargetInstaller.installDropTarget(shell); } } }); } catch (SWTException ex) { if (ex.code == SWT.ERROR_DEVICE_DISPOSED) { // ignore return; } ex.printStackTrace(); } catch (RuntimeException ex) { ex.printStackTrace(); } } }