1 /* Copyright (C) 2005-2020 J.F.Dockes
2  *   This program is free software; you can redistribute it and/or modify
3  *   it under the terms of the GNU General Public License as published by
4  *   the Free Software Foundation; either version 2 of the License, or
5  *   (at your option) any later version.
6  *
7  *   This program is distributed in the hope that it will be useful,
8  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *   GNU General Public License for more details.
11  *
12  *   You should have received a copy of the GNU General Public License
13  *   along with this program; if not, write to the
14  *   Free Software Foundation, Inc.,
15  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16  */
17 
18 #include <iostream>
19 
20 #include "rclmain_w.h"
21 #include "ssearch_w.h"
22 
23 #include <QMenu>
24 #include <QPushButton>
25 #include <QMessageBox>
26 
buildMenus()27 void RclMain::buildMenus()
28 {
29     fileMenu = new QMenu();
30     fileMenu->setObjectName(QString::fromUtf8("fileMenu"));
31     fileMenu->setTitle(QApplication::translate("RclMainBase", "&File"));
32     viewMenu = new QMenu();
33     viewMenu->setObjectName(QString::fromUtf8("viewMenu"));
34     viewMenu->setTitle(QApplication::translate("RclMainBase", "&View"));
35     toolsMenu = new QMenu();
36     toolsMenu->setObjectName(QString::fromUtf8("toolsMenu"));
37     toolsMenu->setTitle(QApplication::translate("RclMainBase", "&Tools"));
38     preferencesMenu = new QMenu();
39     preferencesMenu->setObjectName(QString::fromUtf8("preferencesMenu"));
40     preferencesMenu->setTitle(QApplication::translate("RclMainBase",
41                                                       "&Preferences"));
42     helpMenu = new QMenu();
43     helpMenu->setObjectName(QString::fromUtf8("helpMenu"));
44     helpMenu->setTitle(QApplication::translate("RclMainBase", "&Help"));
45     resultsMenu = new QMenu();
46     resultsMenu->setObjectName(QString::fromUtf8("resultsMenu"));
47     resultsMenu->setTitle(QApplication::translate("RclMainBase", "&Results"));
48     queryMenu = new QMenu();
49     queryMenu->setObjectName(QString::fromUtf8("queryMenu"));
50     queryMenu->setTitle(QApplication::translate("RclMainBase", "&Query"));
51 
52 
53     fileMenu->insertAction(fileRebuildIndexAction, fileBumpIndexingAction);
54     fileMenu->addAction(fileToggleIndexingAction);
55     fileMenu->addAction(fileRebuildIndexAction);
56     fileMenu->addAction(actionSpecial_Indexing);
57     fileMenu->addSeparator();
58     fileMenu->addAction(actionSave_last_query);
59     fileMenu->addAction(actionLoad_saved_query);
60     fileMenu->addSeparator();
61     fileMenu->addAction(fileExportSSearchHistoryAction);
62     fileMenu->addAction(fileEraseSearchHistoryAction);
63     fileMenu->addSeparator();
64     fileMenu->addAction(fileEraseDocHistoryAction);
65     fileMenu->addSeparator();
66     fileMenu->addAction(fileExitAction);
67 
68     viewMenu->addSeparator();
69     viewMenu->addAction(toggleFullScreenAction);
70     viewMenu->addAction(zoomInAction);
71     viewMenu->addAction(zoomOutAction);
72 
73     toolsMenu->addAction(toolsDoc_HistoryAction);
74     toolsMenu->addAction(toolsAdvanced_SearchAction);
75     toolsMenu->addAction(toolsSpellAction);
76     toolsMenu->addAction(actionQuery_Fragments);
77     toolsMenu->addAction(actionWebcache_Editor);
78     toolsMenu->addAction(showMissingHelpers_Action);
79     toolsMenu->addAction(showActiveTypes_Action);
80     toolsMenu->addAction(actionShow_index_statistics);
81 
82     preferencesMenu->addAction(queryPrefsAction);
83     preferencesMenu->addSeparator();
84     preferencesMenu->addAction(indexConfigAction);
85     preferencesMenu->addAction(indexScheduleAction);
86 
87     queryMenu->addSection(QIcon(), tr("Simple search type"));
88     sstypGroup = new QActionGroup(this);
89     auto actSSAny = new QAction(tr("Any term"), this);
90 
91     actSSAny->setData(QVariant(SSearch::SST_ANY));
92     actSSAny->setCheckable(true);
93     sstypGroup->addAction(actSSAny);
94     queryMenu->addAction(actSSAny);
95     auto actSSAll = new QAction(tr("All terms"), this);
96     actSSAll->setData(QVariant(SSearch::SST_ALL));
97     actSSAll->setCheckable(true);
98     sstypGroup->addAction(actSSAll);
99     queryMenu->addAction(actSSAll);
100     auto actSSFile = new QAction(tr("File name"), this);
101     actSSFile->setData(QVariant(SSearch::SST_FNM));
102     actSSFile->setCheckable(true);
103     sstypGroup->addAction(actSSFile);
104     queryMenu->addAction(actSSFile);
105     auto actSSQuery = new QAction(tr("Query language"), this);
106     actSSQuery->setData(QVariant(SSearch::SST_LANG));
107     actSSQuery->setCheckable(true);
108     sstypGroup->addAction(actSSQuery);
109     queryMenu->addAction(actSSQuery);
110     queryMenu->addSeparator();
111     queryMenu->addAction(enbSynAction);
112     queryMenu->addSeparator();
113     queryMenu->addAction(extIdxAction);
114     connect(queryMenu, SIGNAL(triggered(QAction *)), this,
115                           SLOT(onSSTypMenu(QAction *)));
116     connect(sSearch->searchTypCMB, SIGNAL(currentIndexChanged(int)), this,
117             SLOT(onSSTypCMB(int)));
118     queryMenu->addSection(QIcon(), tr("Stemming language"));
119     // Stemming language menu
120     g_stringNoStem = tr("(no stemming)");
121     g_stringAllStem = tr("(all languages)");
122     m_idNoStem = queryMenu->addAction(g_stringNoStem);
123     m_idNoStem->setCheckable(true);
124     m_stemLangToId[g_stringNoStem] = m_idNoStem;
125     m_idAllStem = queryMenu->addAction(g_stringAllStem);
126     m_idAllStem->setCheckable(true);
127     m_stemLangToId[g_stringAllStem] = m_idAllStem;
128     // Can't get the stemming languages from the db at this stage as
129     // db not open yet (the case where it does not even exist makes
130     // things complicated). So get the languages from the config
131     // instead
132     vector<string> langs;
133     if (!getStemLangs(langs)) {
134         QMessageBox::warning(0, "Recoll",
135                              tr("error retrieving stemming languages"));
136     }
137     QAction *curid = prefs.queryStemLang == "ALL" ? m_idAllStem : m_idNoStem;
138     QAction *id;
139     for (const auto& lang : langs) {
140         QString qlang = u8s2qs(lang);
141         id = queryMenu->addAction(qlang);
142         id->setCheckable(true);
143         m_stemLangToId[qlang] = id;
144         if (prefs.queryStemLang == qlang) {
145             curid = id;
146         }
147     }
148     curid->setChecked(true);
149 
150     helpMenu->addAction(userManualAction);
151     helpMenu->addAction(showMissingHelpers_Action);
152     helpMenu->addAction(showActiveTypes_Action);
153     helpMenu->addSeparator();
154     helpMenu->addAction(helpAbout_RecollAction);
155 
156     resultsMenu->addAction(nextPageAction);
157     resultsMenu->addAction(prevPageAction);
158     resultsMenu->addAction(firstPageAction);
159     resultsMenu->addSeparator();
160     resultsMenu->addAction(actionSortByDateAsc);
161     resultsMenu->addAction(actionSortByDateDesc);
162     resultsMenu->addSeparator();
163     resultsMenu->addAction(actionShowQueryDetails);
164     resultsMenu->addSeparator();
165     resultsMenu->addAction(actionShowResultsAsTable);
166     resultsMenu->addSeparator();
167     resultsMenu->addAction(actionSaveResultsAsCSV);
168 
169     MenuBar->addAction(fileMenu->menuAction());
170     MenuBar->addAction(queryMenu->menuAction());
171     MenuBar->addAction(resultsMenu->menuAction());
172     MenuBar->addAction(viewMenu->menuAction());
173     MenuBar->addAction(toolsMenu->menuAction());
174     MenuBar->addAction(preferencesMenu->menuAction());
175     MenuBar->addSeparator();
176     MenuBar->addAction(helpMenu->menuAction());
177 
178     buttonTopMenu = new QMenu();
179     buttonTopMenu->addAction(fileMenu->menuAction());
180     buttonTopMenu->addAction(queryMenu->menuAction());
181     buttonTopMenu->addAction(viewMenu->menuAction());
182     buttonTopMenu->addAction(toolsMenu->menuAction());
183     buttonTopMenu->addAction(resultsMenu->menuAction());
184     buttonTopMenu->addAction(preferencesMenu->menuAction());
185     buttonTopMenu->addSeparator();
186     buttonTopMenu->addAction(helpMenu->menuAction());
187     sSearch->menuPB->setMenu(buttonTopMenu);
188 
189     return;
190 }
191 
onSSTypMenu(QAction * act)192 void RclMain::onSSTypMenu(QAction *act)
193 {
194     if (act->actionGroup() != sstypGroup) {
195         return;
196     }
197     int id = act->data().toInt();
198     sSearch->onSearchTypeChanged(id);
199 }
200 
onSSTypCMB(int idx)201 void RclMain::onSSTypCMB(int idx)
202 {
203     QList<QAction*> ssacts = sstypGroup->actions();
204     for (int i = 0; i < ssacts.size(); ++i) {
205         if (ssacts.at(i)->data().toInt() == idx)
206             ssacts.at(i)->setChecked(true);
207     }
208 }
209