⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swtscrolledcomposite.java

📁 一个基于PlaceLab的室内和室外的智能导航系统
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials  * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html *  * Contributors: *     IBM Corporation - initial API and implementation *******************************************************************************//* XXX: (Yatin) I grabbed this file from the swt.custom package because * older versions of swt do not come with it */package org.placelab.util.swt;import org.eclipse.swt.SWT;import org.eclipse.swt.SWTException;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.Event;import org.eclipse.swt.widgets.Layout;import org.eclipse.swt.widgets.Listener;import org.eclipse.swt.widgets.ScrollBar;/** * A ScrolledComposite provides scrollbars and will scroll its content when the user * uses the scrollbars. * * * <p>There are two ways to use the ScrolledComposite: *  * <p> * 1) Set the size of the control that is being scrolled and the ScrolledComposite  * will show scrollbars when the contained control can not be fully seen. *  * 2) The second way imitates the way a browser would work.  Set the minimum size of * the control and the ScrolledComposite will show scroll bars if the visible area is  * less than the minimum size of the control and it will expand the size of the control  * if the visible area is greater than the minimum size.  This requires invoking  * both setMinWidth(), setMinHeight() and setExpandHorizontal(), setExpandVertical(). *  * <code><pre> * public static void main (String [] args) { *      Display display = new Display (); *      Color red = display.getSystemColor(SWT.COLOR_RED); *      Color blue = display.getSystemColor(SWT.COLOR_BLUE); *      Shell shell = new Shell (display); *      shell.setLayout(new FillLayout()); * 	 *      // set the size of the scrolled content - method 1 *      final ScrolledComposite sc1 = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); *      final Composite c1 = new Composite(sc1, SWT.NONE); *      sc1.setContent(c1); *      c1.setBackground(red); *      GridLayout layout = new GridLayout(); *      layout.numColumns = 4; *      c1.setLayout(layout); *      Button b1 = new Button (c1, SWT.PUSH); *      b1.setText("first button"); *      c1.setSize(c1.computeSize(SWT.DEFAULT, SWT.DEFAULT)); *       *      // set the minimum width and height of the scrolled content - method 2 *      final ScrolledComposite sc2 = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); *      sc2.setExpandHorizontal(true); *      sc2.setExpandVertical(true); *      final Composite c2 = new Composite(sc2, SWT.NONE); *      sc2.setContent(c2); *      c2.setBackground(blue); *      layout = new GridLayout(); *      layout.numColumns = 4; *      c2.setLayout(layout); *      Button b2 = new Button (c2, SWT.PUSH); *      b2.setText("first button"); *      sc2.setMinSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT)); *       *      Button add = new Button (shell, SWT.PUSH); *      add.setText("add children"); *      final int[] index = new int[]{0}; *      add.addListener(SWT.Selection, new Listener() { *          public void handleEvent(Event e) { *              index[0]++; *              Button button = new Button(c1, SWT.PUSH); *              button.setText("button "+index[0]); *              // reset size of content so children can be seen - method 1 *              c1.setSize(c1.computeSize(SWT.DEFAULT, SWT.DEFAULT)); *              c1.layout(); *               *              button = new Button(c2, SWT.PUSH); *              button.setText("button "+index[0]); *              // reset the minimum width and height so children can be seen - method 2 *              sc2.setMinSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT)); *              c2.layout(); *          } *      }); *  *      shell.open (); *      while (!shell.isDisposed ()) { *          if (!display.readAndDispatch ()) display.sleep (); *      } *      display.dispose (); * } * </pre></code> * * <dl> * <dt><b>Styles:</b><dd>H_SCROLL, V_SCROLL * </dl> */public class SwtScrolledComposite extends Composite {	private Control content;	private Listener contentListener;		private int minHeight = 0;	private int minWidth = 0;	private boolean expandHorizontal = false;	private boolean expandVertical = false;	private boolean alwaysShowScroll = false;	private boolean inResize = false;/** * Constructs a new instance of this class given its parent * and a style value describing its behavior and appearance. * <p> * The style value is either one of the style constants defined in * 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 * lists the style constants that are applicable to the class. * Style bits are also inherited from superclasses. * </p> * * @param parent a widget which will be the parent of the new instance (cannot be 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> * </ul> * * @see SWT#H_SCROLL * @see SWT#V_SCROLL * @see #getStyle */	public SwtScrolledComposite(Composite parent, int style) {	super(parent, checkStyle(style));		ScrollBar hBar = getHorizontalBar ();	if (hBar != null) {		hBar.addListener (SWT.Selection, new Listener () {			public void handleEvent (Event e) {				hScroll();			}		});	}		ScrollBar vBar = getVerticalBar ();	if (vBar != null) {		vBar.addListener (SWT.Selection, new Listener () {			public void handleEvent (Event e) {				vScroll();			}		});	}		addListener (SWT.Resize,  new Listener () {		public void handleEvent (Event e) {			resize();		}	});		contentListener = new Listener() {		public void handleEvent(Event e) {			if (e.type != SWT.Resize) return;			resize();		}	};}private static int checkStyle (int style) {	int mask = SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;	return style & mask;}public Point computeSize (int wHint, int hHint, boolean changed) {	checkWidget ();	/*	* When a composite does layout without using a layout	* manager, it must take into account the preferred size	* of it's children when computing it's preferred size in	* the same way that a layout manager would.  In particular,	* when a scrolled composite hides the scroll bars and	* places a child to fill the client area, then repeated	* calls to compute the preferred size of the scrolled	* composite should not keep adding in the space used by	* the scroll bars.	*/	if (content == null) {		return super.computeSize (wHint, hHint, changed);	}	Point size = content.computeSize (wHint, hHint, changed);	Rectangle trim = computeTrim (0, 0, size.x, size.y);	return new Point (trim.width, trim.height);}/** * Returns the Always Show Scrollbars flag.  True if the scrollbars are  * always shown even if they are not required.  False if the scrollbars are only  * visible when some part of the composite needs to be scrolled to be seen. * The H_SCROLL and V_SCROLL style bits are also required to enable scrollbars in the  * horizontal and vertical directions. *  * @return the Always Show Scrollbars flag value */public boolean getAlwaysShowScrollBars() {	//checkWidget();	return alwaysShowScroll;}/** * Get the content that is being scrolled. *  * @return the control displayed in the content area */public Control getContent() {	//checkWidget();	return content;}private void hScroll() {	if (content == null) return;	Point location = content.getLocation ();	ScrollBar hBar = getHorizontalBar ();	int hSelection = hBar.getSelection ();	content.setLocation (-hSelection, location.y);}public void layout(boolean changed) {	checkWidget();	if (content == null) return;	Rectangle contentRect = content.getBounds();	ScrollBar hBar = getHorizontalBar ();	ScrollBar vBar = getVerticalBar ();	if (!alwaysShowScroll) {		boolean hVisible = needHScroll(contentRect, false);		boolean vVisible = needVScroll(contentRect, hVisible);		if (!hVisible && vVisible) hVisible = needHScroll(contentRect, vVisible);		if (hBar != null) hBar.setVisible(hVisible);		if (vBar != null) vBar.setVisible(vVisible);	}	Rectangle hostRect = getClientArea();	if (expandHorizontal) {		contentRect.width = Math.max(minWidth, hostRect.width);		}	if (expandVertical) {		contentRect.height = Math.max(minHeight, hostRect.height);	}	if (hBar != null) {		hBar.setMaximum (contentRect.width);		hBar.setThumb (Math.min (contentRect.width, hostRect.width));		int hPage = contentRect.width - hostRect.width;		int hSelection = hBar.getSelection ();		if (hSelection >= hPage) {			if (hPage <= 0) {				hSelection = 0;				hBar.setSelection(0);			}			contentRect.x = -hSelection;		}	}	if (vBar != null) {		vBar.setMaximum (contentRect.height);		vBar.setThumb (Math.min (contentRect.height, hostRect.height));		int vPage = contentRect.height - hostRect.height;		int vSelection = vBar.getSelection ();		if (vSelection >= vPage) {			if (vPage <= 0) {				vSelection = 0;				vBar.setSelection(0);			}			contentRect.y = -vSelection;		}	}		content.setBounds (contentRect);}private boolean needHScroll(Rectangle contentRect, boolean vVisible) {	ScrollBar hBar = getHorizontalBar();	if (hBar == null) return false;	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -