?? ctabitem.java
字號:
/******************************************************************************* * 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 + -