/[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 1308 - (hide annotations) (download)
Tue Aug 28 17:00:19 2007 UTC (16 years, 8 months ago) by iliev
File size: 12792 byte(s)
* A lists of recently used instrument files, directories,
  database instruments, database directories are now available
  for quick access, where appropriate.

1 iliev 912 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4 iliev 1285 * Copyright (C) 2005-2007 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 1204 import java.awt.Dialog;
27 iliev 912 import java.awt.Dimension;
28 iliev 1204 import java.awt.Frame;
29 iliev 1285 import java.awt.Graphics;
30     import java.awt.GridBagConstraints;
31     import java.awt.GridBagLayout;
32     import java.awt.Insets;
33 iliev 912 import java.awt.Point;
34    
35     import java.awt.event.ActionEvent;
36     import java.awt.event.ActionListener;
37 iliev 1285 import java.awt.event.KeyEvent;
38 iliev 912 import java.awt.event.MouseAdapter;
39     import java.awt.event.MouseEvent;
40    
41 iliev 1285 import java.io.BufferedReader;
42     import java.io.File;
43     import java.io.FileNotFoundException;
44     import java.io.FileReader;
45    
46     import java.util.Vector;
47 iliev 912 import java.util.logging.Level;
48    
49 iliev 1285 import javax.swing.BorderFactory;
50 iliev 912 import javax.swing.Box;
51     import javax.swing.BoxLayout;
52     import javax.swing.JCheckBoxMenuItem;
53 iliev 1285 import javax.swing.JDialog;
54     import javax.swing.JFileChooser;
55     import javax.swing.JFrame;
56 iliev 912 import javax.swing.JMenu;
57 iliev 1285 import javax.swing.JMenuBar;
58 iliev 912 import javax.swing.JMenuItem;
59     import javax.swing.JPanel;
60     import javax.swing.JPopupMenu;
61 iliev 1285 import javax.swing.JScrollPane;
62     import javax.swing.JSplitPane;
63 iliev 912 import javax.swing.JToggleButton;
64 iliev 1285 import javax.swing.KeyStroke;
65     import javax.swing.SwingUtilities;
66 iliev 912 import javax.swing.UIManager;
67    
68     import net.sf.juife.TitleBar;
69    
70     import org.jsampler.CC;
71     import org.jsampler.HF;
72 iliev 1285 import org.jsampler.LSConsoleModel;
73 iliev 912
74     import org.jsampler.view.JSChannel;
75     import org.jsampler.view.JSChannelsPane;
76     import org.jsampler.view.JSMainFrame;
77 iliev 1285 import org.jsampler.view.LscpFileFilter;
78 iliev 912
79 iliev 1285 import org.jsampler.view.std.JSamplerHomeChooser;
80    
81     import static org.jsampler.view.fantasia.A4n.a4n;
82 iliev 912 import static org.jsampler.view.fantasia.FantasiaI18n.i18n;
83 iliev 1285 import static org.jsampler.view.fantasia.FantasiaPrefs.preferences;
84     import static org.jsampler.view.std.StdPrefs.*;
85 iliev 912
86    
87     /**
88     *
89     * @author Grigor Iliev
90     */
91     public class MainFrame extends JSMainFrame {
92 iliev 1285 private final FantasiaMenuBar menuBar = new FantasiaMenuBar();
93     private final StandardBar standardBar = new StandardBar();
94     private final MainPane mainPane = new MainPane();
95     private final DevicesPane devicesPane = new DevicesPane();
96 iliev 912
97 iliev 1285 private final JMenu recentScriptsMenu =
98     new JMenu(i18n.getMenuLabel("actions.recentScripts"));
99 iliev 912
100 iliev 1285 private final JSplitPane hSplitPane;
101    
102     private final SidePane sidePane = new SidePane();
103    
104     private LSConsoleFrame lsConsoleFrame = null;
105     private final Vector<String> recentScripts = new Vector<String>();
106    
107    
108 iliev 912 /** Creates a new instance of <code>MainFrame</code> */
109     public
110     MainFrame() {
111     setTitle(i18n.getLabel("MainFrame.title"));
112    
113 iliev 1285 if(Res.iconAppIcon != null) setIconImage(Res.iconAppIcon.getImage());
114 iliev 912
115 iliev 1285 getContentPane().add(standardBar, BorderLayout.NORTH);
116 iliev 912
117 iliev 1285 addMenu();
118 iliev 912
119 iliev 1285 addChannelsPane(mainPane.getChannelsPane());
120 iliev 912
121 iliev 1285 JScrollPane sp = new JScrollPane(createRightPane());
122     sp.setBorder(BorderFactory.createEmptyBorder());
123 iliev 912
124 iliev 1285 hSplitPane = new JSplitPane (
125     JSplitPane.HORIZONTAL_SPLIT,
126     true, // continuousLayout
127     sidePane, sp
128     );
129 iliev 912
130 iliev 1285 getContentPane().add(hSplitPane);
131 iliev 912
132 iliev 1285 int i = preferences().getIntProperty("MainFrame.hSplitDividerLocation", 220);
133     hSplitPane.setDividerLocation(i);
134 iliev 912
135 iliev 1285 setSavedSize();
136     }
137    
138     private JPanel
139     createRightPane() {
140     JPanel p = new JPanel();
141     GridBagLayout gridbag = new GridBagLayout();
142     GridBagConstraints c = new GridBagConstraints();
143 iliev 912
144 iliev 1285 p.setLayout(gridbag);
145 iliev 912
146 iliev 1285 c.fill = GridBagConstraints.BOTH;
147 iliev 912
148 iliev 1285 c.gridx = 1;
149     c.gridy = 0;
150     c.weightx = 1.0;
151     c.weighty = 1.0;
152     c.insets = new Insets(0, 3, 3, 0);
153     gridbag.setConstraints(devicesPane, c);
154     p.add(devicesPane);
155 iliev 912
156 iliev 1285 c.gridx = 0;
157     c.gridy = 0;
158     c.weightx = 0.0;
159     c.weighty = 1.0;
160     c.insets = new Insets(0, 3, 3, 3);
161     c.fill = GridBagConstraints.VERTICAL;
162     gridbag.setConstraints(mainPane, c);
163     p.add(mainPane);
164 iliev 912
165 iliev 1285 return p;
166     }
167    
168     private void
169     setSavedSize() {
170     String s = preferences().getStringProperty("MainFrame.sizeAndLocation");
171     if(s == null) {
172     setDefaultSizeAndLocation();
173     return;
174     }
175 iliev 912 pack();
176     try {
177 iliev 1285 int i = s.indexOf(',');
178     int x = Integer.parseInt(s.substring(0, i));
179 iliev 912
180 iliev 1285 s = s.substring(i + 1);
181     i = s.indexOf(',');
182     int y = Integer.parseInt(s.substring(0, i));
183 iliev 912
184 iliev 1285 s = s.substring(i + 1);
185     i = s.indexOf(',');
186     int width = Integer.parseInt(s.substring(0, i));
187    
188     s = s.substring(i + 1);
189     int height = Integer.parseInt(s);
190    
191     setBounds(x, y, width, height);
192 iliev 912 } catch(Exception x) {
193     String msg = "Parsing of window size and location string failed";
194     CC.getLogger().log(Level.INFO, msg, x);
195 iliev 1285 setDefaultSizeAndLocation();
196 iliev 912 }
197 iliev 1285
198     if(preferences().getBoolProperty("MainFrame.windowMaximized")) {
199     setExtendedState(getExtendedState() | MAXIMIZED_BOTH);
200     }
201 iliev 912 }
202    
203     private void
204 iliev 1285 setDefaultSizeAndLocation() {
205     setPreferredSize(new Dimension(900, 600));
206     pack();
207     setLocationRelativeTo(null);
208 iliev 912 }
209    
210    
211     /** Invoked when this window is about to close. */
212     protected void
213     onWindowClose() {
214 iliev 1285 sidePane.savePreferences();
215 iliev 912
216 iliev 1285 int i = hSplitPane.getDividerLocation();
217     preferences().setIntProperty("MainFrame.hSplitDividerLocation", i);
218    
219     preferences().setBoolProperty (
220     "MainFrame.windowMaximized",
221     (getExtendedState() & MAXIMIZED_BOTH) == MAXIMIZED_BOTH
222     );
223    
224     if(preferences().getBoolProperty("MainFrame.windowMaximized")) {
225     super.onWindowClose();
226     return;
227     }
228    
229 iliev 912 java.awt.Point p = getLocation();
230     Dimension d = getSize();
231     StringBuffer sb = new StringBuffer();
232 iliev 1285 sb.append(p.x).append(',').append(p.y).append(',');
233     sb.append(d.width).append(',').append(d.height);
234     preferences().setStringProperty("MainFrame.sizeAndLocation", sb.toString());
235 iliev 912
236 iliev 1308 String[] list = recentScripts.toArray(new String[recentScripts.size()]);
237     preferences().setStringListProperty(RECENT_LSCP_SCRIPTS, list);
238 iliev 1285
239     if(preferences().getBoolProperty(SAVE_LS_CONSOLE_HISTORY)) {
240     if(lsConsoleFrame != null) getLSConsolePane().saveConsoleHistory();
241     }
242    
243 iliev 912 super.onWindowClose();
244     }
245    
246 iliev 1285 private void
247     addMenu() {
248     JMenu m;
249     JMenuItem mi;
250    
251     setJMenuBar(menuBar);
252    
253     // Actions
254     m = new FantasiaMenu(i18n.getMenuLabel("actions"));
255    
256     mi = new JMenuItem(a4n.connect);
257     mi.setIcon(null);
258     //mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK));
259     m.add(mi);
260    
261     mi = new JMenuItem(a4n.samplerInfo);
262     mi.setIcon(null);
263     m.add(mi);
264    
265     m.addSeparator();
266    
267     JMenu exportMenu = new JMenu(i18n.getMenuLabel("actions.export"));
268     m.add(exportMenu);
269    
270     mi = new JMenuItem(a4n.exportSamplerConfig);
271     mi.setIcon(null);
272     mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK));
273     exportMenu.add(mi);
274    
275     mi = new JMenuItem(a4n.exportMidiInstrumentMaps);
276     mi.setIcon(null);
277     exportMenu.add(mi);
278    
279     m.addSeparator();
280    
281     mi = new JMenuItem(a4n.loadScript);
282     mi.setIcon(null);
283     m.add(mi);
284    
285 iliev 1308 String[] list = preferences().getStringListProperty(RECENT_LSCP_SCRIPTS);
286     for(String s : list) recentScripts.add(s);
287 iliev 1285
288     updateRecentScriptsMenu();
289    
290     m.add(recentScriptsMenu);
291    
292     m.addSeparator();
293    
294     mi = new JMenuItem(i18n.getMenuLabel("actions.exit"));
295     m.add(mi);
296     mi.addActionListener(new ActionListener() {
297     public void
298     actionPerformed(ActionEvent e) { onWindowClose(); }
299     });
300    
301     menuBar.add(m);
302    
303    
304     // Edit
305     m = new FantasiaMenu(i18n.getMenuLabel("edit"));
306     menuBar.add(m);
307    
308     mi = new JMenuItem(a4n.editPreferences);
309     mi.setIcon(null);
310     mi.setAccelerator(KeyStroke.getKeyStroke (
311     KeyEvent.VK_P, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK
312     ));
313     m.add(mi);
314    
315    
316     // Window
317     m = new FantasiaMenu(i18n.getMenuLabel("window"));
318     menuBar.add(m);
319    
320     mi = new JMenuItem(a4n.windowLSConsole);
321     mi.setIcon(null);
322     m.add(mi);
323    
324     mi = new JMenuItem(a4n.windowInstrumentsDb);
325     mi.setIcon(null);
326     m.add(mi);
327    
328    
329     // Help
330     m = new FantasiaMenu(i18n.getMenuLabel("help"));
331    
332     mi = new JMenuItem(a4n.helpAbout);
333     mi.setIcon(null);
334     m.add(mi);
335    
336     menuBar.add(m);
337 iliev 912 }
338    
339     /**
340     * This method does nothing, because <b>Fantasia</b> has exactly
341     * one pane containing sampler channels, which can not be changed.
342     */
343     public void
344     insertChannelsPane(JSChannelsPane pane, int idx) {
345 iliev 1285
346 iliev 912 }
347    
348     /**
349     * This method always returns the <code>JSChannelsPane</code> at index 0,
350     * because the <b>Fantasia</b> view has exactly one pane containing sampler channels.
351     * @return The <code>JSChannelsPane</code> at index 0.
352     */
353     public JSChannelsPane
354     getSelectedChannelsPane() { return getChannelsPane(0); }
355    
356     /**
357     * This method does nothing because the <b>Fantasia</b> view has
358     * exactly one pane containing sampler channels which is always shown.
359     */
360     public void
361     setSelectedChannelsPane(JSChannelsPane pane) { }
362    
363 iliev 1285 public void
364     installJSamplerHome() {
365     JSamplerHomeChooser chooser = new JSamplerHomeChooser(this);
366     chooser.setVisible(true);
367     if(chooser.isCancelled()) return;
368 iliev 912
369 iliev 1285 CC.changeJSamplerHome(chooser.getJSamplerHome());
370 iliev 912 }
371    
372 iliev 1143 public void
373 iliev 1204 showDetailedErrorMessage(Frame owner, String err, String details) {
374     // TODO:
375     }
376    
377     public void
378     showDetailedErrorMessage(Dialog owner, String err, String details) {
379     // TODO:
380     }
381 iliev 912
382 iliev 1285 protected LSConsoleModel
383     getLSConsoleModel() { return getLSConsolePane().getModel(); }
384    
385     protected LSConsolePane
386     getLSConsolePane() {
387     return getLSConsoleFrame().getLSConsolePane();
388     }
389    
390     protected LSConsoleFrame
391     getLSConsoleFrame() {
392     if(lsConsoleFrame == null) lsConsoleFrame = new LSConsoleFrame();
393     return lsConsoleFrame;
394     }
395    
396     protected void
397     runScript() {
398     String s = preferences().getStringProperty("lastScriptLocation");
399     JFileChooser fc = new JFileChooser(s);
400     fc.setFileFilter(new LscpFileFilter());
401     int result = fc.showOpenDialog(this);
402     if(result != JFileChooser.APPROVE_OPTION) return;
403 iliev 912
404 iliev 1285 String path = fc.getCurrentDirectory().getAbsolutePath();
405     preferences().setStringProperty("lastScriptLocation", path);
406    
407     runScript(fc.getSelectedFile());
408     }
409    
410     private void
411     runScript(String script) { runScript(new File(script)); }
412    
413     private void
414     runScript(File script) {
415     FileReader fr;
416     try { fr = new FileReader(script); }
417     catch(FileNotFoundException e) {
418     HF.showErrorMessage(i18n.getMessage("FileNotFound!"));
419     return;
420 iliev 912 }
421    
422 iliev 1285 BufferedReader br = new BufferedReader(fr);
423    
424     try {
425     String s = br.readLine();
426     while(s != null) {
427     getLSConsoleModel().setCommandLineText(s);
428     getLSConsoleModel().execCommand();
429     s = br.readLine();
430     }
431     } catch(Exception e) {
432     HF.showErrorMessage(e);
433     return;
434 iliev 912 }
435 iliev 1285
436     String s = script.getAbsolutePath();
437     recentScripts.remove(s);
438     recentScripts.insertElementAt(s, 0);
439    
440     updateRecentScriptsMenu();
441     }
442 iliev 912
443 iliev 1285 protected void
444     clearRecentScripts() {
445     recentScripts.removeAllElements();
446     updateRecentScriptsMenu();
447     }
448    
449     protected void
450     updateRecentScriptsMenu() {
451     int size = preferences().getIntProperty(RECENT_LSCP_SCRIPTS_SIZE);
452     while(recentScripts.size() > size) {
453     recentScripts.removeElementAt(recentScripts.size() - 1);
454     }
455    
456     recentScriptsMenu.removeAll();
457    
458     for(String script : recentScripts) {
459     JMenuItem mi = new JMenuItem(script);
460     recentScriptsMenu.add(mi);
461     mi.addActionListener(new RecentScriptHandler(script));
462     }
463    
464     recentScriptsMenu.setEnabled(recentScripts.size() != 0);
465     }
466    
467     private class RecentScriptHandler implements ActionListener {
468     private String script;
469    
470     RecentScriptHandler(String script) { this.script = script; }
471    
472 iliev 912 public void
473 iliev 1285 actionPerformed(ActionEvent e) {
474     runScript(script);
475     if(preferences().getBoolProperty(SHOW_LS_CONSOLE_WHEN_RUN_SCRIPT)) {
476     a4n.windowLSConsole.actionPerformed(null);
477     }
478 iliev 912 }
479 iliev 1285 }
480 iliev 912
481 iliev 1285 private static class FantasiaMenu extends JMenu {
482     FantasiaMenu(String s) {
483     super(s);
484     setFont(getFont().deriveFont(java.awt.Font.BOLD));
485     setOpaque(false);
486 iliev 912 }
487     }
488 iliev 1285
489     private static class FantasiaMenuBar extends JMenuBar {
490     private static Insets pixmapInsets = new Insets(6, 6, 0, 6);
491    
492     FantasiaMenuBar() {
493     setOpaque(false);
494     }
495    
496     protected void
497     paintComponent(Graphics g) {
498     super.paintComponent(g);
499    
500     PixmapPane.paintComponent(this, g, Res.gfxMenuBarBg, pixmapInsets);
501     }
502     }
503 iliev 912 }

  ViewVC Help
Powered by ViewVC