blob: ea94304da62fda0b8c5988c0cbe3e4d7c801f7c6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Google, Inc.
* 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:
* Google, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.wb.core.controls;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
/**
* Instances of the class <code>SelfOrientingSashForm</code> implement a sash form that will
* automatically reset its orientation based on the relationship between the width and height of the
* client area. This is done so that the sash form can be placed in a view that will sometimes be
* tall and narrow and sometimes be short and wide and still lay out its children in a pleasing way.
* <p>
*
* @author unknown
* @author Brian Wilkerson
* @version $Revision: 1.2 $
* @coverage core.control
*/
public class SelfOrientingSashForm extends SashForm {
////////////////////////////////////////////////////////////////////////////
//
// Constructors
//
////////////////////////////////////////////////////////////////////////////
/**
* Initialize a newly created control to have the given parent and style. The style describes the
* behavior and appearance of this control.
* <p>
* The style value is either one of the style constants defined in the class <code>SWT</code>
* which is applicable to instances of this class, or must be built by <em>bitwise OR</em>'ing
* together (that is, using the <code>int</code> "|" operator) two or more of those
* <code>SWT</code> style constants. The class description for all SWT widget classes should
* include a comment which describes the style constants which are applicable to the class.
* </p>
*
* @param parent
* a widget which will be the parent of the new instance (not null)
* @param style
* the style of widget to construct
*
* @exception IllegalArgumentException
* <ul>
* <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
* </ul>
* @exception SWTException
* <ul>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the
* parent</li>
* <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
* </ul>
*/
public SelfOrientingSashForm(Composite parent, int style) {
super(parent, style);
}
////////////////////////////////////////////////////////////////////////////
//
// Layout
//
////////////////////////////////////////////////////////////////////////////
/**
* Returns SWT.HORIZONTAL if the controls in the SashForm are laid out side by side or
* SWT.VERTICAL if the controls in the SashForm are laid out top to bottom.
*
* @return SWT.HORIZONTAL or SWT.VERTICAL
*/
@Override
public int getOrientation() {
int currentOrientation = super.getOrientation();
if (inSetOrientation) {
return currentOrientation;
}
int preferredOrientation = isDisposed() ? currentOrientation : getPreferredOrientation();
if (currentOrientation != preferredOrientation) {
setOrientation(preferredOrientation);
}
return preferredOrientation;
}
boolean inSetOrientation = false;
@Override
public void setOrientation(int orientation) {
if (inSetOrientation) {
return;
}
inSetOrientation = true;
super.setOrientation(orientation);
inSetOrientation = false;
}
/**
* If the receiver has a layout, ask the layout to <em>lay out</em> (that is, set the size and
* location of) the receiver's children. If the argument is <code>true</code> the layout must not
* rely on any cached information it is keeping about the children. If it is <code>false</code>
* the layout may (potentially) simplify the work it is doing by assuming that the state of the
* none of the receiver's children has changed since the last layout. If the receiver does not
* have a layout, do nothing.
*
* @param changed
* <code>true</code> if the layout must flush its caches, and <code>false</code>
* otherwise
*
* @exception SWTException
* <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the
* receiver</li>
* </ul>
*/
@Override
public void layout(boolean changed) {
Rectangle area;
int oldOrientation, newOrientation;
area = getClientArea();
if (area.width > 0 && area.height > 0) {
oldOrientation = super.getOrientation();
newOrientation = SWT.HORIZONTAL;
if (area.width < area.height) {
newOrientation = SWT.VERTICAL;
}
if (newOrientation != oldOrientation) {
setOrientation(newOrientation);
changed = true;
}
}
super.layout(changed);
}
private int getPreferredOrientation() {
Rectangle area = getClientArea();
if (area.width > 0 && area.height > 0 && area.width < area.height) {
return SWT.VERTICAL;
}
return SWT.HORIZONTAL;
}
}