// 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;
import graphtea.platform.StaticUtils;
import graphtea.ui.AttributeSetView;
import graphtea.ui.components.gpropertyeditor.editors.GStringEditor;
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import java.awt.*;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* 1- inplace editing and outplace editing
* @see graphtea.ui.components.gpropertyeditor.GPropertyEditor
*
* @author Azin Azadi
*/
public class GCellEditor extends AbstractCellEditor implements TableCellEditor, EditingFinishedListener {
/**
*
*/
private static final long serialVersionUID = -7943480654474872421L;
protected static HashMap<Class, GBasicCellEditor> knownEditors = new HashMap<>();
//current editor!
private GBasicCellEditor editor;
protected AttributeSetView atr;
public static void registerEditor(Class clazz, GBasicCellEditor editor) {
knownEditors.put(clazz, editor);
}
public GCellEditor() {
}
public void cancelCellEditing() {
super.cancelCellEditing();
if (lastEditor != null)
lastEditor.cancelEditing();
}
GBasicCellEditor lastEditor;
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
String name = atr.getNameAt(row);
if (!atr.isEditable(name))
return null;
if (value == null) {
return null;
}
editor = atr.getEditor(name);
if (editor == null) {
editor = getEditorFor(value);
if (editor == null)
return null;
}
editor.setEditingFinishedListener(this);
return editor.getEditorComponent(value);
}
private static ObjectEditor oe = new ObjectEditor();
/**
* gets an editor for the given object, the editor should be registered before,...
* several editors are registered as default
*/
public static GBasicCellEditor getEditorFor(Object value) {
GBasicCellEditor editor = null;
Class c = value.getClass();
//search super classes
while (editor == null && c != Object.class) {
editor = knownEditors.get(c);
c = c.getSuperclass();
}
if (editor == null) {
//search implementing interfaces
Class cc[] = value.getClass().getInterfaces();
for (int i = 0; i < cc.length && editor == null; i++)
editor = knownEditors.get(cc[i]);
}
if (editor == null) {
//no editor was defiend for this Class
//take the last chance
try {
if (StaticUtils.fromString(value.getClass().getName(), value.toString()) != null) {
return oe; //return oe if it can be reconstructed from a string in StaticUtils
}
} catch (Exception e) {
return null;
}
}
return editor;
}
public Object getCellEditorValue() {
return editor.getEditorValue();
}
public void editingFinished(Object editorValue) {
stopCellEditing();
}
void setAtrView(AttributeSetView attribute) {
this.atr = attribute;
}
/**
* @return known editors as an unmodifiable map
*/
public static Map<Class, GBasicCellEditor> getKnownEditors(){
return Collections.unmodifiableMap(knownEditors);
}
}
class ObjectEditor extends GStringEditor {
Class clazz;
public Component getEditorComponent(Object value) {
clazz = value.getClass();
return super.getEditorComponent(value);
}
protected void finishEdit() {
jt.setText(getEditorValue() + "");
super.finishEdit();
}
public Object getEditorValue() {
String s = super.getEditorValue() + "";
Object o;
try {
o = StaticUtils.fromString(clazz.getName(), s);
} catch (Exception e) {
return StaticUtils.fromString(clazz.getName(), initVal);
}
return o;
}
}