xref: /aoo4110/main/sc/source/ui/docshell/autostyl.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski // INCLUDE ---------------------------------------------------------------
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <time.h>
32*b1cdbd2cSJim Jagielski #include "autostyl.hxx"
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include "docsh.hxx"
35*b1cdbd2cSJim Jagielski #include "attrib.hxx"
36*b1cdbd2cSJim Jagielski #include "sc.hrc"
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski //==================================================================
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski struct ScAutoStyleInitData
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski 	ScRange	aRange;
43*b1cdbd2cSJim Jagielski 	String	aStyle1;
44*b1cdbd2cSJim Jagielski 	sal_uLong	nTimeout;
45*b1cdbd2cSJim Jagielski 	String	aStyle2;
46*b1cdbd2cSJim Jagielski 
ScAutoStyleInitDataScAutoStyleInitData47*b1cdbd2cSJim Jagielski 	ScAutoStyleInitData( const ScRange& rR, const String& rSt1, sal_uLong nT, const String& rSt2 ) :
48*b1cdbd2cSJim Jagielski 		aRange(rR), aStyle1(rSt1), nTimeout(nT), aStyle2(rSt2) {}
49*b1cdbd2cSJim Jagielski };
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski struct ScAutoStyleData
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski 	sal_uLong	nTimeout;
54*b1cdbd2cSJim Jagielski 	ScRange	aRange;
55*b1cdbd2cSJim Jagielski 	String	aStyle;
56*b1cdbd2cSJim Jagielski 
ScAutoStyleDataScAutoStyleData57*b1cdbd2cSJim Jagielski 	ScAutoStyleData( sal_uLong nT, const ScRange& rR, const String& rT ) :
58*b1cdbd2cSJim Jagielski 		nTimeout(nT), aRange(rR), aStyle(rT) {}
59*b1cdbd2cSJim Jagielski };
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski //==================================================================
62*b1cdbd2cSJim Jagielski 
TimeNow()63*b1cdbd2cSJim Jagielski inline sal_uLong TimeNow()			// Sekunden
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski 	return (sal_uLong) time(0);
66*b1cdbd2cSJim Jagielski }
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski //==================================================================
69*b1cdbd2cSJim Jagielski 
ScAutoStyleList(ScDocShell * pShell)70*b1cdbd2cSJim Jagielski ScAutoStyleList::ScAutoStyleList(ScDocShell* pShell) :
71*b1cdbd2cSJim Jagielski 	pDocSh( pShell )
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski 	aTimer.SetTimeoutHdl( LINK( this, ScAutoStyleList, TimerHdl ) );
74*b1cdbd2cSJim Jagielski 	aInitTimer.SetTimeoutHdl( LINK( this, ScAutoStyleList, InitHdl ) );
75*b1cdbd2cSJim Jagielski 	aInitTimer.SetTimeout( 0 );
76*b1cdbd2cSJim Jagielski }
77*b1cdbd2cSJim Jagielski 
~ScAutoStyleList()78*b1cdbd2cSJim Jagielski ScAutoStyleList::~ScAutoStyleList()
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski 	sal_uLong i;
81*b1cdbd2cSJim Jagielski 	sal_uLong nCount = aEntries.Count();
82*b1cdbd2cSJim Jagielski 	for (i=0; i<nCount; i++)
83*b1cdbd2cSJim Jagielski 		delete (ScAutoStyleData*) aEntries.GetObject(i);
84*b1cdbd2cSJim Jagielski 	nCount = aInitials.Count();
85*b1cdbd2cSJim Jagielski 	for (i=0; i<nCount; i++)
86*b1cdbd2cSJim Jagielski 		delete (ScAutoStyleInitData*) aInitials.GetObject(i);
87*b1cdbd2cSJim Jagielski }
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski //==================================================================
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski //	initial short delay (asynchronous call)
92*b1cdbd2cSJim Jagielski 
AddInitial(const ScRange & rRange,const String & rStyle1,sal_uLong nTimeout,const String & rStyle2)93*b1cdbd2cSJim Jagielski void ScAutoStyleList::AddInitial( const ScRange& rRange, const String& rStyle1,
94*b1cdbd2cSJim Jagielski 									sal_uLong nTimeout, const String& rStyle2 )
95*b1cdbd2cSJim Jagielski {
96*b1cdbd2cSJim Jagielski 	ScAutoStyleInitData* pNew =
97*b1cdbd2cSJim Jagielski 		new ScAutoStyleInitData( rRange, rStyle1, nTimeout, rStyle2 );
98*b1cdbd2cSJim Jagielski 	aInitials.Insert( pNew, aInitials.Count() );
99*b1cdbd2cSJim Jagielski 	aInitTimer.Start();
100*b1cdbd2cSJim Jagielski }
101*b1cdbd2cSJim Jagielski 
IMPL_LINK(ScAutoStyleList,InitHdl,Timer *,EMPTYARG)102*b1cdbd2cSJim Jagielski IMPL_LINK( ScAutoStyleList, InitHdl, Timer*, EMPTYARG )
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski 	sal_uLong nCount = aInitials.Count();
105*b1cdbd2cSJim Jagielski 	for (sal_uLong i=0; i<nCount; i++)
106*b1cdbd2cSJim Jagielski 	{
107*b1cdbd2cSJim Jagielski 		ScAutoStyleInitData* pData = (ScAutoStyleInitData*) aInitials.GetObject(i);
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 		//	apply first style immediately
110*b1cdbd2cSJim Jagielski 		pDocSh->DoAutoStyle( pData->aRange, pData->aStyle1 );
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 		//	add second style to list
113*b1cdbd2cSJim Jagielski 		if ( pData->nTimeout )
114*b1cdbd2cSJim Jagielski 			AddEntry( pData->nTimeout, pData->aRange, pData->aStyle2 );
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 		delete pData;
117*b1cdbd2cSJim Jagielski 	}
118*b1cdbd2cSJim Jagielski 	aInitials.Clear();
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 	return 0;
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski //==================================================================
124*b1cdbd2cSJim Jagielski 
AddEntry(sal_uLong nTimeout,const ScRange & rRange,const String & rStyle)125*b1cdbd2cSJim Jagielski void ScAutoStyleList::AddEntry( sal_uLong nTimeout, const ScRange& rRange, const String& rStyle )
126*b1cdbd2cSJim Jagielski {
127*b1cdbd2cSJim Jagielski 	aTimer.Stop();
128*b1cdbd2cSJim Jagielski 	sal_uLong nNow = TimeNow();
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 	//	alten Eintrag loeschen
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski 	sal_uLong nCount = aEntries.Count();
133*b1cdbd2cSJim Jagielski 	sal_uLong i;
134*b1cdbd2cSJim Jagielski 	for (i=0; i<nCount; i++)
135*b1cdbd2cSJim Jagielski 	{
136*b1cdbd2cSJim Jagielski 		ScAutoStyleData* pData = (ScAutoStyleData*) aEntries.GetObject(i);
137*b1cdbd2cSJim Jagielski 		if (pData->aRange == rRange)
138*b1cdbd2cSJim Jagielski 		{
139*b1cdbd2cSJim Jagielski 			delete pData;
140*b1cdbd2cSJim Jagielski 			aEntries.Remove(i);
141*b1cdbd2cSJim Jagielski 			--nCount;
142*b1cdbd2cSJim Jagielski 			break;						// nicht weitersuchen - es kann nur einen geben
143*b1cdbd2cSJim Jagielski 		}
144*b1cdbd2cSJim Jagielski 	}
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 	//	Timeouts von allen Eintraegen anpassen
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 	if (nCount && nNow != nTimerStart)
149*b1cdbd2cSJim Jagielski 	{
150*b1cdbd2cSJim Jagielski 		DBG_ASSERT(nNow>nTimerStart, "Zeit laeuft rueckwaerts?");
151*b1cdbd2cSJim Jagielski 		AdjustEntries((nNow-nTimerStart)*1000);
152*b1cdbd2cSJim Jagielski 	}
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 	//	Einfuege-Position suchen
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 	sal_uLong nPos = LIST_APPEND;
157*b1cdbd2cSJim Jagielski 	for (i=0; i<nCount && nPos == LIST_APPEND; i++)
158*b1cdbd2cSJim Jagielski 		if (nTimeout <= ((ScAutoStyleData*) aEntries.GetObject(i))->nTimeout)
159*b1cdbd2cSJim Jagielski 			nPos = i;
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 	ScAutoStyleData* pNew = new ScAutoStyleData( nTimeout, rRange, rStyle );
162*b1cdbd2cSJim Jagielski 	aEntries.Insert( pNew, nPos );
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 	//	abgelaufene ausfuehren, Timer neu starten
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski 	ExecuteEntries();
167*b1cdbd2cSJim Jagielski 	StartTimer(nNow);
168*b1cdbd2cSJim Jagielski }
169*b1cdbd2cSJim Jagielski 
AdjustEntries(sal_uLong nDiff)170*b1cdbd2cSJim Jagielski void ScAutoStyleList::AdjustEntries( sal_uLong nDiff )	// Millisekunden
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski 	sal_uLong nCount = aEntries.Count();
173*b1cdbd2cSJim Jagielski 	for (sal_uLong i=0; i<nCount; i++)
174*b1cdbd2cSJim Jagielski 	{
175*b1cdbd2cSJim Jagielski 		ScAutoStyleData* pData = (ScAutoStyleData*) aEntries.GetObject(i);
176*b1cdbd2cSJim Jagielski 		if ( pData->nTimeout <= nDiff )
177*b1cdbd2cSJim Jagielski 			pData->nTimeout = 0;					// abgelaufen
178*b1cdbd2cSJim Jagielski 		else
179*b1cdbd2cSJim Jagielski 			pData->nTimeout -= nDiff;				// weiterzaehlen
180*b1cdbd2cSJim Jagielski 	}
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
ExecuteEntries()183*b1cdbd2cSJim Jagielski void ScAutoStyleList::ExecuteEntries()
184*b1cdbd2cSJim Jagielski {
185*b1cdbd2cSJim Jagielski 	ScAutoStyleData* pData;
186*b1cdbd2cSJim Jagielski     while ((pData = (ScAutoStyleData*) aEntries.GetObject(0)) != NULL && pData->nTimeout == 0)
187*b1cdbd2cSJim Jagielski 	{
188*b1cdbd2cSJim Jagielski 		pDocSh->DoAutoStyle( pData->aRange, pData->aStyle );	//! oder Request ???
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 		delete pData;
191*b1cdbd2cSJim Jagielski 		aEntries.Remove((sal_uLong)0);
192*b1cdbd2cSJim Jagielski 	}
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski 
ExecuteAllNow()195*b1cdbd2cSJim Jagielski void ScAutoStyleList::ExecuteAllNow()
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski 	aTimer.Stop();
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 	sal_uLong nCount = aEntries.Count();
200*b1cdbd2cSJim Jagielski 	for (sal_uLong i=0; i<nCount; i++)
201*b1cdbd2cSJim Jagielski 	{
202*b1cdbd2cSJim Jagielski 		ScAutoStyleData* pData = (ScAutoStyleData*) aEntries.GetObject(i);
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 		pDocSh->DoAutoStyle( pData->aRange, pData->aStyle );	//! oder Request ???
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 		delete pData;
207*b1cdbd2cSJim Jagielski 	}
208*b1cdbd2cSJim Jagielski 	aEntries.Clear();
209*b1cdbd2cSJim Jagielski }
210*b1cdbd2cSJim Jagielski 
StartTimer(sal_uLong nNow)211*b1cdbd2cSJim Jagielski void ScAutoStyleList::StartTimer( sal_uLong nNow )		// Sekunden
212*b1cdbd2cSJim Jagielski {
213*b1cdbd2cSJim Jagielski 	// ersten Eintrag mit Timeout != 0 suchen
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 	sal_uLong nPos = 0;
216*b1cdbd2cSJim Jagielski 	ScAutoStyleData* pData;
217*b1cdbd2cSJim Jagielski     while ( (pData = (ScAutoStyleData*) aEntries.GetObject(nPos)) != NULL && pData->nTimeout == 0 )
218*b1cdbd2cSJim Jagielski 		++nPos;
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 	if (pData)
221*b1cdbd2cSJim Jagielski 	{
222*b1cdbd2cSJim Jagielski 		aTimer.SetTimeout( pData->nTimeout );
223*b1cdbd2cSJim Jagielski 		aTimer.Start();
224*b1cdbd2cSJim Jagielski 	}
225*b1cdbd2cSJim Jagielski 	nTimerStart = nNow;
226*b1cdbd2cSJim Jagielski }
227*b1cdbd2cSJim Jagielski 
IMPL_LINK(ScAutoStyleList,TimerHdl,Timer *,EMPTYARG)228*b1cdbd2cSJim Jagielski IMPL_LINK( ScAutoStyleList, TimerHdl, Timer*, EMPTYARG )
229*b1cdbd2cSJim Jagielski {
230*b1cdbd2cSJim Jagielski 	sal_uLong nNow = TimeNow();
231*b1cdbd2cSJim Jagielski 	AdjustEntries(aTimer.GetTimeout());				// eingestellte Wartezeit
232*b1cdbd2cSJim Jagielski 	ExecuteEntries();
233*b1cdbd2cSJim Jagielski 	StartTimer(nNow);
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski 	return 0;
236*b1cdbd2cSJim Jagielski }
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski 
241