summaryrefslogtreecommitdiffstats
path: root/svtools/source/dialogs/prnsetup.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svtools/source/dialogs/prnsetup.cxx')
-rw-r--r--svtools/source/dialogs/prnsetup.cxx351
1 files changed, 351 insertions, 0 deletions
diff --git a/svtools/source/dialogs/prnsetup.cxx b/svtools/source/dialogs/prnsetup.cxx
new file mode 100644
index 000000000..60dba4348
--- /dev/null
+++ b/svtools/source/dialogs/prnsetup.cxx
@@ -0,0 +1,351 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <sal/config.h>
+
+#include <string_view>
+
+#include <svtools/prnsetup.hxx>
+#include <svtools/strings.hrc>
+#include <svtools/svtresid.hxx>
+#include <vcl/QueueInfo.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/print.hxx>
+#include <vcl/event.hxx>
+#include <sal/log.hxx>
+
+void ImplFillPrnDlgListBox( const Printer* pPrinter,
+ weld::ComboBox* pBox, weld::Button* pPropBtn )
+{
+ ImplFreePrnDlgListBox( pBox );
+
+ const std::vector<OUString>& rPrinters = Printer::GetPrinterQueues();
+ unsigned int nCount = rPrinters.size();
+ if ( nCount )
+ {
+ for( unsigned int i = 0; i < nCount; i++ )
+ pBox->append_text( rPrinters[i] );
+ pBox->set_active_text(pPrinter->GetName());
+ }
+
+ pBox->set_sensitive(nCount != 0);
+ pPropBtn->set_visible( pPrinter->HasSupport( PrinterSupport::SetupDialog ) );
+}
+
+
+void ImplFreePrnDlgListBox( weld::ComboBox* pBox, bool bClear )
+{
+ if ( bClear )
+ pBox->clear();
+}
+
+
+Printer* ImplPrnDlgListBoxSelect( const weld::ComboBox* pBox, weld::Button* pPropBtn,
+ Printer const * pPrinter, Printer* pTempPrinterIn )
+{
+ VclPtr<Printer> pTempPrinter( pTempPrinterIn );
+ if ( pBox->get_active() != -1 )
+ {
+ const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->get_active_text(), true );
+ if( pInfo)
+ {
+ if ( !pTempPrinter )
+ {
+ if ( (pPrinter->GetName() == pInfo->GetPrinterName()) &&
+ (pPrinter->GetDriverName() == pInfo->GetDriver()) )
+ pTempPrinter = VclPtr<Printer>::Create( pPrinter->GetJobSetup() );
+ else
+ pTempPrinter = VclPtr<Printer>::Create( *pInfo );
+ }
+ else
+ {
+ if ( (pTempPrinter->GetName() != pInfo->GetPrinterName()) ||
+ (pTempPrinter->GetDriverName() != pInfo->GetDriver()) )
+ {
+ pTempPrinter.disposeAndClear();
+ pTempPrinter = VclPtr<Printer>::Create( *pInfo );
+ }
+ }
+
+ pPropBtn->set_sensitive(pTempPrinter->HasSupport(PrinterSupport::SetupDialog));
+ }
+ else
+ pPropBtn->set_sensitive(false);
+ }
+ else
+ pPropBtn->set_sensitive(false);
+
+ return pTempPrinter;
+}
+
+
+Printer* ImplPrnDlgUpdatePrinter( Printer const * pPrinter, Printer* pTempPrinterIn )
+{
+ VclPtr<Printer> pTempPrinter( pTempPrinterIn );
+ OUString aPrnName;
+ if ( pTempPrinter )
+ aPrnName = pTempPrinter->GetName();
+ else
+ aPrnName = pPrinter->GetName();
+
+ if ( ! Printer::GetQueueInfo( aPrnName, false ) )
+ {
+ pTempPrinter.disposeAndClear();
+ pTempPrinter = VclPtr<Printer>::Create();
+ }
+
+ return pTempPrinter;
+}
+
+
+void ImplPrnDlgUpdateQueueInfo( const weld::ComboBox* pBox, QueueInfo& rInfo )
+{
+ if ( pBox->get_active() != -1 )
+ {
+ const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->get_active_text(), true );
+ if( pInfo )
+ rInfo = *pInfo;
+ }
+}
+
+
+static OUString ImplPrnDlgAddString(const OUString& rStr, std::u16string_view rAddStr)
+{
+ OUString aStr(rStr);
+ if (!aStr.isEmpty())
+ aStr += "; " ;
+ return aStr + rAddStr;
+}
+
+
+static OUString ImplPrnDlgAddResString(const OUString& rStr, TranslateId pResId)
+{
+ return ImplPrnDlgAddString(rStr, SvtResId(pResId));
+}
+
+
+OUString ImplPrnDlgGetStatusText( const QueueInfo& rInfo )
+{
+ OUString aStr;
+ PrintQueueFlags nStatus = rInfo.GetStatus();
+
+ // Default-Printer
+ if ( !rInfo.GetPrinterName().isEmpty() &&
+ (rInfo.GetPrinterName() == Printer::GetDefaultPrinterName()) )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_DEFPRINTER );
+
+ // Status
+ if ( nStatus & PrintQueueFlags::Ready )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_READY );
+ if ( nStatus & PrintQueueFlags::Paused )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAUSED );
+ if ( nStatus & PrintQueueFlags::PendingDeletion )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PENDING );
+ if ( nStatus & PrintQueueFlags::Busy )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_BUSY );
+ if ( nStatus & PrintQueueFlags::Initializing )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_INITIALIZING );
+ if ( nStatus & PrintQueueFlags::Waiting )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_WAITING );
+ if ( nStatus & PrintQueueFlags::WarmingUp )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_WARMING_UP );
+ if ( nStatus & PrintQueueFlags::Processing )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PROCESSING );
+ if ( nStatus & PrintQueueFlags::Printing )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PRINTING );
+ if ( nStatus & PrintQueueFlags::Offline )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OFFLINE );
+ if ( nStatus & PrintQueueFlags::Error )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_ERROR );
+ if ( nStatus & PrintQueueFlags::StatusUnknown )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_SERVER_UNKNOWN );
+ if ( nStatus & PrintQueueFlags::PaperJam )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_JAM );
+ if ( nStatus & PrintQueueFlags::PaperOut )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_OUT );
+ if ( nStatus & PrintQueueFlags::ManualFeed )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_MANUAL_FEED );
+ if ( nStatus & PrintQueueFlags::PaperProblem )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_PROBLEM );
+ if ( nStatus & PrintQueueFlags::IOActive )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_IO_ACTIVE );
+ if ( nStatus & PrintQueueFlags::OutputBinFull )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OUTPUT_BIN_FULL );
+ if ( nStatus & PrintQueueFlags::TonerLow )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_TONER_LOW );
+ if ( nStatus & PrintQueueFlags::NoToner )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_NO_TONER );
+ if ( nStatus & PrintQueueFlags::PagePunt )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAGE_PUNT );
+ if ( nStatus & PrintQueueFlags::UserIntervention )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_USER_INTERVENTION );
+ if ( nStatus & PrintQueueFlags::OutOfMemory )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OUT_OF_MEMORY );
+ if ( nStatus & PrintQueueFlags::DoorOpen )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_DOOR_OPEN );
+ if ( nStatus & PrintQueueFlags::PowerSave )
+ aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_POWER_SAVE );
+
+ // Number of jobs
+ sal_uInt32 nJobs = rInfo.GetJobs();
+ if ( nJobs && (nJobs != QUEUE_JOBS_DONTKNOW) )
+ {
+ OUString aJobStr( SvtResId( STR_SVT_PRNDLG_JOBCOUNT ) );
+ OUString aJobs( OUString::number( nJobs ) );
+ aStr = ImplPrnDlgAddString(aStr, aJobStr.replaceAll("%d", aJobs));
+ }
+
+ return aStr;
+}
+
+PrinterSetupDialog::PrinterSetupDialog(weld::Window* pParent)
+ : GenericDialogController(pParent, "svt/ui/printersetupdialog.ui", "PrinterSetupDialog")
+ , m_xLbName(m_xBuilder->weld_combo_box("name"))
+ , m_xBtnProperties(m_xBuilder->weld_button("properties"))
+ , m_xBtnOptions(m_xBuilder->weld_button("options"))
+ , m_xFiStatus(m_xBuilder->weld_label("status"))
+ , m_xFiType(m_xBuilder->weld_label("type"))
+ , m_xFiLocation(m_xBuilder->weld_label("location"))
+ , m_xFiComment(m_xBuilder->weld_label("comment"))
+ , maStatusTimer("PrinterSetupDialog maStatusTimer")
+{
+ m_xLbName->make_sorted();
+
+ // show options button only if link is set
+ m_xBtnOptions->hide();
+
+ mpPrinter = nullptr;
+ mpTempPrinter = nullptr;
+
+ maStatusTimer.SetTimeout( IMPL_PRINTDLG_STATUS_UPDATE );
+ maStatusTimer.SetInvokeHandler( LINK( this, PrinterSetupDialog, ImplStatusHdl ) );
+ m_xBtnProperties->connect_clicked( LINK( this, PrinterSetupDialog, ImplPropertiesHdl ) );
+ m_xLbName->connect_changed( LINK( this, PrinterSetupDialog, ImplChangePrinterHdl ) );
+ m_xDialog->connect_focus_in( LINK( this, PrinterSetupDialog, ImplGetFocusHdl ) );
+ Application::AddEventListener(LINK( this, PrinterSetupDialog, ImplDataChangedHdl ) );
+}
+
+PrinterSetupDialog::~PrinterSetupDialog()
+{
+ Application::RemoveEventListener(LINK( this, PrinterSetupDialog, ImplDataChangedHdl ) );
+ ImplFreePrnDlgListBox(m_xLbName.get(), false);
+}
+
+void PrinterSetupDialog::SetOptionsHdl(const Link<weld::Button&, void>& rLink)
+{
+ m_xBtnOptions->connect_clicked(rLink);
+ m_xBtnOptions->set_accessible_description(SvtResId(STR_A11Y_DESC_OPTIONS));
+ m_xBtnOptions->set_visible(rLink.IsSet());
+}
+
+void PrinterSetupDialog::ImplSetInfo()
+{
+ const QueueInfo* pInfo = Printer::GetQueueInfo(m_xLbName->get_active_text(), true);
+ if ( pInfo )
+ {
+ m_xFiType->set_label( pInfo->GetDriver() );
+ m_xFiLocation->set_label( pInfo->GetLocation() );
+ m_xFiComment->set_label( pInfo->GetComment() );
+ m_xFiStatus->set_label( ImplPrnDlgGetStatusText( *pInfo ) );
+ }
+ else
+ {
+ const OUString aTempStr;
+ m_xFiType->set_label( aTempStr );
+ m_xFiLocation->set_label( aTempStr );
+ m_xFiComment->set_label( aTempStr );
+ m_xFiStatus->set_label( aTempStr );
+ }
+}
+
+IMPL_LINK_NOARG(PrinterSetupDialog, ImplStatusHdl, Timer *, void)
+{
+ QueueInfo aInfo;
+ ImplPrnDlgUpdateQueueInfo(m_xLbName.get(), aInfo);
+ m_xFiStatus->set_label( ImplPrnDlgGetStatusText( aInfo ) );
+}
+
+
+IMPL_LINK_NOARG(PrinterSetupDialog, ImplPropertiesHdl, weld::Button&, void)
+{
+ if ( !mpTempPrinter )
+ mpTempPrinter = VclPtr<Printer>::Create( mpPrinter->GetJobSetup() );
+ mpTempPrinter->Setup(m_xDialog.get());
+}
+
+IMPL_LINK_NOARG(PrinterSetupDialog, ImplChangePrinterHdl, weld::ComboBox&, void)
+{
+ mpTempPrinter = ImplPrnDlgListBoxSelect(m_xLbName.get(), m_xBtnProperties.get(),
+ mpPrinter, mpTempPrinter);
+ ImplSetInfo();
+}
+
+IMPL_LINK(PrinterSetupDialog, ImplGetFocusHdl, weld::Widget&, rWidget, void)
+{
+ if (rWidget.is_visible())
+ ImplStatusHdl(&maStatusTimer);
+}
+
+IMPL_LINK(PrinterSetupDialog, ImplDataChangedHdl, VclSimpleEvent&, rEvt, void)
+{
+ VclEventId nEvent = rEvt.GetId();
+ if (nEvent != VclEventId::ApplicationDataChanged)
+ return;
+
+ DataChangedEvent* pData = static_cast<DataChangedEvent*>(static_cast<VclWindowEvent&>(rEvt).GetData());
+ if (!pData || pData->GetType() != DataChangedEventType::PRINTER)
+ return;
+
+ mpTempPrinter = ImplPrnDlgUpdatePrinter(mpPrinter, mpTempPrinter);
+ Printer* pPrn;
+ if (mpTempPrinter)
+ pPrn = mpTempPrinter;
+ else
+ pPrn = mpPrinter;
+ ImplFillPrnDlgListBox(pPrn, m_xLbName.get(), m_xBtnProperties.get());
+ ImplSetInfo();
+}
+
+short PrinterSetupDialog::run()
+{
+ if ( !mpPrinter || mpPrinter->IsPrinting() || mpPrinter->IsJobActive() )
+ {
+ SAL_WARN( "svtools.dialogs", "PrinterSetupDialog::execute() - No Printer or printer is printing" );
+ return RET_CANCEL;
+ }
+
+ Printer::updatePrinters();
+
+ ImplFillPrnDlgListBox(mpPrinter, m_xLbName.get(), m_xBtnProperties.get());
+ ImplSetInfo();
+ maStatusTimer.Start();
+
+ // start dialog
+ short nRet = GenericDialogController::run();
+
+ // update data if the dialog was terminated with OK
+ if ( nRet == RET_OK && mpTempPrinter )
+ mpPrinter->SetPrinterProps( mpTempPrinter );
+
+ maStatusTimer.Stop();
+
+ return nRet;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */