~ubuntu-branches/ubuntu/lucid/kdebase/lucid

« back to all changes in this revision

Viewing changes to kfind/kftabdlg.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Ana Beatriz Guerrero Lopez
  • Date: 2009-04-05 05:22:13 UTC
  • mfrom: (0.4.2 experimental) (0.2.2 upstream)
  • mto: This revision was merged to the branch mainline in revision 235.
  • Revision ID: james.westby@ubuntu.com-20090405052213-39thr4l6p2ss07uj
Tags: 4:4.2.2-1
* New upstream release:
  - khtml fixes. (Closes: #290285, #359680)
  - Default konsole sessions can be deleted. (Closes: #286342)
  - Tag widget uses standard application palette. (Closes: #444800)
  - ... and surely many more but we have lost track...

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***********************************************************************
2
 
 *
3
 
 *  kftabdlg.cpp
4
 
 *
5
 
 **********************************************************************/
6
 
 
7
 
#include <qbuttongroup.h>
8
 
#include <qradiobutton.h>
9
 
#include <qlabel.h>
10
 
#include <qlayout.h>
11
 
#include <qcheckbox.h>
12
 
#include <qwhatsthis.h>
13
 
#include <qtooltip.h>
14
 
#include <qcombobox.h>
15
 
#include <qspinbox.h>
16
 
#include <qpushbutton.h>
17
 
#include <qapplication.h>
18
 
 
19
 
#include <kcalendarsystem.h>
20
 
#include <kglobal.h>
21
 
#include <kcombobox.h>
22
 
#include <klineedit.h>
23
 
#include <klocale.h>
24
 
#include <kmessagebox.h>
25
 
#include <kfiledialog.h>
26
 
#include <kregexpeditorinterface.h>
27
 
#include <kparts/componentfactory.h>
28
 
#include <kstandarddirs.h>
29
 
 
30
 
#include "kquery.h"
31
 
#include "kftabdlg.h"
32
 
 
33
 
// Static utility functions
34
 
static void save_pattern(QComboBox *, const QString &, const QString &);
35
 
 
36
 
#define SPECIAL_TYPES 7
37
 
 
38
 
class KSortedMimeTypeList : public QPtrList<KMimeType>
39
 
{
40
 
public:
41
 
  KSortedMimeTypeList() { };
42
 
  int compareItems(QPtrCollection::Item s1, QPtrCollection::Item s2)
43
 
  {
44
 
     KMimeType *item1 = (KMimeType *) s1;
45
 
     KMimeType *item2 = (KMimeType *) s2;
46
 
     if (item1->comment() > item2->comment()) return 1;
47
 
     if (item1->comment() == item2->comment()) return 0;
48
 
     return -1;
49
 
  }
50
 
};
51
 
 
52
 
KfindTabWidget::KfindTabWidget(QWidget *parent, const char *name)
53
 
  : QTabWidget( parent, name ), regExpDialog(0)
54
 
{
55
 
    // This validator will be used for all numeric edit fields
56
 
    //KDigitValidator *digitV = new KDigitValidator(this);
57
 
 
58
 
    // ************ Page One ************
59
 
 
60
 
    pages[0] = new QWidget( this, "page1" );
61
 
 
62
 
    nameBox = new KComboBox(TRUE, pages[0], "combo1");
63
 
    nameBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);  // allow smaller than widest entry
64
 
    QLabel * namedL = new QLabel(nameBox, i18n("&Named:"), pages[0], "named");
65
 
    QToolTip::add( namedL, i18n("You can use wildcard matching and \";\" for separating multiple names") );
66
 
    dirBox  = new KComboBox(TRUE, pages[0], "combo2");
67
 
    dirBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);  // allow smaller than widest entry
68
 
    QLabel * lookinL = new QLabel(dirBox, i18n("Look &in:"), pages[0], "named");
69
 
    subdirsCb  = new QCheckBox(i18n("Include &subfolders"), pages[0]);
70
 
    caseSensCb  = new QCheckBox(i18n("Case s&ensitive search"), pages[0]);
71
 
    browseB    = new QPushButton(i18n("&Browse..."), pages[0]);
72
 
    useLocateCb = new QCheckBox(i18n("&Use files index"), pages[0]);
73
 
 
74
 
    // Setup
75
 
 
76
 
    subdirsCb->setChecked(true);
77
 
    caseSensCb->setChecked(false);
78
 
    useLocateCb->setChecked(false);
79
 
    if(KStandardDirs::findExe("locate")==NULL)
80
 
        useLocateCb->setEnabled(false);
81
 
 
82
 
    nameBox->setDuplicatesEnabled(FALSE);
83
 
    nameBox->setFocus();
84
 
    dirBox->setDuplicatesEnabled(FALSE);
85
 
 
86
 
    nameBox->setInsertionPolicy(QComboBox::AtTop);
87
 
    dirBox->setInsertionPolicy(QComboBox::AtTop);
88
 
 
89
 
    const QString nameWhatsThis
90
 
      = i18n("<qt>Enter the filename you are looking for. <br>"
91
 
             "Alternatives may be separated by a semicolon \";\".<br>"
92
 
             "<br>"
93
 
             "The filename may contain the following special characters:"
94
 
             "<ul>"
95
 
             "<li><b>?</b> matches any single character</li>"
96
 
             "<li><b>*</b> matches zero or more of any characters</li>"
97
 
             "<li><b>[...]</b> matches any of the characters in braces</li>"
98
 
             "</ul>"
99
 
             "<br>"
100
 
             "Example searches:"
101
 
             "<ul>"
102
 
             "<li><b>*.kwd;*.txt</b> finds all files ending with .kwd or .txt</li>"
103
 
             "<li><b>go[dt]</b> finds god and got</li>"
104
 
             "<li><b>Hel?o</b> finds all files that start with \"Hel\" and end with \"o\", "
105
 
             "having one character in between</li>"
106
 
             "<li><b>My Document.kwd</b> finds a file of exactly that name</li>"
107
 
             "</ul></qt>");
108
 
    QWhatsThis::add(nameBox,nameWhatsThis);
109
 
    QWhatsThis::add(namedL,nameWhatsThis);
110
 
    const QString whatsfileindex
111
 
        = i18n("<qt>This lets you use the files' index created by the <i>slocate</i> "
112
 
               "package to speed-up the search; remember to update the index from time to time "
113
 
               "(using <i>updatedb</i>)."
114
 
               "</qt>");
115
 
    QWhatsThis::add(useLocateCb,whatsfileindex);
116
 
 
117
 
    // Layout
118
 
 
119
 
    QGridLayout *grid = new QGridLayout( pages[0], 3, 2,
120
 
                                         KDialog::marginHint(),
121
 
                                         KDialog::spacingHint() );
122
 
    QBoxLayout *subgrid = new QVBoxLayout( -1 , "subgrid" );
123
 
    grid->addWidget( namedL, 0, 0 );
124
 
    grid->addMultiCellWidget( nameBox, 0, 0, 1, 2 );
125
 
    grid->addWidget( lookinL, 1, 0 );
126
 
    grid->addWidget( dirBox, 1, 1 );
127
 
    grid->addWidget( browseB, 1, 2);
128
 
    grid->setColStretch(1,1);
129
 
    grid->addMultiCellLayout( subgrid, 2, 2, 1, 2 );
130
 
    subgrid->addWidget( subdirsCb );
131
 
    subgrid->addWidget( caseSensCb);
132
 
    subgrid->addWidget( useLocateCb );
133
 
    subgrid->addStretch(1);
134
 
 
135
 
    // Signals
136
 
 
137
 
    connect( browseB, SIGNAL(clicked()),
138
 
             this, SLOT(getDirectory()) );
139
 
 
140
 
    connect( nameBox, SIGNAL(activated(int)),
141
 
             this, SIGNAL(startSearch()));
142
 
 
143
 
    // ************ Page Two
144
 
 
145
 
    pages[1] = new QWidget( this, "page2" );
146
 
 
147
 
    findCreated =  new QCheckBox(i18n("Find all files created or &modified:"), pages[1]);
148
 
    bg  = new QButtonGroup();
149
 
    rb[0] = new QRadioButton(i18n("&between"), pages[1] );
150
 
    rb[1] = new QRadioButton(i18n("&during the previous"), pages[1] );
151
 
    QLabel * andL   = new QLabel(i18n("and"), pages[1], "and");
152
 
    betweenType = new KComboBox(FALSE, pages[1], "comboBetweenType");
153
 
    betweenType->insertItem(i18n("minute(s)"));
154
 
    betweenType->insertItem(i18n("hour(s)"));
155
 
    betweenType->insertItem(i18n("day(s)"));
156
 
    betweenType->insertItem(i18n("month(s)"));
157
 
    betweenType->insertItem(i18n("year(s)"));
158
 
    betweenType->setCurrentItem(1);
159
 
 
160
 
 
161
 
    QDate dt = KGlobal::locale()->calendar()->addYears(QDate::currentDate(), -1);
162
 
 
163
 
    fromDate = new KDateCombo(dt, pages[1], "fromDate");
164
 
    toDate = new KDateCombo(pages[1], "toDate");
165
 
    timeBox = new QSpinBox(1, 60, 1, pages[1], "timeBox");
166
 
 
167
 
    sizeBox =new KComboBox(FALSE, pages[1], "sizeBox");
168
 
    QLabel * sizeL   =new QLabel(sizeBox,i18n("File &size is:"), pages[1],"size");
169
 
    sizeEdit=new QSpinBox(0, INT_MAX, 1, pages[1], "sizeEdit" );
170
 
    sizeEdit->setValue(1);
171
 
    sizeUnitBox =new KComboBox(FALSE, pages[1], "sizeUnitBox");
172
 
 
173
 
    m_usernameBox = new KComboBox( true, pages[1], "m_combo1");
174
 
    QLabel *usernameLabel= new QLabel(m_usernameBox,i18n("Files owned by &user:"),pages[1]);
175
 
    m_groupBox = new KComboBox( true, pages[1], "m_combo2");
176
 
    QLabel *groupLabel= new QLabel(m_groupBox,i18n("Owned by &group:"),pages[1]);
177
 
 
178
 
    sizeBox ->insertItem( i18n("(none)") );
179
 
    sizeBox ->insertItem( i18n("At Least") );
180
 
    sizeBox ->insertItem( i18n("At Most") );
181
 
    sizeBox ->insertItem( i18n("Equal To") );
182
 
 
183
 
    sizeUnitBox ->insertItem( i18n("Bytes") );
184
 
    sizeUnitBox ->insertItem( i18n("KB") );
185
 
    sizeUnitBox ->insertItem( i18n("MB") );
186
 
    sizeUnitBox ->insertItem( i18n("GB") );
187
 
    sizeUnitBox ->setCurrentItem(1);
188
 
 
189
 
    int tmp = sizeEdit->fontMetrics().width(" 000000000 ");
190
 
    sizeEdit->setMinimumSize(tmp, sizeEdit->sizeHint().height());
191
 
 
192
 
    m_usernameBox->setDuplicatesEnabled(FALSE);
193
 
    m_groupBox->setDuplicatesEnabled(FALSE);
194
 
    m_usernameBox->setInsertionPolicy(QComboBox::AtTop);
195
 
    m_groupBox->setInsertionPolicy(QComboBox::AtTop);
196
 
 
197
 
 
198
 
    // Setup
199
 
    timeBox->setButtonSymbols(QSpinBox::PlusMinus);
200
 
    rb[0]->setChecked(true);
201
 
    bg->insert( rb[0] );
202
 
    bg->insert( rb[1] );
203
 
 
204
 
    // Layout
205
 
 
206
 
    QGridLayout *grid1 = new QGridLayout( pages[1], 5,  6,
207
 
                                          KDialog::marginHint(),
208
 
                                          KDialog::spacingHint() );
209
 
 
210
 
    grid1->addMultiCellWidget(findCreated, 0, 0, 0, 3 );
211
 
    grid1->addColSpacing(0, KDialog::spacingHint());
212
 
 
213
 
    grid1->addWidget(rb[0], 1, 1 );
214
 
    grid1->addWidget(fromDate, 1, 2 );
215
 
    grid1->addWidget(andL, 1, 3, AlignHCenter );
216
 
    grid1->addWidget(toDate, 1, 4 );
217
 
 
218
 
    grid1->addWidget(rb[1], 2, 1 );
219
 
    grid1->addMultiCellWidget(timeBox, 2, 2, 2, 3);
220
 
    grid1->addWidget(betweenType, 2, 4 );
221
 
 
222
 
    grid1->addMultiCellWidget(sizeL,3,3,0,1);
223
 
    grid1->addWidget(sizeBox,3,2);
224
 
    grid1->addWidget(sizeEdit,3,3);
225
 
    grid1->addWidget(sizeUnitBox,3,4);
226
 
 
227
 
    grid1->addMultiCellWidget(usernameLabel,4,4,0,1);
228
 
    grid1->addWidget(m_usernameBox,4,2);
229
 
    grid1->addWidget(groupLabel,4,3);
230
 
    grid1->addWidget(m_groupBox,4,4);
231
 
 
232
 
    for (int c=1; c<=4; c++)
233
 
       grid1->setColStretch(c,1);
234
 
 
235
 
    grid1->setRowStretch(6,1);
236
 
 
237
 
    // Connect
238
 
    connect( findCreated,  SIGNAL(toggled(bool)),   SLOT(fixLayout()) );
239
 
    connect( bg,  SIGNAL(clicked(int)), this,   SLOT(fixLayout()) );
240
 
    connect( sizeBox, SIGNAL(highlighted(int)), this, SLOT(slotSizeBoxChanged(int)));
241
 
 
242
 
 
243
 
    // ************ Page Three
244
 
 
245
 
    pages[2] = new QWidget( this, "page3" );
246
 
 
247
 
    typeBox =new KComboBox(FALSE, pages[2], "typeBox");
248
 
    typeBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);  // allow smaller than widest entry
249
 
    QLabel * typeL   =new QLabel(typeBox, i18n("File &type:"), pages[2], "type");
250
 
    textEdit=new KLineEdit(pages[2], "textEdit" );
251
 
    QLabel * textL   =new QLabel(textEdit, i18n("C&ontaining text:"), pages[2], "text");
252
 
 
253
 
    connect( textEdit, SIGNAL(returnPressed(const QString &)), SIGNAL( startSearch()));
254
 
 
255
 
    const QString containingtext
256
 
      = i18n("<qt>If specified, only files that contain this text"
257
 
              " are found. Note that not all file types from the list"
258
 
                  " above are supported. Please refer to the documentation"
259
 
                  " for a list of supported file types."
260
 
              "</qt>");
261
 
    QToolTip::add(textEdit,containingtext);
262
 
    QWhatsThis::add(textL,containingtext);
263
 
 
264
 
    caseContextCb  =new QCheckBox(i18n("Case s&ensitive"), pages[2]);
265
 
    binaryContextCb  =new QCheckBox(i18n("Include &binary files"), pages[2]);
266
 
    regexpContentCb  =new QCheckBox(i18n("Regular e&xpression"), pages[2]);
267
 
 
268
 
    const QString binaryTooltip
269
 
      = i18n("<qt>This lets you search in any type of file, "
270
 
       "even those that usually do not contain text (for example "
271
 
           "program files and images).</qt>");
272
 
    QToolTip::add(binaryContextCb,binaryTooltip);
273
 
 
274
 
    QPushButton* editRegExp = 0;
275
 
    if ( !KTrader::self()->query("KRegExpEditor/KRegExpEditor").isEmpty() ) {
276
 
      // The editor is available, so lets use it.
277
 
      editRegExp = new QPushButton(i18n("&Edit..."), pages[2], "editRegExp");
278
 
    }
279
 
 
280
 
    metainfokeyEdit=new KLineEdit(pages[2], "textEdit" );
281
 
    metainfoEdit=new KLineEdit(pages[2], "textEdit" );
282
 
    QLabel * textMetaInfo = new QLabel(metainfoEdit, i18n("fo&r:"), pages[2], "text");
283
 
    QLabel * textMetaKey = new QLabel(metainfokeyEdit, i18n("Search &metainfo sections:"), pages[2], "text");
284
 
 
285
 
    // Setup
286
 
    typeBox->insertItem(i18n("All Files & Folders"));
287
 
    typeBox->insertItem(i18n("Files"));
288
 
    typeBox->insertItem(i18n("Folders"));
289
 
    typeBox->insertItem(i18n("Symbolic Links"));
290
 
    typeBox->insertItem(i18n("Special Files (Sockets, Device Files, ...)"));
291
 
    typeBox->insertItem(i18n("Executable Files"));
292
 
    typeBox->insertItem(i18n("SUID Executable Files"));
293
 
    typeBox->insertItem(i18n("All Images"));
294
 
    typeBox->insertItem(i18n("All Video"));
295
 
    typeBox->insertItem(i18n("All Sounds"));
296
 
 
297
 
    initMimeTypes();
298
 
    initSpecialMimeTypes();
299
 
 
300
 
    for ( KMimeType::List::ConstIterator it = m_types.begin();
301
 
          it != m_types.end(); ++it )
302
 
    {
303
 
      KMimeType::Ptr typ = *it;
304
 
      typeBox->insertItem(typ->pixmap( KIcon::Small ), typ->comment());
305
 
    }
306
 
 
307
 
    if ( editRegExp ) {
308
 
      // The editor was available, so lets use it.
309
 
      connect( regexpContentCb, SIGNAL(toggled(bool) ), editRegExp, SLOT(setEnabled(bool)) );
310
 
      editRegExp->setEnabled(false);
311
 
      connect( editRegExp, SIGNAL(clicked()), this, SLOT( slotEditRegExp() ) );
312
 
    }
313
 
    else
314
 
        regexpContentCb->hide();
315
 
 
316
 
    // Layout
317
 
    tmp = sizeEdit->fontMetrics().width(" 00000 ");
318
 
    sizeEdit->setMinimumSize(tmp, sizeEdit->sizeHint().height());
319
 
 
320
 
    QGridLayout *grid2 = new QGridLayout( pages[2], 5, 4,
321
 
                                          KDialog::marginHint(),
322
 
                                          KDialog::spacingHint() );
323
 
    grid2->addWidget( typeL, 0, 0 );
324
 
    grid2->addWidget( textL, 1, 0 );
325
 
    grid2->addMultiCellWidget( typeBox, 0, 0, 1, 3 );
326
 
    grid2->addMultiCellWidget( textEdit, 1, 1, 1, 3 );
327
 
    grid2->addWidget( regexpContentCb, 2, 2);
328
 
    grid2->addWidget( caseContextCb, 2, 1 );
329
 
    grid2->addWidget( binaryContextCb, 3, 1);
330
 
 
331
 
    grid2->addWidget( textMetaKey, 4, 0 );
332
 
    grid2->addWidget( metainfokeyEdit, 4, 1 );
333
 
    grid2->addWidget( textMetaInfo, 4, 2, AlignHCenter  );
334
 
    grid2->addWidget( metainfoEdit, 4, 3 );
335
 
 
336
 
    metainfokeyEdit->setText("*");
337
 
 
338
 
    if ( editRegExp ) {
339
 
      // The editor was available, so lets use it.
340
 
      grid2->addWidget( editRegExp, 2, 3 );
341
 
    }
342
 
 
343
 
    addTab( pages[0], i18n("Name/&Location") );
344
 
    addTab( pages[2], i18n("C&ontents") );
345
 
    addTab( pages[1], i18n("&Properties") );
346
 
 
347
 
 
348
 
    // Setup
349
 
    const QString whatsmetainfo
350
 
      = i18n("<qt>Search within files' specific comments/metainfo<br>"
351
 
             "These are some examples:<br>"
352
 
             "<ul>"
353
 
             "<li><b>Audio files (mp3...)</b> Search in id3 tag for a title, an album</li>"
354
 
             "<li><b>Images (png...)</b> Search images with a special resolution, comment...</li>"
355
 
             "</ul>"
356
 
             "</qt>");
357
 
    const QString whatsmetainfokey
358
 
      = i18n("<qt>If specified, search only in this field<br>"
359
 
             "<ul>"
360
 
             "<li><b>Audio files (mp3...)</b> This can be Title, Album...</li>"
361
 
             "<li><b>Images (png...)</b> Search only in Resolution, Bitdepth...</li>"
362
 
             "</ul>"
363
 
             "</qt>");
364
 
    QWhatsThis::add(textMetaInfo,whatsmetainfo);
365
 
    QToolTip::add(metainfoEdit,whatsmetainfo);
366
 
    QWhatsThis::add(textMetaKey,whatsmetainfokey);
367
 
    QToolTip::add(metainfokeyEdit,whatsmetainfokey);
368
 
 
369
 
 
370
 
    fixLayout();
371
 
    loadHistory();
372
 
}
373
 
 
374
 
