You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
917 lines
31 KiB
917 lines
31 KiB
/*
|
|
* 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 "kmmainview.h"
|
|
#include "kmtimer.h"
|
|
#include "kmprinterview.h"
|
|
#include "kmpages.h"
|
|
#include "kmmanager.h"
|
|
#include "kmuimanager.h"
|
|
#include "kmfactory.h"
|
|
#include "kmvirtualmanager.h"
|
|
#include "kmprinter.h"
|
|
#include "driver.h"
|
|
#include "kmdriverdialog.h"
|
|
#include "kmwizard.h"
|
|
#include "kmconfigdialog.h"
|
|
#include "kmspecialprinterdlg.h"
|
|
#include "plugincombobox.h"
|
|
#include "kiconselectaction.h"
|
|
#include "messagewindow.h"
|
|
|
|
#include <qdockarea.h>
|
|
#include <kmenubar.h>
|
|
#include <qtimer.h>
|
|
#include <qcombobox.h>
|
|
#include <qlabel.h>
|
|
#include <qlayout.h>
|
|
#include <qpopupmenu.h>
|
|
#include <kmessagebox.h>
|
|
#include <kaction.h>
|
|
#include <klocale.h>
|
|
#include <kconfig.h>
|
|
#include <ktoolbar.h>
|
|
#include <ktoolbarbutton.h>
|
|
#include <kdebug.h>
|
|
#include <kpopupmenu.h>
|
|
#include <klibloader.h>
|
|
#include <kdialogbase.h>
|
|
#include <ksimpleconfig.h>
|
|
#include <kstandarddirs.h>
|
|
#include <kapplication.h>
|
|
|
|
#undef m_manager
|
|
#define m_manager KMFactory::self()->manager()
|
|
|
|
int kdeprint_management_add_printer_wizard( QWidget* parent )
|
|
{
|
|
KMWizard dlg(parent);
|
|
int flag(0);
|
|
if (dlg.exec())
|
|
{
|
|
flag = 1;
|
|
// check if the printer already exists, and ask confirmation if needed.
|
|
if (KMFactory::self()->manager()->findPrinter(dlg.printer()->name()) != 0)
|
|
if (KMessageBox::warningContinueCancel(parent,i18n("The printer %1 already exists. Continuing will overwrite existing printer. Do you want to continue?").arg(dlg.printer()->name())) == KMessageBox::Cancel)
|
|
flag = 0;
|
|
// try to add printer only if flag is true.
|
|
if (flag && !KMFactory::self()->manager()->createPrinter(dlg.printer()))
|
|
flag = -1;
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
KMMainView::KMMainView(QWidget *parent, const char *name, KActionCollection *coll)
|
|
: QWidget(parent, name)
|
|
{
|
|
m_current = 0;
|
|
m_first = true;
|
|
|
|
// create widgets
|
|
m_printerview = new KMPrinterView(this, "PrinterView");
|
|
m_printerpages = new KMPages(this, "PrinterPages");
|
|
m_pop = new QPopupMenu(this);
|
|
m_toolbar = new KToolBar(this, "ToolBar");
|
|
m_toolbar->setMovingEnabled(false);
|
|
m_plugin = new PluginComboBox(this, "Plugin");
|
|
/*
|
|
m_menubar = new KMenuBar( this );
|
|
static_cast<KMenuBar*>( m_menubar )->setTopLevelMenu( false );
|
|
*/
|
|
m_menubar = new KToolBar( this, "MenuBar", false, false );
|
|
m_menubar->setIconText( KToolBar::IconTextRight );
|
|
m_menubar->setMovingEnabled( false );
|
|
|
|
// layout
|
|
QVBoxLayout *m_layout = new QVBoxLayout(this, 0, 0);
|
|
m_layout->addWidget(m_toolbar);
|
|
m_layout->addWidget( m_menubar );
|
|
m_boxlayout = new QBoxLayout(QBoxLayout::TopToBottom, 0, 0);
|
|
m_layout->addLayout(m_boxlayout);
|
|
m_boxlayout->addWidget(m_printerview);
|
|
m_boxlayout->addWidget(m_printerpages);
|
|
m_layout->addSpacing(5);
|
|
m_layout->addWidget(m_plugin, 0);
|
|
|
|
// connections
|
|
connect(KMTimer::self(),SIGNAL(timeout()),SLOT(slotTimer()));
|
|
connect(m_printerview,SIGNAL(printerSelected(const QString&)),SLOT(slotPrinterSelected(const QString&)));
|
|
connect(m_printerview,SIGNAL(rightButtonClicked(const QString&,const QPoint&)),SLOT(slotRightButtonClicked(const QString&,const QPoint&)));
|
|
connect(m_pop,SIGNAL(aboutToShow()),KMTimer::self(),SLOT(hold()));
|
|
connect(m_pop,SIGNAL(aboutToHide()),KMTimer::self(),SLOT(release()));
|
|
connect( m_manager, SIGNAL( updatePossible( bool ) ), SLOT( slotUpdatePossible( bool ) ) );
|
|
|
|
// actions
|
|
if (coll)
|
|
m_actions = coll;
|
|
else
|
|
m_actions = new KActionCollection(this);
|
|
initActions();
|
|
|
|
// first update
|
|
restoreSettings();
|
|
loadParameters();
|
|
|
|
// delay first update until KMManager is ready
|
|
reset( i18n( "Initializing manager..." ), true, true );
|
|
}
|
|
|
|
KMMainView::~KMMainView()
|
|
{
|
|
saveSettings();
|
|
//KMFactory::release();
|
|
}
|
|
|
|
void KMMainView::loadParameters()
|
|
{
|
|
}
|
|
|
|
void KMMainView::restoreSettings()
|
|
{
|
|
KConfig *conf = KMFactory::self()->printConfig();
|
|
conf->setGroup("General");
|
|
setViewType((KMPrinterView::ViewType)conf->readNumEntry("ViewType",KMPrinterView::Icons));
|
|
setOrientation(conf->readNumEntry("Orientation", Qt::Vertical));
|
|
bool view = conf->readBoolEntry("ViewToolBar",false);
|
|
slotToggleToolBar(view);
|
|
((KToggleAction*)m_actions->action("view_toolbar"))->setChecked(view);
|
|
view = conf->readBoolEntry( "ViewMenuBar", true );
|
|
slotToggleMenuBar( view );
|
|
static_cast<KToggleAction*>( m_actions->action( "view_menubar" ) )->setChecked( view );
|
|
view = conf->readBoolEntry("ViewPrinterInfos",true);
|
|
slotShowPrinterInfos(view);
|
|
((KToggleAction*)m_actions->action("view_printerinfos"))->setChecked(view);
|
|
}
|
|
|
|
void KMMainView::saveSettings()
|
|
{
|
|
KConfig *conf = KMFactory::self()->printConfig();
|
|
conf->setGroup("General");
|
|
conf->writeEntry("ViewType",(int)m_printerview->viewType());
|
|
conf->writeEntry("Orientation",(int)orientation());
|
|
conf->writeEntry("ViewToolBar",((KToggleAction*)m_actions->action("view_toolbar"))->isChecked());
|
|
conf->writeEntry("ViewMenuBar",static_cast<KToggleAction*>( m_actions->action("view_menubar") )->isChecked());
|
|
conf->writeEntry("ViewPrinterInfos",((KToggleAction*)m_actions->action("view_printerinfos"))->isChecked());
|
|
conf->sync();
|
|
}
|
|
|
|
void KMMainView::initActions()
|
|
{
|
|
KIconSelectAction *vact = new KIconSelectAction(i18n("&View"),0,m_actions,"view_change");
|
|
QStringList iconlst;
|
|
iconlst << "view_icon" << "view_detailed" << "view_tree";
|
|
vact->setItems(QStringList::split(',',i18n("&Icons,&List,&Tree"),false), iconlst);
|
|
vact->setCurrentItem(0);
|
|
connect(vact,SIGNAL(activated(int)),SLOT(slotChangeView(int)));
|
|
|
|
KActionMenu *stateAct = new KActionMenu(i18n("Start/Stop Printer"), "kdeprint_printstate", m_actions, "printer_state_change");
|
|
stateAct->setDelayed(false);
|
|
stateAct->insert(new KAction(i18n("&Start Printer"),"kdeprint_enableprinter",0,this,SLOT(slotChangePrinterState()),m_actions,"printer_start"));
|
|
stateAct->insert(new KAction(i18n("Sto&p Printer"),"kdeprint_stopprinter",0,this,SLOT(slotChangePrinterState()),m_actions,"printer_stop"));
|
|
|
|
stateAct = new KActionMenu(i18n("Enable/Disable Job Spooling"), "kdeprint_queuestate", m_actions, "printer_spool_change");
|
|
stateAct->setDelayed(false);
|
|
stateAct->insert(new KAction(i18n("&Enable Job Spooling"),"kdeprint_enableprinter",0,this,SLOT(slotChangePrinterState()),m_actions,"printer_enable"));
|
|
stateAct->insert(new KAction(i18n("&Disable Job Spooling"),"kdeprint_stopprinter",0,this,SLOT(slotChangePrinterState()),m_actions,"printer_disable"));
|
|
|
|
new KAction(i18n("&Remove"),"edittrash",0,this,SLOT(slotRemove()),m_actions,"printer_remove");
|
|
new KAction(i18n("&Configure..."),"configure",0,this,SLOT(slotConfigure()),m_actions,"printer_configure");
|
|
new KAction(i18n("Add &Printer/Class..."),"kdeprint_addprinter",0,this,SLOT(slotAdd()),m_actions,"printer_add");
|
|
new KAction(i18n("Add &Special (pseudo) Printer..."),"kdeprint_addpseudo",0,this,SLOT(slotAddSpecial()),m_actions,"printer_add_special");
|
|
new KAction(i18n("Set as &Local Default"),"kdeprint_defaulthard",0,this,SLOT(slotHardDefault()),m_actions,"printer_hard_default");
|
|
new KAction(i18n("Set as &User Default"),"kdeprint_defaultsoft",0,this,SLOT(slotSoftDefault()),m_actions,"printer_soft_default");
|
|
new KAction(i18n("&Test Printer..."),"kdeprint_testprinter",0,this,SLOT(slotTest()),m_actions,"printer_test");
|
|
new KAction(i18n("Configure &Manager..."),"kdeprint_configmgr",0,this,SLOT(slotManagerConfigure()),m_actions,"manager_configure");
|
|
new KAction(i18n("Initialize Manager/&View"),"reload",0,this,SLOT(slotInit()),m_actions,"view_refresh");
|
|
|
|
KIconSelectAction *dact = new KIconSelectAction(i18n("&Orientation"),0,m_actions,"orientation_change");
|
|
iconlst.clear();
|
|
iconlst << "view_top_bottom" << "view_left_right";
|
|
dact->setItems(QStringList::split(',',i18n("&Vertical,&Horizontal"),false), iconlst);
|
|
dact->setCurrentItem(0);
|
|
connect(dact,SIGNAL(activated(int)),SLOT(slotChangeDirection(int)));
|
|
|
|
new KAction(i18n("R&estart Server"),"kdeprint_restartsrv",0,this,SLOT(slotServerRestart()),m_actions,"server_restart");
|
|
new KAction(i18n("Configure &Server..."),"kdeprint_configsrv",0,this,SLOT(slotServerConfigure()),m_actions,"server_configure");
|
|
new KAction(i18n("Configure Server Access..."),"kdeprint_configsrv",0,this,SLOT(slotServerAccessConfigure()),m_actions,"server_access_configure");
|
|
|
|
KToggleAction *tact = new KToggleAction(i18n("Show &Toolbar"),0,m_actions,"view_toolbar");
|
|
tact->setCheckedState(i18n("Hide &Toolbar"));
|
|
connect(tact,SIGNAL(toggled(bool)),SLOT(slotToggleToolBar(bool)));
|
|
tact = new KToggleAction( i18n( "Show Me&nu Toolbar" ), 0, m_actions, "view_menubar" );
|
|
tact->setCheckedState(i18n("Hide Me&nu Toolbar"));
|
|
connect( tact, SIGNAL( toggled( bool ) ), SLOT( slotToggleMenuBar( bool ) ) );
|
|
tact = new KToggleAction(i18n("Show Pr&inter Details"),"kdeprint_printer_infos", 0,m_actions,"view_printerinfos");
|
|
tact->setCheckedState(KGuiItem(i18n("Hide Pr&inter Details"),"kdeprint_printer_infos"));
|
|
tact->setChecked(true);
|
|
connect(tact,SIGNAL(toggled(bool)),SLOT(slotShowPrinterInfos(bool)));
|
|
|
|
tact = new KToggleAction(i18n("Toggle Printer &Filtering"), "filter", 0, m_actions, "view_pfilter");
|
|
tact->setChecked(KMManager::self()->isFilterEnabled());
|
|
connect(tact, SIGNAL(toggled(bool)), SLOT(slotToggleFilter(bool)));
|
|
|
|
new KAction( i18n( "%1 &Handbook" ).arg( "KDEPrint" ), "contents", 0, this, SLOT( slotHelp() ), m_actions, "invoke_help" );
|
|
new KAction( i18n( "%1 &Web Site" ).arg( "KDEPrint" ), "network", 0, this, SLOT( slotHelp() ), m_actions, "invoke_web" );
|
|
|
|
KActionMenu *mact = new KActionMenu(i18n("Pri&nter Tools"), "package_utilities", m_actions, "printer_tool");
|
|
mact->setDelayed(false);
|
|
connect(mact->popupMenu(), SIGNAL(activated(int)), SLOT(slotToolSelected(int)));
|
|
QStringList files = KGlobal::dirs()->findAllResources("data", "kdeprint/tools/*.desktop");
|
|
for (QStringList::ConstIterator it=files.begin(); it!=files.end(); ++it)
|
|
{
|
|
KSimpleConfig conf(*it);
|
|
conf.setGroup("Desktop Entry");
|
|
mact->popupMenu()->insertItem(conf.readEntry("Name", "Unnamed"), mact->popupMenu()->count());
|
|
m_toollist << conf.readEntry("X-KDE-Library");
|
|
}
|
|
|
|
// add actions to the toolbar
|
|
m_actions->action("printer_add")->plug(m_toolbar);
|
|
m_actions->action("printer_add_special")->plug(m_toolbar);
|
|
m_toolbar->insertLineSeparator();
|
|
m_actions->action("printer_state_change")->plug(m_toolbar);
|
|
m_actions->action("printer_spool_change")->plug(m_toolbar);
|
|
m_toolbar->insertSeparator();
|
|
m_actions->action("printer_hard_default")->plug(m_toolbar);
|
|
m_actions->action("printer_soft_default")->plug(m_toolbar);
|
|
m_actions->action("printer_remove")->plug(m_toolbar);
|
|
m_toolbar->insertSeparator();
|
|
m_actions->action("printer_configure")->plug(m_toolbar);
|
|
m_actions->action("printer_test")->plug(m_toolbar);
|
|
m_actions->action("printer_tool")->plug(m_toolbar);
|
|
m_pactionsindex = m_toolbar->insertSeparator();
|
|
m_toolbar->insertLineSeparator();
|
|
m_actions->action("server_restart")->plug(m_toolbar);
|
|
m_actions->action("server_configure")->plug(m_toolbar);
|
|
m_toolbar->insertLineSeparator();
|
|
m_actions->action("manager_configure")->plug(m_toolbar);
|
|
m_actions->action("view_refresh")->plug(m_toolbar);
|
|
m_toolbar->insertLineSeparator();
|
|
m_actions->action("view_printerinfos")->plug(m_toolbar);
|
|
m_actions->action("view_change")->plug(m_toolbar);
|
|
m_actions->action("orientation_change")->plug(m_toolbar);
|
|
m_actions->action("view_pfilter")->plug(m_toolbar);
|
|
|
|
// add actions to the menu bar
|
|
QPopupMenu *menu = new QPopupMenu( this );
|
|
m_actions->action( "printer_add" )->plug( menu );
|
|
m_actions->action( "printer_add_special" )->plug( menu );
|
|
//m_menubar->insertItem( i18n( "Add" ), menu );
|
|
m_menubar->insertButton( "wizard", 0, true, i18n( "Add" ) );
|
|
m_menubar->getButton( 0 )->setPopup( menu, true );
|
|
menu = new QPopupMenu( this );
|
|
m_actions->action("printer_state_change")->plug( menu );
|
|
m_actions->action("printer_spool_change")->plug( menu );
|
|
menu->insertSeparator();
|
|
m_actions->action("printer_hard_default")->plug( menu );
|
|
m_actions->action("printer_soft_default")->plug( menu );
|
|
m_actions->action("printer_remove")->plug( menu );
|
|
menu->insertSeparator();
|
|
m_actions->action("printer_configure")->plug( menu );
|
|
m_actions->action("printer_test")->plug( menu );
|
|
m_actions->action("printer_tool")->plug( menu );
|
|
menu->insertSeparator();
|
|
//m_menubar->insertItem( i18n( "Printer" ), menu );
|
|
m_menubar->insertButton( "printer1", 1, true, i18n( "Printer" ) );
|
|
m_menubar->getButton( 1 )->setPopup( menu, true );
|
|
menu = new QPopupMenu( this );
|
|
m_actions->action("server_restart")->plug( menu );
|
|
m_actions->action("server_configure")->plug( menu );
|
|
//m_menubar->insertItem( i18n( "Server" ), menu );
|
|
m_menubar->insertButton( "misc", 2, true, i18n( "Print Server" ) );
|
|
m_menubar->getButton( 2 )->setPopup( menu, true );
|
|
menu = new QPopupMenu( this );
|
|
m_actions->action("manager_configure")->plug( menu );
|
|
m_actions->action("view_refresh")->plug( menu );
|
|
//m_menubar->insertItem( i18n( "Manager" ), menu );
|
|
m_menubar->insertButton( "kdeprint_configmgr", 3, true, i18n( "Print Manager" ) );
|
|
m_menubar->getButton( 3 )->setPopup( menu, true );
|
|
menu = new QPopupMenu( this );
|
|
m_actions->action("view_printerinfos")->plug( menu );
|
|
m_actions->action("view_change")->plug( menu );
|
|
m_actions->action("orientation_change")->plug( menu );
|
|
m_actions->action( "view_toolbar" )->plug ( menu );
|
|
m_actions->action( "view_menubar" )->plug ( menu );
|
|
menu->insertSeparator();
|
|
m_actions->action("view_pfilter")->plug( menu );
|
|
//m_menubar->insertItem( i18n( "View" ), menu );
|
|
m_menubar->insertButton( "view_remove", 4, true, i18n( "View" ) );
|
|
m_menubar->getButton( 4 )->setPopup( menu, true );
|
|
//m_menubar->setMinimumHeight( m_menubar->heightForWidth( 1000 ) );
|
|
menu = new QPopupMenu( this );
|
|
m_actions->action( "invoke_help" )->plug( menu );
|
|
m_actions->action( "invoke_web" )->plug( menu );
|
|
m_menubar->insertButton( "help", 5, true, i18n( "Documentation" ) );
|
|
m_menubar->getButton( 5 )->setPopup( menu, true );
|
|
|
|
loadPluginActions();
|
|
slotPrinterSelected(QString::null);
|
|
}
|
|
|
|
void KMMainView::slotRefresh()
|
|
{
|
|
// TODO: remove me
|
|
}
|
|
|
|
void KMMainView::slotTimer()
|
|
{
|
|
kdDebug() << "KMMainView::slotTimer" << endl;
|
|
QPtrList<KMPrinter> *printerlist = m_manager->printerList();
|
|
bool ok = m_manager->errorMsg().isEmpty();
|
|
m_printerview->setPrinterList(printerlist);
|
|
if ( m_first )
|
|
{
|
|
if ( !ok )
|
|
showErrorMsg(i18n("An error occurred while retrieving the printer list."));
|
|
else
|
|
{
|
|
/* try to select the most appropriate printer:
|
|
* - soft default owner printer
|
|
* - hard default printer
|
|
* - first printer
|
|
*/
|
|
QPtrListIterator<KMPrinter> it( *printerlist );
|
|
KMPrinter *p1 = 0, *p2 = 0, *p3 = 0;
|
|
while ( it.current() )
|
|
{
|
|
if ( !it.current()->isVirtual() )
|
|
{
|
|
if ( it.current()->ownSoftDefault() )
|
|
{
|
|
p1 = it.current();
|
|
break;
|
|
}
|
|
else if ( it.current()->isHardDefault() )
|
|
p2 = it.current();
|
|
else if ( !p3 )
|
|
p3 = it.current();
|
|
}
|
|
++it;
|
|
}
|
|
if ( p1 || p2 || p3 )
|
|
m_printerview->setPrinter( p1 ? p1 : ( p2 ? p2 : p3 ) );
|
|
}
|
|
m_first = false;
|
|
}
|
|
}
|
|
|
|
void KMMainView::slotPrinterSelected(const QString& prname)
|
|
{
|
|
KMPrinter *p = KMManager::self()->findPrinter(prname);
|
|
m_current = p;
|
|
if (p && !p->isSpecial())
|
|
KMFactory::self()->manager()->completePrinter(p);
|
|
m_printerpages->setPrinter(p);
|
|
|
|
// update actions state (only if toolbar enabled, workaround for toolbar
|
|
// problem).
|
|
//if (m_toolbar->isEnabled())
|
|
//{
|
|
int mask = (m_manager->hasManagement() ? m_manager->printerOperationMask() : 0);
|
|
bool sp = !(p && p->isSpecial());
|
|
m_actions->action("printer_remove")->setEnabled(!sp || ((mask & KMManager::PrinterRemoval) && p && p->isLocal() && !p->isImplicit()));
|
|
m_actions->action("printer_configure")->setEnabled(!sp || ((mask & KMManager::PrinterConfigure) && p && !p->isClass(true) /*&& p->isLocal()*/));
|
|
m_actions->action("printer_hard_default")->setEnabled((sp && (mask & KMManager::PrinterDefault) && p && !p->isClass(true) && !p->isHardDefault() && p->isLocal()));
|
|
m_actions->action("printer_soft_default")->setEnabled((p && !p->isSoftDefault()));
|
|
m_actions->action("printer_test")->setEnabled((sp && (mask & KMManager::PrinterTesting) && p && !p->isClass(true)));
|
|
bool stmask = (sp && (mask & KMManager::PrinterEnabling) && p);
|
|
m_actions->action("printer_state_change")->setEnabled(stmask && p->isLocal());
|
|
m_actions->action("printer_spool_change")->setEnabled(stmask);
|
|
m_actions->action("printer_start")->setEnabled((stmask && p->state() == KMPrinter::Stopped));
|
|
m_actions->action("printer_stop")->setEnabled((stmask && p->state() != KMPrinter::Stopped));
|
|
m_actions->action("printer_enable")->setEnabled((stmask && !p->acceptJobs()));
|
|
m_actions->action("printer_disable")->setEnabled((stmask && p->acceptJobs()));
|
|
|
|
m_actions->action("printer_add")->setEnabled((mask & KMManager::PrinterCreation));
|
|
mask = m_manager->serverOperationMask();
|
|
m_actions->action("server_restart")->setEnabled((mask & KMManager::ServerRestarting));
|
|
m_actions->action("server_configure")->setEnabled((mask & KMManager::ServerConfigure));
|
|
|
|
KMFactory::self()->manager()->validatePluginActions(m_actions, p);
|
|
//}
|
|
m_actions->action("printer_tool")->setEnabled(p && !p->isClass(true) && !p->isRemote() && !p->isSpecial());
|
|
}
|
|
|
|
void KMMainView::setViewType(int ID)
|
|
{
|
|
((KSelectAction*)m_actions->action("view_change"))->setCurrentItem(ID);
|
|
slotChangeView(ID);
|
|
}
|
|
|
|
int KMMainView::viewType() const
|
|
{ return m_printerview->viewType(); }
|
|
|
|
void KMMainView::slotChangeView(int ID)
|
|
{
|
|
kdDebug() << "KMMainView::slotChangeView" << endl;
|
|
if (ID >= KMPrinterView::Icons && ID <= KMPrinterView::Tree)
|
|
m_printerview->setViewType((KMPrinterView::ViewType)ID);
|
|
}
|
|
|
|
void KMMainView::slotRightButtonClicked(const QString& prname, const QPoint& p)
|
|
{
|
|
KMPrinter *printer = KMManager::self()->findPrinter(prname);
|
|
// construct popup menu
|
|
m_pop->clear();
|
|
if (printer)
|
|
{
|
|
m_current = printer;
|
|
if (!printer->isSpecial())
|
|
{
|
|
if (printer->isLocal())
|
|
m_actions->action((printer->state() == KMPrinter::Stopped ? "printer_start" : "printer_stop"))->plug(m_pop);
|
|
m_actions->action((printer->acceptJobs() ? "printer_disable" : "printer_enable"))->plug(m_pop);
|
|
m_pop->insertSeparator();
|
|
}
|
|
if (!printer->isSoftDefault()) m_actions->action("printer_soft_default")->plug(m_pop);
|
|
if (printer->isLocal() && !printer->isImplicit())
|
|
{
|
|
if (!printer->isHardDefault()) m_actions->action("printer_hard_default")->plug(m_pop);
|
|
m_actions->action("printer_remove")->plug(m_pop);
|
|
m_pop->insertSeparator();
|
|
if (!printer->isClass(true))
|
|
{
|
|
m_actions->action("printer_configure")->plug(m_pop);
|
|
m_actions->action("printer_test")->plug(m_pop);
|
|
m_actions->action("printer_tool")->plug(m_pop);
|
|
m_pop->insertSeparator();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!printer->isClass(true))
|
|
{
|
|
m_actions->action("printer_configure")->plug(m_pop);
|
|
m_actions->action("printer_test")->plug(m_pop);
|
|
}
|
|
m_pop->insertSeparator();
|
|
}
|
|
if (!printer->isSpecial())
|
|
{
|
|
QValueList<KAction*> pactions = m_actions->actions("plugin");
|
|
for (QValueList<KAction*>::Iterator it=pactions.begin(); it!=pactions.end(); ++it)
|
|
(*it)->plug(m_pop);
|
|
if (pactions.count() > 0)
|
|
m_pop->insertSeparator();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_actions->action("printer_add")->plug(m_pop);
|
|
m_actions->action("printer_add_special")->plug(m_pop);
|
|
m_pop->insertSeparator();
|
|
m_actions->action("server_restart")->plug(m_pop);
|
|
m_actions->action("server_configure")->plug(m_pop);
|
|
m_pop->insertSeparator();
|
|
m_actions->action("manager_configure")->plug(m_pop);
|
|
m_actions->action("view_refresh")->plug(m_pop);
|
|
m_pop->insertSeparator();
|
|
}
|
|
m_actions->action("view_printerinfos")->plug(m_pop);
|
|
m_actions->action("view_change")->plug(m_pop);
|
|
m_actions->action("orientation_change")->plug(m_pop);
|
|
m_actions->action("view_toolbar")->plug(m_pop);
|
|
m_actions->action("view_menubar")->plug(m_pop);
|
|
m_pop->insertSeparator();
|
|
m_actions->action("view_pfilter")->plug(m_pop);
|
|
|
|
// pop the menu
|
|
m_pop->popup(p);
|
|
}
|
|
|
|
void KMMainView::slotChangePrinterState()
|
|
{
|
|
QString opname = sender()->name();
|
|
if (m_current && opname.startsWith("printer_"))
|
|
{
|
|
opname = opname.mid(8);
|
|
KMTimer::self()->hold();
|
|
bool result(false);
|
|
if (opname == "enable")
|
|
result = m_manager->enablePrinter(m_current, true);
|
|
else if (opname == "disable")
|
|
result = m_manager->enablePrinter(m_current, false);
|
|
else if (opname == "start")
|
|
result = m_manager->startPrinter(m_current, true);
|
|
else if (opname == "stop")
|
|
result = m_manager->startPrinter(m_current, false);
|
|
if (!result)
|
|
showErrorMsg(i18n("Unable to modify the state of printer %1.").arg(m_current->printerName()));
|
|
KMTimer::self()->release(result);
|
|
}
|
|
}
|
|
|
|
void KMMainView::slotRemove()
|
|
{
|
|
if (m_current)
|
|
{
|
|
KMTimer::self()->hold();
|
|
bool result(false);
|
|
if (KMessageBox::warningYesNo(this,i18n("Do you really want to remove %1?").arg(m_current->printerName())) == KMessageBox::Yes)
|
|
if (m_current->isSpecial())
|
|
{
|
|
if (!(result=m_manager->removeSpecialPrinter(m_current)))
|
|
showErrorMsg(i18n("Unable to remove special printer %1.").arg(m_current->printerName()));
|
|
}
|
|
else if (!(result=m_manager->removePrinter(m_current)))
|
|
showErrorMsg(i18n("Unable to remove printer %1.").arg(m_current->printerName()));
|
|
KMTimer::self()->release(result);
|
|
}
|
|
}
|
|
|
|
void KMMainView::slotConfigure()
|
|
{
|
|
if (m_current)
|
|
{
|
|
KMTimer::self()->hold();
|
|
bool needRefresh(false);
|
|
if (m_current->isSpecial())
|
|
{
|
|
KMSpecialPrinterDlg dlg(this);
|
|
dlg.setPrinter(m_current);
|
|
if (dlg.exec())
|
|
{
|
|
KMPrinter *prt = dlg.printer();
|
|
if (prt->name() != m_current->name())
|
|
m_manager->removeSpecialPrinter(m_current);
|
|
m_manager->createSpecialPrinter(prt);
|
|
needRefresh = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DrMain *driver = m_manager->loadPrinterDriver(m_current, true);
|
|
if (driver)
|
|
{
|
|
KMDriverDialog dlg(this);
|
|
dlg.setCaption(i18n("Configure %1").arg(m_current->printerName()));
|
|
dlg.setDriver(driver);
|
|
// disable OK button for remote printer (read-only dialog)
|
|
if (m_current->isRemote())
|
|
dlg.enableButtonOK(false);
|
|
if (dlg.exec())
|
|
if (!m_manager->savePrinterDriver(m_current,driver))
|
|
showErrorMsg(i18n("Unable to modify settings of printer %1.").arg(m_current->printerName()));
|
|
delete driver;
|
|
}
|
|
else
|
|
showErrorMsg(i18n("Unable to load a valid driver for printer %1.").arg(m_current->printerName()));
|
|
}
|
|
KMTimer::self()->release(needRefresh);
|
|
}
|
|
}
|
|
|
|
void KMMainView::slotAdd()
|
|
{
|
|
KMTimer::self()->hold();
|
|
|
|
int result(0);
|
|
if ((result=kdeprint_management_add_printer_wizard(this)) == -1)
|
|
showErrorMsg(i18n("Unable to create printer."));
|
|
|
|
KMTimer::self()->release((result == 1));
|
|
}
|
|
|
|
void KMMainView::slotHardDefault()
|
|
{
|
|
if (m_current)
|
|
{
|
|
KMTimer::self()->hold();
|
|
bool result = m_manager->setDefaultPrinter(m_current);
|
|
if (!result)
|
|
showErrorMsg(i18n("Unable to define printer %1 as default.").arg(m_current->printerName()));
|
|
KMTimer::self()->release(result);
|
|
}
|
|
}
|
|
|
|
void KMMainView::slotSoftDefault()
|
|
{
|
|
if (m_current)
|
|
{
|
|
KMTimer::self()->hold();
|
|
KMFactory::self()->virtualManager()->setAsDefault(m_current,QString::null);
|
|
KMTimer::self()->release(true);
|
|
}
|
|
}
|
|
|
|
void KMMainView::setOrientation(int o)
|
|
{
|
|
int ID = (o == Qt::Horizontal ? 1 : 0);
|
|
((KSelectAction*)m_actions->action("orientation_change"))->setCurrentItem(ID);
|
|
slotChangeDirection(ID);
|
|
}
|
|
|
|
int KMMainView::orientation() const
|
|
{ return (m_boxlayout->direction() == QBoxLayout::LeftToRight ? Qt::Horizontal : Qt::Vertical); }
|
|
|
|
void KMMainView::slotChangeDirection(int d)
|
|
{
|
|
m_boxlayout->setDirection(d == 1 ? QBoxLayout::LeftToRight : QBoxLayout::TopToBottom);
|
|
}
|
|
|
|
void KMMainView::slotTest()
|
|
{
|
|
if (m_current)
|
|
{
|
|
KMTimer::self()->hold();
|
|
if (KMessageBox::warningContinueCancel(this, i18n("You are about to print a test page on %1. Do you want to continue?").arg(m_current->printerName()), QString::null, i18n("Print Test Page"), "printTestPage") == KMessageBox::Continue)
|
|
{
|
|
if (KMFactory::self()->manager()->testPrinter(m_current))
|
|
KMessageBox::information(this,i18n("Test page successfully sent to printer %1.").arg(m_current->printerName()));
|
|
else
|
|
showErrorMsg(i18n("Unable to test printer %1.").arg(m_current->printerName()));
|
|
}
|
|
KMTimer::self()->release(true);
|
|
}
|
|
}
|
|
|
|
void KMMainView::showErrorMsg(const QString& msg, bool usemgr)
|
|
{
|
|
QString s(msg);
|
|
if (usemgr)
|
|
{
|
|
s.prepend("<p>");
|
|
s.append(" ");
|
|
s += i18n("Error message received from manager:</p><p>%1</p>");
|
|
if (m_manager->errorMsg().isEmpty())
|
|
s = s.arg(i18n("Internal error (no error message)."));
|
|
else
|
|
s = s.arg(m_manager->errorMsg());
|
|
// clean up error message
|
|
m_manager->setErrorMsg(QString::null);
|
|
}
|
|
s.prepend("<qt>").append("</qt>");
|
|
KMTimer::self()->hold();
|
|
KMessageBox::error(this,s);
|
|
KMTimer::self()->release();
|
|
}
|
|
|
|
void KMMainView::slotServerRestart()
|
|
{
|
|
KMTimer::self()->hold();
|
|
bool result = m_manager->restartServer();
|
|
if (!result)
|
|
{
|
|
showErrorMsg(i18n("Unable to restart print server."));
|
|
KMTimer::self()->release( false );
|
|
}
|
|
else
|
|
{
|
|
reset( i18n( "Restarting server..." ), false, false );
|
|
}
|
|
}
|
|
|
|
void KMMainView::slotServerConfigure()
|
|
{
|
|
KMTimer::self()->hold();
|
|
bool result = m_manager->configureServer(this);
|
|
if (!result)
|
|
{
|
|
showErrorMsg(i18n("Unable to configure print server."));
|
|
KMTimer::self()->release( false );
|
|
}
|
|
else
|
|
{
|
|
reset( i18n( "Configuring server..." ), false, false );
|
|
}
|
|
}
|
|
|
|
void KMMainView::slotServerConfigureAccess()
|
|
{
|
|
KProcess *proc = new KProcess;
|
|
*proc << "/usr/bin/system-config-printer-kde";
|
|
proc->start(KProcess::DontCare);
|
|
}
|
|
|
|
void KMMainView::slotToggleToolBar(bool on)
|
|
{
|
|
if (on) m_toolbar->show();
|
|
else m_toolbar->hide();
|
|
}
|
|
|
|
void KMMainView::slotToggleMenuBar( bool on )
|
|
{
|
|
if ( on )
|
|
m_menubar->show();
|
|
else
|
|
m_menubar->hide();
|
|
}
|
|
|
|
void KMMainView::slotManagerConfigure()
|
|
{
|
|
KMTimer::self()->hold();
|
|
KMConfigDialog dlg(this,"ConfigDialog");
|
|
if ( dlg.exec() )
|
|
{
|
|
loadParameters();
|
|
}
|
|
/* when "OK":
|
|
* => the config file is saved
|
|
* => triggering a DCOP signal
|
|
* => configChanged() called
|
|
* hence no need to refresh, just release the timer
|
|
*/
|
|
KMTimer::self()->release( false );
|
|
}
|
|
|
|
void KMMainView::slotAddSpecial()
|
|
{
|
|
KMTimer::self()->hold();
|
|
KMSpecialPrinterDlg dlg(this);
|
|
if (dlg.exec())
|
|
{
|
|
KMPrinter *prt = dlg.printer();
|
|
m_manager->createSpecialPrinter(prt);
|
|
}
|
|
KMTimer::self()->release(true);
|
|
}
|
|
|
|
void KMMainView::slotShowPrinterInfos(bool on)
|
|
{
|
|
if (on)
|
|
m_printerpages->show();
|
|
else
|
|
m_printerpages->hide();
|
|
m_actions->action("orientation_change")->setEnabled(on);
|
|
}
|
|
|
|
void KMMainView::enableToolbar(bool on)
|
|
{
|
|
KToggleAction *act = (KToggleAction*)m_actions->action("view_toolbar");
|
|
m_toolbar->setEnabled(on);
|
|
act->setEnabled(on);
|
|
if (on && act->isChecked())
|
|
m_toolbar->show();
|
|
else
|
|
m_toolbar->hide();
|
|
}
|
|
|
|
KAction* KMMainView::action(const char *name)
|
|
{
|
|
return m_actions->action(name);
|
|
}
|
|
|
|
/*
|
|
void KMMainView::aboutToReload()
|
|
{
|
|
m_printerview->setPrinterList(0);
|
|
}
|
|
*/
|
|
|
|
void KMMainView::reload()
|
|
{
|
|
removePluginActions();
|
|
loadPluginActions();
|
|
|
|
// redo the connection as the old manager object has been removed
|
|
connect( m_manager, SIGNAL( updatePossible( bool ) ), SLOT( slotUpdatePossible( bool ) ) );
|
|
|
|
// We must delay the refresh such that all objects has been
|
|
// correctly reloaded (otherwise, crash in KMJobViewer).
|
|
reset( i18n( "Initializing manager..." ), true, true );
|
|
}
|
|
|
|
void KMMainView::showPrinterInfos(bool on)
|
|
{
|
|
static_cast<KToggleAction*>(m_actions->action("view_printerinfos"))->setChecked(on);
|
|
slotShowPrinterInfos(on);
|
|
}
|
|
|
|
bool KMMainView::printerInfosShown() const
|
|
{
|
|
return (static_cast<KToggleAction*>(m_actions->action("view_printerinfos"))->isChecked());
|
|
}
|
|
|
|
void KMMainView::loadPluginActions()
|
|
{
|
|
KMFactory::self()->manager()->createPluginActions(m_actions);
|
|
QValueList<KAction*> pactions = m_actions->actions("plugin");
|
|
int index = m_pactionsindex;
|
|
//QPopupMenu *menu = m_menubar->findItem( m_menubar->idAt( 1 ) )->popup();
|
|
QPopupMenu *menu = m_menubar->getButton( 1 )->popup();
|
|
for (QValueList<KAction*>::Iterator it=pactions.begin(); it!=pactions.end(); ++it)
|
|
{
|
|
(*it)->plug(m_toolbar, index++);
|
|
( *it )->plug( menu );
|
|
}
|
|
}
|
|
|
|
void KMMainView::removePluginActions()
|
|
{
|
|
QValueList<KAction*> pactions = m_actions->actions("plugin");
|
|
for (QValueList<KAction*>::Iterator it=pactions.begin(); it!=pactions.end(); ++it)
|
|
{
|
|
(*it)->unplugAll();
|
|
delete (*it);
|
|
}
|
|
}
|
|
|
|
void KMMainView::slotToolSelected(int ID)
|
|
{
|
|
KMTimer::self()->hold();
|
|
|
|
QString libname = m_toollist[ID];
|
|
libname.prepend("kdeprint_tool_");
|
|
if (m_current && !m_current->device().isEmpty() && !libname.isEmpty())
|
|
{
|
|
KLibFactory *factory = KLibLoader::self()->factory(libname.local8Bit());
|
|
if (factory)
|
|
{
|
|
QStringList args;
|
|
args << m_current->device() << m_current->printerName();
|
|
KDialogBase *dlg = static_cast<KDialogBase*>(factory->create(this, "Tool", 0, args));
|
|
if (dlg)
|
|
dlg->exec();
|
|
delete dlg;
|
|
}
|
|
}
|
|
else
|
|
KMessageBox::error(this,
|
|
i18n("Unable to start printer tool. Possible reasons are: "
|
|
"no printer selected, the selected printer doesn't have "
|
|
"any local device defined (printer port), or the tool library "
|
|
"could not be found."));
|
|
|
|
KMTimer::self()->release();
|
|
}
|
|
|
|
void KMMainView::slotToggleFilter(bool on)
|
|
{
|
|
KMTimer::self()->hold();
|
|
KMManager::self()->enableFilter(on);
|
|
KMTimer::self()->release(true);
|
|
}
|
|
|
|
void KMMainView::configChanged()
|
|
{
|
|
reset( i18n( "Initializing manager..." ), false, true );
|
|
}
|
|
|
|
void KMMainView::slotUpdatePossible( bool flag )
|
|
{
|
|
destroyMessageWindow();
|
|
if ( !flag )
|
|
showErrorMsg( i18n( "Unable to retrieve the printer list." ) );
|
|
KMTimer::self()->release( true );
|
|
}
|
|
|
|
void KMMainView::createMessageWindow( const QString& txt, int delay )
|
|
{
|
|
destroyMessageWindow();
|
|
MessageWindow::add( m_printerview, txt, delay );
|
|
}
|
|
|
|
void KMMainView::destroyMessageWindow()
|
|
{
|
|
MessageWindow::remove( m_printerview );
|
|
}
|
|
|
|
void KMMainView::slotInit()
|
|
{
|
|
reset( i18n( "Initializing manager..." ), true, true );
|
|
}
|
|
|
|
void KMMainView::reset( const QString& msg, bool useDelay, bool holdTimer )
|
|
{
|
|
if ( holdTimer )
|
|
KMTimer::self()->hold();
|
|
m_printerview->setPrinterList( 0 );
|
|
if ( !msg.isEmpty() )
|
|
createMessageWindow( msg, ( useDelay ? 500 : 0 ) );
|
|
m_first = true;
|
|
m_manager->checkUpdatePossible();
|
|
}
|
|
|
|
void KMMainView::slotHelp()
|
|
{
|
|
QString s = sender()->name();
|
|
if ( s == "invoke_help" )
|
|
kapp->invokeHelp( QString::null, "kdeprint" );
|
|
else if ( s == "invoke_web" )
|
|
{
|
|
QStringList args;
|
|
args << "exec" << "http://printing.kde.org";
|
|
kapp->kdeinitExec( "kfmclient", args );
|
|
}
|
|
else
|
|
kdDebug( 500 ) << "Unknown help invokator: " << s << endl;
|
|
}
|
|
|
|
#include "kmmainview.moc"
|