001// License: GPL. For details, see Readme.txt file. 002package org.openstreetmap.gui.jmapviewer; 003 004import java.awt.Desktop; 005import java.io.IOException; 006import java.net.URI; 007import java.net.URISyntaxException; 008import java.text.MessageFormat; 009import java.util.logging.Logger; 010 011public class FeatureAdapter { 012 013 public static interface BrowserAdapter { 014 void openLink(String url); 015 } 016 017 public static interface TranslationAdapter { 018 String tr(String text, Object... objects); 019 // TODO: more i18n functions 020 } 021 022 public static interface LoggingAdapter { 023 Logger getLogger(String name); 024 } 025 026 private static BrowserAdapter browserAdapter = new DefaultBrowserAdapter(); 027 private static TranslationAdapter translationAdapter = new DefaultTranslationAdapter(); 028 private static LoggingAdapter loggingAdapter = new DefaultLoggingAdapter(); 029 030 public static void registerBrowserAdapter(BrowserAdapter browserAdapter) { 031 FeatureAdapter.browserAdapter = browserAdapter; 032 } 033 034 public static void registerTranslationAdapter(TranslationAdapter translationAdapter) { 035 FeatureAdapter.translationAdapter = translationAdapter; 036 } 037 038 public static void registerLoggingAdapter(LoggingAdapter loggingAdapter) { 039 FeatureAdapter.loggingAdapter = loggingAdapter; 040 } 041 042 public static void openLink(String url) { 043 browserAdapter.openLink(url); 044 } 045 046 public static String tr(String text, Object... objects) { 047 return translationAdapter.tr(text, objects); 048 } 049 050 public static Logger getLogger(String name) { 051 return loggingAdapter.getLogger(name); 052 } 053 054 public static class DefaultBrowserAdapter implements BrowserAdapter { 055 @Override 056 public void openLink(String url) { 057 if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { 058 try { 059 Desktop.getDesktop().browse(new URI(url)); 060 } catch (IOException e) { 061 e.printStackTrace(); 062 } catch (URISyntaxException e) { 063 e.printStackTrace(); 064 } 065 } else { 066 System.err.println(tr("Opening link not supported on current platform (''{0}'')", url)); 067 } 068 } 069 } 070 071 public static class DefaultTranslationAdapter implements TranslationAdapter { 072 @Override 073 public String tr(String text, Object... objects) { 074 return MessageFormat.format(text, objects); 075 } 076 } 077 078 public static class DefaultLoggingAdapter implements LoggingAdapter { 079 @Override 080 public Logger getLogger(String name) { 081 return Logger.getLogger(name); 082 } 083 } 084}