KfindTabWidget::~KfindTabWidget()
375
 
{
376
 
  delete pages[0];
377
 
  delete pages[1];
378
 
  delete pages[2];
379
 
}
380
 
 
381
 
void KfindTabWidget::setURL( const KURL & url )
382
 
{
383
 
  KConfig *conf = KGlobal::config();
384
 
  conf->setGroup("History");
385
 
  m_url = url;
386
 
  QStringList sl = conf->readPathListEntry("Directories");
387
 
  dirBox->clear(); // make sure there is no old Stuff in there
388
 
 
389
 
  if(!sl.isEmpty()) {
390
 
    dirBox->insertStringList(sl);
391
 
    // If the _searchPath already exists in the list we do not
392
 
    // want to add it again
393
 
    int indx = sl.findIndex(m_url.prettyURL());
394
 
    if(indx == -1)
395
 
      dirBox->insertItem(m_url.prettyURL(), 0); // make it the first one
396
 
    else
397
 
      dirBox->setCurrentItem(indx);
398
 
  }
399
 
  else {
400
 
    QDir m_dir("/lib");
401
 
    dirBox ->insertItem( m_url.prettyURL() );
402
 
    dirBox ->insertItem( "file:" + QDir::homeDirPath() );
403
 
    dirBox ->insertItem( "file:/" );
404
 
    dirBox ->insertItem( "file:/usr" );
405
 
    if (m_dir.exists())
406
 
      dirBox ->insertItem( "file:/lib" );
407
 
    dirBox ->insertItem( "file:/home" );
408
 
    dirBox ->insertItem( "file:/etc" );
409
 
    dirBox ->insertItem( "file:/var" );
410
 
    dirBox ->insertItem( "file:/mnt" );
411
 
  }
412
 
}
413
 
 
414
 
