Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "csvtablebox.hxx"
30 : : #include <vcl/lstbox.hxx>
31 : :
32 : : // ause
33 : : #include "editutil.hxx"
34 : :
35 : : // ============================================================================
36 : :
37 : 0 : ScCsvTableBox::ScCsvTableBox( Window* pParent, const ResId& rResId ) :
38 : : ScCsvControl( pParent, maData, rResId ),
39 : : maRuler( *this ),
40 : : maGrid( *this ),
41 : : maHScroll( this, WB_HORZ | WB_DRAG ),
42 : : maVScroll( this, WB_VERT | WB_DRAG ),
43 [ # # ][ # # ]: 0 : maScrollBox( this )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
44 : : {
45 : 0 : mbFixedMode = false;
46 : 0 : mnFixedWidth = 1;
47 : :
48 [ # # ]: 0 : maHScroll.EnableRTL( false ); // RTL
49 : 0 : maHScroll.SetLineSize( 1 );
50 : 0 : maVScroll.SetLineSize( 1 );
51 : :
52 [ # # ]: 0 : Link aLink = LINK( this, ScCsvTableBox, CsvCmdHdl );
53 : 0 : SetCmdHdl( aLink );
54 : 0 : maRuler.SetCmdHdl( aLink );
55 : 0 : maGrid.SetCmdHdl( aLink );
56 : :
57 [ # # ]: 0 : aLink = LINK( this, ScCsvTableBox, ScrollHdl );
58 : 0 : maHScroll.SetScrollHdl( aLink );
59 : 0 : maVScroll.SetScrollHdl( aLink );
60 : :
61 [ # # ]: 0 : aLink = LINK( this, ScCsvTableBox, ScrollEndHdl );
62 : 0 : maHScroll.SetEndScrollHdl( aLink );
63 : 0 : maVScroll.SetEndScrollHdl( aLink );
64 : :
65 [ # # ]: 0 : InitControls();
66 : 0 : }
67 : :
68 : :
69 : : // common table box handling --------------------------------------------------
70 : :
71 : 0 : void ScCsvTableBox::SetSeparatorsMode()
72 : : {
73 [ # # ]: 0 : if( mbFixedMode )
74 : : {
75 : : // rescue data for fixed width mode
76 : 0 : mnFixedWidth = GetPosCount();
77 : 0 : maFixColStates = maGrid.GetColumnStates();
78 : : // switch to separators mode
79 : 0 : mbFixedMode = false;
80 : : // reset and reinitialize controls
81 : 0 : DisableRepaint();
82 : 0 : Execute( CSVCMD_SETLINEOFFSET, 0 );
83 : 0 : Execute( CSVCMD_SETPOSCOUNT, 1 );
84 : 0 : Execute( CSVCMD_NEWCELLTEXTS );
85 : 0 : maGrid.SetColumnStates( maSepColStates );
86 : 0 : InitControls();
87 : 0 : EnableRepaint();
88 : : }
89 : 0 : }
90 : :
91 : 0 : void ScCsvTableBox::SetFixedWidthMode()
92 : : {
93 [ # # ]: 0 : if( !mbFixedMode )
94 : : {
95 : : // rescue data for separators mode
96 : 0 : maSepColStates = maGrid.GetColumnStates();
97 : : // switch to fixed width mode
98 : 0 : mbFixedMode = true;
99 : : // reset and reinitialize controls
100 : 0 : DisableRepaint();
101 : 0 : Execute( CSVCMD_SETLINEOFFSET, 0 );
102 : 0 : Execute( CSVCMD_SETPOSCOUNT, mnFixedWidth );
103 : 0 : maGrid.SetSplits( maRuler.GetSplits() );
104 : 0 : maGrid.SetColumnStates( maFixColStates );
105 : 0 : InitControls();
106 : 0 : EnableRepaint();
107 : : }
108 : 0 : }
109 : :
110 : 0 : void ScCsvTableBox::Init()
111 : : {
112 : 0 : maGrid.Init();
113 : 0 : }
114 : :
115 : 0 : void ScCsvTableBox::InitControls()
116 : : {
117 [ # # ]: 0 : maGrid.UpdateLayoutData();
118 : :
119 : 0 : long nScrollBarSize = GetSettings().GetStyleSettings().GetScrollBarSize();
120 [ # # ][ # # ]: 0 : Size aWinSize = CalcOutputSize( GetSizePixel() );
121 : 0 : long nDataWidth = aWinSize.Width() - nScrollBarSize;
122 : 0 : long nDataHeight = aWinSize.Height() - nScrollBarSize;
123 : :
124 : 0 : maData.mnWinWidth = nDataWidth;
125 : 0 : maData.mnWinHeight = nDataHeight;
126 : :
127 [ # # ]: 0 : if( mbFixedMode )
128 : : {
129 : : // ruler sets height internally
130 [ # # ]: 0 : maRuler.SetPosSizePixel( 0, 0, nDataWidth, 0 );
131 [ # # ]: 0 : sal_Int32 nY = maRuler.GetSizePixel().Height();
132 : 0 : maData.mnWinHeight -= nY;
133 [ # # ]: 0 : maGrid.SetPosSizePixel( 0, nY, nDataWidth, maData.mnWinHeight );
134 : : }
135 : : else
136 [ # # ]: 0 : maGrid.SetPosSizePixel( 0, 0, nDataWidth, nDataHeight );
137 [ # # ]: 0 : maGrid.Show();
138 [ # # ]: 0 : maRuler.Show( mbFixedMode );
139 : :
140 : : // scrollbars always visible
141 [ # # ]: 0 : maHScroll.SetPosSizePixel( 0, nDataHeight, nDataWidth, nScrollBarSize );
142 [ # # ]: 0 : InitHScrollBar();
143 [ # # ]: 0 : maHScroll.Show();
144 : :
145 : : // scrollbars always visible
146 [ # # ]: 0 : maVScroll.SetPosSizePixel( nDataWidth, 0, nScrollBarSize, nDataHeight );
147 [ # # ]: 0 : InitVScrollBar();
148 [ # # ]: 0 : maVScroll.Show();
149 : :
150 [ # # ][ # # ]: 0 : bool bScrBox = maHScroll.IsVisible() && maVScroll.IsVisible();
[ # # ][ # # ]
151 [ # # ]: 0 : if( bScrBox )
152 [ # # ]: 0 : maScrollBox.SetPosSizePixel( nDataWidth, nDataHeight, nScrollBarSize, nScrollBarSize );
153 [ # # ]: 0 : maScrollBox.Show( bScrBox );
154 : :
155 : : // let the controls self-adjust to visible area
156 [ # # ]: 0 : Execute( CSVCMD_SETPOSOFFSET, GetFirstVisPos() );
157 [ # # ]: 0 : Execute( CSVCMD_SETLINEOFFSET, GetFirstVisLine() );
158 : 0 : }
159 : :
160 : 0 : void ScCsvTableBox::InitHScrollBar()
161 : : {
162 [ # # ]: 0 : maHScroll.SetRange( Range( 0, GetPosCount() + 2 ) );
163 : 0 : maHScroll.SetVisibleSize( GetVisPosCount() );
164 : 0 : maHScroll.SetPageSize( GetVisPosCount() * 3 / 4 );
165 : 0 : maHScroll.SetThumbPos( GetFirstVisPos() );
166 : 0 : }
167 : :
168 : 0 : void ScCsvTableBox::InitVScrollBar()
169 : : {
170 [ # # ]: 0 : maVScroll.SetRange( Range( 0, GetLineCount() + 1 ) );
171 : 0 : maVScroll.SetVisibleSize( GetVisLineCount() );
172 : 0 : maVScroll.SetPageSize( GetVisLineCount() - 2 );
173 : 0 : maVScroll.SetThumbPos( GetFirstVisLine() );
174 : 0 : }
175 : :
176 : 0 : void ScCsvTableBox::MakePosVisible( sal_Int32 nPos )
177 : : {
178 [ # # ][ # # ]: 0 : if( (0 <= nPos) && (nPos < GetPosCount()) )
[ # # ]
179 : : {
180 [ # # ]: 0 : if( nPos - CSV_SCROLL_DIST + 1 <= GetFirstVisPos() )
181 : 0 : Execute( CSVCMD_SETPOSOFFSET, nPos - CSV_SCROLL_DIST );
182 [ # # ]: 0 : else if( nPos + CSV_SCROLL_DIST >= GetLastVisPos() )
183 : 0 : Execute( CSVCMD_SETPOSOFFSET, nPos - GetVisPosCount() + CSV_SCROLL_DIST );
184 : : }
185 : 0 : }
186 : :
187 : :
188 : : // cell contents --------------------------------------------------------------
189 : :
190 : 0 : void ScCsvTableBox::SetUniStrings(
191 : : const rtl::OUString* pTextLines, const String& rSepChars,
192 : : sal_Unicode cTextSep, bool bMergeSep )
193 : : {
194 : : // assuming that pTextLines is a string array with size CSV_PREVIEW_LINES
195 : : // -> will be dynamic sometime
196 : 0 : DisableRepaint();
197 : 0 : sal_Int32 nEndLine = GetFirstVisLine() + CSV_PREVIEW_LINES;
198 : 0 : const rtl::OUString* pString = pTextLines;
199 [ # # ]: 0 : for( sal_Int32 nLine = GetFirstVisLine(); nLine < nEndLine; ++nLine, ++pString )
200 : : {
201 [ # # ]: 0 : if( mbFixedMode )
202 : 0 : maGrid.ImplSetTextLineFix( nLine, *pString );
203 : : else
204 : 0 : maGrid.ImplSetTextLineSep( nLine, *pString, rSepChars, cTextSep, bMergeSep );
205 : : }
206 : 0 : EnableRepaint();
207 : 0 : }
208 : :
209 : :
210 : : // column settings ------------------------------------------------------------
211 : :
212 : 0 : void ScCsvTableBox::InitTypes( const ListBox& rListBox )
213 : : {
214 [ # # ]: 0 : sal_uInt16 nTypeCount = rListBox.GetEntryCount();
215 [ # # ]: 0 : StringVec aTypeNames( nTypeCount );
216 [ # # ]: 0 : for( sal_uInt16 nIndex = 0; nIndex < nTypeCount; ++nIndex )
217 [ # # ][ # # ]: 0 : aTypeNames[ nIndex ] = rListBox.GetEntry( nIndex );
[ # # ][ # # ]
218 [ # # ]: 0 : maGrid.SetTypeNames( aTypeNames );
219 : 0 : }
220 : :
221 : 0 : void ScCsvTableBox::FillColumnData( ScAsciiOptions& rOptions ) const
222 : : {
223 [ # # ]: 0 : if( mbFixedMode )
224 : 0 : maGrid.FillColumnDataFix( rOptions );
225 : : else
226 : 0 : maGrid.FillColumnDataSep( rOptions );
227 : 0 : }
228 : :
229 : :
230 : : // event handling -------------------------------------------------------------
231 : :
232 : 0 : void ScCsvTableBox::Resize()
233 : : {
234 : 0 : ScCsvControl::Resize();
235 : 0 : InitControls();
236 : 0 : }
237 : :
238 : 0 : void ScCsvTableBox::DataChanged( const DataChangedEvent& rDCEvt )
239 : : {
240 [ # # ][ # # ]: 0 : if( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
[ # # ]
241 : 0 : InitControls();
242 : 0 : ScCsvControl::DataChanged( rDCEvt );
243 : 0 : }
244 : :
245 : 0 : IMPL_LINK( ScCsvTableBox, CsvCmdHdl, ScCsvControl*, pCtrl )
246 : : {
247 : : OSL_ENSURE( pCtrl, "ScCsvTableBox::CsvCmdHdl - missing sender" );
248 : :
249 : 0 : const ScCsvCmd& rCmd = pCtrl->GetCmd();
250 : 0 : ScCsvCmdType eType = rCmd.GetType();
251 : 0 : sal_Int32 nParam1 = rCmd.GetParam1();
252 : 0 : sal_Int32 nParam2 = rCmd.GetParam2();
253 : :
254 : 0 : bool bFound = true;
255 [ # # # # : 0 : switch( eType )
# # # # #
# # # # ]
256 : : {
257 : : case CSVCMD_REPAINT:
258 [ # # ]: 0 : if( !IsNoRepaint() )
259 : : {
260 [ # # ]: 0 : maGrid.ImplRedraw();
261 [ # # ]: 0 : maRuler.ImplRedraw();
262 [ # # ]: 0 : InitHScrollBar();
263 [ # # ]: 0 : InitVScrollBar();
264 : : }
265 : 0 : break;
266 : : case CSVCMD_MAKEPOSVISIBLE:
267 [ # # ]: 0 : MakePosVisible( nParam1 );
268 : 0 : break;
269 : :
270 : : case CSVCMD_NEWCELLTEXTS:
271 [ # # ]: 0 : if( mbFixedMode )
272 [ # # ]: 0 : Execute( CSVCMD_UPDATECELLTEXTS );
273 : : else
274 : : {
275 [ # # ]: 0 : DisableRepaint();
276 [ # # ]: 0 : ScCsvColStateVec aStates( maGrid.GetColumnStates() );
277 : 0 : sal_Int32 nPos = GetFirstVisPos();
278 [ # # ]: 0 : Execute( CSVCMD_SETPOSCOUNT, 1 );
279 [ # # ]: 0 : Execute( CSVCMD_UPDATECELLTEXTS );
280 [ # # ]: 0 : Execute( CSVCMD_SETPOSOFFSET, nPos );
281 [ # # ]: 0 : maGrid.SetColumnStates( aStates );
282 [ # # ]: 0 : EnableRepaint();
283 : : }
284 : 0 : break;
285 : : case CSVCMD_UPDATECELLTEXTS:
286 [ # # ]: 0 : maUpdateTextHdl.Call( this );
287 : 0 : break;
288 : : case CSVCMD_SETCOLUMNTYPE:
289 [ # # ]: 0 : maGrid.SetSelColumnType( nParam1 );
290 : 0 : break;
291 : : case CSVCMD_EXPORTCOLUMNTYPE:
292 [ # # ]: 0 : maColTypeHdl.Call( this );
293 : 0 : break;
294 : : case CSVCMD_SETFIRSTIMPORTLINE:
295 [ # # ]: 0 : maGrid.SetFirstImportedLine( nParam1 );
296 : 0 : break;
297 : :
298 : : case CSVCMD_INSERTSPLIT:
299 : : OSL_ENSURE( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::InsertSplit - invalid call" );
300 [ # # ]: 0 : if( maRuler.GetSplitCount() + 1 < sal::static_int_cast<sal_uInt32>(CSV_MAXCOLCOUNT) )
301 : : {
302 [ # # ]: 0 : maRuler.InsertSplit( nParam1 );
303 [ # # ]: 0 : maGrid.InsertSplit( nParam1 );
304 : : }
305 : 0 : break;
306 : : case CSVCMD_REMOVESPLIT:
307 : : OSL_ENSURE( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::RemoveSplit - invalid call" );
308 [ # # ]: 0 : maRuler.RemoveSplit( nParam1 );
309 [ # # ]: 0 : maGrid.RemoveSplit( nParam1 );
310 : 0 : break;
311 : : case CSVCMD_TOGGLESPLIT:
312 [ # # ][ # # ]: 0 : Execute( maRuler.HasSplit( nParam1 ) ? CSVCMD_REMOVESPLIT : CSVCMD_INSERTSPLIT, nParam1 );
[ # # ]
313 : 0 : break;
314 : : case CSVCMD_MOVESPLIT:
315 : : OSL_ENSURE( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::MoveSplit - invalid call" );
316 [ # # ]: 0 : maRuler.MoveSplit( nParam1, nParam2 );
317 [ # # ]: 0 : maGrid.MoveSplit( nParam1, nParam2 );
318 : 0 : break;
319 : : case CSVCMD_REMOVEALLSPLITS:
320 : : OSL_ENSURE( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::RemoveAllSplits - invalid call" );
321 [ # # ]: 0 : maRuler.RemoveAllSplits();
322 [ # # ]: 0 : maGrid.RemoveAllSplits();
323 : 0 : break;
324 : : default:
325 : 0 : bFound = false;
326 : : }
327 [ # # ]: 0 : if( bFound )
328 : 0 : return 0;
329 : :
330 : 0 : const ScCsvLayoutData aOldData( maData );
331 [ # # # # : 0 : switch( eType )
# # # # #
# # ]
332 : : {
333 : : case CSVCMD_SETPOSCOUNT:
334 : 0 : maData.mnPosCount = Max( nParam1, sal_Int32( 1 ) );
335 [ # # ]: 0 : ImplSetPosOffset( GetFirstVisPos() );
336 : 0 : break;
337 : : case CSVCMD_SETPOSOFFSET:
338 [ # # ]: 0 : ImplSetPosOffset( nParam1 );
339 : 0 : break;
340 : : case CSVCMD_SETHDRWIDTH:
341 : 0 : maData.mnHdrWidth = Max( nParam1, sal_Int32( 0 ) );
342 [ # # ]: 0 : ImplSetPosOffset( GetFirstVisPos() );
343 : 0 : break;
344 : : case CSVCMD_SETCHARWIDTH:
345 : 0 : maData.mnCharWidth = Max( nParam1, sal_Int32( 1 ) );
346 [ # # ]: 0 : ImplSetPosOffset( GetFirstVisPos() );
347 : 0 : break;
348 : : case CSVCMD_SETLINECOUNT:
349 : 0 : maData.mnLineCount = Max( nParam1, sal_Int32( 1 ) );
350 [ # # ]: 0 : ImplSetLineOffset( GetFirstVisLine() );
351 : 0 : break;
352 : : case CSVCMD_SETLINEOFFSET:
353 [ # # ]: 0 : ImplSetLineOffset( nParam1 );
354 : 0 : break;
355 : : case CSVCMD_SETHDRHEIGHT:
356 : 0 : maData.mnHdrHeight = Max( nParam1, sal_Int32( 0 ) );
357 [ # # ]: 0 : ImplSetLineOffset( GetFirstVisLine() );
358 : 0 : break;
359 : : case CSVCMD_SETLINEHEIGHT:
360 : 0 : maData.mnLineHeight = Max( nParam1, sal_Int32( 1 ) );
361 [ # # ]: 0 : ImplSetLineOffset( GetFirstVisLine() );
362 : 0 : break;
363 : : case CSVCMD_MOVERULERCURSOR:
364 [ # # ][ # # ]: 0 : maData.mnPosCursor = IsVisibleSplitPos( nParam1 ) ? nParam1 : CSV_POS_INVALID;
365 : 0 : break;
366 : : case CSVCMD_MOVEGRIDCURSOR:
367 [ # # ][ # # ]: 0 : maData.mnColCursor = ((0 <= nParam1) && (nParam1 < GetPosCount())) ? nParam1 : CSV_POS_INVALID;
368 : 0 : break;
369 : : default:
370 : : {
371 : : // added to avoid warnings
372 : : }
373 : : }
374 : :
375 [ # # ][ # # ]: 0 : if( maData != aOldData )
376 : : {
377 [ # # ]: 0 : DisableRepaint();
378 [ # # ]: 0 : maRuler.ApplyLayout( aOldData );
379 [ # # ]: 0 : maGrid.ApplyLayout( aOldData );
380 [ # # ]: 0 : EnableRepaint();
381 : : }
382 : :
383 : 0 : return 0;
384 : : }
385 : :
386 : 0 : IMPL_LINK( ScCsvTableBox, ScrollHdl, ScrollBar*, pScrollBar )
387 : : {
388 : : OSL_ENSURE( pScrollBar, "ScCsvTableBox::ScrollHdl - missing sender" );
389 : :
390 [ # # ]: 0 : if( pScrollBar == &maHScroll )
391 : 0 : Execute( CSVCMD_SETPOSOFFSET, pScrollBar->GetThumbPos() );
392 [ # # ]: 0 : else if( pScrollBar == &maVScroll )
393 : 0 : Execute( CSVCMD_SETLINEOFFSET, pScrollBar->GetThumbPos() );
394 : :
395 : 0 : return 0;
396 : : }
397 : :
398 : 0 : IMPL_LINK( ScCsvTableBox, ScrollEndHdl, ScrollBar*, pScrollBar )
399 : : {
400 : : OSL_ENSURE( pScrollBar, "ScCsvTableBox::ScrollEndHdl - missing sender" );
401 : :
402 [ # # ]: 0 : if( pScrollBar == &maHScroll )
403 : : {
404 [ # # ]: 0 : if( GetRulerCursorPos() != CSV_POS_INVALID )
405 : 0 : Execute( CSVCMD_MOVERULERCURSOR, maRuler.GetNoScrollPos( GetRulerCursorPos() ) );
406 [ # # ]: 0 : if( GetGridCursorPos() != CSV_POS_INVALID )
407 : 0 : Execute( CSVCMD_MOVEGRIDCURSOR, maGrid.GetNoScrollCol( GetGridCursorPos() ) );
408 : : }
409 : :
410 : 0 : return 0;
411 : : }
412 : :
413 : :
414 : : // accessibility --------------------------------------------------------------
415 : :
416 : 0 : ScCsvTableBox::XAccessibleRef ScCsvTableBox::CreateAccessible()
417 : : {
418 : : // do not use the ScCsvControl mechanism, return default accessible object
419 : 0 : return Control::CreateAccessible();
420 : : }
421 : :
422 : 0 : ScAccessibleCsvControl* ScCsvTableBox::ImplCreateAccessible()
423 : : {
424 : 0 : return NULL; // not used, see CreateAccessible()
425 : : }
426 : :
427 : :
428 : : // ============================================================================
429 : :
430 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|