package com.eas.client.utils.scalableui;
import javax.swing.RepaintManager;
import java.awt.*;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
public class ZoomRepaintManager extends RepaintManager {
protected ZoomRepaintManager() {
super();
}
@Override
public void addDirtyRegion(JComponent c, int x, int y, int w, int h) {
JScalablePanel pc = getPanelContainer(c);
if (pc != null && pc.isVisible() && c != pc) {
if (!pc.isPainting()) {
float scale = pc.getScale();
float dxy = 2 / scale;
Point lnewDirtyLocation = SwingUtilities.convertPoint(c, x, y, pc);
int sx = Math.round(scale * (float) lnewDirtyLocation.x - dxy);
int sy = Math.round(scale * (float) lnewDirtyLocation.y - dxy);
int sw = Math.round(scale * (float) w + dxy);
int sh = Math.round(scale * (float) h + dxy);
super.addDirtyRegion(pc, sx, sy, sw, sh);
//
assert RepaintManager.currentManager(pc) != this;
// Warning! this call is leagal only and only if global repaint manager is not this!!!!
pc.repaint(sx, sy, sw, sh);
}
} else {
super.addDirtyRegion(c, x, y, w, h);
}
}
public static JScalablePanel getPanelContainer(Component c) {
while (c != null && !(c instanceof JScalablePanel)) {
c = c.getParent();
}
if (c != null && c.isVisible() && c instanceof JScalablePanel) {
return (JScalablePanel) c;
}
return null;
}
public static ScalableComboPopup getScalableComboPopup(Component c) {
while (c != null && !(c instanceof ScalableComboPopup)) {
c = c.getParent();
}
if (c != null && c.isVisible() && c instanceof ScalableComboPopup) {
return (ScalableComboPopup) c;
}
return null;
}
}