Ticket #11355: 11355.patch
| File 11355.patch, 18.7 KB (added by , 11 years ago) |
|---|
-
src/org/openstreetmap/josm/Main.java
diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java index 2a14c05..fd0a939 100644
a b public abstract class Main { 529 529 530 530 public static interface InitStatusListener { 531 531 532 void updateStatus(String event); 532 Object updateStatus(String event); 533 void finish(Object status); 533 534 } 534 535 535 536 public static void setInitStatusListener(InitStatusListener listener) { 537 CheckParameterUtil.ensureParameterNotNull(listener); 536 538 initListener = listener; 537 539 } 538 540 … … public abstract class Main { 543 545 main = this; 544 546 isOpenjdk = System.getProperty("java.vm.name").toUpperCase().indexOf("OPENJDK") != -1; 545 547 546 if (initListener != null) { 547 initListener.updateStatus(tr("Executing platform startup hook")); 548 } 549 platform.startupHook(); 548 new InitializationTask(tr("Executing platform startup hook")) { 549 @Override 550 public void initialize() { 551 platform.startupHook(); 552 } 553 }.call(); 550 554 551 if (initListener != null) { 552 initListener.updateStatus(tr("Building main menu")); 553 } 554 contentPanePrivate.add(panel, BorderLayout.CENTER); 555 panel.add(gettingStarted, BorderLayout.CENTER); 556 menu = new MainMenu(); 555 new InitializationTask(tr("Building main menu")) { 556 557 @Override 558 public void initialize() { 559 contentPanePrivate.add(panel, BorderLayout.CENTER); 560 panel.add(gettingStarted, BorderLayout.CENTER); 561 menu = new MainMenu(); 562 } 563 }.call(); 557 564 558 565 undoRedo.addCommandQueueListener(redoUndoListener); 559 566 … … public abstract class Main { 569 576 tasks.add(new InitializationTask(tr("Initializing OSM API")) { 570 577 571 578 @Override 572 public void initialize() throws Exception{579 public void initialize() { 573 580 // We try to establish an API connection early, so that any API 574 581 // capabilities are already known to the editor instance. However 575 582 // if it goes wrong that's not critical at this stage. … … public abstract class Main { 584 591 tasks.add(new InitializationTask(tr("Initializing validator")) { 585 592 586 593 @Override 587 public void initialize() throws Exception{594 public void initialize() { 588 595 validator = new OsmValidator(); 589 596 MapView.addLayerChangeListener(validator); 590 597 } … … public abstract class Main { 593 600 tasks.add(new InitializationTask(tr("Initializing presets")) { 594 601 595 602 @Override 596 public void initialize() throws Exception{603 public void initialize() { 597 604 TaggingPresets.initialize(); 598 605 } 599 606 }); … … public abstract class Main { 601 608 tasks.add(new InitializationTask(tr("Initializing map styles")) { 602 609 603 610 @Override 604 public void initialize() throws Exception{611 public void initialize() { 605 612 MapPaintPreference.initialize(); 606 613 } 607 614 }); … … public abstract class Main { 609 616 tasks.add(new InitializationTask(tr("Loading imagery preferences")) { 610 617 611 618 @Override 612 public void initialize() throws Exception{619 public void initialize() { 613 620 ImageryPreference.initialize(); 614 621 } 615 622 }); … … public abstract class Main { 668 675 } 669 676 }); 670 677 671 if (initListener != null) { 672 initListener.updateStatus(tr("Updating user interface")); 673 } 678 new InitializationTask(tr("Updating user interface")) { 674 679 675 toolbar.refreshToolbarControl(); 676 677 toolbar.control.updateUI(); 678 contentPanePrivate.updateUI(); 680 @Override 681 public void initialize() { 682 toolbar.refreshToolbarControl(); 683 toolbar.control.updateUI(); 684 contentPanePrivate.updateUI(); 685 } 686 }.call(); 679 687 } 680 688 681 689 private abstract class InitializationTask implements Callable<Void> { … … public abstract class Main { 686 694 this.name = name; 687 695 } 688 696 689 public abstract void initialize() throws Exception;697 public abstract void initialize(); 690 698 691 699 @Override 692 public Void call() throws Exception { 700 public Void call() { 701 Object status = null; 693 702 if (initListener != null) { 694 initListener.updateStatus(name);703 status = initListener.updateStatus(name); 695 704 } 696 final long startTime = System.currentTimeMillis();697 705 initialize(); 698 if (isDebugEnabled()) { 699 final long elapsedTime = System.currentTimeMillis() - startTime; 700 Main.debug(tr("{0} completed in {1}", name, Utils.getDurationString(elapsedTime))); 706 if (initListener != null) { 707 initListener.finish(status); 701 708 } 702 709 return null; 703 710 } -
src/org/openstreetmap/josm/gui/MainApplication.java
diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java index 8568f7e..bb0518c 100644
a b import org.openstreetmap.josm.data.Version; 50 50 import org.openstreetmap.josm.gui.download.DownloadDialog; 51 51 import org.openstreetmap.josm.gui.preferences.server.OAuthAccessTokenHolder; 52 52 import org.openstreetmap.josm.gui.preferences.server.ProxyPreference; 53 import org.openstreetmap.josm.gui.progress.ProgressMonitor;54 53 import org.openstreetmap.josm.gui.util.GuiHelper; 55 54 import org.openstreetmap.josm.io.DefaultProxySelector; 56 55 import org.openstreetmap.josm.io.MessageNotifier; … … public class MainApplication extends Main { 411 410 OAuthAccessTokenHolder.getInstance().init(Main.pref, CredentialsManager.getInstance()); 412 411 413 412 final SplashScreen splash = new SplashScreen(); 414 final ProgressMonitor monitor = splash.getProgressMonitor();413 final SplashScreen.SplashProgressMonitor monitor = splash.getProgressMonitor(); 415 414 monitor.beginTask(tr("Initializing")); 416 415 splash.setVisible(Main.pref.getBoolean("draw.splashscreen", true)); 417 416 Main.setInitStatusListener(new InitStatusListener() { 418 417 419 418 @Override 420 public void updateStatus(String event) { 421 monitor.indeterminateSubTask(event); 419 public Object updateStatus(String event) { 420 monitor.beginTask(event); 421 return event; 422 } 423 424 @Override 425 public void finish(Object status) { 426 if (status instanceof String) { 427 monitor.finishTask((String) status); 428 } 422 429 } 423 430 }); 424 431 -
src/org/openstreetmap/josm/gui/SplashScreen.java
diff --git a/src/org/openstreetmap/josm/gui/SplashScreen.java b/src/org/openstreetmap/josm/gui/SplashScreen.java index 1336867..c786ff2 100644
a b package org.openstreetmap.josm.gui; 4 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 5 6 6 import java.awt.Color; 7 import java.awt.Dimension; 7 import java.awt.Component; 8 import java.awt.Graphics; 8 9 import java.awt.GridBagConstraints; 9 10 import java.awt.GridBagLayout; 10 11 import java.awt.Image; 11 12 import java.awt.Insets; 12 13 import java.awt.event.MouseAdapter; 13 14 import java.awt.event.MouseEvent; 14 import java.util.Arrays; 15 import java.util.LinkedList; 15 import java.util.Collections; 16 import java.util.LinkedHashMap; 17 import java.util.Map; 18 import java.util.Objects; 16 19 17 20 import javax.swing.ImageIcon; 18 21 import javax.swing.JFrame; … … import javax.swing.border.Border; 24 27 import javax.swing.border.EmptyBorder; 25 28 import javax.swing.border.EtchedBorder; 26 29 30 import org.openstreetmap.josm.Main; 27 31 import org.openstreetmap.josm.data.Version; 28 32 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 29 import org.openstreetmap.josm.gui.progress.ProgressRenderer; 30 import org.openstreetmap.josm.gui.progress.SwingRenderingProgressMonitor; 33 import org.openstreetmap.josm.gui.progress.ProgressTaskId; 31 34 import org.openstreetmap.josm.gui.util.GuiHelper; 32 35 import org.openstreetmap.josm.tools.ImageProvider; 33 36 import org.openstreetmap.josm.tools.Utils; … … import org.openstreetmap.josm.tools.WindowGeometry; 39 42 */ 40 43 public class SplashScreen extends JFrame { 41 44 42 private final SwingRenderingProgressMonitor progressMonitor; 45 private final SplashProgressMonitor progressMonitor; 46 public final SplashScreenProgressRenderer progressRenderer; 43 47 44 48 /** 45 49 * Constructs a new {@code SplashScreen}. … … public class SplashScreen extends JFrame { 89 93 innerContentPane.add(separator, gbc); 90 94 91 95 // Add a status message 92 SplashScreenProgressRendererprogressRenderer = new SplashScreenProgressRenderer();96 progressRenderer = new SplashScreenProgressRenderer(); 93 97 gbc.gridy = 3; 94 98 gbc.insets = new Insets(0, 0, 10, 0); 95 99 innerContentPane.add(progressRenderer, gbc); 96 progressMonitor = new S wingRenderingProgressMonitor(progressRenderer);100 progressMonitor = new SplashProgressMonitor(null); 97 101 98 102 pack(); 99 103 … … public class SplashScreen extends JFrame { 108 112 }); 109 113 } 110 114 115 void updateProgress() { 116 progressRenderer.setTasks("<html><style>ul {margin-top: 0; margin-bottom: 0; padding: 0;} li {margin: 0; padding: 0;}</style>" 117 + progressMonitor.toString()); 118 } 119 120 private static class MeasurableTask { 121 private final String name; 122 private final long start; 123 private String duration = ""; 124 125 public MeasurableTask(String name) { 126 this.name = name; 127 this.start = System.currentTimeMillis(); 128 } 129 130 public void finish() { 131 duration = tr(" ({0})", Utils.getDurationString(System.currentTimeMillis() - start)); 132 } 133 134 @Override 135 public String toString() { 136 return name + "<i style='color: #666666;'>" + duration + "</i>"; 137 } 138 139 @Override 140 public boolean equals(Object o) { 141 if (this == o) return true; 142 if (o == null || getClass() != o.getClass()) return false; 143 MeasurableTask that = (MeasurableTask) o; 144 return Objects.equals(name, that.name); 145 } 146 147 @Override 148 public int hashCode() { 149 return Objects.hashCode(name); 150 } 151 } 152 153 class SplashProgressMonitor implements ProgressMonitor { 154 155 private final String name; 156 private final Map<Object, Object> tasks = Collections.synchronizedMap(new LinkedHashMap<Object, Object>() { 157 @Override 158 public Object put(Object key, Object value) { 159 final Object r = super.put(key, value); 160 updateProgress(); 161 return r; 162 } 163 }); 164 private SplashProgressMonitor latestSubtask; 165 166 public SplashProgressMonitor(String name) { 167 this.name = name; 168 } 169 170 @Override 171 public String toString() { 172 return Utils.firstNonNull(name, "") + (tasks.isEmpty() ? "" : Utils.joinAsHtmlUnorderedList(tasks.values())); 173 } 174 175 @Override 176 public void beginTask(String title) { 177 if (title != null) { 178 final MeasurableTask task = new MeasurableTask(title); 179 tasks.put(task, task); 180 } 181 } 182 183 @Override 184 public void beginTask(String title, int ticks) { 185 this.beginTask(title); 186 } 187 188 @Override 189 public void setCustomText(String text) { 190 this.beginTask(text); 191 } 192 193 @Override 194 public void setExtraText(String text) { 195 this.beginTask(text); 196 } 197 198 @Override 199 public void indeterminateSubTask(String title) { 200 this.subTask(title); 201 } 202 203 @Override 204 public void subTask(String title) { 205 latestSubtask = new SplashProgressMonitor(title); 206 tasks.put(latestSubtask, latestSubtask); 207 } 208 209 @Override 210 public ProgressMonitor createSubTaskMonitor(int ticks, boolean internal) { 211 return latestSubtask; 212 } 213 214 @Override 215 @Deprecated 216 public void finishTask() { 217 } 218 219 public void finishTask(String title) { 220 final Object task = tasks.get(new MeasurableTask(title)); 221 if (task instanceof MeasurableTask) { 222 ((MeasurableTask) task).finish(); 223 Main.debug(tr("{0} completed in {1}", title, ((MeasurableTask) task).duration)); 224 updateProgress(); 225 } 226 } 227 228 @Override 229 public void invalidate() { 230 } 231 232 @Override 233 public void setTicksCount(int ticks) { 234 } 235 236 @Override 237 public int getTicksCount() { 238 return 0; 239 } 240 241 @Override 242 public void setTicks(int ticks) { 243 } 244 245 @Override 246 public int getTicks() { 247 return 0; 248 } 249 250 @Override 251 public void worked(int ticks) { 252 } 253 254 @Override 255 public boolean isCanceled() { 256 return false; 257 } 258 259 @Override 260 public void cancel() { 261 } 262 263 @Override 264 public void addCancelListener(CancelListener listener) { 265 } 266 267 @Override 268 public void removeCancelListener(CancelListener listener) { 269 } 270 271 @Override 272 public void appendLogMessage(String message) { 273 } 274 275 @Override 276 public void setProgressTaskId(ProgressTaskId taskId) { 277 } 278 279 @Override 280 public ProgressTaskId getProgressTaskId() { 281 return null; 282 } 283 284 @Override 285 public Component getWindowParent() { 286 return Main.parent; 287 } 288 } 289 111 290 /** 112 291 * Returns the progress monitor. 113 292 * @return The progress monitor 114 293 */ 115 public ProgressMonitor getProgressMonitor() {294 public SplashProgressMonitor getProgressMonitor() { 116 295 return progressMonitor; 117 296 } 118 297 119 private static class SplashScreenProgressRenderer extends JPanel implements ProgressRenderer{298 private static class SplashScreenProgressRenderer extends JPanel { 120 299 private JLabel lblTaskTitle; 121 private JLabel lblCustomText;122 300 private JProgressBar progressBar; 123 301 124 302 protected void build() { … … public class SplashScreen extends JFrame { 132 310 gc.insets = new Insets(5,0,0,0); 133 311 add(lblTaskTitle = new JLabel(" "), gc); 134 312 135 gc.gridx = 0;136 313 gc.gridy = 1; 137 gc.fill = GridBagConstraints.HORIZONTAL; 138 gc.weightx = 1.0; 139 gc.weighty = 0.0; 140 gc.insets = new Insets(5,0,0,0); 141 add(lblCustomText = new JLabel(" ") { 142 @Override 143 public Dimension getPreferredSize() { 144 Dimension d = super.getPreferredSize(); 145 if(d.width < 600) d.width = 600; 146 d.height *= MAX_NUMBER_OF_MESSAGES; 147 return d; 148 } 149 }, gc); 150 151 gc.gridx = 0; 152 gc.gridy = 2; 153 gc.fill = GridBagConstraints.HORIZONTAL; 154 gc.weightx = 1.0; 155 gc.weighty = 0.0; 156 gc.insets = new Insets(5,0,0,0); 314 gc.insets = new Insets(15,0,0,0); 157 315 add(progressBar = new JProgressBar(JProgressBar.HORIZONTAL), gc); 316 progressBar.setIndeterminate(true); 158 317 } 159 318 160 319 public SplashScreenProgressRenderer() { … … public class SplashScreen extends JFrame { 162 321 } 163 322 164 323 @Override 165 public void setCustomText(String message) { 166 if(message.isEmpty()) 167 message = " "; // prevent killing of additional line 168 lblCustomText.setText(message); 169 repaint(); 170 } 171 172 @Override 173 public void setIndeterminate(boolean indeterminate) { 174 progressBar.setIndeterminate(indeterminate); 175 repaint(); 176 } 177 178 @Override 179 public void setMaximum(int maximum) { 180 progressBar.setMaximum(maximum); 181 repaint(); 182 } 183 184 private static final int MAX_NUMBER_OF_MESSAGES = 3; 185 private LinkedList<String> messages = new LinkedList<>(Arrays.asList("", "", "")); //update when changing MAX_NUMBER_OF_MESSAGES 186 private long time = System.currentTimeMillis(); 187 188 /** 189 * Stores and displays the {@code MAX_NUMBER_OF_MESSAGES} most recent 190 * task titles together with their execution time. 191 */ 192 @Override 193 public void setTaskTitle(String taskTitle) { 194 195 while (messages.size() >= MAX_NUMBER_OF_MESSAGES) { 196 messages.removeFirst(); 197 } 198 long now = System.currentTimeMillis(); 199 String prevMessageTitle = messages.getLast(); 200 // now should always be >= time but if can be inferior sometimes, see #10287 201 if (!prevMessageTitle.isEmpty() && now >= time) { 202 messages.removeLast(); 203 messages.add(tr("{0} ({1})", prevMessageTitle, Utils.getDurationString(now - time))); 324 public void paint(Graphics g) { 325 try { 326 super.paint(g); 327 } catch (NullPointerException ignore) { 328 // NullPointerException at javax.swing.text.html.StyleSheet$ListPainter.paint 204 329 } 205 time = now;206 if (!taskTitle.isEmpty()) {207 messages.add(taskTitle);208 }209 StringBuilder html = new StringBuilder();210 int i = 0;211 for (String m : messages) {212 html.append("<p class=\"entry").append(++i).append("\">").append(m).append("</p>");213 }214 215 lblTaskTitle.setText("<html><style>"216 + ".entry1{color:#CCCCCC;}"217 + ".entry2{color:#999999;}"218 + ".entry3{color:#000000;}</style>" + html + "</html>"); //update when changing MAX_NUMBER_OF_MESSAGES219 repaint();220 330 } 221 331 222 @Override 223 public void setValue(int value) { 224 progressBar.setValue(value); 332 public void setTasks(String tasks) { 333 lblTaskTitle.setText(tasks); 225 334 repaint(); 226 335 } 227 336 }
