1*96de5490SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*96de5490SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*96de5490SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*96de5490SAndrew Rist * distributed with this work for additional information 6*96de5490SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*96de5490SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*96de5490SAndrew Rist * "License"); you may not use this file except in compliance 9*96de5490SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*96de5490SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*96de5490SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*96de5490SAndrew Rist * software distributed under the License is distributed on an 15*96de5490SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*96de5490SAndrew Rist * KIND, either express or implied. See the License for the 17*96de5490SAndrew Rist * specific language governing permissions and limitations 18*96de5490SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*96de5490SAndrew Rist *************************************************************/ 21*96de5490SAndrew Rist 22*96de5490SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_dbaccess.hxx" 26cdf0e10cSrcweir #ifndef DBAUI_QUERYTABLEVIEW_HXX 27cdf0e10cSrcweir #include "JoinTableView.hxx" 28cdf0e10cSrcweir #endif 29cdf0e10cSrcweir #ifndef _TOOLS_DEBUG_HXX 30cdf0e10cSrcweir #include <tools/debug.hxx> 31cdf0e10cSrcweir #endif 32cdf0e10cSrcweir #ifndef DBAUI_QUERYCONTROLLER_HXX 33cdf0e10cSrcweir #include "querycontroller.hxx" 34cdf0e10cSrcweir #endif 35cdf0e10cSrcweir #ifndef DBAUI_JOINDESIGNVIEW_HXX 36cdf0e10cSrcweir #include "JoinDesignView.hxx" 37cdf0e10cSrcweir #endif 38cdf0e10cSrcweir #ifndef _DBU_QRY_HRC_ 39cdf0e10cSrcweir #include "dbu_qry.hrc" 40cdf0e10cSrcweir #endif 41cdf0e10cSrcweir #ifndef DBAUI_TABLEWINDOW_HXX 42cdf0e10cSrcweir #include "TableWindow.hxx" 43cdf0e10cSrcweir #endif 44cdf0e10cSrcweir //#ifndef DBAUI_QUERY_TABLEWINDOWDATA_HXX 45cdf0e10cSrcweir //#include "QTableWindowData.hxx" 46cdf0e10cSrcweir //#endif 47cdf0e10cSrcweir #ifndef DBAUI_TABLEWINDOWLISTBOX_HXX 48cdf0e10cSrcweir #include "TableWindowListBox.hxx" 49cdf0e10cSrcweir #endif 50cdf0e10cSrcweir #ifndef DBAUI_TABLECONNECTION_HXX 51cdf0e10cSrcweir #include "TableConnection.hxx" 52cdf0e10cSrcweir #endif 53cdf0e10cSrcweir #ifndef DBAUI_TABLECONNECTIONDATA_HXX 54cdf0e10cSrcweir #include "TableConnectionData.hxx" 55cdf0e10cSrcweir #endif 56cdf0e10cSrcweir #ifndef DBAUI_CONNECTIONLINE_HXX 57cdf0e10cSrcweir #include "ConnectionLine.hxx" 58cdf0e10cSrcweir #endif 59cdf0e10cSrcweir #ifndef DBAUI_CONNECTIONLINEDATA_HXX 60cdf0e10cSrcweir #include "ConnectionLineData.hxx" 61cdf0e10cSrcweir #endif 62cdf0e10cSrcweir #ifndef DBACCESS_UI_BROWSER_ID_HXX 63cdf0e10cSrcweir #include "browserids.hxx" 64cdf0e10cSrcweir #endif 65cdf0e10cSrcweir #ifndef _URLBMK_HXX 66cdf0e10cSrcweir #include <svl/urlbmk.hxx> 67cdf0e10cSrcweir #endif 68cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_ 69cdf0e10cSrcweir #include <com/sun/star/sdbc/XDatabaseMetaData.hpp> 70cdf0e10cSrcweir #endif 71cdf0e10cSrcweir #ifndef DBAUI_OQUERYMOVETABWINUNDOACT_HXX 72cdf0e10cSrcweir #include "QueryMoveTabWinUndoAct.hxx" 73cdf0e10cSrcweir #endif 74cdf0e10cSrcweir #ifndef DBAUI_QUERYSIZETABWINUNDOACT_HXX 75cdf0e10cSrcweir #include "QuerySizeTabWinUndoAct.hxx" 76cdf0e10cSrcweir #endif 77cdf0e10cSrcweir #ifndef _SV_SVAPP_HXX 78cdf0e10cSrcweir #include <vcl/svapp.hxx> 79cdf0e10cSrcweir #endif 80cdf0e10cSrcweir #ifndef DBAUI_TABLEWINDOWDATA_HXX 81cdf0e10cSrcweir #include "TableWindowData.hxx" 82cdf0e10cSrcweir #endif 83cdf0e10cSrcweir #ifndef DBACCESS_JACCESS_HXX 84cdf0e10cSrcweir #include "JAccess.hxx" 85cdf0e10cSrcweir #endif 86cdf0e10cSrcweir #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLE_HPP_ 87cdf0e10cSrcweir #include <com/sun/star/accessibility/XAccessible.hpp> 88cdf0e10cSrcweir #endif 89cdf0e10cSrcweir #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_ 90cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp> 91cdf0e10cSrcweir #endif 92cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp> 93cdf0e10cSrcweir #ifndef DBAUI_TOOLS_HXX 94cdf0e10cSrcweir #include "UITools.hxx" 95cdf0e10cSrcweir #endif 96cdf0e10cSrcweir #include <cppuhelper/exc_hlp.hxx> 97cdf0e10cSrcweir #include <tools/diagnose_ex.h> 98cdf0e10cSrcweir #include <boost/bind.hpp> 99cdf0e10cSrcweir #include <algorithm> 100cdf0e10cSrcweir #include <functional> 101cdf0e10cSrcweir 102cdf0e10cSrcweir using namespace dbaui; 103cdf0e10cSrcweir using namespace ::com::sun::star::uno; 104cdf0e10cSrcweir using namespace ::com::sun::star::sdbc; 105cdf0e10cSrcweir using namespace ::com::sun::star::accessibility; 106cdf0e10cSrcweir using namespace ::com::sun::star::container; 107cdf0e10cSrcweir using namespace ::com::sun::star::lang; 108cdf0e10cSrcweir 109cdf0e10cSrcweir #define LINE_SIZE 50 110cdf0e10cSrcweir //////////////////////////////////////////////////////////////// 111cdf0e10cSrcweir // Konstanten fuer das Fensterlayout 112cdf0e10cSrcweir #define TABWIN_SPACING_X 17 113cdf0e10cSrcweir #define TABWIN_SPACING_Y 17 114cdf0e10cSrcweir 115cdf0e10cSrcweir #define TABWIN_WIDTH_STD 120 116cdf0e10cSrcweir #define TABWIN_HEIGHT_STD 120 117cdf0e10cSrcweir 118cdf0e10cSrcweir DBG_NAME(OScrollWindowHelper) 119cdf0e10cSrcweir OScrollWindowHelper::OScrollWindowHelper( Window* pParent) : Window( pParent) 120cdf0e10cSrcweir ,m_aHScrollBar( this, WB_HSCROLL|WB_REPEAT|WB_DRAG ) 121cdf0e10cSrcweir ,m_aVScrollBar( this, WB_VSCROLL|WB_REPEAT|WB_DRAG ) 122cdf0e10cSrcweir ,m_pCornerWindow(new ScrollBarBox(this, WB_3DLOOK)) 123cdf0e10cSrcweir ,m_pTableView(NULL) 124cdf0e10cSrcweir { 125cdf0e10cSrcweir DBG_CTOR(OScrollWindowHelper,NULL); 126cdf0e10cSrcweir 127cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 128cdf0e10cSrcweir // ScrollBars 129cdf0e10cSrcweir 130cdf0e10cSrcweir GetHScrollBar()->SetRange( Range(0, 1000) ); 131cdf0e10cSrcweir GetVScrollBar()->SetRange( Range(0, 1000) ); 132cdf0e10cSrcweir 133cdf0e10cSrcweir GetHScrollBar()->SetLineSize( LINE_SIZE ); 134cdf0e10cSrcweir GetVScrollBar()->SetLineSize( LINE_SIZE ); 135cdf0e10cSrcweir 136cdf0e10cSrcweir GetHScrollBar()->Show(); 137cdf0e10cSrcweir GetVScrollBar()->Show(); 138cdf0e10cSrcweir m_pCornerWindow->Show(); 139cdf0e10cSrcweir 140cdf0e10cSrcweir // normally we should be SCROLL_PANE 141cdf0e10cSrcweir SetAccessibleRole(AccessibleRole::SCROLL_PANE); 142cdf0e10cSrcweir } 143cdf0e10cSrcweir 144cdf0e10cSrcweir // ----------------------------------------------------------------------------- 145cdf0e10cSrcweir OScrollWindowHelper::~OScrollWindowHelper() 146cdf0e10cSrcweir { 147cdf0e10cSrcweir DBG_DTOR(OScrollWindowHelper,NULL); 148cdf0e10cSrcweir ::std::auto_ptr<Window> aTemp(m_pCornerWindow); 149cdf0e10cSrcweir m_pCornerWindow = NULL; 150cdf0e10cSrcweir m_pTableView = NULL; 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir // ----------------------------------------------------------------------------- 154cdf0e10cSrcweir void OScrollWindowHelper::setTableView(OJoinTableView* _pTableView) 155cdf0e10cSrcweir { 156cdf0e10cSrcweir m_pTableView = _pTableView; 157cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 158cdf0e10cSrcweir // ScrollBars 159cdf0e10cSrcweir GetHScrollBar()->SetScrollHdl( LINK(m_pTableView, OJoinTableView, ScrollHdl) ); 160cdf0e10cSrcweir GetVScrollBar()->SetScrollHdl( LINK(m_pTableView, OJoinTableView, ScrollHdl) ); 161cdf0e10cSrcweir } 162cdf0e10cSrcweir // ----------------------------------------------------------------------------- 163cdf0e10cSrcweir void OScrollWindowHelper::resetRange(const Point& _aSize) 164cdf0e10cSrcweir { 165cdf0e10cSrcweir Point aPos = PixelToLogic(_aSize); 166cdf0e10cSrcweir GetHScrollBar()->SetRange( Range(0, aPos.X() + TABWIN_SPACING_X) ); 167cdf0e10cSrcweir GetVScrollBar()->SetRange( Range(0, aPos.Y() + TABWIN_SPACING_Y) ); 168cdf0e10cSrcweir } 169cdf0e10cSrcweir //------------------------------------------------------------------------------ 170cdf0e10cSrcweir void OScrollWindowHelper::Resize() 171cdf0e10cSrcweir { 172cdf0e10cSrcweir Window::Resize(); 173cdf0e10cSrcweir 174cdf0e10cSrcweir Size aTotalOutputSize = GetOutputSizePixel(); 175cdf0e10cSrcweir long nHScrollHeight = GetHScrollBar()->GetSizePixel().Height(); 176cdf0e10cSrcweir long nVScrollWidth = GetVScrollBar()->GetSizePixel().Width(); 177cdf0e10cSrcweir 178cdf0e10cSrcweir GetHScrollBar()->SetPosSizePixel( 179cdf0e10cSrcweir Point( 0, aTotalOutputSize.Height()-nHScrollHeight ), 180cdf0e10cSrcweir Size( aTotalOutputSize.Width()-nVScrollWidth, nHScrollHeight ) 181cdf0e10cSrcweir ); 182cdf0e10cSrcweir 183cdf0e10cSrcweir GetVScrollBar()->SetPosSizePixel( 184cdf0e10cSrcweir Point( aTotalOutputSize.Width()-nVScrollWidth, 0 ), 185cdf0e10cSrcweir Size( nVScrollWidth, aTotalOutputSize.Height()-nHScrollHeight ) 186cdf0e10cSrcweir ); 187cdf0e10cSrcweir 188cdf0e10cSrcweir m_pCornerWindow->SetPosSizePixel( 189cdf0e10cSrcweir Point( aTotalOutputSize.Width() - nVScrollWidth, aTotalOutputSize.Height() - nHScrollHeight), 190cdf0e10cSrcweir Size( nVScrollWidth, nHScrollHeight ) 191cdf0e10cSrcweir ); 192cdf0e10cSrcweir 193cdf0e10cSrcweir GetHScrollBar()->SetPageSize( aTotalOutputSize.Width() ); 194cdf0e10cSrcweir GetHScrollBar()->SetVisibleSize( aTotalOutputSize.Width() ); 195cdf0e10cSrcweir 196cdf0e10cSrcweir GetVScrollBar()->SetPageSize( aTotalOutputSize.Height() ); 197cdf0e10cSrcweir GetVScrollBar()->SetVisibleSize( aTotalOutputSize.Height() ); 198cdf0e10cSrcweir 199cdf0e10cSrcweir // adjust the ranges of the scrollbars if neccessary 200cdf0e10cSrcweir long lRange = GetHScrollBar()->GetRange().Max() - GetHScrollBar()->GetRange().Min(); 201cdf0e10cSrcweir if (m_pTableView->GetScrollOffset().X() + aTotalOutputSize.Width() > lRange) 202cdf0e10cSrcweir GetHScrollBar()->SetRangeMax(m_pTableView->GetScrollOffset().X() + aTotalOutputSize.Width() + GetHScrollBar()->GetRange().Min()); 203cdf0e10cSrcweir 204cdf0e10cSrcweir lRange = GetVScrollBar()->GetRange().Max() - GetVScrollBar()->GetRange().Min(); 205cdf0e10cSrcweir if (m_pTableView->GetScrollOffset().Y() + aTotalOutputSize.Height() > lRange) 206cdf0e10cSrcweir GetVScrollBar()->SetRangeMax(m_pTableView->GetScrollOffset().Y() + aTotalOutputSize.Height() + GetVScrollBar()->GetRange().Min()); 207cdf0e10cSrcweir 208cdf0e10cSrcweir m_pTableView->SetPosSizePixel(Point( 0, 0 ),Size( aTotalOutputSize.Width()-nVScrollWidth, aTotalOutputSize.Height()-nHScrollHeight )); 209cdf0e10cSrcweir } 210cdf0e10cSrcweir // ----------------------------------------------------------------------------- 211cdf0e10cSrcweir // ----------------------------------------------------------------------------- 212cdf0e10cSrcweir //================================================================== 213cdf0e10cSrcweir // class OJoinTableView 214cdf0e10cSrcweir //================================================================== 215cdf0e10cSrcweir 216cdf0e10cSrcweir //const long WINDOW_WIDTH = 1000; 217cdf0e10cSrcweir //const long WINDOW_HEIGHT = 1000; 218cdf0e10cSrcweir DBG_NAME(OJoinTableView); 219cdf0e10cSrcweir //------------------------------------------------------------------------------ 220cdf0e10cSrcweir OJoinTableView::OJoinTableView( Window* pParent, OJoinDesignView* pView ) 221cdf0e10cSrcweir :Window( pParent,WB_BORDER ) 222cdf0e10cSrcweir ,DropTargetHelper(this) 223cdf0e10cSrcweir ,m_aDragOffset( Point(0,0) ) 224cdf0e10cSrcweir ,m_aScrollOffset( Point(0,0) ) 225cdf0e10cSrcweir ,m_pDragWin( NULL ) 226cdf0e10cSrcweir ,m_pSizingWin( NULL ) 227cdf0e10cSrcweir ,m_pSelectedConn( NULL ) 228cdf0e10cSrcweir ,m_bTrackingInitiallyMoved(sal_False) 229cdf0e10cSrcweir ,m_pLastFocusTabWin(NULL) 230cdf0e10cSrcweir ,m_pView( pView ) 231cdf0e10cSrcweir ,m_pAccessible(NULL) 232cdf0e10cSrcweir { 233cdf0e10cSrcweir DBG_CTOR(OJoinTableView,NULL); 234cdf0e10cSrcweir SetSizePixel( Size(1000, 1000) ); 235cdf0e10cSrcweir 236cdf0e10cSrcweir InitColors(); 237cdf0e10cSrcweir 238cdf0e10cSrcweir m_aDragScrollTimer.SetTimeoutHdl(LINK(this, OJoinTableView, OnDragScrollTimer)); 239cdf0e10cSrcweir } 240cdf0e10cSrcweir 241cdf0e10cSrcweir //------------------------------------------------------------------------------ 242cdf0e10cSrcweir OJoinTableView::~OJoinTableView() 243cdf0e10cSrcweir { 244cdf0e10cSrcweir DBG_DTOR(OJoinTableView,NULL); 245cdf0e10cSrcweir if( m_pAccessible ) 246cdf0e10cSrcweir { 247cdf0e10cSrcweir m_pAccessible->clearTableView(); 248cdf0e10cSrcweir m_pAccessible = NULL; 249cdf0e10cSrcweir } 250cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 251cdf0e10cSrcweir // Listen loeschen 252cdf0e10cSrcweir clearLayoutInformation(); 253cdf0e10cSrcweir } 254cdf0e10cSrcweir //------------------------------------------------------------------------------ 255cdf0e10cSrcweir IMPL_LINK( OJoinTableView, ScrollHdl, ScrollBar*, pScrollBar ) 256cdf0e10cSrcweir { 257cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 258cdf0e10cSrcweir // Alle Fenster verschieben 259cdf0e10cSrcweir ScrollPane( pScrollBar->GetDelta(), (pScrollBar == GetHScrollBar()), sal_False ); 260cdf0e10cSrcweir 261cdf0e10cSrcweir return 0; 262cdf0e10cSrcweir } 263cdf0e10cSrcweir //------------------------------------------------------------------------------ 264cdf0e10cSrcweir void OJoinTableView::Resize() 265cdf0e10cSrcweir { 266cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 267cdf0e10cSrcweir Window::Resize(); 268cdf0e10cSrcweir m_aOutputSize = GetSizePixel(); 269cdf0e10cSrcweir 270cdf0e10cSrcweir // tab win positions may not be up-to-date 271cdf0e10cSrcweir if (m_aTableMap.empty()) 272cdf0e10cSrcweir // no tab wins ... 273cdf0e10cSrcweir return; 274cdf0e10cSrcweir 275cdf0e10cSrcweir // we have at least one table so resize it 276cdf0e10cSrcweir m_aScrollOffset.X() = GetHScrollBar()->GetThumbPos(); 277cdf0e10cSrcweir m_aScrollOffset.Y() = GetVScrollBar()->GetThumbPos(); 278cdf0e10cSrcweir 279cdf0e10cSrcweir OTableWindow* pCheck = m_aTableMap.begin()->second; 280cdf0e10cSrcweir Point aRealPos = pCheck->GetPosPixel(); 281cdf0e10cSrcweir Point aAssumedPos = pCheck->GetData()->GetPosition() - GetScrollOffset(); 282cdf0e10cSrcweir 283cdf0e10cSrcweir if (aRealPos == aAssumedPos) 284cdf0e10cSrcweir // all ok 285cdf0e10cSrcweir return; 286cdf0e10cSrcweir 287cdf0e10cSrcweir OTableWindowMapIterator aIter = m_aTableMap.begin(); 288cdf0e10cSrcweir OTableWindowMapIterator aEnd = m_aTableMap.end(); 289cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 290cdf0e10cSrcweir { 291cdf0e10cSrcweir OTableWindow* pCurrent = aIter->second; 292cdf0e10cSrcweir Point aPos(pCurrent->GetData()->GetPosition() - GetScrollOffset()); 293cdf0e10cSrcweir pCurrent->SetPosPixel(aPos); 294cdf0e10cSrcweir } 295cdf0e10cSrcweir } 296cdf0e10cSrcweir //------------------------------------------------------------------------------ 297cdf0e10cSrcweir sal_uLong OJoinTableView::GetTabWinCount() 298cdf0e10cSrcweir { 299cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 300cdf0e10cSrcweir return m_aTableMap.size(); 301cdf0e10cSrcweir } 302cdf0e10cSrcweir 303cdf0e10cSrcweir //------------------------------------------------------------------------------ 304cdf0e10cSrcweir bool OJoinTableView::RemoveConnection( OTableConnection* _pConn,sal_Bool _bDelete ) 305cdf0e10cSrcweir { 306cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 307cdf0e10cSrcweir DeselectConn(_pConn); 308cdf0e10cSrcweir 309cdf0e10cSrcweir // to force a redraw 310cdf0e10cSrcweir _pConn->InvalidateConnection(); 311cdf0e10cSrcweir 312cdf0e10cSrcweir m_pView->getController().removeConnectionData( _pConn->GetData() ); 313cdf0e10cSrcweir 314cdf0e10cSrcweir m_vTableConnection.erase( 315cdf0e10cSrcweir ::std::find(m_vTableConnection.begin(),m_vTableConnection.end(),_pConn) ); 316cdf0e10cSrcweir 317cdf0e10cSrcweir modified(); 318cdf0e10cSrcweir if ( m_pAccessible ) 319cdf0e10cSrcweir m_pAccessible->notifyAccessibleEvent( AccessibleEventId::CHILD, 320cdf0e10cSrcweir makeAny(_pConn->GetAccessible()), 321cdf0e10cSrcweir Any()); 322cdf0e10cSrcweir if ( _bDelete ) 323cdf0e10cSrcweir { 324cdf0e10cSrcweir delete _pConn; 325cdf0e10cSrcweir } 326cdf0e10cSrcweir 327cdf0e10cSrcweir return true; 328cdf0e10cSrcweir } 329cdf0e10cSrcweir 330cdf0e10cSrcweir //------------------------------------------------------------------------ 331cdf0e10cSrcweir OTableWindow* OJoinTableView::GetTabWindow( const String& rName ) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 334cdf0e10cSrcweir OTableWindowMapIterator aIter = m_aTableMap.find(rName); 335cdf0e10cSrcweir 336cdf0e10cSrcweir return aIter == m_aTableMap.end() ? NULL : aIter->second; 337cdf0e10cSrcweir } 338cdf0e10cSrcweir // ----------------------------------------------------------------------------- 339cdf0e10cSrcweir TTableWindowData::value_type OJoinTableView::createTableWindowData(const ::rtl::OUString& _rComposedName 340cdf0e10cSrcweir ,const ::rtl::OUString& _sTableName 341cdf0e10cSrcweir ,const ::rtl::OUString& _rWinName) 342cdf0e10cSrcweir { 343cdf0e10cSrcweir TTableWindowData::value_type pData( CreateImpl(_rComposedName, _sTableName,_rWinName) ); 344cdf0e10cSrcweir OJoinDesignView* pParent = getDesignView(); 345cdf0e10cSrcweir try 346cdf0e10cSrcweir { 347cdf0e10cSrcweir if ( !pData->init(pParent->getController().getConnection(),allowQueries()) ) 348cdf0e10cSrcweir { 349cdf0e10cSrcweir if ( pData->isValid() ) 350cdf0e10cSrcweir onNoColumns_throw(); 351cdf0e10cSrcweir else 352cdf0e10cSrcweir pData.reset(); 353cdf0e10cSrcweir } 354cdf0e10cSrcweir } 355cdf0e10cSrcweir catch ( const SQLException& ) 356cdf0e10cSrcweir { 357cdf0e10cSrcweir ::dbaui::showError( ::dbtools::SQLExceptionInfo( ::cppu::getCaughtException() ), 358cdf0e10cSrcweir pParent, pParent->getController().getORB() ); 359cdf0e10cSrcweir } 360cdf0e10cSrcweir catch( const WrappedTargetException& e ) 361cdf0e10cSrcweir { 362cdf0e10cSrcweir SQLException aSql; 363cdf0e10cSrcweir if ( e.TargetException >>= aSql ) 364cdf0e10cSrcweir ::dbaui::showError( ::dbtools::SQLExceptionInfo( aSql ), pParent, pParent->getController().getORB() ); 365cdf0e10cSrcweir } 366cdf0e10cSrcweir catch( const Exception& ) 367cdf0e10cSrcweir { 368cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 369cdf0e10cSrcweir } 370cdf0e10cSrcweir return pData; 371cdf0e10cSrcweir } 372cdf0e10cSrcweir // ----------------------------------------------------------------------------- 373cdf0e10cSrcweir OTableWindowData* OJoinTableView::CreateImpl(const ::rtl::OUString& _rComposedName 374cdf0e10cSrcweir ,const ::rtl::OUString& _sTableName 375cdf0e10cSrcweir ,const ::rtl::OUString& _rWinName) 376cdf0e10cSrcweir { 377cdf0e10cSrcweir return new OTableWindowData( NULL,_rComposedName,_sTableName, _rWinName ); 378cdf0e10cSrcweir } 379cdf0e10cSrcweir //------------------------------------------------------------------------------ 380cdf0e10cSrcweir void OJoinTableView::AddTabWin(const ::rtl::OUString& _rComposedName, const ::rtl::OUString& rWinName, sal_Bool /*bNewTable*/) 381cdf0e10cSrcweir { 382cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 383cdf0e10cSrcweir OSL_ENSURE(_rComposedName.getLength(),"There must be a table name supplied!"); 384cdf0e10cSrcweir 385cdf0e10cSrcweir TTableWindowData::value_type pNewTabWinData(createTableWindowData( _rComposedName, rWinName,rWinName )); 386cdf0e10cSrcweir 387cdf0e10cSrcweir ////////////////////////////////////////////////////////////////// 388cdf0e10cSrcweir // Neues Fenster in Fensterliste eintragen 389cdf0e10cSrcweir OTableWindow* pNewTabWin = createWindow( pNewTabWinData ); 390cdf0e10cSrcweir if ( pNewTabWin->Init() ) 391cdf0e10cSrcweir { 392cdf0e10cSrcweir m_pView->getController().getTableWindowData()->push_back( pNewTabWinData); 393cdf0e10cSrcweir // when we already have a table with this name insert the full qualified one instead 394cdf0e10cSrcweir if(m_aTableMap.find(rWinName) != m_aTableMap.end()) 395cdf0e10cSrcweir m_aTableMap[_rComposedName] = pNewTabWin; 396cdf0e10cSrcweir else 397cdf0e10cSrcweir m_aTableMap[rWinName] = pNewTabWin; 398cdf0e10cSrcweir 399cdf0e10cSrcweir SetDefaultTabWinPosSize( pNewTabWin ); 400cdf0e10cSrcweir pNewTabWin->Show(); 401cdf0e10cSrcweir 402cdf0e10cSrcweir modified(); 403cdf0e10cSrcweir if ( m_pAccessible ) 404cdf0e10cSrcweir m_pAccessible->notifyAccessibleEvent( AccessibleEventId::CHILD, 405cdf0e10cSrcweir Any(), 406cdf0e10cSrcweir makeAny(pNewTabWin->GetAccessible())); 407cdf0e10cSrcweir } 408cdf0e10cSrcweir else 409cdf0e10cSrcweir { 410cdf0e10cSrcweir pNewTabWin->clearListBox(); 411cdf0e10cSrcweir delete pNewTabWin; 412cdf0e10cSrcweir } 413cdf0e10cSrcweir } 414cdf0e10cSrcweir 415cdf0e10cSrcweir //------------------------------------------------------------------------------ 416cdf0e10cSrcweir void OJoinTableView::RemoveTabWin( OTableWindow* pTabWin ) 417cdf0e10cSrcweir { 418cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 419cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 420cdf0e10cSrcweir // first delete all connections of this window to others 421cdf0e10cSrcweir bool bRemove = true; 422cdf0e10cSrcweir TTableWindowData::value_type pData = pTabWin->GetData(); 423cdf0e10cSrcweir sal_Int32 nCount = m_vTableConnection.size(); 424cdf0e10cSrcweir ::std::vector<OTableConnection*>::reverse_iterator aIter = m_vTableConnection.rbegin(); 425cdf0e10cSrcweir while(aIter != m_vTableConnection.rend() && bRemove) 426cdf0e10cSrcweir { 427cdf0e10cSrcweir OTableConnection* pTabConn = (*aIter); 428cdf0e10cSrcweir if( 429cdf0e10cSrcweir ( pData == pTabConn->GetData()->getReferencingTable()) || 430cdf0e10cSrcweir ( pData == pTabConn->GetData()->getReferencedTable()) 431cdf0e10cSrcweir ) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir bRemove = RemoveConnection( pTabConn ,sal_True); 434cdf0e10cSrcweir aIter = m_vTableConnection.rbegin(); 435cdf0e10cSrcweir } 436cdf0e10cSrcweir else 437cdf0e10cSrcweir ++aIter; 438cdf0e10cSrcweir } 439cdf0e10cSrcweir 440cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 441cdf0e10cSrcweir // then delete the window itself 442cdf0e10cSrcweir if ( bRemove ) 443cdf0e10cSrcweir { 444cdf0e10cSrcweir if ( m_pAccessible ) 445cdf0e10cSrcweir m_pAccessible->notifyAccessibleEvent( AccessibleEventId::CHILD, 446cdf0e10cSrcweir makeAny(pTabWin->GetAccessible()),Any() 447cdf0e10cSrcweir ); 448cdf0e10cSrcweir 449cdf0e10cSrcweir pTabWin->Hide(); 450cdf0e10cSrcweir OJoinController& rController = m_pView->getController(); 451cdf0e10cSrcweir TTableWindowData::iterator aFind = ::std::find(rController.getTableWindowData()->begin(),rController.getTableWindowData()->end(),pData); 452cdf0e10cSrcweir if(aFind != rController.getTableWindowData()->end()) 453cdf0e10cSrcweir { 454cdf0e10cSrcweir rController.getTableWindowData()->erase(aFind); 455cdf0e10cSrcweir rController.setModified(sal_True); 456cdf0e10cSrcweir } 457cdf0e10cSrcweir 458cdf0e10cSrcweir String aWinName = pTabWin->GetWinName(); 459cdf0e10cSrcweir if(m_aTableMap.find(aWinName) != m_aTableMap.end()) 460cdf0e10cSrcweir m_aTableMap.erase( aWinName ); 461cdf0e10cSrcweir else 462cdf0e10cSrcweir m_aTableMap.erase( pTabWin->GetComposedName() ); 463cdf0e10cSrcweir 464cdf0e10cSrcweir if (pTabWin == m_pLastFocusTabWin) 465cdf0e10cSrcweir m_pLastFocusTabWin = NULL; 466cdf0e10cSrcweir 467cdf0e10cSrcweir pTabWin->clearListBox(); 468cdf0e10cSrcweir delete pTabWin; 469cdf0e10cSrcweir 470cdf0e10cSrcweir } 471cdf0e10cSrcweir if ( (sal_Int32)m_vTableConnection.size() < (nCount-1) ) // if some connections could be removed 472cdf0e10cSrcweir modified(); 473cdf0e10cSrcweir } 474cdf0e10cSrcweir namespace 475cdf0e10cSrcweir { 476cdf0e10cSrcweir // ----------------------------------------------------------------------------- 477cdf0e10cSrcweir sal_Bool isScrollAllowed( OJoinTableView* _pView,long nDelta, sal_Bool bHoriz) 478cdf0e10cSrcweir { 479cdf0e10cSrcweir sal_Bool bRet = sal_True; 480cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 481cdf0e10cSrcweir // adjust ScrollBar-Positions 482cdf0e10cSrcweir ScrollBar* pBar = _pView->GetVScrollBar(); 483cdf0e10cSrcweir if( bHoriz ) 484cdf0e10cSrcweir pBar = _pView->GetHScrollBar(); 485cdf0e10cSrcweir 486cdf0e10cSrcweir long nOldThumbPos = pBar->GetThumbPos(); 487cdf0e10cSrcweir long nNewThumbPos = nOldThumbPos + nDelta; 488cdf0e10cSrcweir if( nNewThumbPos < 0 ) 489cdf0e10cSrcweir nNewThumbPos = 0;// bRet = sal_False; 490cdf0e10cSrcweir else if( nNewThumbPos > pBar->GetRangeMax() ) 491cdf0e10cSrcweir nNewThumbPos = pBar->GetRangeMax();// bRet = sal_False; 492cdf0e10cSrcweir 493cdf0e10cSrcweir if ( bHoriz ) 494cdf0e10cSrcweir { 495cdf0e10cSrcweir if( nNewThumbPos == _pView->GetScrollOffset().X() ) 496cdf0e10cSrcweir return sal_False; 497cdf0e10cSrcweir } 498cdf0e10cSrcweir else if ( nNewThumbPos == _pView->GetScrollOffset().Y() ) 499cdf0e10cSrcweir return sal_False; 500cdf0e10cSrcweir 501cdf0e10cSrcweir return bRet; 502cdf0e10cSrcweir } 503cdf0e10cSrcweir // ----------------------------------------------------------------------------- 504cdf0e10cSrcweir sal_Bool getMovementImpl(OJoinTableView* _pView,const Point& _rPoint,const Size& _rSize,long& _nScrollX,long& _nScrollY) 505cdf0e10cSrcweir { 506cdf0e10cSrcweir _nScrollY = _nScrollX = 0; 507cdf0e10cSrcweir // data about the tab win 508cdf0e10cSrcweir Point aUpperLeft = _rPoint; 509cdf0e10cSrcweir // normalize with respect to visibility 510cdf0e10cSrcweir aUpperLeft -= _pView->GetScrollOffset(); 511cdf0e10cSrcweir // aUpperLeft.Y() -= _pView->GetScrollOffset().Y(); 512cdf0e10cSrcweir Point aLowerRight(aUpperLeft.X() + _rSize.Width(), aUpperLeft.Y() + _rSize.Height()); 513cdf0e10cSrcweir 514cdf0e10cSrcweir // data about ourself 515cdf0e10cSrcweir Size aSize = _pView->getRealOutputSize(); //GetOutputSizePixel(); 516cdf0e10cSrcweir 517cdf0e10cSrcweir sal_Bool bVisbile = sal_True; 518cdf0e10cSrcweir sal_Bool bFitsHor = (aUpperLeft.X() >= 0) && (aLowerRight.X() <= aSize.Width()); 519cdf0e10cSrcweir sal_Bool bFitsVert= (aUpperLeft.Y() >= 0) && (aLowerRight.Y() <= aSize.Height()); 520cdf0e10cSrcweir if (!bFitsHor || !bFitsVert) 521cdf0e10cSrcweir { 522cdf0e10cSrcweir // #100386# OJ 523cdf0e10cSrcweir if (!bFitsHor) 524cdf0e10cSrcweir { 525cdf0e10cSrcweir // ensure the visibility of the right border 526cdf0e10cSrcweir if ( aLowerRight.X() > aSize.Width() ) 527cdf0e10cSrcweir _nScrollX = aLowerRight.X() - aSize.Width() + TABWIN_SPACING_X; 528cdf0e10cSrcweir 529cdf0e10cSrcweir // ensure the visibility of the left border (higher priority) 530cdf0e10cSrcweir // if ( (aUpperLeft.X() - _nScrollX) < 0 ) 531cdf0e10cSrcweir if ( aUpperLeft.X() < 0 ) 532cdf0e10cSrcweir _nScrollX = aUpperLeft.X() - TABWIN_SPACING_X; 533cdf0e10cSrcweir } 534cdf0e10cSrcweir 535cdf0e10cSrcweir if (!bFitsVert) 536cdf0e10cSrcweir { 537cdf0e10cSrcweir // lower border 538cdf0e10cSrcweir if ( aLowerRight.Y() > aSize.Height() ) 539cdf0e10cSrcweir _nScrollY = aLowerRight.Y() - aSize.Height() + TABWIN_SPACING_Y; 540cdf0e10cSrcweir // upper border 541cdf0e10cSrcweir // if ( (aUpperLeft.Y() - _nScrollY) < 0 ) 542cdf0e10cSrcweir if ( aUpperLeft.Y() < 0 ) 543cdf0e10cSrcweir _nScrollY = aUpperLeft.Y() - TABWIN_SPACING_Y; 544cdf0e10cSrcweir } 545cdf0e10cSrcweir 546cdf0e10cSrcweir if ( _nScrollX ) // aSize.Width() > _rSize.Width() && 547cdf0e10cSrcweir bVisbile = isScrollAllowed(_pView,_nScrollX, sal_True); 548cdf0e10cSrcweir 549cdf0e10cSrcweir if ( _nScrollY ) // aSize.Height() > _rSize.Height() && 550cdf0e10cSrcweir bVisbile = bVisbile && isScrollAllowed(_pView,_nScrollY, sal_False); 551cdf0e10cSrcweir 552cdf0e10cSrcweir if ( bVisbile ) 553cdf0e10cSrcweir { 554cdf0e10cSrcweir sal_Int32 nHRangeMax = _pView->GetHScrollBar()->GetRangeMax(); 555cdf0e10cSrcweir sal_Int32 nVRangeMax = _pView->GetVScrollBar()->GetRangeMax(); 556cdf0e10cSrcweir 557cdf0e10cSrcweir if ( aSize.Width() + _pView->GetHScrollBar()->GetThumbPos() + _nScrollX > nHRangeMax ) 558cdf0e10cSrcweir bVisbile = sal_False; 559cdf0e10cSrcweir if ( bVisbile && aSize.Height() + _pView->GetVScrollBar()->GetThumbPos() + _nScrollY > nVRangeMax ) 560cdf0e10cSrcweir bVisbile = sal_False; 561cdf0e10cSrcweir } 562cdf0e10cSrcweir } 563cdf0e10cSrcweir 564cdf0e10cSrcweir 565cdf0e10cSrcweir return bVisbile; 566cdf0e10cSrcweir } 567cdf0e10cSrcweir } // end of ano namespace 568cdf0e10cSrcweir // ----------------------------------------------------------------------------- 569cdf0e10cSrcweir sal_Bool OJoinTableView::isMovementAllowed(const Point& _rPoint,const Size& _rSize) 570cdf0e10cSrcweir { 571cdf0e10cSrcweir long nX,nY; 572cdf0e10cSrcweir return getMovementImpl(this,_rPoint,_rSize,nX,nY); 573cdf0e10cSrcweir } 574cdf0e10cSrcweir //------------------------------------------------------------------------------ 575cdf0e10cSrcweir void OJoinTableView::EnsureVisible(const OTableWindow* _pWin) 576cdf0e10cSrcweir { 577cdf0e10cSrcweir // data about the tab win 578cdf0e10cSrcweir TTableWindowData::value_type pData = _pWin->GetData(); 579cdf0e10cSrcweir // Point aUpperLeft = pData->GetPosition(); 580cdf0e10cSrcweir EnsureVisible( pData->GetPosition() , pData->GetSize()); 581cdf0e10cSrcweir Invalidate(INVALIDATE_NOCHILDREN); 582cdf0e10cSrcweir } 583cdf0e10cSrcweir //------------------------------------------------------------------------------ 584cdf0e10cSrcweir void OJoinTableView::EnsureVisible(const Point& _rPoint,const Size& _rSize) 585cdf0e10cSrcweir { 586cdf0e10cSrcweir long nScrollX,nScrollY; 587cdf0e10cSrcweir 588cdf0e10cSrcweir if ( getMovementImpl(this,_rPoint,_rSize,nScrollX,nScrollY) ) 589cdf0e10cSrcweir { 590cdf0e10cSrcweir sal_Bool bVisbile = sal_True; 591cdf0e10cSrcweir if (nScrollX) 592cdf0e10cSrcweir bVisbile = ScrollPane(nScrollX, sal_True, sal_True); 593cdf0e10cSrcweir 594cdf0e10cSrcweir if (nScrollY) 595cdf0e10cSrcweir bVisbile = bVisbile && ScrollPane(nScrollY, sal_False, sal_True); 596cdf0e10cSrcweir } 597cdf0e10cSrcweir } 598cdf0e10cSrcweir 599cdf0e10cSrcweir //------------------------------------------------------------------------------ 600cdf0e10cSrcweir void OJoinTableView::SetDefaultTabWinPosSize( OTableWindow* pTabWin ) 601cdf0e10cSrcweir { 602cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 603cdf0e10cSrcweir ////////////////////////////////////////////////////////////////// 604cdf0e10cSrcweir // Position bestimmen: 605cdf0e10cSrcweir // Das Fenster wird in Zeilen der Hoehe TABWIN_SPACING_Y+TABWIN_HEIGTH_STD aufgeteilt. 606cdf0e10cSrcweir // Dann wird fuer jede Zeile geprueft, ob noch Platz fuer ein weiteres Fenster ist. 607cdf0e10cSrcweir // Wenn kein Platz ist, wird die naechste Zeile ueberprueft. 608cdf0e10cSrcweir Size aOutSize = GetSizePixel(); 609cdf0e10cSrcweir Point aNewPos( 0,0 ); 610cdf0e10cSrcweir sal_uInt16 nRow = 0; 611cdf0e10cSrcweir sal_Bool bEnd = sal_False; 612cdf0e10cSrcweir while( !bEnd ) 613cdf0e10cSrcweir { 614cdf0e10cSrcweir ////////////////////////////////////////////////////////////////// 615cdf0e10cSrcweir // Neue Position auf Zeilenbeginn setzen 616cdf0e10cSrcweir aNewPos.X() = TABWIN_SPACING_X; 617cdf0e10cSrcweir aNewPos.Y() = (nRow+1) * TABWIN_SPACING_Y; 618cdf0e10cSrcweir 619cdf0e10cSrcweir ////////////////////////////////////////////////////////////////// 620cdf0e10cSrcweir // Rectangle fuer die jeweilige Zeile bestimmen 621cdf0e10cSrcweir Rectangle aRowRect( Point(0,0), aOutSize ); 622cdf0e10cSrcweir aRowRect.Top() = nRow * ( TABWIN_SPACING_Y + TABWIN_HEIGHT_STD ); 623cdf0e10cSrcweir aRowRect.Bottom() = (nRow+1) * ( TABWIN_SPACING_Y + TABWIN_HEIGHT_STD ); 624cdf0e10cSrcweir 625cdf0e10cSrcweir ////////////////////////////////////////////////////////////////// 626cdf0e10cSrcweir // Belegte Bereiche dieser Zeile pruefen 627cdf0e10cSrcweir OTableWindow* pOtherTabWin;// = GetTabWinMap()->First(); 628cdf0e10cSrcweir OTableWindowMapIterator aIter = m_aTableMap.begin(); 629cdf0e10cSrcweir OTableWindowMapIterator aEnd = m_aTableMap.end(); 630cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 631cdf0e10cSrcweir { 632cdf0e10cSrcweir pOtherTabWin = aIter->second; 633cdf0e10cSrcweir Rectangle aOtherTabWinRect( pOtherTabWin->GetPosPixel(), pOtherTabWin->GetSizePixel() ); 634cdf0e10cSrcweir 635cdf0e10cSrcweir if( 636cdf0e10cSrcweir ( (aOtherTabWinRect.Top()>aRowRect.Top()) && (aOtherTabWinRect.Top()<aRowRect.Bottom()) ) || 637cdf0e10cSrcweir ( (aOtherTabWinRect.Bottom()>aRowRect.Top()) && (aOtherTabWinRect.Bottom()<aRowRect.Bottom()) ) 638cdf0e10cSrcweir ) 639cdf0e10cSrcweir { 640cdf0e10cSrcweir ////////////////////////////////////////////////////////////////// 641cdf0e10cSrcweir // TabWin liegt in der Zeile 642cdf0e10cSrcweir if( aOtherTabWinRect.Right()>aNewPos.X() ) 643cdf0e10cSrcweir aNewPos.X() = aOtherTabWinRect.Right() + TABWIN_SPACING_X; 644cdf0e10cSrcweir } 645cdf0e10cSrcweir } 646cdf0e10cSrcweir 647cdf0e10cSrcweir ////////////////////////////////////////////////////////////////// 648cdf0e10cSrcweir // Ist in dieser Zeile noch Platz? 649cdf0e10cSrcweir if( (aNewPos.X()+TABWIN_WIDTH_STD)<aRowRect.Right() ) 650cdf0e10cSrcweir { 651cdf0e10cSrcweir aNewPos.Y() = aRowRect.Top() + TABWIN_SPACING_Y; 652cdf0e10cSrcweir bEnd = sal_True; 653cdf0e10cSrcweir } 654cdf0e10cSrcweir else 655cdf0e10cSrcweir { 656cdf0e10cSrcweir if( (aRowRect.Bottom()+aRowRect.GetHeight()) > aOutSize.Height() ) 657cdf0e10cSrcweir { 658cdf0e10cSrcweir // insert it in the first row 659cdf0e10cSrcweir sal_Int32 nCount = m_aTableMap.size() % (nRow+1); 660cdf0e10cSrcweir ++nCount; 661cdf0e10cSrcweir aNewPos.Y() = nCount * TABWIN_SPACING_Y + (nCount-1)*CalcZoom(TABWIN_HEIGHT_STD); 662cdf0e10cSrcweir bEnd = sal_True; 663cdf0e10cSrcweir } 664cdf0e10cSrcweir else 665cdf0e10cSrcweir nRow++; 666cdf0e10cSrcweir 667cdf0e10cSrcweir } 668cdf0e10cSrcweir } 669cdf0e10cSrcweir 670cdf0e10cSrcweir ////////////////////////////////////////////////////////////////// 671cdf0e10cSrcweir // Groesse bestimmen 672cdf0e10cSrcweir Size aNewSize( CalcZoom(TABWIN_WIDTH_STD), CalcZoom(TABWIN_HEIGHT_STD) ); 673cdf0e10cSrcweir 674cdf0e10cSrcweir // check if the new position in inside the scrollbars ranges 675cdf0e10cSrcweir Point aBottom(aNewPos); 676cdf0e10cSrcweir aBottom.X() += aNewSize.Width(); 677cdf0e10cSrcweir aBottom.Y() += aNewSize.Height(); 678cdf0e10cSrcweir 679cdf0e10cSrcweir if(!GetHScrollBar()->GetRange().IsInside(aBottom.X())) 680cdf0e10cSrcweir GetHScrollBar()->SetRange( Range(0, aBottom.X()) ); 681cdf0e10cSrcweir if(!GetVScrollBar()->GetRange().IsInside(aBottom.Y())) 682cdf0e10cSrcweir GetVScrollBar()->SetRange( Range(0, aBottom.Y()) ); 683cdf0e10cSrcweir 684cdf0e10cSrcweir pTabWin->SetPosSizePixel( aNewPos, aNewSize ); 685cdf0e10cSrcweir } 686cdf0e10cSrcweir 687cdf0e10cSrcweir //------------------------------------------------------------------------------ 688cdf0e10cSrcweir void OJoinTableView::DataChanged(const DataChangedEvent& rDCEvt) 689cdf0e10cSrcweir { 690cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 691cdf0e10cSrcweir if (rDCEvt.GetType() == DATACHANGED_SETTINGS) 692cdf0e10cSrcweir { 693cdf0e10cSrcweir // nehmen wir den worst-case an : die Farben haben sich geaendert, also 694cdf0e10cSrcweir // mich anpassen 695cdf0e10cSrcweir InitColors(); 696cdf0e10cSrcweir Invalidate(INVALIDATE_NOCHILDREN); 697cdf0e10cSrcweir // durch das Invalidate werden auch die Connections neu gezeichnet, so dass die auch 698cdf0e10cSrcweir // gleich in den neuen Farben dargestellt werden 699cdf0e10cSrcweir } 700cdf0e10cSrcweir } 701cdf0e10cSrcweir 702cdf0e10cSrcweir //------------------------------------------------------------------------------ 703cdf0e10cSrcweir void OJoinTableView::InitColors() 704cdf0e10cSrcweir { 705cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 706cdf0e10cSrcweir // die Farben fuer die Darstellung sollten die Systemfarben sein 707cdf0e10cSrcweir StyleSettings aSystemStyle = Application::GetSettings().GetStyleSettings(); 708cdf0e10cSrcweir SetBackground(Wallpaper(Color(aSystemStyle.GetDialogColor()))); 709cdf0e10cSrcweir } 710cdf0e10cSrcweir 711cdf0e10cSrcweir //------------------------------------------------------------------------------ 712cdf0e10cSrcweir void OJoinTableView::BeginChildMove( OTableWindow* pTabWin, const Point& rMousePos ) 713cdf0e10cSrcweir { 714cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 715cdf0e10cSrcweir 716cdf0e10cSrcweir if (m_pView->getController().isReadOnly()) 717cdf0e10cSrcweir return; 718cdf0e10cSrcweir 719cdf0e10cSrcweir m_pDragWin = pTabWin; 720cdf0e10cSrcweir SetPointer(Pointer(POINTER_MOVE)); 721cdf0e10cSrcweir Point aMousePos = ScreenToOutputPixel( rMousePos ); 722cdf0e10cSrcweir m_aDragOffset = aMousePos - pTabWin->GetPosPixel(); 723cdf0e10cSrcweir m_pDragWin->SetZOrder(NULL, WINDOW_ZORDER_FIRST); 724cdf0e10cSrcweir m_bTrackingInitiallyMoved = sal_False; 725cdf0e10cSrcweir StartTracking(); 726cdf0e10cSrcweir } 727cdf0e10cSrcweir 728cdf0e10cSrcweir void OJoinTableView::NotifyTitleClicked( OTableWindow* pTabWin, const Point rMousePos ) 729cdf0e10cSrcweir { 730cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 731cdf0e10cSrcweir DeselectConn(GetSelectedConn()); 732cdf0e10cSrcweir BeginChildMove(pTabWin, rMousePos); 733cdf0e10cSrcweir } 734cdf0e10cSrcweir 735cdf0e10cSrcweir //------------------------------------------------------------------------------ 736cdf0e10cSrcweir void OJoinTableView::BeginChildSizing( OTableWindow* pTabWin, const Pointer& rPointer ) 737cdf0e10cSrcweir { 738cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 739cdf0e10cSrcweir 740cdf0e10cSrcweir if (m_pView->getController().isReadOnly()) 741cdf0e10cSrcweir return; 742cdf0e10cSrcweir 743cdf0e10cSrcweir SetPointer( rPointer ); 744cdf0e10cSrcweir m_pSizingWin = pTabWin; 745cdf0e10cSrcweir StartTracking(); 746cdf0e10cSrcweir } 747cdf0e10cSrcweir 748cdf0e10cSrcweir //------------------------------------------------------------------------------ 749cdf0e10cSrcweir sal_Bool OJoinTableView::ScrollPane( long nDelta, sal_Bool bHoriz, sal_Bool bPaintScrollBars ) 750cdf0e10cSrcweir { 751cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 752cdf0e10cSrcweir sal_Bool bRet = sal_True; 753cdf0e10cSrcweir 754cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 755cdf0e10cSrcweir // ScrollBar-Positionen anpassen 756cdf0e10cSrcweir if( bPaintScrollBars ) 757cdf0e10cSrcweir { 758cdf0e10cSrcweir if( bHoriz ) 759cdf0e10cSrcweir { 760cdf0e10cSrcweir long nOldThumbPos = GetHScrollBar()->GetThumbPos(); 761cdf0e10cSrcweir long nNewThumbPos = nOldThumbPos + nDelta; 762cdf0e10cSrcweir if( nNewThumbPos < 0 ) 763cdf0e10cSrcweir { 764cdf0e10cSrcweir nNewThumbPos = 0; 765cdf0e10cSrcweir bRet = sal_False; 766cdf0e10cSrcweir } 767cdf0e10cSrcweir if( nNewThumbPos > GetHScrollBar()->GetRange().Max() ) 768cdf0e10cSrcweir { 769cdf0e10cSrcweir nNewThumbPos = GetHScrollBar()->GetRange().Max(); 770cdf0e10cSrcweir bRet = sal_False; 771cdf0e10cSrcweir } 772cdf0e10cSrcweir GetHScrollBar()->SetThumbPos( nNewThumbPos ); 773cdf0e10cSrcweir nDelta = GetHScrollBar()->GetThumbPos() - nOldThumbPos; 774cdf0e10cSrcweir } 775cdf0e10cSrcweir else 776cdf0e10cSrcweir { 777cdf0e10cSrcweir long nOldThumbPos = GetVScrollBar()->GetThumbPos(); 778cdf0e10cSrcweir long nNewThumbPos = nOldThumbPos+nDelta; 779cdf0e10cSrcweir if( nNewThumbPos < 0 ) 780cdf0e10cSrcweir { 781cdf0e10cSrcweir nNewThumbPos = 0; 782cdf0e10cSrcweir bRet = sal_False; 783cdf0e10cSrcweir } 784cdf0e10cSrcweir if( nNewThumbPos > GetVScrollBar()->GetRange().Max() ) 785cdf0e10cSrcweir { 786cdf0e10cSrcweir nNewThumbPos = GetVScrollBar()->GetRange().Max(); 787cdf0e10cSrcweir bRet = sal_False; 788cdf0e10cSrcweir } 789cdf0e10cSrcweir GetVScrollBar()->SetThumbPos( nNewThumbPos ); 790cdf0e10cSrcweir nDelta = GetVScrollBar()->GetThumbPos() - nOldThumbPos; 791cdf0e10cSrcweir } 792cdf0e10cSrcweir } 793cdf0e10cSrcweir 794cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 795cdf0e10cSrcweir // Wenn ScrollOffset bereits an den Grenzen liegt, kein Neuzeichnen 796cdf0e10cSrcweir if( (GetHScrollBar()->GetThumbPos()==m_aScrollOffset.X()) && 797cdf0e10cSrcweir (GetVScrollBar()->GetThumbPos()==m_aScrollOffset.Y()) ) 798cdf0e10cSrcweir return sal_False; 799cdf0e10cSrcweir 800cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 801cdf0e10cSrcweir // ScrollOffset neu setzen 802cdf0e10cSrcweir if (bHoriz) 803cdf0e10cSrcweir m_aScrollOffset.X() = GetHScrollBar()->GetThumbPos(); 804cdf0e10cSrcweir else 805cdf0e10cSrcweir m_aScrollOffset.Y() = GetVScrollBar()->GetThumbPos(); 806cdf0e10cSrcweir 807cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 808cdf0e10cSrcweir // Alle Fenster verschieben 809cdf0e10cSrcweir OTableWindow* pTabWin; 810cdf0e10cSrcweir Point aPos; 811cdf0e10cSrcweir 812cdf0e10cSrcweir OTableWindowMapIterator aIter = m_aTableMap.begin(); 813cdf0e10cSrcweir OTableWindowMapIterator aEnd = m_aTableMap.end(); 814cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 815cdf0e10cSrcweir { 816cdf0e10cSrcweir pTabWin = aIter->second; 817cdf0e10cSrcweir aPos = pTabWin->GetPosPixel(); 818cdf0e10cSrcweir 819cdf0e10cSrcweir if( bHoriz ) 820cdf0e10cSrcweir aPos.X() -= nDelta; 821cdf0e10cSrcweir else aPos.Y() -= nDelta; 822cdf0e10cSrcweir 823cdf0e10cSrcweir pTabWin->SetPosPixel( aPos ); 824cdf0e10cSrcweir } 825cdf0e10cSrcweir 826cdf0e10cSrcweir Invalidate(); // INVALIDATE_NOCHILDREN 827cdf0e10cSrcweir 828cdf0e10cSrcweir return bRet; 829cdf0e10cSrcweir } 830cdf0e10cSrcweir 831cdf0e10cSrcweir //------------------------------------------------------------------------------ 832cdf0e10cSrcweir void OJoinTableView::Tracking( const TrackingEvent& rTEvt ) 833cdf0e10cSrcweir { 834cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 835cdf0e10cSrcweir HideTracking(); 836cdf0e10cSrcweir 837cdf0e10cSrcweir if (rTEvt.IsTrackingEnded()) 838cdf0e10cSrcweir { 839cdf0e10cSrcweir if( m_pDragWin ) 840cdf0e10cSrcweir { 841cdf0e10cSrcweir if (m_aDragScrollTimer.IsActive()) 842cdf0e10cSrcweir m_aDragScrollTimer.Stop(); 843cdf0e10cSrcweir 844cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 845cdf0e10cSrcweir // Position des Childs nach Verschieben anpassen 846cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 847cdf0e10cSrcweir // Fenster duerfen nicht aus Anzeigebereich herausbewegt werden 848cdf0e10cSrcweir Point aDragWinPos = rTEvt.GetMouseEvent().GetPosPixel() - m_aDragOffset; 849cdf0e10cSrcweir Size aDragWinSize = m_pDragWin->GetSizePixel(); 850cdf0e10cSrcweir if( aDragWinPos.X() < 0 ) 851cdf0e10cSrcweir aDragWinPos.X() = 0; 852cdf0e10cSrcweir if( aDragWinPos.Y() < 0 ) 853cdf0e10cSrcweir aDragWinPos.Y() = 0; 854cdf0e10cSrcweir if( (aDragWinPos.X() + aDragWinSize.Width()) > m_aOutputSize.Width() ) 855cdf0e10cSrcweir aDragWinPos.X() = m_aOutputSize.Width() - aDragWinSize.Width() - 1; 856cdf0e10cSrcweir if( (aDragWinPos.Y() + aDragWinSize.Height()) > m_aOutputSize.Height() ) 857cdf0e10cSrcweir aDragWinPos.Y() = m_aOutputSize.Height() - aDragWinSize.Height() - 1; 858cdf0e10cSrcweir if( aDragWinPos.X() < 0 ) 859cdf0e10cSrcweir aDragWinPos.X() = 0; 860cdf0e10cSrcweir if( aDragWinPos.Y() < 0 ) 861cdf0e10cSrcweir aDragWinPos.Y() = 0; 862cdf0e10cSrcweir // TODO : nicht das Fenster neu positionieren, wenn es uebersteht, sondern einfach meinen Bereich erweitern 863cdf0e10cSrcweir 864cdf0e10cSrcweir 865cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 866cdf0e10cSrcweir // Fenster positionieren 867cdf0e10cSrcweir EndTracking(); 868cdf0e10cSrcweir m_pDragWin->SetZOrder(NULL, WINDOW_ZORDER_FIRST); 869cdf0e10cSrcweir // erst mal testen, ob ich mich ueberhaupt bewegt habe 870cdf0e10cSrcweir // (das verhindert das Setzen des modified-Flags, wenn sich eigentlich gar nichts getan hat) 871cdf0e10cSrcweir TTableWindowData::value_type pData = m_pDragWin->GetData(); 872cdf0e10cSrcweir if ( ! (pData && pData->HasPosition() && (pData->GetPosition() == aDragWinPos))) 873cdf0e10cSrcweir { 874cdf0e10cSrcweir // die alten logischen Koordinaten 875cdf0e10cSrcweir Point ptOldPos = m_pDragWin->GetPosPixel() + Point(GetHScrollBar()->GetThumbPos(), GetVScrollBar()->GetThumbPos()); 876cdf0e10cSrcweir // neu positionieren 877cdf0e10cSrcweir m_pDragWin->SetPosPixel(aDragWinPos); 878cdf0e10cSrcweir TabWinMoved(m_pDragWin, ptOldPos); 879cdf0e10cSrcweir 880cdf0e10cSrcweir m_pDragWin->GrabFocus(); 881cdf0e10cSrcweir } 882cdf0e10cSrcweir m_pDragWin = NULL; 883cdf0e10cSrcweir SetPointer(Pointer(POINTER_ARROW)); 884cdf0e10cSrcweir } 885cdf0e10cSrcweir // else we handle the resizing 886cdf0e10cSrcweir else if( m_pSizingWin ) 887cdf0e10cSrcweir { 888cdf0e10cSrcweir SetPointer( Pointer() ); 889cdf0e10cSrcweir EndTracking(); 890cdf0e10cSrcweir 891cdf0e10cSrcweir // die alten physikalischen Koordinaten 892cdf0e10cSrcweir 893cdf0e10cSrcweir Size szOld = m_pSizingWin->GetSizePixel(); 894cdf0e10cSrcweir Point ptOld = m_pSizingWin->GetPosPixel(); 895cdf0e10cSrcweir Size aNewSize(CalcZoom(m_aSizingRect.GetSize().Width()),CalcZoom(m_aSizingRect.GetSize().Height())); 896cdf0e10cSrcweir m_pSizingWin->SetPosSizePixel( m_aSizingRect.TopLeft(), aNewSize ); 897cdf0e10cSrcweir TabWinSized(m_pSizingWin, ptOld, szOld); 898cdf0e10cSrcweir 899cdf0e10cSrcweir m_pSizingWin->Invalidate( m_aSizingRect ); 900cdf0e10cSrcweir m_pSizingWin = NULL; 901cdf0e10cSrcweir } 902cdf0e10cSrcweir } 903cdf0e10cSrcweir else if (rTEvt.IsTrackingCanceled()) 904cdf0e10cSrcweir { 905cdf0e10cSrcweir if (m_aDragScrollTimer.IsActive()) 906cdf0e10cSrcweir m_aDragScrollTimer.Stop(); 907cdf0e10cSrcweir EndTracking(); 908cdf0e10cSrcweir } 909cdf0e10cSrcweir else 910cdf0e10cSrcweir { 911cdf0e10cSrcweir if( m_pDragWin ) 912cdf0e10cSrcweir { 913cdf0e10cSrcweir m_ptPrevDraggingPos = rTEvt.GetMouseEvent().GetPosPixel(); 914cdf0e10cSrcweir // an Fenstergrenzen scrollen 915cdf0e10cSrcweir ScrollWhileDragging(); 916cdf0e10cSrcweir } 917cdf0e10cSrcweir 918cdf0e10cSrcweir if( m_pSizingWin ) 919cdf0e10cSrcweir { 920cdf0e10cSrcweir Point aMousePos = rTEvt.GetMouseEvent().GetPosPixel(); 921cdf0e10cSrcweir m_aSizingRect = m_pSizingWin->getSizingRect(aMousePos,m_aOutputSize); 922cdf0e10cSrcweir Update(); 923cdf0e10cSrcweir ShowTracking( m_aSizingRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW ); 924cdf0e10cSrcweir } 925cdf0e10cSrcweir } 926cdf0e10cSrcweir } 927cdf0e10cSrcweir 928cdf0e10cSrcweir //------------------------------------------------------------------------------ 929cdf0e10cSrcweir void OJoinTableView::ConnDoubleClicked( OTableConnection* /*pConnection*/ ) 930cdf0e10cSrcweir { 931cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 932cdf0e10cSrcweir } 933cdf0e10cSrcweir 934cdf0e10cSrcweir //------------------------------------------------------------------------------ 935cdf0e10cSrcweir void OJoinTableView::MouseButtonDown( const MouseEvent& rEvt ) 936cdf0e10cSrcweir { 937cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 938cdf0e10cSrcweir GrabFocus(); 939cdf0e10cSrcweir Window::MouseButtonDown(rEvt); 940cdf0e10cSrcweir } 941cdf0e10cSrcweir 942cdf0e10cSrcweir //------------------------------------------------------------------------------ 943cdf0e10cSrcweir void OJoinTableView::MouseButtonUp( const MouseEvent& rEvt ) 944cdf0e10cSrcweir { 945cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 946cdf0e10cSrcweir Window::MouseButtonUp(rEvt); 947cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 948cdf0e10cSrcweir // Wurde eine Connection ausgewaehlt? 949cdf0e10cSrcweir if( !m_vTableConnection.empty() ) 950cdf0e10cSrcweir { 951cdf0e10cSrcweir DeselectConn(GetSelectedConn()); 952cdf0e10cSrcweir 953cdf0e10cSrcweir ::std::vector<OTableConnection*>::iterator aIter = m_vTableConnection.begin(); 954cdf0e10cSrcweir ::std::vector<OTableConnection*>::iterator aEnd = m_vTableConnection.end(); 955cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 956cdf0e10cSrcweir { 957cdf0e10cSrcweir if( (*aIter)->CheckHit(rEvt.GetPosPixel()) ) 958cdf0e10cSrcweir { 959cdf0e10cSrcweir SelectConn((*aIter)); 960cdf0e10cSrcweir 961cdf0e10cSrcweir // Doppelclick 962cdf0e10cSrcweir if( rEvt.GetClicks() == 2 ) 963cdf0e10cSrcweir ConnDoubleClicked( (*aIter) ); 964cdf0e10cSrcweir 965cdf0e10cSrcweir break; 966cdf0e10cSrcweir } 967cdf0e10cSrcweir } 968cdf0e10cSrcweir } 969cdf0e10cSrcweir } 970cdf0e10cSrcweir 971cdf0e10cSrcweir //------------------------------------------------------------------------------ 972cdf0e10cSrcweir void OJoinTableView::KeyInput( const KeyEvent& rEvt ) 973cdf0e10cSrcweir { 974cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 975cdf0e10cSrcweir sal_uInt16 nCode = rEvt.GetKeyCode().GetCode(); 976cdf0e10cSrcweir sal_Bool bShift = rEvt.GetKeyCode().IsShift(); 977cdf0e10cSrcweir sal_Bool bCtrl = rEvt.GetKeyCode().IsMod1(); 978cdf0e10cSrcweir 979cdf0e10cSrcweir if( !bCtrl && !bShift && (nCode==KEY_DELETE) ) 980cdf0e10cSrcweir { 981cdf0e10cSrcweir if (GetSelectedConn()) 982cdf0e10cSrcweir RemoveConnection( GetSelectedConn() ,sal_True); 983cdf0e10cSrcweir } 984cdf0e10cSrcweir else 985cdf0e10cSrcweir Window::KeyInput( rEvt ); 986cdf0e10cSrcweir } 987cdf0e10cSrcweir 988cdf0e10cSrcweir //------------------------------------------------------------------------------ 989cdf0e10cSrcweir void OJoinTableView::DeselectConn(OTableConnection* pConn) 990cdf0e10cSrcweir { 991cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 992cdf0e10cSrcweir if (!pConn || !pConn->IsSelected()) 993cdf0e10cSrcweir return; 994cdf0e10cSrcweir 995cdf0e10cSrcweir // die zugehoerigen Eitnraege in der ListBox des Tabellenfenster deselektieren 996cdf0e10cSrcweir OTableWindow* pWin = pConn->GetSourceWin(); 997cdf0e10cSrcweir if (pWin && pWin->GetListBox()) 998cdf0e10cSrcweir pWin->GetListBox()->SelectAll(sal_False); 999cdf0e10cSrcweir 1000cdf0e10cSrcweir pWin = pConn->GetDestWin(); 1001cdf0e10cSrcweir if (pWin && pWin->GetListBox()) 1002cdf0e10cSrcweir pWin->GetListBox()->SelectAll(sal_False); 1003cdf0e10cSrcweir 1004cdf0e10cSrcweir pConn->Deselect(); 1005cdf0e10cSrcweir m_pSelectedConn = NULL; 1006cdf0e10cSrcweir } 1007cdf0e10cSrcweir 1008cdf0e10cSrcweir //------------------------------------------------------------------------------ 1009cdf0e10cSrcweir void OJoinTableView::SelectConn(OTableConnection* pConn) 1010cdf0e10cSrcweir { 1011cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1012cdf0e10cSrcweir DeselectConn(GetSelectedConn()); 1013cdf0e10cSrcweir 1014cdf0e10cSrcweir pConn->Select(); 1015cdf0e10cSrcweir m_pSelectedConn = pConn; 1016cdf0e10cSrcweir GrabFocus(); // has to be called here because a table window may still be focused 1017cdf0e10cSrcweir 1018cdf0e10cSrcweir // die betroffenene Eintraege in den Windows selektieren 1019cdf0e10cSrcweir OTableWindow* pConnSource = pConn->GetSourceWin(); 1020cdf0e10cSrcweir OTableWindow* pConnDest = pConn->GetDestWin(); 1021cdf0e10cSrcweir if (pConnSource && pConnDest) 1022cdf0e10cSrcweir { 1023cdf0e10cSrcweir OTableWindowListBox* pSourceBox = pConnSource->GetListBox(); 1024cdf0e10cSrcweir OTableWindowListBox* pDestBox = pConnDest->GetListBox(); 1025cdf0e10cSrcweir if (pSourceBox && pDestBox) 1026cdf0e10cSrcweir { 1027cdf0e10cSrcweir pSourceBox->SelectAll(sal_False); 1028cdf0e10cSrcweir pDestBox->SelectAll(sal_False); 1029cdf0e10cSrcweir 1030cdf0e10cSrcweir SvLBoxEntry* pFirstSourceVisible = pSourceBox->GetFirstEntryInView(); 1031cdf0e10cSrcweir SvLBoxEntry* pFirstDestVisible = pDestBox->GetFirstEntryInView(); 1032cdf0e10cSrcweir 1033cdf0e10cSrcweir const ::std::vector<OConnectionLine*>* pLines = pConn->GetConnLineList(); 1034cdf0e10cSrcweir ::std::vector<OConnectionLine*>::const_reverse_iterator aIter = pLines->rbegin(); 1035cdf0e10cSrcweir for(;aIter != pLines->rend();++aIter) 1036cdf0e10cSrcweir { 1037cdf0e10cSrcweir if ((*aIter)->IsValid()) 1038cdf0e10cSrcweir { 1039cdf0e10cSrcweir SvLBoxEntry* pSourceEntry = pSourceBox->GetEntryFromText((*aIter)->GetData()->GetSourceFieldName()); 1040cdf0e10cSrcweir if (pSourceEntry) 1041cdf0e10cSrcweir { 1042cdf0e10cSrcweir pSourceBox->Select(pSourceEntry, sal_True); 1043cdf0e10cSrcweir pSourceBox->MakeVisible(pSourceEntry); 1044cdf0e10cSrcweir } 1045cdf0e10cSrcweir 1046cdf0e10cSrcweir SvLBoxEntry* pDestEntry = pDestBox->GetEntryFromText((*aIter)->GetData()->GetDestFieldName()); 1047cdf0e10cSrcweir if (pDestEntry) 1048cdf0e10cSrcweir { 1049cdf0e10cSrcweir pDestBox->Select(pDestEntry, sal_True); 1050cdf0e10cSrcweir pDestBox->MakeVisible(pDestEntry); 1051cdf0e10cSrcweir } 1052cdf0e10cSrcweir 1053cdf0e10cSrcweir } 1054cdf0e10cSrcweir } 1055cdf0e10cSrcweir 1056cdf0e10cSrcweir if ((pFirstSourceVisible != pSourceBox->GetFirstEntryInView()) 1057cdf0e10cSrcweir || (pFirstDestVisible != pDestBox->GetFirstEntryInView())) 1058cdf0e10cSrcweir // es wurde gescrollt -> neu zeichnen 1059cdf0e10cSrcweir Invalidate(INVALIDATE_NOCHILDREN); 1060cdf0e10cSrcweir } 1061cdf0e10cSrcweir } 1062cdf0e10cSrcweir } 1063cdf0e10cSrcweir //------------------------------------------------------------------------------ 1064cdf0e10cSrcweir void OJoinTableView::Paint( const Rectangle& rRect ) 1065cdf0e10cSrcweir { 1066cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1067cdf0e10cSrcweir DrawConnections( rRect ); 1068cdf0e10cSrcweir } 1069cdf0e10cSrcweir 1070cdf0e10cSrcweir //------------------------------------------------------------------------------ 1071cdf0e10cSrcweir void OJoinTableView::InvalidateConnections() 1072cdf0e10cSrcweir { 1073cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1074cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 1075cdf0e10cSrcweir // Die Joins zeichnen 1076cdf0e10cSrcweir ::std::for_each(m_vTableConnection.begin(),m_vTableConnection.end(), 1077cdf0e10cSrcweir ::std::mem_fun(& OTableConnection::InvalidateConnection)); 1078cdf0e10cSrcweir } 1079cdf0e10cSrcweir 1080cdf0e10cSrcweir //------------------------------------------------------------------------------ 1081cdf0e10cSrcweir void OJoinTableView::DrawConnections( const Rectangle& rRect ) 1082cdf0e10cSrcweir { 1083cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1084cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 1085cdf0e10cSrcweir // Die Joins zeichnen 1086cdf0e10cSrcweir ::std::for_each(m_vTableConnection.begin(),m_vTableConnection.end(),boost::bind( &OTableConnection::Draw, _1, boost::cref( rRect ))); 1087cdf0e10cSrcweir // zum Schluss noch mal die selektierte ueber alle anderen drueber 1088cdf0e10cSrcweir if (GetSelectedConn()) 1089cdf0e10cSrcweir GetSelectedConn()->Draw( rRect ); 1090cdf0e10cSrcweir } 1091cdf0e10cSrcweir 1092cdf0e10cSrcweir 1093cdf0e10cSrcweir //------------------------------------------------------------------------------ 1094cdf0e10cSrcweir ::std::vector<OTableConnection*>::const_iterator OJoinTableView::getTableConnections(const OTableWindow* _pFromWin) const 1095cdf0e10cSrcweir { 1096cdf0e10cSrcweir return ::std::find_if( m_vTableConnection.begin(), 1097cdf0e10cSrcweir m_vTableConnection.end(), 1098cdf0e10cSrcweir ::std::bind2nd(::std::mem_fun(&OTableConnection::isTableConnection),_pFromWin)); 1099cdf0e10cSrcweir } 1100cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1101cdf0e10cSrcweir sal_Int32 OJoinTableView::getConnectionCount(const OTableWindow* _pFromWin) const 1102cdf0e10cSrcweir { 1103cdf0e10cSrcweir return ::std::count_if( m_vTableConnection.begin(), 1104cdf0e10cSrcweir m_vTableConnection.end(), 1105cdf0e10cSrcweir ::std::bind2nd(::std::mem_fun(&OTableConnection::isTableConnection),_pFromWin)); 1106cdf0e10cSrcweir } 1107cdf0e10cSrcweir //------------------------------------------------------------------------------ 1108cdf0e10cSrcweir sal_Bool OJoinTableView::ExistsAConn(const OTableWindow* pFrom) const 1109cdf0e10cSrcweir { 1110cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1111cdf0e10cSrcweir return getTableConnections(pFrom) != m_vTableConnection.end(); 1112cdf0e10cSrcweir } 1113cdf0e10cSrcweir //------------------------------------------------------------------------ 1114cdf0e10cSrcweir void OJoinTableView::ClearAll() 1115cdf0e10cSrcweir { 1116cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1117cdf0e10cSrcweir SetUpdateMode(sal_False); 1118cdf0e10cSrcweir 1119cdf0e10cSrcweir HideTabWins(); 1120cdf0e10cSrcweir 1121cdf0e10cSrcweir // und das selbe mit den Connections 1122cdf0e10cSrcweir ::std::vector<OTableConnection*>::iterator aIter = m_vTableConnection.begin(); 1123cdf0e10cSrcweir ::std::vector<OTableConnection*>::iterator aEnd = m_vTableConnection.end(); 1124cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1125cdf0e10cSrcweir RemoveConnection( *aIter ,sal_True); 1126cdf0e10cSrcweir m_vTableConnection.clear(); 1127cdf0e10cSrcweir 1128cdf0e10cSrcweir m_pLastFocusTabWin = NULL; 1129cdf0e10cSrcweir m_pSelectedConn = NULL; 1130cdf0e10cSrcweir 1131cdf0e10cSrcweir // scroll to the upper left 1132cdf0e10cSrcweir ScrollPane(-GetScrollOffset().X(), sal_True, sal_True); 1133cdf0e10cSrcweir ScrollPane(-GetScrollOffset().Y(), sal_False, sal_True); 1134cdf0e10cSrcweir Invalidate(); 1135cdf0e10cSrcweir } 1136cdf0e10cSrcweir 1137cdf0e10cSrcweir //------------------------------------------------------------------------ 1138cdf0e10cSrcweir sal_Bool OJoinTableView::ScrollWhileDragging() 1139cdf0e10cSrcweir { 1140cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1141cdf0e10cSrcweir DBG_ASSERT(m_pDragWin != NULL, "OJoinTableView::ScrollWhileDragging darf nur waehrend Dragging eines Fensters aufgerufen werden !"); 1142cdf0e10cSrcweir 1143cdf0e10cSrcweir // den Timer schon mal killen 1144cdf0e10cSrcweir if (m_aDragScrollTimer.IsActive()) 1145cdf0e10cSrcweir m_aDragScrollTimer.Stop(); 1146cdf0e10cSrcweir 1147cdf0e10cSrcweir Point aDragWinPos = m_ptPrevDraggingPos - m_aDragOffset; 1148cdf0e10cSrcweir Size aDragWinSize = m_pDragWin->GetSizePixel(); 1149cdf0e10cSrcweir Point aLowerRight(aDragWinPos.X() + aDragWinSize.Width(), aDragWinPos.Y() + aDragWinSize.Height()); 1150cdf0e10cSrcweir 1151cdf0e10cSrcweir if (!m_bTrackingInitiallyMoved && (aDragWinPos == m_pDragWin->GetPosPixel())) 1152cdf0e10cSrcweir return sal_True; 1153cdf0e10cSrcweir 1154cdf0e10cSrcweir // Darstellungsfehler vermeiden (wenn bei aktivem TrackingRect gescrollt wird) 1155cdf0e10cSrcweir HideTracking(); 1156cdf0e10cSrcweir 1157cdf0e10cSrcweir sal_Bool bScrolling = sal_False; 1158cdf0e10cSrcweir sal_Bool bNeedScrollTimer = sal_False; 1159cdf0e10cSrcweir 1160cdf0e10cSrcweir // An Fenstergrenzen scrollen 1161cdf0e10cSrcweir // TODO : nur dann abfangen, wenn das Fenster komplett verschwinden wuerde (nicht, solange noch ein Pixel sichtbar ist) 1162cdf0e10cSrcweir if( aDragWinPos.X() < 5 ) 1163cdf0e10cSrcweir { 1164cdf0e10cSrcweir bScrolling = ScrollPane( -LINE_SIZE, sal_True, sal_True ); 1165cdf0e10cSrcweir if( !bScrolling && (aDragWinPos.X()<0) ) 1166cdf0e10cSrcweir aDragWinPos.X() = 0; 1167cdf0e10cSrcweir 1168cdf0e10cSrcweir // brauche ich weiteres (timergesteuertes) Scrolling ? 1169cdf0e10cSrcweir bNeedScrollTimer = bScrolling && (aDragWinPos.X() < 5); 1170cdf0e10cSrcweir } 1171cdf0e10cSrcweir 1172cdf0e10cSrcweir if( aLowerRight.X() > m_aOutputSize.Width() - 5 ) 1173cdf0e10cSrcweir { 1174cdf0e10cSrcweir bScrolling = ScrollPane( LINE_SIZE, sal_True, sal_True ) ; 1175cdf0e10cSrcweir if( !bScrolling && ( aLowerRight.X() > m_aOutputSize.Width() ) ) 1176cdf0e10cSrcweir aDragWinPos.X() = m_aOutputSize.Width() - aDragWinSize.Width(); 1177cdf0e10cSrcweir 1178cdf0e10cSrcweir // brauche ich weiteres (timergesteuertes) Scrolling ? 1179cdf0e10cSrcweir bNeedScrollTimer = bScrolling && (aLowerRight.X() > m_aOutputSize.Width() - 5); 1180cdf0e10cSrcweir } 1181cdf0e10cSrcweir 1182cdf0e10cSrcweir if( aDragWinPos.Y() < 5 ) 1183cdf0e10cSrcweir { 1184cdf0e10cSrcweir bScrolling = ScrollPane( -LINE_SIZE, sal_False, sal_True ); 1185cdf0e10cSrcweir if( !bScrolling && (aDragWinPos.Y()<0) ) 1186cdf0e10cSrcweir aDragWinPos.Y() = 0; 1187cdf0e10cSrcweir 1188cdf0e10cSrcweir bNeedScrollTimer = bScrolling && (aDragWinPos.Y() < 5); 1189cdf0e10cSrcweir } 1190cdf0e10cSrcweir 1191cdf0e10cSrcweir if( aLowerRight.Y() > m_aOutputSize.Height() - 5 ) 1192cdf0e10cSrcweir { 1193cdf0e10cSrcweir bScrolling = ScrollPane( LINE_SIZE, sal_False, sal_True ); 1194cdf0e10cSrcweir if( !bScrolling && ( (aDragWinPos.Y() + aDragWinSize.Height()) > m_aOutputSize.Height() ) ) 1195cdf0e10cSrcweir aDragWinPos.Y() = m_aOutputSize.Height() - aDragWinSize.Height(); 1196cdf0e10cSrcweir 1197cdf0e10cSrcweir bNeedScrollTimer = bScrolling && (aLowerRight.Y() > m_aOutputSize.Height() - 5); 1198cdf0e10cSrcweir } 1199cdf0e10cSrcweir 1200cdf0e10cSrcweir // Timer neu setzen, wenn noch notwendig 1201cdf0e10cSrcweir if (bNeedScrollTimer) 1202cdf0e10cSrcweir { 1203cdf0e10cSrcweir m_aDragScrollTimer.SetTimeout(100); 1204cdf0e10cSrcweir m_aDragScrollTimer.Start(); 1205cdf0e10cSrcweir } 1206cdf0e10cSrcweir 1207cdf0e10cSrcweir // das DraggingRect neu zeichnen 1208cdf0e10cSrcweir m_aDragRect = Rectangle(m_ptPrevDraggingPos - m_aDragOffset, m_pDragWin->GetSizePixel()); 1209cdf0e10cSrcweir Update(); 1210cdf0e10cSrcweir ShowTracking( m_aDragRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW ); 1211cdf0e10cSrcweir 1212cdf0e10cSrcweir return bScrolling; 1213cdf0e10cSrcweir } 1214cdf0e10cSrcweir 1215cdf0e10cSrcweir //------------------------------------------------------------------------ 1216cdf0e10cSrcweir IMPL_LINK(OJoinTableView, OnDragScrollTimer, void*, EMPTYARG) 1217cdf0e10cSrcweir { 1218cdf0e10cSrcweir ScrollWhileDragging(); 1219cdf0e10cSrcweir return 0L; 1220cdf0e10cSrcweir } 1221cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1222cdf0e10cSrcweir void OJoinTableView::invalidateAndModify(SfxUndoAction *_pAction) 1223cdf0e10cSrcweir { 1224cdf0e10cSrcweir Invalidate(INVALIDATE_NOCHILDREN); 1225cdf0e10cSrcweir m_pView->getController().addUndoActionAndInvalidate(_pAction); 1226cdf0e10cSrcweir } 1227cdf0e10cSrcweir //------------------------------------------------------------------------ 1228cdf0e10cSrcweir void OJoinTableView::TabWinMoved(OTableWindow* ptWhich, const Point& ptOldPosition) 1229cdf0e10cSrcweir { 1230cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1231cdf0e10cSrcweir Point ptThumbPos(GetHScrollBar()->GetThumbPos(), GetVScrollBar()->GetThumbPos()); 1232cdf0e10cSrcweir ptWhich->GetData()->SetPosition(ptWhich->GetPosPixel() + ptThumbPos); 1233cdf0e10cSrcweir 1234cdf0e10cSrcweir invalidateAndModify(new OJoinMoveTabWinUndoAct(this, ptOldPosition, ptWhich)); 1235cdf0e10cSrcweir } 1236cdf0e10cSrcweir 1237cdf0e10cSrcweir //------------------------------------------------------------------------ 1238cdf0e10cSrcweir void OJoinTableView::TabWinSized(OTableWindow* ptWhich, const Point& ptOldPosition, const Size& szOldSize) 1239cdf0e10cSrcweir { 1240cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1241cdf0e10cSrcweir ptWhich->GetData()->SetSize(ptWhich->GetSizePixel()); 1242cdf0e10cSrcweir ptWhich->GetData()->SetPosition(ptWhich->GetPosPixel()); 1243cdf0e10cSrcweir 1244cdf0e10cSrcweir invalidateAndModify(new OJoinSizeTabWinUndoAct(this, ptOldPosition, szOldSize, ptWhich)); 1245cdf0e10cSrcweir } 1246cdf0e10cSrcweir 1247cdf0e10cSrcweir //------------------------------------------------------------------------------ 1248cdf0e10cSrcweir sal_Bool OJoinTableView::IsAddAllowed() 1249cdf0e10cSrcweir { 1250cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1251cdf0e10cSrcweir 1252cdf0e10cSrcweir // nicht wenn Db readonly 1253cdf0e10cSrcweir if (m_pView->getController().isReadOnly()) 1254cdf0e10cSrcweir return sal_False; 1255cdf0e10cSrcweir 1256cdf0e10cSrcweir try 1257cdf0e10cSrcweir { 1258cdf0e10cSrcweir Reference< XConnection> xConnection = m_pView->getController().getConnection(); 1259cdf0e10cSrcweir if(!xConnection.is()) 1260cdf0e10cSrcweir return sal_False; 1261cdf0e10cSrcweir // nicht wenn schon zuviele Tabellen 1262cdf0e10cSrcweir Reference < XDatabaseMetaData > xMetaData( xConnection->getMetaData() ); 1263cdf0e10cSrcweir 1264cdf0e10cSrcweir sal_Int32 nMax = xMetaData.is() ? xMetaData->getMaxTablesInSelect() : 0; 1265cdf0e10cSrcweir if (nMax && nMax <= (sal_Int32)m_aTableMap.size()) 1266cdf0e10cSrcweir return sal_False; 1267cdf0e10cSrcweir } 1268cdf0e10cSrcweir catch(SQLException&) 1269cdf0e10cSrcweir { 1270cdf0e10cSrcweir return sal_False; 1271cdf0e10cSrcweir } 1272cdf0e10cSrcweir 1273cdf0e10cSrcweir // nicht wenn keine Joins moeglich 1274cdf0e10cSrcweir // if (!GetDatabase()->IsCapable(SDB_CAP_JOIN) && nMax <= GetTabWinCount()) 1275cdf0e10cSrcweir // return sal_False; 1276cdf0e10cSrcweir 1277cdf0e10cSrcweir return sal_True; 1278cdf0e10cSrcweir } 1279cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1280cdf0e10cSrcweir void OJoinTableView::executePopup(const Point& _aPos,OTableConnection* _pSelConnection) 1281cdf0e10cSrcweir { 1282cdf0e10cSrcweir PopupMenu aContextMenu( ModuleRes( RID_MENU_JOINVIEW_CONNECTION ) ); 1283cdf0e10cSrcweir switch (aContextMenu.Execute(this, _aPos)) 1284cdf0e10cSrcweir { 1285cdf0e10cSrcweir case SID_DELETE: 1286cdf0e10cSrcweir RemoveConnection( _pSelConnection ,sal_True); 1287cdf0e10cSrcweir break; 1288cdf0e10cSrcweir case ID_QUERY_EDIT_JOINCONNECTION: 1289cdf0e10cSrcweir ConnDoubleClicked( _pSelConnection ); // is the same as double clicked 1290cdf0e10cSrcweir break; 1291cdf0e10cSrcweir } 1292cdf0e10cSrcweir } 1293cdf0e10cSrcweir //------------------------------------------------------------------------------ 1294cdf0e10cSrcweir void OJoinTableView::Command(const CommandEvent& rEvt) 1295cdf0e10cSrcweir { 1296cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1297cdf0e10cSrcweir 1298cdf0e10cSrcweir sal_Bool bHandled = sal_False; 1299cdf0e10cSrcweir 1300cdf0e10cSrcweir switch (rEvt.GetCommand()) 1301cdf0e10cSrcweir { 1302cdf0e10cSrcweir case COMMAND_CONTEXTMENU: 1303cdf0e10cSrcweir { 1304cdf0e10cSrcweir if( m_vTableConnection.empty() ) 1305cdf0e10cSrcweir return; 1306cdf0e10cSrcweir 1307cdf0e10cSrcweir OTableConnection* pSelConnection = GetSelectedConn(); 1308cdf0e10cSrcweir // when it wasn't a mouse event use the selected connection 1309cdf0e10cSrcweir if (!rEvt.IsMouseEvent()) 1310cdf0e10cSrcweir { 1311cdf0e10cSrcweir if( pSelConnection ) 1312cdf0e10cSrcweir { 1313cdf0e10cSrcweir const ::std::vector<OConnectionLine*>* pLines = pSelConnection->GetConnLineList(); 1314cdf0e10cSrcweir ::std::vector<OConnectionLine*>::const_iterator aIter = ::std::find_if(pLines->begin(),pLines->end(),::std::mem_fun(&OConnectionLine::IsValid)); 1315cdf0e10cSrcweir if( aIter != pLines->end() ) 1316cdf0e10cSrcweir executePopup((*aIter)->getMidPoint(),pSelConnection); 1317cdf0e10cSrcweir } 1318cdf0e10cSrcweir } 1319cdf0e10cSrcweir else 1320cdf0e10cSrcweir { 1321cdf0e10cSrcweir DeselectConn(pSelConnection); 1322cdf0e10cSrcweir 1323cdf0e10cSrcweir const Point& aMousePos = rEvt.GetMousePosPixel(); 1324cdf0e10cSrcweir ::std::vector<OTableConnection*>::iterator aIter = m_vTableConnection.begin(); 1325cdf0e10cSrcweir ::std::vector<OTableConnection*>::iterator aEnd = m_vTableConnection.end(); 1326cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1327cdf0e10cSrcweir { 1328cdf0e10cSrcweir if( (*aIter)->CheckHit(aMousePos) ) 1329cdf0e10cSrcweir { 1330cdf0e10cSrcweir SelectConn(*aIter); 1331cdf0e10cSrcweir if(!getDesignView()->getController().isReadOnly() && getDesignView()->getController().isConnected()) 1332cdf0e10cSrcweir executePopup(rEvt.GetMousePosPixel(),*aIter); 1333cdf0e10cSrcweir break; 1334cdf0e10cSrcweir } 1335cdf0e10cSrcweir } 1336cdf0e10cSrcweir } 1337cdf0e10cSrcweir bHandled = sal_True; 1338cdf0e10cSrcweir } 1339cdf0e10cSrcweir } 1340cdf0e10cSrcweir if (!bHandled) 1341cdf0e10cSrcweir Window::Command(rEvt); 1342cdf0e10cSrcweir } 1343cdf0e10cSrcweir 1344cdf0e10cSrcweir //------------------------------------------------------------------------------ 1345cdf0e10cSrcweir OTableConnection* OJoinTableView::GetTabConn(const OTableWindow* pLhs,const OTableWindow* pRhs,bool _bSupressCrossOrNaturalJoin,const OTableConnection* _rpFirstAfter) const 1346cdf0e10cSrcweir { 1347cdf0e10cSrcweir OTableConnection* pConn = NULL; 1348cdf0e10cSrcweir DBG_ASSERT(pRhs || pLhs, "OJoinTableView::GetTabConn : invalid args !"); 1349cdf0e10cSrcweir // only one NULL-arg allowed 1350cdf0e10cSrcweir 1351cdf0e10cSrcweir if ((!pLhs || pLhs->ExistsAConn()) && (!pRhs || pRhs->ExistsAConn())) 1352cdf0e10cSrcweir { 1353cdf0e10cSrcweir sal_Bool bFoundStart = _rpFirstAfter ? sal_False : sal_True; 1354cdf0e10cSrcweir 1355cdf0e10cSrcweir ::std::vector<OTableConnection*>::const_iterator aIter = m_vTableConnection.begin(); 1356cdf0e10cSrcweir ::std::vector<OTableConnection*>::const_iterator aEnd = m_vTableConnection.end(); 1357cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1358cdf0e10cSrcweir { 1359cdf0e10cSrcweir OTableConnection* pData = *aIter; 1360cdf0e10cSrcweir 1361cdf0e10cSrcweir if ( ( (pData->GetSourceWin() == pLhs) 1362cdf0e10cSrcweir && ( (pData->GetDestWin() == pRhs) 1363cdf0e10cSrcweir || (NULL == pRhs) 1364cdf0e10cSrcweir ) 1365cdf0e10cSrcweir ) 1366cdf0e10cSrcweir || ( (pData->GetSourceWin() == pRhs) 1367cdf0e10cSrcweir && ( (pData->GetDestWin() == pLhs) 1368cdf0e10cSrcweir || (NULL == pLhs) 1369cdf0e10cSrcweir ) 1370cdf0e10cSrcweir ) 1371cdf0e10cSrcweir ) 1372cdf0e10cSrcweir { 1373cdf0e10cSrcweir if ( _bSupressCrossOrNaturalJoin ) 1374cdf0e10cSrcweir { 1375cdf0e10cSrcweir if ( supressCrossNaturalJoin(pData->GetData()) ) 1376cdf0e10cSrcweir continue; 1377cdf0e10cSrcweir } 1378cdf0e10cSrcweir if (bFoundStart) 1379cdf0e10cSrcweir { 1380cdf0e10cSrcweir pConn = pData; 1381cdf0e10cSrcweir break; 1382cdf0e10cSrcweir } 1383cdf0e10cSrcweir 1384cdf0e10cSrcweir if (!pConn) 1385cdf0e10cSrcweir // used as fallback : if there is no conn after _rpFirstAfter the first conn between the two tables 1386cdf0e10cSrcweir // will be used 1387cdf0e10cSrcweir pConn = pData; 1388cdf0e10cSrcweir 1389cdf0e10cSrcweir if (pData == _rpFirstAfter) 1390cdf0e10cSrcweir bFoundStart = sal_True; 1391cdf0e10cSrcweir } 1392cdf0e10cSrcweir } 1393cdf0e10cSrcweir } 1394cdf0e10cSrcweir return pConn; 1395cdf0e10cSrcweir } 1396cdf0e10cSrcweir 1397cdf0e10cSrcweir //------------------------------------------------------------------------------ 1398cdf0e10cSrcweir long OJoinTableView::PreNotify(NotifyEvent& rNEvt) 1399cdf0e10cSrcweir { 1400cdf0e10cSrcweir sal_Bool bHandled = sal_False; 1401cdf0e10cSrcweir switch (rNEvt.GetType()) 1402cdf0e10cSrcweir { 1403cdf0e10cSrcweir case EVENT_COMMAND: 1404cdf0e10cSrcweir { 1405cdf0e10cSrcweir const CommandEvent* pCommand = rNEvt.GetCommandEvent(); 1406cdf0e10cSrcweir if (pCommand->GetCommand() == COMMAND_WHEEL) 1407cdf0e10cSrcweir { 1408cdf0e10cSrcweir const CommandWheelData* pData = rNEvt.GetCommandEvent()->GetWheelData(); 1409cdf0e10cSrcweir if (pData->GetMode() == COMMAND_WHEEL_SCROLL) 1410cdf0e10cSrcweir { 1411cdf0e10cSrcweir if (pData->GetDelta() > 0) 1412cdf0e10cSrcweir ScrollPane(-10 * pData->GetScrollLines(), pData->IsHorz(), sal_True); 1413cdf0e10cSrcweir else 1414cdf0e10cSrcweir ScrollPane(10 * pData->GetScrollLines(), pData->IsHorz(), sal_True); 1415cdf0e10cSrcweir bHandled = sal_True; 1416cdf0e10cSrcweir } 1417cdf0e10cSrcweir } 1418cdf0e10cSrcweir } 1419cdf0e10cSrcweir break; 1420cdf0e10cSrcweir case EVENT_KEYINPUT: 1421cdf0e10cSrcweir { 1422cdf0e10cSrcweir if (m_aTableMap.empty()) 1423cdf0e10cSrcweir // no tab wins -> no conns -> no traveling 1424cdf0e10cSrcweir break; 1425cdf0e10cSrcweir 1426cdf0e10cSrcweir const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent(); 1427cdf0e10cSrcweir if (!pKeyEvent->GetKeyCode().IsMod1()) 1428cdf0e10cSrcweir { 1429cdf0e10cSrcweir switch (pKeyEvent->GetKeyCode().GetCode()) 1430cdf0e10cSrcweir { 1431cdf0e10cSrcweir case KEY_TAB: 1432cdf0e10cSrcweir { 1433cdf0e10cSrcweir if (!HasChildPathFocus()) 1434cdf0e10cSrcweir break; 1435cdf0e10cSrcweir 1436cdf0e10cSrcweir sal_Bool bForward = !pKeyEvent->GetKeyCode().IsShift(); 1437cdf0e10cSrcweir // is there an active tab win ? 1438cdf0e10cSrcweir OTableWindowMapIterator aIter = m_aTableMap.begin(); 1439cdf0e10cSrcweir OTableWindowMapIterator aEnd = m_aTableMap.end(); 1440cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1441cdf0e10cSrcweir if (aIter->second && aIter->second->HasChildPathFocus()) 1442cdf0e10cSrcweir break; 1443cdf0e10cSrcweir 1444cdf0e10cSrcweir OTableWindow* pNextWin = NULL; 1445cdf0e10cSrcweir OTableConnection* pNextConn = NULL; 1446cdf0e10cSrcweir 1447cdf0e10cSrcweir if (aIter != m_aTableMap.end()) 1448cdf0e10cSrcweir { // there is a currently active tab win 1449cdf0e10cSrcweir // check if there is an "overflow" and we should select a conn instead of a win 1450cdf0e10cSrcweir if (!m_vTableConnection.empty()) 1451cdf0e10cSrcweir { 1452cdf0e10cSrcweir if ((aIter->second == m_aTableMap.rbegin()->second) && bForward) 1453cdf0e10cSrcweir // the last win is active and we're travelling forward -> select the first conn 1454cdf0e10cSrcweir pNextConn = *m_vTableConnection.begin(); 1455cdf0e10cSrcweir if ((aIter == m_aTableMap.begin()) && !bForward) 1456cdf0e10cSrcweir // the first win is active an we're traveling backward -> select the last conn 1457cdf0e10cSrcweir pNextConn = *m_vTableConnection.rbegin(); 1458cdf0e10cSrcweir } 1459cdf0e10cSrcweir 1460cdf0e10cSrcweir if (!pNextConn) 1461cdf0e10cSrcweir { 1462cdf0e10cSrcweir // no conn for any reason -> select the next or previous tab win 1463cdf0e10cSrcweir if(bForward) 1464cdf0e10cSrcweir { 1465cdf0e10cSrcweir if ((aIter->second == m_aTableMap.rbegin()->second)) 1466cdf0e10cSrcweir pNextWin = m_aTableMap.begin()->second; 1467cdf0e10cSrcweir else 1468cdf0e10cSrcweir { 1469cdf0e10cSrcweir ++aIter; 1470cdf0e10cSrcweir pNextWin = aIter->second; 1471cdf0e10cSrcweir } 1472cdf0e10cSrcweir } 1473cdf0e10cSrcweir else 1474cdf0e10cSrcweir { 1475cdf0e10cSrcweir if (aIter == m_aTableMap.begin()) 1476cdf0e10cSrcweir pNextWin = m_aTableMap.rbegin()->second; 1477cdf0e10cSrcweir else 1478cdf0e10cSrcweir { 1479cdf0e10cSrcweir --aIter; 1480cdf0e10cSrcweir pNextWin = aIter->second; 1481cdf0e10cSrcweir } 1482cdf0e10cSrcweir } 1483cdf0e10cSrcweir } 1484cdf0e10cSrcweir } 1485cdf0e10cSrcweir else 1486cdf0e10cSrcweir { // no active tab win -> travel the connections 1487cdf0e10cSrcweir // find the currently selected conn within the conn list 1488cdf0e10cSrcweir sal_Int32 i(0); 1489cdf0e10cSrcweir for ( ::std::vector<OTableConnection*>::iterator connectionIter = m_vTableConnection.begin(); 1490cdf0e10cSrcweir connectionIter != m_vTableConnection.end(); 1491cdf0e10cSrcweir ++connectionIter, ++i 1492cdf0e10cSrcweir ) 1493cdf0e10cSrcweir { 1494cdf0e10cSrcweir if ( (*connectionIter) == GetSelectedConn() ) 1495cdf0e10cSrcweir break; 1496cdf0e10cSrcweir } 1497cdf0e10cSrcweir if (i == sal_Int32(m_vTableConnection.size() - 1) && bForward) 1498cdf0e10cSrcweir // the last conn is active and we're travelling forward -> select the first win 1499cdf0e10cSrcweir pNextWin = m_aTableMap.begin()->second; 1500cdf0e10cSrcweir if ((i == 0) && !bForward && !m_aTableMap.empty()) 1501cdf0e10cSrcweir // the first conn is active and we're travelling backward -> select the last win 1502cdf0e10cSrcweir pNextWin = m_aTableMap.rbegin()->second; 1503cdf0e10cSrcweir 1504cdf0e10cSrcweir if (pNextWin) 1505cdf0e10cSrcweir DeselectConn(GetSelectedConn()); 1506cdf0e10cSrcweir else 1507cdf0e10cSrcweir // no win for any reason -> select the next or previous conn 1508cdf0e10cSrcweir if (i < (sal_Int32)m_vTableConnection.size()) 1509cdf0e10cSrcweir // there is a currently active conn 1510cdf0e10cSrcweir pNextConn = m_vTableConnection[(i + (bForward ? 1 : m_vTableConnection.size() - 1)) % m_vTableConnection.size()]; 1511cdf0e10cSrcweir else 1512cdf0e10cSrcweir { // no tab win selected, no conn selected 1513cdf0e10cSrcweir if (!m_vTableConnection.empty()) 1514cdf0e10cSrcweir pNextConn = m_vTableConnection[bForward ? 0 : m_vTableConnection.size() - 1]; 1515cdf0e10cSrcweir else if (!m_aTableMap.empty()) 1516cdf0e10cSrcweir { 1517cdf0e10cSrcweir if(bForward) 1518cdf0e10cSrcweir pNextWin = m_aTableMap.begin()->second; 1519cdf0e10cSrcweir else 1520cdf0e10cSrcweir pNextWin = m_aTableMap.rbegin()->second; 1521cdf0e10cSrcweir } 1522cdf0e10cSrcweir } 1523cdf0e10cSrcweir } 1524cdf0e10cSrcweir 1525cdf0e10cSrcweir // now select the object 1526cdf0e10cSrcweir if (pNextWin) 1527cdf0e10cSrcweir { 1528cdf0e10cSrcweir if (pNextWin->GetListBox()) 1529cdf0e10cSrcweir pNextWin->GetListBox()->GrabFocus(); 1530cdf0e10cSrcweir else 1531cdf0e10cSrcweir pNextWin->GrabFocus(); 1532cdf0e10cSrcweir EnsureVisible(pNextWin); 1533cdf0e10cSrcweir } 1534cdf0e10cSrcweir else if (pNextConn) 1535cdf0e10cSrcweir { 1536cdf0e10cSrcweir GrabFocus(); 1537cdf0e10cSrcweir // neccessary : a conn may be selected even if a tab win has the focus, in this case 1538cdf0e10cSrcweir // the next travel would select the same conn again if we would not reset te focus ... 1539cdf0e10cSrcweir SelectConn(pNextConn); 1540cdf0e10cSrcweir } 1541cdf0e10cSrcweir } 1542cdf0e10cSrcweir break; 1543cdf0e10cSrcweir case KEY_RETURN: 1544cdf0e10cSrcweir { 1545cdf0e10cSrcweir if (!pKeyEvent->GetKeyCode().IsShift() && GetSelectedConn() && HasFocus()) 1546cdf0e10cSrcweir ConnDoubleClicked(GetSelectedConn()); 1547cdf0e10cSrcweir break; 1548cdf0e10cSrcweir } 1549cdf0e10cSrcweir } 1550cdf0e10cSrcweir } 1551cdf0e10cSrcweir } 1552cdf0e10cSrcweir break; 1553cdf0e10cSrcweir case EVENT_GETFOCUS: 1554cdf0e10cSrcweir { 1555cdf0e10cSrcweir if (m_aTableMap.empty()) 1556cdf0e10cSrcweir // no tab wins -> no conns -> no focus change 1557cdf0e10cSrcweir break; 1558cdf0e10cSrcweir Window* pSource = rNEvt.GetWindow(); 1559cdf0e10cSrcweir if (pSource) 1560cdf0e10cSrcweir { 1561cdf0e10cSrcweir Window* pSearchFor = NULL; 1562cdf0e10cSrcweir if (pSource->GetParent() == this) 1563cdf0e10cSrcweir // it may be one of the tab wins 1564cdf0e10cSrcweir pSearchFor = pSource; 1565cdf0e10cSrcweir else if (pSource->GetParent() && (pSource->GetParent()->GetParent() == this)) 1566cdf0e10cSrcweir // it may be one of th list boxes of one of the tab wins 1567cdf0e10cSrcweir pSearchFor = pSource->GetParent(); 1568cdf0e10cSrcweir 1569cdf0e10cSrcweir if (pSearchFor) 1570cdf0e10cSrcweir { 1571cdf0e10cSrcweir OTableWindowMapIterator aIter = m_aTableMap.begin(); 1572cdf0e10cSrcweir OTableWindowMapIterator aEnd = m_aTableMap.end(); 1573cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1574cdf0e10cSrcweir { 1575cdf0e10cSrcweir if (aIter->second == pSearchFor) 1576cdf0e10cSrcweir { 1577cdf0e10cSrcweir m_pLastFocusTabWin = aIter->second; 1578cdf0e10cSrcweir break; 1579cdf0e10cSrcweir } 1580cdf0e10cSrcweir } 1581cdf0e10cSrcweir } 1582cdf0e10cSrcweir } 1583cdf0e10cSrcweir } 1584cdf0e10cSrcweir break; 1585cdf0e10cSrcweir } 1586cdf0e10cSrcweir 1587cdf0e10cSrcweir if (!bHandled) 1588cdf0e10cSrcweir return Window::PreNotify(rNEvt); 1589cdf0e10cSrcweir return 1L; 1590cdf0e10cSrcweir } 1591cdf0e10cSrcweir 1592cdf0e10cSrcweir //------------------------------------------------------------------------------ 1593cdf0e10cSrcweir void OJoinTableView::GrabTabWinFocus() 1594cdf0e10cSrcweir { 1595cdf0e10cSrcweir if (m_pLastFocusTabWin && m_pLastFocusTabWin->IsVisible()) 1596cdf0e10cSrcweir { 1597cdf0e10cSrcweir if (m_pLastFocusTabWin->GetListBox()) 1598cdf0e10cSrcweir m_pLastFocusTabWin->GetListBox()->GrabFocus(); 1599cdf0e10cSrcweir else 1600cdf0e10cSrcweir m_pLastFocusTabWin->GrabFocus(); 1601cdf0e10cSrcweir } 1602cdf0e10cSrcweir else if (!m_aTableMap.empty() && m_aTableMap.begin()->second && m_aTableMap.begin()->second->IsVisible()) 1603cdf0e10cSrcweir { 1604cdf0e10cSrcweir OTableWindow* pFirstWin = m_aTableMap.begin()->second; 1605cdf0e10cSrcweir if (pFirstWin->GetListBox()) 1606cdf0e10cSrcweir pFirstWin->GetListBox()->GrabFocus(); 1607cdf0e10cSrcweir else 1608cdf0e10cSrcweir pFirstWin->GrabFocus(); 1609cdf0e10cSrcweir } 1610cdf0e10cSrcweir } 1611cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1612cdf0e10cSrcweir void OJoinTableView::StateChanged( StateChangedType nType ) 1613cdf0e10cSrcweir { 1614cdf0e10cSrcweir Window::StateChanged( nType ); 1615cdf0e10cSrcweir 1616cdf0e10cSrcweir if ( nType == STATE_CHANGE_ZOOM ) 1617cdf0e10cSrcweir { 1618cdf0e10cSrcweir const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 1619cdf0e10cSrcweir 1620cdf0e10cSrcweir Font aFont = rStyleSettings.GetGroupFont(); 1621cdf0e10cSrcweir if ( IsControlFont() ) 1622cdf0e10cSrcweir aFont.Merge( GetControlFont() ); 1623cdf0e10cSrcweir SetZoomedPointFont( aFont ); 1624cdf0e10cSrcweir 1625cdf0e10cSrcweir OTableWindowMapIterator aIter = m_aTableMap.begin(); 1626cdf0e10cSrcweir OTableWindowMapIterator aEnd = m_aTableMap.end(); 1627cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1628cdf0e10cSrcweir { 1629cdf0e10cSrcweir aIter->second->SetZoom(GetZoom()); 1630cdf0e10cSrcweir Size aSize(CalcZoom(aIter->second->GetSizePixel().Width()),CalcZoom(aIter->second->GetSizePixel().Height())); 1631cdf0e10cSrcweir aIter->second->SetSizePixel(aSize); 1632cdf0e10cSrcweir } 1633cdf0e10cSrcweir Resize(); 1634cdf0e10cSrcweir } 1635cdf0e10cSrcweir } 1636cdf0e10cSrcweir //------------------------------------------------------------------------------ 1637cdf0e10cSrcweir void OJoinTableView::HideTabWins() 1638cdf0e10cSrcweir { 1639cdf0e10cSrcweir DBG_CHKTHIS(OJoinTableView,NULL); 1640cdf0e10cSrcweir SetUpdateMode(sal_False); 1641cdf0e10cSrcweir 1642cdf0e10cSrcweir OTableWindowMap* pTabWins = GetTabWinMap(); 1643cdf0e10cSrcweir if ( pTabWins ) 1644cdf0e10cSrcweir { 1645cdf0e10cSrcweir // working on a copy because the real list will be cleared in inner calls 1646cdf0e10cSrcweir OTableWindowMap aCopy(*pTabWins); 1647cdf0e10cSrcweir OTableWindowMap::iterator aIter = aCopy.begin(); 1648cdf0e10cSrcweir OTableWindowMap::iterator aEnd = aCopy.end(); 1649cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1650cdf0e10cSrcweir RemoveTabWin(aIter->second); 1651cdf0e10cSrcweir } 1652cdf0e10cSrcweir 1653cdf0e10cSrcweir m_pView->getController().setModified(sal_True); 1654cdf0e10cSrcweir 1655cdf0e10cSrcweir SetUpdateMode(sal_True); 1656cdf0e10cSrcweir 1657cdf0e10cSrcweir } 1658cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1659cdf0e10cSrcweir sal_Int8 OJoinTableView::AcceptDrop( const AcceptDropEvent& /*_rEvt*/ ) 1660cdf0e10cSrcweir { 1661cdf0e10cSrcweir return DND_ACTION_NONE; 1662cdf0e10cSrcweir } 1663cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1664cdf0e10cSrcweir sal_Int8 OJoinTableView::ExecuteDrop( const ExecuteDropEvent& /*_rEvt*/ ) 1665cdf0e10cSrcweir { 1666cdf0e10cSrcweir return DND_ACTION_NONE; 1667cdf0e10cSrcweir } 1668cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1669cdf0e10cSrcweir void OJoinTableView::dragFinished( ) 1670cdf0e10cSrcweir { 1671cdf0e10cSrcweir } 1672cdf0e10cSrcweir //------------------------------------------------------------------------------ 1673cdf0e10cSrcweir void OJoinTableView::StartDrag( sal_Int8 /*nAction*/, const Point& /*rPosPixel*/ ) 1674cdf0e10cSrcweir { 1675cdf0e10cSrcweir } 1676cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1677cdf0e10cSrcweir void OJoinTableView::clearLayoutInformation() 1678cdf0e10cSrcweir { 1679cdf0e10cSrcweir m_pLastFocusTabWin = NULL; 1680cdf0e10cSrcweir m_pSelectedConn = NULL; 1681cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 1682cdf0e10cSrcweir // Listen loeschen 1683cdf0e10cSrcweir OTableWindowMapIterator aIter = m_aTableMap.begin(); 1684cdf0e10cSrcweir OTableWindowMapIterator aEnd = m_aTableMap.end(); 1685cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1686cdf0e10cSrcweir { 1687cdf0e10cSrcweir if ( aIter->second ) 1688cdf0e10cSrcweir aIter->second->clearListBox(); 1689cdf0e10cSrcweir ::std::auto_ptr<Window> aTemp(aIter->second); 1690cdf0e10cSrcweir aIter->second = NULL; 1691cdf0e10cSrcweir } 1692cdf0e10cSrcweir 1693cdf0e10cSrcweir m_aTableMap.clear(); 1694cdf0e10cSrcweir 1695cdf0e10cSrcweir ::std::vector<OTableConnection*>::const_iterator aIter2 = m_vTableConnection.begin(); 1696cdf0e10cSrcweir ::std::vector<OTableConnection*>::const_iterator aEnd2 = m_vTableConnection.end(); 1697cdf0e10cSrcweir for(;aIter2 != aEnd2;++aIter2) 1698cdf0e10cSrcweir delete *aIter2; 1699cdf0e10cSrcweir 1700cdf0e10cSrcweir m_vTableConnection.clear(); 1701cdf0e10cSrcweir } 1702cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1703cdf0e10cSrcweir void OJoinTableView::lookForUiActivities() 1704cdf0e10cSrcweir { 1705cdf0e10cSrcweir } 1706cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1707cdf0e10cSrcweir void OJoinTableView::LoseFocus() 1708cdf0e10cSrcweir { 1709cdf0e10cSrcweir DeselectConn(GetSelectedConn()); 1710cdf0e10cSrcweir Window::LoseFocus(); 1711cdf0e10cSrcweir } 1712cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1713cdf0e10cSrcweir void OJoinTableView::GetFocus() 1714cdf0e10cSrcweir { 1715cdf0e10cSrcweir Window::GetFocus(); 1716cdf0e10cSrcweir if ( !m_aTableMap.empty() && !GetSelectedConn() ) 1717cdf0e10cSrcweir GrabTabWinFocus(); 1718cdf0e10cSrcweir } 1719cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1720cdf0e10cSrcweir Reference< XAccessible > OJoinTableView::CreateAccessible() 1721cdf0e10cSrcweir { 1722cdf0e10cSrcweir m_pAccessible = new OJoinDesignViewAccess(this); 1723cdf0e10cSrcweir return m_pAccessible; 1724cdf0e10cSrcweir } 1725cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1726cdf0e10cSrcweir void OJoinTableView::modified() 1727cdf0e10cSrcweir { 1728cdf0e10cSrcweir OJoinController& rController = m_pView->getController(); 1729cdf0e10cSrcweir rController.setModified( sal_True ); 1730cdf0e10cSrcweir rController.InvalidateFeature(ID_BROWSER_ADDTABLE); 1731cdf0e10cSrcweir rController.InvalidateFeature(SID_RELATION_ADD_RELATION); 1732cdf0e10cSrcweir } 1733cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1734cdf0e10cSrcweir void OJoinTableView::addConnection(OTableConnection* _pConnection,sal_Bool _bAddData) 1735cdf0e10cSrcweir { 1736cdf0e10cSrcweir if ( _bAddData ) 1737cdf0e10cSrcweir { 1738cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 1739cdf0e10cSrcweir TTableConnectionData* pTabConnDataList = m_pView->getController().getTableConnectionData(); 1740cdf0e10cSrcweir OSL_ENSURE( ::std::find(pTabConnDataList->begin(),pTabConnDataList->end(),_pConnection->GetData()) == pTabConnDataList->end(),"Data already in vector!"); 1741cdf0e10cSrcweir #endif 1742cdf0e10cSrcweir m_pView->getController().getTableConnectionData()->push_back(_pConnection->GetData()); 1743cdf0e10cSrcweir } 1744cdf0e10cSrcweir m_vTableConnection.push_back(_pConnection); 1745cdf0e10cSrcweir _pConnection->RecalcLines(); 1746cdf0e10cSrcweir _pConnection->InvalidateConnection(); 1747cdf0e10cSrcweir 1748cdf0e10cSrcweir modified(); 1749cdf0e10cSrcweir if ( m_pAccessible ) 1750cdf0e10cSrcweir m_pAccessible->notifyAccessibleEvent( AccessibleEventId::CHILD, 1751cdf0e10cSrcweir Any(), 1752cdf0e10cSrcweir makeAny(_pConnection->GetAccessible())); 1753cdf0e10cSrcweir } 1754cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1755cdf0e10cSrcweir bool OJoinTableView::allowQueries() const 1756cdf0e10cSrcweir { 1757cdf0e10cSrcweir return true; 1758cdf0e10cSrcweir } 1759cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1760cdf0e10cSrcweir void OJoinTableView::onNoColumns_throw() 1761cdf0e10cSrcweir { 1762cdf0e10cSrcweir OSL_ENSURE( false, "OTableWindow::onNoColumns_throw: cannot really handle this!" ); 1763cdf0e10cSrcweir throw SQLException(); 1764cdf0e10cSrcweir } 1765cdf0e10cSrcweir //------------------------------------------------------------------------------ 1766cdf0e10cSrcweir bool OJoinTableView::supressCrossNaturalJoin(const TTableConnectionData::value_type& ) const 1767cdf0e10cSrcweir { 1768cdf0e10cSrcweir return false; 1769cdf0e10cSrcweir } 1770