/[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 1778 - (hide annotations) (download)
Sun Sep 28 20:38:36 2008 UTC (15 years, 7 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 iliev 912 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4 iliev 1729 * Copyright (C) 2005-2008 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 912
38     import java.awt.event.ActionEvent;
39     import java.awt.event.ActionListener;
40 iliev 1285 import java.awt.event.KeyEvent;
41 iliev 912
42 iliev 1778 import java.beans.PropertyChangeEvent;
43     import java.beans.PropertyChangeListener;
44    
45 iliev 1285 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 iliev 912 import java.util.logging.Level;
52    
53 iliev 1285 import javax.swing.BorderFactory;
54 iliev 1778 import javax.swing.BoxLayout;
55 iliev 912 import javax.swing.JCheckBoxMenuItem;
56 iliev 1285 import javax.swing.JFileChooser;
57 iliev 912 import javax.swing.JMenu;
58 iliev 1285 import javax.swing.JMenuBar;
59 iliev 912 import javax.swing.JMenuItem;
60     import javax.swing.JPanel;
61 iliev 1285 import javax.swing.JSplitPane;
62     import javax.swing.KeyStroke;
63     import javax.swing.SwingUtilities;
64 iliev 1734 import javax.swing.Timer;
65 iliev 912
66     import org.jsampler.CC;
67     import org.jsampler.HF;
68 iliev 1285 import org.jsampler.LSConsoleModel;
69 iliev 1688 import org.jsampler.Server;
70 iliev 912
71     import org.jsampler.view.JSChannelsPane;
72     import org.jsampler.view.JSMainFrame;
73 iliev 1285 import org.jsampler.view.LscpFileFilter;
74 iliev 912
75 iliev 1688 import org.jsampler.view.std.JSConnectDlg;
76 iliev 1355 import org.jsampler.view.std.JSDetailedErrorDlg;
77 iliev 1567 import org.jsampler.view.std.JSQuitDlg;
78 iliev 1285 import org.jsampler.view.std.JSamplerHomeChooser;
79    
80     import static org.jsampler.view.fantasia.A4n.a4n;
81 iliev 912 import static org.jsampler.view.fantasia.FantasiaI18n.i18n;
82 iliev 1285 import static org.jsampler.view.fantasia.FantasiaPrefs.preferences;
83     import static org.jsampler.view.std.StdPrefs.*;
84 iliev 912
85    
86     /**
87     *
88     * @author Grigor Iliev
89     */
90     public class MainFrame extends JSMainFrame {
91 iliev 1323 private final StandardBar standardBar = new StandardBar();
92 iliev 1285 private final FantasiaMenuBar menuBar = new FantasiaMenuBar();
93 iliev 1778 private final JPanel rootPane = new RootPane();
94     private final BottomPane bottomPane;
95 iliev 1285 private final MainPane mainPane = new MainPane();
96 iliev 1776 private final PianoKeyboardPane pianoKeyboardPane;
97 iliev 912
98 iliev 1285 private final JMenu recentScriptsMenu =
99     new JMenu(i18n.getMenuLabel("actions.recentScripts"));
100 iliev 912
101 iliev 1285 private final JSplitPane hSplitPane;
102    
103 iliev 1729 private final LeftSidePane leftSidePane = new LeftSidePane();
104     private final RightSidePane rightSidePane = new RightSidePane();
105 iliev 1323 private final JPanel rightPane;
106 iliev 1285
107 iliev 1767 //private final StatusBar statusBar = new StatusBar();
108    
109 iliev 1311 private final LSConsoleFrame lsConsoleFrame = new LSConsoleFrame();
110 iliev 1285 private final Vector<String> recentScripts = new Vector<String>();
111    
112    
113 iliev 1323 private final JCheckBoxMenuItem cbmiToolBarVisible =
114     new JCheckBoxMenuItem(i18n.getMenuLabel("view.toolBar"));
115    
116 iliev 1729 private final JCheckBoxMenuItem cbmiLeftSidePaneVisible =
117     new JCheckBoxMenuItem(i18n.getMenuLabel("view.leftSidePane"));
118 iliev 1323
119 iliev 1729 private final JCheckBoxMenuItem cbmiRightSidePaneVisible =
120     new JCheckBoxMenuItem(i18n.getMenuLabel("view.rightSidePane"));
121 iliev 1323
122 iliev 1776 private final JCheckBoxMenuItem cbmiMidiKeyboardVisible =
123     new JCheckBoxMenuItem(i18n.getMenuLabel("view.midiKeyboard"));
124    
125 iliev 1734 private final Timer guiTimer = new Timer(1000, null);
126    
127 iliev 912 /** Creates a new instance of <code>MainFrame</code> */
128     public
129     MainFrame() {
130     setTitle(i18n.getLabel("MainFrame.title"));
131 iliev 1778 //setUndecorated(true);
132 iliev 1285 if(Res.iconAppIcon != null) setIconImage(Res.iconAppIcon.getImage());
133 iliev 912
134 iliev 1285 getContentPane().add(standardBar, BorderLayout.NORTH);
135 iliev 912
136 iliev 1323 rightPane = createRightPane();
137 iliev 912
138 iliev 1285 hSplitPane = new JSplitPane (
139     JSplitPane.HORIZONTAL_SPLIT,
140     true, // continuousLayout
141 iliev 1729 leftSidePane, rightPane
142 iliev 1285 );
143 iliev 1323 hSplitPane.setResizeWeight(0.5);
144 iliev 912
145 iliev 1776 addChannelsPane(mainPane.getChannelsPane());
146    
147     pianoKeyboardPane = new PianoKeyboardPane();
148     getChannelsPane(0).addListSelectionListener(pianoKeyboardPane);
149 iliev 1778 int h = preferences().getIntProperty("midiKeyboard.height");
150     setMidiKeyboardHeight(h);
151 iliev 1776
152 iliev 1778 PropertyChangeListener l = new PropertyChangeListener() {
153     public void
154     propertyChange(PropertyChangeEvent e) {
155     int h = preferences().getIntProperty("midiKeyboard.height");
156     setMidiKeyboardHeight(h);
157     }
158     };
159 iliev 1776
160 iliev 1778 CC.preferences().addPropertyChangeListener("midiKeyboard.height", l);
161 iliev 1776
162 iliev 1778 bottomPane = new BottomPane();
163    
164     hSplitPane.setOpaque(false);
165 iliev 1323 rootPane.add(hSplitPane);
166 iliev 1778 rootPane.add(bottomPane, BorderLayout.SOUTH);
167     add(rootPane);
168 iliev 912
169 iliev 1323 addMenu();
170    
171 iliev 1285 int i = preferences().getIntProperty("MainFrame.hSplitDividerLocation", 220);
172     hSplitPane.setDividerLocation(i);
173 iliev 912
174 iliev 1285 setSavedSize();
175 iliev 1734
176     guiTimer.start();
177 iliev 1285 }
178    
179     private JPanel
180     createRightPane() {
181 iliev 1778 JPanel p = new FantasiaPanel();
182     p.setOpaque(false);
183    
184 iliev 1285 GridBagLayout gridbag = new GridBagLayout();
185     GridBagConstraints c = new GridBagConstraints();
186 iliev 912
187 iliev 1285 p.setLayout(gridbag);
188 iliev 912
189 iliev 1285 c.fill = GridBagConstraints.BOTH;
190 iliev 912
191 iliev 1285 c.gridx = 1;
192     c.gridy = 0;
193     c.weightx = 1.0;
194     c.weighty = 1.0;
195 iliev 1729 c.insets = new Insets(0, 3, 0, 0);
196     gridbag.setConstraints(rightSidePane, c);
197     p.add(rightSidePane);
198 iliev 912
199 iliev 1285 c.gridx = 0;
200     c.gridy = 0;
201     c.weightx = 0.0;
202     c.weighty = 1.0;
203 iliev 1778 c.insets = new Insets(0, 0, 0, 3);
204 iliev 1285 c.fill = GridBagConstraints.VERTICAL;
205     gridbag.setConstraints(mainPane, c);
206     p.add(mainPane);
207 iliev 912
208 iliev 1285 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 iliev 912 pack();
219     try {
220 iliev 1285 int i = s.indexOf(',');
221     int x = Integer.parseInt(s.substring(0, i));
222 iliev 912
223 iliev 1285 s = s.substring(i + 1);
224     i = s.indexOf(',');
225     int y = Integer.parseInt(s.substring(0, i));
226 iliev 912
227 iliev 1285 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 iliev 912 } catch(Exception x) {
236     String msg = "Parsing of window size and location string failed";
237     CC.getLogger().log(Level.INFO, msg, x);
238 iliev 1285 setDefaultSizeAndLocation();
239 iliev 912 }
240 iliev 1285
241     if(preferences().getBoolProperty("MainFrame.windowMaximized")) {
242     setExtendedState(getExtendedState() | MAXIMIZED_BOTH);
243     }
244 iliev 912 }
245    
246     private void
247 iliev 1285 setDefaultSizeAndLocation() {
248     setPreferredSize(new Dimension(900, 600));
249     pack();
250     setLocationRelativeTo(null);
251 iliev 912 }
252    
253    
254     /** Invoked when this window is about to close. */
255 iliev 1778 @Override
256 iliev 912 protected void
257     onWindowClose() {
258 iliev 1688 boolean b = preferences().getBoolProperty(CONFIRM_APP_QUIT);
259     if(b && CC.getSamplerModel().isModified()) {
260 iliev 1567 JSQuitDlg dlg = new JSQuitDlg(Res.iconQuestion32);
261     dlg.setVisible(true);
262     if(dlg.isCancelled()) return;
263     }
264    
265 iliev 1729 leftSidePane.savePreferences();
266     rightSidePane.savePreferences();
267 iliev 912
268 iliev 1285 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 iliev 912 java.awt.Point p = getLocation();
282     Dimension d = getSize();
283     StringBuffer sb = new StringBuffer();
284 iliev 1285 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 iliev 912
288 iliev 1308 String[] list = recentScripts.toArray(new String[recentScripts.size()]);
289     preferences().setStringListProperty(RECENT_LSCP_SCRIPTS, list);
290 iliev 1285
291     if(preferences().getBoolProperty(SAVE_LS_CONSOLE_HISTORY)) {
292     if(lsConsoleFrame != null) getLSConsolePane().saveConsoleHistory();
293     }
294    
295 iliev 912 super.onWindowClose();
296     }
297    
298 iliev 1285 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 iliev 1688 mi = new JMenuItem(a4n.refresh);
309 iliev 1285 mi.setIcon(null);
310 iliev 1688 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
311 iliev 1285 m.add(mi);
312    
313     mi = new JMenuItem(a4n.samplerInfo);
314     mi.setIcon(null);
315     m.add(mi);
316    
317 iliev 1688 mi = new JMenuItem(a4n.resetSampler);
318     mi.setIcon(null);
319     m.add(mi);
320    
321 iliev 1285 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 iliev 1688 mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK));
340 iliev 1285 m.add(mi);
341    
342 iliev 1308 String[] list = preferences().getStringListProperty(RECENT_LSCP_SCRIPTS);
343     for(String s : list) recentScripts.add(s);
344 iliev 1285
345     updateRecentScriptsMenu();
346    
347     m.add(recentScriptsMenu);
348    
349     m.addSeparator();
350    
351 iliev 1688 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 iliev 1285 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 iliev 1323 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 iliev 1285 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 iliev 1323 // View
401     m = new FantasiaMenu(i18n.getMenuLabel("view"));
402     menuBar.add(m);
403 iliev 1285
404 iliev 1323 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 iliev 1729 cbmiLeftSidePaneVisible.setAccelerator(KeyStroke.getKeyStroke (
418 iliev 1323 KeyEvent.VK_L, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
419     ));
420 iliev 1729 m.add(cbmiLeftSidePaneVisible);
421 iliev 1323
422 iliev 1729 cbmiLeftSidePaneVisible.addActionListener(new ActionListener() {
423 iliev 1323 public void
424     actionPerformed(ActionEvent e) {
425 iliev 1729 showSidePane(cbmiLeftSidePaneVisible.getState());
426 iliev 1323 }
427     });
428    
429 iliev 1729 b = preferences().getBoolProperty("leftSidePane.visible");
430     cbmiLeftSidePaneVisible.setSelected(b);
431 iliev 1323 showSidePane(b);
432    
433 iliev 1729 cbmiRightSidePaneVisible.setAccelerator(KeyStroke.getKeyStroke (
434 iliev 1323 KeyEvent.VK_R, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
435     ));
436 iliev 1729 m.add(cbmiRightSidePaneVisible);
437 iliev 1323
438 iliev 1729 cbmiRightSidePaneVisible.addActionListener(new ActionListener() {
439 iliev 1323 public void
440     actionPerformed(ActionEvent e) {
441 iliev 1729 showDevicesPane(cbmiRightSidePaneVisible.getState());
442 iliev 1323 }
443     });
444    
445 iliev 1729 b = preferences().getBoolProperty("rightSidePane.visible");
446     cbmiRightSidePaneVisible.setSelected(b);
447 iliev 1323 showDevicesPane(b);
448    
449 iliev 1776 m.addSeparator();
450 iliev 1323
451 iliev 1776 m.add(cbmiMidiKeyboardVisible);
452    
453     cbmiMidiKeyboardVisible.addActionListener(new ActionListener() {
454     public void
455     actionPerformed(ActionEvent e) {
456 iliev 1778 setMidiKeyboardVisible(cbmiMidiKeyboardVisible.getState());
457 iliev 1776 }
458     });
459    
460     b = preferences().getBoolProperty("midiKeyboard.visible");
461     cbmiMidiKeyboardVisible.setSelected(b);
462 iliev 1778 setMidiKeyboardVisible(b);
463 iliev 1776
464    
465 iliev 1285 // 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 iliev 1496 mi = new JMenuItem(a4n.browseOnlineTutorial);
482     mi.setIcon(null);
483     m.add(mi);
484    
485     m.addSeparator();
486    
487 iliev 1285 mi = new JMenuItem(a4n.helpAbout);
488     mi.setIcon(null);
489     m.add(mi);
490    
491     menuBar.add(m);
492 iliev 912 }
493    
494 iliev 1767 public RightSidePane
495     getRightSidePane() { return rightSidePane; }
496    
497 iliev 912 /**
498     * This method does nothing, because <b>Fantasia</b> has exactly
499     * one pane containing sampler channels, which can not be changed.
500     */
501 iliev 1778 @Override
502 iliev 912 public void
503     insertChannelsPane(JSChannelsPane pane, int idx) {
504 iliev 1285
505 iliev 912 }
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 iliev 1778 @Override
513 iliev 912 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 iliev 1778 @Override
521 iliev 912 public void
522     setSelectedChannelsPane(JSChannelsPane pane) { }
523    
524 iliev 1778 @Override
525 iliev 1285 public void
526     installJSamplerHome() {
527     JSamplerHomeChooser chooser = new JSamplerHomeChooser(this);
528     chooser.setVisible(true);
529     if(chooser.isCancelled()) return;
530 iliev 912
531 iliev 1285 CC.changeJSamplerHome(chooser.getJSamplerHome());
532 iliev 912 }
533    
534 iliev 1778 @Override
535 iliev 1143 public void
536 iliev 1204 showDetailedErrorMessage(Frame owner, String err, String details) {
537 iliev 1355 JSDetailedErrorDlg dlg = new JSDetailedErrorDlg (
538     owner, Res.iconWarning32, i18n.getError("error"), err, details
539     );
540     dlg.setVisible(true);
541 iliev 1204 }
542    
543 iliev 1778 @Override
544 iliev 1204 public void
545     showDetailedErrorMessage(Dialog owner, String err, String details) {
546 iliev 1355 JSDetailedErrorDlg dlg = new JSDetailedErrorDlg (
547     owner, Res.iconWarning32, i18n.getError("error"), err, details
548     );
549     dlg.setVisible(true);
550 iliev 1204 }
551 iliev 912
552 iliev 1688 /**
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 iliev 1778 @Override
557 iliev 1688 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 iliev 1778 @Override
569 iliev 1688 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 iliev 1734 public Timer
586     getGuiTimer() { return guiTimer; }
587    
588 iliev 1285 protected LSConsoleModel
589     getLSConsoleModel() { return getLSConsolePane().getModel(); }
590    
591     protected LSConsolePane
592     getLSConsolePane() {
593     return getLSConsoleFrame().getLSConsolePane();
594     }
595    
596     protected LSConsoleFrame
597 iliev 1311 getLSConsoleFrame() { return lsConsoleFrame; }
598 iliev 1285
599 iliev 1688 protected boolean
600 iliev 1285 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 iliev 1688 if(result != JFileChooser.APPROVE_OPTION) return false;
606 iliev 912
607 iliev 1285 String path = fc.getCurrentDirectory().getAbsolutePath();
608     preferences().setStringProperty("lastScriptLocation", path);
609    
610     runScript(fc.getSelectedFile());
611 iliev 1688
612     return true;
613 iliev 1285 }
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 iliev 912 }
626    
627 iliev 1285 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 iliev 912 }
640 iliev 1285
641     String s = script.getAbsolutePath();
642     recentScripts.remove(s);
643     recentScripts.insertElementAt(s, 0);
644    
645     updateRecentScriptsMenu();
646     }
647 iliev 912
648 iliev 1285 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 iliev 1323 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 iliev 1729 preferences().setBoolProperty("leftSidePane.visible", b);
681 iliev 1323 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 iliev 1729 preferences().setBoolProperty("rightSidePane.visible", b);
713 iliev 1323
714 iliev 1729 int width = leftSidePane.getWidth();
715     int height = leftSidePane.getPreferredSize().height;
716     if(width != 0) leftSidePane.setPreferredSize(new Dimension(width, height));
717 iliev 1323
718     if(b) {
719     int w = preferences().getIntProperty("devicesPane.width", 200);
720    
721 iliev 1729 int h = rightSidePane.getPreferredSize().height;
722     rightSidePane.setPreferredSize(new Dimension(w, h));
723 iliev 1323 } else {
724 iliev 1729 int w = rightSidePane.getWidth();
725 iliev 1323 if(w > 0 && w < 200) w = 200;
726     if(w != 0) preferences().setIntProperty("devicesPane.width", w);
727     }
728    
729     hSplitPane.setResizeWeight(0.0);
730 iliev 1729 rightSidePane.setVisible(b);
731 iliev 1323 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 iliev 1778 public void
748     setMidiKeyboardVisible(boolean b) {
749 iliev 1776 preferences().setBoolProperty("midiKeyboard.visible", b);
750 iliev 1778 pianoKeyboardPane.setVisible(b);
751    
752     if(cbmiMidiKeyboardVisible.isSelected() != b) {
753     cbmiMidiKeyboardVisible.setSelected(b);
754 iliev 1776 }
755    
756 iliev 1778 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 iliev 1776 }
767    
768 iliev 1778 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 iliev 1776 private void
779 iliev 1323 sidePanesVisibilityChanged() {
780 iliev 1729 boolean leftSidePaneVisible = cbmiLeftSidePaneVisible.isSelected();
781     boolean rightSidePaneVisible = cbmiRightSidePaneVisible.isSelected();
782 iliev 1323
783 iliev 1729 if(leftSidePaneVisible && rightSidePaneVisible) {
784 iliev 1323 hSplitPane.setResizeWeight(0.5);
785 iliev 1729 } else if(leftSidePaneVisible && !rightSidePaneVisible) {
786 iliev 1323 hSplitPane.setResizeWeight(1.0);
787     }
788    
789 iliev 1729 if(!leftSidePaneVisible && !rightSidePaneVisible) {
790 iliev 1323 standardBar.showFantasiaLogo(false);
791     if(isResizable()) setResizable(false);
792     } else {
793     standardBar.showFantasiaLogo(true);
794     if(!isResizable()) setResizable(true);
795     }
796     }
797    
798 iliev 1285 private class RecentScriptHandler implements ActionListener {
799     private String script;
800    
801     RecentScriptHandler(String script) { this.script = script; }
802    
803 iliev 1778 @Override
804 iliev 912 public void
805 iliev 1285 actionPerformed(ActionEvent e) {
806     runScript(script);
807     if(preferences().getBoolProperty(SHOW_LS_CONSOLE_WHEN_RUN_SCRIPT)) {
808     a4n.windowLSConsole.actionPerformed(null);
809     }
810 iliev 912 }
811 iliev 1285 }
812 iliev 912
813 iliev 1285 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 iliev 1776 setContentAreaFilled(false);
819 iliev 912 }
820     }
821 iliev 1285
822 iliev 1323 private class FantasiaMenuBar extends JMenuBar {
823 iliev 1285 FantasiaMenuBar() {
824     setOpaque(false);
825 iliev 1778 setBorder(BorderFactory.createEmptyBorder(2, 6, 0, 0));
826 iliev 1285 }
827    
828 iliev 1778 @Override
829 iliev 1285 protected void
830     paintComponent(Graphics g) {
831 iliev 1778 //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 iliev 1323 if(standardBar.isVisible()) {
846 iliev 1778 b = new FantasiaPainter.Border(true, true, false, true);
847     FantasiaPainter.paintBoldOuterBorder(g2, 0, 0, w - 1, h + 1, b);
848 iliev 1323 } else {
849 iliev 1778 b = new FantasiaPainter.Border(true, true, true, true);
850     FantasiaPainter.paintBoldOuterBorder(g2, 0, 0, w - 1, h - 1, b);
851 iliev 1323 }
852 iliev 1778
853     g2.setPaint(oldPaint);
854     g2.setComposite(oldComposite);
855 iliev 1285 }
856     }
857 iliev 1778
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 iliev 912 }

  ViewVC Help
Powered by ViewVC