Initial Commit

thobaben_serialize
Harald Wolff 2013-12-14 03:10:58 +01:00
commit cda2d8211b
49 changed files with 3840 additions and 0 deletions

8
.classpath 100644
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="lib" path="contrib/javassist-3.15.0-GA.jar"/>
<classpathentry kind="lib" path="contrib/hibernate-jpa-2.0-api-1.0.1.Final.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

3
.gitignore vendored 100644
View File

@ -0,0 +1,3 @@
bin/*

17
.project 100644
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.hwo</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,11 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.6

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,118 @@
package org.hwo;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
public class DBProfile
{
private Integer profileno;
private String bezeichnung;
private String hostname;
private String database;
private Integer port;
private String username;
private String password;
public DBProfile(Preferences pref,int profileno)
{
this.setProfileno(profileno);
load(pref);
}
public int getProfileno() {
return profileno;
}
public void load(Preferences pref)
{
Preferences prefs = pref.node("database").node(profileno.toString());
hostname = prefs.get("hostname", "localhost");
database = prefs.get("database", "hworganizer");
username = prefs.get("username", "");
password = prefs.get("password", "");
port = prefs.getInt("port", 5432);
bezeichnung = prefs.get("bezeichnung", "Profil " + profileno.toString());
}
public void save(Preferences pref)
{
Preferences prefs = pref.node("database").node(profileno.toString());
prefs.put("hostname", hostname);
prefs.put("database", database);
prefs.put("username", username);
prefs.put("password", password);
prefs.putInt("port", port);
prefs.put("bezeichnung", bezeichnung);
try
{
prefs.flush();
} catch (BackingStoreException bse)
{
System.err.println("Einstellungen konnten nicht gespeichert werden!");
System.err.println(bse.toString());
bse.printStackTrace();
}
}
public void setProfileno(int profileno) {
this.profileno = profileno;
}
public String getHostname() {
return hostname;
}
public void setHostname(String hostname) {
this.hostname = hostname;
}
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public String getBezeichnung() {
return bezeichnung;
}
public void setBezeichnung(String bezeichnung) {
this.bezeichnung = bezeichnung;
}
@Override
public String toString() {
return getBezeichnung();
}
}

View File

@ -0,0 +1,48 @@
package org.hwo.__mapper_v0_;
import java.util.LinkedList;
import java.util.List;
public abstract class AbstractObjectMapper {
private List<Class<?>> registeredClasses;
private boolean isPrepared;
public AbstractObjectMapper()
{
setRegisteredClasses(new LinkedList<Class<?>>());
}
public AbstractObjectMapper registerClass(Class<?> clazz)
{
getRegisteredClasses().add(clazz);
return this;
};
abstract public void prepareMapper();
public boolean isPrepared()
{
return isPrepared;
};
protected void setPrepared()
{
isPrepared = true;
}
abstract public Object loadObject(ObjectReference objectReference);
public Object loadObject(Class<?> clazz,Object id)
{
return loadObject(ObjectReference.create(clazz, id));
}
abstract public boolean saveObject(Object o);
public List<Class<?>> getRegisteredClasses() {
return registeredClasses;
}
public void setRegisteredClasses(List<Class<?>> registeredClasses) {
this.registeredClasses = registeredClasses;
}
}

View File

@ -0,0 +1,135 @@
package org.hwo.__mapper_v0_;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.persistence.Column;
public class ObjectDescriptor {
private AbstractObjectMapper mapper;
private Class<?> clazz;
private List<FieldDescriptor> fields;
private FieldDescriptor id;
public ObjectDescriptor(AbstractObjectMapper mapper,Class<?> clazz)
{
this.mapper = mapper;
this.clazz = clazz;
this.fields = new ArrayList<FieldDescriptor>();
setup();
}
private void setup()
{
for (Field f:clazz.getDeclaredFields())
{
String name = f.getName();
Column column = f.getAnnotation(Column.class);
if (column!=null)
{
if (column.name()!=null)
name = column.name();
}
FieldDescriptor fd = new FieldDescriptor(name, f);
fields.add(fd);
}
}
public void resolve()
{
for (FieldDescriptor fd:fields)
fd.resolve();
}
public class FieldDescriptor {
private String name;
private Field classField;
private boolean isSimpleType;
private boolean isListType;
private Class<?> fieldType;
public FieldDescriptor(String name,Field classField)
{
this.setName(name);
this.setClassField(classField);
if (
(classField.getType()==Integer.class) ||
(classField.getType()==int.class) ||
(classField.getType()==Long.class) ||
(classField.getType()==long.class) ||
(classField.getType()==float.class) ||
(classField.getType()==Float.class) ||
(classField.getType()==Double.class) ||
(classField.getType()==double.class) ||
(classField.getType()==String.class) ||
(classField.getType()==char.class) ||
(classField.getType()==Boolean.class) ||
(classField.getType()==boolean.class) ||
false
)
{
isSimpleType = true;
fieldType = classField.getType();
}
if (
(classField.getType()==List.class) ||
(classField.getType()==Set.class)
)
{
isListType = true;
fieldType = (Class)((ParameterizedType)classField.getGenericType()).getActualTypeArguments()[0];
};
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Field getClassField() {
return classField;
}
public void setClassField(Field classField) {
this.classField = classField;
}
public boolean isSimpleType() {
return isSimpleType;
}
public void setSimpleType(boolean isSimpleType) {
this.isSimpleType = isSimpleType;
}
public void resolve()
{
}
public boolean isListType() {
return isListType;
}
public void setListType(boolean isListType) {
this.isListType = isListType;
}
}
}

View File

@ -0,0 +1,54 @@
package org.hwo.__mapper_v0_;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
public class ObjectReference {
private static Hashtable<Class<?>, Hashtable<Object, ObjectReference>> referenceList = new Hashtable<Class<?>, Hashtable<Object,ObjectReference>>();
private static Hashtable<Object, ObjectReference> getReferenceList(Class<?> clazz)
{
if (!referenceList.containsKey(clazz))
referenceList.put(clazz, new Hashtable<Object, ObjectReference>());
return referenceList.get(clazz);
}
public static ObjectReference create(Class<?> clazz,Object id)
{
Hashtable<Object, ObjectReference> classReferenceList = getReferenceList(clazz);
if (classReferenceList.containsKey(id))
return classReferenceList.get(id);
ObjectReference ref = new ObjectReference(clazz, id);
classReferenceList.put(id, ref);
return ref;
};
private Class<?> clazz;
private Object id;
private ObjectReference(Class<?> clazz,Object id)
{
this.setClazz(clazz);
this.setId(id);
}
public Class<?> getClazz() {
return clazz;
}
public void setClazz(Class<?> clazz) {
this.clazz = clazz;
}
public Object getId() {
return id;
}
public void setId(Object id) {
this.id = id;
}
}

View File

@ -0,0 +1,41 @@
package org.hwo.__mapper_v0_;
import java.util.Hashtable;
public class SimpleObjectMapper extends AbstractObjectMapper {
Hashtable<Class<?>, ObjectDescriptor> objectDescriptors;
public SimpleObjectMapper()
{
objectDescriptors = new Hashtable<Class<?>, ObjectDescriptor>();
}
public ObjectDescriptor getObjectDescriptor(Class<?> clazz)
{
return objectDescriptors.get(clazz);
}
@Override
public AbstractObjectMapper registerClass(Class<?> clazz) {
objectDescriptors.put(clazz, new ObjectDescriptor(this, clazz));
return this;
}
@Override
public void prepareMapper() {
}
@Override
public Object loadObject(ObjectReference objectReference) {
return null;
}
@Override
public boolean saveObject(Object o) {
return false;
}
}

View File

@ -0,0 +1,223 @@
package org.hwo.csv;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
import javassist.bytecode.EnclosingMethodAttribute;
public class CSV {
List<String[]> records;
private char separator;
private char enclosedBy;
boolean isEnclosed;
List<String> parserRecord;
List<Character> parserField;
char lastChar;
public CSV()
{
this.records = new LinkedList<String[]>();
this.setSeparator(';');
this.setEnclosedBy('\"');
this.parserRecord = new ArrayList<String>();
this.parserField = new ArrayList<Character>();
}
private void nextRecord()
{
nextField();
this.records.add(parserRecord.toArray(new String[]{}));
parserRecord.clear();
}
private void nextField()
{
char fieldChars[] = new char[ parserField.size() ];
for (int i=0;i<parserField.size(); i++)
fieldChars[i] = parserField.get(i);
parserRecord.add(String.valueOf(fieldChars));
parserField.clear();
}
private void feeder(char ch)
{
if (ch == getEnclosedBy())
{
isEnclosed = !isEnclosed;
if (isEnclosed && lastChar == getEnclosedBy())
parserField.add(getEnclosedBy());
} else
{
if (isEnclosed)
parserField.add(ch);
else
{
if (ch == '\r')
{
// Ignore \r
} else if (ch == '\n')
nextRecord();
else if (ch == getSeparator())
nextField();
else
parserField.add(ch);
}
};
lastChar = ch;
}
public void readFromStream(InputStream is) throws IOException
{
this.readFromStream(new InputStreamReader(is,"ISO-8859-1"));
}
public void readFromStream(InputStreamReader isr) throws IOException
{
BufferedReader br = new BufferedReader(isr);
isEnclosed = false;
records.clear();
parserField.clear();
parserRecord.clear();
while (br.ready())
feeder((char)br.read());
}
public void saveToFile(String filename)
{
saveToFile(new File(filename));
}
public void saveToFile(File output)
{
try {
FileOutputStream fos = new FileOutputStream(output,false);
saveToStream(fos);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void saveToStream(OutputStream output)
{
OutputStreamWriter osw;
try {
osw = new OutputStreamWriter(output,"UTF8");
saveToStream(osw);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void saveToStream(OutputStreamWriter output)
{
BufferedWriter writer = new BufferedWriter(output);
try {
for (String[] record:this.records)
{
for (int i=0;i<record.length;i++)
{
if (i>0)
writer.write(separator);
if (record[i] != null)
{
if (String.class.isInstance(record[i]))
writer.write(enclosedBy);
writer.write(record[i]);
if (String.class.isInstance(record[i]))
writer.write(enclosedBy);
}
}
writer.write("\n");
}
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getValue(int row,int column)
{
try
{
return this.records.get(row)[column];
} catch (ArrayIndexOutOfBoundsException ex)
{
return "";
}
}
public List<String[]> getCells()
{
return this.records;
}
public List<Object[]> getCellsAsObjects()
{
List<Object[]> ol = new ArrayList<Object[]>();
for (String[] record:records)
{
Object[] ro = new Object[record.length];
for (int i=0;i<ro.length;i++)
ro[i] = record[i];
ol.add(ro);
}
return ol;
}
public char getSeparator() {
return separator;
}
public void setSeparator(char separator) {
this.separator = separator;
}
public char getEnclosedBy() {
return enclosedBy;
}
public void setEnclosedBy(char enclosedBy) {
this.enclosedBy = enclosedBy;
}
}

View File

@ -0,0 +1,10 @@
package org.hwo.interactiveobjects;
public interface IInteractiveObjectEditor {
public void setInteractiveObject(Object o);
public Object getInteractiveObject();
public void setVisible(boolean visible);
}

View File

@ -0,0 +1,13 @@
package org.hwo.interactiveobjects;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface InteractiveObject {
public boolean keywordSearch() default false;
public Class<? extends IInteractiveObjectEditor> editor();
}

View File

@ -0,0 +1,62 @@
package org.hwo.interactiveobjects;
import java.util.Hashtable;
public class InteractiveObjectHelper {
private static Hashtable<Object, IInteractiveObjectEditor> p_editors = new Hashtable<Object, IInteractiveObjectEditor>();
private static InteractiveObject getInteractiveObject(Class<?> clazz)
{
InteractiveObject io = clazz.getAnnotation(InteractiveObject.class);
if (io != null)
return io;
if (clazz.getSuperclass() != null)
return getInteractiveObject(clazz.getSuperclass());
return null;
}
private static InteractiveObject getInteractiveObject(Object item)
{
Class<?> clazz = item.getClass();
return getInteractiveObject(clazz);
}
public static boolean isInteractiveObject(Class<?> clazz)
{
return (getInteractiveObject(clazz)!=null);
}
public static IInteractiveObjectEditor getEditor(Object item)
{
InteractiveObject io = getInteractiveObject(item);
if (io != null)
{
if (!p_editors.containsKey(item))
{
try
{
IInteractiveObjectEditor editor = io.editor().newInstance();
p_editors.put(item, editor);
} catch (Exception ex)
{
System.err.println(ex.toString());
ex.printStackTrace();
return null;
}
}
return p_editors.get(item);
}
return null;
}
public static void showEditor(Object o)
{
IInteractiveObjectEditor editor = getEditor(o);
editor.setInteractiveObject(o);
editor.setVisible(true);
}
}

View File

@ -0,0 +1,132 @@
package org.hwo.models;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Column {
private int MODE_FIELD = 1;
private int MODE_GETSET = 2;
private int mode;
private String fieldName;
private boolean readonly;
private Class p_class;
private Field field;
private Method getter;
private Method setter;
public Column(Class classInfo,String fieldName,boolean readonly) throws NoSuchFieldException
{
this.fieldName = fieldName;
this.readonly = readonly;
this.p_class = classInfo;
this.getter = null;
this.setter = null;
try
{
mode = MODE_FIELD;
this.field = this.p_class.getDeclaredField(fieldName);
this.field.setAccessible(true);
} catch (NoSuchFieldException nsfex)
{
mode = MODE_GETSET;
// Kein deklariertes Feld, also suchen wir eine get... und set... Methode...
Method[] methods = this.p_class.getDeclaredMethods();
for (Method method : methods) {
// passender getter?
if (("get"+fieldName.toLowerCase()).equals(method.getName().toLowerCase()))
getter = method;
// passender setter?
if (("set"+fieldName.toLowerCase()).equals(method.getName().toLowerCase()))
setter = method;
}
if (getter == null)
throw nsfex;
}
}
public String getFieldName()
{
return this.fieldName;
}
public boolean getReadOnly()
{
if ((mode == MODE_GETSET) && (setter == null))
return true;
return this.readonly;
}
public void setReadOnly(boolean readOnly)
{
this.readonly = readOnly;
}
public Class getColumnClass()
{
if (mode == MODE_GETSET)
return this.getter.getReturnType();
return this.field.getType();
}
Object getValue(Object o)
{
try
{
if (mode == MODE_GETSET)
{
try
{
Object ro = this.getter.invoke(o, null);
return ro;
} catch (InvocationTargetException itex)
{
System.err.println(itex.toString());
itex.printStackTrace();
}
}
return this.field.get(o);
} catch (IllegalArgumentException e) {
System.err.println("IllegalArgument! " + e.toString());
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
System.err.println("IllegalAccess! " + e.toString());
e.printStackTrace();
}
return null;
}
void setValue(Object o,Object value)
{
try
{
if (mode == MODE_GETSET)
{
if (this.setter != null)
{
try
{
this.setter.invoke(o,new Object[]{ value });
} catch (InvocationTargetException itex)
{
System.err.println(itex.toString());
itex.printStackTrace();
}
}
}
this.field.set(o,value);
} catch (IllegalArgumentException e) {
System.err.println("IllegalArgument! " + e.toString());
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
System.err.println("IllegalAccess! " + e.toString());
e.printStackTrace();
}
return;
}
}

View File

@ -0,0 +1,55 @@
package org.hwo.models;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractListModel;
public class FlexibleObjectListModel<T> extends AbstractListModel {
private List<T> items;
public FlexibleObjectListModel() {
this.items = new ArrayList<T>();
}
@Override
public Object getElementAt(int index) {
return this.items.get(index);
}
@Override
public int getSize() {
return this.items.size();
}
public void clear()
{
this.items.clear();
fireContentsChanged(this, 0, getSize());
}
public List<T> getItems() {
return items;
}
public void setItems(List<T> items) {
this.items = items;
fireContentsChanged(this, 0, getSize());
}
public void addItem(T o)
{
this.items.add(o);
fireContentsChanged(this, 0, getSize());
}
public void removeItem(T o)
{
int index = this.items.indexOf(o);
this.items.remove(o);
fireContentsChanged(this, 0, getSize());
}
}

View File

@ -0,0 +1,115 @@
package org.hwo.models;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class FlexibleObjectTableModel<T> extends AbstractTableModel{
List<Column> columns;
List<T> rows;
Class p_classinfo;
public FlexibleObjectTableModel(Class tClass)
{
this.columns = new ArrayList<Column>();
this.rows = new ArrayList<T>();
this.p_classinfo = tClass;
}
public void addColumn(String fieldName)
{
this.addColumn(fieldName,true);
}
public void addColumn(String fieldName,boolean readOnly)
{
try
{
this.columns.add(new Column(this.p_classinfo,fieldName,readOnly));
fireTableStructureChanged();
} catch (NoSuchFieldException nsfex)
{
System.err.println(nsfex.toString());
nsfex.printStackTrace();
}
}
public List<T> getRows()
{
return this.rows;
}
public void setRows(List<T> rows)
{
this.rows = rows;
this.fireTableDataChanged();
}
public int indexOf(Object o)
{
return this.rows.indexOf(o);
}
public void addRow(T o)
{
this.rows.add(o);
this.fireTableDataChanged();
}
public void removeRow(T o)
{
this.rows.remove(o);
this.fireTableDataChanged();
}
public void removeRow(int row)
{
this.rows.remove(row);
this.fireTableDataChanged();
}
@Override
public int getColumnCount() {
return this.columns.size();
}
@Override
public int getRowCount() {
return this.rows.size();
}
@Override
public Object getValueAt(int arg0, int arg1) {
return this.columns.get(arg1).getValue(this.rows.get(arg0));
}
@Override
public String getColumnName(int columnIndex)
{
return this.columns.get(columnIndex).getFieldName();
}
@Override
public void setValueAt(Object aValue,
int rowIndex,
int columnIndex)
{
this.columns.get(columnIndex).setValue(this.rows.get(rowIndex), aValue);
}
@Override
public boolean isCellEditable(int rowIndex,int columnIndex)
{
return !this.columns.get(columnIndex).getReadOnly();
}
@Override
public Class getColumnClass(int columnIndex)
{
return this.columns.get(columnIndex).getColumnClass();
}
}

View File

@ -0,0 +1,56 @@
package org.hwo.models;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class ListTableModel extends AbstractTableModel {
private List<Object[]> rows;
public ListTableModel()
{
rows = new ArrayList<Object[]>();
rows.add(new Object[]{"Eins","Zwei","Drei"});
}
private Integer calcColumnCount()
{
Integer max = 0;
for (Object[] record:rows)
if (record.length > max)
max = record.length;
return max;
}
@Override
public int getColumnCount() {
return calcColumnCount();
}
@Override
public int getRowCount() {
return rows.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return rows.get(rowIndex)[columnIndex];
}
public List<Object[]> getRows() {
return rows;
}
public void setRows(List<Object[]> rows) {
this.rows = rows;
fireTableStructureChanged();
}
}

View File

@ -0,0 +1,17 @@
package org.hwo.models.TableMapper;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface TableColumn {
String label() default "";
boolean readonly() default false;
boolean visible() default true;
int width() default 100;
String after() default "";
boolean firstColumn() default false;
}

View File

@ -0,0 +1,609 @@
package org.hwo.models.TableMapper;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import org.hwo.csv.CSV;
import org.hwo.interactiveobjects.InteractiveObjectHelper;
public class TableMapper extends AbstractTableModel
{
private static final long serialVersionUID = -6556060772230310664L;
public class ColumnInfo
{
private TableColumn p_annotation;
private Field p_field;
private Method p_method;
private String p_label;
private boolean p_readonly;
private Class<?> p_columnclass;
private int width;
private TableColumn tableColumn;
private ColumnInfo nextColumn;
protected ColumnInfo(TableColumn tc,Field field)
{
tableColumn = tc;
p_annotation = field.getAnnotation(TableColumn.class);
p_method = null;
p_field = field;
p_columnclass = field.getType();
initialize();
if (p_label.equals(""))
p_label = field.getName();
field.setAccessible(true);
}
protected ColumnInfo(TableColumn tc,Method method)
{
tableColumn = tc;
p_annotation = method.getAnnotation(TableColumn.class);
p_method = method;
p_field = null;
p_columnclass = method.getReturnType();
initialize();
if (p_label.equals(""))
p_label = method.getName();
method.setAccessible(true);
p_readonly = true;
}
private void initialize()
{
p_label = p_annotation.label();
p_readonly = p_annotation.readonly();
setWidth(p_annotation.width());
}
public void appendAtEnd(ColumnInfo column)
{
if (nextColumn == null)
nextColumn = column;
else
nextColumn.appendAtEnd(column);
}
public List<ColumnInfo> toList()
{
List<ColumnInfo> list = new LinkedList<TableMapper.ColumnInfo>();
appendToList(list);
return list;
}
public void appendToList(List<ColumnInfo> list)
{
list.add(this);
if (nextColumn != null)
nextColumn.appendToList(list);
}
public void removeColumn(ColumnInfo ci)
{
if (nextColumn == ci)
{
nextColumn = ci.nextColumn;
ci.nextColumn = null;
} else if (nextColumn != null)
nextColumn.removeColumn(ci);
}
public ColumnInfo findColumnByName(String name)
{
if (this.p_label.equals(name))
return this;
if (nextColumn!=null)
return nextColumn.findColumnByName(name);
else
return null;
}
public void append(ColumnInfo ci)
{
ci.nextColumn = nextColumn;
nextColumn = ci;
}
public String getLabel()
{
return this.p_label;
}
public void setLabel(String label)
{
this.p_label = label;
}
public boolean getReadOnly()
{
return this.p_readonly;
}
public void setReadOnly(boolean readOnly)
{
this.p_readonly = readOnly;
}
public void setColumnClass(Class<?> cl)
{
this.p_columnclass = cl;
}
public Class<?> getColumnClass()
{
return this.p_columnclass;
}
public Object getValue(Object instance) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
if (p_field != null)
return p_field.get(instance);
if (p_method != null)
return p_method.invoke(instance, null);
return null;
}
public void setValue(Object instance,Object value) throws IllegalAccessException
{
if (p_field != null)
p_field.set(instance, value);
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public ColumnInfo getNextColumn() {
return nextColumn;
}
public void setNextColumn(ColumnInfo nextColumn) {
this.nextColumn = nextColumn;
}
public TableColumn getTableColumn() {
return tableColumn;
}
public void setTableColumn(TableColumn tableColumn) {
this.tableColumn = tableColumn;
}
}
private Class<?> p_class;
private ColumnInfo firstColumn;
private List<Object> p_rows;
private List<ColumnInfo> p_columns;
private boolean p_readonly; // Table readonly...
private TableMapperColumnModel
columnModel;
private JTable jTable;
private TableMapperObject
tableMapperObject;
private Field editorObjectField;
private Class<?> editorObjectClass;
private MouseAdapter mouseAdapter;
private boolean editorEnabled;
public TableMapper(Class<?> clazz,JTable table)
{
this.p_class = clazz;
this.jTable = table;
this.firstColumn = null;
this.p_rows = new LinkedList<Object>();
this.p_columns = new ArrayList<TableMapper.ColumnInfo>();
this.p_readonly = false;
initializeMapper();
initializeColumnInfo();
table.setModel(this);
table.setColumnModel(new TableMapperColumnModel(this));
table.setAutoCreateRowSorter(true);
mouseAdapter = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
switch (e.getButton())
{
case 1:
if (e.getClickCount()==2)
{
openEditor();
}
}
}
};
if (InteractiveObjectHelper.isInteractiveObject(editorObjectClass))
setEditorEnabled(true);
}
private void initializeMapper()
{
tableMapperObject = p_class.getAnnotation(TableMapperObject.class);
if (tableMapperObject != null)
{
if (tableMapperObject.editorField() != null)
{
try {
editorObjectField = p_class.getDeclaredField(tableMapperObject.editorField());
editorObjectField.setAccessible(true);
editorObjectClass = editorObjectField.getType();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else
{
editorObjectClass = p_class;
}
}
private Object getEditorObject()
{
if (jTable.getSelectedRow()!=-1)
{
int row = jTable.convertRowIndexToModel(jTable.getSelectedRow());
Object rowObject = p_rows.get(row);
if (editorObjectField == null)
return rowObject;
try {
Object editorObject = editorObjectField.get(rowObject);
return editorObject;
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
private void openEditor()
{
Object editorObject = getEditorObject();
if (editorObject!=null)
InteractiveObjectHelper.showEditor(editorObject);
}
public List<ColumnInfo> getColumnInfo()
{
return p_columns;
}
public void setRows(List rows)
{
this.p_rows = rows;
fireTableDataChanged();
}
public List getRows()
{
return this.p_rows;
}
public <T> List<T> getRows(Class<T> clazz)
{
return (List<T>) p_rows;
}
public void clear()
{
this.p_rows.clear();
fireTableDataChanged();
}
public boolean isEditorEnabled()
{
return editorEnabled;
}
public void setEditorEnabled(boolean enabled)
{
if (enabled)
jTable.addMouseListener(mouseAdapter);
else
jTable.removeMouseListener(mouseAdapter);
editorEnabled = enabled;
}
private void addColumnInfo(ColumnInfo ci)
{
if (ci.getTableColumn().firstColumn())
p_columns.add(0,ci);
else
p_columns.add(ci);
/*
if (firstColumn == null)
firstColumn = ci;
else
{
if (ci.getTableColumn().firstColumn())
{
ci.setNextColumn(firstColumn);
firstColumn = ci;
} else
firstColumn.appendAtEnd(ci);
}
*/
}
private void addFieldsOfClass(Class<?> clazz)
{
if (clazz.getSuperclass() != null)
addFieldsOfClass(clazz.getSuperclass());
for (Field field: clazz.getDeclaredFields())
{
if (field.getAnnotation(TableColumn.class)!=null)
{
ColumnInfo ci = new ColumnInfo(field.getAnnotation(TableColumn.class),field);
addColumnInfo(ci);
}
}
for (Method method: clazz.getDeclaredMethods())
{
if (method.getAnnotation(TableColumn.class)!=null)
{
ColumnInfo ci = new ColumnInfo(method.getAnnotation(TableColumn.class),method);
addColumnInfo(ci);
}
}
}
private int findColumnIndexByName(String name)
{
for (int i=0;i<p_columns.size();i++)
{
if (p_columns.get(i).p_label.equals(name))
return i;
}
return -1;
}
private void reorderColumns()
{
List<ColumnInfo> lc = new ArrayList<TableMapper.ColumnInfo>(p_columns);
for (ColumnInfo ci:lc)
{
if (!ci.getTableColumn().after().equals(""))
{
int indColumn = p_columns.indexOf(ci);
int indBefore = findColumnIndexByName(ci.getTableColumn().after());
if (indBefore != -1)
{
if (indBefore < indColumn)
{
List<ColumnInfo> subset = new ArrayList<TableMapper.ColumnInfo>(p_columns.subList(indColumn, p_columns.size()));
p_columns.removeAll(subset);
p_columns.addAll(indBefore+1, subset);
} else
{
List<ColumnInfo> subset = new ArrayList<TableMapper.ColumnInfo>(p_columns.subList(indColumn, indBefore));
p_columns.removeAll(subset);
p_columns.addAll(indColumn+1, subset);
}
}
}
}
}
private void initializeColumnInfo()
{
addFieldsOfClass(p_class);
reorderColumns();
}
public void setReadOnly(boolean readOnly)
{
this.p_readonly = readOnly;
}
public boolean getReadOnly()
{
return this.p_readonly;
}
public void addRow(Object row)
{
this.p_rows.add(row);
//fireTableRowsInserted(getRowCount()-1, getRowCount()-1);
fireTableDataChanged();
}
public void removeRow(Object row)
{
int index = this.p_rows.indexOf(row);
if (index != -1)
{
this.p_rows.remove(index);
fireTableRowsDeleted(index, index);
};
}
public Object getRow(int index)
{
return this.p_rows.get(index);
}
public <T> T getRow(int index,Class<T> clazz)
{
return (T)this.p_rows.get(index);
}
public Object appendNewInstance()
{
try
{
Object instance = this.p_class.newInstance();
if (instance != null)
addRow(instance);
return instance;
} catch (Exception ex)
{
return null;
}
}
@Override
public int getColumnCount() {
return this.p_columns.size();
}
@Override
public int getRowCount() {
return this.p_rows.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if ( (rowIndex < this.p_rows.size()) && (columnIndex < this.p_columns.size()))
{
try
{
return this.p_columns.get(columnIndex).getValue(this.p_rows.get(rowIndex));
} catch (Exception ex)
{
System.err.println("Exception: " + ex);
ex.printStackTrace();
}
}
return "";
}
@Override
public void setValueAt(Object aValue,
int rowIndex,
int columnIndex)
{
try
{
this.p_columns.get(columnIndex).setValue(this.p_rows.get(rowIndex), aValue);
} catch (IllegalAccessException ex)
{
System.err.println("IllegalAccessException: " + ex);
ex.printStackTrace();
}
}
@Override
public boolean isCellEditable(int rowIndex,int columnIndex)
{
if (this.p_readonly)
return false;
return !this.p_columns.get(columnIndex).getReadOnly();
}
@Override
public Class<?> getColumnClass(int columnIndex)
{
Class<?> c = this.p_columns.get(columnIndex).getColumnClass();
return c;
}
@Override
public String getColumnName(int columnIndex)
{
return this.p_columns.get(columnIndex).getLabel();
}
public Object getSelectedRow()
{
if (jTable.getSelectedRow()!=-1)
{
return this.p_rows.get(jTable.convertRowIndexToModel(jTable.getSelectedRow()));
}
return null;
}
public boolean exportToFile(File exportFile)
{
CSV csv = new CSV();
List<String[]> cells = csv.getCells();
String[] header = new String[ getColumnCount() ];
for (int i=0;i<getColumnCount();i++)
header[i] = p_columns.get(i).getLabel();
cells.add( header );
for (int row=0;row<getRowCount();row++)
{
String[] record = new String[ getColumnCount() ];
for (int column=0;column<getColumnCount();column++)
if (getValueAt(row, column)!=null)
record[column] = getValueAt(row, column).toString();
else
record[column] = "";
cells.add(record);
}
csv.saveToFile(exportFile);
return true;
}
};

