Project: e4-rendering
/*******************************************************************************
 * 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); 
 
}