// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.ui.components.gpropertyeditor.utils;
import graphtea.platform.attribute.NotifiableAttributeSet;
import graphtea.platform.attribute.NotifiableAttributeSetImpl;
import graphtea.platform.core.exception.ExceptionHandler;
import graphtea.ui.AttributeSetView;
import graphtea.ui.PortableNotifiableAttributeSetImpl;
import graphtea.ui.components.gpropertyeditor.GPropertyEditor;
import graphtea.ui.components.utils.GAttrFrame;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.lang.reflect.*;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
/**
* @author Azin Azadi
*/
public class ObjectViewer implements ListSelectionListener {
GPropertyEditor ped;
public static ObjectViewer showObject(Object o) {
ObjectViewer oo = new ObjectViewer();
oo.Connect(o);
return oo;
}
public static void main(String[] args) {
}
public void Connect(Object obj) {
PortableNotifiableAttributeSetImpl a = Object2NotifiableAttributeSet(obj);
GAttrFrame f = GAttrFrame.showEditDialog(a, false);
ped = f.getPropertyEditor();
JTable t = ped.getTable();
t.getSelectionModel().addListSelectionListener(this);
}
boolean b = true;
/**
* calls when user click on one of the properties
*/
public void valueChanged(ListSelectionEvent e) {
if (b) {
ListSelectionModel ta = (ListSelectionModel) e.getSource();
int selRow = ta.getMinSelectionIndex();
showObject(ped.getTable().getValueAt(selRow, 1));
}
b = !b;
}
private int index(int m) {
if (Modifier.isFinal(m))
return 2000;
if (Modifier.isStatic(m))
return 900;
if (Modifier.isProtected(m))
return 600;
if (Modifier.isPrivate(m))
return 500;
if (Modifier.isPublic(m))
return 400;
return 2000;
}
private int classP(Member m, Object o) {
try {
if (m.getDeclaringClass() != o.getClass())
return 50000;
}
catch (Exception e) {
return 500000;
}
return 0;
}
private PortableNotifiableAttributeSetImpl Object2NotifiableAttributeSet(Object obj) {
PortableNotifiableAttributeSetImpl a = new PortableNotifiableAttributeSetImpl();
AttributeSetView x = a.getView();
for (Field f : obj.getClass().getFields()) {
int mod = f.getModifiers();
try {
Object o = f.get(obj);
String name = f.getName();
a.put(name, o);
x.setIndex(name, index(mod) + classP(f, o));
// if(!Modifier.isFinal(mod))
} catch (IllegalAccessException e) {
ExceptionHandler.catchException(e);
}
}
for (Method m : obj.getClass().getMethods()) {
if (m.getName().startsWith("get") && m.getParameterTypes().length == 0) {
try {
Object o = m.invoke(obj, new Object[]{});
int mod = m.getModifiers();
String name = m.getName();
name = name.substring(3);
a.put(name, o);
x.setIndex(name, index(mod) + classP(m, o) + 1000);
} catch (IllegalAccessException e) {
ExceptionHandler.catchException(e);
} catch (InvocationTargetException e) {
System.err.println(obj.getClass() + "." + m.getName() + " invoke exception");
// ExceptionHandler.catchException(e);
}
}
}
return a;
}
public NotifiableAttributeSetImpl getSortedNotifiableAttributeSet(NotifiableAttributeSet in) {
Map<String, Object> atr = in.getAttrs();
Set<String> keys = atr.keySet();
Object[] o = keys.toArray();
String k[] = new String[keys.size()];
NotifiableAttributeSetImpl ret = new NotifiableAttributeSetImpl();
for (int i = 0; i < k.length; i++) {
k[i] = (String) o[i];
}
Arrays.sort(k);
for (String aK : k) {
ret.put(aK, atr.get(aK));
}
return ret;
}
}