/*******************************************************************************
* Copyright (c) 2011 Kai Toedter 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:
* Kai Toedter - initial API and implementation
******************************************************************************/
package com.toedter.e4.ui.workbench.renderers.swt;
import javax.inject.Inject;
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.MTrimBar;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import com.toedter.e4.ui.workbench.generic.GenericRenderer;
import com.toedter.e4.ui.workbench.generic.PresentationEngine;
import com.toedter.e4.ui.workbench.swt.SWTPresentationEngine;
import com.toedter.e4.ui.workbench.swt.layouts.SimpleTrimLayout;
@SuppressWarnings("restriction")
public class WorkbenchWindowRenderer extends GenericRenderer {
@Inject
private IEventBroker eventBroker;
@Override
public void createWidget(MUIElement element, MElementContainer<MUIElement> parent) {
if (element instanceof MWindow) {
MWindow mWindow = (MWindow) element;
Shell shell = new Shell(Display.getCurrent());
shell.setText(mWindow.getLabel());
shell.setLayout(new SimpleTrimLayout());
shell.setBounds(mWindow.getX(), mWindow.getY(), mWindow.getWidth(), mWindow.getHeight());
mWindow.getContext().set(Shell.class, shell);
element.setWidget(shell);
}
}
@Override
public void hookControllerLogic(final MUIElement element) {
if (element instanceof MWindow) {
final MWindow mWindow = (MWindow) element;
final Shell shell = (Shell) mWindow.getWidget();
EventHandler sizeHandler = new EventHandler() {
@Override
public void handleEvent(Event event) {
// Ensure that this event is for a MMenuItem
Object objElement = event.getProperty(UIEvents.EventTags.ELEMENT);
if (!(objElement instanceof MWindow)) {
return;
}
// Is this listener interested ?
final MWindow window = (MWindow) objElement;
if (window.getRenderer() != WorkbenchWindowRenderer.this) {
return;
}
// No widget == nothing to update
if (shell == null) {
return;
}
String attName = (String) event.getProperty(UIEvents.EventTags.ATTNAME);
if (UIEvents.Window.X.equals(attName) || UIEvents.Window.Y.equals(attName)
|| UIEvents.Window.WIDTH.equals(attName) || UIEvents.Window.HEIGHT.equals(attName)) {
shell.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
shell.setBounds(window.getX(), window.getY(), window.getWidth(), window.getHeight());
}
});
}
}
};
eventBroker.subscribe(UIEvents.Window.TOPIC_ALL, sizeHandler);
shell.addControlListener(new ControlListener() {
@Override
public void controlResized(ControlEvent e) {
// Don't store the maximized size in the model
if (shell.getMaximized()) {
return;
}
mWindow.setWidth(shell.getSize().x);
mWindow.setHeight(shell.getSize().y);
}
@Override
public void controlMoved(ControlEvent e) {
// Don't store the maximized size in the model
if (shell.getMaximized()) {
return;
}
mWindow.setX(shell.getLocation().x);
mWindow.setY(shell.getLocation().y);
}
});
}
}
@Override
public void processContents(MElementContainer<MUIElement> element) {
if (!(((MUIElement) element) instanceof MWindow)) {
return;
}
MWindow mWindow = (MWindow) ((MUIElement) element);
Shell shell = (Shell) element.getWidget();
// Populate the main menu
PresentationEngine renderer = (PresentationEngine) context.get(IPresentationEngine.class.getName());
if (mWindow.getMainMenu() != null) {
renderer.createGui(mWindow.getMainMenu(), element);
shell.setMenuBar((Menu) mWindow.getMainMenu().getWidget());
}
// create Detached Windows
for (MWindow dw : mWindow.getWindows()) {
renderer.createGui(dw, element);
}
// Populate the trim (if any)
if (mWindow instanceof MTrimmedWindow) {
MTrimmedWindow tWindow = (MTrimmedWindow) mWindow;
for (MTrimBar trimBar : tWindow.getTrimBars()) {
renderer.createGui(trimBar, element);
}
}
shell.pack();
shell.open();
}
@Override
public void doLayout(MElementContainer<?> element) {
if (!(((MUIElement) element) instanceof MWindow)) {
return;
}
MWindow mWindow = (MWindow) ((MUIElement) element);
Shell shell = (Shell) element.getWidget();
if (mWindow instanceof MTrimmedWindow) {
MTrimmedWindow tWindow = (MTrimmedWindow) mWindow;
Shell limbo = SWTPresentationEngine.getLimboShell();
for (MTrimBar trimBar : tWindow.getTrimBars()) {
if (!trimBar.isVisible()) {
((Composite) trimBar.getWidget()).setParent(limbo);
} else {
((Composite) trimBar.getWidget()).setParent(shell);
}
}
}
shell.layout(true, true);
shell.pack();
}
@Override
public void removeChild(MUIElement element, MElementContainer<MUIElement> parent) {
System.out.println("SWT WBW Renderer.removeChild(): " + element + ", parent: " + parent);
}
}