Changeset 8498 in josm


Ignore:
Timestamp:
2015-06-19T21:17:27+02:00 (5 years ago)
Author:
simon04
Message:

fix #11413 - Advanced Info: add last edit count tab (slightly modified patch by brycenesbitt)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java

    r8308 r8498  
    77import java.awt.Dimension;
    88import java.awt.GridBagLayout;
     9import java.text.Collator;
    910import java.util.ArrayList;
    1011import java.util.Collection;
    1112import java.util.Collections;
    1213import java.util.List;
     14import java.util.Locale;
     15import java.util.Map;
    1316import java.util.Map.Entry;
     17import java.util.TreeMap;
    1418
    1519import javax.swing.JPanel;
     
    6266    protected transient List<OsmPrimitive> primitives;
    6367    protected transient OsmDataLayer layer;
    64     private JosmTextArea txtMappaint;
    6568    private boolean mappaintTabLoaded;
     69    private boolean editcountTabLoaded;
    6670
    6771    public InspectPrimitiveDialog(Collection<OsmPrimitive> primitives, OsmDataLayer layer) {
     
    7478        setButtonIcons(new String[]{"ok.png"});
    7579        final JTabbedPane tabs = new JTabbedPane();
    76         JPanel pData = buildDataPanel();
    77         tabs.addTab(tr("data"), pData);
     80
     81        tabs.addTab(tr("data"), genericMonospacePanel(new JPanel(), buildDataText()));
     82
    7883        final JPanel pMapPaint = new JPanel();
    7984        tabs.addTab(tr("map style"), pMapPaint);
     
    8489                if (!mappaintTabLoaded && ((SingleSelectionModel) e.getSource()).getSelectedIndex() == 1) {
    8590                    mappaintTabLoaded = true;
    86                     buildMapPaintPanel(pMapPaint);
    87                     createMapPaintText();
     91                    genericMonospacePanel(pMapPaint, buildMapPaintText());
    8892                }
    8993            }
    9094        });
     95
     96        final JPanel pEditCounts = new JPanel();
     97        tabs.addTab(tr("edit counts"), pEditCounts);
     98        tabs.getModel().addChangeListener(new ChangeListener() {
     99
     100            @Override
     101            public void stateChanged(ChangeEvent e) {
     102                if (!editcountTabLoaded && ((SingleSelectionModel) e.getSource()).getSelectedIndex() == 2) {
     103                    editcountTabLoaded = true;
     104                    genericMonospacePanel(pEditCounts, buildListOfEditorsText());
     105                }
     106            }
     107        });
     108
    91109        setContent(tabs, false);
    92110    }
    93111
    94     protected JPanel buildDataPanel() {
    95         JPanel p = new JPanel(new GridBagLayout());
    96         JosmTextArea txtData = new JosmTextArea();
    97         txtData.setFont(GuiHelper.getMonospacedFont(txtData));
    98         txtData.setEditable(false);
    99         txtData.setText(buildDataText());
    100         txtData.setSelectionStart(0);
    101         txtData.setSelectionEnd(0);
    102 
    103         JScrollPane scroll = new JScrollPane(txtData);
    104 
    105         p.add(scroll, GBC.std().fill());
     112    protected JPanel genericMonospacePanel(JPanel p, String s) {
     113        p.setLayout(new GridBagLayout());
     114        JosmTextArea jte = new JosmTextArea();
     115        jte.setFont(GuiHelper.getMonospacedFont(jte));
     116        jte.setEditable(false);
     117        jte.append(s);
     118        p.add(new JScrollPane(jte), GBC.std().fill());
    106119        return p;
    107120    }
     
    322335    }
    323336
    324     protected void buildMapPaintPanel(JPanel p) {
    325         p.setLayout(new GridBagLayout());
    326         txtMappaint = new JosmTextArea();
    327         txtMappaint.setFont(GuiHelper.getMonospacedFont(txtMappaint));
    328         txtMappaint.setEditable(false);
    329 
    330         p.add(new JScrollPane(txtMappaint), GBC.std().fill());
    331     }
    332 
    333     protected void createMapPaintText() {
     337    protected String buildMapPaintText() {
    334338        final Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getAllSelected();
    335339        ElemStyles elemstyles = MapPaintStyles.getStyles();
     
    337341        double scale = nc.getDist100Pixel();
    338342
     343        final StringBuilder txtMappaint = new StringBuilder();
    339344        MapCSSStyleSource.STYLE_SOURCE_LOCK.readLock().lock();
    340345        try {
     
    350355                        txtMappaint.append(tr("\nRange:{0}", mc.range));
    351356                        for (Entry<String, Cascade> e : mc.getLayers()) {
    352                             txtMappaint.append("\n " + e.getKey() + ": \n" + e.getValue());
     357                            txtMappaint.append("\n ").append(e.getKey()).append(": \n").append(e.getValue());
    353358                        }
    354359                    } else {
     
    359364                StyleList sl = elemstyles.get(osm, scale, nc);
    360365                for (ElemStyle s : sl) {
    361                     txtMappaint.append(" * " + s + "\n");
     366                    txtMappaint.append(" * ").append(s).append("\n");
    362367                }
    363368                txtMappaint.append("\n\n");
     
    380385            }
    381386        }
     387        return txtMappaint.toString();
     388    }
     389
     390    /*  Future Ideas:
     391        Calculate the most recent edit date from o.getTimestamp().
     392        Sort by the count for presentation, so the most active editors are on top.
     393        Count only tagged nodes (so empty way nodes don't inflate counts).
     394    */
     395    protected String buildListOfEditorsText() {
     396        final StringBuilder s = new StringBuilder();
     397        final Map<String, Integer> editCountByUser = new TreeMap<>(Collator.getInstance(Locale.getDefault()));
     398
     399        // Count who edited each selected object
     400        for (OsmPrimitive o : primitives) {
     401            if (o.getUser() != null) {
     402                String username = o.getUser().getName();
     403                Integer oldCount = editCountByUser.get(username);
     404                if (oldCount == null) {
     405                    editCountByUser.put(username, 1);
     406                } else {
     407                    editCountByUser.put(username, oldCount + 1);
     408                }
     409            }
     410        }
     411
     412        // Print the count in sorted order
     413        s.append(trn("{0} user last edited the selection:", "{0} users last edited the selection:",
     414                editCountByUser.size(), editCountByUser.size()));
     415        s.append("\n\n");
     416        for (Map.Entry<String, Integer> entry : editCountByUser.entrySet()) {
     417            final String username = entry.getKey();
     418            final Integer editCount = entry.getValue();
     419            s.append(String.format("%6d  %s\n", editCount, username));
     420        }
     421        return s.toString();
    382422    }
    383423
Note: See TracChangeset for help on using the changeset viewer.