xref: /AOO41X/main/sw/source/ui/app/mainwn.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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