office-gobmx/dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx
Release Engineers cb1400a076 CWS-TOOLING: integrate CWS dba32c
2009-06-29 20:53:25 +0200 fs  r273484 : #i103138# Rectangle conversion
2009-06-29 20:51:50 +0200 fs  r273483 : #i103138# yet more refactoring, now also setting the proper zoom level at the proper point in time
2009-06-29 13:40:26 +0200 fs  r273470 : added svn:ignore to ignore output paths
2009-06-29 10:08:54 +0200 fs  r273455 : #i103138#
refactored the code for positioning/zooming the control
Basically, we now allow adjustControlGeometry_throw (formerly known as positionControl_throw and setControlZoom) to
take an additional ViewTransformation parameter, describing the transformation to obtain the actual
control position/size. Consequently, positionControl itself also allows for a ViewTransformation parameter.
This has become necessary since during painting, the device which we created our control for might not necessarily
have a proper MapMode set. In this case, if we would use this map mode for calculating the control's position/size,
this would lead to wrong results.
Note that this problem was introduced by the fix for #i101398#: During the fix, we postponed the control creation
to a later time (when it is really needed). At this later time, the MapMode at the device is broken, at the earlier
time where we formerly crearted the control (createPrimitive2DSequence), it is not yet broken.
Whether or not the MapMode is defined as "broken" might depend on one's point of view, however ...
I consider it broken, since:
- we need the map mode to obtain the proper zoom level, which is to be forwarded to the control
- there are scenarios where the MapMode is *not* set to MAP_PIXEL (in those scenarios, everything works
  fine), and there are scenarios where it *is* set to MAP_PIXEL (in those the bug 103138 appears).
It somehow feels wrong that one cannot rely on the device's map mode this way, but on the other hand
one has no possibility to obtain the current zoom by other means.
Note that one issue (still to be submitted) is left: In the page pane of a Draw/Impress document, controls
have a wrong text size. This is because in this pane, the above-mentioned "broken" map mode is used,
which means the controls have a zoom of "1:1" set, which is wrong here.
2009-06-25 13:41:35 +0200 msc  r273380 : #100000# the tabs changed die to new properties
2009-06-24 12:42:40 +0200 msc  r273330 : #102082# remove issue warning
2009-06-22 10:43:14 +0200 fs  r273201 : createPrimitive2DSequence: care for being disposed
2009-06-18 12:35:13 +0200 oj  r273109 : #i102305# make nooptfiles for gcc
2009-06-17 12:14:37 +0200 oj  r273056 : #i102305# fix for linux
2009-06-17 07:20:22 +0200 oj  r273046 : #i102305# move ValueTransfer into the for loop to avoid a crash under Linux
2009-06-17 07:17:28 +0200 oj  r273045 : #i102305# use varchar
2009-06-15 14:11:27 +0200 fs  r272983 : added since tag
2009-06-15 12:11:39 +0200 oj  r272973 : #i102305# SAL_DLLPUBLIC_EXPORT inserted
2009-06-15 11:08:53 +0200 fs  r272969 : #i10000#
2009-06-15 09:25:13 +0200 fs  r272963 : merging fix for P1 issue #i102701#
2009-06-11 11:31:24 +0200 fs  r272858 : #i10000# copied the fix which before the rebase was done in ../dialog/macropg.src
2009-06-11 09:38:14 +0200 fs  r272846 : CWS-TOOLING: rebase CWS dba32c to trunk@272827 (milestone: DEV300:m50)
2009-06-02 09:53:10 +0200 fs  r272483 : #i10000#
2009-05-29 15:55:03 +0200 fs  r272465 : #i100818#
2009-05-29 12:58:43 +0200 fs  r272452 : don't apply comphelper::getString on possibly VOID any
2009-05-29 10:38:35 +0200 oj  r272437 : #i101519# handle where condition
2009-05-29 09:53:39 +0200 fs  r272434 : #i100818# call into releaseStubs /without/ locked GlobalMutex
2009-05-28 07:53:44 +0200 oj  r272375 : #i101369# parse tree changed
2009-05-27 14:53:36 +0200 fs  r272347 : #i10000#
2009-05-27 09:29:15 +0200 oj  r272327 : #i101626# check for double before hard cast
2009-05-27 09:13:58 +0200 oj  r272326 : #i101626# handle void correctly
2009-05-27 08:04:39 +0200 oj  r272321 : #i102256# wrong method signature used
2009-05-27 07:55:52 +0200 oj  r272320 : #i101519# look up parameter typ if used in function
2009-05-27 06:49:07 +0200 oj  r272319 : #i101519# set parameter from rowset as well
2009-05-26 13:30:56 +0200 oj  r272297 : #i101987# impl XBatchExecution
2009-05-26 12:44:34 +0200 oj  r272293 : #i101700# check if group is not set
2009-05-26 12:16:53 +0200 oj  r272290 : #i101369# resolved some reduce7reduce problems with boolean_term and search_condition
2009-05-26 12:12:42 +0200 oj  r272289 : #i101369# fix for or on one line criteria
2009-05-25 16:02:25 +0200 fs  r272257 : #i999704# +PROPERTY_MOUSE_WHEEL_BEHAVIOR
2009-05-25 16:01:55 +0200 fs  r272256 : merging the changes from CWS dba32b herein
2009-05-25 15:49:57 +0200 fs  r272254 : #i999704#
2009-05-25 15:32:57 +0200 fs  r272252 : #i99704# grid columns also to respect the MouseWheelBehavior property
2009-05-25 15:23:43 +0200 fs  r272251 : don't pass empty Anys to ::comphelper::getString
2009-05-25 14:48:43 +0200 fs  r272248 : merged changes from CWS dba32b herein
2009-05-25 14:44:40 +0200 fs  r272247 : #i99704# support new MouseWheelBehavior property
2009-05-25 14:43:18 +0200 fs  r272246 : #i99704# WheelWithoutFocus (peer property) superseded by MouseWheelBehavior (model property)
2009-05-25 14:41:03 +0200 fs  r272245 : #i99704# no need to set the mouse wheel behavior at the peer, this is now a model property, having the right default
2009-05-25 14:39:31 +0200 fs  r272243 : removed dead import
2009-05-25 14:35:36 +0200 fs  r272242 : the new EnableVisible doesn't make sense for grid columns
2009-05-25 14:34:33 +0200 fs  r272241 : #i99704# +MouseWheelBehavior - allow to enable/disable the mouse wheel for the control, or make it focus-dependent
2009-05-25 14:26:11 +0200 fs  r272240 : #i99704# change MouseSettings wheel flag (NoWheelActionWithoutFocus) to a three-state option, allowing to completely ignore the mouse wheel
2009-05-23 21:35:59 +0200 fs  r272213 : localize 'sub component opened/closed' event
2009-05-22 21:42:47 +0200 fs  r272211 : #i102003#
2009-05-22 21:42:20 +0200 fs  r272210 : grammar
2009-05-22 21:36:10 +0200 fs  r272209 : #i102140# load only once, not twice, and show error messages during loading (and during any form action, that is) asynchronously
2009-05-22 21:35:11 +0200 fs  r272208 : #i102140# +clear
2009-05-22 14:50:30 +0200 fs  r272194 : #i102139# for newly created DB docs, set the MacroExecutionMode to USE_CONFIG
2009-05-22 12:03:42 +0200 fs  r272180 : #i88878#
provided by noel.power@novell.com
implement a visibility property (EnableVisible) for toolkit controls, and usage in forms and UNO dialogs
2009-05-15 15:37:31 +0200 fs  r271942 : #i100671# corrected some @since tags, so autodoc has better chances of correctly reading them
2009-05-15 15:33:11 +0200 fs  r271940 : don't call comphelper::getFOO for VOID values
2009-05-15 15:08:31 +0200 fs  r271937 : includes
2009-05-15 13:39:22 +0200 fs  r271934 : #i101398# createPrimitive2DSequence: when we already have a control, use the old code. In particular, call positionControlForPaint
2009-05-15 12:33:48 +0200 fs  r271933 : make the geometry a part of the ControlPrimitive2D's identity
2009-05-15 10:15:44 +0200 fs  r271928 : #i10000#
2009-05-14 20:55:38 +0200 fs  r271921 : #i101398# don't reuse the name PRIMITIVE_ID_CONTROLPRIMITIVE2D, make the name of our own ControlPrimitive2D unique
2009-05-14 20:55:31 +0200 fs  r271920 : #i101398# don't reuse the name PRIMITIVE_ID_CONTROLPRIMITIVE2D, make the name of our own ControlPrimitive2D unique
2009-05-14 20:23:23 +0200 fs  r271919 : #i101622#
2009-05-14 16:04:38 +0200 fs  r271898 : don't use comphelper::getInt32 on voids
2009-05-14 16:04:12 +0200 fs  r271897 : merge fix for issue whose number just slipped my memory ... (originally fixed in CWS dba32b)
2009-05-14 15:36:55 +0200 fs  r271895 : merging changes from DEV300:m48
2009-05-07 14:43:19 +0200 fs  r271670 : #i101477#
2009-05-07 14:37:30 +0200 fs  r271668 : #i101477#
2009-05-07 09:27:30 +0200 oj  r271628 : #i101343# remove pch
2009-05-06 09:36:02 +0200 fs  r271568 : getFoo: diagnostics
2009-05-04 09:23:06 +0200 oj  r271438 : CWS-TOOLING: rebase CWS dba32c to trunk@271427 (milestone: DEV300:m47)
2009-04-29 23:18:13 +0200 fs  r271394 : #i101398# use a dedicated 2DPrimitive for UNO Controls, which is able to provide the B2DRange *without* actually creating the control
2009-04-29 13:52:25 +0200 fs  r271366 : #i101308#
2009-07-03 14:21:50 +00:00

