source: subversion/applications/editors/josm/plugins/trustosm/src/org/openstreetmap/josm/plugins/trustosm/gui/dialogs/TrustDialog.java

Last change on this file was 34571, checked in by donvip, 8 months ago

fix deprecation warnings

File size: 30.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugins.trustosm.gui.dialogs;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BasicStroke;
7import java.awt.Color;
8import java.awt.Component;
9import java.awt.Font;
10import java.awt.Graphics2D;
11import java.awt.Point;
12import java.awt.event.ActionEvent;
13import java.awt.event.FocusEvent;
14import java.awt.event.FocusListener;
15import java.awt.event.KeyEvent;
16import java.awt.geom.GeneralPath;
17import java.util.ArrayList;
18import java.util.Arrays;
19import java.util.Collection;
20import java.util.HashMap;
21import java.util.List;
22import java.util.Map;
23import java.util.Map.Entry;
24import java.util.TreeMap;
25
26import javax.swing.BoxLayout;
27import javax.swing.JLabel;
28import javax.swing.JPanel;
29import javax.swing.JTable;
30import javax.swing.JTree;
31import javax.swing.event.TreeSelectionEvent;
32import javax.swing.event.TreeSelectionListener;
33import javax.swing.table.DefaultTableCellRenderer;
34import javax.swing.table.DefaultTableModel;
35import javax.swing.table.TableCellRenderer;
36import javax.swing.tree.DefaultMutableTreeNode;
37import javax.swing.tree.DefaultTreeCellRenderer;
38import javax.swing.tree.DefaultTreeModel;
39import javax.swing.tree.TreePath;
40
41import org.openstreetmap.josm.actions.JosmAction;
42import org.openstreetmap.josm.data.Bounds;
43import org.openstreetmap.josm.data.osm.DataSelectionListener;
44import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
45import org.openstreetmap.josm.data.osm.Node;
46import org.openstreetmap.josm.data.osm.OsmPrimitive;
47import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
48import org.openstreetmap.josm.data.osm.Relation;
49import org.openstreetmap.josm.data.osm.Way;
50import org.openstreetmap.josm.data.osm.WaySegment;
51import org.openstreetmap.josm.data.osm.event.SelectionEventManager;
52import org.openstreetmap.josm.data.osm.visitor.paint.PaintColors;
53import org.openstreetmap.josm.gui.MainApplication;
54import org.openstreetmap.josm.gui.MapView;
55import org.openstreetmap.josm.gui.SideButton;
56import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
57import org.openstreetmap.josm.gui.layer.MapViewPaintable;
58import org.openstreetmap.josm.plugins.trustosm.TrustOSMplugin;
59import org.openstreetmap.josm.plugins.trustosm.data.TrustNode;
60import org.openstreetmap.josm.plugins.trustosm.data.TrustOsmPrimitive;
61import org.openstreetmap.josm.plugins.trustosm.data.TrustSignatures;
62import org.openstreetmap.josm.plugins.trustosm.data.TrustWay;
63import org.openstreetmap.josm.plugins.trustosm.util.TrustAnalyzer;
64import org.openstreetmap.josm.tools.ImageProvider;
65import org.openstreetmap.josm.tools.Shortcut;
66
67public class TrustDialog extends ToggleDialog implements DataSelectionListener, MapViewPaintable {
68
69    public static final Color BGCOLOR_NO_SIG = new Color(234, 234, 234);
70    //    public static final Color BGCOLOR_VALID_SIG = new Color(235, 255,177);
71    public static final Color BGCOLOR_VALID_SIG = new Color(74, 245, 106);
72    public static final Color BGCOLOR_BROKEN_SIG = new Color(255, 197, 197);
73    public static final Color BGCOLOR_REMOVED_ITEM = new Color(255, 100, 100);
74    public static final Color BGCOLOR_UPDATED_ITEM = new Color(249, 221, 95);
75
76    /** The check signatures button */
77    private final SideButton checkButton;
78
79    /** The sign button */
80    private final SideButton signButton;
81
82    /** The show sigs button */
83    private final SideButton showButton;
84
85    private final Map<String, Byte> rowStatus = new HashMap<>();
86
87    /** The selected osmData */
88    private Collection<? extends OsmPrimitive> osmData;
89
90    private final List<WaySegment> selectedSegments = new ArrayList<>();
91    private final List<OsmPrimitive> selectedPrimitives = new ArrayList<>();
92
93    /** The JTree for showing the geometry */
94    private final JTree geomTree;
95
96    /**
97     * The property data.
98     */
99    private final DefaultTableModel propertyData = new DefaultTableModel() {
100        @Override public boolean isCellEditable(int row, int column) {
101            return false;
102        }
103
104        @Override public Class<?> getColumnClass(int columnIndex) {
105            return String.class;
106        }
107    };
108    private final JTable propertyTable = new JTable(propertyData) {
109
110        @Override
111        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
112            Component c = super.prepareRenderer(renderer, row, column);
113            Byte stat = rowStatus.get(getModel().getValueAt(row, 0));
114            if (!isRowSelected(row))
115                switch (stat.byteValue()) {
116                case -2: c.setBackground(BGCOLOR_REMOVED_ITEM); break;
117                case -1: c.setBackground(BGCOLOR_BROKEN_SIG); break;
118                case 1: c.setBackground(BGCOLOR_VALID_SIG); break;
119                default: c.setBackground(BGCOLOR_NO_SIG); break;
120                }
121            return c;
122        }
123    };
124
125    /** The JTable for members of a relation */
126    /*private final DefaultTableModel memberData = new DefaultTableModel() {
127
128        @Override public boolean isCellEditable(int row, int column) {
129            return false;
130        }
131        @Override public Class<?> getColumnClass(int columnIndex) {
132            return String.class;
133        }
134    };
135    private final JTable memberTable = new JTable(memberData) {
136
137        @Override
138        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
139            Component c = super.prepareRenderer(renderer, row, column);
140            Byte stat = rowStatus.get(getModel().getValueAt(row, 0));
141            if (!isRowSelected(row))
142                switch (stat.byteValue()) {
143                case -2: c.setBackground( BGCOLOR_REMOVED_ITEM); break;
144                case -1: c.setBackground( BGCOLOR_BROKEN_SIG); break;
145                case 1: c.setBackground( BGCOLOR_VALID_SIG); break;
146                default: c.setBackground( BGCOLOR_NO_SIG); break;
147                }
148            return c;
149        }
150    };*/
151
152    /**
153     * Constructor
154     */
155    public TrustDialog() {
156        super(tr("Object signatures"), "trustosm", tr("Open object signing window."),
157                Shortcut.registerShortcut("subwindow:trustosm", tr("Toggle: {0}", tr("Object signatures")),
158                        KeyEvent.VK_T, Shortcut.ALT_CTRL), 150);
159
160        MainApplication.getMap().mapView.addTemporaryLayer(this);
161
162        // setting up the properties table
163        propertyData.setColumnIdentifiers(new String[]{tr("Key"), tr("Value")});
164
165        // copy and paste from org.openstreetmap.josm.gui.dialogs.properties.PropertiesDialog
166
167        propertyTable.getColumnModel().getColumn(1).setCellRenderer(new DefaultTableCellRenderer() {
168            /**
169             *
170             */
171            private static final long serialVersionUID = 8003207668070727861L;
172
173            @Override
174            public Component getTableCellRendererComponent(JTable table, Object value,
175                    boolean isSelected, boolean hasFocus, int row, int column) {
176                Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
177                if (c instanceof JLabel) {
178                    String str = null;
179                    if (value instanceof String) {
180                        str = (String) value;
181                    } else if (value instanceof Map<?, ?>) {
182                        Map<?, ?> v = (Map<?, ?>) value;
183                        if (v.size() != 1) {
184                            str = tr("<different>");
185                            c.setFont(c.getFont().deriveFont(Font.ITALIC));
186                        } else {
187                            final Map.Entry<?, ?> entry = v.entrySet().iterator().next();
188                            str = (String) entry.getKey();
189                        }
190                    }
191                    ((JLabel) c).setText(str);
192                }
193                return c;
194            }
195        });
196
197        geomTree = new JTree(createTree());
198
199        geomTree.setBackground(BGCOLOR_NO_SIG);
200        geomTree.setRootVisible(false);
201        geomTree.setCellRenderer(new DefaultTreeCellRenderer() {
202            @Override
203            public Component getTreeCellRendererComponent(JTree tree, Object value,
204                    boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
205                super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
206                DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
207                if (node.isRoot()) return this;
208                setBackgroundNonSelectionColor(BGCOLOR_NO_SIG);
209                Object o = node.getUserObject();
210                if (o instanceof OsmPrimitive) {
211                    OsmPrimitive osm = (OsmPrimitive) o;
212                    setIcon(ImageProvider.get(OsmPrimitiveType.from(osm)));
213                    setText(osm.getDisplayName(DefaultNameFormatter.getInstance()));
214                    if (osm instanceof Node) {
215                        TrustSignatures sigs;
216                        String id = TrustOsmPrimitive.createUniqueObjectIdentifier(osm);
217                        if (TrustOSMplugin.signedItems.containsKey(id)
218                                && (sigs = ((TrustNode) TrustOSMplugin.signedItems.get(id)).getNodeSigs()) != null) {
219                            byte stat = sigs.getStatus();
220                            switch (stat) {
221                            case -2: setBackgroundNonSelectionColor(BGCOLOR_REMOVED_ITEM); break;
222                            case -1: setBackgroundNonSelectionColor(BGCOLOR_BROKEN_SIG); break;
223                            case 1: setBackgroundNonSelectionColor(BGCOLOR_VALID_SIG); break;
224                            default: setBackgroundNonSelectionColor(BGCOLOR_NO_SIG); break;
225                            }
226                        }
227                    }
228                } else if (o instanceof WaySegment) {
229                    WaySegment seg = (WaySegment) o;
230                    setIcon(ImageProvider.get("mapmode/addsegment"));
231                    setText(seg.getFirstNode().getDisplayName(DefaultNameFormatter.getInstance())
232                            + " ----- " +
233                            seg.getSecondNode().getDisplayName(DefaultNameFormatter.getInstance()));
234                    TrustSignatures sigs;
235                    String id = TrustOsmPrimitive.createUniqueObjectIdentifier(seg.way);
236                    if (TrustOSMplugin.signedItems.containsKey(id)
237                            && (sigs = ((TrustWay) TrustOSMplugin.signedItems.get(id)).getSigsOnSegment(seg)) != null) {
238                        switch (sigs.getStatus()) {
239                        case -2: setBackgroundNonSelectionColor(BGCOLOR_REMOVED_ITEM); break;
240                        case -1: setBackgroundNonSelectionColor(BGCOLOR_BROKEN_SIG); break;
241                        case 1: setBackgroundNonSelectionColor(BGCOLOR_VALID_SIG); break;
242                        default: setBackgroundNonSelectionColor(BGCOLOR_NO_SIG); break;
243                        }
244                    }
245                }
246                return this;
247            }
248        });
249
250        geomTree.addTreeSelectionListener(new TreeSelectionListener() {
251            @Override
252            public void valueChanged(TreeSelectionEvent e) {
253                // unhighlight everything
254                for (OsmPrimitive p : selectedPrimitives) {
255                    p.setHighlighted(false);
256                }
257                selectedPrimitives.clear();
258                selectedSegments.clear();
259                if (geomTree.getSelectionPaths() != null)
260                    for (TreePath tp : geomTree.getSelectionPaths()) {
261                        Object o = ((DefaultMutableTreeNode) tp.getLastPathComponent()).getUserObject();
262                        if (o instanceof WaySegment) {
263                            selectedSegments.add((WaySegment) o);
264                        } else if (o instanceof OsmPrimitive) {
265                            OsmPrimitive highlight = (OsmPrimitive) o;
266                            highlight.setHighlighted(true);
267                            selectedPrimitives.add(highlight);
268                        }
269                    }
270                MainApplication.getMap().mapView.repaint();
271            }
272        });
273
274        propertyTable.addFocusListener(new FocusListener() {
275
276            @Override
277            public void focusGained(FocusEvent fe) {
278                geomTree.clearSelection();
279            }
280
281            @Override
282            public void focusLost(FocusEvent fe) {
283
284            }
285        });
286
287        geomTree.addFocusListener(new FocusListener() {
288
289            @Override
290            public void focusGained(FocusEvent fe) {
291                propertyTable.clearSelection();
292
293            }
294
295            @Override
296            public void focusLost(FocusEvent fe) {
297
298            }
299        });
300
301        JPanel dataPanel = new JPanel();
302        dataPanel.setLayout(new BoxLayout(dataPanel, BoxLayout.PAGE_AXIS));
303        propertyTable.setAlignmentX(LEFT_ALIGNMENT);
304        dataPanel.add(propertyTable);
305        geomTree.setAlignmentX(LEFT_ALIGNMENT);
306        dataPanel.add(geomTree);
307
308        checkButton = new SideButton(new CheckAction());
309        signButton = new SideButton(new SignAction());
310        showButton = new SideButton(new ShowAction());
311
312        createLayout(dataPanel, true, Arrays.asList(new SideButton[] {
313                checkButton, signButton, showButton
314        }));
315        SelectionEventManager.getInstance().addSelectionListener(this);
316    }
317
318    private class CheckAction extends JosmAction {
319
320        CheckAction() {
321            super(tr("Check"), "checksignatures", tr("Check all available signatures for selected object."), null, false);
322        }
323
324        @Override
325        public void actionPerformed(ActionEvent e) {
326            if (osmData != null) {
327                for (OsmPrimitive osm : osmData) {
328                    String id = TrustOsmPrimitive.createUniqueObjectIdentifier(osm);
329                    if (TrustOSMplugin.signedItems.containsKey(id))
330                        TrustAnalyzer.checkEverything(TrustOSMplugin.signedItems.get(id));
331                }
332            }
333            updateTable();
334            geomTree.repaint();
335        }
336    }
337
338    private class SignAction extends JosmAction {
339
340        SignAction() {
341            super(tr("Sign"), "sign", tr("Digital sign selected Tags, if you believe they are correct."), null, false);
342        }
343
344        @Override
345        public void actionPerformed(ActionEvent e) {
346            if (osmData != null) {
347                for (int i : propertyTable.getSelectedRows()) {
348                    String key = (String) propertyTable.getValueAt(i, 0);
349                    for (OsmPrimitive osm : osmData) {
350                        if (osm.keySet().contains(key)) {
351                            String id = TrustOsmPrimitive.createUniqueObjectIdentifier(osm);
352                            TrustOsmPrimitive trust = TrustOSMplugin.signedItems.containsKey(id) ?
353                                    TrustOSMplugin.signedItems.get(id) : TrustOsmPrimitive.createTrustOsmPrimitive(osm);
354                            if (TrustOSMplugin.gpg.signTag(trust, key))
355                                TrustOSMplugin.signedItems.put(id, trust);
356                        }
357                    }
358                }
359            }
360            if (geomTree.getSelectionPaths() != null)
361                for (TreePath tp : geomTree.getSelectionPaths()) {
362                    Object o = ((DefaultMutableTreeNode) tp.getLastPathComponent()).getUserObject();
363                    if (o instanceof OsmPrimitive) {
364                        OsmPrimitive osm = (OsmPrimitive) o;
365                        String id = TrustOsmPrimitive.createUniqueObjectIdentifier(osm);
366                        if (osm instanceof Node) {
367                            Node osmNode = ((Node) osm);
368                            TrustNode trust = TrustOSMplugin.signedItems.containsKey(id) ?
369                                    (TrustNode) TrustOSMplugin.signedItems.get(id) : new TrustNode(osmNode);
370                            trust.storeNodeSig(TrustOSMplugin.gpg.signNode(osmNode));
371                            TrustOSMplugin.signedItems.put(id, trust);
372
373                            /*                        TreePath parentPath = tp.getParentPath();
374                            if (geomTree.isPathSelected(parentPath)) return;
375
376                            Node osmNode = ((Node) osm);
377                            if (((DefaultMutableTreeNode) parentPath.getLastPathComponent()).getUserObject() instanceof Way) {
378                                osm = (OsmPrimitive) ((DefaultMutableTreeNode) parentPath.getLastPathComponent()).getUserObject();
379                                id = String.valueOf(osm.getUniqueId());
380                            }
381                            TrustOsmPrimitive trust = TrustOSMplugin.signedItems.containsKey(id) ?
382                                TrustOSMplugin.signedItems.get(id) : TrustOsmPrimitive.createTrustOsmPrimitive(osm);
383                            trust.storeNodeSig(osmNode, TrustOSMplugin.gpg.signNode(osm,osmNode));
384                            TrustOSMplugin.signedItems.put(id, trust);
385                             */
386                        } else if (osm instanceof Way) {
387                            TrustOSMplugin.signedItems.put(id, TrustOSMplugin.gpg.signWay(TrustOSMplugin.signedItems.containsKey(id) ?
388                                    (TrustWay) TrustOSMplugin.signedItems.get(id) : new TrustWay(osm)));
389                            /*Way osmWay = ((Way) osm);
390                            TrustWay trust = TrustOSMplugin.signedItems.containsKey(id) ?
391                                (TrustWay) TrustOSMplugin.signedItems.get(id) : new TrustWay(osmWay);
392                            trust.storeSegmentSig(TrustOSMplugin.gpg.signWay(osmWay));
393                            TrustOSMplugin.signedItems.put(id, trust);
394                             */
395                        }
396                    } else if (o instanceof WaySegment) {
397                        TreePath parentPath = tp.getParentPath();
398                        if (geomTree.isPathSelected(parentPath)) return;
399                        WaySegment seg = (WaySegment) o;
400                        List<Node> nodes = new ArrayList<>();
401                        nodes.add(seg.getFirstNode());
402                        nodes.add(seg.getSecondNode());
403                        Way w = seg.way;
404                        String id = TrustOsmPrimitive.createUniqueObjectIdentifier(w);
405                        TrustWay trust = TrustOSMplugin.signedItems.containsKey(id) ?
406                                (TrustWay) TrustOSMplugin.signedItems.get(id) : new TrustWay(w);
407                        trust.storeSegmentSig(nodes, TrustOSMplugin.gpg.signSegment(trust, nodes));
408                        TrustOSMplugin.signedItems.put(id, trust);
409                    }
410                }
411            updateTable();
412            geomTree.repaint();
413        }
414    }
415
416    private class ShowAction extends JosmAction {
417
418        ShowAction() {
419            super(tr("Show"), "showsig", tr("Show all available signatures for selected attribute."), null, false);
420        }
421
422        @Override
423        public void actionPerformed(ActionEvent e) {
424            if (osmData != null) {
425                for (int i : propertyTable.getSelectedRows()) {
426                    String key = (String) propertyTable.getValueAt(i, 0);
427                    for (OsmPrimitive osm : osmData) {
428                        String id = TrustOsmPrimitive.createUniqueObjectIdentifier(osm);
429                        if (osm.keySet().contains(key) && TrustOSMplugin.signedItems.containsKey(id)) {
430                            TrustSignaturesDialog.showSignaturesDialog(TrustOSMplugin.signedItems.get(id), key);
431                        }
432                    }
433                }
434            }
435            if (geomTree.getSelectionPaths() != null) {
436                for (TreePath tp : geomTree.getSelectionPaths()) {
437                    Object o = ((DefaultMutableTreeNode) tp.getLastPathComponent()).getUserObject();
438                    if (o instanceof OsmPrimitive) {
439                        OsmPrimitive osm = (OsmPrimitive) o;
440                        String id = TrustOsmPrimitive.createUniqueObjectIdentifier(osm);
441                        if (osm instanceof Node) {
442                            if (TrustOSMplugin.signedItems.containsKey(id)) {
443                                TrustSignaturesDialog.showSignaturesDialog((TrustNode) TrustOSMplugin.signedItems.get(id));
444                            }
445                        } /*else if (osm instanceof Way) {
446                            TrustOSMplugin.signedItems.put(id, TrustOSMplugin.gpg.signGeometry(
447                                TrustOSMplugin.signedItems.containsKey(id)? TrustOSMplugin.signedItems.get(id) : new TrustOSMItem(osm)));
448                        }*/
449                    } else if (o instanceof WaySegment) {
450                        WaySegment seg = (WaySegment) o;
451                        String id = TrustOsmPrimitive.createUniqueObjectIdentifier(seg.way);
452                        if (TrustOSMplugin.signedItems.containsKey(id)) {
453                            List<Node> nodes = new ArrayList<>();
454                            nodes.add(seg.getFirstNode());
455                            nodes.add(seg.getSecondNode());
456                            TrustSignaturesDialog.showSignaturesDialog((TrustWay) TrustOSMplugin.signedItems.get(id), nodes);
457                        }
458                    }
459                }
460            }
461        }
462    }
463
464    /*
465    public void showSignaturesDialog(TrustOSMItem trust, String key) {
466        TrustSignatures sigs;
467        if ((sigs = trust.getSigsOnKey(key)) == null) {
468            JOptionPane.showMessageDialog(null, tr("Sorry, there are no Signatures for the selected Attribute."),
469                tr("No Signature found"), JOptionPane.WARNING_MESSAGE);
470        } else {
471            JPanel p = new JPanel();
472            p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
473            Dimension d = new Dimension(0, 20);
474            JLabel head = new JLabel(tr("Selected key value pair was:\n{0}={1}",key,trust.getOsmItem().get(key)));
475            head.setAlignmentX(LEFT_ALIGNMENT);
476            p.add(head);
477            p.add(Box.createRigidArea(d));
478            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd:hh.mm.ss");
479            for (PGPSignature s : sigs.getSignatures()) {
480                JTextArea sigtext = new JTextArea(sigs.getArmoredFulltextSignature(s));
481                sigtext.setEditable(false);
482                sigtext.setAlignmentX(LEFT_ALIGNMENT);
483                p.add(sigtext);
484                JLabel siginfo = new JLabel(tr("Signature created at {0} by User {1}", formatter.format(s.getCreationTime()),
485                    s.getHashedSubPackets().getSignerUserID()));
486                siginfo.setAlignmentX(LEFT_ALIGNMENT);
487                p.add(siginfo);
488                p.add(Box.createRigidArea(d));
489            }
490
491            JScrollPane scroller = new JScrollPane(p);
492            JPanel content = new JPanel();
493            content.setMaximumSize(new Dimension(600, 500));
494            content.add(scroller);
495            JOptionPane.showMessageDialog(MainApplication.getMainFrame(),content, tr("Clearsigned Signature"), JOptionPane.PLAIN_MESSAGE);
496        }
497    }
498     */
499    public static List<WaySegment> generateSegmentListFromWay(Way w) {
500        List<WaySegment> segList = new ArrayList<>();
501        for (int i = 0; i < w.getNodesCount()-1; i++) {
502            segList.add(new WaySegment(w, i));
503        }
504        return segList;
505    }
506
507    private DefaultTreeModel createTree() {
508        DefaultMutableTreeNode root = new DefaultMutableTreeNode();
509        DefaultMutableTreeNode wayNode;
510        if (osmData != null)
511            for (OsmPrimitive osm : osmData) {
512                //String id = TrustOsmPrimitive.createUniqueObjectIdentifier(osm);
513                if (osm instanceof Node) {
514                    root.add(new DefaultMutableTreeNode(osm));
515                } else if (osm instanceof Way) {
516                    wayNode = new DefaultMutableTreeNode(osm);
517                    List<WaySegment> presentSegments = TrustDialog.generateSegmentListFromWay(((Way) osm));
518                    for (WaySegment seg : presentSegments) {
519                        wayNode.add(new DefaultMutableTreeNode(seg));
520                    }
521
522                    /*
523                    wayNode = new DefaultMutableTreeNode(osm);
524                    List<Node> presentNodes = ((Way)osm).getNodes();
525                    Iterator<Node> iter = presentNodes.iterator();
526                    while (iter.hasNext()) {
527                        wayNode.add(new DefaultMutableTreeNode(iter.next()));
528                    }
529
530                    if (TrustOSMplugin.signedItems.containsKey(id)) {
531                        TrustOsmPrimitive trust = TrustOSMplugin.signedItems.get(id);
532                        HashSet<Node> signedNodes = new HashSet<Node>(trust.getGeomSigs().keySet());
533                        signedNodes.removeAll(presentNodes);
534                        iter = signedNodes.iterator();
535                        Node removedNode;
536                        while (iter.hasNext()) {
537                            removedNode = iter.next();
538                            trust.updateNodeSigStatus(removedNode, TrustSignatures.ITEM_REMOVED);
539                            wayNode.add(new DefaultMutableTreeNode(removedNode));
540                        }
541                    }
542                     */
543                    root.add(wayNode);
544                } else if (osm instanceof Relation) {
545
546                }
547            }
548
549        return new DefaultTreeModel(root);
550    }
551
552    public void updateTable() {
553        // re-load property data
554        propertyData.setRowCount(0);
555
556        Map<String, Map<String, Integer>> valueCount = new TreeMap<>();
557
558        TrustOsmPrimitive trust;
559
560        valueCount.clear();
561        rowStatus.clear();
562        boolean sigsAvailable = false;
563
564        if (osmData != null) {
565            for (OsmPrimitive osm : osmData) {
566                String id = TrustOsmPrimitive.createUniqueObjectIdentifier(osm);
567                if (TrustOSMplugin.signedItems.containsKey(id)) {
568                    trust = TrustOSMplugin.signedItems.get(id);
569                    sigsAvailable = true;
570                    /*
571                    Map<String,String> tags = osm.getKeys();
572                    Map<String, TrustSignatures>  signedTags = trust.getTagSigs();
573                    HashSet<String> removedKeys = new HashSet<String>(signedTags.keySet());
574                    removedKeys.removeAll(tags.keySet());
575                    for (String removedKey: removedKeys) {
576                        TrustSignatures sigs = signedTags.get(removedKey);
577                        sigs.setStatus( TrustSignatures.ITEM_REMOVED);
578                        String[] kv = TrustOsmPrimitive.generateTagsFromSigtext(sigs.getOnePlainText());
579                        tags.put(kv[0],kv[1]);
580                    }
581                     */
582                } else {
583                    trust = TrustOsmPrimitive.createTrustOsmPrimitive(osm);
584                    sigsAvailable = false;
585                }
586
587                for (String key: osm.keySet()) {
588                    String value = osm.get(key);
589
590                    byte status = sigsAvailable && trust.getTagSigs().containsKey(key) ?
591                            trust.getTagSigs().get(key).getStatus() : TrustSignatures.SIG_UNKNOWN;
592                    Byte oldstatus = rowStatus.containsKey(key) ? rowStatus.get(key) : Byte.valueOf(TrustSignatures.SIG_VALID);
593                    Byte sigstatus = Byte.valueOf(status);
594                    Byte newstatus;
595                    if (sigstatus.equals(Byte.valueOf(TrustSignatures.SIG_BROKEN))
596                            || oldstatus.equals(Byte.valueOf(TrustSignatures.SIG_BROKEN))) {
597                        newstatus = Byte.valueOf(TrustSignatures.SIG_BROKEN);
598                    } else if (sigstatus.equals(Byte.valueOf(TrustSignatures.SIG_UNKNOWN))
599                            || oldstatus.equals(Byte.valueOf(TrustSignatures.SIG_UNKNOWN))) {
600                        newstatus = Byte.valueOf(TrustSignatures.SIG_UNKNOWN);
601                    } else newstatus = Byte.valueOf(TrustSignatures.SIG_VALID);
602
603                    rowStatus.put(key, newstatus);
604                    if (valueCount.containsKey(key)) {
605                        Map<String, Integer> v = valueCount.get(key);
606                        v.put(value, v.containsKey(value) ? v.get(value) + 1 : 1);
607                    } else {
608                        TreeMap<String, Integer> v = new TreeMap<>();
609                        v.put(value, 1);
610                        valueCount.put(key, v);
611                    }
612                }
613            }
614            for (Entry<String, Map<String, Integer>> e : valueCount.entrySet()) {
615                int count = 0;
616                for (Entry<String, Integer> e1: e.getValue().entrySet()) {
617                    count += e1.getValue();
618                }
619                if (count < osmData.size()) {
620                    e.getValue().put("", osmData.size()-count);
621                }
622                propertyData.addRow(new Object[]{e.getKey(), e.getValue()});
623            }
624        }
625
626        boolean hasSelection = osmData != null && !osmData.isEmpty();
627        boolean hasTags = hasSelection && propertyData.getRowCount() > 0;
628
629        propertyTable.setVisible(hasTags);
630        propertyTable.getTableHeader().setVisible(hasTags);
631    }
632
633    @Override
634    public void selectionChanged(SelectionChangeEvent event) {
635        this.osmData = event.getSelection();
636
637        if (!isVisible())
638            return;
639        geomTree.setModel(createTree());
640        updateTable();
641    }
642
643    @Override
644    public void paint(Graphics2D g, MapView mv, Bounds bbox) {
645        // if there are no Segments to highlight - return
646        if (selectedSegments.isEmpty()) return;
647
648        // sanity checks
649        if (MainApplication.getMap().mapView == null) return;
650
651        Graphics2D g2 = g;
652        g2.setColor(PaintColors.HIGHLIGHT.get());
653        g2.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
654
655        // highlight all selected WaySegments
656        for (WaySegment seg : selectedSegments) {
657            GeneralPath b = new GeneralPath();
658            Point p1 = mv.getPoint(seg.getFirstNode());
659            Point p2 = mv.getPoint(seg.getSecondNode());
660
661            b.moveTo(p1.x, p1.y);
662            b.lineTo(p2.x, p2.y);
663
664            g2.draw(b);
665        }
666        g2.setStroke(new BasicStroke(1));
667    }
668}
Note: See TracBrowser for help on using the repository browser.