From 4044f96898a5564efd9274471467d5333211083d Mon Sep 17 00:00:00 2001
From: Kurt Zenker <kz@openoffice.org>
Date: Fri, 5 Jun 2009 12:31:05 +0000
Subject: CWS-TOOLING: integrate CWS evoab2def 2009-05-28 16:00:19 +0200 fs 
 r272412 : don't use createFalse - Evo 2.22 simply hangs when ask for all
 contacts without a first name. Instead, in the WHERE 0=1 case, simply create
 an empty result set 2009-05-22 14:25:51 +0200 fs  r272193 : #i10000#
 2009-05-22 14:25:37 +0200 fs  r272192 : oops, ENABLE_EVOAB2 for some
 platforms only, not generically 2009-05-22 14:19:00 +0200 fs  r272191 :
 #i10000# 2009-05-22 12:42:38 +0200 fs  r272183 : when sorting, properly use a
 syslocale collator, instead of comparing the numerical values of the string's
 UTF-16 code points 2009-05-20 15:09:00 +0200 fs  r272131 : clear/getWarnings:
 also allowed without cache 2009-05-20 14:11:19 +0200 fs  r272128 : removed
 debug traces 2009-05-20 14:03:31 +0200 fs  r272126 : #i55701#
 +STR_SORT_BY_COL_ONLY 2009-05-20 14:02:29 +0200 fs  r272125 : implement
 sorting 2009-05-20 10:10:19 +0200 fs  r272107 : #i10000# 2009-05-19 16:02:17
 +0200 fs  r272089 : #i10000# 2009-05-19 16:02:02 +0200 fs  r272088 : #i55701#
 strings for new error condition DATA_CANNOT_SELECT_UNFILTERED 2009-05-19
 16:01:31 +0200 fs  r272087 : #i55701# use DATA_CANNOT_SELECT_UNFILTERED as
 standardized error code 2009-05-19 15:59:59 +0200 fs  r272086 : #i55701#
 +DATA_CANNOT_SELECT_UNFILTERED 2009-05-19 15:46:12 +0200 fs  r272084 :
 #i55701# recognize the DATA_CANNOT_SELECT_UNFILTERED error condition, and
 allow filtering in this case, even when the result set is empty 2009-05-19
 09:06:50 +0200 fs  r272059 : merging changes from CWS dba32b, to prevent
 future conflicts with upcoming local changes 2009-05-18 21:48:58 +0200 fs 
 r272054 : accessing a non-local unfiltered address book now returns an empty
 result set, and reports a warning, instead of ungracefully failing 2009-05-18
 21:48:42 +0200 fs  r272053 : accessing a non-local unfiltered address book
 now returns an empty result set, and reports a warning, instead of
 ungracefully failing 2009-05-18 21:47:41 +0200 fs  r272052 :
 +setExternalWarnings 2009-05-18 21:47:12 +0200 fs  r272051 : #i55701# when
 re/loading the form, display any possible warnings 2009-05-18 21:43:26 +0200
 fs  r272050 : #i55701# implement XWarningsSupplier, exposing the warnings of
 our result set 2009-05-18 21:42:51 +0200 fs  r272049 : #i55701# implement
 XWarningsSupplier, exposing the warnings of our aggregate RowSet 2009-05-18
 17:53:59 +0200 fs  r272041 : #i55701# moved the (I)WarningsContainer from
 dbaccess to connectivity, to be able to use it in the latter module, too
 2009-05-18 17:24:10 +0200 fs  r272040 : #i55701# properly enable the various
 Evolution types 2009-05-18 14:52:19 +0200 fs  r272024 : #i55701# properly
 enable the Evolution types 2009-05-18 13:57:10 +0200 fs  r272018 :
 fixed/extended whereAnalysis (column searching still not enabled, as neither
 LIKE nor = seem to work with my (somewhat older) Evolution version)
 2009-05-18 13:56:08 +0200 fs  r272017 : extended showParseTree 2009-05-18
 13:55:25 +0200 fs  r272016 : extended showParseTree 2009-05-18 11:40:16 +0200
 fs  r272008 : #i55701# 2009-05-18 11:39:02 +0200 fs  r272006 : let the
 PreparedStatement return proper meta data, too 2009-05-18 10:05:37 +0200 fs 
 r271999 : moved the XStatement interface to from OCommonStatement to
 OStatement - the former class is also the base for other classes which should
 not have this interface 2009-05-15 21:53:22 +0200 fs  r271973 :
 collectColumnInformation: report invalid meta data as assertion 2009-05-15
 21:51:40 +0200 fs  r271972 : showParseTree should be const 2009-05-15
 21:51:26 +0200 fs  r271971 : showParseTree should be const 2009-05-15
 21:51:03 +0200 fs  r271970 : properly recognize the 'WHERE 0 = 1' clause,
 this way having proper statement meta data, this way saving much much calls
 from the DBA framework 2009-05-15 20:29:03 +0200 fs  r271969 : cleaned up the
 mess with the statement classes 2009-05-15 15:51:11 +0200 fs  r271944 : let
 the result set properly init its meta data 2009-05-15 15:29:54 +0200 fs 
 r271939 : proper property implementations for the resultset class 2009-05-15
 15:01:31 +0200 fs  r271936 : proper property implementations for the
 statement class 2009-05-08 14:46:33 +0200 fs  r271717 : component_foo must be
 PUBLIC 2009-05-06 09:20:05 +0200 fs  r271565 : #i10000# (warnings on
 unxlngi6) 2009-05-06 09:01:30 +0200 fs  r271564 : #i101493# 2009-05-05
 23:08:12 +0200 fs  r271560 : #i55701# merging the changes from the ancient
 (CVS-based) CWS evoab2default into this CWS here

