xref: /AOO41X/main/sc/source/ui/view/colrowba.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
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 
28 
29 // INCLUDE ---------------------------------------------------------------
30 
31 #include <svx/svdtrans.hxx>
32 #include <unotools/localedatawrapper.hxx>
33 
34 #include "colrowba.hxx"
35 #include "document.hxx"
36 #include "scmod.hxx"
37 #include "tabvwsh.hxx"
38 #include "docsh.hxx"
39 #include "appoptio.hxx"
40 #include "globstr.hrc"
41 
42 // STATIC DATA -----------------------------------------------------------
43 
44 //==================================================================
45 
lcl_MetricString(long nTwips,const String & rText)46 String lcl_MetricString( long nTwips, const String& rText )
47 {
48     if ( nTwips <= 0 )
49         return ScGlobal::GetRscString(STR_TIP_HIDE);
50     else
51     {
52         FieldUnit eUserMet = SC_MOD()->GetAppOptions().GetAppMetric();
53 
54         sal_Int64 nUserVal = MetricField::ConvertValue( nTwips*100, 1, 2, FUNIT_TWIP, eUserMet );
55 
56         String aStr = rText;
57         aStr += ' ';
58         aStr += ScGlobal::pLocaleData->getNum( nUserVal, 2 );
59         aStr += ' ';
60         aStr += SdrFormatter::GetUnitStr(eUserMet);
61 
62         return aStr;
63     }
64 }
65 
66 //==================================================================
67 
ScColBar(Window * pParent,ScViewData * pData,ScHSplitPos eWhichPos,ScHeaderFunctionSet * pFunc,ScHeaderSelectionEngine * pEng)68 ScColBar::ScColBar( Window* pParent, ScViewData* pData, ScHSplitPos eWhichPos,
69                     ScHeaderFunctionSet* pFunc, ScHeaderSelectionEngine* pEng ) :
70             ScHeaderControl( pParent, pEng, MAXCOL+1, HDR_HORIZONTAL ),
71             pViewData( pData ),
72             eWhich( eWhichPos ),
73             pFuncSet( pFunc ),
74             pSelEngine( pEng )
75 {
76     Show();
77 }
78 
~ScColBar()79 ScColBar::~ScColBar()
80 {
81 }
82 
UseNumericHeader() const83 inline sal_Bool ScColBar::UseNumericHeader() const
84 {
85     return pViewData->GetDocument()->GetAddressConvention() == formula::FormulaGrammar::CONV_XL_R1C1;
86 }
87 
GetPos()88 SCCOLROW ScColBar::GetPos()
89 {
90     return pViewData->GetPosX(eWhich);
91 }
92 
GetEntrySize(SCCOLROW nEntryNo)93 sal_uInt16 ScColBar::GetEntrySize( SCCOLROW nEntryNo )
94 {
95     ScDocument* pDoc = pViewData->GetDocument();
96     SCTAB nTab = pViewData->GetTabNo();
97     SCCOL nLastCol = -1;
98     if (pDoc->ColHidden(static_cast<SCCOL>(nEntryNo), nTab, nLastCol))
99         return 0;
100     else
101         return (sal_uInt16) ScViewData::ToPixel( pDoc->GetColWidth( static_cast<SCCOL>(nEntryNo), nTab ), pViewData->GetPPTX() );
102 }
103 
GetEntryText(SCCOLROW nEntryNo)104 String ScColBar::GetEntryText( SCCOLROW nEntryNo )
105 {
106     return UseNumericHeader()
107         ? String::CreateFromInt32( nEntryNo + 1 )
108         : ScColToAlpha( static_cast<SCCOL>(nEntryNo) );
109 }
110 
SetEntrySize(SCCOLROW nPos,sal_uInt16 nNewSize)111 void ScColBar::SetEntrySize( SCCOLROW nPos, sal_uInt16 nNewSize )
112 {
113     sal_uInt16 nSizeTwips;
114     ScSizeMode eMode = SC_SIZE_DIRECT;
115     if (nNewSize>0 && nNewSize<10) nNewSize=10;             // (Pixel)
116 
117     if ( nNewSize == HDR_SIZE_OPTIMUM )
118     {
119         nSizeTwips = STD_EXTRA_WIDTH;
120         eMode = SC_SIZE_OPTIMAL;
121     }
122     else
123         nSizeTwips = (sal_uInt16) ( nNewSize / pViewData->GetPPTX() );
124 
125     ScMarkData& rMark = pViewData->GetMarkData();
126 //  SCTAB nTab = pViewData->GetTabNo();
127 
128     SCCOLROW* pRanges = new SCCOLROW[MAXCOL+1];
129     SCCOL nRangeCnt = 0;
130     if ( rMark.IsColumnMarked( static_cast<SCCOL>(nPos) ) )
131     {
132         SCCOL nStart = 0;
133         while (nStart<=MAXCOL)
134         {
135             while (nStart<MAXCOL && !rMark.IsColumnMarked(nStart))
136                 ++nStart;
137             if (rMark.IsColumnMarked(nStart))
138             {
139                 SCCOL nEnd = nStart;
140                 while (nEnd<MAXCOL && rMark.IsColumnMarked(nEnd))
141                     ++nEnd;
142                 if (!rMark.IsColumnMarked(nEnd))
143                     --nEnd;
144                 pRanges[static_cast<size_t>(2*nRangeCnt)  ] = nStart;
145                 pRanges[static_cast<size_t>(2*nRangeCnt+1)] = nEnd;
146                 ++nRangeCnt;
147                 nStart = nEnd+1;
148             }
149             else
150                 nStart = MAXCOL+1;
151         }
152     }
153     else
154     {
155         pRanges[0] = nPos;
156         pRanges[1] = nPos;
157         nRangeCnt = 1;
158     }
159 
160     pViewData->GetView()->SetWidthOrHeight( sal_True, nRangeCnt, pRanges, eMode, nSizeTwips );
161     delete[] pRanges;
162 }
163 
HideEntries(SCCOLROW nStart,SCCOLROW nEnd)164 void ScColBar::HideEntries( SCCOLROW nStart, SCCOLROW nEnd )
165 {
166     SCCOLROW nRange[2];
167     nRange[0] = nStart;
168     nRange[1] = nEnd;
169     pViewData->GetView()->SetWidthOrHeight( sal_True, 1, nRange, SC_SIZE_DIRECT, 0 );
170 }
171 
SetMarking(sal_Bool bSet)172 void ScColBar::SetMarking( sal_Bool bSet )
173 {
174     pViewData->GetMarkData().SetMarking( bSet );
175     if (!bSet)
176     {
177         pViewData->GetView()->UpdateAutoFillMark();
178     }
179 }
180 
SelectWindow()181 void ScColBar::SelectWindow()
182 {
183     ScTabViewShell* pViewSh = pViewData->GetViewShell();
184 
185     pViewSh->SetActive();           // Appear und SetViewFrame
186     pViewSh->DrawDeselectAll();
187 
188     ScSplitPos eActive = pViewData->GetActivePart();
189     if (eWhich==SC_SPLIT_LEFT)
190     {
191         if (eActive==SC_SPLIT_TOPRIGHT)     eActive=SC_SPLIT_TOPLEFT;
192         if (eActive==SC_SPLIT_BOTTOMRIGHT)  eActive=SC_SPLIT_BOTTOMLEFT;
193     }
194     else
195     {
196         if (eActive==SC_SPLIT_TOPLEFT)      eActive=SC_SPLIT_TOPRIGHT;
197         if (eActive==SC_SPLIT_BOTTOMLEFT)   eActive=SC_SPLIT_BOTTOMRIGHT;
198     }
199     pViewSh->ActivatePart( eActive );
200 
201     pFuncSet->SetColumn( sal_True );
202     pFuncSet->SetWhich( eActive );
203 
204     pViewSh->ActiveGrabFocus();
205 }
206 
IsDisabled()207 sal_Bool ScColBar::IsDisabled()
208 {
209     ScModule* pScMod = SC_MOD();
210     return pScMod->IsFormulaMode() || pScMod->IsModalMode();
211 }
212 
ResizeAllowed()213 sal_Bool ScColBar::ResizeAllowed()
214 {
215     return !pViewData->HasEditView( pViewData->GetActivePart() ) &&
216             !pViewData->GetDocShell()->IsReadOnly();
217 }
218 
DrawInvert(long nDragPosP)219 void ScColBar::DrawInvert( long nDragPosP )
220 {
221     Rectangle aRect( nDragPosP,0, nDragPosP+HDR_SLIDERSIZE-1,GetOutputSizePixel().Width()-1 );
222     Update();
223     Invert(aRect);
224 
225     pViewData->GetView()->InvertVertical(eWhich,nDragPosP);
226 }
227 
GetDragHelp(long nVal)228 String ScColBar::GetDragHelp( long nVal )
229 {
230     long nTwips = (long) ( nVal / pViewData->GetPPTX() );
231     return lcl_MetricString( nTwips, ScGlobal::GetRscString(STR_TIP_WIDTH) );
232 }
233 
IsLayoutRTL()234 sal_Bool ScColBar::IsLayoutRTL()        // overloaded only for columns
235 {
236     return pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() );
237 }
238 
239 //==================================================================
240 
ScRowBar(Window * pParent,ScViewData * pData,ScVSplitPos eWhichPos,ScHeaderFunctionSet * pFunc,ScHeaderSelectionEngine * pEng)241 ScRowBar::ScRowBar( Window* pParent, ScViewData* pData, ScVSplitPos eWhichPos,
242                     ScHeaderFunctionSet* pFunc, ScHeaderSelectionEngine* pEng ) :
243             ScHeaderControl( pParent, pEng, MAXROW+1, HDR_VERTICAL ),
244             pViewData( pData ),
245             eWhich( eWhichPos ),
246             pFuncSet( pFunc ),
247             pSelEngine( pEng )
248 {
249     Show();
250 }
251 
~ScRowBar()252 ScRowBar::~ScRowBar()
253 {
254 }
255 
GetPos()256 SCCOLROW ScRowBar::GetPos()
257 {
258     return pViewData->GetPosY(eWhich);
259 }
260 
GetEntrySize(SCCOLROW nEntryNo)261 sal_uInt16 ScRowBar::GetEntrySize( SCCOLROW nEntryNo )
262 {
263     ScDocument* pDoc = pViewData->GetDocument();
264     SCTAB nTab = pViewData->GetTabNo();
265     SCROW nLastRow = -1;
266     if (pDoc->RowHidden(nEntryNo, nTab, nLastRow))
267         return 0;
268     else
269         return (sal_uInt16) ScViewData::ToPixel( pDoc->GetOriginalHeight( nEntryNo,
270                     nTab ), pViewData->GetPPTY() );
271 }
272 
GetEntryText(SCCOLROW nEntryNo)273 String ScRowBar::GetEntryText( SCCOLROW nEntryNo )
274 {
275     return String::CreateFromInt32( nEntryNo + 1 );
276 }
277 
SetEntrySize(SCCOLROW nPos,sal_uInt16 nNewSize)278 void ScRowBar::SetEntrySize( SCCOLROW nPos, sal_uInt16 nNewSize )
279 {
280     sal_uInt16 nSizeTwips;
281     ScSizeMode eMode = SC_SIZE_DIRECT;
282     if (nNewSize>0 && nNewSize<10) nNewSize=10;             // (Pixel)
283 
284     if ( nNewSize == HDR_SIZE_OPTIMUM )
285     {
286         nSizeTwips = 0;
287         eMode = SC_SIZE_OPTIMAL;
288     }
289     else
290         nSizeTwips = (sal_uInt16) ( nNewSize / pViewData->GetPPTY() );
291 
292     ScMarkData& rMark = pViewData->GetMarkData();
293 //  SCTAB nTab = pViewData->GetTabNo();
294 
295     SCCOLROW* pRanges = new SCCOLROW[MAXROW+1];
296     SCROW nRangeCnt = 0;
297     if ( rMark.IsRowMarked( nPos ) )
298     {
299         SCROW nStart = 0;
300         while (nStart<=MAXROW)
301         {
302             while (nStart<MAXROW && !rMark.IsRowMarked(nStart))
303                 ++nStart;
304             if (rMark.IsRowMarked(nStart))
305             {
306                 SCROW nEnd = nStart;
307                 while (nEnd<MAXROW && rMark.IsRowMarked(nEnd))
308                     ++nEnd;
309                 if (!rMark.IsRowMarked(nEnd))
310                     --nEnd;
311                 pRanges[static_cast<size_t>(2*nRangeCnt)  ] = nStart;
312                 pRanges[static_cast<size_t>(2*nRangeCnt+1)] = nEnd;
313                 ++nRangeCnt;
314                 nStart = nEnd+1;
315             }
316             else
317                 nStart = MAXROW+1;
318         }
319     }
320     else
321     {
322         pRanges[0] = nPos;
323         pRanges[1] = nPos;
324         nRangeCnt = 1;
325     }
326 
327     pViewData->GetView()->SetWidthOrHeight( sal_False, nRangeCnt, pRanges, eMode, nSizeTwips );
328     delete[] pRanges;
329 }
330 
HideEntries(SCCOLROW nStart,SCCOLROW nEnd)331 void ScRowBar::HideEntries( SCCOLROW nStart, SCCOLROW nEnd )
332 {
333     SCCOLROW nRange[2];
334     nRange[0] = nStart;
335     nRange[1] = nEnd;
336     pViewData->GetView()->SetWidthOrHeight( sal_False, 1, nRange, SC_SIZE_DIRECT, 0 );
337 }
338 
SetMarking(sal_Bool bSet)339 void ScRowBar::SetMarking( sal_Bool bSet )
340 {
341     pViewData->GetMarkData().SetMarking( bSet );
342     if (!bSet)
343     {
344         pViewData->GetView()->UpdateAutoFillMark();
345     }
346 }
347 
SelectWindow()348 void ScRowBar::SelectWindow()
349 {
350     ScTabViewShell* pViewSh = pViewData->GetViewShell();
351 
352     pViewSh->SetActive();           // Appear und SetViewFrame
353     pViewSh->DrawDeselectAll();
354 
355     ScSplitPos eActive = pViewData->GetActivePart();
356     if (eWhich==SC_SPLIT_TOP)
357     {
358         if (eActive==SC_SPLIT_BOTTOMLEFT)   eActive=SC_SPLIT_TOPLEFT;
359         if (eActive==SC_SPLIT_BOTTOMRIGHT)  eActive=SC_SPLIT_TOPRIGHT;
360     }
361     else
362     {
363         if (eActive==SC_SPLIT_TOPLEFT)      eActive=SC_SPLIT_BOTTOMLEFT;
364         if (eActive==SC_SPLIT_TOPRIGHT)     eActive=SC_SPLIT_BOTTOMRIGHT;
365     }
366     pViewSh->ActivatePart( eActive );
367 
368     pFuncSet->SetColumn( sal_False );
369     pFuncSet->SetWhich( eActive );
370 
371     pViewSh->ActiveGrabFocus();
372 }
373 
IsDisabled()374 sal_Bool ScRowBar::IsDisabled()
375 {
376     ScModule* pScMod = SC_MOD();
377     return pScMod->IsFormulaMode() || pScMod->IsModalMode();
378 }
379 
ResizeAllowed()380 sal_Bool ScRowBar::ResizeAllowed()
381 {
382     return !pViewData->HasEditView( pViewData->GetActivePart() ) &&
383             !pViewData->GetDocShell()->IsReadOnly();
384 }
385 
DrawInvert(long nDragPosP)386 void ScRowBar::DrawInvert( long nDragPosP )
387 {
388     Rectangle aRect( 0,nDragPosP, GetOutputSizePixel().Width()-1,nDragPosP+HDR_SLIDERSIZE-1 );
389     Update();
390     Invert(aRect);
391 
392     pViewData->GetView()->InvertHorizontal(eWhich,nDragPosP);
393 }
394 
GetDragHelp(long nVal)395 String ScRowBar::GetDragHelp( long nVal )
396 {
397     long nTwips = (long) ( nVal / pViewData->GetPPTY() );
398     return lcl_MetricString( nTwips, ScGlobal::GetRscString(STR_TIP_HEIGHT) );
399 }
400 
401 //  GetHiddenCount ist nur fuer Zeilen ueberladen
402 
GetHiddenCount(SCROW nEntryNo)403 SCROW ScRowBar::GetHiddenCount( SCROW nEntryNo )
404 {
405     ScDocument* pDoc = pViewData->GetDocument();
406     SCTAB nTab = pViewData->GetTabNo();
407     return pDoc->GetHiddenRowCount( nEntryNo, nTab );
408 }
409 
IsMirrored()410 sal_Bool ScRowBar::IsMirrored()         // overloaded only for rows
411 {
412     return pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() );
413 }
414 
415 
416