View File

@ -0,0 +1,170 @@
package org.hwo.models.TableMapper;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.Vector;
import javax.swing.DefaultListSelectionModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import org.hwo.models.TableMapper.TableMapper.ColumnInfo;
class TableMapperColumnModel implements TableColumnModel{
private TableMapper tableMapper;
private LinkedList<TableColumnModelListener> listeners;
private ArrayList<TableColumn> tableColumns;
private int margin;
private ListSelectionModel listSelectionModel;
public TableMapperColumnModel(TableMapper tableMapper)
{
this.tableMapper = tableMapper;
this.listeners = new LinkedList<TableColumnModelListener>();
this.tableColumns = new ArrayList<TableColumn>();
this.listSelectionModel = new DefaultListSelectionModel();
for (int i=0;i<tableMapper.getColumnCount();i++)
{
ColumnInfo ci = tableMapper.getColumnInfo().get(i);
TableColumn tc = new TableColumn(i, ci.getWidth());
tc.setPreferredWidth(ci.getWidth());
tc.setHeaderValue(ci.getLabel());
tc.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent arg0) {
fireColumnMarginChanged();
}
});
tableColumns.add(tc);
}
}
protected void fireColumnMarginChanged()
{
for (TableColumnModelListener listener:listeners)
listener.columnMarginChanged(new ChangeEvent(this));
}
@Override
public void addColumn(TableColumn aColumn) {
}
@Override
public void addColumnModelListener(TableColumnModelListener x) {
listeners.add(x);
}
@Override
public void removeColumnModelListener(TableColumnModelListener x) {
listeners.remove(x);
}
@Override
public TableColumn getColumn(int columnIndex) {
return tableColumns.get(columnIndex);
}
@Override
public int getColumnCount() {
return tableColumns.size();
}
@Override
public int getColumnIndex(Object columnIdentifier) {
return 0;
}
@Override
public int getColumnIndexAtX(int xPosition) {
int pos = 0;
for (int i=0;i<tableColumns.size();i++)
{
pos += tableColumns.get(i).getWidth();
if (xPosition < pos)
return i;
}
return -1;
}
@Override
public int getColumnMargin() {
return margin;
}
@Override
public boolean getColumnSelectionAllowed() {
return false;
}
@Override
public Enumeration<TableColumn> getColumns() {
return new Vector<TableColumn>(tableColumns).elements();
}
@Override
public int getSelectedColumnCount() {
return 0;
}
@Override
public int[] getSelectedColumns() {
return new int[0];
}
@Override
public ListSelectionModel getSelectionModel() {
return listSelectionModel;
}
@Override
public int getTotalColumnWidth() {
int width = 0;
for (TableColumn tc:tableColumns)
width += tc.getWidth();
return width;
}
@Override
public void moveColumn(int columnIndex, int newIndex) {
}
@Override
public void removeColumn(TableColumn column) {
}
@Override
public void setColumnMargin(int newMargin) {
margin = newMargin;
fireColumnMarginChanged();
}
@Override
public void setColumnSelectionAllowed(boolean flag) {
}
@Override
public void setSelectionModel(ListSelectionModel newModel) {
listSelectionModel = newModel;
}
}

