Skip to main content
aboutsummaryrefslogblamecommitdiffstats
blob: 04023ba677f1dec83d21c5e739000f91a5ef2745 (plain) (tree)
1
2
                                                                                
                                                       

































                                                                                
                        







                                             






                                                                                   
                                
                   
                                                         

                                                
 
                   


                                                                                   
 





                                                                                      
 



                                                         

         











                                                                                   









                                                                                                     

                                                                              



































                                                                                                
                                























                                                 



                                                                               















                                                                                         






                                                                                

















                                                                                                
                                                                              

                                                                                                   
                                 








                                                                                
                                                            









                                                                                                
                                                                              

                                                                                     
                                 



















                                                                                



                                                                   








                                                                                             


                                                                              
                                            
                                     

                                            
                                     
                 


                            







                                                                                        
















































































                                                                                                 





                                                                                 









                                                               
                                                        
                                                  

                                                          
                                                    

                                                      
                                            

                                                      
                                             

                                                   
                                              
                 














                                                                                 
                                                                                    
                                         
                         





                                                                                         
                                                                   
                                                                      
                                 





                                    



                                                                                
                                     
                                              








                                                                                                                           
                                                              
                 

         

















                                                                                    

































                                                                                      














                                                                                    















                                                                                         
                                         

                                                                                         
                                
                                                                                       
                         





                                                                                            
                                                          
                                                       
                         



                                                                                         
                                                  

                                                                                
                         











                                                                                        
                                                                   
                                                                     
                                 













                                                                                       
                                                                   
                                                                     
                                 




                                                                        
                                                                        
                                                         
                         




























                                                                                            
                                                                                   
                                                                                            
                         












                                                                                               
                                                        
                                                          
                                 


                                                                                             
                                                                                         
                                                                 
                                 


                                                                                             
                                                                                
                                                               
                                 

                                                                                   
                                                                             
                                                                                                        
                                                                      
 
                                                         

                                                                                                       
                                                

                                                                                                        
                                         


































                                                                                                    







                                                

                                                                               

                                                                                        



                                                                   

                                                              


                                                                                     

                                                                                        



                                                                                       




                                                      
                            

         






                                                                     
                                                         
                                                        
                                       

                                                          
                                       

                                                      
                                        

                                                      
                                         

                                                   
                                          
                 











                                                                                
                                                               
                                                    
                 
 
                                                              
                                                  
                 









































                                                                                      
/*******************************************************************************
 * Copyright (c) 2006, 2009 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 ******************************************************************************/
package org.eclipse.ui.internal;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CBanner;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.CoolBar;
import org.eclipse.swt.widgets.CoolItem;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.ui.internal.layout.TrimCommonUIHandle;

/**
 * This layout implements the handling necessary to support the positioning of
 * all of the 'trim' elements defined for the workbench.
 * <p>
 * NOTE: This class is a part of a 'work in progress' and should not be used
 * without consulting the Platform UI group. No guarantees are made as to the
 * stability of the API.
 * </p>
 * 
 * @since 3.2
 * 
 */
public class WorkbenchLayout extends Layout {
	private static int defaultMargin = 5;

	/**
	 * This is a convenience class that caches information for a single 'tiled'
	 * line of trim.
	 * 
	 * @since 3.2
	 * 
	 */
	private class TrimLine {
		/**
		 * The list of controls in this trim line
		 */
		List controls = new ArrayList();

		/**
		 * In horizontal terms this is the 'height' of the tallest control.
		 */
		int minorMax = 0;

		/**
		 * The number of controls in the line that want to 'grab' extra space.
		 * Any unused space in a trim line is shared equally among these
		 * controls
		 */
		int resizableCount = 0;

		/**
		 * The amount of unused space in the line
		 */
		int extraSpace = 0;
	}

