diff options
Diffstat (limited to 'kfind/kfwin.cpp')
-rw-r--r-- | kfind/kfwin.cpp | 434 |
1 files changed, 434 insertions, 0 deletions
diff --git a/kfind/kfwin.cpp b/kfind/kfwin.cpp new file mode 100644 index 000000000..9eca22f19 --- /dev/null +++ b/kfind/kfwin.cpp @@ -0,0 +1,434 @@ +/*********************************************************************** + * + * Kfwin.cpp + * + **********************************************************************/ + +#include <stdlib.h> +#include <stdio.h> +#include <pwd.h> +#include <grp.h> +#include <sys/types.h> +#include <unistd.h> +#include <errno.h> +#include <sys/stat.h> +#include <time.h> + +#include <qtextstream.h> +#include <qfileinfo.h> +#include <qdir.h> +#include <qclipboard.h> +#include <qpixmap.h> +#include <qdragobject.h> + +#include <kfiledialog.h> +#include <klocale.h> +#include <kapplication.h> +#include <krun.h> +#include <kprocess.h> +#include <kpropertiesdialog.h> +#include <kstandarddirs.h> +#include <kmessagebox.h> +#include <kmimetype.h> +#include <kglobal.h> +#include <kpopupmenu.h> +#include <kio/netaccess.h> +#include <kurldrag.h> +#include <qptrlist.h> +#include <kdebug.h> +#include <kiconloader.h> + +#include "kfwin.h" + +#include "kfwin.moc" + +template class QPtrList<KfFileLVI>; + +// Permission strings +static const char* perm[4] = { + I18N_NOOP( "Read-write" ), + I18N_NOOP( "Read-only" ), + I18N_NOOP( "Write-only" ), + I18N_NOOP( "Inaccessible" ) }; +#define RW 0 +#define RO 1 +#define WO 2 +#define NA 3 + +KfFileLVI::KfFileLVI(KfindWindow* lv, const KFileItem &item, const QString& matchingLine) + : QListViewItem(lv), + fileitem(item) +{ + fileInfo = new QFileInfo(item.url().path()); + + QString size = KGlobal::locale()->formatNumber(item.size(), 0); + + QDateTime dt; + dt.setTime_t(item.time(KIO::UDS_MODIFICATION_TIME)); + QString date = KGlobal::locale()->formatDateTime(dt); + + int perm_index; + if(fileInfo->isReadable()) + perm_index = fileInfo->isWritable() ? RW : RO; + else + perm_index = fileInfo->isWritable() ? WO : NA; + + // Fill the item with data + setText(0, item.url().fileName(false)); + setText(1, lv->reducedDir(item.url().directory(false))); + setText(2, size); + setText(3, date); + setText(4, i18n(perm[perm_index])); + setText(5, matchingLine); + + // put the icon into the leftmost column + setPixmap(0, item.pixmap(16)); +} + +KfFileLVI::~KfFileLVI() +{ + delete fileInfo; +} + +QString KfFileLVI::key(int column, bool) const +{ + switch (column) { + case 2: + // Returns size in bytes. Used for sorting + return QString().sprintf("%010d", fileInfo->size()); + case 3: + // Returns time in secs from 1/1/1970. Used for sorting + return QString().sprintf("%010ld", fileitem.time(KIO::UDS_MODIFICATION_TIME)); + } + + return text(column); +} + +KfindWindow::KfindWindow( QWidget *parent, const char *name ) + : KListView( parent, name ) +,m_baseDir("") +,m_menu(0) +{ + setSelectionMode( QListView::Extended ); + setShowSortIndicator( TRUE ); + + addColumn(i18n("Name")); + addColumn(i18n("In Subfolder")); + addColumn(i18n("Size")); + setColumnAlignment(2, AlignRight); + addColumn(i18n("Modified")); + setColumnAlignment(3, AlignRight); + addColumn(i18n("Permissions")); + setColumnAlignment(4, AlignRight); + + addColumn(i18n("First Matching Line")); + setColumnAlignment(5, AlignLeft); + + // Disable autoresize for all columns + // Resizing is done by resetColumns() function + for (int i = 0; i < 6; i++) + setColumnWidthMode(i, Manual); + + resetColumns(true); + + connect( this, SIGNAL(selectionChanged()), + this, SLOT( selectionHasChanged() )); + + connect(this, SIGNAL(contextMenu(KListView *, QListViewItem*,const QPoint&)), + this, SLOT(slotContextMenu(KListView *,QListViewItem*,const QPoint&))); + + connect(this, SIGNAL(executed(QListViewItem*)), + this, SLOT(slotExecute(QListViewItem*))); + setDragEnabled(true); + +} + + +QString KfindWindow::reducedDir(const QString& fullDir) +{ + if (fullDir.find(m_baseDir)==0) + { + QString tmp=fullDir.mid(m_baseDir.length()); + return tmp; + }; + return fullDir; +} + +void KfindWindow::beginSearch(const KURL& baseUrl) +{ + kdDebug()<<QString("beginSearch in: %1").arg(baseUrl.path())<<endl; + m_baseDir=baseUrl.path(+1); + haveSelection = false; + clear(); +} + +void KfindWindow::endSearch() +{ +} + +void KfindWindow::insertItem(const KFileItem &item, const QString& matchingLine) +{ + new KfFileLVI(this, item, matchingLine); +} + +// copy to clipboard aka X11 selection +void KfindWindow::copySelection() +{ + QDragObject *drag_obj = dragObject(); + + if (drag_obj) + { + QClipboard *cb = kapp->clipboard(); + cb->setData(drag_obj); + } +} + +void KfindWindow::saveResults() +{ + QListViewItem *item; + + KFileDialog *dlg = new KFileDialog(QString::null, QString::null, this, + "filedialog", true); + dlg->setOperationMode (KFileDialog::Saving); + + dlg->setCaption(i18n("Save Results As")); + + QStringList list; + + list << "text/plain" << "text/html"; + + dlg->setOperationMode(KFileDialog::Saving); + + dlg->setMimeFilter(list, QString("text/plain")); + + dlg->exec(); + + KURL u = dlg->selectedURL(); + KMimeType::Ptr mimeType = dlg->currentFilterMimeType(); + delete dlg; + + if (!u.isValid() || !u.isLocalFile()) + return; + + QString filename = u.path(); + + QFile file(filename); + + if ( !file.open(IO_WriteOnly) ) + KMessageBox::error(parentWidget(), + i18n("Unable to save results.")); + else { + QTextStream stream( &file ); + stream.setEncoding( QTextStream::Locale ); + + if ( mimeType->name() == "text/html") { + stream << QString::fromLatin1("<HTML><HEAD>\n" + "<!DOCTYPE %1>\n" + "<TITLE>%2</TITLE></HEAD>\n" + "<BODY><H1>%3</H1>" + "<DL><p>\n") + .arg(i18n("KFind Results File")) + .arg(i18n("KFind Results File")) + .arg(i18n("KFind Results File")); + + item = firstChild(); + while(item != NULL) + { + QString path=((KfFileLVI*)item)->fileitem.url().url(); + QString pretty=((KfFileLVI*)item)->fileitem.url().htmlURL(); + stream << QString::fromLatin1("<DT><A HREF=\"") << path + << QString::fromLatin1("\">") << pretty + << QString::fromLatin1("</A>\n"); + + item = item->nextSibling(); + } + stream << QString::fromLatin1("</DL><P></BODY></HTML>\n"); + } + else { + item = firstChild(); + while(item != NULL) + { + QString path=((KfFileLVI*)item)->fileitem.url().url(); + stream << path << endl; + item = item->nextSibling(); + } + } + + file.close(); + KMessageBox::information(parentWidget(), + i18n("Results were saved to file\n")+ + filename); + } +} + +// This function is called when selection is changed (both selected/deselected) +// It notifies the parent about selection status and enables/disables menubar +void KfindWindow::selectionHasChanged() +{ + emit resultSelected(true); + + QListViewItem *item = firstChild(); + while(item != 0L) + { + if(isSelected(item)) { + emit resultSelected( true ); + haveSelection = true; + return; + } + + item = item->nextSibling(); + } + + haveSelection = false; + emit resultSelected(false); +} + +void KfindWindow::deleteFiles() +{ + QString tmp = i18n("Do you really want to delete the selected file?", + "Do you really want to delete the %n selected files?",selectedItems().count()); + if (KMessageBox::warningContinueCancel(parentWidget(), tmp, "", KGuiItem( i18n("&Delete"), "editdelete")) == KMessageBox::Cancel) + return; + + // Iterate on all selected elements + QPtrList<QListViewItem> selected = selectedItems(); + for ( uint i = 0; i < selected.count(); i++ ) { + KfFileLVI *item = (KfFileLVI *) selected.at(i); + KFileItem file = item->fileitem; + + KIO::NetAccess::del(file.url(), this); + } + selected.setAutoDelete(true); +} + +void KfindWindow::fileProperties() +{ + // This dialog must be modal because it parent dialog is modal as well. + // Non-modal property dialog will hide behind the main window + (void) new KPropertiesDialog( &((KfFileLVI *)currentItem())->fileitem, this, + "propDialog", true); +} + +void KfindWindow::openFolder() +{ + KFileItem fileitem = ((KfFileLVI *)currentItem())->fileitem; + KURL url = fileitem.url(); + url.setFileName(QString::null); + + (void) new KRun(url); +} + +void KfindWindow::openBinding() +{ + ((KfFileLVI*)currentItem())->fileitem.run(); +} + +void KfindWindow::slotExecute(QListViewItem* item) +{ + if (item==0) + return; + ((KfFileLVI*)item)->fileitem.run(); +} + +// Resizes KListView to occupy all visible space +void KfindWindow::resizeEvent(QResizeEvent *e) +{ + KListView::resizeEvent(e); + resetColumns(false); + clipper()->repaint(); +} + +QDragObject * KfindWindow::dragObject() +{ + KURL::List uris; + QPtrList<QListViewItem> selected = selectedItems(); + + // create a list of URIs from selection + for ( uint i = 0; i < selected.count(); i++ ) + { + KfFileLVI *item = (KfFileLVI *) selected.at( i ); + if (item) + { + uris.append( item->fileitem.url() ); + } + } + + if ( uris.count() <= 0 ) + return 0; + + QUriDrag *ud = new KURLDrag( uris, (QWidget *) this, "kfind uridrag" ); + + const QPixmap *pix = currentItem()->pixmap(0); + if ( pix && !pix->isNull() ) + ud->setPixmap( *pix ); + + return ud; +} + +void KfindWindow::resetColumns(bool init) +{ + QFontMetrics fm = fontMetrics(); + if (init) + { + setColumnWidth(2, QMAX(fm.width(columnText(2)), fm.width("0000000")) + 15); + QString sampleDate = + KGlobal::locale()->formatDateTime(QDateTime::currentDateTime()); + setColumnWidth(3, QMAX(fm.width(columnText(3)), fm.width(sampleDate)) + 15); + setColumnWidth(4, QMAX(fm.width(columnText(4)), fm.width(i18n(perm[RO]))) + 15); + setColumnWidth(5, QMAX(fm.width(columnText(5)), fm.width("some text")) + 15); + } + + int free_space = visibleWidth() - + columnWidth(2) - columnWidth(3) - columnWidth(4) - columnWidth(5); + +// int name_w = QMIN((int)(free_space*0.5), 150); +// int dir_w = free_space - name_w; + int name_w = QMAX((int)(free_space*0.5), fm.width("some long filename")); + int dir_w = name_w; + + setColumnWidth(0, name_w); + setColumnWidth(1, dir_w); +} + +void KfindWindow::slotContextMenu(KListView *,QListViewItem *item,const QPoint&p) +{ + if (!item) return; + int count = selectedItems().count(); + + if (count == 0) + { + return; + }; + + if (m_menu==0) + m_menu = new KPopupMenu(this); + else + m_menu->clear(); + + if (count == 1) + { + //menu = new KPopupMenu(item->text(0), this); + m_menu->insertTitle(item->text(0)); + m_menu->insertItem(SmallIcon("fileopen"),i18n("Menu item", "Open"), this, SLOT(openBinding())); + m_menu->insertItem(SmallIcon("window_new"),i18n("Open Folder"), this, SLOT(openFolder())); + m_menu->insertSeparator(); + m_menu->insertItem(SmallIcon("editcopy"),i18n("Copy"), this, SLOT(copySelection())); + m_menu->insertItem(SmallIcon("editdelete"),i18n("Delete"), this, SLOT(deleteFiles())); + m_menu->insertSeparator(); + m_menu->insertItem(i18n("Open With..."), this, SLOT(slotOpenWith())); + m_menu->insertSeparator(); + m_menu->insertItem(i18n("Properties"), this, SLOT(fileProperties())); + } + else + { + m_menu->insertTitle(i18n("Selected Files")); + m_menu->insertItem(SmallIcon("editcopy"),i18n("Copy"), this, SLOT(copySelection())); + m_menu->insertItem(SmallIcon("editdelete"),i18n("Delete"), this, SLOT(deleteFiles())); + } + m_menu->popup(p, 1); +} + +void KfindWindow::slotOpenWith() +{ + KRun::displayOpenWithDialog( KURL::split(((KfFileLVI*)currentItem())->fileitem.url()) ); +} |