| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_dbaccess.hxx" |
| #ifndef DBAUI_TABLEWINDOW_HXX |
| #include "TableWindow.hxx" |
| #endif |
| #ifndef DBAUI_TABLEWINDOWLISTBOX_HXX |
| #include "TableWindowListBox.hxx" |
| #endif |
| #ifndef DBAUI_QUERYTABLEVIEW_HXX |
| #include "QueryTableView.hxx" |
| #endif |
| #ifndef DBAUI_QUERYDESIGNVIEW_HXX |
| #include "QueryDesignView.hxx" |
| #endif |
| #ifndef DBAUI_TABLEWINDOWDATA_HXX |
| #include "TableWindowData.hxx" |
| #endif |
| #ifndef DBACCESS_IMAGEPROVIDER_HXX |
| #include "imageprovider.hxx" |
| #endif |
| #ifndef _TOOLS_DEBUG_HXX |
| #include <tools/debug.hxx> |
| #endif |
| #ifndef TOOLS_DIAGNOSE_EX_H |
| #include <tools/diagnose_ex.h> |
| #endif |
| #ifndef _SV_SVAPP_HXX |
| #include <vcl/svapp.hxx> |
| #endif |
| #ifndef _SV_WALL_HXX |
| #include <vcl/wall.hxx> |
| #endif |
| |
| #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> |
| #include <com/sun/star/container/XNameAccess.hpp> |
| #include <com/sun/star/beans/XPropertySet.hpp> |
| #include <com/sun/star/accessibility/AccessibleEventId.hpp> |
| #include <com/sun/star/accessibility/AccessibleRole.hpp> |
| #include "querycontroller.hxx" |
| #include "dbu_qry.hrc" |
| #include "dbustrings.hrc" |
| #include "Query.hrc" |
| #include <comphelper/extract.hxx> |
| #include "UITools.hxx" |
| #include "TableWindowAccess.hxx" |
| #include "browserids.hxx" |
| #include <connectivity/dbtools.hxx> |
| |
| |
| using namespace dbaui; |
| using namespace ::utl; |
| using namespace ::com::sun::star; |
| using namespace ::com::sun::star::sdb; |
| using namespace ::com::sun::star::sdbc; |
| using namespace ::com::sun::star::sdbcx; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::beans; |
| using namespace ::com::sun::star::container; |
| using namespace ::com::sun::star::lang; |
| using namespace ::com::sun::star::accessibility; |
| |
| #define TABWIN_SIZING_AREA 4 |
| #define LISTBOX_SCROLLING_AREA 6 |
| #define SCROLLING_TIMESPAN 500 |
| |
| #define TABWIN_WIDTH_MIN 90 |
| #define TABWIN_HEIGHT_MIN 80 |
| |
| //======================================================================== |
| // class OTableWindow |
| //======================================================================== |
| DBG_NAME(OTableWindow) |
| //------------------------------------------------------------------------------ |
| OTableWindow::OTableWindow( Window* pParent, const TTableWindowData::value_type& pTabWinData ) |
| : ::comphelper::OContainerListener(m_aMutex) |
| ,Window( pParent, WB_3DLOOK|WB_MOVEABLE ) |
| ,m_aTypeImage( this ) |
| ,m_aTitle( this ) |
| ,m_pListBox(NULL) |
| ,m_pAccessible(NULL) |
| ,m_pData( pTabWinData ) |
| ,m_nMoveCount(0) |
| ,m_nMoveIncrement(1) |
| ,m_nSizingFlags( SIZING_NONE ) |
| ,m_bActive( sal_False ) |
| { |
| DBG_CTOR(OTableWindow,NULL); |
| |
| // Position und Groesse bestimmen |
| if( GetData()->HasPosition() ) |
| SetPosPixel( GetData()->GetPosition() ); |
| |
| if( GetData()->HasSize() ) |
| SetSizePixel( GetData()->GetSize() ); |
| |
| // Hintergrund setzen |
| const StyleSettings& aSystemStyle = Application::GetSettings().GetStyleSettings(); |
| SetBackground(Wallpaper(aSystemStyle.GetFaceColor())); |
| // und Textfarbe (obwohl ich eigentlich keinen Text habe, aber wer weiss, was |
| // abgeleitete Klassen machen) |
| SetTextColor(aSystemStyle.GetButtonTextColor()); |
| |
| EnableClipSiblings(); |
| } |
| |
| //------------------------------------------------------------------------------ |
| OTableWindow::~OTableWindow() |
| { |
| DBG_DTOR(OTableWindow,NULL); |
| |
| if (m_pListBox) |
| { |
| OSL_ENSURE(m_pListBox->GetEntryCount()==0,"Forgot to call EmptyListbox()!"); |
| ::std::auto_ptr<Window> aTemp(m_pListBox); |
| m_pListBox = NULL; |
| } // if (m_pListBox) |
| if ( m_pContainerListener.is() ) |
| m_pContainerListener->dispose(); |
| |
| m_pAccessible = NULL; |
| } |
| // ----------------------------------------------------------------------------- |
| const OJoinTableView* OTableWindow::getTableView() const |
| { |
| OSL_ENSURE(static_cast<OJoinTableView*>(GetParent()),"No OJoinTableView!"); |
| return static_cast<OJoinTableView*>(GetParent()); |
| } |
| // ----------------------------------------------------------------------------- |
| OJoinTableView* OTableWindow::getTableView() |
| { |
| OSL_ENSURE(static_cast<OJoinTableView*>(GetParent()),"No OJoinTableView!"); |
| return static_cast<OJoinTableView*>(GetParent()); |
| } |
| // ----------------------------------------------------------------------------- |
| OJoinDesignView* OTableWindow::getDesignView() |
| { |
| OSL_ENSURE(static_cast<OJoinDesignView*>(GetParent()->GetParent()->GetParent()),"No OJoinDesignView!"); |
| return static_cast<OJoinDesignView*>(GetParent()->GetParent()->GetParent()); |
| } |
| //------------------------------------------------------------------------------ |
| void OTableWindow::SetPosPixel( const Point& rNewPos ) |
| { |
| Point aNewPosData = rNewPos + getTableView()->GetScrollOffset(); |
| GetData()->SetPosition( aNewPosData ); |
| Window::SetPosPixel( rNewPos ); |
| } |
| |
| //------------------------------------------------------------------------------ |
| void OTableWindow::SetSizePixel( const Size& rNewSize ) |
| { |
| Size aOutSize(rNewSize); |
| if( aOutSize.Width() < TABWIN_WIDTH_MIN ) |
| aOutSize.Width() = TABWIN_WIDTH_MIN; |
| if( aOutSize.Height() < TABWIN_HEIGHT_MIN ) |
| aOutSize.Height() = TABWIN_HEIGHT_MIN; |
| |
| GetData()->SetSize( aOutSize ); |
| Window::SetSizePixel( aOutSize ); |
| } |
| //------------------------------------------------------------------------------ |
| void OTableWindow::SetPosSizePixel( const Point& rNewPos, const Size& rNewSize ) |
| { |
| SetPosPixel( rNewPos ); |
| SetSizePixel( rNewSize ); |
| } |
| //------------------------------------------------------------------------------ |
| OTableWindowListBox* OTableWindow::CreateListBox() |
| { |
| return new OTableWindowListBox(this); |
| } |
| |
| //------------------------------------------------------------------------------ |
| sal_Bool OTableWindow::FillListBox() |
| { |
| m_pListBox->Clear(); |
| if ( !m_pContainerListener.is() ) |
| { |
| Reference< XContainer> xContainer(m_pData->getColumns(),UNO_QUERY); |
| if ( xContainer.is() ) |
| m_pContainerListener = new ::comphelper::OContainerListenerAdapter(this,xContainer); |
| } |
| // mark all primary keys with special image |
| ModuleRes TmpRes(isHiContrast(m_pListBox) ? IMG_JOINS_H : IMG_JOINS); |
| ImageList aImageList(TmpRes); |
| Image aPrimKeyImage = aImageList.GetImage(IMG_PRIMARY_KEY); |
| |
| if (GetData()->IsShowAll()) |
| { |
| SvLBoxEntry* pEntry = m_pListBox->InsertEntry( ::rtl::OUString::createFromAscii("*") ); |
| pEntry->SetUserData( createUserData(NULL,false) ); |
| } |
| |
| Reference<XNameAccess> xPKeyColumns; |
| try |
| { |
| xPKeyColumns = dbtools::getPrimaryKeyColumns_throw(m_pData->getTable()); |
| } |
| catch(Exception&) |
| { |
| OSL_ENSURE(0,"Exception occurred!"); |
| } |
| try |
| { |
| Reference< XNameAccess > xColumns = m_pData->getColumns(); |
| if( xColumns.is() ) |
| { |
| Sequence< ::rtl::OUString> aColumns = xColumns->getElementNames(); |
| const ::rtl::OUString* pIter = aColumns.getConstArray(); |
| const ::rtl::OUString* pEnd = pIter + aColumns.getLength(); |
| |
| SvLBoxEntry* pEntry = NULL; |
| for (; pIter != pEnd; ++pIter) |
| { |
| bool bPrimaryKeyColumn = xPKeyColumns.is() && xPKeyColumns->hasByName( *pIter ); |
| // is this column in the primary key |
| if ( bPrimaryKeyColumn ) |
| pEntry = m_pListBox->InsertEntry(*pIter, aPrimKeyImage, aPrimKeyImage); |
| else |
| pEntry = m_pListBox->InsertEntry(*pIter); |
| |
| Reference<XPropertySet> xColumn(xColumns->getByName(*pIter),UNO_QUERY); |
| if ( xColumn.is() ) |
| pEntry->SetUserData( createUserData(xColumn,bPrimaryKeyColumn) ); |
| } |
| } |
| } |
| catch(Exception&) |
| { |
| OSL_ENSURE(0,"Exception occurred!"); |
| } |
| |
| return sal_True; |
| } |
| // ----------------------------------------------------------------------------- |
| void* OTableWindow::createUserData(const Reference< XPropertySet>& /*_xColumn*/,bool /*_bPrimaryKey*/) |
| { |
| return NULL; |
| } |
| // ----------------------------------------------------------------------------- |
| void OTableWindow::deleteUserData(void*& _pUserData) |
| { |
| OSL_ENSURE(!_pUserData,"INVALID call. Need to delete the userclass!"); |
| _pUserData = NULL; |
| } |
| //------------------------------------------------------------------------------ |
| void OTableWindow::clearListBox() |
| { |
| if ( m_pListBox ) |
| { |
| SvLBoxEntry* pEntry = m_pListBox->First(); |
| |
| while(pEntry) |
| { |
| void* pUserData = pEntry->GetUserData(); |
| deleteUserData(pUserData); |
| SvLBoxEntry* pNextEntry = m_pListBox->Next(pEntry); |
| m_pListBox->GetModel()->Remove(pEntry); |
| pEntry = pNextEntry; |
| } |
| } |
| } |
| |
| //------------------------------------------------------------------------------ |
| void OTableWindow::impl_updateImage() |
| { |
| ImageProvider aImageProvider( getDesignView()->getController().getConnection() ); |
| |
| Image aImage, aImageHC; |
| aImageProvider.getImages( GetComposedName(), m_pData->isQuery() ? DatabaseObject::QUERY : DatabaseObject::TABLE, aImage, aImageHC ); |
| |
| if ( !aImage || !aImageHC ) |
| { |
| OSL_ENSURE( false, "OTableWindow::impl_updateImage: no images!" ); |
| return; |
| } |
| |
| m_aTypeImage.SetModeImage( aImage, BMP_COLOR_NORMAL ); |
| m_aTypeImage.SetModeImage( aImageHC, BMP_COLOR_HIGHCONTRAST ); |
| m_aTypeImage.Show(); |
| } |
| |
| //------------------------------------------------------------------------------ |
| sal_Bool OTableWindow::Init() |
| { |
| // create list box if necessary |
| if ( !m_pListBox ) |
| { |
| m_pListBox = CreateListBox(); |
| DBG_ASSERT( m_pListBox != NULL, "OTableWindow::Init() : CreateListBox hat NULL geliefert !" ); |
| m_pListBox->SetSelectionMode( MULTIPLE_SELECTION ); |
| } |
| |
| // Titel setzen |
| m_aTitle.SetText( m_pData->GetWinName() ); |
| m_aTitle.Show(); |
| |
| m_pListBox->Show(); |
| |
| // die Felder in die ListBox eintragen |
| clearListBox(); |
| sal_Bool bSuccess = FillListBox(); |
| if ( bSuccess ) |
| m_pListBox->SelectAll( sal_False ); |
| |
| impl_updateImage(); |
| |
| return bSuccess; |
| } |
| //------------------------------------------------------------------------------ |
| void OTableWindow::DataChanged(const DataChangedEvent& rDCEvt) |
| { |
| if (rDCEvt.GetType() == DATACHANGED_SETTINGS) |
| { |
| // nehmen wir den worst-case an : die Farben haben sich geaendert, also |
| // mich anpassen |
| const StyleSettings& aSystemStyle = Application::GetSettings().GetStyleSettings(); |
| SetBackground(Wallpaper(Color(aSystemStyle.GetFaceColor()))); |
| SetTextColor(aSystemStyle.GetButtonTextColor()); |
| } |
| } |
| //------------------------------------------------------------------------------ |
| void OTableWindow::Paint( const Rectangle& rRect ) |
| { |
| Rectangle aRect( Point(0,0), GetOutputSizePixel() ); |
| Window::Paint( rRect ); |
| Draw3DBorder( aRect ); |
| } |
| |
| //------------------------------------------------------------------------------ |
| void OTableWindow::Draw3DBorder(const Rectangle& rRect) |
| { |
| // die Style-Settings des Systems fuer meine Farben |
| const StyleSettings& aSystemStyle = Application::GetSettings().GetStyleSettings(); |
| |
| // Schwarze Linie unten und rechts |
| SetLineColor(aSystemStyle.GetDarkShadowColor()); |
| DrawLine( rRect.BottomLeft(), rRect.BottomRight() ); |
| DrawLine( rRect.BottomRight(), rRect.TopRight() ); |
| |
| // Dunkelgraue Linie ueber der schwarzen |
| SetLineColor(aSystemStyle.GetShadowColor()); |
| Point aEHvector(1,1); |
| DrawLine( rRect.BottomLeft()+Point(1,-1), rRect.BottomRight() - aEHvector ); |
| DrawLine( rRect.BottomRight() - aEHvector, rRect.TopRight()+Point(-1,1) ); |
| |
| // Hellgraue Linie links und oben |
| SetLineColor(aSystemStyle.GetLightColor()); |
| DrawLine( rRect.BottomLeft()+Point(1,-2), rRect.TopLeft() + aEHvector ); |
| DrawLine( rRect.TopLeft() + aEHvector, rRect.TopRight()+Point(-2,1) ); |
| } |
| // ----------------------------------------------------------------------------- |
| Rectangle OTableWindow::getSizingRect(const Point& _rPos,const Size& _rOutputSize) const |
| { |
| Rectangle aSizingRect = Rectangle( GetPosPixel(), GetSizePixel() ); |
| sal_uInt16 nSizingFlags = GetSizingFlags(); |
| |
| if( nSizingFlags & SIZING_TOP ) |
| { |
| if( _rPos.Y() < 0 ) |
| aSizingRect.Top() = 0; |
| else |
| aSizingRect.Top() = _rPos.Y(); |
| } |
| |
| if( nSizingFlags & SIZING_BOTTOM ) |
| { |
| if( _rPos.Y() > _rOutputSize.Height() ) |
| aSizingRect.Bottom() = _rOutputSize.Height(); |
| else |
| aSizingRect.Bottom() = _rPos.Y(); |
| } |
| |
| |
| if( nSizingFlags & SIZING_RIGHT ) |
| { |
| if( _rPos.X() > _rOutputSize.Width() ) |
| aSizingRect.Right() = _rOutputSize.Width(); |
| else |
| aSizingRect.Right() = _rPos.X(); |
| } |
| |
| if( nSizingFlags & SIZING_LEFT ) |
| { |
| if( _rPos.X() < 0 ) |
| aSizingRect.Left() = 0; |
| else |
| aSizingRect.Left() = _rPos.X(); |
| } |
| return aSizingRect; |
| } |
| // ----------------------------------------------------------------------------- |
| void OTableWindow::setSizingFlag(const Point& _rPos) |
| { |
| Size aOutSize = GetOutputSizePixel(); |
| ////////////////////////////////////////////////////////////////////// |
| // Flags anpassen, wenn Mauszeiger in sizingArea |
| m_nSizingFlags = SIZING_NONE; |
| |
| if( _rPos.X() < TABWIN_SIZING_AREA ) |
| m_nSizingFlags |= SIZING_LEFT; |
| |
| if( _rPos.Y() < TABWIN_SIZING_AREA ) |
| m_nSizingFlags |= SIZING_TOP; |
| |
| if( _rPos.X() > aOutSize.Width()-TABWIN_SIZING_AREA ) |
| m_nSizingFlags |= SIZING_RIGHT; |
| |
| if( _rPos.Y() > aOutSize.Height()-TABWIN_SIZING_AREA ) |
| m_nSizingFlags |= SIZING_BOTTOM; |
| } |
| //------------------------------------------------------------------------------ |
| void OTableWindow::MouseMove( const MouseEvent& rEvt ) |
| { |
| Window::MouseMove(rEvt); |
| |
| OJoinTableView* pCont = getTableView(); |
| if (pCont->getDesignView()->getController().isReadOnly()) |
| return; |
| |
| Point aPos = rEvt.GetPosPixel(); |
| setSizingFlag(aPos); |
| Pointer aPointer; |
| |
| |
| ////////////////////////////////////////////////////////////////////// |
| // Mauszeiger anpassen, wenn Mauszeiger in sizingArea |
| switch( m_nSizingFlags ) |
| { |
| case SIZING_TOP: |
| case SIZING_BOTTOM: |
| aPointer = Pointer( POINTER_SSIZE ); |
| break; |
| |
| case SIZING_LEFT: |
| case SIZING_RIGHT: |
| aPointer = Pointer( POINTER_ESIZE ); |
| break; |
| |
| case SIZING_LEFT+SIZING_TOP: |
| case SIZING_RIGHT+SIZING_BOTTOM: |
| aPointer = Pointer( POINTER_SESIZE ); |
| break; |
| |
| case SIZING_RIGHT+SIZING_TOP: |
| case SIZING_LEFT+SIZING_BOTTOM: |
| aPointer = Pointer( POINTER_NESIZE ); |
| break; |
| } |
| |
| SetPointer( aPointer ); |
| } |
| |
| //------------------------------------------------------------------------------ |
| void OTableWindow::MouseButtonDown( const MouseEvent& rEvt ) |
| { |
| ////////////////////////////////////////////////////////////////////// |
| // Wenn sizing, dann bekommt Parent die Nachricht, |
| // dass jetzt die Fenstergroesse seines Childs veraendert wird |
| if( m_nSizingFlags ) |
| getTableView()->BeginChildSizing( this, GetPointer() ); |
| |
| Window::MouseButtonDown( rEvt ); |
| } |
| |
| |
| |
| //------------------------------------------------------------------------------ |
| void OTableWindow::Resize() |
| { |
| ////////////////////////////////////////////////////////////////////// |
| // Das Fenster darf nicht verschwinden, deshalb min. Groesse setzen |
| Size aOutSize = GetOutputSizePixel(); |
| aOutSize = Size(CalcZoom(aOutSize.Width()),CalcZoom(aOutSize.Height())); |
| |
| long nTitleHeight = CalcZoom( GetTextHeight() )+ CalcZoom( 4 ); |
| |
| ////////////////////////////////////////////////////////////////////// |
| // Titel und ListBox anpassen |
| long n5Pos = CalcZoom(5); |
| long nPositionX = n5Pos; |
| long nPositionY = n5Pos; |
| |
| // position the image which indicates the type |
| m_aTypeImage.SetPosPixel( Point( nPositionX, nPositionY ) ); |
| Size aImageSize( m_aTypeImage.GetImage().GetSizePixel() ); |
| m_aTypeImage.SetSizePixel( aImageSize ); |
| |
| if ( nTitleHeight < aImageSize.Height() ) |
| nTitleHeight = aImageSize.Height(); |
| |
| nPositionX += aImageSize.Width() + CalcZoom( 2 ); |
| m_aTitle.SetPosSizePixel( Point( nPositionX, nPositionY ), Size( aOutSize.Width() - nPositionX - n5Pos, nTitleHeight ) ); |
| |
| long nTitleToList = CalcZoom( 3 ); |
| |
| m_pListBox->SetPosSizePixel( |
| Point( n5Pos, nPositionY + nTitleHeight + nTitleToList ), |
| Size( aOutSize.Width() - 2 * n5Pos, aOutSize.Height() - ( nPositionY + nTitleHeight + nTitleToList ) - n5Pos ) |
| ); |
| |
| Window::Invalidate(); |
| } |
| |
| //------------------------------------------------------------------------------ |
| void OTableWindow::SetBoldTitle( sal_Bool bBold ) |
| { |
| Font aFont = m_aTitle.GetFont(); |
| aFont.SetWeight( bBold?WEIGHT_BOLD:WEIGHT_NORMAL ); |
| m_aTitle.SetFont( aFont ); |
| m_aTitle.Invalidate(); |
| } |
| |
| //------------------------------------------------------------------------------ |
| void OTableWindow::GetFocus() |
| { |
| Window::GetFocus(); |
| // we have to forward the focus to our listbox to enable keystokes |
| if(m_pListBox) |
| m_pListBox->GrabFocus(); |
| } |
| // ----------------------------------------------------------------------------- |
| void OTableWindow::setActive(sal_Bool _bActive) |
| { |
| SetBoldTitle( _bActive ); |
| m_bActive = _bActive; |
| if (!_bActive && m_pListBox && m_pListBox->GetSelectionCount() != 0) |
| m_pListBox->SelectAll(sal_False); |
| } |
| |
| //------------------------------------------------------------------------------ |
| void OTableWindow::Remove() |
| { |
| ////////////////////////////////////////////////////////////////// |
| // Fenster loeschen |
| OJoinTableView* pTabWinCont = getTableView(); |
| pTabWinCont->RemoveTabWin( this ); |
| pTabWinCont->Invalidate(); |
| } |
| //------------------------------------------------------------------------------ |
| sal_Bool OTableWindow::HandleKeyInput( const KeyEvent& rEvt ) |
| { |
| const KeyCode& rCode = rEvt.GetKeyCode(); |
| sal_uInt16 nCode = rCode.GetCode(); |
| sal_Bool bShift = rCode.IsShift(); |
| sal_Bool bCtrl = rCode.IsMod1(); |
| |
| sal_Bool bHandle = sal_False; |
| |
| if( !bCtrl && !bShift && (nCode==KEY_DELETE) ) |
| { |
| Remove(); |
| bHandle = sal_True; |
| } |
| return bHandle; |
| } |
| |
| //------------------------------------------------------------------------------ |
| sal_Bool OTableWindow::ExistsAConn() const |
| { |
| return getTableView()->ExistsAConn(this); |
| } |
| //------------------------------------------------------------------------------ |
| void OTableWindow::EnumValidFields(::std::vector< ::rtl::OUString>& arrstrFields) |
| { |
| arrstrFields.clear(); |
| // diese Default-Implementierung zaehlt einfach alles auf, was es in der ListBox gibt ... fuer anderes Verhalten ueberschreiben |
| if ( m_pListBox ) |
| { |
| arrstrFields.reserve(m_pListBox->GetEntryCount()); |
| SvLBoxEntry* pEntryLoop = m_pListBox->First(); |
| while (pEntryLoop) |
| { |
| arrstrFields.push_back(m_pListBox->GetEntryText(pEntryLoop)); |
| pEntryLoop = m_pListBox->Next(pEntryLoop); |
| } |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void OTableWindow::StateChanged( StateChangedType nType ) |
| { |
| Window::StateChanged( nType ); |
| |
| if ( nType == STATE_CHANGE_ZOOM ) |
| { |
| const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); |
| |
| Font aFont = rStyleSettings.GetGroupFont(); |
| if ( IsControlFont() ) |
| aFont.Merge( GetControlFont() ); |
| SetZoomedPointFont( aFont ); |
| |
| m_aTitle.SetZoom(GetZoom()); |
| m_pListBox->SetZoom(GetZoom()); |
| Resize(); |
| Invalidate(); |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| Reference< XAccessible > OTableWindow::CreateAccessible() |
| { |
| OTableWindowAccess* pAccessible = new OTableWindowAccess(this); |
| m_pAccessible = pAccessible; |
| return pAccessible; |
| } |
| // ----------------------------------------------------------------------------- |
| void OTableWindow::Command(const CommandEvent& rEvt) |
| { |
| switch (rEvt.GetCommand()) |
| { |
| case COMMAND_CONTEXTMENU: |
| { |
| OJoinController& rController = getDesignView()->getController(); |
| if(!rController.isReadOnly() && rController.isConnected()) |
| { |
| Point ptWhere; |
| if ( rEvt.IsMouseEvent() ) |
| ptWhere = rEvt.GetMousePosPixel(); |
| else |
| { |
| SvLBoxEntry* pCurrent = m_pListBox->GetCurEntry(); |
| if ( pCurrent ) |
| ptWhere = m_pListBox->GetEntryPosition(pCurrent); |
| else |
| ptWhere = m_aTitle.GetPosPixel(); |
| } |
| |
| PopupMenu aContextMenu(ModuleRes(RID_MENU_JOINVIEW_TABLE)); |
| switch (aContextMenu.Execute(this, ptWhere)) |
| { |
| case SID_DELETE: |
| Remove(); |
| break; |
| } |
| } |
| break; |
| } |
| default: |
| Window::Command(rEvt); |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| long OTableWindow::PreNotify(NotifyEvent& rNEvt) |
| { |
| sal_Bool bHandled = sal_False; |
| switch (rNEvt.GetType()) |
| { |
| case EVENT_KEYINPUT: |
| { |
| if ( getDesignView()->getController().isReadOnly() ) |
| break; |
| |
| const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent(); |
| const KeyCode& rCode = pKeyEvent->GetKeyCode(); |
| if ( rCode.IsMod1() ) |
| { |
| Point aStartPoint = GetPosPixel(); |
| if ( rCode.IsShift() ) |
| { |
| aStartPoint.X() = GetSizePixel().Width(); |
| aStartPoint.Y() = GetSizePixel().Height(); |
| } |
| |
| switch( rCode.GetCode() ) |
| { |
| case KEY_DOWN: |
| bHandled = sal_True; |
| aStartPoint.Y() += m_nMoveIncrement; |
| break; |
| case KEY_UP: |
| bHandled = sal_True; |
| aStartPoint.Y() += -m_nMoveIncrement; |
| break; |
| case KEY_LEFT: |
| bHandled = sal_True; |
| aStartPoint.X() += -m_nMoveIncrement; |
| break; |
| case KEY_RIGHT: |
| bHandled = sal_True; |
| aStartPoint.X() += m_nMoveIncrement; |
| break; |
| } |
| if ( bHandled ) |
| { |
| if ( rCode.IsShift() ) |
| { |
| OJoinTableView* pView = getTableView(); |
| Point ptOld = GetPosPixel(); |
| Size aSize = pView->getRealOutputSize(); |
| Size aNewSize(aStartPoint.X(),aStartPoint.Y()); |
| if ( ((ptOld.X() + aNewSize.Width()) <= aSize.Width()) |
| && ((ptOld.Y() + aNewSize.Height()) <= aSize.Height()) ) |
| { |
| if ( aNewSize.Width() < TABWIN_WIDTH_MIN ) |
| aNewSize.Width() = TABWIN_WIDTH_MIN; |
| if ( aNewSize.Height() < TABWIN_HEIGHT_MIN ) |
| aNewSize.Height() = TABWIN_HEIGHT_MIN; |
| |
| Size szOld = GetSizePixel(); |
| |
| aNewSize = Size(pView->CalcZoom(aNewSize.Width()),pView->CalcZoom(aNewSize.Height())); |
| SetPosSizePixel( ptOld, aNewSize ); |
| pView->TabWinSized(this, ptOld, szOld); |
| Invalidate( INVALIDATE_NOCHILDREN ); |
| } |
| } |
| else |
| { |
| // remember how often the user moved our window |
| ++m_nMoveCount; |
| if( m_nMoveCount == 5 ) |
| m_nMoveIncrement = 10; |
| else if( m_nMoveCount > 15 ) |
| m_nMoveCount = m_nMoveIncrement = 20; |
| |
| Point aOldDataPoint = GetData()->GetPosition(); |
| Point aNewDataPoint = aStartPoint + getTableView()->GetScrollOffset(); |
| if ( aNewDataPoint.X() > -1 && aNewDataPoint.Y() > -1 ) |
| { |
| OJoinTableView* pView = getTableView(); |
| if ( pView->isMovementAllowed(aNewDataPoint, GetData()->GetSize()) ) |
| { |
| SetPosPixel(aStartPoint); |
| |
| // aNewDataPoint can not be used here because SetPosPixel reset it |
| pView->EnsureVisible(GetData()->GetPosition(), GetData()->GetSize()); |
| pView->TabWinMoved(this,aOldDataPoint); |
| Invalidate(INVALIDATE_NOCHILDREN); |
| getDesignView()->getController().setModified( sal_True ); |
| } |
| else |
| { |
| m_nMoveCount = 0; // reset our movement count |
| m_nMoveIncrement = 1; |
| } |
| } |
| else |
| { |
| m_nMoveCount = 0; // reset our movement count |
| m_nMoveIncrement = 1; |
| } |
| } |
| resetSizingFlag(); |
| } |
| else |
| { |
| m_nMoveCount = 0; // reset our movement count |
| m_nMoveIncrement = 1; |
| } |
| } |
| else |
| { |
| m_nMoveCount = 0; // reset our movement count |
| m_nMoveIncrement = 1; |
| } |
| } |
| break; |
| case EVENT_KEYUP: |
| { |
| const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent(); |
| const KeyCode& rCode = pKeyEvent->GetKeyCode(); |
| sal_uInt16 nKeyCode = rCode.GetCode(); |
| if ( rCode.IsMod2() && nKeyCode != KEY_UP && nKeyCode != KEY_DOWN && nKeyCode != KEY_LEFT && nKeyCode != KEY_RIGHT ) |
| { |
| m_nMoveCount = 0; // reset our movement count |
| m_nMoveIncrement = 1; |
| } |
| } |
| break; |
| } |
| if (!bHandled) |
| return Window::PreNotify(rNEvt); |
| return 1L; |
| } |
| // ----------------------------------------------------------------------------- |
| String OTableWindow::getTitle() const |
| { |
| return m_aTitle.GetText(); |
| } |
| // ----------------------------------------------------------------------------- |
| void OTableWindow::_elementInserted( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException) |
| { |
| FillListBox(); |
| } |
| // ----------------------------------------------------------------------------- |
| void OTableWindow::_elementRemoved( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException) |
| { |
| FillListBox(); |
| } |
| // ----------------------------------------------------------------------------- |
| void OTableWindow::_elementReplaced( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException) |
| { |
| FillListBox(); |
| } |
| // ----------------------------------------------------------------------------- |
| |