/** * backgroundthread.cpp * * Copyright (C) 2004 Zack Rusin * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "backgroundthread.h" #include "threadevents.h" #include "broker.h" #include "filter.h" #include "dictionary.h" #include #include using namespace KSpell2; BackgroundThread::BackgroundThread() : TQThread(), m_broker( 0 ), m_dict( 0 ) { m_recv = 0; m_filter = Filter::defaultFilter(); m_done = false; } void BackgroundThread::setReceiver( TQObject *recv ) { m_recv = recv; } void BackgroundThread::setBroker( const Broker::Ptr& broker ) { stop(); m_broker = broker; delete m_dict; m_dict = m_broker->dictionary(); m_filter->restart(); } TQStringList BackgroundThread::suggest( const TQString& word ) const { return m_dict->suggest( word ); } void BackgroundThread::run() { m_mutex.lock(); m_done = false; for ( Word w = m_filter->nextWord(); !m_done && !w.end; w = m_filter->nextWord() ) { if ( !m_dict->check( w.word ) && !m_done ) { MisspellingEvent *event = new MisspellingEvent( w.word, w.start ); TQApplication::postEvent( m_recv, event ); } } m_mutex.unlock(); FinishedCheckingEvent *event = new FinishedCheckingEvent(); TQApplication::postEvent( m_recv, event ); } void BackgroundThread::setText( const TQString& buff ) { stop(); m_mutex.lock(); m_filter->setBuffer( buff ); m_mutex.unlock(); start(); } void BackgroundThread::setFilter( Filter *filter ) { stop(); m_mutex.lock(); Filter *oldFilter = m_filter; m_filter = filter; if ( oldFilter ) { m_filter->setBuffer( oldFilter->buffer() ); oldFilter->setBuffer( TQString::null ); } m_mutex.unlock(); start(); } void BackgroundThread::changeLanguage( const TQString& lang ) { stop(); m_mutex.lock(); delete m_dict; m_dict = m_broker->dictionary( lang ); m_filter->restart(); m_mutex.unlock(); start(); } void BackgroundThread::stop() { //### maybe terminate() would be better than using m_done m_done = true; wait(); }