1
0
Fork 0
libreoffice/svtools/source/dialogs/prnsetup.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

351 lines
12 KiB
C++

/* -*- 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, u"svt/ui/printersetupdialog.ui"_ustr, u"PrinterSetupDialog"_ustr)
, m_xLbName(m_xBuilder->weld_combo_box(u"name"_ustr))
, m_xBtnProperties(m_xBuilder->weld_button(u"properties"_ustr))
, m_xBtnOptions(m_xBuilder->weld_button(u"options"_ustr))
, m_xFiStatus(m_xBuilder->weld_label(u"status"_ustr))
, m_xFiType(m_xBuilder->weld_label(u"type"_ustr))
, m_xFiLocation(m_xBuilder->weld_label(u"location"_ustr))
, m_xFiComment(m_xBuilder->weld_label(u"comment"_ustr))
, 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: */