xref: /aoo4110/main/sw/source/ui/app/mainwn.cxx (revision b1cdbd2c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 
28 
29 #include <mdiexp.hxx>
30 #include <tools/shl.hxx>
31 #include <tools/string.hxx>
32 #ifndef _SVARRAY_HXX
33 #include <svl/svstdarr.hxx>
34 #endif
35 #include <sfx2/progress.hxx>
36 #ifndef _RESID_HXX //autogen
37 #include <tools/resid.hxx>
38 #endif
39 #include <docsh.hxx>
40 #include <swmodule.hxx>
41 #include "swtypes.hxx"
42 
43 class SwDocShell;
44 
45 struct SwProgress
46 {
47 	long nStartValue,
48 		 nStartCount;
49 	SwDocShell  *pDocShell;
50 	SfxProgress *pProgress;
51 };
52 
53 static SvPtrarr *pProgressContainer = 0;
54 
lcl_SwFindProgress(SwDocShell * pDocShell)55 static SwProgress *lcl_SwFindProgress( SwDocShell *pDocShell )
56 {
57 	for ( sal_uInt16 i = 0; i < pProgressContainer->Count(); ++i )
58 	{
59 		SwProgress *pTmp = (SwProgress*)(*pProgressContainer)[i];
60 		if ( pTmp->pDocShell == pDocShell )
61 			return pTmp;
62 	}
63 	return 0;
64 }
65 
66 
StartProgress(sal_uInt16 nMessResId,long nStartValue,long nEndValue,SwDocShell * pDocShell)67 void StartProgress( sal_uInt16 nMessResId, long nStartValue, long nEndValue,
68 					SwDocShell *pDocShell )
69 {
70 	if( !SW_MOD()->IsEmbeddedLoadSave() )
71 	{
72 		SwProgress *pProgress = 0;
73 
74 		if ( !pProgressContainer )
75 			pProgressContainer = new SvPtrarr( 2, 2 );
76 		else
77 		{
78 			if ( 0 != (pProgress = lcl_SwFindProgress( pDocShell )) )
79 				++pProgress->nStartCount;
80 		}
81 		if ( !pProgress )
82 		{
83 			pProgress = new SwProgress;
84 			pProgress->pProgress = new SfxProgress( pDocShell,
85 													SW_RESSTR(nMessResId),
86 													nEndValue - nStartValue,
87 													sal_False,
88 													sal_True );
89 			pProgress->nStartCount = 1;
90 			pProgress->pDocShell = pDocShell;
91 			pProgressContainer->Insert( (void*)pProgress, 0 );
92 		}
93 		pProgress->nStartValue = nStartValue;
94 	}
95 }
96 
97 
SetProgressState(long nPosition,SwDocShell * pDocShell)98 void SetProgressState( long nPosition, SwDocShell *pDocShell )
99 {
100 	if( pProgressContainer && !SW_MOD()->IsEmbeddedLoadSave() )
101 	{
102 		SwProgress *pProgress = lcl_SwFindProgress( pDocShell );
103 		if ( pProgress )
104 			pProgress->pProgress->SetState(nPosition - pProgress->nStartValue);
105 	}
106 }
107 
108 
EndProgress(SwDocShell * pDocShell)109 void EndProgress( SwDocShell *pDocShell )
110 {
111 	if( pProgressContainer && !SW_MOD()->IsEmbeddedLoadSave() )
112 	{
113 		SwProgress *pProgress = 0;
114 		sal_uInt16 i;
115 		for ( i = 0; i < pProgressContainer->Count(); ++i )
116 		{
117 			SwProgress *pTmp = (SwProgress*)(*pProgressContainer)[i];
118 			if ( pTmp->pDocShell == pDocShell )
119 			{
120 				pProgress = pTmp;
121 				break;
122 			}
123 		}
124 
125 		if ( pProgress && 0 == --pProgress->nStartCount )
126 		{
127 			pProgress->pProgress->Stop();
128 			pProgressContainer->Remove( i );
129 			delete pProgress->pProgress;
130 			delete pProgress;
131             //#112337# it may happen that the container has been removed
132             //while rescheduling
133             if ( pProgressContainer && !pProgressContainer->Count() )
134 				delete pProgressContainer, pProgressContainer = 0;
135 		}
136 	}
137 }
138 
139 
SetProgressText(sal_uInt16 nId,SwDocShell * pDocShell)140 void SetProgressText( sal_uInt16 nId, SwDocShell *pDocShell )
141 {
142 	if( pProgressContainer && !SW_MOD()->IsEmbeddedLoadSave() )
143 	{
144 		SwProgress *pProgress = lcl_SwFindProgress( pDocShell );
145 		if ( pProgress )
146 			pProgress->pProgress->SetStateText( 0, SW_RESSTR(nId) );
147 	}
148 }
149 
150 
RescheduleProgress(SwDocShell * pDocShell)151 void RescheduleProgress( SwDocShell *pDocShell )
152 {
153 	if( pProgressContainer && !SW_MOD()->IsEmbeddedLoadSave() )
154 	{
155 		SwProgress *pProgress = lcl_SwFindProgress( pDocShell );
156 		if ( pProgress )
157 			pProgress->pProgress->Reschedule();
158 	}
159 }
160 
161 
162