Changeset 4803 in josm


Ignore:
Timestamp:
2012-01-16T20:05:23+01:00 (8 years 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.