summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Schoenheit [fs] <frank.schoenheit@sun.com>2010-09-17 08:38:54 +0200
committerFrank Schoenheit [fs] <frank.schoenheit@sun.com>2010-09-17 08:38:54 +0200
commit432c3c2d8c170c6249b452b9beec57561e90a4f5 (patch)
treeaa378ff76920d89119c1b52738a4b230a5638500
parent6631aae54e580f52e745ac2ccc07c06c385606bb (diff)
dba34a: #i114403# fixed the form-based filter for list boxes
-rw-r--r--svx/source/form/formcontroller.cxx100
-rw-r--r--svx/source/inc/formcontroller.hxx3
2 files changed, 64 insertions, 39 deletions
diff --git a/svx/source/form/formcontroller.cxx b/svx/source/form/formcontroller.cxx
index b8292785b457..b2c79c9cd9bc 100644
--- a/svx/source/form/formcontroller.cxx
+++ b/svx/source/form/formcontroller.cxx
@@ -62,6 +62,7 @@
#include <com/sun/star/sdb/RowChangeAction.hpp>
#include <com/sun/star/sdb/XInteractionSupplyParameters.hpp>
#include <com/sun/star/sdbc/ColumnValue.hpp>
+#include <com/sun/star/sdbc/DataType.hpp>
#include <com/sun/star/util/XURLTransformer.hpp>
#include <com/sun/star/form/runtime/FormOperations.hpp>
#include <com/sun/star/form/runtime/FormFeature.hpp>
@@ -80,6 +81,7 @@
#include <comphelper/property.hxx>
#include <comphelper/sequence.hxx>
#include <comphelper/uno3.hxx>
+#include <comphelper/scopeguard.hxx>
#include <cppuhelper/queryinterface.hxx>
#include <cppuhelper/typeprovider.hxx>
#include <toolkit/controls/unocontrol.hxx>
@@ -208,6 +210,7 @@ namespace svxform
namespace FocusChangeReason = ::com::sun::star::awt::FocusChangeReason;
namespace RowChangeAction = ::com::sun::star::sdb::RowChangeAction;
namespace FormFeature = ::com::sun::star::form::runtime::FormFeature;
+ namespace DataType = ::com::sun::star::sdbc::DataType;
//==============================================================================
// ColumnInfo
@@ -583,6 +586,7 @@ FormController::FormController(const Reference< XMultiServiceFactory > & _rxORB
,m_bAttachEvents(sal_True)
,m_bDetachEvents(sal_True)
,m_bAttemptedHandlerCreation( false )
+ ,m_bSuspendFilterTextListening( false )
{
DBG_CTOR( FormController, NULL );
@@ -782,6 +786,9 @@ namespace
// -----------------------------------------------------------------------------
void FormController::impl_setTextOnAllFilter_throw()
{
+ m_bSuspendFilterTextListening = true;
+ ::comphelper::FlagGuard aResetFlag( m_bSuspendFilterTextListening );
+
// reset the text for all controls
::std::for_each( m_aFilterComponents.begin(), m_aFilterComponents.end(), ResetComponentText() );
@@ -868,10 +875,23 @@ void FormController::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) cons
if ( condition != rRow.begin() )
aFilter.appendAscii( " AND " );
- ::rtl::OUString sFilterValue( condition->second );
+ sal_Int32 nDataType = DataType::OTHER;
+ OSL_VERIFY( xField->getPropertyValue( FM_PROP_FIELDTYPE ) >>= nDataType );
+ const bool isTextColumn = ( ( nDataType == DataType::CHAR )
+ || ( nDataType == DataType::VARCHAR )
+ || ( nDataType == DataType::LONGVARCHAR )
+ );
+
+ ::rtl::OUStringBuffer aPredicateValue;
+ if ( isTextColumn )
+ aPredicateValue.append( sal_Unicode( '\'' ) );
+ aPredicateValue.append( condition->second );
+ if ( isTextColumn )
+ aPredicateValue.append( sal_Unicode( '\'' ) );
::rtl::OUString sErrorMsg, sCriteria;
- ::rtl::Reference< ISQLParseNode > xParseNode = predicateTree( sErrorMsg, sFilterValue, xFormatter, xField );
+ const ::rtl::Reference< ISQLParseNode > xParseNode =
+ predicateTree( sErrorMsg, aPredicateValue.makeStringAndClear(), xFormatter, xField );
OSL_ENSURE( xParseNode.is(), "FormController::getFastPropertyValue: could not parse the field value predicate!" );
if ( xParseNode.is() )
{
@@ -1494,50 +1514,54 @@ void SAL_CALL FormController::textChanged(const TextEvent& e) throw( RuntimeExce
// SYNCHRONIZED -->
::osl::ClearableMutexGuard aGuard( m_aMutex );
OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" );
- if (m_bFiltering)
+ if ( !m_bFiltering )
{
- Reference< XTextComponent > xText(e.Source,UNO_QUERY);
- ::rtl::OUString aText = xText->getText();
-
- if ( m_aFilterRows.empty() )
- appendEmptyDisjunctiveTerm();
+ impl_onModify();
+ return;
+ }
- // Suchen der aktuellen Row
- if ( ( (size_t)m_nCurrentFilterPosition >= m_aFilterRows.size() ) || ( m_nCurrentFilterPosition < 0 ) )
- {
- OSL_ENSURE( false, "FormController::textChanged: m_nCurrentFilterPosition is wrong!" );
- return;
- }
+ if ( m_bSuspendFilterTextListening )
+ return;
- FmFilterRow& rRow = m_aFilterRows[ m_nCurrentFilterPosition ];
+ Reference< XTextComponent > xText(e.Source,UNO_QUERY);
+ ::rtl::OUString aText = xText->getText();
- // do we have a new filter
- if (aText.getLength())
- rRow[xText] = aText;
- else
- {
- // do we have the control in the row
- FmFilterRow::iterator iter = rRow.find(xText);
- // erase the entry out of the row
- if (iter != rRow.end())
- rRow.erase(iter);
- }
+ if ( m_aFilterRows.empty() )
+ appendEmptyDisjunctiveTerm();
- // multiplex the event to our FilterControllerListeners
- FilterEvent aEvent;
- aEvent.Source = *this;
- aEvent.FilterComponent = ::std::find( m_aFilterComponents.begin(), m_aFilterComponents.end(), xText ) - m_aFilterComponents.begin();
- aEvent.DisjunctiveTerm = getActiveTerm();
- aEvent.PredicateExpression = aText;
+ // Suchen der aktuellen Row
+ if ( ( (size_t)m_nCurrentFilterPosition >= m_aFilterRows.size() ) || ( m_nCurrentFilterPosition < 0 ) )
+ {
+ OSL_ENSURE( false, "FormController::textChanged: m_nCurrentFilterPosition is wrong!" );
+ return;
+ }
- aGuard.clear();
- // <-- SYNCHRONIZED
+ FmFilterRow& rRow = m_aFilterRows[ m_nCurrentFilterPosition ];
- // notify the changed filter expression
- m_aFilterListeners.notifyEach( &XFilterControllerListener::predicateExpressionChanged, aEvent );
- }
+ // do we have a new filter
+ if (aText.getLength())
+ rRow[xText] = aText;
else
- impl_onModify();
+ {
+ // do we have the control in the row
+ FmFilterRow::iterator iter = rRow.find(xText);
+ // erase the entry out of the row
+ if (iter != rRow.end())
+ rRow.erase(iter);
+ }
+
+ // multiplex the event to our FilterControllerListeners
+ FilterEvent aEvent;
+ aEvent.Source = *this;
+ aEvent.FilterComponent = ::std::find( m_aFilterComponents.begin(), m_aFilterComponents.end(), xText ) - m_aFilterComponents.begin();
+ aEvent.DisjunctiveTerm = getActiveTerm();
+ aEvent.PredicateExpression = aText;
+
+ aGuard.clear();
+ // <-- SYNCHRONIZED
+
+ // notify the changed filter expression
+ m_aFilterListeners.notifyEach( &XFilterControllerListener::predicateExpressionChanged, aEvent );
}
// XItemListener
diff --git a/svx/source/inc/formcontroller.hxx b/svx/source/inc/formcontroller.hxx
index 82a3516584f7..b0f42a0e97ea 100644
--- a/svx/source/inc/formcontroller.hxx
+++ b/svx/source/inc/formcontroller.hxx
@@ -214,7 +214,8 @@ namespace svxform
sal_Bool m_bFiltering : 1;
sal_Bool m_bAttachEvents : 1;
sal_Bool m_bDetachEvents : 1;
- sal_Bool m_bAttemptedHandlerCreation : 1;
+ bool m_bAttemptedHandlerCreation : 1;
+ bool m_bSuspendFilterTextListening; // no bit field, passed around as reference
// as we want to intercept dispatches of _all_ controls we're responsible for, and an object implementing
// the ::com::sun::star::frame::XDispatchProviderInterceptor interface can intercept only _one_ objects dispatches, we need a helper class