Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[albireo-dev] Re: support for Eclipse 3.4 on MacOS X

This exception
> org.eclipse.swt.SWTException: Invalid thread access
> 	at org.eclipse.swt.SWT.error(SWT.java:3777)
> 	at org.eclipse.swt.SWT.error(SWT.java:3695)
> 	at org.eclipse.swt.SWT.error(SWT.java:3666)
> 	at org.eclipse.swt.widgets.Display.error(Display.java:1126)
> 	at org.eclipse.swt.widgets.Display.checkDevice(Display.java:627)
> 	at org.eclipse.swt.graphics.Device.getDPI(Device.java:370)
> 	at org.eclipse.swt.graphics.Font.getFontData(Font.java:301)
> 	at org.eclipse.albireo.core.ResourceConverter.convertFont(ResourceConverter.java:40)
> 	at org.eclipse.albireo.core.LookAndFeelHandler.propagateSwtFont(LookAndFeelHandler.java:282)
> 	at org.eclipse.albireo.core.AwtEnvironment$6.run(AwtEnvironment.java:181)
> 	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199)
> 	at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
> 	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
> 	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
> 	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
> 	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
> 	at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

should be fixed by this commit.

Index: src/org/eclipse/albireo/core/AwtEnvironment.java
===================================================================
RCS file: /cvsroot/technology/org.eclipse.albireo/org.eclipse.albireo.core/src/org/eclipse/albireo/core/AwtEnvironment.java,v
retrieving revision 1.24
diff -c -3 -r1.24 AwtEnvironment.java
*** src/org/eclipse/albireo/core/AwtEnvironment.java	2 May 2008 18:38:17 -0000	1.24
--- src/org/eclipse/albireo/core/AwtEnvironment.java	24 Jun 2008 19:19:27 -0000
***************
*** 39,44 ****
--- 39,45 ----
  import org.eclipse.swt.SWTException;
  import org.eclipse.swt.awt.SWT_AWT;
  import org.eclipse.swt.graphics.Font;
+ import org.eclipse.swt.graphics.FontData;
  import org.eclipse.swt.layout.FillLayout;
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.swt.widgets.Display;
***************
*** 174,184 ****
                  initialFont[0] = display.getSystemFont();
              }
          });
          try {
              EventQueue.invokeAndWait(new Runnable() {
                  public void run() {
                      setLookAndFeel();
!                     LookAndFeelHandler.getInstance().propagateSwtFont(initialFont[0]);
                      if (FocusHandler.verboseKFHEvents)
                          FocusDebugging.enableKeyboardFocusManagerLogging();
                  }
--- 175,187 ----
                  initialFont[0] = display.getSystemFont();
              }
          });
