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

📄 ctabitem.java

📁 源码为Eclipse开源开发平台桌面开发工具SWT的源代码,
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************* * Copyright (c) 2000, 2004 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 *******************************************************************************/package org.eclipse.swt.custom;import org.eclipse.swt.*;import org.eclipse.swt.graphics.*;import org.eclipse.swt.widgets.*;/** * Instances of this class represent a selectable user interface object * that represent a page in a notebook widget. *  * <dl> * <dt><b>Styles:</b></dt> * <dd>SWT.CLOSE</dd> * <dt><b>Events:</b></dt> * <dd>(none)</dd> * </dl> * <p> * IMPORTANT: This class is <em>not</em> intended to be subclassed. * </p> */public class CTabItem extends Item {	CTabFolder parent;	int x,y,width,height = 0;	Control control; // the tab page		String toolTipText;	String shortenedText;	int shortenedTextWidth;		// Appearance	Font font;	Image disabledImage; 		Rectangle closeRect = new Rectangle(0, 0, 0, 0);	int closeImageState = CTabFolder.NONE;	boolean showClose = false;	// internal constants	static final int TOP_MARGIN = 2;	static final int BOTTOM_MARGIN = 2;	static final int LEFT_MARGIN = 4;	static final int RIGHT_MARGIN = 4;	static final int INTERNAL_SPACING = 2;	static final int FLAGS = SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC;	static final String ELLIPSIS = "..."; //$NON-NLS-1$ // could use the ellipsis glyph on some platforms "\u2026"	/** * Constructs a new instance of this class given its parent * (which must be a <code>CTabFolder</code>) and a style value * describing its behavior and appearance. The item is added * to the end of the items maintained by its parent. * <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 CTabFolder which will be the parent of the new instance (cannot be null) * @param style the style of control 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 * @see Widget#getStyle() */public CTabItem (CTabFolder parent, int style) {	this(parent, style, parent.getItemCount());}/** * Constructs a new instance of this class given its parent * (which must be a <code>CTabFolder</code>), a style value * describing its behavior and appearance, and the index * at which to place it in the items maintained by its parent. * <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 CTabFolder which will be the parent of the new instance (cannot be null) * @param style the style of control to construct * @param index the index to store the receiver in its parent * * @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 * @see Widget#getStyle() */public CTabItem (CTabFolder parent, int style, int index) {	super (parent, checkStyle(style));	showClose = (style & SWT.CLOSE) != 0;	parent.createItem (this, index);}static int checkStyle(int style) {	return SWT.NONE;}static String shortenText(GC gc, String text, int width) {	if (gc.textExtent(text, FLAGS).x <= width) return text;	int ellipseWidth = gc.textExtent(ELLIPSIS, FLAGS).x;	int length = text.length();	int end = length - 1;	while (end > 0) {		text = text.substring(0, end);		int l = gc.textExtent(text, FLAGS).x;		if (l + ellipseWidth <= width) {			return text + ELLIPSIS;		}		end--;	}	return text.substring(0,1);}public void dispose() {	if (isDisposed ()) return;	//if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);	parent.destroyItem(this);	super.dispose();	parent = null;	control = null;	toolTipText = null;	shortenedText = null;	font = null;}void drawClose(GC gc) {	if (closeRect.width == 0 || closeRect.height == 0) return;	Display display = getDisplay();	// draw X 9x9	int indent = Math.max(1, (CTabFolder.BUTTON_SIZE-9)/2);	int x = closeRect.x + indent;	int y = closeRect.y + indent;	y += parent.onBottom ? -1 : 1;		Color closeBorder = display.getSystemColor(CTabFolder.BUTTON_BORDER);	switch (closeImageState) {		case CTabFolder.NORMAL: {			int[] shape = new int[] {x,y, x+2,y, x+4,y+2, x+5,y+2, x+7,y, x+9,y, 					                 x+9,y+2, x+7,y+4, x+7,y+5, x+9,y+7, x+9,y+9,			                         x+7,y+9, x+5,y+7, x+4,y+7, x+2,y+9, x,y+9,			                         x,y+7, x+2,y+5, x+2,y+4, x,y+2};			gc.setBackground(display.getSystemColor(CTabFolder.BUTTON_FILL));			gc.fillPolygon(shape);			gc.setForeground(closeBorder);			gc.drawPolygon(shape);			break;		}		case CTabFolder.HOT: {			int[] shape = new int[] {x,y, x+2,y, x+4,y+2, x+5,y+2, x+7,y, x+9,y, 					                 x+9,y+2, x+7,y+4, x+7,y+5, x+9,y+7, x+9,y+9,			                         x+7,y+9, x+5,y+7, x+4,y+7, x+2,y+9, x,y+9,			                         x,y+7, x+2,y+5, x+2,y+4, x,y+2};			Color fill = new Color(display, CTabFolder.CLOSE_FILL);			gc.setBackground(fill);			gc.fillPolygon(shape);			fill.dispose();			gc.setForeground(closeBorder);			gc.drawPolygon(shape);			break;		}		case CTabFolder.SELECTED: {			int[] shape = new int[] {x+1,y+1, x+3,y+1, x+5,y+3, x+6,y+3, x+8,y+1, x+10,y+1, 					                 x+10,y+3, x+8,y+5, x+8,y+6, x+10,y+8, x+10,y+10,			                         x+8,y+10, x+6,y+8, x+5,y+8, x+3,y+10, x+1,y+10,			                         x+1,y+8, x+3,y+6, x+3,y+5, x+1,y+3};			Color fill = new Color(display, CTabFolder.CLOSE_FILL);			gc.setBackground(fill);			gc.fillPolygon(shape);			fill.dispose();			gc.setForeground(closeBorder);			gc.drawPolygon(shape);			break;		}		case CTabFolder.NONE: {			int[] shape = new int[] {x,y, x+10,y, x+10,y+10, x,y+10};			if (parent.gradientColors != null && !parent.gradientVertical) {				parent.drawBackground(gc, shape, false);			} else {				Color defaultBackground = parent.getBackground();				Image image = parent.bgImage;				Color[] colors = parent.gradientColors;				int[] percents = parent.gradientPercents;				boolean vertical = parent.gradientVertical; 				parent.drawBackground(gc, shape, x, y, 10, 10, defaultBackground, image, colors, percents, vertical);			}			break;		}	}}void drawSelected(GC gc ) {	Point size = parent.getSize();	int rightEdge = Math.min (x + width, parent.getRightItemEdge());		//	 Draw selection border across all tabs	int xx = parent.borderLeft;	int yy = parent.onBottom ? size.y - parent.borderBottom - parent.tabHeight - parent.highlight_header : parent.borderTop + parent.tabHeight + 1;	int ww = size.x - parent.borderLeft - parent.borderRight;	int hh = parent.highlight_header - 1;	int[] shape = new int[] {xx,yy, xx+ww,yy, xx+ww,yy+hh, xx,yy+hh};	if (parent.selectionGradientColors != null && !parent.selectionGradientVertical) {		parent.drawBackground(gc, shape, true);	} else {		gc.setBackground(parent.selectionBackground);		gc.fillRectangle(xx, yy, ww, hh);	}		if (parent.single) {		if (!isShowing()) return;	} else {		// if selected tab scrolled out of view or partially out of view		// just draw bottom line		if (!isShowing()){			int x1 = Math.max(0, parent.borderLeft - 1);			int y1 = (parent.onBottom) ? y - 1 : y + height;			int x2 = size.x - parent.borderRight;			gc.setForeground(CTabFolder.borderColor);			gc.drawLine(x1, y1, x2, y1);			return;		}					// draw selected tab background and outline		shape = null;		if (this.parent.onBottom) {			int[] left = parent.simple ? CTabFolder.SIMPLE_BOTTOM_LEFT_CORNER : CTabFolder.BOTTOM_LEFT_CORNER;			int[] right = parent.simple ? CTabFolder.SIMPLE_BOTTOM_RIGHT_CORNER : parent.curve;			if (parent.borderLeft == 0 && parent.indexOf(this) == parent.firstIndex) {				left = new int[]{x, y+height};			}			shape = new int[left.length+right.length+8];			int index = 0;			shape[index++] = x; // first point repeated here because below we reuse shape to draw outline			shape[index++] = y - 1;			shape[index++] = x;			shape[index++] = y - 1;			for (int i = 0; i < left.length/2; i++) {				shape[index++] = x + left[2*i];				shape[index++] = y + height + left[2*i+1] - 1;			}			for (int i = 0; i < right.length/2; i++) {				shape[index++] = parent.simple ? rightEdge - 1 + right[2*i] : rightEdge - parent.curveIndent + right[2*i];				shape[index++] = parent.simple ? y + height + right[2*i+1] - 1 : y + right[2*i+1] - 2;			}			shape[index++] = parent.simple ? rightEdge - 1 : rightEdge + parent.curveWidth - parent.curveIndent;			shape[index++] = y - 1;			shape[index++] = parent.simple ? rightEdge - 1 : rightEdge + parent.curveWidth - parent.curveIndent;			shape[index++] = y - 1;		} else {			int[] left = parent.simple ? CTabFolder.SIMPLE_TOP_LEFT_CORNER : CTabFolder.TOP_LEFT_CORNER;			int[] right = parent.simple ? CTabFolder.SIMPLE_TOP_RIGHT_CORNER : parent.curve;			if (parent.borderLeft == 0 && parent.indexOf(this) == parent.firstIndex) {				left = new int[]{x, y};			}			shape = new int[left.length+right.length+8];			int index = 0;			shape[index++] = x; // first point repeated here because below we reuse shape to draw outline			shape[index++] = y + height + 1;			shape[index++] = x;			shape[index++] = y + height + 1;			for (int i = 0; i < left.length/2; i++) {				shape[index++] = x + left[2*i];				shape[index++] = y + left[2*i+1];			}			for (int i = 0; i < right.length/2; i++) {				shape[index++] = parent.simple ? rightEdge - 1 + right[2*i] : rightEdge - parent.curveIndent + right[2*i];				shape[index++] = y + right[2*i+1];			}			shape[index++] = parent.simple ? rightEdge - 1 : rightEdge + parent.curveWidth - parent.curveIndent;			shape[index++] = y + height + 1;			shape[index++] = parent.simple ? rightEdge - 1 : rightEdge + parent.curveWidth - parent.curveIndent;			shape[index++] = y + height + 1;		}				Rectangle clipping = gc.getClipping();		Rectangle bounds = getBounds();		bounds.height += 1;		if (parent.onBottom) bounds.y -= 1;		boolean tabInPaint = clipping.intersects(bounds);				if (tabInPaint) {			// fill in tab background			if (parent.selectionGradientColors != null && !parent.selectionGradientVertical) {				parent.drawBackground(gc, shape, true);			} else {				Color defaultBackground = parent.selectionBackground;				Image image = parent.selectionBgImage;				Color[] colors = parent.selectionGradientColors;				int[] percents = parent.selectionGradientPercents;				boolean vertical = parent.selectionGradientVertical;				xx = x;				yy = parent.onBottom ? y -1 : y + 1;				ww = width;				hh = height;				if (!parent.single && !parent.simple) ww += parent.curveWidth - parent.curveIndent;				parent.drawBackground(gc, shape, xx, yy, ww, hh, defaultBackground, image, colors, percents, vertical);			}		}				// draw outline		shape[0] = Math.max(0, parent.borderLeft - 1);		if (parent.borderLeft == 0 && parent.indexOf(this) == parent.firstIndex) {			shape[1] = parent.onBottom ? y + height - 1 : y; 			shape[5] = shape[3] = shape[1];		}		shape[shape.length - 2] = size.x - parent.borderRight + 1;		for (int i = 0; i < shape.length/2; i++) {			if (shape[2*i + 1] == y + height + 1) shape[2*i + 1] -= 1;		}		RGB inside = parent.selectionBackground.getRGB();		if (parent.selectionBgImage != null || 		    (parent.selectionGradientColors != null && parent.selectionGradientColors.length > 1)) {		    inside = null;		}		RGB outside = parent.getBackground().getRGB();				if (parent.bgImage != null || 		    (parent.gradientColors != null && parent.gradientColors.length > 1)) {		    outside = null;		}		parent.antialias(shape, CTabFolder.borderColor.getRGB(), inside, outside, gc);		gc.setForeground(CTabFolder.borderColor);		gc.drawPolyline(shape);				if (!tabInPaint) return;	}		// draw Image	int xDraw = x + LEFT_MARGIN;	if (parent.single && (parent.showClose || showClose)) xDraw += CTabFolder.BUTTON_SIZE; 	Image image = getImage();	if (image != null) {		Rectangle imageBounds = image.getBounds();		// only draw image if it won't overlap with close button		int maxImageWidth = rightEdge - xDraw - RIGHT_MARGIN;		if (!parent.single && closeRect.width > 0) maxImageWidth -= closeRect.width + INTERNAL_SPACING;		if (imageBounds.width < maxImageWidth) {			int imageX = xDraw;			int imageHeight = imageBounds.height;			int imageY = y + (height - imageHeight) / 2;			imageY += parent.onBottom ? -1 : 1;			int imageWidth = imageBounds.width * imageHeight / imageBounds.height;			gc.drawImage(image, 				         imageBounds.x, imageBounds.y, imageBounds.width, imageBounds.height,				         imageX, imageY, imageWidth, imageHeight);			xDraw += imageWidth + INTERNAL_SPACING;		}	}		// draw Text	int textWidth = rightEdge - xDraw - RIGHT_MARGIN;	if (!parent.single && closeRect.width > 0) textWidth -= closeRect.width + INTERNAL_SPACING;	if (textWidth > 0) {		Font gcFont = gc.getFont();		gc.setFont(font == null ? parent.getFont() : font);				if (shortenedText == null || shortenedTextWidth != textWidth) {			shortenedText = shortenText(gc, getText(), textWidth);			shortenedTextWidth = textWidth;		}		Point extent = gc.textExtent(shortenedText, FLAGS);			int textY = y + (height - extent.y) / 2;		textY += parent.onBottom ? -1 : 1;				gc.setForeground(parent.selectionForeground);

⌨️ 快捷键说明

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