Exit program when running external application.
[instantlauncher.git] / src / main / java / eu / svjatoslav / instantlauncher / menu / MultiLevelMenu.java
index a10dabe..0134ce4 100755 (executable)
 package eu.svjatoslav.instantlauncher.menu;
 
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Dimension;
+import eu.svjatoslav.instantlauncher.InstantLauncher;
+import eu.svjatoslav.instantlauncher.Utils;
+
+import javax.swing.*;
+import java.awt.*;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JPanel;
-
-import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
-import eu.svjatoslav.instantlauncher.FileAssociationManager;
-import eu.svjatoslav.instantlauncher.InstantLauncher;
-import eu.svjatoslav.instantlauncher.Utils;
+import static eu.svjatoslav.instantlauncher.Utils.executeCommand;
 
 public class MultiLevelMenu implements MenuListener {
 
-       private final InstantLauncher instantLauncher;
-
-       private static final int VERTICAL_MENUS_COUNT = 7;
-
-       public static final Dimension CONTENT_PANEL_SIZE = new Dimension(1024, 900);
-
-       ArrayList<Menu> menus = new ArrayList<Menu>();
+    private static final int VERTICAL_MENUS_COUNT = 7;
+    private static final Dimension CONTENT_PANEL_SIZE = new Dimension(1024, 900);
+    private final InstantLauncher instantLauncher;
+    private final ArrayList<Menu> menus = new ArrayList<>();
+
+    private final ArrayList<JPanel> panels = new ArrayList<>();
+    private JPanel contentPane;
+
+    public MultiLevelMenu(final InstantLauncher instantLauncher) {
+        this.instantLauncher = instantLauncher;
+    }
+
+    /**
+     * Adds new vertical menu.
+     *
+     * @return <code>true</code> if operation succeeded, or <code>false</code>
+     * if there was not enough space left for a new menu.
+     */
+    private boolean addMenu(final File directory) {
+        final int newMenuHorizontalIndex = menus.size();
+
+        if (newMenuHorizontalIndex >= VERTICAL_MENUS_COUNT) {
+            return false;
+        }
+
+        final Menu menu = new Menu(directory);
+        menu.addMenuListener(this);
+
+        final JPanel placeholderPanel = panels.get(newMenuHorizontalIndex);
+        final JPanel menuPanel = menu.getMenuPanel();
+        placeholderPanel.add(menuPanel, BorderLayout.CENTER);
+
+        menus.add(menu);
+        return true;
+    }
+
+    public JPanel buildContentPanel() {
+
+        contentPane = new JPanel();
+        contentPane.setBackground(Color.BLACK);
+        contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
+        Utils.setComponentSize(contentPane, CONTENT_PANEL_SIZE);
+
+        // initialize panels
+        for (int i = 0; i < VERTICAL_MENUS_COUNT; i++) {
+            contentPane.add(Box.createHorizontalStrut(10));
+
+            final JPanel panel = new JPanel(new BorderLayout());
+            panel.setBackground(Color.BLACK);
+
+            Utils.setComponentSize(panel, Menu.SIZE_MENU_PANEL);
+
+            panels.add(panel);
+            contentPane.add(panel);
+        }
+
+        final File directory = instantLauncher.configurationManager.getConfiguration().getNavigationRootDirectory();
+        addMenu(directory);
+
+        return contentPane;
+    }
+
+    private int getMenuIndex(final Menu menu) {
+        int i = 0;
+        for (final Menu m : menus) {
+            if (m == menu) {
+                return i;
+            }
+            i++;
+        }
+        return -1;
+    }
+
+    @Override
+    public void menuItemHighlighted(final Menu menu, final File chosenFile) {
+
+        if (chosenFile.isDirectory()) {
+            final int menuIndex = getMenuIndex(menu);
+
+            if (menuIndex >= 0) {
+                removeMenus(menuIndex + 1);
+                if (addMenu(chosenFile)) {
+                    contentPane.validate();
+                    contentPane.repaint();
+                }
+            }
+        }
+
+    }
+
+    @Override
+    public void menuItemSelected(final File chosenFile) {
+        if (chosenFile.isFile()) {
+            if (chosenFile.canExecute()) {
+                executeCommand(chosenFile.getAbsolutePath());
+                InstantLauncher.exitProgram();
+            } else {
+                boolean fileOpened;
+                try {
+                    fileOpened = instantLauncher.openFile(chosenFile.getCanonicalFile());
+                    if (fileOpened)
+                        InstantLauncher.exitProgram();
+
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        if (chosenFile.isDirectory()) {
+            try {
+                instantLauncher.openDirectory(chosenFile.getCanonicalFile());
+                InstantLauncher.exitProgram();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    public void menuItemSelectedAlternative(final File chosenFile) {
+        if (chosenFile.isFile())
+            chosenFile.setExecutable(!chosenFile.canExecute());
+        else {
+            instantLauncher.openDirectoryInTerminal(chosenFile);
+            InstantLauncher.exitProgram();
+        }
+    }
+
+    private void removeMenus(final int fromIndex) {
+
+        for (int i = fromIndex; i < menus.size(); i++) {
+            final JPanel jPanel = panels.get(i);
+            jPanel.removeAll();
+        }
+
+        while (menus.size() > fromIndex) {
+            menus.remove(fromIndex);
+        }
+    }
+
+    @Override
+    public void menuItemSelectedAlternative2(File chosenFile) {
+        // TODO: define some middle mouse click functions
+    }
 
-       ArrayList<JPanel> panels = new ArrayList<JPanel>();
-       JPanel contentPane;
-
-       public MultiLevelMenu(final InstantLauncher instantLauncher) {
-               this.instantLauncher = instantLauncher;
-       }
-
-       /**
-        * Adds new vertical menu.
-        * 
-        * @return <code>true</code> if operation succeeded, or <code>false</code>
-        *         if there was not enough space left for a new menu.
-        */
-       public boolean addMenu(final File directory) {
-               final int newMenuHorizontalIndex = menus.size();
-
-               if (newMenuHorizontalIndex >= VERTICAL_MENUS_COUNT)
-                       return false;
-
-               final Menu menu = new Menu(directory);
-               menu.addMenuListener(this);
-
-               final JPanel placeholderPanel = panels.get(newMenuHorizontalIndex);
-               final JPanel menuPanel = menu.getMenuPanel();
-               placeholderPanel.add(menuPanel, BorderLayout.CENTER);
-
-               menus.add(menu);
-               return true;
-       }
-
-       public JPanel buildContentPanel() {
-
-               contentPane = new JPanel();
-               contentPane.setBackground(Color.BLACK);
-               contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
-               Utils.setComponentSize(contentPane, CONTENT_PANEL_SIZE);
-
-               // initialize panels
-               for (int i = 0; i < VERTICAL_MENUS_COUNT; i++) {
-                       contentPane.add(Box.createHorizontalStrut(10));
-
-                       final JPanel panel = new JPanel(new BorderLayout());
-                       panel.setBackground(Color.BLACK);
-
-                       Utils.setComponentSize(panel, Menu.SIZE_MENU_PANEL);
-
-                       panels.add(panel);
-                       contentPane.add(panel);
-               }
-
-               final File directory = instantLauncher.configuration.getRootDirectory();
-               addMenu(directory);
-
-               return contentPane;
-       }
-
-       public int getMenuIndex(final Menu menu) {
-               int i = 0;
-               for (final Menu m : menus) {
-                       if (m == menu)
-                               return i;
-                       i++;
-               }
-               return -1;
-       }
-
-       @Override
-       public void menuItemHighlighted(final Menu menu, final File chosenFile) {
-
-               if (chosenFile.isDirectory()) {
-                       final int menuIndex = getMenuIndex(menu);
-
-                       if (menuIndex >= 0) {
-                               removeMenus(menuIndex + 1);
-                               if (addMenu(chosenFile)) {
-                                       contentPane.validate();
-                                       contentPane.repaint();
-                               }
-                       }
-               }
-
-       }
-
-       @Override
-       public void menuItemSelected(final Menu menu, final File chosenFile) {
-               if (chosenFile.isFile())
-                       if (chosenFile.canExecute())
-                               executeCommand(chosenFile.getAbsolutePath());
-                       else {
-                               final boolean fileOpened = FileAssociationManager.openFile(chosenFile);
-                               if (fileOpened)
-                                       InstantLauncher.exitProgram();
-                       }
-
-               if (chosenFile.isDirectory()) {
-                       executeCommand("nautilus", "-n", chosenFile.getAbsolutePath());
-               }
-       }
-
-       private void executeCommand(String... c) {
-               try {
-                       Runtime.getRuntime().exec(c);
-                       InstantLauncher.exitProgram();
-
-               } catch (final IOException e) {
-                       new ExceptionDialog(e);
-               }
-       }
-
-       @Override
-       public void menuItemSelectedAlternative(final Menu menu, final File chosenFile) {
-               if (chosenFile.isFile())
-                       chosenFile.setExecutable(!chosenFile.canExecute());
-               else {
-                       executeCommand("gnome-terminal", "--working-directory=" + chosenFile.getAbsolutePath());
-               }
-       }
-
-       public void removeMenus(final int fromIndex) {
-
-               for (int i = fromIndex; i < menus.size(); i++) {
-                       final JPanel jPanel = panels.get(i);
-                       jPanel.removeAll();
-               }
-
-               while (menus.size() > fromIndex)
-                       menus.remove(fromIndex);
-       }
-
-       @Override
-       public void menuItemSelectedAlternative2(Menu menu, File chosenFile) {
-               if (chosenFile.isFile()) {
-                       executeCommand("emacs", chosenFile.getAbsolutePath());
-               }
-       }
 
 }