package ui.newgui;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import ui.EditorWindow;
import ui.SettingsGUI;
import ui.SourceFile;
import ui.ThemeManager;
public class MainWindow extends JFrame {
// private static String defaultExpression = "let rec f = lambda x. if x = 0
// then 1 else x * f (x - 1) in f 3";
// private static String defaultExpression = "let rec fact = lambda x. if x = 0 then 1 else x * fact (x - 1) in fact 4";
private static String defaultExpression = "let f = ref (lambda x.x) in f := (lambda x.if x = 0 then 1 else x * ! f (x - 1)); ! f 3";
// private static String defaultExpression = "";
private JMenu fileMenu;
private JMenu editMenu;
private JMenu runMenu;
private ActionListener menulistener;
private JToolBar mainToolbar;
private JTabbedPane tabbedPane;
private EditorWindow selectedEditor;
private PropertyChangeListener editorlistener;
public MainWindow() {
super();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
MainWindow.this.handleExit();
};
});
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setTitle("Projektgruppe v.01");
editorlistener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
try {
if (evt.getPropertyName().equals("name")) {
tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(),
(String) evt.getNewValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
initComponents();
pack();
setSize(640, 480);
}
private void initComponents() {
initMainMenu();
initToolbar();
initTabbedPane();
initDefaultFile();
}
private void initMainMenu() {
menulistener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "New")
handleNew();
else if (e.getActionCommand() == "Open")
handleOpen();
else if (e.getActionCommand() == "Close")
handleClose();
else if (e.getActionCommand() == "Preferences")
handlePreferences();
else if (e.getActionCommand() == "Quit")
handleExit();
}
};
JMenuBar mainMenu = new JMenuBar();
fileMenu = new JMenu("File");
fileMenu.setMnemonic(KeyEvent.VK_F);
mainMenu.add(fileMenu);
editMenu = new JMenu("Edit");
editMenu.setMnemonic(KeyEvent.VK_E);
mainMenu.add(editMenu);
runMenu = new JMenu("Run");
runMenu.setMnemonic(KeyEvent.VK_R);
mainMenu.add(runMenu);
setJMenuBar(mainMenu);
this.setLayout(new BorderLayout());
}
private void initToolbar() {
mainToolbar = new JToolBar("MainMenu");
add(mainToolbar, BorderLayout.NORTH);
}
private void initTabbedPane() {
tabbedPane = new JTabbedPane();
add(tabbedPane, BorderLayout.CENTER);
tabbedPane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0) {
selectedEditor = (EditorWindow) tabbedPane
.getSelectedComponent();
updateActions();
}
});
}
private void initDefaultFile() {
SourceFile newFile = new SourceFile();
EditorWindow tmp = new EditorWindow(newFile, this);
try {
newFile.getDocument().insertString(0, defaultExpression, null);
} catch (Exception e) {
}
tmp.addPropertyChangeListener(editorlistener);
tabbedPane.addTab(tmp.getTitle(), tmp);
}
private void initDefaultActions() {
JMenuItem newItem = fileMenu.add("New");
newItem.addActionListener(menulistener);
newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
KeyEvent.CTRL_MASK));
newItem.setMnemonic(KeyEvent.VK_N);
JMenuItem openItem = fileMenu.add("Open");
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
KeyEvent.CTRL_MASK));
openItem.setMnemonic(KeyEvent.VK_O);
openItem.addActionListener(menulistener);
if (selectedEditor != null) {
JMenuItem closeItem = fileMenu.add("Close");
closeItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,
KeyEvent.CTRL_MASK));
closeItem.setMnemonic(KeyEvent.VK_C);
closeItem.addActionListener(menulistener);
}
fileMenu.addSeparator();
JButton open = new JButton(new ImageIcon(EditorWindow.class
.getResource("icons/open.png")));
open.setToolTipText("Open");
JButton newb = new JButton(new ImageIcon(EditorWindow.class
.getResource("icons/new.png")));
newb.setToolTipText("New");
open.addActionListener(menulistener);
newb.addActionListener(menulistener);
open.setActionCommand("Open");
newb.setActionCommand("New");
mainToolbar.add(newb);
mainToolbar.add(open);
}
private void handleNew() {
SourceFile newFile = new SourceFile();
EditorWindow newItem = new EditorWindow(newFile, this);
try {
newFile.getDocument().insertString(0, defaultExpression, null);
} catch (Exception e) {
}
newItem.addPropertyChangeListener(editorlistener);
tabbedPane.addTab(newItem.getTitle(), newItem);
tabbedPane.setSelectedComponent(newItem);
}
private void handleOpen() {
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(this);
File infile = chooser.getSelectedFile();
StringBuffer buffer = new StringBuffer();
try {
FileInputStream in = new FileInputStream(infile);
int onechar;
while ((onechar = in.read()) != -1)
buffer.append((char) onechar);
SourceFile newFile = new SourceFile();
newFile.setName(infile.getName());
newFile.getDocument().insertString(0, buffer.toString(), null);
EditorWindow newItem = new EditorWindow(newFile, this);
newItem.addPropertyChangeListener(editorlistener);
tabbedPane.addTab(newItem.getTitle(), newItem);
tabbedPane.setSelectedComponent(newItem);
newItem.setSystemfile(infile);
} catch (Exception e) { // TODO; Add Handling!!
System.out.println("Error while Loading File!");
}
}
/**
*
* @return true if Close was cancelled.
*/
private boolean handleClose() {
if (selectedEditor != null) {
if (selectedEditor.isModified()) {
// Custom button text
Object[] options = { "Yes", "No", "Cancel" };
int n = JOptionPane
.showOptionDialog(
this,
selectedEditor.getFile().getFilename()
+ " contains unsaved changes. Do you want to save?",
"Save File", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, options,
options[2]);
if (n == 0) {
if (selectedEditor.handleSave()) {
tabbedPane.remove(tabbedPane.getSelectedIndex());
selectedEditor = (EditorWindow) tabbedPane
.getSelectedComponent();
this.repaint();
}
} else if (n == 1) {
tabbedPane.remove(tabbedPane.getSelectedIndex());
selectedEditor = (EditorWindow) tabbedPane
.getSelectedComponent();
this.repaint();
return false;
} else if (n == 2) {
return true;
}
} else {
tabbedPane.remove(tabbedPane.getSelectedIndex());
selectedEditor = (EditorWindow) tabbedPane
.getSelectedComponent();
this.repaint();
}
}
return false;
}
private void updateActions() {
fileMenu.removeAll();
editMenu.removeAll();
runMenu.removeAll();
mainToolbar.removeAll();
initDefaultActions();
if (selectedEditor != null) {
addActions(selectedEditor.getFileActions(), fileMenu);
addActions(selectedEditor.getToolbarActions(), mainToolbar);
addActions(selectedEditor.getRunActions(), runMenu);
addActions(selectedEditor.getEditActions(), editMenu);
}
closeFileMenu();
closeEditMenu();
}
private void handleExit() {
while (selectedEditor != null) {
if (handleClose()) return;
}
System.exit(0);
}
private void handlePreferences() {
SettingsGUI gui = new SettingsGUI(this, false);
gui.setVisible(true);
}
private void addActions(List<EditorAction> list, JComponent component) {
List<EditorAction> actionlist = list;
for (int i = 0; i < actionlist.size(); i++) {
final EditorAction action = actionlist.get(i);
if (component instanceof JMenu) {
final JMenuItem tmpmenu = new JMenuItem(action.getTitle());
tmpmenu.addActionListener(action.getActionListener());
tmpmenu.setEnabled(action.isEnabled());
tmpmenu.setAccelerator(KeyStroke.getKeyStroke(action
.getAccelKey(), action.getAccelModifiers()));
component.add(tmpmenu);
action.addPropertyChangeListener("enabled",
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
tmpmenu.setEnabled(action.isEnabled());
}
});
} else {
final JButton tmptoolbar;
if (action.getIcon() == null) {
tmptoolbar = new JButton(action.getTitle());
} else {
tmptoolbar = new JButton(action.getIcon());
tmptoolbar.setToolTipText(action.getTitle());
}
component.add(tmptoolbar);
tmptoolbar.addActionListener(action.getActionListener());
tmptoolbar.setEnabled(action.isEnabled());
action.addPropertyChangeListener("enabled",
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
tmptoolbar.setEnabled(action.isEnabled());
}
});
}
}
}
private void closeEditMenu() {
editMenu.addSeparator();
JMenuItem preferences = editMenu.add("Preferences");
preferences.addActionListener(menulistener);
preferences.setMnemonic(KeyEvent.VK_P);
}
private void closeFileMenu() {
fileMenu.addSeparator();
JMenuItem exitItem = fileMenu.add("Quit");
exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
KeyEvent.CTRL_MASK));
exitItem.addActionListener(menulistener);
exitItem.setMnemonic(KeyEvent.VK_Q);
}
/**
* @param args
*/
public static void main(String[] args) {
ThemeManager.get();
MainWindow mw = new MainWindow();
mw.paintAll(mw.getGraphics());
mw.setVisible(true);
}
}