View File

@ -0,0 +1,11 @@
package org.hwo.models.TableMapper;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface TableMapperObject {
String editorField();
}

View File

@ -0,0 +1,70 @@
package org.hwo.thread;
import java.util.ArrayList;
import java.util.EventListener;
import java.util.List;
public abstract class ThreadedOperation extends Thread{
List<ThreadedOperationUpdateListener> updateListeners;
private String operationName;
public ThreadedOperation()
{
updateListeners = new ArrayList<ThreadedOperationUpdateListener>();
operationName = "AktivitŠt...";
}
public void addThreadedOperationUpdateListener(ThreadedOperationUpdateListener listener)
{
updateListeners.add(listener);
}
public void removeThreadedOperationUpdateListener(ThreadedOperationUpdateListener listener)
{
updateListeners.remove(listener);
}
protected void fireUpdate(ThreadedOperationUpdateArgs updateArgs)
{
for (ThreadedOperationUpdateListener listener:updateListeners)
listener.threadedOperationUpdate(updateArgs);
}
protected void fireUpdate(Integer progressOperation,Integer progressStep)
{
fireUpdate(new ThreadedOperationUpdateArgs(progressOperation,progressStep));
}
protected void fireUpdate(Integer progressOperation,Integer progressStep,String statusText)
{
fireUpdate(new ThreadedOperationUpdateArgs(progressOperation,progressStep,statusText));
}
protected void fireUpdate(Integer progressOperation,Integer progressStep,String statusText,String stepLabel)
{
fireUpdate(new ThreadedOperationUpdateArgs(progressOperation,progressStep,statusText,stepLabel));
}
protected void fireFinished(int code)
{
for (ThreadedOperationUpdateListener listener:updateListeners)
listener.threadedOperationFinished(code);
}
protected void fireFinished()
{
fireFinished(0);
}
public abstract void run();
public String getOperationName() {
return operationName;
}
public void setOperationName(String operationName) {
this.operationName = operationName;
}
}

