import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import java.net.URL;

class URLframviser extends JFrame
{
  private JTextField urlfelt;
  private JButton lastNed, tilbake, fram, start;
  private JEditorPane lerret;
  private Knappelytter lytter = new Knappelytter();
  private Hyperlinklytter linklytter = new Hyperlinklytter();
  private JToolBar verktøylinje;
  private java.util.List<String> besøksliste = new ArrayList<>();
  //for lagring av besøkte adresser
  private int listeindeks = 0;
  private String startside = 
          "http://docs.oracle.com/javase/tutorial/index.html";

  public URLframviser()
  {
    setTitle("En enkel nettleser");
    setSize(800, 700);

    verktøylinje = new JToolBar();
    //komponenter for verktøylinje:
    lastNed = new JButton(new ImageIcon(
            getClass().getResource("bilder/middle.gif")));
    lastNed.setToolTipText("Last ned / oppdater");
    lastNed.addActionListener(lytter);
    tilbake = new JButton(new ImageIcon(
            getClass().getResource("bilder/left.gif")));
    tilbake.setToolTipText("Tilbake");
    tilbake.addActionListener(lytter);
    fram = new JButton(new ImageIcon(
            getClass().getResource("bilder/right.gif")));
    fram.setToolTipText("Fram");
    fram.addActionListener(lytter);
    start = new JButton(new ImageIcon(
            getClass().getResource("bilder/home.gif")));
    start.setToolTipText("Startside");
    start.addActionListener(lytter);
    urlfelt = new JTextField(30);
    urlfelt.addActionListener(lytter);
    //legger inn komponentene i verktøylinja
    verktøylinje.add(tilbake);
    verktøylinje.add(lastNed);
    verktøylinje.add(fram);
    verktøylinje.add(start);
    verktøylinje.addSeparator();
    verktøylinje.add(new JLabel("Adresse"));
    verktøylinje.addSeparator(new Dimension(3, 0));
    verktøylinje.add(urlfelt);
    verktøylinje.setFloatable(false);

    lerret = new JEditorPane();
    lerret.setEditable(false);
    lerret.addHyperlinkListener(linklytter);

    Container contentPane = getContentPane();
    contentPane.add(new JScrollPane(lerret), BorderLayout.CENTER);
    contentPane.add(verktøylinje, BorderLayout.PAGE_START);
    besøksliste.add(listeindeks++, startside);
    urlfelt.setText(startside);
    nyURL(startside);
  }

  //viser gitt URL og lagrer den i besøkslista
  public void nyURL(String adresse)
  {
    visURL(adresse);
    besøksliste.add(adresse);
    listeindeks = besøksliste.size() - 1;
  }

  public void visURL(String adresse)
  {
    try
    {
      lerret.setPage(adresse);
    }
    catch (IOException ex)
    {
      lerret.setText("Feil: " + ex);
    }
  }

  public String gåFram()
  {
    listeindeks++;
    if (listeindeks >= besøksliste.size())
    {
      listeindeks = besøksliste.size() - 1;
    }
    String adresse = besøksliste.get(listeindeks);
    visURL(adresse);
    return adresse;
  }

  public String gåTilbake()
  {
    listeindeks--;
    if (listeindeks < 0)
    {
      listeindeks = 0;
    }
    String adresse = besøksliste.get(listeindeks);
    visURL(adresse);
    return adresse;
  }

  public String gåTilStart()
  {
    listeindeks = 0;
    visURL(startside);
    return startside;
  }

  private class Knappelytter implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      if (e.getSource() == lastNed)
      {
        nyURL(urlfelt.getText());
      }
      else if (e.getSource() == tilbake)
      {
        String adresse = gåTilbake();
        urlfelt.setText(adresse);
      }
      else if (e.getSource() == fram)
      {
        String adresse = gåFram();
        urlfelt.setText(adresse);
      }
      else if (e.getSource() == start)
      {
        String adresse = gåTilStart();
        urlfelt.setText(adresse);
      }
    }
  }

  //Nødvendig for at brukerens klikk på hyperlinker skal virke.
  private class Hyperlinklytter implements HyperlinkListener
  {
    public void hyperlinkUpdate(HyperlinkEvent event)
    {
      if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
      {
        URL url = event.getURL();
        nyURL(url.toString());
        urlfelt.setText(url.toString());
      }
    }
  }
}  //class URLframviser

public class Knapperaddemo
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        JFrame vindu = new URLframviser();
        vindu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        vindu.setVisible(true);
      }
    });
  }
}