---
 dbaccess/source/ui/app/AppController.cxx  |  10 ++-
 dbaccess/source/ui/browser/brwctrlr.cxx   | 136 ++++++++++++++++--------------
 dbaccess/source/ui/browser/exsrcbrw.cxx   |   4 +-
 dbaccess/source/ui/dlg/ConnectionPage.cxx |   2 +
 dbaccess/source/ui/dlg/dbwiz.cxx          |   6 ++
 dbaccess/source/ui/inc/brwctrlr.hxx       |  10 ++-
 6 files changed, 103 insertions(+), 65 deletions(-)

(limited to 'dbaccess/source/ui')

diff --git a/dbaccess/source/ui/app/AppController.cxx b/dbaccess/source/ui/app/AppController.cxx
index 21716791864d..fb6c7e254e7c 100644
--- a/dbaccess/source/ui/app/AppController.cxx
+++ b/dbaccess/source/ui/app/AppController.cxx
@@ -959,7 +959,15 @@ FeatureState OApplicationController::GetState(sal_uInt16 _nId) const
                 if ( aReturn.bEnabled )
                 {
                     ::dbaccess::DATASOURCE_TYPE eType = m_aTypeCollection.getType(::comphelper::getString(m_xDataSource->getPropertyValue(PROPERTY_URL)));
-                    aReturn.bEnabled =  ::dbaccess::DST_EMBEDDED_HSQLDB != eType &&  ::dbaccess::DST_MOZILLA != eType &&  ::dbaccess::DST_EVOLUTION != eType &&  ::dbaccess::DST_KAB != eType &&  ::dbaccess::DST_MACAB != eType &&  ::dbaccess::DST_OUTLOOK != eType &&  ::dbaccess::DST_OUTLOOKEXP != eType;
+                    aReturn.bEnabled =  ::dbaccess::DST_EMBEDDED_HSQLDB != eType
+                                    &&  ::dbaccess::DST_MOZILLA != eType
+                                    &&  ::dbaccess::DST_EVOLUTION != eType
+                                    &&  ::dbaccess::DST_EVOLUTION_GROUPWISE != eType
+                                    &&  ::dbaccess::DST_EVOLUTION_LDAP != eType
+                                    &&  ::dbaccess::DST_KAB != eType
+                                    &&  ::dbaccess::DST_MACAB != eType
+                                    &&  ::dbaccess::DST_OUTLOOK != eType
+                                    &&  ::dbaccess::DST_OUTLOOKEXP != eType;
                 }
                 break;
             case SID_DB_APP_DSCONNECTION_TYPE:
diff --git a/dbaccess/source/ui/browser/brwctrlr.cxx b/dbaccess/source/ui/browser/brwctrlr.cxx
index 50f0e4594c7f..706064da08f1 100644
--- a/dbaccess/source/ui/browser/brwctrlr.cxx
+++ b/dbaccess/source/ui/browser/brwctrlr.cxx
@@ -134,6 +134,9 @@
 #ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
 #include <cppuhelper/typeprovider.hxx>
 #endif
