OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

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.menu.mainmenu;
2
 
3
import java.awt.Color;
4
import java.awt.Component;
5
import java.awt.Dimension;
6
import java.awt.GridBagConstraints;
7
import java.awt.GridBagLayout;
8
import java.awt.Insets;
9
import java.awt.event.ActionEvent;
10
import java.awt.event.ActionListener;
11
import java.awt.event.MouseAdapter;
12
import java.awt.event.MouseEvent;
13
import java.util.ArrayList;
14
import java.util.Enumeration;
15
import java.util.List;
16
 
17
import javax.swing.JButton;
18
import javax.swing.JCheckBox;
19
import javax.swing.JComponent;
20
import javax.swing.JLabel;
21
import javax.swing.JPanel;
22
import javax.swing.JScrollPane;
23
import javax.swing.JTree;
24
import javax.swing.SwingUtilities;
25
import javax.swing.event.TreeModelEvent;
26
import javax.swing.event.TreeModelListener;
27
import javax.swing.event.TreeSelectionEvent;
28
import javax.swing.event.TreeSelectionListener;
29
import javax.swing.tree.DefaultMutableTreeNode;
30
import javax.swing.tree.DefaultTreeCellRenderer;
31
import javax.swing.tree.TreePath;
32
 
33
import org.openconcerto.modules.extensionbuilder.AbstractSplittedPanel;
34
import org.openconcerto.modules.extensionbuilder.Extension;
35
import org.openconcerto.modules.extensionbuilder.component.ActivableMutableTreeNode;
36
import org.openconcerto.ui.group.Group;
37
import org.openconcerto.ui.group.Item;
38
import org.openconcerto.ui.group.LayoutHints;
39
import org.openconcerto.ui.tree.ReorderableJTree;
40
 
