X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Finstantlauncher%2Fmenu%2FMenu.java;h=4f97952cf7f422f8755294f4bd119a2cf7c32226;hb=77082432ed790314e9d5600a33103845eeebf993;hp=916f8efa1b23ac4bcf4359f30ac6a05959351eae;hpb=629244b2665bfde057efc66aa333ca8e8cacd6cd;p=instantlauncher.git diff --git a/src/main/java/eu/svjatoslav/instantlauncher/menu/Menu.java b/src/main/java/eu/svjatoslav/instantlauncher/menu/Menu.java index 916f8ef..4f97952 100755 --- a/src/main/java/eu/svjatoslav/instantlauncher/menu/Menu.java +++ b/src/main/java/eu/svjatoslav/instantlauncher/menu/Menu.java @@ -1,244 +1,237 @@ +/* + * Instantlauncher. Copyright ©2012-2019, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 3 of the GNU Lesser General Public License + * or later as published by the Free Software Foundation. + */ + 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); - - /** - *
- * Assign specific colors to: - * Directory - * Executable file - * Non executable file - *- */ - 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
+ * Assign specific colors to: + * Directory + * Executable file + * Non executable file + *+ */ + 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