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