2 * Instantlauncher. Copyright ©2012-2019, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of version 3 of the GNU Lesser General Public License
6 * or later as published by the Free Software Foundation.
9 package eu.svjatoslav.instantlauncher.menu;
11 import eu.svjatoslav.instantlauncher.InstantLauncher;
12 import eu.svjatoslav.instantlauncher.Utils;
17 import java.io.IOException;
18 import java.util.ArrayList;
20 import static eu.svjatoslav.instantlauncher.Utils.executeCommand;
22 public class MultiLevelMenu implements MenuListener {
24 private static final int VERTICAL_MENUS_COUNT = 7;
25 private static final Dimension CONTENT_PANEL_SIZE = new Dimension(1024, 900);
26 private final InstantLauncher instantLauncher;
27 private final ArrayList<Menu> menus = new ArrayList<>();
29 private final ArrayList<JPanel> panels = new ArrayList<>();
30 private JPanel contentPane;
32 public MultiLevelMenu(final InstantLauncher instantLauncher) {
33 this.instantLauncher = instantLauncher;
37 * Adds new vertical menu.
39 * @return <code>true</code> if operation succeeded, or <code>false</code>
40 * if there was not enough space left for a new menu.
42 private boolean addMenu(final File directory) {
43 final int newMenuHorizontalIndex = menus.size();
45 if (newMenuHorizontalIndex >= VERTICAL_MENUS_COUNT) {
49 final Menu menu = new Menu(directory);
50 menu.addMenuListener(this);
52 final JPanel placeholderPanel = panels.get(newMenuHorizontalIndex);
53 final JPanel menuPanel = menu.getMenuPanel();
54 placeholderPanel.add(menuPanel, BorderLayout.CENTER);
60 public JPanel buildContentPanel() {
62 contentPane = new JPanel();
63 contentPane.setBackground(Color.BLACK);
64 contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
65 Utils.setComponentSize(contentPane, CONTENT_PANEL_SIZE);
68 for (int i = 0; i < VERTICAL_MENUS_COUNT; i++) {
69 contentPane.add(Box.createHorizontalStrut(10));
71 final JPanel panel = new JPanel(new BorderLayout());
72 panel.setBackground(Color.BLACK);
74 Utils.setComponentSize(panel, Menu.SIZE_MENU_PANEL);
77 contentPane.add(panel);
80 final File directory = instantLauncher.configurationManager.getConfiguration().getNavigationRootDirectory();
86 private int getMenuIndex(final Menu menu) {
88 for (final Menu m : menus) {
98 public void menuItemHighlighted(final Menu menu, final File chosenFile) {
100 if (chosenFile.isDirectory()) {
101 final int menuIndex = getMenuIndex(menu);
103 if (menuIndex >= 0) {
104 removeMenus(menuIndex + 1);
105 if (addMenu(chosenFile)) {
106 contentPane.validate();
107 contentPane.repaint();
115 public void menuItemSelected(final File chosenFile) {
116 if (chosenFile.isFile()) {
117 if (chosenFile.canExecute()) {
118 executeCommand(chosenFile.getAbsolutePath());
119 InstantLauncher.exitProgram();
123 fileOpened = instantLauncher.openFile(chosenFile.getCanonicalFile());
125 InstantLauncher.exitProgram();
127 } catch (IOException e) {
133 if (chosenFile.isDirectory()) {
135 instantLauncher.openDirectory(chosenFile.getCanonicalFile());
136 InstantLauncher.exitProgram();
137 } catch (IOException e) {
144 public void menuItemSelectedAlternative(final File chosenFile) {
145 if (chosenFile.isFile())
146 chosenFile.setExecutable(!chosenFile.canExecute());
148 instantLauncher.openDirectoryInTerminal(chosenFile);
149 InstantLauncher.exitProgram();
153 private void removeMenus(final int fromIndex) {
155 for (int i = fromIndex; i < menus.size(); i++) {
156 final JPanel jPanel = panels.get(i);
160 while (menus.size() > fromIndex) {
161 menus.remove(fromIndex);
166 public void menuItemSelectedAlternative2(File chosenFile) {
167 // TODO: define some middle mouse click functions