View File

@ -0,0 +1,77 @@
package org.hwo.thread;
public class ThreadedOperationUpdateArgs {
private Integer progressOperation;
private Integer progressStep;
private String stepLabel;
private String statusText;
private String titleText;
public ThreadedOperationUpdateArgs()
{
}
public ThreadedOperationUpdateArgs(Integer progressStep)
{
this.progressStep = progressStep;
}
public ThreadedOperationUpdateArgs(Integer progressOperation,Integer progressStep)
{
this.progressOperation = progressOperation;
this.progressStep = progressStep;
}
public ThreadedOperationUpdateArgs(Integer progressOperation,Integer progressStep,String statusText)
{
this.progressOperation = progressOperation;
this.progressStep = progressStep;
this.statusText = statusText;
}
public ThreadedOperationUpdateArgs(Integer progressOperation,Integer progressStep,String statusText,String stepLabel)
{
this.progressOperation = progressOperation;
this.progressStep = progressStep;
this.statusText = statusText;
this.stepLabel = stepLabel;
}
public String getStepLabel() {
return stepLabel;
}
public void setStepLabel(String stepLabel) {
this.stepLabel = stepLabel;
}
public Integer getProgressStep() {
return progressStep;
}
public void setProgressStep(Integer progressStep) {
this.progressStep = progressStep;
}
public Integer getProgressOperation() {
return progressOperation;
}
public void setProgressOperation(Integer progressOperation) {
this.progressOperation = progressOperation;
}
public String getStatusText() {
return statusText;
}
public void setStatusText(String statusText) {
this.statusText = statusText;
}
public String getTitleText() {
return titleText;
}
public void setTitleText(String titleText) {
this.titleText = titleText;
}
}