41
public class MainMenuGroupEditor extends AbstractSplittedPanel {
42
 
43
    private MenuItemTreeModel newModel;
44
    private JTree tree;
45
 
46
    public MainMenuGroupEditor(Extension extension) {
47
        super(extension);
48
        fillModel();
49
    }
50
 
51
    public void fillModel() {
52
        newModel.fillFromDescriptor(extension);
53
        tree.setModel(newModel);
54
        expand();
55
 
56
    }
57
 
58
    private void expand() {
59
        tree.expandRow(0);
60
 
61
        final List<MenuDescriptor> m = new ArrayList<MenuDescriptor>();
62
        m.addAll(extension.getCreateMenuList());
63
        m.addAll(extension.getRemoveMenuList());
64
        for (MenuDescriptor menuDescriptor : m) {
65
            final DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
66
            @SuppressWarnings("unchecked")
67
            final Enumeration<DefaultMutableTreeNode> e = root.depthFirstEnumeration();
68
            while (e.hasMoreElements()) {
69
                final DefaultMutableTreeNode node = e.nextElement();
70
                final Object userObject = node.getUserObject();
71
                if (userObject != null) {
72
                    final String nodeLabel = ((Item) userObject).getId();
73
                    if (nodeLabel != null && nodeLabel.equals(menuDescriptor.getId())) {
74
                        final TreePath path = new TreePath(((DefaultMutableTreeNode) node.getParent()).getPath());
75
                        tree.expandPath(path);
76
                    }
77
                }
78
            }
79
        }
80
    }
81
 
82
    @Override
83
    public JComponent createLeftComponent() {
84
        final JPanel panel = new JPanel();
85
        panel.setLayout(new GridBagLayout());
86
        final GridBagConstraints c = new GridBagConstraints();
87
        c.fill = GridBagConstraints.BOTH;
88
        c.gridx = 0;
89
        c.gridy = 0;
90
        c.weightx = 1;
91
        c.weighty = 0;
92
        c.insets = new Insets(2, 2, 2, 0);
93
 
94
        panel.add(new JLabel("Menus"), c);
95
        newModel = new MenuItemTreeModel();
96
        tree = new ReorderableJTree();
97
        tree.setModel(newModel);
98
        tree.setRootVisible(false);
99
        tree.setShowsRootHandles(true);
100
 
101
        final DefaultTreeCellRenderer treeRenderer = new DefaultTreeCellRenderer() {
102
            @Override
103
            public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
104
                final ActivableMutableTreeNode tr = (ActivableMutableTreeNode) value;
105
                if (tr.getUserObject() instanceof Item) {
106
                    final String id = ((Item) tr.getUserObject()).getId();
107
                    value = id;
108
                }
109
                final JLabel r = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
110
                if (tr.getUserObject() instanceof Item) {
111
                    final String id = ((Item) tr.getUserObject()).getId();
112
                    if (extension.getCreateMenuItemFromId(id) != null) {
113
                        r.setForeground(new Color(50, 80, 150));
114
                    }
115
                }
116
                if (!tr.isActive()) {
117
                    r.setForeground(Color.LIGHT_GRAY);
118
                }
119
                return r;
120
            }
121
        };
122
 
123
        treeRenderer.setLeafIcon(null);
124
        tree.setCellRenderer(treeRenderer);
125
        final JScrollPane comp2 = new JScrollPane(tree);
126
        comp2.setMinimumSize(new Dimension(250, 150));
127
        comp2.setPreferredSize(new Dimension(250, 150));
128
        c.weighty = 1;
129
        c.gridy++;
130
        c.insets = new Insets(0, 0, 0, 0);
131
        panel.add(comp2, c);
132
 
133
        c.gridy++;
134
        c.weighty = 0;
135
        c.fill = GridBagConstraints.NONE;
136
        c.anchor = GridBagConstraints.SOUTHWEST;
137
        c.insets = new Insets(2, 2, 2, 0);
138
        final JButton addGroupButton = new JButton("Ajouter un menu");
139
        panel.add(addGroupButton, c);
140
        c.gridy++;
141
        final JButton addItemButton = new JButton("Ajouter une action");
142
        panel.add(addItemButton, c);
143
        c.gridy++;
144
        final JButton removeButton = new JButton("Supprimer ");
145
        removeButton.setEnabled(false);
146
        panel.add(removeButton, c);
147
 
148
        c.gridy++;
149
        final JCheckBox hideCheckbox = new JCheckBox("Afficher les champs masqués");
150
        hideCheckbox.setSelected(true);
151
        panel.add(hideCheckbox, c);
152
 
153
        // Listeners
154
        addGroupButton.addActionListener(new ActionListener() {
155
 
156
            @Override
157
            public void actionPerformed(ActionEvent e) {
158
                addNewGroup();
159
            }
160
 
161
        });
162
        addItemButton.addActionListener(new ActionListener() {
163
 
164
            @Override
165
            public void actionPerformed(ActionEvent e) {
166
                addNewItem();
167
            }
168
 
169
        });
170
        removeButton.addActionListener(new ActionListener() {
171
            @Override
172
            public void actionPerformed(ActionEvent e) {
173
                final TreePath selectionPath = tree.getSelectionPath();
174
                if (selectionPath != null) {
175
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath.getLastPathComponent();
176
                    if (node.getUserObject() != null) {
177
                        String idToDelete = ((Item) node.getUserObject()).getId();
178
                        extension.removeCreateMenuForId(idToDelete);
179
                        extension.setChanged();
180
                        fillModel();
181
                    }
182
 
183
                }
184
            }
185
        });
186
        hideCheckbox.addActionListener(new ActionListener() {
187
 
188
            @Override
189
            public void actionPerformed(ActionEvent e) {
190
                newModel.setShowAll(hideCheckbox.isSelected());
191
                newModel.fillFromDescriptor(extension);
192
            }
193
 
194
        });
195
        tree.addTreeSelectionListener(new TreeSelectionListener() {
196
 
197
            @Override
198
            public void valueChanged(TreeSelectionEvent e) {
199
                final TreePath selectionPath = tree.getSelectionPath();
200
                if (selectionPath != null) {
201
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath.getLastPathComponent();
202
                    if (node.getUserObject() != null) {
203
                        String selectedId = ((Item) node.getUserObject()).getId();
204
                        removeButton.setEnabled(extension.getCreateMenuItemFromId(selectedId) != null);
205
                    }
206
                } else {
207
                    removeButton.setEnabled(false);
208
                }
209
 
210
            }
211
        });
212
        tree.addMouseListener(new MouseAdapter() {
213
            @Override
214
            public void mouseClicked(MouseEvent e) {
215
                if (e.getClickCount() > 1) {
216
                    newModel.toggleActive(tree.getSelectionPath());
217
                }
218
            }
219
 
220
            @Override
221
            public void mousePressed(MouseEvent e) {
222
                final TreePath selectionPath = tree.getSelectionPath();
223
                if (selectionPath == null) {
224
                    setRightPanel(new JPanel());
225
                } else {
226
                    Item i = (Item) ((DefaultMutableTreeNode) selectionPath.getLastPathComponent()).getUserObject();
227
                    setRightPanel(new MenuItemEditor(newModel, i, extension));
228
                }
229
            }
230
        });
231
        tree.getModel().addTreeModelListener(new TreeModelListener() {
232
 
233
            @Override
234
            public void treeStructureChanged(TreeModelEvent e) {
235
                // Postpone expand because default behaviour is collapsing tree
236
                SwingUtilities.invokeLater(new Runnable() {
237
                    @Override
238
                    public void run() {
239
                        expand();
240
                    }
241
                });
242
            }
243
 
244
            @Override
245
            public void treeNodesRemoved(TreeModelEvent e) {
246
            }
247
 
248
            @Override
249
            public void treeNodesInserted(TreeModelEvent e) {
250
            }
251
 
252
            @Override
253
            public void treeNodesChanged(TreeModelEvent e) {
254
            }
255
        });
256
        return panel;
257
    }
