Ignore:
Timestamp:
28.12.2009 00:16:04 (2 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.