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: */
|