blob: e8eb01ba2e4727a7136df68a98b8614554d30984 [file] [log] [blame]
/**************************************************************
*
* 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 occured!");
}
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 occured!");
}
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();
}
// -----------------------------------------------------------------------------