/[svn]/jsampler/trunk/src/org/jsampler/view/classic/MainFrame.java
ViewVC logotype

Contents of /jsampler/trunk/src/org/jsampler/view/classic/MainFrame.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 787 - (show annotations) (download)
Mon Oct 10 16:03:12 2005 UTC (18 years, 6 months ago) by iliev
File size: 16647 byte(s)
* The first alpha-release of JSampler

1 /*
2 * JSampler - a java front-end for LinuxSampler
3 *
4 * Copyright (C) 2005 Grigor Kirilov Iliev
5 *
6 * This file is part of JSampler.
7 *
8 * JSampler is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2
10 * as published by the Free Software Foundation.
11 *
12 * JSampler is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with JSampler; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20 * MA 02111-1307 USA
21 */
22
23 package org.jsampler.view.classic;
24
25 import java.awt.BorderLayout;
26 import java.awt.Dimension;
27
28 import java.awt.event.ActionEvent;
29 import java.awt.event.ActionListener;
30 import java.awt.event.KeyEvent;
31
32 import java.util.Vector;
33
34 import javax.swing.Action;
35 import javax.swing.ImageIcon;
36 import javax.swing.JCheckBoxMenuItem;
37 import javax.swing.JMenu;
38 import javax.swing.JMenuBar;
39 import javax.swing.JMenuItem;
40 import javax.swing.JPanel;
41 import javax.swing.JSplitPane;
42 import javax.swing.JTabbedPane;
43 import javax.swing.KeyStroke;
44
45 import javax.swing.event.ChangeEvent;
46 import javax.swing.event.ChangeListener;
47 import javax.swing.event.ListSelectionEvent;
48 import javax.swing.event.ListSelectionListener;
49
50 import net.sf.juife.NavigationPage;
51 import net.sf.juife.NavigationPane;
52
53 import org.jsampler.CC;
54
55 import org.jsampler.view.JSChannel;
56 import org.jsampler.view.JSChannelsPane;
57
58 import static org.jsampler.view.classic.ClassicI18n.i18n;
59 import static org.jsampler.view.classic.LeftPane.getLeftPane;
60
61
62 /**
63 *
64 * @author Grigor Iliev
65 */
66 public class
67 MainFrame extends org.jsampler.view.JSMainFrame implements ChangeListener, ListSelectionListener {
68 public static ImageIcon applicationIcon = null;
69
70 static {
71 String s = "org/jsampler/view/classic/res/icons/app-icon.png";
72 java.net.URL url = ClassLoader.getSystemClassLoader().getResource(s);
73 if(url != null) applicationIcon = new ImageIcon(url);
74 }
75
76 private final Toolbar toolbar = new Toolbar();
77 private final Statusbar statusbar = new Statusbar();
78 private final JMenuBar menuBar = new JMenuBar();
79
80 private final JSplitPane splitPane;
81
82 private final JPanel mainPane = new JPanel();
83 private final JPanel channelsPane = new JPanel(new BorderLayout());
84
85 private final JTabbedPane tabbedPane =
86 new JTabbedPane(JTabbedPane.BOTTOM, JTabbedPane.SCROLL_TAB_LAYOUT);
87 private final JMenu tabsMenu = new JMenu(i18n.getMenuLabel("channels.MoveToTab"));
88 private final Vector<JMenuItem> miList = new Vector<JMenuItem>();
89
90 /** Creates a new instance of JSMainFrame */
91 public
92 MainFrame() {
93 setTitle(i18n.getLabel("MainFrame.title"));
94
95 initMainFrame();
96 getContentPane().add(toolbar, BorderLayout.NORTH);
97 getContentPane().add(mainPane);
98
99 mainPane.setLayout(new BorderLayout());
100 mainPane.add(statusbar, BorderLayout.SOUTH);
101
102 ChannelsPane p = new ChannelsPane("Untitled");
103 p.addListSelectionListener(this);
104 getChannelsPaneList().add(p);
105 miList.add(new JMenuItem(new A4n.MoveChannelsTo(p)));
106
107 channelsPane.add(getChannelsPane(0));
108
109 splitPane = new JSplitPane (
110 JSplitPane.HORIZONTAL_SPLIT,
111 true, // continuousLayout
112 getLeftPane(),
113 channelsPane
114 );
115
116 splitPane.setOneTouchExpandable(true);
117
118 mainPane.add(splitPane);
119
120 if(applicationIcon != null) setIconImage(applicationIcon.getImage());
121
122 pack();
123
124 Dimension dimension = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
125 double width = dimension.getWidth();
126 double height = dimension.getHeight();
127 setBounds(50, 100, (int) width - 100, (int) height - 200);
128 }
129
130 private void
131 initMainFrame() {
132 addMenu();
133 handleEvents();
134 }
135
136 private void
137 addMenu() {
138 JMenu m;
139 JMenu submenu;
140 JMenuItem mi;
141
142 setJMenuBar(menuBar);
143
144 // Actions
145 m = new JMenu(i18n.getMenuLabel("actions"));
146 menuBar.add(m);
147
148 mi = new JMenuItem(A4n.connect);
149 mi.setIcon(null);
150 //mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK));
151 m.add(mi);
152
153 mi = new JMenuItem(A4n.refresh);
154 mi.setIcon(null);
155 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
156 m.add(mi);
157
158 mi = new JMenuItem(A4n.resetSampler);
159 mi.setIcon(null);
160 m.add(mi);
161
162 mi = new JMenuItem(A4n.samplerInfo);
163 mi.setIcon(null);
164 m.add(mi);
165
166 m.addSeparator();
167
168 mi = new JMenuItem(i18n.getMenuLabel("actions.exit"));
169 m.add(mi);
170 mi.addActionListener(new ActionListener() {
171 public void
172 actionPerformed(ActionEvent e) { CC.cleanExit(); }
173 });
174
175 // Edit
176 m = new JMenu(i18n.getMenuLabel("edit"));
177 menuBar.add(m);
178
179 m.addSeparator();
180
181 mi = new JMenuItem(A4n.preferences);
182 mi.setIcon(null);
183 mi.setAccelerator(KeyStroke.getKeyStroke (
184 KeyEvent.VK_P, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
185 ));
186 m.add(mi);
187
188 // View
189 m = new JMenu(i18n.getMenuLabel("view"));
190 menuBar.add(m);
191
192 final JCheckBoxMenuItem cbmi =
193 new JCheckBoxMenuItem(i18n.getMenuLabel("view.toolbar"));
194
195 m.add(cbmi);
196 cbmi.setState(true);
197 cbmi.addActionListener(new ActionListener() {
198 public void
199 actionPerformed(ActionEvent e) {
200 if(cbmi.getState())
201 getContentPane().add(toolbar, BorderLayout.NORTH);
202 else getContentPane().remove(toolbar);
203
204 validate();
205 repaint();
206 }
207 });
208
209 final JCheckBoxMenuItem cbmi1 =
210 new JCheckBoxMenuItem(i18n.getMenuLabel("view.leftPane"));
211
212 m.add(cbmi1);
213 cbmi1.setState(true);
214 cbmi1.addActionListener(new ActionListener() {
215 public void
216 actionPerformed(ActionEvent e) { showLeftPane(cbmi1.getState()); }
217 });
218
219 final JCheckBoxMenuItem cbmi2 =
220 new JCheckBoxMenuItem(i18n.getMenuLabel("view.statusbar"));
221
222 m.add(cbmi2);
223 cbmi2.setState(true);
224 cbmi2.addActionListener(new ActionListener() {
225 public void
226 actionPerformed(ActionEvent e) {
227 statusbar.setVisible(cbmi2.getState());
228 }
229 });
230
231 // Channels
232 m = new JMenu(i18n.getMenuLabel("channels"));
233 menuBar.add(m);
234
235 mi = new JMenuItem(A4n.newChannel);
236 mi.setIcon(null);
237 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK));
238 m.add(mi);
239
240 mi = new JMenuItem(A4n.newChannelWizard);
241 mi.setIcon(null);
242 mi.setAccelerator(KeyStroke.getKeyStroke (
243 KeyEvent.VK_N, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK)
244 );
245 m.add(mi);
246
247 mi = new JMenuItem(A4n.duplicateChannels);
248 mi.setIcon(null);
249 m.add(mi);
250
251 m.addSeparator();
252
253 mi = new JMenuItem(A4n.moveChannelsOnTop);
254 mi.setIcon(null);
255 mi.setAccelerator(KeyStroke.getKeyStroke (
256 KeyEvent.VK_UP, KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK
257 ));
258 m.add(mi);
259
260 mi = new JMenuItem(A4n.moveChannelsUp);
261 mi.setIcon(null);
262 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_UP, KeyEvent.ALT_MASK));
263 m.add(mi);
264
265 mi = new JMenuItem(A4n.moveChannelsDown);
266 mi.setIcon(null);
267 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.ALT_MASK));
268 m.add(mi);
269
270 mi = new JMenuItem(A4n.moveChannelsAtBottom);
271 mi.setIcon(null);
272 mi.setAccelerator(KeyStroke.getKeyStroke (
273 KeyEvent.VK_DOWN, KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK
274 ));
275 m.add(mi);
276
277 tabsMenu.setEnabled(false);
278 m.add(tabsMenu);
279
280 m.addSeparator();
281
282 mi = new JMenuItem(A4n.selectAllChannels);
283 mi.setIcon(null);
284 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK));
285 m.add(mi);
286
287 mi = new JMenuItem(A4n.deselectChannels);
288 mi.setIcon(null);
289 mi.setAccelerator(KeyStroke.getKeyStroke (
290 KeyEvent.VK_A, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
291 ));
292 m.add(mi);
293
294 m.addSeparator();
295
296 mi = new JMenuItem(A4n.removeChannels);
297 mi.setIcon(null);
298 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, KeyEvent.SHIFT_MASK));
299 m.add(mi);
300
301
302 // Tabs
303 m = new JMenu(i18n.getMenuLabel("tabs"));
304 menuBar.add(m);
305
306 mi = new JMenuItem(A4n.newChannelsTab);
307 mi.setIcon(null);
308 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, KeyEvent.CTRL_MASK));
309 m.add(mi);
310
311 mi = new JMenuItem(A4n.editTabTitle);
312 mi.setIcon(null);
313 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0));
314 m.add(mi);
315
316 m.addSeparator();
317
318 mi = new JMenuItem(A4n.moveTab2Beginning);
319 mi.setIcon(null);
320 mi.setAccelerator(KeyStroke.getKeyStroke (
321 KeyEvent.VK_LEFT, KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK
322 ));
323 m.add(mi);
324
325 mi = new JMenuItem(A4n.moveTab2Left);
326 mi.setIcon(null);
327 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.ALT_MASK));
328 m.add(mi);
329
330 mi = new JMenuItem(A4n.moveTab2Right);
331 mi.setIcon(null);
332 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.ALT_MASK));
333 m.add(mi);
334
335 mi = new JMenuItem(A4n.moveTab2End);
336 mi.setIcon(null);
337 mi.setAccelerator(KeyStroke.getKeyStroke (
338 KeyEvent.VK_RIGHT, KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK
339 ));
340 m.add(mi);
341
342 m.addSeparator();
343
344 mi = new JMenuItem(A4n.closeChannelsTab);
345 mi.setIcon(null);
346 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, KeyEvent.CTRL_MASK));
347 m.add(mi);
348
349
350 // Help
351 m = new JMenu(i18n.getMenuLabel("help"));
352 menuBar.add(m);
353
354 mi = new JMenuItem(A4n.helpAbout);
355 mi.setIcon(null);
356 m.add(mi);
357 }
358
359 private void
360 showLeftPane(boolean b) {
361 mainPane.remove(splitPane);
362 mainPane.remove(channelsPane);
363
364 if(b) {
365 splitPane.setRightComponent(channelsPane);
366 mainPane.add(splitPane);
367 } else {
368 mainPane.add(channelsPane);
369 }
370
371 validate();
372 repaint();
373 }
374
375 private void
376 handleEvents() {
377 tabbedPane.addChangeListener(this);
378 }
379
380 public void
381 addChannelsPane(JSChannelsPane chnPane) {
382 insertChannelsPane(chnPane, getChannelsPaneCount());
383 }
384
385 public void
386 insertChannelsPane(JSChannelsPane chnPane, int idx) {
387 chnPane.addListSelectionListener(this);
388
389 if(getChannelsPaneCount() == 1) {
390 channelsPane.remove(getChannelsPane(0));
391 channelsPane.add(tabbedPane);
392 tabbedPane.addTab(getChannelsPane(0).getTitle(), getChannelsPane(0));
393 A4n.closeChannelsTab.setEnabled(true);
394 A4n.editTabTitle.setEnabled(true);
395 }
396
397 getChannelsPaneList().insertElementAt(chnPane, idx);
398 tabbedPane.insertTab(chnPane.getTitle(), null, chnPane, null, idx);
399 tabbedPane.setSelectedComponent(chnPane);
400 miList.insertElementAt(new JMenuItem(new A4n.MoveChannelsTo(chnPane)), idx);
401
402 updateTabsMenu();
403 }
404
405 public JSChannelsPane
406 getSelectedChannelsPane() {
407 if(getChannelsPaneList().size() == 1) return getChannelsPane(0);
408 return (JSChannelsPane)tabbedPane.getSelectedComponent();
409 }
410
411 public void
412 setSelectedChannelsPane(JSChannelsPane pane) {
413 if(getChannelsPaneList().size() == 1) return;
414 tabbedPane.setSelectedComponent(pane);
415 }
416
417 public boolean
418 removeChannelsPane(JSChannelsPane chnPane) {
419 chnPane.removeListSelectionListener(this);
420
421 tabbedPane.remove(chnPane);
422 boolean b = super.removeChannelsPane(chnPane);
423 for(int i = 0; i < miList.size(); i++) {
424 A4n.MoveChannelsTo a = (A4n.MoveChannelsTo)miList.get(i).getAction();
425 if(a.getChannelsPane().equals(chnPane)) {
426 miList.remove(i);
427 break;
428 }
429 }
430
431 updateTabsMenu();
432
433 if(getChannelsPaneCount() == 1) {
434 A4n.closeChannelsTab.setEnabled(false);
435 A4n.editTabTitle.setEnabled(false);
436 tabbedPane.remove(getChannelsPane(0));
437 channelsPane.remove(tabbedPane);
438 channelsPane.add(getChannelsPane(0));
439 }
440
441 return b;
442 }
443
444 private void
445 updateTabsMenu() {
446 tabsMenu.removeAll();
447
448 for(JMenuItem mi : miList) {
449 A4n.MoveChannelsTo a = (A4n.MoveChannelsTo)mi.getAction();
450 if(!a.getChannelsPane().equals(getSelectedChannelsPane())) tabsMenu.add(mi);
451 }
452
453 }
454
455 public void
456 updateTabTitle(JSChannelsPane chnPane) {
457 tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), chnPane.getTitle());
458 }
459
460 private void
461 checkChannelSelection(JSChannelsPane pane) {
462 if(!pane.hasSelectedChannel()) {
463 A4n.duplicateChannels.putValue (
464 Action.NAME, i18n.getMenuLabel("channels.duplicate")
465 );
466 A4n.duplicateChannels.setEnabled(false);
467
468 A4n.removeChannels.putValue (
469 Action.NAME, i18n.getMenuLabel("channels.RemoveChannel")
470 );
471 A4n.removeChannels.setEnabled(false);
472
473 tabsMenu.setEnabled(false);
474
475 A4n.moveChannelsOnTop.setEnabled(false);
476 A4n.moveChannelsUp.setEnabled(false);
477 A4n.moveChannelsDown.setEnabled(false);
478 A4n.moveChannelsAtBottom.setEnabled(false);
479
480 return;
481 }
482
483 A4n.duplicateChannels.setEnabled(true);
484 A4n.removeChannels.setEnabled(true);
485
486 if(getChannelsPaneCount() > 1) tabsMenu.setEnabled(true);
487
488 if(pane.getSelectedChannelCount() > 1) {
489 A4n.duplicateChannels.putValue (
490 Action.NAME, i18n.getMenuLabel("channels.duplicateChannels")
491 );
492 A4n.removeChannels.putValue (
493 Action.NAME, i18n.getMenuLabel("channels.RemoveChannels")
494 );
495 } else {
496 A4n.duplicateChannels.putValue (
497 Action.NAME, i18n.getMenuLabel("channels.duplicate")
498 );
499 A4n.removeChannels.putValue (
500 Action.NAME, i18n.getMenuLabel("channels.RemoveChannel")
501 );
502 }
503
504 A4n.moveChannelsOnTop.setEnabled(false);
505 A4n.moveChannelsUp.setEnabled(true);
506 A4n.moveChannelsDown.setEnabled(true);
507 A4n.moveChannelsAtBottom.setEnabled(false);
508
509 JSChannel[] chns = pane.getSelectedChannels();
510
511 for(int i = 0; i < chns.length; i++) {
512 if(pane.getChannel(i) != chns[i]) {
513 A4n.moveChannelsOnTop.setEnabled(true);
514 break;
515 }
516 }
517
518 if(chns[0] == pane.getFirstChannel()) A4n.moveChannelsUp.setEnabled(false);
519
520 if(chns[chns.length - 1] == pane.getLastChannel())
521 A4n.moveChannelsDown.setEnabled(false);
522
523 for(int i = chns.length - 1, j = pane.getChannelCount() - 1; i >= 0; i--, j--) {
524 if(pane.getChannel(j) != chns[i]) {
525 A4n.moveChannelsAtBottom.setEnabled(true);
526 break;
527 }
528 }
529 }
530
531 private void
532 checkTabSelection() {
533 int si = tabbedPane.getSelectedIndex();
534
535 if(si > 0) {
536 A4n.moveTab2Beginning.setEnabled(true);
537 A4n.moveTab2Left.setEnabled(true);
538 } else {
539 A4n.moveTab2Beginning.setEnabled(false);
540 A4n.moveTab2Left.setEnabled(false);
541 }
542
543 if(si != -1 && si < tabbedPane.getTabCount() - 1) {
544 A4n.moveTab2Right.setEnabled(true);
545 A4n.moveTab2End.setEnabled(true);
546 } else {
547 A4n.moveTab2Right.setEnabled(false);
548 A4n.moveTab2End.setEnabled(false);
549 }
550 }
551
552 /*public JTabbedPane
553 getTabbedPane() { return tabbedPane; }*/
554
555 public JMenu
556 getTabsMenu() { return tabsMenu; }
557
558 public void
559 stateChanged(ChangeEvent e) {
560 updateTabsMenu();
561 checkChannelSelection(getSelectedChannelsPane());
562 checkTabSelection();
563 }
564
565 public void
566 valueChanged(ListSelectionEvent e) {
567 if(e.getValueIsAdjusting()) return;
568 if(e.getSource() != getSelectedChannelsPane()) return;
569
570 checkChannelSelection(getSelectedChannelsPane());
571 }
572
573 public void
574 moveTab2Beginning() {
575 int idx = tabbedPane.getSelectedIndex();
576 if(idx < 1) {
577 CC.getLogger().info("Can't move tab to beginning");
578 return;
579 }
580
581 JSChannelsPane c = (JSChannelsPane)tabbedPane.getSelectedComponent();
582 if(getChannelsPane(idx) != c)
583 CC.getLogger().warning("Channels pane indices don't match");
584 removeChannelsPane(c);
585 insertChannelsPane(c, 0);
586 tabbedPane.setSelectedComponent(c);
587 }
588
589 public void
590 moveTab2Left() {
591 int idx = tabbedPane.getSelectedIndex();
592 if(idx < 1) {
593 CC.getLogger().info("Can't move tab to left");
594 return;
595 }
596
597
598 JSChannelsPane c = (JSChannelsPane)tabbedPane.getSelectedComponent();
599 if(getChannelsPane(idx) != c)
600 CC.getLogger().warning("Channels pane indices don't match");
601 removeChannelsPane(c);
602 insertChannelsPane(c, idx - 1);
603 tabbedPane.setSelectedComponent(c);
604 }
605
606 public void
607 moveTab2Right() {
608 int idx = tabbedPane.getSelectedIndex();
609 if(idx == -1 && idx >= tabbedPane.getTabCount()) {
610 CC.getLogger().info("Can't move tab to right");
611 return;
612 }
613
614 JSChannelsPane c = (JSChannelsPane)tabbedPane.getSelectedComponent();
615 if(getChannelsPane(idx) != c)
616 CC.getLogger().warning("Channels pane indices don't match");
617 removeChannelsPane(c);
618 insertChannelsPane(c, idx + 1);
619 tabbedPane.setSelectedComponent(c);
620 }
621
622 public void
623 moveTab2End() {
624 int idx = tabbedPane.getSelectedIndex();
625 if(idx == -1 && idx >= tabbedPane.getTabCount()) {
626 CC.getLogger().info("Can't move tab to right");
627 return;
628 }
629
630 JSChannelsPane c = (JSChannelsPane)tabbedPane.getSelectedComponent();
631 if(getChannelsPane(idx) != c)
632 CC.getLogger().warning("Channels pane indices don't match");
633 removeChannelsPane(c);
634 addChannelsPane(c);
635 tabbedPane.setSelectedComponent(c);
636 }
637 }

  ViewVC Help
Powered by ViewVC