OSDN Git Service

c4ce3f124e4df366589f32b214d4fc452963a9c2
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / MidiChordHelper.java
1 package camidion.chordhelper;
2
3 import java.applet.Applet;
4 import java.applet.AppletContext;
5 import java.applet.AppletStub;
6 import java.applet.AudioClip;
7 import java.awt.BorderLayout;
8 import java.awt.Font;
9 import java.awt.Frame;
10 import java.awt.Image;
11 import java.awt.Toolkit;
12 import java.awt.event.WindowAdapter;
13 import java.awt.event.WindowEvent;
14 import java.io.File;
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.net.URL;
18 import java.util.Enumeration;
19 import java.util.Iterator;
20 import java.util.List;
21 import java.util.Vector;
22
23 import javax.swing.JFrame;
24 import javax.swing.JLabel;
25 import javax.swing.SwingUtilities;
26 import javax.swing.WindowConstants;
27 import javax.swing.event.ChangeEvent;
28 import javax.swing.event.ChangeListener;
29 import javax.swing.event.TableModelEvent;
30 import javax.swing.event.TableModelListener;
31
32 import camidion.chordhelper.mididevice.MidiSequencerModel;
33 import camidion.chordhelper.midieditor.PlaylistTableModel;
34 import camidion.chordhelper.midieditor.SequenceTrackListTableModel;
35
36 /**
37  * MIDI Chord Helper を Java アプリとして起動します。
38  */
39 public class MidiChordHelper {
40         private static int count = 0;
41         private static AppletFrame frame = null;
42         private static List<File> fileList = new Vector<File>();
43         /**
44          * MIDI Chord Helper を Java アプリとして起動します。
45          * @param args コマンドライン引数
46          * @throws Exception 何らかの異常が発生した場合にスローされる
47          */
48         public static void main(String[] args) throws Exception {
49                 if( args.length > 0 ) {
50                         for( String arg : args ) fileList.add(new File(arg));
51                 }
52                 SwingUtilities.invokeLater(new Runnable(){
53                         @Override
54                         public void run() {
55                                 ChordHelperApplet applet;
56                                 if( count++ > 0 && frame != null) {
57                                         applet = frame.applet;
58                                         int windowState = frame.getExtendedState();
59                                         if( ( windowState & Frame.ICONIFIED ) == 0 ) {
60                                                 frame.toFront();
61                                         } else {
62                                                 frame.setExtendedState(windowState &= ~(Frame.ICONIFIED));
63                                         }
64                                 } else {
65                                         frame = new AppletFrame(applet = new ChordHelperApplet());
66                                 }
67                                 applet.deviceModelList.getEditorDialog().loadAndPlay(fileList);
68                         }
69                 });
70         }
71         private static class AppletFrame extends JFrame
72                 implements AppletStub, AppletContext
73         {
74                 JLabel status_;
75                 ChordHelperApplet applet;
76                 public AppletFrame(ChordHelperApplet applet) {
77                         setTitle(ChordHelperApplet.VersionInfo.NAME);
78                         (status_ = new JLabel()).setFont(
79                                 status_.getFont().deriveFont(Font.PLAIN)
80                         );
81                         add( this.applet = applet, BorderLayout.CENTER );
82                         add( status_, BorderLayout.SOUTH );
83                         applet.setStub(this);
84                         applet.init();
85                         Image iconImage = applet.imageIcon == null ? null : applet.imageIcon.getImage();
86                         setIconImage(iconImage);
87                         setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
88                         addWindowListener(new WindowAdapter() {
89                                 @Override
90                                 public void windowClosing(WindowEvent evt) {
91                                         if( AppletFrame.this.applet.isConfirmedToExit() )
92                                                 System.exit(0);
93                                 }
94                         });
95                         new TitleUpdater(applet);
96                         pack();
97                         setLocationRelativeTo(null);
98                         setVisible(true);
99                         applet.start();
100                 }
101                 /**
102                  * タイトルバー更新器
103                  */
104                 private class TitleUpdater implements ChangeListener, TableModelListener {
105                         MidiSequencerModel sequencerModel;
106                         /**
107                          * タイトルバー更新器の構築
108                          * @param applet 対象アプレット
109                          */
110                         public TitleUpdater(ChordHelperApplet applet) {
111                                 applet.deviceModelList.getEditorDialog().sequenceListTable.getModel().addTableModelListener(this);
112                                 sequencerModel = applet.deviceModelList.getSequencerModel();
113                                 sequencerModel.addChangeListener(this);
114                         }
115                         /**
116                          * プレイリスト上で変更されたファイル名をタイトルバーに反映します。
117                          */
118                         @Override
119                         public void tableChanged(TableModelEvent e) {
120                                 int col = e.getColumn();
121                                 if( col == PlaylistTableModel.Column.FILENAME.ordinal() ) {
122                                         setFilenameToTitle();
123                                 }
124                                 if( col == TableModelEvent.ALL_COLUMNS ) {
125                                         setFilenameToTitle();
126                                 }
127                         }
128                         /**
129                          * 再生中にファイルが切り替わったら、そのファイル名をタイトルバーに反映します。
130                          */
131                         @Override
132                         public void stateChanged(ChangeEvent e) { setFilenameToTitle(); }
133                         /**
134                          * シーケンサーにロードされている曲のファイル名をタイトルバーに反映します。
135                          */
136                         private void setFilenameToTitle() {
137                                 SequenceTrackListTableModel seq = sequencerModel.getSequenceTrackListTableModel();
138                                 String filename = ( seq == null ? null : seq.getFilename() );
139                                 String title = ChordHelperApplet.VersionInfo.NAME;
140                                 if( filename != null && ! filename.isEmpty() ) {
141                                         title = filename + " - " + title;
142                                 }
143                                 setTitle(title);
144                         }
145                 }
146                 @Override
147                 public boolean isActive() { return true; }
148                 @Override
149                 public URL getDocumentBase() { return null; }
150                 @Override
151                 public URL getCodeBase() { return null; }
152                 @Override
153                 public String getParameter(String name) { return null; }
154                 @Override
155                 public AppletContext getAppletContext() { return this; }
156                 @Override
157                 public void appletResize(int width, int height) {}
158                 @Override
159                 public AudioClip getAudioClip(URL url) { return null; }
160                 @Override
161                 public Image getImage(URL url) {
162                         return Toolkit.getDefaultToolkit().getImage(url);
163                 }
164                 @Override
165                 public Applet getApplet(String name) { return null; }
166                 @Override
167                 public Enumeration<Applet> getApplets() { return (null); }
168                 @Override
169                 public void showDocument(URL url) {}
170                 @Override
171                 public void showDocument(URL url, String target) {}
172                 @Override
173                 public void showStatus(String status) { status_.setText(status); }
174                 @Override
175                 public InputStream getStream(String key) { return null; }
176                 @Override
177                 public Iterator<String> getStreamKeys() { return null; }
178                 @Override
179                 public void setStream(String key, InputStream stream) throws IOException {}
180         }
181 }