Ignore:
Timestamp:
2010-01-05T15:01:09+01:00 (15 years ago)
Author:
hampelratte
Message:

added a queue and an offline mode

Location:
applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb
Files:
4 added
10 edited
1 moved

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/ConfigKeys.java

    r14816 r19282  
    4040    public static final String OSB_NEW_HISTORY = "osb.new.history";
    4141    public static final String OSB_NICKNAME = "osb.nickname";
     42    public static final String OSB_API_OFFLINE = "osb.api.offline";
    4243}
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/OsbDownloadLoop.java

    r18147 r19282  
    7878
    7979                // auto download if configured
    80                 if( Main.pref.getBoolean(ConfigKeys.OSB_AUTO_DOWNLOAD) &&
     80                if( Main.pref.getBoolean(ConfigKeys.OSB_AUTO_DOWNLOAD) && !Main.pref.getBoolean(ConfigKeys.OSB_API_OFFLINE) &&
    8181                        plugin != null && plugin.getDialog() != null && plugin.getDialog().isDialogShowing() ) {
    8282                    if(countdown < 0) {
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/OsbLayer.java

    r18595 r19282  
    5858import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
    5959import org.openstreetmap.josm.gui.layer.Layer;
    60 import org.openstreetmap.josm.plugins.osb.gui.action.OsbAction;
     60import org.openstreetmap.josm.plugins.osb.gui.OsbDialog;
    6161import org.openstreetmap.josm.plugins.osb.gui.action.PopupFactory;
    6262import org.openstreetmap.josm.tools.ColorHelper;
     
    7272    private static ImageIcon iconError = OsbPlugin.loadIcon("icon_error16.png");
    7373    private static ImageIcon iconValid = OsbPlugin.loadIcon("icon_valid16.png");
    74 
    75     public OsbLayer(DataSet dataSet, String name) {
     74   
     75    private OsbDialog dialog;
     76
     77    public OsbLayer(DataSet dataSet, String name, OsbDialog dialog) {
    7678        super(name);
    7779        this.data = dataSet;
     80        this.dialog = dialog;
    7881        DataSet.selListeners.add(new SelectionChangedListener() {
    7982            public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
     
    234237                Node n = getNearestNode(e.getPoint());
    235238                if(data.getNodes().contains(n)) {
    236                     data.setSelected(n);
     239                    dialog.setSelectedNode(n);
    237240                }
    238241            }
     
    252255            if(Main.map.mapView.getActiveLayer() == this) {
    253256                Node n = getNearestNode(e.getPoint());
    254                 OsbAction.setSelectedNode(n);
    255257                if(data.getNodes().contains(n)) {
    256                     PopupFactory.createPopup(n).show(e.getComponent(), e.getX(), e.getY());
     258                    PopupFactory.createPopup(n, dialog).show(e.getComponent(), e.getX(), e.getY());
    257259                }
    258260            }
     
    263265
    264266    public void mouseExited(MouseEvent e) {}
     267   
     268    public DataSet getDataSet() {
     269        return data;
     270    }
    265271}
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/OsbPlugin.java

    r19060 r19282  
    156156        }
    157157
    158         try {
    159             // download the data
    160             download.execute(dataSet, bounds);
    161 
    162             // display the parsed data
    163             if(!dataSet.getNodes().isEmpty() && dialog.isDialogShowing()) {
    164                 // if the map layer has been closed, while we are requesting the osb db,
    165                 // we don't have to update the gui, because the user is not interested
    166                 // in this area anymore
    167                 if(Main.map != null && Main.map.mapView != null) {
    168                     updateGui();
     158        // download data for the new bounds, if the plugin is not in offline mode
     159        if(!Main.pref.getBoolean(ConfigKeys.OSB_API_OFFLINE)) {
     160            try {
     161                // download the data
     162                download.execute(dataSet, bounds);
     163   
     164                // display the parsed data
     165                if(!dataSet.getNodes().isEmpty() && dialog.isDialogShowing()) {
     166                    // if the map layer has been closed, while we are requesting the osb db,
     167                    // we don't have to update the gui, because the user is not interested
     168                    // in this area anymore
     169                    if(Main.map != null && Main.map.mapView != null) {
     170                        updateGui();
     171                    }
    169172                }
     173            } catch (Exception e) {
     174                JOptionPane.showMessageDialog(Main.parent, e.getMessage());
     175                e.printStackTrace();
    170176            }
    171         } catch (Exception e) {
    172             JOptionPane.showMessageDialog(Main.parent, e.getMessage());
    173             e.printStackTrace();
    174177        }
    175178    }
     
    188191    private void updateLayer(DataSet osbData) {
    189192        if(layer == null) {
    190             layer = new OsbLayer(osbData, "OpenStreetBugs");
     193            layer = new OsbLayer(osbData, "OpenStreetBugs", dialog);
    191194            Main.main.addLayer(layer);
    192195        }
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/gui/OsbBugListCellRenderer.java

    r19256 r19282  
    4141import org.openstreetmap.josm.plugins.osb.OsbPlugin;
    4242
    43 public class OsbListCellRenderer implements ListCellRenderer {
     43public class OsbBugListCellRenderer implements ListCellRenderer {
    4444
    4545    private Color background = Color.WHITE;
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/gui/OsbDialog.java

    r19060 r19282  
    3838import java.awt.event.MouseListener;
    3939import java.util.ArrayList;
    40 import java.util.Collection;
    4140import java.util.Collections;
    4241import java.util.Comparator;
     
    5049import javax.swing.JPanel;
    5150import javax.swing.JScrollPane;
     51import javax.swing.JTabbedPane;
    5252import javax.swing.JToggleButton;
    5353import javax.swing.ListSelectionModel;
     
    5757
    5858import org.openstreetmap.josm.Main;
    59 import org.openstreetmap.josm.data.SelectionChangedListener;
    6059import org.openstreetmap.josm.data.osm.DataSet;
    6160import org.openstreetmap.josm.data.osm.Node;
     
    6968import org.openstreetmap.josm.plugins.osb.OsbObserver;
    7069import org.openstreetmap.josm.plugins.osb.OsbPlugin;
     70import org.openstreetmap.josm.plugins.osb.gui.action.ActionQueue;
    7171import org.openstreetmap.josm.plugins.osb.gui.action.AddCommentAction;
    7272import org.openstreetmap.josm.plugins.osb.gui.action.CloseIssueAction;
    73 import org.openstreetmap.josm.plugins.osb.gui.action.NewIssueAction;
    7473import org.openstreetmap.josm.plugins.osb.gui.action.OsbAction;
    7574import org.openstreetmap.josm.plugins.osb.gui.action.OsbActionObserver;
     75import org.openstreetmap.josm.plugins.osb.gui.action.PointToNewIssueAction;
    7676import org.openstreetmap.josm.plugins.osb.gui.action.PopupFactory;
     77import org.openstreetmap.josm.plugins.osb.gui.action.ToggleConnectionModeAction;
    7778import org.openstreetmap.josm.tools.OsmUrlToBounds;
    7879import org.openstreetmap.josm.tools.Shortcut;
     
    8283
    8384    private static final long serialVersionUID = 1L;
    84     private DefaultListModel model;
    85     private JList list;
     85    private JPanel bugListPanel, queuePanel;
     86    private DefaultListModel bugListModel;
     87    private JList bugList;
     88    private JList queueList;
    8689    private OsbPlugin osbPlugin;
    8790    private boolean fireSelectionChanged = true;
    8891    private JButton refresh;
    89     private JButton addComment = new JButton(new AddCommentAction());
    90     private JButton closeIssue = new JButton(new CloseIssueAction());
     92    private JButton addComment;
     93    private JButton closeIssue;
     94    private JButton processQueue = new JButton(tr("Process queue"));
    9195    private JToggleButton newIssue = new JToggleButton();
    92 
     96    private JToggleButton toggleConnectionMode;
     97    private JTabbedPane tabbedPane = new JTabbedPane();
     98    private boolean queuePanelVisible = false;
     99   
    93100    private boolean buttonLabels = Main.pref.getBoolean(ConfigKeys.OSB_BUTTON_LABELS);
    94101
     
    100107
    101108        osbPlugin = plugin;
    102 
    103         model = new DefaultListModel();
    104         list = new JList(model);
    105         list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    106         list.addListSelectionListener(this);
    107         list.addMouseListener(this);
    108         list.setCellRenderer(new OsbListCellRenderer());
    109         add(new JScrollPane(list), BorderLayout.CENTER);
    110 
     109        bugListPanel = new JPanel(new BorderLayout());
     110        bugListPanel.setName(tr("Bug list"));
     111        add(bugListPanel, BorderLayout.CENTER);
     112
     113        bugListModel = new DefaultListModel();
     114        bugList = new JList(bugListModel);
     115        bugList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     116        bugList.addListSelectionListener(this);
     117        bugList.addMouseListener(this);
     118        bugList.setCellRenderer(new OsbBugListCellRenderer());
     119        bugListPanel.add(new JScrollPane(bugList), BorderLayout.CENTER);
     120       
    111121        // create dialog buttons
    112         GridLayout layout = buttonLabels ? new GridLayout(2, 2) : new GridLayout(1, 4);
     122        GridLayout layout = buttonLabels ? new GridLayout(3, 2) : new GridLayout(1, 5);
    113123        JPanel buttonPanel = new JPanel(layout);
    114         add(buttonPanel, BorderLayout.SOUTH);
    115124        refresh = new JButton(tr("Refresh"));
    116125        refresh.setToolTipText(tr("Refresh"));
    117126        refresh.setIcon(OsbPlugin.loadIcon("view-refresh22.png"));
    118127        refresh.addActionListener(new ActionListener() {
    119 
    120128            public void actionPerformed(ActionEvent e) {
    121129                int zoom = OsmUrlToBounds.getZoom(Main.map.mapView.getRealBounds());
     
    131139            }
    132140        });
    133 
     141        bugListPanel.add(buttonPanel, BorderLayout.SOUTH);
     142        Action toggleConnectionModeAction = new ToggleConnectionModeAction(this, osbPlugin);
     143        toggleConnectionMode = new JToggleButton(toggleConnectionModeAction);
     144        toggleConnectionMode.setToolTipText(ToggleConnectionModeAction.MSG_OFFLINE);
     145        boolean offline = Main.pref.getBoolean(ConfigKeys.OSB_API_OFFLINE);
     146        toggleConnectionMode.setIcon(OsbPlugin.loadIcon("online22.png"));
     147        toggleConnectionMode.setSelectedIcon(OsbPlugin.loadIcon("offline22.png"));
     148        if(offline) {
     149            // inverse the current value and then do a click, so that
     150            // we are offline and the gui represents the offline state, too
     151            Main.pref.put(ConfigKeys.OSB_API_OFFLINE, false);
     152            toggleConnectionMode.doClick();
     153        }
     154       
     155
     156        AddCommentAction addCommentAction = new AddCommentAction(this);
     157        addComment = new JButton(addCommentAction);
    134158        addComment.setEnabled(false);
    135159        addComment.setToolTipText((String) addComment.getAction().getValue(Action.NAME));
    136160        addComment.setIcon(OsbPlugin.loadIcon("add_comment22.png"));
     161        CloseIssueAction closeIssueAction = new CloseIssueAction(this);
     162        closeIssue = new JButton(closeIssueAction);
    137163        closeIssue.setEnabled(false);
    138164        closeIssue.setToolTipText((String) closeIssue.getAction().getValue(Action.NAME));
    139165        closeIssue.setIcon(OsbPlugin.loadIcon("icon_valid22.png"));
    140         NewIssueAction nia = new NewIssueAction(newIssue, osbPlugin);
     166        PointToNewIssueAction nia = new PointToNewIssueAction(newIssue, osbPlugin);
    141167        newIssue.setAction(nia);
    142168        newIssue.setToolTipText((String) newIssue.getAction().getValue(Action.NAME));
    143169        newIssue.setIcon(OsbPlugin.loadIcon("icon_error_add22.png"));
    144170
     171        buttonPanel.add(toggleConnectionMode);
    145172        buttonPanel.add(refresh);
    146173        buttonPanel.add(newIssue);
    147174        buttonPanel.add(addComment);
    148175        buttonPanel.add(closeIssue);
     176       
     177        queuePanel = new JPanel(new BorderLayout());
     178        queuePanel.setName(tr("Queue"));
     179        queueList = new JList(ActionQueue.getInstance());
     180        queueList.setCellRenderer(new OsbQueueListCellRenderer());
     181        queuePanel.add(new JScrollPane(queueList), BorderLayout.CENTER);
     182        queuePanel.add(processQueue, BorderLayout.SOUTH);
     183        processQueue.addActionListener(new ActionListener() {
     184            public void actionPerformed(ActionEvent e) {
     185                Main.pref.put(ConfigKeys.OSB_API_OFFLINE, "false");
     186                setConnectionMode(false);
     187                try {
     188                    ActionQueue.getInstance().processQueue();
     189   
     190                    // refresh, if the api is enabled
     191                    if(!Main.pref.getBoolean(ConfigKeys.OSB_API_DISABLED)) {
     192                        plugin.updateData();
     193                    }
     194                } catch (Exception e1) {
     195                    System.err.println("Couldn't process action queue");
     196                    e1.printStackTrace();
     197                }
     198            }
     199        });
     200        tabbedPane.add(queuePanel);
    149201
    150202        if (buttonLabels) {
     203            toggleConnectionMode.setHorizontalAlignment(SwingConstants.LEFT);
    151204            refresh.setHorizontalAlignment(SwingConstants.LEFT);
    152205            addComment.setHorizontalAlignment(SwingConstants.LEFT);
     
    154207            newIssue.setHorizontalAlignment(SwingConstants.LEFT);
    155208        } else {
     209            toggleConnectionMode.setText(null);
    156210            refresh.setText(null);
    157211            addComment.setText(null);
     
    160214        }
    161215
    162         // add a selection listener to the data
    163         DataSet.selListeners.add(new SelectionChangedListener() {
    164             public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
    165                 fireSelectionChanged = false;
    166                 list.clearSelection();
    167                 for (OsmPrimitive osmPrimitive : newSelection) {
    168                     for (int i = 0; i < model.getSize(); i++) {
    169                         OsbListItem item = (OsbListItem) model.get(i);
    170                         if (item.getNode() == osmPrimitive) {
    171                             list.addSelectionInterval(i, i);
    172                         }
    173                     }
    174                 }
    175                 fireSelectionChanged = true;
    176             }
    177         });
    178 
    179         AddCommentAction.addActionObserver(this);
    180         CloseIssueAction.addActionObserver(this);
     216        addCommentAction.addActionObserver(this);
     217        closeIssueAction.addActionObserver(this);
     218        setConnectionMode(offline);
    181219    }
    182220
    183221    public synchronized void update(final DataSet dataset) {
    184         Node lastNode = OsbAction.getSelectedNode();
    185         model = new DefaultListModel();
     222        // store the last selection
     223        OsbListItem listItem = (OsbListItem) bugList.getSelectedValue();
     224        Node lastNode = null;
     225        if(listItem != null) {
     226            lastNode = listItem.getNode();
     227        }
     228       
     229        // create a new list model
     230        bugListModel = new DefaultListModel();
    186231        List<Node> sortedList = new ArrayList<Node>(dataset.getNodes());
    187232        Collections.sort(sortedList, new BugComparator());
    188 
    189233        for (Node node : sortedList) {
    190234            if (node.isUsable()) {
    191                 model.addElement(new OsbListItem(node));
    192             }
    193         }
    194         list.setModel(model);
    195         list.setSelectedValue(new OsbListItem(lastNode), true);
     235                bugListModel.addElement(new OsbListItem(node));
     236            }
     237        }
     238        bugList.setModel(bugListModel);
     239       
     240        // restore the last selection
     241        if(lastNode != null) {
     242            bugList.setSelectedValue(new OsbListItem(lastNode), true);
     243        }
    196244    }
    197245
    198246    public void valueChanged(ListSelectionEvent e) {
    199         if (list.getSelectedValues().length == 0) {
     247        if (bugList.getSelectedValues().length == 0) {
    200248            addComment.setEnabled(false);
    201249            closeIssue.setEnabled(false);
    202             OsbAction.setSelectedNode(null);
    203250            return;
    204251        }
    205252
    206253        List<OsmPrimitive> selected = new ArrayList<OsmPrimitive>();
    207         for (Object listItem : list.getSelectedValues()) {
     254        for (Object listItem : bugList.getSelectedValues()) {
    208255            Node node = ((OsbListItem) listItem).getNode();
    209256            selected.add(node);
     
    217264            }
    218265
    219             OsbAction.setSelectedNode(node);
    220266            scrollToSelected(node);
    221267        }
     
    224270        // If so, a temporary DataSet is created because it's the simplest way
    225271        // to fire all necessary events so OSB updates its popups.
    226         DataSet ds = Main.main.getCurrentDataSet();
     272        DataSet ds = osbPlugin.getLayer().getDataSet();
    227273        if (fireSelectionChanged) {
    228274            if(ds == null)
     
    233279
    234280    private void scrollToSelected(Node node) {
    235         for (int i = 0; i < model.getSize(); i++) {
    236             Node current = ((OsbListItem) model.get(i)).getNode();
     281        for (int i = 0; i < bugListModel.getSize(); i++) {
     282            Node current = ((OsbListItem) bugListModel.get(i)).getNode();
    237283            if (current.getId()== node.getId()) {
    238                 list.scrollRectToVisible(list.getCellBounds(i, i));
    239                 list.setSelectedIndex(i);
     284                bugList.scrollRectToVisible(bugList.getCellBounds(i, i));
     285                bugList.setSelectedIndex(i);
    240286                return;
    241287            }
     
    255301    public void layerRemoved(Layer oldLayer) {
    256302        if (oldLayer == osbPlugin.getLayer()) {
    257             model.removeAllElements();
     303            bugListModel.removeAllElements();
    258304        }
    259305    }
     
    269315    public void mouseClicked(MouseEvent e) {
    270316        if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) {
    271             OsbListItem item = (OsbListItem) list.getSelectedValue();
    272             zoomToNode(item.getNode());
     317            zoomToNode(getSelectedNode());
    273318        }
    274319    }
     
    284329    private void mayTriggerPopup(MouseEvent e) {
    285330        if (e.isPopupTrigger()) {
    286             int selectedRow = list.locationToIndex(e.getPoint());
    287             list.setSelectedIndex(selectedRow);
    288             Node n = ((OsbListItem) list.getSelectedValue()).getNode();
    289             OsbAction.setSelectedNode(n);
    290             PopupFactory.createPopup(n).show(e.getComponent(), e.getX(), e.getY());
     331            int selectedRow = bugList.locationToIndex(e.getPoint());
     332            bugList.setSelectedIndex(selectedRow);
     333            PopupFactory.createPopup(getSelectedNode(), this).show(e.getComponent(), e.getX(), e.getY());
    291334        }
    292335    }
     
    334377        super.showDialog();
    335378    }
     379   
     380    public void showQueuePanel() {
     381        if(!queuePanelVisible) {
     382            remove(bugListPanel);
     383            tabbedPane.add(bugListPanel, 0);
     384            add(tabbedPane, BorderLayout.CENTER);
     385            tabbedPane.setSelectedIndex(0);
     386            queuePanelVisible = true;
     387            invalidate();
     388            repaint();
     389        }
     390    }
     391   
     392    public void hideQueuePanel() {
     393        if(queuePanelVisible) {
     394            tabbedPane.remove(bugListPanel);
     395            remove(tabbedPane);
     396            add(bugListPanel, BorderLayout.CENTER);
     397            queuePanelVisible = false;
     398            invalidate();
     399            repaint();
     400        }
     401    }
     402   
     403    public Node getSelectedNode() {
     404        return ((OsbListItem)bugList.getSelectedValue()).getNode();
     405    }
     406   
     407    public void setSelectedNode(Node node) {
     408        bugList.setSelectedValue(new OsbListItem(node), true);
     409    }
     410   
     411    public void setConnectionMode(boolean offline) {
     412        refresh.setEnabled(!offline);
     413        setTitle("OpenStreetBugs (" + (offline ? "offline" : "online") + ")");
     414        toggleConnectionMode.setSelected(offline);
     415    }
    336416}
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/gui/action/AddCommentAction.java

    r17872 r19282  
    3131
    3232import java.awt.event.ActionEvent;
     33import java.io.IOException;
    3334import java.util.LinkedList;
    3435import java.util.List;
    3536
    3637import org.openstreetmap.josm.Main;
     38import org.openstreetmap.josm.data.osm.Node;
    3739import org.openstreetmap.josm.gui.widgets.HistoryChangedListener;
    3840import org.openstreetmap.josm.plugins.osb.ConfigKeys;
    3941import org.openstreetmap.josm.plugins.osb.OsbPlugin;
    4042import org.openstreetmap.josm.plugins.osb.api.EditAction;
     43import org.openstreetmap.josm.plugins.osb.gui.OsbDialog;
    4144import org.openstreetmap.josm.plugins.osb.gui.dialogs.TextInputDialog;
    4245
     
    4649
    4750    private EditAction editAction = new EditAction();
     51   
     52    private String comment;
     53   
     54    private Node node;
    4855
    49     public AddCommentAction() {
    50         super(tr("Add a comment"));
     56    public AddCommentAction(OsbDialog dialog) {
     57        super(tr("Add a comment"), dialog);
    5158    }
    5259
     
    5966            }
    6067        };
    61         String comment = TextInputDialog.showDialog(
     68        node = dialog.getSelectedNode();
     69        comment = TextInputDialog.showDialog(
    6270                Main.map,
    6371                tr("Add a comment"),
     
    6573                OsbPlugin.loadIcon("add_comment22.png"),
    6674                history, l);
    67 
    68         if(comment != null) {
    69             comment = addMesgInfo(comment);
    70             editAction.execute(getSelectedNode(), comment);
     75       
     76        if(comment == null) {
     77            cancelled = true;
    7178        }
    7279    }
     80
     81    @Override
     82    public void execute() throws IOException {
     83        comment = addMesgInfo(comment);
     84        editAction.execute(node, comment);
     85    }
     86   
     87    @Override
     88    public String toString() {
     89        return tr("Comment: " + node.get("note") + " - " + comment);
     90    }
     91   
     92    @Override
     93    public AddCommentAction clone() {
     94        AddCommentAction action = new AddCommentAction(dialog);
     95        action.comment = comment;
     96        action.cancelled = cancelled;
     97        action.node = node;
     98        return action;
     99    }
    73100}
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/gui/action/CloseIssueAction.java

    r17872 r19282  
    3131
    3232import java.awt.event.ActionEvent;
     33import java.io.IOException;
    3334import java.util.LinkedList;
    3435import java.util.List;
    3536
    3637import org.openstreetmap.josm.Main;
     38import org.openstreetmap.josm.data.osm.Node;
    3739import org.openstreetmap.josm.gui.widgets.HistoryChangedListener;
    3840import org.openstreetmap.josm.plugins.osb.ConfigKeys;
     
    4042import org.openstreetmap.josm.plugins.osb.api.CloseAction;
    4143import org.openstreetmap.josm.plugins.osb.api.EditAction;
     44import org.openstreetmap.josm.plugins.osb.gui.OsbDialog;
    4245import org.openstreetmap.josm.plugins.osb.gui.dialogs.TextInputDialog;
    4346
     
    4851    private CloseAction closeAction = new CloseAction();
    4952    private EditAction commentAction = new EditAction();
     53   
     54    private String comment;
     55   
     56    private Node node;
    5057
    51     public CloseIssueAction() {
    52         super(tr("Mark as done"));
     58    public CloseIssueAction(OsbDialog dialog) {
     59        super(tr("Mark as done"), dialog);
    5360    }
    5461
     
    6168            }
    6269        };
    63         String comment = TextInputDialog.showDialog(Main.map,
     70        node = dialog.getSelectedNode();
     71        comment = TextInputDialog.showDialog(Main.map,
    6472                tr("Really close?"),
    6573                tr("<html>Really mark this issue as ''done''?<br><br>You may add an optional comment:</html>"),
    6674                OsbPlugin.loadIcon("icon_valid22.png"),
    6775                history, l);
     76       
     77        if(comment == null) {
     78            cancelled = true;
     79        }
    6880
    69         if(comment != null) {
    70             if(comment.length() > 0) {
    71                 comment = addMesgInfo(comment);
    72                 commentAction.execute(getSelectedNode(), comment);
    73             }
    74             closeAction.execute(getSelectedNode());
     81    }
     82
     83    @Override
     84    public void execute() throws IOException {
     85        if (comment.length() > 0) {
     86            comment = addMesgInfo(comment);
     87            commentAction.execute(node, comment);
    7588        }
     89        closeAction.execute(node);
     90    }
     91   
     92    @Override
     93    public String toString() {
     94        return tr("Close: " + node.get("note") + " - Comment: " + comment);
     95    }
     96   
     97    @Override
     98    public CloseIssueAction clone() {
     99        CloseIssueAction action = new CloseIssueAction(dialog);
     100        action.cancelled = cancelled;
     101        action.comment = comment;
     102        action.node = node;
     103        return action;
    76104    }
    77105}
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/gui/action/NewIssueAction.java

    r17872 r19282  
    3030import static org.openstreetmap.josm.tools.I18n.tr;
    3131
    32 import java.awt.Cursor;
     32import java.awt.Point;
    3333import java.awt.event.ActionEvent;
    34 import java.awt.event.MouseEvent;
    35 import java.awt.event.MouseListener;
    3634import java.io.IOException;
    3735import java.util.LinkedList;
    3836import java.util.List;
    39 
    40 import javax.swing.JOptionPane;
    41 import javax.swing.JToggleButton;
    4237
    4338import org.openstreetmap.josm.Main;
     
    4944import org.openstreetmap.josm.plugins.osb.gui.dialogs.TextInputDialog;
    5045
    51 public class NewIssueAction extends OsbAction implements MouseListener {
     46public class NewIssueAction extends OsbAction {
    5247
    5348    private static final long serialVersionUID = 1L;
    5449
    55     private NewAction newAction = new NewAction();
    56 
    57     private JToggleButton button;
    58 
    5950    private OsbPlugin plugin;
    6051
    61     private Cursor previousCursor;
    62 
    63     public NewIssueAction(JToggleButton button, OsbPlugin plugin) {
    64         super(tr("New issue"));
    65         this.button = button;
     52    private String result;
     53   
     54    private Point p;
     55   
     56    private NewAction newAction = new NewAction();
     57   
     58    public NewIssueAction(OsbPlugin plugin, Point p) {
     59        super(tr("New issue"), plugin.getDialog());
    6660        this.plugin = plugin;
     61        this.p = p;
    6762    }
    6863
    6964    @Override
    70     protected void doActionPerformed(ActionEvent e) throws IOException {
    71         if(button.isSelected()) {
    72             previousCursor = Main.map.mapView.getCursor();
    73             Main.map.mapView.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
    74             Main.map.mapView.addMouseListener(this);
    75         } else {
    76             reset();
    77         }
    78     }
    79 
    80     private void reset() {
    81         Main.map.mapView.setCursor(previousCursor);
    82         Main.map.mapView.removeMouseListener(this);
    83         button.setSelected(false);
    84     }
    85 
    86     public void mouseClicked(MouseEvent e) {
    87         addNewIssue(e);
    88     }
    89 
    90     public void mouseEntered(MouseEvent e) {}
    91 
    92     public void mouseExited(MouseEvent e) {}
    93 
    94     public void mousePressed(MouseEvent e) {
    95         addNewIssue(e);
    96     }
    97 
    98     private void addNewIssue(MouseEvent e) {
     65    protected void doActionPerformed(ActionEvent e) throws IOException, InterruptedException {
    9966        List<String> history = new LinkedList<String>(Main.pref.getCollection(ConfigKeys.OSB_NEW_HISTORY, new LinkedList<String>()));
    10067        HistoryChangedListener l = new HistoryChangedListener() {
     
    10370            }
    10471        };
    105         String result = TextInputDialog.showDialog(
     72
     73        result = TextInputDialog.showDialog(
    10674                Main.map,
    10775                tr("Create issue"),
     
    10977                OsbPlugin.loadIcon("icon_error_add22.png"),
    11078                history, l);
     79       
     80        if(result == null) {
     81            cancelled = true;
     82        }
     83    }
    11184
    112         if(result != null && result.length() > 0) {
    113             try {
    114                 result = addMesgInfo(result);
    115                 Node n = newAction.execute(e.getPoint(), result);
    116                 plugin.getDataSet().addPrimitive(n);
    117                 if(Main.pref.getBoolean(ConfigKeys.OSB_API_DISABLED)) {
    118                     plugin.updateGui();
    119                 } else {
    120                     plugin.updateData();
    121                 }
    122             } catch (Exception e1) {
    123                 e1.printStackTrace();
    124                 JOptionPane.showMessageDialog(Main.parent,
    125                         tr("An error occurred: {0}", new Object[] {result}),
    126                         tr("Error"),
    127                         JOptionPane.ERROR_MESSAGE);
     85    @Override
     86    public void execute() throws IOException {
     87        if (result.length() > 0) {
     88            result = addMesgInfo(result);
     89            Node n = newAction.execute(p, result);
     90            plugin.getDataSet().addPrimitive(n);
     91            if (Main.pref.getBoolean(ConfigKeys.OSB_API_DISABLED)) {
     92                plugin.updateGui();
     93            } else {
     94                plugin.updateData();
    12895            }
    12996        }
    130 
    131         reset();
    13297    }
    133 
    134     public void mouseReleased(MouseEvent e) {}
     98   
     99    @Override
     100    public String toString() {
     101        return tr("Create: " + result);
     102    }
     103   
     104    @Override
     105    public OsbAction clone() {
     106        NewIssueAction action = new NewIssueAction(plugin, p);
     107        action.cancelled = cancelled;
     108        action.p = p;
     109        action.result = result;
     110        return action;
     111    }
    135112}
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/gui/action/OsbAction.java

    r13497 r19282  
    4141
    4242import org.openstreetmap.josm.Main;
    43 import org.openstreetmap.josm.data.osm.Node;
    4443import org.openstreetmap.josm.plugins.osb.ConfigKeys;
     44import org.openstreetmap.josm.plugins.osb.gui.OsbDialog;
    4545
    4646public abstract class OsbAction extends AbstractAction {
     
    4848    private static final long serialVersionUID = 1L;
    4949
    50     private static List<OsbActionObserver> observers = new ArrayList<OsbActionObserver>();
     50    private List<OsbActionObserver> observers = new ArrayList<OsbActionObserver>();
     51   
     52    protected OsbDialog dialog;
     53   
     54    protected boolean cancelled = false;
    5155
    52     private static Node selectedNode;
    53 
    54     public OsbAction(String name) {
     56    public OsbAction(String name, OsbDialog osbDialog) {
    5557        super(name);
    56     }
    57 
    58     public static Node getSelectedNode() {
    59         return selectedNode;
    60     }
    61 
    62     public static void setSelectedNode(Node selectedNode) {
    63         OsbAction.selectedNode = selectedNode;
     58        this.dialog = osbDialog;
    6459    }
    6560
    6661    public void actionPerformed(ActionEvent e) {
     62        cancelled = false;
    6763        try {
    6864            doActionPerformed(e);
    69             for (OsbActionObserver obs : observers) {
    70                 obs.actionPerformed(this);
     65            if(!cancelled) {
     66                if (!Main.pref.getBoolean(ConfigKeys.OSB_API_OFFLINE)) {
     67                    execute();
     68                    for (OsbActionObserver obs : observers) {
     69                        obs.actionPerformed(this);
     70                    }
     71                } else {
     72                    OsbAction action = clone();
     73                    ActionQueue.getInstance().offer(action);
     74                }
    7175            }
    7276        } catch (Exception e1) {
     
    7882    protected abstract void doActionPerformed(ActionEvent e) throws Exception;
    7983
    80     public static void addActionObserver(OsbActionObserver obs) {
     84    public void addActionObserver(OsbActionObserver obs) {
    8185        observers.add(obs);
    8286    }
    8387
    84     public static void removeActionObserver(OsbActionObserver obs) {
     88    public void removeActionObserver(OsbActionObserver obs) {
    8589        observers.remove(obs);
    8690    }
     
    114118        return msg;
    115119    }
     120   
     121    public List<OsbActionObserver> getActionObservers() {
     122        return observers;
     123    }
     124   
     125    public abstract void execute() throws Exception;
     126   
     127    public abstract OsbAction clone();
    116128}
  • applications/editors/josm/plugins/openstreetbugs/src/org/openstreetmap/josm/plugins/osb/gui/action/PopupFactory.java

    r13497 r19282  
    3535import org.openstreetmap.josm.data.osm.Node;
    3636import org.openstreetmap.josm.plugins.osb.OsbPlugin;
     37import org.openstreetmap.josm.plugins.osb.gui.OsbDialog;
    3738
    3839public class PopupFactory {
     
    4142    private static JPopupMenu fixedPopup;
    4243
    43     public static synchronized JPopupMenu createPopup(Node node) {
     44    public static synchronized JPopupMenu createPopup(Node node, OsbDialog dialog) {
    4445        if("0".equals(node.get("state"))) {
    45             return getIssuePopup();
     46            return getIssuePopup(dialog);
    4647        } else if("1".equals(node.get("state"))) {
    47             return getFixedPopup();
     48            return getFixedPopup(dialog);
    4849        } else {
    4950            throw new RuntimeException(tr("Unknown issue state"));
     
    5152    }
    5253
    53     private static JPopupMenu getIssuePopup() {
     54    private static JPopupMenu getIssuePopup(OsbDialog dialog) {
    5455        if(issuePopup == null) {
    5556            issuePopup = new JPopupMenu();
    5657            JMenuItem add = new JMenuItem();
    57             add.setAction(new AddCommentAction());
     58            add.setAction(new AddCommentAction(dialog));
    5859            add.setIcon(OsbPlugin.loadIcon("add_comment16.png"));
    5960            issuePopup.add(add);
    6061            JMenuItem close = new JMenuItem();
    61             close.setAction(new CloseIssueAction());
     62            close.setAction(new CloseIssueAction(dialog));
    6263            close.setIcon(OsbPlugin.loadIcon("icon_valid16.png"));
    6364            issuePopup.add(close);
     
    6667    }
    6768
    68     private static JPopupMenu getFixedPopup() {
     69    private static JPopupMenu getFixedPopup(OsbDialog dialog) {
    6970        if(fixedPopup == null) {
    7071            fixedPopup = new JPopupMenu();
    7172            JMenuItem add = new JMenuItem();
    72             AddCommentAction aca = new AddCommentAction();
     73            AddCommentAction aca = new AddCommentAction(dialog);
    7374            aca.setEnabled(false);
    7475            add.setAction(aca);
    7576            add.setIcon(OsbPlugin.loadIcon("add_comment16.png"));
    7677            JMenuItem close = new JMenuItem();
    77             CloseIssueAction cia = new CloseIssueAction();
     78            CloseIssueAction cia = new CloseIssueAction(dialog);
    7879            cia.setEnabled(false);
    7980            close.setAction(cia);
Note: See TracChangeset for help on using the changeset viewer.