void KfindTabWidget::initMimeTypes()
415
 
{
416
 
    KMimeType::List tmp = KMimeType::allMimeTypes();
417
 
    KSortedMimeTypeList sortedList;
418
 
    for ( KMimeType::List::ConstIterator it = tmp.begin();
419
 
          it != tmp.end(); ++it )
420
 
    {
421
 
      KMimeType * type = *it;
422
 
      if ((!type->comment().isEmpty())
423
 
         && (!type->name().startsWith("kdedevice/"))
424
 
         && (!type->name().startsWith("all/")))
425
 
        sortedList.append(type);
426
 
    }
427
 
    sortedList.sort();
428
 
    for ( KMimeType *type = sortedList.first(); type; type = sortedList.next())
429
 
    {
430
 
       m_types.append(type);
431
 
    }
432
 
}
433
 
 
434
 
void KfindTabWidget::initSpecialMimeTypes()
435
 
{
436
 
    KMimeType::List tmp = KMimeType::allMimeTypes();
437
 
 
438
 
    for ( KMimeType::List::ConstIterator it = tmp.begin(); it != tmp.end(); ++it )
439
 
    {
440
 
      KMimeType * type = *it;
441
 
 
442
 
      if(!type->comment().isEmpty()) {
443
 
        if(type->name().startsWith("image/"))
444
 
           m_ImageTypes.append(type->name());
445
 
        else if(type->name().startsWith("video/"))
446
 
          m_VideoTypes.append(type->name());
447
 
        else if(type->name().startsWith("audio/"))
448
 
          m_AudioTypes.append(type->name());
449
 
      }
450
 
    }
451
 
}
452
 
 
453
 
