Ignore:
Timestamp:
2009-12-28T00:16:04+01:00 (14 years ago)
Author:
Gubaer
Message:

new: Changeset Cache Manager for querying, downloading, browsing, and managing changesets within JOSM. See also Changeset Manager and Changeset Query Dialog

File:
1 edited

Legend:

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

    r2655 r2689  
    66import java.awt.BorderLayout;
    77import java.awt.FlowLayout;
     8import java.awt.Frame;
    89import java.awt.event.ActionEvent;
    910import java.awt.event.ItemEvent;
     
    1112import java.awt.event.MouseAdapter;
    1213import java.awt.event.MouseEvent;
     14import java.util.Collection;
    1315import java.util.HashSet;
    1416import java.util.List;
    1517import java.util.Set;
     18import java.util.concurrent.ExecutionException;
     19import java.util.concurrent.Future;
    1620
    1721import javax.swing.AbstractAction;
     
    3741import org.openstreetmap.josm.gui.MapFrame;
    3842import org.openstreetmap.josm.gui.MapView;
     43import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager;
     44import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetHeaderDownloadTask;
    3945import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetInSelectionListModel;
    4046import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetListCellRenderer;
    4147import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetListModel;
    4248import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetsInActiveDataLayerListModel;
    43 import org.openstreetmap.josm.gui.dialogs.changeset.DownloadChangesetsTask;
    4449import org.openstreetmap.josm.gui.help.HelpUtil;
    4550import org.openstreetmap.josm.gui.io.CloseChangesetTask;
     51import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
     52import org.openstreetmap.josm.tools.BugReportExceptionHandler;
    4653import org.openstreetmap.josm.tools.ImageProvider;
    4754import org.openstreetmap.josm.tools.OpenBrowser;
     
    7582    private ShowChangesetInfoAction showChangsetInfoAction;
    7683    private CloseOpenChangesetsAction closeChangesetAction;
     84    private LaunchChangesetManagerAction launchChangesetManagerAction;
    7785
    7886
     
    93101        lstInActiveDataLayer.setCellRenderer(new ChangesetListCellRenderer());
    94102
    95         ChangesetCache.getInstance().addChangesetCacheListener(inSelectionModel);
    96         MapView.addLayerChangeListener(inSelectionModel);
    97         DataSet.selListeners.add(inSelectionModel);
    98 
    99         ChangesetCache.getInstance().addChangesetCacheListener(inActiveDataLayerModel);
    100 
    101103        DblClickHandler dblClickHandler = new DblClickHandler();
    102104        lstInSelection.addMouseListener(dblClickHandler);
    103105        lstInActiveDataLayer.addMouseListener(dblClickHandler);
    104106
    105         PopupMenuLauncher popupMenuLauncher = new PopupMenuLauncher();
     107        ChangesetPopupMenuLauncher popupMenuLauncher = new ChangesetPopupMenuLauncher();
    106108        lstInSelection.addMouseListener(popupMenuLauncher);
    107109        lstInActiveDataLayer.addMouseListener(popupMenuLauncher);
    108110    }
    109111
     112    protected void registerAsListener() {
     113        // let the model for changesets in the current selection listen to various
     114        // events
     115        ChangesetCache.getInstance().addChangesetCacheListener(inSelectionModel);
     116        MapView.addEditLayerChangeListener(inSelectionModel);
     117        DataSet.selListeners.add(inSelectionModel);
     118
     119
     120        // let the model for changesets in the current layer listen to various
     121        // events and bootstrap it's content
     122        ChangesetCache.getInstance().addChangesetCacheListener(inActiveDataLayerModel);
     123        MapView.addEditLayerChangeListener(inActiveDataLayerModel);
     124        if (Main.main.getEditLayer() != null) {
     125            Main.main.getEditLayer().data.addDataSetListener(inActiveDataLayerModel);
     126            inActiveDataLayerModel.initFromDataSet(Main.main.getEditLayer().data);
     127            inSelectionModel.initFromPrimitives(Main.main.getEditLayer().data.getSelected());
     128        }
     129    }
     130
     131    protected void unregisterAsListener() {
     132        // remove the list model for the current edit layer as listener
     133        //
     134        ChangesetCache.getInstance().removeChangesetCacheListener(inActiveDataLayerModel);
     135        MapView.removeEditLayerChangeListener(inActiveDataLayerModel);
     136        if (Main.main.getEditLayer() != null) {
     137            Main.main.getEditLayer().data.removeDataSetListener(inActiveDataLayerModel);
     138        }
     139
     140        // remove the list model for the changesets in the current selection as
     141        // listener
     142        //
     143        MapView.removeEditLayerChangeListener(inSelectionModel);
     144        DataSet.selListeners.remove(inSelectionModel);
     145    }
     146
    110147    @Override
    111148    public void tearDown() {
    112         ChangesetCache.getInstance().removeChangesetCacheListener(inActiveDataLayerModel);
    113         MapView.removeLayerChangeListener(inSelectionModel);
    114         DataSet.selListeners.remove(inSelectionModel);
     149        unregisterAsListener();
    115150    }
    116151
    117152    @Override
    118153    public void showNotify() {
     154        registerAsListener();
    119155        DatasetEventManager.getInstance().addDatasetListener(inActiveDataLayerModel, true);
    120156    }
     
    122158    @Override
    123159    public void hideNotify() {
     160        unregisterAsListener();
    124161        DatasetEventManager.getInstance().removeDatasetListener(inActiveDataLayerModel);
    125162    }
     
    179216        lstInActiveDataLayer.getSelectionModel().addListSelectionListener(showChangsetInfoAction);
    180217        lstInSelection.getSelectionModel().addListSelectionListener(showChangsetInfoAction);
     218
     219        // -- launch changeset manager action
     220        launchChangesetManagerAction = new LaunchChangesetManagerAction();
     221        tp.add(launchChangesetManagerAction);
     222        cbInSelectionOnly.addItemListener(launchChangesetManagerAction);
     223        lstInActiveDataLayer.getSelectionModel().addListSelectionListener(launchChangesetManagerAction);
     224        lstInSelection.getSelectionModel().addListSelectionListener(launchChangesetManagerAction);
    181225
    182226        pnl.add(tp);
     
    334378            if (sel.isEmpty())
    335379                return;
    336             DownloadChangesetsTask task = new DownloadChangesetsTask(sel);
     380            ChangesetHeaderDownloadTask task = new ChangesetHeaderDownloadTask(sel);
    337381            Main.worker.submit(task);
    338382        }
     
    424468    }
    425469
    426     class PopupMenuLauncher extends MouseAdapter {
    427         protected void showPopup(MouseEvent evt) {
    428             if (!evt.isPopupTrigger())
    429                 return;
     470    /**
     471     * Show information about the currently selected changesets
     472     *
     473     */
     474    class LaunchChangesetManagerAction extends AbstractAction implements ListSelectionListener, ItemListener {
     475        public LaunchChangesetManagerAction() {
     476            putValue(NAME, tr("Details"));
     477            putValue(SHORT_DESCRIPTION, tr("Opens the Changeset Manager window for the selected changesets"));
     478            putValue(SMALL_ICON, ImageProvider.get("dialogs/changeset", "changesetmanager"));
     479            updateEnabledState();
     480        }
     481
     482        protected void launchChangesetManager(Collection<Integer> toSelect) {
     483            ChangesetCacheManager cm = ChangesetCacheManager.getInstance();
     484            if (cm.isVisible()) {
     485                cm.setExtendedState(Frame.NORMAL);
     486                cm.toFront();
     487                cm.requestFocus();
     488            } else {
     489                cm.setVisible(true);
     490                cm.toFront();
     491                cm.requestFocus();
     492            }
     493            cm.setSelectedChangesetsById(toSelect);
     494        }
     495
     496        public void actionPerformed(ActionEvent arg0) {
     497            ChangesetListModel model = getCurrentChangesetListModel();
     498            Set<Integer> sel = model.getSelectedChangesetIds();
     499            if (sel.isEmpty())
     500                return;
     501            final Set<Integer> toDownload = new HashSet<Integer>();
     502            ChangesetCache cc = ChangesetCache.getInstance();
     503            for (int id: sel) {
     504                if (!cc.contains(id)) {
     505                    toDownload.add(id);
     506                }
     507            }
     508
     509            final ChangesetHeaderDownloadTask task;
     510            final Future<?> future;
     511            if (toDownload.isEmpty()) {
     512                task = null;
     513                future = null;
     514            } else {
     515                task = new ChangesetHeaderDownloadTask(toDownload);
     516                future = Main.worker.submit(task);
     517            }
     518
     519            Runnable r = new Runnable() {
     520                public void run() {
     521                    // first, wait for the download task to finish, if a download
     522                    // task was launched
     523                    if (future != null) {
     524                        try {
     525                            future.get();
     526                        } catch(InterruptedException e) {
     527                            e.printStackTrace();
     528                        } catch(ExecutionException e){
     529                            e.printStackTrace();
     530                            BugReportExceptionHandler.handleException(e.getCause());
     531                            return;
     532                        }
     533                    }
     534                    if (task != null) {
     535                        if (task.isCanceled())
     536                            // don't launch the changeset manager if the download task
     537                            // was canceled
     538                            return;
     539                        if (task.isFailed()) {
     540                            toDownload.clear();
     541                        }
     542                    }
     543                    // launch the task
     544                    launchChangesetManager(toDownload);
     545                }
     546            };
     547            Main.worker.submit(r);
     548        }
     549
     550        protected void updateEnabledState() {
     551            setEnabled(getCurrentChangesetList().getSelectedIndices().length > 0);
     552        }
     553
     554        public void itemStateChanged(ItemEvent arg0) {
     555            updateEnabledState();
     556        }
     557
     558        public void valueChanged(ListSelectionEvent e) {
     559            updateEnabledState();
     560        }
     561    }
     562
     563
     564    class ChangesetPopupMenuLauncher extends PopupMenuLauncher {
     565        @Override
     566        public void launch(MouseEvent evt) {
    430567            JList lst = getCurrentChangesetList();
    431568            if (lst.getSelectedIndices().length == 0) {
     
    438575            popup.show(lst, evt.getX(), evt.getY());
    439576
    440         }
    441         @Override
    442         public void mouseClicked(MouseEvent evt) {
    443             showPopup(evt);
    444         }
    445         @Override
    446         public void mousePressed(MouseEvent evt) {
    447             showPopup(evt);
    448         }
    449         @Override
    450         public void mouseReleased(MouseEvent evt) {
    451             showPopup(evt);
    452577        }
    453578    }
Note: See TracChangeset for help on using the changeset viewer.