	/**
	 * This layout is used to capture the CBanner's calls to 'computeSize' for
	 * the left trim (which is used to determine the height of the CBanner) so
	 * that it will compute its own height to be the max of either the left or
	 * the right control.
	 * <p>
	 * NOTE: This class is expected to be removed once the CBanner mods are in.
	 * </p>
	 * 
	 * @since 3.2
	 * 
	 */
	private class LeftBannerLayout extends Layout {

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.swt.widgets.Layout#computeSize(org.eclipse.swt.widgets.Composite,
		 *      int, int, boolean)
		 */
		protected Point computeSize(Composite composite, int wHint, int hHint,
				boolean flushCache) {
			// 'topMax' is the maximum height of both the left and
			// the right side
			return new Point(wHint, WorkbenchLayout.this.topMax);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite,
		 *      boolean)
		 */
		protected void layout(Composite composite, boolean flushCache) {
		}

	}

	// Trim area 'ids'
	public static final String TRIMID_CMD_PRIMARY = "Command Primary"; //$NON-NLS-1$

	public static final String TRIMID_CMD_SECONDARY = "Command Secondary"; //$NON-NLS-1$

	public static final String TRIMID_VERTICAL1 = "vertical1"; //$NON-NLS-1$

	public static final String TRIMID_VERTICAL2 = "vertical2"; //$NON-NLS-1$

	public static final String TRIMID_STATUS = "Status"; //$NON-NLS-1$

	public static final String TRIMID_CENTER = "Center"; //$NON-NLS-1$

	// 'CBanner' info
	public CBanner banner;

	private int topMax;

	// 'Center' composite
	public Composite centerComposite;

	// inter-element spacing
	private int spacing = 0;

	// Trim Areas
	private TrimArea cmdPrimaryTrimArea;

	private TrimArea cmdSecondaryTrimArea;

	private TrimArea leftTrimArea;

	private TrimArea rightTrimArea;

	private TrimArea bottomTrimArea;

	// Drag handle info
	private int horizontalHandleSize = -1;

	private int verticalHandleSize = -1;

	private List dragHandles;

	// statics used in the layout
	private static Composite layoutComposite;

	private static Rectangle clientRect;

	/**
	 * Construct a new layout. This defines the trim areas that trim can be
	 * placed into.
	 */
	public WorkbenchLayout() {
		super();

		// Add the trim areas into the layout
		cmdPrimaryTrimArea = new TrimArea(TRIMID_CMD_PRIMARY, SWT.TOP,
				defaultMargin);
		cmdSecondaryTrimArea = new TrimArea(TRIMID_CMD_SECONDARY, SWT.TOP,
				defaultMargin);
		leftTrimArea = new TrimArea(TRIMID_VERTICAL1, SWT.LEFT, defaultMargin);
		rightTrimArea = new TrimArea(TRIMID_VERTICAL2, SWT.RIGHT, defaultMargin);
		bottomTrimArea = new TrimArea(TRIMID_STATUS, SWT.BOTTOM, defaultMargin);

		// init the list that has the drag handle cache
		dragHandles = new ArrayList();
	}

	/**
	 * Create the CBanner control used to control the horizontal span of the
	 * primary and secondary command areas.
	 * 
	 * @param workbenchComposite
	 *            The workbench acting as the parent of the CBanner
	 */
	public void createCBanner(Composite workbenchComposite) {
		banner = new CBanner(workbenchComposite, SWT.NONE);
		banner.setSimple(false);
		banner.setRightWidth(175);
		banner.setLocation(0, 0);

		// Create the left composite and override its 'computeSize'
		// to delegate to the 'primary' command trim area
		Composite bannerLeft = new Composite(banner, SWT.NONE) {
			/*
			 * (non-Javadoc)
			 * 
			 * @see org.eclipse.swt.widgets.Composite#computeSize(int, int,
			 *      boolean)
			 */
			public Point computeSize(int wHint, int hHint, boolean changed) {
				// If we're doing a 'real' workbench layout then delegate to the
				// appropriate trim area
				if (WorkbenchLayout.layoutComposite != null) {
					return WorkbenchLayout.this.computeSize(TRIMID_CMD_PRIMARY,
							wHint);
				}

				return super.computeSize(wHint, hHint, changed);
			}
		};
		bannerLeft.setLayout(new LeftBannerLayout());
		bannerLeft.setBackground(workbenchComposite.getDisplay()
				.getSystemColor(SWT.COLOR_DARK_BLUE));
		banner.setLeft(bannerLeft);

		// Create the right hand part of the CBanner
		Composite bannerRight = new Composite(banner, SWT.NONE) {
			/*
			 * (non-Javadoc)
			 * 
			 * @see org.eclipse.swt.widgets.Composite#computeSize(int, int,
			 *      boolean)
			 */
			public Point computeSize(int wHint, int hHint, boolean changed) {
				// If we're doing a 'real' workbench layout then delegate to the
				// appropriate trim area
				if (WorkbenchLayout.layoutComposite != null) {
					return WorkbenchLayout.this.computeSize(
							TRIMID_CMD_SECONDARY, wHint);
				}

				return super.computeSize(wHint, hHint, changed);
			}
		};
		bannerRight.setBackground(workbenchComposite.getDisplay()
				.getSystemColor(SWT.COLOR_DARK_BLUE));
		banner.setRight(bannerRight);

		// If the right banner control changes size it's because
		// the 'swoop' moved.
		bannerRight.addControlListener(new ControlListener() {
			public void controlMoved(ControlEvent e) {
			}

			public void controlResized(ControlEvent e) {
				Composite leftComp = (Composite) e.widget;
				leftComp.getShell().layout(true);
			}
		});

		// Place the CBanner on the 'bottom' of the z-order
		banner.moveBelow(null);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.swt.widgets.Layout#computeSize(org.eclipse.swt.widgets.Composite,
	 *      int, int, boolean)
	 * 
	 * Note that this is arbitrary since the we're a top level shell (so
	 * computeSize won't be called.
	 */
	protected Point computeSize(Composite composite, int wHint, int hHint,
			boolean flushCache) {
		Point size = new Point(wHint, hHint);
		if (size.x == SWT.DEFAULT) {
			size.x = 300;
		}
		if (size.y == SWT.DEFAULT) {
			size.y = 300;
		}
		return size;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite,
	 *      boolean)
	 * 
	 * TODO: Supply a full description of the layout mechanicsS
	 */
	protected void layout(Composite composite, boolean flushCache) {
		layoutComposite = composite;
		clientRect = composite.getClientArea();

		// reset all the drag handles to be invisible
		resetDragHandles();

		// Compute the proper size for each trim area
		// Do Top Right, Top Left, Left, Right then Bottom so the math works out
		if (useCBanner()) {
			banner.moveBelow(null);

			// NOTE: calling 'computeSize' here will, in turn, call the
			// 'computeSize' for the left/right areas, each with the
			// 'correct' width hint...
			Point bannerSize = banner
					.computeSize(clientRect.width, SWT.DEFAULT);

			// set the amount of space used by the 'cmd' areas for use later
			topMax = bannerSize.y;

			banner.setSize(bannerSize);
		} else {
			Point c1Size = computeSize(TRIMID_CMD_PRIMARY, clientRect.width);
			Point c2Size = computeSize(TRIMID_CMD_SECONDARY, clientRect.width);

			// set the amount of space used by the 'cmd' areas for use later
			topMax = c1Size.y + c2Size.y;
		}

		// Now do the vertical areas; their 'major' is whatever is left
		// vertically once the top areas have been computed
		Point v1Size = computeSize(TRIMID_VERTICAL1, clientRect.height - topMax);
		Point v2Size = computeSize(TRIMID_VERTICAL2, clientRect.height - topMax);

		// Finally, the status area's 'major' is whatever is left over
		// horizontally once the vertical areas have been computed.
		computeSize(TRIMID_STATUS, clientRect.width - (v1Size.x + v2Size.x));

		// Now, layout the trim within each area
		// Command primary area
		if (useCBanner()) {
			Point leftLoc = banner.getLeft().getLocation();
			cmdPrimaryTrimArea.areaBounds.x = leftLoc.x;
			cmdPrimaryTrimArea.areaBounds.y = leftLoc.y;
		} else {
			cmdPrimaryTrimArea.areaBounds.x = 0;
			cmdPrimaryTrimArea.areaBounds.y = 0;
		}
		layoutTrim(cmdPrimaryTrimArea, cmdPrimaryTrimArea.areaBounds);

		// Command secondary area
		if (useCBanner()) {
			Point rightLoc = banner.getRight().getLocation();
			cmdSecondaryTrimArea.areaBounds.x = rightLoc.x;
			cmdSecondaryTrimArea.areaBounds.y = rightLoc.y;
		} else {
			cmdSecondaryTrimArea.areaBounds.x = 0;
			cmdSecondaryTrimArea.areaBounds.y = cmdPrimaryTrimArea.areaBounds.height;
		}
		layoutTrim(cmdSecondaryTrimArea, cmdSecondaryTrimArea.areaBounds);

		leftTrimArea.areaBounds.x = 0;
		leftTrimArea.areaBounds.y = topMax;
		layoutTrim(leftTrimArea, leftTrimArea.areaBounds);

		rightTrimArea.areaBounds.x = clientRect.width
				- rightTrimArea.areaBounds.width;
		rightTrimArea.areaBounds.y = topMax;
		layoutTrim(rightTrimArea, rightTrimArea.areaBounds);

		bottomTrimArea.areaBounds.x = leftTrimArea.areaBounds.width;
		bottomTrimArea.areaBounds.y = clientRect.height
				- bottomTrimArea.areaBounds.height;
		layoutTrim(bottomTrimArea, bottomTrimArea.areaBounds);

		// Set the center control's bounds to fill the space remaining
		// after the trim has been arranged
		layoutCenter();
	}

	/**
	 * Indicates whether or not the layout should use the CBanner or tile the
	 * primary and secondary trim areas one above the other.
	 * 
	 * @return <code>true</code> iff the layout should use the CBanner.
	 */
	private boolean useCBanner() {
		return (banner != null && banner.getVisible());
	}

	/**
	 * @param areaId
	 *            The identifier for the TrimArea to return
	 * @return The TrimArea that matches the given areaId
	 */
	private TrimArea getTrimArea(String areaId) {
		if (TRIMID_CMD_PRIMARY.equals(areaId)) {
			return cmdPrimaryTrimArea;
		}
		if (TRIMID_CMD_SECONDARY.equals(areaId)) {
			return cmdSecondaryTrimArea;
		}
		if (TRIMID_VERTICAL1.equals(areaId)) {
			return leftTrimArea;
		}
		if (TRIMID_VERTICAL2.equals(areaId)) {
			return rightTrimArea;
		}
		if (TRIMID_STATUS.equals(areaId)) {
			return bottomTrimArea;
		}

		return null;
	}

	/**
	 * @param areaId
	 *            The TrimArea that we want to get the controls for
	 * @return The list of controls whose TrimLayoutData's areaId matches the
	 *         given areaId parameter
	 */
	private List getTrimContents(String areaId) {
		List trimContents = new ArrayList();
		Control[] children = layoutComposite.getChildren();
		for (int i = 0; i < children.length; i++) {
			// Skip any disposed or invisible widgets
			if (children[i].isDisposed() || !children[i].getVisible()) {
				continue;
			}

			// Only accept children that want to be layed out in a particular
			// trim area
			if (children[i].getLayoutData() instanceof TrimLayoutData) {
				TrimLayoutData tlData = (TrimLayoutData) children[i]
						.getLayoutData();
				if (tlData.areaId.equals(areaId)) {
					trimContents.add(children[i]);
				}
			}
		}

		return trimContents;
	}

	/**
	 * Lays out the center composite once the outer trim areas have all been
	 * done.
	 */
	private void layoutCenter() {
		if (centerComposite != null) {
			// The center is the 'inner' bounding box of the other trim areas
			Rectangle areaBounds = new Rectangle(
					leftTrimArea.areaBounds.x + leftTrimArea.areaBounds.width,
					topMax,
					clientRect.width
							- (leftTrimArea.areaBounds.width + rightTrimArea.areaBounds.width),
					clientRect.height
							- (topMax + bottomTrimArea.areaBounds.height));

			centerComposite.setBounds(areaBounds);
		}
	}

	/**
	 * Computes the size of a trim area given the length of its major dimension.
	 * Depending on whether the trim area is horizontal or vertical one of the
	 * two value will always match the supplied 'majorHint' ('x' if it's
	 * horizontal).
	 * <p>
	 * Effectively, this computes the length of the minor dimension by tiling
	 * the trim area's controls into multiple lines based on the length of the
	 * major dimension.
	 * </p>
	 * 
	 * @param areaId
	 *            The area id to compute the size for
	 * @param majorHint
	 *            The length of the major dimension
	 * 
	 * @return The computed size
	 */
	private Point computeSize(String areaId, int majorHint) {
		TrimArea trimArea = getTrimArea(areaId);
		boolean horizontal = trimArea.orientation == SWT.TOP
				|| trimArea.orientation == SWT.BOTTOM;

		// Gather up all the controls for this area and tile them out
		trimArea.trimContents = getTrimContents(trimArea.areaId);

		// Split the controls list into a list of TrimLines that each fit into
		// the trim area
		trimArea.trimLines = computeWrappedTrim(trimArea, majorHint);

		// Now, calculate the max between the default and the contents
		int minorMax = 0;
		for (Iterator iter = trimArea.trimLines.iterator(); iter.hasNext();) {
			TrimLine curLine = (TrimLine) iter.next();
			minorMax += curLine.minorMax;
		}
		minorMax = Math.max(minorMax, trimArea.defaultMinor);

		// Store the size in the area'a cache...
		Point computedSize = new Point(0, 0);
		if (horizontal) {
			computedSize.x = trimArea.areaBounds.width = majorHint;
			computedSize.y = trimArea.areaBounds.height = minorMax;
		} else {
			computedSize.x = trimArea.areaBounds.width = minorMax;
			computedSize.y = trimArea.areaBounds.height = majorHint;
		}

		// ...and return it
		return computedSize;
	}

	/**
	 * This is where the information required to lay the controls belonging to a
	 * particular trim area out.
	 * <p>
	 * Tile the controls in the trim area into one or more lines. Each line is
	 * guaranteed to take up less than or equal to the 'majorHint' in the major
	 * dimension. The result is a complete cache of the information needed to
	 * lay the controls in the trim area out.
	 * </p>
	 * 
	 * @param trimArea The trim area to create the cache info for
	 * @param majorHint The length of the major dimension
	 * 
	 * @return A List of <code>TrimLine</code> elements
	 */
	private List computeWrappedTrim(TrimArea trimArea, int majorHint) {
		boolean horizontal = trimArea.orientation == SWT.TOP
				|| trimArea.orientation == SWT.BOTTOM;
		// Return a list of 'lines' to tile the control into...
		List lines = new ArrayList();
		TrimLine curLine = new TrimLine();
		lines.add(curLine);
		curLine.minorMax = trimArea.defaultMinor;

		// Init the tilePos to force a 'new' line
		int tilePos = 0;
		for (Iterator iter = trimArea.trimContents.iterator(); iter.hasNext();) {
			Control control = (Control) iter.next();
			TrimLayoutData td = (TrimLayoutData) control.getLayoutData();

			Point prefSize;
			if (horizontal) {
				//prefSize = control.computeSize(majorHint, SWT.DEFAULT);
				prefSize = control.computeSize(SWT.DEFAULT, SWT.DEFAULT);
			} else {
				prefSize = control.computeSize(SWT.DEFAULT, majorHint);
			}

			// Will this control fit onto the current line?
			int curTileSize = horizontal ? prefSize.x : prefSize.y;

			// every control except the first one needs to include the 'spacing'
			// in the calc
			if (curLine.controls.size() > 0) {
				curTileSize += spacing;
			}

			// If the control can be re-positioned then we have to add a drag
			// handle to it
			// we have to include the space that it'll occupy in the calcs
			if (td.listener != null) {
				curTileSize += horizontal ? horizontalHandleSize
						: verticalHandleSize;
			}

			// Place the control into the 'current' line if it'll fit (or if
			// it's the
			// -first- control (this handles the case where a control is too
			// large to
			// fit into the current TrimArea's 'major' size.
			if ((tilePos + curTileSize) <= majorHint
					|| curLine.controls.size() == 0) {
				curLine.controls.add(control);

				// Cache the maximum amount of 'minor' space needed
				int minorSize = horizontal ? prefSize.y : prefSize.x;
				if (minorSize > curLine.minorMax) {
					curLine.minorMax = minorSize;
				}

				tilePos += curTileSize;
			} else {
				// Remember how much space was left on the current line
				curLine.extraSpace = majorHint - tilePos;

				// We need a new line...
				curLine = new TrimLine();
				lines.add(curLine);

				curLine.controls.add(control);

				// Cache the maximum amount of 'minor' space needed
				int minorSize = horizontal ? prefSize.y : prefSize.x;
				if (minorSize > curLine.minorMax) {
					curLine.minorMax = minorSize;
				}

				tilePos = curTileSize;
			}

			// Count how many 'resizable' controls there are
			if ((td.flags & TrimLayoutData.GROWABLE) != 0) {
				curLine.resizableCount++;
			}
		}

		// Remember how much space was left on the current line
		curLine.extraSpace = majorHint - tilePos;

		return lines;
	}

	private void layoutTrim(TrimArea trimArea, Rectangle areaBounds) {
		boolean horizontal = trimArea.orientation == SWT.TOP
				|| trimArea.orientation == SWT.BOTTOM;

		// How much space do we have to 'tile' into?
		int areaMajor = horizontal ? areaBounds.width : areaBounds.height;

		// Get the tiled 'List of Lists' for the trim
		List tileAreas = trimArea.trimLines;

		// Tile each 'line' into the trim
		int tilePosMinor = horizontal ? areaBounds.y : areaBounds.x;
		for (Iterator areaIter = tileAreas.iterator(); areaIter.hasNext();) {
			TrimLine curLine = (TrimLine) areaIter.next();

			// Compute how much space to give to 'resizable' controls. Note that
			// we can end up computing -negative- 'extraSpace' values if the
			// control's
			// preferred 'major' size is actually > the 'major' size for the
			// trim area
			int resizePadding = 0;
			if (curLine.resizableCount > 0 && curLine.extraSpace > 0) {
				resizePadding = curLine.extraSpace / curLine.resizableCount;
			}

			// Tile each line
			int tilePosMajor = horizontal ? areaBounds.x : areaBounds.y;
			for (Iterator iter = curLine.controls.iterator(); iter.hasNext();) {
				Control control = (Control) iter.next();
				TrimLayoutData td = (TrimLayoutData) control.getLayoutData();
				Point prefSize = control.computeSize(SWT.DEFAULT, SWT.DEFAULT);

				int major = horizontal ? prefSize.x : prefSize.y;
				int minor = horizontal ? prefSize.y : prefSize.x;

				// Ensure that controls that are too wide for the area get
				// 'clipped'
				if (major > areaMajor) {
					major = areaMajor;
				}

				// If desired, extend the 'minor' size of the control to fill
				// the area
				if ((td.flags & TrimLayoutData.GRAB_EXCESS_MINOR) != 0) {
					minor = curLine.minorMax;
				}

				// If desired, extend the 'major' size of the control to fill
				// the area
				if ((td.flags & TrimLayoutData.GROWABLE) != 0) {
					major += resizePadding;
				}

				// If we have to show a drag handle then do it here
				if (td.listener != null && createHandles()) {
					TrimCommonUIHandle handle = getDragHandle(trimArea.orientation);
					// handle.setControl(control);

					if (horizontal) {
						handle.setBounds(tilePosMajor, tilePosMinor,
								getHandleSize(true), curLine.minorMax);
					} else {
						handle.setBounds(tilePosMinor, tilePosMajor,
								curLine.minorMax, getHandleSize(false));
					}

					tilePosMajor += horizontal ? getHandleSize(true)
							: getHandleSize(false);
				}

				// Now, lay out the actual control
				switch (trimArea.orientation) {
				case SWT.TOP:
					control.setBounds(tilePosMajor, tilePosMinor, major, minor);
					break;
				case SWT.LEFT:
					control.setBounds(tilePosMinor, tilePosMajor, minor, major);
					break;
				case SWT.RIGHT:
					// Here we want to tile the control to the RIGHT edge
					int rightEdge = tilePosMinor + curLine.minorMax;
					control.setBounds(rightEdge - minor, tilePosMajor, minor,
							major);
					break;
				case SWT.BOTTOM:
					// Here we want to tile the control to the RIGHT edge
					int bottomEdge = tilePosMinor + curLine.minorMax;
					control.setBounds(tilePosMajor, bottomEdge - minor, major,
							minor);
					break;
				}

				// Ensure that the control is above the trim control
				tilePosMajor += major + spacing;
			}
			tilePosMinor += curLine.minorMax;
			tilePosMajor = horizontal ? areaBounds.x : areaBounds.y;
		}
	}

	/**
	 * HACK>>>Remove if found in the wild...
	 * @return
	 */
	private boolean createHandles() {
		return false;
	}

	private void resetDragHandles() {
		for (Iterator iter = dragHandles.iterator(); iter.hasNext();) {
			// TrimCommonUIHandle handle = (TrimCommonUIHandle) iter.next();
			// handle.setControl(null);
		}
	}

	private TrimCommonUIHandle getDragHandle(int orientation) {
		// boolean horizontal = orientation == SWT.TOP
		// || orientation == SWT.BOTTOM;

		for (Iterator iter = dragHandles.iterator(); iter.hasNext();) {
			TrimCommonUIHandle handle = (TrimCommonUIHandle) iter.next();
			// if (handle.toDrag == null && handle.horizontal == horizontal)
			return handle;
		}

		// If we get here then we haven't found a new drag handle so create one
		System.out.println("new Handle"); //$NON-NLS-1$
		// TrimCommonUIHandle newHandle = new
		// TrimCommonUIHandle(layoutComposite,
		// horizontal);
		// dragHandles.add(newHandle);
		// return newHandle;
		return null;
	}

	/**
	 * Return the SWT side that the trim area is on
	 * 
	 * @param areaId The id of the area to get the orientation of
	 * 
	 * @return The SWT  side corresponding that the given area
	 */
	public static int getOrientation(String areaId) {
		if (TRIMID_CMD_PRIMARY.equals(areaId)) {
			return SWT.TOP;
		}
		if (TRIMID_CMD_SECONDARY.equals(areaId)) {
			return SWT.TOP;
		}
		if (TRIMID_VERTICAL1.equals(areaId)) {
			return SWT.LEFT;
		}
		if (TRIMID_VERTICAL2.equals(areaId)) {
			return SWT.RIGHT;
		}
		if (TRIMID_STATUS.equals(areaId)) {
			return SWT.BOTTOM;
		}

		return SWT.NONE;
	}

	/**
	 * Calculate a size for the handle that will be large enough to show the
	 * CoolBar's drag affordance.
	 * 
	 * @return The size that the handle has to be, based on the orientation
	 */
	private int getHandleSize(boolean horizontal) {
		// Do we already have a 'cached' value?
		if (horizontal && horizontalHandleSize != -1) {
			return horizontalHandleSize;
		}

		if (!horizontal && verticalHandleSize != -1) {
			return verticalHandleSize;
		}

		// Must be the first time, calculate the value
		CoolBar bar = new CoolBar(layoutComposite, horizontal ? SWT.HORIZONTAL
				: SWT.VERTICAL);

		CoolItem item = new CoolItem(bar, SWT.NONE);

		Label ctrl = new Label(bar, SWT.PUSH);
		ctrl.setText("Button 1"); //$NON-NLS-1$
		Point size = ctrl.computeSize(SWT.DEFAULT, SWT.DEFAULT);

		Point ps = item.computeSize(size.x, size.y);
		item.setPreferredSize(ps);
		item.setControl(ctrl);

		bar.pack();

		// OK, now the difference between the location of the CB and the
		// location of the
		Point bl = ctrl.getLocation();
		Point cl = bar.getLocation();

		// Toss them now...
		ctrl.dispose();
		item.dispose();
		bar.dispose();

		// The 'size' is the difference between the start of teh CoolBar and
		// start of its first control
		int length;
		if (horizontal) {
			length = bl.x - cl.x;
			horizontalHandleSize = length;
		} else {
			length = bl.y - cl.y;
			verticalHandleSize = length;
		}

		return length;
	}

}

Back to the top