summaryrefslogtreecommitdiffstats
path: root/kfind/kftabdlg.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit4aed2c8219774f5d797760606b8489a92ddc5163 (patch)
tree3f8c130f7d269626bf6a9447407ef6c35954426a /kfind/kftabdlg.cpp
downloadtdebase-4aed2c8219774f5d797760606b8489a92ddc5163.tar.gz
tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kfind/kftabdlg.cpp')
-rw-r--r--kfind/kftabdlg.cpp871
1 files changed, 871 insertions, 0 deletions
diff --git a/kfind/kftabdlg.cpp b/kfind/kftabdlg.cpp
new file mode 100644
index 000000000..7f8f73f96
--- /dev/null
+++ b/kfind/kftabdlg.cpp
@@ -0,0 +1,871 @@
+/***********************************************************************
+ *
+ * kftabdlg.cpp
+ *
+ **********************************************************************/
+
+#include <qbuttongroup.h>
+#include <qradiobutton.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qwhatsthis.h>
+#include <qtooltip.h>
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qpushbutton.h>
+#include <qapplication.h>
+
+#include <kcalendarsystem.h>
+#include <kglobal.h>
+#include <kcombobox.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kfiledialog.h>
+#include <kregexpeditorinterface.h>
+#include <kparts/componentfactory.h>
+#include <kstandarddirs.h>
+
+#include "kquery.h"
+#include "kftabdlg.h"
+
+// Static utility functions
+static void save_pattern(QComboBox *, const QString &, const QString &);
+
+#define SPECIAL_TYPES 7
+
+class KSortedMimeTypeList : public QPtrList<KMimeType>
+{
+public:
+ KSortedMimeTypeList() { };
+ int compareItems(QPtrCollection::Item s1, QPtrCollection::Item s2)
+ {
+ KMimeType *item1 = (KMimeType *) s1;
+ KMimeType *item2 = (KMimeType *) s2;
+ if (item1->comment() > item2->comment()) return 1;
+ if (item1->comment() == item2->comment()) return 0;
+ return -1;
+ }
+};
+
+KfindTabWidget::KfindTabWidget(QWidget *parent, const char *name)
+ : QTabWidget( parent, name ), regExpDialog(0)
+{
+ // This validator will be used for all numeric edit fields
+ //KDigitValidator *digitV = new KDigitValidator(this);
+
+ // ************ Page One ************
+
+ pages[0] = new QWidget( this, "page1" );
+
+ nameBox = new KComboBox(TRUE, pages[0], "combo1");
+ nameBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); // allow smaller than widest entry
+ QLabel * namedL = new QLabel(nameBox, i18n("&Named:"), pages[0], "named");
+ QToolTip::add( namedL, i18n("You can use wildcard matching and \";\" for separating multiple names") );
+ dirBox = new KComboBox(TRUE, pages[0], "combo2");
+ dirBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); // allow smaller than widest entry
+ QLabel * lookinL = new QLabel(dirBox, i18n("Look &in:"), pages[0], "named");
+ subdirsCb = new QCheckBox(i18n("Include &subfolders"), pages[0]);
+ caseSensCb = new QCheckBox(i18n("Case s&ensitive search"), pages[0]);
+ browseB = new QPushButton(i18n("&Browse..."), pages[0]);
+ useLocateCb = new QCheckBox(i18n("&Use files index"), pages[0]);
+
+ // Setup
+
+ subdirsCb->setChecked(true);
+ caseSensCb->setChecked(false);
+ useLocateCb->setChecked(false);
+ if(KStandardDirs::findExe("locate")==NULL)
+ useLocateCb->setEnabled(false);
+
+ nameBox->setDuplicatesEnabled(FALSE);
+ nameBox->setFocus();
+ dirBox->setDuplicatesEnabled(FALSE);
+
+ nameBox->setInsertionPolicy(QComboBox::AtTop);
+ dirBox->setInsertionPolicy(QComboBox::AtTop);
+
+ const QString nameWhatsThis
+ = i18n("<qt>Enter the filename you are looking for. <br>"
+ "Alternatives may be separated by a semicolon \";\".<br>"
+ "<br>"
+ "The filename may contain the following special characters:"
+ "<ul>"
+ "<li><b>?</b> matches any single character</li>"
+ "<li><b>*</b> matches zero or more of any characters</li>"
+ "<li><b>[...]</b> matches any of the characters in braces</li>"
+ "</ul>"
+ "<br>"
+ "Example searches:"
+ "<ul>"
+ "<li><b>*.kwd;*.txt</b> finds all files ending with .kwd or .txt</li>"
+ "<li><b>go[dt]</b> finds god and got</li>"
+ "<li><b>Hel?o</b> finds all files that start with \"Hel\" and end with \"o\", "
+ "having one character in between</li>"
+ "<li><b>My Document.kwd</b> finds a file of exactly that name</li>"
+ "</ul></qt>");
+ QWhatsThis::add(nameBox,nameWhatsThis);
+ QWhatsThis::add(namedL,nameWhatsThis);
+ const QString whatsfileindex
+ = i18n("<qt>This lets you use the files' index created by the <i>slocate</i> "
+ "package to speed-up the search; remember to update the index from time to time "
+ "(using <i>updatedb</i>)."
+ "</qt>");
+ QWhatsThis::add(useLocateCb,whatsfileindex);
+
+ // Layout
+
+ QGridLayout *grid = new QGridLayout( pages[0], 3, 2,
+ KDialog::marginHint(),
+ KDialog::spacingHint() );
+ QBoxLayout *subgrid = new QVBoxLayout( -1 , "subgrid" );
+ grid->addWidget( namedL, 0, 0 );
+ grid->addMultiCellWidget( nameBox, 0, 0, 1, 2 );
+ grid->addWidget( lookinL, 1, 0 );
+ grid->addWidget( dirBox, 1, 1 );
+ grid->addWidget( browseB, 1, 2);
+ grid->setColStretch(1,1);
+ grid->addMultiCellLayout( subgrid, 2, 2, 1, 2 );
+ subgrid->addWidget( subdirsCb );
+ subgrid->addWidget( caseSensCb);
+ subgrid->addWidget( useLocateCb );
+ subgrid->addStretch(1);
+
+ // Signals
+
+ connect( browseB, SIGNAL(clicked()),
+ this, SLOT(getDirectory()) );
+
+ connect( nameBox, SIGNAL(activated(int)),
+ this, SIGNAL(startSearch()));
+
+ // ************ Page Two
+
+ pages[1] = new QWidget( this, "page2" );
+
+ findCreated = new QCheckBox(i18n("Find all files created or &modified:"), pages[1]);
+ bg = new QButtonGroup();
+ rb[0] = new QRadioButton(i18n("&between"), pages[1] );
+ rb[1] = new QRadioButton(i18n("&during the previous"), pages[1] );
+ QLabel * andL = new QLabel(i18n("and"), pages[1], "and");
+ betweenType = new KComboBox(FALSE, pages[1], "comboBetweenType");
+ betweenType->insertItem(i18n("minute(s)"));
+ betweenType->insertItem(i18n("hour(s)"));
+ betweenType->insertItem(i18n("day(s)"));
+ betweenType->insertItem(i18n("month(s)"));
+ betweenType->insertItem(i18n("year(s)"));
+ betweenType->setCurrentItem(1);
+
+
+ QDate dt = KGlobal::locale()->calendar()->addYears(QDate::currentDate(), -1);
+
+ fromDate = new KDateCombo(dt, pages[1], "fromDate");
+ toDate = new KDateCombo(pages[1], "toDate");
+ timeBox = new QSpinBox(1, 60, 1, pages[1], "timeBox");
+
+ sizeBox =new KComboBox(FALSE, pages[1], "sizeBox");
+ QLabel * sizeL =new QLabel(sizeBox,i18n("File &size is:"), pages[1],"size");
+ sizeEdit=new QSpinBox(0, INT_MAX, 1, pages[1], "sizeEdit" );
+ sizeEdit->setValue(1);
+ sizeUnitBox =new KComboBox(FALSE, pages[1], "sizeUnitBox");
+
+ m_usernameBox = new KComboBox( true, pages[1], "m_combo1");
+ QLabel *usernameLabel= new QLabel(m_usernameBox,i18n("Files owned by &user:"),pages[1]);
+ m_groupBox = new KComboBox( true, pages[1], "m_combo2");
+ QLabel *groupLabel= new QLabel(m_groupBox,i18n("Owned by &group:"),pages[1]);
+
+ sizeBox ->insertItem( i18n("(none)") );
+ sizeBox ->insertItem( i18n("At Least") );
+ sizeBox ->insertItem( i18n("At Most") );
+ sizeBox ->insertItem( i18n("Equal To") );
+
+ sizeUnitBox ->insertItem( i18n("Bytes") );
+ sizeUnitBox ->insertItem( i18n("KB") );
+ sizeUnitBox ->insertItem( i18n("MB") );
+ sizeUnitBox ->insertItem( i18n("GB") );
+ sizeUnitBox ->setCurrentItem(1);
+
+ int tmp = sizeEdit->fontMetrics().width(" 000000000 ");
+ sizeEdit->setMinimumSize(tmp, sizeEdit->sizeHint().height());
+
+ m_usernameBox->setDuplicatesEnabled(FALSE);
+ m_groupBox->setDuplicatesEnabled(FALSE);
+ m_usernameBox->setInsertionPolicy(QComboBox::AtTop);
+ m_groupBox->setInsertionPolicy(QComboBox::AtTop);
+
+
+ // Setup
+ timeBox->setButtonSymbols(QSpinBox::PlusMinus);
+ rb[0]->setChecked(true);
+ bg->insert( rb[0] );
+ bg->insert( rb[1] );
+
+ // Layout
+
+ QGridLayout *grid1 = new QGridLayout( pages[1], 5, 6,
+ KDialog::marginHint(),
+ KDialog::spacingHint() );
+
+ grid1->addMultiCellWidget(findCreated, 0, 0, 0, 3 );
+ grid1->addColSpacing(0, KDialog::spacingHint());
+
+ grid1->addWidget(rb[0], 1, 1 );
+ grid1->addWidget(fromDate, 1, 2 );
+ grid1->addWidget(andL, 1, 3, AlignHCenter );
+ grid1->addWidget(toDate, 1, 4 );
+
+ grid1->addWidget(rb[1], 2, 1 );
+ grid1->addMultiCellWidget(timeBox, 2, 2, 2, 3);
+ grid1->addWidget(betweenType, 2, 4 );
+
+ grid1->addMultiCellWidget(sizeL,3,3,0,1);
+ grid1->addWidget(sizeBox,3,2);
+ grid1->addWidget(sizeEdit,3,3);
+ grid1->addWidget(sizeUnitBox,3,4);
+
+ grid1->addMultiCellWidget(usernameLabel,4,4,0,1);
+ grid1->addWidget(m_usernameBox,4,2);
+ grid1->addWidget(groupLabel,4,3);
+ grid1->addWidget(m_groupBox,4,4);
+
+ for (int c=1; c<=4; c++)
+ grid1->setColStretch(c,1);
+
+ grid1->setRowStretch(6,1);
+
+ // Connect
+ connect( findCreated, SIGNAL(toggled(bool)), SLOT(fixLayout()) );
+ connect( bg, SIGNAL(clicked(int)), this, SLOT(fixLayout()) );
+ connect( sizeBox, SIGNAL(highlighted(int)), this, SLOT(slotSizeBoxChanged(int)));
+
+
+ // ************ Page Three
+
+ pages[2] = new QWidget( this, "page3" );
+
+ typeBox =new KComboBox(FALSE, pages[2], "typeBox");
+ typeBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); // allow smaller than widest entry
+ QLabel * typeL =new QLabel(typeBox, i18n("File &type:"), pages[2], "type");
+ textEdit=new KLineEdit(pages[2], "textEdit" );
+ QLabel * textL =new QLabel(textEdit, i18n("C&ontaining text:"), pages[2], "text");
+
+ connect( textEdit, SIGNAL(returnPressed(const QString &)), SIGNAL( startSearch()));
+
+ const QString containingtext
+ = i18n("<qt>If specified, only files that contain this text"
+ " are found. Note that not all file types from the list"
+ " above are supported. Please refer to the documentation"
+ " for a list of supported file types."
+ "</qt>");
+ QToolTip::add(textEdit,containingtext);
+ QWhatsThis::add(textL,containingtext);
+
+ caseContextCb =new QCheckBox(i18n("Case s&ensitive"), pages[2]);
+ binaryContextCb =new QCheckBox(i18n("Include &binary files"), pages[2]);
+ regexpContentCb =new QCheckBox(i18n("Regular e&xpression"), pages[2]);
+
+ const QString binaryTooltip
+ = i18n("<qt>This lets you search in any type of file, "
+ "even those that usually do not contain text (for example "
+ "program files and images).</qt>");
+ QToolTip::add(binaryContextCb,binaryTooltip);
+
+ QPushButton* editRegExp = 0;
+ if ( !KTrader::self()->query("KRegExpEditor/KRegExpEditor").isEmpty() ) {
+ // The editor is available, so lets use it.
+ editRegExp = new QPushButton(i18n("&Edit..."), pages[2], "editRegExp");
+ }
+
+ metainfokeyEdit=new KLineEdit(pages[2], "textEdit" );
+ metainfoEdit=new KLineEdit(pages[2], "textEdit" );
+ QLabel * textMetaInfo = new QLabel(metainfoEdit, i18n("fo&r:"), pages[2], "text");
+ QLabel * textMetaKey = new QLabel(metainfokeyEdit, i18n("Search &metainfo sections:"), pages[2], "text");
+
+ // Setup
+ typeBox->insertItem(i18n("All Files & Folders"));
+ typeBox->insertItem(i18n("Files"));
+ typeBox->insertItem(i18n("Folders"));
+ typeBox->insertItem(i18n("Symbolic Links"));
+ typeBox->insertItem(i18n("Special Files (Sockets, Device Files, ...)"));
+ typeBox->insertItem(i18n("Executable Files"));
+ typeBox->insertItem(i18n("SUID Executable Files"));
+ typeBox->insertItem(i18n("All Images"));
+ typeBox->insertItem(i18n("All Video"));
+ typeBox->insertItem(i18n("All Sounds"));
+
+ initMimeTypes();
+ initSpecialMimeTypes();
+
+ for ( KMimeType::List::ConstIterator it = m_types.begin();
+ it != m_types.end(); ++it )
+ {
+ KMimeType::Ptr typ = *it;
+ typeBox->insertItem(typ->pixmap( KIcon::Small ), typ->comment());
+ }
+
+ if ( editRegExp ) {
+ // The editor was available, so lets use it.
+ connect( regexpContentCb, SIGNAL(toggled(bool) ), editRegExp, SLOT(setEnabled(bool)) );
+ editRegExp->setEnabled(false);
+ connect( editRegExp, SIGNAL(clicked()), this, SLOT( slotEditRegExp() ) );
+ }
+ else
+ regexpContentCb->hide();
+
+ // Layout
+ tmp = sizeEdit->fontMetrics().width(" 00000 ");
+ sizeEdit->setMinimumSize(tmp, sizeEdit->sizeHint().height());
+
+ QGridLayout *grid2 = new QGridLayout( pages[2], 5, 4,
+ KDialog::marginHint(),
+ KDialog::spacingHint() );
+ grid2->addWidget( typeL, 0, 0 );
+ grid2->addWidget( textL, 1, 0 );
+ grid2->addMultiCellWidget( typeBox, 0, 0, 1, 3 );
+ grid2->addMultiCellWidget( textEdit, 1, 1, 1, 3 );
+ grid2->addWidget( regexpContentCb, 2, 2);
+ grid2->addWidget( caseContextCb, 2, 1 );
+ grid2->addWidget( binaryContextCb, 3, 1);
+
+ grid2->addWidget( textMetaKey, 4, 0 );
+ grid2->addWidget( metainfokeyEdit, 4, 1 );
+ grid2->addWidget( textMetaInfo, 4, 2, AlignHCenter );
+ grid2->addWidget( metainfoEdit, 4, 3 );
+
+ metainfokeyEdit->setText("*");
+
+ if ( editRegExp ) {
+ // The editor was available, so lets use it.
+ grid2->addWidget( editRegExp, 2, 3 );
+ }
+
+ addTab( pages[0], i18n("Name/&Location") );
+ addTab( pages[2], i18n("C&ontents") );
+ addTab( pages[1], i18n("&Properties") );
+
+
+ // Setup
+ const QString whatsmetainfo
+ = i18n("<qt>Search within files' specific comments/metainfo<br>"
+ "These are some examples:<br>"
+ "<ul>"
+ "<li><b>Audio files (mp3...)</b> Search in id3 tag for a title, an album</li>"
+ "<li><b>Images (png...)</b> Search images with a special resolution, comment...</li>"
+ "</ul>"
+ "</qt>");
+ const QString whatsmetainfokey
+ = i18n("<qt>If specified, search only in this field<br>"
+ "<ul>"
+ "<li><b>Audio files (mp3...)</b> This can be Title, Album...</li>"
+ "<li><b>Images (png...)</b> Search only in Resolution, Bitdepth...</li>"
+ "</ul>"
+ "</qt>");
+ QWhatsThis::add(textMetaInfo,whatsmetainfo);
+ QToolTip::add(metainfoEdit,whatsmetainfo);
+ QWhatsThis::add(textMetaKey,whatsmetainfokey);
+ QToolTip::add(metainfokeyEdit,whatsmetainfokey);
+
+
+ fixLayout();
+ loadHistory();
+}
+
+KfindTabWidget::~KfindTabWidget()
+{
+ delete pages[0];
+ delete pages[1];
+ delete pages[2];
+}
+
+void KfindTabWidget::setURL( const KURL & url )
+{
+ KConfig *conf = KGlobal::config();
+ conf->setGroup("History");
+ m_url = url;
+ QStringList sl = conf->readPathListEntry("Directories");
+ dirBox->clear(); // make sure there is no old Stuff in there
+
+ if(!sl.isEmpty()) {
+ dirBox->insertStringList(sl);
+ // If the _searchPath already exists in the list we do not
+ // want to add it again
+ int indx = sl.findIndex(m_url.prettyURL());
+ if(indx == -1)
+ dirBox->insertItem(m_url.prettyURL(), 0); // make it the first one
+ else
+ dirBox->setCurrentItem(indx);
+ }
+ else {
+ QDir m_dir("/lib");
+ dirBox ->insertItem( m_url.prettyURL() );
+ dirBox ->insertItem( "file:" + QDir::homeDirPath() );
+ dirBox ->insertItem( "file:/" );
+ dirBox ->insertItem( "file:/usr" );
+ if (m_dir.exists())
+ dirBox ->insertItem( "file:/lib" );
+ dirBox ->insertItem( "file:/home" );
+ dirBox ->insertItem( "file:/etc" );
+ dirBox ->insertItem( "file:/var" );
+ dirBox ->insertItem( "file:/mnt" );
+ }
+}
+
+void KfindTabWidget::initMimeTypes()
+{
+ KMimeType::List tmp = KMimeType::allMimeTypes();
+ KSortedMimeTypeList sortedList;
+ for ( KMimeType::List::ConstIterator it = tmp.begin();
+ it != tmp.end(); ++it )
+ {
+ KMimeType * type = *it;
+ if ((!type->comment().isEmpty())
+ && (!type->name().startsWith("kdedevice/"))
+ && (!type->name().startsWith("all/")))
+ sortedList.append(type);
+ }
+ sortedList.sort();
+ for ( KMimeType *type = sortedList.first(); type; type = sortedList.next())
+ {
+ m_types.append(type);
+ }
+}
+
+void KfindTabWidget::initSpecialMimeTypes()
+{
+ KMimeType::List tmp = KMimeType::allMimeTypes();
+
+ for ( KMimeType::List::ConstIterator it = tmp.begin(); it != tmp.end(); ++it )
+ {
+ KMimeType * type = *it;
+
+ if(!type->comment().isEmpty()) {
+ if(type->name().startsWith("image/"))
+ m_ImageTypes.append(type->name());
+ else if(type->name().startsWith("video/"))
+ m_VideoTypes.append(type->name());
+ else if(type->name().startsWith("audio/"))
+ m_AudioTypes.append(type->name());
+ }
+ }
+}
+
+void KfindTabWidget::saveHistory()
+{
+ save_pattern(nameBox, "History", "Patterns");
+ save_pattern(dirBox, "History", "Directories");
+}
+
+void KfindTabWidget::loadHistory()
+{
+ // Load pattern history
+ KConfig *conf = KGlobal::config();
+ conf->setGroup("History");
+ QStringList sl = conf->readListEntry("Patterns");
+ if(!sl.isEmpty())
+ nameBox->insertStringList(sl);
+ else
+ nameBox->insertItem("*");
+
+ sl = conf->readPathListEntry("Directories");
+ if(!sl.isEmpty()) {
+ dirBox->insertStringList(sl);
+ // If the _searchPath already exists in the list we do not
+ // want to add it again
+ int indx = sl.findIndex(m_url.prettyURL());
+ if(indx == -1)
+ dirBox->insertItem(m_url.prettyURL(), 0); // make it the first one
+ else
+ dirBox->setCurrentItem(indx);
+ }
+ else {
+ QDir m_dir("/lib");
+ dirBox ->insertItem( m_url.prettyURL() );
+ dirBox ->insertItem( "file:" + QDir::homeDirPath() );
+ dirBox ->insertItem( "file:/" );
+ dirBox ->insertItem( "file:/usr" );
+ if (m_dir.exists())
+ dirBox ->insertItem( "file:/lib" );
+ dirBox ->insertItem( "file:/home" );
+ dirBox ->insertItem( "file:/etc" );
+ dirBox ->insertItem( "file:/var" );
+ dirBox ->insertItem( "file:/mnt" );
+ }
+}
+
+void KfindTabWidget::slotEditRegExp()
+{
+ if ( ! regExpDialog )
+ regExpDialog = KParts::ComponentFactory::createInstanceFromQuery<QDialog>( "KRegExpEditor/KRegExpEditor", QString::null, this );
+
+ KRegExpEditorInterface *iface = static_cast<KRegExpEditorInterface *>( regExpDialog->qt_cast( "KRegExpEditorInterface" ) );
+ if ( !iface )
+ return;
+
+ iface->setRegExp( textEdit->text() );
+ bool ok = regExpDialog->exec();
+ if ( ok )
+ textEdit->setText( iface->regExp() );
+}
+
+void KfindTabWidget::setFocus()
+{
+ nameBox->setFocus();
+ nameBox->lineEdit()->selectAll();
+}
+
+void KfindTabWidget::slotSizeBoxChanged(int index)
+{
+ sizeEdit->setEnabled((bool)(index != 0));
+ sizeUnitBox->setEnabled((bool)(index != 0));
+}
+
+void KfindTabWidget::setDefaults()
+{
+ QDate dt = KGlobal::locale()->calendar()->addYears(QDate::currentDate(), -1);
+
+ fromDate ->setDate(dt);
+ toDate ->setDate(QDate::currentDate());
+
+ timeBox->setValue(1);
+ betweenType->setCurrentItem(1);
+
+ typeBox ->setCurrentItem(0);
+ sizeBox ->setCurrentItem(0);
+ sizeUnitBox ->setCurrentItem(1);
+ sizeEdit->setValue(1);
+}
+
+/*
+ Checks if dates are correct and popups a error box
+ if they are not.
+*/
+bool KfindTabWidget::isDateValid()
+{
+ // All files
+ if ( !findCreated->isChecked() ) return TRUE;
+
+ if (rb[1]->isChecked())
+ {
+ if (timeBox->value() > 0 ) return TRUE;
+
+ KMessageBox::sorry(this, i18n("Unable to search within a period which is less than a minute."));
+ return FALSE;
+ }
+
+ // If we can not parse either of the dates or
+ // "from" date is bigger than "to" date return FALSE.
+ QDate hi1, hi2;
+
+ QString str;
+ if ( ! fromDate->getDate(&hi1).isValid() ||
+ ! toDate->getDate(&hi2).isValid() )
+ str = i18n("The date is not valid.");
+ else if ( hi1 > hi2 )
+ str = i18n("Invalid date range.");
+ else if ( QDate::currentDate() < hi1 )
+ str = i18n("Unable to search dates in the future.");
+
+ if (!str.isNull()) {
+ KMessageBox::sorry(0, str);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void KfindTabWidget::setQuery(KQuery *query)
+{
+ KIO::filesize_t size;
+ KIO::filesize_t sizeunit;
+ bool itemAlreadyContained(false);
+ // only start if we have valid dates
+ if (!isDateValid()) return;
+
+ query->setPath(KURL(dirBox->currentText().stripWhiteSpace()));
+
+ for (int idx=0; idx<dirBox->count(); idx++)
+ if (dirBox->text(idx)==dirBox->currentText())
+ itemAlreadyContained=true;
+
+ if (!itemAlreadyContained)
+ dirBox->insertItem(dirBox->currentText().stripWhiteSpace(),0);
+
+ QString regex = nameBox->currentText().isEmpty() ? "*" : nameBox->currentText();
+ query->setRegExp(regex, caseSensCb->isChecked());
+ itemAlreadyContained=false;
+ for (int idx=0; idx<nameBox->count(); idx++)
+ if (nameBox->text(idx)==nameBox->currentText())
+ itemAlreadyContained=true;
+
+ if (!itemAlreadyContained)
+ nameBox->insertItem(nameBox->currentText(),0);
+
+ query->setRecursive(subdirsCb->isChecked());
+
+ switch (sizeUnitBox->currentItem())
+ {
+ case 0:
+ sizeunit = 1; //one byte
+ break;
+ case 2:
+ sizeunit = 1048576; //1M
+ break;
+ case 3:
+ sizeunit = 1073741824; //1GB
+ break;
+ case 1: //fall to default case
+ default:
+ sizeunit = 1024; //1k
+ break;
+ }
+ size = sizeEdit->value() * sizeunit;
+
+// TODO: troeder: do we need this check since it is very unlikely-
+// to exceed ULLONG_MAX with INT_MAX * 1024^3.-
+// Or is there an arch where this can happen?
+#if 0
+ if (size < 0) // overflow
+ if (KMessageBox::warningYesNo(this, i18n("Size is too big. Set maximum size value?"), i18n("Error"),i18n("Set"),i18n("Do Not Set"))
+ == KMessageBox::Yes)
+ {
+ sizeEdit->setValue(INT_MAX);
+ sizeUnitBox->setCurrentItem(0);
+ size = INT_MAX;
+ }
+ else
+ return;
+#endif
+
+ // set range mode and size value
+ query->setSizeRange(sizeBox->currentItem(),size,0);
+
+ // dates
+ QDateTime epoch;
+ epoch.setTime_t(0);
+
+ // Add date predicate
+ if (findCreated->isChecked()) { // Modified
+ if (rb[0]->isChecked()) { // Between dates
+ QDate q1, q2;
+ fromDate->getDate(&q1);
+ toDate->getDate(&q2);
+
+ // do not generate negative numbers .. find doesn't handle that
+ time_t time1 = epoch.secsTo(q1);
+ time_t time2 = epoch.secsTo(q2.addDays(1)) - 1; // Include the last day
+
+ query->setTimeRange(time1, time2);
+ }
+ else
+ {
+ time_t cur = time(NULL);
+ time_t minutes = cur;
+
+ switch (betweenType->currentItem())
+ {
+ case 0: // minutes
+ minutes = timeBox->value();
+ break;
+ case 1: // hours
+ minutes = 60 * timeBox->value();
+ break;
+ case 2: // days
+ minutes = 60 * 24 * timeBox->value();
+ break;
+ case 3: // months
+ minutes = 60 * 24 * (time_t)(timeBox->value() * 30.41667);
+ break;
+ case 4: // years
+ minutes = 12 * 60 * 24 * (time_t)(timeBox->value() * 30.41667);
+ break;
+ }
+
+ query->setTimeRange(cur - minutes * 60, 0);
+ }
+ }
+ else
+ query->setTimeRange(0, 0);
+
+ query->setUsername( m_usernameBox->currentText() );
+ query->setGroupname( m_groupBox->currentText() );
+
+ query->setFileType(typeBox->currentItem());
+
+ int id = typeBox->currentItem()-10;
+
+ if ((id >= -3) && (id < (int) m_types.count()))
+ {
+ switch(id)
+ {
+ case -3:
+ query->setMimeType( m_ImageTypes );
+ break;
+ case -2:
+ query->setMimeType( m_VideoTypes );
+ break;
+ case -1:
+ query->setMimeType( m_AudioTypes );
+ break;
+ default:
+ query->setMimeType( m_types[id]->name() );
+ }
+ }
+ else
+ {
+ query->setMimeType( QString::null );
+ }
+
+ //Metainfo
+ query->setMetaInfo(metainfoEdit->text(), metainfokeyEdit->text());
+
+ //Use locate to speed-up search ?
+ query->setUseFileIndex(useLocateCb->isChecked());
+
+ query->setContext(textEdit->text(), caseContextCb->isChecked(),
+ binaryContextCb->isChecked(), regexpContentCb->isChecked());
+}
+
+QString KfindTabWidget::date2String(const QDate & date) {
+ return(KGlobal::locale()->formatDate(date, true));
+}
+
+QDate &KfindTabWidget::string2Date(const QString & str, QDate *qd) {
+ return *qd = KGlobal::locale()->readDate(str);
+}
+
+void KfindTabWidget::getDirectory()
+{
+ QString result =
+ KFileDialog::getExistingDirectory( dirBox->text(dirBox->currentItem()).stripWhiteSpace(),
+ this );
+
+ if (!result.isEmpty())
+ {
+ for (int i = 0; i < dirBox->count(); i++)
+ if (result == dirBox->text(i)) {
+ dirBox->setCurrentItem(i);
+ return;
+ }
+ dirBox->insertItem(result, 0);
+ dirBox->setCurrentItem(0);
+ }
+}
+
+void KfindTabWidget::beginSearch()
+{
+/// dirlister->openURL(KURL(dirBox->currentText().stripWhiteSpace()));
+
+ saveHistory();
+ setEnabled( FALSE );
+}
+
+void KfindTabWidget::endSearch()
+{
+ setEnabled( TRUE );
+}
+
+/*
+ Disables/enables all edit fields depending on their
+ respective check buttons.
+*/
+void KfindTabWidget::fixLayout()
+{
+ int i;
+ // If "All files" is checked - disable all edits
+ // and second radio group on page two
+
+ if(! findCreated->isChecked()) {
+ fromDate->setEnabled(FALSE);
+ toDate->setEnabled(FALSE);
+ timeBox->setEnabled(FALSE);
+ for(i=0; i<2; i++)
+ rb[i]->setEnabled(FALSE);
+ betweenType->setEnabled(FALSE);
+ }
+ else {
+ for(i=0; i<2; i++)
+ rb[i]->setEnabled(TRUE);
+
+ fromDate->setEnabled(rb[0]->isChecked());
+ toDate->setEnabled(rb[0]->isChecked());
+ timeBox->setEnabled(rb[1]->isChecked());
+ betweenType->setEnabled(rb[1]->isChecked());
+ }
+
+ // Size box on page three
+ sizeEdit->setEnabled(sizeBox->currentItem() != 0);
+ sizeUnitBox->setEnabled(sizeBox->currentItem() != 0);
+}
+
+bool KfindTabWidget::isSearchRecursive()
+{
+ return subdirsCb->isChecked();
+}
+
+
+/**
+ Digit validator. Allows only digits to be typed.
+**/
+KDigitValidator::KDigitValidator( QWidget * parent, const char *name )
+ : QValidator( parent, name )
+{
+ r = new QRegExp("^[0-9]*$");
+}
+
+KDigitValidator::~KDigitValidator()
+{
+ delete r;
+}
+
+QValidator::State KDigitValidator::validate( QString & input, int & ) const
+{
+ if (r->search(input) < 0) {
+ // Beep on user if he enters non-digit
+ QApplication::beep();
+ return QValidator::Invalid;
+ }
+ else
+ return QValidator::Acceptable;
+}
+
+//*******************************************************
+// Static utility functions
+//*******************************************************
+static void save_pattern(QComboBox *obj,
+ const QString & group, const QString & entry)
+{
+ // QComboBox allows insertion of items more than specified by
+ // maxCount() (QT bug?). This API call will truncate list if needed.
+ obj->setMaxCount(15);
+
+ // make sure the current item is saved first so it will be the
+ // default when started next time
+ QStringList sl;
+ QString cur = obj->currentText();
+ sl.append(cur);
+ for (int i = 0; i < obj->count(); i++) {
+ if( cur != obj->text(i) ) {
+ sl.append(obj->text(i));
+ }
+ }
+
+ KConfig *conf = KGlobal::config();
+ conf->setGroup(group);
+ conf->writePathEntry(entry, sl);
+}
+
+QSize KfindTabWidget::sizeHint() const
+{
+ // #44662: avoid a huge default size when the comboboxes have very large items
+ // Like in minicli, we changed the combobox size policy so that they can resize down,
+ // and then we simply provide a reasonable size hint for the whole window, depending
+ // on the screen width.
+ QSize sz = QTabWidget::sizeHint();
+ KfindTabWidget* me = const_cast<KfindTabWidget*>( this );
+ const int screenWidth = qApp->desktop()->screenGeometry(me).width();
+ if ( sz.width() > screenWidth / 2 )
+ sz.setWidth( screenWidth / 2 );
+ return sz;
+}
+
+#include "kftabdlg.moc"