blob: d302084e8a79482bb6cc868fce2f0be968a002fb [file] [log] [blame]
/*******************************************************************************
* 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.eclipse.osbp.vaaclipse.presentation.renderers;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.contributions.IContributionFactory;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.basic.MInputPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.e4.ui.workbench.UIEvents.EventTags;
import org.eclipse.osbp.vaaclipse.presentation.renderers.callback.PartItemExecutionService;
import org.eclipse.osbp.vaaclipse.publicapi.commands.IPartItemExecutionService;
import org.eclipse.osbp.vaaclipse.publicapi.editor.SavePromptSetup;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import com.vaadin.ui.AbstractLayout;
import com.vaadin.ui.Component;
import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.VerticalLayout;
@SuppressWarnings("restriction")
public class PartRenderer extends VaadinRenderer {
private Map<MPart, SavePromptSetup> savePrompts = new HashMap<MPart, SavePromptSetup>();
@Inject
IPresentationEngine renderingEngine;
@Inject
IEventBroker eventBroker;
private EventHandler contributionURIChanged = new EventHandler() {
@Override
public void handleEvent(Event event) {
Object changedObj = event.getProperty(EventTags.ELEMENT);
if (!(changedObj instanceof MPart)) {
return;
}
final MPart part = (MPart) changedObj;
IEclipseContext localContext = part.getContext();
IContributionFactory contributionFactory = (IContributionFactory) localContext
.get(IContributionFactory.class.getName());
Object newPart = contributionFactory.create(part.getContributionURI(),
localContext);
if(part.getObject() != null) {
ContextInjectionFactory.uninject(part.getObject(), localContext);
}
part.setObject(newPart);
}
};
public SavePromptSetup getSavePromptSetup(MPart part) {
return savePrompts.get(part);
}
@Override
public void createWidget(MUIElement element,
MElementContainer<MUIElement> parent) {
Panel shortcutReceiver = new Panel();
shortcutReceiver.setSizeFull();
VerticalLayout pane = new VerticalLayout();
shortcutReceiver.setContent(pane);
pane.setSizeFull();
final MPart part = (MPart) element;
// toolbar
MToolBar toolbar = part.getToolbar();
if (toolbar != null && toolbar.isToBeRendered()) {
// create toolbar area
CssLayout toolbarArea = new CssLayout();
toolbarArea.setStyleName("mparttoolbararea");
toolbarArea.setSizeUndefined();
toolbarArea.setWidth("100%");
pane.addComponent(toolbarArea);
// create toolbar
Component toolbarWidget = (Component) renderingEngine
.createGui(toolbar);
((AbstractLayout) toolbarWidget).setSizeUndefined();
toolbarWidget.setStyleName("mparttoolbar");
toolbarArea.addComponent(toolbarWidget);
}
VerticalLayout contributionArea = new VerticalLayout();
contributionArea.setSizeFull();
pane.addComponent(contributionArea);
pane.setExpandRatio(contributionArea, 100);
pane.setStyleName("part");
element.setWidget(shortcutReceiver);
IEclipseContext localContext = part.getContext();
localContext.set(Component.class, contributionArea);
localContext.set(ComponentContainer.class, contributionArea);
localContext.set(VerticalLayout.class, contributionArea);
localContext.set(MPart.class, part);
localContext.set(IPartItemExecutionService.class,
new PartItemExecutionService());
SavePromptSetup savePromptProvider = new SavePromptSetup();
savePrompts.put(part, savePromptProvider);
localContext.set(SavePromptSetup.class, savePromptProvider);
if (part instanceof MInputPart)
localContext.set(MInputPart.class, (MInputPart) part);
IContributionFactory contributionFactory = (IContributionFactory) localContext
.get(IContributionFactory.class.getName());
Object newPart = contributionFactory.create(part.getContributionURI(),
localContext);
part.setObject(newPart);
}
@Override
public void disposeWidget(MUIElement element) {
this.savePrompts.remove(element);
}
@PostConstruct
public void postConstruct() {
eventBroker.subscribe(UIEvents.Contribution.TOPIC_CONTRIBUTIONURI,
contributionURIChanged);
}
@PreDestroy
public void dispose() {
eventBroker.unsubscribe(contributionURIChanged);
}
}