// Last edited on 2000-09-03 02:41:31 by stolfi // Scrollbars previsiveis import java.awt.Scrollbar; import java.awt.Dimension; import java.awt.Event; import Intervalo; import Ouvidor; public class PlinBarraDeAjuste extends Scrollbar { private static final int VARIACAO_TOTAL = 200; private static final int LARGURA_MINIMA = 4; private boolean ajustando = false; private Ouvidor pai; public PlinBarraDeAjuste(int dir, Ouvidor pai) { super(dir, 1, VARIACAO_TOTAL-1, 0, VARIACAO_TOTAL); this.pai = pai; validate(); } public void pegaIntervalo(Intervalo iv) // Transforma o intervalo corrente da barra "[vLo..vHi]", // relativo ao intervalo de variação "[vMin..vMax]", num // intervalo "iv", relativo a "[0..1]". Leva em conta que // "[vLo..vHi]" foi engordado por LARGURA_MINIMA. { int vBar = getVisibleAmount(); int vMax = getMaximum(); int vMin = getMinimum(); int vLo = getValue(); int vHi = vLo + vBar; System.out.print( "pegaIntervalo: [" + vMin + "..[" + vLo + ".." + vHi + "].." + vMax + "]" ); double eps = (double)LARGURA_MINIMA; double rBar = (double)vBar - eps; if (rBar < 0) { rBar = 0; } double rMin = (double)vMin; double rMax = (double)vMax; double rLo = (double)vLo + eps/2.0; double rHi = rLo + rBar; if (rLo < rMin) { rLo = rMin; rHi = rLo + rBar; } if (rHi > rMax) { rHi = rMax; rLo = rHi - rBar; } if (rLo < rMin) { rLo = rMin; } double rTot = rMax - rMin; iv.min = (rLo - rMin)/rTot; iv.max = (rHi - rMin)/rTot; System.out.println(" -> [" + iv.min + ".." + iv.max + "]"); } public void mudaIntervalo(double rMin, double rMax) // O intervalo "[rMin..rMax]" deve ser um sub-intervalo de [0..1]. // Posiciona a barra de modo que o deslizador, relativo ao // percurso da barra, seja proporcional a "[rMin..rMax]", relativo // ao intervalo [0..1]. { if (rMin > rMax) { throw new Error("mudaIntervalo: intervalo vazio"); } System.out.print("mudaIntervalo: [" + rMin + ".." + rMax + "]"); int vTot = VARIACAO_TOTAL; int vMin = 0; int vMax = vMin + vTot; double eps = (double)LARGURA_MINIMA; int dMin = vMin + (int)(rMin * (double)vTot - eps/2.0 + 0.5); int dMax = vMin + (int)(rMax * (double)vTot + eps/2.0 + 0.5); int vBar = dMax - dMin; if (dMin < vMin) { dMin = vMin; dMax = dMin + vBar; } if (dMax > vMax) { dMax = vMax; dMin = dMax - vBar; } if (dMin < vMin) { dMin = vMin; } setValues(dMin, vBar, vMin, vMax); setBlockIncrement(vBar); System.out.println(" -> [" + vMin + "..[" + dMin + ".." + dMax + "].." + vMax + "]"); validate(); } public void mudaIntervalo(double zMin, double zLo, double zHi, double zMax) // Posiciona a barra de modo que o deslizador, relativo ao // percurso total da barra, seja proporcional a "[zLo..zHi]", // relativo a "[zMin..zMax]". Note que é aceitavel // que "zMin > zMax", desde que "zLo > zHi". { double zD = zMax - zMin; double rMin = (zLo - zMin)/zD; double rMax = (zHi - zMin)/zD; mudaIntervalo(rMin, rMax); } public Dimension getPreferredSize() { return getMinimumSize(); } public Dimension getMinimumSize() { if (getOrientation() == Scrollbar.HORIZONTAL) { return(new Dimension(100, 20)); } else { return(new Dimension(20, 100)); } } public boolean mouseDown(Event evt, int x, int y) { super.mouseDown(evt, x, y); System.out.println("MouseDown(barra) -> (" + x + "," + y + ")"); ajustando = true; return(true); } public boolean mouseUp(Event evt, int x, int y) { super.mouseUp(evt, x, y); if ( ajustando ) { System.out.println("MouseUp(scroll) -> (" + x + "," + y + ")"); pai.avisa(this); ajustando = false; return(true); } else { return(false); } } }