View File

@ -0,0 +1,6 @@
package org.hwo.thread;
public interface ThreadedOperationUpdateListener {
public void threadedOperationUpdate(ThreadedOperationUpdateArgs args);
public void threadedOperationFinished(int result);
}

View File

@ -0,0 +1,16 @@
package org.hwo.ui;
import java.awt.Rectangle;
import org.hwo.ui.treetable.TreeTable;
public interface CellEditor {
public void addCellEditorListener(CellEditorListener listener);
public void removeCellEditorListener(CellEditorListener listener);
public boolean editBegin(TreeTable treeTable,Rectangle rect,Object value);
public void editCancel();
public void editFinish();
}

View File

@ -0,0 +1,40 @@
package org.hwo.ui;
import org.hwo.ui.treetable.TreeTable;
public class CellEditorArgs {
private CellEditor cellEditor;
private Object value;
private TreeTable treeTable;
public CellEditorArgs(CellEditor cellEditor,Object value,TreeTable treeTable)
{
this.cellEditor = cellEditor;
this.value = value;
this.treeTable = treeTable;
}
public CellEditor getCellEditor() {
return cellEditor;
}
public void setCellEditor(CellEditor cellEditor) {
this.cellEditor = cellEditor;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public TreeTable getTreeTable() {
return treeTable;
}
public void setTreeTable(TreeTable treeTable) {
this.treeTable = treeTable;
}
}

View File

@ -0,0 +1,9 @@
package org.hwo.ui;
public interface CellEditorListener {
public void editBegin(CellEditorArgs args);
public void editCanceled(CellEditorArgs args);
public void editFinished(CellEditorArgs args);
}

View File

@ -0,0 +1,11 @@
package org.hwo.ui;
import java.awt.Graphics;
import java.awt.Rectangle;
public interface CellRenderer {
public void renderCell(Graphics g,int row,int column,Rectangle cellRect,Object value,Object rowObject);
}

View File

@ -0,0 +1,102 @@
package org.hwo.ui;
import java.awt.Container;
import java.awt.Rectangle;
import java.util.List;
import javax.swing.JTextField;
import org.hwo.ui.treetable.TreeTable;
public class DefaultCellEditor implements CellEditor {
private List<CellEditorListener> editorListeners;
private JTextField textField;
private TreeTable treeTable;
private Object value;
@Override
public void addCellEditorListener(CellEditorListener listener) {
editorListeners.add(listener);
}
@Override
public void removeCellEditorListener(CellEditorListener listener) {
editorListeners.remove(listener);
}
private void fireEditBegin()
{
CellEditorArgs args = new CellEditorArgs(this, value, treeTable);
for (CellEditorListener listener: editorListeners)
listener.editBegin(args);
}
private void fireEditFinish()
{
CellEditorArgs args = new CellEditorArgs(this, value, treeTable);
for (CellEditorListener listener: editorListeners)
listener.editFinished(args);
}
private void fireEditCancel()
{
CellEditorArgs args = new CellEditorArgs(this, value, treeTable);
for (CellEditorListener listener: editorListeners)
listener.editCanceled(args);
}
private void destroyTextField()
{
textField.setVisible(false);
Container parent = textField.getParent();
parent.remove(textField);
textField = null;
}
@Override
public boolean editBegin(TreeTable treeTable, Rectangle rect, Object value) {
if (textField != null)
editCancel();
this.treeTable = treeTable;
this.value = value;
this.textField = new JTextField();
treeTable.add(textField);
textField.setBounds(rect);
textField.requestFocusInWindow();
textField.repaint();
fireEditBegin();
return true;
}
@Override
public void editCancel() {
if (textField != null)
{
destroyTextField();
fireEditCancel();
}
}
@Override
public void editFinish() {
if (this.textField != null)
{
this.value = this.textField.getText();
destroyTextField();
fireEditFinish();
}
}
}

View File

@ -0,0 +1,23 @@
package org.hwo.ui;
import java.awt.Graphics;
import java.awt.Rectangle;
public class DefaultCellRenderer implements CellRenderer{
@Override
public void renderCell(Graphics g,int row,int column, Rectangle cellRect, Object value,Object rowObject)
{
if (value != null)
{
g.drawString( value.toString(),
cellRect.x + 2,
cellRect.y + cellRect.height - 4
);
};
}
}

View File

@ -0,0 +1,66 @@
package org.hwo.ui;
import java.util.List;
import javax.swing.JTable;
import javax.swing.event.ListSelectionListener;
import org.hwo.models.FlexibleObjectTableModel;
public class FlexibleJTable<T> extends JTable {
private FlexibleObjectTableModel<T> model;
public FlexibleJTable(Class class_t)
{
this.model = new FlexibleObjectTableModel<T>(class_t);
this.setModel(this.model);
}
public FlexibleObjectTableModel<T> getModel()
{
return this.model;
}
public T getSelectedObject()
{
if (this.getSelectedRow()==-1)
return null;
return this.model.getRows().get(this.getSelectedRow());
}
public void addListSelectionListener(ListSelectionListener listener)
{
this.getSelectionModel().addListSelectionListener(listener);
}
public void removeListSelectionListener(ListSelectionListener listener)
{
this.getSelectionModel().removeListSelectionListener(listener);
}
public void addColumn(String column)
{
this.addColumn(column, true);
}
public void addColumn(String column,boolean readonly)
{
this.model.addColumn(column,readonly);
}
public void setRows(List<T> rows)
{
this.model.setRows(rows);
}
public void addRow(T o)
{
this.model.addRow(o);
}
public int getRowCount()
{
return this.model.getRowCount();
}
}

View File

@ -0,0 +1,75 @@
package org.hwo.ui;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import org.hwo.interactiveobjects.IInteractiveObjectEditor;
import org.hwo.interactiveobjects.InteractiveObjectHelper;
public class InteractiveObjectListView extends JList {
DefaultListModel pModel;
public InteractiveObjectListView()
{
this.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent arg0) {
if (arg0.getClickCount()==2)
openEditor();
}
});
pModel = new DefaultListModel();
setModel(pModel);
}
private void openEditor()
{
if (getSelectedIndex() != -1)
{
IInteractiveObjectEditor oe = InteractiveObjectHelper.getEditor(getSelectedValue());
if (oe != null)
oe.setVisible(true);
}
}
public void setItems(List items)
{
pModel.clear();
for (Object o:items)
{
pModel.addElement(o);
}
}
}

View File

