/******************************************************************************* * 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.swing; import java.awt.Component; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.inject.Inject; import javax.swing.JSplitPane; 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.MPartSashContainer; import org.eclipse.e4.ui.workbench.UIEvents; import org.osgi.service.event.Event; import org.osgi.service.event.EventHandler; import com.toedter.e4.ui.workbench.generic.GenericRenderer; @SuppressWarnings("restriction") public class SashRenderer extends GenericRenderer { private EventHandler sashOrientationHandler; private EventHandler sashWeightHandler; @Override public void createWidget(MUIElement element, MElementContainer<MUIElement> parent) { if (!(element instanceof MPartSashContainer)) { return; } final MPartSashContainer partSashContainer = (MPartSashContainer) element; JSplitPane splitPane = new JSplitPane(); if (partSashContainer.isHorizontal()) { splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT); } else { splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); } element.setWidget(splitPane); } @Override public void processContents(final MElementContainer<MUIElement> element) { if (element.getChildren().size() == 2) { JSplitPane splitPane = (JSplitPane) element.getWidget(); int visibleChildrenCount = 0; if (element.getChildren().get(0).isVisible()) { splitPane.setLeftComponent((Component) element.getChildren().get(0).getWidget()); visibleChildrenCount++; } else { splitPane.setLeftComponent(null); } if (element.getChildren().get(1).isVisible()) { splitPane.setRightComponent((Component) element.getChildren().get(1).getWidget()); visibleChildrenCount++; } else { splitPane.setRightComponent(null); } // TODO This is not a good position to hook the controller logic // but hookControllerLogic() is invoked before processContents()... String dividerPos = element.getContainerData(); if (visibleChildrenCount == 2) { splitPane.setDividerSize(10); if (dividerPos != null) { splitPane.setDividerLocation(Integer.parseInt(dividerPos)); } } else { splitPane.setDividerSize(0); } element.setVisible(visibleChildrenCount != 0); splitPane.revalidate(); splitPane.repaint(); } else { System.err.println("A sash has to have 2 children"); } } @Override public void hookControllerLogic(MUIElement element) { if (element instanceof MPartSashContainer) { final MPartSashContainer partSashContainer = (MPartSashContainer) element; final JSplitPane splitPane = (JSplitPane) partSashContainer.getWidget(); splitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { if (splitPane.getLeftComponent() != null && splitPane.getRightComponent() != null) { partSashContainer.setContainerData(((Integer) event.getNewValue()).toString()); } } }); } } @Inject void postConstruct(IEventBroker eventBroker) { sashOrientationHandler = new EventHandler() { @Override public void handleEvent(Event event) { // Ensure that this event is for a MPartSashContainer MUIElement element = (MUIElement) event.getProperty(UIEvents.EventTags.ELEMENT); if (element.getRenderer() != SashRenderer.this) { return; } int orientation; if (((MPartSashContainer) element).isHorizontal()) { orientation = JSplitPane.HORIZONTAL_SPLIT; } else { orientation = JSplitPane.VERTICAL_SPLIT; } ((JSplitPane) element.getWidget()).setOrientation(orientation); } }; eventBroker.subscribe(UIEvents.GenericTile.TOPIC_HORIZONTAL, sashOrientationHandler); sashWeightHandler = new EventHandler() { @Override public void handleEvent(Event event) { // Ensure that this event is for a MPartSashContainer MUIElement element = (MUIElement) event.getProperty(UIEvents.EventTags.ELEMENT); if (element.getRenderer() != SashRenderer.this) { return; } String dividerPos = element.getContainerData(); JSplitPane splitPane = ((JSplitPane) element.getWidget()); if (dividerPos != null && dividerPos != ((Integer) splitPane.getDividerLocation()).toString()) { splitPane.setDividerLocation(Integer.parseInt(dividerPos)); } } }; eventBroker.subscribe(UIEvents.UIElement.TOPIC_CONTAINERDATA, sashWeightHandler); } }