1 package eu.svjatoslav.instantlauncher.menu;
3 import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
4 import eu.svjatoslav.instantlauncher.Utils;
7 import javax.swing.border.EmptyBorder;
9 import java.awt.event.MouseEvent;
10 import java.awt.event.MouseListener;
12 import java.util.Arrays;
13 import java.util.HashSet;
18 public static final Dimension SIZE_MENU_PANEL = new Dimension(210, 900);
19 private static final Color BUTTON_BG_DIRECTORY = new Color(0, 0, 60);
21 private static final Color BUTTON_BG_DIRECTORY_SELECTED = new Color(0, 0, 100);
22 private static final Color BUTTON_BG_LINK = new Color(60, 60, 0);
24 private static final Color BUTTON_BG_LINK_SELECTED = new Color(100, 100, 0);
25 private static final Color BUTTON_BG_EXECUTABLE_FILE = new Color(60, 0, 0);
27 private static final Color BUTTON_BG_EXECUTABLE_FILE_SELECTED = new Color(100, 0, 0);
28 private static final Color BUTTON_BG_NONEXECUTABLE_FILE = new Color(0, 60, 0);
30 private static final Color BUTTON_BG_NONEXECUTABLE_FILE_SELECTED = new Color(0, 100, 0);
31 private static final Dimension SIZE_BUTTON = new Dimension(200, 30);
32 private final Set<MenuListener> menuListeners = new HashSet<>();
33 private JPanel menuPanel;
34 private JButton selectedButton;
35 private File selectedFile;
37 public Menu(final File directory) {
38 buildContentPanel(directory);
43 * Assign specific colors to:
49 private static Color getFileColor(final File file, final boolean selected) {
50 if (file.isDirectory())
52 return BUTTON_BG_DIRECTORY_SELECTED;
54 return BUTTON_BG_DIRECTORY;
57 if (file.canExecute()) {
59 return BUTTON_BG_EXECUTABLE_FILE_SELECTED;
61 return BUTTON_BG_EXECUTABLE_FILE;
63 return BUTTON_BG_NONEXECUTABLE_FILE_SELECTED;
65 return BUTTON_BG_NONEXECUTABLE_FILE;
68 return BUTTON_BG_LINK_SELECTED;
70 return BUTTON_BG_LINK;
73 public void addMenuListener(final MenuListener menuListener) {
74 menuListeners.add(menuListener);
77 private JButton buildButton(final File file) {
79 if (file.isDirectory())
80 button = new JButton("[ " + file.getName() + " ]");
82 button = new JButton(file.getName());
84 button.setBackground(getFileColor(file, false));
85 button.setForeground(new Color(255, 255, 255));
87 button.setBorder(new EmptyBorder(5, 10, 5, 10));
89 final Menu.ButtonMouseListener mouseListener = new ButtonMouseListener(button, this, file);
90 button.addMouseListener(mouseListener);
92 button.setHorizontalTextPosition(SwingConstants.CENTER);
95 Utils.setComponentSize(button, SIZE_BUTTON);
100 private void buildContentPanel(final File directory) {
101 menuPanel = new JPanel();
103 Utils.setComponentSize(menuPanel, SIZE_MENU_PANEL);
105 final BoxLayout layout = new BoxLayout(menuPanel, BoxLayout.Y_AXIS);
106 menuPanel.setLayout(layout);
107 menuPanel.setBackground(Color.BLACK);
109 final File[] listFiles = directory.listFiles();
111 // Sort files by name
112 Arrays.sort(listFiles, (f1, f2) -> {
114 // directories come before files
115 if (f1.isFile() && f2.isDirectory())
117 if (f2.isFile() && f1.isDirectory())
120 // order by file name
121 return f1.getName().toUpperCase().compareTo(f2.getName().toUpperCase());
124 // add files to the panel
125 for (final File file : listFiles)
126 // ignore hidden files
127 if (!file.getName().startsWith(".")) {
128 menuPanel.add(Box.createVerticalStrut(10));
129 menuPanel.add(buildButton(file));
133 public JPanel getMenuPanel() {
137 private JButton getSelectedButton() {
138 return selectedButton;
141 private File getSelectedFile() {
145 private void menuItemHighlighted(final File chosenFile) {
146 for (final MenuListener menuListener : menuListeners)
147 menuListener.menuItemHighlighted(this, chosenFile);
150 private void menuItemSelected(final File chosenFile) {
151 for (final MenuListener menuListener : menuListeners)
152 menuListener.menuItemSelected(this, chosenFile);
155 private void menuItemSelectedAlternative(final File chosenFile) {
156 for (final MenuListener menuListener : menuListeners)
157 menuListener.menuItemSelectedAlternative(this, chosenFile);
160 private void menuItemSelectedAlternative2(final File chosenFile) {
161 for (final MenuListener menuListener : menuListeners)
162 menuListener.menuItemSelectedAlternative2(this, chosenFile);
165 private void setSelected(final JButton selectedButton, final File selectedFile) {
166 this.selectedButton = selectedButton;
167 this.selectedFile = selectedFile;
170 public static class ButtonMouseListener implements MouseListener {
172 final JButton parentButton;
173 final Menu parentMenu;
176 public ButtonMouseListener(final JButton button, final Menu parentMenu, final File file) {
177 parentButton = button;
178 this.parentMenu = parentMenu;
183 public void mouseClicked(final MouseEvent e) {
186 if (e.getButton() == 1)
187 parentMenu.menuItemSelected(file);
188 if (e.getButton() == 2)
189 parentMenu.menuItemSelectedAlternative2(file);
190 if (e.getButton() == 3)
191 parentMenu.menuItemSelectedAlternative(file);
192 } catch (final Exception ex) {
193 new ExceptionDialog(ex);
198 public void mouseEntered(final MouseEvent e) {
200 if (parentButton != parentMenu.getSelectedButton()) {
202 if (parentMenu.getSelectedButton() != null)
203 parentMenu.getSelectedButton().setBackground(getFileColor(parentMenu.getSelectedFile(), false));
205 parentMenu.setSelected(parentButton, file);
206 parentButton.setBackground(getFileColor(file, true));
208 parentMenu.menuItemHighlighted(file);
210 } catch (final Exception ex) {
211 new ExceptionDialog(ex);
216 public void mouseExited(final MouseEvent e) {
220 public void mousePressed(final MouseEvent e) {
224 public void mouseReleased(final MouseEvent e) {