-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-/*\r
- *\r
- * @author Toni Kalajainen\r
- */\r
-package org.simantics.g2d.chassis;\r
-\r
-import java.awt.AWTException;\r
-import java.awt.BufferCapabilities;\r
-import java.awt.Component;\r
-import java.awt.Cursor;\r
-import java.awt.DisplayMode;\r
-import java.awt.Frame;\r
-import java.awt.Graphics;\r
-import java.awt.Graphics2D;\r
-import java.awt.GraphicsConfiguration;\r
-import java.awt.GraphicsDevice;\r
-import java.awt.GraphicsEnvironment;\r
-import java.awt.ImageCapabilities;\r
-import java.awt.event.KeyAdapter;\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.KeyListener;\r
-import java.awt.event.WindowAdapter;\r
-import java.awt.event.WindowEvent;\r
-import java.awt.geom.Rectangle2D;\r
-import java.awt.image.BufferStrategy;\r
-import java.lang.reflect.Method;\r
-\r
-import org.simantics.g2d.canvas.ICanvasContext;\r
-import org.simantics.g2d.canvas.IContentContext;\r
-import org.simantics.g2d.canvas.IMouseCursorContext;\r
-import org.simantics.g2d.canvas.IMouseCursorListener;\r
-import org.simantics.g2d.canvas.IContentContext.IContentListener;\r
-import org.simantics.g2d.dnd.DragInteractor;\r
-import org.simantics.g2d.dnd.DropInteractor;\r
-import org.simantics.g2d.participant.RenderingQualityInteractor;\r
-import org.simantics.g2d.participant.TransformUtil;\r
-import org.simantics.scenegraph.g2d.G2DRenderingHints;\r
-import org.simantics.scenegraph.g2d.events.adapter.AWTFocusAdapter;\r
-import org.simantics.scenegraph.g2d.events.adapter.AWTKeyEventAdapter;\r
-import org.simantics.scenegraph.g2d.events.adapter.AWTMouseEventAdapter;\r
-import org.simantics.utils.threads.AWTThread;\r
-import org.simantics.utils.threads.Executable;\r
-import org.simantics.utils.threads.SyncListenerList;\r
-import org.simantics.utils.threads.ThreadUtils;\r
-\r
-\r
-/**\r
- * Full screen AWT Frame chassis for canvas editors.\r
- */\r
-public class FullscreenChassis extends AbstractChassis implements ICanvasChassis {\r
-\r
- protected Frame frame;\r
-\r
- protected java.awt.Canvas canvas;\r
-\r
- protected BufferStrategy bufferStrategy;\r
-\r
- protected Graphics2D g2d;\r
-\r
- protected TransformUtil viewboxInteractor;\r
-\r
- protected AWTMouseEventAdapter mouseAdapter;\r
- protected AWTFocusAdapter focusAdapter;\r
- protected AWTKeyEventAdapter keyAdapter;\r
-\r
- transient boolean dirty = false;\r
-\r
- KeyListener escapeListener = new KeyAdapter() {\r
- @Override\r
- public void keyPressed(KeyEvent e) {\r
- if (e.getKeyCode() == KeyEvent.VK_ESCAPE)\r
- frame.dispose();\r
- }\r
- };\r
-\r
- /**\r
- * Create full screen chassis in default monitor.\r
- * <p>\r
- * This constructor must be ran in AWT Thread.\r
- * \r
- * @param canvasContext\r
- * @param windowTitle\r
- * @param ruler\r
- */\r
- public FullscreenChassis(String windowTitle, boolean ruler) {\r
- this(GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(), windowTitle, ruler);\r
- }\r
-\r
- public void redraw() {\r
- canvas.repaint();\r
- }\r
-\r
- /**\r
- * Create full screen chassis.\r
- * <p>\r
- * This constructor must be ran in AWT Thread.\r
- * \r
- * @param monitor the monitor device\r
- * @param canvasContext\r
- * @param windowTitle\r
- * @param ruler\r
- */\r
- public FullscreenChassis(GraphicsDevice monitor, String windowTitle, boolean ruler) {\r
- DisplayMode dm = monitor.getDisplayMode();\r
-\r
- frame = new Frame(windowTitle);\r
- frame.setSize(dm.getWidth(), dm.getHeight());\r
- frame.setUndecorated(true);\r
-\r
- // Close click\r
- frame.addWindowListener(new WindowAdapter() {\r
- @Override\r
- public void windowClosing(WindowEvent e) {\r
- frame.dispose();\r
- }\r
-\r
- @Override\r
- public void windowClosed(WindowEvent e) {\r
- if (g2d!=null) {\r
- g2d.dispose();\r
- g2d = null;\r
- }\r
- fireChassisClosed();\r
- }\r
- });\r
-\r
- canvas = new java.awt.Canvas() {\r
- private static final long serialVersionUID = -3520733232931837755L;\r
-\r
- @Override\r
- public void paint(Graphics g) {\r
- if (bufferStrategy==null)\r
- {\r
- BufferCapabilities caps = new BufferCapabilities(new ImageCapabilities(true),\r
- new ImageCapabilities(true), BufferCapabilities.FlipContents.COPIED);\r
- try {\r
- canvas.createBufferStrategy(2, caps);\r
- } catch (AWTException e) {\r
- canvas.createBufferStrategy(2);\r
- }\r
- bufferStrategy = canvas.getBufferStrategy();\r
- }\r
- if (g2d!=null && bufferStrategy.contentsLost()) {\r
- g2d.dispose();\r
- g2d = null;\r
- }\r
- if (g2d==null)\r
- g2d = (Graphics2D) bufferStrategy.getDrawGraphics();\r
- paintCanvas(g2d);\r
- bufferStrategy.show();\r
- }\r
-\r
- @Override\r
- public void update(Graphics g) {\r
- paint(g);\r
- }\r
- };\r
-\r
-\r
- // Esc listener\r
- canvas.addKeyListener(escapeListener);\r
- frame.addKeyListener(escapeListener);\r
-\r
- //monitor.setFullScreenWindow(frame);\r
-\r
- frame.add(canvas);\r
-\r
- frame.invalidate();\r
- java.awt.Rectangle awtBounds = monitor.getDefaultConfiguration().getBounds();\r
- frame.setBounds(awtBounds);\r
- frame.setAlwaysOnTop(true);\r
- frame.setVisible(true);\r
-\r
-\r
- }\r
-\r
- @Override\r
- public void setCanvasContext(ICanvasContext canvasContext) {\r
- super.setCanvasContext(canvasContext);\r
-\r
- // quality interactor\r
- RenderingQualityInteractor rq = new RenderingQualityInteractor();\r
- canvasContext.add(rq);\r
-\r
- // Set bridge for mouse cursor changing\r
- IMouseCursorContext mctx = canvasContext.getMouseCursorContext();\r
- mctx.addCursorListener(new IMouseCursorListener() {\r
- @Override\r
- public void onCursorSet(IMouseCursorContext sender, int mouseId, Cursor cursor) {\r
- if (mouseId!=0) return;\r
- canvas.setCursor(cursor);\r
- }}, AWTThread.getThreadAccess());\r
-\r
-\r
- // drop interactor\r
- assert(canvasContext.getAtMostOneItemOfClass(DropInteractor.class)==null);\r
- canvasContext.add( new DropInteractor(canvas) );\r
-\r
- // Drag interactor\r
- assert(canvasContext.getAtMostOneItemOfClass(DragInteractor.class)==null);\r
- canvasContext.add( new DragInteractor(canvas) );\r
-\r
- // Delegate events to the canvas context\r
- mouseAdapter = new AWTMouseEventAdapter(canvasContext, canvasContext.getEventQueue());\r
- keyAdapter = new AWTKeyEventAdapter(canvasContext, canvasContext.getEventQueue());\r
- focusAdapter = new AWTFocusAdapter(canvasContext, canvasContext.getEventQueue());\r
- canvas.addMouseListener(mouseAdapter);\r
- canvas.addMouseMotionListener(mouseAdapter);\r
- canvas.addMouseWheelListener(mouseAdapter);\r
- canvas.addKeyListener(keyAdapter);\r
- canvas.addFocusListener(focusAdapter);\r
-\r
- canvasContext.getContentContext().addPaintableContextListener(new IContentListener() {\r
- @Override\r
- public void onDirty(IContentContext sender) {\r
- if (dirty) return;\r
- dirty = true;\r
- redraw();\r
- }}\r
- );\r
-\r
- redraw();\r
- }\r
-\r
- public void paintCanvas(Graphics2D g) {\r
- if (canvasContext == null)\r
- return;\r
- if (canvasContext.isLocked())\r
- return;\r
-\r
- dirty = false;\r
-\r
- // Paint the canvas\r
- Rectangle2D bounds = new Rectangle2D.Double(0,0, frame.getSize().width, frame.getSize().height);\r
- g.setRenderingHint(G2DRenderingHints.KEY_CONTROL_BOUNDS, bounds);\r
- canvasContext.getSceneGraph().render(g);\r
- }\r
-\r
-\r
- private final static Method CLOSED_METHOD = SyncListenerList.getMethod(IChassisListener.class, "chassisClosed");\r
-\r
- protected void fireChassisClosed() {\r
- Executable e[] = listeners.getExecutables(CLOSED_METHOD, this);\r
- ThreadUtils.multiSyncExec(e);\r
- }\r
-\r
- public GraphicsConfiguration getGraphicsConfiguration() {\r
- return frame.getGraphicsConfiguration();\r
- }\r
-\r
- public Component getAwtComponent() {\r
- return canvas;\r
- }\r
-\r
- public Frame getFrame() {\r
- return frame;\r
- }\r
-\r
-\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * 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:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+/*
+ *
+ * @author Toni Kalajainen
+ */
+package org.simantics.g2d.chassis;
+
+import java.awt.AWTException;
+import java.awt.BufferCapabilities;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.DisplayMode;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.ImageCapabilities;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferStrategy;
+import java.lang.reflect.Method;
+
+import org.simantics.g2d.canvas.ICanvasContext;
+import org.simantics.g2d.canvas.IContentContext;
+import org.simantics.g2d.canvas.IMouseCursorContext;
+import org.simantics.g2d.canvas.IMouseCursorListener;
+import org.simantics.g2d.canvas.IContentContext.IContentListener;
+import org.simantics.g2d.dnd.DragInteractor;
+import org.simantics.g2d.dnd.DropInteractor;
+import org.simantics.g2d.participant.RenderingQualityInteractor;
+import org.simantics.g2d.participant.TransformUtil;
+import org.simantics.scenegraph.g2d.G2DRenderingHints;
+import org.simantics.scenegraph.g2d.events.adapter.AWTFocusAdapter;
+import org.simantics.scenegraph.g2d.events.adapter.AWTKeyEventAdapter;
+import org.simantics.scenegraph.g2d.events.adapter.AWTMouseEventAdapter;
+import org.simantics.utils.threads.AWTThread;
+import org.simantics.utils.threads.Executable;
+import org.simantics.utils.threads.SyncListenerList;
+import org.simantics.utils.threads.ThreadUtils;
+
+
+/**
+ * Full screen AWT Frame chassis for canvas editors.
+ */
+public class FullscreenChassis extends AbstractChassis implements ICanvasChassis {
+
+ protected Frame frame;
+
+ protected java.awt.Canvas canvas;
+
+ protected BufferStrategy bufferStrategy;
+
+ protected Graphics2D g2d;
+
+ protected TransformUtil viewboxInteractor;
+
+ protected AWTMouseEventAdapter mouseAdapter;
+ protected AWTFocusAdapter focusAdapter;
+ protected AWTKeyEventAdapter keyAdapter;
+
+ transient boolean dirty = false;
+
+ KeyListener escapeListener = new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
+ frame.dispose();
+ }
+ };
+
+ /**
+ * Create full screen chassis in default monitor.
+ * <p>
+ * This constructor must be ran in AWT Thread.
+ *
+ * @param canvasContext
+ * @param windowTitle
+ * @param ruler
+ */
+ public FullscreenChassis(String windowTitle, boolean ruler) {
+ this(GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(), windowTitle, ruler);
+ }
+
+ public void redraw() {
+ canvas.repaint();
+ }
+
+ /**
+ * Create full screen chassis.
+ * <p>
+ * This constructor must be ran in AWT Thread.
+ *
+ * @param monitor the monitor device
+ * @param canvasContext
+ * @param windowTitle
+ * @param ruler
+ */
+ public FullscreenChassis(GraphicsDevice monitor, String windowTitle, boolean ruler) {
+ DisplayMode dm = monitor.getDisplayMode();
+
+ frame = new Frame(windowTitle);
+ frame.setSize(dm.getWidth(), dm.getHeight());
+ frame.setUndecorated(true);
+
+ // Close click
+ frame.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ frame.dispose();
+ }
+
+ @Override
+ public void windowClosed(WindowEvent e) {
+ if (g2d!=null) {
+ g2d.dispose();
+ g2d = null;
+ }
+ fireChassisClosed();
+ }
+ });
+
+ canvas = new java.awt.Canvas() {
+ private static final long serialVersionUID = -3520733232931837755L;
+
+ @Override
+ public void paint(Graphics g) {
+ if (bufferStrategy==null)
+ {
+ BufferCapabilities caps = new BufferCapabilities(new ImageCapabilities(true),
+ new ImageCapabilities(true), BufferCapabilities.FlipContents.COPIED);
+ try {
+ canvas.createBufferStrategy(2, caps);
+ } catch (AWTException e) {
+ canvas.createBufferStrategy(2);
+ }
+ bufferStrategy = canvas.getBufferStrategy();
+ }
+ if (g2d!=null && bufferStrategy.contentsLost()) {
+ g2d.dispose();
+ g2d = null;
+ }
+ if (g2d==null)
+ g2d = (Graphics2D) bufferStrategy.getDrawGraphics();
+ paintCanvas(g2d);
+ bufferStrategy.show();
+ }
+
+ @Override
+ public void update(Graphics g) {
+ paint(g);
+ }
+ };
+
+
+ // Esc listener
+ canvas.addKeyListener(escapeListener);
+ frame.addKeyListener(escapeListener);
+
+ //monitor.setFullScreenWindow(frame);
+
+ frame.add(canvas);
+
+ frame.invalidate();
+ java.awt.Rectangle awtBounds = monitor.getDefaultConfiguration().getBounds();
+ frame.setBounds(awtBounds);
+ frame.setAlwaysOnTop(true);
+ frame.setVisible(true);
+
+
+ }
+
+ @Override
+ public void setCanvasContext(ICanvasContext canvasContext) {
+ super.setCanvasContext(canvasContext);
+
+ // quality interactor
+ RenderingQualityInteractor rq = new RenderingQualityInteractor();
+ canvasContext.add(rq);
+
+ // Set bridge for mouse cursor changing
+ IMouseCursorContext mctx = canvasContext.getMouseCursorContext();
+ mctx.addCursorListener(new IMouseCursorListener() {
+ @Override
+ public void onCursorSet(IMouseCursorContext sender, int mouseId, Cursor cursor) {
+ if (mouseId!=0) return;
+ canvas.setCursor(cursor);
+ }}, AWTThread.getThreadAccess());
+
+
+ // drop interactor
+ assert(canvasContext.getAtMostOneItemOfClass(DropInteractor.class)==null);
+ canvasContext.add( new DropInteractor(canvas) );
+
+ // Drag interactor
+ assert(canvasContext.getAtMostOneItemOfClass(DragInteractor.class)==null);
+ canvasContext.add( new DragInteractor(canvas) );
+
+ // Delegate events to the canvas context
+ mouseAdapter = new AWTMouseEventAdapter(canvasContext, canvasContext.getEventQueue());
+ keyAdapter = new AWTKeyEventAdapter(canvasContext, canvasContext.getEventQueue());
+ focusAdapter = new AWTFocusAdapter(canvasContext, canvasContext.getEventQueue());
+ canvas.addMouseListener(mouseAdapter);
+ canvas.addMouseMotionListener(mouseAdapter);
+ canvas.addMouseWheelListener(mouseAdapter);
+ canvas.addKeyListener(keyAdapter);
+ canvas.addFocusListener(focusAdapter);
+
+ canvasContext.getContentContext().addPaintableContextListener(new IContentListener() {
+ @Override
+ public void onDirty(IContentContext sender) {
+ if (dirty) return;
+ dirty = true;
+ redraw();
+ }}
+ );
+
+ redraw();
+ }
+
+ public void paintCanvas(Graphics2D g) {
+ if (canvasContext == null)
+ return;
+ if (canvasContext.isLocked())
+ return;
+
+ dirty = false;
+
+ // Paint the canvas
+ Rectangle2D bounds = new Rectangle2D.Double(0,0, frame.getSize().width, frame.getSize().height);
+ g.setRenderingHint(G2DRenderingHints.KEY_CONTROL_BOUNDS, bounds);
+ canvasContext.getSceneGraph().render(g);
+ }
+
+
+ private final static Method CLOSED_METHOD = SyncListenerList.getMethod(IChassisListener.class, "chassisClosed");
+
+ protected void fireChassisClosed() {
+ Executable e[] = listeners.getExecutables(CLOSED_METHOD, this);
+ ThreadUtils.multiSyncExec(e);
+ }
+
+ public GraphicsConfiguration getGraphicsConfiguration() {
+ return frame.getGraphicsConfiguration();
+ }
+
+ public Component getAwtComponent() {
+ return canvas;
+ }
+
+ public Frame getFrame() {
+ return frame;
+ }
+
+
+}