/* * Licensed 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 jpa.tools.swing; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URI; import java.net.URL; import java.util.LinkedList; import javax.swing.Box; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; /** * An internal viewer for HTML formatted source code. * The input to this viewer is a root URL. * The viewer shows the anchors in a combo-box and displays the * corresponding HTML in the main editor. * * @author Pinaki Poddar * */ @SuppressWarnings("serial") public class SourceCodeViewer extends JPanel { private final JEditorPane _editor; private final JComboBox _bookmarks; private IndexedMap<String, URI> _anchors = new IndexedMap<String, URI>(); private LinkedList<String> _visited = new LinkedList<String>(); /** * Create a Source Code Browser. */ public SourceCodeViewer() { super(true); setLayout(new BorderLayout()); _editor = new JEditorPane(); _editor.setContentType("text/html"); _editor.setEditable(false); DefaultComboBoxModel model = new DefaultComboBoxModel(); _bookmarks = new JComboBox(model); _bookmarks.setEditable(false); _bookmarks.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { showAnchor((String)_bookmarks.getSelectedItem()); } }); JPanel topPanel = new JPanel(); ((FlowLayout)topPanel.getLayout()).setAlignment(FlowLayout.LEADING); topPanel.add(new JLabel("Go to ")); topPanel.add(_bookmarks); topPanel.add(Box.createHorizontalGlue()); add(new JScrollPane(_editor, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS), BorderLayout.CENTER); add(topPanel, BorderLayout.NORTH); } /** * Add a page to this browser. * * @param anchor a user visible description to identify the page * @param uri the unique resource location */ public void addPage(String anchor, URI url) { _anchors.put(anchor, url); ((DefaultComboBoxModel)_bookmarks.getModel()).addElement(anchor); } /** * Shows the page identified by the given anchor. * * @param anchor an anchor added a priori. */ public void showAnchor(String anchor) { int i = _anchors.indexOf(anchor); if (i == -1) return; showPage(anchor, _anchors.get(anchor)); } /** * Shows the given URI. * @param anchor an anchor added a priori or a new one. * @param uri the URI of the anchor */ public void showPage(String anchor, URI uri) { if (anchor == null || uri == null) return; try { URL url = uri.toURL(); _editor.setPage(url); repaint(); _visited.add(anchor); _anchors.put(anchor, uri); } catch (Exception ex) { System.err.println("Anchor = " + anchor + " URI " + uri); ex.printStackTrace(); } } }