+#ifndef _CPPUHELPER_EXC_HLP_HXX_
+#include <cppuhelper/exc_hlp.hxx>
+#endif
 #ifndef _SV_MSGBOX_HXX //autogen
 #include <vcl/msgbox.hxx>
 #endif
@@ -155,6 +158,9 @@
 #ifndef _CONNECTIVITY_DBTOOLS_HXX_
 #include <connectivity/dbtools.hxx>
 #endif
+#ifndef _DBHELPER_DBEXCEPTION_HXX_
+#include <connectivity/dbexception.hxx>
+#endif
 #ifndef _CPPUHELPER_IMPLBASE2_HXX_
 #include <cppuhelper/implbase2.hxx>
 #endif
@@ -176,6 +182,9 @@
 #ifndef _DBHELPER_DBEXCEPTION_HXX_
 #include <connectivity/dbexception.hxx>
 #endif
+#ifndef CONNECTIVITY_SQLERROR_HXX
+#include <connectivity/sqlerror.hxx>
+#endif
 #ifndef _COMPHELPER_EXTRACT_HXX_
 #include <comphelper/extract.hxx>
 #endif
@@ -188,6 +197,12 @@
 #ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_HPP_
 #include <com/sun/star/task/XInteractionHandler.hpp>
 #endif
+#ifndef INCLUDED_COM_SUN_STAR_SDBC_XWARNINGSSUPPLIER_HPP
+#include <com/sun/star/sdbc/XWarningsSupplier.hpp>
+#endif
+#ifndef INCLUDED_COM_SUN_STAR_SDB_ERRORCONDITION_HPP
+#include <com/sun/star/sdb/ErrorCondition.hpp>
+#endif
 #ifndef DBAUI_QUERYFILTER_HXX
 #include "queryfilter.hxx"
 #endif
