xref: /aoo4110/main/sc/source/ui/view/gridwin4.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 "scitems.hxx"
32*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include <svtools/colorcfg.hxx>
36*b1cdbd2cSJim Jagielski #include <editeng/colritem.hxx>
37*b1cdbd2cSJim Jagielski #include <editeng/editview.hxx>
38*b1cdbd2cSJim Jagielski #include <editeng/fhgtitem.hxx>
39*b1cdbd2cSJim Jagielski #include <editeng/scripttypeitem.hxx>
40*b1cdbd2cSJim Jagielski #include <sfx2/bindings.hxx>
41*b1cdbd2cSJim Jagielski #include <sfx2/printer.hxx>
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #include <svx/svdview.hxx>
44*b1cdbd2cSJim Jagielski #include "tabvwsh.hxx"
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski #include "gridwin.hxx"
47*b1cdbd2cSJim Jagielski #include "viewdata.hxx"
48*b1cdbd2cSJim Jagielski #include "output.hxx"
49*b1cdbd2cSJim Jagielski #include "document.hxx"
50*b1cdbd2cSJim Jagielski #include "attrib.hxx"
51*b1cdbd2cSJim Jagielski #include "patattr.hxx"			// InvertSimple
52*b1cdbd2cSJim Jagielski #include "dbcolect.hxx"
53*b1cdbd2cSJim Jagielski #include "docoptio.hxx"
54*b1cdbd2cSJim Jagielski #include "notemark.hxx"
55*b1cdbd2cSJim Jagielski #include "dbfunc.hxx"			// oder GetPageBreakData an die ViewData
56*b1cdbd2cSJim Jagielski #include "scmod.hxx"
57*b1cdbd2cSJim Jagielski #include "inputhdl.hxx"
58*b1cdbd2cSJim Jagielski #include "rfindlst.hxx"
59*b1cdbd2cSJim Jagielski #include "hiranges.hxx"
60*b1cdbd2cSJim Jagielski #include "pagedata.hxx"
61*b1cdbd2cSJim Jagielski #include "docpool.hxx"
62*b1cdbd2cSJim Jagielski #include "globstr.hrc"
63*b1cdbd2cSJim Jagielski #include "docsh.hxx"			// oder GetSfxInPlaceObject
64*b1cdbd2cSJim Jagielski #include "cbutton.hxx"
65*b1cdbd2cSJim Jagielski #include "invmerge.hxx"
66*b1cdbd2cSJim Jagielski #include "editutil.hxx"
67*b1cdbd2cSJim Jagielski #include "inputopt.hxx"
68*b1cdbd2cSJim Jagielski #include "fillinfo.hxx"
69*b1cdbd2cSJim Jagielski #include "dpcontrol.hxx"
70*b1cdbd2cSJim Jagielski #include "queryparam.hxx"
71*b1cdbd2cSJim Jagielski #include "sc.hrc"
72*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx>
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski // #i74769#
75*b1cdbd2cSJim Jagielski #include <svx/sdrpaintwindow.hxx>
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski //#include "tabvwsh.hxx"			//! Test !!!!
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
80*b1cdbd2cSJim Jagielski 
lcl_LimitRect(Rectangle & rRect,const Rectangle & rVisible)81*b1cdbd2cSJim Jagielski void lcl_LimitRect( Rectangle& rRect, const Rectangle& rVisible )
82*b1cdbd2cSJim Jagielski {
83*b1cdbd2cSJim Jagielski 	if ( rRect.Top()    < rVisible.Top()-1 )    rRect.Top()    = rVisible.Top()-1;
84*b1cdbd2cSJim Jagielski //	if ( rRect.Left()   < rVisible.Left()-1 )   rRect.Left()   = rVisible.Left()-1;
85*b1cdbd2cSJim Jagielski 	if ( rRect.Bottom() > rVisible.Bottom()+1 ) rRect.Bottom() = rVisible.Bottom()+1;
86*b1cdbd2cSJim Jagielski //	if ( rRect.Right()  > rVisible.Right()+1 )  rRect.Right()  = rVisible.Right()+1;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski 	// #51122# auch wenn das inner-Rectangle nicht sichtbar ist, muss evtl.
89*b1cdbd2cSJim Jagielski 	// die Titelzeile gezeichnet werden, darum kein Rueckgabewert mehr.
90*b1cdbd2cSJim Jagielski 	// Wenn's weit daneben liegt, wird lcl_DrawOneFrame erst gar nicht gerufen.
91*b1cdbd2cSJim Jagielski }
92*b1cdbd2cSJim Jagielski 
lcl_DrawOneFrame(OutputDevice * pDev,const Rectangle & rInnerPixel,const String & rTitle,const Color & rColor,sal_Bool bTextBelow,double nPPTX,double nPPTY,const Fraction & rZoomY,ScDocument * pDoc,ScViewData * pButtonViewData,sal_Bool bLayoutRTL)93*b1cdbd2cSJim Jagielski void lcl_DrawOneFrame( OutputDevice* pDev, const Rectangle& rInnerPixel,
94*b1cdbd2cSJim Jagielski 						const String& rTitle, const Color& rColor, sal_Bool bTextBelow,
95*b1cdbd2cSJim Jagielski 						double nPPTX, double nPPTY, const Fraction& rZoomY,
96*b1cdbd2cSJim Jagielski 						ScDocument* pDoc, ScViewData* pButtonViewData, sal_Bool bLayoutRTL )
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski 	//	pButtonViewData wird nur benutzt, um die Button-Groesse zu setzen,
99*b1cdbd2cSJim Jagielski 	//	darf ansonsten NULL sein!
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 	Rectangle aInner = rInnerPixel;
102*b1cdbd2cSJim Jagielski 	if ( bLayoutRTL )
103*b1cdbd2cSJim Jagielski 	{
104*b1cdbd2cSJim Jagielski 		aInner.Left() = rInnerPixel.Right();
105*b1cdbd2cSJim Jagielski 		aInner.Right() = rInnerPixel.Left();
106*b1cdbd2cSJim Jagielski 	}
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski 	Rectangle aVisible( Point(0,0), pDev->GetOutputSizePixel() );
109*b1cdbd2cSJim Jagielski 	lcl_LimitRect( aInner, aVisible );
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 	Rectangle aOuter = aInner;
112*b1cdbd2cSJim Jagielski 	long nHor = (long) ( SC_SCENARIO_HSPACE * nPPTX );
113*b1cdbd2cSJim Jagielski 	long nVer = (long) ( SC_SCENARIO_VSPACE * nPPTY );
114*b1cdbd2cSJim Jagielski 	aOuter.Left()	-= nHor;
115*b1cdbd2cSJim Jagielski 	aOuter.Right()	+= nHor;
116*b1cdbd2cSJim Jagielski 	aOuter.Top()	-= nVer;
117*b1cdbd2cSJim Jagielski 	aOuter.Bottom()	+= nVer;
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 	//	use ScPatternAttr::GetFont only for font size
120*b1cdbd2cSJim Jagielski 	Font aAttrFont;
121*b1cdbd2cSJim Jagielski 	((const ScPatternAttr&)pDoc->GetPool()->GetDefaultItem(ATTR_PATTERN)).
122*b1cdbd2cSJim Jagielski 									GetFont(aAttrFont,SC_AUTOCOL_BLACK,pDev,&rZoomY);
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski 	//	everything else from application font
125*b1cdbd2cSJim Jagielski 	Font aAppFont = pDev->GetSettings().GetStyleSettings().GetAppFont();
126*b1cdbd2cSJim Jagielski 	aAppFont.SetSize( aAttrFont.GetSize() );
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski 	aAppFont.SetAlign( ALIGN_TOP );
129*b1cdbd2cSJim Jagielski 	pDev->SetFont( aAppFont );
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 	Size aTextSize( pDev->GetTextWidth( rTitle ), pDev->GetTextHeight() );
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 	if ( bTextBelow )
134*b1cdbd2cSJim Jagielski 		aOuter.Bottom() += aTextSize.Height();
135*b1cdbd2cSJim Jagielski 	else
136*b1cdbd2cSJim Jagielski 		aOuter.Top()    -= aTextSize.Height();
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski 	pDev->SetLineColor();
139*b1cdbd2cSJim Jagielski 	pDev->SetFillColor( rColor );
140*b1cdbd2cSJim Jagielski 	//	links, oben, rechts, unten
141*b1cdbd2cSJim Jagielski 	pDev->DrawRect( Rectangle( aOuter.Left(),  aOuter.Top(),    aInner.Left(),  aOuter.Bottom() ) );
142*b1cdbd2cSJim Jagielski 	pDev->DrawRect( Rectangle( aOuter.Left(),  aOuter.Top(),    aOuter.Right(), aInner.Top()    ) );
143*b1cdbd2cSJim Jagielski 	pDev->DrawRect( Rectangle( aInner.Right(), aOuter.Top(),    aOuter.Right(), aOuter.Bottom() ) );
144*b1cdbd2cSJim Jagielski 	pDev->DrawRect( Rectangle( aOuter.Left(),  aInner.Bottom(), aOuter.Right(), aOuter.Bottom() ) );
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 	long nButtonY = bTextBelow ? aInner.Bottom() : aOuter.Top();
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 	ScDDComboBoxButton aComboButton((Window*)pDev);
149*b1cdbd2cSJim Jagielski 	aComboButton.SetOptSizePixel();
150*b1cdbd2cSJim Jagielski 	long nBWidth  = ( aComboButton.GetSizePixel().Width() * rZoomY.GetNumerator() )
151*b1cdbd2cSJim Jagielski 						/ rZoomY.GetDenominator();
152*b1cdbd2cSJim Jagielski 	long nBHeight = nVer + aTextSize.Height() + 1;
153*b1cdbd2cSJim Jagielski 	Size aButSize( nBWidth, nBHeight );
154*b1cdbd2cSJim Jagielski     long nButtonPos = bLayoutRTL ? aOuter.Left() : aOuter.Right()-nBWidth+1;
155*b1cdbd2cSJim Jagielski     aComboButton.Draw( Point(nButtonPos, nButtonY), aButSize, sal_False );
156*b1cdbd2cSJim Jagielski 	if (pButtonViewData)
157*b1cdbd2cSJim Jagielski 		pButtonViewData->SetScenButSize( aButSize );
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 	long nTextStart = bLayoutRTL ? aInner.Right() - aTextSize.Width() + 1 : aInner.Left();
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 	sal_Bool bWasClip = sal_False;
162*b1cdbd2cSJim Jagielski 	Region aOldClip;
163*b1cdbd2cSJim Jagielski 	sal_Bool bClip = ( aTextSize.Width() > aOuter.Right() - nBWidth - aInner.Left() );
164*b1cdbd2cSJim Jagielski 	if ( bClip )
165*b1cdbd2cSJim Jagielski 	{
166*b1cdbd2cSJim Jagielski 		if (pDev->IsClipRegion())
167*b1cdbd2cSJim Jagielski 		{
168*b1cdbd2cSJim Jagielski 			bWasClip = sal_True;
169*b1cdbd2cSJim Jagielski 			aOldClip = pDev->GetActiveClipRegion();
170*b1cdbd2cSJim Jagielski 		}
171*b1cdbd2cSJim Jagielski 		long nClipStartX = bLayoutRTL ? aOuter.Left() + nBWidth : aInner.Left();
172*b1cdbd2cSJim Jagielski 		long nClipEndX = bLayoutRTL ? aInner.Right() : aOuter.Right() - nBWidth;
173*b1cdbd2cSJim Jagielski 		pDev->SetClipRegion( Rectangle( nClipStartX, nButtonY + nVer/2,
174*b1cdbd2cSJim Jagielski 								nClipEndX, nButtonY + nVer/2 + aTextSize.Height() ) );
175*b1cdbd2cSJim Jagielski 	}
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 	pDev->DrawText( Point( nTextStart, nButtonY + nVer/2 ), rTitle );
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 	if ( bClip )
180*b1cdbd2cSJim Jagielski 	{
181*b1cdbd2cSJim Jagielski 		if ( bWasClip )
182*b1cdbd2cSJim Jagielski 			pDev->SetClipRegion(aOldClip);
183*b1cdbd2cSJim Jagielski 		else
184*b1cdbd2cSJim Jagielski 			pDev->SetClipRegion();
185*b1cdbd2cSJim Jagielski 	}
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 	pDev->SetFillColor();
188*b1cdbd2cSJim Jagielski 	pDev->SetLineColor( COL_BLACK );
189*b1cdbd2cSJim Jagielski 	pDev->DrawRect( aInner );
190*b1cdbd2cSJim Jagielski 	pDev->DrawRect( aOuter );
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski 
lcl_DrawScenarioFrames(OutputDevice * pDev,ScViewData * pViewData,ScSplitPos eWhich,SCCOL nX1,SCROW nY1,SCCOL nX2,SCROW nY2)193*b1cdbd2cSJim Jagielski void lcl_DrawScenarioFrames( OutputDevice* pDev, ScViewData* pViewData, ScSplitPos eWhich,
194*b1cdbd2cSJim Jagielski 							SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2 )
195*b1cdbd2cSJim Jagielski {
196*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pViewData->GetDocument();
197*b1cdbd2cSJim Jagielski 	SCTAB nTab = pViewData->GetTabNo();
198*b1cdbd2cSJim Jagielski 	SCTAB nTabCount = pDoc->GetTableCount();
199*b1cdbd2cSJim Jagielski 	if ( nTab+1<nTabCount && pDoc->IsScenario(nTab+1) && !pDoc->IsScenario(nTab) )
200*b1cdbd2cSJim Jagielski 	{
201*b1cdbd2cSJim Jagielski 		if ( nX1 > 0 ) --nX1;
202*b1cdbd2cSJim Jagielski 		if ( nY1>=2 ) nY1 -= 2;				// Hack: Titelzeile beruehrt zwei Zellen
203*b1cdbd2cSJim Jagielski 		else if ( nY1 > 0 ) --nY1;
204*b1cdbd2cSJim Jagielski 		if ( nX2 < MAXCOL ) ++nX2;
205*b1cdbd2cSJim Jagielski 		if ( nY2 < MAXROW-1 ) nY2 += 2;		// Hack: Titelzeile beruehrt zwei Zellen
206*b1cdbd2cSJim Jagielski 		else if ( nY2 < MAXROW ) ++nY2;
207*b1cdbd2cSJim Jagielski 		ScRange aViewRange( nX1,nY1,nTab, nX2,nY2,nTab );
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 		//!	Ranges an der Table cachen!!!!
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 		ScMarkData aMarks;
212*b1cdbd2cSJim Jagielski 		for (SCTAB i=nTab+1; i<nTabCount && pDoc->IsScenario(i); i++)
213*b1cdbd2cSJim Jagielski 			pDoc->MarkScenario( i, nTab, aMarks, sal_False, SC_SCENARIO_SHOWFRAME );
214*b1cdbd2cSJim Jagielski 		ScRangeListRef xRanges = new ScRangeList;
215*b1cdbd2cSJim Jagielski 		aMarks.FillRangeListWithMarks( xRanges, sal_False );
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 		sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
218*b1cdbd2cSJim Jagielski 		long nLayoutSign = bLayoutRTL ? -1 : 1;
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 		sal_uInt16 nRangeCount = (sal_uInt16)xRanges->Count();
221*b1cdbd2cSJim Jagielski 		for (sal_uInt16 j=0; j<nRangeCount; j++)
222*b1cdbd2cSJim Jagielski 		{
223*b1cdbd2cSJim Jagielski 			ScRange aRange = *xRanges->GetObject(j);
224*b1cdbd2cSJim Jagielski 			//	Szenario-Rahmen immer dann auf zusammengefasste Zellen erweitern, wenn
225*b1cdbd2cSJim Jagielski 			//	dadurch keine neuen nicht-ueberdeckten Zellen mit umrandet werden
226*b1cdbd2cSJim Jagielski 			pDoc->ExtendTotalMerge( aRange );
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 			//!	-> Repaint beim Zusammenfassen erweitern !!!
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski 			if ( aRange.Intersects( aViewRange ) )			//! Platz fuer Text/Button?
231*b1cdbd2cSJim Jagielski 			{
232*b1cdbd2cSJim Jagielski 				Point aStartPos = pViewData->GetScrPos(
233*b1cdbd2cSJim Jagielski 									aRange.aStart.Col(), aRange.aStart.Row(), eWhich, sal_True );
234*b1cdbd2cSJim Jagielski 				Point aEndPos = pViewData->GetScrPos(
235*b1cdbd2cSJim Jagielski 									aRange.aEnd.Col()+1, aRange.aEnd.Row()+1, eWhich, sal_True );
236*b1cdbd2cSJim Jagielski 				//	on the grid:
237*b1cdbd2cSJim Jagielski 				aStartPos.X() -= nLayoutSign;
238*b1cdbd2cSJim Jagielski 				aStartPos.Y() -= 1;
239*b1cdbd2cSJim Jagielski 				aEndPos.X() -= nLayoutSign;
240*b1cdbd2cSJim Jagielski 				aEndPos.Y() -= 1;
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 				sal_Bool bTextBelow = ( aRange.aStart.Row() == 0 );
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 				String aCurrent;
245*b1cdbd2cSJim Jagielski 				Color aColor( COL_LIGHTGRAY );
246*b1cdbd2cSJim Jagielski 				for (SCTAB nAct=nTab+1; nAct<nTabCount && pDoc->IsScenario(nAct); nAct++)
247*b1cdbd2cSJim Jagielski 					if ( pDoc->IsActiveScenario(nAct) && pDoc->HasScenarioRange(nAct,aRange) )
248*b1cdbd2cSJim Jagielski 					{
249*b1cdbd2cSJim Jagielski 						String aDummyComment;
250*b1cdbd2cSJim Jagielski 						sal_uInt16 nDummyFlags;
251*b1cdbd2cSJim Jagielski 						pDoc->GetName( nAct, aCurrent );
252*b1cdbd2cSJim Jagielski 						pDoc->GetScenarioData( nAct, aDummyComment, aColor, nDummyFlags );
253*b1cdbd2cSJim Jagielski 					}
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 				if (!aCurrent.Len())
256*b1cdbd2cSJim Jagielski 					aCurrent = ScGlobal::GetRscString( STR_EMPTYDATA );
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski 				//!	eigener Text "(keins)" statt "(leer)" ???
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski 				lcl_DrawOneFrame( pDev, Rectangle( aStartPos, aEndPos ),
261*b1cdbd2cSJim Jagielski 									aCurrent, aColor, bTextBelow,
262*b1cdbd2cSJim Jagielski 									pViewData->GetPPTX(), pViewData->GetPPTY(), pViewData->GetZoomY(),
263*b1cdbd2cSJim Jagielski 									pDoc, pViewData, bLayoutRTL );
264*b1cdbd2cSJim Jagielski 			}
265*b1cdbd2cSJim Jagielski 		}
266*b1cdbd2cSJim Jagielski 	}
267*b1cdbd2cSJim Jagielski }
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
270*b1cdbd2cSJim Jagielski 
lcl_DrawHighlight(ScOutputData & rOutputData,ScViewData * pViewData,ScHighlightRanges & rHighlightRanges)271*b1cdbd2cSJim Jagielski void lcl_DrawHighlight( ScOutputData& rOutputData, ScViewData* pViewData,
272*b1cdbd2cSJim Jagielski 						ScHighlightRanges& rHighlightRanges )
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski 	SCTAB nTab = pViewData->GetTabNo();
275*b1cdbd2cSJim Jagielski 	sal_uLong nCount = rHighlightRanges.Count();
276*b1cdbd2cSJim Jagielski 	for (sal_uLong i=0; i<nCount; i++)
277*b1cdbd2cSJim Jagielski 	{
278*b1cdbd2cSJim Jagielski 		ScHighlightEntry* pEntry = rHighlightRanges.GetObject( i );
279*b1cdbd2cSJim Jagielski 		if (pEntry)
280*b1cdbd2cSJim Jagielski 		{
281*b1cdbd2cSJim Jagielski 			ScRange aRange = pEntry->aRef;
282*b1cdbd2cSJim Jagielski 			if ( nTab >= aRange.aStart.Tab() && nTab <= aRange.aEnd.Tab() )
283*b1cdbd2cSJim Jagielski 			{
284*b1cdbd2cSJim Jagielski 				rOutputData.DrawRefMark(
285*b1cdbd2cSJim Jagielski 									aRange.aStart.Col(), aRange.aStart.Row(),
286*b1cdbd2cSJim Jagielski 									aRange.aEnd.Col(), aRange.aEnd.Row(),
287*b1cdbd2cSJim Jagielski 									pEntry->aColor, sal_False );
288*b1cdbd2cSJim Jagielski 			}
289*b1cdbd2cSJim Jagielski 		}
290*b1cdbd2cSJim Jagielski 	}
291*b1cdbd2cSJim Jagielski }
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
294*b1cdbd2cSJim Jagielski 
DoInvertRect(const Rectangle & rPixel)295*b1cdbd2cSJim Jagielski void ScGridWindow::DoInvertRect( const Rectangle& rPixel )
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski //	Invert( PixelToLogic(rPixel) );
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski 	if ( rPixel == aInvertRect )
300*b1cdbd2cSJim Jagielski 		aInvertRect = Rectangle();		// aufheben
301*b1cdbd2cSJim Jagielski 	else
302*b1cdbd2cSJim Jagielski 	{
303*b1cdbd2cSJim Jagielski 		DBG_ASSERT( aInvertRect.IsEmpty(), "DoInvertRect nicht paarig" );
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 		aInvertRect = rPixel;			// neues Rechteck merken
306*b1cdbd2cSJim Jagielski 	}
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski     UpdateHeaderOverlay();      // uses aInvertRect
309*b1cdbd2cSJim Jagielski }
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
312*b1cdbd2cSJim Jagielski 
PrePaint()313*b1cdbd2cSJim Jagielski void __EXPORT ScGridWindow::PrePaint()
314*b1cdbd2cSJim Jagielski {
315*b1cdbd2cSJim Jagielski 	// forward PrePaint to DrawingLayer
316*b1cdbd2cSJim Jagielski 	ScTabViewShell* pTabViewShell = pViewData->GetViewShell();
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski 	if(pTabViewShell)
319*b1cdbd2cSJim Jagielski 	{
320*b1cdbd2cSJim Jagielski 		SdrView* pDrawView = pTabViewShell->GetSdrView();
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski 		if(pDrawView)
323*b1cdbd2cSJim Jagielski 		{
324*b1cdbd2cSJim Jagielski             pDrawView->PrePaint();
325*b1cdbd2cSJim Jagielski         }
326*b1cdbd2cSJim Jagielski     }
327*b1cdbd2cSJim Jagielski }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
330*b1cdbd2cSJim Jagielski 
Paint(const Rectangle & rRect)331*b1cdbd2cSJim Jagielski void __EXPORT ScGridWindow::Paint( const Rectangle& rRect )
332*b1cdbd2cSJim Jagielski {
333*b1cdbd2cSJim Jagielski     //TODO/LATER: how to get environment? Do we need that?!
334*b1cdbd2cSJim Jagielski     /*
335*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = pViewData->GetDocShell();
336*b1cdbd2cSJim Jagielski 	SvInPlaceEnvironment* pEnv = pDocSh->GetIPEnv();
337*b1cdbd2cSJim Jagielski 	if (pEnv && pEnv->GetRectsChangedLockCount())
338*b1cdbd2cSJim Jagielski 	{
339*b1cdbd2cSJim Jagielski 		Invalidate(rRect);
340*b1cdbd2cSJim Jagielski 		return;
341*b1cdbd2cSJim Jagielski     }*/
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pViewData->GetDocument();
344*b1cdbd2cSJim Jagielski 	if ( pDoc->IsInInterpreter() )
345*b1cdbd2cSJim Jagielski 	{
346*b1cdbd2cSJim Jagielski 		//	via Reschedule, interpretierende Zellen nicht nochmal anstossen
347*b1cdbd2cSJim Jagielski 		//	hier kein Invalidate, sonst kommt z.B. eine Error-Box nie an die Reihe
348*b1cdbd2cSJim Jagielski 		//	(Bug 36381). Durch bNeedsRepaint wird spaeter alles nochmal gemalt.
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski 		if ( bNeedsRepaint )
351*b1cdbd2cSJim Jagielski 		{
352*b1cdbd2cSJim Jagielski 			//!	Rechtecke zusammenfassen?
353*b1cdbd2cSJim Jagielski 			aRepaintPixel = Rectangle();			// mehrfach -> alles painten
354*b1cdbd2cSJim Jagielski 		}
355*b1cdbd2cSJim Jagielski 		else
356*b1cdbd2cSJim Jagielski 		{
357*b1cdbd2cSJim Jagielski 			bNeedsRepaint = sal_True;
358*b1cdbd2cSJim Jagielski 			aRepaintPixel = LogicToPixel(rRect);	// nur betroffenen Bereich
359*b1cdbd2cSJim Jagielski 		}
360*b1cdbd2cSJim Jagielski 		return;
361*b1cdbd2cSJim Jagielski 	}
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski     // #i117893# If GetSizePixel needs to call the resize handler, the resulting nested Paint call
364*b1cdbd2cSJim Jagielski     // (possibly for a larger rectangle) has to be allowed. Call GetSizePixel before setting bIsInPaint.
365*b1cdbd2cSJim Jagielski     GetSizePixel();
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 	if (bIsInPaint)
368*b1cdbd2cSJim Jagielski 		return;
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski 	bIsInPaint = sal_True;
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski 	Rectangle aPixRect = LogicToPixel( rRect );
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 	SCCOL nX1 = pViewData->GetPosX(eHWhich);
375*b1cdbd2cSJim Jagielski 	SCROW nY1 = pViewData->GetPosY(eVWhich);
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski 	SCTAB nTab = pViewData->GetTabNo();
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski 	double nPPTX = pViewData->GetPPTX();
380*b1cdbd2cSJim Jagielski 	double nPPTY = pViewData->GetPPTY();
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 	Rectangle aMirroredPixel = aPixRect;
383*b1cdbd2cSJim Jagielski 	if ( pDoc->IsLayoutRTL( nTab ) )
384*b1cdbd2cSJim Jagielski 	{
385*b1cdbd2cSJim Jagielski 		//	mirror and swap
386*b1cdbd2cSJim Jagielski 		long nWidth = GetSizePixel().Width();
387*b1cdbd2cSJim Jagielski 		aMirroredPixel.Left()  = nWidth - 1 - aPixRect.Right();
388*b1cdbd2cSJim Jagielski 		aMirroredPixel.Right() = nWidth - 1 - aPixRect.Left();
389*b1cdbd2cSJim Jagielski 	}
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski 	long nScrX = ScViewData::ToPixel( pDoc->GetColWidth( nX1, nTab ), nPPTX );
392*b1cdbd2cSJim Jagielski 	while ( nScrX <= aMirroredPixel.Left() && nX1 < MAXCOL )
393*b1cdbd2cSJim Jagielski 	{
394*b1cdbd2cSJim Jagielski 		++nX1;
395*b1cdbd2cSJim Jagielski 		nScrX += ScViewData::ToPixel( pDoc->GetColWidth( nX1, nTab ), nPPTX );
396*b1cdbd2cSJim Jagielski 	}
397*b1cdbd2cSJim Jagielski 	SCCOL nX2 = nX1;
398*b1cdbd2cSJim Jagielski 	while ( nScrX <= aMirroredPixel.Right() && nX2 < MAXCOL )
399*b1cdbd2cSJim Jagielski 	{
400*b1cdbd2cSJim Jagielski 		++nX2;
401*b1cdbd2cSJim Jagielski 		nScrX += ScViewData::ToPixel( pDoc->GetColWidth( nX2, nTab ), nPPTX );
402*b1cdbd2cSJim Jagielski 	}
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski 	long nScrY = 0;
405*b1cdbd2cSJim Jagielski     ScViewData::AddPixelsWhile( nScrY, aPixRect.Top(), nY1, MAXROW, nPPTY, pDoc, nTab);
406*b1cdbd2cSJim Jagielski 	SCROW nY2 = nY1;
407*b1cdbd2cSJim Jagielski     if (nScrY <= aPixRect.Bottom() && nY2 < MAXROW)
408*b1cdbd2cSJim Jagielski     {
409*b1cdbd2cSJim Jagielski         ++nY2;
410*b1cdbd2cSJim Jagielski         ScViewData::AddPixelsWhile( nScrY, aPixRect.Bottom(), nY2, MAXROW, nPPTY, pDoc, nTab);
411*b1cdbd2cSJim Jagielski     }
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski 	Draw( nX1,nY1,nX2,nY2, SC_UPDATE_MARKS );			// nicht weiterzeichnen
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 	bIsInPaint = sal_False;
416*b1cdbd2cSJim Jagielski }
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski //
419*b1cdbd2cSJim Jagielski // 	Draw  ----------------------------------------------------------------
420*b1cdbd2cSJim Jagielski //
421*b1cdbd2cSJim Jagielski 
Draw(SCCOL nX1,SCROW nY1,SCCOL nX2,SCROW nY2,ScUpdateMode eMode)422*b1cdbd2cSJim Jagielski void ScGridWindow::Draw( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, ScUpdateMode eMode )
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski 	ScModule* pScMod = SC_MOD();
425*b1cdbd2cSJim Jagielski 	sal_Bool bTextWysiwyg = pScMod->GetInputOptions().GetTextWysiwyg();
426*b1cdbd2cSJim Jagielski 	sal_Bool bGridFirst = sal_True;		//! entscheiden!!!
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski 	if (pViewData->IsMinimized())
429*b1cdbd2cSJim Jagielski 		return;
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 	PutInOrder( nX1, nX2 );
432*b1cdbd2cSJim Jagielski 	PutInOrder( nY1, nY2 );
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski 	DBG_ASSERT( ValidCol(nX2) && ValidRow(nY2), "GridWin Draw Bereich zu gross" );
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski 	SCCOL nPosX = pViewData->GetPosX( eHWhich );
437*b1cdbd2cSJim Jagielski 	SCROW nPosY = pViewData->GetPosY( eVWhich );
438*b1cdbd2cSJim Jagielski 	if (nX2 < nPosX || nY2 < nPosY)
439*b1cdbd2cSJim Jagielski 		return;											// unsichtbar
440*b1cdbd2cSJim Jagielski 	if (nX1 < nPosX) nX1 = nPosX;
441*b1cdbd2cSJim Jagielski 	if (nY1 < nPosY) nY1 = nPosY;
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 	SCCOL nXRight = nPosX + pViewData->VisibleCellsX(eHWhich);
444*b1cdbd2cSJim Jagielski 	if (nXRight > MAXCOL) nXRight = MAXCOL;
445*b1cdbd2cSJim Jagielski 	SCROW nYBottom = nPosY + pViewData->VisibleCellsY(eVWhich);
446*b1cdbd2cSJim Jagielski 	if (nYBottom > MAXROW) nYBottom = MAXROW;
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski     // Store the current visible range.
449*b1cdbd2cSJim Jagielski     maVisibleRange.mnCol1 = nPosX;
450*b1cdbd2cSJim Jagielski     maVisibleRange.mnCol2 = nXRight;
451*b1cdbd2cSJim Jagielski     maVisibleRange.mnRow1 = nPosY;
452*b1cdbd2cSJim Jagielski     maVisibleRange.mnRow2 = nYBottom;
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski 	if (nX1 > nXRight || nY1 > nYBottom)
455*b1cdbd2cSJim Jagielski 		return;											// unsichtbar
456*b1cdbd2cSJim Jagielski 	if (nX2 > nXRight) nX2 = nXRight;
457*b1cdbd2cSJim Jagielski 	if (nY2 > nYBottom) nY2 = nYBottom;
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski 	if ( eMode != SC_UPDATE_MARKS )
460*b1cdbd2cSJim Jagielski 		if (nX2 < nXRight)
461*b1cdbd2cSJim Jagielski 			nX2 = nXRight;								// zum Weiterzeichnen
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski 		//	ab hier kein return mehr
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski 	++nPaintCount;					// merken, dass gemalt wird (wichtig beim Invertieren)
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = pViewData->GetDocShell();
468*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pDocSh->GetDocument();
469*b1cdbd2cSJim Jagielski 	SCTAB nTab = pViewData->GetTabNo();
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski 	pDoc->ExtendHidden( nX1, nY1, nX2, nY2, nTab );
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski 	Point aScrPos = pViewData->GetScrPos( nX1, nY1, eWhich );
474*b1cdbd2cSJim Jagielski 	long nMirrorWidth = GetSizePixel().Width();
475*b1cdbd2cSJim Jagielski 	sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
476*b1cdbd2cSJim Jagielski 	long nLayoutSign = bLayoutRTL ? -1 : 1;
477*b1cdbd2cSJim Jagielski 	if ( bLayoutRTL )
478*b1cdbd2cSJim Jagielski 	{
479*b1cdbd2cSJim Jagielski 		long nEndPixel = pViewData->GetScrPos( nX2+1, nPosY, eWhich ).X();
480*b1cdbd2cSJim Jagielski 		nMirrorWidth = aScrPos.X() - nEndPixel;
481*b1cdbd2cSJim Jagielski 		aScrPos.X() = nEndPixel + 1;
482*b1cdbd2cSJim Jagielski 	}
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski 	long nScrX = aScrPos.X();
485*b1cdbd2cSJim Jagielski 	long nScrY = aScrPos.Y();
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 	SCCOL nCurX = pViewData->GetCurX();
488*b1cdbd2cSJim Jagielski 	SCROW nCurY = pViewData->GetCurY();
489*b1cdbd2cSJim Jagielski 	SCCOL nCurEndX = nCurX;
490*b1cdbd2cSJim Jagielski 	SCROW nCurEndY = nCurY;
491*b1cdbd2cSJim Jagielski 	pDoc->ExtendMerge( nCurX, nCurY, nCurEndX, nCurEndY, nTab );
492*b1cdbd2cSJim Jagielski 	sal_Bool bCurVis = nCursorHideCount==0 &&
493*b1cdbd2cSJim Jagielski 					( nCurEndX+1 >= nX1 && nCurX <= nX2+1 && nCurEndY+1 >= nY1 && nCurY <= nY2+1 );
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 	//	AutoFill-Anfasser
496*b1cdbd2cSJim Jagielski 	if ( !bCurVis && nCursorHideCount==0 && bAutoMarkVisible && aAutoMarkPos.Tab() == nTab &&
497*b1cdbd2cSJim Jagielski 			( aAutoMarkPos.Col() != nCurX || aAutoMarkPos.Row() != nCurY ) )
498*b1cdbd2cSJim Jagielski 	{
499*b1cdbd2cSJim Jagielski 		SCCOL nHdlX = aAutoMarkPos.Col();
500*b1cdbd2cSJim Jagielski 		SCROW nHdlY = aAutoMarkPos.Row();
501*b1cdbd2cSJim Jagielski 		pDoc->ExtendMerge( nHdlX, nHdlY, nHdlX, nHdlY, nTab );
502*b1cdbd2cSJim Jagielski 		bCurVis = ( nHdlX+1 >= nX1 && nHdlX <= nX2 && nHdlY+1 >= nY1 && nHdlY <= nY2 );
503*b1cdbd2cSJim Jagielski 		//	links und oben ist nicht betroffen
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski 		//!	AutoFill-Anfasser alleine (ohne Cursor) zeichnen ???
506*b1cdbd2cSJim Jagielski 	}
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski 	double nPPTX = pViewData->GetPPTX();
509*b1cdbd2cSJim Jagielski 	double nPPTY = pViewData->GetPPTY();
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski 	const ScViewOptions& rOpts = pViewData->GetOptions();
512*b1cdbd2cSJim Jagielski 	sal_Bool bFormulaMode = rOpts.GetOption( VOPT_FORMULAS );
513*b1cdbd2cSJim Jagielski 	sal_Bool bMarkClipped = rOpts.GetOption( VOPT_CLIPMARKS );
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski 		// Datenblock
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski     ScTableInfo aTabInfo;
518*b1cdbd2cSJim Jagielski     pDoc->FillInfo( aTabInfo, nX1, nY1, nX2, nY2, nTab,
519*b1cdbd2cSJim Jagielski 										nPPTX, nPPTY, sal_False, bFormulaMode,
520*b1cdbd2cSJim Jagielski 										&pViewData->GetMarkData() );
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski 	Fraction aZoomX = pViewData->GetZoomX();
525*b1cdbd2cSJim Jagielski 	Fraction aZoomY = pViewData->GetZoomY();
526*b1cdbd2cSJim Jagielski     ScOutputData aOutputData( this, OUTTYPE_WINDOW, aTabInfo, pDoc, nTab,
527*b1cdbd2cSJim Jagielski 								nScrX, nScrY, nX1, nY1, nX2, nY2, nPPTX, nPPTY,
528*b1cdbd2cSJim Jagielski 								&aZoomX, &aZoomY );
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski 	aOutputData.SetMirrorWidth( nMirrorWidth );			// needed for RTL
531*b1cdbd2cSJim Jagielski 
532*b1cdbd2cSJim Jagielski     std::auto_ptr< VirtualDevice > xFmtVirtDev;
533*b1cdbd2cSJim Jagielski     sal_Bool bLogicText = bTextWysiwyg;                     // call DrawStrings in logic MapMode?
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski 	if ( bTextWysiwyg )
536*b1cdbd2cSJim Jagielski 	{
537*b1cdbd2cSJim Jagielski 		//	use printer for text formatting
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski 		OutputDevice* pFmtDev = pDoc->GetPrinter();
540*b1cdbd2cSJim Jagielski 		pFmtDev->SetMapMode( pViewData->GetLogicMode(eWhich) );
541*b1cdbd2cSJim Jagielski 		aOutputData.SetFmtDevice( pFmtDev );
542*b1cdbd2cSJim Jagielski 	}
543*b1cdbd2cSJim Jagielski     else if ( aZoomX != aZoomY && pViewData->IsOle() )
544*b1cdbd2cSJim Jagielski     {
545*b1cdbd2cSJim Jagielski         //  #i45033# For OLE inplace editing with different zoom factors,
546*b1cdbd2cSJim Jagielski         //  use a virtual device with 1/100th mm as text formatting reference
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski         xFmtVirtDev.reset( new VirtualDevice );
549*b1cdbd2cSJim Jagielski         xFmtVirtDev->SetMapMode( MAP_100TH_MM );
550*b1cdbd2cSJim Jagielski         aOutputData.SetFmtDevice( xFmtVirtDev.get() );
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski         bLogicText = sal_True;                      // use logic MapMode
553*b1cdbd2cSJim Jagielski     }
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski     const svtools::ColorConfig& rColorCfg = pScMod->GetColorConfig();
556*b1cdbd2cSJim Jagielski     Color aGridColor( rColorCfg.GetColorValue( svtools::CALCGRID, sal_False ).nColor );
557*b1cdbd2cSJim Jagielski 	if ( aGridColor.GetColor() == COL_TRANSPARENT )
558*b1cdbd2cSJim Jagielski 	{
559*b1cdbd2cSJim Jagielski 		//	use view options' grid color only if color config has "automatic" color
560*b1cdbd2cSJim Jagielski 		aGridColor = rOpts.GetGridColor();
561*b1cdbd2cSJim Jagielski 	}
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 	aOutputData.SetSyntaxMode		( pViewData->IsSyntaxMode() );
564*b1cdbd2cSJim Jagielski 	aOutputData.SetGridColor		( aGridColor );
565*b1cdbd2cSJim Jagielski 	aOutputData.SetShowNullValues	( rOpts.GetOption( VOPT_NULLVALS ) );
566*b1cdbd2cSJim Jagielski 	aOutputData.SetShowFormulas		( bFormulaMode );
567*b1cdbd2cSJim Jagielski     aOutputData.SetShowSpellErrors  ( pDoc->GetDocOptions().IsAutoSpell() );
568*b1cdbd2cSJim Jagielski 	aOutputData.SetMarkClipped		( bMarkClipped );
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski 	aOutputData.SetUseStyleColor( sal_True );		// always set in table view
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski 	aOutputData.SetEditObject( GetEditObject() );
573*b1cdbd2cSJim Jagielski 	aOutputData.SetViewShell( pViewData->GetViewShell() );
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski 	sal_Bool bGrid = rOpts.GetOption( VOPT_GRID );
576*b1cdbd2cSJim Jagielski 	sal_Bool bPage = rOpts.GetOption( VOPT_PAGEBREAKS );
577*b1cdbd2cSJim Jagielski 
578*b1cdbd2cSJim Jagielski 	if ( eMode == SC_UPDATE_CHANGED )
579*b1cdbd2cSJim Jagielski 	{
580*b1cdbd2cSJim Jagielski 		aOutputData.FindChanged();
581*b1cdbd2cSJim Jagielski 		aOutputData.SetSingleGrid(sal_True);
582*b1cdbd2cSJim Jagielski 	}
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski 	sal_Bool bPageMode = pViewData->IsPagebreakMode();
585*b1cdbd2cSJim Jagielski 	if (bPageMode)										// nach FindChanged
586*b1cdbd2cSJim Jagielski 	{
587*b1cdbd2cSJim Jagielski 		// SetPagebreakMode initialisiert auch bPrinted Flags
588*b1cdbd2cSJim Jagielski 		aOutputData.SetPagebreakMode( pViewData->GetView()->GetPageBreakData() );
589*b1cdbd2cSJim Jagielski 	}
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski 	EditView*	pEditView = NULL;
592*b1cdbd2cSJim Jagielski 	sal_Bool		bEditMode = pViewData->HasEditView(eWhich);
593*b1cdbd2cSJim Jagielski 	if ( bEditMode && pViewData->GetRefTabNo() == nTab )
594*b1cdbd2cSJim Jagielski 	{
595*b1cdbd2cSJim Jagielski 		SCCOL nEditCol;
596*b1cdbd2cSJim Jagielski 		SCROW nEditRow;
597*b1cdbd2cSJim Jagielski 		pViewData->GetEditView( eWhich, pEditView, nEditCol, nEditRow );
598*b1cdbd2cSJim Jagielski 		SCCOL nEditEndCol = pViewData->GetEditEndCol();
599*b1cdbd2cSJim Jagielski 		SCROW nEditEndRow = pViewData->GetEditEndRow();
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski 		if ( nEditEndCol >= nX1 && nEditCol <= nX2 && nEditEndRow >= nY1 && nEditRow <= nY2 )
602*b1cdbd2cSJim Jagielski 			aOutputData.SetEditCell( nEditCol, nEditRow );
603*b1cdbd2cSJim Jagielski 		else
604*b1cdbd2cSJim Jagielski 			bEditMode = sal_False;
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski 		//	nur Edit-Area zu zeichnen?
607*b1cdbd2cSJim Jagielski 		//!	dann muss trotzdem noch der Rand / das Gitter gemalt werden!
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski //		if ( nEditCol <= nX1 && nEditEndCol >= nX2 && nEditRow <= nY1 && nEditEndRow >= nY2 )
610*b1cdbd2cSJim Jagielski //			bOnlyEdit = sal_True;
611*b1cdbd2cSJim Jagielski 	}
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski 	// define drawing layer map mode and paint rectangle
614*b1cdbd2cSJim Jagielski 	const MapMode aDrawMode = GetDrawMapMode();
615*b1cdbd2cSJim Jagielski 	Rectangle aDrawingRectLogic;
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski 	{
618*b1cdbd2cSJim Jagielski 		// get drawing pixel rect
619*b1cdbd2cSJim Jagielski 		Rectangle aDrawingRectPixel(Point(nScrX, nScrY), Size(aOutputData.GetScrW(), aOutputData.GetScrH()));
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski 		// correct for border (left/right)
622*b1cdbd2cSJim Jagielski 		if(MAXCOL == nX2)
623*b1cdbd2cSJim Jagielski 		{
624*b1cdbd2cSJim Jagielski 			if(bLayoutRTL)
625*b1cdbd2cSJim Jagielski 			{
626*b1cdbd2cSJim Jagielski 				aDrawingRectPixel.Left() = 0L;
627*b1cdbd2cSJim Jagielski 			}
628*b1cdbd2cSJim Jagielski 			else
629*b1cdbd2cSJim Jagielski 			{
630*b1cdbd2cSJim Jagielski 				aDrawingRectPixel.Right() = GetOutputSizePixel().getWidth();
631*b1cdbd2cSJim Jagielski 			}
632*b1cdbd2cSJim Jagielski 		}
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 		// correct for border (bottom)
635*b1cdbd2cSJim Jagielski 		if(MAXROW == nY2)
636*b1cdbd2cSJim Jagielski 		{
637*b1cdbd2cSJim Jagielski 			aDrawingRectPixel.Bottom() = GetOutputSizePixel().getHeight();
638*b1cdbd2cSJim Jagielski 		}
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski 		// get logic positions
641*b1cdbd2cSJim Jagielski 		aDrawingRectLogic = PixelToLogic(aDrawingRectPixel, aDrawMode);
642*b1cdbd2cSJim Jagielski 	}
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski // not necessary with overlay
645*b1cdbd2cSJim Jagielski //	if (bCurVis)
646*b1cdbd2cSJim Jagielski //		HideCursor();
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski     OutputDevice* pContentDev = this;       // device for document content, used by overlay manager
649*b1cdbd2cSJim Jagielski 	SdrPaintWindow* pTargetPaintWindow = 0;	// #i74769# work with SdrPaintWindow directly
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski 	{
652*b1cdbd2cSJim Jagielski 		// init redraw
653*b1cdbd2cSJim Jagielski 		ScTabViewShell* pTabViewShell = pViewData->GetViewShell();
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski 		if(pTabViewShell)
656*b1cdbd2cSJim Jagielski 		{
657*b1cdbd2cSJim Jagielski 			MapMode aCurrentMapMode(pContentDev->GetMapMode());
658*b1cdbd2cSJim Jagielski 			pContentDev->SetMapMode(aDrawMode);
659*b1cdbd2cSJim Jagielski 			SdrView* pDrawView = pTabViewShell->GetSdrView();
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski 			if(pDrawView)
662*b1cdbd2cSJim Jagielski 			{
663*b1cdbd2cSJim Jagielski 				// #i74769# Use new BeginDrawLayers() interface
664*b1cdbd2cSJim Jagielski 				Region aDrawingRegion(aDrawingRectLogic);
665*b1cdbd2cSJim Jagielski 				pTargetPaintWindow = pDrawView->BeginDrawLayers(this, aDrawingRegion);
666*b1cdbd2cSJim Jagielski 				OSL_ENSURE(pTargetPaintWindow, "BeginDrawLayers: Got no SdrPaintWindow (!)");
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski 				// #i74769# get target device from SdrPaintWindow, this may be the prerender
669*b1cdbd2cSJim Jagielski 				// device now, too.
670*b1cdbd2cSJim Jagielski 				pContentDev = &(pTargetPaintWindow->GetTargetOutputDevice());
671*b1cdbd2cSJim Jagielski                 aOutputData.SetContentDevice( pContentDev );
672*b1cdbd2cSJim Jagielski 			}
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 			pContentDev->SetMapMode(aCurrentMapMode);
675*b1cdbd2cSJim Jagielski 		}
676*b1cdbd2cSJim Jagielski 	}
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski 	//	Rand (Wiese) (Pixel)
679*b1cdbd2cSJim Jagielski 	if ( nX2==MAXCOL || nY2==MAXROW )
680*b1cdbd2cSJim Jagielski 	{
681*b1cdbd2cSJim Jagielski 		// save MapMode and set to pixel
682*b1cdbd2cSJim Jagielski 		MapMode aCurrentMapMode(pContentDev->GetMapMode());
683*b1cdbd2cSJim Jagielski 		pContentDev->SetMapMode(MAP_PIXEL);
684*b1cdbd2cSJim Jagielski 
685*b1cdbd2cSJim Jagielski 		Rectangle aPixRect = Rectangle( Point(), GetOutputSizePixel() );
686*b1cdbd2cSJim Jagielski         pContentDev->SetFillColor( rColorCfg.GetColorValue(svtools::APPBACKGROUND).nColor );
687*b1cdbd2cSJim Jagielski 		pContentDev->SetLineColor();
688*b1cdbd2cSJim Jagielski 		if ( nX2==MAXCOL )
689*b1cdbd2cSJim Jagielski 		{
690*b1cdbd2cSJim Jagielski 			Rectangle aDrawRect( aPixRect );
691*b1cdbd2cSJim Jagielski 			if ( bLayoutRTL )
692*b1cdbd2cSJim Jagielski 				aDrawRect.Right() = nScrX - 1;
693*b1cdbd2cSJim Jagielski 			else
694*b1cdbd2cSJim Jagielski 				aDrawRect.Left() = nScrX + aOutputData.GetScrW();
695*b1cdbd2cSJim Jagielski 			if (aDrawRect.Right() >= aDrawRect.Left())
696*b1cdbd2cSJim Jagielski 				pContentDev->DrawRect( aDrawRect );
697*b1cdbd2cSJim Jagielski 		}
698*b1cdbd2cSJim Jagielski 		if ( nY2==MAXROW )
699*b1cdbd2cSJim Jagielski 		{
700*b1cdbd2cSJim Jagielski 			Rectangle aDrawRect( aPixRect );
701*b1cdbd2cSJim Jagielski 			aDrawRect.Top() = nScrY + aOutputData.GetScrH();
702*b1cdbd2cSJim Jagielski 			if ( nX2==MAXCOL )
703*b1cdbd2cSJim Jagielski 			{
704*b1cdbd2cSJim Jagielski 				// no double painting of the corner
705*b1cdbd2cSJim Jagielski 				if ( bLayoutRTL )
706*b1cdbd2cSJim Jagielski 					aDrawRect.Left() = nScrX;
707*b1cdbd2cSJim Jagielski 				else
708*b1cdbd2cSJim Jagielski 					aDrawRect.Right() = nScrX + aOutputData.GetScrW() - 1;
709*b1cdbd2cSJim Jagielski 			}
710*b1cdbd2cSJim Jagielski 			if (aDrawRect.Bottom() >= aDrawRect.Top())
711*b1cdbd2cSJim Jagielski 				pContentDev->DrawRect( aDrawRect );
712*b1cdbd2cSJim Jagielski 		}
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski 		// restore MapMode
715*b1cdbd2cSJim Jagielski 		pContentDev->SetMapMode(aCurrentMapMode);
716*b1cdbd2cSJim Jagielski 	}
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski 	if ( pDoc->HasBackgroundDraw( nTab, aDrawingRectLogic ) )
719*b1cdbd2cSJim Jagielski 	{
720*b1cdbd2cSJim Jagielski 		pContentDev->SetMapMode(MAP_PIXEL);
721*b1cdbd2cSJim Jagielski 		aOutputData.DrawClear();
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski 			// Drawing Hintergrund
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski 		pContentDev->SetMapMode(aDrawMode);
726*b1cdbd2cSJim Jagielski 		DrawRedraw( aOutputData, eMode, SC_LAYER_BACK );
727*b1cdbd2cSJim Jagielski 	}
728*b1cdbd2cSJim Jagielski 	else
729*b1cdbd2cSJim Jagielski 		aOutputData.SetSolidBackground(sal_True);
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski 	pContentDev->SetMapMode(MAP_PIXEL);
732*b1cdbd2cSJim Jagielski 	aOutputData.DrawBackground();
733*b1cdbd2cSJim Jagielski 	if ( bGridFirst && ( bGrid || bPage ) )
734*b1cdbd2cSJim Jagielski 		aOutputData.DrawGrid( bGrid, bPage );
735*b1cdbd2cSJim Jagielski 	if ( bPageMode )
736*b1cdbd2cSJim Jagielski 	{
737*b1cdbd2cSJim Jagielski 		// #87655# DrawPagePreview draws complete lines/page numbers, must always be clipped
738*b1cdbd2cSJim Jagielski 		if ( aOutputData.SetChangedClip() )
739*b1cdbd2cSJim Jagielski 		{
740*b1cdbd2cSJim Jagielski             DrawPagePreview(nX1,nY1,nX2,nY2, pContentDev);
741*b1cdbd2cSJim Jagielski 			pContentDev->SetClipRegion();
742*b1cdbd2cSJim Jagielski 		}
743*b1cdbd2cSJim Jagielski 	}
744*b1cdbd2cSJim Jagielski 	aOutputData.DrawShadow();
745*b1cdbd2cSJim Jagielski 	aOutputData.DrawFrame();
746*b1cdbd2cSJim Jagielski 	if ( !bLogicText )
747*b1cdbd2cSJim Jagielski 		aOutputData.DrawStrings(sal_False);		// in pixel MapMode
748*b1cdbd2cSJim Jagielski 
749*b1cdbd2cSJim Jagielski     // edit cells and printer-metrics text must be before the buttons
750*b1cdbd2cSJim Jagielski     // (DataPilot buttons contain labels in UI font)
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski     pContentDev->SetMapMode(pViewData->GetLogicMode(eWhich));
753*b1cdbd2cSJim Jagielski     if ( bLogicText )
754*b1cdbd2cSJim Jagielski         aOutputData.DrawStrings(sal_True);      // in logic MapMode if bTextWysiwyg is set
755*b1cdbd2cSJim Jagielski     aOutputData.DrawEdit(sal_True);
756*b1cdbd2cSJim Jagielski     pContentDev->SetMapMode(MAP_PIXEL);
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski 		// Autofilter- und Pivot-Buttons
759*b1cdbd2cSJim Jagielski 
760*b1cdbd2cSJim Jagielski     DrawButtons( nX1, nY1, nX2, nY2, aTabInfo, pContentDev );          // Pixel
761*b1cdbd2cSJim Jagielski 
762*b1cdbd2cSJim Jagielski 		// Notiz-Anzeiger
763*b1cdbd2cSJim Jagielski 
764*b1cdbd2cSJim Jagielski 	if ( rOpts.GetOption( VOPT_NOTES ) )
765*b1cdbd2cSJim Jagielski 		aOutputData.DrawNoteMarks();
766*b1cdbd2cSJim Jagielski 
767*b1cdbd2cSJim Jagielski 	if ( !bGridFirst && ( bGrid || bPage ) )
768*b1cdbd2cSJim Jagielski 	{
769*b1cdbd2cSJim Jagielski 		aOutputData.DrawGrid( bGrid, bPage );
770*b1cdbd2cSJim Jagielski 	}
771*b1cdbd2cSJim Jagielski 	aOutputData.DrawClipMarks();
772*b1cdbd2cSJim Jagielski 
773*b1cdbd2cSJim Jagielski 	//	Szenario / ChangeTracking muss auf jeden Fall nach DrawGrid sein, auch bei !bGridFirst
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 	//!	Test, ob ChangeTrack-Anzeige aktiv ist
776*b1cdbd2cSJim Jagielski 	//!	Szenario-Rahmen per View-Optionen abschaltbar?
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski 	SCTAB nTabCount = pDoc->GetTableCount();
779*b1cdbd2cSJim Jagielski 	ScHighlightRanges* pHigh = pViewData->GetView()->GetHighlightRanges();
780*b1cdbd2cSJim Jagielski 	sal_Bool bHasScenario = ( nTab+1<nTabCount && pDoc->IsScenario(nTab+1) && !pDoc->IsScenario(nTab) );
781*b1cdbd2cSJim Jagielski 	sal_Bool bHasChange = ( pDoc->GetChangeTrack() != NULL );
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski 	if ( bHasChange || bHasScenario || pHigh != NULL )
784*b1cdbd2cSJim Jagielski 	{
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 		//! SetChangedClip() mit DrawMarks() zusammenfassen?? (anderer MapMode!)
787*b1cdbd2cSJim Jagielski 
788*b1cdbd2cSJim Jagielski 		sal_Bool bAny = sal_True;
789*b1cdbd2cSJim Jagielski 		if (eMode == SC_UPDATE_CHANGED)
790*b1cdbd2cSJim Jagielski 			bAny = aOutputData.SetChangedClip();
791*b1cdbd2cSJim Jagielski 		if (bAny)
792*b1cdbd2cSJim Jagielski 		{
793*b1cdbd2cSJim Jagielski 			if ( bHasChange )
794*b1cdbd2cSJim Jagielski 				aOutputData.DrawChangeTrack();
795*b1cdbd2cSJim Jagielski 
796*b1cdbd2cSJim Jagielski 			if ( bHasScenario )
797*b1cdbd2cSJim Jagielski 				lcl_DrawScenarioFrames( pContentDev, pViewData, eWhich, nX1,nY1,nX2,nY2 );
798*b1cdbd2cSJim Jagielski 
799*b1cdbd2cSJim Jagielski 			if ( pHigh )
800*b1cdbd2cSJim Jagielski 				lcl_DrawHighlight( aOutputData, pViewData, *pHigh );
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski 			if (eMode == SC_UPDATE_CHANGED)
803*b1cdbd2cSJim Jagielski 				pContentDev->SetClipRegion();
804*b1cdbd2cSJim Jagielski 		}
805*b1cdbd2cSJim Jagielski 	}
806*b1cdbd2cSJim Jagielski 
807*b1cdbd2cSJim Jagielski 		// Drawing Vordergrund
808*b1cdbd2cSJim Jagielski 
809*b1cdbd2cSJim Jagielski 	pContentDev->SetMapMode(aDrawMode);
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski 	DrawRedraw( aOutputData, eMode, SC_LAYER_FRONT );
812*b1cdbd2cSJim Jagielski 	DrawRedraw( aOutputData, eMode, SC_LAYER_INTERN );
813*b1cdbd2cSJim Jagielski     DrawSdrGrid( aDrawingRectLogic, pContentDev );
814*b1cdbd2cSJim Jagielski 
815*b1cdbd2cSJim Jagielski 	if (!bIsInScroll)								// Drawing Markierungen
816*b1cdbd2cSJim Jagielski 	{
817*b1cdbd2cSJim Jagielski 		if(eMode == SC_UPDATE_CHANGED && aOutputData.SetChangedClip())
818*b1cdbd2cSJim Jagielski 		{
819*b1cdbd2cSJim Jagielski 			pContentDev->SetClipRegion();
820*b1cdbd2cSJim Jagielski 		}
821*b1cdbd2cSJim Jagielski 
822*b1cdbd2cSJim Jagielski 		//sal_Bool bDraw = sal_True;
823*b1cdbd2cSJim Jagielski 		//if (eMode == SC_UPDATE_CHANGED)
824*b1cdbd2cSJim Jagielski 		//	bDraw = NeedDrawMarks() && aOutputData.SetChangedClip();
825*b1cdbd2cSJim Jagielski 		//if (bDraw)
826*b1cdbd2cSJim Jagielski 		//{
827*b1cdbd2cSJim Jagielski 		//	DrawMarks();
828*b1cdbd2cSJim Jagielski 		//	if (eMode == SC_UPDATE_CHANGED)
829*b1cdbd2cSJim Jagielski 		//		pContentDev->SetClipRegion();
830*b1cdbd2cSJim Jagielski 		//}
831*b1cdbd2cSJim Jagielski 	}
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski 	pContentDev->SetMapMode(MAP_PIXEL);
834*b1cdbd2cSJim Jagielski 
835*b1cdbd2cSJim Jagielski #ifdef OLD_SELECTION_PAINT
836*b1cdbd2cSJim Jagielski 	if (pViewData->IsActive())
837*b1cdbd2cSJim Jagielski 		aOutputData.DrawMark( this );
838*b1cdbd2cSJim Jagielski #endif
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski 	if ( pViewData->IsRefMode() && nTab >= pViewData->GetRefStartZ() && nTab <= pViewData->GetRefEndZ() )
841*b1cdbd2cSJim Jagielski 	{
842*b1cdbd2cSJim Jagielski         // The AutoFill shrink area has an own overlay now
843*b1cdbd2cSJim Jagielski #if 0
844*b1cdbd2cSJim Jagielski 		//	Schraffur beim Loeschen per AutoFill
845*b1cdbd2cSJim Jagielski 		if ( pViewData->GetRefType() == SC_REFTYPE_FILL )
846*b1cdbd2cSJim Jagielski 		{
847*b1cdbd2cSJim Jagielski 			ScRange aRange;
848*b1cdbd2cSJim Jagielski 			if ( pViewData->GetDelMark( aRange ) )
849*b1cdbd2cSJim Jagielski 			{
850*b1cdbd2cSJim Jagielski 				if ( aRange.aStart.Col() < nX1 ) aRange.aStart.SetCol(nX1);
851*b1cdbd2cSJim Jagielski 				if ( aRange.aEnd.Col() > nX2 )	 aRange.aEnd.SetCol(nX2);
852*b1cdbd2cSJim Jagielski 				if ( aRange.aStart.Row() < nY1 ) aRange.aStart.SetRow(nY1);
853*b1cdbd2cSJim Jagielski 				if ( aRange.aEnd.Row() > nY2 )	 aRange.aEnd.SetRow(nY2);
854*b1cdbd2cSJim Jagielski 				if ( aRange.aStart.Col() <= aRange.aEnd.Col() &&
855*b1cdbd2cSJim Jagielski 					 aRange.aStart.Row() <= aRange.aEnd.Row() )
856*b1cdbd2cSJim Jagielski 				{
857*b1cdbd2cSJim Jagielski 					Point aStart = pViewData->GetScrPos( aRange.aStart.Col(),
858*b1cdbd2cSJim Jagielski 														 aRange.aStart.Row(), eWhich );
859*b1cdbd2cSJim Jagielski 					Point aEnd = pViewData->GetScrPos( aRange.aEnd.Col()+1,
860*b1cdbd2cSJim Jagielski 													   aRange.aEnd.Row()+1, eWhich );
861*b1cdbd2cSJim Jagielski 					aEnd.X() -= 1;
862*b1cdbd2cSJim Jagielski 					aEnd.Y() -= 1;
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski 					//	Markierung aufheben - roter Rahmen bleibt stehen
865*b1cdbd2cSJim Jagielski 					Rectangle aRect( aStart,aEnd );
866*b1cdbd2cSJim Jagielski 					Invert( aRect, INVERT_HIGHLIGHT );
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski 					//!	Delete-Bereich extra kennzeichnen?!?!?
869*b1cdbd2cSJim Jagielski 				}
870*b1cdbd2cSJim Jagielski 			}
871*b1cdbd2cSJim Jagielski 		}
872*b1cdbd2cSJim Jagielski #endif
873*b1cdbd2cSJim Jagielski 
874*b1cdbd2cSJim Jagielski         Color aRefColor( rColorCfg.GetColorValue(svtools::CALCREFERENCE).nColor );
875*b1cdbd2cSJim Jagielski 		aOutputData.DrawRefMark( pViewData->GetRefStartX(), pViewData->GetRefStartY(),
876*b1cdbd2cSJim Jagielski 								 pViewData->GetRefEndX(), pViewData->GetRefEndY(),
877*b1cdbd2cSJim Jagielski 								 aRefColor, sal_False );
878*b1cdbd2cSJim Jagielski 	}
879*b1cdbd2cSJim Jagielski 
880*b1cdbd2cSJim Jagielski 		//	Range-Finder
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski 	ScInputHandler* pHdl = pScMod->GetInputHdl( pViewData->GetViewShell() );
883*b1cdbd2cSJim Jagielski 	if (pHdl)
884*b1cdbd2cSJim Jagielski 	{
885*b1cdbd2cSJim Jagielski 		ScRangeFindList* pRangeFinder = pHdl->GetRangeFindList();
886*b1cdbd2cSJim Jagielski 		if ( pRangeFinder && !pRangeFinder->IsHidden() &&
887*b1cdbd2cSJim Jagielski 				pRangeFinder->GetDocName() == pDocSh->GetTitle() )
888*b1cdbd2cSJim Jagielski 		{
889*b1cdbd2cSJim Jagielski 			sal_uInt16 nCount = (sal_uInt16)pRangeFinder->Count();
890*b1cdbd2cSJim Jagielski 			for (sal_uInt16 i=0; i<nCount; i++)
891*b1cdbd2cSJim Jagielski 			{
892*b1cdbd2cSJim Jagielski 				ScRangeFindData* pData = pRangeFinder->GetObject(i);
893*b1cdbd2cSJim Jagielski 				if (pData)
894*b1cdbd2cSJim Jagielski 				{
895*b1cdbd2cSJim Jagielski 					ScRange aRef = pData->aRef;
896*b1cdbd2cSJim Jagielski 					aRef.Justify();
897*b1cdbd2cSJim Jagielski 					if ( aRef.aStart.Tab() >= nTab && aRef.aEnd.Tab() <= nTab )
898*b1cdbd2cSJim Jagielski 						aOutputData.DrawRefMark( aRef.aStart.Col(), aRef.aStart.Row(),
899*b1cdbd2cSJim Jagielski 												aRef.aEnd.Col(), aRef.aEnd.Row(),
900*b1cdbd2cSJim Jagielski 												Color( ScRangeFindList::GetColorName( i ) ),
901*b1cdbd2cSJim Jagielski 												sal_True );
902*b1cdbd2cSJim Jagielski 				}
903*b1cdbd2cSJim Jagielski 			}
904*b1cdbd2cSJim Jagielski 		}
905*b1cdbd2cSJim Jagielski 	}
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski 	{
908*b1cdbd2cSJim Jagielski 		// end redraw
909*b1cdbd2cSJim Jagielski 		ScTabViewShell* pTabViewShell = pViewData->GetViewShell();
910*b1cdbd2cSJim Jagielski 
911*b1cdbd2cSJim Jagielski 		if(pTabViewShell)
912*b1cdbd2cSJim Jagielski 		{
913*b1cdbd2cSJim Jagielski 			MapMode aCurrentMapMode(pContentDev->GetMapMode());
914*b1cdbd2cSJim Jagielski 			pContentDev->SetMapMode(aDrawMode);
915*b1cdbd2cSJim Jagielski 			SdrView* pDrawView = pTabViewShell->GetSdrView();
916*b1cdbd2cSJim Jagielski 
917*b1cdbd2cSJim Jagielski 			if(pDrawView)
918*b1cdbd2cSJim Jagielski 			{
919*b1cdbd2cSJim Jagielski 				// #i74769# work with SdrPaintWindow directly
920*b1cdbd2cSJim Jagielski 				pDrawView->EndDrawLayers(*pTargetPaintWindow, true);
921*b1cdbd2cSJim Jagielski 			}
922*b1cdbd2cSJim Jagielski 
923*b1cdbd2cSJim Jagielski 			pContentDev->SetMapMode(aCurrentMapMode);
924*b1cdbd2cSJim Jagielski 		}
925*b1cdbd2cSJim Jagielski 	}
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski 	//	InPlace Edit-View
928*b1cdbd2cSJim Jagielski 	// moved after EndDrawLayers() to get it outside the overlay buffer and
929*b1cdbd2cSJim Jagielski 	// on top of everything
930*b1cdbd2cSJim Jagielski 	if ( bEditMode && (pViewData->GetRefTabNo() == pViewData->GetTabNo()) )
931*b1cdbd2cSJim Jagielski 	{
932*b1cdbd2cSJim Jagielski         //! use pContentDev for EditView?
933*b1cdbd2cSJim Jagielski         SetMapMode(MAP_PIXEL);
934*b1cdbd2cSJim Jagielski 		SCCOL nCol1 = pViewData->GetEditStartCol();
935*b1cdbd2cSJim Jagielski 		SCROW nRow1 = pViewData->GetEditStartRow();
936*b1cdbd2cSJim Jagielski 		SCCOL nCol2 = pViewData->GetEditEndCol();
937*b1cdbd2cSJim Jagielski 		SCROW nRow2 = pViewData->GetEditEndRow();
938*b1cdbd2cSJim Jagielski 		SetLineColor();
939*b1cdbd2cSJim Jagielski 		SetFillColor( pEditView->GetBackgroundColor() );
940*b1cdbd2cSJim Jagielski 		Point aStart = pViewData->GetScrPos( nCol1, nRow1, eWhich );
941*b1cdbd2cSJim Jagielski 		Point aEnd = pViewData->GetScrPos( nCol2+1, nRow2+1, eWhich );
942*b1cdbd2cSJim Jagielski 		aEnd.X() -= 2 * nLayoutSign;		// don't overwrite grid
943*b1cdbd2cSJim Jagielski 		aEnd.Y() -= 2;
944*b1cdbd2cSJim Jagielski 		DrawRect( Rectangle( aStart,aEnd ) );
945*b1cdbd2cSJim Jagielski 
946*b1cdbd2cSJim Jagielski 		SetMapMode(pViewData->GetLogicMode());
947*b1cdbd2cSJim Jagielski 		pEditView->Paint( PixelToLogic( Rectangle( Point( nScrX, nScrY ),
948*b1cdbd2cSJim Jagielski 							Size( aOutputData.GetScrW(), aOutputData.GetScrH() ) ) ) );
949*b1cdbd2cSJim Jagielski 		SetMapMode(MAP_PIXEL);
950*b1cdbd2cSJim Jagielski 	}
951*b1cdbd2cSJim Jagielski 
952*b1cdbd2cSJim Jagielski 	if (pViewData->HasEditView(eWhich))
953*b1cdbd2cSJim Jagielski 	{
954*b1cdbd2cSJim Jagielski 		// flush OverlayManager before changing the MapMode
955*b1cdbd2cSJim Jagielski 		flushOverlayManager();
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski 		// set MapMode for text edit
958*b1cdbd2cSJim Jagielski 		SetMapMode(pViewData->GetLogicMode());
959*b1cdbd2cSJim Jagielski 	}
960*b1cdbd2cSJim Jagielski 	else
961*b1cdbd2cSJim Jagielski 		SetMapMode(aDrawMode);
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski 	if ( pNoteMarker )
964*b1cdbd2cSJim Jagielski 		pNoteMarker->Draw();		// ueber den Cursor, im Drawing-MapMode
965*b1cdbd2cSJim Jagielski 
966*b1cdbd2cSJim Jagielski 	//DrawStartTimer();				// fuer bunte Handles ohne System-Clipping
967*b1cdbd2cSJim Jagielski 
968*b1cdbd2cSJim Jagielski 	//
969*b1cdbd2cSJim Jagielski 	//	Wenn waehrend des Paint etwas invertiert wurde (Selektion geaendert aus Basic-Macro),
970*b1cdbd2cSJim Jagielski 	//	ist das jetzt durcheinandergekommen und es muss neu gemalt werden
971*b1cdbd2cSJim Jagielski 	//
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski 	DBG_ASSERT(nPaintCount, "nPaintCount falsch");
974*b1cdbd2cSJim Jagielski 	--nPaintCount;
975*b1cdbd2cSJim Jagielski 	if (!nPaintCount)
976*b1cdbd2cSJim Jagielski 		CheckNeedsRepaint();
977*b1cdbd2cSJim Jagielski }
978*b1cdbd2cSJim Jagielski 
CheckNeedsRepaint()979*b1cdbd2cSJim Jagielski void ScGridWindow::CheckNeedsRepaint()
980*b1cdbd2cSJim Jagielski {
981*b1cdbd2cSJim Jagielski 	//	called at the end of painting, and from timer after background text width calculation
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski 	if (bNeedsRepaint)
984*b1cdbd2cSJim Jagielski 	{
985*b1cdbd2cSJim Jagielski 		bNeedsRepaint = sal_False;
986*b1cdbd2cSJim Jagielski 		if (aRepaintPixel.IsEmpty())
987*b1cdbd2cSJim Jagielski 			Invalidate();
988*b1cdbd2cSJim Jagielski 		else
989*b1cdbd2cSJim Jagielski 			Invalidate(PixelToLogic(aRepaintPixel));
990*b1cdbd2cSJim Jagielski 		aRepaintPixel = Rectangle();
991*b1cdbd2cSJim Jagielski 
992*b1cdbd2cSJim Jagielski         // selection function in status bar might also be invalid
993*b1cdbd2cSJim Jagielski         SfxBindings& rBindings = pViewData->GetBindings();
994*b1cdbd2cSJim Jagielski         rBindings.Invalidate( SID_STATUS_SUM );
995*b1cdbd2cSJim Jagielski         rBindings.Invalidate( SID_ATTR_SIZE );
996*b1cdbd2cSJim Jagielski         rBindings.Invalidate( SID_TABLE_CELL );
997*b1cdbd2cSJim Jagielski 	}
998*b1cdbd2cSJim Jagielski }
999*b1cdbd2cSJim Jagielski 
DrawPagePreview(SCCOL nX1,SCROW nY1,SCCOL nX2,SCROW nY2,OutputDevice * pContentDev)1000*b1cdbd2cSJim Jagielski void ScGridWindow::DrawPagePreview( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, OutputDevice* pContentDev )
1001*b1cdbd2cSJim Jagielski {
1002*b1cdbd2cSJim Jagielski 	ScPageBreakData* pPageData = pViewData->GetView()->GetPageBreakData();
1003*b1cdbd2cSJim Jagielski 	if (pPageData)
1004*b1cdbd2cSJim Jagielski 	{
1005*b1cdbd2cSJim Jagielski 		ScDocument* pDoc = pViewData->GetDocument();
1006*b1cdbd2cSJim Jagielski 		SCTAB nTab = pViewData->GetTabNo();
1007*b1cdbd2cSJim Jagielski 		Size aWinSize = GetOutputSizePixel();
1008*b1cdbd2cSJim Jagielski         const svtools::ColorConfig& rColorCfg = SC_MOD()->GetColorConfig();
1009*b1cdbd2cSJim Jagielski         Color aManual( rColorCfg.GetColorValue(svtools::CALCPAGEBREAKMANUAL).nColor );
1010*b1cdbd2cSJim Jagielski         Color aAutomatic( rColorCfg.GetColorValue(svtools::CALCPAGEBREAK).nColor );
1011*b1cdbd2cSJim Jagielski 
1012*b1cdbd2cSJim Jagielski 		String aPageText = ScGlobal::GetRscString( STR_PAGE );
1013*b1cdbd2cSJim Jagielski 		if ( nPageScript == 0 )
1014*b1cdbd2cSJim Jagielski 		{
1015*b1cdbd2cSJim Jagielski 			//	get script type of translated "Page" string only once
1016*b1cdbd2cSJim Jagielski 			nPageScript = pDoc->GetStringScriptType( aPageText );
1017*b1cdbd2cSJim Jagielski 			if (nPageScript == 0)
1018*b1cdbd2cSJim Jagielski 				nPageScript = ScGlobal::GetDefaultScriptType();
1019*b1cdbd2cSJim Jagielski 		}
1020*b1cdbd2cSJim Jagielski 		aPageText += ' ';
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski 		Font aFont;
1023*b1cdbd2cSJim Jagielski 		ScEditEngineDefaulter* pEditEng = NULL;
1024*b1cdbd2cSJim Jagielski 		const ScPatternAttr& rDefPattern = ((const ScPatternAttr&)pDoc->GetPool()->GetDefaultItem(ATTR_PATTERN));
1025*b1cdbd2cSJim Jagielski 		if ( nPageScript == SCRIPTTYPE_LATIN )
1026*b1cdbd2cSJim Jagielski 		{
1027*b1cdbd2cSJim Jagielski 			//	use single font and call DrawText directly
1028*b1cdbd2cSJim Jagielski 			rDefPattern.GetFont( aFont, SC_AUTOCOL_BLACK );
1029*b1cdbd2cSJim Jagielski 			aFont.SetColor( Color( COL_LIGHTGRAY ) );
1030*b1cdbd2cSJim Jagielski 			//	font size is set as needed
1031*b1cdbd2cSJim Jagielski 		}
1032*b1cdbd2cSJim Jagielski 		else
1033*b1cdbd2cSJim Jagielski 		{
1034*b1cdbd2cSJim Jagielski 			//	use EditEngine to draw mixed-script string
1035*b1cdbd2cSJim Jagielski 			pEditEng = new ScEditEngineDefaulter( EditEngine::CreatePool(), sal_True );
1036*b1cdbd2cSJim Jagielski 			pEditEng->SetRefMapMode( pContentDev->GetMapMode() );
1037*b1cdbd2cSJim Jagielski 			SfxItemSet* pEditDefaults = new SfxItemSet( pEditEng->GetEmptyItemSet() );
1038*b1cdbd2cSJim Jagielski 			rDefPattern.FillEditItemSet( pEditDefaults );
1039*b1cdbd2cSJim Jagielski 			pEditDefaults->Put( SvxColorItem( Color( COL_LIGHTGRAY ), EE_CHAR_COLOR ) );
1040*b1cdbd2cSJim Jagielski 			pEditEng->SetDefaults( pEditDefaults );
1041*b1cdbd2cSJim Jagielski 		}
1042*b1cdbd2cSJim Jagielski 
1043*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = sal::static_int_cast<sal_uInt16>( pPageData->GetCount() );
1044*b1cdbd2cSJim Jagielski 		for (sal_uInt16 nPos=0; nPos<nCount; nPos++)
1045*b1cdbd2cSJim Jagielski 		{
1046*b1cdbd2cSJim Jagielski 			ScPrintRangeData& rData = pPageData->GetData(nPos);
1047*b1cdbd2cSJim Jagielski 			ScRange aRange = rData.GetPrintRange();
1048*b1cdbd2cSJim Jagielski 			if ( aRange.aStart.Col() <= nX2+1  && aRange.aEnd.Col()+1 >= nX1 &&
1049*b1cdbd2cSJim Jagielski 				 aRange.aStart.Row() <= nY2+1 && aRange.aEnd.Row()+1 >= nY1 )
1050*b1cdbd2cSJim Jagielski 			{
1051*b1cdbd2cSJim Jagielski 				//	3 Pixel Rahmen um den Druckbereich
1052*b1cdbd2cSJim Jagielski 				//	(mittlerer Pixel auf den Gitterlinien)
1053*b1cdbd2cSJim Jagielski 
1054*b1cdbd2cSJim Jagielski 				pContentDev->SetLineColor();
1055*b1cdbd2cSJim Jagielski 				if (rData.IsAutomatic())
1056*b1cdbd2cSJim Jagielski 					pContentDev->SetFillColor( aAutomatic );
1057*b1cdbd2cSJim Jagielski 				else
1058*b1cdbd2cSJim Jagielski 					pContentDev->SetFillColor( aManual );
1059*b1cdbd2cSJim Jagielski 
1060*b1cdbd2cSJim Jagielski 				Point aStart = pViewData->GetScrPos(
1061*b1cdbd2cSJim Jagielski 									aRange.aStart.Col(), aRange.aStart.Row(), eWhich, sal_True );
1062*b1cdbd2cSJim Jagielski 				Point aEnd = pViewData->GetScrPos(
1063*b1cdbd2cSJim Jagielski 									aRange.aEnd.Col() + 1, aRange.aEnd.Row() + 1, eWhich, sal_True );
1064*b1cdbd2cSJim Jagielski 				aStart.X() -= 2;
1065*b1cdbd2cSJim Jagielski 				aStart.Y() -= 2;
1066*b1cdbd2cSJim Jagielski 
1067*b1cdbd2cSJim Jagielski 				//	Ueberlaeufe verhindern:
1068*b1cdbd2cSJim Jagielski 				if ( aStart.X() < -10 )	aStart.X() = -10;
1069*b1cdbd2cSJim Jagielski 				if ( aStart.Y() < -10 )	aStart.Y() = -10;
1070*b1cdbd2cSJim Jagielski 				if ( aEnd.X() > aWinSize.Width() + 10 )
1071*b1cdbd2cSJim Jagielski 					aEnd.X() = aWinSize.Width() + 10;
1072*b1cdbd2cSJim Jagielski 				if ( aEnd.Y() > aWinSize.Height() + 10 )
1073*b1cdbd2cSJim Jagielski 					aEnd.Y() = aWinSize.Height() + 10;
1074*b1cdbd2cSJim Jagielski 
1075*b1cdbd2cSJim Jagielski 				pContentDev->DrawRect( Rectangle( aStart, Point(aEnd.X(),aStart.Y()+2) ) );
1076*b1cdbd2cSJim Jagielski 				pContentDev->DrawRect( Rectangle( aStart, Point(aStart.X()+2,aEnd.Y()) ) );
1077*b1cdbd2cSJim Jagielski 				pContentDev->DrawRect( Rectangle( Point(aStart.X(),aEnd.Y()-2), aEnd ) );
1078*b1cdbd2cSJim Jagielski 				pContentDev->DrawRect( Rectangle( Point(aEnd.X()-2,aStart.Y()), aEnd ) );
1079*b1cdbd2cSJim Jagielski 
1080*b1cdbd2cSJim Jagielski 				//	Seitenumbrueche
1081*b1cdbd2cSJim Jagielski 				//!	anders darstellen (gestrichelt ????)
1082*b1cdbd2cSJim Jagielski 
1083*b1cdbd2cSJim Jagielski 				size_t nColBreaks = rData.GetPagesX();
1084*b1cdbd2cSJim Jagielski 				const SCCOL* pColEnd = rData.GetPageEndX();
1085*b1cdbd2cSJim Jagielski 				size_t nColPos;
1086*b1cdbd2cSJim Jagielski 				for (nColPos=0; nColPos+1<nColBreaks; nColPos++)
1087*b1cdbd2cSJim Jagielski 				{
1088*b1cdbd2cSJim Jagielski 					SCCOL nBreak = pColEnd[nColPos]+1;
1089*b1cdbd2cSJim Jagielski 					if ( nBreak >= nX1 && nBreak <= nX2+1 )
1090*b1cdbd2cSJim Jagielski 					{
1091*b1cdbd2cSJim Jagielski 						//! hidden suchen
1092*b1cdbd2cSJim Jagielski                         if (pDoc->HasColBreak(nBreak, nTab) & BREAK_MANUAL)
1093*b1cdbd2cSJim Jagielski 							pContentDev->SetFillColor( aManual );
1094*b1cdbd2cSJim Jagielski 						else
1095*b1cdbd2cSJim Jagielski 							pContentDev->SetFillColor( aAutomatic );
1096*b1cdbd2cSJim Jagielski 						Point aBreak = pViewData->GetScrPos(
1097*b1cdbd2cSJim Jagielski 										nBreak, aRange.aStart.Row(), eWhich, sal_True );
1098*b1cdbd2cSJim Jagielski 						pContentDev->DrawRect( Rectangle( aBreak.X()-1, aStart.Y(), aBreak.X(), aEnd.Y() ) );
1099*b1cdbd2cSJim Jagielski 					}
1100*b1cdbd2cSJim Jagielski 				}
1101*b1cdbd2cSJim Jagielski 
1102*b1cdbd2cSJim Jagielski 				size_t nRowBreaks = rData.GetPagesY();
1103*b1cdbd2cSJim Jagielski 				const SCROW* pRowEnd = rData.GetPageEndY();
1104*b1cdbd2cSJim Jagielski 				size_t nRowPos;
1105*b1cdbd2cSJim Jagielski 				for (nRowPos=0; nRowPos+1<nRowBreaks; nRowPos++)
1106*b1cdbd2cSJim Jagielski 				{
1107*b1cdbd2cSJim Jagielski 					SCROW nBreak = pRowEnd[nRowPos]+1;
1108*b1cdbd2cSJim Jagielski 					if ( nBreak >= nY1 && nBreak <= nY2+1 )
1109*b1cdbd2cSJim Jagielski 					{
1110*b1cdbd2cSJim Jagielski 						//! hidden suchen
1111*b1cdbd2cSJim Jagielski                         if (pDoc->HasRowBreak(nBreak, nTab) & BREAK_MANUAL)
1112*b1cdbd2cSJim Jagielski 							pContentDev->SetFillColor( aManual );
1113*b1cdbd2cSJim Jagielski 						else
1114*b1cdbd2cSJim Jagielski 							pContentDev->SetFillColor( aAutomatic );
1115*b1cdbd2cSJim Jagielski 						Point aBreak = pViewData->GetScrPos(
1116*b1cdbd2cSJim Jagielski 										aRange.aStart.Col(), nBreak, eWhich, sal_True );
1117*b1cdbd2cSJim Jagielski 						pContentDev->DrawRect( Rectangle( aStart.X(), aBreak.Y()-1, aEnd.X(), aBreak.Y() ) );
1118*b1cdbd2cSJim Jagielski 					}
1119*b1cdbd2cSJim Jagielski 				}
1120*b1cdbd2cSJim Jagielski 
1121*b1cdbd2cSJim Jagielski 				//	Seitenzahlen
1122*b1cdbd2cSJim Jagielski 
1123*b1cdbd2cSJim Jagielski 				SCROW nPrStartY = aRange.aStart.Row();
1124*b1cdbd2cSJim Jagielski 				for (nRowPos=0; nRowPos<nRowBreaks; nRowPos++)
1125*b1cdbd2cSJim Jagielski 				{
1126*b1cdbd2cSJim Jagielski 					SCROW nPrEndY = pRowEnd[nRowPos];
1127*b1cdbd2cSJim Jagielski 					if ( nPrEndY >= nY1 && nPrStartY <= nY2 )
1128*b1cdbd2cSJim Jagielski 					{
1129*b1cdbd2cSJim Jagielski 						SCCOL nPrStartX = aRange.aStart.Col();
1130*b1cdbd2cSJim Jagielski 						for (nColPos=0; nColPos<nColBreaks; nColPos++)
1131*b1cdbd2cSJim Jagielski 						{
1132*b1cdbd2cSJim Jagielski 							SCCOL nPrEndX = pColEnd[nColPos];
1133*b1cdbd2cSJim Jagielski 							if ( nPrEndX >= nX1 && nPrStartX <= nX2 )
1134*b1cdbd2cSJim Jagielski 							{
1135*b1cdbd2cSJim Jagielski 								Point aPageStart = pViewData->GetScrPos(
1136*b1cdbd2cSJim Jagielski 														nPrStartX, nPrStartY, eWhich, sal_True );
1137*b1cdbd2cSJim Jagielski 								Point aPageEnd = pViewData->GetScrPos(
1138*b1cdbd2cSJim Jagielski 														nPrEndX+1,nPrEndY+1, eWhich, sal_True );
1139*b1cdbd2cSJim Jagielski 
1140*b1cdbd2cSJim Jagielski 								long nPageNo = rData.GetFirstPage();
1141*b1cdbd2cSJim Jagielski 								if ( rData.IsTopDown() )
1142*b1cdbd2cSJim Jagielski 									nPageNo += ((long)nColPos)*nRowBreaks+nRowPos;
1143*b1cdbd2cSJim Jagielski 								else
1144*b1cdbd2cSJim Jagielski 									nPageNo += ((long)nRowPos)*nColBreaks+nColPos;
1145*b1cdbd2cSJim Jagielski 								String aPageStr = aPageText;
1146*b1cdbd2cSJim Jagielski 								aPageStr += String::CreateFromInt32(nPageNo);
1147*b1cdbd2cSJim Jagielski 
1148*b1cdbd2cSJim Jagielski 								if ( pEditEng )
1149*b1cdbd2cSJim Jagielski 								{
1150*b1cdbd2cSJim Jagielski 									//	find right font size with EditEngine
1151*b1cdbd2cSJim Jagielski 									long nHeight = 100;
1152*b1cdbd2cSJim Jagielski 									pEditEng->SetDefaultItem( SvxFontHeightItem( nHeight, 100, EE_CHAR_FONTHEIGHT ) );
1153*b1cdbd2cSJim Jagielski 									pEditEng->SetDefaultItem( SvxFontHeightItem( nHeight, 100, EE_CHAR_FONTHEIGHT_CJK ) );
1154*b1cdbd2cSJim Jagielski 									pEditEng->SetDefaultItem( SvxFontHeightItem( nHeight, 100, EE_CHAR_FONTHEIGHT_CTL ) );
1155*b1cdbd2cSJim Jagielski 									pEditEng->SetText( aPageStr );
1156*b1cdbd2cSJim Jagielski 									Size aSize100( pEditEng->CalcTextWidth(), pEditEng->GetTextHeight() );
1157*b1cdbd2cSJim Jagielski 
1158*b1cdbd2cSJim Jagielski 									//	40% of width or 60% of height
1159*b1cdbd2cSJim Jagielski 									long nSizeX = 40 * ( aPageEnd.X() - aPageStart.X() ) / aSize100.Width();
1160*b1cdbd2cSJim Jagielski 									long nSizeY = 60 * ( aPageEnd.Y() - aPageStart.Y() ) / aSize100.Height();
1161*b1cdbd2cSJim Jagielski 									nHeight = Min(nSizeX,nSizeY);
1162*b1cdbd2cSJim Jagielski 									pEditEng->SetDefaultItem( SvxFontHeightItem( nHeight, 100, EE_CHAR_FONTHEIGHT ) );
1163*b1cdbd2cSJim Jagielski 									pEditEng->SetDefaultItem( SvxFontHeightItem( nHeight, 100, EE_CHAR_FONTHEIGHT_CJK ) );
1164*b1cdbd2cSJim Jagielski 									pEditEng->SetDefaultItem( SvxFontHeightItem( nHeight, 100, EE_CHAR_FONTHEIGHT_CTL ) );
1165*b1cdbd2cSJim Jagielski 
1166*b1cdbd2cSJim Jagielski 									//	centered output with EditEngine
1167*b1cdbd2cSJim Jagielski 									Size aTextSize( pEditEng->CalcTextWidth(), pEditEng->GetTextHeight() );
1168*b1cdbd2cSJim Jagielski 									Point aPos( (aPageStart.X()+aPageEnd.X()-aTextSize.Width())/2,
1169*b1cdbd2cSJim Jagielski 												(aPageStart.Y()+aPageEnd.Y()-aTextSize.Height())/2 );
1170*b1cdbd2cSJim Jagielski 									pEditEng->Draw( pContentDev, aPos );
1171*b1cdbd2cSJim Jagielski 								}
1172*b1cdbd2cSJim Jagielski 								else
1173*b1cdbd2cSJim Jagielski 								{
1174*b1cdbd2cSJim Jagielski 									//	find right font size for DrawText
1175*b1cdbd2cSJim Jagielski 									aFont.SetSize( Size( 0,100 ) );
1176*b1cdbd2cSJim Jagielski 									pContentDev->SetFont( aFont );
1177*b1cdbd2cSJim Jagielski 									Size aSize100( pContentDev->GetTextWidth( aPageStr ), pContentDev->GetTextHeight() );
1178*b1cdbd2cSJim Jagielski 
1179*b1cdbd2cSJim Jagielski 									//	40% of width or 60% of height
1180*b1cdbd2cSJim Jagielski 									long nSizeX = 40 * ( aPageEnd.X() - aPageStart.X() ) / aSize100.Width();
1181*b1cdbd2cSJim Jagielski 									long nSizeY = 60 * ( aPageEnd.Y() - aPageStart.Y() ) / aSize100.Height();
1182*b1cdbd2cSJim Jagielski 									aFont.SetSize( Size( 0,Min(nSizeX,nSizeY) ) );
1183*b1cdbd2cSJim Jagielski 									pContentDev->SetFont( aFont );
1184*b1cdbd2cSJim Jagielski 
1185*b1cdbd2cSJim Jagielski 									//	centered output with DrawText
1186*b1cdbd2cSJim Jagielski 									Size aTextSize( pContentDev->GetTextWidth( aPageStr ), pContentDev->GetTextHeight() );
1187*b1cdbd2cSJim Jagielski 									Point aPos( (aPageStart.X()+aPageEnd.X()-aTextSize.Width())/2,
1188*b1cdbd2cSJim Jagielski 												(aPageStart.Y()+aPageEnd.Y()-aTextSize.Height())/2 );
1189*b1cdbd2cSJim Jagielski 									pContentDev->DrawText( aPos, aPageStr );
1190*b1cdbd2cSJim Jagielski 								}
1191*b1cdbd2cSJim Jagielski 							}
1192*b1cdbd2cSJim Jagielski 							nPrStartX = nPrEndX + 1;
1193*b1cdbd2cSJim Jagielski 						}
1194*b1cdbd2cSJim Jagielski 					}
1195*b1cdbd2cSJim Jagielski 					nPrStartY = nPrEndY + 1;
1196*b1cdbd2cSJim Jagielski 				}
1197*b1cdbd2cSJim Jagielski 			}
1198*b1cdbd2cSJim Jagielski 		}
1199*b1cdbd2cSJim Jagielski 
1200*b1cdbd2cSJim Jagielski 		delete pEditEng;
1201*b1cdbd2cSJim Jagielski 	}
1202*b1cdbd2cSJim Jagielski }
1203*b1cdbd2cSJim Jagielski 
DrawButtons(SCCOL nX1,SCROW,SCCOL nX2,SCROW,ScTableInfo & rTabInfo,OutputDevice * pContentDev)1204*b1cdbd2cSJim Jagielski void ScGridWindow::DrawButtons( SCCOL nX1, SCROW /*nY1*/, SCCOL nX2, SCROW /*nY2*/, ScTableInfo& rTabInfo, OutputDevice* pContentDev )
1205*b1cdbd2cSJim Jagielski {
1206*b1cdbd2cSJim Jagielski     aComboButton.SetOutputDevice( pContentDev );
1207*b1cdbd2cSJim Jagielski 
1208*b1cdbd2cSJim Jagielski     ScDocument* pDoc = pViewData->GetDocument();
1209*b1cdbd2cSJim Jagielski     ScDPFieldButton aCellBtn(pContentDev, &GetSettings().GetStyleSettings(), &pViewData->GetZoomX(), &pViewData->GetZoomY(), pDoc);
1210*b1cdbd2cSJim Jagielski 
1211*b1cdbd2cSJim Jagielski 	SCCOL nCol;
1212*b1cdbd2cSJim Jagielski 	SCROW nRow;
1213*b1cdbd2cSJim Jagielski 	SCSIZE nArrY;
1214*b1cdbd2cSJim Jagielski 	SCSIZE nQuery;
1215*b1cdbd2cSJim Jagielski 	SCTAB			nTab = pViewData->GetTabNo();
1216*b1cdbd2cSJim Jagielski 	ScDBData*		pDBData = NULL;
1217*b1cdbd2cSJim Jagielski 	ScQueryParam*	pQueryParam = NULL;
1218*b1cdbd2cSJim Jagielski 
1219*b1cdbd2cSJim Jagielski     RowInfo*        pRowInfo = rTabInfo.mpRowInfo;
1220*b1cdbd2cSJim Jagielski     sal_uInt16          nArrCount = rTabInfo.mnArrCount;
1221*b1cdbd2cSJim Jagielski 
1222*b1cdbd2cSJim Jagielski 	sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
1223*b1cdbd2cSJim Jagielski 
1224*b1cdbd2cSJim Jagielski 	Point aOldPos  = aComboButton.GetPosPixel();	// Zustand fuer MouseDown/Up
1225*b1cdbd2cSJim Jagielski 	Size  aOldSize = aComboButton.GetSizePixel();   // merken
1226*b1cdbd2cSJim Jagielski 
1227*b1cdbd2cSJim Jagielski 	for (nArrY=1; nArrY+1<nArrCount; nArrY++)
1228*b1cdbd2cSJim Jagielski 	{
1229*b1cdbd2cSJim Jagielski 		if ( pRowInfo[nArrY].bAutoFilter && pRowInfo[nArrY].bChanged )
1230*b1cdbd2cSJim Jagielski 		{
1231*b1cdbd2cSJim Jagielski 			RowInfo* pThisRowInfo = &pRowInfo[nArrY];
1232*b1cdbd2cSJim Jagielski 
1233*b1cdbd2cSJim Jagielski 			nRow = pThisRowInfo->nRowNo;
1234*b1cdbd2cSJim Jagielski 
1235*b1cdbd2cSJim Jagielski 
1236*b1cdbd2cSJim Jagielski 			for (nCol=nX1; nCol<=nX2; nCol++)
1237*b1cdbd2cSJim Jagielski 			{
1238*b1cdbd2cSJim Jagielski 				CellInfo* pInfo = &pThisRowInfo->pCellInfo[nCol+1];
1239*b1cdbd2cSJim Jagielski 				//if several columns merged on a row, there should be only one auto button at the end of the columns.
1240*b1cdbd2cSJim Jagielski 				//if several rows merged on a column, the button may be in the middle, so "!pInfo->bVOverlapped" should not be used
1241*b1cdbd2cSJim Jagielski 				if ( pInfo->bAutoFilter && !pInfo->bHOverlapped )
1242*b1cdbd2cSJim Jagielski 				{
1243*b1cdbd2cSJim Jagielski 					if (!pQueryParam)
1244*b1cdbd2cSJim Jagielski 						pQueryParam = new ScQueryParam;
1245*b1cdbd2cSJim Jagielski 
1246*b1cdbd2cSJim Jagielski 					sal_Bool bNewData = sal_True;
1247*b1cdbd2cSJim Jagielski 					if (pDBData)
1248*b1cdbd2cSJim Jagielski 					{
1249*b1cdbd2cSJim Jagielski 						SCCOL nStartCol;
1250*b1cdbd2cSJim Jagielski 						SCROW nStartRow;
1251*b1cdbd2cSJim Jagielski 						SCCOL nEndCol;
1252*b1cdbd2cSJim Jagielski 						SCROW nEndRow;
1253*b1cdbd2cSJim Jagielski 						SCTAB nAreaTab;
1254*b1cdbd2cSJim Jagielski 						pDBData->GetArea( nAreaTab, nStartCol, nStartRow, nEndCol, nEndRow );
1255*b1cdbd2cSJim Jagielski 						if ( nCol >= nStartCol && nCol <= nEndCol &&
1256*b1cdbd2cSJim Jagielski 							 nRow >= nStartRow && nRow <= nEndRow )
1257*b1cdbd2cSJim Jagielski 							bNewData = sal_False;
1258*b1cdbd2cSJim Jagielski 					}
1259*b1cdbd2cSJim Jagielski 					if (bNewData)
1260*b1cdbd2cSJim Jagielski 					{
1261*b1cdbd2cSJim Jagielski 						pDBData = pDoc->GetDBAtCursor( nCol, nRow, nTab );
1262*b1cdbd2cSJim Jagielski 						if (pDBData)
1263*b1cdbd2cSJim Jagielski 							pDBData->GetQueryParam( *pQueryParam );
1264*b1cdbd2cSJim Jagielski 						else
1265*b1cdbd2cSJim Jagielski 						{
1266*b1cdbd2cSJim Jagielski 							// can also be part of DataPilot table
1267*b1cdbd2cSJim Jagielski 							// DBG_ERROR("Auto-Filter-Button ohne DBData");
1268*b1cdbd2cSJim Jagielski 						}
1269*b1cdbd2cSJim Jagielski 					}
1270*b1cdbd2cSJim Jagielski 
1271*b1cdbd2cSJim Jagielski 					//	pQueryParam kann nur MAXQUERY Eintraege enthalten
1272*b1cdbd2cSJim Jagielski 
1273*b1cdbd2cSJim Jagielski 					sal_Bool bSimpleQuery = sal_True;
1274*b1cdbd2cSJim Jagielski 					sal_Bool bColumnFound = sal_False;
1275*b1cdbd2cSJim Jagielski 					if (!pQueryParam->bInplace)
1276*b1cdbd2cSJim Jagielski 						bSimpleQuery = sal_False;
1277*b1cdbd2cSJim Jagielski 					for (nQuery=0; nQuery<MAXQUERY && bSimpleQuery; nQuery++)
1278*b1cdbd2cSJim Jagielski 						if (pQueryParam->GetEntry(nQuery).bDoQuery)
1279*b1cdbd2cSJim Jagielski 						{
1280*b1cdbd2cSJim Jagielski 							//	hier nicht auf EQUAL beschraenken
1281*b1cdbd2cSJim Jagielski 							//	(auch bei ">1" soll der Spaltenkopf blau werden)
1282*b1cdbd2cSJim Jagielski 
1283*b1cdbd2cSJim Jagielski 							if (pQueryParam->GetEntry(nQuery).nField == nCol)
1284*b1cdbd2cSJim Jagielski 								bColumnFound = sal_True;
1285*b1cdbd2cSJim Jagielski 							if (nQuery > 0)
1286*b1cdbd2cSJim Jagielski 								if (pQueryParam->GetEntry(nQuery).eConnect != SC_AND)
1287*b1cdbd2cSJim Jagielski 									bSimpleQuery = sal_False;
1288*b1cdbd2cSJim Jagielski 						}
1289*b1cdbd2cSJim Jagielski 
1290*b1cdbd2cSJim Jagielski                     bool bArrowState = bSimpleQuery && bColumnFound;
1291*b1cdbd2cSJim Jagielski 					long	nSizeX;
1292*b1cdbd2cSJim Jagielski 					long	nSizeY;
1293*b1cdbd2cSJim Jagielski 					SCCOL nStartCol= nCol;
1294*b1cdbd2cSJim Jagielski 					SCROW nStartRow = nRow;
1295*b1cdbd2cSJim Jagielski 					//if address(nCol,nRow) is not the start pos of the merge area, the value of the nSizeX will be incorrect, it will be the length of the cell.
1296*b1cdbd2cSJim Jagielski 					//should first get the start pos of the merge area, then get the nSizeX through the start pos.
1297*b1cdbd2cSJim Jagielski 					pDoc->ExtendOverlapped(nStartCol, nStartRow,nCol, nRow, nTab);//get nStartCol,nStartRow
1298*b1cdbd2cSJim Jagielski 					pViewData->GetMergeSizePixel( nStartCol, nStartRow, nSizeX, nSizeY );//get nSizeX
1299*b1cdbd2cSJim Jagielski 					nSizeY = pViewData->ToPixel(pDoc->GetRowHeight(nRow, nTab), pViewData->GetPPTY());
1300*b1cdbd2cSJim Jagielski 					Point aScrPos = pViewData->GetScrPos( nCol, nRow, eWhich );
1301*b1cdbd2cSJim Jagielski 
1302*b1cdbd2cSJim Jagielski                     aCellBtn.setBoundingBox(aScrPos, Size(nSizeX-1, nSizeY-1), bLayoutRTL);
1303*b1cdbd2cSJim Jagielski                     aCellBtn.setPopupLeft(bLayoutRTL);   // #i114944# AutoFilter button is left-aligned in RTL
1304*b1cdbd2cSJim Jagielski                     aCellBtn.setDrawBaseButton(false);
1305*b1cdbd2cSJim Jagielski                     aCellBtn.setDrawPopupButton(true);
1306*b1cdbd2cSJim Jagielski                     aCellBtn.setHasHiddenMember(bArrowState);
1307*b1cdbd2cSJim Jagielski                     aCellBtn.draw();
1308*b1cdbd2cSJim Jagielski 				}
1309*b1cdbd2cSJim Jagielski 			}
1310*b1cdbd2cSJim Jagielski 		}
1311*b1cdbd2cSJim Jagielski 
1312*b1cdbd2cSJim Jagielski 		if ( pRowInfo[nArrY].bPushButton && pRowInfo[nArrY].bChanged )
1313*b1cdbd2cSJim Jagielski 		{
1314*b1cdbd2cSJim Jagielski 			RowInfo* pThisRowInfo = &pRowInfo[nArrY];
1315*b1cdbd2cSJim Jagielski 			nRow = pThisRowInfo->nRowNo;
1316*b1cdbd2cSJim Jagielski 			for (nCol=nX1; nCol<=nX2; nCol++)
1317*b1cdbd2cSJim Jagielski 			{
1318*b1cdbd2cSJim Jagielski 				CellInfo* pInfo = &pThisRowInfo->pCellInfo[nCol+1];
1319*b1cdbd2cSJim Jagielski 				if ( pInfo->bPushButton && !pInfo->bHOverlapped && !pInfo->bVOverlapped )
1320*b1cdbd2cSJim Jagielski 				{
1321*b1cdbd2cSJim Jagielski 					Point aScrPos = pViewData->GetScrPos( nCol, nRow, eWhich );
1322*b1cdbd2cSJim Jagielski 					long nSizeX;
1323*b1cdbd2cSJim Jagielski 					long nSizeY;
1324*b1cdbd2cSJim Jagielski 					pViewData->GetMergeSizePixel( nCol, nRow, nSizeX, nSizeY );
1325*b1cdbd2cSJim Jagielski 					long nPosX = aScrPos.X();
1326*b1cdbd2cSJim Jagielski 					long nPosY = aScrPos.Y();
1327*b1cdbd2cSJim Jagielski 					// bLayoutRTL is handled in setBoundingBox
1328*b1cdbd2cSJim Jagielski 
1329*b1cdbd2cSJim Jagielski                     String aStr;
1330*b1cdbd2cSJim Jagielski                     pDoc->GetString(nCol, nRow, nTab, aStr);
1331*b1cdbd2cSJim Jagielski                     aCellBtn.setText(aStr);
1332*b1cdbd2cSJim Jagielski                     aCellBtn.setBoundingBox(Point(nPosX, nPosY), Size(nSizeX-1, nSizeY-1), bLayoutRTL);
1333*b1cdbd2cSJim Jagielski                     aCellBtn.setPopupLeft(false);   // DataPilot popup is always right-aligned for now
1334*b1cdbd2cSJim Jagielski                     aCellBtn.setDrawBaseButton(true);
1335*b1cdbd2cSJim Jagielski                     aCellBtn.setDrawPopupButton(pInfo->bPopupButton);
1336*b1cdbd2cSJim Jagielski                     aCellBtn.setHasHiddenMember(pInfo->bFilterActive);
1337*b1cdbd2cSJim Jagielski                     aCellBtn.draw();
1338*b1cdbd2cSJim Jagielski 				}
1339*b1cdbd2cSJim Jagielski 			}
1340*b1cdbd2cSJim Jagielski 		}
1341*b1cdbd2cSJim Jagielski 
1342*b1cdbd2cSJim Jagielski         if ( bListValButton && pRowInfo[nArrY].nRowNo == aListValPos.Row() && pRowInfo[nArrY].bChanged )
1343*b1cdbd2cSJim Jagielski         {
1344*b1cdbd2cSJim Jagielski             Rectangle aRect = GetListValButtonRect( aListValPos );
1345*b1cdbd2cSJim Jagielski             aComboButton.SetPosPixel( aRect.TopLeft() );
1346*b1cdbd2cSJim Jagielski             aComboButton.SetSizePixel( aRect.GetSize() );
1347*b1cdbd2cSJim Jagielski             pContentDev->SetClipRegion( aRect );
1348*b1cdbd2cSJim Jagielski             aComboButton.Draw( sal_False, sal_False );
1349*b1cdbd2cSJim Jagielski             pContentDev->SetClipRegion();           // always called from Draw() without clip region
1350*b1cdbd2cSJim Jagielski             aComboButton.SetPosPixel( aOldPos );    // restore old state
1351*b1cdbd2cSJim Jagielski             aComboButton.SetSizePixel( aOldSize );  // for MouseUp/Down (AutoFilter)
1352*b1cdbd2cSJim Jagielski         }
1353*b1cdbd2cSJim Jagielski 	}
1354*b1cdbd2cSJim Jagielski 
1355*b1cdbd2cSJim Jagielski 	delete pQueryParam;
1356*b1cdbd2cSJim Jagielski     aComboButton.SetOutputDevice( this );
1357*b1cdbd2cSJim Jagielski }
1358*b1cdbd2cSJim Jagielski 
GetListValButtonRect(const ScAddress & rButtonPos)1359*b1cdbd2cSJim Jagielski Rectangle ScGridWindow::GetListValButtonRect( const ScAddress& rButtonPos )
1360*b1cdbd2cSJim Jagielski {
1361*b1cdbd2cSJim Jagielski     ScDocument* pDoc = pViewData->GetDocument();
1362*b1cdbd2cSJim Jagielski     SCTAB nTab = pViewData->GetTabNo();
1363*b1cdbd2cSJim Jagielski     sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
1364*b1cdbd2cSJim Jagielski     long nLayoutSign = bLayoutRTL ? -1 : 1;
1365*b1cdbd2cSJim Jagielski 
1366*b1cdbd2cSJim Jagielski     ScDDComboBoxButton aButton( this );             // for optimal size
1367*b1cdbd2cSJim Jagielski     Size aBtnSize = aButton.GetSizePixel();
1368*b1cdbd2cSJim Jagielski 
1369*b1cdbd2cSJim Jagielski     SCCOL nCol = rButtonPos.Col();
1370*b1cdbd2cSJim Jagielski     SCROW nRow = rButtonPos.Row();
1371*b1cdbd2cSJim Jagielski 
1372*b1cdbd2cSJim Jagielski     long nCellSizeX;    // width of this cell, including merged
1373*b1cdbd2cSJim Jagielski     long nDummy;
1374*b1cdbd2cSJim Jagielski     pViewData->GetMergeSizePixel( nCol, nRow, nCellSizeX, nDummy );
1375*b1cdbd2cSJim Jagielski 
1376*b1cdbd2cSJim Jagielski     // for height, only the cell's row is used, excluding merged cells
1377*b1cdbd2cSJim Jagielski     long nCellSizeY = ScViewData::ToPixel( pDoc->GetRowHeight( nRow, nTab ), pViewData->GetPPTY() );
1378*b1cdbd2cSJim Jagielski     long nAvailable = nCellSizeX;
1379*b1cdbd2cSJim Jagielski 
1380*b1cdbd2cSJim Jagielski     //  left edge of next cell if there is a non-hidden next column
1381*b1cdbd2cSJim Jagielski     SCCOL nNextCol = nCol + 1;
1382*b1cdbd2cSJim Jagielski     const ScMergeAttr* pMerge = static_cast<const ScMergeAttr*>(pDoc->GetAttr( nCol,nRow,nTab, ATTR_MERGE ));
1383*b1cdbd2cSJim Jagielski     if ( pMerge->GetColMerge() > 1 )
1384*b1cdbd2cSJim Jagielski         nNextCol = nCol + pMerge->GetColMerge();    // next cell after the merged area
1385*b1cdbd2cSJim Jagielski     while ( nNextCol <= MAXCOL && pDoc->ColHidden(nNextCol, nTab) )
1386*b1cdbd2cSJim Jagielski         ++nNextCol;
1387*b1cdbd2cSJim Jagielski     sal_Bool bNextCell = ( nNextCol <= MAXCOL );
1388*b1cdbd2cSJim Jagielski     if ( bNextCell )
1389*b1cdbd2cSJim Jagielski         nAvailable = ScViewData::ToPixel( pDoc->GetColWidth( nNextCol, nTab ), pViewData->GetPPTX() );
1390*b1cdbd2cSJim Jagielski 
1391*b1cdbd2cSJim Jagielski     if ( nAvailable < aBtnSize.Width() )
1392*b1cdbd2cSJim Jagielski         aBtnSize.Width() = nAvailable;
1393*b1cdbd2cSJim Jagielski     if ( nCellSizeY < aBtnSize.Height() )
1394*b1cdbd2cSJim Jagielski         aBtnSize.Height() = nCellSizeY;
1395*b1cdbd2cSJim Jagielski 
1396*b1cdbd2cSJim Jagielski     Point aPos = pViewData->GetScrPos( nCol, nRow, eWhich, sal_True );
1397*b1cdbd2cSJim Jagielski     aPos.X() += nCellSizeX * nLayoutSign;               // start of next cell
1398*b1cdbd2cSJim Jagielski     if (!bNextCell)
1399*b1cdbd2cSJim Jagielski         aPos.X() -= aBtnSize.Width() * nLayoutSign;     // right edge of cell if next cell not available
1400*b1cdbd2cSJim Jagielski     aPos.Y() += nCellSizeY - aBtnSize.Height();
1401*b1cdbd2cSJim Jagielski     // X remains at the left edge
1402*b1cdbd2cSJim Jagielski 
1403*b1cdbd2cSJim Jagielski     if ( bLayoutRTL )
1404*b1cdbd2cSJim Jagielski         aPos.X() -= aBtnSize.Width()-1;     // align right edge of button with cell border
1405*b1cdbd2cSJim Jagielski 
1406*b1cdbd2cSJim Jagielski     return Rectangle( aPos, aBtnSize );
1407*b1cdbd2cSJim Jagielski }
1408*b1cdbd2cSJim Jagielski 
IsAutoFilterActive(SCCOL nCol,SCROW nRow,SCTAB nTab)1409*b1cdbd2cSJim Jagielski sal_Bool ScGridWindow::IsAutoFilterActive( SCCOL nCol, SCROW nRow, SCTAB nTab )
1410*b1cdbd2cSJim Jagielski {
1411*b1cdbd2cSJim Jagielski 	ScDocument*		pDoc	= pViewData->GetDocument();
1412*b1cdbd2cSJim Jagielski 	ScDBData*		pDBData = pDoc->GetDBAtCursor( nCol, nRow, nTab );
1413*b1cdbd2cSJim Jagielski 	ScQueryParam	aQueryParam;
1414*b1cdbd2cSJim Jagielski 
1415*b1cdbd2cSJim Jagielski 	if ( pDBData )
1416*b1cdbd2cSJim Jagielski 		pDBData->GetQueryParam( aQueryParam );
1417*b1cdbd2cSJim Jagielski 	else
1418*b1cdbd2cSJim Jagielski 	{
1419*b1cdbd2cSJim Jagielski 		DBG_ERROR("Auto-Filter-Button ohne DBData");
1420*b1cdbd2cSJim Jagielski 	}
1421*b1cdbd2cSJim Jagielski 
1422*b1cdbd2cSJim Jagielski 	sal_Bool	bSimpleQuery = sal_True;
1423*b1cdbd2cSJim Jagielski 	sal_Bool	bColumnFound = sal_False;
1424*b1cdbd2cSJim Jagielski 	SCSIZE	nQuery;
1425*b1cdbd2cSJim Jagielski 
1426*b1cdbd2cSJim Jagielski 	if ( !aQueryParam.bInplace )
1427*b1cdbd2cSJim Jagielski 		bSimpleQuery = sal_False;
1428*b1cdbd2cSJim Jagielski 
1429*b1cdbd2cSJim Jagielski 	//	aQueryParam kann nur MAXQUERY Eintraege enthalten
1430*b1cdbd2cSJim Jagielski 
1431*b1cdbd2cSJim Jagielski 	for ( nQuery=0; nQuery<MAXQUERY && bSimpleQuery; nQuery++ )
1432*b1cdbd2cSJim Jagielski 		if ( aQueryParam.GetEntry(nQuery).bDoQuery )
1433*b1cdbd2cSJim Jagielski 		{
1434*b1cdbd2cSJim Jagielski 			if (aQueryParam.GetEntry(nQuery).nField == nCol)
1435*b1cdbd2cSJim Jagielski 				bColumnFound = sal_True;
1436*b1cdbd2cSJim Jagielski 
1437*b1cdbd2cSJim Jagielski 			if (nQuery > 0)
1438*b1cdbd2cSJim Jagielski 				if (aQueryParam.GetEntry(nQuery).eConnect != SC_AND)
1439*b1cdbd2cSJim Jagielski 					bSimpleQuery = sal_False;
1440*b1cdbd2cSJim Jagielski 		}
1441*b1cdbd2cSJim Jagielski 
1442*b1cdbd2cSJim Jagielski 	return ( bSimpleQuery && bColumnFound );
1443*b1cdbd2cSJim Jagielski }
1444*b1cdbd2cSJim Jagielski 
DrawComboButton(const Point & rCellPos,long nCellSizeX,long nCellSizeY,sal_Bool bArrowState,sal_Bool bBtnIn)1445*b1cdbd2cSJim Jagielski void ScGridWindow::DrawComboButton( const Point&	rCellPos,
1446*b1cdbd2cSJim Jagielski 									long			nCellSizeX,
1447*b1cdbd2cSJim Jagielski 									long			nCellSizeY,
1448*b1cdbd2cSJim Jagielski                                     sal_Bool            bArrowState,
1449*b1cdbd2cSJim Jagielski 									sal_Bool			bBtnIn )
1450*b1cdbd2cSJim Jagielski {
1451*b1cdbd2cSJim Jagielski 	Point	aScrPos	 = rCellPos;
1452*b1cdbd2cSJim Jagielski 	Size	aBtnSize = aComboButton.GetSizePixel();
1453*b1cdbd2cSJim Jagielski 
1454*b1cdbd2cSJim Jagielski 	if ( nCellSizeX < aBtnSize.Width() || nCellSizeY < aBtnSize.Height() )
1455*b1cdbd2cSJim Jagielski 	{
1456*b1cdbd2cSJim Jagielski 		if ( nCellSizeX < aBtnSize.Width() )
1457*b1cdbd2cSJim Jagielski 			aBtnSize.Width() = nCellSizeX;
1458*b1cdbd2cSJim Jagielski 
1459*b1cdbd2cSJim Jagielski 		if ( nCellSizeY < aBtnSize.Height() )
1460*b1cdbd2cSJim Jagielski 			aBtnSize.Height() = nCellSizeY;
1461*b1cdbd2cSJim Jagielski 
1462*b1cdbd2cSJim Jagielski 		aComboButton.SetSizePixel( aBtnSize );
1463*b1cdbd2cSJim Jagielski 	}
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski 	sal_Bool bLayoutRTL = pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() );
1466*b1cdbd2cSJim Jagielski 
1467*b1cdbd2cSJim Jagielski 	if ( bLayoutRTL )
1468*b1cdbd2cSJim Jagielski 		aScrPos.X() -= nCellSizeX - 1;
1469*b1cdbd2cSJim Jagielski 	else
1470*b1cdbd2cSJim Jagielski 		aScrPos.X() += nCellSizeX - aBtnSize.Width();
1471*b1cdbd2cSJim Jagielski 	aScrPos.Y() += nCellSizeY - aBtnSize.Height();
1472*b1cdbd2cSJim Jagielski 
1473*b1cdbd2cSJim Jagielski 	aComboButton.SetPosPixel( aScrPos );
1474*b1cdbd2cSJim Jagielski 
1475*b1cdbd2cSJim Jagielski 	HideCursor();
1476*b1cdbd2cSJim Jagielski     aComboButton.Draw( bArrowState, bBtnIn );
1477*b1cdbd2cSJim Jagielski 	ShowCursor();
1478*b1cdbd2cSJim Jagielski }
1479*b1cdbd2cSJim Jagielski 
InvertSimple(SCCOL nX1,SCROW nY1,SCCOL nX2,SCROW nY2,sal_Bool bTestMerge,sal_Bool bRepeat)1480*b1cdbd2cSJim Jagielski void ScGridWindow::InvertSimple( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
1481*b1cdbd2cSJim Jagielski 									sal_Bool bTestMerge, sal_Bool bRepeat )
1482*b1cdbd2cSJim Jagielski {
1483*b1cdbd2cSJim Jagielski 	//!	if INVERT_HIGHLIGHT swaps foreground and background (like on Mac),
1484*b1cdbd2cSJim Jagielski 	//!	use INVERT_HIGHLIGHT only for cells that have no background color set
1485*b1cdbd2cSJim Jagielski 	//!	(here and in ScOutputData::DrawMark)
1486*b1cdbd2cSJim Jagielski 
1487*b1cdbd2cSJim Jagielski 	PutInOrder( nX1, nX2 );
1488*b1cdbd2cSJim Jagielski 	PutInOrder( nY1, nY2 );
1489*b1cdbd2cSJim Jagielski 
1490*b1cdbd2cSJim Jagielski 	ScMarkData& rMark = pViewData->GetMarkData();
1491*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pViewData->GetDocument();
1492*b1cdbd2cSJim Jagielski 	SCTAB nTab = pViewData->GetTabNo();
1493*b1cdbd2cSJim Jagielski 
1494*b1cdbd2cSJim Jagielski 	sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
1495*b1cdbd2cSJim Jagielski 	long nLayoutSign = bLayoutRTL ? -1 : 1;
1496*b1cdbd2cSJim Jagielski 
1497*b1cdbd2cSJim Jagielski 	SCCOL nTestX2 = nX2;
1498*b1cdbd2cSJim Jagielski 	SCROW nTestY2 = nY2;
1499*b1cdbd2cSJim Jagielski 	if (bTestMerge)
1500*b1cdbd2cSJim Jagielski 		pDoc->ExtendMerge( nX1,nY1, nTestX2,nTestY2, nTab );
1501*b1cdbd2cSJim Jagielski 
1502*b1cdbd2cSJim Jagielski 	SCCOL nPosX = pViewData->GetPosX( eHWhich );
1503*b1cdbd2cSJim Jagielski 	SCROW nPosY = pViewData->GetPosY( eVWhich );
1504*b1cdbd2cSJim Jagielski 	if (nTestX2 < nPosX || nTestY2 < nPosY)
1505*b1cdbd2cSJim Jagielski 		return;											// unsichtbar
1506*b1cdbd2cSJim Jagielski 	SCCOL nRealX1 = nX1;
1507*b1cdbd2cSJim Jagielski 	if (nX1 < nPosX)
1508*b1cdbd2cSJim Jagielski 		nX1 = nPosX;
1509*b1cdbd2cSJim Jagielski 	if (nY1 < nPosY)
1510*b1cdbd2cSJim Jagielski 		nY1 = nPosY;
1511*b1cdbd2cSJim Jagielski 
1512*b1cdbd2cSJim Jagielski 	SCCOL nXRight = nPosX + pViewData->VisibleCellsX(eHWhich);
1513*b1cdbd2cSJim Jagielski 	if (nXRight > MAXCOL) nXRight = MAXCOL;
1514*b1cdbd2cSJim Jagielski 	SCROW nYBottom = nPosY + pViewData->VisibleCellsY(eVWhich);
1515*b1cdbd2cSJim Jagielski 	if (nYBottom > MAXROW) nYBottom = MAXROW;
1516*b1cdbd2cSJim Jagielski 
1517*b1cdbd2cSJim Jagielski 	if (nX1 > nXRight || nY1 > nYBottom)
1518*b1cdbd2cSJim Jagielski 		return;											// unsichtbar
1519*b1cdbd2cSJim Jagielski 	if (nX2 > nXRight) nX2 = nXRight;
1520*b1cdbd2cSJim Jagielski 	if (nY2 > nYBottom) nY2 = nYBottom;
1521*b1cdbd2cSJim Jagielski 
1522*b1cdbd2cSJim Jagielski 	MapMode aOld = GetMapMode(); SetMapMode(MAP_PIXEL);		// erst nach den return's !!!
1523*b1cdbd2cSJim Jagielski 
1524*b1cdbd2cSJim Jagielski 	double nPPTX = pViewData->GetPPTX();
1525*b1cdbd2cSJim Jagielski 	double nPPTY = pViewData->GetPPTY();
1526*b1cdbd2cSJim Jagielski 
1527*b1cdbd2cSJim Jagielski 	ScInvertMerger aInvert( this );
1528*b1cdbd2cSJim Jagielski 
1529*b1cdbd2cSJim Jagielski 	Point aScrPos = pViewData->GetScrPos( nX1, nY1, eWhich );
1530*b1cdbd2cSJim Jagielski 	long nScrY = aScrPos.Y();
1531*b1cdbd2cSJim Jagielski 	sal_Bool bWasHidden = sal_False;
1532*b1cdbd2cSJim Jagielski 	for (SCROW nY=nY1; nY<=nY2; nY++)
1533*b1cdbd2cSJim Jagielski 	{
1534*b1cdbd2cSJim Jagielski 		sal_Bool bFirstRow = ( nY == nPosY );						// first visible row?
1535*b1cdbd2cSJim Jagielski 		sal_Bool bDoHidden = sal_False;									// versteckte nachholen ?
1536*b1cdbd2cSJim Jagielski 		sal_uInt16 nHeightTwips = pDoc->GetRowHeight( nY,nTab );
1537*b1cdbd2cSJim Jagielski 		sal_Bool bDoRow = ( nHeightTwips != 0 );
1538*b1cdbd2cSJim Jagielski 		if (bDoRow)
1539*b1cdbd2cSJim Jagielski 		{
1540*b1cdbd2cSJim Jagielski 			if (bTestMerge)
1541*b1cdbd2cSJim Jagielski 				if (bWasHidden)					// auf versteckte zusammengefasste testen
1542*b1cdbd2cSJim Jagielski 				{
1543*b1cdbd2cSJim Jagielski //					--nY;						// nY geaendert -> vorherige zeichnen
1544*b1cdbd2cSJim Jagielski 					bDoHidden = sal_True;
1545*b1cdbd2cSJim Jagielski 					bDoRow = sal_True;
1546*b1cdbd2cSJim Jagielski 				}
1547*b1cdbd2cSJim Jagielski 
1548*b1cdbd2cSJim Jagielski 			bWasHidden = sal_False;
1549*b1cdbd2cSJim Jagielski 		}
1550*b1cdbd2cSJim Jagielski 		else
1551*b1cdbd2cSJim Jagielski 		{
1552*b1cdbd2cSJim Jagielski 			bWasHidden = sal_True;
1553*b1cdbd2cSJim Jagielski 			if (bTestMerge)
1554*b1cdbd2cSJim Jagielski 				if (nY==nY2)
1555*b1cdbd2cSJim Jagielski 					bDoRow = sal_True;				// letzte Zeile aus Block
1556*b1cdbd2cSJim Jagielski 		}
1557*b1cdbd2cSJim Jagielski 
1558*b1cdbd2cSJim Jagielski 		if ( bDoRow )
1559*b1cdbd2cSJim Jagielski 		{
1560*b1cdbd2cSJim Jagielski 			SCCOL nLoopEndX = nX2;
1561*b1cdbd2cSJim Jagielski 			if (nX2 < nX1)						// Rest von zusammengefasst
1562*b1cdbd2cSJim Jagielski 			{
1563*b1cdbd2cSJim Jagielski 				SCCOL nStartX = nX1;
1564*b1cdbd2cSJim Jagielski 				while ( ((const ScMergeFlagAttr*)pDoc->
1565*b1cdbd2cSJim Jagielski 							GetAttr(nStartX,nY,nTab,ATTR_MERGE_FLAG))->IsHorOverlapped() )
1566*b1cdbd2cSJim Jagielski 					--nStartX;
1567*b1cdbd2cSJim Jagielski 				if (nStartX <= nX2)
1568*b1cdbd2cSJim Jagielski 					nLoopEndX = nX1;
1569*b1cdbd2cSJim Jagielski 			}
1570*b1cdbd2cSJim Jagielski 
1571*b1cdbd2cSJim Jagielski 			long nEndY = nScrY + ScViewData::ToPixel( nHeightTwips, nPPTY ) - 1;
1572*b1cdbd2cSJim Jagielski 			long nScrX = aScrPos.X();
1573*b1cdbd2cSJim Jagielski 			for (SCCOL nX=nX1; nX<=nLoopEndX; nX++)
1574*b1cdbd2cSJim Jagielski 			{
1575*b1cdbd2cSJim Jagielski 				long nWidth = ScViewData::ToPixel( pDoc->GetColWidth( nX,nTab ), nPPTX );
1576*b1cdbd2cSJim Jagielski 				if ( nWidth > 0 )
1577*b1cdbd2cSJim Jagielski 				{
1578*b1cdbd2cSJim Jagielski 					long nEndX = nScrX + ( nWidth - 1 ) * nLayoutSign;
1579*b1cdbd2cSJim Jagielski 					if (bTestMerge)
1580*b1cdbd2cSJim Jagielski 					{
1581*b1cdbd2cSJim Jagielski 						SCROW nThisY = nY;
1582*b1cdbd2cSJim Jagielski 						const ScPatternAttr* pPattern = pDoc->GetPattern( nX, nY, nTab );
1583*b1cdbd2cSJim Jagielski 						const ScMergeFlagAttr* pMergeFlag = (const ScMergeFlagAttr*) &pPattern->
1584*b1cdbd2cSJim Jagielski 																		GetItem(ATTR_MERGE_FLAG);
1585*b1cdbd2cSJim Jagielski 						if ( pMergeFlag->IsVerOverlapped() && ( bDoHidden || bFirstRow ) )
1586*b1cdbd2cSJim Jagielski 						{
1587*b1cdbd2cSJim Jagielski 							while ( pMergeFlag->IsVerOverlapped() && nThisY > 0 &&
1588*b1cdbd2cSJim Jagielski                                     (pDoc->RowHidden(nThisY-1, nTab) || bFirstRow) )
1589*b1cdbd2cSJim Jagielski 							{
1590*b1cdbd2cSJim Jagielski 								--nThisY;
1591*b1cdbd2cSJim Jagielski 								pPattern = pDoc->GetPattern( nX, nThisY, nTab );
1592*b1cdbd2cSJim Jagielski 								pMergeFlag = (const ScMergeFlagAttr*) &pPattern->GetItem(ATTR_MERGE_FLAG);
1593*b1cdbd2cSJim Jagielski 							}
1594*b1cdbd2cSJim Jagielski 						}
1595*b1cdbd2cSJim Jagielski 
1596*b1cdbd2cSJim Jagielski 						// nur Rest von zusammengefasster zu sehen ?
1597*b1cdbd2cSJim Jagielski 						SCCOL nThisX = nX;
1598*b1cdbd2cSJim Jagielski 						if ( pMergeFlag->IsHorOverlapped() && nX == nPosX && nX > nRealX1 )
1599*b1cdbd2cSJim Jagielski 						{
1600*b1cdbd2cSJim Jagielski 							while ( pMergeFlag->IsHorOverlapped() )
1601*b1cdbd2cSJim Jagielski 							{
1602*b1cdbd2cSJim Jagielski 								--nThisX;
1603*b1cdbd2cSJim Jagielski 								pPattern = pDoc->GetPattern( nThisX, nThisY, nTab );
1604*b1cdbd2cSJim Jagielski 								pMergeFlag = (const ScMergeFlagAttr*) &pPattern->GetItem(ATTR_MERGE_FLAG);
1605*b1cdbd2cSJim Jagielski 							}
1606*b1cdbd2cSJim Jagielski 						}
1607*b1cdbd2cSJim Jagielski 
1608*b1cdbd2cSJim Jagielski 						if ( rMark.IsCellMarked( nThisX, nThisY, sal_True ) == bRepeat )
1609*b1cdbd2cSJim Jagielski 						{
1610*b1cdbd2cSJim Jagielski 							if ( !pMergeFlag->IsOverlapped() )
1611*b1cdbd2cSJim Jagielski 							{
1612*b1cdbd2cSJim Jagielski 								ScMergeAttr* pMerge = (ScMergeAttr*)&pPattern->GetItem(ATTR_MERGE);
1613*b1cdbd2cSJim Jagielski 								if (pMerge->GetColMerge() > 0 || pMerge->GetRowMerge() > 0)
1614*b1cdbd2cSJim Jagielski 								{
1615*b1cdbd2cSJim Jagielski 									Point aEndPos = pViewData->GetScrPos(
1616*b1cdbd2cSJim Jagielski 											nThisX + pMerge->GetColMerge(),
1617*b1cdbd2cSJim Jagielski 											nThisY + pMerge->GetRowMerge(), eWhich );
1618*b1cdbd2cSJim Jagielski 									if ( aEndPos.X() * nLayoutSign > nScrX * nLayoutSign && aEndPos.Y() > nScrY )
1619*b1cdbd2cSJim Jagielski 									{
1620*b1cdbd2cSJim Jagielski 										aInvert.AddRect( Rectangle( nScrX,nScrY,
1621*b1cdbd2cSJim Jagielski 													aEndPos.X()-nLayoutSign,aEndPos.Y()-1 ) );
1622*b1cdbd2cSJim Jagielski 									}
1623*b1cdbd2cSJim Jagielski 								}
1624*b1cdbd2cSJim Jagielski 								else if ( nEndX * nLayoutSign >= nScrX * nLayoutSign && nEndY >= nScrY )
1625*b1cdbd2cSJim Jagielski 								{
1626*b1cdbd2cSJim Jagielski 									aInvert.AddRect( Rectangle( nScrX,nScrY,nEndX,nEndY ) );
1627*b1cdbd2cSJim Jagielski 								}
1628*b1cdbd2cSJim Jagielski 							}
1629*b1cdbd2cSJim Jagielski 						}
1630*b1cdbd2cSJim Jagielski 					}
1631*b1cdbd2cSJim Jagielski 					else		// !bTestMerge
1632*b1cdbd2cSJim Jagielski 					{
1633*b1cdbd2cSJim Jagielski 						if ( rMark.IsCellMarked( nX, nY, sal_True ) == bRepeat &&
1634*b1cdbd2cSJim Jagielski 												nEndX * nLayoutSign >= nScrX * nLayoutSign && nEndY >= nScrY )
1635*b1cdbd2cSJim Jagielski 						{
1636*b1cdbd2cSJim Jagielski 							aInvert.AddRect( Rectangle( nScrX,nScrY,nEndX,nEndY ) );
1637*b1cdbd2cSJim Jagielski 						}
1638*b1cdbd2cSJim Jagielski 					}
1639*b1cdbd2cSJim Jagielski 
1640*b1cdbd2cSJim Jagielski 					nScrX = nEndX + nLayoutSign;
1641*b1cdbd2cSJim Jagielski 				}
1642*b1cdbd2cSJim Jagielski 			}
1643*b1cdbd2cSJim Jagielski 			nScrY = nEndY + 1;
1644*b1cdbd2cSJim Jagielski 		}
1645*b1cdbd2cSJim Jagielski 	}
1646*b1cdbd2cSJim Jagielski 
1647*b1cdbd2cSJim Jagielski 	aInvert.Flush();		// before restoring MapMode
1648*b1cdbd2cSJim Jagielski 
1649*b1cdbd2cSJim Jagielski 	SetMapMode(aOld);
1650*b1cdbd2cSJim Jagielski 
1651*b1cdbd2cSJim Jagielski 	CheckInverted();
1652*b1cdbd2cSJim Jagielski }
1653*b1cdbd2cSJim Jagielski 
GetSelectionRects(::std::vector<Rectangle> & rPixelRects)1654*b1cdbd2cSJim Jagielski void ScGridWindow::GetSelectionRects( ::std::vector< Rectangle >& rPixelRects )
1655*b1cdbd2cSJim Jagielski {
1656*b1cdbd2cSJim Jagielski     // transformed from ScGridWindow::InvertSimple
1657*b1cdbd2cSJim Jagielski 
1658*b1cdbd2cSJim Jagielski //  ScMarkData& rMark = pViewData->GetMarkData();
1659*b1cdbd2cSJim Jagielski     ScMarkData aMultiMark( pViewData->GetMarkData() );
1660*b1cdbd2cSJim Jagielski     aMultiMark.SetMarking( sal_False );
1661*b1cdbd2cSJim Jagielski     aMultiMark.MarkToMulti();
1662*b1cdbd2cSJim Jagielski 
1663*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pViewData->GetDocument();
1664*b1cdbd2cSJim Jagielski 	SCTAB nTab = pViewData->GetTabNo();
1665*b1cdbd2cSJim Jagielski 
1666*b1cdbd2cSJim Jagielski 	sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
1667*b1cdbd2cSJim Jagielski 	long nLayoutSign = bLayoutRTL ? -1 : 1;
1668*b1cdbd2cSJim Jagielski 
1669*b1cdbd2cSJim Jagielski     if ( !aMultiMark.IsMultiMarked() )
1670*b1cdbd2cSJim Jagielski         return;
1671*b1cdbd2cSJim Jagielski 
1672*b1cdbd2cSJim Jagielski     ScRange aMultiRange;
1673*b1cdbd2cSJim Jagielski     aMultiMark.GetMultiMarkArea( aMultiRange );
1674*b1cdbd2cSJim Jagielski     SCCOL nX1 = aMultiRange.aStart.Col();
1675*b1cdbd2cSJim Jagielski     SCROW nY1 = aMultiRange.aStart.Row();
1676*b1cdbd2cSJim Jagielski     SCCOL nX2 = aMultiRange.aEnd.Col();
1677*b1cdbd2cSJim Jagielski     SCROW nY2 = aMultiRange.aEnd.Row();
1678*b1cdbd2cSJim Jagielski 
1679*b1cdbd2cSJim Jagielski 	PutInOrder( nX1, nX2 );
1680*b1cdbd2cSJim Jagielski 	PutInOrder( nY1, nY2 );
1681*b1cdbd2cSJim Jagielski 
1682*b1cdbd2cSJim Jagielski     sal_Bool bTestMerge = sal_True;
1683*b1cdbd2cSJim Jagielski     sal_Bool bRepeat = sal_True;
1684*b1cdbd2cSJim Jagielski 
1685*b1cdbd2cSJim Jagielski 	SCCOL nTestX2 = nX2;
1686*b1cdbd2cSJim Jagielski 	SCROW nTestY2 = nY2;
1687*b1cdbd2cSJim Jagielski 	if (bTestMerge)
1688*b1cdbd2cSJim Jagielski 		pDoc->ExtendMerge( nX1,nY1, nTestX2,nTestY2, nTab );
1689*b1cdbd2cSJim Jagielski 
1690*b1cdbd2cSJim Jagielski 	SCCOL nPosX = pViewData->GetPosX( eHWhich );
1691*b1cdbd2cSJim Jagielski 	SCROW nPosY = pViewData->GetPosY( eVWhich );
1692*b1cdbd2cSJim Jagielski 	if (nTestX2 < nPosX || nTestY2 < nPosY)
1693*b1cdbd2cSJim Jagielski 		return;											// unsichtbar
1694*b1cdbd2cSJim Jagielski 	SCCOL nRealX1 = nX1;
1695*b1cdbd2cSJim Jagielski 	if (nX1 < nPosX)
1696*b1cdbd2cSJim Jagielski 		nX1 = nPosX;
1697*b1cdbd2cSJim Jagielski 	if (nY1 < nPosY)
1698*b1cdbd2cSJim Jagielski 		nY1 = nPosY;
1699*b1cdbd2cSJim Jagielski 
1700*b1cdbd2cSJim Jagielski 	SCCOL nXRight = nPosX + pViewData->VisibleCellsX(eHWhich);
1701*b1cdbd2cSJim Jagielski 	if (nXRight > MAXCOL) nXRight = MAXCOL;
1702*b1cdbd2cSJim Jagielski 	SCROW nYBottom = nPosY + pViewData->VisibleCellsY(eVWhich);
1703*b1cdbd2cSJim Jagielski 	if (nYBottom > MAXROW) nYBottom = MAXROW;
1704*b1cdbd2cSJim Jagielski 
1705*b1cdbd2cSJim Jagielski 	if (nX1 > nXRight || nY1 > nYBottom)
1706*b1cdbd2cSJim Jagielski 		return;											// unsichtbar
1707*b1cdbd2cSJim Jagielski 	if (nX2 > nXRight) nX2 = nXRight;
1708*b1cdbd2cSJim Jagielski 	if (nY2 > nYBottom) nY2 = nYBottom;
1709*b1cdbd2cSJim Jagielski 
1710*b1cdbd2cSJim Jagielski //	MapMode aOld = GetMapMode(); SetMapMode(MAP_PIXEL);		// erst nach den return's !!!
1711*b1cdbd2cSJim Jagielski 
1712*b1cdbd2cSJim Jagielski 	double nPPTX = pViewData->GetPPTX();
1713*b1cdbd2cSJim Jagielski 	double nPPTY = pViewData->GetPPTY();
1714*b1cdbd2cSJim Jagielski 
1715*b1cdbd2cSJim Jagielski     ScInvertMerger aInvert( &rPixelRects );
1716*b1cdbd2cSJim Jagielski 
1717*b1cdbd2cSJim Jagielski 	Point aScrPos = pViewData->GetScrPos( nX1, nY1, eWhich );
1718*b1cdbd2cSJim Jagielski 	long nScrY = aScrPos.Y();
1719*b1cdbd2cSJim Jagielski 	sal_Bool bWasHidden = sal_False;
1720*b1cdbd2cSJim Jagielski 	for (SCROW nY=nY1; nY<=nY2; nY++)
1721*b1cdbd2cSJim Jagielski 	{
1722*b1cdbd2cSJim Jagielski 		sal_Bool bFirstRow = ( nY == nPosY );						// first visible row?
1723*b1cdbd2cSJim Jagielski 		sal_Bool bDoHidden = sal_False;									// versteckte nachholen ?
1724*b1cdbd2cSJim Jagielski 		sal_uInt16 nHeightTwips = pDoc->GetRowHeight( nY,nTab );
1725*b1cdbd2cSJim Jagielski 		sal_Bool bDoRow = ( nHeightTwips != 0 );
1726*b1cdbd2cSJim Jagielski 		if (bDoRow)
1727*b1cdbd2cSJim Jagielski 		{
1728*b1cdbd2cSJim Jagielski 			if (bTestMerge)
1729*b1cdbd2cSJim Jagielski 				if (bWasHidden)					// auf versteckte zusammengefasste testen
1730*b1cdbd2cSJim Jagielski 				{
1731*b1cdbd2cSJim Jagielski 					bDoHidden = sal_True;
1732*b1cdbd2cSJim Jagielski 					bDoRow = sal_True;
1733*b1cdbd2cSJim Jagielski 				}
1734*b1cdbd2cSJim Jagielski 
1735*b1cdbd2cSJim Jagielski 			bWasHidden = sal_False;
1736*b1cdbd2cSJim Jagielski 		}
1737*b1cdbd2cSJim Jagielski 		else
1738*b1cdbd2cSJim Jagielski 		{
1739*b1cdbd2cSJim Jagielski 			bWasHidden = sal_True;
1740*b1cdbd2cSJim Jagielski 			if (bTestMerge)
1741*b1cdbd2cSJim Jagielski 				if (nY==nY2)
1742*b1cdbd2cSJim Jagielski 					bDoRow = sal_True;				// letzte Zeile aus Block
1743*b1cdbd2cSJim Jagielski 		}
1744*b1cdbd2cSJim Jagielski 
1745*b1cdbd2cSJim Jagielski 		if ( bDoRow )
1746*b1cdbd2cSJim Jagielski 		{
1747*b1cdbd2cSJim Jagielski 			SCCOL nLoopEndX = nX2;
1748*b1cdbd2cSJim Jagielski 			if (nX2 < nX1)						// Rest von zusammengefasst
1749*b1cdbd2cSJim Jagielski 			{
1750*b1cdbd2cSJim Jagielski 				SCCOL nStartX = nX1;
1751*b1cdbd2cSJim Jagielski 				while ( ((const ScMergeFlagAttr*)pDoc->
1752*b1cdbd2cSJim Jagielski 							GetAttr(nStartX,nY,nTab,ATTR_MERGE_FLAG))->IsHorOverlapped() )
1753*b1cdbd2cSJim Jagielski 					--nStartX;
1754*b1cdbd2cSJim Jagielski 				if (nStartX <= nX2)
1755*b1cdbd2cSJim Jagielski 					nLoopEndX = nX1;
1756*b1cdbd2cSJim Jagielski 			}
1757*b1cdbd2cSJim Jagielski 
1758*b1cdbd2cSJim Jagielski 			long nEndY = nScrY + ScViewData::ToPixel( nHeightTwips, nPPTY ) - 1;
1759*b1cdbd2cSJim Jagielski 			long nScrX = aScrPos.X();
1760*b1cdbd2cSJim Jagielski 			for (SCCOL nX=nX1; nX<=nLoopEndX; nX++)
1761*b1cdbd2cSJim Jagielski 			{
1762*b1cdbd2cSJim Jagielski 				long nWidth = ScViewData::ToPixel( pDoc->GetColWidth( nX,nTab ), nPPTX );
1763*b1cdbd2cSJim Jagielski 				if ( nWidth > 0 )
1764*b1cdbd2cSJim Jagielski 				{
1765*b1cdbd2cSJim Jagielski 					long nEndX = nScrX + ( nWidth - 1 ) * nLayoutSign;
1766*b1cdbd2cSJim Jagielski 					if (bTestMerge)
1767*b1cdbd2cSJim Jagielski 					{
1768*b1cdbd2cSJim Jagielski 						SCROW nThisY = nY;
1769*b1cdbd2cSJim Jagielski 						const ScPatternAttr* pPattern = pDoc->GetPattern( nX, nY, nTab );
1770*b1cdbd2cSJim Jagielski 						const ScMergeFlagAttr* pMergeFlag = (const ScMergeFlagAttr*) &pPattern->
1771*b1cdbd2cSJim Jagielski 																		GetItem(ATTR_MERGE_FLAG);
1772*b1cdbd2cSJim Jagielski 						if ( pMergeFlag->IsVerOverlapped() && ( bDoHidden || bFirstRow ) )
1773*b1cdbd2cSJim Jagielski 						{
1774*b1cdbd2cSJim Jagielski 							while ( pMergeFlag->IsVerOverlapped() && nThisY > 0 &&
1775*b1cdbd2cSJim Jagielski                                     (pDoc->RowHidden(nThisY-1, nTab) || bFirstRow) )
1776*b1cdbd2cSJim Jagielski 							{
1777*b1cdbd2cSJim Jagielski 								--nThisY;
1778*b1cdbd2cSJim Jagielski 								pPattern = pDoc->GetPattern( nX, nThisY, nTab );
1779*b1cdbd2cSJim Jagielski 								pMergeFlag = (const ScMergeFlagAttr*) &pPattern->GetItem(ATTR_MERGE_FLAG);
1780*b1cdbd2cSJim Jagielski 							}
1781*b1cdbd2cSJim Jagielski 						}
1782*b1cdbd2cSJim Jagielski 
1783*b1cdbd2cSJim Jagielski 						// nur Rest von zusammengefasster zu sehen ?
1784*b1cdbd2cSJim Jagielski 						SCCOL nThisX = nX;
1785*b1cdbd2cSJim Jagielski 						if ( pMergeFlag->IsHorOverlapped() && nX == nPosX && nX > nRealX1 )
1786*b1cdbd2cSJim Jagielski 						{
1787*b1cdbd2cSJim Jagielski 							while ( pMergeFlag->IsHorOverlapped() )
1788*b1cdbd2cSJim Jagielski 							{
1789*b1cdbd2cSJim Jagielski 								--nThisX;
1790*b1cdbd2cSJim Jagielski 								pPattern = pDoc->GetPattern( nThisX, nThisY, nTab );
1791*b1cdbd2cSJim Jagielski 								pMergeFlag = (const ScMergeFlagAttr*) &pPattern->GetItem(ATTR_MERGE_FLAG);
1792*b1cdbd2cSJim Jagielski 							}
1793*b1cdbd2cSJim Jagielski 						}
1794*b1cdbd2cSJim Jagielski 
1795*b1cdbd2cSJim Jagielski 						if ( aMultiMark.IsCellMarked( nThisX, nThisY, sal_True ) == bRepeat )
1796*b1cdbd2cSJim Jagielski 						{
1797*b1cdbd2cSJim Jagielski 							if ( !pMergeFlag->IsOverlapped() )
1798*b1cdbd2cSJim Jagielski 							{
1799*b1cdbd2cSJim Jagielski 								ScMergeAttr* pMerge = (ScMergeAttr*)&pPattern->GetItem(ATTR_MERGE);
1800*b1cdbd2cSJim Jagielski 								if (pMerge->GetColMerge() > 0 || pMerge->GetRowMerge() > 0)
1801*b1cdbd2cSJim Jagielski 								{
1802*b1cdbd2cSJim Jagielski 									Point aEndPos = pViewData->GetScrPos(
1803*b1cdbd2cSJim Jagielski 											nThisX + pMerge->GetColMerge(),
1804*b1cdbd2cSJim Jagielski 											nThisY + pMerge->GetRowMerge(), eWhich );
1805*b1cdbd2cSJim Jagielski 									if ( aEndPos.X() * nLayoutSign > nScrX * nLayoutSign && aEndPos.Y() > nScrY )
1806*b1cdbd2cSJim Jagielski 									{
1807*b1cdbd2cSJim Jagielski 										aInvert.AddRect( Rectangle( nScrX,nScrY,
1808*b1cdbd2cSJim Jagielski 													aEndPos.X()-nLayoutSign,aEndPos.Y()-1 ) );
1809*b1cdbd2cSJim Jagielski 									}
1810*b1cdbd2cSJim Jagielski 								}
1811*b1cdbd2cSJim Jagielski 								else if ( nEndX * nLayoutSign >= nScrX * nLayoutSign && nEndY >= nScrY )
1812*b1cdbd2cSJim Jagielski 								{
1813*b1cdbd2cSJim Jagielski 									aInvert.AddRect( Rectangle( nScrX,nScrY,nEndX,nEndY ) );
1814*b1cdbd2cSJim Jagielski 								}
1815*b1cdbd2cSJim Jagielski 							}
1816*b1cdbd2cSJim Jagielski 						}
1817*b1cdbd2cSJim Jagielski 					}
1818*b1cdbd2cSJim Jagielski 					else		// !bTestMerge
1819*b1cdbd2cSJim Jagielski 					{
1820*b1cdbd2cSJim Jagielski 						if ( aMultiMark.IsCellMarked( nX, nY, sal_True ) == bRepeat &&
1821*b1cdbd2cSJim Jagielski 												nEndX * nLayoutSign >= nScrX * nLayoutSign && nEndY >= nScrY )
1822*b1cdbd2cSJim Jagielski 						{
1823*b1cdbd2cSJim Jagielski 							aInvert.AddRect( Rectangle( nScrX,nScrY,nEndX,nEndY ) );
1824*b1cdbd2cSJim Jagielski 						}
1825*b1cdbd2cSJim Jagielski 					}
1826*b1cdbd2cSJim Jagielski 
1827*b1cdbd2cSJim Jagielski 					nScrX = nEndX + nLayoutSign;
1828*b1cdbd2cSJim Jagielski 				}
1829*b1cdbd2cSJim Jagielski 			}
1830*b1cdbd2cSJim Jagielski 			nScrY = nEndY + 1;
1831*b1cdbd2cSJim Jagielski 		}
1832*b1cdbd2cSJim Jagielski 	}
1833*b1cdbd2cSJim Jagielski 
1834*b1cdbd2cSJim Jagielski //	aInvert.Flush();		// before restoring MapMode
1835*b1cdbd2cSJim Jagielski }
1836*b1cdbd2cSJim Jagielski 
1837*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
1838*b1cdbd2cSJim Jagielski 
1839*b1cdbd2cSJim Jagielski //UNUSED2008-05  void ScGridWindow::DrawDragRect( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2 )
1840*b1cdbd2cSJim Jagielski //UNUSED2008-05  {
1841*b1cdbd2cSJim Jagielski //UNUSED2008-05      if ( nX2 < pViewData->GetPosX(eHWhich) || nY2 < pViewData->GetPosY(eVWhich) )
1842*b1cdbd2cSJim Jagielski //UNUSED2008-05          return;
1843*b1cdbd2cSJim Jagielski //UNUSED2008-05
1844*b1cdbd2cSJim Jagielski //UNUSED2008-05      Update();           // wegen XOR
1845*b1cdbd2cSJim Jagielski //UNUSED2008-05
1846*b1cdbd2cSJim Jagielski //UNUSED2008-05      MapMode aOld = GetMapMode(); SetMapMode(MAP_PIXEL);
1847*b1cdbd2cSJim Jagielski //UNUSED2008-05
1848*b1cdbd2cSJim Jagielski //UNUSED2008-05      SCTAB nTab = pViewData->GetTabNo();
1849*b1cdbd2cSJim Jagielski //UNUSED2008-05
1850*b1cdbd2cSJim Jagielski //UNUSED2008-05      SCCOL nPosX = pViewData->GetPosX(WhichH(eWhich));
1851*b1cdbd2cSJim Jagielski //UNUSED2008-05      SCROW nPosY = pViewData->GetPosY(WhichV(eWhich));
1852*b1cdbd2cSJim Jagielski //UNUSED2008-05      if (nX1 < nPosX) nX1 = nPosX;
1853*b1cdbd2cSJim Jagielski //UNUSED2008-05      if (nX2 < nPosX) nX2 = nPosX;
1854*b1cdbd2cSJim Jagielski //UNUSED2008-05      if (nY1 < nPosY) nY1 = nPosY;
1855*b1cdbd2cSJim Jagielski //UNUSED2008-05      if (nY2 < nPosY) nY2 = nPosY;
1856*b1cdbd2cSJim Jagielski //UNUSED2008-05
1857*b1cdbd2cSJim Jagielski //UNUSED2008-05      Point aScrPos( pViewData->GetScrPos( nX1, nY1, eWhich ) );
1858*b1cdbd2cSJim Jagielski //UNUSED2008-05
1859*b1cdbd2cSJim Jagielski //UNUSED2008-05      long nSizeXPix=0;
1860*b1cdbd2cSJim Jagielski //UNUSED2008-05      long nSizeYPix=0;
1861*b1cdbd2cSJim Jagielski //UNUSED2008-05      ScDocument* pDoc = pViewData->GetDocument();
1862*b1cdbd2cSJim Jagielski //UNUSED2008-05      double nPPTX = pViewData->GetPPTX();
1863*b1cdbd2cSJim Jagielski //UNUSED2008-05      double nPPTY = pViewData->GetPPTY();
1864*b1cdbd2cSJim Jagielski //UNUSED2008-05      SCCOLROW i;
1865*b1cdbd2cSJim Jagielski //UNUSED2008-05
1866*b1cdbd2cSJim Jagielski //UNUSED2008-05      sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
1867*b1cdbd2cSJim Jagielski //UNUSED2008-05      long nLayoutSign = bLayoutRTL ? -1 : 1;
1868*b1cdbd2cSJim Jagielski //UNUSED2008-05
1869*b1cdbd2cSJim Jagielski //UNUSED2008-05      if (ValidCol(nX2) && nX2>=nX1)
1870*b1cdbd2cSJim Jagielski //UNUSED2008-05          for (i=nX1; i<=nX2; i++)
1871*b1cdbd2cSJim Jagielski //UNUSED2008-05              nSizeXPix += ScViewData::ToPixel( pDoc->GetColWidth( static_cast<SCCOL>(i), nTab ), nPPTX );
1872*b1cdbd2cSJim Jagielski //UNUSED2008-05      else
1873*b1cdbd2cSJim Jagielski //UNUSED2008-05      {
1874*b1cdbd2cSJim Jagielski //UNUSED2008-05          aScrPos.X() -= nLayoutSign;
1875*b1cdbd2cSJim Jagielski //UNUSED2008-05          nSizeXPix   += 2;
1876*b1cdbd2cSJim Jagielski //UNUSED2008-05      }
1877*b1cdbd2cSJim Jagielski //UNUSED2008-05
1878*b1cdbd2cSJim Jagielski //UNUSED2008-05      if (ValidRow(nY2) && nY2>=nY1)
1879*b1cdbd2cSJim Jagielski //UNUSED2008-05          for (i=nY1; i<=nY2; i++)
1880*b1cdbd2cSJim Jagielski //UNUSED2008-05              nSizeYPix += ScViewData::ToPixel( pDoc->GetRowHeight( i, nTab ), nPPTY );
1881*b1cdbd2cSJim Jagielski //UNUSED2008-05      else
1882*b1cdbd2cSJim Jagielski //UNUSED2008-05      {
1883*b1cdbd2cSJim Jagielski //UNUSED2008-05          aScrPos.Y() -= 1;
1884*b1cdbd2cSJim Jagielski //UNUSED2008-05          nSizeYPix   += 2;
1885*b1cdbd2cSJim Jagielski //UNUSED2008-05      }
1886*b1cdbd2cSJim Jagielski //UNUSED2008-05
1887*b1cdbd2cSJim Jagielski //UNUSED2008-05      aScrPos.X() -= 2 * nLayoutSign;
1888*b1cdbd2cSJim Jagielski //UNUSED2008-05      aScrPos.Y() -= 2;
1889*b1cdbd2cSJim Jagielski //UNUSED2008-05  //	Rectangle aRect( aScrPos, Size( nSizeXPix + 3, nSizeYPix + 3 ) );
1890*b1cdbd2cSJim Jagielski //UNUSED2008-05      Rectangle aRect( aScrPos.X(), aScrPos.Y(),
1891*b1cdbd2cSJim Jagielski //UNUSED2008-05                       aScrPos.X() + ( nSizeXPix + 2 ) * nLayoutSign, aScrPos.Y() + nSizeYPix + 2 );
1892*b1cdbd2cSJim Jagielski //UNUSED2008-05      if ( bLayoutRTL )
1893*b1cdbd2cSJim Jagielski //UNUSED2008-05      {
1894*b1cdbd2cSJim Jagielski //UNUSED2008-05          aRect.Left() = aRect.Right();   // end position is left
1895*b1cdbd2cSJim Jagielski //UNUSED2008-05          aRect.Right() = aScrPos.X();
1896*b1cdbd2cSJim Jagielski //UNUSED2008-05      }
1897*b1cdbd2cSJim Jagielski //UNUSED2008-05
1898*b1cdbd2cSJim Jagielski //UNUSED2008-05      Invert(Rectangle( aRect.Left(), aRect.Top(), aRect.Left()+2, aRect.Bottom() ));
1899*b1cdbd2cSJim Jagielski //UNUSED2008-05      Invert(Rectangle( aRect.Right()-2, aRect.Top(), aRect.Right(), aRect.Bottom() ));
1900*b1cdbd2cSJim Jagielski //UNUSED2008-05      Invert(Rectangle( aRect.Left()+3, aRect.Top(), aRect.Right()-3, aRect.Top()+2 ));
1901*b1cdbd2cSJim Jagielski //UNUSED2008-05      Invert(Rectangle( aRect.Left()+3, aRect.Bottom()-2, aRect.Right()-3, aRect.Bottom() ));
1902*b1cdbd2cSJim Jagielski //UNUSED2008-05
1903*b1cdbd2cSJim Jagielski //UNUSED2008-05      SetMapMode(aOld);
1904*b1cdbd2cSJim Jagielski //UNUSED2008-05  }
1905*b1cdbd2cSJim Jagielski 
1906*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
1907*b1cdbd2cSJim Jagielski 
DrawCursor()1908*b1cdbd2cSJim Jagielski void ScGridWindow::DrawCursor()
1909*b1cdbd2cSJim Jagielski {
1910*b1cdbd2cSJim Jagielski // #114409#
1911*b1cdbd2cSJim Jagielski //	SCTAB nTab = pViewData->GetTabNo();
1912*b1cdbd2cSJim Jagielski //	SCCOL nX = pViewData->GetCurX();
1913*b1cdbd2cSJim Jagielski //	SCROW nY = pViewData->GetCurY();
1914*b1cdbd2cSJim Jagielski //
1915*b1cdbd2cSJim Jagielski //	//	in verdeckten Zellen nicht zeichnen
1916*b1cdbd2cSJim Jagielski //
1917*b1cdbd2cSJim Jagielski //	ScDocument* pDoc = pViewData->GetDocument();
1918*b1cdbd2cSJim Jagielski //	const ScPatternAttr* pPattern = pDoc->GetPattern(nX,nY,nTab);
1919*b1cdbd2cSJim Jagielski //	const ScMergeFlagAttr& rMerge = (const ScMergeFlagAttr&) pPattern->GetItem(ATTR_MERGE_FLAG);
1920*b1cdbd2cSJim Jagielski //	if (rMerge.IsOverlapped())
1921*b1cdbd2cSJim Jagielski //		return;
1922*b1cdbd2cSJim Jagielski //
1923*b1cdbd2cSJim Jagielski //	//	links/oben ausserhalb des Bildschirms ?
1924*b1cdbd2cSJim Jagielski //
1925*b1cdbd2cSJim Jagielski //	sal_Bool bVis = ( nX>=pViewData->GetPosX(eHWhich) && nY>=pViewData->GetPosY(eVWhich) );
1926*b1cdbd2cSJim Jagielski //	if (!bVis)
1927*b1cdbd2cSJim Jagielski //	{
1928*b1cdbd2cSJim Jagielski //		SCCOL nEndX = nX;
1929*b1cdbd2cSJim Jagielski //		SCROW nEndY = nY;
1930*b1cdbd2cSJim Jagielski //		ScDocument* pDoc = pViewData->GetDocument();
1931*b1cdbd2cSJim Jagielski //		const ScMergeAttr& rMerge = (const ScMergeAttr&) pPattern->GetItem(ATTR_MERGE);
1932*b1cdbd2cSJim Jagielski //		if (rMerge.GetColMerge() > 1)
1933*b1cdbd2cSJim Jagielski //			nEndX += rMerge.GetColMerge()-1;
1934*b1cdbd2cSJim Jagielski //		if (rMerge.GetRowMerge() > 1)
1935*b1cdbd2cSJim Jagielski //			nEndY += rMerge.GetRowMerge()-1;
1936*b1cdbd2cSJim Jagielski //		bVis = ( nEndX>=pViewData->GetPosX(eHWhich) && nEndY>=pViewData->GetPosY(eVWhich) );
1937*b1cdbd2cSJim Jagielski //	}
1938*b1cdbd2cSJim Jagielski //
1939*b1cdbd2cSJim Jagielski //	if ( bVis )
1940*b1cdbd2cSJim Jagielski //	{
1941*b1cdbd2cSJim Jagielski //		//	hier kein Update, da aus Paint gerufen und laut Zaehler Cursor schon da
1942*b1cdbd2cSJim Jagielski //		//	wenn Update noetig, dann bei Hide/Showcursor vor dem Hoch-/Runterzaehlen
1943*b1cdbd2cSJim Jagielski //
1944*b1cdbd2cSJim Jagielski //		MapMode aOld = GetMapMode(); SetMapMode(MAP_PIXEL);
1945*b1cdbd2cSJim Jagielski //
1946*b1cdbd2cSJim Jagielski //		Point aScrPos = pViewData->GetScrPos( nX, nY, eWhich, sal_True );
1947*b1cdbd2cSJim Jagielski //		sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
1948*b1cdbd2cSJim Jagielski //
1949*b1cdbd2cSJim Jagielski //		//	completely right of/below the screen?
1950*b1cdbd2cSJim Jagielski //		//	(test with logical start position in aScrPos)
1951*b1cdbd2cSJim Jagielski //		sal_Bool bMaybeVisible;
1952*b1cdbd2cSJim Jagielski //		if ( bLayoutRTL )
1953*b1cdbd2cSJim Jagielski //			bMaybeVisible = ( aScrPos.X() >= -2 && aScrPos.Y() >= -2 );
1954*b1cdbd2cSJim Jagielski //		else
1955*b1cdbd2cSJim Jagielski //		{
1956*b1cdbd2cSJim Jagielski //			Size aOutSize = GetOutputSizePixel();
1957*b1cdbd2cSJim Jagielski //			bMaybeVisible = ( aScrPos.X() <= aOutSize.Width() + 2 && aScrPos.Y() <= aOutSize.Height() + 2 );
1958*b1cdbd2cSJim Jagielski //		}
1959*b1cdbd2cSJim Jagielski //		if ( bMaybeVisible )
1960*b1cdbd2cSJim Jagielski //		{
1961*b1cdbd2cSJim Jagielski //			long nSizeXPix;
1962*b1cdbd2cSJim Jagielski //			long nSizeYPix;
1963*b1cdbd2cSJim Jagielski //			pViewData->GetMergeSizePixel( nX, nY, nSizeXPix, nSizeYPix );
1964*b1cdbd2cSJim Jagielski //
1965*b1cdbd2cSJim Jagielski //			if ( bLayoutRTL )
1966*b1cdbd2cSJim Jagielski //				aScrPos.X() -= nSizeXPix - 2;		// move instead of mirroring
1967*b1cdbd2cSJim Jagielski //
1968*b1cdbd2cSJim Jagielski //			sal_Bool bFix = ( pViewData->GetHSplitMode() == SC_SPLIT_FIX ||
1969*b1cdbd2cSJim Jagielski //							pViewData->GetVSplitMode() == SC_SPLIT_FIX );
1970*b1cdbd2cSJim Jagielski //			if ( pViewData->GetActivePart()==eWhich || bFix )
1971*b1cdbd2cSJim Jagielski //			{
1972*b1cdbd2cSJim Jagielski //				//	old UNX version with two Invert calls causes flicker.
1973*b1cdbd2cSJim Jagielski //				//	if optimization is needed, a new flag should be added
1974*b1cdbd2cSJim Jagielski //				//	to InvertTracking
1975*b1cdbd2cSJim Jagielski //
1976*b1cdbd2cSJim Jagielski //				aScrPos.X() -= 2;
1977*b1cdbd2cSJim Jagielski //				aScrPos.Y() -= 2;
1978*b1cdbd2cSJim Jagielski //				Rectangle aRect( aScrPos, Size( nSizeXPix + 3, nSizeYPix + 3 ) );
1979*b1cdbd2cSJim Jagielski //
1980*b1cdbd2cSJim Jagielski //				Invert(Rectangle( aRect.Left(), aRect.Top(), aRect.Left()+2, aRect.Bottom() ));
1981*b1cdbd2cSJim Jagielski //				Invert(Rectangle( aRect.Right()-2, aRect.Top(), aRect.Right(), aRect.Bottom() ));
1982*b1cdbd2cSJim Jagielski //				Invert(Rectangle( aRect.Left()+3, aRect.Top(), aRect.Right()-3, aRect.Top()+2 ));
1983*b1cdbd2cSJim Jagielski //				Invert(Rectangle( aRect.Left()+3, aRect.Bottom()-2, aRect.Right()-3, aRect.Bottom() ));
1984*b1cdbd2cSJim Jagielski //			}
1985*b1cdbd2cSJim Jagielski //			else
1986*b1cdbd2cSJim Jagielski //			{
1987*b1cdbd2cSJim Jagielski //				Rectangle aRect( aScrPos, Size( nSizeXPix - 1, nSizeYPix - 1 ) );
1988*b1cdbd2cSJim Jagielski //				Invert( aRect );
1989*b1cdbd2cSJim Jagielski //			}
1990*b1cdbd2cSJim Jagielski //		}
1991*b1cdbd2cSJim Jagielski //
1992*b1cdbd2cSJim Jagielski //		SetMapMode(aOld);
1993*b1cdbd2cSJim Jagielski //	}
1994*b1cdbd2cSJim Jagielski }
1995*b1cdbd2cSJim Jagielski 
1996*b1cdbd2cSJim Jagielski 	//	AutoFill-Anfasser:
1997*b1cdbd2cSJim Jagielski 
DrawAutoFillMark()1998*b1cdbd2cSJim Jagielski void ScGridWindow::DrawAutoFillMark()
1999*b1cdbd2cSJim Jagielski {
2000*b1cdbd2cSJim Jagielski // #114409#
2001*b1cdbd2cSJim Jagielski //	if ( bAutoMarkVisible && aAutoMarkPos.Tab() == pViewData->GetTabNo() )
2002*b1cdbd2cSJim Jagielski //	{
2003*b1cdbd2cSJim Jagielski //		SCCOL nX = aAutoMarkPos.Col();
2004*b1cdbd2cSJim Jagielski //		SCROW nY = aAutoMarkPos.Row();
2005*b1cdbd2cSJim Jagielski //		SCTAB nTab = pViewData->GetTabNo();
2006*b1cdbd2cSJim Jagielski //		ScDocument* pDoc = pViewData->GetDocument();
2007*b1cdbd2cSJim Jagielski //		sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
2008*b1cdbd2cSJim Jagielski //
2009*b1cdbd2cSJim Jagielski //		Point aFillPos = pViewData->GetScrPos( nX, nY, eWhich, sal_True );
2010*b1cdbd2cSJim Jagielski //		long nSizeXPix;
2011*b1cdbd2cSJim Jagielski //		long nSizeYPix;
2012*b1cdbd2cSJim Jagielski //		pViewData->GetMergeSizePixel( nX, nY, nSizeXPix, nSizeYPix );
2013*b1cdbd2cSJim Jagielski //		if ( bLayoutRTL )
2014*b1cdbd2cSJim Jagielski //			aFillPos.X() -= nSizeXPix + 3;
2015*b1cdbd2cSJim Jagielski //		else
2016*b1cdbd2cSJim Jagielski //			aFillPos.X() += nSizeXPix - 2;
2017*b1cdbd2cSJim Jagielski //
2018*b1cdbd2cSJim Jagielski //		aFillPos.Y() += nSizeYPix;
2019*b1cdbd2cSJim Jagielski //		aFillPos.Y() -= 2;
2020*b1cdbd2cSJim Jagielski //		Rectangle aFillRect( aFillPos, Size(6,6) );
2021*b1cdbd2cSJim Jagielski //		//	Anfasser von Zeichenobjekten sind 7*7
2022*b1cdbd2cSJim Jagielski //
2023*b1cdbd2cSJim Jagielski //		MapMode aOld = GetMapMode(); SetMapMode(MAP_PIXEL);
2024*b1cdbd2cSJim Jagielski //		Invert( aFillRect );
2025*b1cdbd2cSJim Jagielski //		SetMapMode(aOld);
2026*b1cdbd2cSJim Jagielski //	}
2027*b1cdbd2cSJim Jagielski }
2028*b1cdbd2cSJim Jagielski 
2029*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
2030*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)2031*b1cdbd2cSJim Jagielski void ScGridWindow::DataChanged( const DataChangedEvent& rDCEvt )
2032*b1cdbd2cSJim Jagielski {
2033*b1cdbd2cSJim Jagielski 	Window::DataChanged(rDCEvt);
2034*b1cdbd2cSJim Jagielski 
2035*b1cdbd2cSJim Jagielski 	if ( (rDCEvt.GetType() == DATACHANGED_PRINTER) ||
2036*b1cdbd2cSJim Jagielski 		 (rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
2037*b1cdbd2cSJim Jagielski 		 (rDCEvt.GetType() == DATACHANGED_FONTS) ||
2038*b1cdbd2cSJim Jagielski 		 (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
2039*b1cdbd2cSJim Jagielski 		 ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
2040*b1cdbd2cSJim Jagielski 		  (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
2041*b1cdbd2cSJim Jagielski 	{
2042*b1cdbd2cSJim Jagielski 		if ( rDCEvt.GetType() == DATACHANGED_FONTS && eWhich == pViewData->GetActivePart() )
2043*b1cdbd2cSJim Jagielski 			pViewData->GetDocShell()->UpdateFontList();
2044*b1cdbd2cSJim Jagielski 
2045*b1cdbd2cSJim Jagielski 		if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
2046*b1cdbd2cSJim Jagielski 			 (rDCEvt.GetFlags() & SETTINGS_STYLE) )
2047*b1cdbd2cSJim Jagielski 		{
2048*b1cdbd2cSJim Jagielski 			if ( eWhich == pViewData->GetActivePart() )		// only once for the view
2049*b1cdbd2cSJim Jagielski 			{
2050*b1cdbd2cSJim Jagielski 				ScTabView* pView = pViewData->GetView();
2051*b1cdbd2cSJim Jagielski 
2052*b1cdbd2cSJim Jagielski 				//	update scale in case the UI ScreenZoom has changed
2053*b1cdbd2cSJim Jagielski 				ScGlobal::UpdatePPT(this);
2054*b1cdbd2cSJim Jagielski 				pView->RecalcPPT();
2055*b1cdbd2cSJim Jagielski 
2056*b1cdbd2cSJim Jagielski 				//	RepeatResize in case scroll bar sizes have changed
2057*b1cdbd2cSJim Jagielski 				pView->RepeatResize();
2058*b1cdbd2cSJim Jagielski                 pView->UpdateAllOverlays();
2059*b1cdbd2cSJim Jagielski 
2060*b1cdbd2cSJim Jagielski 				//	invalidate cell attribs in input handler, in case the
2061*b1cdbd2cSJim Jagielski 				//	EditEngine BackgroundColor has to be changed
2062*b1cdbd2cSJim Jagielski 				if ( pViewData->IsActive() )
2063*b1cdbd2cSJim Jagielski 				{
2064*b1cdbd2cSJim Jagielski 					ScInputHandler* pHdl = SC_MOD()->GetInputHdl();
2065*b1cdbd2cSJim Jagielski 					if (pHdl)
2066*b1cdbd2cSJim Jagielski 						pHdl->ForgetLastPattern();
2067*b1cdbd2cSJim Jagielski 				}
2068*b1cdbd2cSJim Jagielski 			}
2069*b1cdbd2cSJim Jagielski 		}
2070*b1cdbd2cSJim Jagielski 
2071*b1cdbd2cSJim Jagielski 		Invalidate();
2072*b1cdbd2cSJim Jagielski 	}
2073*b1cdbd2cSJim Jagielski }
2074*b1cdbd2cSJim Jagielski 
2075*b1cdbd2cSJim Jagielski 
2076*b1cdbd2cSJim Jagielski 
2077*b1cdbd2cSJim Jagielski 
2078