Date: prev next · Thread: first prev next last
2012 Archives by date, by thread · List index


Hello,

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.

I guess we'll leave the other two until your updated patches. Right ?,
or is 0004 still valid ?

Here is the a new 0003 and 0004 without the bug.

Regards

-- 
Maxime de Roucy
Groupe LINAGORA - OSSA
80 rue Roque de Fillol
92800 PUTEAUX
Tel. : 0033(0)642004909


Le lundi 25 juin 2012 à 16:56 +0100, Caolán McNamara a écrit :
On Tue, 2012-06-19 at 16:05 +0200, Maxime de Roucy wrote:
Hello,

Here is some patchs :
0001 : one line, code simplification.

I've pushed this one anyway.

0002 : explicite NULL or 0 comparison in if. I don't know if LibreOffice
have a coding standard about that type of comparison ?

meh, I don't think we have any coding standards around it. But I'd skip
this one as in the absence of a coding standard I don't see the value in
swapping from one equally valid syntax to another.

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.

I guess we'll leave the other two until your updated patches. Right ?,
or is 0004 still valid ?

C.

From 221450ef23f6984a87c7a6ac4ddcc85a7a622c63 Mon Sep 17 00:00:00 2001
From: Maxime de Roucy <mderoucy@linagora.com>
Date: Tue, 26 Jun 2012 15:00:38 +0200
Subject: [PATCH 1/2] 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: Ib26399b297aa991e37825f0b3d31574ff1253d4f
---
 sfx2/source/view/viewprn.cxx | 85 ++++++++++++++++++++++++--------------------
 1 file changed, 47 insertions(+), 38 deletions(-)

diff --git a/sfx2/source/view/viewprn.cxx b/sfx2/source/view/viewprn.cxx
index a8c19a2..fb3b9fd 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,52 @@ 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;
+
+                return;
             }
 
             // 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 +892,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.1

From 3a50cb7b92bc2ed69b61e2f7fe26c1a8af93ee1b Mon Sep 17 00:00:00 2001
From: Maxime de Roucy <mderoucy@linagora.com>
Date: Tue, 26 Jun 2012 15:01:35 +0200
Subject: [PATCH 2/2] 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: I02ea6c68dd3de62429e5a11d316981c2b6418bff
---
 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 fb3b9fd..d6e24db 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.1

Attachment: signature.asc
Description: This is a digitally signed message part


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.