// 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.attribute.AtomAttribute;
import graphtea.platform.attribute.NotifiableAttributeSet;
import graphtea.platform.lang.ArrayX;
import graphtea.platform.lang.BoundedInteger;
import graphtea.ui.NotifiableAttributeSetView;
import graphtea.ui.PortableNotifiableAttributeSetImpl;
import graphtea.ui.UIUtils;
import graphtea.ui.components.gpropertyeditor.editors.GColorEditor;
import graphtea.ui.components.gpropertyeditor.editors.GFileEditor;
import graphtea.ui.components.gpropertyeditor.editors.GFontEditor;
import graphtea.ui.components.gpropertyeditor.editors.GStringEditor;
import graphtea.ui.components.gpropertyeditor.editors.inplace.ArrayXEditor;
import graphtea.ui.components.gpropertyeditor.editors.inplace.BoundedIntegerEditor;
import graphtea.ui.components.gpropertyeditor.editors.inplace.GBooleanEditor;
import graphtea.ui.components.gpropertyeditor.editors.inplace.GDimensionEditor;
import graphtea.ui.components.gpropertyeditor.renderers.*;
import graphtea.ui.components.utils.GFrameLocationProvider;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
/**
* see http://graphtea.sharif.ir/trac/wiki/PropertyEditor for documentations. todo: [tea] link to be updated
* @author Azin Azadi
* @email : aazadi@gmail.com
*/
public class GPropertyEditor extends JComponent {
GCellEditor editor = new GCellEditor();
GCellRenderer renderer = new GCellRenderer();
JTable table = new JTable() {
public void paint(Graphics g) {
super.paint(g);
}
@Override
public Dimension getMinimumSize() {
return new Dimension(150, 1100);
}
@Override
public Dimension getPreferredSize() {
return getMinimumSize();
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
@Override
public int getScrollableUnitIncrement(Rectangle rectangle, int i, int i2) {
return 8;
}
@Override
public int getScrollableBlockIncrement(Rectangle rectangle, int i, int i2) {
return getVisibleRect().height;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return true;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
};
public GPropertyTableModel model = new GPropertyTableModel();
NotifiableAttributeSetView def = new PortableNotifiableAttributeSetImpl();
public GPropertyEditor() {
super();
setMinimumSize(new Dimension(300, 200));
setPreferredSize(new Dimension(300, 300));
table.setModel(model);
table.setDefaultRenderer(table.getColumnClass(1), renderer);
table.setDefaultEditor(table.getColumnClass(1), editor);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setAutoCreateColumnsFromModel(true);
// table.getTableHeader().setUpdateTableInRealTime(true);
table.setSurrendersFocusOnKeystroke(true);
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int row = table.getSelectedRow();
if (row == -1)
return;
MouseListener[] mouseListeners = renderer.getLastCreatedRenderer(row).getMouseListeners();
if (mouseListeners != null) {
for (MouseListener ml : mouseListeners) {
ml.mouseClicked(e);
}
}
}
});
//// table.setGridColor(Color.lightGray);
// table.setRowHeight(30);
// table.getColumnModel().getColumn(1).setWidth(50);
initComponents();
l.setEditable(false);
l.setLineWrap(true);
l.setWrapStyleWord(true);
// l.setLineWrap(true);
// l.setPreferredSize(new Dimension(300,300));
}
private JTextArea l = new JTextArea();
private void initComponents() {
JSplitPane jSplitPane1 = new JSplitPane();
JScrollPane jScrollPane1 = new JScrollPane();
JScrollPane jScrollPane2 = new JScrollPane();
jScrollPane1.setBorder(new EmptyBorder(0, 0, 0, 0));
jScrollPane2.setBorder(new EmptyBorder(0, 0, 0, 0));
jSplitPane1.setBorder(new EmptyBorder(0, 0, 0, 0));
setLayout(new java.awt.BorderLayout());
jSplitPane1.setDividerSize(2);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setResizeWeight(0.8);
jScrollPane1.setViewportView(table);
jScrollPane2.setViewportView(l);
table.setBackground(Color.white);
jScrollPane1.setBackground(Color.white);
jScrollPane2.setBackground(Color.white);
jSplitPane1.setLeftComponent(jScrollPane1);
// jPanel1.add(l);
// jPanel1.setMinimumSize(new Dimension(10, 20));
// jPanel1.setMaximumSize(new Dimension(10, 20));
jSplitPane1.setRightComponent(jScrollPane2);
// l.setBackground(Color.white);
// l.setOpaque(true);
add(jSplitPane1, java.awt.BorderLayout.CENTER);
validate();
table.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
updateDescription();
}
});
}
private void updateDescription() {
if (target != null) {
int scc = table.getSelectedRow();
if (scc != -1) {
String name = target.getView().getNameAt(scc);
String desc = target.getView().getDescription(name);
if (desc == null || desc.equals("")) {
desc = name;
}
desc += ": " + target.getView().getAttribute().get(name);
setDescription(desc);
}
} else {
setDescription("");
}
}
private void setDescription(String desc) {
l.setText(desc);
}
static {
UIUtils.registerRenderer(Dimension.class, new GDimensionRenderer());
UIUtils.registerEditor(Dimension.class, new GDimensionEditor());
// registerEditor(String.class, new GStringEditor());
UIUtils.registerEditor(Color.class, new GColorEditor());
UIUtils.registerRenderer(Color.class, new GColorRenderer());
UIUtils.registerRenderer(Boolean.class, new GBooleanRenderer());
UIUtils.registerEditor(Boolean.class, new GBooleanEditor());
UIUtils.registerEditor(Font.class, new GFontEditor());
UIUtils.registerRenderer(Font.class, new GFontRenderer());
UIUtils.registerEditor(ArrayX.class, new ArrayXEditor(null));
// registerEditor(DefaultOAtr.class, new DefaultOAtrEditor());
UIUtils.registerRenderer(AtomAttribute.class, new OAtrRenderer());
UIUtils.registerEditor(String.class, new GStringEditor());
UIUtils.registerEditor(BoundedInteger.class, new BoundedIntegerEditor());
UIUtils.registerRenderer(BoundedInteger.class, new BoundedIntegerRenderer());
UIUtils.registerRenderer(Iterable.class, new IterableRenderer());
UIUtils.registerEditor(File.class, new GFileEditor());
}
public ProEditor2NotifiableAttributeSetConnector conector = new ProEditor2NotifiableAttributeSetConnector(this);
public void connect(NotifiableAttributeSet x) {
conector.connect(x);
int h = 0;
for (int i = 0; i < table.getRowCount(); i++) {
h += table.getRowHeight(i);
}
h += table.getRowCount() * table.getRowMargin();
table.setPreferredSize(GFrameLocationProvider.getPopUpSize());
table.validate();
}
NotifiableAttributeSetView target;
public JTable getTable() {
return table;
}
}