OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Rev 86 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
74 ilm 1
package org.openconcerto.modules.extensionbuilder.list;
2
 
3
import java.awt.Component;
4
import java.awt.GridBagConstraints;
5
import java.awt.GridBagLayout;
6
import java.awt.event.ActionEvent;
7
import java.awt.event.ActionListener;
8
import java.awt.event.KeyAdapter;
9
import java.awt.event.KeyEvent;
10
import java.awt.event.MouseAdapter;
11
import java.awt.event.MouseEvent;
12
 
13
import javax.swing.DefaultListCellRenderer;
14
import javax.swing.ImageIcon;
15
import javax.swing.JButton;
16
import javax.swing.JList;
17
import javax.swing.JPanel;
18
import javax.swing.JScrollPane;
19
import javax.swing.JTree;
20
import javax.swing.tree.DefaultMutableTreeNode;
21
import javax.swing.tree.DefaultTreeCellRenderer;
22
import javax.swing.tree.TreePath;
23
 
24
import org.openconcerto.modules.extensionbuilder.Extension;
25
import org.openconcerto.modules.extensionbuilder.table.FieldDescriptor;
26
import org.openconcerto.ui.DefaultGridBagConstraints;
27
import org.openconcerto.ui.DefaultListModel;
28
import org.openconcerto.ui.JLabelBold;
29
import org.openconcerto.ui.list.ReorderableJList;
30
 
31
public class FieldDescSelector extends JPanel {
32
    private FieldTreeModel treeModel;
33
    private DefaultListModel listModel;
34
    private final JTree tree;
35
    private JList list;
36
    private ListDescriptor listDescriptor;
37
 
38
    FieldDescSelector(ListDescriptor desc, Extension extension) {
39
        this.listDescriptor = desc;
40
        this.setLayout(new GridBagLayout());
41
        GridBagConstraints c = new DefaultGridBagConstraints();
42
        this.add(new JLabelBold("Champs disponibles"), c);
43
        c.gridx += 2;
44
        this.add(new JLabelBold("Colonnes affichés"), c);
45
 
46
        // Col 0
47
        c.gridx = 0;
48
        c.gridy++;
49
        treeModel = new FieldTreeModel(extension);
50
        this.tree = new JTree(treeModel) {
51
            @Override
52
            public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
53
                final Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
54
                if (userObject == null)
55
                    return "null";
56
                FieldDescriptor d = (FieldDescriptor) userObject;
57
 
58
                if (d.getForeignTable() != null) {
59
                    return " " + d.getName() + " référence vers la table " + d.getForeignTable();
60
                }
61
                return " " + d.getName();
62
            }
63
        };
64
        tree.setRootVisible(false);
65
        tree.setShowsRootHandles(true);
66
        final DefaultTreeCellRenderer treeRenderer = new DefaultTreeCellRenderer();
67
 
68
        treeRenderer.setLeafIcon(null);
69
        treeRenderer.setOpenIcon(new ImageIcon(this.getClass().getResource("ref.png")));
70
        treeRenderer.setClosedIcon(new ImageIcon(this.getClass().getResource("ref.png")));
71
        tree.setCellRenderer(treeRenderer);
72
        c.gridheight = 2;
73
        c.weightx = 1;
74
        c.weighty = 1;
75
        c.fill = GridBagConstraints.BOTH;
76
        this.add(new JScrollPane(tree), c);
77
        // Col 1
78
        c.gridx = 1;
79
        c.gridheight = 1;
80
        c.weightx = 0;
81
        c.weighty = 0;
82
        c.fill = GridBagConstraints.NONE;
83
        c.anchor = GridBagConstraints.NORTH;
84
        final JButton buttonAdd = new JButton(">");
85
        this.add(buttonAdd, c);
86
        c.gridy++;
87
        final JButton buttonRemove = new JButton("<");
88
        this.add(buttonRemove, c);
89
        // Col 2
90
        c.gridx = 2;
91
        c.gridy--;
92
        c.gridheight = 2;
93
        c.weightx = 1;
94
        c.weighty = 1;
95
        c.fill = GridBagConstraints.BOTH;
96
        listModel = new DefaultListModel() {
97
            @Override
98
            public void addElement(Object obj) {
99
                if (!(obj instanceof ColumnDescriptor)) {
100
                    throw new IllegalArgumentException(obj + " is not a ColumnDescriptor");
101
                }
102
                super.addElement(obj);
103
            }
104
 
105
        };
106
        list = new ReorderableJList();
107
        list.setModel(listModel);
108
        list.setCellRenderer(new DefaultListCellRenderer() {
109
            @Override
110
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
111
                ColumnDescriptor f = (ColumnDescriptor) value;
112
                String label = f.getFieldsPaths();
113
                return super.getListCellRendererComponent(list, label, index, isSelected, cellHasFocus);
114
            }
115
        });