@@ -484,6 +499,7 @@ SbaXDataBrowserController::SbaXDataBrowserController(const Reference< ::com::sun
     ,m_bLoadCanceled( sal_False )
     ,m_bClosingKillOpen( sal_False )
     ,m_bErrorOccured( sal_False )
+    ,m_bCannotSelectUnfiltered( true )
 {
     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SbaXDataBrowserController" );
     DBG_CTOR(SbaXDataBrowserController,NULL);
@@ -545,12 +561,35 @@ void SbaXDataBrowserController::stopFrameListening( const Reference< XFrame >& _
 }
 
 // -----------------------------------------------------------------------------
-sal_Bool SbaXDataBrowserController::reloadForm(const Reference< XLoadable >& _rxLoadable)
+void SbaXDataBrowserController::onStartLoading( const Reference< XLoadable >& _rxLoadable )
+{
+    m_bLoadCanceled = sal_False;
+    m_bCannotSelectUnfiltered = false;
+
+    Reference< XWarningsSupplier > xWarnings( _rxLoadable, UNO_QUERY );
+    if ( xWarnings.is() )
+        xWarnings->clearWarnings();
+}
+
+// -----------------------------------------------------------------------------
+void SbaXDataBrowserController::impl_checkForCannotSelectUnfiltered( const SQLExceptionInfo& _rError )
+{
+    ::connectivity::SQLError aError( getORB() );
+    ::connectivity::ErrorCode nErrorCode( aError.getErrorCode( ErrorCondition::DATA_CANNOT_SELECT_UNFILTERED ) );
+    if ( ((const SQLException*)_rError)->ErrorCode == nErrorCode )
+    {
+        m_bCannotSelectUnfiltered = true;
+        InvalidateFeature( ID_BROWSER_FILTERCRIT );
+    }
+}
+
+// -----------------------------------------------------------------------------
+sal_Bool SbaXDataBrowserController::reloadForm( const Reference< XLoadable >& _rxLoadable )
 {
     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::reloadForm" );
     WaitObject aWO(getBrowserView());
 
-    setLoadingStarted();
+    onStartLoading( _rxLoadable );
 
     FormErrorHelper aReportError(this);
     if (_rxLoadable->isLoaded())
@@ -558,6 +597,17 @@ sal_Bool SbaXDataBrowserController::reloadForm(const Reference< XLoadable >& _rx
     else
         _rxLoadable->load();
 
+    Reference< XWarningsSupplier > xWarnings( _rxLoadable, UNO_QUERY );
+    if ( xWarnings.is() )
+    {
+        SQLExceptionInfo aInfo( xWarnings->getWarnings() );
+        if ( aInfo.isValid() )
+        {
+            showError( aInfo );
+            impl_checkForCannotSelectUnfiltered( aInfo );
+        }
+    }
+
     return _rxLoadable->isLoaded() && !errorOccured();
 }
 
@@ -1302,8 +1352,7 @@ void SbaXDataBrowserController::errorOccured(const ::com::sun::star::sdb::SQLErr
     if ( aInfo.isValid() )
     {
         ::vos::OGuard aGuard(Application::GetSolarMutex());
-        OSQLMessageBox aDlg(getBrowserView(), aInfo);
-        aDlg.Execute();
+        showError( aInfo );
     }
     if (m_nFormActionNestingLevel)
         m_bErrorOccured = true;
@@ -1523,35 +1572,34 @@ FeatureState SbaXDataBrowserController::GetState(sal_uInt16 nId) const
 
                 aReturn.bEnabled = ::comphelper::getBOOL(xCurrentField->getPropertyValue(PROPERTY_ISSEARCHABLE));
                 const Reference< XRowSet > xRow = getRowSet();
-                if(aReturn.bEnabled && xRow.is()) // check if we stand on a valid row
-                    aReturn.bEnabled = !(xRow->isBeforeFirst() || xRow->isAfterLast() || xRow->rowDeleted() || ::comphelper::getINT32(xFormSet->getPropertyValue(PROPERTY_ROWCOUNT)) == 0);
+                aReturn.bEnabled =  aReturn.bEnabled
+                                &&  xRow.is()
+                                &&  !xRow->isBeforeFirst()
+                                &&  !xRow->isAfterLast()
+                                &&  !xRow->rowDeleted()
+                                &&  ( ::comphelper::getINT32( xFormSet->getPropertyValue( PROPERTY_ROWCOUNT ) ) != 0 );
             }
             break;
 
-            case ID_BROWSER_ORDERCRIT:
             case ID_BROWSER_FILTERCRIT:
+                if ( m_bCannotSelectUnfiltered )
+                {
+                    aReturn.bEnabled = sal_True;
+                    break;
+                }
+                // no break
+            case ID_BROWSER_ORDERCRIT:
                 {
                     const Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
                     if ( !::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)))
                         break;
 
-                    Reference< XPropertySet >  xCurrentField = getBoundField();
-                    // we are not in the handle column
-                    aReturn.bEnabled = getBrowserView()->getVclControl()->GetCurColumnId() != 0 &&
-                                        xCurrentField.is() &&
-                                       ::comphelper::getBOOL(xCurrentField->getPropertyValue(PROPERTY_ISSEARCHABLE));
-
-                    const Reference< XRowSet > xRow = getRowSet();
-
-                    if(aReturn.bEnabled && xRow.is()) // check if we stand on a valid row
-                        aReturn.bEnabled = !(xRow->isBeforeFirst() || xRow->isAfterLast() || xRow->rowDeleted() || ::comphelper::getINT32(xFormSet->getPropertyValue(PROPERTY_ROWCOUNT)) == 0);
-                    // a native statement can't be filtered or sorted
-                    //  aReturn.bEnabled &= m_xParser.is();
+                    aReturn.bEnabled =  getRowSet().is()
+                                    &&  ( ::comphelper::getINT32( xFormSet->getPropertyValue( PROPERTY_ROWCOUNT ) ) != 0 );
                 }
                 break;
 
             case ID_BROWSER_REFRESH:
-                //  aReturn.bEnabled = isValidCursor();
                 aReturn.bEnabled = sal_True;
                 break;
 
@@ -1728,11 +1776,6 @@ void SbaXDataBrowserController::ExecuteFilterSortCrit(sal_Bool bFilter)
 
     Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
 
-    // no condition for searching
-    if (getRowSet()->isBeforeFirst() || getRowSet()->isAfterLast() ||
-        getRowSet()->rowDeleted())
-        return;
-
     initializeParser();
     const ::rtl::OUString sOldVal = bFilter ? m_xParser->getFilter() : m_xParser->getOrder();
     const ::rtl::OUString sOldHaving = m_xParser->getHavingClause();
@@ -1764,7 +1807,12 @@ void SbaXDataBrowserController::ExecuteFilterSortCrit(sal_Bool bFilter)
             aDlg.BuildOrderPart();
         }
     }
