2000-10-26 13:46:14 +00:00
/*************************************************************************
*
* $ RCSfile : exsrcbrw . cxx , v $
*
2001-04-03 13:16:03 +00:00
* $ Revision : 1.10 $
2000-10-26 13:46:14 +00:00
*
2001-04-03 13:16:03 +00:00
* last change : $ Author : fs $ $ Date : 2001 - 04 - 03 14 : 15 : 53 $
2000-10-26 13:46:14 +00:00
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc . , October , 2000
*
* GNU Lesser General Public License Version 2.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright 2000 by Sun Microsystems , Inc .
* 901 San Antonio Road , Palo Alto , CA 94303 , USA
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 , as published by the Free Software Foundation .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston ,
* MA 02111 - 1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 ( 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.openoffice.org/license.html.
*
* Software provided under this License is provided on an " AS IS " basis ,
* WITHOUT WARRANTY OF ANY KIND , EITHER EXPRESSED OR IMPLIED , INCLUDING ,
* WITHOUT LIMITATION , WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS ,
* MERCHANTABLE , FIT FOR A PARTICULAR PURPOSE , OR NON - INFRINGING .
* See the License for the specific provisions governing your rights and
* obligations concerning the Software .
*
* The Initial Developer of the Original Code is : Sun Microsystems , Inc .
*
* Copyright : 2000 by Sun Microsystems , Inc .
*
* All Rights Reserved .
*
* Contributor ( s ) : _______________________________________
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef _SBA_EXTCTRLR_HXX
# include "exsrcbrw.hxx"
# endif
# ifndef _COM_SUN_STAR_FORM_FORMCOMPONENTTYPE_HPP_
# include <com/sun/star/form/FormComponentType.hpp>
# endif
# ifndef _COM_SUN_STAR_UTIL_XURLTRANSFORMER_HPP_
# include <com/sun/star/util/XURLTransformer.hpp>
# endif
# ifndef _COM_SUN_STAR_FORM_XGRIDCOLUMNFACTORY_HPP_
# include <com/sun/star/form/XGridColumnFactory.hpp>
# endif
# ifndef _COM_SUN_STAR_FORM_XFORMCONTROLLER_HPP_
# include <com/sun/star/form/XFormController.hpp>
# endif
# ifndef _SBA_FORMADAPTER_HXX
# include "formadapter.hxx"
# endif
# ifndef _COMPHELPER_PROCESSFACTORY_HXX_
# include <comphelper/processfactory.hxx>
# endif
# ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
# include "dbustrings.hrc"
# endif
2000-12-15 14:54:12 +00:00
# ifndef _DBU_REGHELPER_HXX_
# include "dbu_reghelper.hxx"
2000-10-26 13:46:14 +00:00
# endif
using namespace : : com : : sun : : star : : uno ;
using namespace : : com : : sun : : star : : sdb ;
using namespace : : com : : sun : : star : : sdbc ;
using namespace : : com : : sun : : star : : sdbcx ;
using namespace : : com : : sun : : star : : beans ;
using namespace : : com : : sun : : star : : container ;
using namespace : : com : : sun : : star : : lang ;
using namespace dbaui ;
//==============================================================================
//= SbaExternalSourceBrowser
//==============================================================================
extern " C " void SAL_CALL createRegistryInfo_OFormGridView ( )
{
static OMultiInstanceAutoRegistration < SbaExternalSourceBrowser > aAutoRegistration ;
}
//------------------------------------------------------------------------------
Any SAL_CALL SbaExternalSourceBrowser : : queryInterface ( const Type & _rType ) throw ( RuntimeException )
{
Any aRet = SbaXDataBrowserController : : queryInterface ( _rType ) ;
if ( ! aRet . hasValue ( ) )
{
aRet = : : cppu : : queryInterface ( _rType ,
( : : com : : sun : : star : : util : : XModifyBroadcaster * ) this ,
( : : com : : sun : : star : : form : : XLoadListener * ) this ) ;
if ( ! aRet . hasValue ( ) )
aRet = m_xFormControllerImpl - > queryAggregation ( _rType ) ;
}
return aRet ;
}
//------------------------------------------------------------------------------
SbaExternalSourceBrowser : : SbaExternalSourceBrowser ( const Reference < : : com : : sun : : star : : lang : : XMultiServiceFactory > & _rM )
: SbaXDataBrowserController ( _rM )
, m_pDataSourceImpl ( NULL )
, m_aModifyListeners ( m_aPropertyMutex )
, m_bInQueryDispatch ( NULL )
{
// create the aggregated object
: : comphelper : : increment ( m_refCount ) ;
{
m_pFormControllerImpl = new FormControllerImpl ( this ) ;
m_xFormControllerImpl = m_pFormControllerImpl ;
m_xFormControllerImpl - > setDelegator ( * this ) ;
}
: : comphelper : : decrement ( m_refCount ) ;
}
//------------------------------------------------------------------------------
SbaExternalSourceBrowser : : ~ SbaExternalSourceBrowser ( )
{
// Freigeben der Aggregation
if ( m_xFormControllerImpl . is ( ) )
{
Reference < XInterface > xEmpty ;
m_xFormControllerImpl - > setDelegator ( xEmpty ) ;
}
}
//-------------------------------------------------------------------------
: : comphelper : : StringSequence SAL_CALL SbaExternalSourceBrowser : : getSupportedServiceNames ( ) throw ( RuntimeException )
{
return getSupportedServiceNames_Static ( ) ;
}
// -------------------------------------------------------------------------
: : rtl : : OUString SbaExternalSourceBrowser : : getImplementationName_Static ( ) throw ( RuntimeException )
{
2001-01-05 11:08:57 +00:00
return : : rtl : : OUString : : createFromAscii ( " org.openoffice.comp.dbu.OFormGridView " ) ;
2000-10-26 13:46:14 +00:00
}
//-------------------------------------------------------------------------
: : comphelper : : StringSequence SbaExternalSourceBrowser : : getSupportedServiceNames_Static ( ) throw ( RuntimeException )
{
: : comphelper : : StringSequence aSupported ( 1 ) ;
2001-01-05 11:08:57 +00:00
aSupported . getArray ( ) [ 0 ] = : : rtl : : OUString : : createFromAscii ( " com.sun.star.sdb.FormGridView " ) ;
2000-10-26 13:46:14 +00:00
return aSupported ;
}
//-------------------------------------------------------------------------
Reference < XInterface > SAL_CALL SbaExternalSourceBrowser : : Create ( const Reference < XMultiServiceFactory > & _rxFactory )
{
return * ( new SbaExternalSourceBrowser ( _rxFactory ) ) ;
}
//-------------------------------------------------------------------------
: : rtl : : OUString SAL_CALL SbaExternalSourceBrowser : : getImplementationName ( ) throw ( RuntimeException )
{
return getImplementationName_Static ( ) ;
}
//------------------------------------------------------------------------------
Reference < XRowSet > SbaExternalSourceBrowser : : CreateForm ( )
{
m_pDataSourceImpl = new SbaXFormAdapter ( ) ;
return m_pDataSourceImpl ;
}
//------------------------------------------------------------------------------
sal_Bool SbaExternalSourceBrowser : : InitializeForm ( const Reference < XRowSet > & xForm )
{
return sal_True ;
}
//------------------------------------------------------------------
sal_Bool SbaExternalSourceBrowser : : InitializeGridModel ( const Reference < : : com : : sun : : star : : form : : XFormComponent > & xGrid )
{
return sal_True ;
}
//------------------------------------------------------------------
sal_Bool SbaExternalSourceBrowser : : LoadForm ( )
{
// as we don't have a main form (yet), we have nothing to do
// we don't call FormLoaded, because this expects a working data source
return sal_True ;
}
//------------------------------------------------------------------
void SbaExternalSourceBrowser : : modified ( const : : com : : sun : : star : : lang : : EventObject & aEvent ) throw ( RuntimeException )
{
SbaXDataBrowserController : : modified ( aEvent ) ;
// multiplex this event to all my listeners
: : com : : sun : : star : : lang : : EventObject aEvt ( * this ) ;
: : cppu : : OInterfaceIteratorHelper aIt ( m_aModifyListeners ) ;
while ( aIt . hasMoreElements ( ) )
( ( : : com : : sun : : star : : util : : XModifyListener * ) aIt . next ( ) ) - > modified ( aEvt ) ;
}
// -----------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : attachFrame ( const Reference < : : com : : sun : : star : : frame : : XFrame > & xFrame ) throw ( RuntimeException )
{
Reference < : : com : : sun : : star : : frame : : XFrameActionListener > xAggListener ;
if ( m_xFormControllerImpl . is ( ) )
m_xFormControllerImpl - > queryAggregation ( : : getCppuType ( ( const Reference < : : com : : sun : : star : : frame : : XFrameActionListener > * ) 0 ) ) > > = xAggListener ;
// log off my aggregated object
if ( m_xCurrentFrame . is ( ) & & xAggListener . is ( ) )
m_xCurrentFrame - > removeFrameActionListener ( xAggListener ) ;
SbaXDataBrowserController : : attachFrame ( xFrame ) ;
// and log on to the new frame
if ( m_xCurrentFrame . is ( ) & & xAggListener . is ( ) )
m_xCurrentFrame - > addFrameActionListener ( xAggListener ) ;
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : dispatch ( const : : com : : sun : : star : : util : : URL & aURL , const Sequence < : : com : : sun : : star : : beans : : PropertyValue > & aArgs )
{
const : : com : : sun : : star : : beans : : PropertyValue * pArguments = aArgs . getConstArray ( ) ;
if ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/AddGridColumn " ) ) )
{
// search the argument describing the column to create
: : rtl : : OUString sControlType ;
2001-03-19 11:38:43 +00:00
sal_Int32 nControlPos = - 1 ;
2000-10-26 13:46:14 +00:00
Sequence < : : com : : sun : : star : : beans : : PropertyValue > aControlProps ;
for ( sal_uInt16 i = 0 ; i < aArgs . getLength ( ) ; + + i , + + pArguments )
{
if ( pArguments - > Name . equals ( : : rtl : : OUString : : createFromAscii ( " ColumnType " ) ) )
{
sal_Bool bCorrectType = pArguments - > Value . getValueType ( ) . equals ( : : getCppuType ( ( const : : rtl : : OUString * ) 0 ) ) ;
2001-03-23 12:33:59 +00:00
OSL_ENSURE ( bCorrectType , " invalid type for argument \" ColumnType \" ! " ) ;
2000-10-26 13:46:14 +00:00
if ( bCorrectType )
sControlType = : : comphelper : : getString ( pArguments - > Value ) ;
}
else if ( pArguments - > Name . equals ( : : rtl : : OUString : : createFromAscii ( " ColumnPosition " ) ) )
{
sal_Bool bCorrectType = pArguments - > Value . getValueType ( ) . equals ( : : getCppuType ( ( const sal_Int16 * ) 0 ) ) ;
2001-03-23 12:33:59 +00:00
OSL_ENSURE ( bCorrectType , " invalid type for argument \" ColumnPosition \" ! " ) ;
2000-10-26 13:46:14 +00:00
if ( bCorrectType )
nControlPos = : : comphelper : : getINT16 ( pArguments - > Value ) ;
}
else if ( pArguments - > Name . equals ( : : rtl : : OUString : : createFromAscii ( " ColumnProperties " ) ) )
{
sal_Bool bCorrectType = pArguments - > Value . getValueType ( ) . equals ( : : getCppuType ( ( const Sequence < : : com : : sun : : star : : beans : : PropertyValue > * ) 0 ) ) ;
2001-03-23 12:33:59 +00:00
OSL_ENSURE ( bCorrectType , " invalid type for argument \" ColumnProperties \" ! " ) ;
2000-10-26 13:46:14 +00:00
if ( bCorrectType )
aControlProps = * ( Sequence < : : com : : sun : : star : : beans : : PropertyValue > * ) pArguments - > Value . getValue ( ) ;
}
else
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , ( ( ByteString ( " SbaExternalSourceBrowser::dispatch(AddGridColumn) : unknown argument ( " ) + = ByteString ( ( const sal_Unicode * ) pArguments - > Name , gsl_getSystemTextEncoding ( ) ) . GetBuffer ( ) ) + = " ) ! " ) . GetBuffer ( ) ) ;
2000-10-26 13:46:14 +00:00
}
if ( ! sControlType . getLength ( ) )
{
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , " SbaExternalSourceBrowser::dispatch(AddGridColumn) : missing argument (ColumnType) ! " ) ;
2000-10-26 13:46:14 +00:00
sControlType = : : rtl : : OUString : : createFromAscii ( " TextField " ) ;
}
2001-03-23 12:33:59 +00:00
OSL_ENSURE ( aControlProps . getLength ( ) , " SbaExternalSourceBrowser::dispatch(AddGridColumn) : missing argument (ColumnProperties) ! " ) ;
2000-10-26 13:46:14 +00:00
// create the col
Reference < : : com : : sun : : star : : form : : XGridColumnFactory > xColFactory ( getControlModel ( ) , UNO_QUERY ) ;
Reference < : : com : : sun : : star : : beans : : XPropertySet > xNewCol = xColFactory - > createColumn ( sControlType ) ;
// set it's properties
const : : com : : sun : : star : : beans : : PropertyValue * pControlProps = aControlProps . getConstArray ( ) ;
for ( i = 0 ; i < aControlProps . getLength ( ) ; + + i , + + pControlProps )
{
try
{
xNewCol - > setPropertyValue ( pControlProps - > Name , pControlProps - > Value ) ;
}
2001-03-19 11:38:43 +00:00
catch ( Exception & )
2000-10-26 13:46:14 +00:00
{
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , " SbaExternalSourceBrowser::dispatch : could not set a column property (maybe you forgot a READONLY attribute for a dispatch-argument ?) ! " ) ;
2000-10-26 13:46:14 +00:00
}
}
// correct the position
Reference < : : com : : sun : : star : : container : : XIndexContainer > xColContainer ( getControlModel ( ) , UNO_QUERY ) ;
if ( nControlPos > xColContainer - > getCount ( ) )
nControlPos = xColContainer - > getCount ( ) ;
if ( nControlPos < 0 )
nControlPos = 0 ;
// append the column
xColContainer - > insertByIndex ( nControlPos , makeAny ( xNewCol ) ) ;
}
else if ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/ClearView " ) ) )
{
ClearView ( ) ;
}
else if ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/AttachToForm " ) ) )
{
if ( ! m_pDataSourceImpl )
return ;
Reference < XRowSet > xMasterForm ;
// search the arguments for he master form
for ( sal_uInt16 i = 0 ; i < aArgs . getLength ( ) ; + + i , + + pArguments )
{
if ( ( pArguments - > Name . equals ( : : rtl : : OUString : : createFromAscii ( " MasterForm " ) ) ) & & ( pArguments - > Value . getValueTypeClass ( ) = = TypeClass_INTERFACE ) )
{
xMasterForm = Reference < XRowSet > ( * ( Reference < XInterface > * ) pArguments - > Value . getValue ( ) , UNO_QUERY ) ;
break ;
}
}
if ( ! xMasterForm . is ( ) )
{
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , " SbaExternalSourceBrowser::dispatch(FormSlots/AttachToForm) : please specify a form to attach to as argument ! " ) ;
2000-10-26 13:46:14 +00:00
return ;
}
Attach ( xMasterForm ) ;
}
else
SbaXDataBrowserController : : dispatch ( aURL , aArgs ) ;
}
//------------------------------------------------------------------
Reference < : : com : : sun : : star : : frame : : XDispatch > SAL_CALL SbaExternalSourceBrowser : : queryDispatch ( const : : com : : sun : : star : : util : : URL & aURL , const : : rtl : : OUString & aTargetFrameName , sal_Int32 nSearchFlags ) throw ( RuntimeException )
{
Reference < : : com : : sun : : star : : frame : : XDispatch > xReturn ;
if ( m_bInQueryDispatch )
return xReturn ;
m_bInQueryDispatch = sal_True ;
if ( ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/AttachToForm " ) ) )
// attach a new external form
| | ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/AddGridColumn " ) ) )
// add a column to the grid
| | ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/ClearView " ) ) )
// clear the grid
)
xReturn = ( : : com : : sun : : star : : frame : : XDispatch * ) this ;
if ( ! xReturn . is ( )
& & ( ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/moveToFirst " ) ) )
| | ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/moveToPrev " ) ) )
| | ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/moveToNext " ) ) )
| | ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/moveToLast " ) ) )
| | ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/moveToNew " ) ) )
| | ( aURL . Complete . equals ( : : rtl : : OUString : : createFromAscii ( " .uno:FormSlots/undoRecord " ) ) )
)
)
{
2001-03-23 12:33:59 +00:00
OSL_ENSURE ( aURL . Mark . len ( ) = = 0 , " SbaExternalSourceBrowser::queryDispatch : the ::com::sun::star::util::URL shouldn't have a mark ! " ) ;
2000-10-26 13:46:14 +00:00
: : com : : sun : : star : : util : : URL aNewUrl = aURL ;
// split the ::com::sun::star::util::URL
2001-01-05 11:08:57 +00:00
Reference < : : com : : sun : : star : : util : : XURLTransformer > xTransformer ( : : comphelper : : getProcessServiceFactory ( ) - > createInstance ( : : rtl : : OUString : : createFromAscii ( " com.sun.star.util.URLTransformer " ) ) , UNO_QUERY ) ;
2001-03-23 12:33:59 +00:00
OSL_ENSURE ( xTransformer . is ( ) , " SbaExternalSourceBrowser::queryDispatch : could not create an URLTransformer ! " ) ;
2000-10-26 13:46:14 +00:00
if ( xTransformer . is ( ) )
xTransformer - > parseStrict ( aNewUrl ) ;
// set a new mark
aNewUrl . Mark = : : rtl : : OUString : : createFromAscii ( " DB/FormGridView " ) ;
// this controller is instantiated when somebody dispatches the ".component:DB/FormGridView" in any
// frame, so we use "FormGridView" as mark that a dispatch request came from this view
if ( xTransformer . is ( ) )
xTransformer - > assemble ( aNewUrl ) ;
Reference < : : com : : sun : : star : : frame : : XDispatchProvider > xFrameDispatcher ( m_xCurrentFrame , UNO_QUERY ) ;
if ( xFrameDispatcher . is ( ) )
xReturn = xFrameDispatcher - > queryDispatch ( aNewUrl , aTargetFrameName , nSearchFlags ) ;
# if SUPD<=548 && !PRIV_DEBUG
xReturn = NULL ;
// in version 548 the dispatch interception and the task-local beamer will work ... me hopes
# endif
}
if ( ! xReturn . is ( ) )
xReturn = SbaXDataBrowserController : : queryDispatch ( aURL , aTargetFrameName , nSearchFlags ) ;
m_bInQueryDispatch = sal_False ;
return xReturn ;
}
//------------------------------------------------------------------
2001-03-01 14:17:55 +00:00
void SAL_CALL SbaExternalSourceBrowser : : disposing ( )
2000-10-26 13:46:14 +00:00
{
// say our modify listeners goodbye
: : com : : sun : : star : : lang : : EventObject aEvt ;
aEvt . Source = ( XWeak * ) this ;
m_aModifyListeners . disposeAndClear ( aEvt ) ;
stopListening ( ) ;
if ( m_xFormControllerImpl . is ( ) )
{
Reference < : : com : : sun : : star : : lang : : XComponent > xAggComp ;
m_xFormControllerImpl - > queryAggregation ( : : getCppuType ( ( const Reference < : : com : : sun : : star : : lang : : XComponent > * ) 0 ) ) > > = xAggComp ;
if ( xAggComp . is ( ) )
xAggComp - > dispose ( ) ;
}
// our aggregated object doesn't handle its frame action listening itself, so we have to log it off
Reference < : : com : : sun : : star : : frame : : XFrameActionListener > xAggListener ;
if ( m_xFormControllerImpl . is ( ) )
{
m_xFormControllerImpl - > queryAggregation ( : : getCppuType ( ( const Reference < : : com : : sun : : star : : frame : : XFrameActionListener > * ) 0 ) ) > > = xAggListener ;
m_xCurrentFrame - > removeFrameActionListener ( xAggListener ) ;
}
2001-03-01 14:17:55 +00:00
SbaXDataBrowserController : : disposing ( ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : addModifyListener ( const Reference < : : com : : sun : : star : : util : : XModifyListener > & aListener ) throw ( RuntimeException )
{
m_aModifyListeners . addInterface ( aListener ) ;
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : removeModifyListener ( const Reference < : : com : : sun : : star : : util : : XModifyListener > & aListener ) throw ( RuntimeException )
{
m_aModifyListeners . removeInterface ( aListener ) ;
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : unloading ( const : : com : : sun : : star : : lang : : EventObject & aEvent ) throw ( RuntimeException )
{
if ( m_pDataSourceImpl & & ( m_pDataSourceImpl - > getAttachedForm ( ) = = aEvent . Source ) )
{
ClearView ( ) ;
}
SbaXDataBrowserController : : unloading ( aEvent ) ;
}
//------------------------------------------------------------------
void SbaExternalSourceBrowser : : Attach ( const Reference < XRowSet > & xMaster )
{
// switch the control to design mode
2001-01-09 14:52:33 +00:00
if ( getBrowserView ( ) & & getBrowserView ( ) - > getGridControl ( ) . is ( ) )
getBrowserView ( ) - > getGridControl ( ) - > setDesignMode ( sal_True ) ;
2000-10-26 13:46:14 +00:00
// the grid will move the form's cursor to the first record, but we want the form to remain unchanged
Any aOldPos ;
2001-03-01 10:06:16 +00:00
// restore the old position
sal_Bool bBeforeFirst = sal_True ;
sal_Bool bAfterLast = sal_True ;
Reference < : : com : : sun : : star : : sdbc : : XResultSet > xResultSet ( xMaster , UNO_QUERY ) ;
2000-10-26 13:46:14 +00:00
Reference < : : com : : sun : : star : : sdbcx : : XRowLocate > xCursor ( xMaster , UNO_QUERY ) ;
2001-03-01 10:06:16 +00:00
if ( xCursor . is ( ) & & xResultSet . is ( ) )
{
bBeforeFirst = xResultSet - > isBeforeFirst ( ) ;
bAfterLast = xResultSet - > isBeforeFirst ( ) ;
if ( ! bBeforeFirst & & ! bAfterLast )
aOldPos = xCursor - > getBookmark ( ) ;
}
2000-10-26 13:46:14 +00:00
sal_Bool bWasInsertRow = sal_False ;
Reference < : : com : : sun : : star : : beans : : XPropertySet > xMasterProps ( xMaster , UNO_QUERY ) ;
if ( xMasterProps . is ( ) )
{
try { bWasInsertRow = : : comphelper : : getBOOL ( xMasterProps - > getPropertyValue ( PROPERTY_ISNEW ) ) ; }
2001-03-19 11:38:43 +00:00
catch ( Exception & )
{ }
2000-10-26 13:46:14 +00:00
}
stopListening ( ) ;
m_pDataSourceImpl - > AttachForm ( xMaster ) ;
startListening ( ) ;
if ( xMaster . is ( ) )
{
2000-11-03 13:44:21 +00:00
// at this point we have to reset the formatter for the new form
initFormatter ( ) ;
2000-10-26 13:46:14 +00:00
// assume that the master form is already loaded, we have no chance to check this
m_bLoadCanceled = sal_False ;
FormLoaded ( sal_True ) ;
Reference < XResultSetUpdate > xUpdate ( xMaster , UNO_QUERY ) ;
try
{
if ( bWasInsertRow & & xUpdate . is ( ) )
xUpdate - > moveToInsertRow ( ) ;
else if ( xCursor . is ( ) & & aOldPos . hasValue ( ) )
xCursor - > moveToBookmark ( aOldPos ) ;
2001-03-01 10:06:16 +00:00
else if ( bBeforeFirst & & xResultSet . is ( ) )
xResultSet - > beforeFirst ( ) ;
else if ( bAfterLast & & xResultSet . is ( ) )
xResultSet - > afterLast ( ) ;
2000-10-26 13:46:14 +00:00
}
2001-03-01 10:06:16 +00:00
catch ( Exception & )
2000-10-26 13:46:14 +00:00
{
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , " SbaExternalSourceBrowser::Attach : couldn't restore the cursor position ! " ) ;
2000-10-26 13:46:14 +00:00
}
}
}
//------------------------------------------------------------------
void SbaExternalSourceBrowser : : ClearView ( )
{
// set a new (empty) datasource
Attach ( Reference < XRowSet > ( ) ) ;
// clear all cols in the grid
Reference < : : com : : sun : : star : : container : : XIndexContainer > xColContainer ( getControlModel ( ) , UNO_QUERY ) ;
while ( xColContainer - > getCount ( ) > 0 )
xColContainer - > removeByIndex ( 0 ) ;
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : disposing ( const : : com : : sun : : star : : lang : : EventObject & Source ) throw ( RuntimeException )
{
if ( m_pDataSourceImpl & & ( m_pDataSourceImpl - > getAttachedForm ( ) = = Source . Source ) )
{
ClearView ( ) ;
}
if ( m_xFormControllerImpl ! = Source . Source )
{ // forward the event to my aggregate (if it isn't the source itself)
Reference < : : com : : sun : : star : : lang : : XEventListener > xAggListener ;
m_xFormControllerImpl - > queryAggregation ( : : getCppuType ( ( const Reference < : : com : : sun : : star : : lang : : XEventListener > * ) 0 ) ) > > = xAggListener ;
if ( xAggListener . is ( ) )
xAggListener - > disposing ( Source ) ;
}
// the frame
if ( Source . Source = = m_xCurrentFrame )
{
// our aggregated object doesn't handle its frame action listening itself, so we have to log it off
Reference < : : com : : sun : : star : : frame : : XFrameActionListener > xAggListener ;
if ( m_xFormControllerImpl . is ( ) )
{
m_xFormControllerImpl - > queryAggregation ( : : getCppuType ( ( const Reference < : : com : : sun : : star : : frame : : XFrameActionListener > * ) 0 ) ) > > = xAggListener ;
m_xCurrentFrame - > removeFrameActionListener ( xAggListener ) ;
}
}
2001-01-09 14:52:33 +00:00
SbaXDataBrowserController : : disposing ( Source ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
void SbaExternalSourceBrowser : : addControlListeners ( const Reference < : : com : : sun : : star : : awt : : XControl > & _xGridControl )
{
SbaXDataBrowserController : : addControlListeners ( _xGridControl ) ;
Reference < : : com : : sun : : star : : awt : : XWindow > xWindow ( _xGridControl , UNO_QUERY ) ;
if ( xWindow . is ( ) )
xWindow - > addFocusListener ( this ) ;
}
//------------------------------------------------------------------
void SbaExternalSourceBrowser : : removeControlListeners ( const Reference < : : com : : sun : : star : : awt : : XControl > & _xGridControl )
{
SbaXDataBrowserController : : removeControlListeners ( _xGridControl ) ;
Reference < : : com : : sun : : star : : awt : : XWindow > xWindow ( _xGridControl , UNO_QUERY ) ;
if ( xWindow . is ( ) )
xWindow - > removeFocusListener ( this ) ;
}
//------------------------------------------------------------------
void SbaExternalSourceBrowser : : startListening ( )
{
if ( m_pDataSourceImpl & & m_pDataSourceImpl - > getAttachedForm ( ) . is ( ) )
{
Reference < : : com : : sun : : star : : form : : XLoadable > xLoadable ( m_pDataSourceImpl - > getAttachedForm ( ) , UNO_QUERY ) ;
xLoadable - > addLoadListener ( ( : : com : : sun : : star : : form : : XLoadListener * ) this ) ;
}
}
//------------------------------------------------------------------
void SbaExternalSourceBrowser : : stopListening ( )
{
if ( m_pDataSourceImpl & & m_pDataSourceImpl - > getAttachedForm ( ) . is ( ) )
{
Reference < : : com : : sun : : star : : form : : XLoadable > xLoadable ( m_pDataSourceImpl - > getAttachedForm ( ) , UNO_QUERY ) ;
xLoadable - > removeLoadListener ( ( : : com : : sun : : star : : form : : XLoadListener * ) this ) ;
}
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : focusGained ( const : : com : : sun : : star : : awt : : FocusEvent & e ) throw ( RuntimeException )
{
: : com : : sun : : star : : lang : : EventObject aEvt ( * this ) ;
: : cppu : : OInterfaceIteratorHelper aIter ( m_pFormControllerImpl - > m_aActivateListeners ) ;
while ( aIter . hasMoreElements ( ) )
( ( : : com : : sun : : star : : form : : XFormControllerListener * ) aIter . next ( ) ) - > formActivated ( aEvt ) ;
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : focusLost ( const : : com : : sun : : star : : awt : : FocusEvent & e ) throw ( RuntimeException )
{
2001-01-09 14:52:33 +00:00
if ( ! getBrowserView ( ) | | ! getBrowserView ( ) - > getGridControl ( ) . is ( ) )
2000-10-26 13:46:14 +00:00
return ;
2001-01-09 14:52:33 +00:00
Reference < : : com : : sun : : star : : awt : : XVclWindowPeer > xMyGridPeer ( getBrowserView ( ) - > getGridControl ( ) - > getPeer ( ) , UNO_QUERY ) ;
2000-10-26 13:46:14 +00:00
if ( ! xMyGridPeer . is ( ) )
return ;
Reference < : : com : : sun : : star : : awt : : XWindowPeer > xNextControlPeer ( e . NextFocus , UNO_QUERY ) ;
if ( ! xNextControlPeer . is ( ) )
return ;
if ( xMyGridPeer - > isChild ( xNextControlPeer ) )
return ;
if ( xMyGridPeer = = xNextControlPeer )
return ;
: : com : : sun : : star : : lang : : EventObject aEvt ( * this ) ;
: : cppu : : OInterfaceIteratorHelper aIter ( m_pFormControllerImpl - > m_aActivateListeners ) ;
while ( aIter . hasMoreElements ( ) )
( ( : : com : : sun : : star : : form : : XFormControllerListener * ) aIter . next ( ) ) - > formDeactivated ( aEvt ) ;
// commit the changes of the grid control (as we're deactivated)
2001-01-09 14:52:33 +00:00
Reference < : : com : : sun : : star : : form : : XBoundComponent > xCommitable ( getBrowserView ( ) - > getGridControl ( ) , UNO_QUERY ) ;
2000-10-26 13:46:14 +00:00
if ( xCommitable . is ( ) )
xCommitable - > commit ( ) ;
else
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , " SbaExternalSourceBrowser::focusLost : why is my control not commitable ? " ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
sal_uInt16 SbaExternalSourceBrowser : : SaveData ( sal_Bool bUI , sal_Bool bForBrowsing )
{
if ( m_bSuspending )
// don't ask the user if we're beeing suspended currently
// this is the responsibility of our owner, as we are only an external view to an existing form
// 73384 - 22.02.00 - FS
return ( sal_uInt16 ) sal_True ;
return SbaXDataBrowserController : : SaveData ( bUI , bForBrowsing ) ;
}
//==================================================================
//==================================================================
//------------------------------------------------------------------
SbaExternalSourceBrowser : : FormControllerImpl : : FormControllerImpl ( SbaExternalSourceBrowser * m_pOwner )
: m_pOwner ( m_pOwner )
, m_bActive ( sal_False )
, m_aActivateListeners ( m_pOwner - > m_aPropertyMutex )
{
2001-03-23 12:33:59 +00:00
OSL_ENSURE ( m_pOwner , " SbaExternalSourceBrowser::FormControllerImpl::FormControllerImpl : invalid Owner ! " ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
SbaExternalSourceBrowser : : FormControllerImpl : : ~ FormControllerImpl ( )
{
}
//------------------------------------------------------------------
Reference < : : com : : sun : : star : : awt : : XControl > SbaExternalSourceBrowser : : FormControllerImpl : : getCurrentControl ( void ) throw ( RuntimeException )
{
2001-01-09 14:52:33 +00:00
return m_pOwner - > getBrowserView ( ) ? m_pOwner - > getBrowserView ( ) - > getGridControl ( ) : Reference < : : com : : sun : : star : : awt : : XControl > ( ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : addActivateListener ( const Reference < : : com : : sun : : star : : form : : XFormControllerListener > & l ) throw ( RuntimeException )
{
m_aActivateListeners . addInterface ( l ) ;
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : removeActivateListener ( const Reference < : : com : : sun : : star : : form : : XFormControllerListener > & l ) throw ( RuntimeException )
{
m_aActivateListeners . removeInterface ( l ) ;
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : setModel ( const Reference < : : com : : sun : : star : : awt : : XTabControllerModel > & Model ) throw ( RuntimeException )
{
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , " SbaExternalSourceBrowser::FormControllerImpl::setModel : invalid call, can't change my model ! " ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
Reference < : : com : : sun : : star : : awt : : XTabControllerModel > SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : getModel ( void ) throw ( RuntimeException )
{
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , " SbaExternalSourceBrowser::FormControllerImpl::getModel : don't (and won't) have a model ! " ) ;
2000-10-26 13:46:14 +00:00
if ( m_pOwner - > m_pDataSourceImpl )
return Reference < : : com : : sun : : star : : awt : : XTabControllerModel > ( ( Reference < XInterface > ) * m_pOwner - > m_pDataSourceImpl , UNO_QUERY ) ;
return Reference < : : com : : sun : : star : : awt : : XTabControllerModel > ( ) ;
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : setContainer ( const Reference < : : com : : sun : : star : : awt : : XControlContainer > & _Container ) throw ( RuntimeException )
{
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , " SbaExternalSourceBrowser::FormControllerImpl::setContainer : invalid call, can't change my container ! " ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
Reference < : : com : : sun : : star : : awt : : XControlContainer > SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : getContainer ( void ) throw ( RuntimeException )
{
2001-01-09 14:52:33 +00:00
if ( m_pOwner - > getBrowserView ( ) )
return m_pOwner - > getBrowserView ( ) - > getContainer ( ) ;
2000-10-26 13:46:14 +00:00
return Reference < : : com : : sun : : star : : awt : : XControlContainer > ( ) ;
}
//------------------------------------------------------------------
Sequence < Reference < : : com : : sun : : star : : awt : : XControl > > SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : getControls ( void ) throw ( RuntimeException )
{
2001-01-09 14:52:33 +00:00
if ( m_pOwner - > getBrowserView ( ) )
2000-10-26 13:46:14 +00:00
{
2001-01-09 14:52:33 +00:00
Reference < : : com : : sun : : star : : awt : : XControl > xGrid = m_pOwner - > getBrowserView ( ) - > getGridControl ( ) ;
2000-10-26 13:46:14 +00:00
return Sequence < Reference < : : com : : sun : : star : : awt : : XControl > > ( & xGrid , 1 ) ;
}
return Sequence < Reference < : : com : : sun : : star : : awt : : XControl > > ( ) ;
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : autoTabOrder ( void ) throw ( RuntimeException )
{
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , " SbaExternalSourceBrowser::FormControllerImpl::autoTabOrder : nothing to do (always have only one control) ! " ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : activateTabOrder ( void ) throw ( RuntimeException )
{
2001-04-03 13:16:03 +00:00
OSL_ENSURE ( sal_False , " SbaExternalSourceBrowser::FormControllerImpl::activateTabOrder : nothing to do (always have only one control) ! " ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : activateFirst ( void ) throw ( RuntimeException )
{
2001-01-09 14:52:33 +00:00
if ( m_pOwner - > getBrowserView ( ) )
m_pOwner - > getBrowserView ( ) - > getVclControl ( ) - > ActivateCell ( ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : activateLast ( void ) throw ( RuntimeException )
{
2001-01-09 14:52:33 +00:00
if ( m_pOwner - > getBrowserView ( ) )
m_pOwner - > getBrowserView ( ) - > getVclControl ( ) - > ActivateCell ( ) ;
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : frameAction ( const : : com : : sun : : star : : frame : : FrameActionEvent & aEvent ) throw ( RuntimeException )
{
2001-03-23 12:33:59 +00:00
OSL_ENSURE ( aEvent . Source = = m_pOwner - > m_xCurrentFrame , " SbaExternalSourceBrowser::FormControllerImpl::frameAction : where did this come frome ? " ) ;
2000-10-26 13:46:14 +00:00
: : com : : sun : : star : : lang : : EventObject aEvt ( * m_pOwner ) ;
: : cppu : : OInterfaceIteratorHelper aIter ( m_aActivateListeners ) ;
switch ( aEvent . Action )
{
case : : com : : sun : : star : : frame : : FrameAction_FRAME_ACTIVATED :
// as the frame sends more ACTIVATED than DEACTIVATING events we check this with our own flag, so the listeners
// will be notified only when the first activation occurs
// if (!m_bActive)
// TODO : when de DEACTIVATED-event is implemented (MBA) reinsert this line
// {
// while (aIter.hasMoreElements())
// ((::com::sun::star::form::XFormControllerListener*)aIter.next())->formActivated(aEvt);
// }
// m_bActive = sal_True;
break ;
case : : com : : sun : : star : : frame : : FrameAction_FRAME_DEACTIVATING :
// while (aIter.hasMoreElements())
// ((::com::sun::star::form::XFormControllerListener*)aIter.next())->formDeactivated(aEvt);
// m_bActive = sal_False;
break ;
}
}
//------------------------------------------------------------------
void SAL_CALL SbaExternalSourceBrowser : : FormControllerImpl : : disposing ( const : : com : : sun : : star : : lang : : EventObject & Source ) throw ( RuntimeException )
{
// nothing to do
// we don't add ourself as listener to any broadcasters, so we are not resposible for removing us
}