/[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 1496 - (show annotations) (download)
Mon Nov 19 22:22:22 2007 UTC (16 years, 5 months ago) by iliev
File size: 32369 byte(s)
* Added option for turning off the custom window decoration
  (choose Edit/Preferences, then click the `View' tab)
* Added new menu item: Help/Online Tutorial
* Fantasia: first step of implementing a theme manager
* Fantasia: fixed the view of the channel's stream/voice count statistic
* some minor GUI fixes and enhancements

1 /*
2 * JSampler - a java front-end for LinuxSampler
3 *
4 * Copyright (C) 2005-2007 Grigor Iliev <grigor@grigoriliev.com>
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.Color;
27 import java.awt.Dialog;
28 import java.awt.Dimension;
29 import java.awt.Frame;
30
31 import java.awt.event.ActionEvent;
32 import java.awt.event.ActionListener;
33 import java.awt.event.KeyEvent;
34
35 import java.io.BufferedReader;
36 import java.io.File;
37 import java.io.FileNotFoundException;
38 import java.io.FileReader;
39 import java.io.StringReader;
40
41 import java.util.logging.Level;
42 import java.util.Vector;
43
44 import javax.swing.Action;
45 import javax.swing.ImageIcon;
46 import javax.swing.JCheckBoxMenuItem;
47 import javax.swing.JFileChooser;
48 import javax.swing.JMenu;
49 import javax.swing.JMenuBar;
50 import javax.swing.JMenuItem;
51 import javax.swing.JPanel;
52 import javax.swing.JSplitPane;
53 import javax.swing.JTabbedPane;
54 import javax.swing.KeyStroke;
55
56 import javax.swing.event.ChangeEvent;
57 import javax.swing.event.ChangeListener;
58 import javax.swing.event.ListSelectionEvent;
59 import javax.swing.event.ListSelectionListener;
60
61 import net.sf.juife.NavigationPage;
62 import net.sf.juife.NavigationPane;
63
64 import org.jsampler.CC;
65 import org.jsampler.HF;
66 import org.jsampler.LSConsoleModel;
67 import org.jsampler.OrchestraModel;
68 import org.jsampler.Prefs;
69
70 import org.jsampler.view.JSChannel;
71 import org.jsampler.view.JSChannelsPane;
72 import org.jsampler.view.LscpFileFilter;
73
74 import org.jsampler.view.std.JSDetailedErrorDlg;
75 import org.jsampler.view.std.JSamplerHomeChooser;
76
77 import static org.jsampler.view.classic.A4n.a4n;
78 import static org.jsampler.view.classic.ClassicI18n.i18n;
79 import static org.jsampler.view.classic.ClassicPrefs.preferences;
80 import static org.jsampler.view.classic.LeftPane.getLeftPane;
81 import static org.jsampler.view.std.StdPrefs.*;
82
83 /**
84 *
85 * @author Grigor Iliev
86 */
87 public class
88 MainFrame extends org.jsampler.view.JSMainFrame implements ChangeListener, ListSelectionListener {
89 public static ImageIcon applicationIcon = Res.appIcon;
90
91 private final ChannelsBar channelsBar = new ChannelsBar();
92 private final Statusbar statusbar = new Statusbar();
93 private final JMenuBar menuBar = new JMenuBar();
94 private final JMenu recentScriptsMenu =
95 new JMenu(i18n.getMenuLabel("actions.recentScripts"));
96 private final JMenu tabsMenu = new JMenu(i18n.getMenuLabel("channels.MoveToTab"));
97
98 private final JSplitPane vSplitPane;
99 private final JSplitPane hSplitPane;
100
101 private final JPanel mainPane = new JPanel();
102 private final StandardBar standardBar = new StandardBar();
103 private final JPanel channelsPane = new JPanel(new BorderLayout());
104 private final JPanel rightPane = new JPanel();
105 private final JPanel bottomPane = new JPanel();
106 private final LSConsolePane lsConsolePane = new LSConsolePane(this);
107 private LSConsoleDlg lsConsoleDlg = null;
108
109 private final JTabbedPane tabbedPane =
110 new JTabbedPane(JTabbedPane.BOTTOM, JTabbedPane.SCROLL_TAB_LAYOUT);
111 private final Vector<JMenuItem> miList = new Vector<JMenuItem>();
112
113 private final JCheckBoxMenuItem cbmiLeftPaneVisible =
114 new JCheckBoxMenuItem(i18n.getMenuLabel("view.leftPane"));
115
116 private final JCheckBoxMenuItem cbmiStandardBarVisible =
117 new JCheckBoxMenuItem(i18n.getMenuLabel("view.toolbars.standard"));
118
119 private final JCheckBoxMenuItem cbmiLSConsoleShown =
120 new JCheckBoxMenuItem(i18n.getMenuLabel("view.lsconsole"));
121
122 private boolean lsConsolePopOut;
123
124 private final Vector<String> recentScripts = new Vector<String>();
125
126
127 /** Creates a new instance of <code>MainFrame</code>. */
128 public
129 MainFrame() {
130 setTitle(i18n.getLabel("MainFrame.title"));
131
132 getContentPane().add(standardBar, BorderLayout.NORTH);
133 getContentPane().add(mainPane);
134
135 mainPane.setLayout(new BorderLayout());
136 mainPane.add(statusbar, BorderLayout.SOUTH);
137
138 ChannelsPane p = new ChannelsPane("Untitled");
139 p.addListSelectionListener(this);
140 getChannelsPaneList().add(p);
141 miList.add(new JMenuItem(new A4n.MoveChannelsTo(p)));
142
143 channelsPane.add(getChannelsPane(0));
144
145 bottomPane.setLayout(new BorderLayout());
146
147 rightPane.setLayout(new BorderLayout());
148
149 rightPane.add(channelsBar, BorderLayout.NORTH);
150 rightPane.add(channelsPane);
151
152 hSplitPane = new JSplitPane (
153 JSplitPane.HORIZONTAL_SPLIT,
154 true, // continuousLayout
155 getLeftPane(),
156 rightPane
157 );
158
159 hSplitPane.setOneTouchExpandable(true);
160 if(ClassicPrefs.getSaveWindowProperties()) {
161 hSplitPane.setDividerLocation(ClassicPrefs.getHSplitDividerLocation());
162 }
163
164 mainPane.add(hSplitPane);
165
166
167 vSplitPane = new JSplitPane (
168 JSplitPane.VERTICAL_SPLIT,
169 true, // continuousLayout
170 channelsPane,
171 bottomPane
172 );
173
174 vSplitPane.setDividerSize(3);
175 vSplitPane.setDividerLocation(ClassicPrefs.getVSplitDividerLocation());
176
177 rightPane.add(vSplitPane);
178
179 if(applicationIcon != null) setIconImage(applicationIcon.getImage());
180
181 initMainFrame();
182
183 pack();
184
185 if(ClassicPrefs.getSaveWindowProperties()) setSavedSize();
186 else setDefaultSize();
187
188 if(ClassicPrefs.getSaveLeftPaneState()) {
189 NavigationPage page =
190 getLeftPane().getPages()[ClassicPrefs.getLeftPanePageIndex()];
191
192 getLeftPane().getModel().addPage(page);
193 getLeftPane().getModel().clearHistory();
194
195 int idx = ClassicPrefs.getCurrentOrchestraIndex();
196 if(idx >= 0 && idx < CC.getOrchestras().getOrchestraCount()) {
197 OrchestraModel om = CC.getOrchestras().getOrchestra(idx);
198 getLeftPane().getOrchestrasPage().setSelectedOrchestra(om);
199 }
200 }
201
202 //CC.getInstrumentsDbTreeModel(); // used to initialize the db tree model
203 }
204
205 /** Invoked when this window is about to close. */
206 protected void
207 onWindowClose() {
208 if(ClassicPrefs.getSaveWindowProperties()) {
209 ClassicPrefs.setWindowMaximized (
210 "Mainframe", (getExtendedState() & MAXIMIZED_BOTH) == MAXIMIZED_BOTH
211 );
212
213 setVisible(false);
214 if(ClassicPrefs.getWindowMaximized("Mainframe")) {
215 //setExtendedState(getExtendedState() & ~MAXIMIZED_BOTH);
216 CC.cleanExit();
217 return;
218 }
219
220 java.awt.Point p = getLocation();
221 Dimension d = getSize();
222 StringBuffer sb = new StringBuffer();
223 sb.append(p.x).append(',').append(p.y).append(',');
224 sb.append(d.width).append(',').append(d.height);
225 ClassicPrefs.setWindowSizeAndLocation("Mainframe", sb.toString());
226
227 ClassicPrefs.setHSplitDividerLocation(hSplitPane.getDividerLocation());
228 }
229
230 if(ClassicPrefs.getSaveLeftPaneState()) {
231 int idx = 0;
232 for(int i = 0; i < getLeftPane().getPages().length; i++) {
233 if(getLeftPane().getPages()[i] == getLeftPane().getCurrentPage()) {
234 idx = i;
235 break;
236 }
237 }
238
239 ClassicPrefs.setLeftPanePageIndex(idx);
240
241 idx = getLeftPane().getOrchestrasPage().getCurrentOrchestraIndex();
242
243 if(idx >= 0 && idx < CC.getOrchestras().getOrchestraCount())
244 ClassicPrefs.setCurrentOrchestraIndex(idx);
245 }
246
247 String[] list = recentScripts.toArray(new String[recentScripts.size()]);
248 preferences().setStringListProperty(RECENT_LSCP_SCRIPTS, list);
249
250 if(preferences().getBoolProperty(SAVE_LS_CONSOLE_HISTORY)) {
251 lsConsolePane.saveConsoleHistory();
252 }
253
254 ClassicPrefs.setShowLSConsole(isLSConsoleShown());
255 ClassicPrefs.setLSConsolePopOut(isLSConsolePopOut());
256
257 ClassicPrefs.setVSplitDividerLocation(vSplitPane.getDividerLocation());
258 super.onWindowClose();
259 }
260
261 private void
262 initMainFrame() {
263 addMenu();
264 handleEvents();
265 }
266
267 private void
268 setDefaultSize() {
269 Dimension dimension = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
270 double width = dimension.getWidth();
271 double height = dimension.getHeight();
272 setBounds(50, 100, (int) width - 100, (int) height - 200);
273 }
274
275 private void
276 setSavedSize() {
277 String s = ClassicPrefs.getWindowSizeAndLocation("Mainframe");
278 if(s == null) {
279 setDefaultSize();
280 return;
281 }
282
283 try {
284 int i = s.indexOf(',');
285 int x = Integer.parseInt(s.substring(0, i));
286
287 s = s.substring(i + 1);
288 i = s.indexOf(',');
289 int y = Integer.parseInt(s.substring(0, i));
290
291 s = s.substring(i + 1);
292 i = s.indexOf(',');
293 int width = Integer.parseInt(s.substring(0, i));
294
295 s = s.substring(i + 1);
296 int height = Integer.parseInt(s);
297
298 setBounds(x, y, width, height);
299 } catch(Exception x) {
300 String msg = "Parsing of window size and location string failed";
301 CC.getLogger().log(Level.INFO, msg, x);
302 setDefaultSize();
303 }
304
305 if(ClassicPrefs.getWindowMaximized("Mainframe"))
306 setExtendedState(getExtendedState() | MAXIMIZED_BOTH);
307 }
308
309 private void
310 addMenu() {
311 JMenu m;
312 JMenuItem mi;
313
314 setJMenuBar(menuBar);
315
316 // Actions
317 m = new JMenu(i18n.getMenuLabel("actions"));
318 menuBar.add(m);
319
320 mi = new JMenuItem(a4n.connect);
321 mi.setIcon(null);
322 //mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK));
323 m.add(mi);
324
325 mi = new JMenuItem(a4n.refresh);
326 mi.setIcon(null);
327 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
328 m.add(mi);
329
330 mi = new JMenuItem(a4n.resetSampler);
331 mi.setIcon(null);
332 m.add(mi);
333
334 mi = new JMenuItem(A4n.samplerInfo);
335 mi.setIcon(null);
336 m.add(mi);
337
338 JMenu midiInstrMenu = new JMenu(i18n.getMenuLabel("actions.midiInstruments"));
339 m.add(midiInstrMenu);
340
341 mi = new JMenuItem(A4n.addMidiInstrumentMap);
342 mi.setIcon(null);
343 midiInstrMenu.add(mi);
344
345 mi = new JMenuItem(A4n.removeMidiInstrumentMap);
346 mi.setIcon(null);
347 midiInstrMenu.add(mi);
348
349 mi = new JMenuItem(A4n.addMidiInstrumentWizard);
350 mi.setIcon(null);
351 midiInstrMenu.add(mi);
352
353 m.addSeparator();
354
355 JMenu exportMenu = new JMenu(i18n.getMenuLabel("actions.export"));
356 m.add(exportMenu);
357
358 mi = new JMenuItem(a4n.exportSamplerConfig);
359 mi.setIcon(null);
360 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK));
361 exportMenu.add(mi);
362
363 mi = new JMenuItem(a4n.exportMidiInstrumentMaps);
364 mi.setIcon(null);
365 exportMenu.add(mi);
366
367 m.addSeparator();
368
369 mi = new JMenuItem(A4n.loadScript);
370 mi.setIcon(null);
371 m.add(mi);
372
373 String[] list = preferences().getStringListProperty(RECENT_LSCP_SCRIPTS);
374 for(String s : list) recentScripts.add(s);
375
376 updateRecentScriptsMenu();
377
378 m.add(recentScriptsMenu);
379
380 m.addSeparator();
381
382 mi = new JMenuItem(i18n.getMenuLabel("actions.exit"));
383 m.add(mi);
384 mi.addActionListener(new ActionListener() {
385 public void
386 actionPerformed(ActionEvent e) { onWindowClose(); }
387 });
388
389 // Edit
390 m = new JMenu(i18n.getMenuLabel("edit"));
391 menuBar.add(m);
392
393 mi = new JMenuItem(i18n.getMenuLabel("edit.audioDevices"));
394 m.add(mi);
395 mi.addActionListener(new ActionListener() {
396 public void
397 actionPerformed(ActionEvent e) {
398 if(!isLeftPaneVisible()) cbmiLeftPaneVisible.doClick(0);
399 LeftPane.getLeftPane().showAudioDevicesPage();
400 }
401 });
402
403 mi = new JMenuItem(i18n.getMenuLabel("edit.midiDevices"));
404 m.add(mi);
405 mi.addActionListener(new ActionListener() {
406 public void
407 actionPerformed(ActionEvent e) {
408 if(!isLeftPaneVisible()) cbmiLeftPaneVisible.doClick(0);
409 LeftPane.getLeftPane().showMidiDevicesPage();
410 }
411 });
412
413 mi = new JMenuItem(i18n.getMenuLabel("edit.orchestras"));
414 m.add(mi);
415 mi.addActionListener(new ActionListener() {
416 public void
417 actionPerformed(ActionEvent e) {
418 if(!isLeftPaneVisible()) cbmiLeftPaneVisible.doClick(0);
419 LeftPane.getLeftPane().showManageOrchestrasPage();
420 }
421 });
422
423 m.addSeparator();
424
425 mi = new JMenuItem(A4n.preferences);
426 mi.setIcon(null);
427 mi.setAccelerator(KeyStroke.getKeyStroke (
428 KeyEvent.VK_P, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
429 ));
430 m.add(mi);
431
432 // View
433 m = new JMenu(i18n.getMenuLabel("view"));
434 menuBar.add(m);
435
436 JMenu toolbarsMenu = new JMenu(i18n.getMenuLabel("view.toolbars"));
437 m.add(toolbarsMenu);
438
439 toolbarsMenu.add(cbmiStandardBarVisible);
440 cbmiStandardBarVisible.addActionListener(new ActionListener() {
441 public void
442 actionPerformed(ActionEvent e) {
443 showStandardBar(cbmiStandardBarVisible.getState());
444 }
445 });
446
447 boolean b = ClassicPrefs.shouldShowStandardBar();
448 cbmiStandardBarVisible.setSelected(b);
449 showStandardBar(b);
450
451 final JCheckBoxMenuItem cbmi =
452 new JCheckBoxMenuItem(i18n.getMenuLabel("view.toolbars.channels"));
453
454 toolbarsMenu.add(cbmi);
455 cbmi.addActionListener(new ActionListener() {
456 public void
457 actionPerformed(ActionEvent e) { showChannelsBar(cbmi.getState()); }
458 });
459
460 b = ClassicPrefs.shouldShowChannelsBar();
461 cbmi.setSelected(b);
462 showChannelsBar(b);
463
464 m.add(cbmiLeftPaneVisible);
465 cbmiLeftPaneVisible.addActionListener(new ActionListener() {
466 public void
467 actionPerformed(ActionEvent e) {
468 showLeftPane(cbmiLeftPaneVisible.getState());
469 }
470 });
471
472 b = ClassicPrefs.shouldShowLeftPane();
473 cbmiLeftPaneVisible.setSelected(b);
474 showLeftPane(b);
475
476 final JCheckBoxMenuItem cbmi2 =
477 new JCheckBoxMenuItem(i18n.getMenuLabel("view.statusbar"));
478
479 m.add(cbmi2);
480 cbmi2.addActionListener(new ActionListener() {
481 public void
482 actionPerformed(ActionEvent e) { showStatusbar(cbmi2.getState()); }
483 });
484 b = ClassicPrefs.shouldShowStatusbar();
485 cbmi2.setSelected(b);
486 showStatusbar(b);
487
488 m.addSeparator();
489
490 setLSConsolePopOut(ClassicPrefs.isLSConsolePopOut());
491 cbmiLSConsoleShown.setSelected(ClassicPrefs.shouldShowLSConsole());
492 showLSConsole(ClassicPrefs.shouldShowLSConsole());
493
494 cbmiLSConsoleShown.addActionListener(new ActionListener() {
495 public void
496 actionPerformed(ActionEvent e) {
497 showLSConsole(cbmiLSConsoleShown.isSelected());
498 }
499 });
500 m.add(cbmiLSConsoleShown);
501
502 lsConsolePane.updateLSConsoleViewMode();
503
504 // Channels
505 m = new JMenu(i18n.getMenuLabel("channels"));
506 menuBar.add(m);
507
508 mi = new JMenuItem(A4n.newChannel);
509 mi.setIcon(null);
510 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK));
511 m.add(mi);
512
513 mi = new JMenuItem(A4n.newChannelWizard);
514 mi.setIcon(null);
515 mi.setAccelerator(KeyStroke.getKeyStroke (
516 KeyEvent.VK_N, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK)
517 );
518 m.add(mi);
519
520 mi = new JMenuItem(A4n.duplicateChannels);
521 mi.setIcon(null);
522 m.add(mi);
523
524 m.addSeparator();
525
526 mi = new JMenuItem(A4n.moveChannelsOnTop);
527 mi.setIcon(null);
528 mi.setAccelerator(KeyStroke.getKeyStroke (
529 KeyEvent.VK_UP, KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK
530 ));
531 m.add(mi);
532
533 mi = new JMenuItem(A4n.moveChannelsUp);
534 mi.setIcon(null);
535 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_UP, KeyEvent.ALT_MASK));
536 m.add(mi);
537
538 mi = new JMenuItem(A4n.moveChannelsDown);
539 mi.setIcon(null);
540 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.ALT_MASK));
541 m.add(mi);
542
543 mi = new JMenuItem(A4n.moveChannelsAtBottom);
544 mi.setIcon(null);
545 mi.setAccelerator(KeyStroke.getKeyStroke (
546 KeyEvent.VK_DOWN, KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK
547 ));
548 m.add(mi);
549
550 tabsMenu.setEnabled(false);
551 m.add(tabsMenu);
552
553 m.addSeparator();
554
555 mi = new JMenuItem(A4n.selectAllChannels);
556 mi.setIcon(null);
557 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK));
558 m.add(mi);
559
560 mi = new JMenuItem(A4n.deselectChannels);
561 mi.setIcon(null);
562 mi.setAccelerator(KeyStroke.getKeyStroke (
563 KeyEvent.VK_A, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
564 ));
565 m.add(mi);
566
567 m.addSeparator();
568
569 mi = new JMenuItem(A4n.removeChannels);
570 mi.setIcon(null);
571 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, KeyEvent.SHIFT_MASK));
572 m.add(mi);
573
574
575 // Tabs
576 m = new JMenu(i18n.getMenuLabel("tabs"));
577 menuBar.add(m);
578
579 mi = new JMenuItem(A4n.newChannelsTab);
580 mi.setIcon(null);
581 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, KeyEvent.CTRL_MASK));
582 m.add(mi);
583
584 mi = new JMenuItem(A4n.editTabTitle);
585 mi.setIcon(null);
586 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0));
587 m.add(mi);
588
589 m.addSeparator();
590
591 mi = new JMenuItem(A4n.moveTab2Beginning);
592 mi.setIcon(null);
593 mi.setAccelerator(KeyStroke.getKeyStroke (
594 KeyEvent.VK_LEFT, KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK
595 ));
596 m.add(mi);
597
598 mi = new JMenuItem(A4n.moveTab2Left);
599 mi.setIcon(null);
600 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.ALT_MASK));
601 m.add(mi);
602
603 mi = new JMenuItem(A4n.moveTab2Right);
604 mi.setIcon(null);
605 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.ALT_MASK));
606 m.add(mi);
607
608 mi = new JMenuItem(A4n.moveTab2End);
609 mi.setIcon(null);
610 mi.setAccelerator(KeyStroke.getKeyStroke (
611 KeyEvent.VK_RIGHT, KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK
612 ));
613 m.add(mi);
614
615 m.addSeparator();
616
617 mi = new JMenuItem(A4n.closeChannelsTab);
618 mi.setIcon(null);
619 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, KeyEvent.CTRL_MASK));
620 m.add(mi);
621
622
623 // Window
624 m = new JMenu(i18n.getMenuLabel("window"));
625 menuBar.add(m);
626
627 mi = new JMenuItem(A4n.windowInstrumentsDb);
628 mi.setIcon(null);
629 m.add(mi);
630
631
632 // Help
633 m = new JMenu(i18n.getMenuLabel("help"));
634
635 mi = new JMenuItem(A4n.helpAbout);
636 mi.setIcon(null);
637 m.add(mi);
638
639 m.addSeparator();
640
641 mi = new JMenuItem(a4n.browseOnlineTutorial);
642 mi.setIcon(null);
643 m.add(mi);
644
645 menuBar.add(m);
646 }
647
648 private class RecentScriptHandler implements ActionListener {
649 private String script;
650
651 RecentScriptHandler(String script) { this.script = script; }
652
653 public void
654 actionPerformed(ActionEvent e) { runScript(script); }
655 }
656
657 private void
658 handleEvents() {
659 tabbedPane.addChangeListener(this);
660 }
661
662 private void
663 showChannelsBar(boolean b) {
664 channelsBar.setVisible(b);
665 ClassicPrefs.setShowChannelsBar(b);
666
667 validate();
668 repaint();
669 }
670
671 private void
672 showStatusbar(boolean b) {
673 ClassicPrefs.setShowStatusbar(b);
674 statusbar.setVisible(b);
675 }
676
677 protected boolean
678 isLeftPaneVisible() { return cbmiLeftPaneVisible.isSelected(); }
679
680 protected void
681 setLeftPaneVisible(boolean b) {
682 if(b != cbmiLeftPaneVisible.isSelected()) cbmiLeftPaneVisible.doClick(0);
683 }
684
685 protected boolean
686 isLSConsoleVisible() { return cbmiLSConsoleShown.isSelected(); }
687
688 protected void
689 setLSConsoleVisible(boolean b) {
690 if(b != cbmiLSConsoleShown.isSelected()) cbmiLSConsoleShown.doClick(0);
691 }
692
693 private void
694 showLeftPane(boolean b) {
695 ClassicPrefs.setShowLeftPane(b);
696
697 mainPane.remove(hSplitPane);
698 mainPane.remove(rightPane);
699
700 if(b) {
701 hSplitPane.setRightComponent(rightPane);
702 mainPane.add(hSplitPane);
703 if(ClassicPrefs.getSaveWindowProperties()) {
704 int i = ClassicPrefs.getHSplitDividerLocation();
705 hSplitPane.setDividerLocation(i);
706 }
707 } else {
708 mainPane.add(rightPane);
709 }
710
711 validate();
712 repaint();
713 }
714
715 private void
716 showStandardBar(boolean b) {
717 ClassicPrefs.setShowStandardBar(b);
718 standardBar.setVisible(b);
719 validate();
720 repaint();
721 }
722
723 private void
724 showBottomPane(boolean b) {
725 if(!b) ClassicPrefs.setVSplitDividerLocation(vSplitPane.getDividerLocation());
726
727 rightPane.remove(vSplitPane);
728 rightPane.remove(channelsPane);
729
730 if(b) {
731 vSplitPane.setTopComponent(channelsPane);
732 rightPane.add(vSplitPane);
733 vSplitPane.setDividerLocation(ClassicPrefs.getVSplitDividerLocation());
734 } else {
735 rightPane.add(channelsPane);
736 }
737
738 validate();
739 repaint();
740 }
741
742 protected void
743 setLSConsolePopOut(boolean b) {
744 if(b == lsConsolePopOut) return;
745
746 lsConsolePopOut = b;
747
748 if(isLSConsoleShown()) setLSConsolePopOut0(b);
749 }
750
751 /**
752 * Changes the pop-out state of the LS Console.
753 * Invoke this method only when LS Console is shown.
754 */
755 private void
756 setLSConsolePopOut0(boolean b) {
757 if(b) {
758 bottomPane.remove(lsConsolePane);
759 showBottomPane(false);
760
761 lsConsoleDlg = new LSConsoleDlg(this, lsConsolePane);
762 lsConsoleDlg.setVisible(true);
763 } else {
764 if(lsConsoleDlg != null) lsConsoleDlg.setVisible(false);
765 lsConsoleDlg = null;
766 bottomPane.add(lsConsolePane);
767 showBottomPane(true);
768 }
769 }
770
771 protected boolean
772 isLSConsolePopOut() { return lsConsolePopOut; }
773
774 protected boolean
775 isLSConsoleShown() { return cbmiLSConsoleShown.isSelected(); }
776
777 protected void
778 setLSConsoleShown(boolean b) { cbmiLSConsoleShown.setSelected(b); }
779
780 protected LSConsoleModel
781 getLSConsoleModel() { return lsConsolePane.getModel(); }
782
783 /**
784 * Sets the text color of the LS Console.
785 * @param c The text color of the LS Console.
786 */
787 protected void
788 setLSConsoleTextColor(Color c) { lsConsolePane.setTextColor(c); }
789
790 /**
791 * Sets the background color of the LS Console.
792 * @param c The background color of the LS Console.
793 */
794 protected void
795 setLSConsoleBackgroundColor(Color c) { lsConsolePane.setBackgroundColor(c); }
796
797 /**
798 * Sets the notification messages' color of the LS Console.
799 * @param c The notification messages' color of the LS Console.
800 */
801 protected void
802 setLSConsoleNotifyColor(Color c) { lsConsolePane.setNotifyColor(c); }
803
804 /**
805 * Sets the warning messages' color of the LS Console.
806 * @param c The warning messages' color of the LS Console.
807 */
808 protected void
809 setLSConsoleWarningColor(Color c) { lsConsolePane.setWarningColor(c); }
810
811 /**
812 * Sets the error messages' color of the LS Console.
813 * @param c The error messages' color of the LS Console.
814 */
815 protected void
816 setLSConsoleErrorColor(Color c) { lsConsolePane.setErrorColor(c); }
817
818 protected void
819 showLSConsole(boolean b) {
820 if(!b) {
821 showBottomPane(false);
822 if(lsConsoleDlg != null) lsConsoleDlg.setVisible(false);
823 lsConsolePane.hideAutoCompleteWindow();
824 return;
825 }
826
827 setLSConsolePopOut0(isLSConsolePopOut());
828 }
829
830 /**
831 * Adds the specified <code>JSChannelsPane</code> to the view.
832 * @param chnPane The <code>JSChannelsPane</code> to be added.
833 */
834 public void
835 addChannelsPane(JSChannelsPane chnPane) {
836 insertChannelsPane(chnPane, getChannelsPaneCount());
837 }
838
839 public void
840 insertChannelsPane(JSChannelsPane chnPane, int idx) {
841 chnPane.addListSelectionListener(this);
842
843 if(getChannelsPaneCount() == 1) {
844 channelsPane.remove(getChannelsPane(0));
845 channelsPane.add(tabbedPane);
846 tabbedPane.addTab(getChannelsPane(0).getTitle(), getChannelsPane(0));
847 A4n.closeChannelsTab.setEnabled(true);
848 A4n.editTabTitle.setEnabled(true);
849 }
850
851 getChannelsPaneList().insertElementAt(chnPane, idx);
852 tabbedPane.insertTab(chnPane.getTitle(), null, chnPane, null, idx);
853 tabbedPane.setSelectedComponent(chnPane);
854 miList.insertElementAt(new JMenuItem(new A4n.MoveChannelsTo(chnPane)), idx);
855
856 updateTabsMenu();
857 }
858
859 /**
860 * Gets the <code>JSChannelsPane</code> that is currently shown.
861 * @return The currently shown <code>JSChannelsPane</code>.
862 */
863 public JSChannelsPane
864 getSelectedChannelsPane() {
865 if(getChannelsPaneList().size() == 1) return getChannelsPane(0);
866 return (JSChannelsPane)tabbedPane.getSelectedComponent();
867 }
868
869 /**
870 * Sets the <code>JSChannelsPane</code> to be selected.
871 * @param pane The <code>JSChannelsPane</code> to be shown.
872 */
873 public void
874 setSelectedChannelsPane(JSChannelsPane pane) {
875 if(getChannelsPaneList().size() == 1) return;
876 tabbedPane.setSelectedComponent(pane);
877 }
878
879 /**
880 * Removes the specified <code>JSChannelsPane</code> from the view.
881 * @param chnPane The <code>JSChannelsPane</code> to be removed.
882 * @return <code>true</code> if the specified code>JSChannelsPane</code>
883 * is actually removed from the view, <code>false</code> otherwise.
884 */
885 public boolean
886 removeChannelsPane(JSChannelsPane chnPane) {
887 chnPane.removeListSelectionListener(this);
888
889 tabbedPane.remove(chnPane);
890 boolean b = super.removeChannelsPane(chnPane);
891 for(int i = 0; i < miList.size(); i++) {
892 A4n.MoveChannelsTo a = (A4n.MoveChannelsTo)miList.get(i).getAction();
893 if(a.getChannelsPane().equals(chnPane)) {
894 miList.remove(i);
895 break;
896 }
897 }
898
899 updateTabsMenu();
900
901 if(getChannelsPaneCount() == 1) {
902 A4n.closeChannelsTab.setEnabled(false);
903 A4n.editTabTitle.setEnabled(false);
904 tabbedPane.remove(getChannelsPane(0));
905 channelsPane.remove(tabbedPane);
906 channelsPane.add(getChannelsPane(0));
907 }
908
909 return b;
910 }
911
912 private void
913 updateTabsMenu() {
914 tabsMenu.removeAll();
915
916 for(JMenuItem mi : miList) {
917 A4n.MoveChannelsTo a = (A4n.MoveChannelsTo)mi.getAction();
918 if(!a.getChannelsPane().equals(getSelectedChannelsPane())) tabsMenu.add(mi);
919 }
920
921 }
922
923 public void
924 updateTabTitle(JSChannelsPane chnPane) {
925 tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), chnPane.getTitle());
926 }
927
928 private void
929 checkChannelSelection(JSChannelsPane pane) {
930 if(!pane.hasSelectedChannel()) {
931 A4n.duplicateChannels.putValue (
932 Action.NAME, i18n.getMenuLabel("channels.duplicate")
933 );
934 A4n.duplicateChannels.setEnabled(false);
935
936 A4n.removeChannels.putValue (
937 Action.NAME, i18n.getMenuLabel("channels.RemoveChannel")
938 );
939 A4n.removeChannels.setEnabled(false);
940
941 tabsMenu.setEnabled(false);
942
943 A4n.moveChannelsOnTop.setEnabled(false);
944 A4n.moveChannelsUp.setEnabled(false);
945 A4n.moveChannelsDown.setEnabled(false);
946 A4n.moveChannelsAtBottom.setEnabled(false);
947
948 return;
949 }
950
951 A4n.duplicateChannels.setEnabled(true);
952 A4n.removeChannels.setEnabled(true);
953
954 if(getChannelsPaneCount() > 1) tabsMenu.setEnabled(true);
955
956 if(pane.getSelectedChannelCount() > 1) {
957 A4n.duplicateChannels.putValue (
958 Action.NAME, i18n.getMenuLabel("channels.duplicateChannels")
959 );
960 A4n.removeChannels.putValue (
961 Action.NAME, i18n.getMenuLabel("channels.RemoveChannels")
962 );
963 } else {
964 A4n.duplicateChannels.putValue (
965 Action.NAME, i18n.getMenuLabel("channels.duplicate")
966 );
967 A4n.removeChannels.putValue (
968 Action.NAME, i18n.getMenuLabel("channels.RemoveChannel")
969 );
970 }
971
972 A4n.moveChannelsOnTop.setEnabled(false);
973 A4n.moveChannelsUp.setEnabled(true);
974 A4n.moveChannelsDown.setEnabled(true);
975 A4n.moveChannelsAtBottom.setEnabled(false);
976
977 JSChannel[] chns = pane.getSelectedChannels();
978
979 for(int i = 0; i < chns.length; i++) {
980 if(pane.getChannel(i) != chns[i]) {
981 A4n.moveChannelsOnTop.setEnabled(true);
982 break;
983 }
984 }
985
986 if(chns[0] == pane.getFirstChannel()) A4n.moveChannelsUp.setEnabled(false);
987
988 if(chns[chns.length - 1] == pane.getLastChannel())
989 A4n.moveChannelsDown.setEnabled(false);
990
991 for(int i = chns.length - 1, j = pane.getChannelCount() - 1; i >= 0; i--, j--) {
992 if(pane.getChannel(j) != chns[i]) {
993 A4n.moveChannelsAtBottom.setEnabled(true);
994 break;
995 }
996 }
997 }
998
999 private void
1000 checkTabSelection() {
1001 int si = tabbedPane.getSelectedIndex();
1002
1003 if(si > 0) {
1004 A4n.moveTab2Beginning.setEnabled(true);
1005 A4n.moveTab2Left.setEnabled(true);
1006 } else {
1007 A4n.moveTab2Beginning.setEnabled(false);
1008 A4n.moveTab2Left.setEnabled(false);
1009 }
1010
1011 if(si != -1 && si < tabbedPane.getTabCount() - 1) {
1012 A4n.moveTab2Right.setEnabled(true);
1013 A4n.moveTab2End.setEnabled(true);
1014 } else {
1015 A4n.moveTab2Right.setEnabled(false);
1016 A4n.moveTab2End.setEnabled(false);
1017 }
1018 }
1019
1020 /*public JTabbedPane
1021 getTabbedPane() { return tabbedPane; }*/
1022
1023 public JMenu
1024 getTabsMenu() { return tabsMenu; }
1025
1026 public void
1027 stateChanged(ChangeEvent e) {
1028 updateTabsMenu();
1029 checkChannelSelection(getSelectedChannelsPane());
1030 checkTabSelection();
1031 }
1032
1033 public void
1034 valueChanged(ListSelectionEvent e) {
1035 if(e.getValueIsAdjusting()) return;
1036 if(e.getSource() != getSelectedChannelsPane()) return;
1037
1038 checkChannelSelection(getSelectedChannelsPane());
1039 }
1040
1041 public void
1042 moveTab2Beginning() {
1043 int idx = tabbedPane.getSelectedIndex();
1044 if(idx < 1) {
1045 CC.getLogger().info("Can't move tab to beginning");
1046 return;
1047 }
1048
1049 JSChannelsPane c = (JSChannelsPane)tabbedPane.getSelectedComponent();
1050 if(getChannelsPane(idx) != c)
1051 CC.getLogger().warning("Channels pane indices don't match");
1052 removeChannelsPane(c);
1053 insertChannelsPane(c, 0);
1054 tabbedPane.setSelectedComponent(c);
1055 }
1056
1057 public void
1058 moveTab2Left() {
1059 int idx = tabbedPane.getSelectedIndex();
1060 if(idx < 1) {
1061 CC.getLogger().info("Can't move tab to left");
1062 return;
1063 }
1064
1065
1066 JSChannelsPane c = (JSChannelsPane)tabbedPane.getSelectedComponent();
1067 if(getChannelsPane(idx) != c)
1068 CC.getLogger().warning("Channels pane indices don't match");
1069 removeChannelsPane(c);
1070 insertChannelsPane(c, idx - 1);
1071 tabbedPane.setSelectedComponent(c);
1072 }
1073
1074 public void
1075 moveTab2Right() {
1076 int idx = tabbedPane.getSelectedIndex();
1077 if(idx == -1 && idx >= tabbedPane.getTabCount()) {
1078 CC.getLogger().info("Can't move tab to right");
1079 return;
1080 }
1081
1082 JSChannelsPane c = (JSChannelsPane)tabbedPane.getSelectedComponent();
1083 if(getChannelsPane(idx) != c)
1084 CC.getLogger().warning("Channels pane indices don't match");
1085 removeChannelsPane(c);
1086 insertChannelsPane(c, idx + 1);
1087 tabbedPane.setSelectedComponent(c);
1088 }
1089
1090 public void
1091 moveTab2End() {
1092 int idx = tabbedPane.getSelectedIndex();
1093 if(idx == -1 && idx >= tabbedPane.getTabCount()) {
1094 CC.getLogger().info("Can't move tab to right");
1095 return;
1096 }
1097
1098 JSChannelsPane c = (JSChannelsPane)tabbedPane.getSelectedComponent();
1099 if(getChannelsPane(idx) != c)
1100 CC.getLogger().warning("Channels pane indices don't match");
1101 removeChannelsPane(c);
1102 addChannelsPane(c);
1103 tabbedPane.setSelectedComponent(c);
1104 }
1105
1106 protected void
1107 runScript() {
1108 String s = preferences().getStringProperty("lastScriptLocation");
1109 JFileChooser fc = new JFileChooser(s);
1110 fc.setFileFilter(new LscpFileFilter());
1111 int result = fc.showOpenDialog(this);
1112 if(result != JFileChooser.APPROVE_OPTION) return;
1113
1114 String path = fc.getCurrentDirectory().getAbsolutePath();
1115 preferences().setStringProperty("lastScriptLocation", path);
1116
1117 runScript(fc.getSelectedFile());
1118 }
1119
1120 private void
1121 runScript(String script) { runScript(new File(script)); }
1122
1123 private void
1124 runScript(File script) {
1125 FileReader fr;
1126 try { fr = new FileReader(script); }
1127 catch(FileNotFoundException e) {
1128 HF.showErrorMessage(i18n.getMessage("FileNotFound!"));
1129 return;
1130 }
1131
1132 BufferedReader br = new BufferedReader(fr);
1133
1134 try {
1135 String s = br.readLine();
1136 while(s != null) {
1137 getLSConsoleModel().setCommandLineText(s);
1138 getLSConsoleModel().execCommand();
1139 s = br.readLine();
1140 }
1141 } catch(Exception e) {
1142 HF.showErrorMessage(e);
1143 return;
1144 }
1145
1146 if(preferences().getBoolProperty(SHOW_LS_CONSOLE_WHEN_RUN_SCRIPT)) {
1147 if(!cbmiLSConsoleShown.isSelected()) cbmiLSConsoleShown.doClick(0);
1148 }
1149
1150 String s = script.getAbsolutePath();
1151 recentScripts.remove(s);
1152 recentScripts.insertElementAt(s, 0);
1153
1154 updateRecentScriptsMenu();
1155 }
1156
1157 protected void
1158 clearRecentScripts() {
1159 recentScripts.removeAllElements();
1160 updateRecentScriptsMenu();
1161 }
1162
1163 protected void
1164 updateRecentScriptsMenu() {
1165 int size = preferences().getIntProperty(RECENT_LSCP_SCRIPTS_SIZE);
1166 while(recentScripts.size() > size) {
1167 recentScripts.removeElementAt(recentScripts.size() - 1);
1168 }
1169
1170 recentScriptsMenu.removeAll();
1171
1172 for(String script : recentScripts) {
1173 JMenuItem mi = new JMenuItem(script);
1174 recentScriptsMenu.add(mi);
1175 mi.addActionListener(new RecentScriptHandler(script));
1176 }
1177
1178 recentScriptsMenu.setEnabled(recentScripts.size() != 0);
1179 }
1180
1181 public void
1182 installJSamplerHome() {
1183 JSamplerHomeChooser chooser = new JSamplerHomeChooser(this);
1184 chooser.setVisible(true);
1185 if(chooser.isCancelled()) return;
1186
1187 CC.changeJSamplerHome(chooser.getJSamplerHome());
1188 }
1189
1190 public void
1191 showDetailedErrorMessage(Frame owner, String err, String details) {
1192 JSDetailedErrorDlg dlg = new JSDetailedErrorDlg (
1193 owner, Res.iconWarning32, i18n.getError("error"), err, details
1194 );
1195 dlg.setVisible(true);
1196 }
1197
1198 public void
1199 showDetailedErrorMessage(Dialog owner, String err, String details) {
1200 JSDetailedErrorDlg dlg = new JSDetailedErrorDlg (
1201 owner, Res.iconWarning32, i18n.getError("error"), err, details
1202 );
1203 dlg.setVisible(true);
1204 }
1205 }

  ViewVC Help
Powered by ViewVC