blob: 7d3acf1f3255adffcfd84d602d2ece3580a7289b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2005 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.layout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
/**
* Contains helper methods for CellLayout. Many of these methods are workarounds for
* known SWT bugs. They should be updated once the original bugs are fixed in SWT.
*
* @since 3.0
*/
class CellLayoutUtil {
private static Point zero = new Point(0, 0);
private static Point minimumShellSize;
private static CellData defaultData = new CellData();
/**
* Returns the minimum size for the given composite. That is,
* this returns the smallest values that will have any effect
* when passed into the composite's setSize method. Passing any
* smaller value is equivalent to passing the minimum size.
* <p>
* This method is intended for use by layouts. The layout can
* use this information when determining its preferred size.
* Returning a preferred size smaller than the composite's
* minimum size is pointless since the composite could never
* be set to that size. The layout may choose a different preferred
* size in this situation.
* </p><p>
* Note that this method is only concerned with restrictions imposed
* by the composite; not it's layout. If the only restriction on the
* composite's size is imposed by the layout, then this method returns (0,0).
* </p><p>
* Currently SWT does not expose this information through
* API, so this method is developed using trial-and-error. Whenever
* a composite is discovered that will not accept sizes below
* a certain threshold on some platform, this method should be
* updated to reflect that fact.
* </p><p>
* At this time, the only known composite that has a minimum size
* are Shells.
* </p>
*
* @param toCompute the composite whose minimum size is being computed
* @return a size, in pixels, which is the smallest value that can be
* passed into the composite's setSize(...) method.
*/
static Point computeMinimumSize(Composite toCompute) {
if (toCompute instanceof Shell) {
if (minimumShellSize == null) {
Shell testShell = new Shell((Shell) toCompute, SWT.DIALOG_TRIM
| SWT.RESIZE);
testShell.setSize(0, 0);
minimumShellSize = testShell.getSize();
testShell.dispose();
}
return minimumShellSize;
}
// If any other composites are discovered to have minimum sizes,
// add heuristics for them here.
// Otherwise, the composite can be reduced to size (0,0)
return zero;
}
/**
* Returns the CellData associated with the given control. If the control
* does not have any layout data associated with it, a default object is returned.
* If the control has a GridData object associated with it, an equivalent
* CellData object will be returned.
*
* @param control
* @return
*/
static CellData getData(Control control) {
Object layoutData = control.getLayoutData();
CellData data = null;
if (layoutData instanceof CellData) {
data = (CellData) layoutData;
} else if (layoutData instanceof GridData) {
data = new CellData((GridData) layoutData);
}
if (data == null) {
data = defaultData;
}
return data;
}
}