aboutsummaryrefslogtreecommitdiff
path: root/src/main/ui/BrowserWindow.java
blob: 640fb1a513b0307a18e91d10eacf64e9ab18ee77 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package ui;

import model.BrowserState;
import model.html.HtmlParser;
import model.util.Event;
import model.util.EventLog;
import org.json.JSONArray;
import persistance.JsonUtils;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayDeque;
import java.util.ArrayList;

// Broad JFrame usage taken from here: https://docs.oracle.com/javase/tutorial/uiswing/components/frame.html
public class BrowserWindow extends JFrame {
    public static final int WIDTH = 1200;
    public static final int HEIGHT = 800;
    private static final String storagePath = "data/apus.cache";

    private BrowserCanvas canvas;
    private BrowserBar browserBar;

    private BrowserState state;

    // MODIFIES: this
    // EFFECTS: creates a new BrowserWindow program for rendering pages
    public BrowserWindow() {
        super("apus");
        state = new BrowserState(new ArrayDeque<>(), "");

        canvas = new BrowserCanvas(new ArrayList<>());
//        render("data/example.html");
        browserBar = new BrowserBar(this);
        getContentPane().add(browserBar, BorderLayout.SOUTH);
//        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(WIDTH, HEIGHT);
        render("/home/apropos/Projects/website/j-james/index.html");
//        browserBar.addTab("/home/apropos/Projects/website/j-james/index.html");
        setVisible(true);
        setClosingBehavior();

        initializeBrowser();
    }

    // MODIFIES: this
    // EFFECTS: Renders an arbitrary page
    public void render(String uri) {
        state.setCurrentTab(uri);
        remove(canvas);
//        System.out.println(state.getCurrentTab());
        try {
            Path path = Paths.get(state.getCurrentTab());
            String file = new String(Files.readAllBytes(path));
            HtmlParser parser = new HtmlParser();
            canvas = new BrowserCanvas(parser.parseHtml(file));
        } catch (Exception e) {
            System.out.println("Could not read file, rendering empty page: " + e.getMessage());

            canvas = new BrowserCanvas(new ArrayList<>());
        }
        add(canvas);
        repaint();
        setVisible(true);
    }

    // EFFECTS: Prompts the user to save their tabs before quitting
    private void setClosingBehavior() {
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                if (state.getTabs().size() > 0) {
                    saveCurrentTabs();
                }
                for (Event event : EventLog.getInstance()) {
                    System.out.println(event);
                }
                super.windowClosing(e);
            }
        });
    }

    // EFFECTS: sets up the browser upon launching
    private void initializeBrowser() {
        if (new File(storagePath).length() > 2) {
            restorePreviousTabs();
        }
    }

    // MODIFIES: this
    // EFFECTS: prompts the user to restore their previous tabs
    private void restorePreviousTabs() {
        int answer = JOptionPane.showOptionDialog(
                this, "Would you like to restore your previous tabs?", "apus",
                JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
                null, new String[]{"Yes", "No"}, "Yes");
        if (answer == 0) {
            try {
                JSONArray state = JsonUtils.readFromFile(storagePath);
                for (int i = 0; i < state.length(); i++) {
                    this.browserBar.addTab((String) state.get(i));
                    this.state.addTab((String) state.get(i));
                }
            } catch (Exception e) {
                System.out.println("Restoring state from disk failed with " + e.toString());
            }
        }
    }

    // EFFECTS: prompts the user to save their current tabs before closing
    private void saveCurrentTabs() {
        int answer = JOptionPane.showOptionDialog(
                this, "Would you like to save your current tabs?", "apus",
                JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
                null, new String[]{"Yes", "No"}, "Yes");
        if (answer == 0) {
            JsonUtils.writeToFile(new JSONArray(state.getTabs()), storagePath);
        } else {
            JsonUtils.writeToFile(new JSONArray(), storagePath);
        }
    }

    public BrowserState getBrowserState() {
        return this.state;
    }
}