20 #include "kmjobviewer.h"
21 #include "kmjobmanager.h"
22 #include "kmfactory.h"
24 #include "kmprinter.h"
25 #include "kmmanager.h"
26 #include "kmuimanager.h"
29 #include "kmconfigjobs.h"
30 #include "kmconfigpage.h"
33 #include <klistview.h>
34 #include <kstatusbar.h>
35 #include <tqpopupmenu.h>
36 #include <kmessagebox.h>
38 #include <kpopupmenu.h>
40 #include <kstdaction.h>
41 #include <kiconloader.h>
42 #include <kapplication.h>
47 #include <kio/netaccess.h>
51 #include <tqlineedit.h>
52 #include <kdialogbase.h>
53 #include <tqcheckbox.h>
58 #define m_manager KMFactory::self()->jobManager()
60 class KJobListView :
public KListView
63 KJobListView( TQWidget *parent = 0,
const char *name = 0 );
66 bool acceptDrag( TQDropEvent* )
const;
69 KJobListView::KJobListView( TQWidget *parent,
const char *name )
70 : KListView( parent, name )
72 setAcceptDrops(
true );
73 setDropVisualizer(
false );
76 bool KJobListView::acceptDrag( TQDropEvent *e )
const
78 if ( KURLDrag::canDecode( e ) )
81 return KListView::acceptDrag( e );
84 KMJobViewer::KMJobViewer(TQWidget *parent,
const char *name)
85 : KMainWindow(parent,name)
89 m_jobs.setAutoDelete(
false);
90 m_items.setAutoDelete(
false);
91 m_printers.setAutoDelete(
false);
92 m_type = KMJobManager::ActiveJobs;
94 m_standalone = ( parent == NULL );
96 setToolBarsMovable(
false);
101 setCaption(i18n(
"No Printer"));
102 KConfig *conf = KMFactory::self()->printConfig();
103 TQSize defSize( 550, 250 );
104 conf->setGroup(
"Jobs" );
105 resize( conf->readSizeEntry(
"Size", &defSize ) );
109 KMJobViewer::~KMJobViewer()
113 kdDebug( 500 ) <<
"Destroying stand-alone job viewer window" << endl;
114 KConfig *conf = KMFactory::self()->printConfig();
115 conf->setGroup(
"Jobs" );
116 conf->writeEntry(
"Size", size() );
117 emit viewerDestroyed(
this);
122 void KMJobViewer::setPrinter(KMPrinter *p)
124 setPrinter((p ? p->printerName() : TQString::null));
127 void KMJobViewer::setPrinter(
const TQString& prname)
133 if (m_prname != prname)
138 m_view->setAcceptDrops( prname != i18n(
"All Printers" ) );
143 void KMJobViewer::updateCaption()
148 TQString pixname(
"fileprint");
149 if (!m_prname.isEmpty())
151 setCaption(i18n(
"Print Jobs for %1").arg(m_prname));
152 KMPrinter *prt = KMManager::self()->findPrinter(m_prname);
154 pixname = prt->pixmap();
158 setCaption(i18n(
"No Printer"));
160 KWin::setIcons(winId(), DesktopIcon(pixname), SmallIcon(pixname));
163 void KMJobViewer::updateStatusBar()
168 int limit = m_manager->limit();
170 statusBar()->changeItem(i18n(
"Max.: %1").arg(i18n(
"Unlimited")), 0);
172 statusBar()->changeItem(i18n(
"Max.: %1").arg(limit), 0);
175 void KMJobViewer::addToManager()
177 if (m_prname == i18n(
"All Printers"))
180 TQPtrListIterator<KMPrinter> it(m_printers);
181 for (; it.current(); ++it)
182 m_manager->addPrinter(it.current()->printerName(), (KMJobManager::JobType)m_type, it.current()->isSpecial());
184 else if (!m_prname.isEmpty())
186 KMPrinter *prt = KMManager::self()->findPrinter( m_prname );
187 bool isSpecial = ( prt ? prt->isSpecial() : false );
188 m_manager->addPrinter(m_prname, (KMJobManager::JobType)m_type, isSpecial);
192 void KMJobViewer::removeFromManager()
194 if (m_prname == i18n(
"All Printers"))
196 TQPtrListIterator<KMPrinter> it(m_printers);
197 for (; it.current(); ++it)
198 m_manager->removePrinter(it.current()->printerName(), (KMJobManager::JobType)m_type);
200 else if (!m_prname.isEmpty())
202 m_manager->removePrinter(m_prname, (KMJobManager::JobType)m_type);
206 void KMJobViewer::refresh(
bool reload)
209 TQPtrListIterator<KMJob> it(m_manager->jobList(reload));
210 bool all = (m_prname == i18n(
"All Printers")), active = (m_type == KMJobManager::ActiveJobs);
211 for (; it.current(); ++it)
212 if ((all || it.current()->printer() == m_prname)
213 && ((it.current()->state() >= KMJob::Cancelled && !active)
214 || (it.current()->state() < KMJob::Cancelled && active))
215 && (m_username.isEmpty() || m_username == it.current()->owner()))
216 m_jobs.append(it.current());
227 emit jobsShown(
this, (m_jobs.count() != 0));
230 void KMJobViewer::init()
234 m_view =
new KJobListView(
this);
235 m_view->addColumn(i18n(
"Job ID"));
236 m_view->addColumn(i18n(
"Owner"));
237 m_view->addColumn(i18n(
"Name"), 150);
238 m_view->addColumn(i18n(
"Status",
"State"));
239 m_view->addColumn(i18n(
"Size (KB)"));
240 m_view->addColumn(i18n(
"Page(s)"));
241 m_view->setColumnAlignment(5,Qt::AlignRight|Qt::AlignVCenter);
242 connect( m_view, TQT_SIGNAL( dropped( TQDropEvent*, TQListViewItem* ) ), TQT_SLOT( slotDropped( TQDropEvent*, TQListViewItem* ) ) );
245 KMFactory::self()->uiManager()->setupJobViewer(m_view);
246 m_view->setFrameStyle(TQFrame::WinPanel|TQFrame::Sunken);
247 m_view->setLineWidth(1);
248 m_view->setSorting(0);
249 m_view->setAllColumnsShowFocus(
true);
250 m_view->setSelectionMode(TQListView::Extended);
251 connect(m_view,TQT_SIGNAL(selectionChanged()),TQT_SLOT(slotSelectionChanged()));
252 connect(m_view,TQT_SIGNAL(rightButtonPressed(TQListViewItem*,
const TQPoint&,
int)),TQT_SLOT(slotRightClicked(TQListViewItem*,
const TQPoint&,
int)));
253 setCentralWidget(m_view);
259 void KMJobViewer::initActions()
262 KAction *hact =
new KAction(i18n(
"&Hold"),
"stop",0,TQT_TQOBJECT(
this),TQT_SLOT(slotHold()),actionCollection(),
"job_hold");
263 KAction *ract =
new KAction(i18n(
"&Resume"),
"run",0,TQT_TQOBJECT(
this),TQT_SLOT(slotResume()),actionCollection(),
"job_resume");
264 KAction *dact =
new KAction(i18n(
"Remo&ve"),
"edittrash",Qt::Key_Delete,TQT_TQOBJECT(
this),TQT_SLOT(slotRemove()),actionCollection(),
"job_remove");
265 KAction *sact =
new KAction(i18n(
"Res&tart"),
"redo",0,TQT_TQOBJECT(
this),TQT_SLOT(slotRestart()),actionCollection(),
"job_restart");
266 KActionMenu *mact =
new KActionMenu(i18n(
"&Move to Printer"),
"fileprint",actionCollection(),
"job_move");
267 mact->setDelayed(
false);
268 connect(mact->popupMenu(),TQT_SIGNAL(activated(
int)),TQT_SLOT(slotMove(
int)));
269 connect(mact->popupMenu(),TQT_SIGNAL(aboutToShow()),KMTimer::self(),TQT_SLOT(hold()));
270 connect(mact->popupMenu(),TQT_SIGNAL(aboutToHide()),KMTimer::self(),TQT_SLOT(release()));
271 connect(mact->popupMenu(),TQT_SIGNAL(aboutToShow()),TQT_SLOT(slotShowMoveMenu()));
272 KToggleAction *tact =
new KToggleAction(i18n(
"&Toggle Completed Jobs"),
"history",0,actionCollection(),
"view_completed");
273 tact->setEnabled(m_manager->actions() & KMJob::ShowCompleted);
274 connect(tact,TQT_SIGNAL(toggled(
bool)),TQT_SLOT(slotShowCompleted(
bool)));
275 KToggleAction *uact =
new KToggleAction(i18n(
"Show Only User Jobs"),
"personal", 0, actionCollection(),
"view_user_jobs");
276 uact->setCheckedState(KGuiItem(i18n(
"Hide Only User Jobs"),
"personal"));
277 connect(uact, TQT_SIGNAL(toggled(
bool)), TQT_SLOT(slotUserOnly(
bool)));
278 m_userfield =
new TQLineEdit(0);
279 m_userfield->setText(getenv(
"USER"));
280 connect(m_userfield, TQT_SIGNAL(returnPressed()), TQT_SLOT(slotUserChanged()));
281 connect(uact, TQT_SIGNAL(toggled(
bool)), m_userfield, TQT_SLOT(setEnabled(
bool)));
282 m_userfield->setEnabled(
false);
283 m_userfield->setSizePolicy(TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed));
284 KWidgetAction *ufact =
new KWidgetAction(m_userfield, i18n(
"User Name"), 0, 0, 0, actionCollection(),
"view_username");
288 m_pop =
new TQPopupMenu(
this);
289 connect(m_pop,TQT_SIGNAL(aboutToShow()),KMTimer::self(),TQT_SLOT(hold()));
290 connect(m_pop,TQT_SIGNAL(aboutToHide()),KMTimer::self(),TQT_SLOT(release()));
293 m_pop->insertSeparator();
296 m_pop->insertSeparator();
301 KActionMenu *fact =
new KActionMenu(i18n(
"&Select Printer"),
"kdeprint_printer", actionCollection(),
"filter_modify");
302 fact->setDelayed(
false);
303 connect(fact->popupMenu(),TQT_SIGNAL(activated(
int)),TQT_SLOT(slotPrinterSelected(
int)));
304 connect(fact->popupMenu(),TQT_SIGNAL(aboutToShow()),KMTimer::self(),TQT_SLOT(hold()));
305 connect(fact->popupMenu(),TQT_SIGNAL(aboutToHide()),KMTimer::self(),TQT_SLOT(release()));
306 connect(fact->popupMenu(),TQT_SIGNAL(aboutToShow()),TQT_SLOT(slotShowPrinterMenu()));
310 KToolBar *toolbar = toolBar();
313 toolbar->insertSeparator();
316 toolbar->insertSeparator();
318 toolbar->insertSeparator();
321 ufact->plug(toolbar);
325 KStdAction::quit(TQT_TQOBJECT(kapp),TQT_SLOT(quit()),actionCollection());
326 KStdAction::close(TQT_TQOBJECT(
this),TQT_SLOT(slotClose()),actionCollection());
327 KStdAction::preferences(TQT_TQOBJECT(
this), TQT_SLOT(slotConfigure()), actionCollection());
330 new KAction(i18n(
"Refresh"),
"reload",0,TQT_TQOBJECT(
this),TQT_SLOT(slotRefresh()),actionCollection(),
"refresh");
333 KStatusBar *statusbar = statusBar();
334 m_stickybox =
new TQCheckBox( i18n(
"Keep window permanent" ), statusbar );
335 statusbar->addWidget( m_stickybox, 1,
false );
336 statusbar->insertItem(
" " + i18n(
"Max.: %1").arg(i18n(
"Unlimited"))+
" ", 0, 0,
true);
337 statusbar->setItemFixed(0);
344 slotSelectionChanged();
347 void KMJobViewer::buildPrinterMenu(TQPopupMenu *menu,
bool use_all,
bool use_specials)
352 TQPtrListIterator<KMPrinter> it(m_printers);
356 menu->insertItem(SmallIcon(
"fileprint"), i18n(
"All Printers"), i++);
357 menu->insertSeparator();
359 for (; it.current(); ++it, i++)
361 if ( !it.current()->instanceName().isEmpty() ||
362 ( it.current()->isSpecial() && !use_specials ) )
364 menu->insertItem(SmallIcon(it.current()->pixmap()), it.current()->printerName(), i);
368 void KMJobViewer::slotShowMoveMenu()
370 TQPopupMenu *menu =
static_cast<KActionMenu*
>(actionCollection()->action(
"job_move"))->popupMenu();
371 buildPrinterMenu(menu,
false,
false);
374 void KMJobViewer::slotShowPrinterMenu()
376 TQPopupMenu *menu =
static_cast<KActionMenu*
>(actionCollection()->action(
"filter_modify"))->popupMenu();
377 buildPrinterMenu(menu,
true,
true);
380 void KMJobViewer::updateJobs()
382 TQPtrListIterator<JobItem> jit(m_items);
383 for (;jit.current();++jit)
384 jit.current()->setDiscarded(
true);
386 TQPtrListIterator<KMJob> it(m_jobs);
387 for (;it.current();++it)
389 KMJob *j(it.current());
390 JobItem *item = findItem(j->uri());
393 item->setDiscarded(
false);
397 m_items.append(
new JobItem(m_view,j));
400 for (uint i=0; i<m_items.count(); i++)
401 if (m_items.at(i)->isDiscarded())
403 delete m_items.take(i);
407 slotSelectionChanged();
410 JobItem* KMJobViewer::findItem(
const TQString& uri)
412 TQPtrListIterator<JobItem> it(m_items);
413 for (;it.current();++it)
414 if (it.current()->jobUri() == uri)
return it.current();
418 void KMJobViewer::slotSelectionChanged()
420 int acts = m_manager->actions();
423 bool completed(
true), remote(
false);
425 TQPtrListIterator<JobItem> it(m_items);
426 TQPtrList<KMJob> joblist;
428 joblist.setAutoDelete(
false);
429 for (;it.current();++it)
431 if (it.current()->isSelected())
438 if (it.current()->job()->type() == KMJob::Threaded) thread |= 0x1;
441 if (state == -1) state = it.current()->job()->state();
442 else if (state != 0 && state != it.current()->job()->state()) state = 0;
444 completed = (completed && it.current()->job()->isCompleted());
445 joblist.append(it.current()->job());
446 if (it.current()->job()->isRemote())
453 actionCollection()->action(
"job_remove")->setEnabled((thread == 1) || ( !completed && (state >= 0) && (acts & KMJob::Remove)));
454 actionCollection()->action(
"job_hold")->setEnabled( !completed && (thread == 2) && (state > 0) && (state != KMJob::Held) && (acts & KMJob::Hold));
455 actionCollection()->action(
"job_resume")->setEnabled( !completed && (thread == 2) && (state > 0) && (state == KMJob::Held) && (acts & KMJob::Resume));
456 actionCollection()->action(
"job_move")->setEnabled(!remote && !completed && (thread == 2) && (state >= 0) && (acts & KMJob::Move));
457 actionCollection()->action(
"job_restart")->setEnabled(!remote && (thread == 2) && (state >= 0) && (completed) && (acts & KMJob::Restart));
459 m_manager->validatePluginActions(actionCollection(), joblist);
462 void KMJobViewer::jobSelection(TQPtrList<KMJob>& l)
464 l.setAutoDelete(
false);
465 TQPtrListIterator<JobItem> it(m_items);
466 for (;it.current();++it)
467 if (it.current()->isSelected())
468 l.append(it.current()->job());
471 void KMJobViewer::send(
int cmd,
const TQString& name,
const TQString& arg)
473 KMTimer::self()->hold();
477 if (!m_manager->sendCommand(l,cmd,arg))
479 KMessageBox::error(
this,
"<qt>"+i18n(
"Unable to perform action \"%1\" on selected jobs. Error received from manager:").arg(name)+
"<p>"+KMManager::self()->errorMsg()+
"</p></qt>");
481 KMManager::self()->setErrorMsg(TQString::null);
486 KMTimer::self()->release();
489 void KMJobViewer::slotHold()
491 send(KMJob::Hold,i18n(
"Hold"));
494 void KMJobViewer::slotResume()
496 send(KMJob::Resume,i18n(
"Resume"));
499 void KMJobViewer::slotRemove()
501 send(KMJob::Remove,i18n(
"Remove"));
504 void KMJobViewer::slotRestart()
506 send(KMJob::Restart,i18n(
"Restart"));
509 void KMJobViewer::slotMove(
int prID)
511 if (prID >= 0 && prID < (
int)(m_printers.count()))
513 KMPrinter *p = m_printers.at(prID);
514 send(KMJob::Move,i18n(
"Move to %1").arg(p->printerName()),p->printerName());
518 void KMJobViewer::slotRightClicked(TQListViewItem*,
const TQPoint& p,
int)
520 if (m_pop) m_pop->popup(p);
523 void KMJobViewer::loadPrinters()
528 TQPtrListIterator<KMPrinter> it(*(KMFactory::self()->manager()->printerList(
false)));
529 for (;it.current();++it)
532 if ((it.current()->isPrinter() || it.current()->isClass(
false) ||
533 ( it.current()->isSpecial() && it.current()->isValid() ) )
534 && (it.current()->name() == it.current()->printerName()))
535 m_printers.append(it.current());
539 void KMJobViewer::slotPrinterSelected(
int prID)
541 if (prID >= 0 && prID < (
int)(m_printers.count()+1))
543 TQString prname = (prID == 0 ? i18n(
"All Printers") : m_printers.at(prID-1)->printerName());
544 emit printerChanged(
this, prname);
548 void KMJobViewer::slotRefresh()
553 void KMJobViewer::triggerRefresh()
562 emit refreshClicked();
565 void KMJobViewer::slotShowCompleted(
bool on)
568 m_type = (on ? KMJobManager::CompletedJobs : KMJobManager::ActiveJobs);
573 void KMJobViewer::slotClose()
578 void KMJobViewer::loadPluginActions()
580 int mpopindex(7), toolbarindex(!m_standalone?7:8), menuindex(7);
586 KAction *act = actionCollection()->action(
"job_restart");
587 for (
int i=0;i<act->containerCount();i++)
589 if (menuBar()->findItem(act->itemId(i), &menu))
591 menuindex = mpopindex = menu->indexOf(act->itemId(i))+1;
597 TQValueList<KAction*> acts = m_manager->createPluginActions(actionCollection());
598 for (TQValueListIterator<KAction*> it=acts.begin(); it!=acts.end(); ++it)
601 connect((*it), TQT_SIGNAL(activated(
int)), TQT_SLOT(pluginActionActivated(
int)));
604 (*it)->plug(toolBar(), toolbarindex++);
606 (*it)->plug(m_pop, mpopindex++);
608 (*it)->plug(static_cast<TQPopupMenu*>(menu), menuindex++);
612 void KMJobViewer::removePluginActions()
614 TQValueList<KAction*> acts = actionCollection()->actions(
"plugin");
615 for (TQValueListIterator<KAction*> it=acts.begin(); it!=acts.end(); ++it)
634 void KMJobViewer::reload()
636 removePluginActions();
647 for (
int c=m_view->columns()-1; c>5; c--)
648 m_view->removeColumn(c);
649 KMFactory::self()->uiManager()->setupJobViewer(m_view);
652 actionCollection()->action(
"view_completed")->setEnabled(m_manager->actions() & KMJob::ShowCompleted);
653 static_cast<KToggleAction*
>(actionCollection()->action(
"view_completed"))->setChecked(
false);
656 void KMJobViewer::closeEvent(TQCloseEvent *e)
658 if (m_standalone && !kapp->sessionSaving())
667 void KMJobViewer::pluginActionActivated(
int ID)
669 KMTimer::self()->hold();
671 TQPtrList<KMJob> joblist;
672 jobSelection(joblist);
673 if (!m_manager->doPluginAction(ID, joblist))
674 KMessageBox::error(
this,
"<qt>"+i18n(
"Operation failed.")+
"<p>"+KMManager::self()->errorMsg()+
"</p></qt>");
677 KMTimer::self()->release();
680 void KMJobViewer::slotUserOnly(
bool on)
682 m_username = (on ? m_userfield->text() : TQString::null);
686 void KMJobViewer::slotUserChanged()
688 if (m_userfield->isEnabled())
690 m_username = m_userfield->text();
695 void KMJobViewer::slotConfigure()
697 KMTimer::self()->hold();
699 KDialogBase dlg(
this, 0,
true, i18n(
"Print Job Settings"), KDialogBase::Ok|KDialogBase::Cancel);
700 KMConfigJobs *w =
new KMConfigJobs(&dlg);
701 dlg.setMainWidget(w);
703 KConfig *conf = KMFactory::self()->printConfig();
712 KMTimer::self()->release();
715 bool KMJobViewer::isSticky()
const
717 return ( m_stickybox ? m_stickybox->isChecked() : false );
720 void KMJobViewer::slotDropped( TQDropEvent *e, TQListViewItem* )
726 KURLDrag::decode( e, uris );
727 for ( KURL::List::ConstIterator it = uris.begin();
728 it != uris.end(); ++it)
730 if ( KIO::NetAccess::download( *it, target, 0 ) )
734 if ( files.count() > 0 )
742 #include "kmjobviewer.moc"