xref: /AOO41X/main/svx/source/dialog/simptabl.cxx (revision f6e50924346d0b8c0b07c91832a97665dd718b0c)
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