001 // GraphLab Project: http://graphlab.sharif.edu 002 // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology 003 // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ 004 package graphlab.ui.components.gpropertyeditor; 005 006 import graphlab.platform.attribute.AtomAttribute; 007 import graphlab.platform.attribute.NotifiableAttributeSet; 008 import graphlab.platform.lang.ArrayX; 009 import graphlab.platform.lang.BoundedInteger; 010 import graphlab.ui.NotifiableAttributeSetView; 011 import graphlab.ui.PortableNotifiableAttributeSetImpl; 012 import graphlab.ui.UIUtils; 013 import graphlab.ui.components.gpropertyeditor.editors.GColorEditor; 014 import graphlab.ui.components.gpropertyeditor.editors.GFileEditor; 015 import graphlab.ui.components.gpropertyeditor.editors.GFontEditor; 016 import graphlab.ui.components.gpropertyeditor.editors.GStringEditor; 017 import graphlab.ui.components.gpropertyeditor.editors.inplace.ArrayXEditor; 018 import graphlab.ui.components.gpropertyeditor.editors.inplace.BoundedIntegerEditor; 019 import graphlab.ui.components.gpropertyeditor.editors.inplace.GBooleanEditor; 020 import graphlab.ui.components.gpropertyeditor.editors.inplace.GDimensionEditor; 021 import graphlab.ui.components.gpropertyeditor.renderers.*; 022 import graphlab.ui.components.utils.GFrameLocationProvider; 023 024 import javax.swing.*; 025 import javax.swing.border.EmptyBorder; 026 import java.awt.*; 027 import java.awt.event.MouseAdapter; 028 import java.awt.event.MouseEvent; 029 import java.awt.event.MouseListener; 030 import java.io.File; 031 032 /** 033 * see http://graphlab.sharif.ir/trac/wiki/PropertyEditor for documentations. 034 * @author Azin Azadi 035 * @email : aazadi@gmail.com 036 */ 037 038 public class GPropertyEditor extends JComponent { 039 GCellEditor editor = new GCellEditor(); 040 GCellRenderer renderer = new GCellRenderer(); 041 JTable table = new JTable() { 042 043 public void paint(Graphics g) { 044 super.paint(g); 045 } 046 }; 047 public GPropertyTableModel model = new GPropertyTableModel(); 048 NotifiableAttributeSetView def = new PortableNotifiableAttributeSetImpl(); 049 050 public GPropertyEditor() { 051 super(); 052 setMinimumSize(new Dimension(300, 200)); 053 setPreferredSize(new Dimension(300, 300)); 054 table.setModel(model); 055 table.setDefaultRenderer(table.getColumnClass(1), renderer); 056 table.setDefaultEditor(table.getColumnClass(1), editor); 057 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 058 table.setAutoCreateColumnsFromModel(true); 059 // table.getTableHeader().setUpdateTableInRealTime(true); 060 table.setSurrendersFocusOnKeystroke(true); 061 062 table.addMouseListener(new MouseAdapter() { 063 public void mouseClicked(MouseEvent e) { 064 int row = table.getSelectedRow(); 065 if (row == -1) 066 return; 067 MouseListener[] mouseListeners = renderer.getLastCreatedRenderer(row).getMouseListeners(); 068 if (mouseListeners != null) { 069 for (MouseListener ml : mouseListeners) { 070 ml.mouseClicked(e); 071 } 072 } 073 } 074 }); 075 076 //// table.setGridColor(Color.lightGray); 077 // table.setRowHeight(30); 078 // table.getColumnModel().getColumn(1).setWidth(50); 079 initComponents(); 080 l.setEditable(false); 081 // l.setLineWrap(true); 082 // l.setPreferredSize(new Dimension(300,300)); 083 } 084 085 JEditorPane l = new JEditorPane(); 086 087 private void initComponents() { 088 JSplitPane jSplitPane1 = new JSplitPane(); 089 JScrollPane jScrollPane1 = new JScrollPane(); 090 091 jScrollPane1.setBorder(new EmptyBorder(0, 0, 0, 0)); 092 jSplitPane1.setBorder(new EmptyBorder(0, 0, 0, 0)); 093 094 setLayout(new java.awt.BorderLayout()); 095 096 jSplitPane1.setDividerSize(2); 097 jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); 098 jSplitPane1.setResizeWeight(0.8); 099 jScrollPane1.setViewportView(table); 100 table.setBackground(Color.white); 101 jScrollPane1.setBackground(Color.white); 102 jSplitPane1.setLeftComponent(jScrollPane1); 103 104 // jPanel1.add(l); 105 // jPanel1.setMinimumSize(new Dimension(10, 20)); 106 // jPanel1.setMaximumSize(new Dimension(10, 20)); 107 jSplitPane1.setRightComponent(l); 108 // l.setBackground(Color.white); 109 // l.setOpaque(true); 110 add(jSplitPane1, java.awt.BorderLayout.CENTER); 111 112 validate(); 113 table.addMouseListener(new MouseAdapter() { 114 public void mousePressed(MouseEvent e) { 115 updateDescription(); 116 } 117 }); 118 } 119 120 private void updateDescription() { 121 if (target != null) { 122 int scc = table.getSelectedRow(); 123 if (scc != -1) { 124 String name = target.getView().getNameAt(scc); 125 String desc = target.getView().getDescription(name); 126 if (desc == null || desc.equals("")) { 127 desc = name; 128 } 129 desc += ": " + target.getView().getAttribute().get(name); 130 setDescription(desc); 131 } 132 } else { 133 setDescription(""); 134 } 135 } 136 137 private void setDescription(String desc) { 138 l.setText(desc); 139 } 140 141 static { 142 UIUtils.registerRenderer(Dimension.class, new GDimensionRenderer()); 143 UIUtils.registerEditor(Dimension.class, new GDimensionEditor()); 144 // registerEditor(String.class, new GStringEditor()); 145 UIUtils.registerEditor(Color.class, new GColorEditor()); 146 UIUtils.registerRenderer(Color.class, new GColorRenderer()); 147 UIUtils.registerRenderer(Boolean.class, new GBooleanRenderer()); 148 UIUtils.registerEditor(Boolean.class, new GBooleanEditor()); 149 UIUtils.registerEditor(Font.class, new GFontEditor()); 150 UIUtils.registerRenderer(Font.class, new GFontRenderer()); 151 UIUtils.registerEditor(ArrayX.class, new ArrayXEditor(null)); 152 // registerEditor(DefaultOAtr.class, new DefaultOAtrEditor()); 153 UIUtils.registerRenderer(AtomAttribute.class, new OAtrRenderer()); 154 UIUtils.registerEditor(String.class, new GStringEditor()); 155 UIUtils.registerEditor(BoundedInteger.class, new BoundedIntegerEditor()); 156 UIUtils.registerRenderer(BoundedInteger.class, new BoundedIntegerRenderer()); 157 UIUtils.registerRenderer(Iterable.class, new IterableRenderer()); 158 UIUtils.registerEditor(File.class, new GFileEditor()); 159 } 160 161 public ProEditor2NotifiableAttributeSetConnector conector = new ProEditor2NotifiableAttributeSetConnector(this); 162 163 public void connect(NotifiableAttributeSet x) { 164 conector.connect(x); 165 166 int h = 0; 167 for (int i = 0; i < table.getRowCount(); i++) { 168 h += table.getRowHeight(i); 169 } 170 h += table.getRowCount() * table.getRowMargin(); 171 table.setPreferredSize(GFrameLocationProvider.getPopUpSize()); 172 table.validate(); 173 } 174 175 NotifiableAttributeSetView target; 176 177 public JTable getTable() { 178 return table; 179 } 180 181 }