1 package eu.svjatoslav.instantlauncher.menu;
4 import java.awt.Dimension;
5 import java.awt.event.MouseEvent;
6 import java.awt.event.MouseListener;
8 import java.util.Arrays;
9 import java.util.Comparator;
10 import java.util.HashSet;
13 import javax.swing.Box;
14 import javax.swing.BoxLayout;
15 import javax.swing.JButton;
16 import javax.swing.JPanel;
17 import javax.swing.SwingConstants;
18 import javax.swing.border.EmptyBorder;
20 import eu.svjatoslav.commons.gui.dialog.ExceptionDialog;
21 import eu.svjatoslav.instantlauncher.Utils;
25 public static class ButtonMouseListener implements MouseListener {
31 public ButtonMouseListener(final JButton button, final Menu parentMenu, final File file) {
32 parentButton = button;
33 this.parentMenu = parentMenu;
38 public void mouseClicked(final MouseEvent e) {
41 if (e.getButton() == 1)
42 parentMenu.menuItemSelected(file);
43 if (e.getButton() == 3)
44 parentMenu.menuItemSelectedAlternative(file);
45 } catch (final Exception ex) {
46 new ExceptionDialog(ex);
51 public void mouseEntered(final MouseEvent e) {
53 if (parentButton != parentMenu.getSelectedButton()) {
55 if (parentMenu.getSelectedButton() != null)
56 parentMenu.getSelectedButton().setBackground(getFileColor(parentMenu.getSelectedFile(), false));
58 parentMenu.setSelected(parentButton, file);
59 parentButton.setBackground(getFileColor(file, true));
61 parentMenu.menuItemHighlighted(file);
63 } catch (final Exception ex) {
64 new ExceptionDialog(ex);
69 public void mouseExited(final MouseEvent e) {
73 public void mousePressed(final MouseEvent e) {
77 public void mouseReleased(final MouseEvent e) {
82 public static final Color BUTTON_BG_DIRECTORY = new Color(0, 0, 60);
84 public static final Color BUTTON_BG_DIRECTORY_SELECTED = new Color(0, 0, 100);
85 public static final Color BUTTON_BG_LINK = new Color(60, 60, 0);
87 public static final Color BUTTON_BG_LINK_SELECTED = new Color(100, 100, 0);
88 public static final Color BUTTON_BG_EXECUTABLE_FILE = new Color(60, 0, 0);
90 public static final Color BUTTON_BG_EXECUTABLE_FILE_SELECTED = new Color(100, 0, 0);
91 public static final Color BUTTON_BG_NONEXECUTABLE_FILE = new Color(0, 60, 0);
93 public static final Color BUTTON_BG_NONEXECUTABLE_FILE_SELECTED = new Color(0, 100, 0);
94 public static final Dimension SIZE_BUTTON = new Dimension(200, 30);
96 public static final Dimension SIZE_MENU_PANEL = new Dimension(210, 900);
100 * Assign specific colors to:
103 * Non executable file
106 public static Color getFileColor(final File file, final boolean selected) {
107 if (file.isDirectory())
109 return BUTTON_BG_DIRECTORY_SELECTED;
111 return BUTTON_BG_DIRECTORY;
114 if (file.canExecute()) {
116 return BUTTON_BG_EXECUTABLE_FILE_SELECTED;
118 return BUTTON_BG_EXECUTABLE_FILE;
120 return BUTTON_BG_NONEXECUTABLE_FILE_SELECTED;
122 return BUTTON_BG_NONEXECUTABLE_FILE;
125 return BUTTON_BG_LINK_SELECTED;
127 return BUTTON_BG_LINK;
130 private JPanel menuPanel;
132 public JButton selectedButton;
134 public File selectedFile;;
136 private final Set<MenuListener> menuListeners = new HashSet<MenuListener>();
138 public Menu(final File directory) {
139 buildContentPanel(directory);
142 public void addMenuListener(final MenuListener menuListener) {
143 menuListeners.add(menuListener);
146 public JButton buildButton(final File file) {
148 if (file.isDirectory())
149 button = new JButton("[ " + file.getName() + " ]");
151 button = new JButton(file.getName());
153 button.setBackground(getFileColor(file, false));
154 button.setForeground(new Color(255, 255, 255));
156 button.setBorder(new EmptyBorder(5, 10, 5, 10));
158 final Menu.ButtonMouseListener mouseListener = new ButtonMouseListener(button, this, file);
159 button.addMouseListener(mouseListener);
161 button.setHorizontalTextPosition(SwingConstants.CENTER);
164 Utils.setComponentSize(button, SIZE_BUTTON);
169 private void buildContentPanel(final File directory) {
170 menuPanel = new JPanel();
172 Utils.setComponentSize(menuPanel, SIZE_MENU_PANEL);
174 final BoxLayout layout = new BoxLayout(menuPanel, BoxLayout.Y_AXIS);
175 menuPanel.setLayout(layout);
176 menuPanel.setBackground(Color.BLACK);
178 final File[] listFiles = directory.listFiles();
180 // Sort files by name
181 Arrays.sort(listFiles, new Comparator<File>() {
183 public int compare(final File f1, final File f2) {
185 // directories come before files
186 if (f1.isFile() && f2.isDirectory())
188 if (f2.isFile() && f1.isDirectory())
191 // order by file name
192 return f1.getName().toUpperCase().compareTo(f2.getName().toUpperCase());
196 // add files to the panel
197 for (final File file : listFiles)
198 // ignore hidden files
199 if (!file.getName().startsWith(".")) {
200 menuPanel.add(Box.createVerticalStrut(10));
201 menuPanel.add(buildButton(file));
205 public JPanel getMenuPanel() {
209 public JButton getSelectedButton() {
210 return selectedButton;
213 public File getSelectedFile() {
217 public void menuItemHighlighted(final File chosenFile) {
218 for (final MenuListener menuListener : menuListeners)
219 menuListener.menuItemHighlighted(this, chosenFile);
222 public void menuItemSelected(final File chosenFile) {
223 for (final MenuListener menuListener : menuListeners)
224 menuListener.menuItemSelected(this, chosenFile);
227 public void menuItemSelectedAlternative(final File chosenFile) {
228 for (final MenuListener menuListener : menuListeners)
229 menuListener.menuItemSelectedAlternative(this, chosenFile);
232 public void setSelected(final JButton selectedButton, final File selectedFile) {
233 this.selectedButton = selectedButton;
234 this.selectedFile = selectedFile;