Various changes related to Quicktime and JMF

support, as well as keyboard modularization. Not
quite done yet, though, so may not compile.
This commit is contained in:
eg3p 2002-10-25 20:18:22 +00:00
parent 3f17daab67
commit 7f3f0eb8e1
2 changed files with 246 additions and 151 deletions

View file

@ -30,9 +30,13 @@ import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
import java.lang.reflect.*;
import org.thdl.tib.input.*;
import org.thdl.tib.text.*;
import org.thdl.tib.text.TibetanDocument.*;
import org.thdl.savant.JdkVersionHacks;
import org.thdl.media.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
@ -45,8 +49,12 @@ import org.thdl.util.ThdlDebug;
import org.thdl.util.ThdlActionListener;
import org.thdl.util.ThdlAbstractAction;
import org.thdl.util.ThdlOptions;
import org.thdl.util.SimpleSpinner;
public class QD extends JDesktopPane {
private final static JskadKeyboardManager keybdMgr
= new JskadKeyboardManager(JskadKeyboardFactory.getAllAvailableJskadKeyboards());
//project related data
protected Project project;
@ -90,8 +98,6 @@ public class QD extends JDesktopPane {
protected TibetanDocument findDoc = null;
protected TibetanDocument replaceDoc = null;
protected URL keyboard_url = null;
protected KeyStroke cutKey, copyKey, pasteKey, selectAllKey;
protected KeyStroke insert1TimeKey, insert2TimesKey, insertSpeakerKey;
protected KeyStroke findKey, replaceKey;
@ -286,8 +292,7 @@ class TimePoint extends JLabel implements DragGestureListener, DragSourceListene
if (e.getButton() == MouseEvent.BUTTON1)
playSegment();
else {
SpinnerNumberModel snm1 = new SpinnerNumberModel(0, 0, player.getEndTime(), 10);
JSpinner spinner = new JSpinner(snm1);
SimpleSpinner spinner = new SimpleSpinner();
spinner.setPreferredSize(new Dimension(100, 40));
spinner.setValue(getTime());
if (JOptionPane.showOptionDialog(tp, spinner, messages.getString("AdjustTimeCode"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null) == JOptionPane.OK_OPTION)
@ -439,14 +444,13 @@ public class TimePointDropTarget implements DropTargetListener {
}
class TimeCodeManager extends JPanel {
JSpinner inSpinner, outSpinner;
SimpleSpinner inSpinner, outSpinner;
TimeCodeManager() {
setLayout(new BorderLayout());
JPanel inPanel = new JPanel();
JButton inButton = new JButton(messages.getString("In"));
SpinnerNumberModel snm1 = new SpinnerNumberModel(0, 0, player.getEndTime(), 10);
inSpinner = new JSpinner(snm1);
inSpinner = new SimpleSpinner();
inSpinner.setValue(new Integer(0));
inSpinner.setPreferredSize(new Dimension(100, inButton.getPreferredSize().height));
inPanel.add(inButton);
@ -463,8 +467,7 @@ class TimeCodeManager extends JPanel {
JPanel outPanel = new JPanel();
JButton outButton = new JButton(messages.getString("Out"));
SpinnerNumberModel snm2 = new SpinnerNumberModel(0, 0, player.getEndTime(), 10);
outSpinner = new JSpinner(snm2);
outSpinner = new SimpleSpinner();
outSpinner.setValue(new Integer(player.getEndTime()));
outSpinner.setPreferredSize(new Dimension(100, inButton.getPreferredSize().height));
outPanel.add(outButton);
@ -533,10 +536,10 @@ class TimeCodeManager extends JPanel {
add("North", box);
}
public Integer getInTime() {
return (Integer)inSpinner.getValue();
return inSpinner.getValue();
}
public Integer getOutTime() {
return (Integer)outSpinner.getValue();
return outSpinner.getValue();
}
public void setInTime(int k) {
inSpinner.setValue(new Integer(k));
@ -568,14 +571,14 @@ class Work {
}
public void setMediaPlayerProperty(String property) {
if (property.equals("jmf") || property.equals("qt4j"))
if (!thdl_mediaplayer_property.equals(property)) {
if (property.equals("org.thdl.media.SmartJMFPlayer") || property.equals("org.thdl.media.SmartQT4JPlayer"))
if (thdl_mediaplayer_property == null || !thdl_mediaplayer_property.equals(property)) {
thdl_mediaplayer_property = new String(property);
if (project != null) {
File f = project.getMedia();
if (f != null) {
URL url = project.getMedia();
if (url != null) {
project.setMedia(null);
project.setMedia(f);
project.setMedia(url);
}
}
}
@ -590,12 +593,12 @@ public String getMediaPlayerProperty() {
} catch (SecurityException e) {
os = "unknown";
}
if (os.indexOf("mac") != -1) //macs default to qt4j
thdl_mediaplayer_property = ThdlOptions.getStringOption("thdl.media.player", "qt4j");
if (os.indexOf("mac") != -1) //macs default to org.thdl.media.SmartQT4JPlayer
thdl_mediaplayer_property = ThdlOptions.getStringOption("thdl.media.player", "org.thdl.media.SmartQT4JPlayer");
else if (os.indexOf("windows") != -1)
thdl_mediaplayer_property = ThdlOptions.getStringOption("thdl.media.player", "jmf");
thdl_mediaplayer_property = ThdlOptions.getStringOption("thdl.media.player", "org.thdl.media.SmartJMFPlayer");
else //put linux etc. here
thdl_mediaplayer_property = ThdlOptions.getStringOption("thdl.media.player", "jmf");
thdl_mediaplayer_property = ThdlOptions.getStringOption("thdl.media.player", "org.thdl.media.SmartJMFPlayer");
}
return thdl_mediaplayer_property;
}
@ -603,7 +606,7 @@ public String getMediaPlayerProperty() {
class Project extends JPanel {
JTextField titleField, mediaField, transcriptField, nameField, taskField;
File transcript = null;
File media = null;
URL media = null;
public String getTitle() {
return titleField.getText();
@ -633,12 +636,12 @@ public void setTranscript(File f) { //doesn't actually load or save transcript,
else
transcriptField.setText(transcript.getPath());
}
public File getMedia() {
public URL getMedia() {
return media;
}
public void setMedia(File f) {
if (f == null) {
media = f;
public void setMedia(URL url) {
if (url == null) {
media = url;
mediaField.setText("");
if (player != null) {
try {
@ -660,9 +663,6 @@ public void setMedia(File f) {
actionFrame.setSize(new Dimension(actionFrame.getSize().width, QD.this.getSize().height));
}
} else {
try {
URL url = f.toURL();
if (player != null) {
try {
player.cmd_stop();
@ -677,26 +677,52 @@ public void setMedia(File f) {
try {
if (thdl_mediaplayer_property == null)
thdl_mediaplayer_property = getMediaPlayerProperty();
if (thdl_mediaplayer_property.equals("qt4j")) {
player = new SmartQT4JPlayer();
player.loadMovie(url);
} else if (thdl_mediaplayer_property.equals("jmf")) {
player = new SmartJMFPlayer(QD.this, url);
}
media = f;
Class mediaClass = Class.forName(thdl_mediaplayer_property);
Class[] mediaArgsClass = new Class[] {Container.class, URL.class};
Object[] mediaArgs = new Object[] {QD.this, url};
Constructor mediaConstructor = mediaClass.getConstructor(mediaArgsClass);
player = (SmartMoviePanel)createObject(mediaConstructor, mediaArgs);
media = url;
mediaField.setText(media.getPath());
startTimer();
} catch (SmartMoviePanelException smpe) {
smpe.printStackTrace();
//FIXME if neither media player is supported then friendly error rather than just doing nothing
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
ThdlDebug.noteIffyCode();
} catch (NoSuchMethodException nsme) {
nsme.printStackTrace();
ThdlDebug.noteIffyCode();
}
} catch (MalformedURLException murle) {
murle.printStackTrace();
ThdlDebug.noteIffyCode();
}
}
}
public Object createObject(Constructor constructor,
Object[] arguments) {
System.out.println ("Constructor: " + constructor.toString());
Object object = null;
try {
object = constructor.newInstance(arguments);
System.out.println ("Object: " + object.toString());
return object;
} catch (InstantiationException e) {
System.out.println(e);
} catch (IllegalAccessException e) {
System.out.println(e);
} catch (IllegalArgumentException e) {
System.out.println(e);
} catch (InvocationTargetException e) {
System.out.println(e);
}
return object;
}
public Project() {
JPanel p = new JPanel(new GridLayout(2,2));
titleField = new JTextField();
@ -763,43 +789,20 @@ public Project() {
}
}
public void changeKeyboard(ActionEvent e) {
public void changeKeyboard(JskadKeyboard kbd) {
DuffPane dp = (DuffPane)pane;
if (e.getActionCommand().equals("wylie")) {
dp.registerKeyboard();
// project.tName.setupKeyboard();
// project.tTask.setupKeyboard();
sharedDP.setupKeyboard();
sharedDP2.setupKeyboard();
return;
}
keyboard_url = null;
if (e.getActionCommand().equals("sambhota1"))
keyboard_url = TibetanMachineWeb.class.getResource("sambhota_keyboard_1.ini");
else if (e.getActionCommand().equals("tcc1"))
keyboard_url = TibetanMachineWeb.class.getResource("tcc_keyboard_1.ini");
else if (e.getActionCommand().equals("tcc2"))
keyboard_url = TibetanMachineWeb.class.getResource("tcc_keyboard_2.ini");
dp.registerKeyboard(keyboard_url);
// project.tName.setupKeyboard();
// project.tTask.setupKeyboard();
sharedDP.setupKeyboard();
sharedDP2.setupKeyboard();
kbd.activate(dp);
kbd.activate(sharedDP);
kbd.activate(sharedDP2);
}
public boolean saveTranscript() {
currentWork.stopWork();
//URGENT!! fix saving problem
//change keyboard back to wylie for a second
DuffPane dp = (DuffPane)pane;
if (keyboard_url != null) {
dp.registerKeyboard();
// project.tName.setupKeyboard();
// project.tTask.setupKeyboard();
sharedDP.setupKeyboard();
sharedDP.setupKeyboard();
}
org.jdom.Element title = new org.jdom.Element("title");
@ -810,11 +813,15 @@ if (keyboard_url != null) {
media.setText("");
else {
String tPath = project.getTranscript().getPath();
String mPath = project.getMedia().getPath();
if (tPath.substring(0, tPath.lastIndexOf(File.separatorChar)).equals(mPath.substring(0, mPath.lastIndexOf(File.separatorChar))))
media.setText(mPath.substring(mPath.lastIndexOf(File.separatorChar)+1));
else
media.setText(mPath);
String mPath = project.getMedia().getFile();
if (mPath == null)
media.setText(project.getMedia().toString());
else {
if (tPath.substring(0, tPath.lastIndexOf(File.separatorChar)).equals(mPath.substring(0, mPath.lastIndexOf(File.separatorChar))))
media.setText("file:" + mPath.substring(mPath.lastIndexOf(File.separatorChar)+1));
else
media.setText(project.getMedia().toString());
}
}
org.jdom.Element speakers = new org.jdom.Element("speakers");
@ -910,13 +917,7 @@ if (keyboard_url != null) {
File htmlOut = new File(f.substring(0, f.lastIndexOf('.')) + ".html");
transformer.transform(new JDOMSource(qdDoc), new StreamResult(new FileOutputStream(htmlOut)));
if (keyboard_url != null) {
dp.registerKeyboard(keyboard_url);
// project.tName.setupKeyboard();
// project.tTask.setupKeyboard();
sharedDP.setupKeyboard();
sharedDP2.setupKeyboard();
}
//URGENT FIX SAVING PROBLEM
return true;
} catch (FileNotFoundException fnfe) {
@ -939,7 +940,6 @@ protected void clearProject() {
project.setMedia(null); //do this first to properly dispose of media player
jtp.remove(project);
project = null;
}
if (tcp != null) {
@ -949,6 +949,9 @@ protected void clearProject() {
SpeakerData sd = (SpeakerData)speakerTable.getModel();
sd.removeAllSpeakers();
speakerTable.invalidate();
speakerTable.validate();
speakerTable.repaint();
jtp.invalidate();
jtp.validate();
@ -957,11 +960,11 @@ protected void clearProject() {
pane.setText("");
}
public void newProject(File mediaFile) {
public void newProject(URL mediaUrl) {
clearProject();
project = new Project();
jtp.addTab(messages.getString("ProjectDetails"), project);
project.setMedia(mediaFile);
project.setMedia(mediaUrl);
}
public boolean loadTranscript(File t) {
@ -976,6 +979,10 @@ public boolean loadTranscript(File t) {
//change keyboard back to wylie for a second
DuffPane dp = (DuffPane)pane;
//URGENT FIX LOADING PROBLEM
/*
if (keyboard_url != null) {
dp.registerKeyboard();
@ -985,7 +992,7 @@ if (keyboard_url != null) {
sharedDP.setupKeyboard();
sharedDP2.setupKeyboard();
}
*/
org.jdom.Document doc = builder.build(t);
org.jdom.Element qd = doc.getRootElement();
@ -995,13 +1002,21 @@ if (keyboard_url != null) {
String mediaString = meta.getChild("mediafile").getText().trim();
if (!mediaString.equals("")) {
String tPath = t.getPath().substring(0, t.getPath().lastIndexOf(File.separatorChar)+1);
if (new File(tPath + mediaString).exists())
project.setMedia(new File(tPath + mediaString));
else if (new File(mediaString).exists())
project.setMedia(new File(mediaString));
else
project.setMedia(null);
if (mediaString.startsWith("file:")) {
try {
String mPath = mediaString.substring(5);
String tPath = t.getPath().substring(0, t.getPath().lastIndexOf(File.separatorChar)+1);
if (new File(tPath + mPath).exists())
project.setMedia(new URL("file:" + tPath + mPath));
else if (new File(mPath).exists())
project.setMedia(new URL("file:" + mPath));
else
project.setMedia(null);
} catch (MalformedURLException murle) {
murle.printStackTrace();
ThdlDebug.noteIffyCode();
}
}
} else
project.setMedia(null);
@ -1078,6 +1093,7 @@ if (keyboard_url != null) {
currentWork = new Work();
work.add(currentWork);
/* URGENT FIX LOADING PROBLEM
if (keyboard_url != null) {
dp.registerKeyboard(keyboard_url);
// project.tName.setupKeyboard();
@ -1085,6 +1101,7 @@ if (keyboard_url != null) {
sharedDP.setupKeyboard();
sharedDP2.setupKeyboard();
}
*/
project.setTranscript(t);
jtp.addTab(messages.getString("ProjectDetails"), project);

View file

@ -98,41 +98,82 @@ public class QDShell extends JFrame {
qd = new QD(messages);
getContentPane().add(qd);
setJMenuBar(getQDShellMenu());
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter () {
public void windowClosing (WindowEvent e) {
if (getSave())
System.exit(0);
if (getWantSave())
getSave();
System.exit(0);
}
});
}
public JMenuBar getQDShellMenu() {
JMenu projectMenu = new JMenu(messages.getString("Project"));
JMenuItem newItem = new JMenuItem(messages.getString("New"));
newItem.addActionListener(new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
if (getSave()) {
JFileChooser fc = new JFileChooser();
if (fc.showDialog(QDShell.this, messages.getString("SelectMedia")) == JFileChooser.APPROVE_OPTION) {
File mediaFile = fc.getSelectedFile();
qd.newProject(mediaFile);
if (getWantSave())
getSave();
qd.clearProject();
}
});
JMenuItem openVideoItem = new JMenuItem(messages.getString("OpenMediaFile"));
openVideoItem.addActionListener(new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
if (getWantSave())
getSave();
JFileChooser fc = new JFileChooser();
if (fc.showDialog(QDShell.this, messages.getString("SelectMedia")) == JFileChooser.APPROVE_OPTION) {
File mediaFile = fc.getSelectedFile();
try {
qd.newProject(mediaFile.toURL());
} catch (MalformedURLException murle) {
murle.printStackTrace();
ThdlDebug.noteIffyCode();
}
}
}
});
JMenuItem openItem = new JMenuItem(messages.getString("Open"));
JMenuItem openURLItem = new JMenuItem(messages.getString("OpenMediaURL"));
openURLItem.addActionListener(new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
String url = JOptionPane.showInputDialog(QDShell.this,
messages.getString("TypeMediaURL"));
if (url != null) {
if (getWantSave())
getSave();
try {
qd.newProject(new URL(url));
} catch (MalformedURLException murle) {
murle.printStackTrace();
ThdlDebug.noteIffyCode();
}
}
}
});
JMenuItem openItem = new JMenuItem(messages.getString("OpenTranscript"));
openItem.addActionListener(new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
if (getSave()) {
JFileChooser fc = new JFileChooser();
fc.addChoosableFileFilter(new QDFileFilter());
if (fc.showDialog(QDShell.this, messages.getString("OpenTranscript")) == JFileChooser.APPROVE_OPTION) {
File transcriptFile = fc.getSelectedFile();
qd.loadTranscript(transcriptFile);
}
if (getWantSave())
getSave();
JFileChooser fc = new JFileChooser();
fc.addChoosableFileFilter(new QDFileFilter());
if (fc.showDialog(QDShell.this, messages.getString("OpenTranscript")) == JFileChooser.APPROVE_OPTION) {
File transcriptFile = fc.getSelectedFile();
qd.loadTranscript(transcriptFile);
}
}
});
/*
JMenuItem closeItem = new JMenuItem(messages.getString("Close"));
closeItem.addActionListener(new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
@ -140,6 +181,7 @@ public class QDShell extends JFrame {
qd.clearProject();
}
});
*/
JMenuItem saveItem = new JMenuItem(messages.getString("Save"));
saveItem.addActionListener(new ThdlActionListener() {
@ -150,20 +192,30 @@ public class QDShell extends JFrame {
JMenuItem quitItem = new JMenuItem(messages.getString("Quit"));
quitItem.addActionListener(new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
if (getSave())
System.exit(0);
if (getWantSave())
getSave();
System.exit(0);
}
});
projectMenu.add(newItem);
projectMenu.add(openItem);
projectMenu.add(closeItem);
projectMenu.addSeparator();
projectMenu.add(openVideoItem);
projectMenu.add(openURLItem);
projectMenu.add(openItem);
projectMenu.addSeparator();
// projectMenu.add(closeItem);
// projectMenu.addSeparator();
projectMenu.add(saveItem);
projectMenu.addSeparator();
projectMenu.add(quitItem);
//Tibetan-specific value: remove in non-Tibetan version
//non-Tibetan specific version would have Transcription Language option here instead
/* Note that on the Mac, you radio buttons don't appear possible as
submenus on menu bars. They just don't show up.
JRadioButton[] buttons = new JRadioButton[4];
buttons[0] = new JRadioButton("THDL Extended Wylie");
buttons[1] = new JRadioButton("TCC Keyboard 1");
@ -199,38 +251,53 @@ public class QDShell extends JFrame {
buttons[initialKeyboard].setSelected(true);
*/
JMenu keyboardMenu = new JMenu(messages.getString("Keyboard"));
keyboardMenu.add(b1);
for (int i = 0; i < keybdMgr.size(); i++) {
final JskadKeyboard kbd = keybdMgr.elementAt(i);
if (kbd.hasQuickRefFile()) {
JMenuItem keybdItem = new JMenuItem(kbd.getIdentifyingString());
keybdItem.addActionListener(new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
qd.changeKeyboard(kbd);
}
});
keyboardMenu.add(keybdItem);
}
}
JRadioButton[] buttons2 = new JRadioButton[2];
buttons2[0] = new JRadioButton("Java Media Framework");
buttons2[1] = new JRadioButton("Quicktime for Java");
buttons2[0].setActionCommand("jmf");
buttons2[1].setActionCommand("qt4j");
ThdlActionListener l2 = new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
qd.setMediaPlayerProperty(e.getActionCommand());
}
};
buttons2[0].addActionListener(l2);
buttons2[1].addActionListener(l2);
ButtonGroup bg2 = new ButtonGroup();
bg2.add(buttons2[0]);
bg2.add(buttons2[1]);
JPanel b2 = new JPanel(new GridLayout(0,1));
b2.add(buttons2[0]);
b2.add(buttons2[1]);
String initialMediaPlayer = qd.getMediaPlayerProperty();
if (initialMediaPlayer.equals("jmf"))
buttons2[0].setSelected(true);
else if (initialMediaPlayer.equals("qt4j"))
buttons2[1].setSelected(true);
JMenu mediaPlayerMenu = new JMenu(messages.getString("MediaPlayer"));
mediaPlayerMenu.add(b2);
for (int i = 0; i < keybdMgr.size(); i++) {
final JskadKeyboard kbd = keybdMgr.elementAt(i);
if (kbd.hasQuickRefFile()) {
JMenuItem keybdItem = new JMenuItem(kbd.getIdentifyingString());
keybdItem.addActionListener(new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
qd.changeKeyboard(kbd);
}
});
keyboardMenu.add(keybdItem);
}
}
JMenuItem jmfItem = new JMenuItem("Java Media Framework");
jmfItem.addActionListener(new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
qd.setMediaPlayerProperty("org.thdl.media.SmartJMFPlayer");
}
});
JMenuItem qtItem = new JMenuItem("Quicktime for Java");
qtItem.addActionListener(new ThdlActionListener() {
public void theRealActionPerformed(ActionEvent e) {
qd.setMediaPlayerProperty("org.thdl.media.SmartQT4JPlayer");
}
});
JMenu preferencesMenu = new JMenu(messages.getString("Preferences"));
preferencesMenu.add(keyboardMenu);
@ -241,9 +308,18 @@ public class QDShell extends JFrame {
bar.add(preferencesMenu);
return bar;
}
private boolean getSave() {
private boolean getWantSave() {
if (qd.pane.getDocument().getLength() == 0 && qd.speakerTable.getRowCount() == 0)
return true; //nothing to save
return false; //nothing to save
if (JOptionPane.showConfirmDialog(QDShell.this, messages.getString("WantSave"), null, JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE) == JOptionPane.YES_OPTION)
return true;
else
return false;
}
private void getSave() {
if (qd.pane.getDocument().getLength() == 0 && qd.speakerTable.getRowCount() == 0)
return; //nothing to save
JFileChooser fc = new JFileChooser();
if (qd.project.getTranscript() == null) {
@ -254,13 +330,15 @@ public class QDShell extends JFrame {
path = path.substring(0, path.lastIndexOf('.')) + QDShell.dotQuillDriver;
fc.setSelectedFile(new File(path));
}
if (fc.showSaveDialog(QDShell.this) == JFileChooser.APPROVE_OPTION) {
File f = fc.getSelectedFile();
qd.project.setTranscript(f);
} else
return false;
} else
fc.setSelectedFile(qd.project.getTranscript());
int op = fc.showSaveDialog(QDShell.this);
if (op == JFileChooser.APPROVE_OPTION) {
File f = fc.getSelectedFile();
qd.project.setTranscript(f);
qd.saveTranscript();
}
return qd.saveTranscript();
}
private class QDFileFilter extends javax.swing.filechooser.FileFilter {
// accepts all directories and all savant files