Changeset 4803 in josm


Ignore:
Timestamp:
Jan 16, 2012 8:05:23 PM (17 months ago)
Author:
akks
Message:

Context menu for "Angle" status panel (Angle snap configuration), see #7260, #6694

Location:
trunk/src/org/openstreetmap/josm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java

    r4785 r4803  
    2222import java.awt.event.KeyEvent; 
    2323import java.awt.event.MouseEvent; 
     24import java.awt.event.MouseListener; 
    2425import java.awt.geom.GeneralPath; 
    2526import java.util.ArrayList; 
     
    3940import javax.swing.JOptionPane; 
    4041 
    41 import javax.swing.SwingUtilities; 
     42import javax.swing.JPopupMenu; 
    4243import javax.swing.Timer; 
    4344import org.openstreetmap.josm.Main; 
     
    6364import org.openstreetmap.josm.gui.layer.MapViewPaintable; 
    6465import org.openstreetmap.josm.gui.layer.OsmDataLayer; 
     66import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 
    6567import org.openstreetmap.josm.tools.ImageProvider; 
    6668import org.openstreetmap.josm.tools.Pair; 
     
    157159 
    158160        }); 
    159          
     161       Main.map.statusLine.getAnglePanel().addMouseListener(snapHelper.anglePopupListener); 
    160162        backspaceShortcut = Shortcut.registerShortcut("mapmode:backspace", tr("Backspace in Add mode"), KeyEvent.VK_BACK_SPACE, Shortcut.GROUP_EDIT); 
    161163        Main.registerActionShortcut(new BackSpaceAction(), backspaceShortcut); 
     
    183185        snapHelper.unsetFixedMode(); 
    184186        snapCheckboxMenuItem.getAction().setEnabled(false); 
     187        Main.map.statusLine.getAnglePanel().removeMouseListener(snapHelper.anglePopupListener); 
    185188         
    186189        removeHighlighting(); 
     
    717720        mouseOnExistingWays = new HashSet<Way>(); 
    718721 
    719         Main.map.statusLine.setAngle(-1); 
    720         Main.map.statusLine.setHeading(-1); 
    721         Main.map.statusLine.setDist(-1); 
     722        showStausInfo(-1, -1, -1); 
    722723 
    723724        if (!ctrl && mousePos != null) { 
     
    750751            return; // Don't create zero length way segments. 
    751752 
    752         // find out the distance, in metres, between the base point and the mouse cursor 
    753         LatLon mouseLatLon = mv.getProjection().eastNorth2latlon(currentMouseEastNorth); 
    754         distance = currentBaseNode.getCoor().greatCircleDistance(mouseLatLon); 
    755753 
    756754        double hdg = Math.toDegrees(currentBaseNode.getEastNorth() 
     
    761759            angle += angle < 0 ? 360 : 0; 
    762760        } 
    763          
     761 
    764762        snapHelper.checkAngleSnapping(currentMouseEastNorth,angle); 
    765          
     763        if (!snapHelper.isActive()) { 
     764            // find out the distance, in metres, between the base point and the mouse cursor 
     765            LatLon mouseLatLon = mv.getProjection().eastNorth2latlon(currentMouseEastNorth); 
     766            distance = currentBaseNode.getCoor().greatCircleDistance(mouseLatLon); 
     767            showStausInfo(angle, hdg, distance); 
     768        } // elsewhere status ar was filled by snapHelper 
     769         
     770        // Now done in redrawIfRequired() 
     771        //updateStatusLine(); 
     772    } 
     773 
     774    private void showStausInfo(double angle, double hdg, double distance) { 
    766775        Main.map.statusLine.setAngle(angle); 
    767776        Main.map.statusLine.setHeading(hdg); 
    768777        Main.map.statusLine.setDist(distance); 
    769         // Now done in redrawIfRequired() 
    770         //updateStatusLine(); 
    771     } 
    772      
    773      
     778    } 
     779 
    774780    /**  
    775781     * Helper function that sets fields currentBaseNode and previousNode  
     
    11921198                         
    11931199            Collection<String> angles = Main.pref.getCollection("draw.anglesnap.angles",  
    1194                     Arrays.asList("0","30","45","60","90","120","135","150","210","225","240","270","300","315","330")); 
     1200                    Arrays.asList("0","30","45","60","90","120","135","150")); 
    11951201             
    1196             snapAngles = new double[angles.size()]; 
     1202            snapAngles = new double[2*angles.size()]; 
    11971203            int i=0; 
    11981204            for (String s: angles) { 
    11991205                try { 
    1200                     snapAngles[i] = Double.parseDouble(s); 
     1206                    snapAngles[i] = Double.parseDouble(s); i++; 
     1207                    snapAngles[i] = 360-Double.parseDouble(s); i++; 
    12011208                } catch (NumberFormatException e) { 
    12021209                    System.err.println("Warning: incorrect number in draw.anglesnap.angles preferences: "+s); 
    1203                     snapAngles[i]=0; 
     1210                    snapAngles[i]=0;i++; 
     1211                    snapAngles[i]=0;i++; 
    12041212                }  
    1205                 i++; 
    12061213            } 
    12071214            snapAngleTolerance = Main.pref.getDouble("draw.anglesnap.tolerance", 5.0); 
     
    12171224                         BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f); 
    12181225 
     1226        } 
     1227         
     1228        public void saveAngles(String ... angles) { 
     1229            Main.pref.putCollection("draw.anglesnap.angles", Arrays.asList(angles)); 
    12191230        } 
    12201231         
     
    13151326                double scale = 20*Main.map.mapView.getDist100Pixel(); 
    13161327                dir2 = new EastNorth( e0+scale*pe, n0+scale*pn); 
    1317                 getSnapPoint(currentEN);  
     1328                EastNorth snapPoint = getSnapPoint(currentEN); 
     1329                 
     1330                // find out the distance, in metres, between the base point and projected point 
     1331                LatLon mouseLatLon = Main.map.mapView.getProjection().eastNorth2latlon(snapPoint); 
     1332                double distance = currentBaseNode.getCoor().greatCircleDistance(mouseLatLon); 
     1333                double hdg = Math.toDegrees(p0.heading(snapPoint)); 
     1334                if (previousNode != null) { 
     1335                    angle = hdg - Math.toDegrees(previousNode.getEastNorth().heading(p0)); 
     1336                    angle += angle < 0 ? 360 : 0; 
     1337                    if (Math.abs(angle-360)<1e-4) angle=0; 
     1338                } 
     1339                 
     1340                showStausInfo(angle, hdg, distance); 
    13181341           } else { 
    13191342                noSnapNow(); 
     
    13601383        } 
    13611384         
     1385        private void enableSnapping() { 
     1386            snapOn = true; 
     1387            checkBox.setState(snapOn); 
     1388            unsetFixedMode(); 
     1389        } 
     1390         
    13621391        private void toggleSnapping() { 
    13631392            snapOn = !snapOn; 
     
    13691398            if (active) { fixed=true; } 
    13701399        } 
    1371          
     1400                 
    13721401         
    13731402        public  void unsetFixedMode() { 
     
    14061435            if (absoluteFix) unsetFixedMode(); else toggleSnapping(); 
    14071436        } 
     1437         
     1438        MouseListener anglePopupListener = new PopupMenuLauncher( new JPopupMenu() { 
     1439            {   
     1440               add(new JCheckBoxMenuItem(new AbstractAction(tr("Show helper geometry")){ 
     1441                    public void actionPerformed(ActionEvent e) { 
     1442                        boolean sel=((JCheckBoxMenuItem) e.getSource()).getState(); 
     1443                        Main.pref.put("draw.anglesnap.drawConstructionGeometry", sel); 
     1444                        Main.pref.put("draw.anglesnap.drawProjectedPoint", sel); 
     1445                        Main.pref.put("draw.anglesnap.showAngle", sel); 
     1446                        init(); enableSnapping(); 
     1447                    } 
     1448               })); 
     1449               add(new AbstractAction(tr("0,90,...")) { 
     1450                public void actionPerformed(ActionEvent e) { 
     1451                    saveAngles("0","90"); 
     1452                    init(); enableSnapping(); 
     1453                } 
     1454               }); 
     1455               add(new AbstractAction(tr("0,45,90,...")) { 
     1456                public void actionPerformed(ActionEvent e) { 
     1457                    saveAngles("0","45","90","135"); 
     1458                    init(); enableSnapping(); 
     1459                } 
     1460               }); 
     1461               add(new AbstractAction(tr("0,30,45,60,90,...")) { 
     1462                public void actionPerformed(ActionEvent e) { 
     1463                    saveAngles("0","30","45","60","90","120","135","150"); 
     1464                    init(); enableSnapping(); 
     1465                } 
     1466               }); 
     1467        } 
     1468    }) { 
     1469            @Override 
     1470            public void mouseClicked(MouseEvent e) { 
     1471                super.mouseClicked(e); 
     1472                if (e.getButton()==MouseEvent.BUTTON1) { 
     1473                    toggleSnapping(); 
     1474                    updateStatusLine(); 
     1475                } 
     1476            } 
     1477    }; 
    14081478    } 
    14091479     
  • trunk/src/org/openstreetmap/josm/gui/MapStatus.java

    r4763 r4803  
    1717import java.awt.Toolkit; 
    1818import java.awt.event.AWTEventListener; 
     19import java.awt.event.ActionEvent; 
    1920import java.awt.event.InputEvent; 
    2021import java.awt.event.KeyAdapter; 
     
    3132import javax.swing.BorderFactory; 
    3233import javax.swing.JLabel; 
     34import javax.swing.JMenu; 
    3335import javax.swing.JPanel; 
     36import javax.swing.JPopupMenu; 
    3437import javax.swing.JProgressBar; 
    3538import javax.swing.JScrollPane; 
     
    4851import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor; 
    4952import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor.ProgressMonitorDialog; 
     53import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 
    5054import org.openstreetmap.josm.tools.GBC; 
    5155import org.openstreetmap.josm.tools.ImageProvider; 
     
    681685        lonText.addMouseListener(Main.main.menu.jumpToAct); 
    682686        latText.addMouseListener(Main.main.menu.jumpToAct); 
    683  
     687         
    684688        // Listen for mouse movements and set the position text field 
    685689        mv.addMouseMotionListener(new MouseMotionListener(){ 
     
    734738        thread.start(); 
    735739    } 
     740     
     741    public JPanel getAnglePanel() { 
     742        return angleText; 
     743    } 
    736744 
    737745    public String helpTopic() { 
Note: See TracChangeset for help on using the changeset viewer.