/*
* Created on 2004/11/13 Author aki@www.xucker.jpn.org License Apache2.0 or
* Common Public License
*/
package org.jpn.xucker.subplayer;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.MethodUtils;
import org.apache.commons.betwixt.io.BeanReader;
import org.apache.commons.betwixt.io.BeanWriter;
import org.apache.commons.betwixt.strategy.ConvertUtilsObjectStringConverter;
import org.apache.commons.lang.CharSet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Slider;
import org.jpn.xucker.commons.audio.JavaSoundAudioPlayer;
import org.jpn.xucker.commons.audio.TimerAudioStopper;
import org.jpn.xucker.commons.swt.ui.MenuItemContainer;
import org.jpn.xucker.commons.swt.ui.SWTBasicFileApplication;
import org.jpn.xucker.mp3.MP3JavaSoundAudioPlayer;
import org.jpn.xucker.subtitle.StandardSubObject;
import org.jpn.xucker.subtitle.SubUtils;
import org.jpn.xucker.subtitle.srt.SRTList;
import org.jpn.xucker.subtitle.srt.SRTParser;
import org.jpn.xucker.subtitle.sub.SUBParser;
import org.xml.sax.SAXException;
import java.beans.IntrospectionException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
public class SubPlayMain extends SWTBasicFileApplication implements
SelectionListener, SubPlayFileUpdater, ShellListener ,Runnable{
public static Log log=
LogFactory.getLog(SubPlayMain.class);
/**
* @param shell
*/
private Button markButton;
private Button markNext;
private Button markPrev;
private Button autoButton;
private Button stopButton;
private Button playButton;
private Button nextButton;
private Button prevButton;
private Button firstButton;
private Button lastButton;
int index = 0;
private SubPlayFileXmlObject subPlayFileXmlObject;
/*
* public class EListener implements MouseListener,Listener{
* /* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
/*
* public void handleEvent(Event event) {
*
* if(event.type==SWT.MouseUp){ // TODO Auto-generated method stub
* System.out.println("event:"+event.button); event.doit=true;
*
* System.out.println(event.widget); if(event.widget instanceof Control){
* System.out.println("control"); Menu
* menu=((Control)event.widget).getMenu();
*
* if(menu!=null){ System.out.println("enable");
*
* menu.setEnabled(false); menu.setVisible(false);
* ((Control)event.widget).setMenu(null); MenuItem items[]=menu.getItems();
* for(int i=0;i <items.length;i++){ items[i].setEnabled(false); }
* } }
* } } public void mouseDoubleClick(MouseEvent e) { // TODO Auto-generated
* method stub
* }
*
*
* public void mouseDown(MouseEvent e) { // TODO Auto-generated method stub
* }
*
*
* public void mouseUp(MouseEvent e) {
* // TODO Auto-generated method stub System.out.println(e.button);
* }
* }
*/
private String version = "0.4";
private String HOMEPAGE_URL = "http://www.xucker.jpn.org/product/subplayer.html";
private String APP_NAME = "jSubPlay";
//private DvdsuptoolsList list;
//private DvdsuptoolsObject[] datas;
//private DvdsuptoolsList list2;
//private DvdsuptoolsObject[] datas2;
private List sublist1;
private List sublist2;
private ImageCanvas canvas;
private ImageCanvas canvas2;
private boolean autoPlay;
private long lastPosition;
private SubPlayPreferenceXmlObject preference;
JavaSoundAudioPlayer audioPlayer;
private TimerAudioStopper stopper;;
private TitleUpdater titleUpdater;
private ImageSetter imageSetter;
private SubMainMenu mainMenu;
private boolean preferenceChanged = false;
private Shell subshell;
private SubPlayMain self;
private String preferencePath = "subplay_preference.conf";
private Object totalTime;
private Slider slider;
private MarkControler markControler;
public SubPlayMain(Shell shell) {
self = this;
shell.addShellListener(this);
shell.setImage(new Image(Display.getCurrent(), SubPlayMain.class
.getClassLoader().getResourceAsStream(
"org/jpn/xucker/subplayer/resource/icon.png")));
this.shell = shell;
shell.setText("");
shell.setBounds(0, 0, 715, 570);
RowLayout layout = new RowLayout();
shell.setLayout(layout);
autoButton = new Button(shell, SWT.NULL);
autoButton.setText("autoPlay");
autoButton.setImage(new Image(Display.getCurrent(), SubPlayMain.class
.getClassLoader().getResourceAsStream(
"org/jpn/xucker/subplayer/resource/auto.png")));
autoButton.addSelectionListener(this);
RowData button1_data = new RowData();
autoButton.setLayoutData(button1_data);
playButton = new Button(shell, SWT.NULL);
playButton.setText("play");
playButton.setImage(new Image(Display.getCurrent(), this.getClass()
.getClassLoader().getResourceAsStream(
"org/jpn/xucker/subplayer/resource/play.png")));
playButton.addSelectionListener(this);
stopButton = new Button(shell, SWT.NULL);
stopButton.setText("stop");
stopButton.setImage(new Image(Display.getCurrent(), SubPlayMain.class
.getClassLoader().getResourceAsStream(
"org/jpn/xucker/subplayer/resource/stop.png")));
stopButton.addSelectionListener(this);
prevButton = new Button(shell, SWT.NULL);
prevButton.setText("prev");
prevButton.setImage(new Image(Display.getCurrent(), SubPlayMain.class
.getClassLoader().getResourceAsStream(
"org/jpn/xucker/subplayer/resource/prev.png")));
prevButton.addSelectionListener(this);
nextButton = new Button(shell, SWT.NULL);
nextButton.setText("next");
nextButton.setImage(new Image(Display.getCurrent(), SubPlayMain.class
.getClassLoader().getResourceAsStream(
"org/jpn/xucker/subplayer/resource/next.png")));
nextButton.addSelectionListener(this);
firstButton = new Button(shell, SWT.NULL);
firstButton.setText("first");
firstButton.setImage(new Image(Display.getCurrent(), SubPlayMain.class
.getClassLoader().getResourceAsStream(
"org/jpn/xucker/subplayer/resource/first.png")));
firstButton.addSelectionListener(this);
lastButton = new Button(shell, SWT.NULL);
lastButton.setText("last");
lastButton.setImage(new Image(Display.getCurrent(), SubPlayMain.class
.getClassLoader().getResourceAsStream(
"org/jpn/xucker/subplayer/resource/last.png")));
lastButton.addSelectionListener(this);
slider = new Slider(shell,SWT.HORIZONTAL);
slider.setEnabled(false);
slider.setMinimum(0);
slider.setMaximum(1);
slider.addSelectionListener(this);
RowData sliderData=new RowData();
sliderData.width=100;
sliderData.height=16;
slider.setLayoutData(sliderData);
createMarkPanel(shell);
markControler=new MarkControler(this,markButton);
playButton.setFocus();
canvas = new ImageCanvas(shell);
RowData label_data = new RowData();
canvas.setLayoutData(label_data);
label_data.width = 700;
label_data.height = 325;
canvas2 = new ImageCanvas(shell);
//canvas2.addListener(SWT.MouseUp,new EListener());
Menu popup = new Menu(shell, SWT.POP_UP);
MenuItem item = new MenuItem(popup, SWT.NULL);
item.setText("ok");
canvas2.setMenu(popup);
//canvas2.addMouseListener(new EListener());
RowData sub2_data = new RowData();
canvas2.setLayoutData(sub2_data);
sub2_data.width = 700;
sub2_data.height = 125;
stopper = new TimerAudioStopper();
titleUpdater = new TitleUpdater();
imageSetter = new ImageSetter();
mainMenu = new SubMainMenu(shell);
mainMenu.setExecuteObject(new MenuEventExecuter());
preference = new SubPlayPreferenceXmlObject();
//writePreference(new File("c:\\tmp\\p.xml"));
readPreference(new File(preferencePath));
menuUpdate();
updateButtons();
modeDisable();
}
/**
* @param shell
*/
private void createMarkPanel(Shell shell) {
// TODO Auto-generated method stub
Canvas canvas=new Canvas(shell,SWT.NULL);
canvas.setLayout(null);
markButton=new Button(canvas,SWT.CHECK);
markButton.addSelectionListener(this);
markButton.setBounds(0,0,60,20);
markButton.setText("Mark");
markPrev=new Button(canvas,SWT.NULL);
markPrev.setBounds(0,20,30,30);
markPrev.setText("prev");
markPrev.setEnabled(false);
markPrev.addSelectionListener(this);
markNext=new Button(canvas,SWT.NULL);
markNext.setBounds(30,20,30,30);
markNext.setText("next");
markNext.setEnabled(false);
markNext.addSelectionListener(this);
}
/**
*
*/
private final void menuUpdate() {
int margintime = preference.getMargintime();
if (margintime == 0) {
mainMenu.getMenuItem("m0").setSelection(true);
} else if (margintime == 100) {
mainMenu.getMenuItem("m1").setSelection(true);
} else if (margintime == 150) {
mainMenu.getMenuItem("m1p5").setSelection(true);
} else if (margintime == 200) {
mainMenu.getMenuItem("m2").setSelection(true);
} else if (margintime == 250) {
mainMenu.getMenuItem("m2p5").setSelection(true);
} else if (margintime == 300) {
mainMenu.getMenuItem("m3").setSelection(true);
} else if (margintime == 400) {
mainMenu.getMenuItem("m4").setSelection(true);
} else if (margintime == 500) {
mainMenu.getMenuItem("m5").setSelection(true);
} else if (margintime == 1000) {
mainMenu.getMenuItem("m10").setSelection(true);
}
int waittime = preference.getWaittime();
if (waittime == 0) {
mainMenu.getMenuItem("w0").setSelection(true);
} else if (waittime == 1000) {
mainMenu.getMenuItem("w1").setSelection(true);
} else if (waittime == 3000) {
mainMenu.getMenuItem("w3").setSelection(true);
} else if (waittime == 10000) {
mainMenu.getMenuItem("w10").setSelection(true);
} else if (waittime == 15000) {
mainMenu.getMenuItem("w15").setSelection(true);
} else if (waittime == 30000) {
mainMenu.getMenuItem("w30").setSelection(true);
} else if (waittime == 45000) {
mainMenu.getMenuItem("w45").setSelection(true);
} else if (waittime == 60000) {
mainMenu.getMenuItem("w60").setSelection(true);
}
mainMenu.getMenuItem("checkStartNew").setSelection(
preference.isCreateNew());
mainMenu.getMenuItem("checkPlayFirstSub").setSelection(
preference.isPlayFirstSub());
mainMenu.getMenuItem("checkPlaySecondSub").setSelection(
preference.isPlaySecondSub());
mainMenu.getMenuItem("checkPlaySound").setSelection(
preference.isPlayFirstAudio());
mainMenu.getMenuItem("checkRepeat").setSelection(preference.isRepeat());
mainMenu.getMenuItem("checkReverse").setSelection(
preference.isReverse());
}
private final void updateButtons() {
setReverse(preference.isReverse());
}
public void setUpSubDatas() {
index = 0;
if (subPlayFileXmlObject != null) {
if (subPlayFileXmlObject.getFirstSubFilePath() != null
&& !subPlayFileXmlObject.getFirstSubFilePath().equals("")) {
// list = DvdsuptoolsBuilder.parseSubData());
sublist1 = loadSubData(new File(parsePath(subPlayFileXmlObject
.getFirstSubFilePath())));
//datas = list.getSubOjects();
if(sublist1!=null){
totalTime = SubUtils
.toTimeString(SubUtils
.getTotalTime((StandardSubObject[]) sublist1
.toArray(new StandardSubObject[sublist1
.size()])));
}else{
totalTime=SubUtils.toTimeString(0);
}
} else {
//list=null;
//datas=null;
sublist1 = null;
totalTime = null;
}
// Arrays.sort(datas);
// list2 = SubDataBuilder.parseSubData(new
// File(subFile2),SubDataBuilder.RELATIVE);
if (subPlayFileXmlObject.getSecondSubFilePath() != null
&& !subPlayFileXmlObject.getSecondSubFilePath().equals("")) {
sublist2 = loadSubData(new File(parsePath(subPlayFileXmlObject
.getSecondSubFilePath())));
// list2 = DvdsuptoolsBuilder.parseSubData(new
// File(parsePath(subPlayFileXmlObject.getSecondSubFilePath())));
// datas2 = list2.getSubOjects();
} else {
// list2=null;
// datas2=null;
sublist2 = null;
}
} else {
sublist1 = null;
sublist2 = null;
}
}
private void errorMessage(String message){
MessageBox box = new MessageBox(shell, SWT.OK | SWT.ICON_WARNING);
box.setText("ƒGƒ‰[");
box.setMessage(message);
//int result=box.open();
//never use result int,for PMD
box.open();
}
private void errorFileNotFound(String path){
errorMessage("ƒtƒ@ƒCƒ‹‚ª‚ ‚è‚Ü‚¹‚ñ\r\n"+path);
}
/**
* @param file
* @return
*/
private List loadSubData(File file) {
if(file==null || !file.exists()){
errorFileNotFound(file.getAbsolutePath());
return null;
}
// TODO Auto-generated method stub
int type = SubUtils.getSubType(file);
if (type == SubUtils.SUB) {
SUBParser parser=new SUBParser();
parser.parse(file);
return parser.getSubDataList();
} else if (type == SubUtils.SRT) {
SRTParser parser=new SRTParser();
try {
SRTList list=parser.parse(new FileReader(file));
return list.getSubDataList();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
public String parsePath(String path) {
if (isAbsolutePath(path)) {
return path;
} else {
File resultPath = new File(getFile().getParentFile(), path);
return resultPath.getAbsolutePath();
}
}
public boolean isAbsolutePath(String path) {
if (path.startsWith("/")) {
return true;
}
if (path.length() > 1) {
if (CharSet.ASCII_ALPHA.contains(path.charAt(0))
&& path.charAt(1) == ':') {
return true;
}
}
return false;
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display, SWT.CLOSE | SWT.MIN);
try {
SubPlayMain main = new SubPlayMain(shell);
shell.open();
if (args.length > 0) {
main.openFile(args[0]);
} else {
main.openNew();
}
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
} catch (Exception e) {
e.printStackTrace();
log.fatal(e.getMessage());
} finally {
if (!shell.isDisposed()) {
shell.close();
}
display.dispose();
System.exit(0);
}
}
/**
*
*/
private void openNew() {
//System.out.println("opennew");
if (preference.isCreateNew()) {
execNew();
}
}
/**
* @param string
*/
public void openFile(String string) {
if(log.isDebugEnabled()){
log.debug("openFile()"+string);
}
setFile(new File(string));
execOpen();
}
public void widgetSelected(SelectionEvent event) {
Object target = event.getSource();
if (target == null) {
//maybe not happen.
log.warn("target==null");
}
//null1
else if (target == autoButton) {
//do_button1();
execAutoPlay();
//mode play
} else if (target == playButton) {
// do_button1();
execPlay();
//mode play
} else if (target == nextButton) {
// do_button1();
execNext();
//mode play
} else if (target == prevButton) {
// do_button1();
execPrev();
//mode play
} else if (target == firstButton) {
// do_button1();
execFirst();
//mode play
} else if (target == lastButton) {
// do_button1();
execLast();
//mode play
} else if (target == stopButton) {
// do_button1();
execStop();
}else if (target == slider) {
// do_button1();
execSlider();
}else if (target == markButton) {
// do_button1();
markCheck();
}else if (target == markNext) {
// do_button1();
markControler.next();
}else if (target == markPrev) {
// do_button1();
markControler.prev();
}
}
/**
*
*/
private void markCheck() {
StandardSubObject currentObject=(StandardSubObject)sublist1.get(index);
markControler.check(currentObject);
if(markControler.canMove()){
markPrev.setEnabled(true);
markNext.setEnabled(true);
}else{
markPrev.setEnabled(false);
markNext.setEnabled(false);
}
}
/**
*
*/
private void execSlider() {
int value=slider.getSelection();
if (value < sublist1.size() ) {
index=value;
}
updateCanvas();
updateTitle();
//slider moved.
updateMark();
}
private final void setReverse(boolean selection) {
preference.setReverse(selection);
if (selection) {
autoButton.setImage(new Image(Display.getCurrent(),
SubPlayMain.class.getClassLoader().getResourceAsStream(
"org/jpn/xucker/subplayer/resource/auto2.png")));
} else {
autoButton.setImage(new Image(Display.getCurrent(),
SubPlayMain.class.getClassLoader().getResourceAsStream(
"org/jpn/xucker/subplayer/resource/auto.png")));
}
}
private void execStop() {
stopper.setStopped(true);
//mode stop
modeStop();
}
/**
*
*/
public void modeStop() {
log.debug("modestop()");
autoPlay = false;
// TODO Auto-generated method stub
stopButton.setEnabled(false);
autoButton.setEnabled(true);
playButton.setEnabled(true);
nextButton.setEnabled(true);
prevButton.setEnabled(true);
firstButton.setEnabled(true);
lastButton.setEnabled(true);
slider.setEnabled(true);
slider.setSelection(index); //for auto play.
lastPosition = 0;
//re draw.
updateCanvas();
updateTitle();
updateSlider();
updateMark();
}
public void widgetDefaultSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
}
/*
* public void do_button1(){ //loadImage loadImage(datas[index]);
* //playsound playSound(datas[index]); index++; if(index>datas.length){
* index=0; } }
*/
public void execAutoPlay() {
autoPlay = true;
modePlay();
Thread t = new Thread(new Changer());
t.start();
}
public void execNext() {
if (index < sublist1.size() - 1) {
index++;
}
updateCanvas();
updateTitle();
updateSlider();
updateMark();
}
public void execPrev() {
if (index > 0) {
index--;
}
updateCanvas();
updateTitle();
updateSlider();
updateMark();
}
public void execFirst() {
index = 0;
updateCanvas();
updateTitle();
updateSlider();
updateMark();
}
public void updateMark(){
if(sublist1!=null){
if(sublist1.size()>0){
boolean bool=markControler.isMarked((StandardSubObject)sublist1.get(index));
markControler.setStatus(bool);
if(bool){
markControler.setCurrentMark(markControler.findMark((StandardSubObject)sublist1.get(index)));
}
}
if(markControler.canMove()){
markPrev.setEnabled(true);
markNext.setEnabled(true);
}
}
}
public void moveFrame(Mark mark){
StandardSubObject subs[]=(StandardSubObject[])sublist1.toArray(new StandardSubObject[sublist1.size()]);
for(int i=0;i<subs.length;i++){
if(subs[i].getStartTime()==mark.getStartTime()&&subs[i].getEndTime()==mark.getEndTime()){
index=i;
updateCanvas();
updateTitle();
updateSlider();
}
}
}
public void execLast() {
if (sublist1 != null) {
index = sublist1.size() - 1;
}
updateCanvas();
updateTitle();
updateSlider();
updateMark();
}
public void execPlay() {
log.debug("execPlay()");
modePlay();
log.debug("call thread()");
Thread thread=new Thread(this);
thread.start();
}
private void inPlay() {
log.debug("inPlay()");
if (subPlayFileXmlObject.getFirstWavFilePath() != null
&& !subPlayFileXmlObject.getFirstWavFilePath().equals("")) {
playSound((StandardSubObject) sublist1.get(index));
}
}
/**
*
*/
private void modePlay() {
stopButton.setEnabled(true);
autoButton.setEnabled(false);
playButton.setEnabled(false);
nextButton.setEnabled(false);
prevButton.setEnabled(false);
firstButton.setEnabled(false);
lastButton.setEnabled(false);
slider.setEnabled(false);
}
private void modeDisable(){
autoPlay = false;
lastPosition = 0;
stopButton.setEnabled(false);
autoButton.setEnabled(false);
playButton.setEnabled(false);
nextButton.setEnabled(false);
prevButton.setEnabled(false);
firstButton.setEnabled(false);
lastButton.setEnabled(false);
stopButton.setEnabled(false);
slider.setEnabled(false);
}
public void writePreference(File path) {
try {
BeanWriter writer = new BeanWriter(new FileWriter(path));
writer
.writeXmlDeclaration("<?xml version=\"1.0\" encoding=\"Shift_Jis\"?>");
writer.write(preference);
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IntrospectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
final public void readPreference(File file) {
if (file.exists()) {
try {
// XML‚©‚çJavaBean‚ðì¬
BeanReader reader = new BeanReader();
reader.getBindingConfiguration().setObjectStringConverter(
new ConvertUtilsObjectStringConverter());
reader.registerBeanClass(SubPlayPreferenceXmlObject.class);
preference = (SubPlayPreferenceXmlObject) reader.parse(file);
} catch (Exception e) {
preference = new SubPlayPreferenceXmlObject();
e.printStackTrace();
}
} else {
preference = new SubPlayPreferenceXmlObject();
}
}
private File getFirstSubFileBaseDir(){
return new File(parsePath(subPlayFileXmlObject
.getFirstSubFilePath())).getParentFile();
}
private File getSecondSubFileBaseDir(){
return new File(parsePath(subPlayFileXmlObject
.getSecondSubFilePath())).getParentFile();
}
public void updateCanvas() {
if (preference.isPlayFirstSub() && sublist1 != null
&& sublist1.size() > 0) {
//have image.
if(((StandardSubObject) sublist1.get(index)).getImagePath()!=null){
File file = new File(getFirstSubFileBaseDir(),
((StandardSubObject) sublist1.get(index)).getImagePath());
//loadImage(datas[index]);
imageSetter.setFile(file);
}else{
imageSetter.setFile(null);
}
if(((StandardSubObject) sublist1.get(index)).getText()!=null){
String text=((StandardSubObject) sublist1.get(index)).getText();
canvas.setText(text);
}else{
canvas.setText(null);
}
imageSetter.setImageCanvas(canvas);
shell.getDisplay().syncExec(imageSetter);
} else {
canvas.setText(null);
imageSetter.setImageCanvas(canvas);
imageSetter.setFile(null);
shell.getDisplay().syncExec(imageSetter);
}
//secondSub
if (sublist1 != null && sublist1.size() > 0) {
StandardSubObject sub = findSecondSub((StandardSubObject)sublist1.get(index));
if (sub != null && preference.isPlaySecondSub()) {
if(sub.getImagePath()!=null){
File secondFile = new File(getSecondSubFileBaseDir(), sub
.getImagePath());
//System.out.println("second:"+secondFile);
imageSetter.setImageCanvas(canvas2);
imageSetter.setFile(secondFile);
}else{
imageSetter.setImageCanvas(canvas2);
imageSetter.setFile(null);
}
canvas2.setText(sub.getText());
shell.getDisplay().syncExec(imageSetter);
} else {
canvas2.setText(null);
imageSetter.setImageCanvas(canvas2);
imageSetter.setFile(null);
shell.getDisplay().syncExec(imageSetter);
}
} else {
canvas2.setText(null);
imageSetter.setImageCanvas(canvas2);
imageSetter.setFile(null);
shell.getDisplay().syncExec(imageSetter);
}
}
private StandardSubObject findSecondSub(StandardSubObject data) {
if (sublist2 == null) {
return null;
}
StandardSubObject result = null;
long mutch = 0;
for (int i = 0; i < sublist2.size(); i++) {
long count = SubUtils.countContainTime(data,(StandardSubObject)sublist2.get(i));
if (count > mutch) {
result = (StandardSubObject)sublist2.get(i);
mutch = count;
}
if (mutch != 0 && count == 0) {
return result;
}
}
return result;
}
public class Changer implements Runnable {
public void run() {
// TODO support loop
while (autoPlay) {
//loadImage
updateCanvas();
shell.getDisplay().syncExec(titleUpdater);
//playsound
//maybe should change audio valid.
if (preference.isPlayFirstAudio()) {
inPlay();
}
int direction = 1;
if (preference.isReverse()) {
direction = -1;
}
index += direction;
if (index < 0 || index >= sublist1.size()) {
//updateCanvas();
//shell.getDisplay().syncExec(titleUpdater);
if (preference.isRepeat()) {
if (index < 0) {
index = sublist1.size() - 1;
} else {
index = 0;
}
lastPosition = 0;
} else {
if (index < 0) {
index = 0;
} else {
index = sublist1.size() - 1;
}
break;
}
}
try {
if (preference.getWaittime() > 0) {
Thread.sleep(preference.getWaittime());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
MethodCommand modeStopCommand = new MethodCommand(self, "modeStop",
null);
shell.getDisplay().syncExec(modeStopCommand);
//modeStop();
}
/**
* @param data
* @return
*/
}
/**
* @param data
*/
private void playSound(StandardSubObject data) {
log.debug("playsound()");
stopper.setStopped(false);
//maybe start thread.
try {
int margin = preference.getMargintime();
/*BufferedInputStream finput = new BufferedInputStream(new FileInputStream(new File(
parsePath(subPlayFileXmlObject.getFirstWavFilePath()))),10240);
*/
FileInputStream finput = new FileInputStream(new File(
parsePath(subPlayFileXmlObject.getFirstWavFilePath())));
long start = Math.max(data.getStartTime()
- margin, 0);
long end = data.getEndTime() + margin;
//System.out.println("playSound:["+data.getFileName()+"]
// "+SubDataList.toTimeString(start)+"-"+SubDataList.toTimeString(end));
if(subPlayFileXmlObject.getFirstWavFilePath().toLowerCase().endsWith(".wav")){
audioPlayer = new JavaSoundAudioPlayer();
audioPlayer.setStopper(stopper);
audioPlayer.play(finput, Math.max(lastPosition, start), end);
}else if(subPlayFileXmlObject.getFirstWavFilePath().toLowerCase().endsWith(".mp3")){
audioPlayer = new MP3JavaSoundAudioPlayer();
audioPlayer.setStopper(stopper);
audioPlayer.play(new File(subPlayFileXmlObject.getFirstWavFilePath()), Math.max(lastPosition, start), end);
}
if (autoPlay && !preference.isReverse()) {
lastPosition = end;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param data
*/
/*
* private void loadImage(SubData data) { loadImage(new
* File(list.getBaseDir(),data.getFileName())); }
*/
private void loadImage(ImageCanvas imageCanvas, File imagePath) {
try {
if (imagePath != null) {
Image img = new Image(shell.getDisplay(), new FileInputStream(
imagePath));
imageCanvas.setImage(img);
imageCanvas.redraw();
} else {
imageCanvas.setImage(null);
imageCanvas.redraw();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public class MethodCommand implements Runnable {
private Object object;
/**
* @param self
* @param string
* @param object2
*/
public MethodCommand(Object object, String method, Object[] args) {
this.object = object;
this.methodName = method;
this.args = args;
}
public Object[] getArgs() {
return args;
}
public void setArgs(Object[] args) {
this.args = args;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
private String methodName;
private Object[] args;
public void run() {
try {
MethodUtils.invokeMethod(object, methodName, args);
// System.out.println("call stop");
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class TitleUpdater implements Runnable {
public void run() {
updateTitle();
}
}
public class ImageSetter implements Runnable {
private File file;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
private ImageCanvas imageCanvas;
public ImageCanvas getImageCanvas() {
return imageCanvas;
}
public void setImageCanvas(ImageCanvas imageCanvas) {
this.imageCanvas = imageCanvas;
}
public ImageSetter() {
}/*
* public ImageSetter(File file,ImageCanvas imageCanvas){
* this.file=file; this.imageCanvas=imageCanvas; }
*/
/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
public void run() {
loadImage(imageCanvas, file);
}
}
public void execHomepage() {
Program program = Program.findProgram("html");
if (program != null) {
program.execute(HOMEPAGE_URL);
}
}
public void execVersion() {
MessageBox box = new MessageBox(shell, SWT.OK | SWT.ICON_INFORMATION);
box.setMessage(APP_NAME + " v" + version + "\r\n\r\n"
+ "License CPL or Apache2.0\r\n (c)ƒAƒbƒL[ 2004\r\n"
+ HOMEPAGE_URL);
//int result=box.open();
//never use result int,for PMD
box.open();
}
/*
* (non-Javadoc)
*
* @see org.jpn.xucker.commons.util.AbstractBasicFileApplication#execOpen()
*/
protected void execOpen() {
if (subshell != null && !subshell.isDisposed()) {
subshell.close();
}
subPlayFileXmlObject = null;
try {
if(getFile().exists()){
// XML‚©‚çJavaBean‚ðì¬
BeanReader reader = new BeanReader();
reader.registerBeanClass(SubPlayFileXmlObject.class);
subPlayFileXmlObject = (SubPlayFileXmlObject) reader
.parse(getFile());
updateDatas();
}else{
log.fatal("file not found "+getFile().getAbsolutePath());
}
} catch (Exception e) {
e.printStackTrace();
}
if (subPlayFileXmlObject == null) {
setFile(null);
sublist1=null;
sublist2=null;
modeDisable();
}else{
// load marks
markControler.init();
Mark marks[]=subPlayFileXmlObject.getMarks();
if(marks!=null){
for(int i=0;i<marks.length;i++){
for(int j=0;j<sublist1.size();j++){
StandardSubObject sub=(StandardSubObject)sublist1.get(j);
if(marks[i].isMutch(sub)){
markControler.addMark(marks[i]);
}
}
}
}
}
updateMark();
}
private void errorInvalidXml(){
MessageBox box = new MessageBox(shell, SWT.OK | SWT.ICON_WARNING);
box.setMessage("XML‚ÌŒ`Ž®‚ªˆá‚¢‚Ü‚·B");
//int result=box.open();
//never use result int,for PMD
box.open();
}
/*
* (non-Javadoc)
*
* @see org.jpn.xucker.commons.util.AbstractBasicFileApplication#execSave()
*/
protected void execSave() {
try {
//synch mark.
subPlayFileXmlObject.setMarks(markControler.getMarkArray());
BeanWriter writer = new BeanWriter(new FileWriter(getFile()));
writer
.writeXmlDeclaration("<?xml version=\"1.0\" encoding=\"Shift_Jis\"?>");
writer.write(subPlayFileXmlObject);
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IntrospectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* @see org.jpn.xucker.commons.util.AbstractBasicFileApplication#updateTitle()
*/
protected void updateTitle() {
// TODO Auto-generated method stub
String label = "";
File file = getFile();
if (file != null) {
label = file.getName() + " ";
}
if (totalTime != null) {
label += "[" + totalTime + "]" + " ";
}
if (sublist1 != null) {
label += (index + 1) + "/" + sublist1.size();
}
if (isNeedSave()) {
label = "* " + label;
}
shell.setText(label);
}
/*
* (non-Javadoc)
*
* @see org.jpn.xucker.commons.util.AbstractBasicFileApplication#execNew()
*/
final protected void execNew() {
subPlayFileXmlObject = new SubPlayFileXmlObject();
updateDatas();
modeDisable();
// TODO Auto-generated method stub
if (subshell == null || subshell.isDisposed()) {
subshell = new Shell(shell);
SubPlayFileXmlDialog dialog = new SubPlayFileXmlDialog(this,
subshell);
subshell.open();
} else {
subshell.setActive();
}
}
/*
* (non-Javadoc)
*
* @see org.jpn.xucker.commons.util.AbstractBasicFileApplication#execExit()
*/
public void execExit() {
if(log.isDebugEnabled()){
log.debug("execExit()");
}
shell.close();
}
public void edit() {
if (subPlayFileXmlObject != null) {
// TODO Auto-generated method stub
if (subshell == null || subshell.isDisposed()) {
subshell = new Shell(shell);
SubPlayFileXmlDialog dialog = new SubPlayFileXmlDialog(this,
subshell);
try {
BeanUtils.copyProperties(dialog, subPlayFileXmlObject);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
subshell.open();
} else {
subshell.setActive();
}
}
}
/**
*
*/
private void savePreference() {
writePreference(new File(preferencePath));
preferenceChanged = false;
}
public class MenuEventExecuter {
public void do_newz(MenuItemContainer menuItemContainer) {
newFile();
}
public void do_open(MenuItemContainer menuItemContainer) {
if (!stopButton.isEnabled()) {
openFile();
}
}
public void do_save(MenuItemContainer menuItemContainer) {
if (!stopButton.isEnabled()) {
saveFile();
}
}
public void do_saveAs(MenuItemContainer menuItemContainer) {
if (!stopButton.isEnabled()) {
saveAsFile();
}
}
public void do_edit(MenuItemContainer menuItemContainer) {
if (!stopButton.isEnabled()) {
edit();
}
}
public void do_export(MenuItemContainer menuItemContainer) {
}
public void do_exit(MenuItemContainer menuItemContainer) {
execExit();
}
public void do_autoplay(MenuItemContainer menuItemContainer) {
if (!stopButton.isEnabled()) {
execAutoPlay();
}
}
public void do_play(MenuItemContainer menuItemContainer) {
if (!stopButton.isEnabled()) {
execPlay();
}
}
public void do_stop(MenuItemContainer menuItemContainer) {
if (stopButton.isEnabled()) {
execStop();
}
}
public void do_prev(MenuItemContainer menuItemContainer) {
if (!stopButton.isEnabled()) {
execPrev();
}
}
public void do_next(MenuItemContainer menuItemContainer) {
if (!stopButton.isEnabled()) {
execNext();
}
}
public void do_first(MenuItemContainer menuItemContainer) {
if (!stopButton.isEnabled()) {
execFirst();
}
}
public void do_last(MenuItemContainer menuItemContainer) {
if (!stopButton.isEnabled()) {
execLast();
}
}
public void do_checkStartNew(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setCreateNew(menuItemContainer.getMenuItem(
"checkStartNew").getSelection());
}
public void do_checkPlaySound(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setPlayFirstAudio(menuItemContainer.getMenuItem(
"checkPlaySound").getSelection());
}
public void do_checkPlayFirstSub(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setPlayFirstSub(menuItemContainer.getMenuItem(
"checkPlayFirstSub").getSelection());
updateCanvas();
}
public void do_checkPlaySecondSub(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setPlaySecondSub(menuItemContainer.getMenuItem(
"checkPlaySecondSub").getSelection());
updateCanvas();
}
public void do_checkRepeat(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setRepeat(menuItemContainer.getMenuItem("checkRepeat")
.getSelection());
}
public void do_checkReverse(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
setReverse(menuItemContainer.getMenuItem("checkReverse")
.getSelection());
}
/**
* @param selection
*/
public void do_w0(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setWaittime(0);
}
public void do_w1(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setWaittime(1 * 1000);
}
public void do_w3(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setWaittime(3 * 1000);
}
public void do_w10(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setWaittime(10 * 1000);
}
public void do_w15(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setWaittime(15 * 1000);
}
public void do_w30(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setWaittime(30 * 1000);
}
public void do_w45(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setWaittime(45 * 1000);
}
public void do_w60(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setWaittime(60 * 1000);
}
public void do_m0(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setMargintime(0);
}
public void do_m1p5(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setMargintime(150);
}
public void do_m2p5(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setMargintime(250);
}
public void do_m1(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setMargintime(100);
}
public void do_m2(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setMargintime(200);
}
public void do_m3(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setMargintime(300);
}
public void do_m4(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setMargintime(400);
}
public void do_m5(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setMargintime(500);
}
public void do_m10(MenuItemContainer menuItemContainer) {
preferenceChanged = true;
preference.setMargintime(1000);
}
public void do_about(MenuItemContainer menuItemContainer) {
execVersion();
}
public void do_homepage(MenuItemContainer menuItemContainer) {
execHomepage();
}
}
public SubPlayFileXmlObject getSubPlayFileXmlObject() {
return subPlayFileXmlObject;
}
/*
* (non-Javadoc)
*
* @see org.jpn.xucker.subplayer.SubPlayFileUpdater#update(org.jpn.xucker.subplayer.SubPlayFileXmlDialog)
*/
public void update(SubPlayFileXmlDialog dialog) {
//new version
/*
* SubPlayFileXmlObject xmlObject=updater.getSubPlayFileXmlObject();
* xmlObject.setFirstSubFilePath(firstSub.getAbsoluteFilePath());
* xmlObject.setSecondSubFilePath(secondSub.getAbsoluteFilePath());
* xmlObject.setFirstWavFilePath(firstWav.getAbsoluteFilePath());
*/
SubPlayFileXmlObject tmpObject = new SubPlayFileXmlObject();
try {
BeanUtils.copyProperties(tmpObject, dialog);
//System.out.println(tmpObject.getFirstSubFilePath());
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!subPlayFileXmlObject.equals(tmpObject)) {
// System.out.println("need save");
setNeedSave(true);
try {
BeanUtils.copyProperties(subPlayFileXmlObject, tmpObject);
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InvocationTargetException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
//edit version
updateDatas();
}
public void updateDatas() {
setUpSubDatas();
updateCanvas();
updateTitle();
updateSlider();
if (sublist1 != null && sublist1.size() > 0) {
modeStop();
if (!preference.isReverse()) {
index = 0;
} else {
index = sublist1.size() - 1;
}
}else{
modeDisable();
}
}
/**
*
*/
private void updateSlider() {
if(sublist1!=null && sublist1.size()>0){
slider.setMaximum(sublist1.size());
slider.setSelection(index);
slider.setEnabled(true);
}else{
slider.setEnabled(false);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.ShellListener#shellActivated(org.eclipse.swt.events.ShellEvent)
*/
public void shellActivated(ShellEvent e) {
// TODO Auto-generated method stub
}
public void shellClosed(ShellEvent event) {
//System.out.println("shell closed");
if (isNeedSave()) {
if (isNeedSave()) {
int result = askSave();
if (result == YES) {
if (!saveFile()) {
event.doit = false;
return; //cancel
}
} else if (result == CANCEL) {
event.doit = false;
return;
}
}
}
event.doit = true;
/* do finally */
stopper.setStopped(true);
autoPlay = false;
if (preferenceChanged) {
//
//System.out.println("save preference");
savePreference();
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.ShellListener#shellDeactivated(org.eclipse.swt.events.ShellEvent)
*/
public void shellDeactivated(ShellEvent e) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.ShellListener#shellDeiconified(org.eclipse.swt.events.ShellEvent)
*/
public void shellDeiconified(ShellEvent e) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.ShellListener#shellIconified(org.eclipse.swt.events.ShellEvent)
*/
public void shellIconified(ShellEvent e) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
log.debug("run");
inPlay();
shell.getDisplay().syncExec(modeStop);
}
ModeStop modeStop=new ModeStop();
public class ModeStop implements Runnable{
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
modeStop();
}
}
}
|