private class row implements comparable {
private int modelindex;
public row(int index) {
this.modelindex = index;
}
public int compareto(object o) {
int row1 = modelindex;
int row2 = ((row) o).modelindex;
for (iterator it = sortingcolumns.iterator(); it.hasnext();) {
directive directive = (directive) it.next();
int column = directive.column;
object o1 = tablemodel.getvalueat(row1, column);
object o2 = tablemodel.getvalueat(row2, column);
int comparison = 0;
if (o1 == null && o2 == null) {
comparison = 0;
} else if (o1 == null) {
comparison = -1;
} else if (o2 == null) {
comparison = 1;
} else {
comparison = getcomparator(column).compare(o1, o2);
}
if (comparison != 0) {
return directive.direction == descending ? -comparison : comparison;
}
}
return 0;
}
}
private class tablemodelhandler implements tablemodellistener {
public void tablechanged(tablemodelevent e) {
if (!issorting()) {
clearsortingstate();
firetablechanged(e);
return;
}
if (e.getfirstrow() == tablemodelevent.header_row) {
cancelsorting();
firetablechanged(e);
return;
}
int column = e.getcolumn();
if (e.getfirstrow() == e.getlastrow()
&& column != tablemodelevent.all_columns
&& getsortingstatus(column) == not_sorted
&& modeltoview != null) {
int viewindex = getmodeltoview()[e.getfirstrow()];
firetablechanged(new tablemodelevent(tablesorter.this,
viewindex, viewindex,
column, e.gettype()));
return;
}
clearsortingstate();
firetabledatachanged();
return;
}
}
private class mousehandler extends mouseadapter {
public void mouseclicked(mouseevent e) {
jtableheader h = (jtableheader) e.getsource();
tablecolumnmodel columnmodel = h.getcolumnmodel();
int viewcolumn = columnmodel.getcolumnindexatx(e.getx());
int column = columnmodel.getcolumn(viewcolumn).getmodelindex();
if (column != -1) {
int status = getsortingstatus(column);
if (!e.iscontroldown()) {
cancelsorting();
}
status = status + (e.isshiftdown() ? -1 : 1);
status = (status + 4) % 3 - 1;
setsortingstatus(column, status);
}
}
}
private static class arrow implements icon {
private boolean descending;
private int size;
private int priority;
public arrow(boolean descending, int size, int priority) {
this.descending = descending;
this.size = size;
this.priority = priority;
}
public void painticon(component c, graphics g, int x, int y) {
color color = c == null ? color.gray : c.getbackground();
int dx = (int)(size/2*math.pow(0.8, priority));
int dy = descending ? dx : -dx;
y = y + 5*size/6 + (descending ? -dy : 0);
int shift = descending ? 1 : -1;
g.translate(x, y);
g.setcolor(color.darker());
g.drawline(dx / 2, dy, 0, 0);
g.drawline(dx / 2, dy + shift, 0, shift);
g.setcolor(color.brighter());
g.drawline(dx / 2, dy, dx, 0);
g.drawline(dx / 2, dy + shift, dx, shift);
if (descending) {
g.setcolor(color.darker().darker());
} else {
g.setcolor(color.brighter().brighter());
}
g.drawline(dx, 0, 0, 0);
g.setcolor(color);
g.translate(-x, -y);
}
public int geticonwidth() {
return size;
}
public int geticonheight() {
return size;
}
}
private class sortableheaderrenderer implements tablecellrenderer {
private tablecellrenderer tablecellrenderer;
public sortableheaderrenderer(tablecellrenderer tablecellrenderer) {
this.tablecellrenderer = tablecellrenderer;
}
public component gettablecellrenderercomponent(jtable table,
object value,
boolean isselected,
boolean hasfocus,
int row,
int column) {
component c = tablecellrenderer.gettablecellrenderercomponent(table,
value, isselected, hasfocus, row, column);
if (c instanceof jlabel) {
jlabel l = (jlabel) c;
l.sethorizontaltextposition(jlabel.left);
int modelcolumn = table.convertcolumnindextomodel(column);
l.seticon(getheaderrenderericon(modelcolumn, l.getfont().getsize()));
}
return c;
}
}
private static class directive {
private int column;
private int direction;
public directive(int column, int direction) {
this.column = column;
this.direction = direction;
}
}
}