/[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 1688 - (show annotations) (download)
Thu Feb 14 16:52:36 2008 UTC (16 years, 2 months ago) by iliev
File size: 33782 byte(s)
* Implemented a backend list with option to manually choose a backend
  to connect on startup(Edit/Preferences, then click the `Backend' tab)
  and option to change the backend without restarting JSampler
  (Actions/Change Backend or Ctrl + B)

* Added confirmation messages for removing sampler channels and
  audio/MIDI devices (Edit/Preferences, then click the `View' tab)

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

  ViewVC Help
Powered by ViewVC