rendered paste bodypackage katastrofeklient;
import katastrofeserver.*;
import javax.swing.*;
import java.util.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
public class WarpTable extends JPanel {
private Main main;
private DefaultTableColumnModel tableColumnModel=null;
// type tabell
private int tabelltype = -1;
public static final int BEHOV = 1;
public static final int OBSERVASJON = 2;
public static final int RESSURS = 3;
public static final int PERSON = 4;
// tabell-variabler
private ArrayList data = null;
private JTable table = null;
private Vector<String> columns = null;
private Vector rows = null;
private JTableModel tableModel = null;
private JScrollPane scroll = null;
private int scrollValue = -1;
// extras
private int extras = 0;
public static final int NONE = 0;
public static final int CHECKBOXES = 1;
public static final int SELECTBUTTONS = 2;
public static final int DELETEBUTTONS = 3;
public static final int FRIGIBUTTONS = 4;
private Object parent;
public WarpTable(Object parent, ArrayList data, int extras, Main main) {
super();
this.parent = parent;
this.main = main;
this.setLayout(new BorderLayout(0, 0));
this.data = data;
this.extras = extras;
createTable();
}
private void saveScrollValue() {
scrollValue = scroll.getVerticalScrollBar().getValue();
}
private void restoreScrollValue() {
scroll.getVerticalScrollBar().setValue(scrollValue);
}
private void update() {
saveScrollValue();
for(Component c : getComponents()) {
if (c instanceof JScrollPane) {
remove(c);
}
}
createTable();
}
private void createTable() {
try {
identifyTableType();
makeRows();
makeColumns();
buildTable();
} catch (Exception e) {
// do nothing
}
}
public void idSelected(String id) {
if (extras == CHECKBOXES) {
tableModel.toggleBoolean(id);
return;
}
Object selected = null;
switch (tabelltype) {
case BEHOV:
for (Object o : data) {
if (((Behov) o).getBid().equals(id)) {
selected = o;
break;
}
}
break;
case OBSERVASJON:
for (Object o : data) {
if (((Observasjon) o).getOid().equals(id)) {
selected = o;
break;
}
}
break;
case RESSURS:
for (Object o : data) {
if (((Ressurs) o).getRid().equals(id)) {
selected = o;
break;
}
}
break;
case PERSON:
for (Object o : data) {
if (((Person) o).getPid().equals(id)) {
selected = o;
break;
}
}
break;
}
String svar = "";
switch (extras){
case WarpTable.DELETEBUTTONS:
svar = main.slettObject(selected);
if(!svar.equalsIgnoreCase("nei")){
if(selected instanceof Behov){
System.out.println("Slettet behov"+((Behov)selected).getBid());
}
else if(selected instanceof Ressurs){
System.out.println("Slettet ressurs"+((Ressurs)selected).getRid());
}
else {
try{System.out.println("Slettet Observasjon"+((Observasjon)selected).getOid());}
catch (Exception e){System.out.println("Alvorlig feil i warptable");}
}
removeItem(selected);
}
System.out.println("Kunne ikke slette!!");
update();
break;
case WarpTable.SELECTBUTTONS:
if (parent instanceof WarpQuestion) {
((WarpQuestion)parent).setReturnValue(selected);
((WarpQuestion)parent).dispose();
break;
}
main.velgObject(selected, parent);
break;
case WarpTable.FRIGIBUTTONS:
svar = main.frigiObject(selected);
if(!svar.equalsIgnoreCase("nei")){
if (selected instanceof Behov){
System.out.println("Frigjorde ressursene til behovet:"+((Behov)selected).getBid());
}
else try{System.out.println("Frigjorde ressursen:"+((Ressurs)selected).getRid());}
catch(Exception e){System.out.println("ALVORLIG feil i warptable");}
removeItem(selected);
}
update();
break;
}
if (svar.equalsIgnoreCase("nei")){
System.out.println("Kunne ikke utføre operasjonen");
}
}
private void removeItem(Object selected) {
for (Object o : data) {
if (o.equals(selected)) {
data.remove(o);
break;
}
}
}
public ArrayList getSelected() {
Vector selected = tableModel.getSelected();
ArrayList result = new ArrayList();
for (Object o : selected) {
String id = o.toString();
for (Object d : data) {
if (d instanceof Behov && ((Behov) d).getBid().equals(id))
result.add(d);
if (d instanceof Observasjon &&
((Observasjon) d).getOid().equals(id))
result.add(d);
if (d instanceof Ressurs && ((Ressurs) d).getRid().equals(id))
result.add(d);
if (d instanceof Person && ((Person) d).getPid().equals(id))
result.add(d);
}
}
return result;
}
private void identifyTableType() {
if (data.get(0) instanceof Behov)
tabelltype = BEHOV;
else if (data.get(0) instanceof Observasjon)
tabelltype = OBSERVASJON;
else if (data.get(0) instanceof Ressurs)
tabelltype = RESSURS;
else if (data.get(0) instanceof Person)
tabelltype = PERSON;
}
private void makeRows() {
rows = new Vector(0);
switch (tabelltype) {
case RESSURS:
for (Object object : data) {
Ressurs r = (Ressurs) object;
Vector rv = new Vector(0);
rv.addElement(r.getRid());
rv.addElement(r.getUtm());
rv.addElement(r.getBeskrivelse());
rv.addElement(r.getKategori());
rv.addElement(r.getType());
rv.addElement(r.getStatus());
rv.addElement(r.getPersonid());
rv.addElement(r.getBid());
rows.addElement(rv);
}
break;
case BEHOV:
for (Object object : data) {
Behov b = (Behov) object;
Vector bv = new Vector(0);
bv.addElement(b.getBid());
bv.addElement(b.getUtm());
bv.addElement(b.getBeskrivelse());
bv.addElement(b.getKategori());
bv.addElement(b.getType());
bv.addElement(b.getTidsfaktor());
bv.addElement(b.getOid());
bv.addElement(b.getStatus());
bv.addElement(b.getPersonid());
rows.addElement(bv);
}
break;
case OBSERVASJON:
for (Object object : data) {
Observasjon o = (Observasjon) object;
Vector ov = new Vector(0);
ov.addElement(o.getOid());
ov.addElement(o.getObservasjon());
ov.addElement(o.getReferanse());
ov.addElement(o.getTidspunkt());
ov.addElement(o.getKontakttlf());
rows.addElement(ov);
}
break;
case PERSON:
for (Object object : data) {
Person p = (Person) object;
Vector pv = new Vector(0);
pv.addElement(p.getPid());
pv.addElement(p.getFornavn());
pv.addElement(p.getEtternavn());
pv.addElement(p.getAdresse());
pv.addElement(p.getPostnr());
pv.addElement(p.getPoststed());
pv.addElement(p.getTelefonnr());
rows.addElement(pv);
}
break;
}
}
private void makeColumns() {
columns = new Vector<String>(0);
switch (tabelltype) {
case RESSURS:
columns.add("RID");
columns.add("UTM");
columns.add("BESKRIVELSE");
columns.add("KATEGORI");
columns.add("TYPE");
columns.add("STATUS");
columns.add("PERSONID");
columns.add("BID");
break;
case BEHOV:
columns.add("BID");
columns.add("UTM");
columns.add("BESKRIVELSE");
columns.add("KATEGORI");
columns.add("TYPE");
columns.add("TIDSFAKTOR");
columns.add("OID");
columns.add("STATUS");
columns.add("PERSONID");
break;
case OBSERVASJON:
columns.add("OID");
columns.add("OBSERVASJON");
columns.add("REFERANSE");
columns.add("TIDSPUNKT");
columns.add("KONTAKTTLF");
break;
case PERSON:
columns.add("PID");
columns.add("FORNAVN");
columns.add("ETTERNAVN");
columns.add("ADRESSE");
columns.add("POSTNUMMER");
columns.add("POSTSTED");
columns.add("TELEFONNR");
break;
}
}
private void buildTable() {
tableModel = new JTableModel(rows, columns, extras);
tableColumnModel = new WarpTableColumnModel(extras);
TableSorter sortedModel = new TableSorter(tableModel);
table = new JTable(sortedModel, tableColumnModel);
table.createDefaultColumnsFromModel();
sortedModel.setTableHeader(table.getTableHeader());
TableCellRenderer defaultRenderer = table.getDefaultRenderer(JButton.class);
table.setDefaultRenderer(JButton.class,
new JTableRenderer(defaultRenderer));
JTableButtonMouseListener mouse = new JTableButtonMouseListener(this,
table);
table.addMouseListener(mouse);
table.addMouseMotionListener(mouse);
table.setColumnSelectionAllowed(false);
table.setRowSelectionAllowed(false);
table.setEnabled(false);
limitColumnWidths();
scroll = new JScrollPane(table);
this.add(scroll, BorderLayout.CENTER);
validate();
if (scrollValue == -1) {
saveScrollValue();
} else {
restoreScrollValue();
}
validate();
}
public void limitColumnWidths() {
switch (tabelltype) {
case RESSURS:
limitWidthOfColumn(0);
limitWidthOfColumn(1);
limitWidthOfColumn(3);
limitWidthOfColumn(4);
limitWidthOfColumn(5);
limitWidthOfColumn(6);
limitWidthOfColumn(7);
break;
case BEHOV:
limitWidthOfColumn(0);
limitWidthOfColumn(1);
limitWidthOfColumn(3);
limitWidthOfColumn(4);
limitWidthOfColumn(5);
limitWidthOfColumn(6);
limitWidthOfColumn(7);
limitWidthOfColumn(8);
break;
case OBSERVASJON:
limitWidthOfColumn(0);
limitWidthOfColumn(2);
limitWidthOfColumn(3);
limitWidthOfColumn(4);
break;
case PERSON:
limitWidthOfColumn(0);
limitWidthOfColumn(1);
limitWidthOfColumn(2);
limitWidthOfColumn(3);
limitWidthOfColumn(4);
limitWidthOfColumn(5);
limitWidthOfColumn(6);
break;
}
}
private void limitWidthOfColumn(int columnNumber) {
FontMetrics tableFont = getFontMetrics(table.getFont());
FontMetrics headerFont = getFontMetrics(table.getTableHeader().getFont());
int minWidth = headerFont.stringWidth((String)columns.elementAt(columnNumber)) + 10;
int maxWidth = minWidth;
int widthFix = 10;
for (Object row : rows) {
String s = (String)((Vector)row).elementAt(columnNumber);
if (tableFont.stringWidth(s) + widthFix > maxWidth) {
maxWidth = tableFont.stringWidth(s) + widthFix;
}
}
TableColumn tc = table.getColumnModel().getColumn(columnNumber);
tc.setPreferredWidth(maxWidth);
tc.setMaxWidth(maxWidth);
tc.setMinWidth(minWidth);
}
}
class JTableRenderer implements TableCellRenderer {
private TableCellRenderer __defaultRenderer;
public JTableRenderer(TableCellRenderer renderer) {
__defaultRenderer = renderer;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected,
boolean hasFocus,
int row, int column) {
if (value instanceof Component)
return (Component) value;
return __defaultRenderer.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
}
}
class WarpTableColumnModel extends DefaultTableColumnModel {
int extras;
public WarpTableColumnModel(int extras) {
super();
this.extras = extras;
}
public TableColumn getColumn(int columnIndex) {
TableColumn tc = super.getColumn(columnIndex);
if (extras != WarpTable.NONE && columnIndex == getColumnCount()-1) {
switch (extras) {
case WarpTable.CHECKBOXES:
tc.setPreferredWidth(33);
tc.setMaxWidth(33);
tc.setMinWidth(33);
break;
default:
tc.setPreferredWidth(75);
tc.setMaxWidth(75);
tc.setMinWidth(75);
}
}
return tc;
}
}
class JTableModel extends AbstractTableModel {
private Vector rows;
private Vector columns;
private int extras;
private Vector ev = new Vector(0);
public JTableModel(Vector rows, Vector<String> columns, int extras) {
this.rows = rows;
this.columns = columns;
this.extras = extras;
if (extras > 0) {
for (int i = 0; i < rows.size(); i++) {
switch (extras) {
case WarpTable.CHECKBOXES:
ev.addElement(new Boolean(false));
break;
case WarpTable.SELECTBUTTONS:
ev.addElement(new JButton("Velg"));
break;
case WarpTable.DELETEBUTTONS:
ev.addElement(new JButton("Slett"));
break;
case WarpTable.FRIGIBUTTONS:
ev.addElement(new JButton("Frigi"));
break;
}
}
}
}
public String getColumnName(int column) {
if (column == columns.size()) {
switch (extras) {
case WarpTable.CHECKBOXES:
return "Valgt";
case WarpTable.SELECTBUTTONS:
case WarpTable.DELETEBUTTONS:
case WarpTable.FRIGIBUTTONS:
return "Knapp";
}
}
return columns.elementAt(column).toString();
}
public void toggleBoolean(String id) {
for (int i = 0; i < ev.size(); i++) {
if ((getValueAt(i, 0).equals(id))) {
ev.setElementAt((Object) (!((Boolean) ev.elementAt(i))), i);
break;
}
}
}
public Vector getSelected() {
Vector selected = new Vector(0);
for (int i = 0; i < ev.size(); i++) {
if ((Boolean) ev.elementAt(i)) {
selected.add(((Vector) rows.elementAt(i)).elementAt(0).toString());
}
}
return selected;
}
public int getRowCount() {
return rows.size();
}
public int getColumnCount() {
if (extras > 0) {
return columns.size() + 1;
}
return columns.size();
}
public Object getValueAt(int row, int column) {
Object o = null;
if (extras > 0 && column == columns.size()) {
o = ev.elementAt(row);
} else {
o = ((Vector) rows.elementAt(row)).elementAt(column);
}
if (o instanceof JButton) {
return (JButton) o;
} else if (o instanceof Boolean) {
return (Boolean) o;
} else {
return (String) o;
}
}
public boolean isCellEditable(int row, int column) {
return false;
}
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
}
class JTableButtonMouseListener implements MouseListener, MouseMotionListener {
private JTable __table;
private JButton lastButton;
private MouseEvent lastEvent;
private WarpTable warp;
private void __forwardEventToButton(MouseEvent e) {
TableColumnModel columnModel = __table.getColumnModel();
int column = columnModel.getColumnIndexAtX(e.getX());
int row = e.getY() / __table.getRowHeight();
if (row >= __table.getRowCount() ||
row < 0 ||
column >= __table.getColumnCount() ||
column < 0) {
if (lastButton != null) {
exitButton(lastButton, lastEvent);
}
lastButton = null;
__table.repaint();
return;
}
Object value = __table.getValueAt(row, column);
if (value instanceof Boolean && e.getID() == MouseEvent.MOUSE_CLICKED) {
warp.idSelected(__table.getModel().getValueAt(row, 0).toString());
__table.repaint();
}
if (!(value instanceof JButton)) {
if (lastButton != null) {
exitButton(lastButton, lastEvent);
}
lastButton = null;
__table.repaint();
return;
}
JButton button = (JButton) value;
MouseEvent buttonEvent = (MouseEvent) SwingUtilities.convertMouseEvent(
__table, e, button);
switch (buttonEvent.getID()) {
case MouseEvent.MOUSE_MOVED:
case MouseEvent.MOUSE_DRAGGED:
if (lastButton == null) {
enterButton(button, buttonEvent);
lastButton = button;
lastEvent = buttonEvent;
} else if (lastButton != button) {
exitButton(lastButton, lastEvent);
enterButton(button, buttonEvent);
lastButton = button;
lastEvent = buttonEvent;
}
break;
case MouseEvent.MOUSE_EXITED:
if (lastButton != null) {
exitButton(lastButton, lastEvent);
}
break;
case MouseEvent.MOUSE_CLICKED:
warp.idSelected(__table.getModel().getValueAt(row, 0).toString());
break;
}
__table.repaint();
}
private void enterButton(JButton button, MouseEvent event) {
button.dispatchEvent(new MouseEvent(event.getComponent(),
MouseEvent.MOUSE_ENTERED,
event.getWhen(),
event.getModifiers(),
event.getX(),
event.getY(),
event.getClickCount(),
event.isPopupTrigger()));
}
private void exitButton(JButton button, MouseEvent event) {
button.dispatchEvent(new MouseEvent(event.getComponent(),
MouseEvent.MOUSE_EXITED,
event.getWhen(),
event.getModifiers(),
event.getX(),
event.getY(),
event.getClickCount(),
event.isPopupTrigger()));
}
public JTableButtonMouseListener(WarpTable warp, JTable table) {
this.warp = warp;
__table = table;
}
public void mouseMoved(MouseEvent e) {
__forwardEventToButton(e);
}
public void mouseDragged(MouseEvent e) {
__forwardEventToButton(e);
}
public void mouseClicked(MouseEvent e) {
__forwardEventToButton(e);
}
public void mouseEntered(MouseEvent e) {
__forwardEventToButton(e);
}
public void mouseExited(MouseEvent e) {
__forwardEventToButton(e);
}
public void mousePressed(MouseEvent e) {
__forwardEventToButton(e);
}
public void mouseReleased(MouseEvent e) {
__forwardEventToButton(e);
}
}