package browser; import history.*; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; public class BrowserFrame extends JFrame implements Observer { private static final long serialVersionUID = 8720995195364754006L; public static final String LINK_OPEN_STRING = "Open "; public static final String LINK_DEFAULT_STRING = " "; public static final String FAILURE_URL = "file:Failure.html"; private JEditorPane pane; private HistoryBar toolbar; private JLabel label; private History history; private FramesController controller; protected BrowserFrame(FramesController controller, String initialPage) { this.controller = controller; pane = new JEditorPane(); pane.setEditable(false); JScrollPane scrollPane = new JScrollPane(pane); label = new JLabel(LINK_DEFAULT_STRING); pane.addHyperlinkListener(new HyperlinkListener() { public void hyperlinkUpdate(HyperlinkEvent evt) { // Mouse enters on the link if (evt.getEventType() == HyperlinkEvent.EventType.ENTERED) label.setText(LINK_OPEN_STRING + evt.getURL().toString()); // Link activate if (evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { String selectedURL = evt.getURL().toString(); history.add(selectedURL); } // Mouse exits the link if (evt.getEventType() == HyperlinkEvent.EventType.EXITED) label.setText(LINK_DEFAULT_STRING); } }); history = new History(); history.addObserver(this); toolbar = new HistoryBar(history); history.add(initialPage); JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu menu = new JMenu(Browser.MENU_FILE); menuBar.add(menu); createMenuItem(menu, Browser.MENU_ITEM_NEW, e -> BrowserFrame.this.controller.createFrame()); createMenuItem(menu, Browser.MENU_ITEM_CLOSE, e -> BrowserFrame.this.controller.deleteFrame(BrowserFrame.this)); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { BrowserFrame.this.controller.deleteFrame(BrowserFrame.this); } }); createMenuSeparator(menu); createMenuItem(menu, Browser.MENU_ITEM_QUIT, e -> BrowserFrame.this.controller.quit()); JPanel contentPane = new JPanel(new BorderLayout()); contentPane.add(toolbar, BorderLayout.NORTH); contentPane.add(scrollPane, BorderLayout.CENTER); contentPane.add(label, BorderLayout.SOUTH); setContentPane(contentPane); } private void createMenuItem(JMenu menu, String name, ActionListener action) { JMenuItem menuItem = new JMenuItem(name); menuItem.addActionListener(action); menu.add(menuItem); } private void createMenuSeparator(JMenu menu) { JSeparator separator = new JSeparator(); separator.setForeground(Color.lightGray); menu.add(separator); } public void update(Observable observable, Object arg) { if (!observable.equals(history)) { return; } setPage(history.get()); } protected void setPage(String url) { try { pane.setPage(url); } catch (Exception e) { try { pane.setPage(FAILURE_URL); } catch (Exception e2) { System.err.println(e2.getMessage()); } } } }