@ -0,0 +1,93 @@
package org.hwo.ui;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.awt.Dimension;
public class JCalendar extends JPanel {
private JTextField tfDate;
private Date date;
private JButton btnLookup;
private boolean nullable;
public JCalendar() {
setMaximumSize(new Dimension(32767, 30));
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{100, 134, 0};
gridBagLayout.rowHeights = new int[]{29, 0};
gridBagLayout.columnWeights = new double[]{1.0, 0.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[]{1.0, Double.MIN_VALUE};
setLayout(gridBagLayout);
tfDate = new JTextField();
GridBagConstraints gbc_tfDate = new GridBagConstraints();
gbc_tfDate.fill = GridBagConstraints.BOTH;
gbc_tfDate.insets = new Insets(0, 0, 0, 5);
gbc_tfDate.gridx = 0;
gbc_tfDate.gridy = 0;
add(tfDate, gbc_tfDate);
tfDate.setColumns(10);
btnLookup = new JButton("X");
btnLookup.setMaximumSize(new Dimension(25, 29));
btnLookup.setPreferredSize(new Dimension(25, 29));
btnLookup.setMinimumSize(new Dimension(25, 29));
GridBagConstraints gbc_btnLookup = new GridBagConstraints();
gbc_btnLookup.fill = GridBagConstraints.BOTH;
gbc_btnLookup.gridx = 1;
gbc_btnLookup.gridy = 0;
add(btnLookup, gbc_btnLookup);
}
private void updateView()
{
tfDate.setEnabled(false);
if (date != null)
{
btnLookup.setEnabled(false);
tfDate.setText( SimpleDateFormat.getInstance().format(date));
} else
{
btnLookup.setEnabled(false);
tfDate.setText("");
}
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
updateView();
}
public void setValue(Object value)
{
setDate((Date)value);
}
public Object getValue()
{
return this.getDate();
}
public boolean isNullable() {
return nullable;
}
public void setNullable(boolean nullable) {
this.nullable = nullable;
}
}

View File

@ -0,0 +1,29 @@
package org.hwo.ui;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public abstract class MousePopupListener extends MouseAdapter {
public void mouseClicked(MouseEvent arg0) {
checkPopup(arg0);
}
@Override
public void mousePressed(MouseEvent arg0) {
checkPopup(arg0);
}
@Override
public void mouseReleased(MouseEvent arg0) {
checkPopup(arg0);
}
public void checkPopup(MouseEvent e)
{
if (e.isPopupTrigger())
popupTriggered(e.getX(),e.getY());
}
public abstract void popupTriggered(int x,int y);
}

View File

@ -0,0 +1,183 @@
package org.hwo.ui;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Font;
import javax.swing.JProgressBar;
import javax.swing.border.TitledBorder;
import javax.swing.JTextArea;
import org.hwo.thread.ThreadedOperation;
import org.hwo.thread.ThreadedOperationUpdateArgs;
import org.hwo.thread.ThreadedOperationUpdateListener;
import java.awt.Dialog.ModalExclusionType;
import java.awt.Dialog.ModalityType;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ProgressDialog extends JDialog implements ThreadedOperationUpdateListener{
private final JPanel contentPanel = new JPanel();
private JProgressBar pSchritt;
private JProgressBar pGesamt;
private JTextArea taStatus;
private JLabel lblSchritt;
private int operationResult;
private boolean operationFinished;
public static int executeOperation(ThreadedOperation operation)
{
ProgressDialog dialog = new ProgressDialog();
operation.addThreadedOperationUpdateListener(dialog);
dialog.setTitle(operation.getName());
operation.start();
dialog.setVisible(true);
operation.removeThreadedOperationUpdateListener(dialog);
return dialog.getOperationResult();
}
/**
* Create the dialog.
*/
protected ProgressDialog() {
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) {
if (!operationFinished)
setVisible(true);
}
@Override
public void windowOpened(WindowEvent e) {
}
});
setModalityType(ModalityType.APPLICATION_MODAL);
setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
setBounds(100, 100, 691, 270);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
GridBagLayout gbl_contentPanel = new GridBagLayout();
gbl_contentPanel.columnWidths = new int[] {0};
gbl_contentPanel.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0};
gbl_contentPanel.columnWeights = new double[]{1.0};
gbl_contentPanel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
contentPanel.setLayout(gbl_contentPanel);
{
JLabel lblBitteWarten = new JLabel("Bitte warten...");
lblBitteWarten.setFont(new Font("Lucida Grande", Font.PLAIN, 32));
GridBagConstraints gbc_lblBitteWarten = new GridBagConstraints();
gbc_lblBitteWarten.insets = new Insets(0, 0, 5, 0);
gbc_lblBitteWarten.gridx = 0;
gbc_lblBitteWarten.gridy = 0;
contentPanel.add(lblBitteWarten, gbc_lblBitteWarten);
}
{
JLabel lblGesamtfortschritt = new JLabel("Gesamtfortschritt:");
GridBagConstraints gbc_lblGesamtfortschritt = new GridBagConstraints();
gbc_lblGesamtfortschritt.insets = new Insets(0, 0, 5, 0);
gbc_lblGesamtfortschritt.gridx = 0;
gbc_lblGesamtfortschritt.gridy = 1;
contentPanel.add(lblGesamtfortschritt, gbc_lblGesamtfortschritt);
}
{
pGesamt = new JProgressBar();
GridBagConstraints gbc_pGesamt = new GridBagConstraints();
gbc_pGesamt.insets = new Insets(0, 0, 5, 0);
gbc_pGesamt.fill = GridBagConstraints.HORIZONTAL;
gbc_pGesamt.gridx = 0;
gbc_pGesamt.gridy = 2;
contentPanel.add(pGesamt, gbc_pGesamt);
}
{
lblSchritt = new JLabel("Arbeitsschritt:");
GridBagConstraints gbc_lblSchritt = new GridBagConstraints();
gbc_lblSchritt.insets = new Insets(0, 0, 5, 0);
gbc_lblSchritt.gridx = 0;
gbc_lblSchritt.gridy = 3;
contentPanel.add(lblSchritt, gbc_lblSchritt);
}
{
pSchritt = new JProgressBar();
GridBagConstraints gbc_pSchritt = new GridBagConstraints();
gbc_pSchritt.insets = new Insets(0, 0, 5, 0);
gbc_pSchritt.fill = GridBagConstraints.HORIZONTAL;
gbc_pSchritt.gridx = 0;
gbc_pSchritt.gridy = 4;
contentPanel.add(pSchritt, gbc_pSchritt);
}
{
JPanel panel = new JPanel();
panel.setBorder(new TitledBorder(null, "Status", TitledBorder.LEADING, TitledBorder.TOP, null, null));
GridBagConstraints gbc_panel = new GridBagConstraints();
gbc_panel.fill = GridBagConstraints.BOTH;
gbc_panel.gridx = 0;
gbc_panel.gridy = 5;
contentPanel.add(panel, gbc_panel);
GridBagLayout gbl_panel = new GridBagLayout();
gbl_panel.columnWidths = new int[]{0, 0};
gbl_panel.rowHeights = new int[]{0, 0};
gbl_panel.columnWeights = new double[]{1.0, Double.MIN_VALUE};
gbl_panel.rowWeights = new double[]{1.0, Double.MIN_VALUE};
panel.setLayout(gbl_panel);
{
taStatus = new JTextArea();
GridBagConstraints gbc_taStatus = new GridBagConstraints();
gbc_taStatus.fill = GridBagConstraints.BOTH;
gbc_taStatus.gridx = 0;
gbc_taStatus.gridy = 0;
panel.add(taStatus, gbc_taStatus);
}
}
}
public int getOperationResult() {
return operationResult;
}
public void setOperationResult(int operationResult) {
this.operationResult = operationResult;
}
@Override
public void threadedOperationUpdate(ThreadedOperationUpdateArgs args) {
if (args.getProgressOperation()!=null)
pGesamt.setValue(args.getProgressOperation());
if (args.getProgressStep()!=null)
pSchritt.setValue(args.getProgressStep());
if (args.getStepLabel()!=null)
lblSchritt.setText(args.getStepLabel());
if (args.getStatusText()!=null)
taStatus.setText(args.getStatusText());
if (args.getTitleText()!=null)
setTitle(args.getTitleText());
}
@Override
public void threadedOperationFinished(int result) {
operationResult = result;
operationFinished = true;
setVisible(false);
}
}

View File

@ -0,0 +1,13 @@
package org.hwo.ui.shapes;
import java.awt.Polygon;
public class Triangle extends Polygon {
public Triangle(int x1,int y1,int x2,int y2,int x3,int y3)
{
super(new int[]{x1,x2,x3},new int[]{y1,y2,y3},3);
}
}

View File

