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