xref: /AOO41X/main/dbaccess/source/ui/querydesign/TableWindow.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
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_dbaccess.hxx"
26 #ifndef DBAUI_TABLEWINDOW_HXX
27 #include "TableWindow.hxx"
28 #endif
29 #ifndef DBAUI_TABLEWINDOWLISTBOX_HXX
30 #include "TableWindowListBox.hxx"
31 #endif
32 #ifndef DBAUI_QUERYTABLEVIEW_HXX
33 #include "QueryTableView.hxx"
34 #endif
35 #ifndef DBAUI_QUERYDESIGNVIEW_HXX
36 #include "QueryDesignView.hxx"
37 #endif
38 #ifndef DBAUI_TABLEWINDOWDATA_HXX
39 #include "TableWindowData.hxx"
40 #endif
41 #ifndef DBACCESS_IMAGEPROVIDER_HXX
42 #include "imageprovider.hxx"
43 #endif
44 #ifndef _TOOLS_DEBUG_HXX
45 #include <tools/debug.hxx>
46 #endif
47 #ifndef TOOLS_DIAGNOSE_EX_H
48 #include <tools/diagnose_ex.h>
49 #endif
50 #ifndef _SV_SVAPP_HXX
51 #include <vcl/svapp.hxx>
52 #endif
53 #ifndef _SV_WALL_HXX
54 #include <vcl/wall.hxx>
55 #endif
56 
57 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
58 #include <com/sun/star/container/XNameAccess.hpp>
59 #include <com/sun/star/beans/XPropertySet.hpp>
60 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
61 #include <com/sun/star/accessibility/AccessibleRole.hpp>
62 #include "querycontroller.hxx"
63 #include "dbu_qry.hrc"
64 #include "dbustrings.hrc"
65 #include "Query.hrc"
66 #include <comphelper/extract.hxx>
67 #include "UITools.hxx"
68 #include "TableWindowAccess.hxx"
69 #include "browserids.hxx"
70 #include <connectivity/dbtools.hxx>
71 
72 
73 using namespace dbaui;
74 using namespace ::utl;
75 using namespace ::com::sun::star;
76 using namespace ::com::sun::star::sdb;
77 using namespace ::com::sun::star::sdbc;
78 using namespace ::com::sun::star::sdbcx;
79 using namespace ::com::sun::star::uno;
80 using namespace ::com::sun::star::beans;
81 using namespace ::com::sun::star::container;
82 using namespace ::com::sun::star::lang;
83 using namespace ::com::sun::star::accessibility;
84 
85 #define TABWIN_SIZING_AREA      4
86 #define LISTBOX_SCROLLING_AREA  6
87 #define SCROLLING_TIMESPAN      500
88 
89 #define TABWIN_WIDTH_MIN    90
90 #define TABWIN_HEIGHT_MIN   80
91 
92 //========================================================================
93 // class OTableWindow
94 //========================================================================
DBG_NAME(OTableWindow)95 DBG_NAME(OTableWindow)
96 //------------------------------------------------------------------------------
97 OTableWindow::OTableWindow( Window* pParent, const TTableWindowData::value_type& pTabWinData )
98           : ::comphelper::OContainerListener(m_aMutex)
99           ,Window( pParent, WB_3DLOOK|WB_MOVEABLE )
100           ,m_aTypeImage( this )
101           ,m_aTitle( this )
102           ,m_pListBox(NULL)
103           ,m_pAccessible(NULL)
104           ,m_pData( pTabWinData )
105           ,m_nMoveCount(0)
106           ,m_nMoveIncrement(1)
107           ,m_nSizingFlags( SIZING_NONE )
108           ,m_bActive( sal_False )
109 {
110     DBG_CTOR(OTableWindow,NULL);
111 
112     // Position und Groesse bestimmen
113     if( GetData()->HasPosition() )
114         SetPosPixel( GetData()->GetPosition() );
115 
116     if( GetData()->HasSize() )
117         SetSizePixel( GetData()->GetSize() );
118 
119     // Hintergrund setzen
120     const StyleSettings&  aSystemStyle = Application::GetSettings().GetStyleSettings();
121     SetBackground(Wallpaper(aSystemStyle.GetFaceColor()));
122     // und Textfarbe (obwohl ich eigentlich keinen Text habe, aber wer weiss, was
123     // abgeleitete Klassen machen)
124     SetTextColor(aSystemStyle.GetButtonTextColor());
125 
126     EnableClipSiblings();
127 }
128 
129 //------------------------------------------------------------------------------
~OTableWindow()130 OTableWindow::~OTableWindow()
131 {
132     DBG_DTOR(OTableWindow,NULL);
133 
134     if (m_pListBox)
135     {
136         OSL_ENSURE(m_pListBox->GetEntryCount()==0,"Forgot to call EmptyListbox()!");
137         ::std::auto_ptr<Window> aTemp(m_pListBox);
138         m_pListBox = NULL;
139     } // if (m_pListBox)
140     if ( m_pContainerListener.is() )
141         m_pContainerListener->dispose();
142 
143     m_pAccessible = NULL;
144 }
145 // -----------------------------------------------------------------------------
getTableView() const146 const OJoinTableView* OTableWindow::getTableView() const
147 {
148     OSL_ENSURE(static_cast<OJoinTableView*>(GetParent()),"No OJoinTableView!");
149     return static_cast<OJoinTableView*>(GetParent());
150 }
151 // -----------------------------------------------------------------------------
getTableView()152 OJoinTableView* OTableWindow::getTableView()
153 {
154     OSL_ENSURE(static_cast<OJoinTableView*>(GetParent()),"No OJoinTableView!");
155     return static_cast<OJoinTableView*>(GetParent());
156 }
157 // -----------------------------------------------------------------------------
getDesignView()158 OJoinDesignView* OTableWindow::getDesignView()
159 {
160     OSL_ENSURE(static_cast<OJoinDesignView*>(GetParent()->GetParent()->GetParent()),"No OJoinDesignView!");
161     return static_cast<OJoinDesignView*>(GetParent()->GetParent()->GetParent());
162 }
163 //------------------------------------------------------------------------------
SetPosPixel(const Point & rNewPos)164 void OTableWindow::SetPosPixel( const Point& rNewPos )
165 {
166     Point aNewPosData = rNewPos + getTableView()->GetScrollOffset();
167     GetData()->SetPosition( aNewPosData );
168     Window::SetPosPixel( rNewPos );
169 }
170 
171 //------------------------------------------------------------------------------
SetSizePixel(const Size & rNewSize)172 void OTableWindow::SetSizePixel( const Size& rNewSize )
173 {
174     Size aOutSize(rNewSize);
175     if( aOutSize.Width() < TABWIN_WIDTH_MIN )
176         aOutSize.Width() = TABWIN_WIDTH_MIN;
177     if( aOutSize.Height() < TABWIN_HEIGHT_MIN )
178         aOutSize.Height() = TABWIN_HEIGHT_MIN;
179 
180     GetData()->SetSize( aOutSize );
181     Window::SetSizePixel( aOutSize );
182 }
183 //------------------------------------------------------------------------------
SetPosSizePixel(const Point & rNewPos,const Size & rNewSize)184 void OTableWindow::SetPosSizePixel( const Point& rNewPos, const Size& rNewSize )
185 {
186     SetPosPixel( rNewPos );
187     SetSizePixel( rNewSize );
188 }
189 //------------------------------------------------------------------------------
CreateListBox()190 OTableWindowListBox* OTableWindow::CreateListBox()
191 {
192     return new OTableWindowListBox(this);
193 }
194 
195 //------------------------------------------------------------------------------
FillListBox()196 sal_Bool OTableWindow::FillListBox()
197 {
198     m_pListBox->Clear();
199     if ( !m_pContainerListener.is() )
200     {
201         Reference< XContainer> xContainer(m_pData->getColumns(),UNO_QUERY);
202         if ( xContainer.is() )
203             m_pContainerListener = new ::comphelper::OContainerListenerAdapter(this,xContainer);
204     }
205     // mark all primary keys with special image
206     ModuleRes TmpRes(isHiContrast(m_pListBox) ? IMG_JOINS_H : IMG_JOINS);
207     ImageList aImageList(TmpRes);
208     Image aPrimKeyImage = aImageList.GetImage(IMG_PRIMARY_KEY);
209 
210     if (GetData()->IsShowAll())
211     {
212         SvLBoxEntry* pEntry = m_pListBox->InsertEntry( ::rtl::OUString::createFromAscii("*") );
213         pEntry->SetUserData( createUserData(NULL,false) );
214     }
215 
216     Reference<XNameAccess> xPKeyColumns;
217     try
218     {
219         xPKeyColumns = dbtools::getPrimaryKeyColumns_throw(m_pData->getTable());
220     }
221     catch(Exception&)
222     {
223         OSL_ENSURE(0,"Exception occured!");
224     }
225     try
226     {
227         Reference< XNameAccess > xColumns = m_pData->getColumns();
228         if( xColumns.is() )
229         {
230             Sequence< ::rtl::OUString> aColumns = xColumns->getElementNames();
231             const ::rtl::OUString* pIter = aColumns.getConstArray();
232             const ::rtl::OUString* pEnd = pIter + aColumns.getLength();
233 
234             SvLBoxEntry* pEntry = NULL;
235             for (; pIter != pEnd; ++pIter)
236             {
237                 bool bPrimaryKeyColumn = xPKeyColumns.is() && xPKeyColumns->hasByName( *pIter );
238                 // is this column in the primary key
239                 if ( bPrimaryKeyColumn )
240                     pEntry = m_pListBox->InsertEntry(*pIter, aPrimKeyImage, aPrimKeyImage);
241                 else
242                     pEntry = m_pListBox->InsertEntry(*pIter);
243 
244                 Reference<XPropertySet> xColumn(xColumns->getByName(*pIter),UNO_QUERY);
245                 if ( xColumn.is() )
246                     pEntry->SetUserData( createUserData(xColumn,bPrimaryKeyColumn) );
247             }
248         }
249     }
250     catch(Exception&)
251     {
252         OSL_ENSURE(0,"Exception occured!");
253     }
254 
255     return sal_True;
256 }
257 // -----------------------------------------------------------------------------
createUserData(const Reference<XPropertySet> &,bool)258 void* OTableWindow::createUserData(const Reference< XPropertySet>& /*_xColumn*/,bool /*_bPrimaryKey*/)
259 {
260     return NULL;
261 }
262 // -----------------------------------------------------------------------------
deleteUserData(void * & _pUserData)263 void OTableWindow::deleteUserData(void*& _pUserData)
264 {
265     OSL_ENSURE(!_pUserData,"INVALID call. Need to delete the userclass!");
266     _pUserData = NULL;
267 }
268 //------------------------------------------------------------------------------
clearListBox()269 void OTableWindow::clearListBox()
270 {
271     if ( m_pListBox )
272     {
273         SvLBoxEntry* pEntry = m_pListBox->First();
274 
275         while(pEntry)
276         {
277             void* pUserData = pEntry->GetUserData();
278             deleteUserData(pUserData);
279             SvLBoxEntry* pNextEntry = m_pListBox->Next(pEntry);
280             m_pListBox->GetModel()->Remove(pEntry);
281             pEntry = pNextEntry;
282         }
283     }
284 }
285 
286 //------------------------------------------------------------------------------
impl_updateImage()287 void OTableWindow::impl_updateImage()
288 {
289     ImageProvider aImageProvider( getDesignView()->getController().getConnection() );
290 
291     Image aImage, aImageHC;
292     aImageProvider.getImages( GetComposedName(), m_pData->isQuery() ? DatabaseObject::QUERY : DatabaseObject::TABLE, aImage, aImageHC );
293 
294     if ( !aImage || !aImageHC )
295     {
296         OSL_ENSURE( false, "OTableWindow::impl_updateImage: no images!" );
297         return;
298     }
299 
300     m_aTypeImage.SetModeImage( aImage, BMP_COLOR_NORMAL );
301     m_aTypeImage.SetModeImage( aImageHC, BMP_COLOR_HIGHCONTRAST );
302     m_aTypeImage.Show();
303 }
304 
305 //------------------------------------------------------------------------------
Init()306 sal_Bool OTableWindow::Init()
307 {
308     // create list box if necessary
309     if ( !m_pListBox )
310     {
311         m_pListBox = CreateListBox();
312         DBG_ASSERT( m_pListBox != NULL, "OTableWindow::Init() : CreateListBox hat NULL geliefert !" );
313         m_pListBox->SetSelectionMode( MULTIPLE_SELECTION );
314     }
315 
316     // Titel setzen
317     m_aTitle.SetText( m_pData->GetWinName() );
318     m_aTitle.Show();
319 
320     m_pListBox->Show();
321 
322     // die Felder in die ListBox eintragen
323     clearListBox();
324     sal_Bool bSuccess = FillListBox();
325     if ( bSuccess )
326         m_pListBox->SelectAll( sal_False );
327 
328     impl_updateImage();
329 
330     return bSuccess;
331 }
332 //------------------------------------------------------------------------------
DataChanged(const DataChangedEvent & rDCEvt)333 void OTableWindow::DataChanged(const DataChangedEvent& rDCEvt)
334 {
335     if (rDCEvt.GetType() == DATACHANGED_SETTINGS)
336     {
337         // nehmen wir den worst-case an : die Farben haben sich geaendert, also
338         // mich anpassen
339         const StyleSettings&  aSystemStyle = Application::GetSettings().GetStyleSettings();
340         SetBackground(Wallpaper(Color(aSystemStyle.GetFaceColor())));
341         SetTextColor(aSystemStyle.GetButtonTextColor());
342     }
343 }
344 //------------------------------------------------------------------------------
Paint(const Rectangle & rRect)345 void OTableWindow::Paint( const Rectangle& rRect )
346 {
347     Rectangle aRect( Point(0,0), GetOutputSizePixel() );
348     Window::Paint( rRect );
349     Draw3DBorder( aRect );
350 }
351 
352 //------------------------------------------------------------------------------
Draw3DBorder(const Rectangle & rRect)353 void OTableWindow::Draw3DBorder(const Rectangle& rRect)
354 {
355     // die Style-Settings des Systems fuer meine Farben
356     const StyleSettings& aSystemStyle = Application::GetSettings().GetStyleSettings();
357 
358     // Schwarze Linie unten und rechts
359     SetLineColor(aSystemStyle.GetDarkShadowColor());
360     DrawLine( rRect.BottomLeft(), rRect.BottomRight() );
361     DrawLine( rRect.BottomRight(), rRect.TopRight() );
362 
363     // Dunkelgraue Linie ueber der schwarzen
364     SetLineColor(aSystemStyle.GetShadowColor());
365     Point aEHvector(1,1);
366     DrawLine( rRect.BottomLeft()+Point(1,-1), rRect.BottomRight() - aEHvector );
367     DrawLine( rRect.BottomRight() - aEHvector, rRect.TopRight()+Point(-1,1) );
368 
369     // Hellgraue Linie links und oben
370     SetLineColor(aSystemStyle.GetLightColor());
371     DrawLine( rRect.BottomLeft()+Point(1,-2), rRect.TopLeft() + aEHvector );
372     DrawLine( rRect.TopLeft() + aEHvector, rRect.TopRight()+Point(-2,1) );
373 }
374 // -----------------------------------------------------------------------------
getSizingRect(const Point & _rPos,const Size & _rOutputSize) const375 Rectangle OTableWindow::getSizingRect(const Point& _rPos,const Size& _rOutputSize) const
376 {
377     Rectangle aSizingRect = Rectangle( GetPosPixel(), GetSizePixel() );
378     sal_uInt16 nSizingFlags = GetSizingFlags();
379 
380     if( nSizingFlags & SIZING_TOP )
381     {
382         if( _rPos.Y() < 0 )
383             aSizingRect.Top() = 0;
384         else
385             aSizingRect.Top() = _rPos.Y();
386     }
387 
388     if( nSizingFlags & SIZING_BOTTOM )
389     {
390         if( _rPos.Y() > _rOutputSize.Height() )
391             aSizingRect.Bottom() = _rOutputSize.Height();
392         else
393             aSizingRect.Bottom() = _rPos.Y();
394     }
395 
396 
397     if( nSizingFlags & SIZING_RIGHT )
398     {
399         if( _rPos.X() > _rOutputSize.Width() )
400             aSizingRect.Right() = _rOutputSize.Width();
401         else
402             aSizingRect.Right() = _rPos.X();
403     }
404 
405     if( nSizingFlags & SIZING_LEFT )
406     {
407         if( _rPos.X() < 0 )
408             aSizingRect.Left() = 0;
409         else
410             aSizingRect.Left() = _rPos.X();
411     }
412     return aSizingRect;
413 }
414 // -----------------------------------------------------------------------------
setSizingFlag(const Point & _rPos)415 void OTableWindow::setSizingFlag(const Point& _rPos)
416 {
417     Size    aOutSize = GetOutputSizePixel();
418     //////////////////////////////////////////////////////////////////////
419     // Flags anpassen, wenn Mauszeiger in sizingArea
420     m_nSizingFlags = SIZING_NONE;
421 
422     if( _rPos.X() < TABWIN_SIZING_AREA )
423         m_nSizingFlags |= SIZING_LEFT;
424 
425     if( _rPos.Y() < TABWIN_SIZING_AREA )
426         m_nSizingFlags |= SIZING_TOP;
427 
428     if( _rPos.X() > aOutSize.Width()-TABWIN_SIZING_AREA )
429         m_nSizingFlags |= SIZING_RIGHT;
430 
431     if( _rPos.Y() > aOutSize.Height()-TABWIN_SIZING_AREA )
432         m_nSizingFlags |= SIZING_BOTTOM;
433 }
434 //------------------------------------------------------------------------------
MouseMove(const MouseEvent & rEvt)435 void OTableWindow::MouseMove( const MouseEvent& rEvt )
436 {
437     Window::MouseMove(rEvt);
438 
439     OJoinTableView* pCont = getTableView();
440     if (pCont->getDesignView()->getController().isReadOnly())
441         return;
442 
443     Point   aPos = rEvt.GetPosPixel();
444     setSizingFlag(aPos);
445     Pointer aPointer;
446 
447 
448     //////////////////////////////////////////////////////////////////////
449     // Mauszeiger anpassen, wenn Mauszeiger in sizingArea
450     switch( m_nSizingFlags )
451     {
452     case SIZING_TOP:
453     case SIZING_BOTTOM:
454         aPointer = Pointer( POINTER_SSIZE );
455         break;
456 
457     case SIZING_LEFT:
458     case SIZING_RIGHT:
459         aPointer = Pointer( POINTER_ESIZE );
460         break;
461 
462     case SIZING_LEFT+SIZING_TOP:
463     case SIZING_RIGHT+SIZING_BOTTOM:
464         aPointer = Pointer( POINTER_SESIZE );
465         break;
466 
467     case SIZING_RIGHT+SIZING_TOP:
468     case SIZING_LEFT+SIZING_BOTTOM:
469         aPointer = Pointer( POINTER_NESIZE );
470         break;
471     }
472 
473     SetPointer( aPointer );
474 }
475 
476 //------------------------------------------------------------------------------
MouseButtonDown(const MouseEvent & rEvt)477 void OTableWindow::MouseButtonDown( const MouseEvent& rEvt )
478 {
479     //////////////////////////////////////////////////////////////////////
480     // Wenn sizing, dann bekommt Parent die Nachricht,
481     // dass jetzt die Fenstergroesse seines Childs veraendert wird
482     if( m_nSizingFlags )
483         getTableView()->BeginChildSizing( this, GetPointer() );
484 
485     Window::MouseButtonDown( rEvt );
486 }
487 
488 
489 
490 //------------------------------------------------------------------------------
Resize()491 void OTableWindow::Resize()
492 {
493     //////////////////////////////////////////////////////////////////////
494     // Das Fenster darf nicht verschwinden, deshalb min. Groesse setzen
495     Size    aOutSize = GetOutputSizePixel();
496     aOutSize = Size(CalcZoom(aOutSize.Width()),CalcZoom(aOutSize.Height()));
497 
498     long nTitleHeight = CalcZoom( GetTextHeight() )+ CalcZoom( 4 );
499 
500     //////////////////////////////////////////////////////////////////////
501     // Titel und ListBox anpassen
502     long n5Pos = CalcZoom(5);
503     long nPositionX = n5Pos;
504     long nPositionY = n5Pos;
505 
506     // position the image which indicates the type
507     m_aTypeImage.SetPosPixel( Point( nPositionX, nPositionY ) );
508     Size aImageSize( m_aTypeImage.GetImage().GetSizePixel() );
509     m_aTypeImage.SetSizePixel( aImageSize );
510 
511     if ( nTitleHeight < aImageSize.Height() )
512         nTitleHeight = aImageSize.Height();
513 
514     nPositionX += aImageSize.Width() + CalcZoom( 2 );
515     m_aTitle.SetPosSizePixel( Point( nPositionX, nPositionY ), Size( aOutSize.Width() - nPositionX - n5Pos, nTitleHeight ) );
516 
517     long nTitleToList = CalcZoom( 3 );
518 
519     m_pListBox->SetPosSizePixel(
520         Point( n5Pos, nPositionY + nTitleHeight + nTitleToList ),
521         Size( aOutSize.Width() - 2 * n5Pos, aOutSize.Height() - ( nPositionY + nTitleHeight + nTitleToList ) - n5Pos )
522     );
523 
524     Window::Invalidate();
525 }
526 
527 //------------------------------------------------------------------------------
SetBoldTitle(sal_Bool bBold)528 void OTableWindow::SetBoldTitle( sal_Bool bBold )
529 {
530     Font aFont = m_aTitle.GetFont();
531     aFont.SetWeight( bBold?WEIGHT_BOLD:WEIGHT_NORMAL );
532     m_aTitle.SetFont( aFont );
533     m_aTitle.Invalidate();
534 }
535 
536 //------------------------------------------------------------------------------
GetFocus()537 void OTableWindow::GetFocus()
538 {
539     Window::GetFocus();
540     // we have to forward the focus to our listbox to enable keystokes
541     if(m_pListBox)
542         m_pListBox->GrabFocus();
543 }
544 // -----------------------------------------------------------------------------
setActive(sal_Bool _bActive)545 void OTableWindow::setActive(sal_Bool _bActive)
546 {
547     SetBoldTitle( _bActive );
548     m_bActive = _bActive;
549     if (!_bActive && m_pListBox && m_pListBox->GetSelectionCount() != 0)
550         m_pListBox->SelectAll(sal_False);
551 }
552 
553 //------------------------------------------------------------------------------
Remove()554 void OTableWindow::Remove()
555 {
556     //////////////////////////////////////////////////////////////////
557     // Fenster loeschen
558     OJoinTableView* pTabWinCont = getTableView();
559     pTabWinCont->RemoveTabWin( this );
560     pTabWinCont->Invalidate();
561 }
562 //------------------------------------------------------------------------------
HandleKeyInput(const KeyEvent & rEvt)563 sal_Bool OTableWindow::HandleKeyInput( const KeyEvent& rEvt )
564 {
565     const KeyCode& rCode = rEvt.GetKeyCode();
566     sal_uInt16 nCode = rCode.GetCode();
567     sal_Bool   bShift = rCode.IsShift();
568     sal_Bool   bCtrl = rCode.IsMod1();
569 
570     sal_Bool bHandle = sal_False;
571 
572     if( !bCtrl && !bShift && (nCode==KEY_DELETE) )
573     {
574         Remove();
575         bHandle = sal_True;
576     }
577     return bHandle;
578 }
579 
580 //------------------------------------------------------------------------------
ExistsAConn() const581 sal_Bool OTableWindow::ExistsAConn() const
582 {
583     return getTableView()->ExistsAConn(this);
584 }
585 //------------------------------------------------------------------------------
EnumValidFields(::std::vector<::rtl::OUString> & arrstrFields)586 void OTableWindow::EnumValidFields(::std::vector< ::rtl::OUString>& arrstrFields)
587 {
588     arrstrFields.clear();
589     // diese Default-Implementierung zaehlt einfach alles auf, was es in der ListBox gibt ... fuer anderes Verhalten ueberschreiben
590     if ( m_pListBox )
591     {
592         arrstrFields.reserve(m_pListBox->GetEntryCount());
593         SvLBoxEntry* pEntryLoop = m_pListBox->First();
594         while (pEntryLoop)
595         {
596             arrstrFields.push_back(m_pListBox->GetEntryText(pEntryLoop));
597             pEntryLoop = m_pListBox->Next(pEntryLoop);
598         }
599     }
600 }
601 // -----------------------------------------------------------------------------
StateChanged(StateChangedType nType)602 void OTableWindow::StateChanged( StateChangedType nType )
603 {
604     Window::StateChanged( nType );
605 
606     if ( nType == STATE_CHANGE_ZOOM )
607     {
608         const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
609 
610         Font aFont = rStyleSettings.GetGroupFont();
611         if ( IsControlFont() )
612             aFont.Merge( GetControlFont() );
613         SetZoomedPointFont( aFont );
614 
615         m_aTitle.SetZoom(GetZoom());
616         m_pListBox->SetZoom(GetZoom());
617         Resize();
618         Invalidate();
619     }
620 }
621 // -----------------------------------------------------------------------------
CreateAccessible()622 Reference< XAccessible > OTableWindow::CreateAccessible()
623 {
624     OTableWindowAccess* pAccessible = new OTableWindowAccess(this);
625     m_pAccessible = pAccessible;
626     return pAccessible;
627 }
628 // -----------------------------------------------------------------------------
Command(const CommandEvent & rEvt)629 void OTableWindow::Command(const CommandEvent& rEvt)
630 {
631     switch (rEvt.GetCommand())
632     {
633         case COMMAND_CONTEXTMENU:
634         {
635             OJoinController& rController = getDesignView()->getController();
636             if(!rController.isReadOnly() && rController.isConnected())
637             {
638                 Point ptWhere;
639                 if ( rEvt.IsMouseEvent() )
640                     ptWhere = rEvt.GetMousePosPixel();
641                 else
642                 {
643                     SvLBoxEntry* pCurrent = m_pListBox->GetCurEntry();
644                     if ( pCurrent )
645                         ptWhere = m_pListBox->GetEntryPosition(pCurrent);
646                     else
647                         ptWhere = m_aTitle.GetPosPixel();
648                 }
649 
650                 PopupMenu aContextMenu(ModuleRes(RID_MENU_JOINVIEW_TABLE));
651                 switch (aContextMenu.Execute(this, ptWhere))
652                 {
653                     case SID_DELETE:
654                         Remove();
655                         break;
656                 }
657             }
658             break;
659         }
660         default:
661             Window::Command(rEvt);
662     }
663 }
664 // -----------------------------------------------------------------------------
PreNotify(NotifyEvent & rNEvt)665 long OTableWindow::PreNotify(NotifyEvent& rNEvt)
666 {
667     sal_Bool bHandled = sal_False;
668     switch (rNEvt.GetType())
669     {
670         case EVENT_KEYINPUT:
671         {
672             if ( getDesignView()->getController().isReadOnly() )
673                 break;
674 
675             const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
676             const KeyCode& rCode = pKeyEvent->GetKeyCode();
677             if ( rCode.IsMod1() )
678             {
679                 Point aStartPoint = GetPosPixel();
680                 if ( rCode.IsShift() )
681                 {
682                     aStartPoint.X() = GetSizePixel().Width();
683                     aStartPoint.Y() = GetSizePixel().Height();
684                 }
685 
686                 switch( rCode.GetCode() )
687                 {
688                     case KEY_DOWN:
689                         bHandled = sal_True;
690                         aStartPoint.Y() += m_nMoveIncrement;
691                         break;
692                     case KEY_UP:
693                         bHandled = sal_True;
694                         aStartPoint.Y() += -m_nMoveIncrement;
695                         break;
696                     case KEY_LEFT:
697                         bHandled = sal_True;
698                         aStartPoint.X() += -m_nMoveIncrement;
699                         break;
700                     case KEY_RIGHT:
701                         bHandled = sal_True;
702                         aStartPoint.X()  += m_nMoveIncrement;
703                         break;
704                 }
705                 if ( bHandled )
706                 {
707                     if ( rCode.IsShift() )
708                     {
709                         OJoinTableView* pView = getTableView();
710                         Point ptOld = GetPosPixel();
711                         Size aSize = pView->getRealOutputSize();
712                         Size aNewSize(aStartPoint.X(),aStartPoint.Y());
713                         if (   ((ptOld.X() + aNewSize.Width())  <= aSize.Width())
714                             && ((ptOld.Y() + aNewSize.Height()) <= aSize.Height()) )
715                         {
716                             if ( aNewSize.Width() < TABWIN_WIDTH_MIN )
717                                 aNewSize.Width() = TABWIN_WIDTH_MIN;
718                             if ( aNewSize.Height() < TABWIN_HEIGHT_MIN )
719                                 aNewSize.Height() = TABWIN_HEIGHT_MIN;
720 
721                             Size szOld = GetSizePixel();
722 
723                             aNewSize = Size(pView->CalcZoom(aNewSize.Width()),pView->CalcZoom(aNewSize.Height()));
724                             SetPosSizePixel( ptOld, aNewSize );
725                             pView->TabWinSized(this, ptOld, szOld);
726                             Invalidate( INVALIDATE_NOCHILDREN );
727                         }
728                     }
729                     else
730                     {
731                         // remember how often the user moved our window
732                         ++m_nMoveCount;
733                         if( m_nMoveCount == 5 )
734                             m_nMoveIncrement = 10;
735                         else if( m_nMoveCount > 15 )
736                             m_nMoveCount = m_nMoveIncrement = 20;
737 
738                         Point aOldDataPoint = GetData()->GetPosition();
739                         Point aNewDataPoint = aStartPoint + getTableView()->GetScrollOffset();
740                         if ( aNewDataPoint.X() > -1 && aNewDataPoint.Y() > -1 )
741                         {
742                             OJoinTableView* pView = getTableView();
743                             if ( pView->isMovementAllowed(aNewDataPoint, GetData()->GetSize()) )
744                             {
745                                 SetPosPixel(aStartPoint);
746 
747                                 // aNewDataPoint can not be used here because SetPosPixel reset it
748                                 pView->EnsureVisible(GetData()->GetPosition(), GetData()->GetSize());
749                                 pView->TabWinMoved(this,aOldDataPoint);
750                                 Invalidate(INVALIDATE_NOCHILDREN);
751                                 getDesignView()->getController().setModified( sal_True );
752                             }
753                             else
754                             {
755                                 m_nMoveCount        = 0; // reset our movement count
756                                 m_nMoveIncrement    = 1;
757                             }
758                         }
759                         else
760                         {
761                             m_nMoveCount        = 0; // reset our movement count
762                             m_nMoveIncrement    = 1;
763                         }
764                     }
765                     resetSizingFlag();
766                 }
767                 else
768                 {
769                     m_nMoveCount        = 0; // reset our movement count
770                     m_nMoveIncrement    = 1;
771                 }
772             }
773             else
774             {
775                 m_nMoveCount        = 0; // reset our movement count
776                 m_nMoveIncrement    = 1;
777             }
778         }
779             break;
780         case EVENT_KEYUP:
781         {
782             const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
783             const KeyCode& rCode = pKeyEvent->GetKeyCode();
784             sal_uInt16 nKeyCode = rCode.GetCode();
785             if ( rCode.IsMod2() && nKeyCode != KEY_UP && nKeyCode != KEY_DOWN && nKeyCode != KEY_LEFT && nKeyCode != KEY_RIGHT )
786             {
787                 m_nMoveCount        = 0; // reset our movement count
788                 m_nMoveIncrement    = 1;
789             }
790         }
791             break;
792     }
793     if (!bHandled)
794         return Window::PreNotify(rNEvt);
795     return 1L;
796 }
797 // -----------------------------------------------------------------------------
getTitle() const798 String OTableWindow::getTitle() const
799 {
800     return m_aTitle.GetText();
801 }
802 // -----------------------------------------------------------------------------
_elementInserted(const container::ContainerEvent &)803 void OTableWindow::_elementInserted( const container::ContainerEvent& /*_rEvent*/ )  throw(::com::sun::star::uno::RuntimeException)
804 {
805     FillListBox();
806 }
807 // -----------------------------------------------------------------------------
_elementRemoved(const container::ContainerEvent &)808 void OTableWindow::_elementRemoved( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException)
809 {
810     FillListBox();
811 }
812 // -----------------------------------------------------------------------------
_elementReplaced(const container::ContainerEvent &)813 void OTableWindow::_elementReplaced( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException)
814 {
815     FillListBox();
816 }
817 // -----------------------------------------------------------------------------
818 
819