package org.pepsoft.util;
import org.bridj.Pointer;
import org.bridj.cpp.com.COMRuntime;
import org.bridj.cpp.com.shell.ITaskbarList3;
import org.bridj.jawt.JAWTUtils;
import java.awt.*;
import java.util.Map;
import java.util.WeakHashMap;
/**
* Created by Pepijn on 27-11-2016.
*/
class ProgressHelper {
@SuppressWarnings("unchecked") // Guaranteed by BridJ
private ProgressHelper(Window window) {
ITaskbarList3 taskbarList;
Pointer<Integer> hwnd;
try {
taskbarList = COMRuntime.newInstance(ITaskbarList3.class);
long hwndVal = JAWTUtils.getNativePeerHandle(window);
hwnd = (Pointer<Integer>) Pointer.pointerToAddress(hwndVal);
} catch (ClassNotFoundException | RuntimeException e) {
// Probably too old a Windows version
taskbarList = null;
hwnd = null;
}
this.taskbarList = taskbarList;
this.hwnd = hwnd;
}
static void setProgress(Window window, int percentage) {
ProgressHelper progressHelper = progressHelpers.get(window);
if (progressHelper == null) {
progressHelper = new ProgressHelper(window);
progressHelpers.put(window, progressHelper);
if (progressHelper.taskbarList != null) {
progressHelper.taskbarList.SetProgressState(progressHelper.hwnd, ITaskbarList3.TbpFlag.TBPF_NORMAL);
}
}
if ((progressHelper.taskbarList != null) && (! progressHelper.errorReported)) {
progressHelper.taskbarList.SetProgressValue(progressHelper.hwnd, percentage, 100);
}
}
static void setProgressDone(Window window) {
ProgressHelper progressHelper = progressHelpers.get(window);
if (progressHelper != null) {
if (progressHelper.taskbarList != null) {
progressHelper.taskbarList.SetProgressState(progressHelper.hwnd, ITaskbarList3.TbpFlag.TBPF_NOPROGRESS);
}
progressHelpers.remove(window);
}
}
static void setProgressError(Window window) {
ProgressHelper progressHelper = progressHelpers.get(window);
if ((progressHelper != null) && (progressHelper.taskbarList != null)) {
progressHelper.taskbarList.SetProgressState(progressHelper.hwnd, ITaskbarList3.TbpFlag.TBPF_ERROR);
progressHelper.errorReported = true;
}
}
private final ITaskbarList3 taskbarList;
private final Pointer<Integer> hwnd;
private boolean errorReported;
private static final Map<Window, ProgressHelper> progressHelpers = new WeakHashMap<>();
}