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