fix AIOOB in AnimatedIcon
authorKonstantin Bulenkov <kb@jetbrains.com>
Wed, 1 Feb 2012 13:51:39 +0000 (14:51 +0100)
committerKonstantin Bulenkov <kb@jetbrains.com>
Wed, 1 Feb 2012 13:53:15 +0000 (14:53 +0100)
platform/platform-api/src/com/intellij/openapi/ui/LoadingDecorator.java
platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java
platform/platform-api/src/com/intellij/util/ui/AnimatedIcon.java
platform/platform-api/src/com/intellij/util/ui/Animator.java
platform/platform-api/src/com/intellij/util/ui/AsyncProcessIcon.java
platform/platform-api/src/com/intellij/util/ui/ButtonlessScrollBarUI.java
platform/platform-impl/src/com/intellij/ide/actionMacro/ActionMacroManager.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/ScrollingModelImpl.java
platform/platform-impl/src/com/intellij/ui/BalloonImpl.java

index 22ae559d18edc28461f99ca47948b20cb9aaac72..ad8ba71f2c43b96f5644d5f3518a13da728c6d89 100644 (file)
@@ -51,8 +51,8 @@ public class LoadingDecorator {
 
 
     myFadeOutAnimator = new Animator("Loading", 10, 500, false) {
-      public void paintNow(final float frame, final float totalFrames, final float cycle) {
-        myLoadingLayer.setAlpha(1f - frame / totalFrames);
+      public void paintNow(final int frame, final int totalFrames, final int cycle) {
+        myLoadingLayer.setAlpha(1f - ((float)frame) / ((float)totalFrames));
       }
 
       @Override
index bd5de74ad0bd66c0bb2798209aaa949b3d91a869..71783fc6918ff0e8fc6fc116b08a6d31736a97e9 100644 (file)
@@ -233,7 +233,7 @@ public class JBTabsImpl extends JComponent
     });
 
     myAnimator = new Animator("JBTabs Attractions", 2, 500, true) {
-      public void paintNow(final float frame, final float totalFrames, final float cycle) {
+      public void paintNow(final int frame, final int totalFrames, final int cycle) {
         repaintAttractions();
       }
     };
index 30ba39ec503326d07307f1ca6ad30c63e2014fda..84e2502da2393b8bd43d47a9791ff47309d16802 100644 (file)
 package com.intellij.util.ui;
 
 import com.intellij.openapi.Disposable;
+import com.intellij.openapi.util.Disposer;
 
 import javax.swing.*;
 import java.awt.*;
 
-public abstract class AnimatedIcon extends JComponent implements Disposable {
-
-  private Icon[] myIcons;
-  private Dimension myPrefSize = new Dimension();
+/**
+ * @author Kirill Kalishev
+ * @author Konstantin Bulenkov
+ */
+public class AnimatedIcon extends JComponent implements Disposable {
+  private final Icon[] myIcons;
+  private final Dimension myPrefSize = new Dimension();
 
+  //no need to make it volatile, all r/w operations are from EDT
   private int myCurrentIconIndex;
 
-  private Icon myPassiveIcon;
+  private final Icon myPassiveIcon;
+  private final Icon myEmptyPassiveIcon;
 
-  private Icon myEmptyPassiveIcon;
   private boolean myPaintPassive = true;
-
   private boolean myRunning = true;
 
-  protected Animator myAnimator;
+  protected final Animator myAnimator;
 
   private final String myName;
 
-  private boolean myLastPaintWasRunning;
-  private boolean myPaintingBgNow;
+  //private boolean myPaintingBgNow;
 
-  protected AnimatedIcon(final String name) {
+  public AnimatedIcon(final String name, Icon[] icons, Icon passiveIcon, int cycleLength) {
     myName = name;
-  }
-
-  protected final void init(Icon[] icons, Icon passiveIcon, int cycleLength) {
-    myIcons = icons;
+    myIcons = icons.length == 0 ? new Icon[]{passiveIcon} : icons;
     myPassiveIcon = passiveIcon;
 
-    myPrefSize = new Dimension();
     for (Icon each : icons) {
       myPrefSize.width = Math.max(each.getIconWidth(), myPrefSize.width);
       myPrefSize.height = Math.max(each.getIconHeight(), myPrefSize.height);
@@ -62,16 +61,9 @@ public abstract class AnimatedIcon extends JComponent implements Disposable {
     UIUtil.removeQuaquaVisualMarginsIn(this);
 
     myAnimator = new Animator(myName, icons.length, cycleLength, true) {
-      public void paintNow(final float frame, final float totalFrames, final float cycle) {
-        if (frame < 0) {
-          myCurrentIconIndex = 0;
-        }
-        else if (frame >= myIcons.length) {
-          myCurrentIconIndex = myIcons.length-1;
-        }
-        else {
-          myCurrentIconIndex = (int)frame;
-        }
+      public void paintNow(final int frame, final int totalFrames, final int cycle) {
+        final int len = myIcons.length;
+        myCurrentIconIndex = frame < 0 ? 0 : frame >= len ? len - 1 : frame;
         paintImmediately(0, 0, getWidth(), getHeight());
       }
     };
@@ -126,7 +118,7 @@ public abstract class AnimatedIcon extends JComponent implements Disposable {
   }
 
   public void dispose() {
-    myAnimator.dispose();
+    Disposer.dispose(myAnimator);
   }
 
   public Dimension getPreferredSize() {
@@ -143,7 +135,7 @@ public abstract class AnimatedIcon extends JComponent implements Disposable {
   }
 
   protected void paintComponent(Graphics g) {
-    if (myPaintingBgNow) return;
+    //if (myPaintingBgNow) return;
 
     if (isOpaque()) {
       final Container parent = getParent();
@@ -170,7 +162,7 @@ public abstract class AnimatedIcon extends JComponent implements Disposable {
 
     paintIcon(g, icon, x, y);
 
-    myLastPaintWasRunning = myAnimator.isRunning();
+    //boolean lastPaintWasRunning = myAnimator.isRunning();
   }
 
   protected void paintIcon(Graphics g, Icon icon, int x, int y) {
index 6e84478341aa94d071cce44af69e1ad12885c2e8..b57ddfc929a621aa3582cbbffd1a38fbf7afb7ba 100644 (file)
@@ -157,7 +157,7 @@ public abstract class Animator implements Disposable {
     }
   }
 
-  public abstract void paintNow(float frame, final float totalFrames, final float cycle);
+  public abstract void paintNow(int frame, int totalFrames, int cycle);
 
   public void dispose() {
     myDisposed = true;
index 3b3881b00b429a5fe5474730a29944ff2d2737ea..6e8a74b756c51e120c0d14c8ab3201c0b411b494 100644 (file)
@@ -36,10 +36,7 @@ public class AsyncProcessIcon extends AnimatedIcon {
   }
 
   private AsyncProcessIcon(@NonNls String name, Icon[] icons, Icon passive) {
-    super(name);
-
-    init(icons, passive, CYCLE_LENGTH);
-
+    super(name, icons, passive, CYCLE_LENGTH);
     setUseMask(false);
   }
 
index 749087defb2e283caf4f7d583db8a1dcbf033e2c..9abc1de863f095fe682101066737d23c7b472619 100644 (file)
@@ -56,7 +56,7 @@ public class ButtonlessScrollBarUI extends BasicScrollBarUI {
     final int framesCount = 10 + delayFrames;
     myAnimator = new Animator("Adjustment fadeout", framesCount, framesCount * 50, false) {
       @Override
-      public void paintNow(float frame, float totalFrames, float cycle) {
+      public void paintNow(int frame, int totalFrames, int cycle) {
         myAnimationColorShift = 40;
         if (frame > delayFrames) {
           myAnimationColorShift *= 1 - (frame - delayFrames) / (totalFrames - delayFrames);
index 66d153f1639847409e7664c2993cb35ce55869d7..190f202cd05b33223828a2ad40b7d69ad51ff30f 100644 (file)
@@ -36,8 +36,10 @@ import com.intellij.openapi.ui.popup.JBPopupFactory;
 import com.intellij.openapi.ui.popup.LightweightWindowEvent;
 import com.intellij.openapi.util.*;
 import com.intellij.openapi.util.registry.Registry;
-import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.wm.*;
+import com.intellij.openapi.wm.CustomStatusBarWidget;
+import com.intellij.openapi.wm.IdeFrame;
+import com.intellij.openapi.wm.StatusBar;
+import com.intellij.openapi.wm.WindowManager;
 import com.intellij.ui.awt.RelativePoint;
 import com.intellij.ui.components.panels.NonOpaquePanel;
 import com.intellij.util.Consumer;
@@ -50,9 +52,10 @@ import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 
 import javax.swing.*;
-import javax.swing.border.LineBorder;
 import java.awt.*;
-import java.awt.event.*;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
 import java.io.File;
 import java.util.*;
 import java.util.List;
@@ -176,16 +179,13 @@ public class ActionMacroManager implements ExportableApplicationComponent, Named
 
   private class Widget implements CustomStatusBarWidget, Consumer<MouseEvent> {
 
-    private AnimatedIcon myIcon = new AnimatedIcon("Macro recording") {
-      {
-        init(new Icon[] {
-          IconLoader.getIcon("/ide/macro/recording_1.png"),
-          IconLoader.getIcon("/ide/macro/recording_2.png"),
-          IconLoader.getIcon("/ide/macro/recording_3.png"),
-          IconLoader.getIcon("/ide/macro/recording_4.png")},
-             IconLoader.getIcon("/ide/macro/recording_1.png"), 1000);
-      }
-    };
+    private AnimatedIcon myIcon = new AnimatedIcon("Macro recording",
+                                                   new Icon[]{
+                                                     IconLoader.getIcon("/ide/macro/recording_1.png"),
+                                                     IconLoader.getIcon("/ide/macro/recording_2.png"),
+                                                     IconLoader.getIcon("/ide/macro/recording_3.png"),
+                                                     IconLoader.getIcon("/ide/macro/recording_4.png")},
+                                                   IconLoader.getIcon("/ide/macro/recording_1.png"), 1000);
     private StatusBar myStatusBar;
     private final WidgetPresentation myPresentation;
 
index 5fffa314c8085c00a435a9f457c0e6418a7c01ab..6c2ae03f25758bdd9d701f0d412db620a6ce8d8e 100644 (file)
@@ -448,7 +448,7 @@ public class ScrollingModelImpl implements ScrollingModelEx {
 
       myAnimator = new Animator("Animated scroller", myStepCount, SCROLL_DURATION, false, true) {
         @Override
-        public void paintNow(float frame, float totalFrames, float cycle) {
+        public void paintNow(int frame, int totalFrames, int cycle) {
           double time = (frame + 1) / (double)totalFrames;
           double fraction = timeToFraction(time);
 
index b081eb3a17a07460b84a54179eaeb28eb1ee5571..ad236d27ec24dbeb26ad2db2930659b2f1fa0427 100644 (file)
@@ -571,9 +571,9 @@ public class BalloonImpl implements Balloon, IdeTooltip.Ui {
       Disposer.dispose(myAnimator);
     }
     myAnimator = new Animator("Balloon", 8, myAnimationEnabled ? myAnimationCycle : 0, false, forward) {
-      public void paintNow(final float frame, final float totalFrames, final float cycle) {
+      public void paintNow(final int frame, final int totalFrames, final int cycle) {
         if (myComp == null || myComp.getParent() == null) return;
-        myComp.setAlpha(frame / totalFrames);
+        myComp.setAlpha(((float)frame) / ((float)totalFrames));
       }
 
       @Override