blob: ac28f8789e1301ae1040696f3cffc32b7e85872b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui;
/**
* Interface implemented by objects that are capable of computing a preferred
* size.
*
* @since 3.1
*/
public interface ISizeProvider {
/**
* Constant used to indicate infinite size. This is equal to Integer.MAX_VALUE, ensuring
* that it is greater than any other integer.
*/
int INFINITE = Integer.MAX_VALUE;
/**
* Returns a bitwise combination of flags indicating how and when computePreferredSize should
* be used. When called with horizontal=true, this indicates the usage of computePreferredSize(true,...)
* for computing widths. When called with horizontal=false, this indicates the usage of computeSize(false,...)
* for computing heights. These flags are used for optimization. Each flag gives the part more control
* over its preferred size but slows down the layout algorithm. Parts should return the minimum set
* of flags necessary to specify their constraints.
* <p>
* If the return value of this function ever changes, the part must call <code>flushLayout</code> before
* the changes will take effect.
* </p>
*
* <ul>
* <li>SWT.MAX: The part has a maximum size that will be returned by computePreferredSize(horizontal,
* INFINITE, someWidth, INFINITE)</li>
* <li>SWT.MIN: The part has a minimum size that will be returned by computePreferredSize(horizontal,
* INFINITE, someWidth, 0)</li>
* <li>SWT.WRAP: Indicates that computePreferredSize makes use of the availablePerpendicular argument. If this
* flag is not specified, then the third argument to computePreferredSize will always be set to
* INFINITE. The perpendicular size is expensive to compute, and it is usually only used
* for wrapping parts.
* <li>SWT.FILL: The part may not return the preferred size verbatim when computePreferredSize is
* is given a value between the minimum and maximum sizes. This is commonly used if the part
* wants to use a set of predetermined sizes instead of using the workbench-provided size.
* For example, computePreferredSize(horizontal, availableSpace, someWidth,
* preferredSize) may return the nearest predetermined size. Note that this flag should
* be used sparingly. It can prevent layout caching and cause the workbench layout algorithm
* to degrade to exponential worst-case runtime. If this flag is omitted, then
* computePreferredSize may be used to compute the minimum and maximum sizes, but not for
* anything in between.</li>
* </ul>
*
* @param width a value of true or false determines whether the return value applies when computing
* widths or heights respectively. That is, getSizeFlags(true) will be used when calling
* computePreferredSize(true,...)
* @return any bitwise combination of SWT.MAX, SWT.MIN, SWT.WRAP, and SWT.FILL
*/
int getSizeFlags(boolean width);
/**
* <p>
* Returns the best size for this part, given the available width and height and
* the workbench's preferred size for the part. Parts can overload this to
* enforce a minimum size, maximum size, or a quantized set of preferred sizes.
* If width == true, this method computes a width in pixels. If width == false,
* this method computes a height. availableParallel and availablePerpendicular
* contain the space available, and preferredParallel contains the preferred
* result.
* </p>
*
* <p>
* This method returns an answer that is less than or equal to availableParallel
* and as close to preferredParallel as possible. Return values larger than
* availableParallel will be truncated.
* </p>
*
* <p>
* Most presentations will define a minimum size at all times, and a maximum
* size that only applies when maximized.
* </p>
*
* <p>
* The getSizeFlags method controls how frequently this method will be called
* and what information will be available when it is. Any subclass that
* specializes this method should also specialize getSizeFlags.
* computePreferredSize(width, INFINITE, someSize, 0) returns the minimum size
* of the control (if any). computePreferredSize(width, INFINITE, someSize,
* INFINITE) returns the maximum size of the control.
* </p>
*
* <p>
* Examples:
* </p>
* <ul>
* <li>To maintain a constant size of 100x300 pixels: {return width ? 100 :
* 300}, getSizeFlags(boolean) must return SWT.MIN | SWT.MAX</li>
* <li>To grow without constraints: {return preferredResult;},
* getSizeFlags(boolean) must return 0.</li>
* <li>To enforce a width that is always a multiple of 100 pixels, to a minimum
* of 100 pixels:
*
* <pre>
* <code>
* {
* if (width && preferredResult != INFINITE) {
* int result = preferredResult - ((preferredResult + 50) % 100) + 50;
* result = Math.max(100, Math.min(result, availableParallel - (availableParallel % 100)));
*
* return result;
* }
* return preferredResult;
* }
* </code>
* </pre>
*
* In this case, getSizeFlags(boolean width) must return (width ? SWT.FILL |
* SWT.MIN: 0)</li>
* <li>To maintain a minimum area of 100000 pixels: <code>
* {return availablePerpendicular < 100 ? 1000 : 100000 / availablePerpendicular;}
* </code> getSizeFlags(boolean width) must return SWT.WRAP | SWT.MIN;</li>
* </ul>
*
* @param width indicates whether a width (if
* <code>true</code>) or a height (if
* <code>false</code>) is being computed
* @param availableParallel available space. This is a width (pixels) if
* width == true, and a height (pixels) if width
* == false. A return value larger than this will
* be ignored.
* @param availablePerpendicular available space perpendicular to the direction
* being measured or INFINITE if unbounded
* (pixels). This is a height if width == true, or
* a height if width == false. Implementations
* will generally ignore this argument unless they
* contain wrapping widgets. Note this argument
* will only contain meaningful information if the
* part returns the SWT.WRAP flag from
* getSizeFlags(width)
* @param preferredResult preferred size of the control (pixels, <=
* availableParallel). Set to INFINITE if unknown
* or unbounded.
* @return returns the preferred size of the control (pixels). This is a width
* if width == true or a height if width == false. Callers are
* responsible for rounding down the return value if it is larger than
* availableParallel. If availableParallel is INFINITE, then a return
* value of INFINITE is permitted, indicating that the preferred size of
* the control is unbounded.
*
* @see ISizeProvider#getSizeFlags(boolean)
*/
int computePreferredSize(boolean width, int availableParallel, int availablePerpendicular, int preferredResult);
}