1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/**
* backgroundthread.cpp
*
* Copyright (C) 2004 Zack Rusin <zack@kde.org>
*
* 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 <kdebug.h>
#include <qapplication.h>
using namespace KSpell2;
BackgroundThread::BackgroundThread()
: QThread(), m_broker( 0 ), m_dict( 0 )
{
m_recv = 0;
m_filter = Filter::defaultFilter();
m_done = false;
}
void BackgroundThread::setReceiver( QObject *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();
}
QStringList BackgroundThread::suggest( const QString& 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 );
QApplication::postEvent( m_recv, event );
}
}
m_mutex.unlock();
FinishedCheckingEvent *event = new FinishedCheckingEvent();
QApplication::postEvent( m_recv, event );
}
void BackgroundThread::setText( const QString& 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( QString::null );
}
m_mutex.unlock();
start();
}
void BackgroundThread::changeLanguage( const QString& 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();
}
|