001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.io;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    import static org.openstreetmap.josm.tools.I18n.trn;
006    
007    import java.awt.GridBagConstraints;
008    import java.awt.GridBagLayout;
009    import java.util.ArrayList;
010    import java.util.List;
011    
012    import javax.swing.AbstractListModel;
013    import javax.swing.JLabel;
014    import javax.swing.JList;
015    import javax.swing.JPanel;
016    import javax.swing.JScrollPane;
017    
018    import org.openstreetmap.josm.data.osm.OsmPrimitive;
019    import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
020    
021    /**
022     * This panel displays a summary of the objects to upload. It is displayed in
023     * the upper part of the {@link UploadDialog}.
024     *
025     */
026    public class UploadedObjectsSummaryPanel extends JPanel {
027        static public final String NUM_OBJECTS_TO_UPLOAD_PROP = UploadedObjectsSummaryPanel.class.getName() + ".numObjectsToUpload";
028    
029        /** the list with the added primitives */
030        private PrimitiveList lstAdd;
031        private JLabel lblAdd;
032        private JScrollPane spAdd;
033        /** the list with the updated primitives */
034        private PrimitiveList lstUpdate;
035        private JLabel lblUpdate;
036        private JScrollPane spUpdate;
037        /** the list with the deleted primitives */
038        private PrimitiveList lstDelete;
039        private JLabel lblDelete;
040        private JScrollPane spDelete;
041    
042        protected void build() {
043            setLayout(new GridBagLayout());
044            OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
045            // initialize the three lists for uploaded primitives, but don't add
046            // them to the dialog yet,  see setUploadedPrimitives()
047            //
048            lstAdd = new PrimitiveList();
049            lstAdd.setCellRenderer(renderer);
050            lstAdd.setVisibleRowCount(Math.min(lstAdd.getModel().getSize(), 10));
051            spAdd = new JScrollPane(lstAdd);
052            lblAdd = new JLabel(tr("Objects to add:"));
053    
054            lstUpdate = new PrimitiveList();
055            lstUpdate.setCellRenderer(renderer);
056            lstUpdate.setVisibleRowCount(Math.min(lstUpdate.getModel().getSize(), 10));
057            spUpdate = new JScrollPane(lstUpdate);
058            lblUpdate = new JLabel(tr("Objects to modify:"));
059    
060            lstDelete = new PrimitiveList();
061            lstDelete.setCellRenderer(renderer);
062            lstDelete.setVisibleRowCount(Math.min(lstDelete.getModel().getSize(), 10));
063            spDelete = new JScrollPane(lstDelete);
064            lblDelete = new JLabel(tr("Objects to delete:"));
065        }
066    
067        /**
068         * Sets the collections of primitives which will be uploaded
069         *
070         * @param add  the collection of primitives to add
071         * @param update the collection of primitives to update
072         * @param delete the collection of primitives to delete
073         */
074        public void setUploadedPrimitives(List<OsmPrimitive> add, List<OsmPrimitive> update, List<OsmPrimitive> delete) {
075            lstAdd.getPrimitiveListModel().setPrimitives(add);
076            lstUpdate.getPrimitiveListModel().setPrimitives(update);
077            lstDelete.getPrimitiveListModel().setPrimitives(delete);
078    
079            GridBagConstraints gcLabel = new GridBagConstraints();
080            gcLabel.fill = GridBagConstraints.HORIZONTAL;
081            gcLabel.weightx = 1.0;
082            gcLabel.weighty = 0.0;
083            gcLabel.anchor = GridBagConstraints.FIRST_LINE_START;
084    
085            GridBagConstraints gcList = new GridBagConstraints();
086            gcList.fill = GridBagConstraints.BOTH;
087            gcList.weightx = 1.0;
088            gcList.weighty = 1.0;
089            gcList.anchor = GridBagConstraints.CENTER;
090            removeAll();
091            int y = -1;
092            if (!add.isEmpty()) {
093                y++;
094                gcLabel.gridy = y;
095                lblAdd.setText(trn("{0} object to add:", "{0} objects to add:", add.size(),add.size()));
096                add(lblAdd, gcLabel);
097                y++;
098                gcList.gridy = y;
099                add(spAdd, gcList);
100            }
101            if (!update.isEmpty()) {
102                y++;
103                gcLabel.gridy = y;
104                lblUpdate.setText(trn("{0} object to modify:", "{0} objects to modify:", update.size(),update.size()));
105                add(lblUpdate, gcLabel);
106                y++;
107                gcList.gridy = y;
108                add(spUpdate, gcList);
109            }
110            if (!delete.isEmpty()) {
111                y++;
112                gcLabel.gridy = y;
113                lblDelete.setText(trn("{0} object to delete:", "{0} objects to delete:", delete.size(),delete.size()));
114                add(lblDelete, gcLabel);
115                y++;
116                gcList.gridy = y;
117                add(spDelete, gcList);
118            }
119    
120            firePropertyChange(NUM_OBJECTS_TO_UPLOAD_PROP,0, getNumObjectsToUpload());
121        }
122    
123        public UploadedObjectsSummaryPanel() {
124            build();
125        }
126    
127        /**
128         * Replies the number of objects to upload
129         *
130         * @return the number of objects to upload
131         */
132        public int  getNumObjectsToUpload() {
133            return lstAdd.getModel().getSize()
134            + lstUpdate.getModel().getSize()
135            + lstDelete.getModel().getSize();
136        }
137    
138        /**
139         * A simple list of OSM primitives.
140         *
141         */
142        static class PrimitiveList extends JList {
143            public PrimitiveList() {
144                super(new PrimitiveListModel());
145            }
146    
147            public PrimitiveListModel getPrimitiveListModel() {
148                return (PrimitiveListModel)getModel();
149            }
150        }
151    
152        /**
153         * A list model for a list of OSM primitives.
154         *
155         */
156        static class PrimitiveListModel extends AbstractListModel{
157            private List<OsmPrimitive> primitives;
158    
159            public PrimitiveListModel() {
160                primitives = new ArrayList<OsmPrimitive>();
161            }
162    
163            public PrimitiveListModel(List<OsmPrimitive> primitives) {
164                setPrimitives(primitives);
165            }
166    
167            public void setPrimitives(List<OsmPrimitive> primitives) {
168                if (primitives == null) {
169                    this.primitives = new ArrayList<OsmPrimitive>();
170                } else {
171                    this.primitives = primitives;
172                }
173                fireContentsChanged(this,0,getSize());
174            }
175    
176            public Object getElementAt(int index) {
177                if (primitives == null) return null;
178                return primitives.get(index);
179            }
180    
181            public int getSize() {
182                if (primitives == null) return 0;
183                return primitives.size();
184            }
185        }
186    }