-    catch(SQLException& e) { showError(SQLExceptionInfo(e)); return; }
+    catch(const SQLException& )
+    {
+        SQLExceptionInfo aError( ::cppu::getCaughtException() );
+        showError( aError );
+        return;
+    }
     catch(Exception&)
     {
         return;
@@ -2293,40 +2341,6 @@ IMPL_LINK(SbaXDataBrowserController, OnInvalidateClipboard, AutoTimer*, _pTimer)
     return 0L;
 }
 
-// ------------------------------------------------------------------------------
-//sal_uInt16 SbaXDataBrowserController::SaveData(sal_Bool bUI, sal_Bool bForBrowsing)
-//{
-//  if (!getBrowserView())
-//      return sal_True;
-//
-//  if (!isValidCursor())
-//      return sal_True;
-//
-//  if (bUI && GetState(ID_BROWSER_SAVEDOC).bEnabled)
-//  {
-//      getBrowserView()->getVclControl()->GrabFocus();
-//
-//      QueryBox aQry(getBrowserView()->getVclControl(), ModuleRes(QUERY_BRW_SAVEMODIFIED));
-//      if (bForBrowsing)
-//          aQry.AddButton(ResId(RID_STR_NEW_TASK), RET_NEWTASK,
-//              BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON);
-//
-//      switch (aQry.Execute())
-//      {
-//          case RET_NO:
-//              Execute(ID_BROWSER_UNDO);
-//              return sal_True;
-//          case RET_CANCEL:
-//              return sal_False;
-//          case RET_NEWTASK:
-//              return RET_NEWTASK;
-//      }
-//  }
-//
-//
-//  return SbaXDataBrowserController_Base::SaveData(bUI,bForBrowsing);
-//}
-//
 // -------------------------------------------------------------------------
 Reference< XPropertySet >  SbaXDataBrowserController::getBoundField(sal_uInt16 nViewPos) const
 {
@@ -2686,7 +2700,7 @@ sal_Bool SbaXDataBrowserController::isValidCursor() const
         if ( !bIsValid )
         {
             initializeParser();
-            bIsValid = (m_xParser.is() && (m_xParser->getFilter().getLength() || m_xParser->getHavingClause().getLength() || m_xParser->getOrder().getLength()));
+            bIsValid = m_xParser.is();
         }
     } // if ( !bIsValid )
     return bIsValid;
diff --git a/dbaccess/source/ui/browser/exsrcbrw.cxx b/dbaccess/source/ui/browser/exsrcbrw.cxx
index 179ca9e63795..01475f549a14 100644
--- a/dbaccess/source/ui/browser/exsrcbrw.cxx
+++ b/dbaccess/source/ui/browser/exsrcbrw.cxx
@@ -394,8 +394,6 @@ void SbaExternalSourceBrowser::Attach(const Reference< XRowSet > & xMaster)
     Reference< XRowLocate > xCursor(xMaster, UNO_QUERY);
     Reference< XPropertySet > xMasterProps(xMaster, UNO_QUERY);
 
-    setLoadingStarted();
-
     try
     {
         // switch the control to design mode
@@ -420,6 +418,8 @@ void SbaExternalSourceBrowser::Attach(const Reference< XRowSet > & xMaster)
         DBG_UNHANDLED_EXCEPTION();
     }
 
+    onStartLoading( Reference< XLoadable >( xMaster, UNO_QUERY ) );
+
     stopListening();
     m_pDataSourceImpl->AttachForm(xMaster);
     startListening();
diff --git a/dbaccess/source/ui/dlg/ConnectionPage.cxx b/dbaccess/source/ui/dlg/ConnectionPage.cxx
index 135dd3b07b92..a032b6a47908 100644
--- a/dbaccess/source/ui/dlg/ConnectionPage.cxx
+++ b/dbaccess/source/ui/dlg/ConnectionPage.cxx
@@ -304,6 +304,8 @@ namespace dbaui
             case  ::dbaccess::DST_OUTLOOK:
             case  ::dbaccess::DST_OUTLOOKEXP:
             case  ::dbaccess::DST_EVOLUTION:
+            case  ::dbaccess::DST_EVOLUTION_GROUPWISE:
+            case  ::dbaccess::DST_EVOLUTION_LDAP:
             case  ::dbaccess::DST_KAB:
             case  ::dbaccess::DST_MACAB:
                 m_aFT_Connection.SetText(String(ModuleRes(STR_NO_ADDITIONAL_SETTINGS)));
