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.plugins.main.core.actions;
005    
006    import graphlab.graph.graph.GraphModel;
007    import graphlab.ui.components.gpropertyeditor.EditingFinishedListener;
008    import graphlab.ui.components.gpropertyeditor.GBasicCellEditor;
009    import graphlab.ui.components.gpropertyeditor.editors.GColorEditor;
010    
011    import javax.swing.*;
012    import java.awt.*;
013    import java.awt.event.ActionEvent;
014    import java.awt.event.ActionListener;
015    import java.awt.event.MouseEvent;
016    import java.awt.event.MouseListener;
017    
018    
019    /**
020     * author: Azin Azadi
021     * Email:
022     */
023    public class GMergedColorEditor implements GBasicCellEditor<Integer>, ActionListener, EditingFinishedListener, MouseListener, ListCellRenderer {
024        JComboBox c;
025        private Integer curVal;
026        private EditingFinishedListener listener;
027        boolean general = true;
028    
029        public GMergedColorEditor(boolean vertexColor) {
030            isVertexColor = vertexColor;
031            general = false;
032        }
033    
034        boolean isVertexColor;
035    
036        public GMergedColorEditor() {
037            general = true;
038        }
039    
040        private void createCombo() {
041            c = new JComboBox();
042            c.addItem("Int Editor");
043            c.addItem("Color Editor");
044    
045            for (int i = 0; i < 20; i++) {
046                c.addItem(i);
047            }
048            c.addItem(curVal);
049            c.setRenderer(this);
050            c.addActionListener(this);
051            c.setSelectedIndex(c.getItemCount() - 1);
052        }
053    
054        public void setEditingFinishedListener(EditingFinishedListener listener) {
055            this.listener = listener;
056        }
057    
058        public Component getEditorComponent(Integer value) {
059            this.curVal = value;
060            createCombo();
061            return c;
062        }
063    
064    
065        public void cancelEditing() {
066    
067        }
068    
069        public Object getEditorValue() {
070            if (c.getSelectedItem() instanceof String) {
071                String val = (String) c.getSelectedItem();
072                if (val.equals("Int Editor")) {
073                    try {
074                        int v = Integer.parseInt(comp.getText());
075                        return v;
076                    }
077                    catch (Exception ee) { //it was not a number
078                        return curVal;
079                    }
080    
081                } else if (val.equals("Color Editor")) {
082                    Color editorValue = gc.getEditorValue();
083                    return editorValue.getRGB();
084                }
085            }
086            return c.getSelectedItem();
087        }
088    
089    
090        GColorEditor gc;
091        JTextField comp;
092    
093        public void actionPerformed(ActionEvent e) { //on combo
094            if (c.getSelectedItem() instanceof String) {
095                String val = (String) c.getSelectedItem();
096                if (val.equals("Int Editor")) {
097                    showIntEditor();
098                } else if (val.equals("Color Editor")) {
099                    showRGBEditor();
100                }
101            } else {
102                Integer i = (Integer) c.getSelectedItem();
103                listener.editingFinished(i);
104            }
105        }
106    
107        private void showRGBEditor() {
108            gc = new GColorEditor();
109            gc.getEditorComponent(GraphModel.getColor(curVal)).setVisible(true);
110            gc.setEditingFinishedListener(this);
111        }
112    
113        private void showIntEditor() {
114            final JFrame f = new JFrame();
115            comp = new JTextField(7);
116            f.add(comp);
117            f.pack();
118            f.setVisible(true);
119            comp.addActionListener(new ActionListener() {
120                public void actionPerformed(ActionEvent e) {
121                    String text = comp.getText();
122                    try {
123                        int v = Integer.parseInt(text);
124                        listener.editingFinished(v);
125                        f.setVisible(false);
126                    }
127                    catch (Exception ee) { //it was not a number
128                        comp.setText("" + curVal);
129                    }
130                }
131            });
132        }
133    
134        public void editingFinished(Object editorValue) {
135            listener.editingFinished(((Color) editorValue).getRGB());
136        }
137    
138        public void mouseClicked(MouseEvent e) {//this is done because of the bug:4135029 of jdk. see: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4135029
139            if (c.getSelectedIndex() == 0) {
140                showIntEditor();
141            }
142            if (c.getSelectedIndex() == 1) {
143                showRGBEditor();
144            }
145        }
146    
147        public void mousePressed(MouseEvent e) {
148        }
149    
150        public void mouseReleased(MouseEvent e) {
151        }
152    
153        public void mouseEntered(MouseEvent e) {
154        }
155    
156        public void mouseExited(MouseEvent e) {
157        }
158    
159        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
160            if (value instanceof String) {
161                DefaultListCellRenderer d = new DefaultListCellRenderer();
162                Component c = d.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
163                return c;
164                //                    String v = (String) value;
165                //                    if (v.equals("Color Editor")) {
166                //
167                //                    } else if (v.equals("Int Editor")) {
168                //
169                //                    }
170            }
171            if (!general)
172                return new GMergedColorRenderer().getRendererComponent(value, isVertexColor);
173            else
174                return new GMergedColorRenderer().getRendererComponent(value);
175        }
176    }