+         final Font swtFont = initialFont[0];
+         final FontData[] swtFontData = swtFont.getFontData();
          try {
              EventQueue.invokeAndWait(new Runnable() {
                  public void run() {
                      setLookAndFeel();
!                     LookAndFeelHandler.getInstance().propagateSwtFont(swtFont, swtFontData);
                      if (FocusHandler.verboseKFHEvents)
                          FocusDebugging.enableKeyboardFocusManagerLogging();
                  }
Index: src/org/eclipse/albireo/core/LookAndFeelHandler.java
===================================================================
RCS file: /cvsroot/technology/org.eclipse.albireo/org.eclipse.albireo.core/src/org/eclipse/albireo/core/LookAndFeelHandler.java,v
retrieving revision 1.10
diff -c -3 -r1.10 LookAndFeelHandler.java
*** src/org/eclipse/albireo/core/LookAndFeelHandler.java	28 May 2008 18:53:34 -0000	1.10
--- src/org/eclipse/albireo/core/LookAndFeelHandler.java	24 Jun 2008 19:19:27 -0000
***************
*** 22,27 ****
--- 22,28 ----
  import org.eclipse.albireo.internal.Platform;
  import org.eclipse.swt.graphics.Color;
  import org.eclipse.swt.graphics.Font;
+ import org.eclipse.swt.graphics.FontData;
  
  /**
   * This class deals with the customization of the look&feel
***************
*** 310,323 ****
       * In this implementation, this method calls the
       * {@link #updateLookAndFeelFonts(java.awt.Font)} method.
       * @param swtFont The default SWT font.
       * @return The corresponding AWT font.
       * @see #isSwtDefaultFontPropagated()
       * @see #updateLookAndFeelFonts(java.awt.Font)
       */
!     public java.awt.Font propagateSwtFont(Font swtFont) {
          assert EventQueue.isDispatchThread();    // On AWT event thread
  
!         java.awt.Font awtFont = ResourceConverter.getInstance().convertFont(swtFont);
          if (isSwtDefaultFontPropagated()
              && !swtFont.getDevice().isDisposed()
              && (lastPropagatedSwtFont != swtFont)) {
--- 311,326 ----
       * In this implementation, this method calls the
       * {@link #updateLookAndFeelFonts(java.awt.Font)} method.
       * @param swtFont The default SWT font.
+      * @param swtFontData Result of <code>swtFont.getFontData()</code>,
+      *                    obtained on the SWT event thread.
       * @return The corresponding AWT font.
       * @see #isSwtDefaultFontPropagated()
       * @see #updateLookAndFeelFonts(java.awt.Font)
       */
!     public java.awt.Font propagateSwtFont(Font swtFont, FontData[] swtFontData) {
          assert EventQueue.isDispatchThread();    // On AWT event thread
  
!         java.awt.Font awtFont = ResourceConverter.getInstance().convertFont(swtFont, swtFontData);
          if (isSwtDefaultFontPropagated()
              && !swtFont.getDevice().isDisposed()
              && (lastPropagatedSwtFont != swtFont)) {
Index: src/org/eclipse/albireo/core/ResourceConverter.java
===================================================================
RCS file: /cvsroot/technology/org.eclipse.albireo/org.eclipse.albireo.core/src/org/eclipse/albireo/core/ResourceConverter.java,v
retrieving revision 1.2
diff -c -3 -r1.2 ResourceConverter.java
*** src/org/eclipse/albireo/core/ResourceConverter.java	28 Apr 2008 16:22:15 -0000	1.2
--- src/org/eclipse/albireo/core/ResourceConverter.java	24 Jun 2008 19:19:27 -0000
***************
*** 35,52 ****
      /**
       * Converts a font from SWT to Swing.
       * The argument Font remains owned by the caller.
       */
!     public java.awt.Font convertFont(Font swtFont) {
!         FontData fontData = swtFont.getFontData()[0];
  
          // AWT font sizes assume a 72 dpi resolution, always. The true screen resolution must be
          // used to convert the platform font size into an AWT point size that matches when displayed.
          int resolution = Toolkit.getDefaultToolkit().getScreenResolution();
!         int awtFontSize = (int)Math.round((double)fontData.getHeight() * resolution / 72.0);
  
          // The style constants for SWT and AWT map exactly, and since they are int constants, they should
          // never change. So, the SWT style is passed through as the AWT style.
!         return new java.awt.Font(fontData.getName(), fontData.getStyle(), awtFontSize);
      }
  
  
--- 35,55 ----
      /**
       * Converts a font from SWT to Swing.
       * The argument Font remains owned by the caller.
+      * @param swtFont An SWT font.
+      * @param swtFontData Result of <code>swtFont.getFontData()</code>,
+      *                    obtained on the SWT event thread.
       */
!     public java.awt.Font convertFont(Font swtFont, FontData[] swtFontData) {
!         FontData fontData0 = swtFontData[0];
  
          // AWT font sizes assume a 72 dpi resolution, always. The true screen resolution must be
          // used to convert the platform font size into an AWT point size that matches when displayed.
          int resolution = Toolkit.getDefaultToolkit().getScreenResolution();
!         int awtFontSize = (int)Math.round((double)fontData0.getHeight() * resolution / 72.0);
  
          // The style constants for SWT and AWT map exactly, and since they are int constants, they should
          // never change. So, the SWT style is passed through as the AWT style.
!         return new java.awt.Font(fontData0.getName(), fontData0.getStyle(), awtFontSize);
      }
  
  
Index: src/org/eclipse/albireo/core/SwingControl.java
===================================================================
RCS file: /cvsroot/technology/org.eclipse.albireo/org.eclipse.albireo.core/src/org/eclipse/albireo/core/SwingControl.java,v
retrieving revision 1.87
diff -c -3 -r1.87 SwingControl.java
*** src/org/eclipse/albireo/core/SwingControl.java	24 Jun 2008 19:05:01 -0000	1.87
--- src/org/eclipse/albireo/core/SwingControl.java	24 Jun 2008 19:19:29 -0000
***************
*** 52,57 ****
--- 52,58 ----
  import org.eclipse.swt.events.KeyListener;
  import org.eclipse.swt.graphics.Color;
  import org.eclipse.swt.graphics.Font;
+ import org.eclipse.swt.graphics.FontData;
  import org.eclipse.swt.graphics.Point;
  import org.eclipse.swt.graphics.Rectangle;
  import org.eclipse.swt.layout.FillLayout;
***************
*** 294,299 ****
--- 295,301 ----
          final Color foreground = getForeground();
          final Color background = getBackground();
          final Font font = getFont();
+         final FontData[] fontData = font.getFontData();
  
          // Create AWT/Swing components on the AWT thread. This is
          // especially necessary to avoid an AWT leak bug (Sun bug 6411042).
***************
*** 330,336 ****
                      // The color of the content Pane is visible permanently.
                      setComponentForeground(rootPaneContainer.getContentPane(), foreground, true);
                      setComponentBackground(rootPaneContainer.getContentPane(), background, true);
!                     setComponentFont(font, true);
                      
                      rootPaneContainer.getRootPane().getContentPane().add(swingComponent);
                      swingComponent.putClientProperty(SWT_PARENT_PROPERTY_KEY, SwingControl.this);
--- 332,338 ----
                      // The color of the content Pane is visible permanently.
                      setComponentForeground(rootPaneContainer.getContentPane(), foreground, true);
                      setComponentBackground(rootPaneContainer.getContentPane(), background, true);
!                     setComponentFont(font, fontData, true);
                      
                      rootPaneContainer.getRootPane().getContentPane().add(swingComponent);
                      swingComponent.putClientProperty(SWT_PARENT_PROPERTY_KEY, SwingControl.this);
***************
*** 1118,1134 ****
       */
      public void setFont(final Font font) {
          super.setFont(font);
          EventQueue.invokeLater(new Runnable() {
              public void run() {
!                 setComponentFont(font, false);
              }
          });
      }
  
!     private void updateDefaultFont(Font swtFont) {
          assert EventQueue.isDispatchThread();    // On AWT event thread
  
!         java.awt.Font awtFont = LookAndFeelHandler.getInstance().propagateSwtFont(swtFont);
          if (awtFont == null) {
              return;
          }
--- 1120,1137 ----
       */
      public void setFont(final Font font) {
          super.setFont(font);
+         final FontData[] fontData = font.getFontData();
          EventQueue.invokeLater(new Runnable() {
              public void run() {
!                 setComponentFont(font, fontData, false);
              }
          });
      }
  
!     private void updateDefaultFont(Font swtFont, FontData[] swtFontData) {
          assert EventQueue.isDispatchThread();    // On AWT event thread
  
!         java.awt.Font awtFont = LookAndFeelHandler.getInstance().propagateSwtFont(swtFont, swtFontData);
          if (awtFont == null) {
              return;
          }
***************
*** 1144,1154 ****
          }
      }
  
!     protected void setComponentFont(Font swtFont, boolean preserveDefaults) {
          assert EventQueue.isDispatchThread();
  
          ResourceConverter converter = ResourceConverter.getInstance();
!         java.awt.Font awtFont = converter.convertFont(swtFont);
  
          // Allow subclasses to react to font change if necessary.
          updateAwtFont(awtFont);
--- 1147,1157 ----
          }
      }
  
!     protected void setComponentFont(Font swtFont, FontData[] swtFontData, boolean preserveDefaults) {
          assert EventQueue.isDispatchThread();
  
          ResourceConverter converter = ResourceConverter.getInstance();
!         java.awt.Font awtFont = converter.convertFont(swtFont, swtFontData);
  
          // Allow subclasses to react to font change if necessary.
          updateAwtFont(awtFont);
***************
*** 1180,1188 ****
  
      private void handleSettingsChange() {
          final Font newFont = getDisplay().getSystemFont();
          EventQueue.invokeLater(new Runnable() {
              public void run() {
!                 updateDefaultFont(newFont);
              }
          });
      }
--- 1183,1192 ----
  
      private void handleSettingsChange() {
          final Font newFont = getDisplay().getSystemFont();
+         final FontData[] newFontData = newFont.getFontData();
          EventQueue.invokeLater(new Runnable() {
              public void run() {
!                 updateDefaultFont(newFont, newFontData);
              }
          });
      }



Back to the top