diff --git a/dbaccess/source/ui/dlg/dbwiz.cxx b/dbaccess/source/ui/dlg/dbwiz.cxx
index 3ace14f2fc36..ff986cbcbd6f 100644
--- a/dbaccess/source/ui/dlg/dbwiz.cxx
+++ b/dbaccess/source/ui/dlg/dbwiz.cxx
@@ -173,6 +173,8 @@ IMPL_LINK(ODbTypeWizDialog, OnTypeSelected, OGeneralPage*, _pTabPage)
         case  ::dbaccess::DST_OUTLOOK:
         case  ::dbaccess::DST_OUTLOOKEXP:
         case  ::dbaccess::DST_EVOLUTION:
+        case  ::dbaccess::DST_EVOLUTION_GROUPWISE:
+        case  ::dbaccess::DST_EVOLUTION_LDAP:
         case  ::dbaccess::DST_KAB:
         case  ::dbaccess::DST_MACAB:
             enableButtons(WZB_NEXT,sal_False);
@@ -198,6 +200,8 @@ WizardTypes::WizardState ODbTypeWizDialog::determineNextState( WizardState _nCur
                 case  ::dbaccess::DST_OUTLOOK:
                 case  ::dbaccess::DST_OUTLOOKEXP:
                 case  ::dbaccess::DST_EVOLUTION:
+                case  ::dbaccess::DST_EVOLUTION_GROUPWISE:
+                case  ::dbaccess::DST_EVOLUTION_LDAP:
                 case  ::dbaccess::DST_KAB:
                 case  ::dbaccess::DST_MACAB:
                     nNextState = WZS_INVALID_STATE;
@@ -218,6 +222,8 @@ WizardTypes::WizardState ODbTypeWizDialog::determineNextState( WizardState _nCur
                 case  ::dbaccess::DST_OUTLOOK:
                 case  ::dbaccess::DST_OUTLOOKEXP:
                 case  ::dbaccess::DST_EVOLUTION:
+                case  ::dbaccess::DST_EVOLUTION_GROUPWISE:
+                case  ::dbaccess::DST_EVOLUTION_LDAP:
                 case  ::dbaccess::DST_KAB:
                 case  ::dbaccess::DST_MACAB:
                 case  ::dbaccess::DST_MSACCESS:
diff --git a/dbaccess/source/ui/inc/brwctrlr.hxx b/dbaccess/source/ui/inc/brwctrlr.hxx
index 19a0971e4981..381c70a2c0cd 100644
--- a/dbaccess/source/ui/inc/brwctrlr.hxx
+++ b/dbaccess/source/ui/inc/brwctrlr.hxx
@@ -64,6 +64,11 @@ class ResMgr;
 struct FmFoundRecordInformation;
 struct FmSearchContext;
 
+namespace dbtools
+{
+    class SQLExceptionInfo;
+}
+
 namespace dbaui
 {
 
@@ -125,6 +130,7 @@ namespace dbaui
         sal_Bool                m_bLoadCanceled : 1;            // the load was canceled somehow
         sal_Bool                m_bClosingKillOpen : 1;         // are we killing the load thread because we are to be suspended ?
         sal_Bool                m_bErrorOccured : 1;            // see enter-/leaveFormAction
+        bool                    m_bCannotSelectUnfiltered : 1;  // recieved an DATA_CANNOT_SELECT_UNFILTERED error
 
     protected:
         class FormErrorHelper
@@ -151,7 +157,7 @@ namespace dbaui
         sal_Bool    isValidCursor() const;  // checks the ::com::sun::star::data::XDatabaseCursor-interface of m_xRowSet
         sal_Bool    isLoaded() const;
         sal_Bool    loadingCancelled() const { return m_bLoadCanceled; }
-        void        setLoadingStarted()     { m_bLoadCanceled = sal_False; }
+        void        onStartLoading( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XLoadable >& _rxLoadable );
         void        setLoadingCancelled()   { m_bLoadCanceled = sal_True; }
 
         const TransferableDataHelper&
@@ -346,6 +352,8 @@ namespace dbaui
         void        setCurrentColumnPosition( sal_Int16 _nPos );
         void        addColumnListeners(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel);
 
+        void        impl_checkForCannotSelectUnfiltered( const ::dbtools::SQLExceptionInfo& _rError );
+
         // time to check the CUT/COPY/PASTE-slot-states
         DECL_LINK( OnInvalidateClipboard, AutoTimer* );
         DECL_LINK( OnClipboardChanged, void* );
-- 
cgit