1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.scenegraph.example;
\r
14 import java.awt.Graphics;
\r
15 import java.awt.Graphics2D;
\r
16 import java.awt.Rectangle;
\r
17 import java.awt.event.FocusEvent;
\r
18 import java.awt.event.FocusListener;
\r
19 import java.awt.event.KeyEvent;
\r
20 import java.awt.event.KeyListener;
\r
21 import java.awt.event.MouseEvent;
\r
22 import java.awt.event.MouseListener;
\r
23 import java.awt.event.MouseMotionListener;
\r
24 import java.awt.event.MouseWheelEvent;
\r
25 import java.awt.event.MouseWheelListener;
\r
26 import java.awt.image.VolatileImage;
\r
28 import javax.swing.JComponent;
\r
30 import org.simantics.scenegraph.g2d.G2DFocusManager;
\r
31 import org.simantics.scenegraph.g2d.G2DSceneGraph;
\r
33 public class SGCanvas extends JComponent implements MouseListener, MouseMotionListener, MouseWheelListener, KeyListener, FocusListener {
\r
37 private static final long serialVersionUID = -7835590396125816119L;
\r
39 private G2DSceneGraph scenegraph = null;
\r
40 private VolatileImage buffer = null;
\r
43 setFocusable(true);
\r
46 public void initListeners() {
\r
47 addKeyListener(this);
\r
48 addMouseWheelListener(this);
\r
49 addMouseListener(this);
\r
50 addMouseMotionListener(this);
\r
51 addFocusListener(this);
\r
55 public void paintComponent(Graphics g) {
\r
56 if (scenegraph == null) return;
\r
57 Graphics2D g2d = (Graphics2D) g;
\r
58 Rectangle b = getBounds();
\r
60 int newWidth = b.width;
\r
61 int newHeight = b.height;
\r
63 if (buffer == null) {
\r
64 buffer = createVolatileImage(newWidth, newHeight);
\r
66 int w = buffer.getWidth();
\r
67 int h = buffer.getHeight();
\r
68 if (w != newWidth || h != newHeight) {
\r
69 buffer = createVolatileImage(newWidth, newHeight);
\r
71 int valid = buffer.validate(g2d.getDeviceConfiguration());
\r
72 if (valid == VolatileImage.IMAGE_INCOMPATIBLE) {
\r
73 buffer = createVolatileImage(newWidth, newHeight);
\r
78 Graphics2D bg = (Graphics2D) buffer.getGraphics();
\r
80 bg.setClip((int)b.getMinX(), (int)b.getMinY(), (int)b.getWidth(), (int)b.getHeight());
\r
81 scenegraph.render(bg);
\r
82 g2d.drawImage(buffer, 0, 0, null);
\r
85 public void setSceneGraph(G2DSceneGraph scenegraph) {
\r
86 this.scenegraph = scenegraph;
\r
87 scenegraph.setRootPane(this);
\r
90 public G2DSceneGraph getSceneGraph() {
\r
95 public void mouseWheelMoved(MouseWheelEvent event) {
\r
96 if(scenegraph != null) {
\r
97 scenegraph.getEventDelegator().mouseWheelMoved(event);
\r
103 public void keyPressed(KeyEvent event) {
\r
104 if(scenegraph != null)
\r
105 scenegraph.getEventDelegator().keyPressed(event);
\r
109 public void keyReleased(KeyEvent event) {
\r
110 if(scenegraph != null)
\r
111 scenegraph.getEventDelegator().keyReleased(event);
\r
115 public void keyTyped(KeyEvent event) {
\r
116 if(scenegraph != null)
\r
117 scenegraph.getEventDelegator().keyTyped(event);
\r
121 public void focusGained(FocusEvent event) {
\r
122 if(scenegraph != null)
\r
123 scenegraph.getEventDelegator().focusGained(event);
\r
127 public void focusLost(FocusEvent event) {
\r
128 if(scenegraph != null)
\r
129 scenegraph.getEventDelegator().focusLost(event);
\r
133 public void mouseClicked(MouseEvent event) {
\r
134 if(scenegraph != null) {
\r
135 scenegraph.getEventDelegator().mouseClicked(event);
\r
141 public void mouseEntered(MouseEvent event) {
\r
142 if(scenegraph != null)
\r
143 scenegraph.getEventDelegator().mouseEntered(event);
\r
147 public void mouseExited(MouseEvent event) {
\r
148 if(scenegraph != null)
\r
149 scenegraph.getEventDelegator().mouseExited(event);
\r
153 public void mousePressed(MouseEvent event) {
\r
154 if(scenegraph != null) {
\r
155 G2DFocusManager.INSTANCE.clearFocus();
\r
156 scenegraph.getEventDelegator().mousePressed(event);
\r
157 if(G2DFocusManager.INSTANCE.getFocusOwner() == null) {
\r
158 this.requestFocusInWindow();
\r
165 public void mouseReleased(MouseEvent event) {
\r
166 if(scenegraph != null)
\r
167 scenegraph.getEventDelegator().mouseReleased(event);
\r
171 public void mouseDragged(MouseEvent event) {
\r
172 if(scenegraph != null) {
\r
173 scenegraph.getEventDelegator().mouseDragged(event);
\r
179 public void mouseMoved(MouseEvent event) {
\r
180 if(scenegraph != null)
\r
181 scenegraph.getEventDelegator().mouseMoved(event);
\r