xref: /aoo41x/main/sc/source/ui/view/gridmerg.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 
32 
33 #include <vcl/outdev.hxx>
34 
35 #include "gridmerg.hxx"
36 
37 //------------------------------------------------------------------
38 
39 ScGridMerger::ScGridMerger( OutputDevice* pOutDev, long nOnePixelX, long nOnePixelY ) :
40 	pDev( pOutDev ),
41 	nOneX( nOnePixelX ),
42 	nOneY( nOnePixelY ),
43 	nCount( 0 ),
44 	bVertical( sal_False )
45 {
46 	//	optimize (DrawGrid) only for pixel MapMode,
47 	//	to avoid rounding errors
48 
49 	bOptimize = ( pDev->GetMapMode().GetMapUnit() == MAP_PIXEL );
50 }
51 
52 ScGridMerger::~ScGridMerger()
53 {
54 	Flush();
55 }
56 
57 void ScGridMerger::AddLine( long nStart, long nEnd, long nPos )
58 {
59 	if ( nCount )
60 	{
61 		//	not first line - test fix position
62 		//	more than one previous line - test distance
63 
64 		if ( nStart != nFixStart || nEnd != nFixEnd )
65 		{
66 			if ( nCount == 1 && nPos == nVarStart &&
67 					( nStart == nFixEnd ||
68 						nStart == nFixEnd + ( bVertical ? nOneY : nOneX ) ) )
69 			{
70 				//	additional optimization: extend connected lines
71 				//	keep nCount at 1
72 				nFixEnd = nEnd;
73 			}
74 			else
75 				Flush();
76 		}
77 		else if ( nCount == 1 )
78 		{
79 			nVarDiff = nPos - nVarStart;
80 			++nCount;
81 		}
82 		else if ( nPos != nVarStart + nCount * nVarDiff )		//! keep VarEnd?
83 			Flush();
84 		else
85 			++nCount;
86 	}
87 
88 	if ( !nCount )
89 	{
90 		//	first line (or flushed above) - just store
91 
92 		nFixStart = nStart;
93 		nFixEnd   = nEnd;
94 		nVarStart = nPos;
95 		nVarDiff  = 0;
96 		nCount    = 1;
97 	}
98 }
99 
100 void ScGridMerger::AddHorLine( long nX1, long nX2, long nY )
101 {
102 	if ( bOptimize )
103 	{
104 		if ( bVertical )
105 		{
106 			Flush();
107 			bVertical = sal_False;
108 		}
109 		AddLine( nX1, nX2, nY );
110 	}
111 	else
112 		pDev->DrawLine( Point( nX1, nY ), Point( nX2, nY ) );
113 }
114 
115 void ScGridMerger::AddVerLine( long nX, long nY1, long nY2 )
116 {
117 	if ( bOptimize )
118 	{
119 		if ( !bVertical )
120 		{
121 			Flush();
122 			bVertical = sal_True;
123 		}
124 		AddLine( nY1, nY2, nX );
125 	}
126 	else
127 		pDev->DrawLine( Point( nX, nY1 ), Point( nX, nY2 ) );
128 }
129 
130 void ScGridMerger::Flush()
131 {
132 	if (nCount)
133 	{
134 		if (bVertical)
135 		{
136 			if ( nCount == 1 )
137 				pDev->DrawLine( Point( nVarStart, nFixStart ), Point( nVarStart, nFixEnd ) );
138 			else
139 			{
140 				long nVarEnd = nVarStart + ( nCount - 1 ) * nVarDiff;
141 				if ( nVarDiff < 0 )
142 				{
143 					//	nVarDiff is negative in RTL layout mode
144 					//	Change the positions so DrawGrid is called with a positive distance
145 					//	(nVarStart / nVarDiff can be modified, aren't used after Flush)
146 
147 					nVarDiff = -nVarDiff;
148 					long nTemp = nVarStart;
149 					nVarStart = nVarEnd;
150 					nVarEnd = nTemp;
151 				}
152 				pDev->DrawGrid( Rectangle( nVarStart, nFixStart, nVarEnd, nFixEnd ),
153 								Size( nVarDiff, nFixEnd - nFixStart ),
154 								GRID_VERTLINES );
155 			}
156 		}
157 		else
158 		{
159 			if ( nCount == 1 )
160 				pDev->DrawLine( Point( nFixStart, nVarStart ), Point( nFixEnd, nVarStart ) );
161 			else
162 			{
163 				long nVarEnd = nVarStart + ( nCount - 1 ) * nVarDiff;
164 				pDev->DrawGrid( Rectangle( nFixStart, nVarStart, nFixEnd, nVarEnd ),
165 								Size( nFixEnd - nFixStart, nVarDiff ),
166 								GRID_HORZLINES );
167 			}
168 		}
169 		nCount = 0;
170 	}
171 }
172 
173 
174 
175