Switch to side-by-side view

--- a/src/qtgui/confgui/confguiindex.cpp
+++ b/src/qtgui/confgui/confguiindex.cpp
@@ -107,7 +107,7 @@
     m_widgets.push_back(w);
     tabWidget->addTab(w, QObject::tr("Global parameters"));
 	
-    w = new ConfSubPanelW(this, m_conf);
+    w = new ConfSubPanelW(this, m_conf, m_rclconf);
     m_widgets.push_back(w);
     tabWidget->addTab(w, QObject::tr("Local parameters"));
 
@@ -225,21 +225,26 @@
 ConfTopPanelW::ConfTopPanelW(QWidget *parent, ConfNull *config)
     : QWidget(parent)
 {
+    QWidget *w = 0;
+
     QGridLayout *gl1 = new QGridLayout(this);
     gl1->setSpacing(spacing);
     gl1->setMargin(margin);
 
-    ConfLink lnktopdirs(new ConfLinkRclRep(config, "topdirs"));
-    ConfParamDNLW *etopdirs = new 
-	ConfParamDNLW(this, lnktopdirs, tr("Top directories"),
-		      tr("The list of directories where recursive "
-			 "indexing starts. Default: your home."));
-    setSzPol(etopdirs, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3);
-    gl1->addWidget(etopdirs, 0, 0, 1, 2);
-
-    ConfLink lnkskp(new ConfLinkRclRep(config, "skippedPaths"));
+    int gridrow = 0;
+
+    w = new ConfParamDNLW(this, 
+                          ConfLink(new ConfLinkRclRep(config, "topdirs")), 
+                          tr("Top directories"),
+                          tr("The list of directories where recursive "
+                             "indexing starts. Default: your home."));
+    setSzPol(w, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3);
+    gl1->addWidget(w, gridrow++, 0, 1, 2);
+
     ConfParamSLW *eskp = new 
-	ConfParamSLW(this, lnkskp, tr("Skipped paths"),
+	ConfParamSLW(this, 
+                     ConfLink(new ConfLinkRclRep(config, "skippedPaths")), 
+                     tr("Skipped paths"),
 		     tr("These are names of directories which indexing "
 			"will not enter.<br> May contain wildcards. "
 			"Must match "
@@ -249,7 +254,7 @@
 			"would be '/home/me/tmp*', not '/usr/home/me/tmp*')"));
     eskp->setFsEncoding(true);
     setSzPol(eskp, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3);
-    gl1->addWidget(eskp, 1, 0, 1, 2);
+    gl1->addWidget(eskp, gridrow++, 0, 1, 2);
 
     vector<string> cstemlangs = Rcl::Db::getStemmerNames();
     QStringList stemlangs;
@@ -257,103 +262,112 @@
 	 it != cstemlangs.end(); it++) {
 	stemlangs.push_back(QString::fromUtf8(it->c_str()));
     }
-    ConfLink lnkidxsl(new ConfLinkRclRep(config, "indexstemminglanguages"));
-    ConfParamCSLW *eidxsl = new 
-	ConfParamCSLW(this, lnkidxsl, tr("Stemming languages"),
+    w = new 
+	ConfParamCSLW(this, 
+                      ConfLink(new ConfLinkRclRep(config, 
+                                                  "indexstemminglanguages")),
+                      tr("Stemming languages"),
 		      tr("The languages for which stemming expansion<br>"
 			 "dictionaries will be built."), stemlangs);
-    setSzPol(eidxsl, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1);
-    gl1->addWidget(eidxsl, 2, 0, 1, 2);
-
-    ConfLink lnk4(new ConfLinkRclRep(config, "logfilename"));
-    ConfParamFNW *e4 = new 
-	ConfParamFNW(this, lnk4, tr("Log file name"),
-		     tr("The file where the messages will be written.<br>"
-			"Use 'stderr' for terminal output"), false);
-    gl1->addWidget(e4, 3, 0, 1, 2);
-
-    QWidget *w = 0;
-
-    ConfLink lnk1(new ConfLinkRclRep(config, "loglevel"));
-    w = new ConfParamIntW(this, lnk1, tr("Log verbosity level"),
-		      tr("This value adjusts the amount of "
-			 "messages,<br>from only errors to a "
-			 "lot of debugging data."), 0, 6);
-    gl1->addWidget(w, 4, 0);
-
-    ConfLink lnkidxflsh(new ConfLinkRclRep(config, "idxflushmb"));
-    w = new ConfParamIntW(this, lnkidxflsh, 
+    setSzPol(w, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1);
+    gl1->addWidget(w, gridrow, 0);
+    
+
+    w = new ConfParamFNW(this, 
+                         ConfLink(new ConfLinkRclRep(config, "logfilename")), 
+                         tr("Log file name"),
+                         tr("The file where the messages will be written.<br>"
+                            "Use 'stderr' for terminal output"), false);
+    gl1->addWidget(w, gridrow++, 1);
+
+    
+    w = new ConfParamIntW(this, 
+                          ConfLink(new ConfLinkRclRep(config, "loglevel")), 
+                          tr("Log verbosity level"),
+                          tr("This value adjusts the amount of "
+                             "messages,<br>from only errors to a "
+                             "lot of debugging data."), 0, 6);
+    gl1->addWidget(w, gridrow, 0);
+
+    w = new ConfParamIntW(this, 
+                          ConfLink(new ConfLinkRclRep(config, "idxflushmb")),
                           tr("Index flush megabytes interval"),
                           tr("This value adjust the amount of "
 			 "data which is indexed between flushes to disk.<br>"
 			 "This helps control the indexer memory usage. "
 			 "Default 10MB "), 0, 1000);
-    gl1->addWidget(w, 4, 1);
-
-    ConfLink lnkfsocc(new ConfLinkRclRep(config, "maxfsoccuppc"));
-    w = new ConfParamIntW(this, lnkfsocc, tr("Max disk occupation (%)"),
-		      tr("This is the percentage of disk occupation where "
-			 "indexing will fail and stop (to avoid filling up "
-			 "your disk).<br>"
-			 "0 means no limit (this is the default)."), 0, 100);
-    gl1->addWidget(w, 5, 0);
-
-    ConfLink lnknaspl(new ConfLinkRclRep(config, "noaspell"));
+    gl1->addWidget(w, gridrow++, 1);
+
+    w = new ConfParamIntW(this, 
+                          ConfLink(new ConfLinkRclRep(config, "maxfsoccuppc")),
+                          tr("Max disk occupation (%)"),
+                          tr("This is the percentage of disk occupation where "
+                             "indexing will fail and stop (to avoid filling up "
+                             "your disk).<br>0 means no limit "
+                             "(this is the default)."), 0, 100);
+    gl1->addWidget(w, gridrow++, 0);
+
     ConfParamBoolW* cpasp =
-    new ConfParamBoolW(this, lnknaspl, tr("No aspell usage"),
-		       tr("Disables use of aspell to generate spelling "
-			  "approximation in the term explorer tool.<br> "
-			  "Useful if aspell is absent or does not work. "));
-    gl1->addWidget(cpasp, 6, 0);
-
-    ConfLink lnk2(new ConfLinkRclRep(config, "aspellLanguage"));
-    ConfParamStrW* cpaspl =
-        new ConfParamStrW(this, lnk2, tr("Aspell language"),
-		      tr("The language for the aspell dictionary. "
-			 "This should look like 'en' or 'fr' ...<br>"
-			 "If this value is not set, the NLS environment "
+        new ConfParamBoolW(this, 
+                           ConfLink(new ConfLinkRclRep(config, "noaspell")), 
+                           tr("No aspell usage"),
+                           tr("Disables use of aspell to generate spelling "
+                              "approximation in the term explorer tool.<br> "
+                              "Useful if aspell is absent or does not work. "));
+    gl1->addWidget(cpasp, gridrow, 0);
+
+    ConfParamStrW* cpaspl = new 
+        ConfParamStrW(this, 
+                      ConfLink(new ConfLinkRclRep(config, "aspellLanguage")),
+                      tr("Aspell language"),
+                      tr("The language for the aspell dictionary. "
+                         "This should look like 'en' or 'fr' ...<br>"
+                         "If this value is not set, the NLS environment "
 			 "will be used to compute it, which usually works. "
 			 "To get an idea of what is installed on your system, "
 			 "type 'aspell config' and look for .dat files inside "
 			 "the 'data-dir' directory. "));
     cpaspl->setEnabled(!cpasp->m_cb->isChecked());
     connect(cpasp->m_cb, SIGNAL(toggled(bool)), cpaspl,SLOT(setDisabled(bool)));
-    gl1->addWidget(cpaspl, 6, 1);
-
-    ConfLink lnkdbd(new ConfLinkRclRep(config, "dbdir"));
-    ConfParamFNW *edbd = new 
-	ConfParamFNW(this, lnkdbd, tr("Database directory name"),
-		     tr("The name for a directory where to store the index<br>"
+    gl1->addWidget(cpaspl, gridrow++, 1);
+
+    w = new 
+        ConfParamFNW(this, 
+                     ConfLink(new ConfLinkRclRep(config, "dbdir")),
+                     tr("Database directory name"),
+                     tr("The name for a directory where to store the index<br>"
 			"A non-absolute path is taken relative to the "
 			"configuration directory. The default is 'xapiandb'."
 			), true);
-    gl1->addWidget(edbd, 7, 0, 1, 2);
+    gl1->addWidget(w, gridrow++, 0, 1, 2);
     
-    ConfLink lnkuexc(new ConfLinkRclRep(config, "unac_except_trans"));
-    ConfParamStrW *euexc = new 
-	ConfParamStrW(this, lnkuexc, tr("Unac exceptions"),
-		     tr("<p>These are exceptions to the unac mechanism "
-			"which, by default, removes all diacritics, "
-			"and performs canonic decomposition. You can override "
-			"unaccenting for some characters, depending on your "
-			"language, and specify additional decompositions, "
-			"e.g. for ligatures. In each space-separated entry, "
-			"the first character is the source one, and the rest "
-			"is the translation."
-			));
-    gl1->addWidget(euexc, 8, 0, 1, 2);
-}
-
-ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config)
+    w = new 
+	ConfParamStrW(this, 
+                      ConfLink(new ConfLinkRclRep(config, "unac_except_trans")),
+                      tr("Unac exceptions"),
+                      tr("<p>These are exceptions to the unac mechanism "
+                         "which, by default, removes all diacritics, "
+                         "and performs canonic decomposition. You can override "
+                         "unaccenting for some characters, depending on your "
+                         "language, and specify additional decompositions, "
+                         "e.g. for ligatures. In each space-separated entry, "
+                         "the first character is the source one, and the rest "
+                         "is the translation."
+                          ));
+    gl1->addWidget(w, gridrow++, 0, 1, 2);
+}
+
+ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config, 
+                             RclConfig *rclconf)
     : QWidget(parent), m_config(config)
 {
     QVBoxLayout *vboxLayout = new QVBoxLayout(this);
     vboxLayout->setSpacing(spacing);
     vboxLayout->setMargin(margin);
 
-    ConfLink lnksubkeydirs(new ConfLinkNullRep());
     m_subdirs = new 
-	ConfParamDNLW(this, lnksubkeydirs, 
+	ConfParamDNLW(this, 
+                      ConfLink(new ConfLinkNullRep()), 
 		      QObject::tr("<b>Customised subtrees"),
 		      QObject::tr("The list of subdirectories in the indexed "
 				  "hierarchy <br>where some parameters need "
@@ -404,16 +418,41 @@
     QGridLayout *gl1 = new QGridLayout(m_groupbox);
     gl1->setSpacing(spacing);
     gl1->setMargin(margin);
-
-    ConfLink lnkskn(new ConfLinkRclRep(config, "skippedNames", &m_sk));
-    ConfParamSLW *eskn = new 
-	ConfParamSLW(m_groupbox, lnkskn, 
-		     QObject::tr("Skipped names"),
-		     QObject::tr("These are patterns for file or directory "
-				 " names which should not be indexed."));
+    int gridy = 0;
+
+    ConfParamSLW *eskn = new ConfParamSLW(
+        m_groupbox, 
+        ConfLink(new ConfLinkRclRep(config, "skippedNames", &m_sk)),
+        QObject::tr("Skipped names"),
+        QObject::tr("These are patterns for file or directory "
+                    " names which should not be indexed."));
     eskn->setFsEncoding(true);
     m_widgets.push_back(eskn);
-    gl1->addWidget(eskn, 0, 0, 1, 2);
+    gl1->addWidget(eskn, gridy, 0);
+
+    vector<string> amimes = rclconf->getAllMimeTypes();
+    QStringList amimesq;
+    for (vector<string>::const_iterator it = amimes.begin(); 
+	 it != amimes.end(); it++) {
+	amimesq.push_back(QString::fromUtf8(it->c_str()));
+    }
+
+    ConfParamCSLW *eincm = new ConfParamCSLW(
+        m_groupbox, 
+        ConfLink(new ConfLinkRclRep(config, "indexedmimetypes", &m_sk)),
+        tr("Only mime types"),
+        tr("An exclusive list of indexed mime types.<br>Nothing "
+           "else will be indexed. Normally empty and inactive"), amimesq);
+    m_widgets.push_back(eincm);
+    gl1->addWidget(eincm, gridy++, 1);
+
+    ConfParamCSLW *eexcm = new ConfParamCSLW(
+        m_groupbox, 
+        ConfLink(new ConfLinkRclRep(config, "excludedmimetypes", &m_sk)),
+        tr("Exclude mime types"),
+        tr("Mime types not to be indexed"), amimesq);
+    m_widgets.push_back(eexcm);
+    gl1->addWidget(eexcm, gridy, 0);
 
     vector<string> args;
     args.push_back("-l");
@@ -434,85 +473,81 @@
 	charsets.push_back(QString::fromUtf8(it->c_str()));
     }
 
-    ConfLink lnk21(new ConfLinkRclRep(config, "defaultcharset", &m_sk));
-    ConfParamCStrW *e21 = new 
-	ConfParamCStrW(m_groupbox, lnk21, 
-		       QObject::tr("Default character set"),
-		       QObject::tr("This is the character set used for reading files "
-			  "which do not identify the character set "
-			  "internally, for example pure text files.<br>"
-			  "The default value is empty, "
-			  "and the value from the NLS environnement is used."
-			  ), charsets);
+    ConfParamCStrW *e21 = new ConfParamCStrW(
+        m_groupbox, 
+        ConfLink(new ConfLinkRclRep(config, "defaultcharset", &m_sk)), 
+        QObject::tr("Default<br>character set"),
+        QObject::tr("Character set used for reading files "
+                    "which do not identify the character set "
+                    "internally, for example pure text files.<br>"
+                    "The default value is empty, "
+                    "and the value from the NLS environnement is used."
+            ), charsets);
     m_widgets.push_back(e21);
-    gl1->addWidget(e21, 1, 0, 1, 2);
-
-    ConfLink lnk3(new ConfLinkRclRep(config, "followLinks", &m_sk));
-    ConfParamBoolW *e3 = new 
-	ConfParamBoolW(m_groupbox, lnk3, 
-		        QObject::tr("Follow symbolic links"),
-		        QObject::tr("Follow symbolic links while "
-			  "indexing. The default is no, "
-			  "to avoid duplicate indexing"));
+    gl1->addWidget(e21, gridy++, 1);
+
+    ConfParamBoolW *e3 = new ConfParamBoolW(
+        m_groupbox, 
+        ConfLink(new ConfLinkRclRep(config, "followLinks", &m_sk)), 
+        QObject::tr("Follow symbolic links"),
+        QObject::tr("Follow symbolic links while "
+                    "indexing. The default is no, "
+                    "to avoid duplicate indexing"));
     m_widgets.push_back(e3);
-    gl1->addWidget(e3, 2, 0);
-
-    ConfLink lnkafln(new ConfLinkRclRep(config, "indexallfilenames", &m_sk));
-    ConfParamBoolW *eafln = new 
-	ConfParamBoolW(m_groupbox, lnkafln, 
-		       QObject::tr("Index all file names"),
-		       QObject::tr("Index the names of files for which the contents "
-			  "cannot be identified or processed (no or "
-			  "unsupported mime type). Default true"));
+    gl1->addWidget(e3, gridy, 0);
+
+    ConfParamBoolW *eafln = new ConfParamBoolW(
+        m_groupbox, 
+        ConfLink(new ConfLinkRclRep(config, "indexallfilenames", &m_sk)), 
+        QObject::tr("Index all file names"),
+        QObject::tr("Index the names of files for which the contents "
+                    "cannot be identified or processed (no or "
+                    "unsupported mime type). Default true"));
     m_widgets.push_back(eafln);
-    gl1->addWidget(eafln, 2, 1);
-
-    ConfLink lnkzfmaxkbs(new ConfLinkRclRep(config, "compressedfilemaxkbs"));
-    ConfParamIntW *ezfmaxkbs = new 
-	ConfParamIntW(m_groupbox, lnkzfmaxkbs, 
-		      tr("Max. compressed file size (KB)"),
-		      tr("This value sets a threshold beyond which compressed"
-			 "files will not be processed. Set to -1 for no "
-			 "limit, to 0 for no decompression ever."),
-		      -1, 1000000, -1);
+    gl1->addWidget(eafln, gridy++, 1);
+
+    ConfParamIntW *ezfmaxkbs = new ConfParamIntW(
+        m_groupbox, 
+        ConfLink(new ConfLinkRclRep(config, "compressedfilemaxkbs", &m_sk)), 
+        tr("Max. compressed file size (KB)"),
+        tr("This value sets a threshold beyond which compressed"
+           "files will not be processed. Set to -1 for no "
+           "limit, to 0 for no decompression ever."), -1, 1000000, -1);
     m_widgets.push_back(ezfmaxkbs);
-    gl1->addWidget(ezfmaxkbs, 3, 0);
-
-    ConfLink lnktxtmaxmbs(new ConfLinkRclRep(config, "textfilemaxmbs"));
-    ConfParamIntW *etxtmaxmbs = new 
-	ConfParamIntW(m_groupbox, lnktxtmaxmbs, 
-		      tr("Max. text file size (MB)"),
-		      tr("This value sets a threshold beyond which text "
-			 "files will not be processed. Set to -1 for no "
-			 "limit. \nThis is for excluding monster "
-                         "log files from the index."),
-		      -1, 1000000);
+    gl1->addWidget(ezfmaxkbs, gridy, 0);
+
+    ConfParamIntW *etxtmaxmbs = new ConfParamIntW(
+        m_groupbox,
+        ConfLink(new ConfLinkRclRep(config, "textfilemaxmbs", &m_sk)), 
+        tr("Max. text file size (MB)"),
+        tr("This value sets a threshold beyond which text "
+           "files will not be processed. Set to -1 for no "
+           "limit. \nThis is for excluding monster "
+           "log files from the index."), -1, 1000000);
     m_widgets.push_back(etxtmaxmbs);
-    gl1->addWidget(etxtmaxmbs, 3, 1);
-
-    ConfLink lnktxtpagekbs(new ConfLinkRclRep(config, "textfilepagekbs"));
-    ConfParamIntW *etxtpagekbs = new 
-	ConfParamIntW(m_groupbox, lnktxtpagekbs, 
-		      tr("Text file page size (KB)"),
-		      tr("If this value is set (not equal to -1), text "
-                         "files will be split in chunks of this size for "
-                         "indexing.\nThis will help searching very big text "
-                         " files (ie: log files)."),
-		      -1, 1000000);
+    gl1->addWidget(etxtmaxmbs, gridy++, 1);
+
+    ConfParamIntW *etxtpagekbs = new ConfParamIntW(
+        m_groupbox, 
+        ConfLink(new ConfLinkRclRep(config, "textfilepagekbs", &m_sk)),
+        tr("Text file page size (KB)"),
+        tr("If this value is set (not equal to -1), text "
+           "files will be split in chunks of this size for "
+           "indexing.\nThis will help searching very big text "
+           " files (ie: log files)."), -1, 1000000);
     m_widgets.push_back(etxtpagekbs);
-    gl1->addWidget(etxtpagekbs, 4, 0);
-
-    ConfLink lnkfiltmaxsecs(new ConfLinkRclRep(config, "filtermaxseconds"));
-    ConfParamIntW *efiltmaxsecs = new 
-	ConfParamIntW(m_groupbox, lnkfiltmaxsecs, 
-		      tr("Max. filter exec. time (S)"),
-		      tr("External filters working longer than this will be "
-                         "aborted. This is for the rare case (ie: postscript) "
-                         "where a document could cause a filter to loop. "
-			 "Set to -1 for no limit.\n"),
-		      -1, 10000);
+    gl1->addWidget(etxtpagekbs, gridy, 0);
+
+    ConfParamIntW *efiltmaxsecs = new ConfParamIntW(
+        m_groupbox, 
+        ConfLink(new ConfLinkRclRep(config, "filtermaxseconds", &m_sk)), 
+        tr("Max. filter exec. time (S)"),
+        tr("External filters working longer than this will be "
+           "aborted. This is for the rare case (ie: postscript) "
+           "where a document could cause a filter to loop. "
+           "Set to -1 for no limit.\n"), -1, 10000);
     m_widgets.push_back(efiltmaxsecs);
-    gl1->addWidget(efiltmaxsecs, 4, 1);
+    gl1->addWidget(efiltmaxsecs, gridy++, 1);
 
     vboxLayout->addWidget(m_groupbox);
     subDirChanged(0, 0);