/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package openbook.client; import java.awt.Desktop; import java.io.File; import java.io.IOException; import java.net.URI; import jpa.tools.swing.SourceCodeViewer; /** * Browses source code. * The source code URI is resolved with respect to a root URI. * The source code is expected to be in HTML format. * The actual rendering of the source code can be either through an * {@linkplain SourceCodeViewer internal} or an external browser. * * @author Pinaki Poddar * */ public class SourceCodeBrowser { private boolean _useExternal; private SourceCodeViewer _internal = new SourceCodeViewer(); private URI _rootURI; private File _rootDir; /** * Construct a browser. * * @param root a path to be resolved as an URI to root of source tree. * @param useDesktop flags to use external or internal browser. */ public SourceCodeBrowser(String root, boolean useDesktop) { _rootURI = convertToURI(root); _useExternal = useDesktop; } public URI getRootURI() { return _rootURI; } /** * Gets the root source directory if the sources are being serverd from a local * file system directory. */ public File getRootDirectory() { return _rootDir; } /** * Shows the given page. * @param key key a user visible moniker for the page. * @param page the path of the page content w.r.t the root URI of this browser. */ public void showPage(String key, String page) { showPage(key, URI.create(_rootURI.toString() + page)); } public void addPage(String key, String path) { _internal.addPage(key, URI.create(_rootURI.toString() + path)); } public SourceCodeViewer getViewer() { return _internal; } /** * Shows the given page. * * @param key a user visible moniker for the page. * @param uri the URI of the page content. */ public void showPage(String key, URI uri) { System.err.println("Going to show [" + uri + "] for anchor " + key); try { if (_useExternal) { Desktop.getDesktop().browse(uri); } else { _internal.showPage(key, uri); } } catch (IOException e) { e.printStackTrace(); } } private URI convertToURI(String srcPath) { try { URI uri = URI.create(srcPath); String scheme = uri.getScheme(); if (scheme != null && !"file".equals(scheme)) { return uri; } } catch (IllegalArgumentException e) { // we have a relative path. Resolve it against current directory } File srcDir = new File(new File("."), srcPath); if (!srcDir.exists()) { throw new RuntimeException(srcDir.getAbsolutePath() + " does not exist." + "The source root must be relative to current dir"); } if (!srcDir.isDirectory()) { throw new RuntimeException(srcDir.getAbsolutePath() + " is not a directory"); } _rootDir = srcDir; return convertForWindows(_rootDir.toURI()); } URI convertForWindows(URI uri) { String os = System.getProperty("os.name"); boolean windows = os.toLowerCase().indexOf("windows") != -1; return URI.create(uri.getScheme() + (windows ? "://" : "") + uri.getRawSchemeSpecificPart()); } }