27 * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> |
27 * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> |
28 */ |
28 */ |
29 public abstract class Device implements Drawable { |
29 public abstract class Device implements Drawable { |
30 |
30 |
31 // Native device handle |
31 // Native device handle |
32 int paintDevice; |
32 static int paintDevice; |
33 |
33 |
34 // Device instance tracking |
34 // Device instance tracking |
35 static Device[] Devices = new Device[4]; |
35 static Device[] Devices = new Device[4]; |
36 |
36 |
37 // Debugging |
37 // Debugging |
38 public static boolean DEBUG; |
38 public static boolean DEBUG; |
39 boolean debug = DEBUG; |
39 static boolean debug = DEBUG; |
40 boolean tracking = DEBUG; |
40 static boolean tracking = DEBUG; |
41 Error [] errors; |
41 static Error [] errors; |
42 Object [] objects; |
42 static Object [] objects; |
43 Object trackingLock; |
43 static Object trackingLock; |
44 |
44 |
45 // Themed system colors |
45 // Themed system colors |
46 Color COLOR_LIST_BACKGROUND; |
46 static Color COLOR_LIST_BACKGROUND; |
47 Color COLOR_LIST_FOREGROUND; |
47 static Color COLOR_LIST_FOREGROUND; |
48 Color COLOR_LIST_SELECTION; |
48 static Color COLOR_LIST_SELECTION; |
49 Color COLOR_LIST_SELECTION_TEXT; |
49 static Color COLOR_LIST_SELECTION_TEXT; |
50 Color COLOR_TITLE_BACKGROUND; |
50 static Color COLOR_TITLE_BACKGROUND; |
51 Color COLOR_TITLE_BACKGROUND_GRADIENT; |
51 static Color COLOR_TITLE_BACKGROUND_GRADIENT; |
52 Color COLOR_TITLE_FOREGROUND; |
52 static Color COLOR_TITLE_FOREGROUND; |
53 Color COLOR_TITLE_INACTIVE_BACKGROUND; |
53 static Color COLOR_TITLE_INACTIVE_BACKGROUND; |
54 Color COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT; |
54 static Color COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT; |
55 Color COLOR_TITLE_INACTIVE_FOREGROUND; |
55 static Color COLOR_TITLE_INACTIVE_FOREGROUND; |
56 Color COLOR_WIDGET_BACKGROUND; |
56 static Color COLOR_WIDGET_BACKGROUND; |
57 Color COLOR_WIDGET_BORDER; |
57 static Color COLOR_WIDGET_BORDER; |
58 Color COLOR_WIDGET_DARK_SHADOW; |
58 static Color COLOR_WIDGET_DARK_SHADOW; |
59 Color COLOR_WIDGET_FOREGROUND; |
59 static Color COLOR_WIDGET_FOREGROUND; |
60 Color COLOR_WIDGET_HIGHLIGHT_SHADOW; |
60 static Color COLOR_WIDGET_HIGHLIGHT_SHADOW; |
61 Color COLOR_WIDGET_LIGHT_SHADOW; |
61 static Color COLOR_WIDGET_LIGHT_SHADOW; |
62 Color COLOR_WIDGET_NORMAL_SHADOW; |
62 static Color COLOR_WIDGET_NORMAL_SHADOW; |
63 |
63 |
64 // Disposed state flag |
64 // Disposed state flag, instance data |
65 protected boolean disposed; |
65 protected boolean disposed; |
|
66 |
|
67 // Initialized state flag |
|
68 static boolean initialized; |
|
69 |
|
70 // Internal state flag telling if this is the application's instance |
|
71 // or an internal one |
|
72 boolean internal; |
66 |
73 |
67 // Handle to the null Icon. Eventually set by Image.internal_getNullIconHandle |
74 // Handle to the null Icon. Eventually set by Image.internal_getNullIconHandle |
68 static int nullIconHandle; |
75 static int nullIconHandle; |
69 |
76 |
70 // Default height for FontData |
77 // Default height for FontData |
71 static final int FONT_DEF_HEIGHT = 12; |
78 static final int FONT_DEF_HEIGHT = 12; |
72 |
79 |
73 /* |
|
74 * TEMPORARY CODE. When a graphics object is |
|
75 * created and the device parameter is null, |
|
76 * the current Display is used. This presents |
|
77 * a problem because SWT graphics does not |
|
78 * reference classes in SWT widgets. The correct |
|
79 * fix is to remove this feature. Unfortunately, |
|
80 * too many application programs rely on this |
|
81 * feature. |
|
82 * |
|
83 * This code will be removed in the future. |
|
84 */ |
|
85 protected static Device CurrentDevice; |
|
86 protected static Runnable DeviceFinder; |
|
87 static { |
80 static { |
88 try { |
81 try { |
89 Class.forName ("org.eclipse.swt.widgets.Display"); |
82 Class.forName ("org.eclipse.swt.widgets.Display"); |
90 } catch (Throwable e) {} |
83 } catch (Throwable e) {} |
91 } |
84 } |
92 |
85 |
93 /* |
|
94 * TEMPORARY CODE. |
|
95 */ |
|
96 static synchronized Device getDevice () { |
|
97 if (DeviceFinder != null) DeviceFinder.run(); |
|
98 Device device = CurrentDevice; |
|
99 CurrentDevice = null; |
|
100 return device; |
|
101 } |
|
102 |
|
103 /** |
86 /** |
104 * Constructs a new instance of this class. |
87 * Constructs a new instance of this class. |
105 * <p> |
88 * <p> |
106 * You must dispose the device when it is no longer required. |
89 * You must dispose the device when it is no longer required. |
107 * </p> |
90 * </p> |
565 * </p> |
561 * </p> |
566 * |
562 * |
567 * @see #create |
563 * @see #create |
568 */ |
564 */ |
569 protected void init () { |
565 protected void init () { |
570 int palette = OS.QApplication_swt_palette_new(); |
566 if(!initialized) { |
571 try { |
567 int palette = OS.QApplication_swt_palette_new(); |
572 int[] rgb; |
568 try { |
573 |
569 int[] rgb; |
574 // List like widgets |
570 |
575 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_BASE); |
571 // List like widgets |
576 COLOR_LIST_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
572 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_BASE); |
577 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_TEXT); |
573 COLOR_LIST_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
578 COLOR_LIST_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
574 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_TEXT); |
579 |
575 COLOR_LIST_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
580 // Highlight |
576 |
581 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_HIGHLIGHT); |
577 // Highlight |
582 COLOR_LIST_SELECTION = new Color(this, rgb[0], rgb[1], rgb[2]); |
578 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_HIGHLIGHT); |
583 COLOR_TITLE_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
579 COLOR_LIST_SELECTION = new Color(this, rgb[0], rgb[1], rgb[2]); |
584 COLOR_TITLE_BACKGROUND_GRADIENT = new Color(this, rgb[0], rgb[1], rgb[2]); |
580 COLOR_TITLE_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
585 COLOR_WIDGET_HIGHLIGHT_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]); |
581 COLOR_TITLE_BACKGROUND_GRADIENT = new Color(this, rgb[0], rgb[1], rgb[2]); |
586 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_HIGHLIGHTTEXT); |
582 COLOR_WIDGET_HIGHLIGHT_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]); |
587 COLOR_LIST_SELECTION_TEXT = new Color(this, rgb[0], rgb[1], rgb[2]); |
583 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_HIGHLIGHTTEXT); |
588 COLOR_TITLE_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
584 COLOR_LIST_SELECTION_TEXT = new Color(this, rgb[0], rgb[1], rgb[2]); |
589 |
585 COLOR_TITLE_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
590 // Inactive highlight |
586 |
591 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_DISABLED, OS.QPALETTE_COLORROLE_HIGHLIGHT); |
587 // Inactive highlight |
592 COLOR_TITLE_INACTIVE_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
588 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_DISABLED, OS.QPALETTE_COLORROLE_HIGHLIGHT); |
593 COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = new Color(this, rgb[0], rgb[1], rgb[2]); |
589 COLOR_TITLE_INACTIVE_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
594 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_DISABLED, OS.QPALETTE_COLORROLE_TEXT); |
590 COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = new Color(this, rgb[0], rgb[1], rgb[2]); |
595 COLOR_TITLE_INACTIVE_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
591 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_DISABLED, OS.QPALETTE_COLORROLE_TEXT); |
596 |
592 COLOR_TITLE_INACTIVE_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
597 // Window |
593 |
598 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_WINDOW); |
594 // Window |
599 COLOR_WIDGET_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
595 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_WINDOW); |
600 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_WINDOWTEXT); |
596 COLOR_WIDGET_BACKGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
601 COLOR_WIDGET_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
597 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_WINDOWTEXT); |
602 |
598 COLOR_WIDGET_FOREGROUND = new Color(this, rgb[0], rgb[1], rgb[2]); |
603 // Shadows: Black <= Shadow < [Dark] < [Mid] < [Button] < Midlight < Light <= White |
599 |
604 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_DARK); |
600 // Shadows: Black <= Shadow < [Dark] < [Mid] < [Button] < Midlight < Light <= White |
605 COLOR_WIDGET_DARK_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]); |
601 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_DARK); |
606 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_MID); |
602 COLOR_WIDGET_DARK_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]); |
607 COLOR_WIDGET_BORDER = new Color(this, rgb[0], rgb[1], rgb[2]); |
603 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_MID); |
608 COLOR_WIDGET_NORMAL_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]); |
604 COLOR_WIDGET_BORDER = new Color(this, rgb[0], rgb[1], rgb[2]); |
609 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_BUTTON); |
605 COLOR_WIDGET_NORMAL_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]); |
610 COLOR_WIDGET_LIGHT_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]); |
606 rgb = OS.QPalette_color(palette, OS.QPALETTE_COLORGROUP_NORMAL, OS.QPALETTE_COLORROLE_BUTTON); |
611 } finally { |
607 COLOR_WIDGET_LIGHT_SHADOW = new Color(this, rgb[0], rgb[1], rgb[2]); |
612 OS.QPalette_delete(palette); |
608 } finally { |
613 } |
609 OS.QPalette_delete(palette); |
614 paintDevice = OS.QApplication_swt_desktopPaintDevice(); |
610 } |
|
611 paintDevice = OS.QApplication_swt_desktopPaintDevice(); |
|
612 } |
615 } |
613 } |
616 |
614 |
617 /** |
615 /** |
618 * Invokes platform specific functionality to allocate a new GC handle. |
616 * Invokes platform specific functionality to allocate a new GC handle. |
619 * <p> |
617 * <p> |
759 if (deviceCount() == 1) { |
757 if (deviceCount() == 1) { |
760 if ( nullIconHandle != 0 ){ |
758 if ( nullIconHandle != 0 ){ |
761 OS.QIcon_delete( nullIconHandle ); |
759 OS.QIcon_delete( nullIconHandle ); |
762 nullIconHandle = 0; |
760 nullIconHandle = 0; |
763 } |
761 } |
|
762 COLOR_LIST_BACKGROUND.dispose(); |
|
763 COLOR_LIST_FOREGROUND.dispose(); |
|
764 COLOR_LIST_SELECTION.dispose(); |
|
765 COLOR_LIST_SELECTION_TEXT.dispose(); |
|
766 COLOR_TITLE_BACKGROUND.dispose(); |
|
767 COLOR_TITLE_BACKGROUND_GRADIENT.dispose(); |
|
768 COLOR_TITLE_FOREGROUND.dispose(); |
|
769 COLOR_TITLE_INACTIVE_BACKGROUND.dispose(); |
|
770 COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT.dispose(); |
|
771 COLOR_TITLE_INACTIVE_FOREGROUND.dispose(); |
|
772 COLOR_WIDGET_BACKGROUND.dispose(); |
|
773 COLOR_WIDGET_BORDER.dispose(); |
|
774 COLOR_WIDGET_DARK_SHADOW.dispose(); |
|
775 COLOR_WIDGET_FOREGROUND.dispose(); |
|
776 COLOR_WIDGET_HIGHLIGHT_SHADOW.dispose(); |
|
777 COLOR_WIDGET_LIGHT_SHADOW.dispose(); |
|
778 COLOR_WIDGET_NORMAL_SHADOW.dispose(); |
|
779 |
|
780 COLOR_LIST_BACKGROUND = null; |
|
781 COLOR_LIST_FOREGROUND = null; |
|
782 COLOR_LIST_SELECTION = null; |
|
783 COLOR_LIST_SELECTION_TEXT = null; |
|
784 COLOR_TITLE_BACKGROUND = null; |
|
785 COLOR_TITLE_BACKGROUND_GRADIENT = null; |
|
786 COLOR_TITLE_FOREGROUND = null; |
|
787 COLOR_TITLE_INACTIVE_BACKGROUND = null; |
|
788 COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = null; |
|
789 COLOR_TITLE_INACTIVE_FOREGROUND = null; |
|
790 COLOR_WIDGET_BACKGROUND = null; |
|
791 COLOR_WIDGET_BORDER = null; |
|
792 COLOR_WIDGET_DARK_SHADOW = null; |
|
793 COLOR_WIDGET_FOREGROUND = null; |
|
794 COLOR_WIDGET_HIGHLIGHT_SHADOW = null; |
|
795 COLOR_WIDGET_LIGHT_SHADOW = null; |
|
796 COLOR_WIDGET_NORMAL_SHADOW = null; |
|
797 |
|
798 paintDevice = 0; |
764 } |
799 } |
765 |
800 |
766 // Non static data follows |
801 // Non static data follows |
767 COLOR_LIST_BACKGROUND.dispose(); |
802 // No non-static data to release |
768 COLOR_LIST_FOREGROUND.dispose(); |
|
769 COLOR_LIST_SELECTION.dispose(); |
|
770 COLOR_LIST_SELECTION_TEXT.dispose(); |
|
771 COLOR_TITLE_BACKGROUND.dispose(); |
|
772 COLOR_TITLE_BACKGROUND_GRADIENT.dispose(); |
|
773 COLOR_TITLE_FOREGROUND.dispose(); |
|
774 COLOR_TITLE_INACTIVE_BACKGROUND.dispose(); |
|
775 COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT.dispose(); |
|
776 COLOR_TITLE_INACTIVE_FOREGROUND.dispose(); |
|
777 COLOR_WIDGET_BACKGROUND.dispose(); |
|
778 COLOR_WIDGET_BORDER.dispose(); |
|
779 COLOR_WIDGET_DARK_SHADOW.dispose(); |
|
780 COLOR_WIDGET_FOREGROUND.dispose(); |
|
781 COLOR_WIDGET_HIGHLIGHT_SHADOW.dispose(); |
|
782 COLOR_WIDGET_LIGHT_SHADOW.dispose(); |
|
783 COLOR_WIDGET_NORMAL_SHADOW.dispose(); |
|
784 |
|
785 COLOR_LIST_BACKGROUND = null; |
|
786 COLOR_LIST_FOREGROUND = null; |
|
787 COLOR_LIST_SELECTION = null; |
|
788 COLOR_LIST_SELECTION_TEXT = null; |
|
789 COLOR_TITLE_BACKGROUND = null; |
|
790 COLOR_TITLE_BACKGROUND_GRADIENT = null; |
|
791 COLOR_TITLE_FOREGROUND = null; |
|
792 COLOR_TITLE_INACTIVE_BACKGROUND = null; |
|
793 COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = null; |
|
794 COLOR_TITLE_INACTIVE_FOREGROUND = null; |
|
795 COLOR_WIDGET_BACKGROUND = null; |
|
796 COLOR_WIDGET_BORDER = null; |
|
797 COLOR_WIDGET_DARK_SHADOW = null; |
|
798 COLOR_WIDGET_FOREGROUND = null; |
|
799 COLOR_WIDGET_HIGHLIGHT_SHADOW = null; |
|
800 COLOR_WIDGET_LIGHT_SHADOW = null; |
|
801 COLOR_WIDGET_NORMAL_SHADOW = null; |
|
802 |
|
803 paintDevice = 0; |
|
804 } |
803 } |
805 |
804 |
806 /** |
805 /** |
807 * If the underlying window system supports printing warning messages |
806 * If the underlying window system supports printing warning messages |
808 * to the console, setting warnings to <code>false</code> prevents these |
807 * to the console, setting warnings to <code>false</code> prevents these |