summaryrefslogtreecommitdiffstats
path: root/kdeprint/kdeprintfax/kdeprintfax.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdeprint/kdeprintfax/kdeprintfax.cpp')
-rw-r--r--kdeprint/kdeprintfax/kdeprintfax.cpp607
1 files changed, 607 insertions, 0 deletions
diff --git a/kdeprint/kdeprintfax/kdeprintfax.cpp b/kdeprint/kdeprintfax/kdeprintfax.cpp
new file mode 100644
index 000000000..e10416bef
--- /dev/null
+++ b/kdeprint/kdeprintfax/kdeprintfax.cpp
@@ -0,0 +1,607 @@
+/*
+ * kdeprintfax - a small fax utility
+ * Copyright (C) 2001 Michael Goffioul
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "kdeprintfax.h"
+#include "faxab.h"
+#include "faxctrl.h"
+#include "configdlg.h"
+
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qtextedit.h>
+#include <qdatetimeedit.h>
+#include <qcombobox.h>
+#include <qtooltip.h>
+
+#include <kapplication.h>
+#include <kstdaction.h>
+#include <kmenubar.h>
+#include <ktoolbar.h>
+#include <kaction.h>
+#include <klistbox.h>
+#include <klistview.h>
+#include <qheader.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kio/netaccess.h>
+#include <kmessagebox.h>
+#include <kfiledialog.h>
+#include <kmimetype.h>
+#include <kseparator.h>
+#include <ksystemtray.h>
+#include <kstatusbar.h>
+#include <ksqueezedtextlabel.h>
+#include <krun.h>
+#include <kopenwith.h>
+#include <kpushbutton.h>
+#include <kurldrag.h>
+#include <kdebug.h>
+
+KdeprintFax::KdeprintFax(QWidget *parent, const char *name)
+: KMainWindow(parent, name)
+{
+ m_faxctrl = new FaxCtrl(this);
+ m_quitAfterSend = false;
+ connect(m_faxctrl, SIGNAL(message(const QString&)), SLOT(slotMessage(const QString&)));
+ connect(m_faxctrl, SIGNAL(faxSent(bool)), SLOT(slotFaxSent(bool)));
+
+ QWidget *mainw = new QWidget(this);
+ setCentralWidget(mainw);
+ m_files = new KListBox(mainw);
+ connect( m_files, SIGNAL( currentChanged( QListBoxItem* ) ), SLOT( slotCurrentChanged() ) );
+ m_upbtn = new KPushButton( mainw );
+ m_upbtn->setIconSet( SmallIconSet( "up" ) );
+ QToolTip::add( m_upbtn, i18n( "Move up" ) );
+ connect( m_upbtn, SIGNAL( clicked() ), SLOT( slotMoveUp() ) );
+ m_upbtn->setEnabled( false );
+ m_downbtn = new KPushButton( mainw );
+ m_downbtn->setIconSet( SmallIconSet( "down" ) );
+ QToolTip::add( m_downbtn, i18n( "Move down" ) );
+ connect( m_downbtn, SIGNAL( clicked() ), SLOT( slotMoveDown() ) );
+ m_downbtn->setEnabled( false );
+ QLabel *m_filelabel = new QLabel(i18n("F&iles:"), mainw);
+ m_filelabel->setBuddy(m_files);
+ KSeparator*m_line = new KSeparator( KSeparator::HLine, mainw);
+ KSeparator *m_line2 = new KSeparator( KSeparator::HLine, mainw );
+ m_numbers = new KListView( mainw );
+ m_numbers->addColumn( i18n("Fax Number") );
+ m_numbers->addColumn( i18n("Name") );
+ m_numbers->addColumn( i18n("Enterprise") );
+ m_numbers->header()->setStretchEnabled( true );
+ m_numbers->setSelectionMode( QListView::Extended );
+ connect( m_numbers, SIGNAL( selectionChanged() ), SLOT( slotFaxSelectionChanged() ) );
+ connect( m_numbers, SIGNAL( executed( QListViewItem* ) ), SLOT( slotFaxExecuted( QListViewItem* ) ) );
+ m_newbtn = new KPushButton( mainw );
+ m_newbtn->setPixmap( SmallIcon( "edit" ) );
+ QToolTip::add( m_newbtn, i18n( "Add fax number" ) );
+ connect( m_newbtn, SIGNAL( clicked() ), SLOT( slotFaxAdd() ) );
+ m_abbtn = new KPushButton( mainw );
+ m_abbtn->setPixmap( SmallIcon( "kaddressbook" ) );
+ QToolTip::add( m_abbtn, i18n( "Add fax number from addressbook" ) );
+ connect( m_abbtn, SIGNAL( clicked() ), SLOT( slotKab() ) );
+ m_delbtn = new KPushButton( mainw );
+ m_delbtn->setIconSet( SmallIconSet( "edittrash" ) );
+ QToolTip::add( m_delbtn, i18n( "Remove fax number" ) );
+ m_delbtn->setEnabled( false );
+ connect( m_delbtn, SIGNAL( clicked() ), SLOT( slotFaxRemove() ) );
+ QLabel *m_commentlabel = new QLabel(i18n("&Comment:"), mainw);
+ KSystemTray *m_tray = new KSystemTray(this);
+ m_tray->setPixmap(SmallIcon("kdeprintfax"));
+ m_tray->show();
+ m_comment = new QTextEdit(mainw);
+// I don't understand why anyone would want to turn off word wrap. It makes
+// the text hard to read and write. It provides no benefit. Therefore,
+// I commented out the next line. [Ray Lischner]
+// m_comment->setWordWrap(QTextEdit::NoWrap);
+ m_comment->setLineWidth(1);
+ m_commentlabel->setBuddy(m_comment);
+ QLabel *m_timelabel = new QLabel(i18n("Sched&ule:"), mainw);
+ m_timecombo = new QComboBox(mainw);
+ m_timecombo->insertItem(i18n("Now"));
+ m_timecombo->insertItem(i18n("At Specified Time"));
+ m_timecombo->setCurrentItem(0);
+ m_timelabel->setBuddy(m_timecombo);
+ m_time = new QTimeEdit(mainw);
+ m_time->setTime(QTime::currentTime());
+ m_time->setEnabled(false);
+ connect(m_timecombo, SIGNAL(activated(int)), SLOT(slotTimeComboActivated(int)));
+ m_cover = new QCheckBox(i18n("Send Co&ver Sheet"), mainw);
+ connect(m_cover, SIGNAL(toggled(bool)), SLOT(slotCoverToggled(bool)));
+ m_subject = new QLineEdit( mainw );
+ QLabel *m_subjectlabel = new QLabel( i18n( "Su&bject:" ), mainw );
+ m_subjectlabel->setBuddy( m_subject );
+
+ QGridLayout *l0 = new QGridLayout(mainw, 10, 2, 10, 5);
+ l0->setColStretch(1,1);
+ l0->addWidget(m_filelabel, 0, 0, Qt::AlignLeft|Qt::AlignTop);
+ QHBoxLayout *l2 = new QHBoxLayout( 0, 0, 10 );
+ QVBoxLayout *l3 = new QVBoxLayout( 0, 0, 5 );
+ l0->addLayout( l2, 0, 1 );
+ l2->addWidget( m_files );
+ l2->addLayout( l3 );
+ //l3->addStretch( 1 );
+ l3->addWidget( m_upbtn );
+ l3->addWidget( m_downbtn );
+ l3->addStretch( 1 );
+ l0->addMultiCellWidget(m_line, 1, 1, 0, 1);
+ l0->addRowSpacing(1, 10);
+ QHBoxLayout *l5 = new QHBoxLayout( 0, 0, 10 );
+ QVBoxLayout *l6 = new QVBoxLayout( 0, 0, 5 );
+ l0->addMultiCellLayout( l5, 2, 4, 0, 1 );
+ l5->addWidget( m_numbers );
+ l5->addLayout( l6 );
+ l6->addWidget( m_newbtn );
+ l6->addWidget( m_delbtn );
+ l6->addWidget( m_abbtn );
+ l6->addStretch( 1 );
+ l0->addMultiCellWidget( m_line2, 5, 5, 0, 1 );
+ l0->addRowSpacing( 5, 10 );
+ l0->addWidget( m_cover, 6, 1 );
+ l0->addWidget( m_subjectlabel, 7, 0 );
+ l0->addWidget( m_subject, 7, 1 );
+ l0->addWidget(m_commentlabel, 8, 0, Qt::AlignTop|Qt::AlignLeft);
+ l0->addWidget(m_comment, 8, 1);
+ l0->addWidget(m_timelabel, 9, 0);
+ QHBoxLayout *l1 = new QHBoxLayout(0, 0, 5);
+ l0->addLayout(l1, 9, 1);
+ l1->addWidget(m_timecombo, 1);
+ l1->addWidget(m_time, 0);
+
+ m_msglabel = new KSqueezedTextLabel(statusBar());
+ statusBar()->addWidget(m_msglabel, 1);
+ statusBar()->insertFixedItem(i18n("Processing..."), 1);
+ statusBar()->changeItem(i18n("Idle"), 1);
+ statusBar()->insertFixedItem("hylafax/efax", 2);
+ initActions();
+ setAcceptDrops(true);
+ setCaption(i18n("Send to Fax"));
+ updateState();
+
+ resize(550,500);
+ QWidget *d = kapp->desktop();
+ move((d->width()-width())/2, (d->height()-height())/2);
+}
+
+KdeprintFax::~KdeprintFax()
+{
+}
+
+void KdeprintFax::initActions()
+{
+ new KAction(i18n("&Add File..."), "filenew", Qt::Key_Insert, this, SLOT(slotAdd()), actionCollection(), "file_add");
+ new KAction(i18n("&Remove File"), "remove", Qt::Key_Delete, this, SLOT(slotRemove()), actionCollection(), "file_remove");
+ new KAction(i18n("&Send Fax"), "connect_established", Qt::Key_Return, this, SLOT(slotFax()), actionCollection(), "fax_send");
+ new KAction(i18n("A&bort"), "stop", Qt::Key_Escape, this, SLOT(slotAbort()), actionCollection(), "fax_stop");
+ new KAction(i18n("A&ddress Book"), "kaddressbook", Qt::CTRL+Qt::Key_A, this, SLOT(slotKab()), actionCollection(), "fax_ab");
+ new KAction(i18n("V&iew Log"), "contents", Qt::CTRL+Qt::Key_L, this, SLOT(slotViewLog()), actionCollection(), "fax_log");
+ new KAction(i18n("Vi&ew File"), "filefind", Qt::CTRL+Qt::Key_O, this, SLOT(slotView()), actionCollection(), "file_view");
+ new KAction( i18n( "&New Fax Recipient..." ), "edit", Qt::CTRL+Qt::Key_N, this, SLOT( slotFaxAdd() ), actionCollection(), "fax_add" );
+
+ KStdAction::quit(this, SLOT(slotQuit()), actionCollection());
+ setStandardToolBarMenuEnabled(true);
+ KStdAction::showMenubar(this, SLOT(slotToggleMenuBar()), actionCollection());
+ KStdAction::preferences(this, SLOT(slotConfigure()), actionCollection());
+ KStdAction::keyBindings(guiFactory(), SLOT(configureShortcuts()),
+actionCollection());
+ actionCollection()->action("fax_stop")->setEnabled(false);
+ connect(actionCollection()->action("file_remove"), SIGNAL(enabled(bool)), actionCollection()->action("file_view"), SLOT(setEnabled(bool)));
+ actionCollection()->action("file_remove")->setEnabled(false);
+
+ createGUI();
+}
+
+void KdeprintFax::slotToggleMenuBar()
+{
+ if (menuBar()->isVisible()) menuBar()->hide();
+ else menuBar()->show();
+}
+
+void KdeprintFax::slotAdd()
+{
+ KURL url = KFileDialog::getOpenURL(QString::null, QString::null, this);
+ if (!url.isEmpty())
+ addURL(url);
+}
+
+void KdeprintFax::slotRemove()
+{
+ if (m_files->currentItem() >= 0)
+ m_files->removeItem(m_files->currentItem());
+ if (m_files->count() == 0)
+ actionCollection()->action("file_remove")->setEnabled(false);
+}
+
+void KdeprintFax::slotView()
+{
+ if (m_files->currentItem() >= 0)
+ {
+ new KRun(KURL( m_files->currentText() ));
+ }
+}
+
+void KdeprintFax::slotFax()
+{
+ if (m_files->count() == 0)
+ KMessageBox::error(this, i18n("No file to fax."));
+ else if ( m_numbers->childCount() == 0 )
+ KMessageBox::error(this, i18n("No fax number specified."));
+ else if (m_faxctrl->send(this))
+ {
+ actionCollection()->action("fax_send")->setEnabled(false);
+ actionCollection()->action("fax_stop")->setEnabled(true);
+ statusBar()->changeItem(i18n("Processing..."), 1);
+ }
+ else
+ KMessageBox::error(this, i18n("Unable to start Fax process."));
+}
+
+void KdeprintFax::slotAbort()
+{
+ if (!m_faxctrl->abort())
+ KMessageBox::error(this, i18n("Unable to stop Fax process."));
+}
+
+void KdeprintFax::slotKab()
+{
+ QStringList number, name, enterprise;
+ if (FaxAB::getEntry(number, name, enterprise, this))
+ {
+ for ( unsigned int i = 0; i<number.count(); i++ )
+ new QListViewItem( m_numbers, number[ i ], name[ i ], enterprise[ i ] );
+ }
+}
+
+void KdeprintFax::addURL(KURL url)
+{
+ QString target;
+ if (KIO::NetAccess::download(url,target,this))
+ {
+ m_files->insertItem(KMimeType::pixmapForURL(url,0,KIcon::Small),target);
+ actionCollection()->action("file_remove")->setEnabled(true);
+ slotCurrentChanged();
+ }
+ else
+ KMessageBox::error(this, i18n("Unable to retrieve %1.").arg(url.prettyURL()));
+}
+
+void KdeprintFax::setPhone(QString phone)
+{
+ QString name, enterprise;
+ FaxAB::getEntryByNumber(phone, name, enterprise);
+ new QListViewItem( m_numbers, phone, name, enterprise );
+}
+
+void KdeprintFax::sendFax( bool quitAfterSend )
+{
+ slotFax();
+ m_quitAfterSend = quitAfterSend;
+}
+
+void KdeprintFax::dragEnterEvent(QDragEnterEvent *e)
+{
+ e->accept(KURLDrag::canDecode(e));
+}
+
+void KdeprintFax::dropEvent(QDropEvent *e)
+{
+ KURL::List l;
+ if (KURLDrag::decode(e, l))
+ {
+ for (KURL::List::ConstIterator it = l.begin(); it != l.end(); ++it)
+ addURL(*it);
+ }
+}
+
+QStringList KdeprintFax::files()
+{
+ QStringList l;
+ for (uint i=0; i<m_files->count(); i++)
+ l.append(m_files->text(i));
+ return l;
+}
+
+
+int KdeprintFax::faxCount() const
+{
+ return m_numbers->childCount();
+}
+
+/*
+QListViewItem* KdeprintFax::faxItem( int i ) const
+{
+ QListViewItem *item = m_numbers->firstChild();
+ while ( i && item && item->nextSibling() )
+ {
+ item = item->nextSibling();
+ i--;
+ }
+ if ( i || !item )
+ kdError() << "KdeprintFax::faxItem(" << i << ") => fax item index out of bound" << endl;
+ return item;
+}
+
+QString KdeprintFax::number( int i ) const
+{
+ QListViewItem *item = faxItem( i );
+ return ( item ? item->text( 0 ) : QString::null );
+}
+
+QString KdeprintFax::name( int i ) const
+{
+ QListViewItem *item = faxItem( i );
+ return ( item ? item->text( 1 ) : QString::null );
+}
+
+QString KdeprintFax::enterprise( int i ) const
+{
+ QListViewItem *item = faxItem( i );
+ return ( item ? item->text( 2 ) : QString::null );
+}
+*/
+
+KdeprintFax::FaxItemList KdeprintFax::faxList() const
+{
+ FaxItemList list;
+ QListViewItemIterator it( m_numbers );
+ while ( it.current() )
+ {
+ FaxItem item;
+ item.number = it.current()->text( 0 );
+ item.name = it.current()->text( 1 );
+ item.enterprise = it.current()->text( 2 );
+ list << item;
+ ++it;
+ }
+ return list;
+}
+
+QString KdeprintFax::comment() const
+{
+ return m_comment->text();
+}
+
+bool KdeprintFax::cover() const
+{
+ return m_cover->isChecked();
+}
+
+QString KdeprintFax::subject() const
+{
+ return m_subject->text();
+}
+
+void KdeprintFax::slotMessage(const QString& msg)
+{
+ m_msglabel->setText(msg);
+}
+
+void KdeprintFax::slotFaxSent(bool status)
+{
+ actionCollection()->action("fax_send")->setEnabled(true);
+ actionCollection()->action("fax_stop")->setEnabled(false);
+ statusBar()->changeItem(i18n("Idle"), 1);
+
+ if( m_quitAfterSend ) {
+ slotQuit();
+ }
+ else {
+ if (!status)
+ KMessageBox::error(this, i18n("Fax error: see log message for more information."));
+ slotMessage(QString::null);
+ }
+}
+
+void KdeprintFax::slotViewLog()
+{
+ m_faxctrl->viewLog(this);
+}
+
+void KdeprintFax::slotConfigure()
+{
+ if (ConfigDlg::configure(this))
+ updateState();
+}
+
+void KdeprintFax::updateState()
+{
+ QString cmd = m_faxctrl->faxCommand();
+ m_cover->setEnabled(cmd.find("%cover") != -1);
+ if ( !m_cover->isEnabled() )
+ m_cover->setChecked(false);
+ m_comment->setEnabled(cmd.find("%comment") != -1 && m_cover->isChecked());
+ //m_comment->setPaper(m_comment->isEnabled() ? colorGroup().brush(QColorGroup::Base) : colorGroup().brush(QColorGroup::Background));
+ if (!m_comment->isEnabled())
+ {
+ m_comment->setText("");
+ m_comment->setPaper( colorGroup().background() );
+ }
+ else
+ m_comment->setPaper( colorGroup().base() );
+ /*
+ m_enterprise->setEnabled(cmd.find("%enterprise") != -1);
+ if (!m_enterprise->isEnabled())
+ m_enterprise->setText("");
+ */
+ if (cmd.find("%time") == -1)
+ {
+ m_timecombo->setCurrentItem(0);
+ m_timecombo->setEnabled(false);
+ slotTimeComboActivated(0);
+ }
+ else
+ m_timecombo->setEnabled( true );
+ /*m_name->setEnabled( cmd.find( "%name" ) != -1 );*/
+ m_subject->setEnabled( cmd.find( "%subject" ) != -1 && m_cover->isChecked() );
+ statusBar()->changeItem(m_faxctrl->faxSystem(), 2);
+}
+
+void KdeprintFax::slotQuit()
+{
+ close(true);
+}
+
+void KdeprintFax::slotTimeComboActivated(int ID)
+{
+ m_time->setEnabled(ID == 1);
+}
+
+QString KdeprintFax::time() const
+{
+ if (!m_time->isEnabled())
+ return QString::null;
+ return m_time->time().toString("hh:mm");
+}
+
+void KdeprintFax::slotMoveUp()
+{
+ int index = m_files->currentItem();
+ if ( index > 0 )
+ {
+ QListBoxItem *item = m_files->item( index );
+ m_files->takeItem( item );
+ m_files->insertItem( item, index-1 );
+ m_files->setCurrentItem( index-1 );
+ }
+}
+
+void KdeprintFax::slotMoveDown()
+{
+ int index = m_files->currentItem();
+ if ( index >= 0 && index < ( int )m_files->count()-1 )
+ {
+ QListBoxItem *item = m_files->item( index );
+ m_files->takeItem( item );
+ m_files->insertItem( item, index+1 );
+ m_files->setCurrentItem( index+1 );
+ }
+}
+
+/** The user or program toggled the "Cover Sheet" check box.
+ * Update the state of the other controls to reflect the
+ * new status.
+ */
+void KdeprintFax::slotCoverToggled(bool)
+{
+ updateState();
+}
+
+void KdeprintFax::slotCurrentChanged()
+{
+ int index = m_files->currentItem();
+ m_upbtn->setEnabled( index > 0 );
+ m_downbtn->setEnabled( index >=0 && index < ( int )m_files->count()-1 );
+}
+
+void KdeprintFax::slotFaxSelectionChanged()
+{
+ QListViewItemIterator it( m_numbers, QListViewItemIterator::Selected );
+ m_delbtn->setEnabled( it.current() != NULL );
+}
+
+void KdeprintFax::slotFaxRemove()
+{
+ QListViewItemIterator it( m_numbers, QListViewItemIterator::Selected );
+ QPtrList<QListViewItem> items;
+ items.setAutoDelete( true );
+ while ( it.current() )
+ {
+ items.append( it.current() );
+ ++it;
+ }
+ items.clear();
+ /* force this slot to be called, to update buttons state */
+ slotFaxSelectionChanged();
+}
+
+void KdeprintFax::slotFaxAdd()
+{
+ QString number, name, enterprise;
+ if ( manualFaxDialog( number, name, enterprise ) )
+ {
+ new QListViewItem( m_numbers, number, name, enterprise );
+ }
+}
+
+void KdeprintFax::slotFaxExecuted( QListViewItem *item )
+{
+ if ( item )
+ {
+ QString number = item->text( 0 ), name = item->text( 1 ), enterprise = item->text( 2 );
+ if ( manualFaxDialog( number, name, enterprise ) )
+ {
+ item->setText( 0, number );
+ item->setText( 1, name );
+ item->setText( 2, enterprise );
+ }
+ }
+}
+
+bool KdeprintFax::manualFaxDialog( QString& number, QString& name, QString& enterprise )
+{
+ /* dialog construction */
+ KDialogBase dlg( this, "manualFaxDialog", true, i18n( "Fax Number" ), KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true );
+ QWidget *mainw = new QWidget( &dlg );
+ QLabel *lab0 = new QLabel( i18n( "Enter recipient fax properties." ), mainw );
+ QLabel *lab1 = new QLabel( i18n( "&Number:" ), mainw );
+ QLabel *lab2 = new QLabel( i18n( "N&ame:" ), mainw );
+ QLabel *lab3 = new QLabel( i18n( "&Enterprise:" ), mainw );
+ QLineEdit *edit_number = new QLineEdit( number, mainw );
+ QLineEdit *edit_name = new QLineEdit( name, mainw );
+ QLineEdit *edit_enterprise = new QLineEdit( enterprise, mainw );
+ lab1->setBuddy( edit_number );
+ lab2->setBuddy( edit_name );
+ lab3->setBuddy( edit_enterprise );
+ QGridLayout *l0 = new QGridLayout( mainw, 5, 2, 0, 5 );
+ l0->setColStretch( 1, 1 );
+ l0->addMultiCellWidget( lab0, 0, 0, 0, 1 );
+ l0->setRowSpacing( 1, 10 );
+ l0->addWidget( lab1, 2, 0 );
+ l0->addWidget( lab2, 3, 0 );
+ l0->addWidget( lab3, 4, 0 );
+ l0->addWidget( edit_number, 2, 1 );
+ l0->addWidget( edit_name, 3, 1 );
+ l0->addWidget( edit_enterprise, 4, 1 );
+ dlg.setMainWidget( mainw );
+ dlg.resize( 300, 10 );
+
+ /* dialog execution */
+ while ( 1 )
+ if ( dlg.exec() )
+ {
+ if ( edit_number->text().isEmpty() )
+ {
+ KMessageBox::error( this, i18n( "Invalid fax number." ) );
+ }
+ else
+ {
+ number = edit_number->text();
+ name = edit_name->text();
+ enterprise = edit_enterprise->text();
+ return true;
+ }
+ }
+ else
+ return false;
+}
+
+#include "kdeprintfax.moc"