void KfindTabWidget::saveHistory()
454
 
{
455
 
  save_pattern(nameBox, "History", "Patterns");
456
 
  save_pattern(dirBox, "History", "Directories");
457
 
}
458
 
 
459
 
void KfindTabWidget::loadHistory()
460
 
{
461
 
  // Load pattern history
462
 
  KConfig *conf = KGlobal::config();
463
 
  conf->setGroup("History");
464
 
  QStringList sl = conf->readListEntry("Patterns");
465
 
  if(!sl.isEmpty())
466
 
    nameBox->insertStringList(sl);
467
 
  else
468
 
    nameBox->insertItem("*");
469
 
 
470
 
  sl = conf->readPathListEntry("Directories");
471
 
  if(!sl.isEmpty()) {
472
 
    dirBox->insertStringList(sl);
473
 
    // If the _searchPath already exists in the list we do not
474
 
    // want to add it again
475
 
    int indx = sl.findIndex(m_url.prettyURL());
476
 
    if(indx == -1)
477
 
      dirBox->insertItem(m_url.prettyURL(), 0); // make it the first one
478
 
    else
479
 
      dirBox->setCurrentItem(indx);
480
 
  }
481
 
  else {
482
 
    QDir m_dir("/lib");
483
 
    dirBox ->insertItem( m_url.prettyURL() );
484
 
    dirBox ->insertItem( "file:" + QDir::homeDirPath() );
485
 
    dirBox ->insertItem( "file:/" );
486
 
    dirBox ->insertItem( "file:/usr" );
487
 
    if (m_dir.exists())
488
 
      dirBox ->insertItem( "file:/lib" );
489
 
    dirBox ->insertItem( "file:/home" );
490
 
    dirBox ->insertItem( "file:/etc" );
491
 
    dirBox ->insertItem( "file:/var" );
492
 
    dirBox ->insertItem( "file:/mnt" );
493
 
  }
494
 
}
495
 
 
496
 
