xref: /aoo41x/main/sc/source/ui/dbgui/csvtablebox.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 
28 // ============================================================================
29 #include "csvtablebox.hxx"
30 #include <tools/debug.hxx>
31 #include <vcl/lstbox.hxx>
32 
33 // ause
34 #include "editutil.hxx"
35 
36 // ============================================================================
37 
38 //UNUSED2009-05 ScCsvTableBox::ScCsvTableBox( Window* pParent ) :
39 //UNUSED2009-05     ScCsvControl( pParent, maData, WB_BORDER | WB_TABSTOP | WB_DIALOGCONTROL ),
40 //UNUSED2009-05     maRuler( *this ),
41 //UNUSED2009-05     maGrid( *this ),
42 //UNUSED2009-05     maHScroll( this, WB_HORZ | WB_DRAG ),
43 //UNUSED2009-05     maVScroll( this, WB_VERT | WB_DRAG ),
44 //UNUSED2009-05     maScrollBox( this )
45 //UNUSED2009-05 {
46 //UNUSED2009-05     Init();
47 //UNUSED2009-05 }
48 
ScCsvTableBox(Window * pParent,const ResId & rResId)49 ScCsvTableBox::ScCsvTableBox( Window* pParent, const ResId& rResId ) :
50     ScCsvControl( pParent, maData, rResId ),
51     maRuler( *this ),
52     maGrid( *this ),
53     maHScroll( this, WB_HORZ | WB_DRAG ),
54     maVScroll( this, WB_VERT | WB_DRAG ),
55     maScrollBox( this )
56 {
57     Init();
58 }
59 
60 
61 // common table box handling --------------------------------------------------
62 
SetSeparatorsMode()63 void ScCsvTableBox::SetSeparatorsMode()
64 {
65     if( mbFixedMode )
66     {
67         // rescue data for fixed width mode
68         mnFixedWidth = GetPosCount();
69         maFixColStates = maGrid.GetColumnStates();
70         // switch to separators mode
71         mbFixedMode = false;
72         // reset and reinitialize controls
73         DisableRepaint();
74         Execute( CSVCMD_SETLINEOFFSET, 0 );
75         Execute( CSVCMD_SETPOSCOUNT, 1 );
76         Execute( CSVCMD_NEWCELLTEXTS );
77         maGrid.SetColumnStates( maSepColStates );
78         InitControls();
79         EnableRepaint();
80     }
81 }
82 
SetFixedWidthMode()83 void ScCsvTableBox::SetFixedWidthMode()
84 {
85     if( !mbFixedMode )
86     {
87         // rescue data for separators mode
88         maSepColStates = maGrid.GetColumnStates();
89         // switch to fixed width mode
90         mbFixedMode = true;
91         // reset and reinitialize controls
92         DisableRepaint();
93         Execute( CSVCMD_SETLINEOFFSET, 0 );
94         Execute( CSVCMD_SETPOSCOUNT, mnFixedWidth );
95         maGrid.SetSplits( maRuler.GetSplits() );
96         maGrid.SetColumnStates( maFixColStates );
97         InitControls();
98         EnableRepaint();
99     }
100 }
101 
Init()102 void ScCsvTableBox::Init()
103 {
104     mbFixedMode = false;
105     mnFixedWidth = 1;
106 
107     maHScroll.EnableRTL( false ); // #107812# RTL
108     maHScroll.SetLineSize( 1 );
109     maVScroll.SetLineSize( 1 );
110 
111     Link aLink = LINK( this, ScCsvTableBox, CsvCmdHdl );
112     SetCmdHdl( aLink );
113     maRuler.SetCmdHdl( aLink );
114     maGrid.SetCmdHdl( aLink );
115 
116     aLink = LINK( this, ScCsvTableBox, ScrollHdl );
117     maHScroll.SetScrollHdl( aLink );
118     maVScroll.SetScrollHdl( aLink );
119 
120     aLink = LINK( this, ScCsvTableBox, ScrollEndHdl );
121     maHScroll.SetEndScrollHdl( aLink );
122     maVScroll.SetEndScrollHdl( aLink );
123 
124     InitControls();
125 }
126 
InitControls()127 void ScCsvTableBox::InitControls()
128 {
129     maGrid.UpdateLayoutData();
130 
131     long nScrollBarSize = GetSettings().GetStyleSettings().GetScrollBarSize();
132     Size aWinSize = CalcOutputSize( GetSizePixel() );
133     long nDataWidth = aWinSize.Width() - nScrollBarSize;
134     long nDataHeight = aWinSize.Height() - nScrollBarSize;
135 
136     maData.mnWinWidth = nDataWidth;
137     maData.mnWinHeight = nDataHeight;
138 
139     if( mbFixedMode )
140     {
141         // ruler sets height internally
142         maRuler.SetPosSizePixel( 0, 0, nDataWidth, 0 );
143         sal_Int32 nY = maRuler.GetSizePixel().Height();
144         maData.mnWinHeight -= nY;
145         maGrid.SetPosSizePixel( 0, nY, nDataWidth, maData.mnWinHeight );
146     }
147     else
148         maGrid.SetPosSizePixel( 0, 0, nDataWidth, nDataHeight );
149     maGrid.Show();
150     maRuler.Show( mbFixedMode );
151 
152     // scrollbars always visible
153     maHScroll.SetPosSizePixel( 0, nDataHeight, nDataWidth, nScrollBarSize );
154     InitHScrollBar();
155     maHScroll.Show();
156 
157     // scrollbars always visible
158     maVScroll.SetPosSizePixel( nDataWidth, 0, nScrollBarSize, nDataHeight );
159     InitVScrollBar();
160     maVScroll.Show();
161 
162     bool bScrBox = maHScroll.IsVisible() && maVScroll.IsVisible();
163     if( bScrBox )
164         maScrollBox.SetPosSizePixel( nDataWidth, nDataHeight, nScrollBarSize, nScrollBarSize );
165     maScrollBox.Show( bScrBox );
166 
167     // let the controls self-adjust to visible area
168     Execute( CSVCMD_SETPOSOFFSET, GetFirstVisPos() );
169     Execute( CSVCMD_SETLINEOFFSET, GetFirstVisLine() );
170 }
171 
InitHScrollBar()172 void ScCsvTableBox::InitHScrollBar()
173 {
174     maHScroll.SetRange( Range( 0, GetPosCount() + 2 ) );
175     maHScroll.SetVisibleSize( GetVisPosCount() );
176     maHScroll.SetPageSize( GetVisPosCount() * 3 / 4 );
177     maHScroll.SetThumbPos( GetFirstVisPos() );
178 }
179 
InitVScrollBar()180 void ScCsvTableBox::InitVScrollBar()
181 {
182     maVScroll.SetRange( Range( 0, GetLineCount() + 1 ) );
183     maVScroll.SetVisibleSize( GetVisLineCount() );
184     maVScroll.SetPageSize( GetVisLineCount() - 2 );
185     maVScroll.SetThumbPos( GetFirstVisLine() );
186 }
187 
MakePosVisible(sal_Int32 nPos)188 void ScCsvTableBox::MakePosVisible( sal_Int32 nPos )
189 {
190     if( (0 <= nPos) && (nPos < GetPosCount()) )
191     {
192         if( nPos - CSV_SCROLL_DIST + 1 <= GetFirstVisPos() )
193             Execute( CSVCMD_SETPOSOFFSET, nPos - CSV_SCROLL_DIST );
194         else if( nPos + CSV_SCROLL_DIST >= GetLastVisPos() )
195             Execute( CSVCMD_SETPOSOFFSET, nPos - GetVisPosCount() + CSV_SCROLL_DIST );
196     }
197 }
198 
199 
200 // cell contents --------------------------------------------------------------
201 
SetUniStrings(const String * pTextLines,const String & rSepChars,sal_Unicode cTextSep,bool bMergeSep)202 void ScCsvTableBox::SetUniStrings(
203         const String* pTextLines, const String& rSepChars,
204         sal_Unicode cTextSep, bool bMergeSep )
205 {
206     // assuming that pTextLines is a string array with size CSV_PREVIEW_LINES
207     // -> will be dynamic sometime
208     DisableRepaint();
209     sal_Int32 nEndLine = GetFirstVisLine() + CSV_PREVIEW_LINES;
210     const String* pString = pTextLines;
211     for( sal_Int32 nLine = GetFirstVisLine(); nLine < nEndLine; ++nLine, ++pString )
212     {
213         if( mbFixedMode )
214             maGrid.ImplSetTextLineFix( nLine, *pString );
215         else
216             maGrid.ImplSetTextLineSep( nLine, *pString, rSepChars, cTextSep, bMergeSep );
217     }
218     EnableRepaint();
219 }
220 
221 //UNUSED2009-05 void ScCsvTableBox::SetByteStrings(
222 //UNUSED2009-05         const ByteString* pTextLines, CharSet eCharSet,
223 //UNUSED2009-05         const String& rSepChars, sal_Unicode cTextSep, bool bMergeSep )
224 //UNUSED2009-05 {
225 //UNUSED2009-05     // assuming that pTextLines is a string array with size CSV_PREVIEW_LINES
226 //UNUSED2009-05     // -> will be dynamic sometime
227 //UNUSED2009-05     DisableRepaint();
228 //UNUSED2009-05     sal_Int32 nEndLine = GetFirstVisLine() + CSV_PREVIEW_LINES;
229 //UNUSED2009-05     const ByteString* pString = pTextLines;
230 //UNUSED2009-05     for( sal_Int32 nLine = GetFirstVisLine(); nLine < nEndLine; ++nLine, ++pString )
231 //UNUSED2009-05     {
232 //UNUSED2009-05         if( mbFixedMode )
233 //UNUSED2009-05             maGrid.ImplSetTextLineFix( nLine, String( *pString, eCharSet ) );
234 //UNUSED2009-05         else
235 //UNUSED2009-05             maGrid.ImplSetTextLineSep( nLine, String( *pString, eCharSet ), rSepChars, cTextSep, bMergeSep );
236 //UNUSED2009-05     }
237 //UNUSED2009-05     EnableRepaint();
238 //UNUSED2009-05 }
239 
240 
241 // column settings ------------------------------------------------------------
242 
InitTypes(const ListBox & rListBox)243 void ScCsvTableBox::InitTypes( const ListBox& rListBox )
244 {
245     sal_uInt16 nTypeCount = rListBox.GetEntryCount();
246     StringVec aTypeNames( nTypeCount );
247     for( sal_uInt16 nIndex = 0; nIndex < nTypeCount; ++nIndex )
248         aTypeNames[ nIndex ] = rListBox.GetEntry( nIndex );
249     maGrid.SetTypeNames( aTypeNames );
250 }
251 
FillColumnData(ScAsciiOptions & rOptions) const252 void ScCsvTableBox::FillColumnData( ScAsciiOptions& rOptions ) const
253 {
254     if( mbFixedMode )
255         maGrid.FillColumnDataFix( rOptions );
256     else
257         maGrid.FillColumnDataSep( rOptions );
258 }
259 
260 
261 // event handling -------------------------------------------------------------
262 
Resize()263 void ScCsvTableBox::Resize()
264 {
265     ScCsvControl::Resize();
266     InitControls();
267 }
268 
DataChanged(const DataChangedEvent & rDCEvt)269 void ScCsvTableBox::DataChanged( const DataChangedEvent& rDCEvt )
270 {
271     if( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
272         InitControls();
273     ScCsvControl::DataChanged( rDCEvt );
274 }
275 
IMPL_LINK(ScCsvTableBox,CsvCmdHdl,ScCsvControl *,pCtrl)276 IMPL_LINK( ScCsvTableBox, CsvCmdHdl, ScCsvControl*, pCtrl )
277 {
278     DBG_ASSERT( pCtrl, "ScCsvTableBox::CsvCmdHdl - missing sender" );
279 
280     const ScCsvCmd& rCmd = pCtrl->GetCmd();
281     ScCsvCmdType eType = rCmd.GetType();
282     sal_Int32 nParam1 = rCmd.GetParam1();
283     sal_Int32 nParam2 = rCmd.GetParam2();
284 
285     bool bFound = true;
286     switch( eType )
287     {
288         case CSVCMD_REPAINT:
289             if( !IsNoRepaint() )
290             {
291                 maGrid.ImplRedraw();
292                 maRuler.ImplRedraw();
293                 InitHScrollBar();
294                 InitVScrollBar();
295             }
296         break;
297         case CSVCMD_MAKEPOSVISIBLE:
298             MakePosVisible( nParam1 );
299         break;
300 
301         case CSVCMD_NEWCELLTEXTS:
302             if( mbFixedMode )
303                 Execute( CSVCMD_UPDATECELLTEXTS );
304             else
305             {
306                 DisableRepaint();
307                 ScCsvColStateVec aStates( maGrid.GetColumnStates() );
308                 sal_Int32 nPos = GetFirstVisPos();
309                 Execute( CSVCMD_SETPOSCOUNT, 1 );
310                 Execute( CSVCMD_UPDATECELLTEXTS );
311                 Execute( CSVCMD_SETPOSOFFSET, nPos );
312                 maGrid.SetColumnStates( aStates );
313                 EnableRepaint();
314             }
315         break;
316         case CSVCMD_UPDATECELLTEXTS:
317             maUpdateTextHdl.Call( this );
318         break;
319         case CSVCMD_SETCOLUMNTYPE:
320             maGrid.SetSelColumnType( nParam1 );
321         break;
322         case CSVCMD_EXPORTCOLUMNTYPE:
323             maColTypeHdl.Call( this );
324         break;
325         case CSVCMD_SETFIRSTIMPORTLINE:
326             maGrid.SetFirstImportedLine( nParam1 );
327         break;
328 
329         case CSVCMD_INSERTSPLIT:
330             DBG_ASSERT( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::InsertSplit - invalid call" );
331             if( maRuler.GetSplitCount() + 1 < sal::static_int_cast<sal_uInt32>(CSV_MAXCOLCOUNT) )
332             {
333                 maRuler.InsertSplit( nParam1 );
334                 maGrid.InsertSplit( nParam1 );
335             }
336         break;
337         case CSVCMD_REMOVESPLIT:
338             DBG_ASSERT( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::RemoveSplit - invalid call" );
339             maRuler.RemoveSplit( nParam1 );
340             maGrid.RemoveSplit( nParam1 );
341         break;
342         case CSVCMD_TOGGLESPLIT:
343             Execute( maRuler.HasSplit( nParam1 ) ? CSVCMD_REMOVESPLIT : CSVCMD_INSERTSPLIT, nParam1 );
344         break;
345         case CSVCMD_MOVESPLIT:
346             DBG_ASSERT( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::MoveSplit - invalid call" );
347             maRuler.MoveSplit( nParam1, nParam2 );
348             maGrid.MoveSplit( nParam1, nParam2 );
349         break;
350         case CSVCMD_REMOVEALLSPLITS:
351             DBG_ASSERT( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::RemoveAllSplits - invalid call" );
352             maRuler.RemoveAllSplits();
353             maGrid.RemoveAllSplits();
354         break;
355         default:
356             bFound = false;
357     }
358     if( bFound )
359         return 0;
360 
361     const ScCsvLayoutData aOldData( maData );
362     switch( eType )
363     {
364         case CSVCMD_SETPOSCOUNT:
365             maData.mnPosCount = Max( nParam1, sal_Int32( 1 ) );
366             ImplSetPosOffset( GetFirstVisPos() );
367         break;
368         case CSVCMD_SETPOSOFFSET:
369             ImplSetPosOffset( nParam1 );
370         break;
371         case CSVCMD_SETHDRWIDTH:
372             maData.mnHdrWidth = Max( nParam1, sal_Int32( 0 ) );
373             ImplSetPosOffset( GetFirstVisPos() );
374         break;
375         case CSVCMD_SETCHARWIDTH:
376             maData.mnCharWidth = Max( nParam1, sal_Int32( 1 ) );
377             ImplSetPosOffset( GetFirstVisPos() );
378         break;
379         case CSVCMD_SETLINECOUNT:
380             maData.mnLineCount = Max( nParam1, sal_Int32( 1 ) );
381             ImplSetLineOffset( GetFirstVisLine() );
382         break;
383         case CSVCMD_SETLINEOFFSET:
384             ImplSetLineOffset( nParam1 );
385         break;
386         case CSVCMD_SETHDRHEIGHT:
387             maData.mnHdrHeight = Max( nParam1, sal_Int32( 0 ) );
388             ImplSetLineOffset( GetFirstVisLine() );
389         break;
390         case CSVCMD_SETLINEHEIGHT:
391             maData.mnLineHeight = Max( nParam1, sal_Int32( 1 ) );
392             ImplSetLineOffset( GetFirstVisLine() );
393         break;
394         case CSVCMD_MOVERULERCURSOR:
395             maData.mnPosCursor = IsVisibleSplitPos( nParam1 ) ? nParam1 : CSV_POS_INVALID;
396         break;
397         case CSVCMD_MOVEGRIDCURSOR:
398             maData.mnColCursor = ((0 <= nParam1) && (nParam1 < GetPosCount())) ? nParam1 : CSV_POS_INVALID;
399         break;
400         default:
401         {
402             // added to avoid warnings
403         }
404     }
405 
406     if( maData != aOldData )
407     {
408         DisableRepaint();
409         maRuler.ApplyLayout( aOldData );
410         maGrid.ApplyLayout( aOldData );
411         EnableRepaint();
412     }
413 
414     return 0;
415 }
416 
IMPL_LINK(ScCsvTableBox,ScrollHdl,ScrollBar *,pScrollBar)417 IMPL_LINK( ScCsvTableBox, ScrollHdl, ScrollBar*, pScrollBar )
418 {
419     DBG_ASSERT( pScrollBar, "ScCsvTableBox::ScrollHdl - missing sender" );
420 
421     if( pScrollBar == &maHScroll )
422         Execute( CSVCMD_SETPOSOFFSET, pScrollBar->GetThumbPos() );
423     else if( pScrollBar == &maVScroll )
424         Execute( CSVCMD_SETLINEOFFSET, pScrollBar->GetThumbPos() );
425 
426     return 0;
427 }
428 
IMPL_LINK(ScCsvTableBox,ScrollEndHdl,ScrollBar *,pScrollBar)429 IMPL_LINK( ScCsvTableBox, ScrollEndHdl, ScrollBar*, pScrollBar )
430 {
431     DBG_ASSERT( pScrollBar, "ScCsvTableBox::ScrollEndHdl - missing sender" );
432 
433     if( pScrollBar == &maHScroll )
434     {
435         if( GetRulerCursorPos() != CSV_POS_INVALID )
436             Execute( CSVCMD_MOVERULERCURSOR, maRuler.GetNoScrollPos( GetRulerCursorPos() ) );
437         if( GetGridCursorPos() != CSV_POS_INVALID )
438             Execute( CSVCMD_MOVEGRIDCURSOR, maGrid.GetNoScrollCol( GetGridCursorPos() ) );
439     }
440 
441     return 0;
442 }
443 
444 
445 // accessibility --------------------------------------------------------------
446 
CreateAccessible()447 ScCsvTableBox::XAccessibleRef ScCsvTableBox::CreateAccessible()
448 {
449     // do not use the ScCsvControl mechanism, return default accessible object
450     return Control::CreateAccessible();
451 }
452 
ImplCreateAccessible()453 ScAccessibleCsvControl* ScCsvTableBox::ImplCreateAccessible()
454 {
455     return NULL;    // not used, see CreateAccessible()
456 }
457 
458 
459 // ============================================================================
460 
461