2 * Instantlauncher. Author: Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
3 * This project is released under Creative Commons Zero (CC0) license.
5 package eu.svjatoslav.instantlauncher.menu;
7 import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
8 import eu.svjatoslav.instantlauncher.Utils;
11 import javax.swing.border.EmptyBorder;
13 import java.awt.event.MouseEvent;
14 import java.awt.event.MouseListener;
16 import java.util.Arrays;
17 import java.util.HashSet;
22 public static final Dimension SIZE_MENU_PANEL = new Dimension(210, 900);
23 private static final Color BUTTON_BG_DIRECTORY = new Color(0, 0, 60);
25 private static final Color BUTTON_BG_DIRECTORY_SELECTED = new Color(0, 0, 100);
26 private static final Color BUTTON_BG_LINK = new Color(60, 60, 0);
28 private static final Color BUTTON_BG_LINK_SELECTED = new Color(100, 100, 0);
29 private static final Color BUTTON_BG_EXECUTABLE_FILE = new Color(60, 0, 0);
31 private static final Color BUTTON_BG_EXECUTABLE_FILE_SELECTED = new Color(100, 0, 0);
32 private static final Color BUTTON_BG_NONEXECUTABLE_FILE = new Color(0, 60, 0);
34 private static final Color BUTTON_BG_NONEXECUTABLE_FILE_SELECTED = new Color(0, 100, 0);
35 private static final Dimension SIZE_BUTTON = new Dimension(200, 30);
36 private final Set<MenuListener> menuListeners = new HashSet<>();
37 private JPanel menuPanel;
38 private JButton selectedButton;
39 private File selectedFile;
41 public Menu(final File directory) {
42 buildContentPanel(directory);
47 * Assign specific colors to:
53 private static Color getFileColor(final File file, final boolean selected) {
54 if (file.isDirectory())
56 return BUTTON_BG_DIRECTORY_SELECTED;
58 return BUTTON_BG_DIRECTORY;
61 if (file.canExecute()) {
63 return BUTTON_BG_EXECUTABLE_FILE_SELECTED;
65 return BUTTON_BG_EXECUTABLE_FILE;
67 return BUTTON_BG_NONEXECUTABLE_FILE_SELECTED;
69 return BUTTON_BG_NONEXECUTABLE_FILE;
72 return BUTTON_BG_LINK_SELECTED;
74 return BUTTON_BG_LINK;
77 public void addMenuListener(final MenuListener menuListener) {
78 menuListeners.add(menuListener);
81 private JButton buildButton(final File file) {
83 if (file.isDirectory())
84 button = new JButton("[ " + file.getName() + " ]");
86 button = new JButton(file.getName());
88 button.setBackground(getFileColor(file, false));
89 button.setForeground(new Color(255, 255, 255));
91 button.setBorder(new EmptyBorder(5, 10, 5, 10));
93 final Menu.ButtonMouseListener mouseListener = new ButtonMouseListener(button, this, file);
94 button.addMouseListener(mouseListener);
96 button.setHorizontalTextPosition(SwingConstants.CENTER);
99 Utils.setComponentSize(button, SIZE_BUTTON);
104 private void buildContentPanel(final File directory) {
105 menuPanel = new JPanel();
107 Utils.setComponentSize(menuPanel, SIZE_MENU_PANEL);
109 final BoxLayout layout = new BoxLayout(menuPanel, BoxLayout.Y_AXIS);
110 menuPanel.setLayout(layout);
111 menuPanel.setBackground(Color.BLACK);
113 final File[] listFiles = directory.listFiles();
115 // Sort files by name
116 Arrays.sort(listFiles, (f1, f2) -> {
118 // directories come before files
119 if (f1.isFile() && f2.isDirectory())
121 if (f2.isFile() && f1.isDirectory())
124 // order by file name
125 return f1.getName().toUpperCase().compareTo(f2.getName().toUpperCase());
128 // add files to the panel
129 for (final File file : listFiles)
130 // ignore hidden files
131 if (!file.getName().startsWith(".")) {
132 menuPanel.add(Box.createVerticalStrut(10));
133 menuPanel.add(buildButton(file));
137 public JPanel getMenuPanel() {
141 private JButton getSelectedButton() {
142 return selectedButton;
145 private File getSelectedFile() {
149 private void menuItemHighlighted(final File chosenFile) {
150 for (final MenuListener menuListener : menuListeners)
151 menuListener.menuItemHighlighted(this, chosenFile);
154 private void menuItemSelected(final File chosenFile) {
155 for (final MenuListener menuListener : menuListeners)
156 menuListener.menuItemSelected(chosenFile);
159 private void menuItemSelectedAlternative(final File chosenFile) {
160 for (final MenuListener menuListener : menuListeners)
161 menuListener.menuItemSelectedAlternative(chosenFile);
164 private void menuItemSelectedAlternative2(final File chosenFile) {
165 for (final MenuListener menuListener : menuListeners)
166 menuListener.menuItemSelectedAlternative2(chosenFile);
169 private void setSelected(final JButton selectedButton, final File selectedFile) {
170 this.selectedButton = selectedButton;
171 this.selectedFile = selectedFile;
174 public static class ButtonMouseListener implements MouseListener {
176 final JButton parentButton;
177 final Menu parentMenu;
180 public ButtonMouseListener(final JButton button, final Menu parentMenu, final File file) {
181 parentButton = button;
182 this.parentMenu = parentMenu;
187 public void mouseClicked(final MouseEvent e) {
190 if (e.getButton() == 1) // left mouse click
191 parentMenu.menuItemSelected(file);
192 if (e.getButton() == 2) // middle mouse click
193 parentMenu.menuItemSelectedAlternative2(file);
194 if (e.getButton() == 3) //right mouse click
195 parentMenu.menuItemSelectedAlternative(file);
196 } catch (final Exception ex) {
197 new ExceptionDialog(ex);
202 public void mouseEntered(final MouseEvent e) {
204 if (parentButton != parentMenu.getSelectedButton()) {
206 if (parentMenu.getSelectedButton() != null)
207 parentMenu.getSelectedButton().setBackground(getFileColor(parentMenu.getSelectedFile(), false));
209 parentMenu.setSelected(parentButton, file);
210 parentButton.setBackground(getFileColor(file, true));
212 parentMenu.menuItemHighlighted(file);
214 } catch (final Exception ex) {
215 new ExceptionDialog(ex);
220 public void mouseExited(final MouseEvent e) {
224 public void mousePressed(final MouseEvent e) {
228 public void mouseReleased(final MouseEvent e) {