From f26dd53da3c43fd1b7dade24d207f3783b17e67e Mon Sep 17 00:00:00 2001 From: dchandler Date: Sun, 27 Oct 2002 19:12:13 +0000 Subject: [PATCH] Changed the build so that Savant and QuillDriver's builds include Smart*Player.java, which are accessed via reflection. Cleaned up the code a bit so that it would compile in so doing. Changed the 'options.txt' preferences file to reflect the new method of selecting media players. --- build.xml | 22 + dist/.cvsignore | 5 + source/options.txt | 8 +- source/org/thdl/media/SmartJMFPlayer.java | 2 +- source/org/thdl/media/SmartMoviePanel.java | 2 +- source/org/thdl/media/SmartPlayerFactory.java | 27 +- source/org/thdl/media/SmartQT4JPlayer.java | 2 +- source/org/thdl/quilldriver/QD.java | 61 +-- source/org/thdl/quilldriver/QDShell.java | 29 +- .../org/thdl/quilldriver/SmartJMFPlayer.java | 388 --------------- .../org/thdl/quilldriver/SmartMoviePanel.java | 31 -- .../quilldriver/SmartMoviePanelException.java | 13 - .../org/thdl/quilldriver/SmartQT4JPlayer.java | 465 ------------------ source/org/thdl/tib/input/Jskad.java | 4 +- 14 files changed, 108 insertions(+), 951 deletions(-) create mode 100644 dist/.cvsignore delete mode 100644 source/org/thdl/quilldriver/SmartJMFPlayer.java delete mode 100644 source/org/thdl/quilldriver/SmartMoviePanel.java delete mode 100644 source/org/thdl/quilldriver/SmartMoviePanelException.java delete mode 100644 source/org/thdl/quilldriver/SmartQT4JPlayer.java diff --git a/build.xml b/build.xml index b8250ae..e08cb54 100644 --- a/build.xml +++ b/build.xml @@ -204,6 +204,10 @@ value="org/thdl/savant/SavantShell.java"/> + + + + @@ -333,6 +337,10 @@ value="org/thdl/tib/text/TibetanHTML.java"/> + + + + @@ -1030,6 +1038,20 @@ + + + + + + + + + + + diff --git a/dist/.cvsignore b/dist/.cvsignore new file mode 100644 index 0000000..a453cb8 --- /dev/null +++ b/dist/.cvsignore @@ -0,0 +1,5 @@ +docs +java-web-start +lib +releases +source diff --git a/source/options.txt b/source/options.txt index 03e962f..9ad5cf4 100644 --- a/source/options.txt +++ b/source/options.txt @@ -19,9 +19,11 @@ ######################### User Preferences ########################### ############################################################################ -# Set this to qt4j if you wish to use QuickTime for Java, or to jmf if you -# with to use Sun's Java Media Framework. -thdl.media.player = qt4j +# Set this to your preference of one of the following values: +# +# Framework: QuickTime for Java Value: org.thdl.media.SmartQT4JPlayer +# Framework: Java Media Framework Value: org.thdl.media.SmartJMFPlayer +thdl.media.player = org.thdl.media.SmartJMFPlayer # Sets the Tibetan keyboard that Jskad uses on startup. # Here are the acceptable values: diff --git a/source/org/thdl/media/SmartJMFPlayer.java b/source/org/thdl/media/SmartJMFPlayer.java index d617a56..e26ea88 100644 --- a/source/org/thdl/media/SmartJMFPlayer.java +++ b/source/org/thdl/media/SmartJMFPlayer.java @@ -54,7 +54,7 @@ public class SmartJMFPlayer extends SmartMoviePanel implements ControllerListene private Float to = null; /*-----------------------------------------------------------------------*/ - public static String getName() { + public String getName() { return "Java Media Framework"; } public SmartJMFPlayer() { diff --git a/source/org/thdl/media/SmartMoviePanel.java b/source/org/thdl/media/SmartMoviePanel.java index bed4f76..c04b2ad 100644 --- a/source/org/thdl/media/SmartMoviePanel.java +++ b/source/org/thdl/media/SmartMoviePanel.java @@ -23,7 +23,7 @@ import java.net.*; public abstract class SmartMoviePanel extends Panel { - public abstract static String getName(); + public abstract String getName(); public abstract void setParentContainer(Container c); //helper methods - initialize diff --git a/source/org/thdl/media/SmartPlayerFactory.java b/source/org/thdl/media/SmartPlayerFactory.java index 93d4a08..672f323 100644 --- a/source/org/thdl/media/SmartPlayerFactory.java +++ b/source/org/thdl/media/SmartPlayerFactory.java @@ -1,7 +1,30 @@ +/* +The contents of this file are subject to the THDL Open Community License +Version 1.0 (the "License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License on the THDL web site +(http://www.thdl.org/). + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +License for the specific terms governing rights and limitations under the +License. + +The Initial Developer of this software is the Tibetan and Himalayan Digital +Library (THDL). Portions created by the THDL are Copyright 2001 THDL. +All Rights Reserved. + +Contributor(s): ______________________________________. +*/ + +package org.thdl.media; + import java.lang.reflect.*; import java.util.*; -public static class SmartPlayerFactory { +public class SmartPlayerFactory { + /** You cannot instantiate this class. */ + private SmartPlayerFactory() { } + static final String[] possiblePlayers = {"org.thdl.media.SmartJMFPlayer", "org.thdl.media.SmartQT4JPlayer"}; @@ -25,4 +48,4 @@ public static class SmartPlayerFactory { } return (SmartMoviePanel[])moviePlayers.toArray(); } -} \ No newline at end of file +} diff --git a/source/org/thdl/media/SmartQT4JPlayer.java b/source/org/thdl/media/SmartQT4JPlayer.java index bab340e..6b112c1 100644 --- a/source/org/thdl/media/SmartQT4JPlayer.java +++ b/source/org/thdl/media/SmartQT4JPlayer.java @@ -54,7 +54,7 @@ public class SmartQT4JPlayer extends SmartMoviePanel private TimeBaseTimeCallBackStopper theStopper; //accessors - public static String getName() { + public String getName() { return "Quicktime for Java"; } public void setParentContainer(Container c) { diff --git a/source/org/thdl/quilldriver/QD.java b/source/org/thdl/quilldriver/QD.java index 6b5c809..2cfa6c7 100644 --- a/source/org/thdl/quilldriver/QD.java +++ b/source/org/thdl/quilldriver/QD.java @@ -675,14 +675,12 @@ public void setMedia(URL url) { } try { - if (thdl_mediaplayer_property == null) - thdl_mediaplayer_property = getMediaPlayerProperty(); - - Class mediaClass = Class.forName(thdl_mediaplayer_property); + Class mediaClass = Class.forName(getMediaPlayerProperty()); 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); + player = (SmartMoviePanel)QD.createObject(mediaConstructor, mediaArgs); + if (null == player) throw new ClassNotFoundException("FIXME: the constructor failed."); media = url; mediaField.setText(media.getPath()); startTimer(); @@ -700,29 +698,6 @@ public void setMedia(URL url) { } } -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(); @@ -1786,4 +1761,34 @@ class RadioListener extends ThdlActionListener { } } } + + /* FIXME: needs better error handling */ + /** Creates an object via reflection. + * @returns nonnull on succes, null on error */ + public static 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); + ThdlDebug.noteIffyCode(); + } catch (IllegalAccessException e) { + System.out.println(e); + ThdlDebug.noteIffyCode(); + } catch (IllegalArgumentException e) { + System.out.println(e); + ThdlDebug.noteIffyCode(); + } catch (InvocationTargetException e) { + System.out.println(e); + System.out.println(e.getTargetException()); + ThdlDebug.noteIffyCode(); + } + return object; + } } diff --git a/source/org/thdl/quilldriver/QDShell.java b/source/org/thdl/quilldriver/QDShell.java index 75d682f..81bfbaa 100644 --- a/source/org/thdl/quilldriver/QDShell.java +++ b/source/org/thdl/quilldriver/QDShell.java @@ -30,11 +30,20 @@ import javax.swing.text.rtf.*; import org.thdl.util.ThdlDebug; import org.thdl.util.ThdlActionListener; import org.thdl.util.ThdlOptions; +import org.thdl.tib.input.JskadKeyboardManager; +import org.thdl.tib.input.JskadKeyboardFactory; +import org.thdl.tib.input.JskadKeyboard; import org.thdl.savant.JdkVersionHacks; public class QDShell extends JFrame { + + /** the middleman that keeps code regarding Tibetan keyboards + * clean */ + private final static JskadKeyboardManager keybdMgr + = new JskadKeyboardManager(JskadKeyboardFactory.getAllAvailableJskadKeyboards()); + /** When opening a file, this is the only extension QuillDriver cares about. This is case-insensitive. */ protected final static String dotQuillDriver = ".xml"; @@ -261,8 +270,8 @@ public class QDShell extends JFrame { JMenuItem keybdItem = new JMenuItem(kbd.getIdentifyingString()); keybdItem.addActionListener(new ThdlActionListener() { public void theRealActionPerformed(ActionEvent e) { - qd.changeKeyboard(kbd); - } + qd.changeKeyboard(kbd); + } }); keyboardMenu.add(keybdItem); } @@ -271,20 +280,6 @@ public class QDShell extends JFrame { JMenu mediaPlayerMenu = new JMenu(messages.getString("MediaPlayer")); - 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) { @@ -355,4 +350,4 @@ public class QDShell extends JFrame { return "QD File Format (" + QDShell.dotQuillDriver + ")"; } } -} \ No newline at end of file +} diff --git a/source/org/thdl/quilldriver/SmartJMFPlayer.java b/source/org/thdl/quilldriver/SmartJMFPlayer.java deleted file mode 100644 index d63d39b..0000000 --- a/source/org/thdl/quilldriver/SmartJMFPlayer.java +++ /dev/null @@ -1,388 +0,0 @@ -/* -The contents of this file are subject to the THDL Open Community License -Version 1.0 (the "License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License on the THDL web site -(http://www.thdl.org/). - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -License for the specific terms governing rights and limitations under the -License. - -The Initial Developer of this software is the Tibetan and Himalayan Digital -Library (THDL). Portions created by the THDL are Copyright 2001 THDL. -All Rights Reserved. - -Contributor(s): ______________________________________. -*/ - -package org.thdl.quilldriver; - -import java.util.*; -import java.net.*; -import javax.media.*; -import java.awt.*; -import javax.swing.*; -import javax.swing.event.*; - -import org.thdl.util.ThdlDebug; - -/*-----------------------------------------------------------------------*/ -public class SmartJMFPlayer extends SmartMoviePanel implements ControllerListener -{ - private EventListenerList listenerList = new EventListenerList(); - - public URL mediaURL; - - private Player player = null; - private Component visualComponent = null; - private Component controlComponent = null; - private Panel panel = null; - private JPanel vPanel = null; - - private Container parent = null; - - private java.util.Timer timer = null; - private Time stopTime = null; - private Time pauseTime = null; - private boolean stillLoadingVideo = false; - private boolean isMediaAudio = false; - private boolean isSized = false; - - private Float to = null; -/*-----------------------------------------------------------------------*/ - public SmartJMFPlayer(Container p, URL sound) throws SmartMoviePanelException { - super( new GridLayout() ); - parent = p; - loadMovie(sound); - } - public void loadMovie(URL sound) throws SmartMoviePanelException { - if (mediaURL != null) { - cmd_stop(); - destroy(); - } - mediaURL = sound; - start(); - } - public void destroy() throws SmartMoviePanelException { - if (false) - throw new SmartMoviePanelException(); - player.close(); - } -/*-----------------------------------------------------------------------*/ - private void start() { - try { - player = Manager.createPlayer(mediaURL); - player.addControllerListener(this); - } catch (javax.media.NoPlayerException e) { - System.err.println("noplayer exception"); - e.printStackTrace(); - ThdlDebug.noteIffyCode(); - return; - } catch (java.io.IOException ex) { - System.err.println("IO exception"); - ex.printStackTrace(); - ThdlDebug.noteIffyCode(); - return; - } - if (player != null) - player.realize(); - } -/*-----------------------------------------------------------------------*/ - public void displayBorders(boolean borders) throws SmartMoviePanelException - { - if (false) - throw new SmartMoviePanelException(); - } - public void displayController(boolean controller) throws SmartMoviePanelException - { - if (false) - throw new SmartMoviePanelException(); - - } - public boolean isInitialized() { - return isSized; - } -/*-----------------------------------------------------------------------*/ - public synchronized void controllerUpdate(ControllerEvent event) { - if (player == null) - return; - if (event instanceof RealizeCompleteEvent) { - System.out.println("received RealizeCompleteEvent event"); - if (visualComponent == null) { - if (panel == null) { - setLayout(new GridLayout(1,1)); - vPanel = new JPanel(); - vPanel.setLayout( new BorderLayout() ); - if ((visualComponent = player.getVisualComponent())!= null) - vPanel.add("Center", visualComponent); - else { - isMediaAudio = true; - stillLoadingVideo = false; - } - if (!stillLoadingVideo) - { - if ((controlComponent = player.getControlPanelComponent()) != null) { - if (visualComponent == null) //no video - vPanel.setPreferredSize(new Dimension(400,25)); - vPanel.add("South", controlComponent); - } - } - add(vPanel); - } - } - parent.invalidate(); - parent.validate(); - parent.repaint(); - isSized = true; - if (stillLoadingVideo) - player.start(); - } else if (event instanceof StartEvent) { - StartEvent se = (StartEvent)event; - Time t = se.getMediaTime(); - long longt = t.getNanoseconds(); - Float from = new Float(longt); - float f = (from.floatValue() / 1000000000); - from = new Float(f); - t = player.getStopTime(); - longt = t.getNanoseconds(); - to = new Float(longt); - f = (to.floatValue() / 1000000000); - to = new Float(f); - if (timer != null) - { - timer.cancel(); - timer = null; - } - timer = new java.util.Timer(true); - timer.schedule(new TimerTask() { - public void run() { - //this is specifically for the MPG stop time bug - if (stopTime != null) - if (player.getMediaTime().getNanoseconds() > stopTime.getNanoseconds()) - player.stop(); - }}, 0, 15); - } else if (event instanceof StopEvent) { - pauseTime = player.getMediaTime(); - - - /*messy problems require messy solutions: - if the slider is present, dragging it while playing creates - a RestartingEvent, and if I set the media time here it messes up - and barely plays at all (maybe because it cancels the previously - set media time? - I don't know). - - but it seems that if you press the play/pause button on the - control widget, then you need to set the media time upon stop - (probably because of problem noted below, namely that you get - weird results if you do player.start() without setting the media - time.*/ - - if (!(event instanceof RestartingEvent)) { - player.setMediaTime(pauseTime); - player.prefetch(); - } - -// player.setStopTime(Clock.RESET); - stopTime = null; - - System.out.println("received StopEvent"); - - if (timer != null) - { - timer.cancel(); - timer = null; - } - if (stillLoadingVideo) - { - System.out.println("received EndOfMediaEvent"); - stillLoadingVideo = false; - player.stop(); - if ((controlComponent = player.getControlPanelComponent()) != null) { - if (visualComponent == null) //no video - vPanel.setPreferredSize(new Dimension(400,25)); - vPanel.add("South", controlComponent); - } - parent.invalidate(); - parent.validate(); - parent.repaint(); - } - } else if ( event instanceof CachingControlEvent) { - CachingControlEvent e = (CachingControlEvent) event; - System.out.println("got CachingControlEvent: " + e); - if (!isMediaAudio) - stillLoadingVideo = true; - } else if (event instanceof ControllerErrorEvent) { - player = null; - System.err.println("*** ControllerErrorEvent *** " + ((ControllerErrorEvent)event).getMessage()); - } else if (event instanceof PrefetchCompleteEvent) { - if (panel != null) { - panel.invalidate(); - } - parent.invalidate(); - parent.validate(); - parent.repaint(); - } - } -/*-----------------------------------------------------------------------*/ - public void cmd_stop() throws SmartMoviePanelException { - if (player == null) - throw new SmartMoviePanelException("no player"); - try { - player.stop(); - } catch (NotRealizedError err) { - throw new SmartMoviePanelException("JMF player not realized"); - } - } - public void cmd_playOn() throws SmartMoviePanelException { - if (stillLoadingVideo || player == null) { - throw new SmartMoviePanelException("no player or video still loading"); - } - if (player.getState() == Controller.Started) - return; - - if (pauseTime == null) - player.setMediaTime(new Time(0.0)); - else - player.setMediaTime(pauseTime); - if (player.getTargetState() < Player.Started) { - player.setStopTime(Clock.RESET); - player.prefetch(); - } - player.start(); - } - public void cmd_playSegment(Integer from, Integer to) throws SmartMoviePanelException { - if (from == null || player == null || stillLoadingVideo) - throw new SmartMoviePanelException("no player or video still loading"); - - final Time startTime = new Time(from.longValue() * 1000000); - try { - if (player.getState() == Controller.Started) - player.stop(); - while (player.getState() == Controller.Unrealized) - ; - if (to == null) { - stopTime = null; - player.setStopTime(Clock.RESET); - } else { - stopTime = new Time(to.longValue() * 1000000); - player.setStopTime(stopTime); - } - player.setMediaTime(startTime); - player.prefetch(); - player.start(); - } catch(NotRealizedError err) { - throw new SmartMoviePanelException("JMF player not realized"); - } - } -/*-----------------------------------------------------------------------*/ - public boolean isPlaying() { - if (player == null) - return false; - if (player.getState() == Controller.Started) - return true; - return false; - } - public int getCurrentTime() { - if (player == null) - return -1; - if (player.getState() < Controller.Realized) - return -1; - long currTime = player.getMediaNanoseconds(); - return new Long(currTime / 1000000).intValue(); - } - public int getEndTime() { - Time t = player.getDuration(); - long l = t.getNanoseconds(); - return new Long(l / 1000000).intValue(); - } -/*-----------------------------------------------------------------------*/ -} - -/* - -After pause the MPEG video and playing it again it gets faster -Author: vladshtr -In Reply To: After pause the MPEG video and playing it again it gets faster -Mar 1, 2001 6:25 PM - -Reply 1 of 1 - - -The problem is in the setting the Media time. - -The safety way is to always set new media time with the -following method: setMediaTime(Time time); .... if you want to -use it after --player.stop(); used as real stop you can use setMediaTime(new -Time(0.0)); --player.stop(); used as real pause you have to use the -combination: -player.stop(); -Time currentTime = player.getMediaTime(); -//........ -player.setMediaTime(currentTime); -player.start(); - - -Re: (urgent) when you pause and resume, video plays at rate > 1 -Author: seertenedos -In Reply To: (urgent) when you pause and resume, video plays at rate > 1 -Aug 11, 2002 11:36 PM - -Reply 1 of 1 - - -I found a solution for this problem for those that are interested. - -what you have to do is store the time just before you pause and then set the -time just before you play. here is a copy of my pause and play methods - -// Start the player -private void play() { -if (player != null) -{ -if (pauseTime != null) -{ -player.setMediaTime(pauseTime); -} -if (player.getTargetState() < Player.Started) -player.prefetch(); -player.start(); -} -} - -// Pause the player -private void pause() { -if (player != null) -pauseTime = player.getMediaTime(); -player.stop(); -} - - -that should solve your pause play problems! - -> The problem is below. It seems quite a few people are -> having this problem but i have not seen a solution -> around. I really need a solution to this problem as -> the whole point of my application is that it plays -> divx and mpeg videos. At the moment i have divx -> movies playing through the mpeg demuxer as the avi one -> stuffed up the audio. I think that is the reason it -> affects both divx and mpeg. My application is due in -> one week and my client is not going to be very happy -> if this problem happens every time they pause then -> play the video. -> The player is for divx movies. If anyone knows how to -> solve this problem or how to make it so you can pause -> and resume divx movies please respond. -> -> Pause and Resume playback. -> The video plays at a high rate and there is no audio. -> Problem doesn't appear while seeking. -> -> -> -> - -*/ diff --git a/source/org/thdl/quilldriver/SmartMoviePanel.java b/source/org/thdl/quilldriver/SmartMoviePanel.java deleted file mode 100644 index 9bb64a4..0000000 --- a/source/org/thdl/quilldriver/SmartMoviePanel.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.thdl.quilldriver; - -import java.awt.*; -import java.net.*; - -public abstract class SmartMoviePanel extends Panel -{ -//helper methods - initialize - public abstract void displayBorders(boolean borders) throws SmartMoviePanelException; - public abstract void displayController(boolean controller) throws SmartMoviePanelException; - public abstract void loadMovie(URL mediaUrl) throws SmartMoviePanelException; - -//helper methods - control media - public abstract void cmd_playOn() throws SmartMoviePanelException; - public abstract void cmd_playSegment(Integer startTime, Integer stopTime) throws SmartMoviePanelException; - public abstract void cmd_stop() throws SmartMoviePanelException; - -//helper methods - media status - public abstract boolean isInitialized(); - public abstract boolean isPlaying(); - public abstract int getCurrentTime(); - public abstract int getEndTime(); - -//helper methods - cleanup - public abstract void destroy() throws SmartMoviePanelException; -//constructor - public SmartMoviePanel(GridLayout layout) - { - super(layout); - } -} diff --git a/source/org/thdl/quilldriver/SmartMoviePanelException.java b/source/org/thdl/quilldriver/SmartMoviePanelException.java deleted file mode 100644 index 47fde76..0000000 --- a/source/org/thdl/quilldriver/SmartMoviePanelException.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.thdl.quilldriver; - -public class SmartMoviePanelException extends Exception -{ - public SmartMoviePanelException() - { - super(); - } - public SmartMoviePanelException(String msg) - { - super(msg); - } -} diff --git a/source/org/thdl/quilldriver/SmartQT4JPlayer.java b/source/org/thdl/quilldriver/SmartQT4JPlayer.java deleted file mode 100644 index 0870fbf..0000000 --- a/source/org/thdl/quilldriver/SmartQT4JPlayer.java +++ /dev/null @@ -1,465 +0,0 @@ -package org.thdl.quilldriver; - -import java.awt.*; -import java.net.*; -import quicktime.*; -import quicktime.app.*; -import quicktime.app.display.*; -import quicktime.app.players.*; -import quicktime.app.image.*; //required for the QT4JAVA test -import quicktime.std.*; -import quicktime.std.movies.*; -import quicktime.std.movies.media.DataRef; -import quicktime.io.*; -import quicktime.app.time.*; -import quicktime.std.clocks.*; - -public class SmartQT4JPlayer extends SmartMoviePanel -{ -//attributes - private QTCanvas canvas; //this hands over screen real estate to - //native graphics that quicktime can control - - private QTPlayer player; //this is the the client for the canvas - //In my app it will get set to a - // quicktime.app.player object - - private Movie movie; //this is the content used in - //QTDrawable player's quicktime.app.player constructor - - private MovieController controller; - - private TimeBaseRateCallBack theMoviesRateCallback; - private TimeBaseExtremesCallBack theMoviesExtremeCallback; - private TimeBaseTimeJumpCallBack theMoviesTimeJumpCallback; - private TimeBaseTimeCallBack theMoviesTimeCallback; - private TimeBaseTimeCallBackStopper theStopper; - -//accessors - public void setPlayer(QTPlayer player) - { - this.player = player; - } - public QTPlayer getPlayer() - { - return player; - } - - public void setMovie(Movie movie) - { - this.movie = movie; - } - public void setMovie(URL movieURL) - { - try - { - DataRef movieDataRef = new DataRef( "file://" + movieURL.getFile() ); - Movie m = new Movie(); - m = m.fromDataRef( movieDataRef, StdQTConstants.newMovieActive ); - setMovie(m); - getMovie().setTimeScale(1000); - } - catch(QTException qte) - { - qte.printStackTrace(); - System.out.println( movieURL.toString() ); - } - } - public Movie getMovie() - { - return movie; - } - - public void setController(MovieController controller) - { - this.controller = controller; - } - public MovieController getController() - { - return controller; - } - - public void setCanvas(QTCanvas canvas) - { - this.canvas = canvas; - } - public QTCanvas getCanvas() - { - return canvas; - } - - -//contract methods - initialize - public void displayBorders(boolean borders) throws SmartMoviePanelException - { - } - public void displayController(boolean controller) throws SmartMoviePanelException - { - } - public void loadMovie(URL mediaURL) throws SmartMoviePanelException - { - setMovie(mediaURL); - try - { - getCanvas().removeClient(); - setController( new MovieController( getMovie() )); - getController().setKeysEnabled(true); - setPlayer(new QTPlayer( getController() )); - getCanvas().setClient( getPlayer(), true ); - this.add( getCanvas() ); - TimeBase theMoviesTimeBase = getMovie().getTimeBase(); - - // this callback is triggered when the rate of the movie changes - theMoviesRateCallback = new TimeBaseRateCallBack(theMoviesTimeBase, 1.0F, StdQTConstants.triggerRateChange); -// theMoviesRateCallback.callMeWhen(); - - // this callback is triggered when the movie ends - theMoviesExtremeCallback = new TimeBaseExtremesCallBack(theMoviesTimeBase, StdQTConstants.triggerAtStop); -// theMoviesExtremeCallback.callMeWhen(); - - // this callback is triggered when the movie starts - theMoviesExtremeCallback = new TimeBaseExtremesCallBack(theMoviesTimeBase, StdQTConstants.triggerAtStart); -// theMoviesExtremeCallback.callMeWhen(); - - // this callback is triggered when there is a jump in the timebase - theMoviesTimeJumpCallback = new TimeBaseTimeJumpCallBack(theMoviesTimeBase); -// theMoviesTimeJumpCallback.callMeWhen(); - - // this schedules the time callback once every 2 seconds - // this callback is triggered at a specific time interval - theMoviesTimeCallback = new TimeBaseTimeCallBack(theMoviesTimeBase, 1, 2, StdQTConstants.triggerTimeEither); -// theMoviesTimeCallback.callMeWhen(); - - //Using the Timer class you can get rescheduled properly and get callbacks at the set intervals. It uses the same callback - //mechanism of internally of the TimeCallback. - //Its recomended to use this Timer class to do callbacks , which would take care of the time base time changes and - //recscheduling of the tickle method . - Timer timer = new Timer(1, 2, new Tickler(), getMovie() ); -// timer.setActive(true); - - } - catch(QTException qte) - { - qte.printStackTrace(); - } - } - -//contract methods - control media - public void cmd_playOn() throws SmartMoviePanelException - { - try - { - getPlayer().setRate(1.0F); - } - catch(QTException qte) - { - qte.printStackTrace(); - } - } - public void cmd_playSegment(Integer startTime, Integer stopTime) throws SmartMoviePanelException - { -//FIXME: need to deal with null stopTime - try - { - getPlayer().setTime( startTime.intValue() ); - - int value=stopTime.intValue(); - TimeBase theMoviesTimeBase = getPlayer().getTimeBase(); - theStopper = new TimeBaseTimeCallBackStopper(theMoviesTimeBase, 1000, value, StdQTConstants.triggerTimeEither); - theStopper.callMeWhen(); - - cmd_playOn(); - - System.out.println("Set start time to " +startTime.intValue() ); - System.out.println("Set stop time " +stopTime.intValue() ); - System.out.println("Current time " +getPlayer().getTime() ); - System.out.println("Time Stopper's stop trigger " +theStopper.getCallTime() ); - System.out.println("Player Scale: " +getPlayer().getScale() ); - System.out.println("Movie Scale: " +getMovie().getTimeScale() ); - - } - catch (SmartMoviePanelException smpe) {} - catch (StdQTException sqte) {} - catch (QTException qte) {} - } - public void cmd_stop() throws SmartMoviePanelException - { - try - { - getPlayer().setRate(0.0F); - } - catch(QTException qte) - { - qte.printStackTrace(); - } - } - -//contract methods - media status - public boolean isInitialized() - { - return true; - } - public boolean isPlaying() { - return false; //FIXME - } - public int getCurrentTime() - { - try { - return getMovie().getTime(); - } catch (StdQTException stqte) { - stqte.printStackTrace(); - return -1; - } - } - public int getEndTime() - { - try { - return getMovie().getDuration(); - } catch (StdQTException stqte) { - stqte.printStackTrace(); - return -1; - } - } - -//helper methods - QT4J - public void startupQTSession() - { - //Initialize a QT session and add a test image - - //These three try/catch blocks come from PlayMovie.java copyright - // Apple Co. I'm using it to test that QT and QT4Java exist - try - { - if (QTSession.isInitialized() == false) - QTSession.open(); - } - catch (NoClassDefFoundError er) - { - add (new Label ("Can't Find QTJava classes"), "North"); - add (new Label ("Check install and try again"), "South"); - } - catch (SecurityException se) - { - // this is thrown by MRJ trying to find QTSession class - add (new Label ("Can't Find QTJava classes"), "North"); - add (new Label ("Check install and try again"), "South"); - } - catch (Exception e) - { - // do a dynamic test for QTException - //so the QTException class is not loaded unless - // an unknown exception is thrown by the runtime - if (e instanceof ClassNotFoundException || e instanceof java.io.FileNotFoundException) - { - add (new Label ("Can't Find QTJava classes"), "North"); - add (new Label ("Check install and try again"), "South"); - } - else if (e instanceof QTException) - { - add (new Label ("Problem with QuickTime install"), "North"); - if (((QTException)e).errorCode() == -2093) - add (new Label ("QuickTime must be installed"), "South"); - else - add (new Label (e.getMessage()), "South"); - } - } - try - { - setCanvas( new QTCanvas(QTCanvas.kInitialSize, 0.5F, 0.5F) ); - this.add( getCanvas() ); - getCanvas().setClient(ImageDrawer.getQTLogo(), true); - } - catch(QTException qte) - { - qte.printStackTrace(); - } - } - - public void destroy() - { - QTSession.close(); - System.out.println("Clean up performed."); - } - -//constructor - public SmartQT4JPlayer(Container cont, URL mediaURL) - { - super( new GridLayout() ); - startupQTSession(); - } - public SmartQT4JPlayer() - { - super( new GridLayout() ); - startupQTSession(); - } - -// inner classes - /** - * This class extends the RateCallBack class and provides an execute routine - * that is invoked by the callback when the rate of the movie changes - * - *@author travis - *@created September 3, 2002 - */ - - public class TimeBaseRateCallBack extends RateCallBack - { - public TimeBaseRateCallBack(TimeBase tb, float rate, int flag) throws QTException - { - super(tb, rate, flag); - } - - public void execute() - { - try - { - System.out.println("--- RateCallBack@ratechange---"); - - cancel(); - //reschedule - callMeWhen(); - - } catch (StdQTException e) - {} - } - } - - /** - * This class implements a method that is called when the movie stops - * - *@author travis - *@created September 3, 2002 - */ - - class TimeBaseExtremesCallBack extends quicktime.std.clocks.ExtremesCallBack - { - - public TimeBaseExtremesCallBack(TimeBase tb, int flag) throws QTException - { - super(tb, flag); - } - - public void execute() - { - try - { - System.out.println("--- ExtremesCallBack@stop---"); - - //cancel - cancel(); - //reschedule - callMeWhen(); - } - catch (StdQTException e) - {} - } - } - - /** - * This class extends the TimeJumpCallBack class to provide a method that is - * called when the timebase of the movie changes (IE, if the user clicks in - * the movie controller) - * - *@author travis - *@created September 3, 2002 - */ - - class TimeBaseTimeJumpCallBack extends quicktime.std.clocks.TimeJumpCallBack - { - public TimeBaseTimeJumpCallBack(TimeBase tb) throws QTException - { - super(tb); - } - - public void execute() - { - try - { - System.out.println("--- TimeJumpCallBack---"); - - cancel(); - //reschedule - callMeWhen(); - } - catch (StdQTException e) - {} - } - } - - class TimeBaseTimeCallBack extends quicktime.std.clocks.TimeCallBack - { - private int callTime; - private TimeBase theTimeBase; - - public void setCallTime(int time) - { - callTime=time; - value=callTime; - } - public int getCallTime() - { - return callTime; - } - public void execute() - { - try - { - System.out.println("--- TimeCallBack@triggerTimeEither--- called at:" + timeWhenCalledMsecs + "msecs"); - - cancel(); - //reschedule - callMeWhen(); - } - catch (StdQTException e) - {} - } - public TimeBaseTimeCallBack(TimeBase tb, int scale, int value, int flags) throws QTException - { - super(tb, scale, value, flags); -// setCallTime(value/1000); - setCallTime(value); - theTimeBase = tb; - } - } - - class TimeBaseTimeCallBackStopper extends TimeBaseTimeCallBack - { - public void execute() - { - try - { - System.out.println("---TimeCallBackStopper--- called at:" + timeWhenCalledMsecs + "msecs"); - System.out.println("---TimeCallBackStopper--- callTime is: " + getCallTime() + " msecs"); - cmd_stop(); - System.out.println("---TimeCallBackStopper--- Player time is: " + getPlayer().getTime() + " msecs"); - System.out.println("---TimeCallBackStopper--- Movie time is: " + getMovie().getTime() + " msecs"); - - cancelAndCleanup(); - //reschedule - //callMeWhen(); - } - catch (StdQTException e) {} - catch (SmartMoviePanelException smpe) {} - } - public TimeBaseTimeCallBackStopper(TimeBase tb, int scale, int value, int flags) throws QTException - { - super(tb, scale, value, flags); - } - - } - - public class Tickler implements Ticklish - { - public void timeChanged(int newTime) throws QTException - { - System.out.println("* * * * Timer Class * * * timeChanged at:" + newTime); - } - - public boolean tickle(float er, int time) throws QTException - { - System.out.println("* * * * Timer Class * * * tickle at:" + time); - return true; - } - } - -} diff --git a/source/org/thdl/tib/input/Jskad.java b/source/org/thdl/tib/input/Jskad.java index 04e881c..5c6e209 100644 --- a/source/org/thdl/tib/input/Jskad.java +++ b/source/org/thdl/tib/input/Jskad.java @@ -68,9 +68,11 @@ public class Jskad extends JPanel implements DocumentListener { private final static String enableKeypressStatusProp = "thdl.Jskad.enable.tibetan.mode.status"; + /** the middleman that keeps code regarding Tibetan keyboards + * clean */ private final static JskadKeyboardManager keybdMgr = new JskadKeyboardManager(JskadKeyboardFactory.getAllAvailableJskadKeyboards()); - + private JComboBox fontFamilies, fontSizes; private JFileChooser fileChooser; private javax.swing.filechooser.FileFilter rtfFilter;