code cleanup
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Mon, 1 Aug 2016 19:43:34 +0000 (22:43 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Mon, 1 Aug 2016 19:43:34 +0000 (22:43 +0300)
14 files changed:
instantlauncher.iml
pom.xml
run.sh [deleted file]
src/main/java/eu/svjatoslav/instantlauncher/CommandlineHandler.java [deleted file]
src/main/java/eu/svjatoslav/instantlauncher/Configuration.java
src/main/java/eu/svjatoslav/instantlauncher/FileAssociationManager.java
src/main/java/eu/svjatoslav/instantlauncher/InstantLauncher.java
src/main/java/eu/svjatoslav/instantlauncher/Main.java
src/main/java/eu/svjatoslav/instantlauncher/MainFrame.java
src/main/java/eu/svjatoslav/instantlauncher/Utils.java
src/main/java/eu/svjatoslav/instantlauncher/menu/Menu.java
src/main/java/eu/svjatoslav/instantlauncher/menu/MenuListener.java
src/main/java/eu/svjatoslav/instantlauncher/menu/MultiLevelMenu.java
src/main/resources/log4j.xml

index 20c81c0..df9054d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
     <output url="file://$MODULE_DIR$/target/classes" />
     <output-test url="file://$MODULE_DIR$/target/test-classes" />
     <content url="file://$MODULE_DIR$">
@@ -10,7 +10,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" name="Maven: eu.svjatoslav:svjatoslavcommons:1.0" level="project" />
+    <orderEntry type="library" name="Maven: eu.svjatoslav:svjatoslavcommons:1.4" level="project" />
     <orderEntry type="library" name="Maven: log4j:log4j:1.2.16" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 96479f5..89ee842 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,7 @@
 <project
-    xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xmlns="http://maven.apache.org/POM/4.0.0"
+        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>eu.svjatoslav</groupId>
     <artifactId>instantlauncher</artifactId>
@@ -14,7 +14,7 @@
         <dependency>
             <groupId>eu.svjatoslav</groupId>
             <artifactId>svjatoslavcommons</artifactId>
-            <version>1.0</version>
+            <version>1.4</version>
         </dependency>
 
         <dependency>
@@ -31,8 +31,8 @@
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>2.3.1</version>
                 <configuration>
-                    <source>1.6</source>
-                    <target>1.6</target>
+                    <source>1.8</source>
+                    <target>1.8</target>
                     <optimize>true</optimize>
                     <encoding>UTF-8</encoding>
                 </configuration>
diff --git a/run.sh b/run.sh
deleted file mode 100755 (executable)
index 1726ba2..0000000
--- a/run.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-cd ~/workspace/instantlauncher
-
-# For faster subsequent startup we use offline mode
-mvn -o exec:java -Dexec.mainClass="eu.svjatoslav.instantlauncher.Main"
-
diff --git a/src/main/java/eu/svjatoslav/instantlauncher/CommandlineHandler.java b/src/main/java/eu/svjatoslav/instantlauncher/CommandlineHandler.java
deleted file mode 100755 (executable)
index 2b71669..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-package eu.svjatoslav.instantlauncher;
-
-import eu.svjatoslav.commons.commandline.parameterparser.Parameter;
-import eu.svjatoslav.commons.commandline.parameterparser.Parser;
-
-public class CommandlineHandler {
-
-    Parameter helpParameter = new Parameter("Show commandline optons help", "-h", "--help");
-    private final Parser parser;
-
-    public CommandlineHandler() {
-
-        parser = new Parser();
-        parser.addParameter(helpParameter);
-
-    }
-
-    public void parseCommandlineArguments(final String[] args) {
-
-        if (!parser.parse(args))
-            return;
-
-        if (helpParameter.isParameterSpecified()) {
-            parser.showHelp();
-            System.exit(0);
-        }
-    }
-}
index 28f2f82..94f9de2 100755 (executable)
@@ -2,7 +2,6 @@ package eu.svjatoslav.instantlauncher;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.Properties;
@@ -11,15 +10,15 @@ public class Configuration {
 
     private static final String KEY_ROOT_DIRECTORY = "KEY_ROOT_DIRECTORY";
     private static final String CONFIG_FILE_NAME = ".instantlauncher";
-    Properties properties = new Properties();
+    private final Properties properties = new Properties();
 
-    boolean propertiesChanged = false;
+    private boolean propertiesChanged = false;
 
-    public Configuration() throws FileNotFoundException, IOException {
+    public Configuration() throws IOException {
         initialize();
     }
 
-    public File getPropertiesFile() {
+    private File getPropertiesFile() {
         return new File(System.getProperty("user.home") + "/" + CONFIG_FILE_NAME);
     }
 
@@ -35,7 +34,7 @@ public class Configuration {
 
     }
 
-    public void initialize() throws FileNotFoundException, IOException {
+    private void initialize() throws IOException {
 
         loadIfFileExists();
 
@@ -46,7 +45,7 @@ public class Configuration {
         }
     }
 
-    public void loadIfFileExists() throws FileNotFoundException, IOException {
+    private void loadIfFileExists() throws IOException {
         final File propertiesFile = getPropertiesFile();
 
         if (propertiesFile.exists()) {
@@ -56,11 +55,11 @@ public class Configuration {
         }
     }
 
-    public void saveFile() throws FileNotFoundException, IOException {
+    private void saveFile() throws IOException {
         properties.store(new FileOutputStream(getPropertiesFile()), "Instantlauncher configuration file.");
     }
 
-    public void validatePropertiesFile() {
+    private void validatePropertiesFile() {
         getRootDirectory();
     }
 
index 51d900f..a4323ce 100755 (executable)
 package eu.svjatoslav.instantlauncher;
 
+import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
+
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
 
-import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
-
 public class FileAssociationManager {
 
-       private static final String FILE_INDICATOR = "<FILE>";
+    private static final String FILE_INDICATOR = "<FILE>";
 
-       private static final String[] TEXT_EDITOR_PATTERN = new String[] { "emc", FILE_INDICATOR };
+    private static final String[] TEXT_EDITOR_PATTERN = new String[]{"emc", FILE_INDICATOR};
 
-       private static final String DOCUMENT_EDITOR = "lowriter";
+    private static final String DOCUMENT_EDITOR = "lowriter";
 
-       private static final String SPREADSHEET_EDITOR = "localc";
+    private static final String SPREADSHEET_EDITOR = "localc";
 
-       private static final String MUSIC_PLAYER = "clementine";
+    private static final String MUSIC_PLAYER = "clementine";
 
-       public static HashMap<String, String[]> extensionToApplication = new HashMap<String, String[]>();
+    private static final HashMap<String, String[]> extensionToApplication = new HashMap<>();
 
-       private static boolean isLogFile(final String fileName) {
-               if (fileName.endsWith(".out"))
-                       return true;
-               if (fileName.endsWith(".log"))
-                       return true;
-               if (fileName.contains(".log."))
-                       return true;
+    public FileAssociationManager() {
 
-               return false;
-       }
+        extensionToApplication.put("txt", TEXT_EDITOR_PATTERN);
+        extensionToApplication.put("xml", TEXT_EDITOR_PATTERN);
+        extensionToApplication.put("org", TEXT_EDITOR_PATTERN);
+        extensionToApplication.put("properties", TEXT_EDITOR_PATTERN);
+        extensionToApplication.put("ini", TEXT_EDITOR_PATTERN);
+        extensionToApplication.put("", TEXT_EDITOR_PATTERN);
 
-       /**
-        * @return <code>true</code> if file was opened. <code>false</code> if
-        *         unknown file type.
-        */
-       public static boolean openFile(final File file) {
+        extensionToApplication.put("jpg", new String[]{"eog", FILE_INDICATOR});
+        extensionToApplication.put("jpeg", new String[]{"eog", FILE_INDICATOR});
+        extensionToApplication.put("png", new String[]{"eog", FILE_INDICATOR});
 
-               if (isLogFile(file.getName())) {
-                       runOpeningApplication(file, new String[] { "glogg", FILE_INDICATOR });
-                       return true;
-               }
+        extensionToApplication.put("pdf", new String[]{"evince", FILE_INDICATOR});
 
-               final String fileExtension = Utils.getFileExtension(file);
+        extensionToApplication.put("mp3", new String[]{"banshee", FILE_INDICATOR});
+        extensionToApplication.put("ogg", new String[]{"banshee", FILE_INDICATOR});
 
-               if (extensionToApplication.containsKey(fileExtension)) {
-                       final String[] commands = extensionToApplication.get(fileExtension);
-                       runOpeningApplication(file, commands);
-                       return true;
-               } else
-                       return false;
+        extensionToApplication.put("avi", new String[]{"vlc", FILE_INDICATOR});
+        extensionToApplication.put("mkv", new String[]{"vlc", FILE_INDICATOR});
+        extensionToApplication.put("ogv", new String[]{"vlc", FILE_INDICATOR});
+        extensionToApplication.put("mp4", new String[]{"vlc", FILE_INDICATOR});
+        extensionToApplication.put("flv", new String[]{"vlc", FILE_INDICATOR});
+        extensionToApplication.put("wmv", new String[]{"vlc", FILE_INDICATOR});
 
-       }
+        extensionToApplication.put("flac", new String[]{MUSIC_PLAYER, FILE_INDICATOR});
+        extensionToApplication.put("mp3", new String[]{MUSIC_PLAYER, FILE_INDICATOR});
+        extensionToApplication.put("ogg", new String[]{MUSIC_PLAYER, FILE_INDICATOR});
+        extensionToApplication.put("wav", new String[]{MUSIC_PLAYER, FILE_INDICATOR});
 
-       private static void runOpeningApplication(final File file, final String[] commands) {
-               for (int i = 0; i < commands.length; i++)
-                       if (commands[i].equals(FILE_INDICATOR))
-                               commands[i] = file.getAbsolutePath();
+        extensionToApplication.put("ods", new String[]{SPREADSHEET_EDITOR, FILE_INDICATOR});
+        extensionToApplication.put("xls", new String[]{SPREADSHEET_EDITOR, FILE_INDICATOR});
+        extensionToApplication.put("xlsx", new String[]{SPREADSHEET_EDITOR, FILE_INDICATOR});
 
-               try {
-                       Runtime.getRuntime().exec(commands);
-                       InstantLauncher.exitProgram();
+        extensionToApplication.put("docx", new String[]{DOCUMENT_EDITOR, FILE_INDICATOR});
+        extensionToApplication.put("doc", new String[]{DOCUMENT_EDITOR, FILE_INDICATOR});
 
-               } catch (final IOException e) {
-                       new ExceptionDialog(e);
-               }
-       }
+        extensionToApplication.put("desktop", new String[]{"run-desktop", FILE_INDICATOR});
 
-       public FileAssociationManager() {
+        extensionToApplication.put("log", new String[]{"glogg", FILE_INDICATOR});
+        extensionToApplication.put("out", new String[]{"glogg", FILE_INDICATOR});
 
-               extensionToApplication.put("txt", TEXT_EDITOR_PATTERN);
-               extensionToApplication.put("xml", TEXT_EDITOR_PATTERN);
-               extensionToApplication.put("org", TEXT_EDITOR_PATTERN);
-               extensionToApplication.put("properties", TEXT_EDITOR_PATTERN);
-               extensionToApplication.put("ini", TEXT_EDITOR_PATTERN);
-               extensionToApplication.put("", TEXT_EDITOR_PATTERN);
+        extensionToApplication.put("html", new String[]{"firefox", FILE_INDICATOR});
 
-               extensionToApplication.put("jpg", new String[] { "eog", FILE_INDICATOR });
-               extensionToApplication.put("jpeg", new String[] { "eog", FILE_INDICATOR });
-               extensionToApplication.put("png", new String[] { "eog", FILE_INDICATOR });
+        extensionToApplication.put("htm", new String[]{"firefox", FILE_INDICATOR});
 
-               extensionToApplication.put("pdf", new String[] { "evince", FILE_INDICATOR });
+    }
 
-               extensionToApplication.put("mp3", new String[] { "banshee", FILE_INDICATOR });
-               extensionToApplication.put("ogg", new String[] { "banshee", FILE_INDICATOR });
+    private static boolean isLogFile(final String fileName) {
+        if (fileName.endsWith(".out"))
+            return true;
+        if (fileName.endsWith(".log"))
+            return true;
+        return fileName.contains(".log.");
 
-               extensionToApplication.put("avi", new String[] { "vlc", FILE_INDICATOR });
-               extensionToApplication.put("mkv", new String[] { "vlc", FILE_INDICATOR });
-               extensionToApplication.put("ogv", new String[] { "vlc", FILE_INDICATOR });
-               extensionToApplication.put("mp4", new String[] { "vlc", FILE_INDICATOR });
-               extensionToApplication.put("flv", new String[] { "vlc", FILE_INDICATOR });
-               extensionToApplication.put("wmv", new String[] { "vlc", FILE_INDICATOR });
+    }
 
-               extensionToApplication.put("flac", new String[] { MUSIC_PLAYER, FILE_INDICATOR });
-               extensionToApplication.put("mp3", new String[] { MUSIC_PLAYER, FILE_INDICATOR });
-               extensionToApplication.put("ogg", new String[] { MUSIC_PLAYER, FILE_INDICATOR });
-               extensionToApplication.put("wav", new String[] { MUSIC_PLAYER, FILE_INDICATOR });
+    /**
+     * @return <code>true</code> if file was opened. <code>false</code> if
+     * unknown file type.
+     */
+    public static boolean openFile(final File file) {
 
-               extensionToApplication.put("ods", new String[] { SPREADSHEET_EDITOR, FILE_INDICATOR });
-               extensionToApplication.put("xls", new String[] { SPREADSHEET_EDITOR, FILE_INDICATOR });
-               extensionToApplication.put("xlsx", new String[] { SPREADSHEET_EDITOR, FILE_INDICATOR });
+        if (isLogFile(file.getName())) {
+            runOpeningApplication(file, new String[]{"glogg", FILE_INDICATOR});
+            return true;
+        }
 
-               extensionToApplication.put("docx", new String[] { DOCUMENT_EDITOR, FILE_INDICATOR });
-               extensionToApplication.put("doc", new String[] { DOCUMENT_EDITOR, FILE_INDICATOR });
+        final String fileExtension = Utils.getFileExtension(file);
 
-               extensionToApplication.put("desktop", new String[] { "run-desktop", FILE_INDICATOR });
+        if (extensionToApplication.containsKey(fileExtension)) {
+            final String[] commands = extensionToApplication.get(fileExtension);
+            runOpeningApplication(file, commands);
+            return true;
+        } else
+            return false;
 
-               extensionToApplication.put("log", new String[] { "glogg", FILE_INDICATOR });
-               extensionToApplication.put("out", new String[] { "glogg", FILE_INDICATOR });
+    }
 
-               extensionToApplication.put("html", new String[] { "firefox", FILE_INDICATOR });
+    private static void runOpeningApplication(final File file, final String[] commands) {
+        for (int i = 0; i < commands.length; i++)
+            if (commands[i].equals(FILE_INDICATOR))
+                commands[i] = file.getAbsolutePath();
 
-               extensionToApplication.put("htm", new String[] { "firefox", FILE_INDICATOR });
+        try {
+            Runtime.getRuntime().exec(commands);
+            InstantLauncher.exitProgram();
 
-       }
+        } catch (final IOException e) {
+            new ExceptionDialog(e);
+        }
+    }
 
 }
index b13b585..c68c70e 100755 (executable)
@@ -1,28 +1,25 @@
 package eu.svjatoslav.instantlauncher;
 
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
 import org.apache.log4j.Logger;
 
+import java.io.IOException;
+
 public class InstantLauncher {
 
+    private static final Logger LOGGER = Logger.getLogger(InstantLauncher.class);
     public Configuration configuration;
-
     FileAssociationManager associationManager = new FileAssociationManager();
 
-    public static final Logger LOGGER = Logger.getLogger(InstantLauncher.class);
+    public static void exitProgram() {
+        LOGGER.info("Closing InstantLauncher");
+        System.exit(0);
+    }
 
-    public void run() throws FileNotFoundException, IOException {
+    public void run() throws IOException {
         configuration = new Configuration();
 
         final MainFrame mainFrame = new MainFrame(this);
         mainFrame.show();
     }
 
-    public static void exitProgram() {
-        LOGGER.info("Closing InstantLauncher");
-        System.exit(0);
-    }
-
 }
index 47f1cba..e743390 100755 (executable)
@@ -2,17 +2,12 @@ package eu.svjatoslav.instantlauncher;
 
 import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
 
-public class Main {
+class Main {
 
     public static void main(final String[] args) {
 
         try {
-
-            final CommandlineHandler commandlineHandler = new CommandlineHandler();
-            commandlineHandler.parseCommandlineArguments(args);
-
-            final InstantLauncher instantLauncher = new InstantLauncher();
-            instantLauncher.run();
+            new InstantLauncher().run();
         } catch (final Exception e) {
             new ExceptionDialog(e);
         }
index cdd351c..3ec2966 100755 (executable)
@@ -1,23 +1,18 @@
 package eu.svjatoslav.instantlauncher;
 
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowListener;
-
-import javax.swing.JFrame;
-
 import eu.svjatoslav.instantlauncher.menu.MultiLevelMenu;
 
-public class MainFrame {
-
-    private JFrame frame;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
 
-    private boolean isShowing;
+class MainFrame {
 
     public static final Dimension CONTENT_PANEL_SIZE = new Dimension(1100, 850);
-
     private final InstantLauncher instantLauncher;
+    private JFrame frame;
+    private boolean isShowing;
 
     public MainFrame(final InstantLauncher instantLauncher) {
         this.instantLauncher = instantLauncher;
@@ -51,7 +46,7 @@ public class MainFrame {
 
     }
 
-    public static class FrameWindowListener implements WindowListener {
+    private static class FrameWindowListener implements WindowListener {
 
         @Override
         public void windowActivated(final WindowEvent e) {
index b82f623..f382e7c 100755 (executable)
@@ -1,10 +1,9 @@
 package eu.svjatoslav.instantlauncher;
 
-import java.awt.Dimension;
+import javax.swing.*;
+import java.awt.*;
 import java.io.File;
 
-import javax.swing.JComponent;
-
 public class Utils {
 
     public static String getFileExtension(File file) {
@@ -23,7 +22,7 @@ public class Utils {
         return fileExtension;
     }
 
-    public static final void setComponentSize(JComponent component, Dimension size) {
+    public static void setComponentSize(JComponent component, Dimension size) {
         component.setMinimumSize(size);
         component.setMaximumSize(size);
         component.setSize(size);
index 916f8ef..2201868 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(this, chosenFile);
+    }
+
+    private void menuItemSelectedAlternative(final File chosenFile) {
+        for (final MenuListener menuListener : menuListeners)
+            menuListener.menuItemSelectedAlternative(this, chosenFile);
+    }
+
+    private void menuItemSelectedAlternative2(final File chosenFile) {
+        for (final MenuListener menuListener : menuListeners)
+            menuListener.menuItemSelectedAlternative2(this, 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)
+                    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) {
+        }
+
+    }
 
 }
\ No newline at end of file
index 82e1a57..19f59d6 100755 (executable)
@@ -1,25 +1,25 @@
 package eu.svjatoslav.instantlauncher.menu;
 
-public interface MenuListener {
+interface MenuListener {
 
-       /**
-        * mouse over
-        */
-       public void menuItemHighlighted(Menu menu, java.io.File chosenFile);
+    /**
+     * mouse over
+     */
+    void menuItemHighlighted(Menu menu, java.io.File chosenFile);
 
-       /**
-        * left click
-        */
-       public void menuItemSelected(Menu menu, java.io.File chosenFile);
+    /**
+     * left click
+     */
+    void menuItemSelected(Menu menu, java.io.File chosenFile);
 
-       /**
-        * right click
-        */
-       public void menuItemSelectedAlternative(Menu menu, java.io.File chosenFile);
+    /**
+     * right click
+     */
+    void menuItemSelectedAlternative(Menu menu, java.io.File chosenFile);
 
-       /**
-        * middle click
-        */
-       public void menuItemSelectedAlternative2(Menu menu, java.io.File chosenFile);
+    /**
+     * middle click
+     */
+    void menuItemSelectedAlternative2(Menu menu, java.io.File chosenFile);
 
 }
index 017872f..10d6f3f 100755 (executable)
 package eu.svjatoslav.instantlauncher.menu;
 
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Dimension;
-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;
 
-public class MultiLevelMenu implements MenuListener {
+import javax.swing.*;
+import java.awt.*;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
 
-       private final InstantLauncher instantLauncher;
+public class MultiLevelMenu implements MenuListener {
 
-       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>();
-
-       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 {
-                               boolean fileOpened;
-                               try {
-                                       fileOpened = FileAssociationManager.openFile(chosenFile.getCanonicalFile());
-                                       if (fileOpened) {
-                                               InstantLauncher.exitProgram();
-                                       }
-                               } catch (IOException e) {
-                                       e.printStackTrace();
-                               }
-                       }
-               }
-
-               if (chosenFile.isDirectory()) {
-                       try {
-                               executeCommand("nautilus", "-w", chosenFile.getCanonicalFile().getAbsolutePath());
-                       } catch (IOException e) {
-                               e.printStackTrace();
-                       }
-               }
-       }
-
-       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 {
-                       try {
-                               executeCommand("gnome-terminal", "--working-directory="
-                                               + chosenFile.getCanonicalFile().getAbsolutePath());
-                       } catch (IOException e) {
-                               e.printStackTrace();
-                       }
-               }
-       }
-
-       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()) {
-                       try {
-                               executeCommand("emacs", chosenFile.getCanonicalFile().getAbsolutePath());
-                       } catch (IOException e) {
-                               e.printStackTrace();
-                       }
-               }
-       }
+    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.configuration.getRootDirectory();
+        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 Menu menu, final File chosenFile) {
+        if (chosenFile.isFile()) {
+            if (chosenFile.canExecute()) {
+                executeCommand(chosenFile.getAbsolutePath());
+            } else {
+                boolean fileOpened;
+                try {
+                    fileOpened = FileAssociationManager.openFile(chosenFile.getCanonicalFile());
+                    if (fileOpened) {
+                        InstantLauncher.exitProgram();
+                    }
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        if (chosenFile.isDirectory()) {
+            try {
+                executeCommand("nautilus", "-w", chosenFile.getCanonicalFile().getAbsolutePath());
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    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 {
+            try {
+                executeCommand("gnome-terminal", "--working-directory="
+                        + chosenFile.getCanonicalFile().getAbsolutePath());
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    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(Menu menu, File chosenFile) {
+        if (chosenFile.isFile()) {
+            try {
+                executeCommand("emacs", chosenFile.getCanonicalFile().getAbsolutePath());
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 
 }
index b7e0f6c..8bb9ee1 100644 (file)
@@ -1,16 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
 <log4j:configuration>
-       <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
-               <layout class="org.apache.log4j.PatternLayout">
-                       <param name="ConversionPattern" value="%d{ABSOLUTE} 
-      %5p %c{1}:%L - %m%n" />
+    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="%d{ABSOLUTE}
+      %5p %c{1}:%L - %m%n"/>
 
-               </layout>
-       </appender>
-       <root>
+        </layout>
+    </appender>
+    <root>
         <!-- possible values are: debug, info, error -->
-        <priority value="debug"></priority> 
-               <appender-ref ref="stdout" />
-       </root>
+        <priority value="debug"></priority>
+        <appender-ref ref="stdout"/>
+    </root>
 </log4j:configuration>
\ No newline at end of file