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}