<?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$">
</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
<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>
<dependency>
<groupId>eu.svjatoslav</groupId>
<artifactId>svjatoslavcommons</artifactId>
- <version>1.0</version>
+ <version>1.4</version>
</dependency>
<dependency>
<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>
+++ /dev/null
-cd ~/workspace/instantlauncher
-
-# For faster subsequent startup we use offline mode
-mvn -o exec:java -Dexec.mainClass="eu.svjatoslav.instantlauncher.Main"
-
+++ /dev/null
-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);
- }
- }
-}
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
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);
}
}
- public void initialize() throws FileNotFoundException, IOException {
+ private void initialize() throws IOException {
loadIfFileExists();
}
}
- public void loadIfFileExists() throws FileNotFoundException, IOException {
+ private void loadIfFileExists() throws IOException {
final File propertiesFile = getPropertiesFile();
if (propertiesFile.exists()) {
}
}
- 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();
}
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);
+ }
+ }
}
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);
- }
-
}
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);
}
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;
}
- public static class FrameWindowListener implements WindowListener {
+ private static class FrameWindowListener implements WindowListener {
@Override
public void windowActivated(final WindowEvent e) {
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) {
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);
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
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);
}
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();
+ }
+ }
+ }
}
<?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