2873 lines
113 KiB
C++
Raw Blame History

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: SelectionBrowseBox.cxx,v $
* $Revision: 1.83 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_dbaccess.hxx"
#ifndef DBAUI_QUERYDESIGN_OSELECTIONBROWSEBOX_HXX
#include "SelectionBrowseBox.hxx"
#endif
#ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_
#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
#include <com/sun/star/sdbc/DataType.hpp>
#endif
#ifndef DBAUI_QUERYDESIGNVIEW_HXX
#include "QueryDesignView.hxx"
#endif
#ifndef DBAUI_QUERYCONTROLLER_HXX
#include "querycontroller.hxx"
#endif
#ifndef DBAUI_QUERYTABLEVIEW_HXX
#include "QueryTableView.hxx"
#endif
#ifndef DBACCESS_UI_BROWSER_ID_HXX
#include "browserids.hxx"
#endif
#ifndef _COMPHELPER_TYPES_HXX_
#include <comphelper/types.hxx>
#endif
#ifndef DBAUI_TABLEFIELDINFO_HXX
#include "TableFieldInfo.hxx"
#endif
#ifndef _DBU_QRY_HRC_
#include "dbu_qry.hrc"
#endif
#ifndef _DBA_DBACCESS_HELPID_HRC_
#include "dbaccess_helpid.hrc"
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
#include "dbustrings.hrc"
#endif
#ifndef DBAUI_QUERY_TABLEWINDOW_HXX
#include "QTableWindow.hxx"
#endif
#ifndef DBAUI_QUERYTABLEVIEW_HXX
#include "QueryTableView.hxx"
#endif
#ifndef _SV_MSGBOX_HXX
#include <vcl/msgbox.hxx>
#endif
#ifndef DBAUI_QUERYDESIGNFIELDUNDOACT_HXX
#include "QueryDesignFieldUndoAct.hxx"
#endif
#ifndef _SVX_DBEXCH_HRC
#include <svx/dbexch.hrc>
#endif
#ifndef _COMPHELPER_STLTYPES_HXX_
#include <comphelper/stl_types.hxx>
#endif
#ifndef _COMPHELPER_EXTRACT_HXX_
#include <comphelper/extract.hxx>
#endif
#ifndef _DBAUI_SQLMESSAGE_HXX_
#include "sqlmessage.hxx"
#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif
using namespace ::svt;
using namespace ::dbaui;
using namespace ::connectivity;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::accessibility;
const String g_strOne = String::CreateFromAscii("1");
const String g_strZero = String::CreateFromAscii("0");
#define DEFAULT_QUERY_COLS 20
#define DEFAULT_SIZE GetTextWidth(g_strZero) * 30
#define CHECKBOX_SIZE 10
#define HANDLE_ID 0
#define HANDLE_COLUMN_WITDH 70
#define SQL_ISRULEOR2(pParseNode, e1,e2) ((pParseNode)->isRule() && (\
(pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e1) || \
(pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e2)))
// -----------------------------------------------------------------------------
namespace
{
sal_Bool isFieldNameAsterix(const ::rtl::OUString& _sFieldName )
{
sal_Bool bAsterix = !(_sFieldName.getLength() && _sFieldName.toChar() != '*');
if ( !bAsterix )
{
String sName = _sFieldName;
xub_StrLen nTokenCount = sName.GetTokenCount('.');
if ( (nTokenCount == 2 && sName.GetToken(1,'.').GetChar(0) == '*' )
|| (nTokenCount == 3 && sName.GetToken(2,'.').GetChar(0) == '*' ) )
{
bAsterix = sal_True;
}
}
return bAsterix;
}
// -----------------------------------------------------------------------------
sal_Bool lcl_SupportsCoreSQLGrammar(const Reference< XConnection>& _xConnection)
{
sal_Bool bSupportsCoreGrammar = sal_False;
if ( _xConnection.is() )
{
try
{
Reference< XDatabaseMetaData > xMetaData = _xConnection->getMetaData();
bSupportsCoreGrammar = xMetaData.is() && xMetaData->supportsCoreSQLGrammar();
}
catch(Exception&)
{
}
}
return bSupportsCoreGrammar;
}
}
DBG_NAME(OSelectionBrowseBox)
//------------------------------------------------------------------------------
OSelectionBrowseBox::OSelectionBrowseBox( Window* pParent )
:EditBrowseBox( pParent,EBBF_NOROWPICTURE, WB_3DLOOK, BROWSER_COLUMNSELECTION | BROWSER_KEEPSELECTION | BROWSER_HIDESELECT |
BROWSER_HIDECURSOR | BROWSER_HLINESFULL | BROWSER_VLINESFULL )
,m_aFunctionStrings(ModuleRes(STR_QUERY_FUNCTIONS))
,m_nVisibleCount(0)
,m_bOrderByUnRelated(sal_True)
,m_bGroupByUnRelated(sal_True)
,m_bStopTimer(sal_False)
,m_bWasEditing(sal_False)
,m_bDisableErrorBox(sal_False)
,m_bInUndoMode(sal_False)
{
DBG_CTOR(OSelectionBrowseBox,NULL);
SetHelpId(HID_CTL_QRYDGNCRIT);
m_nMode = BROWSER_COLUMNSELECTION | BROWSER_HIDESELECT
| BROWSER_KEEPSELECTION | BROWSER_HIDECURSOR
| BROWSER_HLINESFULL | BROWSER_VLINESFULL
| BROWSER_HEADERBAR_NEW ;
m_pTextCell = new Edit(&GetDataWindow(), 0);
// m_pTextCell->EnableSpecialCheck(sal_False);
m_pVisibleCell = new CheckBoxControl(&GetDataWindow());
m_pTableCell = new ListBoxControl(&GetDataWindow()); m_pTableCell->SetDropDownLineCount( 20 );
m_pFieldCell = new ComboBoxControl(&GetDataWindow()); m_pFieldCell->SetDropDownLineCount( 20 );
m_pOrderCell = new ListBoxControl(&GetDataWindow());
m_pFunctionCell = new ListBoxControl(&GetDataWindow()); m_pFunctionCell->SetDropDownLineCount( 20 );
m_pVisibleCell->SetHelpId(HID_QRYDGN_ROW_VISIBLE);
m_pTableCell->SetHelpId(HID_QRYDGN_ROW_TABLE);
m_pFieldCell->SetHelpId(HID_QRYDGN_ROW_FIELD);
m_pOrderCell->SetHelpId(HID_QRYDGN_ROW_ORDER);
m_pFunctionCell->SetHelpId(HID_QRYDGN_ROW_FUNCTION);
//////////////////////////////////////////////////////////////////////
// TriState der ::com::sun::star::form::CheckBox abschalten
m_pVisibleCell->GetBox().EnableTriState( sal_False );
// m_pEmptyEntry = new OTableFieldDesc();
// m_pEmptyEntry->SetColWidth(DEFAULT_SIZE);
Font aTitleFont = OutputDevice::GetDefaultFont( DEFAULTFONT_SANS_UNICODE,Window::GetSettings().GetLanguage(),DEFAULTFONT_FLAGS_ONLYONE);
aTitleFont.SetSize(Size(0, 6));
SetTitleFont(aTitleFont);
String aTxt(ModuleRes(STR_QUERY_SORTTEXT));
xub_StrLen nCount = aTxt.GetTokenCount();
xub_StrLen nIdx = 0;
for (; nIdx < nCount; nIdx++)
m_pOrderCell->InsertEntry(aTxt.GetToken(nIdx));
for(long i=0;i < BROW_ROW_CNT;i++)
m_bVisibleRow.push_back(sal_True);
m_bVisibleRow[BROW_FUNCTION_ROW] = sal_False; // zuerst ausblenden
m_timerInvalidate.SetTimeout(200);
m_timerInvalidate.SetTimeoutHdl(LINK(this, OSelectionBrowseBox, OnInvalidateTimer));
m_timerInvalidate.Start();
}
//------------------------------------------------------------------------------
OSelectionBrowseBox::~OSelectionBrowseBox()
{
DBG_DTOR(OSelectionBrowseBox,NULL);
delete m_pTextCell;
delete m_pVisibleCell;
delete m_pFieldCell;
delete m_pTableCell;
delete m_pOrderCell;
delete m_pFunctionCell;
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::initialize()
{
Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
if(xConnection.is())
{
const IParseContext& rContext = static_cast<OQueryController&>(getDesignView()->getController()).getParser().getContext();
IParseContext::InternationalKeyCode eFunctions[] = { IParseContext::KEY_AVG,IParseContext::KEY_COUNT,IParseContext::KEY_MAX
,IParseContext::KEY_MIN,IParseContext::KEY_SUM
,IParseContext::KEY_EVERY
,IParseContext::KEY_ANY
,IParseContext::KEY_SOME
,IParseContext::KEY_STDDEV_POP
,IParseContext::KEY_STDDEV_SAMP
,IParseContext::KEY_VAR_SAMP
,IParseContext::KEY_VAR_POP
,IParseContext::KEY_COLLECT
,IParseContext::KEY_FUSION
,IParseContext::KEY_INTERSECTION
};
String sGroup = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount() - 1);
m_aFunctionStrings = m_aFunctionStrings.GetToken(0);
for (size_t i = 0; i < sizeof(eFunctions)/sizeof(eFunctions[0]) ; ++i)
{
m_aFunctionStrings += String(RTL_CONSTASCII_USTRINGPARAM(";"));
m_aFunctionStrings += String(ByteString(rContext.getIntlKeywordAscii(eFunctions[i])),RTL_TEXTENCODING_UTF8);
} // for (sal_Int32 i = 0; i < sizeof(eFunctions)/sizeof(eFunctions[0]) ; ++i)
m_aFunctionStrings += String(RTL_CONSTASCII_USTRINGPARAM(";"));
m_aFunctionStrings += sGroup;
// Diese Funktionen stehen nur unter CORE zur Verf<72>gung
if ( lcl_SupportsCoreSQLGrammar(xConnection) )
{
xub_StrLen nCount = m_aFunctionStrings.GetTokenCount();
for (xub_StrLen nIdx = 0; nIdx < nCount; nIdx++)
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(nIdx));
}
else // sonst nur COUNT(*)
{
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(0));
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT
}
try
{
Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
if ( xMetaData.is() )
{
m_bOrderByUnRelated = xMetaData->supportsOrderByUnrelated();
m_bGroupByUnRelated = xMetaData->supportsGroupByUnrelated();
}
}
catch(Exception&)
{
}
}
Init();
}
//==============================================================================
OQueryDesignView* OSelectionBrowseBox::getDesignView()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OSL_ENSURE(static_cast<const OQueryDesignView*>(GetParent()),"Parent isn't an OQueryDesignView!");
return static_cast<OQueryDesignView*>(GetParent());
}
// -----------------------------------------------------------------------------
OQueryDesignView* OSelectionBrowseBox::getDesignView() const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OSL_ENSURE(static_cast<const OQueryDesignView*>(GetParent()),"Parent isn't an OQueryDesignView!");
return static_cast<OQueryDesignView*>(GetParent());
}
namespace
{
class OSelectionBrwBoxHeader : public ::svt::EditBrowserHeader
{
OSelectionBrowseBox* m_pBrowseBox;
protected:
virtual void Select();
public:
OSelectionBrwBoxHeader(OSelectionBrowseBox* pParent);
};
OSelectionBrwBoxHeader::OSelectionBrwBoxHeader(OSelectionBrowseBox* pParent)
: ::svt::EditBrowserHeader(pParent,WB_BUTTONSTYLE|WB_DRAG)
,m_pBrowseBox(pParent)
{
}
void OSelectionBrwBoxHeader::Select()
{
EditBrowserHeader::Select();
m_pBrowseBox->GrabFocus();
BrowserMode nMode = m_pBrowseBox->GetMode();
if ( 0 == m_pBrowseBox->GetSelectColumnCount() )
{
m_pBrowseBox->DeactivateCell();
// wenn es schon eine selektierte Spalte gibt, bin ich schon im richtigen Modus
if ( BROWSER_HIDESELECT == ( nMode & BROWSER_HIDESELECT ) )
{
nMode &= ~BROWSER_HIDESELECT;
nMode |= BROWSER_MULTISELECTION;
m_pBrowseBox->SetMode( nMode );
}
}
m_pBrowseBox->SelectColumnId( GetCurItemId() );
m_pBrowseBox->DeactivateCell();
}
}
// -----------------------------------------------------------------------------
BrowserHeader* OSelectionBrowseBox::imp_CreateHeaderBar(BrowseBox* /*pParent*/)
{
return new OSelectionBrwBoxHeader(this);
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::ColumnMoved( USHORT nColId,BOOL _bCreateUndo )
{
EditBrowseBox::ColumnMoved( nColId );
// swap the two columns
USHORT nNewPos = GetColumnPos( nColId );
OTableFields& rFields = getFields();
if ( rFields.size() > USHORT(nNewPos-1) )
{
USHORT nOldPos = 0;
OTableFields::iterator aEnd = rFields.end();
OTableFields::iterator aIter = rFields.begin();
for (; aIter != aEnd && ( (*aIter)->GetColumnId() != nColId ); ++aIter,++nOldPos)
;
OSL_ENSURE( (nNewPos-1) != nOldPos && nOldPos < rFields.size(),"Old and new position are equal!");
if ( aIter != aEnd )
{
OTableFieldDescRef pOldEntry = rFields[nOldPos];
rFields.erase(rFields.begin() + nOldPos);
rFields.insert(rFields.begin() + nNewPos - 1,pOldEntry);
// create the undo action
if ( !m_bInUndoMode && _bCreateUndo )
{
OTabFieldMovedUndoAct* pUndoAct = new OTabFieldMovedUndoAct(this);
pUndoAct->SetColumnPosition( nOldPos + 1);
pUndoAct->SetTabFieldDescr(pOldEntry);
getDesignView()->getController().addUndoActionAndInvalidate(pUndoAct);
} // if ( !m_bInUndoMode && _bCreateUndo )
}
}
else
OSL_ENSURE(0,"Invalid column id!");
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::Init()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
EditBrowseBox::Init();
// set the header bar
BrowserHeader* pNewHeaderBar = CreateHeaderBar(this);
pNewHeaderBar->SetMouseTransparent(sal_False);
SetHeaderBar(pNewHeaderBar);
SetMode(m_nMode);
Font aFont( GetDataWindow().GetFont() );
aFont.SetWeight( WEIGHT_NORMAL );
GetDataWindow().SetFont( aFont );
Size aHeight;
const Control* pControls[] = { m_pTextCell,m_pVisibleCell,m_pTableCell,m_pFieldCell };
for(sal_Size i= 0; i < sizeof(pControls)/sizeof(pControls[0]);++i)
{
const Size aTemp( pControls[i]->GetOptimalSize(WINDOWSIZE_PREFERRED) );
if ( aTemp.Height() > aHeight.Height() )
aHeight.Height() = aTemp.Height();
} // for(int i= 0; i < sizeof(pControls)/sizeof(pControls[0]);++i
SetDataRowHeight(aHeight.Height());
SetTitleLines(1);
// Anzahl der sichtbaren Zeilen ermitteln
for(long i=0;i<BROW_ROW_CNT;i++)
{
if(m_bVisibleRow[i])
m_nVisibleCount++;
}
RowInserted(0, m_nVisibleCount, sal_False);
try
{
Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
if(xConnection.is())
{
Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
m_nMaxColumns = xMetaData.is() ? xMetaData->getMaxColumnsInSelect() : 0;
}
else
m_nMaxColumns = 0;
}
catch(const SQLException&)
{
OSL_ENSURE(0,"Catched Exception when asking for database metadata options!");
m_nMaxColumns = 0;
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::PreFill()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
SetUpdateMode(sal_False);
if (GetCurRow() != 0)
GoToRow(0);
static_cast< OQueryController& >( getDesignView()->getController() ).clearFields();
DeactivateCell();
RemoveColumns();
InsertHandleColumn( HANDLE_COLUMN_WITDH );
SetUpdateMode(sal_True);
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::ClearAll()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
SetUpdateMode(sal_False);
OTableFields::reverse_iterator aIter = getFields().rbegin();
for ( ;aIter != getFields().rend(); ++aIter )
{
if ( !(*aIter)->IsEmpty() )
{
RemoveField( (*aIter)->GetColumnId() );
aIter = getFields().rbegin();
}
}
SetUpdateMode(sal_True);
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetReadOnly(sal_Bool bRO)
{
if (bRO)
{
DeactivateCell();
m_nMode &= ~BROWSER_HIDECURSOR;
SetMode(m_nMode);
}
else
{
m_nMode |= BROWSER_HIDECURSOR;
SetMode(m_nMode);
ActivateCell();
}
}
//------------------------------------------------------------------------------
CellController* OSelectionBrowseBox::GetController(long nRow, sal_uInt16 nColId)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if ( nColId > getFields().size() )
return NULL;
OTableFieldDescRef pEntry = getFields()[nColId-1];
DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::GetController : keine FieldDescription !");
if (!pEntry.isValid())
return NULL;
if (static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly())
return NULL;
long nCellIndex = GetRealRow(nRow);
switch (nCellIndex)
{
case BROW_FIELD_ROW:
return new ComboBoxCellController(m_pFieldCell);
case BROW_TABLE_ROW:
return new ListBoxCellController(m_pTableCell);
case BROW_VIS_ROW:
return new CheckBoxCellController(m_pVisibleCell);
case BROW_ORDER_ROW:
return new ListBoxCellController(m_pOrderCell);
case BROW_FUNCTION_ROW:
return new ListBoxCellController(m_pFunctionCell);
default:
return new EditCellController(m_pTextCell);
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::InitController(CellControllerRef& /*rController*/, long nRow, sal_uInt16 nColId)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OSL_ENSURE(nColId != BROWSER_INVALIDID,"An Invalid Id was set!");
if ( nColId == BROWSER_INVALIDID )
return;
USHORT nPos = GetColumnPos(nColId);
if ( nPos == 0 || nPos == BROWSER_INVALIDID || nPos > getFields().size() )
return;
OTableFieldDescRef pEntry = getFields()[nPos-1];
DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::InitController : keine FieldDescription !");
long nCellIndex = GetRealRow(nRow);
switch (nCellIndex)
{
case BROW_FIELD_ROW:
{
m_pFieldCell->Clear();
m_pFieldCell->SetText(String());
String aField(pEntry->GetField());
String aTable(pEntry->GetAlias());
getDesignView()->fillValidFields(aTable, m_pFieldCell);
// * durch alias.* ersetzen
if ((aField.GetChar(0) == '*') && aTable.Len())
{
aField = aTable;
aField.AppendAscii(".*");
}
m_pFieldCell->SetText(aField);
} break;
case BROW_TABLE_ROW:
{
m_pTableCell->Clear();
enableControl(pEntry,m_pTableCell);
if ( !pEntry->isCondition() )
{
OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
if (pTabWinList)
{
OJoinTableView::OTableWindowMap::iterator aIter = pTabWinList->begin();
OJoinTableView::OTableWindowMap::iterator aEnd = pTabWinList->end();
for(;aIter != aEnd;++aIter)
m_pTableCell->InsertEntry(static_cast<OQueryTableWindow*>(aIter->second)->GetAliasName());
m_pTableCell->InsertEntry(String(ModuleRes(STR_QUERY_NOTABLE)), 0);
if (pEntry->GetAlias().getLength())
m_pTableCell->SelectEntry(pEntry->GetAlias());
else
m_pTableCell->SelectEntry(String(ModuleRes(STR_QUERY_NOTABLE)));
}
}
} break;
case BROW_VIS_ROW:
{
m_pVisibleCell->GetBox().Check(pEntry->IsVisible());
m_pVisibleCell->GetBox().SaveValue();
enableControl(pEntry,m_pTextCell);
if(!pEntry->IsVisible() && pEntry->GetOrderDir() != ORDER_NONE && !m_bOrderByUnRelated)
{
// Spalte muss sichtbar sein, um im ORDER BY aufzutauchen
pEntry->SetVisible(sal_True);
m_pVisibleCell->GetBox().Check(pEntry->IsVisible());
m_pVisibleCell->GetBox().SaveValue();
m_pVisibleCell->GetBox().Disable();
m_pVisibleCell->GetBox().EnableInput(sal_False);
String aMessage(ModuleRes(STR_QRY_ORDERBY_UNRELATED));
OQueryDesignView* paDView = getDesignView();
InfoBox(paDView, aMessage).Execute();
}
} break;
case BROW_ORDER_ROW:
m_pOrderCell->SelectEntryPos(
sal::static_int_cast< USHORT >(pEntry->GetOrderDir()));
enableControl(pEntry,m_pOrderCell);
break;
case BROW_COLUMNALIAS_ROW:
setTextCellContext(pEntry,pEntry->GetFieldAlias(),HID_QRYDGN_ROW_ALIAS);
break;
case BROW_FUNCTION_ROW:
setFunctionCell(pEntry);
break;
default:
{
sal_uInt16 nIdx = sal_uInt16(nCellIndex - BROW_CRIT1_ROW);
setTextCellContext(pEntry,pEntry->GetCriteria( nIdx ),HID_QRYDGN_ROW_CRIT);
}
}
Controller()->ClearModified();
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::notifyTableFieldChanged(const String& _sOldAlias,const String& _sAlias,sal_Bool& _bListAction,USHORT _nColumnId)
{
appendUndoAction(_sOldAlias,_sAlias,BROW_TABLE_ROW,_bListAction);
if ( m_bVisibleRow[BROW_TABLE_ROW] )
RowModified(GetBrowseRow(BROW_TABLE_ROW), _nColumnId);
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::notifyFunctionFieldChanged(const String& _sOldFunctionName,const String& _sFunctionName,sal_Bool& _bListAction,USHORT _nColumnId)
{
appendUndoAction(_sOldFunctionName,_sFunctionName,BROW_FUNCTION_ROW,_bListAction);
if ( !m_bVisibleRow[BROW_FUNCTION_ROW] )
SetRowVisible(BROW_FUNCTION_ROW, sal_True);
RowModified(GetBrowseRow(BROW_FUNCTION_ROW), _nColumnId);
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::clearEntryFunctionField(const String& _sFieldName,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction,USHORT _nColumnId)
{
if ( isFieldNameAsterix( _sFieldName ) && (!_pEntry->isNoneFunction() || _pEntry->IsGroupBy()) )
{
String sFunctionName;
GetFunctionName(SQL_TOKEN_COUNT,sFunctionName);
String sOldLocalizedFunctionName = _pEntry->GetFunction();
if ( !sOldLocalizedFunctionName.Equals(sFunctionName) || _pEntry->IsGroupBy() )
{
// append undo action for the function field
_pEntry->SetFunctionType(FKT_NONE);
_pEntry->SetFunction(::rtl::OUString());
_pEntry->SetGroupBy(sal_False);
notifyFunctionFieldChanged(sOldLocalizedFunctionName,_pEntry->GetFunction(),_bListAction,_nColumnId);
}
}
}
// -----------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::fillColumnRef(const OSQLParseNode* _pColumnRef, const Reference< XConnection >& _rxConnection, OTableFieldDescRef& _pEntry, sal_Bool& _bListAction )
{
OSL_ENSURE(_pColumnRef,"No valid parsenode!");
::rtl::OUString sColumnName,sTableRange;
OSQLParseTreeIterator::getColumnRange(_pColumnRef,_rxConnection,sColumnName,sTableRange);
return fillColumnRef(sColumnName,sTableRange,_rxConnection->getMetaData(),_pEntry,_bListAction);
}
// -----------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::fillColumnRef(const ::rtl::OUString& _sColumnName,const ::rtl::OUString& _sTableRange,const Reference<XDatabaseMetaData>& _xMetaData,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction)
{
sal_Bool bError = sal_False;
::comphelper::UStringMixEqual bCase(_xMetaData->supportsMixedCaseQuotedIdentifiers());
// check if the table name is the same
if ( _sTableRange.getLength() && (bCase(_pEntry->GetTable(),_sTableRange) || bCase(_pEntry->GetAlias(),_sTableRange)) )
{ // a table was already inserted and the tables contains that column name
if ( !_pEntry->GetTabWindow() )
{ // fill tab window
::rtl::OUString sOldAlias = _pEntry->GetAlias();
if ( !fillEntryTable(_pEntry,_pEntry->GetTable()) )
fillEntryTable(_pEntry,_pEntry->GetAlias()); // only when the first failed
if ( !bCase(sOldAlias,_pEntry->GetAlias()) )
notifyTableFieldChanged(sOldAlias,_pEntry->GetAlias(),_bListAction,GetCurColumnId());
}
}
// check if the table window
OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(_pEntry->GetTabWindow());
if ( !pEntryTab ) // no table found with this name so we have to travel through all tables
{
OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
if ( pTabWinList )
{
sal_uInt16 nTabCount = 0;
if ( !static_cast<OQueryTableView*>(getDesignView()->getTableView())->FindTableFromField(_sColumnName,_pEntry,nTabCount) ) // error occured: column not in table window
{
String sErrorMsg(ModuleRes(RID_STR_FIELD_DOESNT_EXIST));
sErrorMsg.SearchAndReplaceAscii("$name$",_sColumnName);
OSQLWarningBox( this, sErrorMsg ).Execute();
bError = sal_True;
}
else
{
pEntryTab = static_cast<OQueryTableWindow*>(_pEntry->GetTabWindow());
notifyTableFieldChanged(String(),_pEntry->GetAlias(),_bListAction,GetCurColumnId());
}
}
}
if ( pEntryTab ) // here we got a valid table
_pEntry->SetField(_sColumnName);
return bError;
}
// -----------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::saveField(const String& _sFieldName,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction)
{
sal_Bool bError = sal_False;
OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
// first look if the name can be found in our tables
sal_uInt16 nTabCount = 0;
String sOldAlias = _pEntry->GetAlias();
if ( static_cast<OQueryTableView*>(getDesignView()->getTableView())->FindTableFromField(_sFieldName,_pEntry,nTabCount) )
{
// append undo action for the alias name
_pEntry->SetField(_sFieldName);
notifyTableFieldChanged(sOldAlias,_pEntry->GetAlias(),_bListAction,GetCurColumnId());
clearEntryFunctionField(_sFieldName,_pEntry,_bListAction,_pEntry->GetColumnId());
return bError;
}
Reference<XConnection> xConnection( rController.getConnection() );
Reference< XDatabaseMetaData > xMetaData;
if ( xConnection.is() )
xMetaData = xConnection->getMetaData();
OSL_ENSURE( xMetaData.is(), "OSelectionBrowseBox::saveField: invalid connection/meta data!" );
if ( !xMetaData.is() )
return sal_True;
::rtl::OUString sErrorMsg;
// second test if the name can be set as select columns in a pseudo statement
// we have to look which entries we should quote
const ::rtl::OUString sFieldAlias = _pEntry->GetFieldAlias();
size_t nPass = 4;
::connectivity::OSQLParser& rParser( rController.getParser() );
OSQLParseNode* pParseNode = NULL;
// 4 passes in trying to interprete the field name
// - don't quote the field name, parse internationally
// - don't quote the field name, parse en-US
// - quote the field name, parse internationally
// - quote the field name, parse en-US
do
{
bool bQuote = ( nPass <= 2 );
bool bInternational = ( nPass % 2 ) == 0;
::rtl::OUString sSql;
sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT "));
if ( bQuote )
sSql += ::dbtools::quoteName( xMetaData->getIdentifierQuoteString(), _sFieldName );
else
sSql += _sFieldName;
if ( sFieldAlias.getLength() )
{ // always quote the alias name there canbe no function in it
sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" "));
sSql += ::dbtools::quoteName( xMetaData->getIdentifierQuoteString(), sFieldAlias );
}
sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" FROM x"));
pParseNode = rParser.parseTree( sErrorMsg, sSql, bInternational );
}
while ( ( pParseNode == NULL ) && ( --nPass > 0 ) );
if ( pParseNode == NULL )
{
// something different which we have to check (may be a select statement)
String sErrorMessage( ModuleRes( STR_QRY_COLUMN_NOT_FOUND ) );
sErrorMessage.SearchAndReplaceAscii("$name$",_sFieldName);
OSQLWarningBox( this, sErrorMessage ).Execute();
return sal_True;
}
// we got a valid select column
// find what type of column has be inserted
::connectivity::OSQLParseNode* pSelection = pParseNode->getChild(2);
if ( SQL_ISRULE(pSelection,selection) ) // we found the asterix
{
_pEntry->SetField(_sFieldName);
clearEntryFunctionField(_sFieldName,_pEntry,_bListAction,_pEntry->GetColumnId());
} // travel through the select column parse node
else
{
::comphelper::UStringMixEqual bCase(xMetaData->supportsMixedCaseQuotedIdentifiers());
OTableFieldDescRef aSelEntry = _pEntry;
USHORT nColumnId = aSelEntry->GetColumnId();
sal_uInt32 nCount = pSelection->count();
for (sal_uInt32 i = 0; i < nCount; ++i)
{
if ( i > 0 ) // may we have to append more than one field
{
USHORT nColumnPostion;
aSelEntry = FindFirstFreeCol(nColumnPostion);
if ( !aSelEntry.isValid() )
{
AppendNewCol(1);
aSelEntry = FindFirstFreeCol(nColumnPostion);
}
++nColumnPostion;
nColumnId = GetColumnId(nColumnPostion);
}
::connectivity::OSQLParseNode* pChild = pSelection->getChild( i );
OSL_ENSURE(SQL_ISRULE(pChild,derived_column), "No derived column found!");
// get the column alias
::rtl::OUString sColumnAlias = OSQLParseTreeIterator::getColumnAlias(pChild);
if ( sColumnAlias.getLength() ) // we found an as clause
{
String aSelectionAlias = aSelEntry->GetFieldAlias();
aSelEntry->SetFieldAlias( sColumnAlias );
// append undo
appendUndoAction(aSelectionAlias,aSelEntry->GetFieldAlias(),BROW_COLUMNALIAS_ROW,_bListAction);
if ( m_bVisibleRow[BROW_COLUMNALIAS_ROW] )
RowModified(GetBrowseRow(BROW_COLUMNALIAS_ROW), nColumnId);
}
::connectivity::OSQLParseNode* pColumnRef = pChild->getChild(0);
if (
pColumnRef->count() == 3 &&
SQL_ISPUNCTUATION(pColumnRef->getChild(0),"(") &&
SQL_ISPUNCTUATION(pColumnRef->getChild(2),")")
)
pColumnRef = pColumnRef->getChild(1);
if ( SQL_ISRULE(pColumnRef,column_ref) ) // we found a valid column name or more column names
{
// look if we can find the corresponding table
bError = fillColumnRef( pColumnRef, xConnection, aSelEntry, _bListAction );
// we found a simple column so we must clear the function fields but only when the column name is '*'
// and the function is different to count
clearEntryFunctionField(_sFieldName,aSelEntry,_bListAction,nColumnId);
}
else
{
// first check if we have a aggregate function and only a function
if ( SQL_ISRULE(pColumnRef,general_set_fct) )
{
String sLocalizedFunctionName;
if ( GetFunctionName(pColumnRef->getChild(0)->getTokenID(),sLocalizedFunctionName) )
{
String sOldLocalizedFunctionName = aSelEntry->GetFunction();
aSelEntry->SetFunction(sLocalizedFunctionName);
sal_uInt32 nFunCount = pColumnRef->count() - 1;
sal_Int32 nFunctionType = FKT_AGGREGATE;
sal_Bool bQuote = sal_False;
// may be there exists only one parameter which is a column, fill all information into our fields
if ( nFunCount == 4 && SQL_ISRULE(pColumnRef->getChild(3),column_ref) )
bError = fillColumnRef( pColumnRef->getChild(3), xConnection, aSelEntry, _bListAction );
else if ( nFunCount == 3 ) // we have a COUNT(*) here, so take the first table
bError = fillColumnRef( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("*")), ::rtl::OUString(), xMetaData, aSelEntry, _bListAction );
else
{
nFunctionType |= FKT_NUMERIC;
bQuote = sal_True;
aSelEntry->SetDataType(DataType::DOUBLE);
aSelEntry->SetFieldType(TAB_NORMAL_FIELD);
}
// now parse the parameters
::rtl::OUString sParameters;
for(sal_uInt32 function = 2; function < nFunCount; ++function) // we only want to parse the parameters of the function
pColumnRef->getChild(function)->parseNodeToStr( sParameters, xConnection, &rParser.getContext(), sal_True, bQuote );
aSelEntry->SetFunctionType(nFunctionType);
aSelEntry->SetField(sParameters);
if ( aSelEntry->IsGroupBy() )
{
sOldLocalizedFunctionName = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount()-1);
aSelEntry->SetGroupBy(sal_False);
}
// append undo action
notifyFunctionFieldChanged(sOldLocalizedFunctionName,sLocalizedFunctionName,_bListAction, nColumnId);
}
else
OSL_ENSURE(0,"Unsupported function inserted!");
}
else if( SQL_ISRULEOR2(pColumnRef,position_exp,extract_exp) ||
SQL_ISRULEOR2(pColumnRef,fold,char_substring_fct) ||
SQL_ISRULEOR2(pColumnRef,length_exp,char_value_fct) )
// a calculation has been found ( can be calc and function )
{
// append the whole text as field name
// so we first clear the function field
clearEntryFunctionField(_sFieldName,aSelEntry,_bListAction,nColumnId);
sal_Bool bQuote = sal_True;
sal_Int32 nDataType = DataType::DOUBLE;
OSQLParseNode* pFunctionName = pColumnRef->getChild(0);
if ( !SQL_ISPUNCTUATION(pFunctionName,"{") )
{
if ( SQL_ISRULEOR2(pColumnRef,length_exp,char_value_fct) )
pFunctionName = pFunctionName->getChild(0);
if ( pFunctionName )
{
::rtl::OUString sFunctionName = pFunctionName->getTokenValue();
if ( !sFunctionName.getLength() )
sFunctionName = ::rtl::OStringToOUString(OSQLParser::TokenIDToStr(pFunctionName->getTokenID()),RTL_TEXTENCODING_MS_1252);
nDataType = OSQLParser::getFunctionReturnType(
sFunctionName
,&rController.getParser().getContext());
aSelEntry->SetDataType(nDataType);
}
}
// now parse the whole statement
sal_uInt32 nFunCount = pColumnRef->count();
::rtl::OUString sParameters;
for(sal_uInt32 function = 0; function < nFunCount; ++function)
pColumnRef->getChild(function)->parseNodeToStr( sParameters, xConnection, &rParser.getContext(), sal_True, bQuote );
::rtl::OUString aSelectionAlias = aSelEntry->GetAlias();
aSelEntry->SetAlias(::rtl::OUString());
sal_Int32 nNewFunctionType = aSelEntry->GetFunctionType() | FKT_NUMERIC | FKT_OTHER;
aSelEntry->SetFunctionType(nNewFunctionType);
aSelEntry->SetFieldType(TAB_NORMAL_FIELD);
aSelEntry->SetTabWindow(NULL);
aSelEntry->SetField(sParameters);
notifyTableFieldChanged(aSelectionAlias,aSelEntry->GetAlias(),_bListAction, nColumnId);
}
else
{
clearEntryFunctionField(_sFieldName,aSelEntry,_bListAction,nColumnId);
::rtl::OUString aColumns;
pColumnRef->parseNodeToStr( aColumns,
xConnection,
&rController.getParser().getContext(),
sal_True,
sal_True);
// get the type out of the funtion name
sal_Int32 nDataType = DataType::DOUBLE;
aSelEntry->SetDataType(nDataType);
aSelEntry->SetField(aColumns);
aSelEntry->SetFieldType(TAB_NORMAL_FIELD);
aSelEntry->SetTabWindow(NULL);
aSelEntry->SetAlias(::rtl::OUString());
aSelEntry->SetFieldAlias(sColumnAlias);
aSelEntry->SetFunctionType(FKT_NUMERIC | FKT_OTHER);
notifyTableFieldChanged(sOldAlias,aSelEntry->GetAlias(),_bListAction, nColumnId);
}
}
if ( i > 0 && InsertField(aSelEntry,BROWSER_INVALIDID,sal_True,sal_False).isEmpty() ) // may we have to append more than one field
{ // the field could not be isnerted
String sErrorMessage( ModuleRes( RID_STR_FIELD_DOESNT_EXIST ) );
sErrorMessage.SearchAndReplaceAscii("$name$",aSelEntry->GetField());
OSQLWarningBox( this, sErrorMessage ).Execute();
bError = sal_True;
}
}
}
delete pParseNode;
return bError;
}
//------------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::SaveModified()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
OTableFieldDescRef pEntry = NULL;
USHORT nCurrentColumnPos = GetColumnPos(GetCurColumnId());
if(getFields().size() > static_cast<USHORT>(nCurrentColumnPos - 1))
pEntry = getEntry(nCurrentColumnPos - 1);
sal_Bool bWasEmpty = pEntry.isValid() ? pEntry->IsEmpty() : sal_False;
sal_Bool bError = sal_False;
sal_Bool bListAction = sal_False;
if (pEntry.isValid() && Controller().Is() && Controller()->IsModified())
{
// fuer die Undo-Action
String strOldCellContents,sNewValue;
long nRow = GetRealRow(GetCurRow());
sal_Bool bAppendRow = sal_False;
switch (nRow)
{
case BROW_VIS_ROW:
{
sal_Bool bOldValue = m_pVisibleCell->GetBox().GetSavedValue() != STATE_NOCHECK;
strOldCellContents = bOldValue ? g_strOne : g_strZero;
sNewValue = !bOldValue ? g_strOne : g_strZero;
}
if((m_bOrderByUnRelated || pEntry->GetOrderDir() == ORDER_NONE) &&
(m_bGroupByUnRelated || !pEntry->IsGroupBy()))
{
pEntry->SetVisible(m_pVisibleCell->GetBox().IsChecked());
}
else
{
pEntry->SetVisible(sal_True);
m_pVisibleCell->GetBox().Check();
}
break;
case BROW_FIELD_ROW:
{
String aFieldName(m_pFieldCell->GetText());
try
{
if (!aFieldName.Len())
{
OTableFieldDescRef pNewEntry = new OTableFieldDesc();
pNewEntry->SetColumnId( pEntry->GetColumnId() );
::std::replace(getFields().begin(),getFields().end(),pEntry,pNewEntry);
sal_uInt16 nCol = GetCurColumnId();
for (int i = 0; i < m_nVisibleCount; i++) // Spalte neu zeichnen
RowModified(i,nCol);
}
else
{
strOldCellContents = pEntry->GetField();
bListAction = sal_True;
if ( !m_bInUndoMode )
rController.getUndoMgr()->EnterListAction(String(),String());
USHORT nPos = m_pFieldCell->GetEntryPos(aFieldName);
String aAliasName = pEntry->GetAlias();
if ( nPos != COMBOBOX_ENTRY_NOTFOUND && !aAliasName.Len() && aFieldName.GetTokenCount('.') > 1 )
{ // special case, we have a table field so we must cut the table name
String sTableAlias = aFieldName.GetToken(0,'.');
pEntry->SetAlias(sTableAlias);
String sColumnName = aFieldName.Copy(sTableAlias.Len()+1,aFieldName.Len() - sTableAlias.Len() -1);
Reference<XConnection> xConnection = rController.getConnection();
if ( !xConnection.is() )
return sal_False;
bError = fillColumnRef( sColumnName, sTableAlias, xConnection->getMetaData(), pEntry, bListAction );
}
else
bError = sal_True;
if ( bError )
bError = saveField(aFieldName,pEntry,bListAction);
}
}
catch(Exception&)
{
bError = sal_True;
}
if ( bError )
{
sNewValue = aFieldName;
if ( !m_bInUndoMode )
static_cast<OQueryController&>(getDesignView()->getController()).getUndoMgr()->LeaveListAction();
bListAction = sal_False;
}
else
sNewValue = pEntry->GetField();
rController.InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
}
break;
case BROW_TABLE_ROW:
{
String aAliasName = m_pTableCell->GetSelectEntry();
strOldCellContents = pEntry->GetAlias();
if ( m_pTableCell->GetSelectEntryPos() != 0 )
{
pEntry->SetAlias(aAliasName);
// we have to set the table name as well as the table window
OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
if (pTabWinList)
{
OJoinTableView::OTableWindowMapIterator aIter = pTabWinList->find(aAliasName);
if(aIter != pTabWinList->end())
{
OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(aIter->second);
if (pEntryTab)
{
pEntry->SetTable(pEntryTab->GetTableName());
pEntry->SetTabWindow(pEntryTab);
}
}
}
}
else
{
pEntry->SetAlias(::rtl::OUString());
pEntry->SetTable(::rtl::OUString());
pEntry->SetTabWindow(NULL);
}
sNewValue = pEntry->GetAlias();
} break;
case BROW_ORDER_ROW:
{
strOldCellContents = String::CreateFromInt32((sal_uInt16)pEntry->GetOrderDir());
sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos();
if (nIdx == sal_uInt16(-1))
nIdx = 0;
pEntry->SetOrderDir(EOrderDir(nIdx));
if(!m_bOrderByUnRelated)
{
pEntry->SetVisible(sal_True);
m_pVisibleCell->GetBox().Check();
RowModified(GetBrowseRow(BROW_VIS_ROW), GetCurColumnId());
}
sNewValue = String::CreateFromInt32((sal_uInt16)pEntry->GetOrderDir());
} break;
case BROW_COLUMNALIAS_ROW:
strOldCellContents = pEntry->GetFieldAlias();
pEntry->SetFieldAlias(m_pTextCell->GetText());
sNewValue = pEntry->GetFieldAlias();
break;
case BROW_FUNCTION_ROW:
{
strOldCellContents = pEntry->GetFunction();
sal_uInt16 nPos = m_pFunctionCell->GetSelectEntryPos();
// Diese Funktionen stehen nur unter CORE zur Verf<72>gung
String sFunctionName = m_pFunctionCell->GetEntry(nPos);
String sGroupFunctionName = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount()-1);
sal_Bool bGroupBy = sal_False;
if ( sGroupFunctionName.Equals(sFunctionName) ) // check if the function name is GROUP
{
bGroupBy = sal_True;
if ( !m_bGroupByUnRelated && !pEntry->IsVisible() )
{
// we have to change the visblie flag, so we must append also an undo action
pEntry->SetVisible(sal_True);
m_pVisibleCell->GetBox().Check();
appendUndoAction(g_strZero,g_strOne,BROW_VIS_ROW,bListAction);
RowModified(GetBrowseRow(BROW_VIS_ROW), GetCurColumnId());
}
pEntry->SetFunction(String());
pEntry->SetFunctionType(pEntry->GetFunctionType() & ~FKT_AGGREGATE );
}
else if ( nPos ) // we found an aggregate function
{
pEntry->SetFunctionType(pEntry->GetFunctionType() | FKT_AGGREGATE );
pEntry->SetFunction(sFunctionName);
}
else
{
sFunctionName = String();
pEntry->SetFunction(String());
pEntry->SetFunctionType(pEntry->GetFunctionType() & ~FKT_AGGREGATE );
}
pEntry->SetGroupBy(bGroupBy);
sNewValue = sFunctionName;
}
break;
default:
{
Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
if(!xConnection.is())
break;
sal_uInt16 nIdx = sal_uInt16(nRow - BROW_CRIT1_ROW);
String aText = m_pTextCell->GetText();
aText.EraseLeadingChars();
::rtl::OUString aCrit;
if(aText.Len())
{
::rtl::OUString aErrorMsg;
Reference<XPropertySet> xColumn;
OSQLParseNode* pParseNode = getDesignView()->getPredicateTreeFromEntry(pEntry,aText,aErrorMsg,xColumn);
if (pParseNode)
{
pParseNode->parseNodeToPredicateStr(aCrit,
xConnection,
static_cast<OQueryController&>(getDesignView()->getController()).getNumberFormatter(),
xColumn,
getDesignView()->getLocale(),
static_cast<sal_Char>(getDesignView()->getDecimalSeparator().toChar()),
&(static_cast<OQueryController&>(getDesignView()->getController()).getParser().getContext()));
delete pParseNode;
}
else
{
if(xColumn.is())
{
sal_Int32 nType = 0;
xColumn->getPropertyValue(PROPERTY_TYPE) >>= nType;
switch(nType)
{
case DataType::CHAR:
case DataType::VARCHAR:
case DataType::LONGVARCHAR:
if(aText.GetChar(0) != '\'' || aText.GetChar(aText.Len() -1) != '\'')
{
aText.SearchAndReplaceAll(String::CreateFromAscii("'"),String::CreateFromAscii("''"));
String aTmp(String::CreateFromAscii("'"));
(aTmp += aText) += String::CreateFromAscii("'");
aText = aTmp;
}
break;
default:
;
}
::connectivity::OSQLParser& rParser = static_cast<OQueryController&>(getDesignView()->getController()).getParser();
pParseNode = rParser.predicateTree(aErrorMsg,
aText,
static_cast<OQueryController&>(getDesignView()->getController()).getNumberFormatter(),
xColumn);
if (pParseNode)
{
pParseNode->parseNodeToPredicateStr(aCrit,
xConnection,
static_cast<OQueryController&>(getDesignView()->getController()).getNumberFormatter(),
xColumn,
getDesignView()->getLocale(),
static_cast<sal_Char>(getDesignView()->getDecimalSeparator().toChar()),
&(static_cast<OQueryController&>(getDesignView()->getController()).getParser().getContext()));
delete pParseNode;
}
else
{
if ( !m_bDisableErrorBox )
{
OSQLWarningBox( this, aErrorMsg ).Execute();
}
bError = sal_True;
}
}
else
{
if ( !m_bDisableErrorBox )
{
OSQLWarningBox( this, aErrorMsg ).Execute();
}
bError = sal_True;
}
}
// }
}
strOldCellContents = pEntry->GetCriteria(nIdx);
pEntry->SetCriteria(nIdx, aCrit);
sNewValue = pEntry->GetCriteria(nIdx);
if(aCrit.getLength() && nRow >= (GetRowCount()-1))
bAppendRow = sal_True;
}
}
if(!bError && Controller())
Controller()->ClearModified();
RowModified(GetCurRow(), GetCurColumnId());
if ( bAppendRow )
{
RowInserted( GetRowCount()-1, 1, TRUE );
m_bVisibleRow.push_back(sal_True);
++m_nVisibleCount;
}
if(!bError)
{
// und noch die Undo-Action fuer das Ganze
appendUndoAction(strOldCellContents,sNewValue,nRow);
}
}
// habe ich Daten in einer FieldDescription gespeichert, die vorher leer war und es nach den Aenderungen nicht mehr ist ?
if ( pEntry.isValid() && bWasEmpty && !pEntry->IsEmpty() && !bError )
{
// Default auf sichtbar
pEntry->SetVisible(sal_True);
appendUndoAction(g_strZero,g_strOne,BROW_VIS_ROW,bListAction);
RowModified(BROW_VIS_ROW, GetCurColumnId());
// wenn noetig neue freie Spalten anlegen
USHORT nDummy;
CheckFreeColumns(nDummy);
}
if ( bListAction && !m_bInUndoMode )
static_cast<OQueryController&>(getDesignView()->getController()).getUndoMgr()->LeaveListAction();
return pEntry != NULL && !bError;
}
//------------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::SeekRow(long nRow)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
sal_Bool bRet = sal_False;
m_nSeekRow = nRow;
if (nRow < m_nVisibleCount )
bRet = sal_True;
return bRet;
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::PaintCell(OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
rDev.SetClipRegion( rRect );
OTableFieldDescRef pEntry = NULL;
USHORT nPos = GetColumnPos(nColumnId);
if(getFields().size() > sal_uInt16(nPos - 1))
pEntry = getFields()[nPos - 1];
if (!pEntry.isValid())
return;
long nRow = GetRealRow(m_nSeekRow);
if (nRow == BROW_VIS_ROW)
PaintTristate(rDev, rRect, pEntry->IsVisible() ? STATE_CHECK : STATE_NOCHECK);
else
rDev.DrawText(rRect, GetCellText(nRow, nColumnId),TEXT_DRAW_VCENTER);
rDev.SetClipRegion( );
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::PaintStatusCell(OutputDevice& rDev, const Rectangle& rRect) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
Rectangle aRect(rRect);
aRect.TopLeft().Y() -= 2;
String aLabel(ModuleRes(STR_QUERY_HANDLETEXT));
// ab BROW_CRIT2_ROW werden alle Zeilen mit "oder" angegeben
xub_StrLen nToken = (xub_StrLen) (m_nSeekRow >= GetBrowseRow(BROW_CRIT2_ROW))
?
xub_StrLen(BROW_CRIT2_ROW) : xub_StrLen(GetRealRow(m_nSeekRow));
rDev.DrawText(aRect, aLabel.GetToken(nToken),TEXT_DRAW_VCENTER);
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::RemoveColumn(USHORT _nColumnId)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
USHORT nPos = GetColumnPos(_nColumnId);
// das Control sollte immer genau eine Spalte mehr haben, naemlich die HandleColumn
DBG_ASSERT((nPos == 0) || (nPos <= getFields().size()), "OSelectionBrowseBox::RemoveColumn : invalid parameter nColId");
// ColId ist bei mir gleichbedeutend mit Position, und da sollte die Bedingung natuerlich zutreffen
sal_uInt16 nCurCol = GetCurColumnId();
long nCurrentRow = GetCurRow();
DeactivateCell();
getFields().erase( getFields().begin() + (nPos - 1) );
OTableFieldDescRef pEntry = new OTableFieldDesc();
pEntry->SetColumnId(_nColumnId);
getFields().push_back(pEntry);
EditBrowseBox::RemoveColumn( _nColumnId );
InsertDataColumn( _nColumnId , String(), DEFAULT_SIZE, HIB_STDSTYLE, HEADERBAR_APPEND);
// Neuzeichnen
Rectangle aInvalidRect = GetInvalidRect( _nColumnId );
Invalidate( aInvalidRect );
ActivateCell( nCurrentRow, nCurCol );
rController.setModified();
invalidateUndoRedo();
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::RemoveField(sal_uInt16 nColumnId )
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
USHORT nPos = GetColumnPos(nColumnId);
OSL_ENSURE(getFields().size() > sal_uInt16(nPos-1),"ID is to great!");
OTableFieldDescRef pDesc = getEntry((sal_uInt32)(nPos - 1)) ;
pDesc->SetColWidth( (sal_uInt16)GetColumnWidth(nColumnId) ); // hat er sich vorher leider nicht gemerkt
// UndoAction erzeugen
if ( !m_bInUndoMode )
{
OTabFieldDelUndoAct* pUndoAction = new OTabFieldDelUndoAct( this );
pUndoAction->SetTabFieldDescr(pDesc);
pUndoAction->SetColumnPosition(nPos);
rController.addUndoActionAndInvalidate( pUndoAction );
}
RemoveColumn(nColumnId);
invalidateUndoRedo();
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::adjustSelectionMode( sal_Bool _bClickedOntoHeader, sal_Bool _bClickedOntoHandleCol )
{
// wenn ein Header selectiert wird, mu<6D> die selection angezeigt werden, sonst nicht)
if ( _bClickedOntoHeader )
{
if (0 == GetSelectColumnCount() )
// wenn es schon eine selektierte Spalte gibt, bin ich schon im richtigen Modus
if ( BROWSER_HIDESELECT == ( m_nMode & BROWSER_HIDESELECT ) )
{
m_nMode &= ~BROWSER_HIDESELECT;
m_nMode |= BROWSER_MULTISELECTION;
SetMode( m_nMode );
}
}
else if ( BROWSER_HIDESELECT != ( m_nMode & BROWSER_HIDESELECT ) )
{
if ( GetSelectColumnCount() != 0 )
SetNoSelection();
if ( _bClickedOntoHandleCol )
{
m_nMode |= BROWSER_HIDESELECT;
m_nMode &= ~BROWSER_MULTISELECTION;
SetMode( m_nMode );
}
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::MouseButtonDown(const BrowserMouseEvent& rEvt)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if( rEvt.IsLeft() )
{
sal_Bool bOnHandle = HANDLE_ID == rEvt.GetColumnId();
sal_Bool bOnHeader = ( rEvt.GetRow() < 0 ) && !bOnHandle;
adjustSelectionMode( bOnHeader, bOnHandle );
}
EditBrowseBox::MouseButtonDown(rEvt);
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::MouseButtonUp(const BrowserMouseEvent& rEvt)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
EditBrowseBox::MouseButtonUp( rEvt );
static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::KeyInput( const KeyEvent& rEvt )
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if (IsColumnSelected(GetCurColumnId()))
{
if (rEvt.GetKeyCode().GetCode() == KEY_DELETE && // Delete rows
!rEvt.GetKeyCode().IsShift() &&
!rEvt.GetKeyCode().IsMod1())
{
RemoveField(GetCurColumnId());
return;
}
}
EditBrowseBox::KeyInput(rEvt);
}
//------------------------------------------------------------------------------
sal_Int8 OSelectionBrowseBox::AcceptDrop( const BrowserAcceptDropEvent& rEvt )
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
sal_Int8 nDropAction = DND_ACTION_NONE;
if ( rEvt.GetRow() >= -1 )
{
if ( IsEditing() )
{
// #100271# OJ allow the asterix again
m_bDisableErrorBox = sal_True;
SaveModified();
m_bDisableErrorBox = sal_False;
DeactivateCell();
}
// check if the format is already supported, if not deactivate the current cell and try again
if ( OJoinExchObj::isFormatAvailable(GetDataFlavors()) )
nDropAction = DND_ACTION_LINK;
}
return nDropAction;
}
//------------------------------------------------------------------------------
sal_Int8 OSelectionBrowseBox::ExecuteDrop( const BrowserExecuteDropEvent& _rEvt )
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
TransferableDataHelper aDropped(_rEvt.maDropEvent.Transferable);
if (!OJoinExchObj::isFormatAvailable(aDropped.GetDataFlavorExVector()))
{
DBG_ERROR("OSelectionBrowseBox::ExecuteDrop: this should never have passed AcceptDrop!");
return DND_ACTION_NONE;
}
OTableFieldDesc aInfo;
// Einfuegen des Feldes an der gewuenschten Position
OJoinExchangeData jxdSource = OJoinExchObj::GetSourceDescription(_rEvt.maDropEvent.Transferable);
InsertField(jxdSource);
return DND_ACTION_LINK;
}
//------------------------------------------------------------------------------
OTableFieldDescRef OSelectionBrowseBox::AppendNewCol( sal_uInt16 nCnt)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
// es koennen mehrere angelegt werden, aber der Erste
// wird returnt
sal_uInt32 nCount = getFields().size();
for (sal_uInt16 i=0 ; i<nCnt ; i++)
{
OTableFieldDescRef pEmptyEntry = new OTableFieldDesc();
getFields().push_back(pEmptyEntry);
USHORT nColumnId = sal::static_int_cast< USHORT >(getFields().size());
pEmptyEntry->SetColumnId( nColumnId );
InsertDataColumn( nColumnId , String(), DEFAULT_SIZE, HIB_STDSTYLE, HEADERBAR_APPEND);
}
return getFields()[nCount];
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::DeleteFields(const String& rAliasName)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if (!getFields().empty())
{
sal_uInt16 nColId = GetCurColumnId();
sal_uInt32 nRow = GetCurRow();
sal_Bool bWasEditing = IsEditing();
if (bWasEditing)
DeactivateCell();
OTableFields::reverse_iterator aIter = getFields().rbegin();
OTableFieldDescRef pEntry = NULL;
for(USHORT nPos=sal::static_int_cast< USHORT >(getFields().size());aIter != getFields().rend();++aIter,--nPos)
{
pEntry = *aIter;
if ( pEntry->GetAlias().equals( rAliasName ) )
{
RemoveField( GetColumnId( nPos ) );
break;
}
}
if (bWasEditing)
ActivateCell(nRow , nColId);
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetColWidth(sal_uInt16 nColId, long nNewWidth)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
sal_Bool bWasEditing = IsEditing();
if (bWasEditing)
DeactivateCell();
// die Basisklasse machen lassen
SetColumnWidth(nColId, nNewWidth);
// der FieldDescription Bescheid sagen
OTableFieldDescRef pEntry = getEntry(GetColumnPos(nColId) - 1);
if (pEntry.isValid())
pEntry->SetColWidth(sal_uInt16(GetColumnWidth(nColId)));
if (bWasEditing)
ActivateCell(GetCurRow(), GetCurColumnId());
}
//------------------------------------------------------------------------------
Rectangle OSelectionBrowseBox::GetInvalidRect( sal_uInt16 nColId )
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
//////////////////////////////////////////////////////////////////////
// Rechteck ist erst einmal der gesamte Outputbereich des Fensters
Rectangle aInvalidRect( Point(0,0), GetOutputSizePixel() );
//////////////////////////////////////////////////////////////////////
// Dann wird die linke Seite angepasst
Rectangle aFieldRect(GetCellRect( 0, nColId )); // used instead of GetFieldRectPixel
aInvalidRect.Left() = aFieldRect.Left();
return aInvalidRect;
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::InsertColumn(OTableFieldDescRef pEntry, USHORT& _nColumnPostion)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
// das Control sollte immer genau eine Spalte mehr haben, naemlich die HandleColumn
DBG_ASSERT(_nColumnPostion == BROWSER_INVALIDID || (_nColumnPostion <= (long)getFields().size()), "OSelectionBrowseBox::InsertColumn : invalid parameter nColId.");
// -1 heisst ganz hinten, Count heisst ganz hinten, der Rest bezeichnet eine richtige Position
sal_uInt16 nCurCol = GetCurColumnId();
long nCurrentRow = GetCurRow();
DeactivateCell();
// remember the column id of the current positon
USHORT nColumnId = GetColumnId(_nColumnPostion);
// Wenn zu klein oder zu gross, auf Ende der Liste setzen
if ((_nColumnPostion == BROWSER_INVALIDID) || (_nColumnPostion >= getFields().size())) // Anhaengen des Feldes
{
if (FindFirstFreeCol(_nColumnPostion) == NULL) // keine freie Column mehr
{
AppendNewCol(1);
_nColumnPostion = sal::static_int_cast< USHORT >(
getFields().size());
}
else
++_nColumnPostion; // innerhalb der vorgegebenen Liste
nColumnId = GetColumnId(_nColumnPostion);
pEntry->SetColumnId( nColumnId );
getFields()[ _nColumnPostion - 1] = pEntry;
}
// check if the column ids are identical, if not we have to move
if ( pEntry->GetColumnId() != nColumnId )
{
USHORT nOldPosition = GetColumnPos(pEntry->GetColumnId());
OSL_ENSURE( nOldPosition != 0,"Old position was 0. Not possible!");
SetColumnPos(pEntry->GetColumnId(),_nColumnPostion);
// we have to delete an empty field for the fields list, because the columns must have equal length
if ( nOldPosition > 0 && nOldPosition <= getFields().size() )
getFields()[nOldPosition - 1] = pEntry;
ColumnMoved(pEntry->GetColumnId(),FALSE);
} // if ( pEntry->GetColumnId() != nColumnId )
if ( pEntry->GetFunctionType() & (FKT_AGGREGATE) )
{
String sFunctionName = pEntry->GetFunction();
if ( GetFunctionName(sal_uInt32(-1),sFunctionName) )
pEntry->SetFunction(sFunctionName);
}
nColumnId = pEntry->GetColumnId();
SetColWidth(nColumnId,getDesignView()->getColWidth(GetColumnPos(nColumnId)-1));
// Neuzeichnen
Rectangle aInvalidRect = GetInvalidRect( nColumnId );
Invalidate( aInvalidRect );
ActivateCell( nCurrentRow, nCurCol );
static_cast<OQueryController&>(getDesignView()->getController()).setModified();
invalidateUndoRedo();
}
//------------------------------------------------------------------------------
OTableFieldDescRef OSelectionBrowseBox::InsertField(const OJoinExchangeData& jxdSource, USHORT _nColumnPostion, sal_Bool bVis, sal_Bool bActivate)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OQueryTableWindow* pSourceWin = static_cast<OQueryTableWindow*>(jxdSource.pListBox->GetTabWin());
if (!pSourceWin)
return NULL;
// Namen/Position des selektierten Feldes
String aFieldName = jxdSource.pListBox->GetEntryText(jxdSource.pEntry);
sal_uInt32 nFieldIndex = jxdSource.pListBox->GetModel()->GetAbsPos(jxdSource.pEntry);
OTableFieldInfo* pInf = static_cast<OTableFieldInfo*>(jxdSource.pEntry->GetUserData());
// eine DragInfo aufbauen, damit ich mich auf das andere InsertField zurueckziehen kann
OTableFieldDescRef aInfo = new OTableFieldDesc(pSourceWin->GetTableName(),aFieldName);
aInfo->SetTabWindow(pSourceWin);
aInfo->SetFieldIndex(nFieldIndex);
aInfo->SetFieldType(pInf->GetKeyType());
aInfo->SetAlias(pSourceWin->GetAliasName());
aInfo->SetDataType(pInf->GetDataType());
aInfo->SetVisible(bVis);
return InsertField(aInfo, _nColumnPostion, bVis, bActivate);
}
//------------------------------------------------------------------------------
OTableFieldDescRef OSelectionBrowseBox::InsertField(const OTableFieldDescRef& _rInfo, USHORT _nColumnPostion, sal_Bool bVis, sal_Bool bActivate)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if(m_nMaxColumns && m_nMaxColumns <= FieldsCount())
return NULL;
if (bActivate)
SaveModified();
// Neue Spaltenbeschreibung
OTableFieldDescRef pEntry = _rInfo;
pEntry->SetVisible(bVis);
// Spalte einfuegen
InsertColumn( pEntry, _nColumnPostion );
if ( !m_bInUndoMode )
{
// UndoAction erzeugen
OTabFieldCreateUndoAct* pUndoAction = new OTabFieldCreateUndoAct( this );
pUndoAction->SetTabFieldDescr( pEntry );
pUndoAction->SetColumnPosition(_nColumnPostion);
getDesignView()->getController().addUndoActionAndInvalidate( pUndoAction );
}
return pEntry;
}
//------------------------------------------------------------------------------
sal_uInt16 OSelectionBrowseBox::FieldsCount()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OTableFields::iterator aIter = getFields().begin();
sal_uInt16 nCount = 0;
while (aIter != getFields().end())
{
if ((*aIter).isValid() && !(*aIter)->IsEmpty())
++nCount;
++aIter;
}
return nCount;
}
//------------------------------------------------------------------------------
OTableFieldDescRef OSelectionBrowseBox::FindFirstFreeCol(USHORT& _rColumnPosition )
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OTableFields::iterator aIter = getFields().begin();
OTableFields::iterator aEnd = getFields().end();
_rColumnPosition = BROWSER_INVALIDID;
while ( aIter != aEnd )
{
++_rColumnPosition;
OTableFieldDescRef pEntry = (*aIter);
if ( pEntry.isValid() && pEntry->IsEmpty() )
return pEntry;
++aIter;
}
return NULL;
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::CheckFreeColumns(USHORT& _rColumnPosition)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if (FindFirstFreeCol(_rColumnPosition) == NULL)
{
// es ist voll, also einen Packen Spalten anhaengen
AppendNewCol(DEFAULT_QUERY_COLS);
OSL_VERIFY(FindFirstFreeCol(_rColumnPosition).isValid());
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::AddGroupBy( const OTableFieldDescRef& rInfo , sal_uInt32 /*_nCurrentPos*/)
{
Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
if(!xConnection.is())
return;
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(!rInfo->IsEmpty(),"AddGroupBy:: OTableFieldDescRef sollte nicht Empty sein!");
OTableFieldDescRef pEntry;
const Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData();
const ::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers());
//sal_Bool bAppend = sal_False;
OTableFields& rFields = getFields();
OTableFields::iterator aIter = rFields.begin();
OTableFields::iterator aEnd = rFields.end();
for(;aIter != aEnd;++aIter)
{
pEntry = *aIter;
OSL_ENSURE(pEntry.isValid(),"OTableFieldDescRef was null!");
const ::rtl::OUString aField = pEntry->GetField();
const ::rtl::OUString aAlias = pEntry->GetAlias();
if (bCase(aField,rInfo->GetField()) &&
bCase(aAlias,rInfo->GetAlias()) &&
pEntry->GetFunctionType() == rInfo->GetFunctionType() &&
pEntry->GetFunction() == rInfo->GetFunction())
{
/*sal_uInt32 nPos = aIter - rFields.begin();
bAppend = _nCurrentPos > nPos && (rInfo->IsGroupBy() != pEntry->IsGroupBy());
if ( bAppend )
aIter = rFields.end();
else*/
{
if ( pEntry->isNumericOrAggreateFunction() && rInfo->IsGroupBy() )
{
pEntry->SetGroupBy(sal_False);
aIter = rFields.end();
}
else
{
pEntry->SetGroupBy(rInfo->IsGroupBy());
if(!m_bGroupByUnRelated && pEntry->IsGroupBy())
pEntry->SetVisible(sal_True);
}
}
break;
}
}
if (aIter == rFields.end())
{
OTableFieldDescRef pTmp = InsertField(rInfo, BROWSER_INVALIDID, sal_False, sal_False );
if ( (pTmp->isNumericOrAggreateFunction() && rInfo->IsGroupBy()) ) // das GroupBy wird bereits von rInfo "ubernommen
pTmp->SetGroupBy(sal_False);
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::AddCondition( const OTableFieldDescRef& rInfo, const String& rValue, const sal_uInt16 nLevel,bool _bAddOrOnOneLine )
{
Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
if(!xConnection.is())
return;
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(rInfo.isValid() && !rInfo->IsEmpty(),"AddCondition:: OTableFieldDescRef sollte nicht Empty sein!");
OTableFieldDescRef pLastEntry;
Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData();
::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers());
OTableFields& rFields = getFields();
OTableFields::iterator aIter = rFields.begin();
OTableFields::iterator aEnd = rFields.end();
for(;aIter != aEnd;++aIter)
{
OTableFieldDescRef pEntry = *aIter;
const ::rtl::OUString aField = pEntry->GetField();
const ::rtl::OUString aAlias = pEntry->GetAlias();
if (bCase(aField,rInfo->GetField()) &&
bCase(aAlias,rInfo->GetAlias()) &&
pEntry->GetFunctionType() == rInfo->GetFunctionType() &&
pEntry->GetFunction() == rInfo->GetFunction())
{
if ( pEntry->isNumericOrAggreateFunction() && rInfo->IsGroupBy() )
pEntry->SetGroupBy(sal_False);
else
{
pEntry->SetGroupBy(rInfo->IsGroupBy());
if(!m_bGroupByUnRelated && pEntry->IsGroupBy())
pEntry->SetVisible(sal_True);
}
if (!pEntry->GetCriteria(nLevel).getLength() )
{
pEntry->SetCriteria( nLevel, rValue);
if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1))
{
RowInserted( GetRowCount()-1, 1, TRUE );
m_bVisibleRow.push_back(sal_True);
++m_nVisibleCount;
}
m_bVisibleRow[BROW_CRIT1_ROW + nLevel] = sal_True;
break;
} // if (!pEntry->GetCriteria(nLevel).getLength() )
if ( _bAddOrOnOneLine )
{
pLastEntry = pEntry;
}
}
} // for(;aIter != getFields().end();++aIter)
if ( pLastEntry.isValid() )
{
String sCriteria = rValue;
String sOldCriteria = pLastEntry->GetCriteria( nLevel );
if ( sOldCriteria.Len() )
{
sCriteria = String(RTL_CONSTASCII_USTRINGPARAM("( "));
sCriteria += sOldCriteria;
sCriteria += String(RTL_CONSTASCII_USTRINGPARAM(" OR "));
sCriteria += rValue;
sCriteria += String(RTL_CONSTASCII_USTRINGPARAM(" )"));
}
pLastEntry->SetCriteria( nLevel, sCriteria);
if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1))
{
RowInserted( GetRowCount()-1, 1, TRUE );
m_bVisibleRow.push_back(sal_True);
++m_nVisibleCount;
}
m_bVisibleRow[BROW_CRIT1_ROW + nLevel] = sal_True;
}
else if (aIter == getFields().end())
{
OTableFieldDescRef pTmp = InsertField(rInfo, BROWSER_INVALIDID, sal_False, sal_False );
if ( pTmp->isNumericOrAggreateFunction() && rInfo->IsGroupBy() ) // das GroupBy wird bereits von rInfo "ubernommen
pTmp->SetGroupBy(sal_False);
if ( pTmp.isValid() )
{
pTmp->SetCriteria( nLevel, rValue);
if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1))
{
RowInserted( GetRowCount()-1, 1, TRUE );
m_bVisibleRow.push_back(sal_True);
++m_nVisibleCount;
}
}
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::AddOrder( const OTableFieldDescRef& rInfo, const EOrderDir eDir, sal_uInt32 _nCurrentPos)
{
Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
if(!xConnection.is())
return;
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(!rInfo->IsEmpty(),"AddOrder:: OTableFieldDescRef sollte nicht Empty sein!");
OTableFieldDescRef pEntry;
Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData();
::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers());
sal_Bool bAppend = sal_False;
OTableFields& rFields = getFields();
OTableFields::iterator aIter = rFields.begin();
OTableFields::iterator aEnd = rFields.end();
for(;aIter != aEnd;++aIter)
{
pEntry = *aIter;
::rtl::OUString aField = pEntry->GetField();
::rtl::OUString aAlias = pEntry->GetAlias();
if (bCase(aField,rInfo->GetField()) &&
bCase(aAlias,rInfo->GetAlias()))
{
sal_uInt32 nPos = aIter - rFields.begin();
bAppend = _nCurrentPos > nPos;
if ( bAppend )
aIter = rFields.end();
else
{
if ( !m_bOrderByUnRelated )
pEntry->SetVisible(sal_True);
pEntry->SetOrderDir( eDir );
}
break;
}
}
if (aIter == rFields.end())
{
OTableFieldDescRef pTmp = InsertField(rInfo, BROWSER_INVALIDID, sal_False, sal_False );
if(pTmp.isValid())
{
if ( !m_bOrderByUnRelated && !bAppend )
pTmp->SetVisible(sal_True);
pTmp->SetOrderDir( eDir );
}
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::ArrangeControls(sal_uInt16& nX, sal_uInt16 nY)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
EditBrowseBox::ArrangeControls(nX, nY);
}
//------------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::Save()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
sal_Bool bRet = sal_True;
if (IsModified())
bRet = SaveModified();
return bRet;
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::CellModified()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_VIS_ROW:
{
OTableFieldDescRef pEntry = getEntry(GetColumnPos(GetCurColumnId()) - 1);
sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos();
if(!m_bOrderByUnRelated && nIdx > 0 &&
nIdx != sal_uInt16(-1) &&
!pEntry->IsEmpty() &&
pEntry->GetOrderDir() != ORDER_NONE)
{
m_pVisibleCell->GetBox().Check();
pEntry->SetVisible(sal_True);
}
else
pEntry->SetVisible(m_pVisibleCell->GetBox().IsChecked());
}
break;
}
static_cast<OQueryController&>(getDesignView()->getController()).setModified();
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::Fill()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(ColCount() >= 1, "OSelectionBrowseBox::Fill : please call only after inserting the handle column !");
sal_uInt16 nColCount = ColCount() - 1;
if (nColCount < DEFAULT_QUERY_COLS)
AppendNewCol(DEFAULT_QUERY_COLS - nColCount);
}
//------------------------------------------------------------------------------
Size OSelectionBrowseBox::CalcOptimalSize( const Size& _rAvailable )
{
Size aReturn( _rAvailable.Width(), GetTitleHeight() );
aReturn.Height() += ( m_nVisibleCount ? m_nVisibleCount : 15 ) * GetDataRowHeight();
aReturn.Height() += 40; // just some space
return aReturn;
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::Command(const CommandEvent& rEvt)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
switch (rEvt.GetCommand())
{
case COMMAND_CONTEXTMENU:
{
Point aMenuPos( rEvt.GetMousePosPixel() );
if (!rEvt.IsMouseEvent())
{
if ( 1 == GetSelectColumnCount() )
{
sal_uInt16 nSelId = GetColumnId(
sal::static_int_cast< USHORT >(
FirstSelectedColumn() ) );
::Rectangle aColRect( GetFieldRectPixel( 0, nSelId, sal_False ) );
aMenuPos = aColRect.TopCenter();
}
else
{
EditBrowseBox::Command(rEvt);
return;
}
}
sal_uInt16 nColId = GetColumnId(GetColumnAtXPosPixel( aMenuPos.X() ));
long nRow = GetRowAtYPosPixel( aMenuPos.Y() );
if (nRow < 0 && nColId > HANDLE_ID )
{
if ( !IsColumnSelected( nColId ) )
{
adjustSelectionMode( sal_True /* clicked onto a header */ , sal_False /* not onto the handle col */ );
SelectColumnId( nColId );
}
if (!static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly())
{
PopupMenu aContextMenu( ModuleRes( RID_QUERYCOLPOPUPMENU ) );
switch (aContextMenu.Execute(this, aMenuPos))
{
case SID_DELETE:
RemoveField(nColId);
break;
case ID_BROWSER_COLWIDTH:
adjustBrowseBoxColumnWidth( this, nColId );
break;
}
}
}
else if(nRow >= 0 && nColId <= HANDLE_ID)
{
if (!static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly())
{
PopupMenu aContextMenu(ModuleRes(RID_QUERYFUNCTION_POPUPMENU));
aContextMenu.CheckItem( ID_QUERY_FUNCTION, m_bVisibleRow[BROW_FUNCTION_ROW]);
aContextMenu.CheckItem( ID_QUERY_TABLENAME, m_bVisibleRow[BROW_TABLE_ROW]);
aContextMenu.CheckItem( ID_QUERY_ALIASNAME, m_bVisibleRow[BROW_COLUMNALIAS_ROW]);
aContextMenu.CheckItem( ID_QUERY_DISTINCT, static_cast<OQueryController&>(getDesignView()->getController()).isDistinct());
switch (aContextMenu.Execute(this, aMenuPos))
{
case ID_QUERY_FUNCTION:
SetRowVisible(BROW_FUNCTION_ROW, !IsRowVisible(BROW_FUNCTION_ROW));
static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_VIEW_FUNCTIONS );
break;
case ID_QUERY_TABLENAME:
SetRowVisible(BROW_TABLE_ROW, !IsRowVisible(BROW_TABLE_ROW));
static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_VIEW_TABLES );
break;
case ID_QUERY_ALIASNAME:
SetRowVisible(BROW_COLUMNALIAS_ROW, !IsRowVisible(BROW_COLUMNALIAS_ROW));
static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_VIEW_ALIASES );
break;
case ID_QUERY_DISTINCT:
static_cast<OQueryController&>(getDesignView()->getController()).setDistinct(!static_cast<OQueryController&>(getDesignView()->getController()).isDistinct());
static_cast<OQueryController&>(getDesignView()->getController()).setModified();
static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_DISTINCT_VALUES );
break;
}
static_cast<OQueryController&>(getDesignView()->getController()).setModified();
}
}
else
{
EditBrowseBox::Command(rEvt);
return;
}
}
default:
EditBrowseBox::Command(rEvt);
}
}
//------------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::IsRowVisible(sal_uInt16 _nWhich) const
{
DBG_ASSERT(_nWhich<(m_bVisibleRow.size()), "OSelectionBrowseBox::IsRowVisible : invalid parameter !");
return m_bVisibleRow[_nWhich];
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetRowVisible(sal_uInt16 _nWhich, sal_Bool _bVis)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(_nWhich<m_bVisibleRow.size(), "OSelectionBrowseBox::SetRowVisible : invalid parameter !");
sal_Bool bWasEditing = IsEditing();
if (bWasEditing)
DeactivateCell();
// do this before removing or inserting rows, as this triggers ActivateCell-calls, which rely on m_bVisibleRow
m_bVisibleRow[_nWhich] = !m_bVisibleRow[_nWhich];
long nId = GetBrowseRow(_nWhich);
if (_bVis)
{
RowInserted(nId,1);
++m_nVisibleCount;
}
else
{
RowRemoved(nId,1);
--m_nVisibleCount;
}
if (bWasEditing)
ActivateCell();
}
//------------------------------------------------------------------------------
long OSelectionBrowseBox::GetBrowseRow(long nRowId) const
{
USHORT nCount(0);
for(USHORT i = 0 ; i < nRowId ; ++i)
{
if ( m_bVisibleRow[i] )
++nCount;
}
return nCount;
}
//------------------------------------------------------------------------------
long OSelectionBrowseBox::GetRealRow(long nRowId) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
long nErg=0,i;
const long nCount = m_bVisibleRow.size();
for(i=0;i < nCount; ++i)
{
if(m_bVisibleRow[i])
{
if(nErg++ == nRowId)
break;
}
}
DBG_ASSERT(nErg <= long(m_bVisibleRow.size()),"nErg kann nicht groesser als BROW_ROW_CNT sein!");
return i;
}
static long nVisibleRowMask[] =
{
0x0001,
0x0002,
0x0004,
0x0008,
0x0010,
0x0020,
0x0040,
0x0080,
0x0100,
0x0200,
0x0400,
0x0800
};
//------------------------------------------------------------------------------
sal_Int32 OSelectionBrowseBox::GetNoneVisibleRows() const
{
sal_Int32 nErg(0);
// only the first 11 row are interesting
sal_Int32 nSize = sizeof(nVisibleRowMask) / sizeof(nVisibleRowMask[0]);
for(sal_Int32 i=0;i<nSize;i++)
{
if(!m_bVisibleRow[i])
nErg |= nVisibleRowMask[i];
}
return nErg;
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetNoneVisbleRow(long nRows)
{
// only the first 11 row are interesting
sal_Int32 nSize = sizeof(nVisibleRowMask) / sizeof(nVisibleRowMask[0]);
for(sal_Int32 i=0;i< nSize;i++)
m_bVisibleRow[i] = !(nRows & nVisibleRowMask[i]);
}
//------------------------------------------------------------------------------
String OSelectionBrowseBox::GetCellText(long nRow, sal_uInt16 nColId) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
USHORT nPos = GetColumnPos(nColId);
OTableFieldDescRef pEntry = getFields()[nPos-1];
DBG_ASSERT(pEntry != NULL, "OSelectionBrowseBox::GetCellText : invalid column id, prepare for GPF ... ");
if ( pEntry->IsEmpty() )
return String();
String aText;
switch (nRow)
{
case BROW_TABLE_ROW:
aText = pEntry->GetAlias();
break;
case BROW_FIELD_ROW:
{
String aField = pEntry->GetField();
if (aField.GetChar(0) == '*') // * durch alias.* ersetzen
{
aField = pEntry->GetAlias();
if(aField.Len())
aField += '.';
aField += '*';
}
aText = aField;
} break;
case BROW_ORDER_ROW:
if (pEntry->GetOrderDir() != ORDER_NONE)
aText = String(ModuleRes(STR_QUERY_SORTTEXT) ).GetToken(sal::static_int_cast< USHORT >(pEntry->GetOrderDir()));
break;
case BROW_VIS_ROW:
break;
case BROW_COLUMNALIAS_ROW:
aText = pEntry->GetFieldAlias();
break;
case BROW_FUNCTION_ROW:
// we always show the group function at first
if ( pEntry->IsGroupBy() )
aText = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount()-1);
else if ( pEntry->isNumericOrAggreateFunction() )
aText = pEntry->GetFunction();
break;
default:
aText = pEntry->GetCriteria(sal_uInt16(nRow - BROW_CRIT1_ROW));
}
return aText;
}
//------------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::GetFunctionName(sal_uInt32 _nFunctionTokenId,String& rFkt)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
sal_Bool bErg=sal_True;
String aText;
switch(_nFunctionTokenId)
{
case SQL_TOKEN_COUNT:
rFkt = (m_pFunctionCell->GetEntryCount() < 3) ? m_pFunctionCell->GetEntry(1) : m_pFunctionCell->GetEntry(2);
break;
case SQL_TOKEN_AVG:
rFkt = m_pFunctionCell->GetEntry(1);
break;
case SQL_TOKEN_MAX:
rFkt = m_pFunctionCell->GetEntry(3);
break;
case SQL_TOKEN_MIN:
rFkt = m_pFunctionCell->GetEntry(4);
break;
case SQL_TOKEN_SUM:
rFkt = m_pFunctionCell->GetEntry(5);
break;
case SQL_TOKEN_EVERY:
rFkt = m_pFunctionCell->GetEntry(6);
break;
case SQL_TOKEN_ANY:
rFkt = m_pFunctionCell->GetEntry(7);
break;
case SQL_TOKEN_SOME:
rFkt = m_pFunctionCell->GetEntry(8);
break;
case SQL_TOKEN_STDDEV_POP:
rFkt = m_pFunctionCell->GetEntry(9);
break;
case SQL_TOKEN_STDDEV_SAMP:
rFkt = m_pFunctionCell->GetEntry(10);
break;
case SQL_TOKEN_VAR_SAMP:
rFkt = m_pFunctionCell->GetEntry(11);
break;
case SQL_TOKEN_VAR_POP:
rFkt = m_pFunctionCell->GetEntry(12);
break;
case SQL_TOKEN_COLLECT:
rFkt = m_pFunctionCell->GetEntry(13);
break;
case SQL_TOKEN_FUSION:
rFkt = m_pFunctionCell->GetEntry(14);
break;
case SQL_TOKEN_INTERSECTION:
rFkt = m_pFunctionCell->GetEntry(15);
break;
default:
{
xub_StrLen nCount = m_aFunctionStrings.GetTokenCount();
xub_StrLen i;
for ( i = 0; i < nCount-1; i++) // Gruppierung wird nicht mit gez"ahlt
{
if(rFkt.EqualsIgnoreCaseAscii(m_aFunctionStrings.GetToken(i)))
{
rFkt = m_aFunctionStrings.GetToken(i);
break;
}
}
if(i == nCount-1)
bErg = sal_False;
}
}
return bErg;
}
//------------------------------------------------------------------------------
String OSelectionBrowseBox::GetCellContents(sal_Int32 nCellIndex, USHORT nColId)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
// DBG_ASSERT(nCellIndex < (GetRowCount()-1),"CellIndex ist zu gross");
if ( GetCurColumnId() == nColId && !m_bInUndoMode )
SaveModified();
USHORT nPos = GetColumnPos(nColId);
OTableFieldDescRef pEntry = getFields()[nPos - 1];
DBG_ASSERT(pEntry != NULL, "OSelectionBrowseBox::GetCellContents : invalid column id, prepare for GPF ... ");
switch (nCellIndex)
{
case BROW_VIS_ROW :
return pEntry->IsVisible() ? g_strOne : g_strZero;
case BROW_ORDER_ROW:
{
sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos();
if (nIdx == sal_uInt16(-1))
nIdx = 0;
return String(nIdx);
}
default:
return GetCellText(nCellIndex, nColId);
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetCellContents(sal_Int32 nRow, USHORT nColId, const String& strNewText)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
sal_Bool bWasEditing = IsEditing() && (GetCurColumnId() == nColId) && IsRowVisible(static_cast<USHORT>(nRow)) && (GetCurRow() == static_cast<USHORT>(GetBrowseRow(nRow)));
if (bWasEditing)
DeactivateCell();
USHORT nPos = GetColumnPos(nColId);
OTableFieldDescRef pEntry = getEntry(nPos - 1);
DBG_ASSERT(pEntry != NULL, "OSelectionBrowseBox::SetCellContents : invalid column id, prepare for GPF ... ");
switch (nRow)
{
case BROW_VIS_ROW:
pEntry->SetVisible(strNewText.Equals(g_strOne));
break;
case BROW_FIELD_ROW:
pEntry->SetField(strNewText);
break;
case BROW_TABLE_ROW:
pEntry->SetAlias(strNewText);
break;
case BROW_ORDER_ROW:
{
sal_uInt16 nIdx = (sal_uInt16)strNewText.ToInt32();
pEntry->SetOrderDir(EOrderDir(nIdx));
} break;
case BROW_COLUMNALIAS_ROW:
pEntry->SetFieldAlias(strNewText);
break;
case BROW_FUNCTION_ROW:
{
String sOldFunctionName = pEntry->GetFunction();
String sGroupFunctionName = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount()-1);
pEntry->SetFunction(strNewText);
// first reset this two member
sal_Int32 nFunctionType = pEntry->GetFunctionType();
nFunctionType &= ~FKT_AGGREGATE;
pEntry->SetFunctionType(nFunctionType);
if ( pEntry->IsGroupBy() && !sGroupFunctionName.EqualsIgnoreCaseAscii(strNewText) )
pEntry->SetGroupBy(sal_False);
if ( sGroupFunctionName.EqualsIgnoreCaseAscii(strNewText) )
pEntry->SetGroupBy(sal_True);
else if ( strNewText.Len() )
{
nFunctionType |= FKT_AGGREGATE;
pEntry->SetFunctionType(nFunctionType);
}
} break;
default:
pEntry->SetCriteria(sal_uInt16(nRow - BROW_CRIT1_ROW), strNewText);
}
long nCellIndex = GetRealRow(nRow);
if(IsRowVisible(static_cast<USHORT>(nRow)))
RowModified(nCellIndex, nColId);
// die entsprechende Feld-Beschreibung ist jetzt leer -> Visible auf sal_False (damit das konsistent mit normalen leeren Spalten ist)
if (pEntry->IsEmpty())
pEntry->SetVisible(sal_False);
if (bWasEditing)
ActivateCell(nCellIndex, nColId);
static_cast<OQueryController&>(getDesignView()->getController()).setModified();
}
//------------------------------------------------------------------------------
sal_uInt32 OSelectionBrowseBox::GetTotalCellWidth(long nRow, sal_uInt16 nColId) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
long nRowId = GetRealRow(nRow);
if (nRowId == BROW_VIS_ROW)
return CHECKBOX_SIZE;
else
return GetDataWindow().GetTextWidth(GetCellText(nRowId, nColId));
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::ColumnResized(sal_uInt16 nColId)
{
if (static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly())
return;
// The resizing of columns can't be suppressed (BrowseBox doesn't support that) so we have to do this
// fake. It's not _that_ bad : the user may change column widths while in read-only mode to see all details
// but the changes aren't permanent ...
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
USHORT nPos = GetColumnPos(nColId);
DBG_ASSERT(nPos <= getFields().size(),"ColumnResized:: nColId sollte nicht groesser als List::count sein!");
OTableFieldDescRef pEntry = getEntry(nPos-1);
DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::ColumnResized : keine FieldDescription !");
static_cast<OQueryController&>(getDesignView()->getController()).setModified();
EditBrowseBox::ColumnResized(nColId);
if ( pEntry.isValid())
{
if ( !m_bInUndoMode )
{
// create the undo action
OTabFieldSizedUndoAct* pUndo = new OTabFieldSizedUndoAct(this);
pUndo->SetColumnPosition( nPos );
pUndo->SetOriginalWidth(pEntry->GetColWidth());
getDesignView()->getController().addUndoActionAndInvalidate(pUndo);
}
pEntry->SetColWidth(sal_uInt16(GetColumnWidth(nColId)));
}
}
//------------------------------------------------------------------------------
sal_uInt32 OSelectionBrowseBox::GetTotalCellWidth(long nRowId, sal_uInt16 nColId)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
USHORT nPos = GetColumnPos(nColId);
DBG_ASSERT((nPos == 0) || (nPos <= getFields().size()), "OSelectionBrowseBox::GetTotalCellWidth : invalid parameter nColId");
OTableFieldDescRef pEntry = getFields()[nPos-1];
DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::GetTotalCellWidth : invalid FieldDescription !");
long nRow = GetRealRow(nRowId);
String strText(GetCellText(nRow, nColId));
return GetDataWindow().LogicToPixel(Size(GetDataWindow().GetTextWidth(strText),0)).Width();
}
//------------------------------------------------------------------------------
sal_uInt16 OSelectionBrowseBox::GetDefaultColumnWidth(const String& /*rName*/) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
// die Baissklasse macht das von dem Text abhaengig, ich habe aber keine Spaltenueberschriften, daher haette ich
// hier gern einen anderen Default-Wert
return static_cast<sal_uInt16>(DEFAULT_SIZE);
}
//------------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::isCutAllowed()
{
sal_Bool bCutAllowed = sal_False;
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_VIS_ROW:
case BROW_ORDER_ROW:
case BROW_TABLE_ROW:
case BROW_FUNCTION_ROW:
break;
case BROW_FIELD_ROW:
bCutAllowed = m_pFieldCell->GetSelected().Len() != 0;
break;
default:
bCutAllowed = m_pTextCell->GetSelected().Len() != 0;
break;
}
return bCutAllowed;
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::cut()
{
String sOldValue = GetCellContents(GetRealRow(GetCurRow()),GetCurColumnId());
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_FIELD_ROW:
m_pFieldCell->Cut();
m_pFieldCell->SetModifyFlag();
break;
default:
m_pTextCell->Cut();
m_pTextCell->SetModifyFlag();
}
SaveModified();
RowModified(GetBrowseRow(nRow), GetCurColumnId());
invalidateUndoRedo();
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::paste()
{
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_FIELD_ROW:
m_pFieldCell->Paste();
m_pFieldCell->SetModifyFlag();
break;
default:
m_pTextCell->Paste();
m_pTextCell->SetModifyFlag();
}
RowModified(GetBrowseRow(nRow), GetCurColumnId());
invalidateUndoRedo();
}
// -----------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::isPasteAllowed()
{
sal_Bool bPasteAllowed = sal_True;
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_VIS_ROW:
case BROW_ORDER_ROW:
case BROW_TABLE_ROW:
case BROW_FUNCTION_ROW:
bPasteAllowed = sal_False;
break;
}
return bPasteAllowed;
}
// -----------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::isCopyAllowed()
{
return isCutAllowed();
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::copy()
{
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_FIELD_ROW:
m_pFieldCell->Copy();
break;
default:
m_pTextCell->Copy();
}
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::appendUndoAction(const String& _rOldValue,const String& _rNewValue,sal_Int32 _nRow,sal_Bool& _bListAction)
{
if ( !m_bInUndoMode && !_rNewValue.Equals(_rOldValue) )
{
if ( !_bListAction )
{
_bListAction = sal_True;
static_cast<OQueryController&>(getDesignView()->getController()).getUndoMgr()->EnterListAction(String(),String());
}
appendUndoAction(_rOldValue,_rNewValue,_nRow);
}
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::appendUndoAction(const String& _rOldValue,const String& _rNewValue,sal_Int32 _nRow)
{
if ( !m_bInUndoMode && !_rNewValue.Equals(_rOldValue) )
{
OTabFieldCellModifiedUndoAct* pUndoAct = new OTabFieldCellModifiedUndoAct(this);
pUndoAct->SetCellIndex(_nRow);
OSL_ENSURE(GetColumnPos(GetCurColumnId()) != BROWSER_INVALIDID,"Current position isn't valid!");
pUndoAct->SetColumnPosition( GetColumnPos(GetCurColumnId()) );
pUndoAct->SetCellContents(_rOldValue);
getDesignView()->getController().addUndoActionAndInvalidate(pUndoAct);
}
}
// -----------------------------------------------------------------------------
IMPL_LINK(OSelectionBrowseBox, OnInvalidateTimer, void*, EMPTYARG)
{
static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature(SID_CUT);
static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature(SID_COPY);
static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature(SID_PASTE);
if(!m_bStopTimer)
m_timerInvalidate.Start();
return 0L;
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::stopTimer()
{
m_bStopTimer = sal_True;
if (m_timerInvalidate.IsActive())
m_timerInvalidate.Stop();
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::startTimer()
{
m_bStopTimer = sal_False;
if (!m_timerInvalidate.IsActive())
m_timerInvalidate.Start();
}
// -----------------------------------------------------------------------------
OTableFields& OSelectionBrowseBox::getFields() const
{
OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
return rController.getTableFieldDesc();
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::enableControl(const OTableFieldDescRef& _rEntry,Window* _pControl)
{
BOOL bEnable = !_rEntry->isCondition();
_pControl->Enable(bEnable);
_pControl->EnableInput(bEnable);
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::setTextCellContext(const OTableFieldDescRef& _rEntry,const String& _sText,ULONG _nHelpId)
{
m_pTextCell->SetText(_sText);
m_pTextCell->ClearModifyFlag();
if (!m_pTextCell->HasFocus())
m_pTextCell->GrabFocus();
enableControl(_rEntry,m_pTextCell);
if (m_pTextCell->GetHelpId() != _nHelpId)
// da TextCell in verschiedenen Kontexten verwendet wird, muss ich den gecachten HelpText loeschen
m_pTextCell->SetHelpText(String());
m_pTextCell->SetHelpId(_nHelpId);
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::invalidateUndoRedo()
{
OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController());
rController.InvalidateFeature( ID_BROWSER_UNDO );
rController.InvalidateFeature( ID_BROWSER_REDO );
rController.InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
}
// -----------------------------------------------------------------------------
OTableFieldDescRef OSelectionBrowseBox::getEntry(OTableFields::size_type _nPos)
{
// we have to check if we need a new entry at this position
OTableFields& aFields = getFields();
OSL_ENSURE(aFields.size() > _nPos,"ColID is to great!");
OTableFieldDescRef pEntry = aFields[_nPos];
OSL_ENSURE(pEntry.isValid(),"Invalid entry!");
if ( !pEntry.isValid() )
{
pEntry = new OTableFieldDesc();
pEntry->SetColumnId(
GetColumnId(sal::static_int_cast< USHORT >(_nPos+1)));
aFields[_nPos] = pEntry;
}
return pEntry;
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::GetFocus()
{
if(!IsEditing() && !m_bWasEditing)
ActivateCell();
EditBrowseBox::GetFocus();
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::DeactivateCell(sal_Bool _bUpdate)
{
m_bWasEditing = sal_True;
EditBrowseBox::DeactivateCell(_bUpdate);
m_bWasEditing = sal_False;
}
// -----------------------------------------------------------------------------
::rtl::OUString OSelectionBrowseBox::GetRowDescription( sal_Int32 _nRow ) const
{
String aLabel(ModuleRes(STR_QUERY_HANDLETEXT));
// ab BROW_CRIT2_ROW werden alle Zeilen mit "oder" angegeben
xub_StrLen nToken = (xub_StrLen) (_nRow >= GetBrowseRow(BROW_CRIT2_ROW))
?
xub_StrLen(BROW_CRIT2_ROW) : xub_StrLen(GetRealRow(_nRow));
return ::rtl::OUString(aLabel.GetToken(nToken));
}
// -----------------------------------------------------------------------------
::rtl::OUString OSelectionBrowseBox::GetAccessibleObjectName( ::svt::AccessibleBrowseBoxObjType _eObjType,sal_Int32 _nPosition) const
{
::rtl::OUString sRetText;
switch( _eObjType )
{
case ::svt::BBTYPE_ROWHEADERCELL:
sRetText = GetRowDescription(_nPosition);
break;
default:
sRetText = EditBrowseBox::GetAccessibleObjectDescription(_eObjType,_nPosition);
}
return sRetText;
}
// -----------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::fillEntryTable(OTableFieldDescRef& _pEntry,const ::rtl::OUString& _sTableName)
{
sal_Bool bRet = sal_False;
OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
if (pTabWinList)
{
OJoinTableView::OTableWindowMapIterator aIter = pTabWinList->find(_sTableName);
if(aIter != pTabWinList->end())
{
OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(aIter->second);
if (pEntryTab)
{
_pEntry->SetTable(pEntryTab->GetTableName());
_pEntry->SetTabWindow(pEntryTab);
bRet = sal_True;
}
}
}
return bRet;
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::setFunctionCell(OTableFieldDescRef& _pEntry)
{
Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection();
if ( xConnection.is() )
{
// Diese Funktionen stehen nur unter CORE zur Verf<72>gung
if ( lcl_SupportsCoreSQLGrammar(xConnection) )
{
// if we have an asterix, no other function than count is allowed
m_pFunctionCell->Clear();
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(0));
if ( isFieldNameAsterix(_pEntry->GetField()) )
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT
else
{
xub_StrLen nCount = m_aFunctionStrings.GetTokenCount();
if ( _pEntry->isNumeric() )
--nCount;
for (xub_StrLen nIdx = 1; nIdx < nCount; nIdx++)
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(nIdx));
}
if ( _pEntry->IsGroupBy() )
{
OSL_ENSURE(!_pEntry->isNumeric(),"Not allowed to combine group by and numeric values!");
m_pFunctionCell->SelectEntry(m_pFunctionCell->GetEntry(m_pFunctionCell->GetEntryCount() - 1));
}
else if ( m_pFunctionCell->GetEntryPos(String(_pEntry->GetFunction())) != COMBOBOX_ENTRY_NOTFOUND )
m_pFunctionCell->SelectEntry(String(_pEntry->GetFunction()));
else
m_pFunctionCell->SelectEntryPos(0);
enableControl(_pEntry,m_pFunctionCell);
}
else
{
// nur COUNT(*) erlaubt
sal_Bool bCountRemoved = !isFieldNameAsterix(_pEntry->GetField());
if ( bCountRemoved )
m_pFunctionCell->RemoveEntry(1);
if ( !bCountRemoved && m_pFunctionCell->GetEntryCount() < 2)
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT
if(m_pFunctionCell->GetEntryPos(String(_pEntry->GetFunction())) != COMBOBOX_ENTRY_NOTFOUND)
m_pFunctionCell->SelectEntry(_pEntry->GetFunction());
else
m_pFunctionCell->SelectEntryPos(0);
}
}
}
// -----------------------------------------------------------------------------
Reference< XAccessible > OSelectionBrowseBox::CreateAccessibleCell( sal_Int32 _nRow, sal_uInt16 _nColumnPos )
{
OTableFieldDescRef pEntry = NULL;
if(getFields().size() > sal_uInt16(_nColumnPos - 1))
pEntry = getFields()[_nColumnPos - 1];
if ( _nRow == BROW_VIS_ROW && pEntry.isValid() )
return EditBrowseBox::CreateAccessibleCheckBoxCell( _nRow, _nColumnPos,pEntry->IsVisible() ? STATE_CHECK : STATE_NOCHECK );
return EditBrowseBox::CreateAccessibleCell( _nRow, _nColumnPos );
}
// -----------------------------------------------------------------------------
bool OSelectionBrowseBox::HasFieldByAliasName(const ::rtl::OUString& rFieldName, OTableFieldDescRef& rInfo) const
{
OTableFields& aFields = getFields();
OTableFields::iterator aIter = aFields.begin();
OTableFields::iterator aEnd = aFields.end();
for(;aIter != aEnd;++aIter)
{
if ( (*aIter)->GetFieldAlias() == rFieldName )
{
rInfo = *aIter;
break;
}
}
return aIter != aEnd;
}
// -----------------------------------------------------------------------------