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

📄 paintsurface.java

📁 eclipse 的程序源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************* * Copyright (c) 2000, 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.swt.examples.paint;import org.eclipse.swt.events.*;import org.eclipse.swt.graphics.*;import org.eclipse.swt.widgets.*;/** * Manages a simple drawing surface. */public class PaintSurface {	private Point currentPosition = new Point(0, 0);	private Canvas paintCanvas;	private PaintSession paintSession;	private Image image;	private Image paintImage; // buffer for refresh blits	private int   imageWidth, imageHeight;	private int   visibleWidth, visibleHeight;	private FigureDrawContext displayFDC = new FigureDrawContext();	private FigureDrawContext imageFDC = new FigureDrawContext();	private FigureDrawContext paintFDC = new FigureDrawContext();	/* Rubberband */	private ContainerFigure rubberband = new ContainerFigure();		// the active rubberband selection	private int rubberbandHiddenNestingCount = 0;		// always >= 0, if > 0 rubberband has been hidden	/* Status */	private Text statusText;	private String statusActionInfo, statusMessageInfo, statusCoordInfo;	/**	 * Constructs a PaintSurface.	 * <p>	 * paintCanvas must have SWT.NO_REDRAW_RESIZE and SWT.NO_BACKGROUND styles,	 *     and may have SWT.V_SCROLL and/or SWT.H_SCROLL.	 * </p>	 * @param paintCanvas the Canvas object in which to render	 * @param paintStatus the PaintStatus object to use for providing user feedback	 * @param fillColor the color to fill the canvas with initially	 */	public PaintSurface(Canvas paintCanvas, Text statusText, Color fillColor) {		this.paintCanvas = paintCanvas;		this.statusText = statusText;		clearStatus();		/* Set up the drawing surface */		Rectangle displayRect = paintCanvas.getDisplay().getClientArea();		imageWidth = displayRect.width;		imageHeight = displayRect.height;		image = new Image(paintCanvas.getDisplay(), imageWidth, imageHeight);		imageFDC.gc = new GC(image);		imageFDC.gc.setBackground(fillColor);		imageFDC.gc.fillRectangle(0, 0, imageWidth, imageHeight);		displayFDC.gc = new GC(paintCanvas);		/* Initialize the session */		setPaintSession(null);		/* Add our listeners */		paintCanvas.addDisposeListener(new DisposeListener() {			public void widgetDisposed(DisposeEvent e) {				displayFDC.gc.dispose();			}					});		paintCanvas.addMouseListener(new MouseAdapter() {			public void mouseDown(MouseEvent event) {				processMouseEventCoordinates(event);				if (paintSession != null) paintSession.mouseDown(event);			}			public void mouseUp(MouseEvent event) {				processMouseEventCoordinates(event);				if (paintSession != null) paintSession.mouseUp(event);			}			public void mouseDoubleClick(MouseEvent event) {				processMouseEventCoordinates(event);				if (paintSession != null) paintSession.mouseDoubleClick(event);			}					});		paintCanvas.addMouseMoveListener(new MouseMoveListener() {			public void mouseMove(MouseEvent event) {				processMouseEventCoordinates(event);				if (paintSession != null) paintSession.mouseMove(event);			}		});		paintCanvas.addPaintListener(new PaintListener() {			public void paintControl(PaintEvent event) {				if (rubberband.isEmpty()) {					// Nothing to merge, so we just refresh					event.gc.drawImage(image,						displayFDC.xOffset + event.x, displayFDC.yOffset + event.y, event.width, event.height,						event.x, event.y, event.width, event.height);				} else {					/*					 * Avoid flicker when merging overlayed objects by constructing the image on					 * a backbuffer first, then blitting it to the screen.					 */					// Check that the backbuffer is large enough					if (paintImage != null) {						Rectangle rect = paintImage.getBounds();						if ((event.width + event.x > rect.width) ||							(event.height + event.y > rect.height)) {							paintFDC.gc.dispose();							paintImage.dispose();							paintImage = null;						}					}					if (paintImage == null) {						Display display = getDisplay();						Rectangle rect = display.getClientArea();						paintImage = new Image(display,							Math.max(rect.width, event.width + event.x),							Math.max(rect.height, event.height + event.y));						paintFDC.gc = new GC(paintImage);					}					// Setup clipping and the FDC					Region clipRegion = new Region();					event.gc.getClipping(clipRegion);										paintFDC.gc.setClipping(clipRegion);					clipRegion.dispose();					paintFDC.xOffset = displayFDC.xOffset;					paintFDC.yOffset = displayFDC.yOffset;					paintFDC.xScale = displayFDC.xScale;					paintFDC.yScale = displayFDC.yScale;										// Merge the overlayed objects into the image, then blit					paintFDC.gc.drawImage(image,						displayFDC.xOffset + event.x, displayFDC.yOffset + event.y, event.width, event.height,						event.x, event.y, event.width, event.height);					rubberband.draw(paintFDC);					event.gc.drawImage(paintImage,						event.x, event.y, event.width, event.height,						event.x, event.y, event.width, event.height);				}			}		});		paintCanvas.addControlListener(new ControlAdapter() {			public void controlResized(ControlEvent event) {				handleResize();			}					});		/* Set up the paint canvas scroll bars */		ScrollBar horizontal = paintCanvas.getHorizontalBar();		horizontal.setVisible(true);		horizontal.addSelectionListener(new SelectionAdapter() {			public void widgetSelected(SelectionEvent event) {				scrollHorizontally((ScrollBar)event.widget);			}		});		ScrollBar vertical = paintCanvas.getVerticalBar();		vertical.setVisible(true);		vertical.addSelectionListener(new SelectionAdapter() {			public void widgetSelected(SelectionEvent event) {				scrollVertically((ScrollBar)event.widget);			}		});		handleResize();	}		/**	 * Disposes of the PaintSurface's resources.	 */	public void dispose() {		imageFDC.gc.dispose();		image.dispose();		if (paintImage != null) {			paintImage.dispose();			paintFDC.gc.dispose();		}		currentPosition = null;		paintCanvas = null;		paintSession = null;		image = null;		paintImage = null;		displayFDC = null;		imageFDC = null;		paintFDC = null;		rubberband = null;		statusText = null;		statusActionInfo = null;		statusMessageInfo = null;		statusCoordInfo = null;	}	/**	 * Called when we must grab focus.	 */	public void setFocus()  {		paintCanvas.setFocus();	}	/**	 * Returns the Display on which the PaintSurface resides.	 * @return the Display	 */	public Display getDisplay() {		return paintCanvas.getDisplay();	}	/**	 * Returns the Shell in which the PaintSurface resides.	 * @return the Shell	 */	public Shell getShell() {		return paintCanvas.getShell();	}	/**	 * Sets the current paint session.	 * <p>	 * If oldPaintSession != paintSession calls oldPaintSession.end()	 * and paintSession.begin()	 * </p>	 * 	 * @param paintSession the paint session to activate; null to disable all sessions	 */	public void setPaintSession(PaintSession paintSession) {		if (this.paintSession != null) {			if (this.paintSession == paintSession) return;			this.paintSession.endSession();		}		this.paintSession = paintSession;		clearStatus();		if (paintSession != null) {			setStatusAction(paintSession.getDisplayName());			paintSession.beginSession();		} else {			setStatusAction(PaintExample.getResourceString("tool.Null.label"));			setStatusMessage(PaintExample.getResourceString("session.Null.message"));		}	}	/**	 * Returns the current paint session.	 * 	 * @return the current paint session, null if none is active	 */	public PaintSession getPaintSession() {		return paintSession;	}	/**	 * Returns the current paint tool.	 * 	 * @return the current paint tool, null if none is active (though some other session

⌨️ 快捷键说明

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