kdeprint Library API Documentation

kfilelist.cpp

00001 /*
00002  *  This file is part of the KDE libraries
00003  *  Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be>
00004  *
00005  *  This library is free software; you can redistribute it and/or
00006  *  modify it under the terms of the GNU Library General Public
00007  *  License version 2 as published by the Free Software Foundation.
00008  *
00009  *  This library is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  *  Library General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU Library General Public License
00015  *  along with this library; see the file COPYING.LIB.  If not, write to
00016  *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017  *  Boston, MA 02111-1307, USA.
00018  **/
00019 
00020 #include "kfilelist.h"
00021 
00022 #include <qtoolbutton.h>
00023 #include <qlabel.h>
00024 #include <qlayout.h>
00025 #include <qtooltip.h>
00026 #include <qheader.h>
00027 #include <qwhatsthis.h>
00028 
00029 #include <kio/netaccess.h>
00030 #include <kurldrag.h>
00031 #include <kfiledialog.h>
00032 #include <klocale.h>
00033 #include <kiconloader.h>
00034 #include <klistview.h>
00035 #include <krun.h>
00036 #include <kmimetype.h>
00037 
00038 KFileList::KFileList(QWidget *parent, const char *name)
00039 : QWidget(parent, name)
00040 {
00041     //WhatsThis strings.... (added by pfeifle@kde.org)
00042     QString whatsThisAddFileButton = i18n(  " <qt> <b>Add File button</b>"
00043                         " <p>This button calls the <em>'File Open'</em> dialog to let you"
00044                         " select a file for printing. Note, that "
00045                         " <ul><li>you can select ASCII or International Text, PDF,"
00046                         " PostScript, JPEG, TIFF, PNG, GIF and many other graphic"
00047                         " formats."
00048                         " <li>you can select various files from different paths"
00049                         " and send them as one \"multi-file job\" to the printing"
00050                         " system."
00051                         " </ul>"
00052                             " </qt>" );
00053 
00054     QString whatsThisRemoveFileButton = i18n(" <qt> <b>Remove File button</b>"
00055                                                 " <p>This button removes the highlighted file from the"
00056                         " list of to-be-printed files."
00057                             " </qt>" );
00058 
00059     QString whatsThisMoveFileUpButton = i18n(" <qt> <b>Move File Up button</b>"
00060                                                 " <p>This button moves the highlighted file up in the list"
00061                         " of files to be printed.</p>"
00062                         " <p>In effect, this changes the order"
00063                         " of the files' printout.</p>"
00064                             " </qt>" );
00065 
00066     QString whatsThisMoveFileDownButton = i18n(" <qt> <b>Move File Down button</b>"
00067                                                 " <p>This button moves the highlighted file down in the list"
00068                         " of files to be printed.</p>"
00069                         " <p>In effect, this changes the order"
00070                         " of the files' printout.</p>"
00071                             " </qt>" );
00072 
00073     QString whatsThisOpenFileButton = i18n( " <qt> <b>File Open button</b>"
00074                                                 " <p>This button tries to open the highlighted file, so"
00075                         " you can view or edit it before you send it to the printing"
00076                         " system.</p>"
00077                         " <p>If you open"
00078                         " files, KDEPrint will use the application matching the MIME type of"
00079                         " the file.</p>"
00080                             " </qt>" );
00081 
00082     QString whatsThisFileSelectionListview = i18n( " <qt> <b>File List view</b>"
00083                                                 " <p>This list displays all the files you selected for printing."
00084                         " You can see the file name(s), file path(s) and the file"
00085                         " (MIME) type(s) as determined by KDEPrint. You may re-arrange the "
00086                         " initial order of the list "
00087                         " with the help of the arrow buttons on the right.</p>"
00088                         " <p>The files will be printed as a single job,"
00089                         " in the same order as displayed in the list.</p>"
00090                         " <p><b>Note:</b> You can select multiple files. The files may be in multiple"
00091                         " locations. The files may be of multiple MIME types. The buttons on the right"
00092                         " side let you add more files, remove already selected files from the list, "
00093                         " re-order the list (by moving files up or down), and open files. If you open"
00094                         " files, KDEPrint will use the application matching the MIME type of"
00095                         " the file.</p>"
00096                             " </qt>" );
00097 
00098     m_block = false;
00099 
00100     m_files = new KListView(this);
00101     m_files->addColumn(i18n("Name"));
00102     m_files->addColumn(i18n("Type"));
00103     m_files->addColumn(i18n("Path"));
00104     m_files->setAllColumnsShowFocus(true);
00105     m_files->setSorting(-1);
00106     m_files->setAcceptDrops(false);
00107     m_files->setSelectionMode(QListView::Extended);
00108     m_files->header()->setStretchEnabled(true, 2);
00109     QWhatsThis::add(m_files, whatsThisFileSelectionListview);
00110     connect(m_files, SIGNAL(selectionChanged()), SLOT(slotSelectionChanged()));
00111 
00112     m_add = new QToolButton(this);
00113     m_add->setIconSet(SmallIconSet("fileopen"));
00114     connect(m_add, SIGNAL(clicked()), SLOT(slotAddFile()));
00115     QToolTip::add(m_add, i18n("Add file"));
00116     QWhatsThis::add(m_add, whatsThisAddFileButton);
00117 
00118     m_remove = new QToolButton(this);
00119     m_remove->setIconSet(SmallIconSet("remove"));
00120     connect(m_remove, SIGNAL(clicked()), SLOT(slotRemoveFile()));
00121     QToolTip::add(m_remove, i18n("Remove file"));
00122     QWhatsThis::add(m_remove, whatsThisRemoveFileButton);
00123     m_remove->setEnabled(false);
00124 
00125     m_open = new QToolButton(this);
00126     m_open->setIconSet(SmallIconSet("filefind"));
00127     connect(m_open, SIGNAL(clicked()), SLOT(slotOpenFile()));
00128     QToolTip::add(m_open, i18n("Open file"));
00129     QWhatsThis::add(m_open, whatsThisOpenFileButton);
00130     m_open->setEnabled(false);
00131 
00132     m_up = new QToolButton(this);
00133     m_up->setIconSet(SmallIconSet("up"));
00134     connect(m_up, SIGNAL(clicked()), SLOT(slotUp()));
00135     QToolTip::add(m_up, i18n("Move up"));
00136     QWhatsThis::add(m_up, whatsThisMoveFileUpButton);
00137     m_up->setEnabled(false);
00138 
00139     m_down = new QToolButton(this);
00140     m_down->setIconSet(SmallIconSet("down"));
00141     connect(m_down, SIGNAL(clicked()), SLOT(slotDown()));
00142     QToolTip::add(m_down, i18n("Move down"));
00143     QWhatsThis::add(m_down, whatsThisMoveFileDownButton);
00144     m_down->setEnabled(false);
00145 
00146     setAcceptDrops(true);
00147 
00148     QToolTip::add(m_files, i18n(
00149         "Drag file(s) here or use the button to open a file dialog. "
00150         "Leave empty for <b>&lt;STDIN&gt;</b>."));
00151 
00152     QHBoxLayout *l0 = new QHBoxLayout(this, 0, KDialog::spacingHint());
00153     QVBoxLayout *l1 = new QVBoxLayout(0, 0, 1);
00154     l0->addWidget(m_files);
00155     l0->addLayout(l1);
00156     l1->addWidget(m_add);
00157     l1->addWidget(m_remove);
00158     l1->addWidget(m_open);
00159     l1->addSpacing(10);
00160     l1->addWidget(m_up);
00161     l1->addWidget(m_down);
00162     l1->addStretch(1);
00163 }
00164 
00165 KFileList::~KFileList()
00166 {
00167 }
00168 
00169 void KFileList::dragEnterEvent(QDragEnterEvent *e)
00170 {
00171     e->accept(KURLDrag::canDecode(e));
00172 }
00173 
00174 void KFileList::dropEvent(QDropEvent *e)
00175 {
00176     KURL::List  files;
00177     if (KURLDrag::decode(e, files))
00178     {
00179         addFiles(files);
00180     }
00181 }
00182 
00183 void KFileList::addFiles(const KURL::List& files)
00184 {
00185     if (files.count() > 0)
00186     {
00187         // search last item in current list, to add new ones at the end
00188         QListViewItem   *item = m_files->firstChild();
00189         while (item && item->nextSibling())
00190             item = item->nextSibling();
00191 
00192         // for each file, download it (if necessary) and add it
00193         QString downloaded;
00194         for (KURL::List::ConstIterator it=files.begin(); it!=files.end(); ++it)
00195             if (KIO::NetAccess::download(*it, downloaded, this))
00196             {
00197                 KURL    url;
00198                 url.setPath(downloaded);
00199                 KMimeType::Ptr  mime = KMimeType::findByURL(url, 0, true, false);
00200                 item = new QListViewItem(m_files, item, url.fileName(), mime->comment(), downloaded);
00201                 item->setPixmap(0, mime->pixmap(url, KIcon::Small));
00202             }
00203 
00204         slotSelectionChanged();
00205         /*
00206         if (m_files->childCount() > 0)
00207         {
00208             m_remove->setEnabled(true);
00209             m_open->setEnabled(true);
00210             if (m_files->currentItem() == 0)
00211                 m_files->setSelected(m_files->firstChild(), true);
00212         }
00213         */
00214     }
00215 }
00216 
00217 void KFileList::setFileList(const QStringList& files)
00218 {
00219     m_files->clear();
00220     QListViewItem *item = 0;
00221     for (QStringList::ConstIterator it=files.begin(); it!=files.end(); ++it)
00222     {
00223         KURL    url;
00224         url.setPath(*it);
00225         KMimeType::Ptr  mime = KMimeType::findByURL(url, 0, true, false);
00226         item = new QListViewItem(m_files, item, url.fileName(), mime->comment(), *it);
00227         item->setPixmap(0, mime->pixmap(url, KIcon::Small));
00228     }
00229     slotSelectionChanged();
00230 }
00231 
00232 QStringList KFileList::fileList() const
00233 {
00234     QStringList l;
00235     QListViewItem   *item = m_files->firstChild();
00236     while (item)
00237     {
00238         l << item->text(2);
00239         item = item->nextSibling();
00240     }
00241     return l;
00242 }
00243 
00244 void KFileList::slotAddFile()
00245 {
00246     KURL    fname = KFileDialog::getOpenURL(QString::null, QString::null, this);
00247     if (!fname.isEmpty())
00248         addFiles(KURL::List(fname));
00249 }
00250 
00251 void KFileList::slotRemoveFile()
00252 {
00253     QPtrList<QListViewItem> l;
00254     selection(l);
00255     l.setAutoDelete(true);
00256     m_block = true;
00257     l.clear();
00258     m_block = false;
00259     slotSelectionChanged();
00260 }
00261 
00262 void KFileList::slotOpenFile()
00263 {
00264     QListViewItem   *item = m_files->currentItem();
00265     if (item)
00266     {
00267         KURL url( item->text( 2 ) );
00268         new KRun(url);
00269     }
00270 }
00271 
00272 QSize KFileList::sizeHint() const
00273 {
00274     return QSize(100, 100);
00275 }
00276 
00277 void KFileList::selection(QPtrList<QListViewItem>& l)
00278 {
00279     l.setAutoDelete(false);
00280     QListViewItem   *item = m_files->firstChild();
00281     while (item)
00282     {
00283         if (item->isSelected())
00284             l.append(item);
00285         item = item->nextSibling();
00286     }
00287 }
00288 
00289 void KFileList::slotSelectionChanged()
00290 {
00291     if (m_block)
00292         return;
00293 
00294     QPtrList<QListViewItem> l;
00295     selection(l);
00296     m_remove->setEnabled(l.count() > 0);
00297     m_open->setEnabled(l.count() == 1);
00298     m_up->setEnabled(l.count() == 1 && l.first()->itemAbove());
00299     m_down->setEnabled(l.count() == 1 && l.first()->itemBelow());
00300 }
00301 
00302 void KFileList::slotUp()
00303 {
00304     QPtrList<QListViewItem> l;
00305     selection(l);
00306     if (l.count() == 1 && l.first()->itemAbove())
00307     {
00308         QListViewItem   *item(l.first()), *clone;
00309         clone = new QListViewItem(m_files, item->itemAbove()->itemAbove(), item->text(0), item->text(1), item->text(2));
00310         clone->setPixmap(0, *(item->pixmap(0)));
00311         delete item;
00312         m_files->setCurrentItem(clone);
00313         m_files->setSelected(clone, true);
00314     }
00315 }
00316 
00317 void KFileList::slotDown()
00318 {
00319     QPtrList<QListViewItem> l;
00320     selection(l);
00321     if (l.count() == 1 && l.first()->itemBelow())
00322     {
00323         QListViewItem   *item(l.first()), *clone;
00324         clone = new QListViewItem(m_files, item->itemBelow(), item->text(0), item->text(1), item->text(2));
00325         clone->setPixmap(0, *(item->pixmap(0)));
00326         delete item;
00327         m_files->setCurrentItem(clone);
00328         m_files->setSelected(clone, true);
00329     }
00330 }
00331 
00332 #include "kfilelist.moc"
KDE Logo
This file is part of the documentation for kdeprint Library Version 3.4.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Jul 20 14:03:15 2006 by doxygen 1.4.4 written by Dimitri van Heesch, © 1997-2003