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 final Color BUTTON_BG_DIRECTORY = new Color(0, 0, 60);
26 public static final Color BUTTON_BG_DIRECTORY_SELECTED = new Color(0, 0, 100);
28 public static final Color BUTTON_BG_LINK = new Color(60, 60, 0);
29 public static final Color BUTTON_BG_LINK_SELECTED = new Color(100, 100, 0);
31 public static final Color BUTTON_BG_EXECUTABLE_FILE = new Color(60, 0, 0);
32 public static final Color BUTTON_BG_EXECUTABLE_FILE_SELECTED = new Color(100, 0, 0);
34 public static final Color BUTTON_BG_NONEXECUTABLE_FILE = new Color(0, 60, 0);
35 public static final Color BUTTON_BG_NONEXECUTABLE_FILE_SELECTED = new Color(0, 100, 0);
37 public static final Dimension SIZE_BUTTON = new Dimension(200, 30);
38 public static final Dimension SIZE_MENU_PANEL = new Dimension(210, 900);
40 private JPanel menuPanel;
42 public JButton selectedButton;
43 public File selectedFile;
45 private final Set<MenuListener> menuListeners = new HashSet<MenuListener>();
47 public Menu(final File directory) {
48 buildContentPanel(directory);
51 public void addMenuListener(final MenuListener menuListener) {
52 menuListeners.add(menuListener);
55 public JButton buildButton(final File file) {
57 if (file.isDirectory()) {
58 button = new JButton("[ " + file.getName() + " ]");
60 button = new JButton(file.getName());
63 button.setBackground(getFileColor(file, false));
64 button.setForeground(new Color(255, 255, 255));
66 button.setBorder(new EmptyBorder(5, 10, 5, 10));
68 final Menu.ButtonMouseListener mouseListener = new ButtonMouseListener(button, this, file);
69 button.addMouseListener(mouseListener);
71 button.setHorizontalTextPosition(SwingConstants.CENTER);
74 Utils.setComponentSize(button, SIZE_BUTTON);
79 private void buildContentPanel(final File directory) {
80 menuPanel = new JPanel();
82 Utils.setComponentSize(menuPanel, SIZE_MENU_PANEL);
84 final BoxLayout layout = new BoxLayout(menuPanel, BoxLayout.Y_AXIS);
85 menuPanel.setLayout(layout);
86 menuPanel.setBackground(Color.BLACK);
88 final File[] listFiles = directory.listFiles();
91 Arrays.sort(listFiles, new Comparator<File>() {
93 public int compare(final File f1, final File f2) {
95 // directories come before files
96 if (f1.isFile() && f2.isDirectory()) {
99 if (f2.isFile() && f1.isDirectory()) {
103 // order by file name
104 return f1.getName().toUpperCase().compareTo(f2.getName().toUpperCase());
108 // add files to the panel
109 for (final File file : listFiles) {
110 // ignore hidden files
111 if (!file.getName().startsWith(".")) {
112 menuPanel.add(Box.createVerticalStrut(10));
113 menuPanel.add(buildButton(file));
118 public JPanel getMenuPanel() {
122 public JButton getSelectedButton() {
123 return selectedButton;
126 public File getSelectedFile() {
130 public void notifyAlternativeEventListeners(final File chosenFile) {
131 for (final MenuListener menuListener : menuListeners) {
132 menuListener.menuItemSelectedAlternative(this, chosenFile);
136 public void notifyEventListeners(final File chosenFile) {
137 for (final MenuListener menuListener : menuListeners) {
138 menuListener.menuItemSelected(this, chosenFile);
142 public void setSelected(final JButton selectedButton, final File selectedFile) {
143 this.selectedButton = selectedButton;
144 this.selectedFile = selectedFile;
149 * Assign specific colors to:
152 * Non executable file
155 public static Color getFileColor(final File file, final boolean selected) {
156 if (file.isDirectory()) {
158 return BUTTON_BG_DIRECTORY_SELECTED;
160 return BUTTON_BG_DIRECTORY;
165 if (file.canExecute()) {
167 return BUTTON_BG_EXECUTABLE_FILE_SELECTED;
169 return BUTTON_BG_EXECUTABLE_FILE;
173 return BUTTON_BG_NONEXECUTABLE_FILE_SELECTED;
175 return BUTTON_BG_NONEXECUTABLE_FILE;
181 return BUTTON_BG_LINK_SELECTED;
183 return BUTTON_BG_LINK;
187 public static class ButtonMouseListener implements MouseListener {
189 JButton parentButton;
193 public ButtonMouseListener(final JButton button, final Menu parentMenu, final File file) {
194 parentButton = button;
195 this.parentMenu = parentMenu;
200 public void mouseClicked(final MouseEvent e) {
203 if (e.getButton() == 1) {
204 parentMenu.notifyEventListeners(file);
206 if (e.getButton() == 3) {
207 parentMenu.notifyAlternativeEventListeners(file);
209 } catch (final Exception ex) {
210 new ExceptionDialog(ex);
215 public void mouseEntered(final MouseEvent e) {
217 if (parentButton != parentMenu.getSelectedButton()) {
219 if (parentMenu.getSelectedButton() != null) {
220 parentMenu.getSelectedButton().setBackground(getFileColor(parentMenu.getSelectedFile(), false));
223 parentMenu.setSelected(parentButton, file);
224 parentButton.setBackground(getFileColor(file, true));
226 if (file.isDirectory()) {
227 parentMenu.notifyEventListeners(file);
230 } catch (final Exception ex) {
231 new ExceptionDialog(ex);
236 public void mouseExited(final MouseEvent e) {
240 public void mousePressed(final MouseEvent e) {
244 public void mouseReleased(final MouseEvent e) {