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}