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