LCOV - code coverage report
Current view: top level - libreoffice/svtools/source/misc - ehdl.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 15 182 8.2 %
Date: 2012-12-27 Functions: 3 19 15.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <osl/mutex.hxx>
      21             : #include <tools/rcid.h>
      22             : #include <tools/wintypes.hxx>
      23             : #include <vcl/msgbox.hxx>
      24             : #include <vcl/svapp.hxx>
      25             : 
      26             : #include <svtools/ehdl.hxx>
      27             : #include <svtools/svtresid.hxx>
      28             : #include <svtools/svtools.hrc>
      29             : #include <svtools/sfxecode.hxx>
      30             : 
      31             : //=========================================================================
      32             : 
      33           0 : static sal_uInt16 aWndFunc(
      34             :     Window *pWin,            // Parent des Dialoges
      35             :     sal_uInt16 nFlags,
      36             :     const OUString &rErr,      // Fehlertext
      37             :     const OUString &rAction)   // Actiontext
      38             : 
      39             : /*  [Beschreibung]
      40             : 
      41             :     Bringt eine Fehlerbox auf den Schirm. Je nach nFlags werden
      42             :     Error/ Info usw. Boxen mit den gewuenschten Buttons angezeigt
      43             : 
      44             :     Rueckgabewert ist der gedrueckte Button
      45             : 
      46             :     */
      47             : 
      48             : 
      49             : {
      50           0 :     SolarMutexGuard aGuard;
      51             : 
      52             :     // aus den Flags die benoetigten WinBits ermitteln
      53           0 :     WinBits eBits=0;
      54           0 :     if ( (ERRCODE_BUTTON_CANCEL|ERRCODE_BUTTON_RETRY) == (nFlags & (ERRCODE_BUTTON_CANCEL|ERRCODE_BUTTON_RETRY)) )
      55           0 :         eBits = WB_RETRY_CANCEL;
      56           0 :     else if ( ERRCODE_BUTTON_OK_CANCEL == (nFlags & ERRCODE_BUTTON_OK_CANCEL) )
      57           0 :         eBits = WB_OK_CANCEL;
      58           0 :     else if ( ERRCODE_BUTTON_OK == (nFlags & ERRCODE_BUTTON_OK) )
      59           0 :         eBits = WB_OK;
      60           0 :     else if ( ERRCODE_BUTTON_YES_NO_CANCEL == (nFlags & ERRCODE_BUTTON_YES_NO_CANCEL) )
      61           0 :         eBits = WB_YES_NO_CANCEL;
      62           0 :     else if ( ERRCODE_BUTTON_YES_NO == (nFlags & ERRCODE_BUTTON_YES_NO) )
      63           0 :         eBits = WB_YES_NO;
      64             : 
      65           0 :     switch(nFlags & 0x0f00)
      66             :     {
      67             :       case ERRCODE_BUTTON_DEF_OK:
      68           0 :             eBits |= WB_DEF_OK;
      69           0 :             break;
      70             : 
      71             :       case ERRCODE_BUTTON_DEF_CANCEL:
      72           0 :             eBits |= WB_DEF_CANCEL;
      73           0 :             break;
      74             : 
      75             :       case ERRCODE_BUTTON_DEF_YES:
      76           0 :             eBits |= WB_DEF_YES;
      77           0 :             break;
      78             : 
      79             :       case ERRCODE_BUTTON_DEF_NO:
      80           0 :             eBits |= WB_DEF_NO;
      81           0 :             break;
      82             :     }
      83             : 
      84           0 :     String aErr(SvtResId(STR_ERR_HDLMESS).toString());
      85           0 :     String aAction(rAction);
      86           0 :     if ( aAction.Len() )
      87           0 :         aAction += rtl::OUString(":\n");
      88           0 :     aErr.SearchAndReplace(rtl::OUString("$(ACTION)"), aAction);
      89           0 :     aErr.SearchAndReplace(rtl::OUString("$(ERROR)"), rErr);
      90             : 
      91             :     MessBox* pBox;
      92           0 :     switch ( nFlags & 0xf000 )
      93             :     {
      94             :         case ERRCODE_MSG_ERROR:
      95           0 :             pBox = new ErrorBox(pWin, eBits, aErr);
      96           0 :             break;
      97             : 
      98             :         case ERRCODE_MSG_WARNING:
      99           0 :             pBox = new WarningBox(pWin, eBits, aErr);
     100           0 :             break;
     101             : 
     102             :         case ERRCODE_MSG_INFO:
     103           0 :             pBox = new InfoBox(pWin, aErr);
     104           0 :             break;
     105             : 
     106             :         case ERRCODE_MSG_QUERY:
     107           0 :             pBox = new QueryBox(pWin, eBits, aErr);
     108           0 :             break;
     109             : 
     110             :         default:
     111             :         {
     112             :             SAL_WARN( "svtools.misc", "no MessBox type");
     113           0 :             pBox = NULL;
     114           0 :             return ERRCODE_BUTTON_OK;
     115             :         }
     116             :     }
     117             : 
     118           0 :     sal_uInt16 nRet = RET_CANCEL;
     119           0 :     switch ( pBox->Execute() )
     120             :     {
     121             :         case RET_OK:
     122           0 :             nRet = ERRCODE_BUTTON_OK;
     123           0 :             break;
     124             :         case RET_CANCEL:
     125           0 :             nRet = ERRCODE_BUTTON_CANCEL;
     126           0 :             break;
     127             :         case RET_RETRY:
     128           0 :             nRet = ERRCODE_BUTTON_RETRY;
     129           0 :             break;
     130             :         case RET_YES:
     131           0 :             nRet = ERRCODE_BUTTON_YES;
     132           0 :             break;
     133             :         case RET_NO:
     134           0 :             nRet = ERRCODE_BUTTON_NO;
     135           0 :             break;
     136             :         default:
     137             :             SAL_WARN( "svtools.misc", "Unknown MessBox return value" );
     138           0 :             break;
     139             :     }
     140           0 :     delete pBox;
     141           0 :     return nRet;
     142             : }
     143             : 
     144             : //-------------------------------------------------------------------------
     145             : 
     146          93 : SfxErrorHandler::SfxErrorHandler(sal_uInt16 nIdP, sal_uLong lStartP, sal_uLong lEndP, ResMgr *pMgrP) :
     147             : 
     148          93 :     lStart(lStartP), lEnd(lEndP), nId(nIdP), pMgr(pMgrP), pFreeMgr( NULL )
     149             : 
     150             : {
     151          93 :     RegisterDisplay(&aWndFunc);
     152          93 :     if( ! pMgr )
     153             :     {
     154          19 :         com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILanguageTag().getLocale();
     155          19 :         pFreeMgr = pMgr = ResMgr::CreateResMgr("ofa", aLocale );
     156             :     }
     157          93 : }
     158             : 
     159             : //-------------------------------------------------------------------------
     160             : 
     161          36 : SfxErrorHandler::~SfxErrorHandler()
     162             : {
     163          18 :     delete pFreeMgr;
     164          18 : }
     165             : 
     166             : //-------------------------------------------------------------------------
     167             : 
     168           0 : sal_Bool SfxErrorHandler::CreateString(
     169             :     const ErrorInfo *pErr, OUString &rStr, sal_uInt16& nFlags) const
     170             : 
     171             : /*  [Beschreibung]
     172             : 
     173             :     Der Fehlerstring fuer die ErrorInfo pErr wird zusammengesetzt.
     174             : 
     175             :     */
     176             : 
     177             : {
     178           0 :     sal_uLong nErrCode = pErr->GetErrorCode() & ERRCODE_ERROR_MASK;
     179           0 :     if( nErrCode>=lEnd || nErrCode<=lStart )
     180           0 :         return sal_False;
     181           0 :     MessageInfo *pMsgInfo=PTR_CAST(MessageInfo,pErr);
     182           0 :     if(pMsgInfo)
     183             :     {
     184           0 :         if(GetMessageString(nErrCode, rStr, nFlags))
     185             :         {
     186           0 :             rStr = rStr.replaceAll("$(ARG1)", pMsgInfo->GetMessageArg());
     187           0 :             return sal_True;
     188             :         }
     189             :     }
     190           0 :     else if(GetErrorString(nErrCode, rStr, nFlags))
     191             :     {
     192           0 :         StringErrorInfo *pStringInfo=PTR_CAST(StringErrorInfo,pErr);
     193           0 :         if(pStringInfo)
     194             :         {
     195             :             rStr = rStr.replaceAll(rtl::OUString("$(ARG1)"),
     196           0 :                                       pStringInfo->GetErrorString());
     197             :         }
     198             :         else
     199             :         {
     200           0 :             TwoStringErrorInfo * pTwoStringInfo = PTR_CAST(TwoStringErrorInfo,
     201             :                                                            pErr);
     202           0 :             if (pTwoStringInfo)
     203             :             {
     204           0 :                 rStr = rStr.replaceAll("$(ARG1)", pTwoStringInfo->GetArg1());
     205           0 :                 rStr = rStr.replaceAll("$(ARG2)", pTwoStringInfo->GetArg2());
     206             :             }
     207             :         }
     208           0 :         return sal_True;
     209             :     }
     210           0 :     return sal_False;
     211             : }
     212             : 
     213             : //-------------------------------------------------------------------------
     214             : 
     215           0 : class ResString: public String
     216             : 
     217             : /*  [Beschreibung]
     218             : 
     219             :     Hilfsklasse zum Auslesen eines Strings und optionaler ExtraData aus
     220             :     einer String Resource.
     221             : 
     222             :     */
     223             : 
     224             : {
     225             :     sal_uInt16 nFlags;
     226             :   public:
     227           0 :     sal_uInt16 GetFlags() const {return nFlags;}
     228           0 :     const String & GetString() const {return *this;}
     229             :     ResString( ResId &rId);
     230             : };
     231             : 
     232             : //-------------------------------------------------------------------------
     233             : 
     234           0 : ResString::ResString(ResId & rId):
     235           0 :     String(rId.SetAutoRelease(sal_False).toString()),
     236           0 :     nFlags(0)
     237             : {
     238           0 :     ResMgr * pResMgr = rId.GetResMgr();
     239             :      // String ctor temporarily sets global ResManager
     240           0 :     if (pResMgr->GetRemainSize())
     241           0 :         nFlags = sal_uInt16(pResMgr->ReadShort());
     242           0 :     rId.SetAutoRelease(sal_True);
     243           0 :     pResMgr->PopContext();
     244           0 : }
     245             : 
     246             : //-------------------------------------------------------------------------
     247             : 
     248             : struct ErrorResource_Impl : private Resource
     249             : 
     250             : /*  [Beschreibung]
     251             : 
     252             :     Hilfsklasse zum Zugriff auf String SubResourcen einer Resource
     253             :     */
     254             : 
     255             : {
     256             : 
     257             :     ResId aResId;
     258             : 
     259           0 :     ErrorResource_Impl(ResId& rErrIdP, sal_uInt16 nId)
     260           0 :         : Resource(rErrIdP),aResId(nId,*rErrIdP.GetResMgr()){}
     261             : 
     262           0 :     ~ErrorResource_Impl() { FreeResource(); }
     263             : 
     264           0 :     operator ResString(){ return ResString( aResId ); }
     265           0 :     operator sal_Bool(){return IsAvailableRes(aResId.SetRT(RSC_STRING));}
     266             : 
     267             : };
     268             : 
     269             : 
     270           0 : sal_Bool SfxErrorHandler::GetClassString(sal_uLong lClassId, String &rStr) const
     271             : 
     272             : /*  [Beschreibung]
     273             : 
     274             :     Erzeugt den String fuer die Klasse des Fehlers. Wird immer aus der
     275             :     Resource des Sfx gelesen
     276             : 
     277             :     */
     278             : 
     279             : {
     280           0 :     sal_Bool bRet = sal_False;
     281           0 :     com::sun::star::lang::Locale aLocale( Application::GetSettings().GetUILanguageTag().getLocale() );
     282           0 :     ResMgr* pResMgr = ResMgr::CreateResMgr("ofa", aLocale );
     283           0 :     if( pResMgr )
     284             :     {
     285           0 :         ResId aId(RID_ERRHDL, *pResMgr );
     286           0 :         ErrorResource_Impl aEr(aId, (sal_uInt16)lClassId);
     287           0 :         if(aEr)
     288             :         {
     289           0 :             rStr=((ResString)aEr).GetString();
     290           0 :             bRet = sal_True;
     291           0 :         }
     292             :     }
     293           0 :     delete pResMgr;
     294           0 :     return bRet;
     295             : }
     296             : 
     297             : //-------------------------------------------------------------------------
     298             : 
     299           0 : sal_Bool SfxErrorHandler::GetMessageString(
     300             :     sal_uLong lErrId, OUString &rStr, sal_uInt16 &nFlags) const
     301             : 
     302             : /*  [Beschreibung]
     303             : 
     304             :     Erzeugt den String fuer die Ausgabe in einer MessageBox
     305             : 
     306             :     */
     307             : 
     308             : {
     309           0 :     sal_Bool bRet = sal_False;
     310           0 :     ResId *pResId= new ResId(nId, *pMgr);
     311             : 
     312           0 :     ErrorResource_Impl aEr(*pResId, (sal_uInt16)lErrId);
     313           0 :     if(aEr)
     314             :     {
     315           0 :         ResString aErrorString(aEr);
     316           0 :         sal_uInt16 nResFlags = aErrorString.GetFlags();
     317           0 :         if( nResFlags )
     318           0 :             nFlags=aErrorString.GetFlags();
     319           0 :         rStr = aErrorString.GetString();
     320           0 :         bRet = sal_True;
     321             :     }
     322             : 
     323           0 :     delete pResId;
     324           0 :     return bRet;
     325             : }
     326             : 
     327             : //-------------------------------------------------------------------------
     328             : 
     329           0 : sal_Bool SfxErrorHandler::GetErrorString(
     330             :     sal_uLong lErrId, OUString &rStr, sal_uInt16 &nFlags) const
     331             : 
     332             : /*  [Beschreibung]
     333             :     Erzeugt den Fehlerstring fuer den eigentlichen Fehler ohne
     334             :     dessen Klasse
     335             : 
     336             :     */
     337             : 
     338             : {
     339           0 :     SolarMutexGuard aGuard;
     340             : 
     341           0 :     sal_Bool bRet = sal_False;
     342           0 :     rStr=SvtResId(RID_ERRHDL_CLASS).toString();
     343           0 :     ResId aResId(nId, *pMgr);
     344             : 
     345             :     {
     346           0 :         ErrorResource_Impl aEr(aResId, (sal_uInt16)lErrId);
     347           0 :         if(aEr)
     348             :         {
     349           0 :             ResString aErrorString(aEr);
     350             : 
     351           0 :             sal_uInt16 nResFlags = aErrorString.GetFlags();
     352           0 :             if ( nResFlags )
     353           0 :                 nFlags = nResFlags;
     354           0 :             rStr = rStr.replaceAll(rtl::OUString("$(ERROR)"), aErrorString.GetString());
     355           0 :             bRet = sal_True;
     356             :         }
     357             :         else
     358           0 :             bRet = sal_False;
     359             :     }
     360             : 
     361           0 :     if( bRet )
     362             :     {
     363           0 :         String aErrStr;
     364             :         GetClassString(lErrId & ERRCODE_CLASS_MASK,
     365           0 :                        aErrStr);
     366           0 :         if(aErrStr.Len())
     367           0 :             aErrStr += rtl::OUString(".\n");
     368           0 :         rStr = rStr.replaceAll(rtl::OUString("$(CLASS)"),aErrStr);
     369             :     }
     370             : 
     371           0 :     return bRet;
     372             : }
     373             : 
     374             : //-------------------------------------------------------------------------
     375             : 
     376           0 : SfxErrorContext::SfxErrorContext(
     377             :     sal_uInt16 nCtxIdP, Window *pWindow, sal_uInt16 nResIdP, ResMgr *pMgrP)
     378           0 : :   ErrorContext(pWindow), nCtxId(nCtxIdP), nResId(nResIdP), pMgr(pMgrP)
     379             : {
     380           0 :     if( nResId==USHRT_MAX )
     381           0 :         nResId=RID_ERRCTX;
     382           0 : }
     383             : 
     384             : //-------------------------------------------------------------------------
     385             : 
     386         243 : SfxErrorContext::SfxErrorContext(
     387             :     sal_uInt16 nCtxIdP, const String &aArg1P, Window *pWindow,
     388             :     sal_uInt16 nResIdP, ResMgr *pMgrP)
     389             : :   ErrorContext(pWindow), nCtxId(nCtxIdP), nResId(nResIdP), pMgr(pMgrP),
     390         243 :     aArg1(aArg1P)
     391             : {
     392         243 :     if( nResId==USHRT_MAX )
     393         243 :         nResId=RID_ERRCTX;
     394         243 : }
     395             : 
     396             : //-------------------------------------------------------------------------
     397             : 
     398           0 : sal_Bool SfxErrorContext::GetString(sal_uLong nErrId, OUString &rStr)
     399             : 
     400             : /*  [Beschreibung]
     401             : 
     402             :     Baut die Beschreibung eines ErrorContextes auf
     403             :     */
     404             : 
     405             : {
     406           0 :     bool bRet = false;
     407           0 :     ResMgr* pFreeMgr = NULL;
     408           0 :     if( ! pMgr )
     409             :     {
     410           0 :         com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILanguageTag().getLocale();
     411           0 :         pFreeMgr = pMgr = ResMgr::CreateResMgr("ofa", aLocale );
     412             :     }
     413           0 :     if( pMgr )
     414             :     {
     415           0 :         SolarMutexGuard aGuard;
     416             : 
     417           0 :         ResId aResId( nResId, *pMgr );
     418             : 
     419           0 :         ErrorResource_Impl aTestEr( aResId, nCtxId );
     420           0 :         if ( aTestEr )
     421             :         {
     422           0 :             rStr = ( (ResString)aTestEr ).GetString();
     423           0 :             rStr = rStr.replaceAll(rtl::OUString("$(ARG1)"), aArg1 );
     424           0 :             bRet = true;
     425             :         }
     426             :         else
     427             :         {
     428             :             SAL_WARN( "svtools.misc", "ErrorContext cannot find the resource" );
     429           0 :             bRet = false;
     430             :         }
     431             : 
     432           0 :         if ( bRet )
     433             :         {
     434           0 :             sal_uInt16 nId = ( nErrId & ERRCODE_WARNING_MASK ) ? ERRCTX_WARNING : ERRCTX_ERROR;
     435           0 :             ResId aSfxResId( RID_ERRCTX, *pMgr );
     436           0 :             ErrorResource_Impl aEr( aSfxResId, nId );
     437           0 :             rStr = rStr.replaceAll( rtl::OUString("$(ERR)"), ( (ResString)aEr ).GetString() );
     438           0 :         }
     439             :     }
     440             : 
     441           0 :     if( pFreeMgr )
     442             :     {
     443           0 :         delete pFreeMgr;
     444           0 :         pMgr = NULL;
     445             :     }
     446           0 :     return bRet;
     447             : }
     448             : 
     449             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10