package org.basex.gui.layout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
/**
* Project specific Split panel implementation.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class BaseXSplit extends BaseXBack implements LayoutManager {
/** Layout: horizontal = true, vertical = false. */
private final boolean l;
/** Panel positions. */
private double[] s;
/** Temporary panel positions. */
private double[] t;
/** Temporary drag position. */
private double d;
/**
* Constructor.
* @param lay layout: horizontal = true, vertical = false
*/
public BaseXSplit(final boolean lay) {
layout(this);
l = lay;
}
@Override
public Component add(final Component comp) {
if(getComponentCount() != 0) super.add(new BaseXSplitSep(l));
super.add(comp);
s = null;
return comp;
}
@Override
public void removeAll() {
super.removeAll();
s = null;
}
/**
* Starts split pane dragging.
* @param p position
*/
void startDrag(final double p) {
d = p;
t = s.clone();
}
/**
* Reacts on splitter drags.
* @param sep separator
* @param p current position
*/
void drag(final BaseXSplitSep sep, final double p) {
final Component[] m = getComponents();
final int r = s.length;
int q = 0;
for(int n = 0; n < r - 1; ++n) if(m[(n << 1) + 1] == sep) q = n + 1;
final double v = (d - p) / (l ? getWidth() : getHeight());
for(int i = 0; i < q; ++i) if(t[i] - v / q < .0001) return;
for(int i = q; i < r; ++i) if(t[i] + v / (r - q) < .0001) return;
for(int i = 0; i < q; ++i) s[i] = t[i] - v / q;
for(int i = q; i < r; ++i) s[i] = t[i] + v / (r - q);
revalidate();
}
@Override
public void addLayoutComponent(final String name, final Component comp) { }
@Override
public void removeLayoutComponent(final Component comp) { }
@Override
public Dimension preferredLayoutSize(final Container parent) {
return getSize();
}
@Override
public Dimension minimumLayoutSize(final Container parent) {
return preferredLayoutSize(parent);
}
@Override
public void layoutContainer(final Container parent) {
final Component[] c = getComponents();
final int h = getHeight();
final int w = getWidth();
final int m = c.length + 1 >> 1;
final double p = (l ? w : h) - (m - 1) * BaseXSplitSep.SIZE;
final boolean a = s == null;
if(a) s = new double[m];
double v = 0;
for(int n = 0; n < c.length; ++n) {
final boolean b = (n & 1) == 0;
double z = BaseXSplitSep.SIZE;
if(b) z = s[n >> 1] == 0 ? (int) (p / m) : s[n >> 1] * p;
final int y = (int) v;
c[n].setBounds(l ? y : 0, l ? 0 : y, l ? (int) z : w, l ? h : (int) z);
if(a && b) s[n >> 1] = z / p;
v += z;
}
}
}