void KfindTabWidget::slotEditRegExp()
497
 
{
498
 
  if ( ! regExpDialog )
499
 
    regExpDialog = KParts::ComponentFactory::createInstanceFromQuery<QDialog>( "KRegExpEditor/KRegExpEditor", QString::null, this );
500
 
 
501
 
  KRegExpEditorInterface *iface = static_cast<KRegExpEditorInterface *>( regExpDialog->qt_cast( "KRegExpEditorInterface" ) );
502
 
  if ( !iface )
503
 
       return;
504
 
 
505
 
  iface->setRegExp( textEdit->text() );
506
 
  bool ok = regExpDialog->exec();
507
 
  if ( ok )
508
 
    textEdit->setText( iface->regExp() );
509
 
}
510
 
 
511
 
void KfindTabWidget::setFocus()
512
 
{
513
 
  nameBox->setFocus();
514
 
  nameBox->lineEdit()->selectAll();
515
 
}
516
 
 
517
 
void KfindTabWidget::slotSizeBoxChanged(int index)
518
 
{
519
 
  sizeEdit->setEnabled((bool)(index != 0));
520
 
  sizeUnitBox->setEnabled((bool)(index != 0));
521
 
}
522
 
 
523
 
void KfindTabWidget::setDefaults()
524
 
