Modified all providers to separate them between factory and factory manager. This will make plugin system easier. Also, made hunspell register manually as well.

Originally committed to SVN as r1946.
This commit is contained in:
Rodrigo Braz Monteiro 2008-03-07 02:32:29 +00:00
parent 6bdee2a765
commit 974efa126b
29 changed files with 325 additions and 135 deletions

View File

@ -878,15 +878,15 @@ void AudioDisplay::SetFile(wxString file) {
is_dummy = true; is_dummy = true;
provider = new DummyAudioProvider(150*60*1000, true); // 150 minutes noise provider = new DummyAudioProvider(150*60*1000, true); // 150 minutes noise
} else { } else {
provider = AudioProviderFactory::GetAudioProvider(file); provider = AudioProviderFactoryManager::GetAudioProvider(file);
} }
#else #else
provider = AudioProviderFactory::GetAudioProvider(file); provider = AudioProviderFactoryManager::GetAudioProvider(file);
#endif #endif
// Get player // Get player
wxLogDebug(_T("AudioDisplay::SetFile: get audio player")); wxLogDebug(_T("AudioDisplay::SetFile: get audio player"));
player = AudioPlayerFactory::GetAudioPlayer(); player = AudioPlayerFactoryManager::GetAudioPlayer();
player->SetDisplayTimer(&UpdateTimer); player->SetDisplayTimer(&UpdateTimer);
player->SetProvider(provider); player->SetProvider(provider);
player->OpenStream(); player->OpenStream();
@ -1022,12 +1022,12 @@ void AudioDisplay::Play(int start,int end) {
try { try {
// Get provider // Get provider
if (!VideoContext::Get()->videoName.StartsWith(_T("?dummy"))) if (!VideoContext::Get()->videoName.StartsWith(_T("?dummy")))
provider = AudioProviderFactory::GetAudioProvider(VideoContext::Get()->videoName, 0); provider = AudioProviderFactoryManager::GetAudioProvider(VideoContext::Get()->videoName, 0);
else else
return; return;
// Get player // Get player
player = AudioPlayerFactory::GetAudioPlayer(); player = AudioPlayerFactoryManager::GetAudioPlayer();
player->SetDisplayTimer(&UpdateTimer); player->SetDisplayTimer(&UpdateTimer);
player->SetProvider(provider); player->SetProvider(provider);
player->OpenStream(); player->OpenStream();

View File

@ -126,7 +126,7 @@ void AudioPlayer::OnStopAudio(wxCommandEvent &event) {
////////////// //////////////
// Get player // Get player
AudioPlayer* AudioPlayerFactory::GetAudioPlayer() { AudioPlayer* AudioPlayerFactoryManager::GetAudioPlayer() {
// List of providers // List of providers
wxArrayString list = GetFactoryList(Options.AsText(_T("Audio player"))); wxArrayString list = GetFactoryList(Options.AsText(_T("Audio player")));
@ -152,26 +152,26 @@ AudioPlayer* AudioPlayerFactory::GetAudioPlayer() {
////////////////////////// //////////////////////////
// Register all factories // Register all factories
void AudioPlayerFactory::RegisterProviders() { void AudioPlayerFactoryManager::RegisterProviders() {
#ifdef WITH_ALSA #ifdef WITH_ALSA
new AlsaPlayerFactory(); RegisterFactory(new AlsaPlayerFactory(),_T("ALSA"));
#endif #endif
#ifdef WITH_DIRECTSOUND #ifdef WITH_DIRECTSOUND
new DirectSoundPlayerFactory(); RegisterFactory(new DirectSoundPlayerFactory(),_T("DirectSound"));
#endif #endif
#ifdef WITH_OPENAL #ifdef WITH_OPENAL
new OpenALPlayerFactory(); RegisterFactory(new OpenALPlayerFactory(),_T("OpenAL"));
#endif #endif
#ifdef WITH_PORTAUDIO #ifdef WITH_PORTAUDIO
new PortAudioPlayerFactory(); RegisterFactory(new PortAudioPlayerFactory(),_T("PortAudio"));
#endif #endif
#ifdef WITH_PULSEAUDIO #ifdef WITH_PULSEAUDIO
new PulseAudioPlayerFactory(); RegisterFactory(new PulseAudioPlayerFactory(),_T("PulseAudio"));
#endif #endif
} }
////////// //////////
// Static // Static
template <class AudioPlayerFactory> std::map<wxString,AudioPlayerFactory*>* AegisubFactory<AudioPlayerFactory>::factories=NULL; template <class AudioPlayerFactory> std::map<wxString,AudioPlayerFactory*>* FactoryManager<AudioPlayerFactory>::factories=NULL;

View File

@ -44,7 +44,7 @@
#include <wx/timer.h> #include <wx/timer.h>
#include <wx/thread.h> #include <wx/thread.h>
#include <stdint.h> #include <stdint.h>
#include "factory.h" #include "factory_manager.h"
////////////// //////////////
@ -96,18 +96,22 @@ public:
/////////// ///////////
// Factory // Factory
class AudioPlayerFactory : public AegisubFactory<AudioPlayerFactory> { class AudioPlayerFactory {
protected: public:
virtual AudioPlayer *CreatePlayer()=0; virtual AudioPlayer *CreatePlayer()=0;
AudioPlayerFactory(wxString name) { RegisterFactory(name); } };
///////////////////
// Factory Manager
class AudioPlayerFactoryManager : public FactoryManager<AudioPlayerFactory> {
public: public:
virtual ~AudioPlayerFactory() {}
static AudioPlayer *GetAudioPlayer(); static AudioPlayer *GetAudioPlayer();
static void RegisterProviders(); static void RegisterProviders();
}; };
///////// /////////
// Event // Event
DECLARE_EVENT_TYPE(wxEVT_STOP_AUDIO, -1) DECLARE_EVENT_TYPE(wxEVT_STOP_AUDIO, -1)

View File

@ -137,7 +137,6 @@ public:
class DirectSoundPlayerFactory : public AudioPlayerFactory { class DirectSoundPlayerFactory : public AudioPlayerFactory {
public: public:
AudioPlayer *CreatePlayer() { return new DirectSoundPlayer(); } AudioPlayer *CreatePlayer() { return new DirectSoundPlayer(); }
DirectSoundPlayerFactory() : AudioPlayerFactory(_T("dsound")) {}
}; };
#endif #endif

View File

@ -191,7 +191,7 @@ void AudioProvider::GetAudioWithVolume(void *buf, int64_t start, int64_t count,
//////////////// ////////////////
// Get provider // Get provider
AudioProvider *AudioProviderFactory::GetAudioProvider(wxString filename, int cache) { AudioProvider *AudioProviderFactoryManager::GetAudioProvider(wxString filename, int cache) {
// Prepare provider // Prepare provider
AudioProvider *provider = NULL; AudioProvider *provider = NULL;
@ -254,16 +254,16 @@ AudioProvider *AudioProviderFactory::GetAudioProvider(wxString filename, int cac
/////////////////////////// ///////////////////////////
// Register all providers // Register all providers
void AudioProviderFactory::RegisterProviders() { void AudioProviderFactoryManager::RegisterProviders() {
#ifdef WITH_AVISYNTH #ifdef WITH_AVISYNTH
new AvisynthAudioProviderFactory(); RegisterFactory(new AvisynthAudioProviderFactory(),_T("Avisynth"));
#endif #endif
#ifdef WITH_FFMPEG #ifdef WITH_FFMPEG
new LAVCAudioProviderFactory(); RegisterFactory(new LAVCAudioProviderFactory(),_T("FFMPEG"));
#endif #endif
} }
////////// //////////
// Static // Static
template <class AudioProviderFactory> std::map<wxString,AudioProviderFactory*>* AegisubFactory<AudioProviderFactory>::factories=NULL; template <class AudioProviderFactory> std::map<wxString,AudioProviderFactory*>* FactoryManager<AudioProviderFactory>::factories=NULL;

View File

@ -41,7 +41,7 @@
// Headers // Headers
#include <wx/wxprec.h> #include <wx/wxprec.h>
#include <stdint.h> #include <stdint.h>
#include "factory.h" #include "factory_manager.h"
////////////// //////////////
@ -84,13 +84,16 @@ public:
/////////// ///////////
// Factory // Factory
class AudioProviderFactory : public AegisubFactory<AudioProviderFactory> { class AudioProviderFactory {
protected:
virtual AudioProvider *CreateProvider(wxString filename)=0;
AudioProviderFactory(wxString name) { RegisterFactory(name); }
public: public:
virtual ~AudioProviderFactory() {} virtual AudioProvider *CreateProvider(wxString filename)=0;
static AudioProvider *GetAudioProvider(wxString filename, int cache=-1); };
static void RegisterProviders();
///////////////////
// Factory Manager
class AudioProviderFactoryManager : public FactoryManager<AudioProviderFactory> {
public:
static void RegisterProviders();
static AudioProvider *GetAudioProvider(wxString filename, int cache=-1);
}; };

View File

@ -71,7 +71,6 @@ public:
class AvisynthAudioProviderFactory : public AudioProviderFactory { class AvisynthAudioProviderFactory : public AudioProviderFactory {
public: public:
AudioProvider *CreateProvider(wxString file) { return new AvisynthAudioProvider(file); } AudioProvider *CreateProvider(wxString file) { return new AvisynthAudioProvider(file); }
AvisynthAudioProviderFactory() : AudioProviderFactory(_T("avisynth")) {}
}; };
#endif #endif

View File

@ -390,12 +390,12 @@ DialogOptions::DialogOptions(wxWindow *parent)
// Second sizer // Second sizer
videoSizer4->Add(new wxStaticText(videoPage,-1,_("Video provider: ")),0,wxALIGN_CENTER_VERTICAL | wxRIGHT,10); videoSizer4->Add(new wxStaticText(videoPage,-1,_("Video provider: ")),0,wxALIGN_CENTER_VERTICAL | wxRIGHT,10);
wxArrayString choices4 = VideoProviderFactory::GetFactoryList(); wxArrayString choices4 = VideoProviderFactoryManager::GetFactoryList();
control = new wxComboBox(videoPage,-1,_T(""),wxDefaultPosition,wxDefaultSize,choices4,wxCB_DROPDOWN | wxCB_READONLY); control = new wxComboBox(videoPage,-1,_T(""),wxDefaultPosition,wxDefaultSize,choices4,wxCB_DROPDOWN | wxCB_READONLY);
Bind(control,_T("Video provider"),1); Bind(control,_T("Video provider"),1);
videoSizer4->Add(control,1,wxEXPAND); videoSizer4->Add(control,1,wxEXPAND);
videoSizer4->Add(new wxStaticText(videoPage,-1,_("Subtitles provider: ")),0,wxALIGN_CENTER_VERTICAL | wxRIGHT,10); videoSizer4->Add(new wxStaticText(videoPage,-1,_("Subtitles provider: ")),0,wxALIGN_CENTER_VERTICAL | wxRIGHT,10);
wxArrayString choices5 = SubtitlesProviderFactory::GetFactoryList(); wxArrayString choices5 = SubtitlesProviderFactoryManager::GetFactoryList();
control = new wxComboBox(videoPage,-1,_T(""),wxDefaultPosition,wxDefaultSize,choices5,wxCB_DROPDOWN | wxCB_READONLY); control = new wxComboBox(videoPage,-1,_T(""),wxDefaultPosition,wxDefaultSize,choices5,wxCB_DROPDOWN | wxCB_READONLY);
Bind(control,_T("Subtitles provider"),1); Bind(control,_T("Subtitles provider"),1);
videoSizer4->Add(control,1,wxEXPAND); videoSizer4->Add(control,1,wxEXPAND);
@ -529,8 +529,8 @@ DialogOptions::DialogOptions(wxWindow *parent)
wxString choices3[3] = { _T("ConvertToMono"), _T("GetLeftChannel"), _T("GetRightChannel") }; wxString choices3[3] = { _T("ConvertToMono"), _T("GetLeftChannel"), _T("GetRightChannel") };
#endif #endif
AddComboControl(audioAdvPage,audioAdvSizer1,_("Audio provider"),_T("Audio Provider"),AudioProviderFactory::GetFactoryList(),true,1); AddComboControl(audioAdvPage,audioAdvSizer1,_("Audio provider"),_T("Audio Provider"),AudioProviderFactoryManager::GetFactoryList(),true,1);
AddComboControl(audioAdvPage,audioAdvSizer1,_("Audio player"),_T("Audio Player"),AudioPlayerFactory::GetFactoryList(),true,1); AddComboControl(audioAdvPage,audioAdvSizer1,_("Audio player"),_T("Audio Player"),AudioPlayerFactoryManager::GetFactoryList(),true,1);
AddComboControl(audioAdvPage,audioAdvSizer1,_("Cache type"),_T("Audio Cache"),wxArrayString(3,choices2),true); AddComboControl(audioAdvPage,audioAdvSizer1,_("Cache type"),_T("Audio Cache"),wxArrayString(3,choices2),true);
#ifdef WIN32 #ifdef WIN32
AddComboControl(audioAdvPage,audioAdvSizer1,_("Avisynth down-mixer"),_T("Audio Downmixer"),wxArrayString(3,choices3),false); AddComboControl(audioAdvPage,audioAdvSizer1,_("Avisynth down-mixer"),_T("Audio Downmixer"),wxArrayString(3,choices3),false);

View File

@ -70,7 +70,7 @@ DialogSpellChecker::DialogSpellChecker(wxFrame *parent)
SetIcon(BitmapToIcon(wxBITMAP(spellcheck_toolbutton))); SetIcon(BitmapToIcon(wxBITMAP(spellcheck_toolbutton)));
// Get spell checker // Get spell checker
spellchecker = SpellCheckerFactory::GetSpellChecker(); spellchecker = SpellCheckerFactoryManager::GetSpellChecker();
if (!spellchecker) { if (!spellchecker) {
wxMessageBox(_T("No spellchecker available."),_T("Error"),wxICON_ERROR); wxMessageBox(_T("No spellchecker available."),_T("Error"),wxICON_ERROR);
Destroy(); Destroy();

View File

@ -299,7 +299,7 @@ DialogStyleEditor::DialogStyleEditor (wxWindow *parent, AssStyle *_style, Subtit
// Preview // Preview
SubsPreview = NULL; SubsPreview = NULL;
PreviewText = NULL; PreviewText = NULL;
if (SubtitlesProviderFactory::ProviderAvailable()) { if (SubtitlesProviderFactoryManager::ProviderAvailable()) {
PreviewText = new wxTextCtrl(this,TEXT_PREVIEW,Options.AsText(_T("Style editor preview text"))); PreviewText = new wxTextCtrl(this,TEXT_PREVIEW,Options.AsText(_T("Style editor preview text")));
previewButton = new ColourButton(this,BUTTON_PREVIEW_COLOR,wxSize(45,16),Options.AsColour(_T("Style editor preview background"))); previewButton = new ColourButton(this,BUTTON_PREVIEW_COLOR,wxSize(45,16),Options.AsColour(_T("Style editor preview background")));
SubsPreview = new SubtitlesPreview(this,-1,wxDefaultPosition,wxSize(100,60),wxSUNKEN_BORDER,Options.AsColour(_T("Style editor preview background"))); SubsPreview = new SubtitlesPreview(this,-1,wxDefaultPosition,wxSize(100,60),wxSUNKEN_BORDER,Options.AsColour(_T("Style editor preview background")));

107
aegisub/factory_manager.h Normal file
View File

@ -0,0 +1,107 @@
// Copyright (c) 2007-2008, Rodrigo Braz Monteiro
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of the Aegisub Group nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// -----------------------------------------------------------------------------
//
// AEGISUB
//
// Website: http://aegisub.cellosoft.com
// Contact: mailto:zeratul@cellosoft.com
//
#pragma once
///////////
// Headers
#include <map>
#include <wx/string.h>
#include <wx/arrstr.h>
/////////////////
// Factory class
template <class T>
class FactoryManager {
protected:
// Static map of all factories
static std::map<wxString,T*> *factories;
// Register one factory type (with possible subtypes)
static void RegisterFactory(T* factory,wxString name, wxArrayString subTypes=wxArrayString()) {
// Create factories if it doesn't exist
if (factories == NULL) factories = new std::map<wxString,T*>;
// Prepare subtypes
if (subTypes.GetCount() == 0) subTypes.Add(_T(""));
else {
for (unsigned int i=0;i<subTypes.GetCount();i++) {
subTypes[i] = _T("/") + subTypes[i];
}
}
// Insert each subtype
for (unsigned int i=0;i<subTypes.GetCount();i++) {
factories->insert(std::make_pair(name.Lower() + subTypes[i],factory));
}
}
// Get a factory with name
static T *GetFactory(wxString name) {
// No factories
if (factories == NULL) {
factories = new std::map<wxString,T*>;
return NULL;
}
// Search for factory that matches
typename std::map<wxString,T*>::iterator cur;
for (cur = factories->begin();cur != factories->end();cur++) {
if (cur->first.StartsWith(name)) return cur->second;
}
// None found
return NULL;
}
public:
// Virtual destructor
virtual ~FactoryManager() {}
// Get list of all factories, with favourite as first
static wxArrayString GetFactoryList(wxString favourite=_T("")) {
if (factories == NULL) factories = new std::map<wxString,T*>;
wxArrayString list;
favourite = favourite.Lower();
for (typename std::map<wxString,T*>::iterator cur=factories->begin();cur!=factories->end();cur++) {
if (cur->first == favourite) list.Insert(cur->first,0);
else list.Add(cur->first);
}
return list;
}
};

View File

@ -160,7 +160,11 @@ void OptionsManager::LoadDefaults(bool onlyDefaults,bool doOverride) {
SetModificationType(MOD_VIDEO_RELOAD); SetModificationType(MOD_VIDEO_RELOAD);
SetInt(_T("Avisynth MemoryMax"),64,1700); SetInt(_T("Avisynth MemoryMax"),64,1700);
SetBool(_T("Threaded Video"),false,1700); SetBool(_T("Threaded Video"),false,1700);
#ifdef __WINDOWS__
SetText(_T("Video Provider"),_T("Avisynth"),1700); SetText(_T("Video Provider"),_T("Avisynth"),1700);
#else
SetText(_T("Video Provider"),_T("FFMPEG"),1945);
#endif
SetBool(_T("Allow Ancient Avisynth"),false,1700); SetBool(_T("Allow Ancient Avisynth"),false,1700);
SetText(_T("Avisynth subs renderer"),_T("vsfilter"),1700); SetText(_T("Avisynth subs renderer"),_T("vsfilter"),1700);
SetBool(_T("Avisynth render own subs"),true,1700); SetBool(_T("Avisynth render own subs"),true,1700);
@ -190,13 +194,15 @@ void OptionsManager::LoadDefaults(bool onlyDefaults,bool doOverride) {
SetModificationType(MOD_AUDIO_RELOAD); SetModificationType(MOD_AUDIO_RELOAD);
SetInt(_T("Audio Cache"),1,1700); SetInt(_T("Audio Cache"),1,1700);
#if defined(__WINDOWS__) #if defined(__WINDOWS__)
SetText(_T("Audio Player"),_T("dsound"),1700); SetText(_T("Audio Player"),_T("DirectSound"),1945);
SetText(_T("Audio Provider"),_T("avisynth"),1700);
#elif defined(__APPLE__) #elif defined(__APPLE__)
SetText(_T("Audio Player"), _T("openal")); SetText(_T("Audio Player"), _T("openal"));
SetText(_T("Audio Provider"),_T("FFMPEG"),1945);
#else #else
SetText(_T("Audio Player"),_T("portaudio")); // FIXME: should this be something else? perhaps alsa on linux and portaudio on everything else? SetText(_T("Audio Player"),_T("portaudio")); // FIXME: should this be something else? perhaps alsa on linux and portaudio on everything else?
SetText(_T("Audio Provider"),_T("FFMPEG"),1945);
#endif #endif
SetText(_T("Audio Provider"),_T("avisynth"),1700); // TODO: proper default on non-windows
SetText(_T("Audio Downmixer"),_T("ConvertToMono"),1700); SetText(_T("Audio Downmixer"),_T("ConvertToMono"),1700);
SetText(_T("Audio Alsa Device"), _T("plughw:0,0")); SetText(_T("Audio Alsa Device"), _T("plughw:0,0"));
SetText(_T("Audio HD Cache Location"),_T("default"),1700); SetText(_T("Audio HD Cache Location"),_T("default"),1700);

View File

@ -41,6 +41,7 @@
#include "audio_provider.h" #include "audio_provider.h"
#include "audio_player.h" #include "audio_player.h"
#include "subtitles_provider.h" #include "subtitles_provider.h"
#include "spellchecker.h"
/////////////// ///////////////
@ -60,10 +61,11 @@ PluginManager::~PluginManager() {
// Registers all built-in plugins // Registers all built-in plugins
void PluginManager::RegisterBuiltInPlugins() { void PluginManager::RegisterBuiltInPlugins() {
if (!init) { if (!init) {
VideoProviderFactory::RegisterProviders(); VideoProviderFactoryManager::RegisterProviders();
AudioProviderFactory::RegisterProviders(); AudioProviderFactoryManager::RegisterProviders();
AudioPlayerFactory::RegisterProviders(); AudioPlayerFactoryManager::RegisterProviders();
SubtitlesProviderFactory::RegisterProviders(); SubtitlesProviderFactoryManager::RegisterProviders();
SpellCheckerFactoryManager::RegisterProviders();
} }
// Done // Done

View File

@ -37,12 +37,15 @@
/////////// ///////////
// Headers // Headers
#include "spellchecker.h" #include "spellchecker.h"
#ifdef WITH_HUNSPELL
#include "spellchecker_hunspell.h"
#endif
#include "options.h" #include "options.h"
///////////////////// /////////////////////
// Get spell checker // Get spell checker
SpellChecker *SpellCheckerFactory::GetSpellChecker() { SpellChecker *SpellCheckerFactoryManager::GetSpellChecker() {
// List of providers // List of providers
wxArrayString list = GetFactoryList(Options.AsText(_T("Spell Checker"))); wxArrayString list = GetFactoryList(Options.AsText(_T("Spell Checker")));
@ -66,6 +69,15 @@ SpellChecker *SpellCheckerFactory::GetSpellChecker() {
} }
//////////////////////////
// Register all providers
void SpellCheckerFactoryManager::RegisterProviders() {
#ifdef WITH_HUNSPELL
RegisterFactory(new HunspellSpellCheckerFactory(),_T("Hunspell"));
#endif
}
////////// //////////
// Static // Static
template <class SpellCheckerFactory> std::map<wxString,SpellCheckerFactory*>* AegisubFactory<SpellCheckerFactory>::factories=NULL; template <class SpellCheckerFactory> std::map<wxString,SpellCheckerFactory*>* FactoryManager<SpellCheckerFactory>::factories=NULL;

View File

@ -40,7 +40,7 @@
/////////// ///////////
// Headers // Headers
#include <wx/wxprec.h> #include <wx/wxprec.h>
#include "factory.h" #include "factory_manager.h"
/////////////////////////// ///////////////////////////
@ -63,12 +63,16 @@ public:
/////////// ///////////
// Factory // Factory
class SpellCheckerFactory : public AegisubFactory<SpellCheckerFactory> { class SpellCheckerFactory {
protected:
virtual SpellChecker *CreateSpellChecker()=0;
SpellCheckerFactory(wxString name) { RegisterFactory(name); }
public: public:
virtual ~SpellCheckerFactory() {} virtual SpellChecker *CreateSpellChecker()=0;
static SpellChecker *GetSpellChecker(); };
///////////////////
// Factory Manager
class SpellCheckerFactoryManager : public FactoryManager<SpellCheckerFactory> {
public:
static SpellChecker *GetSpellChecker();
static void RegisterProviders();
}; };

View File

@ -39,7 +39,7 @@
#ifdef WITH_HUNSPELL #ifdef WITH_HUNSPELL
#include "spellchecker.h" #include "spellchecker_hunspell.h"
#include "standard_paths.h" #include "standard_paths.h"
#include "utils.h" #include "utils.h"
#include "options.h" #include "options.h"
@ -52,42 +52,6 @@
#include <wx/txtstrm.h> #include <wx/txtstrm.h>
//////////////////
// Hunspell class
class HunspellSpellChecker : public SpellChecker {
private:
Hunspell *hunspell;
wxCSConv *conv;
wxString affpath;
wxString dicpath;
wxString usrdicpath;
void Reset();
public:
HunspellSpellChecker();
~HunspellSpellChecker();
void AddWord(wxString word);
bool CanAddWord(wxString word);
bool CheckWord(wxString word);
wxArrayString GetSuggestions(wxString word);
wxArrayString GetLanguageList();
void SetLanguage(wxString language);
};
///////////
// Factory
class HunspellSpellCheckerFactory : public SpellCheckerFactory {
public:
SpellChecker *CreateSpellChecker() { return new HunspellSpellChecker(); }
HunspellSpellCheckerFactory() : SpellCheckerFactory(_T("hunspell")) {}
} registerHunspell;
/////////////// ///////////////
// Constructor // Constructor
HunspellSpellChecker::HunspellSpellChecker() { HunspellSpellChecker::HunspellSpellChecker() {

View File

@ -0,0 +1,82 @@
// Copyright (c) 2008, Rodrigo Braz Monteiro
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of the Aegisub Group nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// -----------------------------------------------------------------------------
//
// AEGISUB
//
// Website: http://aegisub.cellosoft.com
// Contact: mailto:zeratul@cellosoft.com
//
///////////
// Headers
#ifdef WITH_HUNSPELL
#include "spellchecker.h"
#include <hunspell/hunspell.hxx>
#include <wx/wxprec.h>
//////////////////
// Hunspell class
class HunspellSpellChecker : public SpellChecker {
private:
Hunspell *hunspell;
wxCSConv *conv;
wxString affpath;
wxString dicpath;
wxString usrdicpath;
void Reset();
public:
HunspellSpellChecker();
~HunspellSpellChecker();
void AddWord(wxString word);
bool CanAddWord(wxString word);
bool CheckWord(wxString word);
wxArrayString GetSuggestions(wxString word);
wxArrayString GetLanguageList();
void SetLanguage(wxString language);
};
///////////
// Factory
class HunspellSpellCheckerFactory : public SpellCheckerFactory {
public:
SpellChecker *CreateSpellChecker() { return new HunspellSpellChecker(); }
};
#endif

View File

@ -70,7 +70,7 @@ SubsTextEditCtrl::SubsTextEditCtrl(wxWindow* parent, wxWindowID id, const wxStri
CmdKeyClear('U',wxSTC_SCMOD_CTRL); CmdKeyClear('U',wxSTC_SCMOD_CTRL);
// Set spellchecker // Set spellchecker
spellchecker = SpellCheckerFactory::GetSpellChecker(); spellchecker = SpellCheckerFactoryManager::GetSpellChecker();
// Set thesaurus // Set thesaurus
thesaurus = Thesaurus::GetThesaurus(); thesaurus = Thesaurus::GetThesaurus();

View File

@ -143,7 +143,7 @@ void SubtitlesPreview::UpdateBitmap(int w,int h) {
// Try to get subtitles provider // Try to get subtitles provider
SubtitlesProvider *provider = NULL; SubtitlesProvider *provider = NULL;
try { try {
provider = SubtitlesProviderFactory::GetProvider(); provider = SubtitlesProviderFactoryManager::GetProvider();
} }
catch (...) { catch (...) {
wxMessageBox(_T("Could not get any subtitles provider for the preview box. Make sure that you have a provider installed."),_T("No subtitles provider"),wxICON_ERROR); wxMessageBox(_T("Could not get any subtitles provider for the preview box. Make sure that you have a provider installed."),_T("No subtitles provider"),wxICON_ERROR);

View File

@ -97,7 +97,7 @@ void DVDSubtitleFormat::GetSubPictureList(std::vector<SubPicture> &pics) {
pics.resize(count); pics.resize(count);
SubtitlesProvider *provider = NULL; SubtitlesProvider *provider = NULL;
provider = SubtitlesProviderFactory::GetProvider(); provider = SubtitlesProviderFactoryManager::GetProvider();
provider->LoadSubtitles(GetAssFile()); provider->LoadSubtitles(GetAssFile());
// Write lines // Write lines

View File

@ -54,7 +54,7 @@ SubtitlesProvider::~SubtitlesProvider() {
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
// Check if provider available (doesn't verify provider works!) // Check if provider available (doesn't verify provider works!)
bool SubtitlesProviderFactory::ProviderAvailable() { bool SubtitlesProviderFactoryManager::ProviderAvailable() {
// List of providers // List of providers
wxArrayString list = GetFactoryList(Options.AsText(_T("Subtitles provider"))); wxArrayString list = GetFactoryList(Options.AsText(_T("Subtitles provider")));
@ -65,7 +65,7 @@ bool SubtitlesProviderFactory::ProviderAvailable() {
//////////////// ////////////////
// Get provider // Get provider
SubtitlesProvider* SubtitlesProviderFactory::GetProvider() { SubtitlesProvider* SubtitlesProviderFactoryManager::GetProvider() {
// List of providers // List of providers
wxArrayString list = GetFactoryList(Options.AsText(_T("Subtitles provider"))); wxArrayString list = GetFactoryList(Options.AsText(_T("Subtitles provider")));
@ -94,16 +94,17 @@ SubtitlesProvider* SubtitlesProviderFactory::GetProvider() {
////////////////////// //////////////////////
// Register providers // Register providers
void SubtitlesProviderFactory::RegisterProviders() { void SubtitlesProviderFactoryManager::RegisterProviders() {
#ifdef WITH_CSRI #ifdef WITH_CSRI
new CSRISubtitlesProviderFactory(); CSRISubtitlesProviderFactory *csri = new CSRISubtitlesProviderFactory();
RegisterFactory(csri,_T("CSRI"),csri->GetSubTypes());
#endif #endif
#ifdef WITH_LIBASS #ifdef WITH_LIBASS
new LibassSubtitlesProviderFactory(); RegisterFactory(new LibassSubtitlesProviderFactory(),_T("libass"));
#endif #endif
} }
////////// //////////
// Static // Static
template <class SubtitlesProviderFactory> std::map<wxString,SubtitlesProviderFactory*>* AegisubFactory<SubtitlesProviderFactory>::factories=NULL; template <class SubtitlesProviderFactory> std::map<wxString,SubtitlesProviderFactory*>* FactoryManager<SubtitlesProviderFactory>::factories=NULL;

View File

@ -41,7 +41,7 @@
// Headers // Headers
#include <wx/wxprec.h> #include <wx/wxprec.h>
#include "video_frame.h" #include "video_frame.h"
#include "factory.h" #include "factory_manager.h"
////////////// //////////////
@ -65,16 +65,19 @@ public:
/////////// ///////////
// Factory // Factory
class SubtitlesProviderFactory : public AegisubFactory<SubtitlesProviderFactory> { class SubtitlesProviderFactory {
protected:
virtual SubtitlesProvider *CreateProvider(wxString subType=_T(""))=0;
SubtitlesProviderFactory(wxString name,wxArrayString subTypes=wxArrayString()) {
RegisterFactory(name,subTypes);
}
public: public:
virtual ~SubtitlesProviderFactory() {} virtual ~SubtitlesProviderFactory() {}
virtual SubtitlesProvider *CreateProvider(wxString subType=_T(""))=0;
};
///////////////////
// Factory Manager
class SubtitlesProviderFactoryManager : public FactoryManager<SubtitlesProviderFactory> {
public:
static SubtitlesProvider *GetProvider(); static SubtitlesProvider *GetProvider();
static void RegisterProviders(); static void RegisterProviders();
static bool ProviderAvailable(); static bool ProviderAvailable();
}; };

View File

@ -75,7 +75,6 @@ class CSRISubtitlesProviderFactory : public SubtitlesProviderFactory {
public: public:
SubtitlesProvider *CreateProvider(wxString subType=_T("")) { return new CSRISubtitlesProvider(subType); } SubtitlesProvider *CreateProvider(wxString subType=_T("")) { return new CSRISubtitlesProvider(subType); }
wxArrayString GetSubTypes(); wxArrayString GetSubTypes();
CSRISubtitlesProviderFactory() : SubtitlesProviderFactory(_T("csri"),GetSubTypes()) {}
}; };
#endif #endif

View File

@ -329,13 +329,13 @@ void VideoContext::SetVideo(const wxString &filename) {
#endif #endif
// Choose a provider // Choose a provider
provider = VideoProviderFactory::GetProvider(filename,overFps); provider = VideoProviderFactoryManager::GetProvider(filename,overFps);
loaded = provider != NULL; loaded = provider != NULL;
// Get subtitles provider // Get subtitles provider
try { try {
subsProvider = provider->GetAsSubtitlesProvider(); subsProvider = provider->GetAsSubtitlesProvider();
if (!subsProvider) subsProvider = SubtitlesProviderFactory::GetProvider(); if (!subsProvider) subsProvider = SubtitlesProviderFactoryManager::GetProvider();
} }
catch (wxString err) { wxMessageBox(_T("Error while loading subtitles provider: ") + err,_T("Subtitles provider")); } catch (wxString err) { wxMessageBox(_T("Error while loading subtitles provider: ") + err,_T("Subtitles provider")); }
catch (const wchar_t *err) { wxMessageBox(_T("Error while loading subtitles provider: ") + wxString(err),_T("Subtitles provider")); } catch (const wchar_t *err) { wxMessageBox(_T("Error while loading subtitles provider: ") + wxString(err),_T("Subtitles provider")); }

View File

@ -55,7 +55,7 @@
//////////////// ////////////////
// Get provider // Get provider
VideoProvider *VideoProviderFactory::GetProvider(wxString video,double fps) { VideoProvider *VideoProviderFactoryManager::GetProvider(wxString video,double fps) {
// First check special case of dummy video // First check special case of dummy video
if (video.StartsWith(_T("?dummy:"))) { if (video.StartsWith(_T("?dummy:"))) {
return new DummyVideoProvider(video, fps); return new DummyVideoProvider(video, fps);
@ -93,19 +93,19 @@ VideoProvider *VideoProviderFactory::GetProvider(wxString video,double fps) {
////////////////////////// //////////////////////////
// Register all providers // Register all providers
void VideoProviderFactory::RegisterProviders() { void VideoProviderFactoryManager::RegisterProviders() {
#ifdef WITH_AVISYNTH #ifdef WITH_AVISYNTH
new AvisynthVideoProviderFactory(); RegisterFactory(new AvisynthVideoProviderFactory(),_T("Avisynth"));
#endif #endif
#ifdef WITH_DIRECTSHOW #ifdef WITH_DIRECTSHOW
new DirectShowVideoProviderFactory(); RegisterFactory(new DirectShowVideoProviderFactory(),_T("DirectShow"));
#endif #endif
#ifdef WITH_FFMPEG #ifdef WITH_FFMPEG
new LAVCVideoProviderFactory(); RegisterFactory(new LAVCVideoProviderFactory(),_T("FFMPEG"));
#endif #endif
} }
////////// //////////
// Static // Static
template <class VideoProviderFactory> std::map<wxString,VideoProviderFactory*>* AegisubFactory<VideoProviderFactory>::factories=NULL; template <class VideoProviderFactory> std::map<wxString,VideoProviderFactory*>* FactoryManager<VideoProviderFactory>::factories=NULL;

View File

@ -41,7 +41,7 @@
// Headers // Headers
#include <wx/intl.h> #include <wx/intl.h>
#include "video_frame.h" #include "video_frame.h"
#include "factory.h" #include "factory_manager.h"
////////////// //////////////
@ -86,14 +86,16 @@ public:
/////////// ///////////
// Factory // Factory
class VideoProviderFactory : public AegisubFactory<VideoProviderFactory> { class VideoProviderFactory {
protected:
virtual VideoProvider *CreateProvider(wxString video,double fps=0.0)=0;
VideoProviderFactory(wxString name) { RegisterFactory(name); }
public: public:
virtual ~VideoProviderFactory() {} virtual VideoProvider *CreateProvider(wxString video,double fps=0.0)=0;
static VideoProvider *GetProvider(wxString video,double fps=0.0); };
static void RegisterProviders();
///////////////////
// Factory Manager
class VideoProviderFactoryManager : public FactoryManager<VideoProviderFactory> {
public:
static void RegisterProviders();
static VideoProvider *GetProvider(wxString video,double fps=0.0);
}; };

View File

@ -101,7 +101,6 @@ public:
class AvisynthVideoProviderFactory : public VideoProviderFactory { class AvisynthVideoProviderFactory : public VideoProviderFactory {
public: public:
VideoProvider *CreateProvider(wxString video,double fps=0.0) { return new AvisynthVideoProvider(video,fps); } VideoProvider *CreateProvider(wxString video,double fps=0.0) { return new AvisynthVideoProvider(video,fps); }
AvisynthVideoProviderFactory() : VideoProviderFactory(_T("avisynth")) {}
}; };

View File

@ -124,7 +124,6 @@ public:
class DirectShowVideoProviderFactory : public VideoProviderFactory { class DirectShowVideoProviderFactory : public VideoProviderFactory {
public: public:
VideoProvider *CreateProvider(wxString video,double fps=0.0) { return new DirectShowVideoProvider(video,fps); } VideoProvider *CreateProvider(wxString video,double fps=0.0) { return new DirectShowVideoProvider(video,fps); }
DirectShowVideoProviderFactory() : VideoProviderFactory(_T("dshow")) {}
}; };
#endif #endif

View File

@ -222,10 +222,11 @@
OpenMP="true" OpenMP="true"
UsePrecompiledHeader="2" UsePrecompiledHeader="2"
PrecompiledHeaderThrough="stdwx.h" PrecompiledHeaderThrough="stdwx.h"
ProgramDataBaseFileName="$(IntDir)\vc90.pdb"
WarningLevel="3" WarningLevel="3"
WarnAsError="true" WarnAsError="true"
Detect64BitPortabilityProblems="false" Detect64BitPortabilityProblems="false"
DebugInformationFormat="3" DebugInformationFormat="0"
DisableSpecificWarnings="4267" DisableSpecificWarnings="4267"
ForcedIncludeFiles="stdwx.h;config.h" ForcedIncludeFiles="stdwx.h;config.h"
/> />
@ -917,7 +918,7 @@
> >
</File> </File>
<File <File
RelativePath="..\..\aegisub\factory.h" RelativePath="..\..\aegisub\factory_manager.h"
> >
</File> </File>
<File <File
@ -1672,6 +1673,10 @@
RelativePath="..\..\aegisub\spellchecker_hunspell.cpp" RelativePath="..\..\aegisub\spellchecker_hunspell.cpp"
> >
</File> </File>
<File
RelativePath="..\..\aegisub\spellchecker_hunspell.h"
>
</File>
<File <File
RelativePath="..\..\aegisub\thesaurus.cpp" RelativePath="..\..\aegisub\thesaurus.cpp"
> >