@ -0,0 +1,198 @@
package org.hwo.ui.treetable;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.hwo.ui.CellRenderer;
public class DefaultTreeTableColumnModel implements TreeTableColumnModel {
public class Column
{
private String label;
private int width;
private int modelColumn;
private CellRenderer
cellRenderer;
private TreeTablePopupListener
popupListener;
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
fireColumnsChanged();
}
public int getWidth() {
return width;
}
public Column setWidth(int width) {
this.width = width;
fireColumnsChanged();
return this;
}
public int getModelColumn() {
return modelColumn;
}
public Column setModelColumn(int modelColumn) {
this.modelColumn = modelColumn;
fireColumnsChanged();
return this; }
public CellRenderer getCellRenderer() {
return cellRenderer;
}
public Column setCellRenderer(CellRenderer cellRenderer) {
this.cellRenderer = cellRenderer;
return this;
}
public TreeTablePopupListener getPopupListener() {
return popupListener;
}
public Column setPopupListener(TreeTablePopupListener popupListener) {
this.popupListener = popupListener;
return this;
}
}
private List<Column> columns;
private List<TreeTableModelListener> treeTableModelListener;
public DefaultTreeTableColumnModel()
{
treeTableModelListener = new LinkedList<TreeTableModelListener>();
columns = new ArrayList<DefaultTreeTableColumnModel.Column>();
Column column = new Column();
column.label = "";
column.width = 280;
columns.add(column);
}
public Column addColumn(String label)
{
return addColumn(label,100);
}
public Column addColumn(String label,int width)
{
return addColumn(label, width, -1);
}
public Column addColumn(String label,int width,int modelColumn)
{
Column column = new Column();
column.label = label;
column.width = width;
columns.add(column);
if (modelColumn == -1)
column.modelColumn = columns.indexOf(column);
else
column.modelColumn = modelColumn;
fireColumnsChanged();
return column;
}
public void removeColumn(int column)
{
columns.remove(column);
fireColumnsChanged();
}
public Column getColumn(int column)
{
return columns.get(column);
}
public int indexOfColumn(Column column)
{
return columns.indexOf(column);
}
@Override
public int getColumnCount() {
return columns.size();
}
@Override
public String getColumnLabel(int column) {
return columns.get(column).getLabel();
}
@Override
public int getColumnWidth(int column) {
return columns.get(column).getWidth();
}
@Override
public int getColumnPos(int column) {
int x = 0;
for (int i=0;i<column;i++)
x += getColumnWidth(i);
return x;
}
@Override
public void addTreeTableModelListener(TreeTableModelListener listener) {
treeTableModelListener.add(listener);
}
@Override
public void removeTreeTableModelListener(TreeTableModelListener listener) {
treeTableModelListener.remove(listener);
}
private void fireColumnsChanged()
{
for (TreeTableModelListener listener:treeTableModelListener)
listener.rowsChanged();
}
@Override
public int getColumnAtX(int x) {
for (int i=0;i<columns.size();i++)
{
if (x < getColumnPos(i+1))
return i;
}
return -1;
}
@Override
public CellRenderer getColumnCellRenderer(int column) {
return columns.get(column).getCellRenderer();
}
@Override
public int getColumnModelColumn(int x)
{
return getColumn(x).modelColumn;
}
@Override
public TreeTablePopupListener getPopup(int row, int column) {
TreeTablePopupListener listener;
listener = getPopupFromColumn(column);
if (listener == null)
listener = getPopupFromRow(row);
return listener;
}
protected TreeTablePopupListener getPopupFromRow(int row)
{
return null;
}
protected TreeTablePopupListener getPopupFromColumn(int column)
{
return columns.get(column).getPopupListener();
}
}

View File

@ -0,0 +1,83 @@
package org.hwo.ui.treetable;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class DefaultTreeTableModel implements TreeTableModel {
private TreeTableElement rootNode;
private List<TreeTableModelListener> treeTableModelListener;
public DefaultTreeTableModel()
{
treeTableModelListener = new LinkedList<TreeTableModelListener>();
}
@Override
public Object getParent(Object node) {
return ((TreeTableElement)node).getParent();
}
@Override
public int getChildCount(Object parent) {
return ((TreeTableElement)parent).getChildCount();
}
@Override
public Object getChild(Object parent, int index) {
return ((TreeTableElement)parent).getChild(index);
}
@Override
public Object getRoot() {
return getRootNode();
}
@Override
public boolean isLeaf(Object node) {
if (((TreeTableElement)node).getChildCount()==0)
return true;
else
return false;
}
@Override
public Object getValue(Object node, int column) {
return ((TreeTableElement)node).getValue(column);
}
public TreeTableElement getRootNode() {
return rootNode;
}
public void setRootNode(TreeTableElement rootNode) {
this.rootNode = rootNode;
fireRowsChanged();
}
@Override
public TreeTableColumnModel getDefaultColumnModel() {
return new DefaultTreeTableColumnModel();
}
@Override
public void addTreeTableModelListener(TreeTableModelListener listener) {
treeTableModelListener.add(listener);
}
@Override
public void removeTreeTableModelListener(TreeTableModelListener listener) {
treeTableModelListener.remove(listener);
}
private void fireRowsChanged()
{
for (TreeTableModelListener listener:treeTableModelListener)
listener.rowsChanged();
}
}

View File

@ -0,0 +1,623 @@
package org.hwo.ui.treetable;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.Scrollable;
import javax.swing.SwingConstants;
import org.hwo.ui.CellEditor;
import org.hwo.ui.CellEditorArgs;
import org.hwo.ui.CellEditorListener;
import org.hwo.ui.CellRenderer;
import org.hwo.ui.DefaultCellEditor;
import org.hwo.ui.DefaultCellRenderer;
import org.hwo.ui.shapes.Triangle;
import org.hwo.ui.treetable.DefaultTreeTableColumnModel.Column;
public class TreeTable extends JComponent implements Scrollable, TreeTableModelListener, CellEditorListener {
class NodeState
{
private boolean opened;
public int indentation;
public boolean isOpened() {
return opened;
}
public void setOpened(boolean opened) {
this.opened = opened;
}
}
public class HeaderView extends JComponent
{
@Override
public void paint(Graphics g) {
g.drawLine(0, getHeight()-1, TreeTable.this.preferredSize.width - 1, getHeight()-1);
for (int i=0;i<columnModel.getColumnCount();i++)
{
int left = columnModel.getColumnPos(i);
int width = columnModel.getColumnWidth(i);
int right = left + width - 1;
g.setColor(getForeground());
g.drawString(columnModel.getColumnLabel(i), left + 2, rowHeight - 3);
g.drawLine( right, 0, right, getHeight());
}
}
}
private TreeTableModel model;
private TreeTableColumnModel
columnModel;
private int rowHeight;
private List<Object> rowObjects;
private Hashtable<Object, NodeState>
nodeStates;
private Hashtable<Class<?>, CellRenderer> cellRendererList;
private Hashtable<Class<?>, CellEditor> cellEditorList;
private JViewport headerViewport;
private Dimension preferredSize;
private List<TreeTablePopupListener> popupListener;
private List<TreeTableMouseListener> mouseListener;
private CellEditor activeEditor;
public TreeTable()
{
popupListener = new LinkedList<TreeTablePopupListener>();
mouseListener = new LinkedList<TreeTableMouseListener>();
preferredSize = new Dimension(1,1);
rowHeight = 20;
setBackground(Color.WHITE);
cellRendererList = new Hashtable<Class<?>, CellRenderer>();
cellRendererList.put(Object.class, new DefaultCellRenderer());
cellEditorList = new Hashtable<Class<?>, CellEditor>();
addCellEditor(Object.class, new DefaultCellEditor());
rowObjects = new ArrayList<Object>();
nodeStates = new Hashtable<Object, TreeTable.NodeState>();
setModel(new DefaultTreeTableModel());
addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger())
firePopupRequestedFromMouseEvent(e);
}
@Override
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger())
firePopupRequestedFromMouseEvent(e);
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
int row,column;
row = e.getY() / rowHeight;
column = columnModel.getColumnAtX(e.getX());
TreeTable.this.mouseClicked(e.getX(), e.getY(), e.getClickCount(), row, column);
if (e.isPopupTrigger())
firePopupRequestedFromMouseEvent(e);
else
fireMouseClicked(e);
}
});
prepareWidth();
prepareHeight();
}
public Point mouseToCell(int x,int y)
{
Point p = new Point();
p.x = columnModel.getColumnAtX(x);
p.y = y / rowHeight;
if ((p.x >= columnModel.getColumnCount()) || (p.y >= rowObjects.size()))
return null;
return p;
}
public Object getRowObject(int row)
{
return this.rowObjects.get(row);
}
private CellRenderer findCellRenderer(Class<?> clazz)
{
if (clazz == null)
return new DefaultCellRenderer();
if (cellRendererList.containsKey(clazz))
return cellRendererList.get(clazz);
if (clazz.getSuperclass()!=null)
return findCellRenderer(clazz.getSuperclass());
return new DefaultCellRenderer();
}
public void addCellEditor(Class<?> clazz,CellEditor editor)
{
editor.addCellEditorListener(this);
cellEditorList.put(clazz,editor);
}
private CellEditor findCellEditor(Class<?> clazz)
{
if (clazz == null)
return null;
if (cellEditorList.containsKey(clazz))
return cellEditorList.get(clazz);
return cellEditorList.get(Object.class);
}
private void mouseClicked(int x,int y,int clickCount,int row,int column)
{
System.err.println("Click: " + x + "/" + y + " ( " + row + " : " + column + " )");
if (clickCount == 1)
{
if (column == 0)
{
if (x < rowHeight)
{
NodeState state = getState(rowObjects.get(row));
setOpened(rowObjects.get(row), !state.opened);
}
}
}
}
private void prepareWidth()
{
preferredSize.width = columnModel.getColumnPos(columnModel.getColumnCount());
}
private void prepareHeight()
{
prepareRows();
preferredSize.height = rowHeight * rowObjects.size();
}
private void prepareRow(Object row)
{
if (row!=null)
{
int ind = getState(row).indentation;
rowObjects.add(row);
if (model.getChildCount(row)>0)
{
if (getState(row).isOpened())
{
for (int i=0;i<model.getChildCount(row);i++)
{
Object child = model.getChild(row, i);
getState(child).indentation = ind + 1 ;
prepareRow( child );
}
}
}
};
}
private void prepareRows()
{
if (rowObjects == null)
return;
rowObjects.clear();
if (model.getRoot()!=null)
{
getState(model.getRoot()).indentation = 0;
prepareRow(model.getRoot());
};
}
private NodeState getState(Object node)
{
if (!nodeStates.containsKey(node))
nodeStates.put(node, new NodeState());
return nodeStates.get(node);
}
private Rectangle getCellRect(int row,int column)
{
int left = columnModel.getColumnPos(column);
int width = columnModel.getColumnWidth(column);
int top = rowHeight * row;
return new Rectangle(left, top, width, rowHeight);
}
@Override
public void paint(Graphics g) {
prepareRows();
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
for (int i=0;i<rowObjects.size();i++)
{
Object ro = rowObjects.get(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);
}
}
}
}
private void firePopupRequestedFromMouseEvent(MouseEvent event)
{
Point p = mouseToCell(event.getX(), event.getY());
TreeTablePopupArgs args = new TreeTablePopupArgs(this, p.y,p.x, event.getX(), event.getY());
firePopupRequested(args);
}
private void firePopupRequested(TreeTablePopupArgs args)
{
TreeTablePopupListener listener = columnModel.getPopup(args.getRow(), args.getColumn());
if (listener != null)
listener.popupRequest(args);
else
for (TreeTablePopupListener l:popupListener)
l.popupRequest(args);
}
public void addPopupListener(TreeTablePopupListener listener)
{
popupListener.add(listener);
}
public void removePopupListener(TreeTablePopupListener listener)
{
popupListener.remove(listener);
}
private void fireMouseClicked(MouseEvent event)
{
TreeTableMouseArgs args = new TreeTableMouseArgs(this,event);
if (args.getMouseEvent().getClickCount()==2)
{
if (args.getRowObject() != null)
{
startEditor(args.getRow(),args.getColumn());
}
}
for (TreeTableMouseListener listener:mouseListener)
listener.mouseClicked(args);
}
public void addMouseListener(TreeTableMouseListener listener)
{
mouseListener.add(listener);
}
public void removeMouseListener(TreeTableMouseListener listener)
{
mouseListener.remove(listener);
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect,
int orientation, int direction) {
if (orientation == SwingConstants.HORIZONTAL)
return visibleRect.width / 2;
else
return visibleRect.height / 2;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return false;
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect,
int orientation, int direction) {
if (orientation == SwingConstants.HORIZONTAL)
return 10;
else
return rowHeight;
}
public TreeTableModel getModel() {
return model;
}
public DefaultTreeTableModel getDefaultModel()
{
return (DefaultTreeTableModel)model;
}
public void setModel(TreeTableModel model) {
if (this.model != null)
this.model.removeTreeTableModelListener(this);
rowObjects.clear();
nodeStates.clear();
this.model = model;
this.model.addTreeTableModelListener(this);
TreeTableColumnModel cm = model.getDefaultColumnModel();
if (cm != null)
setColumnModel(cm);
prepareRows();
}
public int getRowHeight() {
return rowHeight;
}
public void setRowHeight(int rowHeight) {
this.rowHeight = rowHeight;
}
public void setOpened(Object node,boolean opened)
{
getState(node).opened = opened;
prepareHeight();
repaint();
}
public TreeTableColumnModel getColumnModel() {
return columnModel;
}
public void setColumnModel(TreeTableColumnModel columnModel) {
if (this.columnModel != null)
this.columnModel.removeTreeTableModelListener(this);
this.columnModel = columnModel;
this.columnModel.addTreeTableModelListener(this);
}
@Override
public void columnsChanged() {
buildHeader();
prepareWidth();
repaint();
}
@Override
public void rowsChanged() {
prepareHeight();
repaint();
}
@Override
public void repaint() {
invalidate();
if (getParent()!=null)
getParent().validate();
super.repaint();
}
private void buildHeader()
{
if (headerViewport == null)
headerViewport = new JViewport();
headerViewport.removeAll();
HeaderView hv = new HeaderView();
hv.setSize(columnModel.getColumnPos(columnModel.getColumnCount()),24);
hv.setPreferredSize(new Dimension(columnModel.getColumnPos(columnModel.getColumnCount()),24));
headerViewport.setView(hv);
}
private JViewport getHeaderViewport()
{
if (headerViewport == null)
buildHeader();
return headerViewport;
}
private void configureEnclosingScrollPane()
{
prepareWidth();
prepareHeight();
if (JViewport.class.isInstance(getParent()) && JScrollPane.class.isInstance(getParent().getParent()))
{
JScrollPane sp = (JScrollPane)getParent().getParent();
sp.setColumnHeader(getHeaderViewport());
}
}
@Override
public void addNotify() {
configureEnclosingScrollPane();
super.addNotify();
}
@Override
public void removeNotify() {
super.removeNotify();
}
@Override
public Dimension getPreferredSize() {
return preferredSize;
}
public void cancelEditor()
{
if (activeEditor != null)
{
activeEditor.editCancel();
activeEditor = null;
}
}
public void startEditor(int row,int column)
{
if (activeEditor != null)
cancelEditor();
Object value = getModel().getValue(rowObjects.get(row), column);
activeEditor = findCellEditor(value.getClass());
if (activeEditor != null)
{
activeEditor.editBegin(this, getCellRect(row, column), value);
}
}
@Override
public void editBegin(CellEditorArgs args) {
// TODO Auto-generated method stub
}
@Override
public void editCanceled(CellEditorArgs args) {
}
@Override
public void editFinished(CellEditorArgs args) {
}
}

