Possibility to configure terminal emulator.
[instantlauncher.git] / src / main / java / eu / svjatoslav / instantlauncher / menu / Menu.java
index 916f8ef..252abbf 100755 (executable)
 package eu.svjatoslav.instantlauncher.menu;
 
-import java.awt.Color;
-import java.awt.Dimension;
+import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
+import eu.svjatoslav.instantlauncher.Utils;
+
+import javax.swing.*;
+import javax.swing.border.EmptyBorder;
+import java.awt.*;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.io.File;
 import java.util.Arrays;
-import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Set;
 
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JPanel;
-import javax.swing.SwingConstants;
-import javax.swing.border.EmptyBorder;
-
-import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
-import eu.svjatoslav.instantlauncher.Utils;
-
-public class Menu {
-
-       public static class ButtonMouseListener implements MouseListener {
-
-               JButton parentButton;
-               Menu parentMenu;
-               File file;
-
-               public ButtonMouseListener(final JButton button, final Menu parentMenu, final File file) {
-                       parentButton = button;
-                       this.parentMenu = parentMenu;
-                       this.file = file;
-               }
-
-               @Override
-               public void mouseClicked(final MouseEvent e) {
-                       try {
-
-                               if (e.getButton() == 1)
-                                       parentMenu.menuItemSelected(file);
-                               if (e.getButton() == 2)
-                                       parentMenu.menuItemSelectedAlternative2(file);
-                               if (e.getButton() == 3)
-                                       parentMenu.menuItemSelectedAlternative(file);
-                       } catch (final Exception ex) {
-                               new ExceptionDialog(ex);
-                       }
-               }
-
-               @Override
-               public void mouseEntered(final MouseEvent e) {
-                       try {
-                               if (parentButton != parentMenu.getSelectedButton()) {
-
-                                       if (parentMenu.getSelectedButton() != null)
-                                               parentMenu.getSelectedButton().setBackground(getFileColor(parentMenu.getSelectedFile(), false));
-
-                                       parentMenu.setSelected(parentButton, file);
-                                       parentButton.setBackground(getFileColor(file, true));
-
-                                       parentMenu.menuItemHighlighted(file);
-                               }
-                       } catch (final Exception ex) {
-                               new ExceptionDialog(ex);
-                       }
-               }
-
-               @Override
-               public void mouseExited(final MouseEvent e) {
-               }
-
-               @Override
-               public void mousePressed(final MouseEvent e) {
-               }
-
-               @Override
-               public void mouseReleased(final MouseEvent e) {
-               }
-
-       }
-
-       public static final Color BUTTON_BG_DIRECTORY = new Color(0, 0, 60);
-
-       public static final Color BUTTON_BG_DIRECTORY_SELECTED = new Color(0, 0, 100);
-       public static final Color BUTTON_BG_LINK = new Color(60, 60, 0);
-
-       public static final Color BUTTON_BG_LINK_SELECTED = new Color(100, 100, 0);
-       public static final Color BUTTON_BG_EXECUTABLE_FILE = new Color(60, 0, 0);
-
-       public static final Color BUTTON_BG_EXECUTABLE_FILE_SELECTED = new Color(100, 0, 0);
-       public static final Color BUTTON_BG_NONEXECUTABLE_FILE = new Color(0, 60, 0);
-
-       public static final Color BUTTON_BG_NONEXECUTABLE_FILE_SELECTED = new Color(0, 100, 0);
-       public static final Dimension SIZE_BUTTON = new Dimension(200, 30);
-
-       public static final Dimension SIZE_MENU_PANEL = new Dimension(210, 900);
-
-       /**
-        * <pre>
-        * Assign specific colors to:
-        *    Directory
-        *    Executable file
-        *    Non executable file
-        * </pre>
-        */
-       public static Color getFileColor(final File file, final boolean selected) {
-               if (file.isDirectory())
-                       if (selected)
-                               return BUTTON_BG_DIRECTORY_SELECTED;
-                       else
-                               return BUTTON_BG_DIRECTORY;
-
-               if (file.isFile())
-                       if (file.canExecute()) {
-                               if (selected)
-                                       return BUTTON_BG_EXECUTABLE_FILE_SELECTED;
-                               else
-                                       return BUTTON_BG_EXECUTABLE_FILE;
-                       } else if (selected)
-                               return BUTTON_BG_NONEXECUTABLE_FILE_SELECTED;
-                       else
-                               return BUTTON_BG_NONEXECUTABLE_FILE;
-
-               if (selected)
-                       return BUTTON_BG_LINK_SELECTED;
-               else
-                       return BUTTON_BG_LINK;
-       }
-
-       private JPanel menuPanel;
-
-       public JButton selectedButton;
-
-       public File selectedFile;;
-
-       private final Set<MenuListener> menuListeners = new HashSet<MenuListener>();
-
-       public Menu(final File directory) {
-               buildContentPanel(directory);
-       }
-
-       public void addMenuListener(final MenuListener menuListener) {
-               menuListeners.add(menuListener);
-       }
-
-       public JButton buildButton(final File file) {
-               JButton button;
-               if (file.isDirectory())
-                       button = new JButton("[ " + file.getName() + " ]");
-               else
-                       button = new JButton(file.getName());
-
-               button.setBackground(getFileColor(file, false));
-               button.setForeground(new Color(255, 255, 255));
-
-               button.setBorder(new EmptyBorder(5, 10, 5, 10));
-
-               final Menu.ButtonMouseListener mouseListener = new ButtonMouseListener(button, this, file);
-               button.addMouseListener(mouseListener);
-
-               button.setHorizontalTextPosition(SwingConstants.CENTER);
-
-               // set button size
-               Utils.setComponentSize(button, SIZE_BUTTON);
-
-               return button;
-       }
-
-       private void buildContentPanel(final File directory) {
-               menuPanel = new JPanel();
-
-               Utils.setComponentSize(menuPanel, SIZE_MENU_PANEL);
-
-               final BoxLayout layout = new BoxLayout(menuPanel, BoxLayout.Y_AXIS);
-               menuPanel.setLayout(layout);
-               menuPanel.setBackground(Color.BLACK);
-
-               final File[] listFiles = directory.listFiles();
-
-               // Sort files by name
-               Arrays.sort(listFiles, new Comparator<File>() {
-                       @Override
-                       public int compare(final File f1, final File f2) {
-
-                               // directories come before files
-                               if (f1.isFile() && f2.isDirectory())
-                                       return 1;
-                               if (f2.isFile() && f1.isDirectory())
-                                       return -1;
-
-                               // order by file name
-                               return f1.getName().toUpperCase().compareTo(f2.getName().toUpperCase());
-                       }
-               });
-
-               // add files to the panel
-               for (final File file : listFiles)
-                       // ignore hidden files
-                       if (!file.getName().startsWith(".")) {
-                               menuPanel.add(Box.createVerticalStrut(10));
-                               menuPanel.add(buildButton(file));
-                       }
-       }
-
-       public JPanel getMenuPanel() {
-               return menuPanel;
-       }
-
-       public JButton getSelectedButton() {
-               return selectedButton;
-       }
-
-       public File getSelectedFile() {
-               return selectedFile;
-       }
-
-       public void menuItemHighlighted(final File chosenFile) {
-               for (final MenuListener menuListener : menuListeners)
-                       menuListener.menuItemHighlighted(this, chosenFile);
-       }
-
-       public void menuItemSelected(final File chosenFile) {
-               for (final MenuListener menuListener : menuListeners)
-                       menuListener.menuItemSelected(this, chosenFile);
-       }
-
-       public void menuItemSelectedAlternative(final File chosenFile) {
-               for (final MenuListener menuListener : menuListeners)
-                       menuListener.menuItemSelectedAlternative(this, chosenFile);
-       }
-
-       public void menuItemSelectedAlternative2(final File chosenFile) {
-               for (final MenuListener menuListener : menuListeners)
-                       menuListener.menuItemSelectedAlternative2(this, chosenFile);
-       }
-
-       public void setSelected(final JButton selectedButton, final File selectedFile) {
-               this.selectedButton = selectedButton;
-               this.selectedFile = selectedFile;
-       }
+class Menu {
+
+    public static final Dimension SIZE_MENU_PANEL = new Dimension(210, 900);
+    private static final Color BUTTON_BG_DIRECTORY = new Color(0, 0, 60);
+
+    private static final Color BUTTON_BG_DIRECTORY_SELECTED = new Color(0, 0, 100);
+    private static final Color BUTTON_BG_LINK = new Color(60, 60, 0);
+
+    private static final Color BUTTON_BG_LINK_SELECTED = new Color(100, 100, 0);
+    private static final Color BUTTON_BG_EXECUTABLE_FILE = new Color(60, 0, 0);
+
+    private static final Color BUTTON_BG_EXECUTABLE_FILE_SELECTED = new Color(100, 0, 0);
+    private static final Color BUTTON_BG_NONEXECUTABLE_FILE = new Color(0, 60, 0);
+
+    private static final Color BUTTON_BG_NONEXECUTABLE_FILE_SELECTED = new Color(0, 100, 0);
+    private static final Dimension SIZE_BUTTON = new Dimension(200, 30);
+    private final Set<MenuListener> menuListeners = new HashSet<>();
+    private JPanel menuPanel;
+    private JButton selectedButton;
+    private File selectedFile;
+
+    public Menu(final File directory) {
+        buildContentPanel(directory);
+    }
+
+    /**
+     * <pre>
+     * Assign specific colors to:
+     *    Directory
+     *    Executable file
+     *    Non executable file
+     * </pre>
+     */
+    private static Color getFileColor(final File file, final boolean selected) {
+        if (file.isDirectory())
+            if (selected)
+                return BUTTON_BG_DIRECTORY_SELECTED;
+            else
+                return BUTTON_BG_DIRECTORY;
+
+        if (file.isFile())
+            if (file.canExecute()) {
+                if (selected)
+                    return BUTTON_BG_EXECUTABLE_FILE_SELECTED;
+                else
+                    return BUTTON_BG_EXECUTABLE_FILE;
+            } else if (selected)
+                return BUTTON_BG_NONEXECUTABLE_FILE_SELECTED;
+            else
+                return BUTTON_BG_NONEXECUTABLE_FILE;
+
+        if (selected)
+            return BUTTON_BG_LINK_SELECTED;
+        else
+            return BUTTON_BG_LINK;
+    }
+
+    public void addMenuListener(final MenuListener menuListener) {
+        menuListeners.add(menuListener);
+    }
+
+    private JButton buildButton(final File file) {
+        JButton button;
+        if (file.isDirectory())
+            button = new JButton("[ " + file.getName() + " ]");
+        else
+            button = new JButton(file.getName());
+
+        button.setBackground(getFileColor(file, false));
+        button.setForeground(new Color(255, 255, 255));
+
+        button.setBorder(new EmptyBorder(5, 10, 5, 10));
+
+        final Menu.ButtonMouseListener mouseListener = new ButtonMouseListener(button, this, file);
+        button.addMouseListener(mouseListener);
+
+        button.setHorizontalTextPosition(SwingConstants.CENTER);
+
+        // set button size
+        Utils.setComponentSize(button, SIZE_BUTTON);
+
+        return button;
+    }
+
+    private void buildContentPanel(final File directory) {
+        menuPanel = new JPanel();
+
+        Utils.setComponentSize(menuPanel, SIZE_MENU_PANEL);
+
+        final BoxLayout layout = new BoxLayout(menuPanel, BoxLayout.Y_AXIS);
+        menuPanel.setLayout(layout);
+        menuPanel.setBackground(Color.BLACK);
+
+        final File[] listFiles = directory.listFiles();
+
+        // Sort files by name
+        Arrays.sort(listFiles, (f1, f2) -> {
+
+            // directories come before files
+            if (f1.isFile() && f2.isDirectory())
+                return 1;
+            if (f2.isFile() && f1.isDirectory())
+                return -1;
+
+            // order by file name
+            return f1.getName().toUpperCase().compareTo(f2.getName().toUpperCase());
+        });
+
+        // add files to the panel
+        for (final File file : listFiles)
+            // ignore hidden files
+            if (!file.getName().startsWith(".")) {
+                menuPanel.add(Box.createVerticalStrut(10));
+                menuPanel.add(buildButton(file));
+            }
+    }
+
+    public JPanel getMenuPanel() {
+        return menuPanel;
+    }
+
+    private JButton getSelectedButton() {
+        return selectedButton;
+    }
+
+    private File getSelectedFile() {
+        return selectedFile;
+    }
+
+    private void menuItemHighlighted(final File chosenFile) {
+        for (final MenuListener menuListener : menuListeners)
+            menuListener.menuItemHighlighted(this, chosenFile);
+    }
+
+    private void menuItemSelected(final File chosenFile) {
+        for (final MenuListener menuListener : menuListeners)
+            menuListener.menuItemSelected(chosenFile);
+    }
+
+    private void menuItemSelectedAlternative(final File chosenFile) {
+        for (final MenuListener menuListener : menuListeners)
+            menuListener.menuItemSelectedAlternative(chosenFile);
+    }
+
+    private void menuItemSelectedAlternative2(final File chosenFile) {
+        for (final MenuListener menuListener : menuListeners)
+            menuListener.menuItemSelectedAlternative2(chosenFile);
+    }
+
+    private void setSelected(final JButton selectedButton, final File selectedFile) {
+        this.selectedButton = selectedButton;
+        this.selectedFile = selectedFile;
+    }
+
+    public static class ButtonMouseListener implements MouseListener {
+
+        final JButton parentButton;
+        final Menu parentMenu;
+        final File file;
+
+        public ButtonMouseListener(final JButton button, final Menu parentMenu, final File file) {
+            parentButton = button;
+            this.parentMenu = parentMenu;
+            this.file = file;
+        }
+
+        @Override
+        public void mouseClicked(final MouseEvent e) {
+            try {
+
+                if (e.getButton() == 1) // left mouse click
+                    parentMenu.menuItemSelected(file);
+                if (e.getButton() == 2) // middle mouse click
+                    parentMenu.menuItemSelectedAlternative2(file);
+                if (e.getButton() == 3) //right mouse click
+                    parentMenu.menuItemSelectedAlternative(file);
+            } catch (final Exception ex) {
+                new ExceptionDialog(ex);
+            }
+        }
+
+        @Override
+        public void mouseEntered(final MouseEvent e) {
+            try {
+                if (parentButton != parentMenu.getSelectedButton()) {
+
+                    if (parentMenu.getSelectedButton() != null)
+                        parentMenu.getSelectedButton().setBackground(getFileColor(parentMenu.getSelectedFile(), false));
+
+                    parentMenu.setSelected(parentButton, file);
+                    parentButton.setBackground(getFileColor(file, true));
+
+                    parentMenu.menuItemHighlighted(file);
+                }
+            } catch (final Exception ex) {
+                new ExceptionDialog(ex);
+            }
+        }
+
+        @Override
+        public void mouseExited(final MouseEvent e) {
+        }
+
+        @Override
+        public void mousePressed(final MouseEvent e) {
+        }
+
+        @Override
+        public void mouseReleased(final MouseEvent e) {
+        }
+
+    }
 
 }
\ No newline at end of file