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