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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1883 - (hide annotations) (download)
Sun Apr 5 09:15:35 2009 UTC (15 years ago) by iliev
File size: 27995 byte(s)
* fixed the channel order when exporting sampler configuration
* don't mute channels muted by solo channel when exporting
   sampler configuration
* don't ask whether to replace a file on Mac OS when using
  native file choosers

1 iliev 912 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4 iliev 1864 * Copyright (C) 2005-2009 Grigor Iliev <grigor@grigoriliev.com>
5 iliev 912 *
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 iliev 1778 import java.awt.Color;
27     import java.awt.Composite;
28 iliev 1204 import java.awt.Dialog;
29 iliev 912 import java.awt.Dimension;
30 iliev 1204 import java.awt.Frame;
31 iliev 1285 import java.awt.Graphics;
32 iliev 1778 import java.awt.Graphics2D;
33 iliev 1285 import java.awt.GridBagConstraints;
34     import java.awt.GridBagLayout;
35     import java.awt.Insets;
36 iliev 1778 import java.awt.Paint;
37 iliev 1786 import java.awt.Rectangle;
38 iliev 912
39     import java.awt.event.ActionEvent;
40     import java.awt.event.ActionListener;
41 iliev 1285 import java.awt.event.KeyEvent;
42 iliev 912
43 iliev 1778 import java.beans.PropertyChangeEvent;
44     import java.beans.PropertyChangeListener;
45    
46 iliev 1285 import java.io.BufferedReader;
47     import java.io.File;
48     import java.io.FileNotFoundException;
49     import java.io.FileReader;
50    
51     import java.util.Vector;
52 iliev 912
53 iliev 1285 import javax.swing.BorderFactory;
54 iliev 1778 import javax.swing.BoxLayout;
55 iliev 912 import javax.swing.JCheckBoxMenuItem;
56     import javax.swing.JMenu;
57 iliev 1285 import javax.swing.JMenuBar;
58 iliev 912 import javax.swing.JMenuItem;
59     import javax.swing.JPanel;
60 iliev 1285 import javax.swing.JSplitPane;
61     import javax.swing.KeyStroke;
62     import javax.swing.SwingUtilities;
63 iliev 1734 import javax.swing.Timer;
64 iliev 912
65 iliev 1818 import javax.swing.event.ListSelectionEvent;
66     import javax.swing.event.ListSelectionListener;
67    
68 iliev 912 import org.jsampler.CC;
69     import org.jsampler.HF;
70 iliev 1285 import org.jsampler.LSConsoleModel;
71 iliev 1688 import org.jsampler.Server;
72 iliev 912
73     import org.jsampler.view.JSChannelsPane;
74 iliev 1818 import org.jsampler.view.SessionViewConfig;
75 iliev 912
76 iliev 1785 import org.jsampler.view.fantasia.basic.FantasiaPainter;
77     import org.jsampler.view.fantasia.basic.FantasiaPanel;
78     import org.jsampler.view.fantasia.basic.FantasiaSubPanel;
79    
80 iliev 1786 import org.jsampler.view.std.JSBackendLogFrame;
81 iliev 1688 import org.jsampler.view.std.JSConnectDlg;
82 iliev 1355 import org.jsampler.view.std.JSDetailedErrorDlg;
83 iliev 1567 import org.jsampler.view.std.JSQuitDlg;
84 iliev 1285 import org.jsampler.view.std.JSamplerHomeChooser;
85 iliev 1818 import org.jsampler.view.std.StdMainFrame;
86 iliev 1786 import org.jsampler.view.std.StdUtils;
87 iliev 1285
88     import static org.jsampler.view.fantasia.A4n.a4n;
89 iliev 912 import static org.jsampler.view.fantasia.FantasiaI18n.i18n;
90 iliev 1285 import static org.jsampler.view.fantasia.FantasiaPrefs.preferences;
91     import static org.jsampler.view.std.StdPrefs.*;
92 iliev 912
93    
94     /**
95     *
96     * @author Grigor Iliev
97     */
98 iliev 1818 public class MainFrame extends StdMainFrame {
99 iliev 1872 public final static int MAX_CHANNEL_LANE_NUMBER = 8;
100    
101 iliev 1323 private final StandardBar standardBar = new StandardBar();
102 iliev 1285 private final FantasiaMenuBar menuBar = new FantasiaMenuBar();
103 iliev 1778 private final JPanel rootPane = new RootPane();
104     private final BottomPane bottomPane;
105 iliev 1785 private final MainPane mainPane;
106 iliev 1776 private final PianoKeyboardPane pianoKeyboardPane;
107 iliev 912
108 iliev 1285 private final JMenu recentScriptsMenu =
109     new JMenu(i18n.getMenuLabel("actions.recentScripts"));
110 iliev 912
111 iliev 1285 private final JSplitPane hSplitPane;
112    
113 iliev 1785 private final LeftSidePane leftSidePane;
114     private final RightSidePane rightSidePane;
115 iliev 1323 private final JPanel rightPane;
116 iliev 1285
117 iliev 1767 //private final StatusBar statusBar = new StatusBar();
118    
119 iliev 1311 private final LSConsoleFrame lsConsoleFrame = new LSConsoleFrame();
120 iliev 1285 private final Vector<String> recentScripts = new Vector<String>();
121 iliev 1786
122     private final JSBackendLogFrame backendLogFrame = new JSBackendLogFrame();
123 iliev 1285
124    
125 iliev 1323 private final JCheckBoxMenuItem cbmiToolBarVisible =
126     new JCheckBoxMenuItem(i18n.getMenuLabel("view.toolBar"));
127    
128 iliev 1729 private final JCheckBoxMenuItem cbmiLeftSidePaneVisible =
129     new JCheckBoxMenuItem(i18n.getMenuLabel("view.leftSidePane"));
130 iliev 1323
131 iliev 1729 private final JCheckBoxMenuItem cbmiRightSidePaneVisible =
132     new JCheckBoxMenuItem(i18n.getMenuLabel("view.rightSidePane"));
133 iliev 1323
134 iliev 1776 private final JCheckBoxMenuItem cbmiMidiKeyboardVisible =
135     new JCheckBoxMenuItem(i18n.getMenuLabel("view.midiKeyboard"));
136    
137 iliev 1734 private final Timer guiTimer = new Timer(1000, null);
138    
139 iliev 912 /** Creates a new instance of <code>MainFrame</code> */
140     public
141     MainFrame() {
142     setTitle(i18n.getLabel("MainFrame.title"));
143 iliev 1778 //setUndecorated(true);
144 iliev 1285 if(Res.iconAppIcon != null) setIconImage(Res.iconAppIcon.getImage());
145 iliev 912
146 iliev 1785 CC.setMainFrame(this); // TODO:
147     mainPane = new MainPane();
148     leftSidePane = new LeftSidePane();
149     rightSidePane = new RightSidePane();
150    
151     setSelectedChannelsPane(mainPane.getChannelsPane(0));
152    
153 iliev 1285 getContentPane().add(standardBar, BorderLayout.NORTH);
154 iliev 912
155 iliev 1323 rightPane = createRightPane();
156 iliev 912
157 iliev 1285 hSplitPane = new JSplitPane (
158     JSplitPane.HORIZONTAL_SPLIT,
159     true, // continuousLayout
160 iliev 1729 leftSidePane, rightPane
161 iliev 1285 );
162 iliev 1323 hSplitPane.setResizeWeight(0.5);
163 iliev 912
164 iliev 1785 pianoKeyboardPane = new PianoKeyboardPane();
165 iliev 1776
166 iliev 1785 for(int i = 0; i < mainPane.getChannelsPaneCount(); i++) {
167     addChannelsPane(mainPane.getChannelsPane(i));
168     getChannelsPane(i).addListSelectionListener(pianoKeyboardPane);
169     }
170 iliev 1872
171     PropertyChangeListener l = new PropertyChangeListener() {
172     public void
173     propertyChange(PropertyChangeEvent e) {
174     onChangeChannelLaneCount();
175     }
176     };
177    
178     preferences().addPropertyChangeListener("channelLanes.count", l);
179 iliev 1785
180 iliev 1778 int h = preferences().getIntProperty("midiKeyboard.height");
181     setMidiKeyboardHeight(h);
182 iliev 1776
183 iliev 1872 l = new PropertyChangeListener() {
184 iliev 1778 public void
185     propertyChange(PropertyChangeEvent e) {
186     int h = preferences().getIntProperty("midiKeyboard.height");
187     setMidiKeyboardHeight(h);
188     }
189     };
190 iliev 1776
191 iliev 1778 CC.preferences().addPropertyChangeListener("midiKeyboard.height", l);
192 iliev 1776
193 iliev 1778 bottomPane = new BottomPane();
194    
195     hSplitPane.setOpaque(false);
196 iliev 1323 rootPane.add(hSplitPane);
197 iliev 1778 rootPane.add(bottomPane, BorderLayout.SOUTH);
198     add(rootPane);
199 iliev 1865
200     if(CC.isMacOS()) {
201 iliev 1866 try {
202     String s = "org.jsampler.view.fantasia.MacOSApplicationHandler";
203     Class.forName(s).newInstance(); }
204 iliev 1865 catch(Throwable e) { }
205     }
206 iliev 912
207 iliev 1323 addMenu();
208    
209 iliev 1865 if(CC.getViewConfig().isUsingScreenMenuBar()) {
210     // fix for moving the menu bar on top of the screen
211     // when running on Mac OS and third party plugin is used
212     ((ViewConfig)CC.getViewConfig()).restoreMenuProperties();
213     }
214    
215 iliev 1285 int i = preferences().getIntProperty("MainFrame.hSplitDividerLocation", 220);
216     hSplitPane.setDividerLocation(i);
217 iliev 912
218 iliev 1285 setSavedSize();
219 iliev 1734
220     guiTimer.start();
221 iliev 1285 }
222    
223     private JPanel
224     createRightPane() {
225 iliev 1778 JPanel p = new FantasiaPanel();
226     p.setOpaque(false);
227    
228 iliev 1285 GridBagLayout gridbag = new GridBagLayout();
229     GridBagConstraints c = new GridBagConstraints();
230 iliev 912
231 iliev 1285 p.setLayout(gridbag);
232 iliev 912
233 iliev 1285 c.fill = GridBagConstraints.BOTH;
234 iliev 912
235 iliev 1285 c.gridx = 1;
236     c.gridy = 0;
237     c.weightx = 1.0;
238     c.weighty = 1.0;
239 iliev 1729 c.insets = new Insets(0, 3, 0, 0);
240     gridbag.setConstraints(rightSidePane, c);
241     p.add(rightSidePane);
242 iliev 912
243 iliev 1285 c.gridx = 0;
244     c.gridy = 0;
245     c.weightx = 0.0;
246     c.weighty = 1.0;
247 iliev 1778 c.insets = new Insets(0, 0, 0, 3);
248 iliev 1285 c.fill = GridBagConstraints.VERTICAL;
249     gridbag.setConstraints(mainPane, c);
250     p.add(mainPane);
251 iliev 912
252 iliev 1285 return p;
253     }
254    
255     private void
256     setSavedSize() {
257 iliev 1786 Rectangle r = StdUtils.getWindowBounds("MainFrame");
258     if(r == null) {
259 iliev 1285 setDefaultSizeAndLocation();
260     return;
261     }
262    
263 iliev 1786 setBounds(r);
264 iliev 912 }
265    
266     private void
267 iliev 1285 setDefaultSizeAndLocation() {
268     setPreferredSize(new Dimension(900, 600));
269     pack();
270     setLocationRelativeTo(null);
271 iliev 912 }
272    
273    
274     /** Invoked when this window is about to close. */
275 iliev 1778 @Override
276 iliev 1864 public void
277 iliev 912 onWindowClose() {
278 iliev 1688 boolean b = preferences().getBoolProperty(CONFIRM_APP_QUIT);
279     if(b && CC.getSamplerModel().isModified()) {
280 iliev 1567 JSQuitDlg dlg = new JSQuitDlg(Res.iconQuestion32);
281     dlg.setVisible(true);
282     if(dlg.isCancelled()) return;
283     }
284    
285 iliev 1729 leftSidePane.savePreferences();
286     rightSidePane.savePreferences();
287 iliev 912
288 iliev 1285 int i = hSplitPane.getDividerLocation();
289     preferences().setIntProperty("MainFrame.hSplitDividerLocation", i);
290    
291     preferences().setBoolProperty (
292     "MainFrame.windowMaximized",
293     (getExtendedState() & MAXIMIZED_BOTH) == MAXIMIZED_BOTH
294     );
295    
296     if(preferences().getBoolProperty("MainFrame.windowMaximized")) {
297     super.onWindowClose();
298     return;
299     }
300    
301 iliev 1786 StdUtils.saveWindowBounds("MainFrame", getBounds());
302 iliev 912
303 iliev 1308 String[] list = recentScripts.toArray(new String[recentScripts.size()]);
304     preferences().setStringListProperty(RECENT_LSCP_SCRIPTS, list);
305 iliev 1285
306     if(preferences().getBoolProperty(SAVE_LS_CONSOLE_HISTORY)) {
307     if(lsConsoleFrame != null) getLSConsolePane().saveConsoleHistory();
308     }
309    
310 iliev 1786 if(getBackendLogFrame() != null) getBackendLogFrame().stopTimer();
311     if(getLSConsolePane() != null) getLSConsolePane().disconnect();
312    
313 iliev 912 super.onWindowClose();
314     }
315 iliev 1872
316     private void
317     onChangeChannelLaneCount() {
318     int newCount = preferences().getIntProperty("channelLanes.count");
319     if(newCount < 1 || newCount > MAX_CHANNEL_LANE_NUMBER) return;
320     if(newCount == getChannelsPaneCount()) return;
321     int current = getChannelsPaneIndex(getSelectedChannelsPane());
322    
323     if(newCount > getChannelsPaneCount()) {
324     int d = newCount - getChannelsPaneCount();
325     for(int i = 0; i < d; i++) {
326     JSChannelsPane p = mainPane.addChannelsPane();
327     addChannelsPane(p);
328     p.addListSelectionListener(pianoKeyboardPane);
329     }
330     } else {
331     int d = getChannelsPaneCount() - newCount;
332     for(int i = 0; i < d; i++) {
333     int idx = getChannelsPaneCount() - 1 - i;
334     if(getChannelsPane(idx).getChannelCount() > 0) {
335     String s;
336     s = i18n.getError("MainFrame.notEmptyChannelLane!", idx + 1);
337     HF.showErrorMessage(s);
338     return;
339     }
340     }
341    
342     for(int i = 0; i < d; i++) {
343     int idx = getChannelsPaneCount() - 1;
344     JSChannelsPane p = getChannelsPane(idx);
345     removeChannelsPane(p);
346     p.removeListSelectionListener(pianoKeyboardPane);
347     mainPane.removeChannelsPane(idx);
348     }
349     }
350    
351     if(newCount == 1) {
352     mainPane.getButtonsPanel().setVisible(false);
353     } else if(!mainPane.getButtonsPanel().isVisible()) {
354     mainPane.getButtonsPanel().setVisible(true);
355     }
356     mainPane.getButtonsPanel().setButtonNumber(newCount);
357     if(current < 0 || current >= getChannelsPaneCount()) current = 0;
358     setSelectedChannelsPane(getChannelsPane(current));
359     }
360 iliev 912
361 iliev 1786 @Override
362     public void
363     setVisible(boolean b) {
364     if(b == isVisible()) return;
365    
366     super.setVisible(b);
367    
368     if(b && preferences().getBoolProperty("MainFrame.windowMaximized")) {
369     setExtendedState(getExtendedState() | MAXIMIZED_BOTH);
370     }
371     }
372    
373 iliev 1285 private void
374     addMenu() {
375     JMenu m;
376     JMenuItem mi;
377    
378     setJMenuBar(menuBar);
379    
380     // Actions
381     m = new FantasiaMenu(i18n.getMenuLabel("actions"));
382    
383 iliev 1688 mi = new JMenuItem(a4n.refresh);
384 iliev 1285 mi.setIcon(null);
385 iliev 1688 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
386 iliev 1285 m.add(mi);
387    
388     mi = new JMenuItem(a4n.samplerInfo);
389     mi.setIcon(null);
390     m.add(mi);
391    
392 iliev 1688 mi = new JMenuItem(a4n.resetSampler);
393     mi.setIcon(null);
394     m.add(mi);
395    
396 iliev 1285 m.addSeparator();
397    
398     JMenu exportMenu = new JMenu(i18n.getMenuLabel("actions.export"));
399     m.add(exportMenu);
400 iliev 1864
401     int modKey = CC.getViewConfig().getDefaultModKey();
402 iliev 1285
403     mi = new JMenuItem(a4n.exportSamplerConfig);
404     mi.setIcon(null);
405 iliev 1864 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, modKey));
406 iliev 1285 exportMenu.add(mi);
407    
408     mi = new JMenuItem(a4n.exportMidiInstrumentMaps);
409     mi.setIcon(null);
410     exportMenu.add(mi);
411    
412     m.addSeparator();
413    
414     mi = new JMenuItem(a4n.loadScript);
415     mi.setIcon(null);
416 iliev 1864 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, modKey));
417 iliev 1285 m.add(mi);
418    
419 iliev 1308 String[] list = preferences().getStringListProperty(RECENT_LSCP_SCRIPTS);
420     for(String s : list) recentScripts.add(s);
421 iliev 1285
422     updateRecentScriptsMenu();
423    
424     m.add(recentScriptsMenu);
425    
426     m.addSeparator();
427    
428 iliev 1688 mi = new JMenuItem(a4n.changeBackend);
429     mi.setIcon(null);
430 iliev 1864 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, modKey));
431 iliev 1688 m.add(mi);
432    
433     m.addSeparator();
434    
435 iliev 1285 mi = new JMenuItem(i18n.getMenuLabel("actions.exit"));
436     m.add(mi);
437     mi.addActionListener(new ActionListener() {
438     public void
439     actionPerformed(ActionEvent e) { onWindowClose(); }
440     });
441    
442     menuBar.add(m);
443    
444    
445     // Edit
446     m = new FantasiaMenu(i18n.getMenuLabel("edit"));
447     menuBar.add(m);
448    
449 iliev 1323 mi = new JMenuItem(i18n.getMenuLabel("edit.addChannel"));
450     m.add(mi);
451     mi.addActionListener(new ActionListener() {
452     public void
453     actionPerformed(ActionEvent e) {
454     CC.getSamplerModel().addBackendChannel();
455     }
456     });
457    
458     m.addSeparator();
459    
460     mi = new JMenuItem(a4n.createMidiDevice);
461     mi.setIcon(null);
462     m.add(mi);
463    
464     mi = new JMenuItem(a4n.createAudioDevice);
465     mi.setIcon(null);
466     m.add(mi);
467    
468     m.addSeparator();
469    
470 iliev 1285 mi = new JMenuItem(a4n.editPreferences);
471     mi.setIcon(null);
472     mi.setAccelerator(KeyStroke.getKeyStroke (
473 iliev 1864 KeyEvent.VK_P, modKey | KeyEvent.SHIFT_MASK
474 iliev 1285 ));
475     m.add(mi);
476    
477 iliev 1323 // View
478     m = new FantasiaMenu(i18n.getMenuLabel("view"));
479     menuBar.add(m);
480 iliev 1285
481 iliev 1323 m.add(cbmiToolBarVisible);
482    
483     cbmiToolBarVisible.addActionListener(new ActionListener() {
484     public void
485     actionPerformed(ActionEvent e) {
486     showToolBar(cbmiToolBarVisible.getState());
487     }
488     });
489    
490     boolean b = preferences().getBoolProperty("toolBar.visible");
491     cbmiToolBarVisible.setSelected(b);
492     showToolBar(b);
493    
494 iliev 1729 cbmiLeftSidePaneVisible.setAccelerator(KeyStroke.getKeyStroke (
495 iliev 1864 KeyEvent.VK_L, modKey | KeyEvent.SHIFT_MASK
496 iliev 1323 ));
497 iliev 1729 m.add(cbmiLeftSidePaneVisible);
498 iliev 1323
499 iliev 1729 cbmiLeftSidePaneVisible.addActionListener(new ActionListener() {
500 iliev 1323 public void
501     actionPerformed(ActionEvent e) {
502 iliev 1729 showSidePane(cbmiLeftSidePaneVisible.getState());
503 iliev 1323 }
504     });
505    
506 iliev 1729 b = preferences().getBoolProperty("leftSidePane.visible");
507     cbmiLeftSidePaneVisible.setSelected(b);
508 iliev 1323 showSidePane(b);
509    
510 iliev 1729 cbmiRightSidePaneVisible.setAccelerator(KeyStroke.getKeyStroke (
511 iliev 1864 KeyEvent.VK_R, modKey | KeyEvent.SHIFT_MASK
512 iliev 1323 ));
513 iliev 1729 m.add(cbmiRightSidePaneVisible);
514 iliev 1323
515 iliev 1729 cbmiRightSidePaneVisible.addActionListener(new ActionListener() {
516 iliev 1323 public void
517     actionPerformed(ActionEvent e) {
518 iliev 1729 showDevicesPane(cbmiRightSidePaneVisible.getState());
519 iliev 1323 }
520     });
521    
522 iliev 1729 b = preferences().getBoolProperty("rightSidePane.visible");
523     cbmiRightSidePaneVisible.setSelected(b);
524 iliev 1323 showDevicesPane(b);
525    
526 iliev 1776 m.addSeparator();
527 iliev 1323
528 iliev 1776 m.add(cbmiMidiKeyboardVisible);
529    
530     cbmiMidiKeyboardVisible.addActionListener(new ActionListener() {
531     public void
532     actionPerformed(ActionEvent e) {
533 iliev 1778 setMidiKeyboardVisible(cbmiMidiKeyboardVisible.getState());
534 iliev 1776 }
535     });
536    
537     b = preferences().getBoolProperty("midiKeyboard.visible");
538     cbmiMidiKeyboardVisible.setSelected(b);
539 iliev 1778 setMidiKeyboardVisible(b);
540 iliev 1776
541    
542 iliev 1818 // Channels
543     m = new FantasiaMenu(i18n.getMenuLabel("channels"));
544    
545     mi = new JMenuItem(i18n.getMenuLabel("channels.newChannel"));
546     mi.addActionListener(new ActionListener() {
547     public void
548     actionPerformed(ActionEvent e) {
549     CC.getSamplerModel().addBackendChannel();
550     }
551     });
552     m.add(mi);
553    
554     m.addSeparator();
555    
556     MenuManager.ChannelViewGroup group = new MenuManager.ChannelViewGroup();
557     MenuManager.getMenuManager().registerChannelViewGroup(group);
558    
559     for(JMenuItem menuItem : group.getMenuItems()) m.add(menuItem);
560    
561     m.addSeparator();
562    
563     m.add(new JMenuItem(a4n.moveChannelsOnTop));
564     m.add(new JMenuItem(a4n.moveChannelsUp));
565     m.add(new JMenuItem(a4n.moveChannelsDown));
566     m.add(new JMenuItem(a4n.moveChannelsAtBottom));
567    
568     m.add(new ToPanelMenu());
569    
570     m.addSeparator();
571    
572     mi = new JMenuItem(a4n.selectAllChannels);
573     mi.setIcon(null);
574 iliev 1864 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, modKey));
575 iliev 1818 m.add(mi);
576    
577     mi = new JMenuItem(a4n.deselectChannels);
578     mi.setIcon(null);
579     mi.setAccelerator(KeyStroke.getKeyStroke (
580 iliev 1864 KeyEvent.VK_A, modKey | KeyEvent.SHIFT_MASK
581 iliev 1818 ));
582     m.add(mi);
583    
584     menuBar.add(m);
585    
586 iliev 1285 // Window
587     m = new FantasiaMenu(i18n.getMenuLabel("window"));
588     menuBar.add(m);
589    
590     mi = new JMenuItem(a4n.windowLSConsole);
591     mi.setIcon(null);
592     m.add(mi);
593    
594     mi = new JMenuItem(a4n.windowInstrumentsDb);
595     mi.setIcon(null);
596     m.add(mi);
597    
598 iliev 1786 m.addSeparator();
599 iliev 1285
600 iliev 1786 final JMenuItem mi2 = new JMenuItem(i18n.getMenuLabel("window.backendLog"));
601     m.add(mi2);
602     mi2.addActionListener(new ActionListener() {
603     public void
604     actionPerformed(ActionEvent e) {
605     if(getBackendLogFrame().isVisible()) {
606     getBackendLogFrame().setVisible(false);
607     }
608    
609     getBackendLogFrame().setVisible(true);
610     }
611     });
612    
613     mi2.setEnabled(CC.getBackendProcess() != null);
614    
615     CC.addBackendProcessListener(new ActionListener() {
616     public void
617     actionPerformed(ActionEvent e) {
618     mi2.setEnabled(CC.getBackendProcess() != null);
619     }
620     });
621    
622    
623 iliev 1285 // Help
624     m = new FantasiaMenu(i18n.getMenuLabel("help"));
625    
626 iliev 1496 mi = new JMenuItem(a4n.browseOnlineTutorial);
627     mi.setIcon(null);
628     m.add(mi);
629    
630     m.addSeparator();
631    
632 iliev 1285 mi = new JMenuItem(a4n.helpAbout);
633     mi.setIcon(null);
634     m.add(mi);
635    
636     menuBar.add(m);
637 iliev 912 }
638    
639 iliev 1818 public static class ToPanelMenu extends FantasiaMenu implements ListSelectionListener {
640     public
641     ToPanelMenu() {
642     super(i18n.getMenuLabel("channels.toPanel"));
643     setEnabled(CC.getMainFrame().getSelectedChannelsPane().hasSelectedChannel());
644    
645     CC.getMainFrame().addChannelsPaneSelectionListener(this);
646    
647     for(int i = 0; i < CC.getMainFrame().getChannelsPaneCount(); i++) {
648     JSChannelsPane p = CC.getMainFrame().getChannelsPane(i);
649     add(new JMenuItem(new A4n.MoveChannelsToPanel(p)));
650     p.addListSelectionListener(this);
651     }
652     }
653    
654     @Override
655     public void
656     valueChanged(ListSelectionEvent e) {
657     setEnabled(CC.getMainFrame().getSelectedChannelsPane().hasSelectedChannel());
658     }
659     }
660    
661 iliev 1767 public RightSidePane
662     getRightSidePane() { return rightSidePane; }
663    
664 iliev 1818 @Override
665     public A4n
666     getA4n() { return A4n.a4n; }
667    
668 iliev 912 /**
669 iliev 1785 * This method does nothing, because <b>Fantasia</b> has constant
670     * number of panes containing sampler channels, which can not be changed.
671 iliev 912 */
672 iliev 1778 @Override
673 iliev 912 public void
674     insertChannelsPane(JSChannelsPane pane, int idx) {
675 iliev 1285
676 iliev 912 }
677    
678 iliev 1778 @Override
679 iliev 912 public JSChannelsPane
680 iliev 1785 getSelectedChannelsPane() { return mainPane.getSelectedChannelsPane(); }
681 iliev 912
682 iliev 1778 @Override
683 iliev 912 public void
684 iliev 1785 setSelectedChannelsPane(JSChannelsPane pane) {
685     mainPane.setSelectedChannelsPane(pane);
686     fireChannelsPaneSelectionChanged();
687     }
688 iliev 912
689 iliev 1778 @Override
690 iliev 1285 public void
691     installJSamplerHome() {
692     JSamplerHomeChooser chooser = new JSamplerHomeChooser(this);
693     chooser.setVisible(true);
694     if(chooser.isCancelled()) return;
695 iliev 912
696 iliev 1285 CC.changeJSamplerHome(chooser.getJSamplerHome());
697 iliev 912 }
698    
699 iliev 1778 @Override
700 iliev 1143 public void
701 iliev 1204 showDetailedErrorMessage(Frame owner, String err, String details) {
702 iliev 1355 JSDetailedErrorDlg dlg = new JSDetailedErrorDlg (
703     owner, Res.iconWarning32, i18n.getError("error"), err, details
704     );
705     dlg.setVisible(true);
706 iliev 1204 }
707    
708 iliev 1778 @Override
709 iliev 1204 public void
710     showDetailedErrorMessage(Dialog owner, String err, String details) {
711 iliev 1355 JSDetailedErrorDlg dlg = new JSDetailedErrorDlg (
712     owner, Res.iconWarning32, i18n.getError("error"), err, details
713     );
714     dlg.setVisible(true);
715 iliev 1204 }
716 iliev 912
717 iliev 1688 /**
718     * Gets the server address to which to connect. If the server should be
719     * manually selected, a dialog asking the user to choose a server is displayed.
720     */
721 iliev 1778 @Override
722 iliev 1688 public Server
723     getServer() {
724     boolean b = preferences().getBoolProperty(MANUAL_SERVER_SELECT_ON_STARTUP);
725     return getServer(b);
726     }
727    
728     /**
729     * Gets the server address to which to connect. If the server should be
730     * manually selected, a dialog asking the user to choose a server is displayed.
731     * @param manualSelect Determines whether the server should be manually selected.
732     */
733 iliev 1778 @Override
734 iliev 1688 public Server
735     getServer(boolean manualSelect) {
736     if(manualSelect) {
737     JSConnectDlg dlg = new JSConnectDlg();
738     dlg.setVisible(true);
739 iliev 1786
740 iliev 1688 return dlg.getSelectedServer();
741     }
742    
743     int i = preferences().getIntProperty(SERVER_INDEX);
744     int size = CC.getServerList().getServerCount();
745     if(size == 0) return null;
746     if(i >= size) return CC.getServerList().getServer(0);
747    
748     return CC.getServerList().getServer(i);
749     }
750    
751 iliev 1734 public Timer
752     getGuiTimer() { return guiTimer; }
753    
754 iliev 1883 @Override
755     public LSConsoleModel
756 iliev 1285 getLSConsoleModel() { return getLSConsolePane().getModel(); }
757    
758     protected LSConsolePane
759     getLSConsolePane() {
760     return getLSConsoleFrame().getLSConsolePane();
761     }
762    
763     protected LSConsoleFrame
764 iliev 1311 getLSConsoleFrame() { return lsConsoleFrame; }
765 iliev 1285
766 iliev 1786 public JSBackendLogFrame
767     getBackendLogFrame() { return backendLogFrame; }
768    
769 iliev 1688 protected boolean
770 iliev 1285 runScript() {
771 iliev 1871 File f = StdUtils.showOpenLscpFileChooser();
772     if(f == null) return false;
773     runScript(f);
774 iliev 912
775 iliev 1688 return true;
776 iliev 1285 }
777    
778 iliev 1786 @Override
779     public void
780 iliev 1285 runScript(String script) { runScript(new File(script)); }
781    
782     private void
783     runScript(File script) {
784     FileReader fr;
785     try { fr = new FileReader(script); }
786     catch(FileNotFoundException e) {
787 iliev 1871 HF.showErrorMessage(i18n.getError("fileNotFound!"));
788 iliev 1285 return;
789 iliev 912 }
790    
791 iliev 1818 String prefix = "#jsampler.fantasia: ";
792     Vector<String> v = new Vector<String>();
793 iliev 1285 BufferedReader br = new BufferedReader(fr);
794    
795     try {
796     String s = br.readLine();
797     while(s != null) {
798     getLSConsoleModel().setCommandLineText(s);
799     getLSConsoleModel().execCommand();
800 iliev 1818 if(s.startsWith(prefix)) v.add(s.substring(prefix.length()));
801 iliev 1285 s = br.readLine();
802     }
803     } catch(Exception e) {
804     HF.showErrorMessage(e);
805     return;
806 iliev 912 }
807 iliev 1285
808     String s = script.getAbsolutePath();
809     recentScripts.remove(s);
810     recentScripts.insertElementAt(s, 0);
811    
812     updateRecentScriptsMenu();
813 iliev 1818
814     CC.getViewConfig().setSessionViewConfig(
815     new SessionViewConfig(v.toArray(new String[v.size()]))
816     );
817 iliev 1285 }
818 iliev 912
819 iliev 1285 protected void
820     clearRecentScripts() {
821     recentScripts.removeAllElements();
822     updateRecentScriptsMenu();
823     }
824    
825     protected void
826     updateRecentScriptsMenu() {
827     int size = preferences().getIntProperty(RECENT_LSCP_SCRIPTS_SIZE);
828     while(recentScripts.size() > size) {
829     recentScripts.removeElementAt(recentScripts.size() - 1);
830     }
831    
832     recentScriptsMenu.removeAll();
833    
834     for(String script : recentScripts) {
835     JMenuItem mi = new JMenuItem(script);
836     recentScriptsMenu.add(mi);
837     mi.addActionListener(new RecentScriptHandler(script));
838     }
839    
840     recentScriptsMenu.setEnabled(recentScripts.size() != 0);
841     }
842    
843 iliev 1323 private void
844     showToolBar(boolean b) {
845     preferences().setBoolProperty("toolBar.visible", b);
846     standardBar.setVisible(b);
847     }
848    
849     private void
850     showSidePane(boolean b) {
851 iliev 1729 preferences().setBoolProperty("leftSidePane.visible", b);
852 iliev 1323 rootPane.remove(rightPane);
853     rootPane.remove(hSplitPane);
854    
855     if(b) {
856     hSplitPane.setRightComponent(rightPane);
857     rootPane.add(hSplitPane);
858     int i = preferences().getIntProperty("MainFrame.hSplitDividerLocation", 220);
859    
860     hSplitPane.setDividerLocation(i);
861     hSplitPane.validate();
862     } else {
863     rootPane.add(rightPane);
864    
865     }
866    
867     int w = getPreferredSize().width;
868     int h = getSize().height;
869     setSize(new Dimension(w, h));
870    
871     rootPane.revalidate();
872     rootPane.validate();
873     rootPane.repaint();
874    
875     SwingUtilities.invokeLater(new Runnable() {
876     public void
877     run() { sidePanesVisibilityChanged(); }
878     });
879     }
880    
881     private void
882     showDevicesPane(boolean b) {
883 iliev 1729 preferences().setBoolProperty("rightSidePane.visible", b);
884 iliev 1323
885 iliev 1729 int width = leftSidePane.getWidth();
886     int height = leftSidePane.getPreferredSize().height;
887     if(width != 0) leftSidePane.setPreferredSize(new Dimension(width, height));
888 iliev 1323
889     if(b) {
890     int w = preferences().getIntProperty("devicesPane.width", 200);
891    
892 iliev 1729 int h = rightSidePane.getPreferredSize().height;
893     rightSidePane.setPreferredSize(new Dimension(w, h));
894 iliev 1323 } else {
895 iliev 1729 int w = rightSidePane.getWidth();
896 iliev 1323 if(w > 0 && w < 200) w = 200;
897     if(w != 0) preferences().setIntProperty("devicesPane.width", w);
898     }
899    
900     hSplitPane.setResizeWeight(0.0);
901 iliev 1729 rightSidePane.setVisible(b);
902 iliev 1323 hSplitPane.resetToPreferredSizes();
903    
904     int w = getPreferredSize().width;
905     int h = getSize().height;
906     setSize(new Dimension(w, h));
907    
908     rootPane.validate();
909     rootPane.repaint();
910     //hSplitPane.validate();
911    
912     SwingUtilities.invokeLater(new Runnable() {
913     public void
914     run() { sidePanesVisibilityChanged(); }
915     });
916     }
917    
918 iliev 1778 public void
919     setMidiKeyboardVisible(boolean b) {
920 iliev 1776 preferences().setBoolProperty("midiKeyboard.visible", b);
921 iliev 1778 pianoKeyboardPane.setVisible(b);
922    
923     if(cbmiMidiKeyboardVisible.isSelected() != b) {
924     cbmiMidiKeyboardVisible.setSelected(b);
925 iliev 1776 }
926    
927 iliev 1778 if(standardBar.btnMidiKeyboard.isSelected() != b) {
928     standardBar.btnMidiKeyboard.setSelected(b);
929     }
930    
931     if(pianoKeyboardPane.btnPower.isSelected() != b) {
932     pianoKeyboardPane.btnPower.setSelected(b);
933     }
934    
935     rootPane.validate();
936     rootPane.repaint();
937 iliev 1776 }
938    
939 iliev 1778 public void
940     setMidiKeyboardHeight(int height) {
941     Dimension d = pianoKeyboardPane.getPreferredSize();
942     d = new Dimension(d.width, height);
943     pianoKeyboardPane.setPreferredSize(d);
944     pianoKeyboardPane.setMinimumSize(d);
945     pianoKeyboardPane.revalidate();
946     pianoKeyboardPane.repaint();
947     }
948    
949 iliev 1776 private void
950 iliev 1323 sidePanesVisibilityChanged() {
951 iliev 1729 boolean leftSidePaneVisible = cbmiLeftSidePaneVisible.isSelected();
952     boolean rightSidePaneVisible = cbmiRightSidePaneVisible.isSelected();
953 iliev 1323
954 iliev 1729 if(leftSidePaneVisible && rightSidePaneVisible) {
955 iliev 1323 hSplitPane.setResizeWeight(0.5);
956 iliev 1729 } else if(leftSidePaneVisible && !rightSidePaneVisible) {
957 iliev 1323 hSplitPane.setResizeWeight(1.0);
958     }
959    
960 iliev 1729 if(!leftSidePaneVisible && !rightSidePaneVisible) {
961 iliev 1323 standardBar.showFantasiaLogo(false);
962     if(isResizable()) setResizable(false);
963     } else {
964     standardBar.showFantasiaLogo(true);
965     if(!isResizable()) setResizable(true);
966     }
967     }
968    
969 iliev 1285 private class RecentScriptHandler implements ActionListener {
970     private String script;
971    
972     RecentScriptHandler(String script) { this.script = script; }
973    
974 iliev 1778 @Override
975 iliev 912 public void
976 iliev 1285 actionPerformed(ActionEvent e) {
977     runScript(script);
978     if(preferences().getBoolProperty(SHOW_LS_CONSOLE_WHEN_RUN_SCRIPT)) {
979     a4n.windowLSConsole.actionPerformed(null);
980     }
981 iliev 912 }
982 iliev 1285 }
983 iliev 912
984 iliev 1285 private static class FantasiaMenu extends JMenu {
985     FantasiaMenu(String s) {
986     super(s);
987     setFont(getFont().deriveFont(java.awt.Font.BOLD));
988     setOpaque(false);
989 iliev 1776 setContentAreaFilled(false);
990 iliev 912 }
991     }
992 iliev 1285
993 iliev 1323 private class FantasiaMenuBar extends JMenuBar {
994 iliev 1285 FantasiaMenuBar() {
995     setOpaque(false);
996 iliev 1778 setBorder(BorderFactory.createEmptyBorder(2, 6, 0, 0));
997 iliev 1285 }
998    
999 iliev 1778 @Override
1000 iliev 1285 protected void
1001     paintComponent(Graphics g) {
1002 iliev 1778 //super.paintComponent(g);
1003     Graphics2D g2 = (Graphics2D)g;
1004    
1005     Paint oldPaint = g2.getPaint();
1006     Composite oldComposite = g2.getComposite();
1007    
1008     double h = getSize().getHeight();
1009     double w = getSize().getWidth();
1010    
1011     FantasiaPainter.paintGradient(g2, 0.0, 0.0, w - 1, h - 1, FantasiaPainter.color6, FantasiaPainter.color5);
1012    
1013     FantasiaPainter.Border b;
1014    
1015    
1016 iliev 1323 if(standardBar.isVisible()) {
1017 iliev 1778 b = new FantasiaPainter.Border(true, true, false, true);
1018     FantasiaPainter.paintBoldOuterBorder(g2, 0, 0, w - 1, h + 1, b);
1019 iliev 1323 } else {
1020 iliev 1778 b = new FantasiaPainter.Border(true, true, true, true);
1021     FantasiaPainter.paintBoldOuterBorder(g2, 0, 0, w - 1, h - 1, b);
1022 iliev 1323 }
1023 iliev 1778
1024     g2.setPaint(oldPaint);
1025     g2.setComposite(oldComposite);
1026 iliev 1285 }
1027     }
1028 iliev 1778
1029     class RootPane extends FantasiaSubPanel {
1030     private final Color color1 = new Color(0x454545);
1031     private final Color color2 = new Color(0x2e2e2e);
1032    
1033     RootPane() {
1034     setLayout(new BorderLayout());
1035     setBorder(BorderFactory.createEmptyBorder(9, 10, 6, 10));
1036     setOpaque(false);
1037    
1038     }
1039    
1040     @Override
1041     public void
1042     paintComponent(Graphics g) {
1043     Graphics2D g2 = (Graphics2D)g;
1044    
1045     Paint oldPaint = g2.getPaint();
1046     Composite oldComposite = g2.getComposite();
1047    
1048     double h = getSize().getHeight();
1049     double w = getSize().getWidth();
1050    
1051     FantasiaPainter.paintBorder(g2, 0, -3, w - 1, h - 1, 6, false);
1052     paintComponent(g2, 5, 1, w - 10, h - 6, color1, color2);
1053    
1054     g2.setPaint(oldPaint);
1055     g2.setComposite(oldComposite);
1056     }
1057     }
1058    
1059     class BottomPane extends FantasiaPanel {
1060     BottomPane() {
1061     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
1062     setOpaque(false);
1063     add(pianoKeyboardPane);
1064    
1065     }
1066     }
1067 iliev 912 }

  ViewVC Help
Powered by ViewVC