View File

@ -0,0 +1,28 @@
package org.hwo.ui.treetable;
import org.hwo.ui.CellRenderer;
public interface TreeTableColumnModel {
public void addTreeTableModelListener(TreeTableModelListener listener);
public void removeTreeTableModelListener(TreeTableModelListener listener);
public int getColumnCount();
public String getColumnLabel(int column);
public int getColumnWidth(int column);
public int getColumnPos(int column);
public int getColumnAtX(int x);
public int getColumnModelColumn(int x);
public CellRenderer
getColumnCellRenderer(int column);
public TreeTablePopupListener
getPopup(int row,int column);
}

View File

@ -0,0 +1,14 @@
package org.hwo.ui.treetable;
public interface TreeTableElement {
public TreeTableElement
getParent();
public Object getValue(int column);
public int getChildCount();
public TreeTableElement
getChild(int index);
}

View File

@ -0,0 +1,22 @@
package org.hwo.ui.treetable;
public interface TreeTableModel {
public void addTreeTableModelListener(TreeTableModelListener listener);
public void removeTreeTableModelListener(TreeTableModelListener listener);
public Object getParent(Object node);
public int getChildCount(Object parent);
public Object getChild(Object parent,int index);
public Object getRoot();
public boolean isLeaf(Object node);
public Object getValue(Object node,int column);
public TreeTableColumnModel
getDefaultColumnModel();
}

View File

@ -0,0 +1,7 @@
package org.hwo.ui.treetable;
public interface TreeTableModelListener {
public void columnsChanged();
public void rowsChanged();
}

View File

@ -0,0 +1,69 @@
package org.hwo.ui.treetable;
import java.awt.Point;
import java.awt.event.MouseEvent;
public class TreeTableMouseArgs {
private MouseEvent mouseEvent;
private int row, column;
private TreeTable treeTable;
private Object rowObject;
public TreeTableMouseArgs(TreeTable treeTable,MouseEvent event)
{
this.treeTable = treeTable;
mouseEvent = event;
Point p = treeTable.mouseToCell(event.getX(), event.getY());
row = p.y;
column = p.x;
rowObject = treeTable.getRowObject(row);
}
public MouseEvent getMouseEvent() {
return mouseEvent;
}
public void setMouseEvent(MouseEvent mouseEvent) {
this.mouseEvent = mouseEvent;
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getColumn() {
return column;
}
public void setColumn(int column) {
this.column = column;
}
public TreeTable getTreeTable() {
return treeTable;
}
public void setTreeTable(TreeTable treeTable) {
this.treeTable = treeTable;
}
public Object getRowObject() {
return rowObject;
}
public void setRowObject(Object rowObject) {
this.rowObject = rowObject;
}
}

View File

@ -0,0 +1,7 @@
package org.hwo.ui.treetable;
public interface TreeTableMouseListener {
public void mouseClicked(TreeTableMouseArgs args);
}

View File

@ -0,0 +1,61 @@
package org.hwo.ui.treetable;
public class TreeTablePopupArgs {
private TreeTable treeTable;
private int row,
column;
private int mouseX,
mouseY;
public TreeTablePopupArgs(TreeTable treeTable,int row,int column,int x,int y)
{
this.setTreeTable(treeTable);
this.setRow(row);
this.setColumn(column);
this.setMouseX(x);
this.setMouseY(y);
}
public int getColumn() {
return column;
}
public void setColumn(int column) {
this.column = column;
}
public TreeTable getTreeTable() {
return treeTable;
}
public void setTreeTable(TreeTable treeTable) {
this.treeTable = treeTable;
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getMouseX() {
return mouseX;
}
public void setMouseX(int mouseX) {
this.mouseX = mouseX;
}
public int getMouseY() {
return mouseY;
}
public void setMouseY(int mouseY) {
this.mouseY = mouseY;
}
}

View File

@ -0,0 +1,7 @@
package org.hwo.ui.treetable;
public interface TreeTablePopupListener {
public void popupRequest(TreeTablePopupArgs args);
}