{
525
 
    QDate dt = KGlobal::locale()->calendar()->addYears(QDate::currentDate(), -1);
526
 
 
527
 
    fromDate ->setDate(dt);
528
 
    toDate ->setDate(QDate::currentDate());
529
 
 
530
 
    timeBox->setValue(1);
531
 
    betweenType->setCurrentItem(1);
532
 
 
533
 
    typeBox ->setCurrentItem(0);
534
 
    sizeBox ->setCurrentItem(0);
535
 
    sizeUnitBox ->setCurrentItem(1);
536
 
    sizeEdit->setValue(1);
537
 
}
538
 
 
539
 
/*
540
 
  Checks if dates are correct and popups a error box
541
 
  if they are not.
542
 
*/
543
 
bool KfindTabWidget::isDateValid()
544
 
{
545
 
  // All files
546
 
  if ( !findCreated->isChecked() ) return TRUE;
547
 
 
548
 
  if (rb[1]->isChecked())
549
 
  {
550
 
    if (timeBox->value() > 0 ) return TRUE;
551
 
 
552
 
    KMessageBox::sorry(this, i18n("Unable to search within a period which is less than a minute."));
553
 
    return FALSE;
554
 
  }
555
 
 
556
 
  // If we can not parse either of the dates or
557
 
  // "from" date is bigger than "to" date return FALSE.
558
 
  QDate hi1, hi2;
559
 
 
560
 
  QString str;
561
 
  if ( ! fromDate->getDate(&hi1).isValid() ||
562
 
       ! toDate->getDate(&hi2).isValid() )
563
 
    str = i18n("The date is not valid.");
564
 
  else if ( hi1 > hi2 )
565
 
    str = i18n("Invalid date range.");
566
 
  else if ( QDate::currentDate() < hi1 )
567
 
    str = i18n("Unable to search dates in the future.");
568
 
 
569
 
  if (!str.isNull()) {
570
 
    KMessageBox::sorry(0, str);
571
 
    return FALSE;
572
 
  }
573
 
  return TRUE;
574
 
}
575
 
 
576
 
void KfindTabWidget::setQuery(KQuery *query)
577
 
