Fixed phantom errors linked with saving/loading settings
[mdictionary] / trunk / src / base / backbone / backbone.h
1 /*******************************************************************************
2
3     This file is part of mDictionary.
4
5     mDictionary is free software: you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation, either version 3 of the License, or
8     (at your option) any later version.
9
10     mDictionary is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with mDictionary.  If not, see <http://www.gnu.org/licenses/>.
17
18     Copyright 2010 Comarch S.A.
19
20 *******************************************************************************/
21
22 // Created by Bartosz Szatkowski
23
24 #ifndef BACKBONE_H
25 #define BACKBONE_H
26
27 #include <QObject>
28 #include <QList>
29 #include <QHash>
30 #include <QPluginLoader>
31 #include <QFuture>
32 #include <QtConcurrentRun>
33 #include <QTimer>
34 #include <QTime>
35 #include <QDir>
36 #include <QSettings>
37 #include "../../includes/CommonDictInterface.h"
38 #include "../../includes/settings.h"
39 #include "../../includes/translation.h"
40 #include "../../includes/History.h"
41
42
43 /*! Inner part of dictionary - glues together GUI and plugins
44
45   Backbone is responsible for managing plugins and dictionaries, starting
46   new searches and threads, merging search results from multiple dictionaries.
47
48   Each plugin may live in multiple instances - each with its own dictionary,
49   backbone must provide way to create them at start (with specific Settings) and
50   distinguich each ditionary.
51
52 */
53 class Backbone : public QObject
54 {
55     Q_OBJECT
56
57 public:
58     /*!\param pluginPath path to plugins (leave blank for default)
59       \param configPath path to folder with configuration files*/
60     Backbone(QString pluginPath="", QString configPath="",
61              bool dry = 0, QObject *parent = 0);
62     ~Backbone();
63     Backbone(const Backbone& b);
64
65     //! \return all loadded dictionaries with activity state flag
66     QHash<CommonDictInterface*, bool> getDictionaries();
67
68     //! \return all loadded plugins
69     QList<CommonDictInterface*> getPlugins();
70
71     //! \return history of performed searches
72     History* history();
73
74     //! \return return search fesult
75     QMultiHash<QString, Translation*> result();
76
77     //! \return maximum number of word that plugin could find
78     int searchLimit() const;
79
80     //! \return number of active searches
81     int activeSearches() const;
82
83     /*! Performs search for final translation (html/xml) form
84       \param list of Translation* to be searched for
85       */
86     void searchHtml(QList<Translation*>);
87
88     //! \return final translation (after searching for html)
89     QStringList htmls();
90
91
92 public Q_SLOTS:
93     //! stops all current searches
94     void stopSearching();
95
96     /*! search for a word translation
97        \param word to be translated
98       */
99     void search(QString word);
100
101     /*! sets active dictionaries (searches are performed only in active dicts
102        \param List of dictionaris to be activated
103       */
104     void selectedDictionaries(QList<CommonDictInterface* >);
105
106     /*! adds new dictionary and activate it
107       \param dict dictionary to be added
108       \param active decides whether searches are perfomed in given dictionaries
109       */
110     void addDictionary(CommonDictInterface* dict, bool active = 1);
111
112
113     //! stops all current activity - emiting signal \see closeOk
114     void quit();
115
116
117     /*! Fired with given interval during searches -
118         checking if translation is ready
119       */
120     void translationReady();
121
122     /*! Fired with given interval during html searches -
123         checking if html is ready
124       */
125     void htmlTranslationReady();
126
127     /*! Removes given dictionary
128         \param dict dictionary to be deleted
129       */
130     void removeDictionary(CommonDictInterface* dict);
131
132     /*! saves plugins new state/configuration after each change */
133     void dictUpdated();
134
135     // TODO addToBookmark(Translation*);
136     // TODO removeFromBookmark(Translation*);
137
138 Q_SIGNALS:
139     /*! emmited when backbone is ready to close - after getting stop signal it
140         should kill all threads and so on */
141     void closeOk();
142
143     //! emitted when there are search result ready to fetch
144     void ready();
145
146     //! emitted when html result is ready to fetch
147     void htmlReady();
148
149
150
151 private:
152     QHash<CommonDictInterface*, bool> _dicts;
153     QList<CommonDictInterface*> _plugins;
154     QList<QFuture<QList<Translation*> > > _innerResult;
155     QList<QFuture<QString> > _innerHtmlResult;
156     QMultiHash<QString, Translation*> _result;
157     QStringList _htmlResult;
158     QTimer _timerSearch, _timerHtmlSearch;
159     QTime _time;
160     QString _pluginPath, _defaultPluginPath;
161     QString _configPath;
162     QString _defaultConfigPath;
163     int _searchLimit, _defaultSearchLimit;
164     int _activeSearchNum;
165     int _interval; //Search fetching timer.timeout interval in msec
166     int _historyLen, _defaultHistoryLen;
167     bool dryRun;
168
169     void init();
170     QStringList getFilesFromDir(QString dir, QStringList nameFilter);
171     void loadPlugins(); //< locate and load plugins
172     void loadPrefs(QString fileName);
173     void loadDicts(QString fileName, bool _default=false);
174     void saveState(QSettings*, Settings*, bool, uint);
175     void addInternalDictionary(CommonDictInterface*, bool);
176     void savePrefs(QSettings*);
177     void saveDefaultPrefs(QSettings*);
178     CommonDictInterface* plugin(QString type); //< search for given type plugin
179
180     History* _history;
181
182 };
183
184 #endif // BACKBONE_H