package org.apache.batik.apps.svgbrowser;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.Authenticator;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.gvt.GVTTreeRendererAdapter;
import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
import org.apache.batik.swing.svg.GVTTreeBuilderAdapter;
import org.apache.batik.swing.svg.GVTTreeBuilderEvent;
import org.apache.batik.swing.svg.SVGDocumentLoaderAdapter;
import org.apache.batik.swing.svg.SVGDocumentLoaderEvent;
import org.apache.batik.util.ApplicationSecurityEnforcer;
import org.apache.batik.util.ParsedURL;
import org.apache.batik.util.Platform;
import org.apache.batik.util.XMLResourceDescriptor;
import org.apache.batik.util.gui.resource.ResourceManager;

// Referenced classes of package org.apache.batik.apps.svgbrowser:
//            XMLPreferenceManager, JAuthenticator, AboutDialog, JSVGViewerFrame, 
//            PreferenceDialog, Application

public class Main
    implements Application
{
    protected class FontSizeHandler
        implements OptionHandler
    {

        final Main this$0;

        public int handleOption(int i)
        {
            int j = Integer.parseInt(arguments[++i]);
            Font font = new Font("Dialog", 0, j);
            FontUIResource fontuiresource = new FontUIResource(font);
            UIManager.put("CheckBox.font", fontuiresource);
            UIManager.put("PopupMenu.font", fontuiresource);
            UIManager.put("TextPane.font", fontuiresource);
            UIManager.put("MenuItem.font", fontuiresource);
            UIManager.put("ComboBox.font", fontuiresource);
            UIManager.put("Button.font", fontuiresource);
            UIManager.put("Tree.font", fontuiresource);
            UIManager.put("ScrollPane.font", fontuiresource);
            UIManager.put("TabbedPane.font", fontuiresource);
            UIManager.put("EditorPane.font", fontuiresource);
            UIManager.put("TitledBorder.font", fontuiresource);
            UIManager.put("Menu.font", fontuiresource);
            UIManager.put("TextArea.font", fontuiresource);
            UIManager.put("OptionPane.font", fontuiresource);
            UIManager.put("DesktopIcon.font", fontuiresource);
            UIManager.put("MenuBar.font", fontuiresource);
            UIManager.put("ToolBar.font", fontuiresource);
            UIManager.put("RadioButton.font", fontuiresource);
            UIManager.put("RadioButtonMenuItem.font", fontuiresource);
            UIManager.put("ToggleButton.font", fontuiresource);
            UIManager.put("ToolTip.font", fontuiresource);
            UIManager.put("ProgressBar.font", fontuiresource);
            UIManager.put("TableHeader.font", fontuiresource);
            UIManager.put("Panel.font", fontuiresource);
            UIManager.put("List.font", fontuiresource);
            UIManager.put("ColorChooser.font", fontuiresource);
            UIManager.put("PasswordField.font", fontuiresource);
            UIManager.put("TextField.font", fontuiresource);
            UIManager.put("Table.font", fontuiresource);
            UIManager.put("Label.font", fontuiresource);
            UIManager.put("InternalFrameTitlePane.font", fontuiresource);
            UIManager.put("CheckBoxMenuItem.font", fontuiresource);
            return i;
        }

        public String getDescription()
        {
            return Main.resources.getString("Command.font-size");
        }

        protected FontSizeHandler()
        {
            this$0 = Main.this;
            super();
        }
    }

    protected static interface OptionHandler
    {

        public abstract int handleOption(int i);

        public abstract String getDescription();
    }


    public static final String UNKNOWN_SCRIPT_TYPE_LOAD_KEY_EXTENSION = ".load";
    public static final String PROPERTY_USER_HOME = "user.home";
    public static final String PROPERTY_JAVA_SECURITY_POLICY = "java.security.policy";
    public static final String BATIK_CONFIGURATION_SUBDIRECTORY = ".batik";
    public static final String SQUIGGLE_CONFIGURATION_FILE = "preferences.xml";
    public static final String SQUIGGLE_POLICY_FILE = "__svgbrowser.policy";
    public static final String POLICY_GRANT_SCRIPT_NETWORK_ACCESS = "grant {\n  permission java.net.SocketPermission \"*\", \"listen, connect, resolv" +
"e, accept\";\n};\n\n"
;
    public static final String POLICY_GRANT_SCRIPT_FILE_ACCESS = "grant {\n  permission java.io.FilePermission \"<<ALL FILES>>\", \"read\";\n};\n\n";
    public static final String PREFERENCE_KEY_VISITED_URI_LIST = "preference.key.visited.uri.list";
    public static final String PREFERENCE_KEY_VISITED_URI_LIST_LENGTH = "preference.key.visited.uri.list.length";
    public static final String URI_SEPARATOR = " ";
    public static final String DEFAULT_DEFAULT_FONT_FAMILY = "Arial, Helvetica, sans-serif";
    public static final String SVG_INITIALIZATION = "resources/init.svg";
    protected String svgInitializationURI;
    public static final String RESOURCES = "org.apache.batik.apps.svgbrowser.resources.Main";
    public static final String SQUIGGLE_SECURITY_POLICY = "org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy";
    protected static ResourceBundle bundle;
    protected static ResourceManager resources;
    protected static ImageIcon frameIcon;
    protected XMLPreferenceManager preferenceManager;
    public static final int MAX_VISITED_URIS = 10;
    protected Vector lastVisited;
    protected int maxVisitedURIs;
    protected String arguments[];
    protected boolean overrideSecurityPolicy;
    protected ApplicationSecurityEnforcer securityEnforcer;
    protected Map handlers;
    protected java.util.List viewerFrames;
    protected PreferenceDialog preferenceDialog;
    protected String uiSpecialization;

    public static void main(String args[])
    {
        new Main(args);
    }

    public Main(String as[])
    {
        lastVisited = new Vector();
        maxVisitedURIs = 10;
        overrideSecurityPolicy = false;
        handlers = new HashMap();
        handlers.put("-font-size", new FontSizeHandler());
        viewerFrames = new LinkedList();
        arguments = as;
        if(Platform.isOSX)
        {
            uiSpecialization = "OSX";
            System.setProperty("apple.laf.useScreenMenuBar", "true");
            try
            {
                Class class1 = Class.forName("com.apple.eawt.Application");
                Class class2 = Class.forName("com.apple.eawt.ApplicationListener");
                Class class3 = Class.forName("com.apple.eawt.ApplicationEvent");
                Method method = class1.getMethod("getApplication", new Class[0]);
                Method method1 = class1.getMethod("addApplicationListener", new Class[] {
                    class2
                });
                final Method setHandled = class3.getMethod("setHandled", new Class[] {
                    Boolean.TYPE
                });
                Method method2 = class1.getMethod("setEnabledPreferencesMenu", new Class[] {
                    Boolean.TYPE
                });
                InvocationHandler invocationhandler = new InvocationHandler() {

                    final Method val$setHandled;
                    final Main this$0;

                    public Object invoke(Object obj2, Method method3, Object aobj[])
                    {
                        String s1 = method3.getName();
                        if(s1.equals("handleAbout"))
                        {
                            JSVGViewerFrame jsvgviewerframe = viewerFrames.isEmpty() ? null : (JSVGViewerFrame)viewerFrames.get(0);
                            AboutDialog aboutdialog = new AboutDialog(jsvgviewerframe);
                            aboutdialog.setSize(aboutdialog.getPreferredSize());
                            aboutdialog.setLocationRelativeTo(jsvgviewerframe);
                            aboutdialog.setVisible(true);
                            aboutdialog.toFront();
                        } else
                        if(s1.equals("handlePreferences"))
                        {
                            JSVGViewerFrame jsvgviewerframe1 = viewerFrames.isEmpty() ? null : (JSVGViewerFrame)viewerFrames.get(0);
                            showPreferenceDialog(jsvgviewerframe1);
                        } else
                        if(!s1.equals("handleQuit"))
                        {
                            return null;
                        }
                        try
                        {
                            setHandled.invoke(aobj[0], new Object[] {
                                Boolean.TRUE
                            });
                        }
                        catch(Exception exception2) { }
                        return null;
                    }

            
            {
                this$0 = Main.this;
                setHandled = method;
                super();
            }
                };
                Object obj = method.invoke(null, (Object[])null);
                method2.invoke(obj, new Object[] {
                    Boolean.TRUE
                });
                Object obj1 = Proxy.newProxyInstance(org/apache/batik/apps/svgbrowser/Main.getClassLoader(), new Class[] {
                    class2
                }, invocationhandler);
                method1.invoke(obj, new Object[] {
                    obj1
                });
            }
            catch(Exception exception)
            {
                exception.printStackTrace();
                uiSpecialization = null;
            }
        }
        HashMap hashmap = new HashMap(11);
        hashmap.put("preference.key.languages", Locale.getDefault().getLanguage());
        hashmap.put("preference.key.show.rendering", Boolean.FALSE);
        hashmap.put("preference.key.auto.adjust.window", Boolean.TRUE);
        hashmap.put("preference.key.selection.xor.mode", Boolean.FALSE);
        hashmap.put("preference.key.enable.double.buffering", Boolean.TRUE);
        hashmap.put("preference.key.show.debug.trace", Boolean.FALSE);
        hashmap.put("preference.key.proxy.host", "");
        hashmap.put("preference.key.proxy.port", "");
        hashmap.put("preference.key.cssmedia", "screen");
        hashmap.put("preference.key.default.font.family", "Arial, Helvetica, sans-serif");
        hashmap.put("preference.key.is.xml.parser.validating", Boolean.FALSE);
        hashmap.put("preference.key.enforce.secure.scripting", Boolean.TRUE);
        hashmap.put("preference.key.grant.script.file.access", Boolean.FALSE);
        hashmap.put("preference.key.grant.script.network.access", Boolean.FALSE);
        hashmap.put("preference.key.load.java.script", Boolean.TRUE);
        hashmap.put("preference.key.load.ecmascript", Boolean.TRUE);
        hashmap.put("preference.key.allowed.script.origin", new Integer(2));
        hashmap.put("preference.key.allowed.external.resource.origin", new Integer(1));
        hashmap.put("preference.key.visited.uri.list", "");
        hashmap.put("preference.key.visited.uri.list.length", new Integer(10));
        hashmap.put("preference.key.animation.rate.limiting.mode", new Integer(1));
        hashmap.put("preference.key.animation.rate.limiting.cpu", new Float(0.75F));
        hashmap.put("preference.key.animation.rate.limiting.fps", new Float(10F));
        hashmap.put("preference.key.user.stylesheet.enabled", Boolean.TRUE);
        securityEnforcer = new ApplicationSecurityEnforcer(getClass(), "org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy");
        try
        {
            preferenceManager = new XMLPreferenceManager("preferences.xml", hashmap);
            String s = System.getProperty("user.home");
            File file = new File(s, ".batik");
            file.mkdir();
            XMLPreferenceManager.setPreferenceDirectory(file.getCanonicalPath());
            preferenceManager.load();
            setPreferences();
            initializeLastVisited();
            Authenticator.setDefault(new JAuthenticator());
        }
        catch(Exception exception1)
        {
            exception1.printStackTrace();
        }
        final AboutDialog initDialog = new AboutDialog();
        ((BorderLayout)initDialog.getContentPane().getLayout()).setVgap(8);
        final JProgressBar pb = new JProgressBar(0, 3);
        initDialog.getContentPane().add(pb, "South");
        Dimension dimension = initDialog.getToolkit().getScreenSize();
        Dimension dimension1 = initDialog.getPreferredSize();
        initDialog.setLocation((dimension.width - dimension1.width) / 2, (dimension.height - dimension1.height) / 2);
        initDialog.setSize(dimension1);
        initDialog.setVisible(true);
        final JSVGViewerFrame v = new JSVGViewerFrame(this);
        JSVGCanvas jsvgcanvas = v.getJSVGCanvas();
        jsvgcanvas.addSVGDocumentLoaderListener(new SVGDocumentLoaderAdapter() {

            final JProgressBar val$pb;
            final Main this$0;

            public void documentLoadingStarted(SVGDocumentLoaderEvent svgdocumentloaderevent)
            {
                pb.setValue(1);
            }

            public void documentLoadingCompleted(SVGDocumentLoaderEvent svgdocumentloaderevent)
            {
                pb.setValue(2);
            }

            
            {
                this$0 = Main.this;
                pb = jprogressbar;
                super();
            }
        });
        jsvgcanvas.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() {

            final JProgressBar val$pb;
            final Main this$0;

            public void gvtBuildCompleted(GVTTreeBuilderEvent gvttreebuilderevent)
            {
                pb.setValue(3);
            }

            
            {
                this$0 = Main.this;
                pb = jprogressbar;
                super();
            }
        });
        jsvgcanvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {

            final AboutDialog val$initDialog;
            final JSVGViewerFrame val$v;
            final Main this$0;

            public void gvtRenderingCompleted(GVTTreeRendererEvent gvttreerendererevent)
            {
                initDialog.dispose();
                v.dispose();
                System.gc();
                run();
            }

            
            {
                this$0 = Main.this;
                initDialog = aboutdialog;
                v = jsvgviewerframe;
                super();
            }
        });
        jsvgcanvas.setSize(100, 100);
        svgInitializationURI = org/apache/batik/apps/svgbrowser/Main.getResource("resources/init.svg").toString();
        jsvgcanvas.loadSVGDocument(svgInitializationURI);
    }

    public void installCustomPolicyFile()
        throws IOException
    {
        String s = System.getProperty("java.security.policy");
        if(overrideSecurityPolicy || s == null || "".equals(s))
        {
            ParsedURL parsedurl = new ParsedURL(securityEnforcer.getPolicyURL());
            String s1 = System.getProperty("user.home");
            File file = new File(s1, ".batik");
            File file1 = new File(file, "__svgbrowser.policy");
            BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(parsedurl.openStream()));
            FileWriter filewriter = new FileWriter(file1);
            char ac[] = new char[1024];
            for(int i = 0; (i = bufferedreader.read(ac, 0, ac.length)) != -1;)
            {
                filewriter.write(ac, 0, i);
            }

            bufferedreader.close();
            boolean flag = preferenceManager.getBoolean("preference.key.grant.script.network.access");
            boolean flag1 = preferenceManager.getBoolean("preference.key.grant.script.file.access");
            if(flag)
            {
                filewriter.write("grant {\n  permission java.net.SocketPermission \"*\", \"listen, connect, resolv" +
"e, accept\";\n};\n\n"
);
            }
            if(flag1)
            {
                filewriter.write("grant {\n  permission java.io.FilePermission \"<<ALL FILES>>\", \"read\";\n};\n\n");
            }
            filewriter.close();
            overrideSecurityPolicy = true;
            System.setProperty("java.security.policy", file1.toURL().toString());
        }
    }

    public void run()
    {
        try
        {
            int i = 0;
            do
            {
                if(i >= arguments.length)
                {
                    break;
                }
                OptionHandler optionhandler = (OptionHandler)handlers.get(arguments[i]);
                if(optionhandler == null)
                {
                    break;
                }
                i = optionhandler.handleOption(i);
                i++;
            } while(true);
            JSVGViewerFrame jsvgviewerframe = createAndShowJSVGViewerFrame();
            while(i < arguments.length) 
            {
                if(arguments[i].length() == 0)
                {
                    i++;
                } else
                {
                    File file = new File(arguments[i]);
                    String s = null;
                    try
                    {
                        if(file.canRead())
                        {
                            s = file.toURL().toString();
                        }
                    }
                    catch(SecurityException securityexception) { }
                    if(s == null)
                    {
                        s = arguments[i];
                        ParsedURL parsedurl = null;
                        parsedurl = new ParsedURL(arguments[i]);
                        if(!parsedurl.complete())
                        {
                            s = null;
                        }
                    }
                    if(s != null)
                    {
                        if(jsvgviewerframe == null)
                        {
                            jsvgviewerframe = createAndShowJSVGViewerFrame();
                        }
                        jsvgviewerframe.showSVGDocument(s);
                        jsvgviewerframe = null;
                    } else
                    {
                        JOptionPane.showMessageDialog(jsvgviewerframe, (new StringBuilder()).append(resources.getString("Error.skipping.file")).append(arguments[i]).toString());
                    }
                    i++;
                }
            }
        }
        catch(Exception exception)
        {
            exception.printStackTrace();
            printUsage();
        }
    }

    protected void printUsage()
    {
        System.out.println();
        System.out.println(resources.getString("Command.header"));
        System.out.println(resources.getString("Command.syntax"));
        System.out.println();
        System.out.println(resources.getString("Command.options"));
        String s;
        for(Iterator iterator = handlers.keySet().iterator(); iterator.hasNext(); System.out.println(((OptionHandler)handlers.get(s)).getDescription()))
        {
            s = (String)iterator.next();
        }

    }

    public JSVGViewerFrame createAndShowJSVGViewerFrame()
    {
        JSVGViewerFrame jsvgviewerframe = new JSVGViewerFrame(this);
        jsvgviewerframe.setSize(resources.getInteger("Frame.width"), resources.getInteger("Frame.height"));
        jsvgviewerframe.setIconImage(frameIcon.getImage());
        jsvgviewerframe.setTitle(resources.getString("Frame.title"));
        jsvgviewerframe.setVisible(true);
        viewerFrames.add(jsvgviewerframe);
        setPreferences(jsvgviewerframe);
        return jsvgviewerframe;
    }

    public void closeJSVGViewerFrame(JSVGViewerFrame jsvgviewerframe)
    {
        jsvgviewerframe.getJSVGCanvas().stopProcessing();
        viewerFrames.remove(jsvgviewerframe);
        if(viewerFrames.size() == 0)
        {
            System.exit(0);
        }
        jsvgviewerframe.dispose();
    }

    public Action createExitAction(JSVGViewerFrame jsvgviewerframe)
    {
        return new AbstractAction() {

            final Main this$0;

            public void actionPerformed(ActionEvent actionevent)
            {
                System.exit(0);
            }

            
            {
                this$0 = Main.this;
                super();
            }
        };
    }

    public void openLink(String s)
    {
        JSVGViewerFrame jsvgviewerframe = createAndShowJSVGViewerFrame();
        jsvgviewerframe.getJSVGCanvas().loadSVGDocument(s);
    }

    public String getXMLParserClassName()
    {
        return XMLResourceDescriptor.getXMLParserClassName();
    }

    public boolean isXMLParserValidating()
    {
        return preferenceManager.getBoolean("preference.key.is.xml.parser.validating");
    }

    public void showPreferenceDialog(JSVGViewerFrame jsvgviewerframe)
    {
        if(preferenceDialog == null)
        {
            preferenceDialog = new PreferenceDialog(jsvgviewerframe, preferenceManager);
        }
        if(preferenceDialog.showDialog() == 0)
        {
            try
            {
                preferenceManager.save();
                setPreferences();
            }
            catch(Exception exception) { }
        }
    }

    private void setPreferences()
        throws IOException
    {
        for(Iterator iterator = viewerFrames.iterator(); iterator.hasNext(); setPreferences((JSVGViewerFrame)iterator.next())) { }
        System.setProperty("proxyHost", preferenceManager.getString("preference.key.proxy.host"));
        System.setProperty("proxyPort", preferenceManager.getString("preference.key.proxy.port"));
        installCustomPolicyFile();
        securityEnforcer.enforceSecurity(preferenceManager.getBoolean("preference.key.enforce.secure.scripting"));
    }

    private void setPreferences(JSVGViewerFrame jsvgviewerframe)
    {
        boolean flag = preferenceManager.getBoolean("preference.key.enable.double.buffering");
        jsvgviewerframe.getJSVGCanvas().setDoubleBufferedRendering(flag);
        boolean flag1 = preferenceManager.getBoolean("preference.key.show.rendering");
        jsvgviewerframe.getJSVGCanvas().setProgressivePaint(flag1);
        boolean flag2 = preferenceManager.getBoolean("preference.key.show.debug.trace");
        jsvgviewerframe.setDebug(flag2);
        boolean flag3 = preferenceManager.getBoolean("preference.key.auto.adjust.window");
        jsvgviewerframe.setAutoAdjust(flag3);
        boolean flag4 = preferenceManager.getBoolean("preference.key.selection.xor.mode");
        jsvgviewerframe.getJSVGCanvas().setSelectionOverlayXORMode(flag4);
        int i = preferenceManager.getInteger("preference.key.animation.rate.limiting.mode");
        if(i < 0 || i > 2)
        {
            i = 1;
        }
        switch(i)
        {
        default:
            break;

        case 0: // '\0'
            jsvgviewerframe.getJSVGCanvas().setAnimationLimitingNone();
            break;

        case 1: // '\001'
            float f = preferenceManager.getFloat("preference.key.animation.rate.limiting.cpu");
            if(f <= 0.0F || f > 1.0F)
            {
                f = 0.75F;
            }
            jsvgviewerframe.getJSVGCanvas().setAnimationLimitingCPU(f);
            break;

        case 2: // '\002'
            float f1 = preferenceManager.getFloat("preference.key.animation.rate.limiting.fps");
            if(f1 <= 0.0F)
            {
                f1 = 10F;
            }
            jsvgviewerframe.getJSVGCanvas().setAnimationLimitingFPS(f1);
            break;
        }
    }

    public String getLanguages()
    {
        String s = preferenceManager.getString("preference.key.languages");
        return s != null ? s : Locale.getDefault().getLanguage();
    }

    public String getUserStyleSheetURI()
    {
        String s;
        boolean flag = preferenceManager.getBoolean("preference.key.user.stylesheet.enabled");
        s = preferenceManager.getString("preference.key.user.stylesheet");
        if(!flag || s.length() == 0)
        {
            return null;
        }
        File file = new File(s);
        if(file.exists())
        {
            return file.toURL().toString();
        }
        break MISSING_BLOCK_LABEL_61;
        IOException ioexception;
        ioexception;
        return s;
    }

    public String getDefaultFontFamily()
    {
        return preferenceManager.getString("preference.key.default.font.family");
    }

    public String getMedia()
    {
        String s = preferenceManager.getString("preference.key.cssmedia");
        return s != null ? s : "screen";
    }

    public boolean isSelectionOverlayXORMode()
    {
        return preferenceManager.getBoolean("preference.key.selection.xor.mode");
    }

    public boolean canLoadScriptType(String s)
    {
        if("text/ecmascript".equals(s))
        {
            return preferenceManager.getBoolean("preference.key.load.ecmascript");
        }
        if("application/java-archive".equals(s))
        {
            return preferenceManager.getBoolean("preference.key.load.java.script");
        } else
        {
            return preferenceManager.getBoolean((new StringBuilder()).append(s).append(".load").toString());
        }
    }

    public int getAllowedScriptOrigin()
    {
        int i = preferenceManager.getInteger("preference.key.allowed.script.origin");
        return i;
    }

    public int getAllowedExternalResourceOrigin()
    {
        int i = preferenceManager.getInteger("preference.key.allowed.external.resource.origin");
        return i;
    }

    public void addVisitedURI(String s)
    {
        if(svgInitializationURI.equals(s))
        {
            return;
        }
        int i = preferenceManager.getInteger("preference.key.visited.uri.list.length");
        if(i < 0)
        {
            i = 0;
        }
        if(lastVisited.contains(s))
        {
            lastVisited.removeElement(s);
        }
        for(; lastVisited.size() > 0 && lastVisited.size() > i - 1; lastVisited.removeElementAt(0)) { }
        if(i > 0)
        {
            lastVisited.addElement(s);
        }
        StringBuffer stringbuffer = new StringBuffer(lastVisited.size() * 8);
        for(int j = 0; j < lastVisited.size(); j++)
        {
            stringbuffer.append(URLEncoder.encode(lastVisited.get(j).toString()));
            stringbuffer.append(" ");
        }

        preferenceManager.setString("preference.key.visited.uri.list", stringbuffer.toString());
        try
        {
            preferenceManager.save();
        }
        catch(Exception exception) { }
    }

    public String[] getVisitedURIs()
    {
        String as[] = new String[lastVisited.size()];
        lastVisited.toArray(as);
        return as;
    }

    public String getUISpecialization()
    {
        return uiSpecialization;
    }

    protected void initializeLastVisited()
    {
        String s = preferenceManager.getString("preference.key.visited.uri.list");
        StringTokenizer stringtokenizer = new StringTokenizer(s, " ");
        int i = stringtokenizer.countTokens();
        int j = preferenceManager.getInteger("preference.key.visited.uri.list.length");
        if(i > j)
        {
            i = j;
        }
        for(int k = 0; k < i; k++)
        {
            lastVisited.addElement(URLDecoder.decode(stringtokenizer.nextToken()));
        }

    }

    static 
    {
        bundle = ResourceBundle.getBundle("org.apache.batik.apps.svgbrowser.resources.Main", Locale.getDefault());
        resources = new ResourceManager(bundle);
        frameIcon = new ImageIcon(org/apache/batik/apps/svgbrowser/Main.getResource(resources.getString("Frame.icon")));
    }
}
