/******************************************************************************* * Copyright (c) 2012 Rushan R. Gilmullin 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: * Rushan R. Gilmullin - initial API and implementation *******************************************************************************/ package org.semanticsoft.vaaclipse.presentation.fastview; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.model.application.ui.MUIElement; import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder; import org.eclipse.e4.ui.model.application.ui.basic.MPartStack; import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar; import org.eclipse.e4.ui.model.application.ui.menu.MToolBar; import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.osgi.service.event.Event; import org.osgi.service.event.EventHandler; import org.semanticsoft.vaaclipse.api.Events; import org.semanticsoft.vaaclipse.widgets.StackWidget; import fi.jasoft.dragdroplayouts.client.ui.LayoutDragMode; /** * @author rushan * */ public class FastViewManager { @Inject private IEclipseContext context; @Inject private EModelService modelService; private Map<MUIElement, SingleElementFastViewManager> element2man = new HashMap<MUIElement, SingleElementFastViewManager>(); private Map<StackWidget, LayoutDragMode> layoutDragMode = new HashMap<StackWidget, LayoutDragMode>(); private Map<MUIElement, List<MPartStack>> areaStackWidgets = new HashMap<MUIElement, List<MPartStack>>(); private EventHandler minimizeHandler = new EventHandler() { @Override public void handleEvent(Event event) { MUIElement minimizedElement = (MUIElement) event.getProperty(Events.MinMaxEvents.PARAMETER_ELEMENT); if (element2man.containsKey(minimizedElement)) return; //Disable drag mode if (minimizedElement instanceof MPartStack) { disableDrag((MPartStack)minimizedElement); } else if (minimizedElement instanceof MPlaceholder) //area { if (((MPlaceholder) minimizedElement).getRef() != null) { List<MPartStack> stacks = modelService.findElements(((MPlaceholder) minimizedElement).getRef(), null, MPartStack.class, null); for (MPartStack stack : stacks) { if (stack.getWidget() != null) { disableDrag(stack); } } areaStackWidgets.put(minimizedElement, stacks); } } //start single element fast view manager for minimizedElement MTrimBar trimBar = (MTrimBar) event.getProperty(Events.MinMaxEvents.PARAMETER_TRIMBAR); MToolBar toolBar = (MToolBar) event.getProperty(Events.MinMaxEvents.PARAMETER_TOOLBAR); IEclipseContext manContext = context.createChild(); manContext.set(MUIElement.class, minimizedElement); manContext.set(MTrimBar.class, trimBar); manContext.set(MToolBar.class, toolBar); SingleElementFastViewManager man = ContextInjectionFactory.make(SingleElementFastViewManager.class, manContext); element2man.put(minimizedElement, man); } }; private EventHandler restoreHandler = new EventHandler() { @Override public void handleEvent(Event event) { MUIElement minimizedElement = (MUIElement) event.getProperty(Events.MinMaxEvents.PARAMETER_ELEMENT); if (!element2man.containsKey(minimizedElement)) return; element2man.remove(minimizedElement).dispose(); //restore drag mode if (minimizedElement instanceof MPartStack) { restoreDrag((MPartStack) minimizedElement); } else if (minimizedElement instanceof MPlaceholder) //area { MPlaceholder ph = (MPlaceholder) minimizedElement; if (ph.getRef() != null) { List<MPartStack> stacks = areaStackWidgets.remove(minimizedElement); if (stacks != null) { for (MPartStack stack : stacks) { restoreDrag(stack); } } } } } }; private void disableDrag(MPartStack stack) { StackWidget sw = (StackWidget) stack.getWidget(); if (sw != null) { if (sw.getDragMode() != null && !sw.getDragMode().equals(LayoutDragMode.NONE)) { layoutDragMode.put(sw, sw.getDragMode()); sw.setDragMode(LayoutDragMode.NONE); } } } private void restoreDrag(MPartStack stack) { StackWidget sw = (StackWidget) stack.getWidget(); if (sw != null) { LayoutDragMode ldm = layoutDragMode.remove(sw); if (ldm != null) { sw.setDragMode(ldm); } } } @PostConstruct public void postConstruct(IEventBroker eventBroker) { eventBroker.unsubscribe(minimizeHandler); eventBroker.subscribe(Events.MinMaxEvents.EVENT_MINIMIZE_ELEMENT, minimizeHandler); eventBroker.unsubscribe(restoreHandler); eventBroker.subscribe(Events.MinMaxEvents.EVENT_RESTORE_ELEMENT, restoreHandler); } }