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);
53 * Assign specific colors to:
59 public static Color getFileColor(final File file, final boolean selected) {
60 if (file.isDirectory()) {
62 return BUTTON_BG_DIRECTORY_SELECTED;
64 return BUTTON_BG_DIRECTORY;
69 if (file.canExecute()) {
71 return BUTTON_BG_EXECUTABLE_FILE_SELECTED;
73 return BUTTON_BG_EXECUTABLE_FILE;
77 return BUTTON_BG_NONEXECUTABLE_FILE_SELECTED;
79 return BUTTON_BG_NONEXECUTABLE_FILE;
85 return BUTTON_BG_LINK_SELECTED;
87 return BUTTON_BG_LINK;
91 public void addMenuListener(final MenuListener menuListener) {
92 menuListeners.add(menuListener);
95 public JButton buildButton(final File file) {
97 if (file.isDirectory()) {
98 button = new JButton("[ " + file.getName() + " ]");
100 button = new JButton(file.getName());
103 button.setBackground(getFileColor(file, false));
104 button.setForeground(new Color(255, 255, 255));
106 button.setBorder(new EmptyBorder(5, 10, 5, 10));
108 final Menu.ButtonMouseListener mouseListener = new ButtonMouseListener(button, this, file);
109 button.addMouseListener(mouseListener);
111 button.setHorizontalTextPosition(SwingConstants.CENTER);
114 Utils.setComponentSize(button, SIZE_BUTTON);
119 private void buildContentPanel(final File directory) {
120 menuPanel = new JPanel();
122 Utils.setComponentSize(menuPanel, SIZE_MENU_PANEL);
124 final BoxLayout layout = new BoxLayout(menuPanel, BoxLayout.Y_AXIS);
125 menuPanel.setLayout(layout);
126 menuPanel.setBackground(Color.BLACK);
128 final File[] listFiles = directory.listFiles();
130 // Sort files by name
131 Arrays.sort(listFiles, new Comparator<File>() {
133 public int compare(final File f1, final File f2) {
135 // directories come before files
136 if (f1.isFile() && f2.isDirectory()) {
139 if (f2.isFile() && f1.isDirectory()) {
143 // order by file name
144 return f1.getName().toUpperCase().compareTo(f2.getName().toUpperCase());
148 // add files to the panel
149 for (final File file : listFiles) {
150 // ignore hidden files
151 if (!file.getName().startsWith(".")) {
152 menuPanel.add(Box.createVerticalStrut(10));
153 menuPanel.add(buildButton(file));
158 public JPanel getMenuPanel() {
162 public JButton getSelectedButton() {
163 return selectedButton;
166 public File getSelectedFile() {
170 public void notifyAlternativeEventListeners(final File chosenFile) {
171 for (final MenuListener menuListener : menuListeners) {
172 menuListener.menuItemSelectedAlternative(this, chosenFile);
176 public void notifyEventListeners(final File chosenFile) {
177 for (final MenuListener menuListener : menuListeners) {
178 menuListener.menuItemSelected(this, chosenFile);
182 public void setSelected(final JButton selectedButton, final File selectedFile) {
183 this.selectedButton = selectedButton;
184 this.selectedFile = selectedFile;
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 ExceptionDialog.showException(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 ExceptionDialog.showException(ex);
236 public void mouseExited(final MouseEvent e) {
240 public void mousePressed(final MouseEvent e) {
244 public void mouseReleased(final MouseEvent e) {