116
        this.add(new JScrollPane(list), c);
117
        // Listeners
118
        tree.addMouseListener(new MouseAdapter() {
119
            @Override
120
            public void mouseClicked(MouseEvent e) {
121
                if (e.getClickCount() > 1) {
122
                    addTreeSelectionToList();
123
                }
124
            }
125
 
126
        });
127
        buttonAdd.addActionListener(new ActionListener() {
128
 
129
            @Override
130
            public void actionPerformed(ActionEvent e) {
131
                addTreeSelectionToList();
132
 
133
            }
134
        });
135
        buttonRemove.addActionListener(new ActionListener() {
136
 
137
            @Override
138
            public void actionPerformed(ActionEvent e) {
139
                deleteSelectedInList();
140
 
141
            }
142
        });
143
        list.addKeyListener(new KeyAdapter() {
144
            @Override
145
            public void keyPressed(KeyEvent e) {
146
                if (e.getKeyCode() == KeyEvent.VK_DELETE) {
147
                    deleteSelectedInList();
148
                }
149
                e.consume();
150
            }
151
        });
152
 
153
    }
154
 
155
    public void setMainTable(String table) {
156
        treeModel.fillFromTable(table);
157
        listModel.removeAllElements();
158
        for (ColumnDescriptor d : this.listDescriptor.getColumns()) {
159
            this.listModel.addElement(d);
160
        }
161
    }
162
 
163
    private void deleteSelectedInList() {
164
        Object[] vals = list.getSelectedValues();
165
        if (vals == null)
166
            return;
167
        for (int i = 0; i < vals.length; i++) {
168
            Object object = vals[i];
169
            this.listModel.removeElement(object);
170
        }
171
        list.clearSelection();
172
    }
173
 
174
    private void addTreeSelectionToList() {
175
        final TreePath[] paths = tree.getSelectionPaths();
176
        if (paths == null)
177
            return;
178
        for (int i = 0; i < paths.length; i++) {
179
            TreePath treePath = paths[i];
180
            Object[] obj = treePath.getPath();
181
            FieldDescriptor d = null;
182
            FieldDescriptor root = null;
183
            for (int j = 0; j < obj.length; j++) {
184
                final Object object = obj[j];
185
                if (object != null) {
186
                    final FieldDescriptor f = (FieldDescriptor) (((DefaultMutableTreeNode) object).getUserObject());
187
                    if (f != null) {
188
                        final FieldDescriptor fieldDescriptor = new FieldDescriptor(f);
189
                        if (root == null) {
190
                            root = fieldDescriptor;
191
 
192
                        }
193
                        if (d != null) {
194
                            d.setLink(fieldDescriptor);
195
                        }
196
                        d = fieldDescriptor;
197
                    }
198
                }
199
            }
200
 
201
            // On ne met pas les foreigns keys
202
            if (d != null && root != null) {
203
                boolean add = true;
204
                final String extendedLabel = root.getPath();
205
                final int size = listModel.getSize();
206
                // Check if already in the list
207
                for (int j = 0; j < size; j++) {
208
                    if (((ColumnDescriptor) listModel.getElementAt(j)).getFieldsPaths().contains(extendedLabel)) {
209
                        add = false;
210
                        break;
211
                    }
212
                }
213
                if (add) {
214
                    final ColumnDescriptor colDesc = new ColumnDescriptor(root.getPath());
215
                    colDesc.setFieldsPaths(root.getPath());
216
                    listModel.addElement(colDesc);
217
                    listDescriptor.add(colDesc);
218
                }
219
            }
220
        }
221
        tree.clearSelection();
222
    }
223
 
224
}