258
 
259
    protected void addNewGroup() {
260
        final DefaultMutableTreeNode root = (DefaultMutableTreeNode) ((DefaultMutableTreeNode) (tree.getModel().getRoot())).getFirstChild();
261
        DefaultMutableTreeNode node = root;
262
        if (node.getChildCount() > 0) {
263
            node = (DefaultMutableTreeNode) node.getFirstChild();
264
        }
265
        if (tree.getSelectionPath() != null) {
266
            node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
267
        }
268
        if (node != root) {
269
            final String newGroupId = "group" + node.getParent().getChildCount() + 1;
270
            DefaultMutableTreeNode newNode = new ActivableMutableTreeNode(new Group(newGroupId));
271
            final DefaultMutableTreeNode parent = (DefaultMutableTreeNode) node.getParent();
272
            parent.insert(newNode, parent.getIndex(node));
273
 
274
            final MenuDescriptor desc = new MenuDescriptor(newGroupId);
275
            desc.setType(MenuDescriptor.GROUP);
276
            desc.setInsertInMenu(((Item) parent.getUserObject()).getId());
277
            extension.addCreateMenu(desc);
278
            extension.setChanged();
279
 
280
            newModel.reload();
281
            tree.setSelectionPath(new TreePath(newModel.getPathToRoot(newNode)));
282
        }
283
        extension.setChanged();
284
    }
285
 
286
    protected void addNewItem() {
287
        final DefaultMutableTreeNode root = (DefaultMutableTreeNode) ((DefaultMutableTreeNode) (tree.getModel().getRoot())).getFirstChild();
288
        DefaultMutableTreeNode node = root;
289
        if (node.getChildCount() > 0) {
290
            node = (DefaultMutableTreeNode) node.getFirstChild();
291
        }
292
        if (tree.getSelectionPath() != null) {
293
            node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
294
        }
295
        if (node != root) {
296
            final String newActionId = "action" + node.getParent().getChildCount() + 1;
297
            DefaultMutableTreeNode newNode = new ActivableMutableTreeNode(new Item(newActionId));
298
            final DefaultMutableTreeNode parent = (DefaultMutableTreeNode) node.getParent();
299
            parent.insert(newNode, parent.getIndex(node));
300
            final MenuDescriptor desc = new MenuDescriptor(newActionId);
301
            desc.setType(MenuDescriptor.CREATE);
302
            desc.setInsertInMenu(((Item) parent.getUserObject()).getId());
303
            extension.addCreateMenu(desc);
304
            extension.setChanged();
305
            newModel.reload();
306
            tree.setSelectionPath(new TreePath(newModel.getPathToRoot(newNode)));
307
        }
308
 
309
    }
310
 
311
    // public Group getFilteredGroup() {
312
    // // Parcours du Tree
313
    // Group filteredGroup = new Group(n.getId());
314
    //
315
    // walk(newModel, filteredGroup, newModel.getRoot());
316
    // filteredGroup = (Group) filteredGroup.getItem(0);
317
    // filteredGroup.dumpTwoColumn();
318
    // return filteredGroup;
319
    // }
320
 
321
    protected void walk(MenuItemTreeModel model, Group gr, Object o) {
322
        int cc = model.getChildCount(o);
323
        for (int i = 0; i < cc; i++) {
324
            ActivableMutableTreeNode child = (ActivableMutableTreeNode) model.getChild(o, i);
325
            if (child.isActive()) {
326
                final Item userObject = (Item) child.getUserObject();
327
                if (userObject instanceof Group) {
328
                    final Group item = new Group(userObject.getId());
329
                    item.setLocalHint(new LayoutHints(userObject.getLocalHint()));
330
                    gr.add(item);
331
                    walk(model, item, child);
332
                } else {
333
                    final Item item = new Item(userObject.getId());
334
                    item.setLocalHint(new LayoutHints(userObject.getLocalHint()));
335
                    gr.add(item);
336
                }
337
 
338
            }
339
        }
340
    }
341
 
342
}