[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [albireo-dev] CleanResizeListener

[Followup from a conversation on 2008-02-11.]

Gordon Hirsch wrote:
> Bruno Haible wrote:
> >   - Make it possible to turn on/off the CleanResizeListener, on a per-instance
> >     basis (since it depends on the contents of the window),
> 
> Sounds good.

OK, implemented as below.

> >   - Document that it should be enabled only after a background colour has been
> >     set that approximately matches the window's contents.
> 
> No objection, but wouldn't this be the default case? (i.e. background 
> colors normally match)

For highly graphic views (such as map displays), a developer may not think
that the background color is relevant. Therefore better to mention it.

> >   - Add a boolean method isCleanResizeRecommended() that returns false in
> >     JDK 1.6.
> 
> Should we just keep it off by default under JDK 1.6?

Yes, I agree. I made this change too.

Bruno


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.71
diff -c -3 -r1.71 SwingControl.java
*** src/org/eclipse/albireo/core/SwingControl.java	28 Apr 2008 18:06:32 -0000	1.71
--- src/org/eclipse/albireo/core/SwingControl.java	28 Apr 2008 20:26:40 -0000
***************
*** 197,207 ****
                  handleDispose();
              }
          });
!         // This listener clears garbage during resizing, making it look much cleaner. The garbage
!         // is due to use of the sun.awt.noerasebackground property, so this is done only under Windows.
!         if (Platform.isWin32()) {
!             borderlessChild.addControlListener(new CleanResizeListener());
!         }
      }
  
      // ========================================================================
--- 197,204 ----
                  handleDispose();
              }
          });
! 
!         initCleanResizeListener();
      }
  
      // ========================================================================
***************
*** 909,914 ****
--- 906,966 ----
  
  
      // ========================================================================
+     // Resizing with less flickering
+ 
+     // This listener clears garbage during resizing, making it look much
+     // cleaner. The garbage is due to use of the sun.awt.noerasebackground
+     // property, so this is done only under Windows.
+ 
+     private CleanResizeListener cleanResizeListener /* = null */;
+ 
+     /**
+      * Returns true if a particular mechanism for resizing with less flicker is
+      * enabled.
+      */
+     public boolean isCleanResizeEnabled() {
+         return cleanResizeListener != null;
+     }
+ 
+     /**
+      * Specifies whether the particular mechanism for resizing with less flicker
+      * should be enabled or not.
+      * <p>
+      * For this setting to be useful, a background colour should have been
+      * set that approximately matches the window's contents.
+      * <p>
+      * By default, this setting is enabled on Windows with JDK 1.5 or older, and
+      * disabled otherwise.
+      */
+     public void setCleanResizeEnabled(boolean enabled) {
+         if (enabled != isCleanResizeEnabled()) {
+             if (enabled) {
+                 cleanResizeListener = new CleanResizeListener();
+                 borderlessChild.addControlListener(cleanResizeListener);
+             } else {
+                 borderlessChild.removeControlListener(cleanResizeListener);
+                 cleanResizeListener = null;
+             }
+         }
+     }
+ 
+     private void initCleanResizeListener() {
+         // On Windows:
+         //  - In JDK 1.4 and 1.5: It indeed avoids most of the "garbage". But
+         //    if the background colour is not aligned with the contents of the
+         //    window (like here: background grey, contents dark green), the
+         //    cleaning is visually more disturbing than the garbage. This is
+         //    especially noticeable when you click with the mouse in the above
+         //    test view.
+         //  - In JDK 1.6: There is much less "garbage"; the repaint is quicker.
+         //    The CleanResizeListener's effect is mostly visible as flickering.
+         if (Platform.isWin32()
+             && Platform.JAVA_VERSION < Platform.javaVersion(1, 6, 0)) {
+             setCleanResizeEnabled(true);
+         }
+     }
+ 
+     // ========================================================================
      // Font management
  
      /**