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 <tdelistview.h> 34 #include <kstatusbar.h> 35 #include <tqpopupmenu.h> 36 #include <tdemessagebox.h> 37 #include <tdelocale.h> 38 #include <tdepopupmenu.h> 39 #include <tdeaction.h> 40 #include <kstdaction.h> 41 #include <kiconloader.h> 42 #include <tdeapplication.h> 44 #include <tdemenubar.h> 47 #include <tdeio/netaccess.h> 51 #include <tqlineedit.h> 52 #include <kdialogbase.h> 53 #include <tqcheckbox.h> 55 #include <tdeconfig.h> 58 #define m_manager KMFactory::self()->jobManager() 60 class KJobListView :
public TDEListView
63 KJobListView( TQWidget *parent = 0,
const char *name = 0 );
66 bool acceptDrag( TQDropEvent* )
const;
69 KJobListView::KJobListView( TQWidget *parent,
const char *name )
70 : TDEListView( parent, name )
72 setAcceptDrops(
true );
73 setDropVisualizer(
false );
76 bool KJobListView::acceptDrag( TQDropEvent *e )
const 78 if ( KURLDrag::canDecode( e ) )
81 return TDEListView::acceptDrag( e );
84 KMJobViewer::KMJobViewer(TQWidget *parent,
const char *name)
85 : TDEMainWindow(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 TDEConfig *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 TDEConfig *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(
"document-print");
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 TDEAction *hact =
new TDEAction(i18n(
"&Hold"),
"process-stop",0,TQT_TQOBJECT(
this),TQT_SLOT(slotHold()),actionCollection(),
"job_hold");
263 TDEAction *ract =
new TDEAction(i18n(
"&Resume"),
"system-run",0,TQT_TQOBJECT(
this),TQT_SLOT(slotResume()),actionCollection(),
"job_resume");
264 TDEAction *dact =
new TDEAction(i18n(
"Remo&ve"),
"edittrash",Qt::Key_Delete,TQT_TQOBJECT(
this),TQT_SLOT(slotRemove()),actionCollection(),
"job_remove");
265 TDEAction *sact =
new TDEAction(i18n(
"Res&tart"),
"edit-redo",0,TQT_TQOBJECT(
this),TQT_SLOT(slotRestart()),actionCollection(),
"job_restart");
266 TDEActionMenu *mact =
new TDEActionMenu(i18n(
"&Move to Printer"),
"document-print",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 TDEToggleAction *tact =
new TDEToggleAction(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 TDEToggleAction *uact =
new TDEToggleAction(i18n(
"Show Only User Jobs"),
"preferences-desktop-personal", 0, actionCollection(),
"view_user_jobs");
276 uact->setCheckedState(KGuiItem(i18n(
"Hide Only User Jobs"),
"preferences-desktop-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 TDEActionMenu *fact =
new TDEActionMenu(i18n(
"&Select Printer"),
"tdeprint_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 TDEToolBar *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 TDEAction(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 );
336 TDEConfig *conf = KMFactory::self()->printConfig();
337 conf->setGroup(
"Jobs");
338 m_stickybox->setChecked(conf->readBoolEntry(
"KeepWindow",
true));
339 connect(m_stickybox, TQT_SIGNAL(toggled(
bool)), TQT_SLOT(slotKeepWindowChange(
bool)));
340 statusbar->addWidget( m_stickybox, 1,
false );
341 statusbar->insertItem(
" " + i18n(
"Max.: %1").arg(i18n(
"Unlimited"))+
" ", 0, 0,
true);
342 statusbar->setItemFixed(0);
349 slotSelectionChanged();
352 void KMJobViewer::buildPrinterMenu(TQPopupMenu *menu,
bool use_all,
bool use_specials)
357 TQPtrListIterator<KMPrinter> it(m_printers);
361 menu->insertItem(SmallIcon(
"document-print"), i18n(
"All Printers"), i++);
362 menu->insertSeparator();
364 for (; it.current(); ++it, i++)
366 if ( !it.current()->instanceName().isEmpty() ||
367 ( it.current()->isSpecial() && !use_specials ) )
369 menu->insertItem(SmallIcon(it.current()->pixmap()), it.current()->printerName(), i);
373 void KMJobViewer::slotKeepWindowChange(
bool val )
375 TDEConfig *conf = KMFactory::self()->printConfig();
376 conf->setGroup(
"Jobs");
377 conf->writeEntry(
"KeepWindow",val);
380 void KMJobViewer::slotShowMoveMenu()
382 TQPopupMenu *menu =
static_cast<TDEActionMenu*
>(actionCollection()->action(
"job_move"))->popupMenu();
383 buildPrinterMenu(menu,
false,
false);
386 void KMJobViewer::slotShowPrinterMenu()
388 TQPopupMenu *menu =
static_cast<TDEActionMenu*
>(actionCollection()->action(
"filter_modify"))->popupMenu();
389 buildPrinterMenu(menu,
true,
true);
392 void KMJobViewer::updateJobs()
394 TQPtrListIterator<JobItem> jit(m_items);
395 for (;jit.current();++jit)
396 jit.current()->setDiscarded(
true);
398 TQPtrListIterator<KMJob> it(m_jobs);
399 for (;it.current();++it)
401 KMJob *j(it.current());
402 JobItem *item = findItem(j->uri());
405 item->setDiscarded(
false);
409 m_items.append(
new JobItem(m_view,j));
412 for (uint i=0; i<m_items.count(); i++)
413 if (m_items.at(i)->isDiscarded())
415 delete m_items.take(i);
419 slotSelectionChanged();
422 JobItem* KMJobViewer::findItem(
const TQString& uri)
424 TQPtrListIterator<JobItem> it(m_items);
425 for (;it.current();++it)
426 if (it.current()->jobUri() == uri)
return it.current();
430 void KMJobViewer::slotSelectionChanged()
432 int acts = m_manager->actions();
435 bool completed(
true), remote(
false);
437 TQPtrListIterator<JobItem> it(m_items);
438 TQPtrList<KMJob> joblist;
440 joblist.setAutoDelete(
false);
441 for (;it.current();++it)
443 if (it.current()->isSelected())
450 if (it.current()->job()->type() == KMJob::Threaded) thread |= 0x1;
453 if (state == -1) state = it.current()->job()->state();
454 else if (state != 0 && state != it.current()->job()->state()) state = 0;
456 completed = (completed && it.current()->job()->isCompleted());
457 joblist.append(it.current()->job());
458 if (it.current()->job()->isRemote())
465 actionCollection()->action(
"job_remove")->setEnabled((thread == 1) || ( !completed && (state >= 0) && (acts & KMJob::Remove)));
466 actionCollection()->action(
"job_hold")->setEnabled( !completed && (thread == 2) && (state > 0) && (state != KMJob::Held) && (acts & KMJob::Hold));
467 actionCollection()->action(
"job_resume")->setEnabled( !completed && (thread == 2) && (state > 0) && (state == KMJob::Held) && (acts & KMJob::Resume));
468 actionCollection()->action(
"job_move")->setEnabled(!remote && !completed && (thread == 2) && (state >= 0) && (acts & KMJob::Move));
469 actionCollection()->action(
"job_restart")->setEnabled(!remote && (thread == 2) && (state >= 0) && (completed) && (acts & KMJob::Restart));
471 m_manager->validatePluginActions(actionCollection(), joblist);
474 void KMJobViewer::jobSelection(TQPtrList<KMJob>& l)
476 l.setAutoDelete(
false);
477 TQPtrListIterator<JobItem> it(m_items);
478 for (;it.current();++it)
479 if (it.current()->isSelected())
480 l.append(it.current()->job());
483 void KMJobViewer::send(
int cmd,
const TQString& name,
const TQString& arg)
485 KMTimer::self()->hold();
489 if (!m_manager->sendCommand(l,cmd,arg))
491 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>");
493 KMManager::self()->setErrorMsg(TQString::null);
498 KMTimer::self()->release();
501 void KMJobViewer::slotHold()
503 send(KMJob::Hold,i18n(
"Hold"));
506 void KMJobViewer::slotResume()
508 send(KMJob::Resume,i18n(
"Resume"));
511 void KMJobViewer::slotRemove()
513 send(KMJob::Remove,i18n(
"Remove"));
516 void KMJobViewer::slotRestart()
518 send(KMJob::Restart,i18n(
"Restart"));
521 void KMJobViewer::slotMove(
int prID)
523 if (prID >= 0 && prID < (
int)(m_printers.count()))
525 KMPrinter *p = m_printers.at(prID);
526 send(KMJob::Move,i18n(
"Move to %1").arg(p->printerName()),p->printerName());
530 void KMJobViewer::slotRightClicked(TQListViewItem*,
const TQPoint& p,
int)
532 if (m_pop) m_pop->popup(p);
535 void KMJobViewer::loadPrinters()
540 TQPtrListIterator<KMPrinter> it(*(KMFactory::self()->manager()->printerList(
false)));
541 for (;it.current();++it)
544 if ((it.current()->isPrinter() || it.current()->isClass(
false) ||
545 ( it.current()->isSpecial() && it.current()->isValid() ) )
546 && (it.current()->name() == it.current()->printerName()))
547 m_printers.append(it.current());
551 void KMJobViewer::slotPrinterSelected(
int prID)
553 if (prID >= 0 && prID < (
int)(m_printers.count()+1))
555 TQString prname = (prID == 0 ? i18n(
"All Printers") : m_printers.at(prID-1)->printerName());
556 emit printerChanged(
this, prname);
560 void KMJobViewer::slotRefresh()
565 void KMJobViewer::triggerRefresh()
574 emit refreshClicked();
577 void KMJobViewer::slotShowCompleted(
bool on)
580 m_type = (on ? KMJobManager::CompletedJobs : KMJobManager::ActiveJobs);
585 void KMJobViewer::slotClose()
590 void KMJobViewer::loadPluginActions()
592 int mpopindex(7), toolbarindex(!m_standalone?7:8), menuindex(7);
598 TDEAction *act = actionCollection()->action(
"job_restart");
599 for (
int i=0;i<act->containerCount();i++)
601 if (menuBar()->findItem(act->itemId(i), &menu))
603 menuindex = mpopindex = menu->indexOf(act->itemId(i))+1;
609 TQValueList<TDEAction*> acts = m_manager->createPluginActions(actionCollection());
610 for (TQValueListIterator<TDEAction*> it=acts.begin(); it!=acts.end(); ++it)
613 connect((*it), TQT_SIGNAL(activated(
int)), TQT_SLOT(pluginActionActivated(
int)));
616 (*it)->plug(toolBar(), toolbarindex++);
618 (*it)->plug(m_pop, mpopindex++);
620 (*it)->plug(static_cast<TQPopupMenu*>(menu), menuindex++);
624 void KMJobViewer::removePluginActions()
626 TQValueList<TDEAction*> acts = actionCollection()->actions(
"plugin");
627 for (TQValueListIterator<TDEAction*> it=acts.begin(); it!=acts.end(); ++it)
646 void KMJobViewer::reload()
648 removePluginActions();
659 for (
int c=m_view->columns()-1; c>5; c--)
660 m_view->removeColumn(c);
661 KMFactory::self()->uiManager()->setupJobViewer(m_view);
664 actionCollection()->action(
"view_completed")->setEnabled(m_manager->actions() & KMJob::ShowCompleted);
665 static_cast<TDEToggleAction*
>(actionCollection()->action(
"view_completed"))->setChecked(
false);
668 void KMJobViewer::closeEvent(TQCloseEvent *e)
670 if (m_standalone && !kapp->sessionSaving())
679 void KMJobViewer::pluginActionActivated(
int ID)
681 KMTimer::self()->hold();
683 TQPtrList<KMJob> joblist;
684 jobSelection(joblist);
685 if (!m_manager->doPluginAction(ID, joblist))
686 KMessageBox::error(
this,
"<qt>"+i18n(
"Operation failed.")+
"<p>"+KMManager::self()->errorMsg()+
"</p></qt>");
689 KMTimer::self()->release();
692 void KMJobViewer::slotUserOnly(
bool on)
694 m_username = (on ? m_userfield->text() : TQString::null);
698 void KMJobViewer::slotUserChanged()
700 if (m_userfield->isEnabled())
702 m_username = m_userfield->text();
707 void KMJobViewer::slotConfigure()
709 KMTimer::self()->hold();
711 KDialogBase dlg(
this, 0,
true, i18n(
"Print Job Settings"), KDialogBase::Ok|KDialogBase::Cancel);
712 KMConfigJobs *w =
new KMConfigJobs(&dlg);
713 dlg.setMainWidget(w);
715 TDEConfig *conf = KMFactory::self()->printConfig();
724 KMTimer::self()->release();
727 bool KMJobViewer::isSticky()
const 729 return ( m_stickybox ? m_stickybox->isChecked() : false );
732 void KMJobViewer::slotDropped( TQDropEvent *e, TQListViewItem* )
738 KURLDrag::decode( e, uris );
739 for ( KURL::List::ConstIterator it = uris.begin();
740 it != uris.end(); ++it)
742 if ( TDEIO::NetAccess::download( *it, target, 0 ) )
746 if ( files.count() > 0 )
754 #include "kmjobviewer.moc" bool autoConfigure(const TQString &prname=TQString::null, TQWidget *parent=0)
Configure the KPrinter object to be used with the printer named prname.
This class is the main interface to access the TDE print framework.
bool printFiles(const TQStringList &files, bool removeafter=false, bool startviewer=true)
Prints the files given in argument.