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    }