forked from LupusNobilis/java-org.hwo
TreeTable: SelectionMode, selectedRow
parent
a7056482f3
commit
dba92aaa8b
|
@ -0,0 +1,8 @@
|
||||||
|
package org.hwo.ui;
|
||||||
|
|
||||||
|
public enum SelectionMode {
|
||||||
|
NONE,
|
||||||
|
CELL,
|
||||||
|
ROW,
|
||||||
|
COLUMN
|
||||||
|
}
|
|
@ -30,6 +30,7 @@ import org.hwo.ui.CellEditorListener;
|
||||||
import org.hwo.ui.CellRenderer;
|
import org.hwo.ui.CellRenderer;
|
||||||
import org.hwo.ui.DefaultCellEditor;
|
import org.hwo.ui.DefaultCellEditor;
|
||||||
import org.hwo.ui.DefaultCellRenderer;
|
import org.hwo.ui.DefaultCellRenderer;
|
||||||
|
import org.hwo.ui.SelectionMode;
|
||||||
import org.hwo.ui.shapes.Triangle;
|
import org.hwo.ui.shapes.Triangle;
|
||||||
import org.hwo.ui.treetable.DefaultTreeTableColumnModel.Column;
|
import org.hwo.ui.treetable.DefaultTreeTableColumnModel.Column;
|
||||||
|
|
||||||
|
@ -93,6 +94,9 @@ public class TreeTable extends JComponent implements Scrollable, TreeTableModelL
|
||||||
|
|
||||||
private CellEditor activeEditor;
|
private CellEditor activeEditor;
|
||||||
|
|
||||||
|
private SelectionMode selectionMode;
|
||||||
|
private int selectedRow;
|
||||||
|
|
||||||
|
|
||||||
public TreeTable()
|
public TreeTable()
|
||||||
{
|
{
|
||||||
|
@ -160,6 +164,8 @@ public class TreeTable extends JComponent implements Scrollable, TreeTableModelL
|
||||||
|
|
||||||
prepareWidth();
|
prepareWidth();
|
||||||
prepareHeight();
|
prepareHeight();
|
||||||
|
|
||||||
|
selectedRow = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Point mouseToCell(int x,int y)
|
public Point mouseToCell(int x,int y)
|
||||||
|
@ -218,6 +224,10 @@ public class TreeTable extends JComponent implements Scrollable, TreeTableModelL
|
||||||
{
|
{
|
||||||
NodeState state = getState(rowObjects.get(row));
|
NodeState state = getState(rowObjects.get(row));
|
||||||
setOpened(rowObjects.get(row), !state.opened);
|
setOpened(rowObjects.get(row), !state.opened);
|
||||||
|
} else if (selectionMode == SelectionMode.ROW)
|
||||||
|
{
|
||||||
|
selectedRow = row;
|
||||||
|
repaint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -286,6 +296,82 @@ public class TreeTable extends JComponent implements Scrollable, TreeTableModelL
|
||||||
return new Rectangle(left, top, width, rowHeight);
|
return new Rectangle(left, top, width, rowHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void paintRow(Graphics g,int row)
|
||||||
|
{
|
||||||
|
Object ro = rowObjects.get(row);
|
||||||
|
NodeState state = getState(ro);
|
||||||
|
int top = rowHeight * row;
|
||||||
|
int bottom = top + rowHeight - 1;
|
||||||
|
|
||||||
|
if (selectedRow == row)
|
||||||
|
{
|
||||||
|
g.setColor(Color.BLUE);
|
||||||
|
g.fillRect(0, top, getColumnModel().getColumnPos(getColumnModel().getColumnCount()) - 1, rowHeight - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
g.setColor(Color.black);
|
||||||
|
g.drawLine(0, bottom, getWidth(), bottom);
|
||||||
|
|
||||||
|
for (int column = 0; column < columnModel.getColumnCount(); column++)
|
||||||
|
{
|
||||||
|
int left = columnModel.getColumnPos(column);
|
||||||
|
int width = columnModel.getColumnWidth(column);
|
||||||
|
int right = left + width - 1;
|
||||||
|
|
||||||
|
g.drawLine(right , top, right, bottom);
|
||||||
|
|
||||||
|
|
||||||
|
if (column==0)
|
||||||
|
{
|
||||||
|
int a = rowHeight / 4;
|
||||||
|
int b = rowHeight / 2;
|
||||||
|
|
||||||
|
left += state.indentation * 5;
|
||||||
|
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
|
||||||
|
if (model.getChildCount(ro)>0)
|
||||||
|
{
|
||||||
|
if (!state.isOpened())
|
||||||
|
{
|
||||||
|
g.drawPolygon(new Triangle(left + a, top + a, left + b, top + b, left + a, bottom - a));
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
g.drawPolygon(new Triangle(left + a, top + b, left + a + b, top + b, left + b, bottom - a ));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
left += rowHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
g.setColor(getForeground());
|
||||||
|
|
||||||
|
Object value = model.getValue(ro, columnModel.getColumnModelColumn(column));
|
||||||
|
CellRenderer renderer = columnModel.getColumnCellRenderer(column);
|
||||||
|
|
||||||
|
if (renderer == null)
|
||||||
|
if (value != null)
|
||||||
|
renderer = findCellRenderer(value.getClass());
|
||||||
|
else
|
||||||
|
renderer = findCellRenderer(null);
|
||||||
|
|
||||||
|
Rectangle rect = new Rectangle(left, top, width, rowHeight);
|
||||||
|
|
||||||
|
Rectangle clipRestore = g.getClipBounds();
|
||||||
|
|
||||||
|
if (clipRestore.intersects(rect))
|
||||||
|
{
|
||||||
|
Rectangle rectClip = clipRestore.intersection(rect);
|
||||||
|
|
||||||
|
g.setClip(rectClip);
|
||||||
|
renderer.renderCell(g, row, column, rect, value, ro);
|
||||||
|
g.setClip(clipRestore);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void paint(Graphics g) {
|
public void paint(Graphics g) {
|
||||||
prepareRows();
|
prepareRows();
|
||||||
|
@ -295,71 +381,7 @@ public class TreeTable extends JComponent implements Scrollable, TreeTableModelL
|
||||||
|
|
||||||
for (int i=0;i<rowObjects.size();i++)
|
for (int i=0;i<rowObjects.size();i++)
|
||||||
{
|
{
|
||||||
Object ro = rowObjects.get(i);
|
paintRow(g, i);
|
||||||
NodeState state = getState(ro);
|
|
||||||
int top = rowHeight * i;
|
|
||||||
int bottom = top + rowHeight - 1;
|
|
||||||
|
|
||||||
g.setColor(Color.black);
|
|
||||||
g.drawLine(0, bottom, getWidth(), bottom);
|
|
||||||
|
|
||||||
for (int column = 0; column < columnModel.getColumnCount(); column++)
|
|
||||||
{
|
|
||||||
int left = columnModel.getColumnPos(column);
|
|
||||||
int width = columnModel.getColumnWidth(column);
|
|
||||||
int right = left + width - 1;
|
|
||||||
|
|
||||||
g.drawLine(right , top, right, bottom);
|
|
||||||
|
|
||||||
|
|
||||||
if (column==0)
|
|
||||||
{
|
|
||||||
int a = rowHeight / 4;
|
|
||||||
int b = rowHeight / 2;
|
|
||||||
|
|
||||||
left += state.indentation * 5;
|
|
||||||
|
|
||||||
g.setColor(Color.BLACK);
|
|
||||||
|
|
||||||
if (model.getChildCount(ro)>0)
|
|
||||||
{
|
|
||||||
if (!state.isOpened())
|
|
||||||
{
|
|
||||||
g.drawPolygon(new Triangle(left + a, top + a, left + b, top + b, left + a, bottom - a));
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
g.drawPolygon(new Triangle(left + a, top + b, left + a + b, top + b, left + b, bottom - a ));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
left += rowHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
g.setColor(getForeground());
|
|
||||||
|
|
||||||
Object value = model.getValue(ro, columnModel.getColumnModelColumn(column));
|
|
||||||
CellRenderer renderer = columnModel.getColumnCellRenderer(column);
|
|
||||||
|
|
||||||
if (renderer == null)
|
|
||||||
if (value != null)
|
|
||||||
renderer = findCellRenderer(value.getClass());
|
|
||||||
else
|
|
||||||
renderer = findCellRenderer(null);
|
|
||||||
|
|
||||||
Rectangle rect = new Rectangle(left, top, width, rowHeight);
|
|
||||||
|
|
||||||
Rectangle clipRestore = g.getClipBounds();
|
|
||||||
|
|
||||||
if (clipRestore.intersects(rect))
|
|
||||||
{
|
|
||||||
Rectangle rectClip = clipRestore.intersection(rect);
|
|
||||||
|
|
||||||
g.setClip(rectClip);
|
|
||||||
renderer.renderCell(g, i, column, rect, value, ro);
|
|
||||||
g.setClip(clipRestore);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -618,6 +640,22 @@ public class TreeTable extends JComponent implements Scrollable, TreeTableModelL
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getSelectedRow() {
|
||||||
|
return selectedRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedRow(int selectedRow) {
|
||||||
|
this.selectedRow = selectedRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SelectionMode getSelectionMode() {
|
||||||
|
return selectionMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectionMode(SelectionMode selectionMode) {
|
||||||
|
this.selectionMode = selectionMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue