Hello, Here is some patchs : 0001 : one line, code simplification. 0002 : explicite NULL or 0 comparison in if. I don't know if LibreOffice have a coding standard about that type of comparison ? 0003 : some rewriting of SfxViewShell::ExecPrint_Impl ; add some comments, prevent a segfault (NULL pointer dereferencing ; add return after "rReq.SetReturnValue(SfxBoolItem(0,sal_False))")… 0004 : Prevent the printer settings dialog to show help button when it's called from a help window. Regards. -- Maxime de Roucy Groupe LINAGORA - OSSA 80 rue Roque de Fillol 92800 PUTEAUX Tel. : 0033(0)642004909
From 858e796808271d8280aece653704261839042922 Mon Sep 17 00:00:00 2001
From: Maxime de Roucy <mderoucy@linagora.com>
Date: Wed, 30 May 2012 10:45:02 +0200
Subject: [PATCH 1/4] Change unnecessary pointer dereference
Change-Id: I28404d9d1a18886361deae1aec583ef40c25ce85
---
sw/source/ui/uno/SwXDocumentSettings.cxx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sw/source/ui/uno/SwXDocumentSettings.cxx b/sw/source/ui/uno/SwXDocumentSettings.cxx
index d988bf5..ff56b00 100644
--- a/sw/source/ui/uno/SwXDocumentSettings.cxx
+++ b/sw/source/ui/uno/SwXDocumentSettings.cxx
@@ -839,7 +839,7 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
break;
case HANDLE_PRINTER_SETUP:
{
- SfxPrinter *pPrinter = mpDocSh->GetDoc()->getPrinter( sal_False );
+ SfxPrinter *pPrinter = mpDoc->getPrinter( sal_False );
if (pPrinter)
{
SvMemoryStream aStream;
--
1.7.11
From 1ec537b448324972cdb59fcbea67e3b165228116 Mon Sep 17 00:00:00 2001
From: Maxime de Roucy <mderoucy@linagora.com>
Date: Wed, 30 May 2012 10:57:09 +0200
Subject: [PATCH 2/4] Explicit if statement
Change-Id: I80fb875cab4e15f0eeab1739804b7530d4e26198
---
sw/source/ui/uno/SwXDocumentSettings.cxx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/sw/source/ui/uno/SwXDocumentSettings.cxx b/sw/source/ui/uno/SwXDocumentSettings.cxx
index ff56b00..49a6791 100644
--- a/sw/source/ui/uno/SwXDocumentSettings.cxx
+++ b/sw/source/ui/uno/SwXDocumentSettings.cxx
@@ -433,7 +433,7 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
sal_Bool bIsKern = *(sal_Bool*)(rValue).getValue();
mpDoc->set(IDocumentSettingAccess::KERN_ASIAN_PUNCTUATION, bIsKern);
SwEditShell* pEditSh = mpDoc->GetEditShell();
- if(pEditSh)
+ if(pEditSh != NULL)
pEditSh->ChgHyphenation();
}
break;
@@ -589,7 +589,7 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
if(rValue >>= aNew)
{
mpDoc->SetRedlinePassword(aNew);
- if(aNew.getLength())
+ if(aNew.getLength() != 0)
{
sal_uInt16 eMode = mpDoc->GetRedlineMode();
eMode = eMode|nsRedlineMode_t::REDLINE_ON;
@@ -840,7 +840,7 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
case HANDLE_PRINTER_SETUP:
{
SfxPrinter *pPrinter = mpDoc->getPrinter( sal_False );
- if (pPrinter)
+ if (pPrinter != NULL)
{
SvMemoryStream aStream;
pPrinter->Store( aStream );
--
1.7.11
From 9dfe6c37bc57fbad5ec0ab00f2fcdba8e55b6b75 Mon Sep 17 00:00:00 2001
From: Maxime de Roucy <mderoucy@linagora.com>
Date: Fri, 15 Jun 2012 17:19:41 +0200
Subject: [PATCH 3/4] Some rewriting in SfxViewShell::ExecPrint_Impl
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* add comments
* reorganise if statement
* use of the IsAPI function
* prevent segfault (NULL pointer dereferencing)
Change-Id: Icbdac93e5250346bd5b4c465d00740b5fb51e8ac
---
sfx2/source/view/viewprn.cxx | 89 ++++++++++++++++++++++----------------------
1 file changed, 44 insertions(+), 45 deletions(-)
diff --git a/sfx2/source/view/viewprn.cxx b/sfx2/source/view/viewprn.cxx
index a8c19a2..20e2ac7 100644
--- a/sfx2/source/view/viewprn.cxx
+++ b/sfx2/source/view/viewprn.cxx
@@ -137,7 +137,7 @@ SfxPrinterController::SfxPrinterController( const boost::shared_ptr<Printer>& i_
// initialize extra ui options
if( mxRenderable.is() )
{
- for (sal_Int32 nProp=0; nProp<rProps.getLength(); nProp++)
+ for (sal_Int32 nProp=0; nProp < rProps.getLength(); nProp++)
setValue( rProps[nProp].Name, rProps[nProp].Value );
Sequence< beans::PropertyValue > aRenderOptions( 3 );
@@ -654,15 +654,21 @@ Printer* SfxViewShell::GetActivePrinter() const
void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
{
- sal_uInt16 nDialogRet = RET_CANCEL;
+ sal_uInt16 nDialogRet = RET_CANCEL;
SfxPrinter* pPrinter = 0;
SfxDialogExecutor_Impl* pExecutor = 0;
bool bSilent = false;
- sal_Bool bIsAPI = rReq.GetArgs() && rReq.GetArgs()->Count();
+
+ // does the function have been called by the user interface or by an API call
+ sal_Bool bIsAPI = rReq.IsAPI();
if ( bIsAPI )
{
+ // the function have been called by the API
+
+ // Should it be visible on the user interface,
+ // should it launch popup dialogue ?
SFX_REQUEST_ARG(rReq, pSilentItem, SfxBoolItem, SID_SILENT, sal_False);
- bSilent = pSilentItem && pSilentItem->GetValue();
+ bSilent = ( pSilentItem != NULL && pSilentItem->GetValue() );
}
//FIXME: how to transport "bPrintOnHelp"?
@@ -678,27 +684,20 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
const sal_uInt16 nId = rReq.GetSlot();
switch( nId )
{
- // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- case SID_PRINTDOC:
- case SID_PRINTDOCDIRECT:
+ case SID_PRINTDOC: // display the printer selection and properties dialogue : File > Print…
+ case SID_PRINTDOCDIRECT: // Print the document directly, without displaying the dialogue
{
SfxObjectShell* pDoc = GetObjectShell();
// derived class may decide to abort this
- if( !pDoc->QuerySlotExecutable( nId ) )
+ if( pDoc == NULL || !pDoc->QuerySlotExecutable( nId ) )
{
rReq.SetReturnValue( SfxBoolItem( 0, sal_False ) );
return;
}
- bool bDetectHidden = ( !bSilent && pDoc );
- if ( bDetectHidden && pDoc->QueryHiddenInformation( WhenPrinting, NULL ) != RET_YES )
- break;
-
- SFX_REQUEST_ARG(rReq, pSelectItem, SfxBoolItem, SID_SELECTION, sal_False);
- sal_Bool bSelection = pSelectItem && pSelectItem->GetValue();
- if( pSelectItem && rReq.GetArgs()->Count() == 1 )
- bIsAPI = sal_False;
+ if ( !bSilent && pDoc->QueryHiddenInformation( WhenPrinting, NULL ) != RET_YES )
+ return;
uno::Sequence < beans::PropertyValue > aProps;
if ( bIsAPI )
@@ -714,21 +713,28 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
// bool Asynchron
// bool Collate
// bool Silent
+
+ // the TransformItems function overwrite aProps
TransformItems( nId, *rReq.GetArgs(), aProps, GetInterface()->GetSlot(nId) );
- for ( sal_Int32 nProp=0; nProp<aProps.getLength(); nProp++ )
+
+ for ( sal_Int32 nProp=0; nProp < aProps.getLength(); nProp++ )
{
if ( aProps[nProp].Name == "Copies" )
+ {
aProps[nProp]. Name = rtl::OUString("CopyCount");
+ }
else if ( aProps[nProp].Name == "RangeText" )
+ {
aProps[nProp]. Name = rtl::OUString("Pages");
- if ( aProps[nProp].Name == "Asynchron" )
+ }
+ else if ( aProps[nProp].Name == "Asynchron" )
{
aProps[nProp]. Name = rtl::OUString("Wait");
sal_Bool bAsynchron = sal_False;
aProps[nProp].Value >>= bAsynchron;
aProps[nProp].Value <<= (sal_Bool) (!bAsynchron);
}
- if ( aProps[nProp].Name == "Silent" )
+ else if ( aProps[nProp].Name == "Silent" )
{
aProps[nProp]. Name = rtl::OUString("MonitorVisible");
sal_Bool bPrintSilent = sal_False;
@@ -737,6 +743,7 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
}
}
}
+
// HACK: writer sets the SID_SELECTION item when printing directly and expects
// to get only the selection document in that case (see getSelectionObject)
// however it also reacts to the PrintContent property. We need this distinction here,
too,
@@ -744,6 +751,10 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
// it would be better if writer handled this internally
if( nId == SID_PRINTDOCDIRECT )
{
+ // should we print only the selection or the whole document
+ SFX_REQUEST_ARG(rReq, pSelectItem, SfxBoolItem, SID_SELECTION, sal_False);
+ sal_Bool bSelection = ( pSelectItem != NULL && pSelectItem->GetValue() );
+
sal_Int32 nLen = aProps.getLength();
aProps.realloc( nLen + 1 );
aProps[nLen].Name = rtl::OUString( "PrintSelectionOnly" );
@@ -756,8 +767,7 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
rReq.Done();
break;
}
-
- case SID_SETUPPRINTER :
+ case SID_SETUPPRINTER : // display the printer settings dialogue : File > Printer Settings…
case SID_PRINTER_NAME : // only for recorded macros
{
// get printer and printer settings from the document
@@ -765,49 +775,42 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
// look for printer in parameters
SFX_REQUEST_ARG( rReq, pPrinterItem, SfxStringItem, SID_PRINTER_NAME, sal_False );
- if ( pPrinterItem )
+ if ( pPrinterItem != NULL )
{
// use PrinterName parameter to create a printer
pPrinter = new SfxPrinter( pDocPrinter->GetOptions().Clone(), ((const
SfxStringItem*) pPrinterItem)->GetValue() );
// if printer is unknown, it can't be used - now printer from document will be used
- if ( !pPrinter->IsOriginal() )
+ if ( !pPrinter->IsKnown() )
DELETEZ(pPrinter);
}
- if ( SID_PRINTER_NAME == nId )
- {
- // just set a recorded printer name
- if ( pPrinter )
- SetPrinter( pPrinter, SFX_PRINTER_PRINTER );
- break;
- }
-
// no PrinterName parameter in ItemSet or the PrinterName points to an unknown printer
- if ( !pPrinter )
+ if ( pPrinter == NULL )
// use default printer from document
pPrinter = pDocPrinter;
- if( !pPrinter || !pPrinter->IsValid() )
+ if( pPrinter == NULL || !pPrinter->IsValid() )
{
// no valid printer either in ItemSet or at the document
- if ( bSilent )
- {
- rReq.SetReturnValue(SfxBoolItem(0,sal_False));
- break;
- }
- else
+ if ( !bSilent )
ErrorBox( NULL, WB_OK | WB_DEF_OK, String( SfxResId( STR_NODEFPRINTER ) )
).Execute();
+
+ rReq.SetReturnValue(SfxBoolItem(0,sal_False));
+
+ return;
}
// FIXME: printer isn't used for printing anymore!
if( pPrinter->IsPrinting() )
{
- // if printer is busy, abort printing
+ // if printer is busy, abort configuration
if ( !bSilent )
InfoBox( NULL, String( SfxResId( STR_ERROR_PRINTER_BUSY ) ) ).Execute();
+
rReq.SetReturnValue(SfxBoolItem(0,sal_False));
- break;
+
+ return;
}
// if no arguments are given, retrieve them from a dialog
@@ -879,14 +882,10 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
if ( SID_PRINTDOC == nId )
rReq.SetReturnValue(SfxBoolItem(0,sal_False));
if ( nId == SID_SETUPPRINTER )
- {
rReq.AppendItem( SfxBoolItem( SID_DIALOG_RETURN, sal_False ) );
- }
}
}
}
-
- break;
}
}
--
1.7.11
From d63f7c628439b25bf98b9d8e8697aa9d309f8cb6 Mon Sep 17 00:00:00 2001
From: Maxime de Roucy <mderoucy@linagora.com>
Date: Fri, 15 Jun 2012 17:28:37 +0200
Subject: [PATCH 4/4] Prevent print settings dialog to show help button
Prevent the printer settings dialog to show help button when it's called
from the help.
Add a PrinterController property : HideHelpButton
Change-Id: I9ce548075f79e09115632fffa12dd14258ea5263
---
sfx2/source/view/viewprn.cxx | 15 +++++++++++----
vcl/source/window/printdlg.cxx | 3 +++
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/sfx2/source/view/viewprn.cxx b/sfx2/source/view/viewprn.cxx
index 20e2ac7..5f99161 100644
--- a/sfx2/source/view/viewprn.cxx
+++ b/sfx2/source/view/viewprn.cxx
@@ -671,8 +671,6 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
bSilent = ( pSilentItem != NULL && pSilentItem->GetValue() );
}
- //FIXME: how to transport "bPrintOnHelp"?
-
// no help button in dialogs if called from the help window
// (pressing help button would exchange the current page inside the help
// document that is going to be printed!)
@@ -744,6 +742,11 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
}
}
+ // we will add the "PrintSelectionOnly" or "HideHelpButton" properties
+ // we have to increase the capacity of aProps
+ sal_Int32 nLen = aProps.getLength();
+ aProps.realloc( nLen + 1 );
+
// HACK: writer sets the SID_SELECTION item when printing directly and expects
// to get only the selection document in that case (see getSelectionObject)
// however it also reacts to the PrintContent property. We need this distinction here,
too,
@@ -755,11 +758,15 @@ void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq )
SFX_REQUEST_ARG(rReq, pSelectItem, SfxBoolItem, SID_SELECTION, sal_False);
sal_Bool bSelection = ( pSelectItem != NULL && pSelectItem->GetValue() );
- sal_Int32 nLen = aProps.getLength();
- aProps.realloc( nLen + 1 );
aProps[nLen].Name = rtl::OUString( "PrintSelectionOnly" );
aProps[nLen].Value = makeAny( bSelection );
}
+ else // if nId == SID_PRINTDOC ; nothing to do with the previous HACK
+ {
+ // should the printer selection and properties dialogue display an help button
+ aProps[nLen].Name = rtl::OUString( "HideHelpButton" );
+ aProps[nLen].Value = makeAny( bPrintOnHelp );
+ }
ExecPrint( aProps, bIsAPI, (nId == SID_PRINTDOCDIRECT) );
diff --git a/vcl/source/window/printdlg.cxx b/vcl/source/window/printdlg.cxx
index d9aa5dd..9c05203 100644
--- a/vcl/source/window/printdlg.cxx
+++ b/vcl/source/window/printdlg.cxx
@@ -902,6 +902,9 @@ PrintDialog::PrintDialog( Window* i_pParent, const boost::shared_ptr<PrinterCont
// setup dependencies
checkControlDependencies();
+ if ( maPController->getBoolProperty( rtl::OUString( "HideHelpButton" ), sal_False ) )
+ maHelpButton.Hide();
+
// set initial focus to "Number of copies"
maJobPage.maCopyCountField.GrabFocus();
maJobPage.maCopyCountField.SetSelection( Selection(0, 0xFFFF) );
--
1.7.11
Attachment:
signature.asc
Description: This is a digitally signed message part