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