{
578
 
  KIO::filesize_t size;
579
 
  KIO::filesize_t sizeunit;
580
 
  bool itemAlreadyContained(false);
581
 
  // only start if we have valid dates
582
 
  if (!isDateValid()) return;
583
 
 
584
 
  query->setPath(KURL(dirBox->currentText().stripWhiteSpace()));
585
 
 
586
 
  for (int idx=0; idx<dirBox->count(); idx++)
587
 
     if (dirBox->text(idx)==dirBox->currentText())
588
 
        itemAlreadyContained=true;
589
 
 
590
 
  if (!itemAlreadyContained)
591
 
     dirBox->insertItem(dirBox->currentText().stripWhiteSpace(),0);
592
 
 
593
 
  QString regex = nameBox->currentText().isEmpty() ? "*" : nameBox->currentText();
594
 
  query->setRegExp(regex, caseSensCb->isChecked());
595
 
  itemAlreadyContained=false;
596
 
  for (int idx=0; idx<nameBox->count(); idx++)
597
 
     if (nameBox->text(idx)==nameBox->currentText())
598
 
        itemAlreadyContained=true;
599
 
 
600
 
  if (!itemAlreadyContained)
601
 
     nameBox->insertItem(nameBox->currentText(),0);
602
 
 
603
 
  query->setRecursive(subdirsCb->isChecked());
604
 
 
605
 
  switch (sizeUnitBox->currentItem())
606
 
  {
607
 
     case 0:
608
 
         sizeunit = 1; //one byte
609
 
         break;
610
 
     case 2:
611
 
         sizeunit = 1048576; //1M
612
 
         break;
613
 
     case 3:
614
 
         sizeunit = 1073741824; //1GB
615
 
         break;
616
 
     case 1: //fall to default case
617
 
     default:
618
 
         sizeunit = 1024; //1k
619
 
         break;
620
 
  }
621
 
  size = sizeEdit->value() * sizeunit;
622
 
 
623
 
// TODO: troeder: do we need this check since it is very unlikely-
624
 
// to exceed ULLONG_MAX with INT_MAX * 1024^3.-
625
 
// Or is there an arch where this can happen?
626
 
#if 0
627
 
  if (size < 0)  // overflow
628
 
     if (KMessageBox::warningYesNo(this, i18n("Size is too big. Set maximum size value?"), i18n("Error"),i18n("Set"),i18n("Do Not Set"))
629
 
           == KMessageBox::Yes)
630
 
                {
631
 
         sizeEdit->setValue(INT_MAX);
632
 
                sizeUnitBox->setCurrentItem(0);
633
 
                   size = INT_MAX;
634
 
                }
635
 
     else
636
 
        return;
637
 
#endif
638
 
 
639
 
  // set range mode and size value
640
 
  query->setSizeRange(sizeBox->currentItem(),size,0);
641
 
 
642
 
  // dates
643
 
  QDateTime epoch;
644
 
  epoch.setTime_t(0);
645
 
 
646
 
  // Add date predicate
647
 
  if (findCreated->isChecked()) { // Modified
648
 
    if (rb[0]->isChecked()) { // Between dates
649
 
      QDate q1, q2;
650
 
      fromDate->getDate(&q1);
651
 
      toDate->getDate(&q2);
652
 
 
653
 
      // do not generate negative numbers .. find doesn't handle that
654
 
      time_t time1 = epoch.secsTo(q1);
655
 
      time_t time2 = epoch.secsTo(q2.addDays(1)) - 1; // Include the last day
656
 
 
657
 
      query->setTimeRange(time1, time2);
658
 
    }
659
 
    else
660
 
    {
661
 
       time_t cur = time(NULL);
662
 
       time_t minutes = cur;
663
 
 
664
 
       switch (betweenType->currentItem())
665
 
       {
666
 
          case 0: // minutes
667
 
                 minutes = timeBox->value();
668
 
                      break;
669
 
          case 1: // hours
670
 
                 minutes = 60 * timeBox->value();
671
 
                      break;
672
 
          case 2: // days
673
 
                 minutes = 60 * 24 * timeBox->value();
674
 
                      break;
675
 
          case 3: // months
676
 
                 minutes = 60 * 24 * (time_t)(timeBox->value() * 30.41667);
677
 
                      break;
678
 
          case 4: // years
679
 
                 minutes = 12 * 60 * 24 * (time_t)(timeBox->value() * 30.41667);
680
 
                      break;
681
 
       }
682
 
 
683
 
       query->setTimeRange(cur - minutes * 60, 0);
684
 
    }
685
 
  }
686
 
  else
687
 
    query->setTimeRange(0, 0);
688
 
 
689
 
  query->setUsername( m_usernameBox->currentText() );
690
 
  query->setGroupname( m_groupBox->currentText() );
691
 
 
692
 
  query->setFileType(typeBox->currentItem());
693
 
 
694
 
  int id = typeBox->currentItem()-10;
695
 
 
696
 
  if ((id >= -3) && (id < (int) m_types.count()))
697
 
  {
698
 
    switch(id)
699
 
    {
700
 
      case -3:
701
 
        query->setMimeType( m_ImageTypes );
702
 
        break;
703
 
      case -2:
704
 
        query->setMimeType( m_VideoTypes );
705
 
        break;
706
 
      case -1:
707
 
        query->setMimeType( m_AudioTypes );
708
 
        break;
709
 
      default:
710
 
        query->setMimeType( m_types[id]->name() );
711
 
     }
712
 
  }
713
 
  else
714
 
  {
715
 
     query->setMimeType( QString::null );
716
 
  }
717
 
 
718
 
  //Metainfo
719
 
  query->setMetaInfo(metainfoEdit->text(), metainfokeyEdit->text());
720
 
 
721
 
  //Use locate to speed-up search ?
722
 
  query->setUseFileIndex(useLocateCb->isChecked());
723
 
 
724
 
  query->setContext(textEdit->text(), caseContextCb->isChecked(),
725
 
        binaryContextCb->isChecked(), regexpContentCb->isChecked());
726
 
}
727
 
 
728
 
QString KfindTabWidget::date2String(const QDate & date) {
729
 
  return(KGlobal::locale()->formatDate(date, true));
730
 
}
731
 
 
732
 
QDate &KfindTabWidget::string2Date(const QString & str, QDate *qd) {
733
 
  return *qd = KGlobal::locale()->readDate(str);
734
 
}
735
 
 
736
 
void KfindTabWidget::getDirectory()
737
 
