blob: 4a03356eab66b611810926e1f536e554623f847f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 2008 IBM Corporation and Others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Daisuke SATO - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.ai.internal.audio.description;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Locale;
import org.eclipse.actf.ai.audio.description.IMetadataProvider;
import org.eclipse.actf.ai.audio.description.impl.MetadataManager;
import org.eclipse.actf.ai.audio.description.impl.MetadataProviderImpl;
import org.eclipse.actf.ai.audio.description.views.DescriptionView;
import org.eclipse.actf.ai.navigator.IMediaControl;
import org.eclipse.actf.ai.tts.AbstractUIPluginForTTS;
import org.eclipse.actf.ai.tts.ITTSEngine;
import org.eclipse.actf.ai.tts.TTSRegistry;
import org.eclipse.actf.ai.voice.IVoiceEventListener;
import org.eclipse.actf.ai.xmlstore.IXMLInfo;
import org.eclipse.actf.ai.xmlstore.IXMLSelector;
import org.eclipse.actf.ai.xmlstore.IXMLStore;
import org.eclipse.actf.ai.xmlstore.IXMLStoreService;
import org.eclipse.actf.ai.xmlstore.XMLStoreServiceUtil;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.osgi.framework.BundleContext;
/**
* The activator class controls the plug-in life cycle. And this provides
* information of audio description and TTS function to speak the description.
*/
public class DescriptionPlugin extends AbstractUIPluginForTTS implements
IPropertyChangeListener, IVoiceEventListener {
/**
* The plug-in ID.
*/
public static final String PLUGIN_ID = "org.eclipse.actf.ai.audio.description";
/**
* The preferences ID of TTS engine for audio description.
*/
public static final String PREF_ENGINE = "AudioDescriptionTTSEngine";
/*
* The shared instance.
*/
private static DescriptionPlugin plugin;
/*
* The switch weather enable or disable audio description speaking.
*/
private boolean enable = true;
/*
* The current active audio description manager. If the target page has no
* audio description then this should be null.
*/
private IMetadataProvider activeProvider;
/*
* The instance of TTS engine for audio description.
*/
private ITTSEngine engine;
/**
* The constructor
*/
public DescriptionPlugin() {
plugin = this;
}
private IVoiceEventListener listener;
/**
* @param url
* The URL string which determines audio description files in the
* XMLStore
* @see org.eclipse.actf.ai.xmlstore.XMLStoreServiceUtil#getXMLStoreService
* @return metadata information
*/
public IMetadataProvider getMetadata(String url) {
IXMLStoreService service = XMLStoreServiceUtil
.getXMLStoreService();
IXMLStore store = service.getRootStore();
IXMLSelector selector1 = service.getSelectorWithDocElem("puits",
"urn:puits");
System.out.println(url);
IXMLSelector selector2 = service.getSelectorWithURI(url);
store = store.specify(selector1);
store = store.specify(selector2);
ArrayList<IXMLInfo> list = new ArrayList<IXMLInfo>();
for (Iterator<IXMLInfo> i = store.getInfoIterator(); i.hasNext();) {
list.add(i.next());
}
if (list.size() == 0)
return null;
MetadataProviderImpl provider = new MetadataProviderImpl(list);
if (provider != null) {
provider.reload();
provider.setLocale(Locale.getDefault());
provider.prepareMetadata();
}
return provider;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
*/
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
initialize();
}
/**
* The initializer of the plug-in.
*/
private void initialize() {
engine = newTTSEngine();
DescriptionPlugin.getDefault().addPropertyChangeListener(this);
}
/**
* @return TTS engine using the preference value
* @see #engine
*/
private ITTSEngine newTTSEngine() {
ITTSEngine engine;
String e = DescriptionPlugin.getDefault().getPreferenceStore()
.getString(DescriptionPlugin.PREF_ENGINE);
// TODO
if (e.equals("org.eclipse.actf.ai.screenreader.jaws"))
return null;
engine = TTSRegistry.createTTSEngine(e);
if (engine != null){
engine.setSpeed(50);
engine.setEventListener(this);
}
return engine;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.actf.ai.voice.internal.AbstractPreferenceUIPlugin#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent event) {
if (DescriptionPlugin.PREF_ENGINE.equals(event.getProperty())) {
if (null != engine) {
engine.stop();
engine.dispose();
engine = newTTSEngine();
}
}
}
/**
* @return instance of TTS engine.
*/
public ITTSEngine getTTSEngine() {
return engine;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
*/
@Override
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
}
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static DescriptionPlugin getDefault() {
return plugin;
}
/**
* The instance of the view.
*/
private DescriptionView view;
/**
* @param view
* Keep the instance of the view to share the instance.
*/
public void setDescriptionView(DescriptionView view) {
this.view = view;
}
/**
* @return shared instance of the view.
*/
public DescriptionView getDescriptionView() {
return view;
}
/**
* @param flag
* The switch to enable/disable
* @return The status of the audio description plug-in
* @see IMediaControl.STATUS_NOT_AVAILABLE
* @see IMediaControl.STATUS_ON
* @see IMediaControl.STATUS_OFF
*/
public int setEnable(boolean flag) {
if (!isAvailable()) {
enable = false;
return IMediaControl.STATUS_NOT_AVAILABLE;
}
enable = flag;
getDescriptionView().setEnable(enable);
if (enable) {
return IMediaControl.STATUS_ON;
} else {
return IMediaControl.STATUS_OFF;
}
}
/**
* @return The availability of the plug-in. If there is no active metadata
* manager then this returns false.
* @see #setActiveMetadataProvider(MetadataManager)
*/
public boolean isAvailable() {
if (activeProvider == null)
return false;
return activeProvider.hasMetadata();
}
/**
* @return The availability of TTS engine.
*/
public boolean canSpeak() {
return engine != null;
}
/**
* @param str
* The string to be spoken.
*/
public void speak(String str, int speed, String gender) {
if (engine != null){
engine.setEventListener(this);
engine.setGender(gender);
engine.setSpeed(speed);
engine.speak(str, ITTSEngine.TTSFLAG_FLUSH, -1);
}
}
public void addSpeakIndex(int index){
if(engine != null){
engine.speak("",ITTSEngine.TTSFLAG_DEFAULT,index);
}
}
public void setVoiceEventListener(IVoiceEventListener listener){
this.listener = listener;
}
/**
* Toggle the enable and disable of the plug-in.
*
* @return The status of the plug-in.
* @see #setEnable(boolean)
*/
public int toggleEnable() {
return setEnable(!getEnable());
}
/**
* @return The value of enable/disable
*/
public boolean getEnable() {
return enable;
}
/**
* @param manager
* The active metadata provider to know the metadata avilability
*/
public void setActiveMetadataProvider(IMetadataProvider provider) {
this.activeProvider = provider;
}
/**
* @param key
* The key for the resource string.
* @return The resource string.
*/
public static String getString(String key) {
return Platform.getResourceString(getDefault().getBundle(), key);
}
public void indexReceived(int index) {
if(listener!=null){
listener.indexReceived(index);
}
}
}