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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1778 - (show annotations) (download)
Sun Sep 28 20:38:36 2008 UTC (15 years, 6 months ago) by iliev
File size: 23548 byte(s)
* Fantasia: Improved look and feel
* Fantasia: Added buttons for increasing/decreasing the key number
  of the MIDI keyboard (Ctrl+Up Arrow/Ctrl+Down Arrow)
* Fantasia: Added buttons for scrolling left/right on the MIDI keyboard
  (Ctrl+Left Arrow/Ctrl+Right Arrow)
* Added key bindings for triggering MIDI notes using the computer keyboard
  (from a to ' for the white keys and from 0 to 7 for changing the octaves)
* Notes are now triggered when dragging the mouse over the MIDI keyboard

1 /*
2 * JSampler - a java front-end for LinuxSampler
3 *
4 * Copyright (C) 2005-2008 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.fantasia;
24
25 import java.awt.BorderLayout;
26 import java.awt.Color;
27 import java.awt.Composite;
28 import java.awt.Dialog;
29 import java.awt.Dimension;
30 import java.awt.Frame;
31 import java.awt.Graphics;
32 import java.awt.Graphics2D;
33 import java.awt.GridBagConstraints;
34 import java.awt.GridBagLayout;
35 import java.awt.Insets;
36 import java.awt.Paint;
37
38 import java.awt.event.ActionEvent;
39 import java.awt.event.ActionListener;
40 import java.awt.event.KeyEvent;
41
42 import java.beans.PropertyChangeEvent;
43 import java.beans.PropertyChangeListener;
44
45 import java.io.BufferedReader;
46 import java.io.File;
47 import java.io.FileNotFoundException;
48 import java.io.FileReader;
49
50 import java.util.Vector;
51 import java.util.logging.Level;
52
53 import javax.swing.BorderFactory;
54 import javax.swing.BoxLayout;
55 import javax.swing.JCheckBoxMenuItem;
56 import javax.swing.JFileChooser;
57 import javax.swing.JMenu;
58 import javax.swing.JMenuBar;
59 import javax.swing.JMenuItem;
60 import javax.swing.JPanel;
61 import javax.swing.JSplitPane;
62 import javax.swing.KeyStroke;
63 import javax.swing.SwingUtilities;
64 import javax.swing.Timer;
65
66 import org.jsampler.CC;
67 import org.jsampler.HF;
68 import org.jsampler.LSConsoleModel;
69 import org.jsampler.Server;
70
71 import org.jsampler.view.JSChannelsPane;
72 import org.jsampler.view.JSMainFrame;
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.fantasia.A4n.a4n;
81 import static org.jsampler.view.fantasia.FantasiaI18n.i18n;
82 import static org.jsampler.view.fantasia.FantasiaPrefs.preferences;
83 import static org.jsampler.view.std.StdPrefs.*;
84
85
86 /**
87 *
88 * @author Grigor Iliev
89 */
90 public class MainFrame extends JSMainFrame {
91 private final StandardBar standardBar = new StandardBar();
92 private final FantasiaMenuBar menuBar = new FantasiaMenuBar();
93 private final JPanel rootPane = new RootPane();
94 private final BottomPane bottomPane;
95 private final MainPane mainPane = new MainPane();
96 private final PianoKeyboardPane pianoKeyboardPane;
97
98 private final JMenu recentScriptsMenu =
99 new JMenu(i18n.getMenuLabel("actions.recentScripts"));
100
101 private final JSplitPane hSplitPane;
102
103 private final LeftSidePane leftSidePane = new LeftSidePane();
104 private final RightSidePane rightSidePane = new RightSidePane();
105 private final JPanel rightPane;
106
107 //private final StatusBar statusBar = new StatusBar();
108
109 private final LSConsoleFrame lsConsoleFrame = new LSConsoleFrame();
110 private final Vector<String> recentScripts = new Vector<String>();
111
112
113 private final JCheckBoxMenuItem cbmiToolBarVisible =
114 new JCheckBoxMenuItem(i18n.getMenuLabel("view.toolBar"));
115
116 private final JCheckBoxMenuItem cbmiLeftSidePaneVisible =
117 new JCheckBoxMenuItem(i18n.getMenuLabel("view.leftSidePane"));
118
119 private final JCheckBoxMenuItem cbmiRightSidePaneVisible =
120 new JCheckBoxMenuItem(i18n.getMenuLabel("view.rightSidePane"));
121
122 private final JCheckBoxMenuItem cbmiMidiKeyboardVisible =
123 new JCheckBoxMenuItem(i18n.getMenuLabel("view.midiKeyboard"));
124
125 private final Timer guiTimer = new Timer(1000, null);
126
127 /** Creates a new instance of <code>MainFrame</code> */
128 public
129 MainFrame() {
130 setTitle(i18n.getLabel("MainFrame.title"));
131 //setUndecorated(true);
132 if(Res.iconAppIcon != null) setIconImage(Res.iconAppIcon.getImage());
133
134 getContentPane().add(standardBar, BorderLayout.NORTH);
135
136 rightPane = createRightPane();
137
138 hSplitPane = new JSplitPane (
139 JSplitPane.HORIZONTAL_SPLIT,
140 true, // continuousLayout
141 leftSidePane, rightPane
142 );
143 hSplitPane.setResizeWeight(0.5);
144
145 addChannelsPane(mainPane.getChannelsPane());
146
147 pianoKeyboardPane = new PianoKeyboardPane();
148 getChannelsPane(0).addListSelectionListener(pianoKeyboardPane);
149 int h = preferences().getIntProperty("midiKeyboard.height");
150 setMidiKeyboardHeight(h);
151
152 PropertyChangeListener l = new PropertyChangeListener() {
153 public void
154 propertyChange(PropertyChangeEvent e) {
155 int h = preferences().getIntProperty("midiKeyboard.height");
156 setMidiKeyboardHeight(h);
157 }
158 };
159
160 CC.preferences().addPropertyChangeListener("midiKeyboard.height", l);
161
162 bottomPane = new BottomPane();
163
164 hSplitPane.setOpaque(false);
165 rootPane.add(hSplitPane);
166 rootPane.add(bottomPane, BorderLayout.SOUTH);
167 add(rootPane);
168
169 addMenu();
170
171 int i = preferences().getIntProperty("MainFrame.hSplitDividerLocation", 220);
172 hSplitPane.setDividerLocation(i);
173
174 setSavedSize();
175
176 guiTimer.start();
177 }
178
179 private JPanel
180 createRightPane() {
181 JPanel p = new FantasiaPanel();
182 p.setOpaque(false);
183
184 GridBagLayout gridbag = new GridBagLayout();
185 GridBagConstraints c = new GridBagConstraints();
186
187 p.setLayout(gridbag);
188
189 c.fill = GridBagConstraints.BOTH;
190
191 c.gridx = 1;
192 c.gridy = 0;
193 c.weightx = 1.0;
194 c.weighty = 1.0;
195 c.insets = new Insets(0, 3, 0, 0);
196 gridbag.setConstraints(rightSidePane, c);
197 p.add(rightSidePane);
198
199 c.gridx = 0;
200 c.gridy = 0;
201 c.weightx = 0.0;
202 c.weighty = 1.0;
203 c.insets = new Insets(0, 0, 0, 3);
204 c.fill = GridBagConstraints.VERTICAL;
205 gridbag.setConstraints(mainPane, c);
206 p.add(mainPane);
207
208 return p;
209 }
210
211 private void
212 setSavedSize() {
213 String s = preferences().getStringProperty("MainFrame.sizeAndLocation");
214 if(s == null) {
215 setDefaultSizeAndLocation();
216 return;
217 }
218 pack();
219 try {
220 int i = s.indexOf(',');
221 int x = Integer.parseInt(s.substring(0, i));
222
223 s = s.substring(i + 1);
224 i = s.indexOf(',');
225 int y = Integer.parseInt(s.substring(0, i));
226
227 s = s.substring(i + 1);
228 i = s.indexOf(',');
229 int width = Integer.parseInt(s.substring(0, i));
230
231 s = s.substring(i + 1);
232 int height = Integer.parseInt(s);
233
234 setBounds(x, y, width, height);
235 } catch(Exception x) {
236 String msg = "Parsing of window size and location string failed";
237 CC.getLogger().log(Level.INFO, msg, x);
238 setDefaultSizeAndLocation();
239 }
240
241 if(preferences().getBoolProperty("MainFrame.windowMaximized")) {
242 setExtendedState(getExtendedState() | MAXIMIZED_BOTH);
243 }
244 }
245
246 private void
247 setDefaultSizeAndLocation() {
248 setPreferredSize(new Dimension(900, 600));
249 pack();
250 setLocationRelativeTo(null);
251 }
252
253
254 /** Invoked when this window is about to close. */
255 @Override
256 protected void
257 onWindowClose() {
258 boolean b = preferences().getBoolProperty(CONFIRM_APP_QUIT);
259 if(b && CC.getSamplerModel().isModified()) {
260 JSQuitDlg dlg = new JSQuitDlg(Res.iconQuestion32);
261 dlg.setVisible(true);
262 if(dlg.isCancelled()) return;
263 }
264
265 leftSidePane.savePreferences();
266 rightSidePane.savePreferences();
267
268 int i = hSplitPane.getDividerLocation();
269 preferences().setIntProperty("MainFrame.hSplitDividerLocation", i);
270
271 preferences().setBoolProperty (
272 "MainFrame.windowMaximized",
273 (getExtendedState() & MAXIMIZED_BOTH) == MAXIMIZED_BOTH
274 );
275
276 if(preferences().getBoolProperty("MainFrame.windowMaximized")) {
277 super.onWindowClose();
278 return;
279 }
280
281 java.awt.Point p = getLocation();
282 Dimension d = getSize();
283 StringBuffer sb = new StringBuffer();
284 sb.append(p.x).append(',').append(p.y).append(',');
285 sb.append(d.width).append(',').append(d.height);
286 preferences().setStringProperty("MainFrame.sizeAndLocation", sb.toString());
287
288 String[] list = recentScripts.toArray(new String[recentScripts.size()]);
289 preferences().setStringListProperty(RECENT_LSCP_SCRIPTS, list);
290
291 if(preferences().getBoolProperty(SAVE_LS_CONSOLE_HISTORY)) {
292 if(lsConsoleFrame != null) getLSConsolePane().saveConsoleHistory();
293 }
294
295 super.onWindowClose();
296 }
297
298 private void
299 addMenu() {
300 JMenu m;
301 JMenuItem mi;
302
303 setJMenuBar(menuBar);
304
305 // Actions
306 m = new FantasiaMenu(i18n.getMenuLabel("actions"));
307
308 mi = new JMenuItem(a4n.refresh);
309 mi.setIcon(null);
310 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
311 m.add(mi);
312
313 mi = new JMenuItem(a4n.samplerInfo);
314 mi.setIcon(null);
315 m.add(mi);
316
317 mi = new JMenuItem(a4n.resetSampler);
318 mi.setIcon(null);
319 m.add(mi);
320
321 m.addSeparator();
322
323 JMenu exportMenu = new JMenu(i18n.getMenuLabel("actions.export"));
324 m.add(exportMenu);
325
326 mi = new JMenuItem(a4n.exportSamplerConfig);
327 mi.setIcon(null);
328 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK));
329 exportMenu.add(mi);
330
331 mi = new JMenuItem(a4n.exportMidiInstrumentMaps);
332 mi.setIcon(null);
333 exportMenu.add(mi);
334
335 m.addSeparator();
336
337 mi = new JMenuItem(a4n.loadScript);
338 mi.setIcon(null);
339 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK));
340 m.add(mi);
341
342 String[] list = preferences().getStringListProperty(RECENT_LSCP_SCRIPTS);
343 for(String s : list) recentScripts.add(s);
344
345 updateRecentScriptsMenu();
346
347 m.add(recentScriptsMenu);
348
349 m.addSeparator();
350
351 mi = new JMenuItem(a4n.changeBackend);
352 mi.setIcon(null);
353 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, KeyEvent.CTRL_MASK));
354 m.add(mi);
355
356 m.addSeparator();
357
358 mi = new JMenuItem(i18n.getMenuLabel("actions.exit"));
359 m.add(mi);
360 mi.addActionListener(new ActionListener() {
361 public void
362 actionPerformed(ActionEvent e) { onWindowClose(); }
363 });
364
365 menuBar.add(m);
366
367
368 // Edit
369 m = new FantasiaMenu(i18n.getMenuLabel("edit"));
370 menuBar.add(m);
371
372 mi = new JMenuItem(i18n.getMenuLabel("edit.addChannel"));
373 m.add(mi);
374 mi.addActionListener(new ActionListener() {
375 public void
376 actionPerformed(ActionEvent e) {
377 CC.getSamplerModel().addBackendChannel();
378 }
379 });
380
381 m.addSeparator();
382
383 mi = new JMenuItem(a4n.createMidiDevice);
384 mi.setIcon(null);
385 m.add(mi);
386
387 mi = new JMenuItem(a4n.createAudioDevice);
388 mi.setIcon(null);
389 m.add(mi);
390
391 m.addSeparator();
392
393 mi = new JMenuItem(a4n.editPreferences);
394 mi.setIcon(null);
395 mi.setAccelerator(KeyStroke.getKeyStroke (
396 KeyEvent.VK_P, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
397 ));
398 m.add(mi);
399
400 // View
401 m = new FantasiaMenu(i18n.getMenuLabel("view"));
402 menuBar.add(m);
403
404 m.add(cbmiToolBarVisible);
405
406 cbmiToolBarVisible.addActionListener(new ActionListener() {
407 public void
408 actionPerformed(ActionEvent e) {
409 showToolBar(cbmiToolBarVisible.getState());
410 }
411 });
412
413 boolean b = preferences().getBoolProperty("toolBar.visible");
414 cbmiToolBarVisible.setSelected(b);
415 showToolBar(b);
416
417 cbmiLeftSidePaneVisible.setAccelerator(KeyStroke.getKeyStroke (
418 KeyEvent.VK_L, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
419 ));
420 m.add(cbmiLeftSidePaneVisible);
421
422 cbmiLeftSidePaneVisible.addActionListener(new ActionListener() {
423 public void
424 actionPerformed(ActionEvent e) {
425 showSidePane(cbmiLeftSidePaneVisible.getState());
426 }
427 });
428
429 b = preferences().getBoolProperty("leftSidePane.visible");
430 cbmiLeftSidePaneVisible.setSelected(b);
431 showSidePane(b);
432
433 cbmiRightSidePaneVisible.setAccelerator(KeyStroke.getKeyStroke (
434 KeyEvent.VK_R, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
435 ));
436 m.add(cbmiRightSidePaneVisible);
437
438 cbmiRightSidePaneVisible.addActionListener(new ActionListener() {
439 public void
440 actionPerformed(ActionEvent e) {
441 showDevicesPane(cbmiRightSidePaneVisible.getState());
442 }
443 });
444
445 b = preferences().getBoolProperty("rightSidePane.visible");
446 cbmiRightSidePaneVisible.setSelected(b);
447 showDevicesPane(b);
448
449 m.addSeparator();
450
451 m.add(cbmiMidiKeyboardVisible);
452
453 cbmiMidiKeyboardVisible.addActionListener(new ActionListener() {
454 public void
455 actionPerformed(ActionEvent e) {
456 setMidiKeyboardVisible(cbmiMidiKeyboardVisible.getState());
457 }
458 });
459
460 b = preferences().getBoolProperty("midiKeyboard.visible");
461 cbmiMidiKeyboardVisible.setSelected(b);
462 setMidiKeyboardVisible(b);
463
464
465 // Window
466 m = new FantasiaMenu(i18n.getMenuLabel("window"));
467 menuBar.add(m);
468
469 mi = new JMenuItem(a4n.windowLSConsole);
470 mi.setIcon(null);
471 m.add(mi);
472
473 mi = new JMenuItem(a4n.windowInstrumentsDb);
474 mi.setIcon(null);
475 m.add(mi);
476
477
478 // Help
479 m = new FantasiaMenu(i18n.getMenuLabel("help"));
480
481 mi = new JMenuItem(a4n.browseOnlineTutorial);
482 mi.setIcon(null);
483 m.add(mi);
484
485 m.addSeparator();
486
487 mi = new JMenuItem(a4n.helpAbout);
488 mi.setIcon(null);
489 m.add(mi);
490
491 menuBar.add(m);
492 }
493
494 public RightSidePane
495 getRightSidePane() { return rightSidePane; }
496
497 /**
498 * This method does nothing, because <b>Fantasia</b> has exactly
499 * one pane containing sampler channels, which can not be changed.
500 */
501 @Override
502 public void
503 insertChannelsPane(JSChannelsPane pane, int idx) {
504
505 }
506
507 /**
508 * This method always returns the <code>JSChannelsPane</code> at index 0,
509 * because the <b>Fantasia</b> view has exactly one pane containing sampler channels.
510 * @return The <code>JSChannelsPane</code> at index 0.
511 */
512 @Override
513 public JSChannelsPane
514 getSelectedChannelsPane() { return getChannelsPane(0); }
515
516 /**
517 * This method does nothing because the <b>Fantasia</b> view has
518 * exactly one pane containing sampler channels which is always shown.
519 */
520 @Override
521 public void
522 setSelectedChannelsPane(JSChannelsPane pane) { }
523
524 @Override
525 public void
526 installJSamplerHome() {
527 JSamplerHomeChooser chooser = new JSamplerHomeChooser(this);
528 chooser.setVisible(true);
529 if(chooser.isCancelled()) return;
530
531 CC.changeJSamplerHome(chooser.getJSamplerHome());
532 }
533
534 @Override
535 public void
536 showDetailedErrorMessage(Frame owner, String err, String details) {
537 JSDetailedErrorDlg dlg = new JSDetailedErrorDlg (
538 owner, Res.iconWarning32, i18n.getError("error"), err, details
539 );
540 dlg.setVisible(true);
541 }
542
543 @Override
544 public void
545 showDetailedErrorMessage(Dialog owner, String err, String details) {
546 JSDetailedErrorDlg dlg = new JSDetailedErrorDlg (
547 owner, Res.iconWarning32, i18n.getError("error"), err, details
548 );
549 dlg.setVisible(true);
550 }
551
552 /**
553 * Gets the server address to which to connect. If the server should be
554 * manually selected, a dialog asking the user to choose a server is displayed.
555 */
556 @Override
557 public Server
558 getServer() {
559 boolean b = preferences().getBoolProperty(MANUAL_SERVER_SELECT_ON_STARTUP);
560 return getServer(b);
561 }
562
563 /**
564 * Gets the server address to which to connect. If the server should be
565 * manually selected, a dialog asking the user to choose a server is displayed.
566 * @param manualSelect Determines whether the server should be manually selected.
567 */
568 @Override
569 public Server
570 getServer(boolean manualSelect) {
571 if(manualSelect) {
572 JSConnectDlg dlg = new JSConnectDlg();
573 dlg.setVisible(true);
574 return dlg.getSelectedServer();
575 }
576
577 int i = preferences().getIntProperty(SERVER_INDEX);
578 int size = CC.getServerList().getServerCount();
579 if(size == 0) return null;
580 if(i >= size) return CC.getServerList().getServer(0);
581
582 return CC.getServerList().getServer(i);
583 }
584
585 public Timer
586 getGuiTimer() { return guiTimer; }
587
588 protected LSConsoleModel
589 getLSConsoleModel() { return getLSConsolePane().getModel(); }
590
591 protected LSConsolePane
592 getLSConsolePane() {
593 return getLSConsoleFrame().getLSConsolePane();
594 }
595
596 protected LSConsoleFrame
597 getLSConsoleFrame() { return lsConsoleFrame; }
598
599 protected boolean
600 runScript() {
601 String s = preferences().getStringProperty("lastScriptLocation");
602 JFileChooser fc = new JFileChooser(s);
603 fc.setFileFilter(new LscpFileFilter());
604 int result = fc.showOpenDialog(this);
605 if(result != JFileChooser.APPROVE_OPTION) return false;
606
607 String path = fc.getCurrentDirectory().getAbsolutePath();
608 preferences().setStringProperty("lastScriptLocation", path);
609
610 runScript(fc.getSelectedFile());
611
612 return true;
613 }
614
615 private void
616 runScript(String script) { runScript(new File(script)); }
617
618 private void
619 runScript(File script) {
620 FileReader fr;
621 try { fr = new FileReader(script); }
622 catch(FileNotFoundException e) {
623 HF.showErrorMessage(i18n.getMessage("FileNotFound!"));
624 return;
625 }
626
627 BufferedReader br = new BufferedReader(fr);
628
629 try {
630 String s = br.readLine();
631 while(s != null) {
632 getLSConsoleModel().setCommandLineText(s);
633 getLSConsoleModel().execCommand();
634 s = br.readLine();
635 }
636 } catch(Exception e) {
637 HF.showErrorMessage(e);
638 return;
639 }
640
641 String s = script.getAbsolutePath();
642 recentScripts.remove(s);
643 recentScripts.insertElementAt(s, 0);
644
645 updateRecentScriptsMenu();
646 }
647
648 protected void
649 clearRecentScripts() {
650 recentScripts.removeAllElements();
651 updateRecentScriptsMenu();
652 }
653
654 protected void
655 updateRecentScriptsMenu() {
656 int size = preferences().getIntProperty(RECENT_LSCP_SCRIPTS_SIZE);
657 while(recentScripts.size() > size) {
658 recentScripts.removeElementAt(recentScripts.size() - 1);
659 }
660
661 recentScriptsMenu.removeAll();
662
663 for(String script : recentScripts) {
664 JMenuItem mi = new JMenuItem(script);
665 recentScriptsMenu.add(mi);
666 mi.addActionListener(new RecentScriptHandler(script));
667 }
668
669 recentScriptsMenu.setEnabled(recentScripts.size() != 0);
670 }
671
672 private void
673 showToolBar(boolean b) {
674 preferences().setBoolProperty("toolBar.visible", b);
675 standardBar.setVisible(b);
676 }
677
678 private void
679 showSidePane(boolean b) {
680 preferences().setBoolProperty("leftSidePane.visible", b);
681 rootPane.remove(rightPane);
682 rootPane.remove(hSplitPane);
683
684 if(b) {
685 hSplitPane.setRightComponent(rightPane);
686 rootPane.add(hSplitPane);
687 int i = preferences().getIntProperty("MainFrame.hSplitDividerLocation", 220);
688
689 hSplitPane.setDividerLocation(i);
690 hSplitPane.validate();
691 } else {
692 rootPane.add(rightPane);
693
694 }
695
696 int w = getPreferredSize().width;
697 int h = getSize().height;
698 setSize(new Dimension(w, h));
699
700 rootPane.revalidate();
701 rootPane.validate();
702 rootPane.repaint();
703
704 SwingUtilities.invokeLater(new Runnable() {
705 public void
706 run() { sidePanesVisibilityChanged(); }
707 });
708 }
709
710 private void
711 showDevicesPane(boolean b) {
712 preferences().setBoolProperty("rightSidePane.visible", b);
713
714 int width = leftSidePane.getWidth();
715 int height = leftSidePane.getPreferredSize().height;
716 if(width != 0) leftSidePane.setPreferredSize(new Dimension(width, height));
717
718 if(b) {
719 int w = preferences().getIntProperty("devicesPane.width", 200);
720
721 int h = rightSidePane.getPreferredSize().height;
722 rightSidePane.setPreferredSize(new Dimension(w, h));
723 } else {
724 int w = rightSidePane.getWidth();
725 if(w > 0 && w < 200) w = 200;
726 if(w != 0) preferences().setIntProperty("devicesPane.width", w);
727 }
728
729 hSplitPane.setResizeWeight(0.0);
730 rightSidePane.setVisible(b);
731 hSplitPane.resetToPreferredSizes();
732
733 int w = getPreferredSize().width;
734 int h = getSize().height;
735 setSize(new Dimension(w, h));
736
737 rootPane.validate();
738 rootPane.repaint();
739 //hSplitPane.validate();
740
741 SwingUtilities.invokeLater(new Runnable() {
742 public void
743 run() { sidePanesVisibilityChanged(); }
744 });
745 }
746
747 public void
748 setMidiKeyboardVisible(boolean b) {
749 preferences().setBoolProperty("midiKeyboard.visible", b);
750 pianoKeyboardPane.setVisible(b);
751
752 if(cbmiMidiKeyboardVisible.isSelected() != b) {
753 cbmiMidiKeyboardVisible.setSelected(b);
754 }
755
756 if(standardBar.btnMidiKeyboard.isSelected() != b) {
757 standardBar.btnMidiKeyboard.setSelected(b);
758 }
759
760 if(pianoKeyboardPane.btnPower.isSelected() != b) {
761 pianoKeyboardPane.btnPower.setSelected(b);
762 }
763
764 rootPane.validate();
765 rootPane.repaint();
766 }
767
768 public void
769 setMidiKeyboardHeight(int height) {
770 Dimension d = pianoKeyboardPane.getPreferredSize();
771 d = new Dimension(d.width, height);
772 pianoKeyboardPane.setPreferredSize(d);
773 pianoKeyboardPane.setMinimumSize(d);
774 pianoKeyboardPane.revalidate();
775 pianoKeyboardPane.repaint();
776 }
777
778 private void
779 sidePanesVisibilityChanged() {
780 boolean leftSidePaneVisible = cbmiLeftSidePaneVisible.isSelected();
781 boolean rightSidePaneVisible = cbmiRightSidePaneVisible.isSelected();
782
783 if(leftSidePaneVisible && rightSidePaneVisible) {
784 hSplitPane.setResizeWeight(0.5);
785 } else if(leftSidePaneVisible && !rightSidePaneVisible) {
786 hSplitPane.setResizeWeight(1.0);
787 }
788
789 if(!leftSidePaneVisible && !rightSidePaneVisible) {
790 standardBar.showFantasiaLogo(false);
791 if(isResizable()) setResizable(false);
792 } else {
793 standardBar.showFantasiaLogo(true);
794 if(!isResizable()) setResizable(true);
795 }
796 }
797
798 private class RecentScriptHandler implements ActionListener {
799 private String script;
800
801 RecentScriptHandler(String script) { this.script = script; }
802
803 @Override
804 public void
805 actionPerformed(ActionEvent e) {
806 runScript(script);
807 if(preferences().getBoolProperty(SHOW_LS_CONSOLE_WHEN_RUN_SCRIPT)) {
808 a4n.windowLSConsole.actionPerformed(null);
809 }
810 }
811 }
812
813 private static class FantasiaMenu extends JMenu {
814 FantasiaMenu(String s) {
815 super(s);
816 setFont(getFont().deriveFont(java.awt.Font.BOLD));
817 setOpaque(false);
818 setContentAreaFilled(false);
819 }
820 }
821
822 private class FantasiaMenuBar extends JMenuBar {
823 FantasiaMenuBar() {
824 setOpaque(false);
825 setBorder(BorderFactory.createEmptyBorder(2, 6, 0, 0));
826 }
827
828 @Override
829 protected void
830 paintComponent(Graphics g) {
831 //super.paintComponent(g);
832 Graphics2D g2 = (Graphics2D)g;
833
834 Paint oldPaint = g2.getPaint();
835 Composite oldComposite = g2.getComposite();
836
837 double h = getSize().getHeight();
838 double w = getSize().getWidth();
839
840 FantasiaPainter.paintGradient(g2, 0.0, 0.0, w - 1, h - 1, FantasiaPainter.color6, FantasiaPainter.color5);
841
842 FantasiaPainter.Border b;
843
844
845 if(standardBar.isVisible()) {
846 b = new FantasiaPainter.Border(true, true, false, true);
847 FantasiaPainter.paintBoldOuterBorder(g2, 0, 0, w - 1, h + 1, b);
848 } else {
849 b = new FantasiaPainter.Border(true, true, true, true);
850 FantasiaPainter.paintBoldOuterBorder(g2, 0, 0, w - 1, h - 1, b);
851 }
852
853 g2.setPaint(oldPaint);
854 g2.setComposite(oldComposite);
855 }
856 }
857
858 class RootPane extends FantasiaSubPanel {
859 private final Color color1 = new Color(0x454545);
860 private final Color color2 = new Color(0x2e2e2e);
861
862 RootPane() {
863 setLayout(new BorderLayout());
864 setBorder(BorderFactory.createEmptyBorder(9, 10, 6, 10));
865 setOpaque(false);
866
867 }
868
869 @Override
870 public void
871 paintComponent(Graphics g) {
872 Graphics2D g2 = (Graphics2D)g;
873
874 Paint oldPaint = g2.getPaint();
875 Composite oldComposite = g2.getComposite();
876
877 double h = getSize().getHeight();
878 double w = getSize().getWidth();
879
880 FantasiaPainter.paintBorder(g2, 0, -3, w - 1, h - 1, 6, false);
881 paintComponent(g2, 5, 1, w - 10, h - 6, color1, color2);
882
883 g2.setPaint(oldPaint);
884 g2.setComposite(oldComposite);
885 }
886 }
887
888 class BottomPane extends FantasiaPanel {
889 BottomPane() {
890 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
891 setOpaque(false);
892 add(pianoKeyboardPane);
893
894 }
895 }
896 }

  ViewVC Help
Powered by ViewVC