1 /* 2 * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package sun.awt; 27 28 import java.awt.*; 29 import java.awt.datatransfer.Clipboard; 30 import java.awt.dnd.DragGestureListener; 31 import java.awt.dnd.DragGestureRecognizer; 32 import java.awt.dnd.DragSource; 33 import java.awt.event.AWTEventListener; 34 import java.awt.font.TextAttribute; 35 import java.awt.im.InputMethodHighlight; 36 import java.awt.image.ColorModel; 37 import java.awt.image.ImageObserver; 38 import java.awt.image.ImageProducer; 39 import java.awt.peer.FontPeer; 40 import java.awt.peer.KeyboardFocusManagerPeer; 41 import java.awt.peer.SystemTrayPeer; 42 import java.awt.peer.TrayIconPeer; 43 import java.beans.PropertyChangeListener; 44 import java.net.URL; 45 import java.util.Map; 46 import java.util.Properties; 47 48 public final class HeadlessToolkit extends Toolkit 49 implements ComponentFactory, KeyboardFocusManagerPeerProvider { 50 51 private static final KeyboardFocusManagerPeer kfmPeer = new KeyboardFocusManagerPeer() { 52 @Override 53 public void setCurrentFocusedWindow(Window win) {} 54 @Override 55 public Window getCurrentFocusedWindow() { return null; } 56 @Override 57 public void setCurrentFocusOwner(Component comp) {} 58 @Override 59 public Component getCurrentFocusOwner() { return null; } 60 @Override 61 public void clearGlobalFocusOwner(Window activeWindow) {} 62 }; 63 64 private final Toolkit tk; 65 private ComponentFactory componentFactory; 66 67 public HeadlessToolkit(Toolkit tk) { 68 this.tk = tk; 69 if (tk instanceof ComponentFactory) { 70 componentFactory = (ComponentFactory)tk; 71 } 72 } 73 74 public Toolkit getUnderlyingToolkit() { 75 return tk; 76 } 77 78 @Override 79 public KeyboardFocusManagerPeer getKeyboardFocusManagerPeer() { 80 // See 6833019. 81 return kfmPeer; 82 } 83 84 public TrayIconPeer createTrayIcon(TrayIcon target) 85 throws HeadlessException { 86 throw new HeadlessException(); 87 } 88 89 public SystemTrayPeer createSystemTray(SystemTray target) 90 throws HeadlessException { 91 throw new HeadlessException(); 92 } 93 94 public boolean isTraySupported() { 95 return false; 96 } 97 98 public GlobalCursorManager getGlobalCursorManager() 99 throws HeadlessException { 100 throw new HeadlessException(); 101 } 102 103 /* 104 * Headless toolkit - unsupported. 105 */ 106 @Override 107 protected void loadSystemColors(int[] systemColors) 108 throws HeadlessException { 109 throw new HeadlessException(); 110 } 111 112 @Override 113 public ColorModel getColorModel() 114 throws HeadlessException { 115 throw new HeadlessException(); 116 } 117 118 @Override 119 public int getScreenResolution() 120 throws HeadlessException { 121 throw new HeadlessException(); 122 } 123 124 @Override 125 public Map<TextAttribute, ?> mapInputMethodHighlight(InputMethodHighlight highlight) 126 throws HeadlessException { 127 throw new HeadlessException(); 128 } 129 130 @Override 131 public int getMenuShortcutKeyMask() 132 throws HeadlessException { 133 throw new HeadlessException(); 134 } 135 136 @Override 137 public boolean getLockingKeyState(int keyCode) 138 throws UnsupportedOperationException { 139 throw new HeadlessException(); 140 } 141 142 @Override 143 public void setLockingKeyState(int keyCode, boolean on) 144 throws UnsupportedOperationException { 145 throw new HeadlessException(); 146 } 147 148 @Override 149 public Cursor createCustomCursor(Image cursor, Point hotSpot, String name) 150 throws IndexOutOfBoundsException, HeadlessException { 151 throw new HeadlessException(); 152 } 153 154 @Override 155 public Dimension getBestCursorSize(int preferredWidth, int preferredHeight) 156 throws HeadlessException { 157 throw new HeadlessException(); 158 } 159 160 @Override 161 public int getMaximumCursorColors() 162 throws HeadlessException { 163 throw new HeadlessException(); 164 } 165 166 @Override 167 public <T extends DragGestureRecognizer> T 168 createDragGestureRecognizer(Class<T> abstractRecognizerClass, 169 DragSource ds, Component c, 170 int srcActions, DragGestureListener dgl) 171 { 172 return null; 173 } 174 175 public int getScreenHeight() 176 throws HeadlessException { 177 throw new HeadlessException(); 178 } 179 180 public int getScreenWidth() 181 throws HeadlessException { 182 throw new HeadlessException(); 183 } 184 185 @Override 186 public Dimension getScreenSize() 187 throws HeadlessException { 188 throw new HeadlessException(); 189 } 190 191 @Override 192 public Insets getScreenInsets(GraphicsConfiguration gc) 193 throws HeadlessException { 194 throw new HeadlessException(); 195 } 196 197 @Override 198 public void setDynamicLayout(boolean dynamic) 199 throws HeadlessException { 200 throw new HeadlessException(); 201 } 202 203 @Override 204 protected boolean isDynamicLayoutSet() 205 throws HeadlessException { 206 throw new HeadlessException(); 207 } 208 209 @Override 210 public boolean isDynamicLayoutActive() 211 throws HeadlessException { 212 throw new HeadlessException(); 213 } 214 215 @Override 216 public Clipboard getSystemClipboard() 217 throws HeadlessException { 218 throw new HeadlessException(); 219 } 220 221 /* 222 * Printing 223 */ 224 @Override 225 public PrintJob getPrintJob(Frame frame, String jobtitle, 226 JobAttributes jobAttributes, 227 PageAttributes pageAttributes) { 228 if (frame != null) { 229 // Should never happen 230 throw new HeadlessException(); 231 } 232 throw new NullPointerException("frame must not be null"); 233 } 234 235 @Override 236 public PrintJob getPrintJob(Frame frame, String doctitle, Properties props) 237 { 238 if (frame != null) { 239 // Should never happen 240 throw new HeadlessException(); 241 } 242 throw new NullPointerException("frame must not be null"); 243 } 244 245 /* 246 * Headless toolkit - supported. 247 */ 248 249 @Override 250 public void sync() { 251 // Do nothing 252 } 253 254 @Override 255 public void beep() { 256 // Send alert character 257 System.out.write(0x07); 258 } 259 260 /* 261 * Event Queue 262 */ 263 @Override 264 public EventQueue getSystemEventQueueImpl() { 265 return SunToolkit.getSystemEventQueueImplPP(); 266 } 267 268 /* 269 * Images. 270 */ 271 @Override 272 public int checkImage(Image img, int w, int h, ImageObserver o) { 273 return tk.checkImage(img, w, h, o); 274 } 275 276 @Override 277 public boolean prepareImage( 278 Image img, int w, int h, ImageObserver o) { 279 return tk.prepareImage(img, w, h, o); 280 } 281 282 @Override 283 public Image getImage(String filename) { 284 return tk.getImage(filename); 285 } 286 287 @Override 288 public Image getImage(URL url) { 289 return tk.getImage(url); 290 } 291 292 @Override 293 public Image createImage(String filename) { 294 return tk.createImage(filename); 295 } 296 297 @Override 298 public Image createImage(URL url) { 299 return tk.createImage(url); 300 } 301 302 @Override 303 public Image createImage(byte[] data, int offset, int length) { 304 return tk.createImage(data, offset, length); 305 } 306 307 @Override 308 public Image createImage(ImageProducer producer) { 309 return tk.createImage(producer); 310 } 311 312 @Override 313 public Image createImage(byte[] imagedata) { 314 return tk.createImage(imagedata); 315 } 316 317 318 /* 319 * Fonts 320 */ 321 @Override 322 public FontPeer getFontPeer(String name, int style) { 323 if (componentFactory != null) { 324 return componentFactory.getFontPeer(name, style); 325 } 326 return null; 327 } 328 329 @Override 330 @SuppressWarnings("deprecation") 331 public FontMetrics getFontMetrics(Font font) { 332 return tk.getFontMetrics(font); 333 } 334 335 @Override 336 @SuppressWarnings("deprecation") 337 public String[] getFontList() { 338 return tk.getFontList(); 339 } 340 341 /* 342 * Desktop properties 343 */ 344 345 @Override 346 public void addPropertyChangeListener(String name, 347 PropertyChangeListener pcl) { 348 tk.addPropertyChangeListener(name, pcl); 349 } 350 351 @Override 352 public void removePropertyChangeListener(String name, 353 PropertyChangeListener pcl) { 354 tk.removePropertyChangeListener(name, pcl); 355 } 356 357 /* 358 * Modality 359 */ 360 @Override 361 public boolean isModalityTypeSupported(Dialog.ModalityType modalityType) { 362 return false; 363 } 364 365 @Override 366 public boolean isModalExclusionTypeSupported(Dialog.ModalExclusionType exclusionType) { 367 return false; 368 } 369 370 /* 371 * Always on top 372 */ 373 @Override 374 public boolean isAlwaysOnTopSupported() { 375 return false; 376 } 377 378 /* 379 * AWT Event listeners 380 */ 381 382 @Override 383 public void addAWTEventListener(AWTEventListener listener, 384 long eventMask) { 385 tk.addAWTEventListener(listener, eventMask); 386 } 387 388 @Override 389 public void removeAWTEventListener(AWTEventListener listener) { 390 tk.removeAWTEventListener(listener); 391 } 392 393 @Override 394 public AWTEventListener[] getAWTEventListeners() { 395 return tk.getAWTEventListeners(); 396 } 397 398 @Override 399 public AWTEventListener[] getAWTEventListeners(long eventMask) { 400 return tk.getAWTEventListeners(eventMask); 401 } 402 403 public boolean isDesktopSupported() { 404 return false; 405 } 406 407 @Override 408 public boolean areExtraMouseButtonsEnabled() throws HeadlessException{ 409 throw new HeadlessException(); 410 } 411 }