summaryrefslogtreecommitdiffstats
path: root/kdeprint/kfilelist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdeprint/kfilelist.cpp')
-rw-r--r--kdeprint/kfilelist.cpp326
1 files changed, 326 insertions, 0 deletions
diff --git a/kdeprint/kfilelist.cpp b/kdeprint/kfilelist.cpp
new file mode 100644
index 000000000..6be6f4ecb
--- /dev/null
+++ b/kdeprint/kfilelist.cpp
@@ -0,0 +1,326 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "kfilelist.h"
+
+#include <qtoolbutton.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qheader.h>
+#include <qwhatsthis.h>
+
+#include <kio/netaccess.h>
+#include <kurldrag.h>
+#include <kfiledialog.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <klistview.h>
+#include <krun.h>
+#include <kmimetype.h>
+
+KFileList::KFileList(QWidget *parent, const char *name)
+: QWidget(parent, name)
+{
+ //WhatsThis strings.... (added by pfeifle@kde.org)
+ QString whatsThisAddFileButton = i18n( " <qt> <b>Add File button</b>"
+ " <p>This button calls the <em>'File Open'</em> dialog to let you"
+ " select a file for printing. Note, that "
+ " <ul><li>you can select ASCII or International Text, PDF,"
+ " PostScript, JPEG, TIFF, PNG, GIF and many other graphic"
+ " formats."
+ " <li>you can select various files from different paths"
+ " and send them as one \"multi-file job\" to the printing"
+ " system."
+ " </ul>"
+ " </qt>" );
+
+ QString whatsThisRemoveFileButton = i18n(" <qt> <b>Remove File button</b>"
+ " <p>This button removes the highlighted file from the"
+ " list of to-be-printed files."
+ " </qt>" );
+
+ QString whatsThisMoveFileUpButton = i18n(" <qt> <b>Move File Up button</b>"
+ " <p>This button moves the highlighted file up in the list"
+ " of files to be printed.</p>"
+ " <p>In effect, this changes the order"
+ " of the files' printout.</p>"
+ " </qt>" );
+
+ QString whatsThisMoveFileDownButton = i18n(" <qt> <b>Move File Down button</b>"
+ " <p>This button moves the highlighted file down in the list"
+ " of files to be printed.</p>"
+ " <p>In effect, this changes the order"
+ " of the files' printout.</p>"
+ " </qt>" );
+
+ QString whatsThisOpenFileButton = i18n( " <qt> <b>File Open button</b>"
+ " <p>This button tries to open the highlighted file, so"
+ " you can view or edit it before you send it to the printing"
+ " system.</p>"
+ " <p>If you open"
+ " files, KDEPrint will use the application matching the MIME type of"
+ " the file.</p>"
+ " </qt>" );
+
+ QString whatsThisFileSelectionListview = i18n( " <qt> <b>File List view</b>"
+ " <p>This list displays all the files you selected for printing."
+ " You can see the file name(s), file path(s) and the file"
+ " (MIME) type(s) as determined by KDEPrint. You may re-arrange the "
+ " initial order of the list "
+ " with the help of the arrow buttons on the right.</p>"
+ " <p>The files will be printed as a single job,"
+ " in the same order as displayed in the list.</p>"
+ " <p><b>Note:</b> You can select multiple files. The files may be in multiple"
+ " locations. The files may be of multiple MIME types. The buttons on the right"
+ " side let you add more files, remove already selected files from the list, "
+ " re-order the list (by moving files up or down), and open files. If you open"
+ " files, KDEPrint will use the application matching the MIME type of"
+ " the file.</p>"
+ " </qt>" );
+
+ m_block = false;
+
+ m_files = new KListView(this);
+ m_files->addColumn(i18n("Name"));
+ m_files->addColumn(i18n("Type"));
+ m_files->addColumn(i18n("Path"));
+ m_files->setAllColumnsShowFocus(true);
+ m_files->setSorting(-1);
+ m_files->setAcceptDrops(false);
+ m_files->setSelectionMode(QListView::Extended);
+ m_files->header()->setStretchEnabled(true, 2);
+ QWhatsThis::add(m_files, whatsThisFileSelectionListview);
+ connect(m_files, SIGNAL(selectionChanged()), SLOT(slotSelectionChanged()));
+
+ m_add = new QToolButton(this);
+ m_add->setIconSet(SmallIconSet("fileopen"));
+ connect(m_add, SIGNAL(clicked()), SLOT(slotAddFile()));
+ QToolTip::add(m_add, i18n("Add file"));
+ QWhatsThis::add(m_add, whatsThisAddFileButton);
+
+ m_remove = new QToolButton(this);
+ m_remove->setIconSet(SmallIconSet("remove"));
+ connect(m_remove, SIGNAL(clicked()), SLOT(slotRemoveFile()));
+ QToolTip::add(m_remove, i18n("Remove file"));
+ QWhatsThis::add(m_remove, whatsThisRemoveFileButton);
+ m_remove->setEnabled(false);
+
+ m_open = new QToolButton(this);
+ m_open->setIconSet(SmallIconSet("filefind"));
+ connect(m_open, SIGNAL(clicked()), SLOT(slotOpenFile()));
+ QToolTip::add(m_open, i18n("Open file"));
+ QWhatsThis::add(m_open, whatsThisOpenFileButton);
+ m_open->setEnabled(false);
+
+ m_up = new QToolButton(this);
+ m_up->setIconSet(SmallIconSet("up"));
+ connect(m_up, SIGNAL(clicked()), SLOT(slotUp()));
+ QToolTip::add(m_up, i18n("Move up"));
+ QWhatsThis::add(m_up, whatsThisMoveFileUpButton);
+ m_up->setEnabled(false);
+
+ m_down = new QToolButton(this);
+ m_down->setIconSet(SmallIconSet("down"));
+ connect(m_down, SIGNAL(clicked()), SLOT(slotDown()));
+ QToolTip::add(m_down, i18n("Move down"));
+ QWhatsThis::add(m_down, whatsThisMoveFileDownButton);
+ m_down->setEnabled(false);
+
+ setAcceptDrops(true);
+
+ QToolTip::add(m_files, i18n(
+ "Drag file(s) here or use the button to open a file dialog. "
+ "Leave empty for <b>&lt;STDIN&gt;</b>."));
+
+ QHBoxLayout *l0 = new QHBoxLayout(this, 0, KDialog::spacingHint());
+ QVBoxLayout *l1 = new QVBoxLayout(0, 0, 1);
+ l0->addWidget(m_files);
+ l0->addLayout(l1);
+ l1->addWidget(m_add);
+ l1->addWidget(m_remove);
+ l1->addWidget(m_open);
+ l1->addSpacing(10);
+ l1->addWidget(m_up);
+ l1->addWidget(m_down);
+ l1->addStretch(1);
+}
+
+KFileList::~KFileList()
+{
+}
+
+void KFileList::dragEnterEvent(QDragEnterEvent *e)
+{
+ e->accept(KURLDrag::canDecode(e));
+}
+
+void KFileList::dropEvent(QDropEvent *e)
+{
+ KURL::List files;
+ if (KURLDrag::decode(e, files))
+ {
+ addFiles(files);
+ }
+}
+
+void KFileList::addFiles(const KURL::List& files)
+{
+ if (files.count() > 0)
+ {
+ // search last item in current list, to add new ones at the end
+ QListViewItem *item = m_files->firstChild();
+ while (item && item->nextSibling())
+ item = item->nextSibling();
+
+ for (KURL::List::ConstIterator it=files.begin(); it!=files.end(); ++it)
+ {
+ KMimeType::Ptr mime = KMimeType::findByURL( *it, 0, true, false);
+ item = new QListViewItem(m_files, item, (*it).fileName(), mime->comment(), (*it).url());
+ item->setPixmap(0, mime->pixmap(*it, KIcon::Small));
+ }
+
+ slotSelectionChanged();
+ /*
+ if (m_files->childCount() > 0)
+ {
+ m_remove->setEnabled(true);
+ m_open->setEnabled(true);
+ if (m_files->currentItem() == 0)
+ m_files->setSelected(m_files->firstChild(), true);
+ }
+ */
+ }
+}
+
+void KFileList::setFileList(const QStringList& files)
+{
+ m_files->clear();
+ QListViewItem *item = 0;
+ for (QStringList::ConstIterator it=files.begin(); it!=files.end(); ++it)
+ {
+ KURL url = KURL::fromPathOrURL( *it );
+ KMimeType::Ptr mime = KMimeType::findByURL(url, 0, true, false);
+ item = new QListViewItem(m_files, item, url.fileName(), mime->comment(), url.url());
+ item->setPixmap(0, mime->pixmap(url, KIcon::Small));
+ }
+ slotSelectionChanged();
+}
+
+QStringList KFileList::fileList() const
+{
+ QStringList l;
+ QListViewItem *item = m_files->firstChild();
+ while (item)
+ {
+ l << item->text(2);
+ item = item->nextSibling();
+ }
+ return l;
+}
+
+void KFileList::slotAddFile()
+{
+ KURL::List fnames = KFileDialog::getOpenURLs(QString::null, QString::null, this);
+ if (!fnames.empty())
+ addFiles(fnames);
+}
+
+void KFileList::slotRemoveFile()
+{
+ QPtrList<QListViewItem> l;
+ selection(l);
+ l.setAutoDelete(true);
+ m_block = true;
+ l.clear();
+ m_block = false;
+ slotSelectionChanged();
+}
+
+void KFileList::slotOpenFile()
+{
+ QListViewItem *item = m_files->currentItem();
+ if (item)
+ {
+ KURL url( item->text( 2 ) );
+ new KRun(url);
+ }
+}
+
+QSize KFileList::sizeHint() const
+{
+ return QSize(100, 100);
+}
+
+void KFileList::selection(QPtrList<QListViewItem>& l)
+{
+ l.setAutoDelete(false);
+ QListViewItem *item = m_files->firstChild();
+ while (item)
+ {
+ if (item->isSelected())
+ l.append(item);
+ item = item->nextSibling();
+ }
+}
+
+void KFileList::slotSelectionChanged()
+{
+ if (m_block)
+ return;
+
+ QPtrList<QListViewItem> l;
+ selection(l);
+ m_remove->setEnabled(l.count() > 0);
+ m_open->setEnabled(l.count() == 1);
+ m_up->setEnabled(l.count() == 1 && l.first()->itemAbove());
+ m_down->setEnabled(l.count() == 1 && l.first()->itemBelow());
+}
+
+void KFileList::slotUp()
+{
+ QPtrList<QListViewItem> l;
+ selection(l);
+ if (l.count() == 1 && l.first()->itemAbove())
+ {
+ QListViewItem *item(l.first()), *clone;
+ clone = new QListViewItem(m_files, item->itemAbove()->itemAbove(), item->text(0), item->text(1), item->text(2));
+ clone->setPixmap(0, *(item->pixmap(0)));
+ delete item;
+ m_files->setCurrentItem(clone);
+ m_files->setSelected(clone, true);
+ }
+}
+
+void KFileList::slotDown()
+{
+ QPtrList<QListViewItem> l;
+ selection(l);
+ if (l.count() == 1 && l.first()->itemBelow())
+ {
+ QListViewItem *item(l.first()), *clone;
+ clone = new QListViewItem(m_files, item->itemBelow(), item->text(0), item->text(1), item->text(2));
+ clone->setPixmap(0, *(item->pixmap(0)));
+ delete item;
+ m_files->setCurrentItem(clone);
+ m_files->setSelected(clone, true);
+ }
+}
+
+#include "kfilelist.moc"