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 final class FeatureAdapter { 012 013 private static BrowserAdapter browserAdapter = new DefaultBrowserAdapter(); 014 private static TranslationAdapter translationAdapter = new DefaultTranslationAdapter(); 015 private static LoggingAdapter loggingAdapter = new DefaultLoggingAdapter(); 016 017 private FeatureAdapter() { 018 // private constructor for utility classes 019 } 020 021 public interface BrowserAdapter { 022 void openLink(String url); 023 } 024 025 public interface TranslationAdapter { 026 String tr(String text, Object... objects); 027 // TODO: more i18n functions 028 } 029 030 public interface LoggingAdapter { 031 Logger getLogger(String name); 032 } 033 034 public static void registerBrowserAdapter(BrowserAdapter browserAdapter) { 035 FeatureAdapter.browserAdapter = browserAdapter; 036 } 037 038 public static void registerTranslationAdapter(TranslationAdapter translationAdapter) { 039 FeatureAdapter.translationAdapter = translationAdapter; 040 } 041 042 public static void registerLoggingAdapter(LoggingAdapter loggingAdapter) { 043 FeatureAdapter.loggingAdapter = loggingAdapter; 044 } 045 046 public static void openLink(String url) { 047 browserAdapter.openLink(url); 048 } 049 050 public static String tr(String text, Object... objects) { 051 return translationAdapter.tr(text, objects); 052 } 053 054 public static Logger getLogger(String name) { 055 return loggingAdapter.getLogger(name); 056 } 057 058 public static class DefaultBrowserAdapter implements BrowserAdapter { 059 @Override 060 public void openLink(String url) { 061 if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { 062 try { 063 Desktop.getDesktop().browse(new URI(url)); 064 } catch (IOException e) { 065 e.printStackTrace(); 066 } catch (URISyntaxException e) { 067 e.printStackTrace(); 068 } 069 } else { 070 System.err.println(tr("Opening link not supported on current platform (''{0}'')", url)); 071 } 072 } 073 } 074 075 public static class DefaultTranslationAdapter implements TranslationAdapter { 076 @Override 077 public String tr(String text, Object... objects) { 078 return MessageFormat.format(text, objects); 079 } 080 } 081 082 public static class DefaultLoggingAdapter implements LoggingAdapter { 083 @Override 084 public Logger getLogger(String name) { 085 return Logger.getLogger(name); 086 } 087 } 088}