3cca2c6053
The original problem was that %PRODUCTNAME wasn't replaced for accessibility descriptions (which are reused for extended tips) under gtk. Universally querying all a11y descs on load to potentially replace %PRODUCTNAME in a11y descs at runtime led to tdf146971 which was a huge startup slowdown. The half way 7.3 fix was to leave a11y descs alone, but do the replacement when querying for the extended tip case. So the extended tooltips were ok, but screen readers would still say a raw "%PRODUCTNAME" text, hence the rewording effort to remove %PRODUCTNAME from the a11y descs entirely for 7.4. But there is now a few cases where some options paths exists in the a11y descs which is not exactly correct wrt to the text shown in the options dialog. Reworking the options dialog to not have %PRODUCTNAME there at all and updating everything to fit that sort of change would not be popular. So move the cases where a11y descs really should have %PRODUCTNAME in them out of the .ui files and into .hrc files and use specific set_accessibility_description calls for them via ResID which will do the %PRODUCTNAME replacement automatically. Hopefully the a11y runtime cost for just this handful of cases is negligible in the overall scheme of things. Change-Id: Ieb17d26fd581cd5804a52b371b3bb5ea43023aa3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135432 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
351 lines
12 KiB
C++
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, "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: */
|