diff options
| -rw-r--r-- | SwifTools/SpellCheckerFactory.cpp | 10 | ||||
| -rw-r--r-- | SwifTools/SpellCheckerFactory.h | 2 | ||||
| -rw-r--r-- | Swift/Controllers/SettingConstants.cpp | 2 | ||||
| -rw-r--r-- | Swift/QtUI/QtChatWindow.cpp | 2 | ||||
| -rw-r--r-- | Swift/QtUI/QtSpellCheckerWindow.cpp | 21 | ||||
| -rw-r--r-- | Swift/QtUI/QtSpellCheckerWindow.ui | 34 | ||||
| -rw-r--r-- | Swift/QtUI/QtTextEdit.cpp | 43 | ||||
| -rw-r--r-- | Swift/QtUI/QtTextEdit.h | 10 | 
8 files changed, 93 insertions, 31 deletions
diff --git a/SwifTools/SpellCheckerFactory.cpp b/SwifTools/SpellCheckerFactory.cpp index 9ec1151..9ac33cd 100644 --- a/SwifTools/SpellCheckerFactory.cpp +++ b/SwifTools/SpellCheckerFactory.cpp @@ -10,8 +10,6 @@  #ifdef HAVE_HUNSPELL  #include <hunspell/hunspell.hxx> -#else -#define HAVE_NO_SPELL_CHECK  #endif  namespace Swift { @@ -19,14 +17,12 @@ namespace Swift {  SpellCheckerFactory::SpellCheckerFactory() {  } -SpellChecker* SpellCheckerFactory::createSpellChecker() { +SpellChecker* SpellCheckerFactory::createSpellChecker(const char* affixPath, const char* dictPath) {  #ifdef HAVE_HUNSPELL -	//TODO(vladv): Do something smart about finding available dictionaries, -	// maybe a UI button to select language from available dictionaries? -	const char* dictPath = "/usr/share/hunspell/en_US.dic"; -	const char* affixPath = "/usr/share/hunspell/en_US.aff"; +	std::cout << affixPath << std::endl << dictPath << std::endl;  	return new HunspellChecker(affixPath, dictPath);  #endif +	return NULL;  }  } diff --git a/SwifTools/SpellCheckerFactory.h b/SwifTools/SpellCheckerFactory.h index 23f89b8..85aa8b6 100644 --- a/SwifTools/SpellCheckerFactory.h +++ b/SwifTools/SpellCheckerFactory.h @@ -13,6 +13,6 @@ namespace Swift {  	class SpellCheckerFactory {  		public:  			SpellCheckerFactory(); -			SpellChecker* createSpellChecker(); +			SpellChecker* createSpellChecker(const char* affixPath, const char* dictPath);  	};  } diff --git a/Swift/Controllers/SettingConstants.cpp b/Swift/Controllers/SettingConstants.cpp index 6f147a7..678babc 100644 --- a/Swift/Controllers/SettingConstants.cpp +++ b/Swift/Controllers/SettingConstants.cpp @@ -21,6 +21,6 @@ const SettingsProvider::Setting<std::string> SettingConstants::EXPANDED_ROSTER_G  const SettingsProvider::Setting<bool> SettingConstants::PLAY_SOUNDS("playSounds", true);  const SettingsProvider::Setting<bool> SettingConstants::SPELL_CHECKER("spellChecker", false);  const SettingsProvider::Setting<std::string> SettingConstants::DICT_PATH("dictPath", "/usr/share/myspell/dicts/"); -const SettingsProvider::Setting<std::string> SettingConstants::PERSONAL_DICT_PATH("personaldictPath", "/home"); +const SettingsProvider::Setting<std::string> SettingConstants::PERSONAL_DICT_PATH("personaldictPath", "/home/");  const SettingsProvider::Setting<std::string> SettingConstants::DICT_FILE("dictFile", "en_US.dic");  } diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp index 314e36c..3a20713 100644 --- a/Swift/QtUI/QtChatWindow.cpp +++ b/Swift/QtUI/QtChatWindow.cpp @@ -150,7 +150,7 @@ QtChatWindow::QtChatWindow(const QString &contact, QtChatTheme* theme, UIEventSt  	QHBoxLayout* inputBarLayout = new QHBoxLayout();  	inputBarLayout->setContentsMargins(0,0,0,0);  	inputBarLayout->setSpacing(2); -	input_ = new QtTextEdit(this); +	input_ = new QtTextEdit(settings_, this);  	input_->setAcceptRichText(false);  	inputBarLayout->addWidget(midBar_);  	inputBarLayout->addWidget(input_); diff --git a/Swift/QtUI/QtSpellCheckerWindow.cpp b/Swift/QtUI/QtSpellCheckerWindow.cpp index c6fcc2c..ef1985e 100644 --- a/Swift/QtUI/QtSpellCheckerWindow.cpp +++ b/Swift/QtUI/QtSpellCheckerWindow.cpp @@ -27,13 +27,19 @@ QtSpellCheckerWindow::QtSpellCheckerWindow(SettingsProvider* settings, QWidget*  	connect(ui_.pathButton, SIGNAL(clicked()), this, SLOT(handlePathButton()));  	connect(ui_.personalPathButton, SIGNAL(clicked()), this, SLOT(handlePersonalPathButton()));  	setFromSettings(); -	setEnabled(settings_->getSetting(SettingConstants::SPELL_CHECKER));  }  void QtSpellCheckerWindow::setFromSettings() {  	ui_.spellChecker->setChecked(settings_->getSetting(SettingConstants::SPELL_CHECKER));  	ui_.personalPathContent->insert(P2QSTRING(settings_->getSetting(SettingConstants::PERSONAL_DICT_PATH)));  	ui_.pathContent->insert(P2QSTRING(settings_->getSetting(SettingConstants::DICT_PATH))); +	ui_.currentLanguageValue->setText(P2QSTRING(settings_->getSetting(SettingConstants::DICT_FILE))); +	std::string currentPath = settings_->getSetting(SettingConstants::DICT_PATH); +	QString filename = "*.dic"; +	QDir dictDirectory = QDir(P2QSTRING(currentPath)); +	QStringList files = dictDirectory.entryList(QStringList(filename), QDir::Files); +	showFiles(files); +	setEnabled(settings_->getSetting(SettingConstants::SPELL_CHECKER));  }  void QtSpellCheckerWindow::handleChecker(bool state) { @@ -48,6 +54,8 @@ void QtSpellCheckerWindow::setEnabled(bool state) {  	ui_.personalPathButton->setEnabled(state);  	ui_.pathLabel->setEnabled(state);  	ui_.personalDictionaryLabel->setEnabled(state); +	ui_.currentLanguage->setEnabled(state); +	ui_.currentLanguageValue->setEnabled(state);  	ui_.language->setEnabled(state);  } @@ -56,6 +64,8 @@ void QtSpellCheckerWindow::handleApply() {  	QList<QListWidgetItem* > selectedLanguage = ui_.languageView->selectedItems();  	if (!selectedLanguage.empty()) {  		settings_->storeSetting(SettingConstants::DICT_FILE, Q2PSTRING(selectedLanguage[0]->text())); +	} else { +		settings_->storeSetting(SettingConstants::SPELL_CHECKER, false);  	}  	this->done(0);  } @@ -67,10 +77,13 @@ void QtSpellCheckerWindow::handleCancel() {  void QtSpellCheckerWindow::handlePathButton() {  	std::string currentPath = settings_->getSetting(SettingConstants::DICT_PATH);  	QString dirpath = QFileDialog::getExistingDirectory(this, tr("Dictionary Path"), P2QSTRING(currentPath)); -	if (dirpath != NULL) { -		QDir dictDirectory = QDir(dirpath); +	if (!dirpath.isEmpty()) { +		if (!dirpath.endsWith("/")) { +			dirpath.append("/"); +		}  		settings_->storeSetting(SettingConstants::DICT_PATH, Q2PSTRING(dirpath)); -		ui_.personalPathContent->insert(dirpath); +		QDir dictDirectory = QDir(dirpath); +		ui_.pathContent->insert(dirpath);  		QString filename = "*.dic";  		QStringList files = dictDirectory.entryList(QStringList(filename), QDir::Files);  		showFiles(files); diff --git a/Swift/QtUI/QtSpellCheckerWindow.ui b/Swift/QtUI/QtSpellCheckerWindow.ui index 619ed88..63f3ed4 100644 --- a/Swift/QtUI/QtSpellCheckerWindow.ui +++ b/Swift/QtUI/QtSpellCheckerWindow.ui @@ -6,8 +6,8 @@     <rect>      <x>0</x>      <y>0</y> -    <width>431</width> -    <height>214</height> +    <width>502</width> +    <height>303</height>     </rect>    </property>    <property name="windowTitle"> @@ -31,7 +31,7 @@     <item row="1" column="1">      <widget class="QLineEdit" name="pathContent"/>     </item> -   <item row="1" column="2"> +   <item row="1" column="3">      <widget class="QPushButton" name="pathButton">       <property name="text">        <string>Change</string> @@ -41,14 +41,14 @@     <item row="2" column="0">      <widget class="QLabel" name="personalDictionaryLabel">       <property name="text"> -      <string>Personal Dictionary</string> +      <string>Personal Dictionary:</string>       </property>      </widget>     </item>     <item row="2" column="1">      <widget class="QLineEdit" name="personalPathContent"/>     </item> -   <item row="2" column="2"> +   <item row="2" column="3">      <widget class="QPushButton" name="personalPathButton">       <property name="text">        <string>Change</string> @@ -56,13 +56,30 @@      </widget>     </item>     <item row="3" column="0"> +    <widget class="QLabel" name="currentLanguage"> +     <property name="text"> +      <string>Current Language:</string> +     </property> +    </widget> +   </item> +   <item row="3" column="1"> +    <widget class="QLabel" name="currentLanguageValue"> +     <property name="text"> +      <string/> +     </property> +    </widget> +   </item> +   <item row="4" column="0">      <widget class="QLabel" name="language">       <property name="text"> -      <string>Language</string> +      <string>Language:</string>       </property>      </widget>     </item> -   <item row="4" column="0" colspan="3"> +   <item row="4" column="1" colspan="2"> +    <widget class="QListWidget" name="languageView"/> +   </item> +   <item row="5" column="2" colspan="2">      <layout class="QHBoxLayout" name="horizontalLayout">       <item>        <spacer name="horizontalSpacer"> @@ -93,9 +110,6 @@       </item>      </layout>     </item> -   <item row="3" column="1"> -    <widget class="QListWidget" name="languageView"/> -   </item>    </layout>   </widget>   <resources/> diff --git a/Swift/QtUI/QtTextEdit.cpp b/Swift/QtUI/QtTextEdit.cpp index 60f0939..e523dca 100644 --- a/Swift/QtUI/QtTextEdit.cpp +++ b/Swift/QtUI/QtTextEdit.cpp @@ -5,12 +5,14 @@   */  #include <boost/tuple/tuple.hpp> +#include <boost/algorithm/string.hpp>  #include <SwifTools/SpellCheckerFactory.h>  #include <SwifTools/SpellChecker.h>  #include <Swift/QtUI/QtTextEdit.h>  #include <Swift/QtUI/QtSwiftUtil.h> +#include <Swift/QtUI/QtSpellCheckerWindow.h>  #include <QApplication>  #include <QFontMetrics> @@ -20,12 +22,11 @@  namespace Swift { -QtTextEdit::QtTextEdit(QWidget* parent) : QTextEdit(parent) { +QtTextEdit::QtTextEdit(SettingsProvider* settings, QWidget* parent) : QTextEdit(parent) {  	connect(this, SIGNAL(textChanged()), this, SLOT(handleTextChanged())); +	settings_ = settings; +	setUpSpellChecker();  	handleTextChanged(); -	SpellCheckerFactory *checkerFactory = new SpellCheckerFactory(); -	checker_ = checkerFactory->createSpellChecker(); -	delete checkerFactory;  };  QtTextEdit::~QtTextEdit() { @@ -57,11 +58,21 @@ void QtTextEdit::keyPressEvent(QKeyEvent* event) {  	}  	else {  		QTextEdit::keyPressEvent(event); -		underlineMisspells(); +		if(settings_->getSetting(SettingConstants::SPELL_CHECKER)) { +			underlineMisspells(); +		}  	}  }  void QtTextEdit::underlineMisspells() { +	if (checker_ == NULL) { +		// Try to setUp the checker again in case that +		// settings changed. +		setUpSpellChecker(); +		if (checker_ == NULL) { +			return; +		} +	}  	misspelledPositions_.clear();  	QTextCharFormat spellingErrorFormat;  	QTextCharFormat normalFormat; @@ -160,4 +171,26 @@ void QtTextEdit::contextMenuEvent(QContextMenuEvent* event) {  	delete menu;  } +void QtTextEdit::setUpSpellChecker() +{ +	SpellCheckerFactory *checkerFactory = new SpellCheckerFactory(); +	std::string dictFile = settings_->getSetting(SettingConstants::DICT_FILE); +	if (dictFile.empty()) { +		// Disable the dictionary to force the user to select a dictionary +		settings_->storeSetting(SettingConstants::SPELL_CHECKER, false); +	} +	if (settings_->getSetting(SettingConstants::SPELL_CHECKER)) { +		std::string dictPath = settings_->getSetting(SettingConstants::DICT_PATH); +		std::string affixFile(dictFile); +		boost::replace_all(affixFile, ".dic", ".aff"); +		if (checker_ != NULL) { +			delete checker_; +		} +		checker_ = checkerFactory->createSpellChecker((dictPath + affixFile).c_str(), (dictPath + dictFile).c_str()); +		delete checkerFactory; +	} else { +		checker_ = NULL; +	} +} +  } diff --git a/Swift/QtUI/QtTextEdit.h b/Swift/QtUI/QtTextEdit.h index 297312d..38d5d0a 100644 --- a/Swift/QtUI/QtTextEdit.h +++ b/Swift/QtUI/QtTextEdit.h @@ -6,15 +6,19 @@  #pragma once -#include <QTextEdit>  #include <SwifTools/SpellParser.h> +#include <Swift/Controllers/Settings/SettingsProvider.h> +#include <Swift/Controllers/SettingConstants.h> + +#include <QTextEdit> +  namespace Swift {  	class SpellChecker;  	class QtTextEdit : public QTextEdit {  		Q_OBJECT  	public: -		QtTextEdit(QWidget* parent = 0); +		QtTextEdit(SettingsProvider* settings, QWidget* parent = 0);  		virtual ~QtTextEdit();  		virtual QSize sizeHint() const;  	signals: @@ -31,6 +35,8 @@ namespace Swift {  	private:  		SpellChecker *checker_;  		PositionPairList misspelledPositions_; +		SettingsProvider *settings_; +		void setUpSpellChecker();  		void underlineMisspells();  		boost::tuple<int,int> getWordFromCursor(int cursorPosition);  	};  | 
 Swift