xref: /trunk/main/sc/source/core/data/clipparam.cxx (revision b3f79822)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 // INCLUDE ---------------------------------------------------------------
28 
29 #include "clipparam.hxx"
30 
31 using ::std::vector;
32 
ScClipParam()33 ScClipParam::ScClipParam() :
34     meDirection(Unspecified),
35     mbCutMode(false),
36     mnSourceDocID(0)
37 {
38 }
39 
ScClipParam(const ScRange & rRange,bool bCutMode)40 ScClipParam::ScClipParam(const ScRange& rRange, bool bCutMode) :
41     meDirection(Unspecified),
42     mbCutMode(bCutMode),
43     mnSourceDocID(0)
44 {
45     maRanges.Append(rRange);
46 }
47 
ScClipParam(const ScClipParam & r)48 ScClipParam::ScClipParam(const ScClipParam& r) :
49     maRanges(r.maRanges),
50     meDirection(r.meDirection),
51     mbCutMode(r.mbCutMode),
52     mnSourceDocID(r.mnSourceDocID),
53     maProtectedChartRangesVector(r.maProtectedChartRangesVector)
54 {
55 }
56 
isMultiRange() const57 bool ScClipParam::isMultiRange() const
58 {
59     return maRanges.Count() > 1;
60 }
61 
getPasteColSize()62 SCCOL ScClipParam::getPasteColSize()
63 {
64     if (!maRanges.Count())
65         return 0;
66 
67     switch (meDirection)
68     {
69         case ScClipParam::Column:
70         {
71             SCCOL nColSize = 0;
72             for (ScRangePtr p = maRanges.First(); p; p = maRanges.Next())
73                 nColSize += p->aEnd.Col() - p->aStart.Col() + 1;
74             return nColSize;
75         }
76         case ScClipParam::Row:
77         {
78             // We assume that all ranges have identical column size.
79             const ScRange& rRange = *maRanges.First();
80             return rRange.aEnd.Col() - rRange.aStart.Col() + 1;
81         }
82         case ScClipParam::Unspecified:
83         default:
84             ;
85     }
86     return 0;
87 }
88 
getPasteRowSize()89 SCROW ScClipParam::getPasteRowSize()
90 {
91     if (!maRanges.Count())
92         return 0;
93 
94     switch (meDirection)
95     {
96         case ScClipParam::Column:
97         {
98             // We assume that all ranges have identical row size.
99             const ScRange& rRange = *maRanges.First();
100             return rRange.aEnd.Row() - rRange.aStart.Row() + 1;
101         }
102         case ScClipParam::Row:
103         {
104             SCROW nRowSize = 0;
105             for (ScRangePtr p = maRanges.First(); p; p = maRanges.Next())
106                 nRowSize += p->aEnd.Row() - p->aStart.Row() + 1;
107             return nRowSize;
108         }
109         case ScClipParam::Unspecified:
110         default:
111             ;
112     }
113     return 0;
114 }
115 
getWholeRange() const116 ScRange ScClipParam::getWholeRange() const
117 {
118     ScRange aWhole;
119     bool bFirst = true;
120     ScRangeList aRanges = maRanges;
121     for (ScRange* p = aRanges.First(); p; p = aRanges.Next())
122     {
123         if (bFirst)
124         {
125             aWhole = *p;
126             bFirst = false;
127             continue;
128         }
129 
130         if (aWhole.aStart.Col() > p->aStart.Col())
131             aWhole.aStart.SetCol(p->aStart.Col());
132 
133         if (aWhole.aStart.Row() > p->aStart.Row())
134             aWhole.aStart.SetRow(p->aStart.Row());
135 
136         if (aWhole.aEnd.Col() < p->aEnd.Col())
137             aWhole.aEnd.SetCol(p->aEnd.Col());
138 
139         if (aWhole.aEnd.Row() < p->aEnd.Row())
140             aWhole.aEnd.SetRow(p->aEnd.Row());
141     }
142     return aWhole;
143 }
144 
transpose()145 void ScClipParam::transpose()
146 {
147     switch (meDirection)
148     {
149         case Column:
150             meDirection = ScClipParam::Row;
151         break;
152         case Row:
153             meDirection = ScClipParam::Column;
154         break;
155         case Unspecified:
156         default:
157             ;
158     }
159 
160     ScRangeList aNewRanges;
161     if (maRanges.Count())
162     {
163         ScRange* p = maRanges.First();
164         SCCOL nColOrigin = p->aStart.Col();
165         SCROW nRowOrigin = p->aStart.Row();
166         for (; p; p = maRanges.Next())
167         {
168             SCCOL nColDelta = p->aStart.Col() - nColOrigin;
169             SCROW nRowDelta = p->aStart.Row() - nRowOrigin;
170             SCCOL nCol1 = 0;
171             SCCOL nCol2 = static_cast<SCCOL>(p->aEnd.Row() - p->aStart.Row());
172             SCROW nRow1 = 0;
173             SCROW nRow2 = static_cast<SCROW>(p->aEnd.Col() - p->aStart.Col());
174             nCol1 += static_cast<SCCOL>(nRowDelta);
175             nCol2 += static_cast<SCCOL>(nRowDelta);
176             nRow1 += static_cast<SCROW>(nColDelta);
177             nRow2 += static_cast<SCROW>(nColDelta);
178             ScRange aNew(nCol1, nRow1, p->aStart.Tab(), nCol2, nRow2, p->aStart.Tab());
179             aNewRanges.Append(aNew);
180         }
181     }
182     maRanges = aNewRanges;
183 }
184 
185 // ============================================================================
186 
ScClipRangeNameData()187 ScClipRangeNameData::ScClipRangeNameData() :
188     mbReplace(false)
189 {
190 }
191 
~ScClipRangeNameData()192 ScClipRangeNameData::~ScClipRangeNameData()
193 {
194 }
195 
insert(sal_uInt16 nOldIndex,sal_uInt16 nNewIndex)196 void ScClipRangeNameData::insert(sal_uInt16 nOldIndex, sal_uInt16 nNewIndex)
197 {
198     maRangeMap.insert(
199         ScRangeData::IndexMap::value_type(nOldIndex, nNewIndex));
200 }
201