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_svx.hxx"
26
27 // INCLUDE -------------------------------------------------------------------
28
29 #include <svx/simptabl.hxx>
30 #include <vcl/svapp.hxx>
31
32 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
33 #include <comphelper/processfactory.hxx>
34 #endif
35 #include <unotools/intlwrapper.hxx>
36
37 // SvxSimpTblContainer ------------------------------------------------------
38
SvxSimpTblContainer(Window * pParent,WinBits nWinStyle)39 SvxSimpTblContainer::SvxSimpTblContainer( Window* pParent, WinBits nWinStyle):
40 Control(pParent,nWinStyle)
41 {
42 //Do Nothing;
43 }
44
SvxSimpTblContainer(Window * pParent,const ResId & rResId)45 SvxSimpTblContainer::SvxSimpTblContainer( Window* pParent, const ResId& rResId):
46 Control(pParent,rResId)
47 {
48 //Do Nothing;
49 }
50
PreNotify(NotifyEvent & rNEvt)51 long SvxSimpTblContainer::PreNotify( NotifyEvent& rNEvt )
52 {
53 long nResult = sal_True;
54 if ( rNEvt.GetType() == EVENT_KEYINPUT )
55 {
56 const KeyCode& aKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
57 sal_uInt16 nKey = aKeyCode.GetCode();
58 if ( nKey == KEY_TAB )
59 GetParent()->Notify( rNEvt );
60 else if ( m_pTable->IsFocusOnCellEnabled() && ( nKey == KEY_LEFT || nKey == KEY_RIGHT ) )
61 return 0;
62 else
63 nResult = Control::PreNotify( rNEvt );
64 }
65 else
66 nResult = Control::PreNotify( rNEvt );
67
68 return nResult;
69 }
70
71
72 // SvxSimpleTable ------------------------------------------------------------
73
SvxSimpleTable(Window * pParent,WinBits nBits)74 SvxSimpleTable::SvxSimpleTable( Window* pParent,WinBits nBits ):
75 SvHeaderTabListBox(pParent,WB_CLIPCHILDREN | WB_HSCROLL | WB_TABSTOP),
76 aPrivContainer(pParent,nBits|WB_DIALOGCONTROL),
77 aHeaderBar(pParent,WB_BUTTONSTYLE | WB_BORDER | WB_TABSTOP),
78 nHeaderItemId(1),
79 bResizeFlag(sal_False),
80 bPaintFlag(sal_True)
81 {
82 bSortDirection=sal_True;
83 nSortCol=0xFFFF;
84 nOldPos=0;
85
86 SetParent(&aPrivContainer);
87 aHeaderBar.SetParent(&aPrivContainer);
88 aPrivContainer.SetTable( this );
89
90 aHeaderBar.SetStartDragHdl(LINK( this, SvxSimpleTable, StartDragHdl));
91 aHeaderBar.SetDragHdl(LINK( this, SvxSimpleTable, DragHdl));
92 aHeaderBar.SetEndDragHdl(LINK( this, SvxSimpleTable, EndDragHdl));
93 aHeaderBar.SetSelectHdl(LINK( this, SvxSimpleTable, HeaderBarClick));
94 aHeaderBar.SetDoubleClickHdl(LINK( this, SvxSimpleTable, HeaderBarDblClick));
95
96 EnableCellFocus();
97 DisableTransientChildren();
98 InitHeaderBar( &aHeaderBar );
99
100 aHeaderBar.Show();
101 SvHeaderTabListBox::Show();
102 }
103
104
SvxSimpleTable(Window * pParent,const ResId & rResId)105 SvxSimpleTable::SvxSimpleTable( Window* pParent,const ResId& rResId):
106 SvHeaderTabListBox(pParent,WB_CLIPCHILDREN | WB_HSCROLL | WB_TABSTOP),
107 aPrivContainer(pParent,rResId),
108 aHeaderBar(pParent,WB_BUTTONSTYLE | WB_BORDER | WB_TABSTOP),
109 nHeaderItemId(1),
110 bResizeFlag(sal_True),
111 bPaintFlag(sal_True)
112 {
113
114 bSortDirection=sal_True;
115 nOldPos=0;
116 nSortCol=0xFFFF;
117
118 pMyParentWin=pParent;
119 SetParent(&aPrivContainer);
120 aHeaderBar.SetParent(&aPrivContainer);
121 aPrivContainer.SetTable( this );
122
123 WinBits nBits=aPrivContainer.GetStyle()|WB_DIALOGCONTROL;
124 aPrivContainer.SetStyle(nBits);
125
126 aHeaderBar.SetStartDragHdl(LINK( this, SvxSimpleTable, StartDragHdl));
127 aHeaderBar.SetDragHdl(LINK( this, SvxSimpleTable, DragHdl));
128 aHeaderBar.SetEndDragHdl(LINK( this, SvxSimpleTable, EndDragHdl));
129 aHeaderBar.SetSelectHdl(LINK( this, SvxSimpleTable, HeaderBarClick));
130 aHeaderBar.SetDoubleClickHdl(LINK( this, SvxSimpleTable, HeaderBarDblClick));
131
132 Size theWinSize=aPrivContainer.GetOutputSizePixel();
133 Size HbSize=aHeaderBar.GetSizePixel();
134
135 HbSize.Width()=theWinSize.Width();
136 theWinSize.Height()-=HbSize.Height();
137 Point thePos(0,0);
138
139 aHeaderBar.SetPosPixel(thePos);
140 aHeaderBar.SetSizePixel(HbSize);
141
142 thePos.Y()+=HbSize.Height();
143 SvHeaderTabListBox::SetPosPixel(thePos);
144 SvHeaderTabListBox::SetSizePixel(theWinSize);
145
146 EnableCellFocus();
147 DisableTransientChildren();
148 InitHeaderBar( &aHeaderBar );
149
150 aHeaderBar.Show();
151 SvHeaderTabListBox::Show();
152 }
153
~SvxSimpleTable()154 SvxSimpleTable::~SvxSimpleTable()
155 {
156 SetParent(pMyParentWin);
157 aPrivContainer.SetParent(this);
158 aHeaderBar.SetParent(this);
159 }
160
161
UpdateViewSize()162 void SvxSimpleTable::UpdateViewSize()
163 {
164 Size theWinSize=aPrivContainer.GetOutputSizePixel();
165 Size HbSize=aHeaderBar.GetSizePixel();
166
167 HbSize.Width()=theWinSize.Width();
168 theWinSize.Height()-=HbSize.Height();
169 Point thePos(0,0);
170
171 aHeaderBar.SetPosPixel(thePos);
172 aHeaderBar.SetSizePixel(HbSize);
173
174 thePos.Y()+=HbSize.Height();
175 SvHeaderTabListBox::SetPosPixel(thePos);
176 SvHeaderTabListBox::SetSizePixel(theWinSize);
177 Invalidate();
178 }
179
NotifyScrolled()180 void SvxSimpleTable::NotifyScrolled()
181 {
182 long nOffset=-GetXOffset();
183 if(nOldPos!=nOffset)
184 {
185 aHeaderBar.SetOffset(nOffset);
186 aHeaderBar.Invalidate();
187 aHeaderBar.Update();
188 nOldPos=nOffset;
189 }
190 SvHeaderTabListBox::NotifyScrolled();
191 }
192
SetTabs()193 void SvxSimpleTable::SetTabs()
194 {
195 SvHeaderTabListBox::SetTabs();
196
197 sal_uInt16 nPrivTabCount = TabCount();
198 if ( nPrivTabCount )
199 {
200 if ( nPrivTabCount > aHeaderBar.GetItemCount() )
201 nPrivTabCount = aHeaderBar.GetItemCount();
202
203 sal_uInt16 i, nNewSize = static_cast< sal_uInt16 >( GetTab(0) ), nPos = 0;
204 for ( i = 1; i < nPrivTabCount; ++i )
205 {
206 nNewSize = static_cast< sal_uInt16 >( GetTab(i) ) - nPos;
207 aHeaderBar.SetItemSize( i, nNewSize );
208 nPos = (sal_uInt16)GetTab(i);
209 }
210
211 aHeaderBar.SetItemSize( i, HEADERBAR_FULLSIZE ); // because no tab for last entry
212 }
213 }
214
SetTabs(long * pTabs,MapUnit eMapUnit)215 void SvxSimpleTable::SetTabs( long* pTabs, MapUnit eMapUnit)
216 {
217 SvHeaderTabListBox::SetTabs(pTabs,eMapUnit);
218 }
219
Paint(const Rectangle & rRect)220 void SvxSimpleTable::Paint( const Rectangle& rRect )
221 {
222 SvHeaderTabListBox::Paint(rRect );
223
224 sal_uInt16 nPrivTabCount = TabCount();
225 sal_uInt16 nPos = 0;
226 sal_uInt16 nNewSize = ( nPrivTabCount > 0 ) ? (sal_uInt16)GetTab(0) : 0;
227
228 long nOffset=-GetXOffset();
229 nOldPos=nOffset;
230
231 aHeaderBar.SetOffset(nOffset);
232 aHeaderBar.Invalidate();
233
234 if(nPrivTabCount && bPaintFlag)
235 {
236 if(nPrivTabCount>aHeaderBar.GetItemCount())
237 nPrivTabCount=aHeaderBar.GetItemCount();
238
239 for(sal_uInt16 i=1;i<nPrivTabCount;i++)
240 {
241 nNewSize = static_cast< sal_uInt16 >( GetTab(i) ) - nPos;
242 aHeaderBar.SetItemSize( i, nNewSize );
243 nPos= static_cast< sal_uInt16 >( GetTab(i) );
244 }
245 }
246 bPaintFlag=sal_True;
247 }
InsertHeaderEntry(const XubString & rText,sal_uInt16 nCol,HeaderBarItemBits nBits)248 void SvxSimpleTable::InsertHeaderEntry(const XubString& rText,sal_uInt16 nCol,
249 HeaderBarItemBits nBits)
250 {
251 xub_StrLen nEnd = rText.Search( sal_Unicode( '\t' ) );
252 if( nEnd == STRING_NOTFOUND )
253 {
254 aHeaderBar.InsertItem(nHeaderItemId++, rText, 0, nBits, nCol);
255 }
256 else
257 {
258 xub_StrLen nCount = rText.GetTokenCount( sal_Unicode( '\t' ) );
259
260 for( xub_StrLen i=0; i<nCount; i++ )
261 {
262 String aString=rText.GetToken(i, sal_Unicode( '\t' ) );
263 aHeaderBar.InsertItem(nHeaderItemId++, aString, 0, nBits, nCol);
264 }
265 }
266 SetTabs();
267 }
268
ClearAll()269 void SvxSimpleTable::ClearAll()
270 {
271 aHeaderBar.Clear();
272 Clear();
273 }
ClearHeader()274 void SvxSimpleTable::ClearHeader()
275 {
276 aHeaderBar.Clear();
277 }
278
ShowTable()279 void SvxSimpleTable::ShowTable()
280 {
281 aPrivContainer.Show();
282 }
283
HideTable()284 void SvxSimpleTable::HideTable()
285 {
286 aPrivContainer.Hide();
287 }
288
IsVisible() const289 sal_Bool SvxSimpleTable::IsVisible() const
290 {
291 return aPrivContainer.IsVisible();
292 }
293
EnableTable()294 void SvxSimpleTable::EnableTable()
295 {
296 aPrivContainer.Enable();
297 }
298
DisableTable()299 void SvxSimpleTable::DisableTable()
300 {
301 aPrivContainer.Disable();
302 }
303
IsEnabled() const304 sal_Bool SvxSimpleTable::IsEnabled() const
305 {
306 return aPrivContainer.IsEnabled();
307 }
308
TableToTop()309 void SvxSimpleTable::TableToTop()
310 {
311 aPrivContainer.ToTop();
312 }
313
SetPosPixel(const Point & rNewPos)314 void SvxSimpleTable::SetPosPixel( const Point& rNewPos )
315 {
316 aPrivContainer.SetPosPixel(rNewPos);
317 }
318
GetPosPixel() const319 Point SvxSimpleTable::GetPosPixel() const
320 {
321 return aPrivContainer.GetPosPixel();
322 }
323
SetPosSizePixel(const Point & rNewPos,Size & rNewSize)324 void SvxSimpleTable::SetPosSizePixel( const Point& rNewPos, Size& rNewSize )
325 {
326 aPrivContainer.SetPosPixel(rNewPos);
327 aPrivContainer.SetSizePixel(rNewSize);
328 }
329
SetPosSize(const Point & rNewPos,const Size & rNewSize)330 void SvxSimpleTable::SetPosSize( const Point& rNewPos, const Size& rNewSize )
331 {
332 aPrivContainer.SetPosPixel(rNewPos);
333 SvHeaderTabListBox::SetPosSizePixel(rNewPos,rNewSize);
334 }
335
GetSizePixel() const336 Size SvxSimpleTable::GetSizePixel() const
337 {
338 return aPrivContainer.GetSizePixel();
339 }
340
GetOutputSizePixel() const341 Size SvxSimpleTable::GetOutputSizePixel() const
342 {
343 return aPrivContainer.GetOutputSizePixel();
344 }
345
SetSizePixel(const Size & rNewSize)346 void SvxSimpleTable::SetSizePixel(const Size& rNewSize )
347 {
348 aPrivContainer.SetSizePixel(rNewSize);
349 UpdateViewSize();
350 }
351
SetOutputSizePixel(const Size & rNewSize)352 void SvxSimpleTable::SetOutputSizePixel(const Size& rNewSize )
353 {
354 aPrivContainer.SetOutputSizePixel(rNewSize);
355 UpdateViewSize();
356 }
357
GetSelectedCol()358 sal_uInt16 SvxSimpleTable::GetSelectedCol()
359 {
360 return (aHeaderBar.GetCurItemId()-1);
361 }
362
SortByCol(sal_uInt16 nCol,sal_Bool bDir)363 void SvxSimpleTable::SortByCol(sal_uInt16 nCol,sal_Bool bDir)
364 {
365 bSortDirection=bDir;
366 if(nSortCol!=0xFFFF)
367 aHeaderBar.SetItemBits(nSortCol+1,HIB_STDSTYLE);
368
369 if (nCol != 0xFFFF)
370 {
371 if(bDir)
372 {
373 aHeaderBar.SetItemBits( nCol+1, HIB_STDSTYLE | HIB_DOWNARROW);
374 GetModel()->SetSortMode(SortAscending);
375 }
376 else
377 {
378 aHeaderBar.SetItemBits( nCol+1, HIB_STDSTYLE | HIB_UPARROW);
379 GetModel()->SetSortMode(SortDescending);
380 }
381 nSortCol=nCol;
382 GetModel()->SetCompareHdl( LINK( this, SvxSimpleTable, CompareHdl));
383 GetModel()->Resort();
384 }
385 else
386 GetModel()->SetSortMode(SortNone);
387 nSortCol=nCol;
388 }
389
HBarClick()390 void SvxSimpleTable::HBarClick()
391 {
392 sal_uInt16 nId=aHeaderBar.GetCurItemId();
393
394 if (aHeaderBar.GetItemBits(nId) & HIB_CLICKABLE)
395 {
396 if(nId==nSortCol+1)
397 {
398 SortByCol(nId-1,!bSortDirection);
399 }
400 else
401 {
402 SortByCol(nId-1,bSortDirection);
403 }
404
405 aHeaderBarClickLink.Call(this);
406 }
407 }
408
HBarDblClick()409 void SvxSimpleTable::HBarDblClick()
410 {
411 aHeaderBarDblClickLink.Call(this);
412 }
413
HBarStartDrag()414 void SvxSimpleTable::HBarStartDrag()
415 {
416 if(!aHeaderBar.IsItemMode())
417 {
418 Rectangle aSizeRect(Point(0,0),
419 SvHeaderTabListBox::GetOutputSizePixel());
420 aSizeRect.Left()=-GetXOffset()+aHeaderBar.GetDragPos();
421 aSizeRect.Right()=-GetXOffset()+aHeaderBar.GetDragPos();
422 ShowTracking( aSizeRect, SHOWTRACK_SPLIT );
423 }
424 }
HBarDrag()425 void SvxSimpleTable::HBarDrag()
426 {
427 HideTracking();
428 if(!aHeaderBar.IsItemMode())
429 {
430 Rectangle aSizeRect(Point(0,0),
431 SvHeaderTabListBox::GetOutputSizePixel());
432 aSizeRect.Left()=-GetXOffset()+aHeaderBar.GetDragPos();
433 aSizeRect.Right()=-GetXOffset()+aHeaderBar.GetDragPos();
434 ShowTracking( aSizeRect, SHOWTRACK_SPLIT );
435 }
436 }
HBarEndDrag()437 void SvxSimpleTable::HBarEndDrag()
438 {
439 HideTracking();
440 sal_uInt16 nPrivTabCount=TabCount();
441 sal_uInt16 nPos=0;
442 sal_uInt16 nNewSize=0;
443
444 if(nPrivTabCount)
445 {
446 if(nPrivTabCount>aHeaderBar.GetItemCount())
447 nPrivTabCount=aHeaderBar.GetItemCount();
448
449 //for(sal_uInt16 i=1;i<=nPrivTabCount;i++)
450 for(sal_uInt16 i=1;i<nPrivTabCount;i++)
451 {
452 nNewSize = static_cast< sal_uInt16 >( aHeaderBar.GetItemSize(i) ) + nPos;
453 SetTab( i, nNewSize, MAP_PIXEL );
454 nPos = nNewSize;
455 }
456 }
457 bPaintFlag=sal_False;
458 Invalidate();
459 Update();
460 }
461
GetCommandEvent() const462 CommandEvent SvxSimpleTable::GetCommandEvent() const
463 {
464 return aCEvt;
465 }
466
Command(const CommandEvent & rCEvt)467 void SvxSimpleTable::Command( const CommandEvent& rCEvt )
468 {
469 aCEvt=rCEvt;
470 aCommandLink.Call(this);
471 SvHeaderTabListBox::Command(rCEvt);
472 }
473
IMPL_LINK(SvxSimpleTable,StartDragHdl,HeaderBar *,pCtr)474 IMPL_LINK( SvxSimpleTable, StartDragHdl, HeaderBar*, pCtr)
475 {
476 if(pCtr==&aHeaderBar)
477 {
478 HBarStartDrag();
479 }
480 return 0;
481 }
482
IMPL_LINK(SvxSimpleTable,DragHdl,HeaderBar *,pCtr)483 IMPL_LINK( SvxSimpleTable, DragHdl, HeaderBar*, pCtr)
484 {
485 if(pCtr==&aHeaderBar)
486 {
487 HBarDrag();
488 }
489 return 0;
490 }
491
IMPL_LINK(SvxSimpleTable,EndDragHdl,HeaderBar *,pCtr)492 IMPL_LINK( SvxSimpleTable, EndDragHdl, HeaderBar*, pCtr)
493 {
494 if(pCtr==&aHeaderBar)
495 {
496 HBarEndDrag();
497 }
498 return 0;
499 }
500
IMPL_LINK(SvxSimpleTable,HeaderBarClick,HeaderBar *,pCtr)501 IMPL_LINK( SvxSimpleTable, HeaderBarClick, HeaderBar*, pCtr)
502 {
503 if(pCtr==&aHeaderBar)
504 {
505 HBarClick();
506 }
507 return 0;
508 }
509
IMPL_LINK(SvxSimpleTable,HeaderBarDblClick,HeaderBar *,pCtr)510 IMPL_LINK( SvxSimpleTable, HeaderBarDblClick, HeaderBar*, pCtr)
511 {
512 if(pCtr==&aHeaderBar)
513 {
514 HBarDblClick();
515 }
516 return 0;
517 }
518
GetEntryAtPos(SvLBoxEntry * pEntry,sal_uInt16 nPos) const519 SvLBoxItem* SvxSimpleTable::GetEntryAtPos( SvLBoxEntry* pEntry, sal_uInt16 nPos ) const
520 {
521 DBG_ASSERT(pEntry,"GetEntryText:Invalid Entry");
522 SvLBoxItem* pItem = NULL;
523
524 if( pEntry )
525 {
526 sal_uInt16 nCount = pEntry->ItemCount();
527
528 nPos++;
529
530 if( nTreeFlags & TREEFLAG_CHKBTN ) nPos++;
531
532 if( nPos < nCount )
533 {
534 pItem = pEntry->GetItem( nPos);
535 }
536 }
537 return pItem;
538 }
539
ColCompare(SvLBoxEntry * pLeft,SvLBoxEntry * pRight)540 StringCompare SvxSimpleTable::ColCompare(SvLBoxEntry* pLeft,SvLBoxEntry* pRight)
541 {
542 StringCompare eCompare=COMPARE_EQUAL;
543
544 SvLBoxItem* pLeftItem = GetEntryAtPos( pLeft, nSortCol);
545 SvLBoxItem* pRightItem = GetEntryAtPos( pRight, nSortCol);
546
547
548 if(pLeftItem != NULL && pRightItem != NULL)
549 {
550 sal_uInt16 nLeftKind=pLeftItem->IsA();
551 sal_uInt16 nRightKind=pRightItem->IsA();
552
553 if(nRightKind == SV_ITEM_ID_LBOXSTRING &&
554 nLeftKind == SV_ITEM_ID_LBOXSTRING )
555 {
556 IntlWrapper aIntlWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
557 const CollatorWrapper* pCollator = aIntlWrapper.getCaseCollator();
558
559 eCompare=(StringCompare)pCollator->compareString( ((SvLBoxString*)pLeftItem)->GetText(),
560 ((SvLBoxString*)pRightItem)->GetText());
561
562 if(eCompare==COMPARE_EQUAL) eCompare=COMPARE_LESS;
563 }
564 }
565 return eCompare;
566 }
567
IMPL_LINK(SvxSimpleTable,CompareHdl,SvSortData *,pData)568 IMPL_LINK( SvxSimpleTable, CompareHdl, SvSortData*, pData)
569 {
570 SvLBoxEntry* pLeft = (SvLBoxEntry*)(pData->pLeft );
571 SvLBoxEntry* pRight = (SvLBoxEntry*)(pData->pRight );
572 return (long) ColCompare(pLeft,pRight);
573 }
574
575
576