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 {
|
113 | 113 | */ |
114 | 114 | private final double spacingMeter; |
115 | 115 | private final int steps; |
116 | | private final int majorStepEvery; |
| 116 | private final int minorStepsPerMajor; |
117 | 117 | |
118 | 118 | /** |
119 | 119 | * Creates a new tick mark helper. |
… |
… |
public class MapScaler extends JComponent implements Helpful, Accessible {
|
126 | 126 | |
127 | 127 | double log10 = Math.log(lineDistance) / Math.log(10); |
128 | 128 | double spacingLog10 = Math.pow(10, Math.floor(log10)); |
| 129 | int minorStepsPerMajor; |
| 130 | double distanceBetweenMinor; |
129 | 131 | 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; |
132 | 135 | } else { |
133 | | spacingMeter = spacingLog10; |
134 | | majorStepEvery = 5; |
| 136 | // Add 10 ticks for every full unit |
| 137 | distanceBetweenMinor = spacingLog10; |
| 138 | minorStepsPerMajor = 5; |
135 | 139 | } |
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; |
137 | 151 | } |
138 | 152 | |
| 153 | /** |
| 154 | * Paint the ticks to the graphics. |
| 155 | * @param g The graphics to paint on. |
| 156 | */ |
139 | 157 | public void paintTicks(Graphics g) { |
140 | 158 | double spacingPixel = spacingMeter / (dist100Pixel / 100); |
141 | 159 | double textBlockedUntil = -1; |
142 | 160 | for (int step = 0; step <= steps; step++) { |
143 | 161 | int x = (int) (PADDING_LEFT + spacingPixel * step); |
144 | | boolean isMajor = step % majorStepEvery == 0; |
| 162 | boolean isMajor = step % minorStepsPerMajor == 0; |
145 | 163 | int paddingY = isMajor ? 0 : 3; |
146 | 164 | g.drawLine(x, paddingY, x, 10 - paddingY); |
147 | 165 | |
148 | | if (isMajor || (step == steps && textBlockedUntil < 0)) { |
| 166 | if (step == 0 || step == steps) { |
149 | 167 | String text; |
150 | 168 | if (step == 0) { |
151 | 169 | text = "0"; |
… |
… |
public class MapScaler extends JComponent implements Helpful, Accessible {
|
154 | 172 | } |
155 | 173 | Rectangle2D bound = g.getFontMetrics().getStringBounds(text, g); |
156 | 174 | 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); |
160 | 177 | } |
| 178 | g.drawString(text, left, 23); |
| 179 | textBlockedUntil = left + bound.getWidth() + 2; |
161 | 180 | } |
162 | 181 | } |
163 | 182 | g.drawLine(PADDING_LEFT + 0, 5, (int) (PADDING_LEFT + spacingPixel * steps), 5); |