package apes.views; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Locale; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.border.LineBorder; import apes.controllers.ConfigController; import apes.controllers.HelpController; import apes.controllers.InternalFormatController; import apes.controllers.KeyBindingController; import apes.controllers.LanguageController; import apes.controllers.PlayerController; import apes.controllers.PluginController; import apes.controllers.TabsController; import apes.controllers.TagsController; import apes.lib.Language; import apes.models.Config; import apes.models.KeyBinding; import apes.models.Tabs; import apes.views.buttons.BackwardButton; import apes.views.buttons.CopyButton; import apes.views.buttons.CutButton; import apes.views.buttons.DeleteButton; import apes.views.buttons.ForwardButton; import apes.views.buttons.ImageButton; import apes.views.buttons.OpenButton; import apes.views.buttons.PasteButton; import apes.views.buttons.PauseButton; import apes.views.buttons.PlayButton; import apes.views.buttons.RedoButton; import apes.views.buttons.SaveButton; import apes.views.buttons.StopButton; import apes.views.buttons.UndoButton; import apes.views.buttons.ZoomInButton; import apes.views.buttons.ZoomOutButton; import apes.views.buttons.ZoomResetButton; import apes.views.buttons.ZoomSelectionButton; import apes.views.tabs.TabsView; /** * @author Johan Andersson (johandy@student.chalmers.se) */ public class ApplicationView extends JFrame { /** * Config model. */ private Config config; /** * Language model. */ private Language language; /** * Internal format controller. */ private InternalFormatController internalFormatController; /** * Tags controller. */ private TagsController tagsController; /** * Language controller. */ private LanguageController languageController; /** * Config controller. */ private ConfigController configController; /** * Plugin controller. */ private PluginController pluginController; /** * Help controller. */ private HelpController helpController; /** * Player controller. */ private PlayerController playerController; /** * Key binding controller. */ private KeyBindingController keyBindingController; /** * Creates a new <code>ApplicationView</code> instance. * * @param internalFormatController The internal format controller. * @param tagsController The tags controller. * @param languageController The language controller. * @param configController The configuration controller. * @param pluginController The plugin controller. * @param helpController The help controller. * @param playerController The player controller. * @param tabsController The tabs controller. * @param keyBindingController The key binding controller. */ public ApplicationView(InternalFormatController internalFormatController, TagsController tagsController, LanguageController languageController, ConfigController configController, PluginController pluginController, HelpController helpController, PlayerController playerController, TabsController tabsController, KeyBindingController keyBindingController) { this.config = Config.getInstance(); this.language = Language.getInstance(); KeyBinding.getInstance(); // Set controllers. this.internalFormatController = internalFormatController; this.tagsController = tagsController; this.languageController = languageController; this.configController = configController; this.pluginController = pluginController; this.helpController = helpController; this.playerController = playerController; this.keyBindingController = keyBindingController; // These should by default be white. String[] whites = { "Panel", "Label", "Slider", "Frame", "CheckBox", "TextField", "TextArea", "MenuBar", "Menu", "MenuItem" }; for(int i = 0; i < whites.length; i++) { UIManager.put(whites[i] + ".background", Color.WHITE); } // Set layout. setLayout(new BorderLayout()); // Initialize apes message. ApesMessage apesMessage = ApesMessage.getInstance(); JPanel wrapper = new JPanel(); wrapper.setLayout(new BorderLayout()); add(wrapper, BorderLayout.CENTER); // Add tab stuff. TabsView tabsView = new TabsView(tabsController); Tabs tabs = tabsController.getTabs(); tabs.addObserver(tabsView); tabs.setModel(tabsView.getModel()); wrapper.add(tabsView, BorderLayout.CENTER); wrapper.add(apesMessage, BorderLayout.SOUTH); // Set the menu. setJMenuBar(this.new Menu()); // Add top panel. add(this.new TopPanel(), BorderLayout.NORTH); // Add bottom panel. add(this.new BottomPanel(), BorderLayout.SOUTH); // Set window dimensions. setWindowDimensions(); // Set a title. setTitle(language.get("help.about.name")); // Exit on close. setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); // Set icon. setIconImage(Toolkit.getDefaultToolkit().createImage("images/apes.png")); // Start in center on screen. setLocationRelativeTo(null); // Make frame visible. setVisible(true); // Is runned when the program close button is pressed. addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if(config.getBooleanOption("close_confirmation")) { int status = JOptionPane.showConfirmDialog(null, language.get("exit.confirm.message"), language.get("exit.confirm.title"), JOptionPane.YES_NO_OPTION); if(status == JOptionPane.YES_OPTION) { System.exit(0); } } else { System.exit(0); } } }); } /** * Sets the dimensions for the window depending on the configuration file. */ private void setWindowDimensions() { pack(); boolean maximized = config.getBooleanOption("maximized"); // Do this even if maximized is set to true. This is because then // when the window gets restored, the preferred size is set. try { int width = config.getIntOption("frame_width"); int height = config.getIntOption("frame_height"); if(width > 0 && height > 0) { // Best do both JIC. setPreferredSize(new Dimension(width, height)); setSize(width, height); } } catch(NumberFormatException e) { e.printStackTrace(); } if(maximized) { setExtendedState(getExtendedState() | MAXIMIZED_BOTH); } } /** * The program menu. */ private class Menu extends JMenuBar { /** * Creates a new <code>Menu</code> instance. */ public Menu() { JMenu file = new ApesMenu("menu.head.file"); add(file); JMenuItem open = new ApesMenuItem("menu.file.open", "open"); open.addActionListener(internalFormatController); open.setName("open"); file.add(open); JMenuItem save = new ApesMenuItem("menu.file.save", "save"); save.addActionListener(internalFormatController); save.setName("save"); file.add(save); JMenuItem saveAs = new ApesMenuItem("menu.file.save_as", "save_as"); saveAs.addActionListener(internalFormatController); saveAs.setName("saveAs"); file.add(saveAs); JMenuItem export = new ApesMenuItem("menu.file.export", "export"); export.addActionListener(internalFormatController); export.setName("export"); file.add(export); JMenuItem quit = new ApesMenuItem("menu.file.quit", "quit"); // Exit program is this is clicked. quit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); file.add(quit); // File END // Edit START JMenu edit = new ApesMenu("menu.head.edit"); add(edit); JMenuItem undo = new ApesMenuItem("menu.edit.undo", "undo"); undo.addActionListener(internalFormatController); undo.setName("undo"); edit.add(undo); JMenuItem redo = new ApesMenuItem("menu.edit.redo", "redo"); redo.addActionListener(internalFormatController); redo.setName("redo"); edit.add(redo); JMenuItem cut = new ApesMenuItem("menu.edit.cut", "cut"); cut.addActionListener(internalFormatController); cut.setName("cut"); edit.add(cut); JMenuItem copy = new ApesMenuItem("menu.edit.copy", "copy"); copy.addActionListener(internalFormatController); copy.setName("copy"); edit.add(copy); JMenuItem paste = new ApesMenuItem("menu.edit.paste", "paste"); paste.addActionListener(internalFormatController); paste.setName("paste"); edit.add(paste); JMenuItem delete = new ApesMenuItem("menu.edit.delete", "delete"); delete.addActionListener(internalFormatController); delete.setName("delete"); edit.add(delete); JMenuItem tags = new ApesMenuItem("menu.edit.tags", "tags"); tags.addActionListener(tagsController); tags.setName("edit"); edit.add(tags); // Edit END // View START JMenu view = new ApesMenu("menu.head.view"); add(view); JMenu zoom = new ApesMenu("menu.head.zoom"); view.add(zoom); JMenuItem zoomIn = new ApesMenuItem("menu.view.zoom.in", "zoom_in"); zoomIn.addActionListener(internalFormatController); zoomIn.setName("zoomIn"); zoom.add(zoomIn); JMenuItem zoomOut = new ApesMenuItem("menu.view.zoom.out", "zoom_out"); zoomOut.addActionListener(internalFormatController); zoomOut.setName("zoomOut"); zoom.add(zoomOut); JMenuItem zoomSelection = new ApesMenuItem("menu.view.zoom.selection", "zoom_selection"); zoomSelection.addActionListener(internalFormatController); zoomSelection.setName("zoomSelection"); zoom.add(zoomSelection); JMenuItem zoomReset = new ApesMenuItem("menu.view.zoom.reset", "zoom_reset"); zoomReset.addActionListener(internalFormatController); zoomReset.setName("zoomReset"); zoom.add(zoomReset); JMenu languages = new ApesMenu("menu.view.languages"); view.add(languages); for(String lang : language.getLanguages()) { Locale locale = new Locale(lang); String tempName = locale.getDisplayName().replaceFirst("reg", ""); char[] chars = tempName.toCharArray(); chars[0] = Character.toUpperCase(chars[0]); String name = new String(chars); JMenuItem menuItem = new JMenuItem(name); menuItem.addActionListener(languageController); menuItem.setName(lang); languages.add(menuItem); } // View END // Player START JMenu player = new ApesMenu("menu.head.player"); add(player); JMenuItem play = new ApesMenuItem("menu.player.play", "play"); play.addActionListener(playerController); play.setName("play"); player.add(play); JMenuItem pause = new ApesMenuItem("menu.player.pause", "pause"); pause.addActionListener(playerController); pause.setName("pause"); player.add(pause); JMenuItem stop = new ApesMenuItem("menu.player.stop", "stop"); stop.addActionListener(playerController); stop.setName("stop"); player.add(stop); JMenuItem forward = new ApesMenuItem("menu.player.forward", "forward"); forward.addActionListener(playerController); forward.setName("forward"); player.add(forward); JMenuItem backward = new ApesMenuItem("menu.player.backward", "backward"); backward.addActionListener(playerController); backward.setName("backward"); player.add(backward); // Player END // Effects START JMenuItem effects = pluginController.getEffectMenu(); add(effects); // Effects END // Tools START JMenu tools = new ApesMenu("menu.head.tools"); add(tools); JMenuItem properties = new ApesMenuItem("menu.tools.properties", "properties"); properties.addActionListener(configController); properties.setName("show"); tools.add(properties); JMenuItem plugins = new ApesMenuItem("menu.tools.plugins", "plugins"); plugins.addActionListener(pluginController); plugins.setName("plugin"); tools.add(plugins); JMenuItem keyBindings = new ApesMenuItem("menu.tools.key_bindings", "key_bindings"); keyBindings.addActionListener(keyBindingController); keyBindings.setName("show"); tools.add(keyBindings); // Tools END // Help START JMenu help = new ApesMenu("menu.head.help"); add(help); JMenuItem manual = new ApesMenuItem("menu.help.manual"); help.add(manual); JMenuItem about = new ApesMenuItem("menu.help.about"); about.addActionListener(helpController); about.setName("about"); help.add(about); // Help END } } /** * The program top panel. */ private class TopPanel extends JPanel { /** * Creates a new <code>TopPanel</code> instance. */ public TopPanel() { setBorder(new LineBorder(Color.GRAY, 1, true)); ImageButton open = new OpenButton(); open.addActionListener(internalFormatController); open.setName("open"); add(open); ImageButton save = new SaveButton(); save.addActionListener(internalFormatController); save.setName("save"); add(save); ImageButton undo = new UndoButton(); undo.addActionListener(internalFormatController); undo.setName("undo"); add(undo); ImageButton redo = new RedoButton(); redo.addActionListener(internalFormatController); redo.setName("redo"); add(redo); ImageButton copy = new CopyButton(); copy.addActionListener(internalFormatController); copy.setName("copy"); add(copy); ImageButton cut = new CutButton(); cut.addActionListener(internalFormatController); cut.setName("cut"); add(cut); ImageButton paste = new PasteButton(); paste.addActionListener(internalFormatController); paste.setName("paste"); add(paste); ImageButton delete = new DeleteButton(); delete.addActionListener(internalFormatController); delete.setName("delete"); add(delete); ImageButton zoomIn = new ZoomInButton(); zoomIn.addActionListener(internalFormatController); zoomIn.setName("zoomIn"); add(zoomIn); ImageButton zoomOut = new ZoomOutButton(); zoomOut.addActionListener(internalFormatController); zoomOut.setName("zoomOut"); add(zoomOut); ImageButton zoomSelection = new ZoomSelectionButton(); zoomSelection.addActionListener(internalFormatController); zoomSelection.setName("zoomSelection"); add(zoomSelection); ImageButton zoomReset = new ZoomResetButton(); zoomReset.addActionListener(internalFormatController); zoomReset.setName("zoomReset"); add(zoomReset); } } /** * The program bottom panel. */ private class BottomPanel extends JPanel { /** * Creates a new <code>BottomPanel</code> instance. */ public BottomPanel() { setBorder(new LineBorder(Color.GRAY, 1, true)); ProgressView progressBar = ProgressView.getInstance(); add(progressBar); ImageButton backward = new BackwardButton(); backward.addActionListener(playerController); backward.setName("backward"); add(backward); ImageButton pause = new PauseButton(); pause.addActionListener(playerController); pause.setName("pause"); add(pause); ImageButton play = new PlayButton(); play.addActionListener(playerController); play.setName("play"); add(play); ImageButton stop = new StopButton(); stop.addActionListener(playerController); stop.setName("stop"); add(stop); ImageButton forward = new ForwardButton(); forward.addActionListener(playerController); forward.setName("forward"); add(forward); JPanel volumePanel = new VolumePanel(playerController); add(volumePanel); } } }