Ticket #12919: patch-fix-12919.patch

File patch-fix-12919.patch, 3.8 KB (added by michael2402, 9 years ago)
  • src/org/openstreetmap/josm/gui/MapScaler.java

    diff --git a/src/org/openstreetmap/josm/gui/MapScaler.java b/src/org/openstreetmap/josm/gui/MapScaler.java
    index a52e163..4ec3b0a 100644
    a b public class MapScaler extends JComponent implements Helpful, Accessible {  
    113113         */
    114114        private final double spacingMeter;
    115115        private final int steps;
    116         private final int majorStepEvery;
     116        private final int minorStepsPerMajor;
    117117
    118118        /**
    119119         * Creates a new tick mark helper.
    public class MapScaler extends JComponent implements Helpful, Accessible {  
    126126
    127127            double log10 = Math.log(lineDistance) / Math.log(10);
    128128            double spacingLog10 = Math.pow(10, Math.floor(log10));
     129            int minorStepsPerMajor;
     130            double distanceBetweenMinor;
    129131            if (log10 - Math.floor(log10) < .75) {
    130                 spacingMeter = spacingLog10 / 4;
    131                 majorStepEvery = 4;
     132                // Add 2 ticks for every full unit
     133                distanceBetweenMinor = spacingLog10 / 2;
     134                minorStepsPerMajor = 2;
    132135            } else {
    133                 spacingMeter = spacingLog10;
    134                 majorStepEvery = 5;
     136                // Add 10 ticks for every full unit
     137                distanceBetweenMinor = spacingLog10;
     138                minorStepsPerMajor = 5;
    135139            }
    136             steps = (int) Math.floor(lineDistance / spacingMeter);
     140            // round down to the last major step.
     141            int majorSteps = (int) Math.floor(lineDistance / distanceBetweenMinor / minorStepsPerMajor);
     142            if (majorSteps >= 4) {
     143                // we have many major steps, do not paint the minor now.
     144                this.spacingMeter = distanceBetweenMinor * minorStepsPerMajor;
     145                this.minorStepsPerMajor = 1;
     146            } else {
     147                this.minorStepsPerMajor = minorStepsPerMajor;
     148                this.spacingMeter = distanceBetweenMinor;
     149            }
     150            steps = majorSteps * this.minorStepsPerMajor;
    137151        }
    138152
     153        /**
     154         * Paint the ticks to the graphics.
     155         * @param g The graphics to paint on.
     156         */
    139157        public void paintTicks(Graphics g) {
    140158            double spacingPixel = spacingMeter / (dist100Pixel / 100);
    141159            double textBlockedUntil = -1;
    142160            for (int step = 0; step <= steps; step++) {
    143161                int x = (int) (PADDING_LEFT + spacingPixel * step);
    144                 boolean isMajor = step % majorStepEvery == 0;
     162                boolean isMajor = step % minorStepsPerMajor == 0;
    145163                int paddingY = isMajor ? 0 : 3;
    146164                g.drawLine(x, paddingY, x, 10 - paddingY);
    147165
    148                 if (isMajor || (step == steps && textBlockedUntil < 0)) {
     166                if (step == 0 || step == steps) {
    149167                    String text;
    150168                    if (step == 0) {
    151169                        text = "0";
    public class MapScaler extends JComponent implements Helpful, Accessible {  
    154172                    }
    155173                    Rectangle2D bound = g.getFontMetrics().getStringBounds(text, g);
    156174                    int left = (int) (x - bound.getWidth() / 2);
    157                     if (textBlockedUntil < left) {
    158                         g.drawString(text, left, 23);
    159                         textBlockedUntil = left + bound.getWidth() + 2;
     175                    if (textBlockedUntil > left) {
     176                        left = (int) (textBlockedUntil + 5);
    160177                    }
     178                    g.drawString(text, left, 23);
     179                    textBlockedUntil = left + bound.getWidth() + 2;
    161180                }
    162181            }
    163182            g.drawLine(PADDING_LEFT + 0, 5, (int) (PADDING_LEFT + spacingPixel * steps), 5);