{
738
 
  QString result =
739
 
  KFileDialog::getExistingDirectory( dirBox->text(dirBox->currentItem()).stripWhiteSpace(),
740
 
                                     this );
741
 
 
742
 
  if (!result.isEmpty())
743
 
  {
744
 
    for (int i = 0; i < dirBox->count(); i++)
745
 
      if (result == dirBox->text(i)) {
746
 
        dirBox->setCurrentItem(i);
747
 
        return;
748
 
      }
749
 
    dirBox->insertItem(result, 0);
750
 
    dirBox->setCurrentItem(0);
751
 
  }
752
 
}
753
 
 
754
 
void KfindTabWidget::beginSearch()
755
 
{
756
 
///  dirlister->openURL(KURL(dirBox->currentText().stripWhiteSpace()));
757
 
 
758
 
  saveHistory();
759
 
  setEnabled( FALSE );
760
 
}
761
 
 
762
 
void KfindTabWidget::endSearch()
763
 
{
764
 
  setEnabled( TRUE );
765
 
}
766
 
 
767
 
/*
768
 
  Disables/enables all edit fields depending on their
769
 
  respective check buttons.
770
 
*/
771
 
void KfindTabWidget::fixLayout()
772
 
{
773
 
  int i;
774
 
  // If "All files" is checked - disable all edits
775
 
  // and second radio group on page two
776
 
 
777
 
  if(! findCreated->isChecked())  {
778
 
    fromDate->setEnabled(FALSE);
779
 
    toDate->setEnabled(FALSE);
780
 
    timeBox->setEnabled(FALSE);
781
 
    for(i=0; i<2; i++)
782
 
      rb[i]->setEnabled(FALSE);
783
 
    betweenType->setEnabled(FALSE);
784
 
  }
785
 
  else {
786
 
    for(i=0; i<2; i++)
787
 
      rb[i]->setEnabled(TRUE);
788
 
 
789
 
    fromDate->setEnabled(rb[0]->isChecked());
790
 
    toDate->setEnabled(rb[0]->isChecked());
791
 
    timeBox->setEnabled(rb[1]->isChecked());
792
 
    betweenType->setEnabled(rb[1]->isChecked());
793
 
  }
794
 
 
795
 
  // Size box on page three
796
 
  sizeEdit->setEnabled(sizeBox->currentItem() != 0);
797
 
  sizeUnitBox->setEnabled(sizeBox->currentItem() != 0);
798
 
}
799
 
 
800
 
bool KfindTabWidget::isSearchRecursive()
801
 
{
802
 
  return subdirsCb->isChecked();
803
 
}
804
 
 
805
 
 
806
 
/**
807
 
   Digit validator. Allows only digits to be typed.
808
 
**/
809
 
KDigitValidator::KDigitValidator( QWidget * parent, const char *name )
810
 
  : QValidator( parent, name )
811
 
{
812
 
  r = new QRegExp("^[0-9]*$");
813
 
}
814
 
 
815
 
KDigitValidator::~KDigitValidator()
816
 
{
817
 
  delete r;
818
 
}
819
 
 
820
 
QValidator::State KDigitValidator::validate( QString & input, int & ) const
821
 
{
822
 
  if (r->search(input) < 0) {
823
 
    // Beep on user if he enters non-digit
824
 
    QApplication::beep();
825
 
    return QValidator::Invalid;
826
 
  }
827
 
  else
828
 
    return QValidator::Acceptable;
829
 
}
830
 
 
831
 
//*******************************************************
832
 
//             Static utility functions
833
 
//*******************************************************
834
 
static void save_pattern(QComboBox *obj,
835
 
                         const QString & group, const QString & entry)
836
 
{
837
 
  // QComboBox allows insertion of items more than specified by
838
 
  // maxCount() (QT bug?). This API call will truncate list if needed.
839
 
  obj->setMaxCount(15);
840
 
 
841
 
  // make sure the current item is saved first so it will be the
842
 
  // default when started next time
843
 
  QStringList sl;
844
 
  QString cur = obj->currentText();
845
 
  sl.append(cur);
846
 
  for (int i = 0; i < obj->count(); i++) {
847
 
    if( cur != obj->text(i) ) {
848
 
      sl.append(obj->text(i));
849
 
    }
850
 
  }
851
 
 
852
 
  KConfig *conf = KGlobal::config();
853
 
  conf->setGroup(group);
854
 
  conf->writePathEntry(entry, sl);
855
 
}
856
 
 
857
 
QSize KfindTabWidget::sizeHint() const
858
 
{
859
 
  // #44662: avoid a huge default size when the comboboxes have very large items
860
 
  // Like in minicli, we changed the combobox size policy so that they can resize down,
861
 
  // and then we simply provide a reasonable size hint for the whole window, depending
862
 
  // on the screen width.
863
 
  QSize sz = QTabWidget::sizeHint();
864
 
  KfindTabWidget* me = const_cast<KfindTabWidget*>( this );
865
 
  const int screenWidth = qApp->desktop()->screenGeometry(me).width();
866
 
  if ( sz.width() > screenWidth / 2 )
867
 
    sz.setWidth( screenWidth / 2 );
868
 
  return sz;
869
 
}
870
 
 
871
 
#include "kftabdlg.moc"