[PATCH] Database: Add Limit in Query Desing View
Zolnai Tamás (via_Code_Review)
gerrit at gerrit.libreoffice.org
Tue Feb 5 02:58:26 PST 2013
Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/1994
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/94/1994/1
Database: Add Limit in Query Desing View
Levels of implementation
- Add a new toolbar item to ui (designobjectbar.xml)
- Make a control for this element( LimitBox)
- Make an own controller for this control (LimitBoxController) and
register it
- Add new feature to the general\central controller (OQueryController)
and construct a communication channel between the two controller
- Modify the view switching (SQL<->Design) methods to use\set limit
value (QueryDesignView.cxx)
Change-Id: I0eb09d1d40cfdb9b8a2a57ab8911faca91d5e690
---
M dbaccess/Library_dbu.mk
M dbaccess/inc/dbaccess_slotid.hrc
M dbaccess/source/ui/inc/dbu_qry.hrc
M dbaccess/source/ui/inc/querycontroller.hxx
M dbaccess/source/ui/misc/uiservices.cxx
M dbaccess/source/ui/querydesign/QueryDesignView.cxx
A dbaccess/source/ui/querydesign/limitboxcontroller.cxx
A dbaccess/source/ui/querydesign/limitboxcontroller.hxx
M dbaccess/source/ui/querydesign/query.src
M dbaccess/source/ui/querydesign/querycontroller.cxx
M dbaccess/uiconfig/dbquery/toolbar/designobjectbar.xml
M dbaccess/util/dbu.component
M officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
M officecfg/registry/data/org/openoffice/Office/UI/DbuCommands.xcu
14 files changed, 458 insertions(+), 4 deletions(-)
diff --git a/dbaccess/Library_dbu.mk b/dbaccess/Library_dbu.mk
index 1ca0f82..ef84bfe 100644
--- a/dbaccess/Library_dbu.mk
+++ b/dbaccess/Library_dbu.mk
@@ -214,6 +214,7 @@
dbaccess/source/ui/querydesign/JoinDesignView \
dbaccess/source/ui/querydesign/JoinExchange \
dbaccess/source/ui/querydesign/JoinTableView \
+ dbaccess/source/ui/querydesign/limitboxcontroller \
dbaccess/source/ui/querydesign/QTableConnection \
dbaccess/source/ui/querydesign/QTableConnectionData \
dbaccess/source/ui/querydesign/QTableWindow \
diff --git a/dbaccess/inc/dbaccess_slotid.hrc b/dbaccess/inc/dbaccess_slotid.hrc
index c3db103..37a333e 100644
--- a/dbaccess/inc/dbaccess_slotid.hrc
+++ b/dbaccess/inc/dbaccess_slotid.hrc
@@ -83,6 +83,7 @@
#define SID_APP_NEW_FOLDER ( SID_DBACCESS_START + 53 )
#define SID_APP_NEW_FORM ( SID_DBACCESS_START + 54 )
#define SID_DB_APP_PASTE_SPECIAL ( SID_DBACCESS_START + 55 )
+#define SID_QUERY_LIMIT ( SID_DBACCESS_START + 56 )
// status information
#define SID_DB_APP_STATUS_TYPE ( SID_DBACCESS_START + 57 )
diff --git a/dbaccess/source/ui/inc/dbu_qry.hrc b/dbaccess/source/ui/inc/dbu_qry.hrc
index 659254f..1907b0c 100644
--- a/dbaccess/source/ui/inc/dbu_qry.hrc
+++ b/dbaccess/source/ui/inc/dbu_qry.hrc
@@ -42,7 +42,7 @@
#define STR_QUERY_NOTABLE RID_STR_QRY_START + 21
#define STR_QRY_ORDERBY_UNRELATED RID_STR_QRY_START + 22
#define STR_QUERY_HANDLETEXT RID_STR_QRY_START + 23
-// free
+#define STR_QUERY_LIMIT_ALL RID_STR_QRY_START + 24
// free
#define STR_QRY_TOO_MANY_COLUMNS RID_STR_QRY_START + 26
#define STR_SVT_SQL_SYNTAX_ERROR RID_STR_QRY_START + 27
diff --git a/dbaccess/source/ui/inc/querycontroller.hxx b/dbaccess/source/ui/inc/querycontroller.hxx
index 789f9ea..2fddb24 100644
--- a/dbaccess/source/ui/inc/querycontroller.hxx
+++ b/dbaccess/source/ui/inc/querycontroller.hxx
@@ -78,6 +78,8 @@
mutable ::rtl::OUString
m_sName; // name of the query
+ OUString m_sLimit; // the limit of the query result (a number or All)
+
sal_Int32 m_nVisibleRows; // which rows the selection browse should show
sal_Int32 m_nSplitPos; // the position of the splitter
sal_Int32 m_nCommandType; // the type of the object we're designing
@@ -143,12 +145,14 @@
sal_Bool isEsacpeProcessing() const { return m_bEscapeProcessing; }
sal_Bool isGraphicalDesign() const { return m_bGraphicalDesign; }
sal_Bool isDistinct() const { return m_bDistinct; }
+ OUString getLimit() const { return m_sLimit; }
::rtl::OUString getStatement() const { return m_sStatement; }
sal_Int32 getSplitPos() const { return m_nSplitPos;}
sal_Int32 getVisibleRows() const { return m_nVisibleRows; }
void setDistinct(sal_Bool _bDistinct) { m_bDistinct = _bDistinct;}
+ void setLimit(const OUString& _sLimit) { m_sLimit = _sLimit;}
void setSplitPos(sal_Int32 _nSplitPos) { m_nSplitPos = _nSplitPos;}
void setVisibleRows(sal_Int32 _nVisibleRows) { m_nVisibleRows = _nVisibleRows;}
diff --git a/dbaccess/source/ui/misc/uiservices.cxx b/dbaccess/source/ui/misc/uiservices.cxx
index 672f970..81fe7ba 100644
--- a/dbaccess/source/ui/misc/uiservices.cxx
+++ b/dbaccess/source/ui/misc/uiservices.cxx
@@ -58,6 +58,7 @@
extern "C" void SAL_CALL createRegistryInfo_OStatusbarController();
extern "C" void SAL_CALL createRegistryInfo_CopyTableWizard();
extern "C" void SAL_CALL createRegistryInfo_OTextConnectionSettingsDialog();
+extern "C" void SAL_CALL createRegistryInfo_LimitBoxController();
//***************************************************************************************
extern "C" void SAL_CALL createRegistryInfo_DBU()
@@ -90,6 +91,7 @@
createRegistryInfo_OStatusbarController();
createRegistryInfo_CopyTableWizard();
createRegistryInfo_OTextConnectionSettingsDialog();
+ createRegistryInfo_LimitBoxController();
bInit = sal_True;
}
}
diff --git a/dbaccess/source/ui/querydesign/QueryDesignView.cxx b/dbaccess/source/ui/querydesign/QueryDesignView.cxx
index fe780c9..6f4bc36264 100644
--- a/dbaccess/source/ui/querydesign/QueryDesignView.cxx
+++ b/dbaccess/source/ui/querydesign/QueryDesignView.cxx
@@ -2004,7 +2004,7 @@
}
const OSQLParseNode* pTableExp = pParseTree->getChild(3);
- if ( pTableExp->getChild(6)->count() > 0 || pTableExp->getChild(7)->count() > 0 || pTableExp->getChild(8)->count() > 0)
+ if ( pTableExp->getChild(7)->count() > 0 || pTableExp->getChild(8)->count() > 0)
{
eErrorCode = eStatementTooComplex;
break;
@@ -2102,6 +2102,19 @@
{
rController.setDistinct(sal_False);
}
+
+ ///check if query has a limit
+ if( pTableExp->getChild(6)->count() >= 2 && pTableExp->getChild(6)->getChild(1) )
+ {
+ const OUString sLimit =
+ pTableExp->getChild(6)->getChild(1)->getTokenValue();
+ rController.setLimit( sLimit );
+ }
+ else
+ {
+ rController.setLimit( ModuleRes(STR_QUERY_LIMIT_ALL) );
+ }
+
if ( (eErrorCode = InstallFields(_pView,pParseTree, pTableView->GetTabWinMap())) == eOk )
{
// GetSelectionCriteria must be called before GetHavingCriteria
@@ -2933,7 +2946,7 @@
}
// ----------------- Statement aufbauen ----------------------
::rtl::OUStringBuffer aSqlCmd(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT ")));
- if(static_cast<OQueryController&>(getController()).isDistinct())
+ if(rController.isDistinct())
aSqlCmd.append(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" DISTINCT ")));
aSqlCmd.append(aFieldListStr);
aSqlCmd.append(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" FROM ")));
@@ -2971,6 +2984,11 @@
m_rController.displayError();
}
+ // --------------------- Limit Clause -------------------
+ if( rController.getLimit() != ModuleRes(STR_QUERY_LIMIT_ALL).toString() )
+ {
+ aSqlCmd.append(" LIMIT " + rController.getLimit());
+ }
::rtl::OUString sSQL = aSqlCmd.makeStringAndClear();
if ( xConnection.is() )
diff --git a/dbaccess/source/ui/querydesign/limitboxcontroller.cxx b/dbaccess/source/ui/querydesign/limitboxcontroller.cxx
new file mode 100644
index 0000000..6f8c4be
--- /dev/null
+++ b/dbaccess/source/ui/querydesign/limitboxcontroller.cxx
@@ -0,0 +1,278 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "limitboxcontroller.hxx"
+
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+
+#include <vcl/svapp.hxx>
+#include <vcl/window.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <osl/mutex.hxx>
+#include <rtl/ustring.hxx>
+
+#include "dbu_reghelper.hxx"
+#include "dbu_qry.hrc"
+#include "moduledbu.hxx"
+
+using namespace ::com::sun::star;
+
+
+////////////////
+///LimitBox
+////////////////
+
+namespace dbaui
+{
+
+namespace{
+
+/// Default values
+OUString aDefLimitAry[] =
+{
+ "5",
+ "10",
+ "20",
+ "50"
+};
+
+
+///Initialize entries
+static void lcl_LoadDefaultLimits( LimitBox& io_rLimitBox )
+{
+ const OUString sAll = ModuleRes(STR_QUERY_LIMIT_ALL);
+ io_rLimitBox.SetText( sAll );
+ io_rLimitBox.InsertEntry( sAll );
+
+ const unsigned nSize = sizeof(aDefLimitAry)/sizeof(aDefLimitAry[0]);
+ for( unsigned nIndex = 0; nIndex< nSize; ++nIndex)
+ {
+ io_rLimitBox.InsertEntry( aDefLimitAry[nIndex] );
+ }
+}
+
+///Check input string whether it can be a limit value
+static bool lcl_CheckData( const OUString& rData )
+{
+ if( rData.isEmpty() )
+ {
+ return false;
+ }
+ if( rData == String(ModuleRes(STR_QUERY_LIMIT_ALL)) )
+ {
+ return true;
+ }
+ sal_Int32 nIndex = 0;
+ sal_uInt32 nChar;
+ while( nIndex < rData.getLength() )
+ {
+ nChar = rData.iterateCodePoints( &nIndex );
+ if( nChar < '0' || nChar > '9' )
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+} /// anonymous namespace
+
+LimitBox::LimitBox( Window* pParent, LimitBoxController* pCtrl )
+ : ComboBox( pParent, WinBits( WB_DROPDOWN | WB_VSCROLL) )
+ , m_pControl( pCtrl )
+{
+ lcl_LoadDefaultLimits( *this );
+ EnableAutocomplete(sal_False);
+ Size aSize(
+ CalcMinimumSize().Width() + 30 ,
+ CalcWindowSizePixel(GetEntryCount() + 1) );
+ SetSizePixel(aSize);
+}
+
+LimitBox::~LimitBox()
+{
+}
+
+long LimitBox::Notify( NotifyEvent& rNEvt )
+{
+ long nHandled = 0;
+
+ switch ( rNEvt.GetType() )
+ {
+ /**
+ * Check the current data
+ * If it can a limit value than dispatch it
+ * Else set the previous data (checked value)
+ */
+ case EVENT_LOSEFOCUS:
+ {
+ const OUString sText = GetText();
+ if ( lcl_CheckData( sText ) )
+ {
+ uno::Sequence< beans::PropertyValue > aArgs( 1 );
+ aArgs[0].Name = OUString( "DBLimit.Value" );
+ aArgs[0].Value = uno::makeAny( sText );
+ m_pControl->dispatchCommand( aArgs );
+ }
+ else
+ {
+ Undo();
+ }
+ nHandled = 1;
+ break;
+ }
+ }
+ return nHandled ? nHandled : ComboBox::Notify( rNEvt );
+}
+
+/////////////////////////
+///LimitBoxController
+/////////////////////////
+
+LimitBoxController::LimitBoxController(
+ const uno::Reference< lang::XMultiServiceFactory >& rServiceManager ) :
+ svt::ToolboxController( rServiceManager,
+ uno::Reference< frame::XFrame >(),
+ OUString( ".uno:DBLimit" ) ),
+ m_pLimitBox( NULL )
+{
+}
+
+LimitBoxController::~LimitBoxController()
+{
+}
+
+/// XInterface
+uno::Any SAL_CALL LimitBoxController::queryInterface( const uno::Type& aType )
+throw (uno::RuntimeException)
+{
+ uno::Any a = ToolboxController::queryInterface( aType );
+ if ( a.hasValue() )
+ return a;
+
+ return ::cppu::queryInterface( aType, static_cast< lang::XServiceInfo* >( this ));
+}
+
+void SAL_CALL LimitBoxController::acquire() throw ()
+{
+ ToolboxController::acquire();
+}
+
+void SAL_CALL LimitBoxController::release() throw ()
+{
+ ToolboxController::release();
+}
+
+
+/// XServiceInfo
+IMPLEMENT_SERVICE_INFO1_STATIC(LimitBoxController,"org.libreoffice.comp.dbu.LimitBoxController","com.sun.star.frame.ToolboxController")
+
+/// XComponent
+void SAL_CALL LimitBoxController::dispose()
+throw (uno::RuntimeException)
+{
+ svt::ToolboxController::dispose();
+
+ SolarMutexGuard aSolarMutexGuard;
+ delete m_pLimitBox;
+ m_pLimitBox = 0;
+}
+
+/// XStatusListener
+void SAL_CALL LimitBoxController::statusChanged(
+ const frame::FeatureStateEvent& rEvent )
+throw ( uno::RuntimeException )
+{
+ if ( m_pLimitBox )
+ {
+ SolarMutexGuard aSolarMutexGuard;
+ if ( rEvent.FeatureURL.Path == "DBLimit" )
+ {
+ if ( rEvent.IsEnabled )
+ {
+ m_pLimitBox->Enable();
+ OUString sLimit;
+ if ( (rEvent.State >>= sLimit) && !sLimit.isEmpty() )
+ {
+ m_pLimitBox->SetText(sLimit);
+ }
+ }
+ else
+ m_pLimitBox->Disable();
+ }
+ }
+}
+
+/// XToolbarController
+void SAL_CALL LimitBoxController::execute( sal_Int16 /*KeyModifier*/ )
+throw (uno::RuntimeException)
+{
+}
+
+void SAL_CALL LimitBoxController::click()
+throw (uno::RuntimeException)
+{
+}
+
+void SAL_CALL LimitBoxController::doubleClick()
+throw (uno::RuntimeException)
+{
+}
+
+uno::Reference< awt::XWindow > SAL_CALL LimitBoxController::createPopupWindow()
+throw (uno::RuntimeException)
+{
+ return uno::Reference< awt::XWindow >();
+}
+
+uno::Reference< awt::XWindow > SAL_CALL LimitBoxController::createItemWindow(
+ const uno::Reference< awt::XWindow >& Parent )
+ throw (uno::RuntimeException)
+{
+ uno::Reference< awt::XWindow > xItemWindow;
+ uno::Reference< awt::XWindow > xParent( Parent );
+
+ Window* pParent = VCLUnoHelper::GetWindow( xParent );
+ if ( pParent )
+ {
+ SolarMutexGuard aSolarMutexGuard;
+ m_pLimitBox = new LimitBox(pParent, this);
+ xItemWindow = VCLUnoHelper::GetInterface( m_pLimitBox );
+ }
+
+ return xItemWindow;
+}
+
+void LimitBoxController::dispatchCommand(
+ const uno::Sequence< beans::PropertyValue >& rArgs )
+{
+ uno::Reference< frame::XDispatchProvider > xDispatchProvider( m_xFrame, uno::UNO_QUERY );
+ if ( xDispatchProvider.is() )
+ {
+ util::URL aURL;
+ uno::Reference< frame::XDispatch > xDispatch;
+ uno::Reference< util::XURLTransformer > xURLTransformer = getURLTransformer();
+
+ aURL.Complete = OUString( ".uno:DBLimit" );
+ xURLTransformer->parseStrict( aURL );
+ xDispatch = xDispatchProvider->queryDispatch( aURL, OUString(), 0 );
+ if ( xDispatch.is() )
+ xDispatch->dispatch( aURL, rArgs );
+ }
+}
+
+} ///dbaui namespace
+
+extern "C" void SAL_CALL createRegistryInfo_LimitBoxController()
+{
+ static ::dbaui::OMultiInstanceAutoRegistration< ::dbaui::LimitBoxController > aAutoRegistration;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/dbaccess/source/ui/querydesign/limitboxcontroller.hxx b/dbaccess/source/ui/querydesign/limitboxcontroller.hxx
new file mode 100644
index 0000000..0ab559a
--- /dev/null
+++ b/dbaccess/source/ui/querydesign/limitboxcontroller.hxx
@@ -0,0 +1,85 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef _LIMITBOXCONTROLLER_HXX_
+#define _LIMITBOXCONTROLLER_HXX_
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <svtools/toolboxcontroller.hxx>
+#include <vcl/combobox.hxx>
+
+#include "apitools.hxx"
+
+namespace dbaui
+{
+
+class LimitBoxController;
+
+/** Input box to add limit to an SQL query (max rownumber of result)
+ * This box is reachable on the Query Design Toolbar
+ */
+class LimitBox: public ComboBox
+{
+ public:
+ LimitBox( Window* pParent, LimitBoxController* pCtrl );
+ virtual ~LimitBox();
+
+ virtual long Notify( NotifyEvent& rNEvt );
+
+ private:
+ LimitBoxController* m_pControl;
+};
+
+
+/**
+ * A ToolboxController to paste LimitBox onto the Query Design Toolbar
+ * It is communicating with querycontroller and this channel make enable
+ * to set\get the value of limitbox when switching between views
+ */
+class LimitBoxController: public svt::ToolboxController,
+ public ::com::sun::star::lang::XServiceInfo
+{
+ public:
+ LimitBoxController(
+ const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rServiceManager );
+ ~LimitBoxController();
+
+ /// XInterface
+ virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL acquire() throw ();
+ virtual void SAL_CALL release() throw ();
+
+ /// XServiceInfo
+ DECLARE_SERVICE_INFO_STATIC();
+
+ /// XComponent
+ virtual void SAL_CALL dispose() throw (::com::sun::star::uno::RuntimeException);
+
+ /// XStatusListener
+ virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException );
+
+ /// XToolbarController
+ virtual void SAL_CALL execute( sal_Int16 KeyModifier ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL click() throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL doubleClick() throw (::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > SAL_CALL createPopupWindow() throw (::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > SAL_CALL createItemWindow( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& Parent ) throw (::com::sun::star::uno::RuntimeException);
+
+ void dispatchCommand( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rArgs );
+ using svt::ToolboxController::dispatchCommand;
+
+ private:
+ LimitBox* m_pLimitBox;
+};
+
+} ///dbaui namespace
+
+#endif /// _LIMITBOXCONTROLLER_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/dbaccess/source/ui/querydesign/query.src b/dbaccess/source/ui/querydesign/query.src
index 575ee1e..89af2ad 100644
--- a/dbaccess/source/ui/querydesign/query.src
+++ b/dbaccess/source/ui/querydesign/query.src
@@ -217,6 +217,11 @@
Text [ en-US ] = "Field;Alias;Table;Sort;Visible;Function;Criterion;Or;Or";
};
+String STR_QUERY_LIMIT_ALL
+{
+ Text [ en-US ] = "All";
+};
+
String STR_QRY_TOO_MANY_COLUMNS
{
Text [ en-US ] = "There are too many columns.";
diff --git a/dbaccess/source/ui/querydesign/querycontroller.cxx b/dbaccess/source/ui/querydesign/querycontroller.cxx
index 31e6d18..1ed5d82d 100644
--- a/dbaccess/source/ui/querydesign/querycontroller.cxx
+++ b/dbaccess/source/ui/querydesign/querycontroller.cxx
@@ -63,6 +63,7 @@
#include <com/sun/star/util/XCloseable.hpp>
#include <com/sun/star/util/VetoException.hpp>
#include <com/sun/star/frame/XUntitledNumbers.hpp>
+#include <com/sun/star/ui/XUIElement.hpp>
#include <comphelper/basicio.hxx>
#include <comphelper/extract.hxx>
@@ -246,6 +247,7 @@
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::sdb;
+using namespace ::com::sun::star::ui;
using namespace ::com::sun::star::ui::dialogs;
using namespace ::com::sun::star::awt;
using namespace ::dbtools;
@@ -274,6 +276,27 @@
}
xLayoutManager->unlock();
xLayoutManager->doLayout();
+ }
+ }
+
+ /**
+ * The value of m_sLimit is updated when LimitBox loose its focus
+ * So in those case when execution needs recent data, grab the focus
+ * (e.g. execute SQL statment, change views)
+ */
+ void grabFocusFromLimitBox( OQueryController& _rController )
+ {
+ static const OUString sResourceURL( "private:resource/toolbar/designobjectbar" );
+ Reference< XLayoutManager > xLayoutManager = _rController.getLayoutManager( _rController.getFrame() );
+ Reference< XUIElement > xUIElement = xLayoutManager->getElement(sResourceURL);
+ if (xUIElement.is())
+ {
+ Reference< XWindow > xWindow(xUIElement->getRealInterface(), css::uno::UNO_QUERY);
+ Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
+ if( pWindow || pWindow->HasChildPathFocus() )
+ {
+ pWindow->GrabFocusToDocument();
+ }
}
}
}
@@ -314,6 +337,7 @@
,m_pParseContext( new svxform::OSystemParseContext )
,m_aSqlParser( _rM, m_pParseContext )
,m_pSqlIterator(NULL)
+ ,m_sLimit( OUString() )
,m_nVisibleRows(0x400)
,m_nSplitPos(-1)
,m_nCommandType( CommandType::QUERY )
@@ -522,6 +546,11 @@
aReturn.bEnabled = m_bGraphicalDesign && isEditable();
aReturn.bChecked = m_bDistinct;
break;
+ case SID_QUERY_LIMIT:
+ aReturn.bEnabled = m_bGraphicalDesign;
+ if( aReturn.bEnabled )
+ aReturn.aValue = makeAny( m_sLimit );
+ break;
case ID_BROWSER_QUERY_EXECUTE:
aReturn.bEnabled = sal_True;
break;
@@ -561,6 +590,7 @@
break;
case ID_BROWSER_SAVEASDOC:
case ID_BROWSER_SAVEDOC:
+ grabFocusFromLimitBox(*this);
doSaveAsDoc(ID_BROWSER_SAVEASDOC == _nId);
break;
case SID_RELATION_ADD_RELATION:
@@ -583,6 +613,7 @@
break;
case ID_BROWSER_SQL:
{
+ grabFocusFromLimitBox(*this);
if ( !getContainer()->checkStatement() )
break;
SQLExceptionInfo aError;
@@ -689,7 +720,15 @@
m_bDistinct = !m_bDistinct;
setModified(sal_True);
break;
+ case SID_QUERY_LIMIT:
+ if ( aArgs.getLength() == 1 && aArgs[0].Name == "DBLimit.Value" )
+ {
+ aArgs[0].Value >>= m_sLimit;
+ setModified(sal_True);
+ }
+ break;
case ID_BROWSER_QUERY_EXECUTE:
+ grabFocusFromLimitBox(*this);
if ( getContainer()->checkStatement() )
executeQuery();
break;
@@ -1120,6 +1159,7 @@
implDescribeSupportedFeature( ".uno:SbaExecuteSql", ID_BROWSER_QUERY_EXECUTE, CommandGroup::VIEW );
implDescribeSupportedFeature( ".uno:DBAddRelation", SID_RELATION_ADD_RELATION, CommandGroup::EDIT );
implDescribeSupportedFeature( ".uno:DBQueryPreview", SID_DB_QUERY_PREVIEW, CommandGroup::VIEW );
+ implDescribeSupportedFeature( ".uno:DBLimit", SID_QUERY_LIMIT, CommandGroup::FORMAT );
#if OSL_DEBUG_LEVEL > 1
implDescribeSupportedFeature( ".uno:DBShowParseTree", ID_EDIT_QUERY_SQL );
diff --git a/dbaccess/uiconfig/dbquery/toolbar/designobjectbar.xml b/dbaccess/uiconfig/dbquery/toolbar/designobjectbar.xml
index 64cc4bf..a25548f 100644
--- a/dbaccess/uiconfig/dbquery/toolbar/designobjectbar.xml
+++ b/dbaccess/uiconfig/dbquery/toolbar/designobjectbar.xml
@@ -24,4 +24,5 @@
<toolbar:toolbaritem xlink:href=".uno:DBViewTableNames" toolbar:helpid="helpid:12298" toolbar:text="" toolbar:style="" />
<toolbar:toolbaritem xlink:href=".uno:DBViewAliases" toolbar:helpid="helpid:12299" toolbar:text="" toolbar:style="" />
<toolbar:toolbaritem xlink:href=".uno:DBDistinctValues" toolbar:helpid="helpid:12300" toolbar:text="" toolbar:style="" />
-</toolbar:toolbar>
\ No newline at end of file
+ <toolbar:toolbaritem xlink:href=".uno:DBLimit" />
+</toolbar:toolbar>
diff --git a/dbaccess/util/dbu.component b/dbaccess/util/dbu.component
index 17d3ab9..afd9002 100644
--- a/dbaccess/util/dbu.component
+++ b/dbaccess/util/dbu.component
@@ -104,4 +104,7 @@
<implementation name="org.openoffice.comp.dbu.OViewDesign">
<service name="com.sun.star.sdb.ViewDesign"/>
</implementation>
+ <implementation name="org.libreoffice.comp.dbu.LimitBoxController">
+ <service name="com.sun.star.frame.ToolbarController"/>
+ </implementation>
</component>
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
index fe27c05..2f40b2a 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
@@ -187,6 +187,17 @@
<value>com.sun.star.sdb.ApplicationToolboxController</value>
</prop>
</node>
+ <node oor:name="org.libreoffice.comp.dbu.LimitBoxController" oor:op="replace">
+ <prop oor:name="Command">
+ <value>.uno:DBLimit</value>
+ </prop>
+ <prop oor:name="Module">
+ <value/>
+ </prop>
+ <prop oor:name="Controller">
+ <value>org.libreoffice.comp.dbu.LimitBoxController</value>
+ </prop>
+ </node>
<node oor:name="c2" oor:op="replace">
<prop oor:name="Command">
<value>.uno:Refresh</value>
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/DbuCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/DbuCommands.xcu
index f3c3c56..44f2d42 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/DbuCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/DbuCommands.xcu
@@ -72,6 +72,11 @@
<value>1</value>
</prop>
</node>
+ <node oor:name=".uno:DBLimit" oor:op="replace">
+ <prop oor:name="Label" oor:type="xs:string">
+ <value xml:lang="en-US">Limit</value>
+ </prop>
+ </node>
<node oor:name=".uno:PasteSpecial" oor:op="replace">
<prop oor:name="Label" oor:type="xs:string">
<value xml:lang="en-US">Paste ~Special...</value>
--
To view, visit https://gerrit.libreoffice.org/1994
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0eb09d1d40cfdb9b8a2a57ab8911faca91d5e690
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Zolnai Tamás <zolnaitamas2000 at gmail.com>
More information about the LibreOffice
mailing list