diff --git a/jdk/src/java.desktop/share/classes/java/awt/Taskbar.java b/jdk/src/java.desktop/share/classes/java/awt/Taskbar.java
index 5510da3bdac..112ccb59001 100644
--- a/jdk/src/java.desktop/share/classes/java/awt/Taskbar.java
+++ b/jdk/src/java.desktop/share/classes/java/awt/Taskbar.java
@@ -407,10 +407,21 @@ public class Taskbar {
}
/**
- * Displays progress for specified window.
+ * Displays a determinate progress bar in the task area for the specified
+ * window.
+ *
+ * The visual behavior is platform and {@link State} dependent.
+ *
+ * This call cancels the {@link State#INDETERMINATE INDETERMINATE} state
+ * of the window.
+ *
+ * Note that when multiple windows is grouped in the task area
+ * the behavior is platform specific.
*
* @param w window to update
- * @param value from 0 to 100, other to disable progress indication
+ * @param value from 0 to 100, other to switch to {@link State#OFF} state
+ * and disable progress indication
+ * @see #setWindowProgressState(java.awt.Window, State)
* @throws SecurityException if a security manager exists and it denies the
* {@code RuntimePermission("canProcessApplicationEvents")} permission.
* @throws UnsupportedOperationException if the current platform
@@ -426,14 +437,21 @@ public class Taskbar {
/**
* Sets a progress state for a specified window.
+ *
+ * Each state displays a progress in a platform-dependent way.
+ *
+ * Note than switching from {@link State#INDETERMINATE INDETERMINATE} state
+ * to any of determinate states may reset value set by
+ * {@link #setWindowProgressValue(java.awt.Window, int) setWindowProgressValue}
*
* @param w window
* @param state to change to
* @see State#OFF
* @see State#NORMAL
* @see State#PAUSED
- * @see State#INDETERMINATE
* @see State#ERROR
+ * @see State#INDETERMINATE
+ * @see #setWindowProgressValue(java.awt.Window, int)
* @throws SecurityException if a security manager exists and it denies the
* {@code RuntimePermission("canProcessApplicationEvents")} permission.
* @throws UnsupportedOperationException if the current platform
diff --git a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Taskbar.cpp b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Taskbar.cpp
index ebb07187322..19a6fd743b4 100644
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Taskbar.cpp
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Taskbar.cpp
@@ -58,7 +58,11 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WTaskbarPeer_nativeInit
JNIEXPORT void JNICALL Java_sun_awt_windows_WTaskbarPeer_setProgressValue
(JNIEnv *, jobject, jlong window, jint value)
{
- m_Taskbar->SetProgressValue((HWND)window, value, 100);
+ if (value < 0 || value > 100) {
+ m_Taskbar->SetProgressState((HWND)window, TBPF_NOPROGRESS);
+ } else {
+ m_Taskbar->SetProgressValue((HWND)window, value, 100);
+ }
}
@@ -88,6 +92,9 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WTaskbarPeer_setProgressState
flag = TBPF_NOPROGRESS;
} else if (strcmp(valueNative, "NORMAL") == 0) {
flag = TBPF_NORMAL;
+
+ // Switching from TBPF_INDETERMINATE to TBPF_NORMAL has no effect
+ m_Taskbar->SetProgressState((HWND)window, TBPF_PAUSED);
} else if (strcmp(valueNative, "PAUSED") == 0) {
flag = TBPF_PAUSED;
} else if (strcmp(valueNative, "INDETERMINATE") == 0) {