1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_dbaccess.hxx" 30*cdf0e10cSrcweir #ifndef DBAUI_QUERYDESIGN_OSELECTIONBROWSEBOX_HXX 31*cdf0e10cSrcweir #include "SelectionBrowseBox.hxx" 32*cdf0e10cSrcweir #endif 33*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_ 34*cdf0e10cSrcweir #include <com/sun/star/sdbc/XDatabaseMetaData.hpp> 35*cdf0e10cSrcweir #endif 36*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_ 37*cdf0e10cSrcweir #include <com/sun/star/sdbc/DataType.hpp> 38*cdf0e10cSrcweir #endif 39*cdf0e10cSrcweir #ifndef DBAUI_QUERYDESIGNVIEW_HXX 40*cdf0e10cSrcweir #include "QueryDesignView.hxx" 41*cdf0e10cSrcweir #endif 42*cdf0e10cSrcweir #ifndef DBAUI_QUERYCONTROLLER_HXX 43*cdf0e10cSrcweir #include "querycontroller.hxx" 44*cdf0e10cSrcweir #endif 45*cdf0e10cSrcweir #ifndef DBAUI_QUERYTABLEVIEW_HXX 46*cdf0e10cSrcweir #include "QueryTableView.hxx" 47*cdf0e10cSrcweir #endif 48*cdf0e10cSrcweir #ifndef DBACCESS_UI_BROWSER_ID_HXX 49*cdf0e10cSrcweir #include "browserids.hxx" 50*cdf0e10cSrcweir #endif 51*cdf0e10cSrcweir #ifndef _COMPHELPER_TYPES_HXX_ 52*cdf0e10cSrcweir #include <comphelper/types.hxx> 53*cdf0e10cSrcweir #endif 54*cdf0e10cSrcweir #ifndef DBAUI_TABLEFIELDINFO_HXX 55*cdf0e10cSrcweir #include "TableFieldInfo.hxx" 56*cdf0e10cSrcweir #endif 57*cdf0e10cSrcweir #ifndef _DBU_QRY_HRC_ 58*cdf0e10cSrcweir #include "dbu_qry.hrc" 59*cdf0e10cSrcweir #endif 60*cdf0e10cSrcweir #ifndef _DBA_DBACCESS_HELPID_HRC_ 61*cdf0e10cSrcweir #include "dbaccess_helpid.hrc" 62*cdf0e10cSrcweir #endif 63*cdf0e10cSrcweir #ifndef _TOOLS_DEBUG_HXX 64*cdf0e10cSrcweir #include <tools/debug.hxx> 65*cdf0e10cSrcweir #endif 66*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_ 67*cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp> 68*cdf0e10cSrcweir #endif 69*cdf0e10cSrcweir #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC 70*cdf0e10cSrcweir #include "dbustrings.hrc" 71*cdf0e10cSrcweir #endif 72*cdf0e10cSrcweir #ifndef DBAUI_QUERY_TABLEWINDOW_HXX 73*cdf0e10cSrcweir #include "QTableWindow.hxx" 74*cdf0e10cSrcweir #endif 75*cdf0e10cSrcweir #ifndef DBAUI_QUERYTABLEVIEW_HXX 76*cdf0e10cSrcweir #include "QueryTableView.hxx" 77*cdf0e10cSrcweir #endif 78*cdf0e10cSrcweir #ifndef _SV_MSGBOX_HXX 79*cdf0e10cSrcweir #include <vcl/msgbox.hxx> 80*cdf0e10cSrcweir #endif 81*cdf0e10cSrcweir #ifndef DBAUI_QUERYDESIGNFIELDUNDOACT_HXX 82*cdf0e10cSrcweir #include "QueryDesignFieldUndoAct.hxx" 83*cdf0e10cSrcweir #endif 84*cdf0e10cSrcweir #ifndef _SVX_DBEXCH_HRC 85*cdf0e10cSrcweir #include <svx/dbexch.hrc> 86*cdf0e10cSrcweir #endif 87*cdf0e10cSrcweir #ifndef _COMPHELPER_STLTYPES_HXX_ 88*cdf0e10cSrcweir #include <comphelper/stl_types.hxx> 89*cdf0e10cSrcweir #endif 90*cdf0e10cSrcweir #ifndef _COMPHELPER_EXTRACT_HXX_ 91*cdf0e10cSrcweir #include <comphelper/extract.hxx> 92*cdf0e10cSrcweir #endif 93*cdf0e10cSrcweir #ifndef _DBAUI_SQLMESSAGE_HXX_ 94*cdf0e10cSrcweir #include "sqlmessage.hxx" 95*cdf0e10cSrcweir #endif 96*cdf0e10cSrcweir #ifndef DBAUI_TOOLS_HXX 97*cdf0e10cSrcweir #include "UITools.hxx" 98*cdf0e10cSrcweir #endif 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir using namespace ::svt; 101*cdf0e10cSrcweir using namespace ::dbaui; 102*cdf0e10cSrcweir using namespace ::connectivity; 103*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 104*cdf0e10cSrcweir using namespace ::com::sun::star::sdbc; 105*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 106*cdf0e10cSrcweir using namespace ::com::sun::star::container; 107*cdf0e10cSrcweir using namespace ::com::sun::star::util; 108*cdf0e10cSrcweir using namespace ::com::sun::star::accessibility; 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir const String g_strOne = String::CreateFromAscii("1"); 111*cdf0e10cSrcweir const String g_strZero = String::CreateFromAscii("0"); 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir #define DEFAULT_QUERY_COLS 20 114*cdf0e10cSrcweir #define DEFAULT_SIZE GetTextWidth(g_strZero) * 30 115*cdf0e10cSrcweir #define CHECKBOX_SIZE 10 116*cdf0e10cSrcweir #define HANDLE_ID 0 117*cdf0e10cSrcweir #define HANDLE_COLUMN_WITDH 70 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir #define SQL_ISRULEOR2(pParseNode, e1,e2) ((pParseNode)->isRule() && (\ 120*cdf0e10cSrcweir (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e1) || \ 121*cdf0e10cSrcweir (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e2))) 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 125*cdf0e10cSrcweir namespace 126*cdf0e10cSrcweir { 127*cdf0e10cSrcweir sal_Bool isFieldNameAsterix(const ::rtl::OUString& _sFieldName ) 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir sal_Bool bAsterix = !(_sFieldName.getLength() && _sFieldName.toChar() != '*'); 130*cdf0e10cSrcweir if ( !bAsterix ) 131*cdf0e10cSrcweir { 132*cdf0e10cSrcweir String sName = _sFieldName; 133*cdf0e10cSrcweir xub_StrLen nTokenCount = sName.GetTokenCount('.'); 134*cdf0e10cSrcweir if ( (nTokenCount == 2 && sName.GetToken(1,'.').GetChar(0) == '*' ) 135*cdf0e10cSrcweir || (nTokenCount == 3 && sName.GetToken(2,'.').GetChar(0) == '*' ) ) 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir bAsterix = sal_True; 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir } 140*cdf0e10cSrcweir return bAsterix; 141*cdf0e10cSrcweir } 142*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 143*cdf0e10cSrcweir sal_Bool lcl_SupportsCoreSQLGrammar(const Reference< XConnection>& _xConnection) 144*cdf0e10cSrcweir { 145*cdf0e10cSrcweir sal_Bool bSupportsCoreGrammar = sal_False; 146*cdf0e10cSrcweir if ( _xConnection.is() ) 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir try 149*cdf0e10cSrcweir { 150*cdf0e10cSrcweir Reference< XDatabaseMetaData > xMetaData = _xConnection->getMetaData(); 151*cdf0e10cSrcweir bSupportsCoreGrammar = xMetaData.is() && xMetaData->supportsCoreSQLGrammar(); 152*cdf0e10cSrcweir } 153*cdf0e10cSrcweir catch(Exception&) 154*cdf0e10cSrcweir { 155*cdf0e10cSrcweir } 156*cdf0e10cSrcweir } 157*cdf0e10cSrcweir return bSupportsCoreGrammar; 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir } 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir DBG_NAME(OSelectionBrowseBox) 162*cdf0e10cSrcweir //------------------------------------------------------------------------------ 163*cdf0e10cSrcweir OSelectionBrowseBox::OSelectionBrowseBox( Window* pParent ) 164*cdf0e10cSrcweir :EditBrowseBox( pParent,EBBF_NOROWPICTURE, WB_3DLOOK, BROWSER_COLUMNSELECTION | BROWSER_KEEPSELECTION | BROWSER_HIDESELECT | 165*cdf0e10cSrcweir BROWSER_HIDECURSOR | BROWSER_HLINESFULL | BROWSER_VLINESFULL ) 166*cdf0e10cSrcweir ,m_aFunctionStrings(ModuleRes(STR_QUERY_FUNCTIONS)) 167*cdf0e10cSrcweir ,m_nVisibleCount(0) 168*cdf0e10cSrcweir ,m_bOrderByUnRelated(sal_True) 169*cdf0e10cSrcweir ,m_bGroupByUnRelated(sal_True) 170*cdf0e10cSrcweir ,m_bStopTimer(sal_False) 171*cdf0e10cSrcweir ,m_bWasEditing(sal_False) 172*cdf0e10cSrcweir ,m_bDisableErrorBox(sal_False) 173*cdf0e10cSrcweir ,m_bInUndoMode(sal_False) 174*cdf0e10cSrcweir { 175*cdf0e10cSrcweir DBG_CTOR(OSelectionBrowseBox,NULL); 176*cdf0e10cSrcweir SetHelpId(HID_CTL_QRYDGNCRIT); 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir m_nMode = BROWSER_COLUMNSELECTION | BROWSER_HIDESELECT 179*cdf0e10cSrcweir | BROWSER_KEEPSELECTION | BROWSER_HIDECURSOR 180*cdf0e10cSrcweir | BROWSER_HLINESFULL | BROWSER_VLINESFULL 181*cdf0e10cSrcweir | BROWSER_HEADERBAR_NEW ; 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir m_pTextCell = new Edit(&GetDataWindow(), 0); 184*cdf0e10cSrcweir // m_pTextCell->EnableSpecialCheck(sal_False); 185*cdf0e10cSrcweir m_pVisibleCell = new CheckBoxControl(&GetDataWindow()); 186*cdf0e10cSrcweir m_pTableCell = new ListBoxControl(&GetDataWindow()); m_pTableCell->SetDropDownLineCount( 20 ); 187*cdf0e10cSrcweir m_pFieldCell = new ComboBoxControl(&GetDataWindow()); m_pFieldCell->SetDropDownLineCount( 20 ); 188*cdf0e10cSrcweir m_pOrderCell = new ListBoxControl(&GetDataWindow()); 189*cdf0e10cSrcweir m_pFunctionCell = new ListBoxControl(&GetDataWindow()); m_pFunctionCell->SetDropDownLineCount( 20 ); 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir m_pVisibleCell->SetHelpId(HID_QRYDGN_ROW_VISIBLE); 192*cdf0e10cSrcweir m_pTableCell->SetHelpId(HID_QRYDGN_ROW_TABLE); 193*cdf0e10cSrcweir m_pFieldCell->SetHelpId(HID_QRYDGN_ROW_FIELD); 194*cdf0e10cSrcweir m_pOrderCell->SetHelpId(HID_QRYDGN_ROW_ORDER); 195*cdf0e10cSrcweir m_pFunctionCell->SetHelpId(HID_QRYDGN_ROW_FUNCTION); 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 198*cdf0e10cSrcweir // TriState der ::com::sun::star::form::CheckBox abschalten 199*cdf0e10cSrcweir m_pVisibleCell->GetBox().EnableTriState( sal_False ); 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir // m_pEmptyEntry = new OTableFieldDesc(); 202*cdf0e10cSrcweir // m_pEmptyEntry->SetColWidth(DEFAULT_SIZE); 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir Font aTitleFont = OutputDevice::GetDefaultFont( DEFAULTFONT_SANS_UNICODE,Window::GetSettings().GetLanguage(),DEFAULTFONT_FLAGS_ONLYONE); 205*cdf0e10cSrcweir aTitleFont.SetSize(Size(0, 6)); 206*cdf0e10cSrcweir SetTitleFont(aTitleFont); 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir String aTxt(ModuleRes(STR_QUERY_SORTTEXT)); 209*cdf0e10cSrcweir xub_StrLen nCount = aTxt.GetTokenCount(); 210*cdf0e10cSrcweir xub_StrLen nIdx = 0; 211*cdf0e10cSrcweir for (; nIdx < nCount; nIdx++) 212*cdf0e10cSrcweir m_pOrderCell->InsertEntry(aTxt.GetToken(nIdx)); 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir for(long i=0;i < BROW_ROW_CNT;i++) 215*cdf0e10cSrcweir m_bVisibleRow.push_back(sal_True); 216*cdf0e10cSrcweir 217*cdf0e10cSrcweir m_bVisibleRow[BROW_FUNCTION_ROW] = sal_False; // zuerst ausblenden 218*cdf0e10cSrcweir 219*cdf0e10cSrcweir m_timerInvalidate.SetTimeout(200); 220*cdf0e10cSrcweir m_timerInvalidate.SetTimeoutHdl(LINK(this, OSelectionBrowseBox, OnInvalidateTimer)); 221*cdf0e10cSrcweir m_timerInvalidate.Start(); 222*cdf0e10cSrcweir } 223*cdf0e10cSrcweir 224*cdf0e10cSrcweir //------------------------------------------------------------------------------ 225*cdf0e10cSrcweir OSelectionBrowseBox::~OSelectionBrowseBox() 226*cdf0e10cSrcweir { 227*cdf0e10cSrcweir DBG_DTOR(OSelectionBrowseBox,NULL); 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir delete m_pTextCell; 230*cdf0e10cSrcweir delete m_pVisibleCell; 231*cdf0e10cSrcweir delete m_pFieldCell; 232*cdf0e10cSrcweir delete m_pTableCell; 233*cdf0e10cSrcweir delete m_pOrderCell; 234*cdf0e10cSrcweir delete m_pFunctionCell; 235*cdf0e10cSrcweir } 236*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 237*cdf0e10cSrcweir void OSelectionBrowseBox::initialize() 238*cdf0e10cSrcweir { 239*cdf0e10cSrcweir Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection(); 240*cdf0e10cSrcweir if(xConnection.is()) 241*cdf0e10cSrcweir { 242*cdf0e10cSrcweir const IParseContext& rContext = static_cast<OQueryController&>(getDesignView()->getController()).getParser().getContext(); 243*cdf0e10cSrcweir IParseContext::InternationalKeyCode eFunctions[] = { IParseContext::KEY_AVG,IParseContext::KEY_COUNT,IParseContext::KEY_MAX 244*cdf0e10cSrcweir ,IParseContext::KEY_MIN,IParseContext::KEY_SUM 245*cdf0e10cSrcweir ,IParseContext::KEY_EVERY 246*cdf0e10cSrcweir ,IParseContext::KEY_ANY 247*cdf0e10cSrcweir ,IParseContext::KEY_SOME 248*cdf0e10cSrcweir ,IParseContext::KEY_STDDEV_POP 249*cdf0e10cSrcweir ,IParseContext::KEY_STDDEV_SAMP 250*cdf0e10cSrcweir ,IParseContext::KEY_VAR_SAMP 251*cdf0e10cSrcweir ,IParseContext::KEY_VAR_POP 252*cdf0e10cSrcweir ,IParseContext::KEY_COLLECT 253*cdf0e10cSrcweir ,IParseContext::KEY_FUSION 254*cdf0e10cSrcweir ,IParseContext::KEY_INTERSECTION 255*cdf0e10cSrcweir }; 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir String sGroup = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount() - 1); 258*cdf0e10cSrcweir m_aFunctionStrings = m_aFunctionStrings.GetToken(0); 259*cdf0e10cSrcweir 260*cdf0e10cSrcweir for (size_t i = 0; i < sizeof(eFunctions)/sizeof(eFunctions[0]) ; ++i) 261*cdf0e10cSrcweir { 262*cdf0e10cSrcweir m_aFunctionStrings += String(RTL_CONSTASCII_USTRINGPARAM(";")); 263*cdf0e10cSrcweir m_aFunctionStrings += String(ByteString(rContext.getIntlKeywordAscii(eFunctions[i])),RTL_TEXTENCODING_UTF8); 264*cdf0e10cSrcweir 265*cdf0e10cSrcweir } // for (sal_Int32 i = 0; i < sizeof(eFunctions)/sizeof(eFunctions[0]) ; ++i) 266*cdf0e10cSrcweir m_aFunctionStrings += String(RTL_CONSTASCII_USTRINGPARAM(";")); 267*cdf0e10cSrcweir m_aFunctionStrings += sGroup; 268*cdf0e10cSrcweir 269*cdf0e10cSrcweir // Diese Funktionen stehen nur unter CORE zur Verf�gung 270*cdf0e10cSrcweir if ( lcl_SupportsCoreSQLGrammar(xConnection) ) 271*cdf0e10cSrcweir { 272*cdf0e10cSrcweir xub_StrLen nCount = m_aFunctionStrings.GetTokenCount(); 273*cdf0e10cSrcweir for (xub_StrLen nIdx = 0; nIdx < nCount; nIdx++) 274*cdf0e10cSrcweir m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(nIdx)); 275*cdf0e10cSrcweir } 276*cdf0e10cSrcweir else // sonst nur COUNT(*) 277*cdf0e10cSrcweir { 278*cdf0e10cSrcweir m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(0)); 279*cdf0e10cSrcweir m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT 280*cdf0e10cSrcweir } 281*cdf0e10cSrcweir try 282*cdf0e10cSrcweir { 283*cdf0e10cSrcweir Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData(); 284*cdf0e10cSrcweir if ( xMetaData.is() ) 285*cdf0e10cSrcweir { 286*cdf0e10cSrcweir m_bOrderByUnRelated = xMetaData->supportsOrderByUnrelated(); 287*cdf0e10cSrcweir m_bGroupByUnRelated = xMetaData->supportsGroupByUnrelated(); 288*cdf0e10cSrcweir } 289*cdf0e10cSrcweir } 290*cdf0e10cSrcweir catch(Exception&) 291*cdf0e10cSrcweir { 292*cdf0e10cSrcweir } 293*cdf0e10cSrcweir } 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir Init(); 296*cdf0e10cSrcweir } 297*cdf0e10cSrcweir //============================================================================== 298*cdf0e10cSrcweir OQueryDesignView* OSelectionBrowseBox::getDesignView() 299*cdf0e10cSrcweir { 300*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 301*cdf0e10cSrcweir OSL_ENSURE(static_cast<const OQueryDesignView*>(GetParent()),"Parent isn't an OQueryDesignView!"); 302*cdf0e10cSrcweir return static_cast<OQueryDesignView*>(GetParent()); 303*cdf0e10cSrcweir } 304*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 305*cdf0e10cSrcweir OQueryDesignView* OSelectionBrowseBox::getDesignView() const 306*cdf0e10cSrcweir { 307*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 308*cdf0e10cSrcweir OSL_ENSURE(static_cast<const OQueryDesignView*>(GetParent()),"Parent isn't an OQueryDesignView!"); 309*cdf0e10cSrcweir return static_cast<OQueryDesignView*>(GetParent()); 310*cdf0e10cSrcweir } 311*cdf0e10cSrcweir namespace 312*cdf0e10cSrcweir { 313*cdf0e10cSrcweir class OSelectionBrwBoxHeader : public ::svt::EditBrowserHeader 314*cdf0e10cSrcweir { 315*cdf0e10cSrcweir OSelectionBrowseBox* m_pBrowseBox; 316*cdf0e10cSrcweir protected: 317*cdf0e10cSrcweir virtual void Select(); 318*cdf0e10cSrcweir public: 319*cdf0e10cSrcweir OSelectionBrwBoxHeader(OSelectionBrowseBox* pParent); 320*cdf0e10cSrcweir }; 321*cdf0e10cSrcweir OSelectionBrwBoxHeader::OSelectionBrwBoxHeader(OSelectionBrowseBox* pParent) 322*cdf0e10cSrcweir : ::svt::EditBrowserHeader(pParent,WB_BUTTONSTYLE|WB_DRAG) 323*cdf0e10cSrcweir ,m_pBrowseBox(pParent) 324*cdf0e10cSrcweir { 325*cdf0e10cSrcweir } 326*cdf0e10cSrcweir 327*cdf0e10cSrcweir void OSelectionBrwBoxHeader::Select() 328*cdf0e10cSrcweir { 329*cdf0e10cSrcweir EditBrowserHeader::Select(); 330*cdf0e10cSrcweir m_pBrowseBox->GrabFocus(); 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir BrowserMode nMode = m_pBrowseBox->GetMode(); 333*cdf0e10cSrcweir if ( 0 == m_pBrowseBox->GetSelectColumnCount() ) 334*cdf0e10cSrcweir { 335*cdf0e10cSrcweir m_pBrowseBox->DeactivateCell(); 336*cdf0e10cSrcweir // wenn es schon eine selektierte Spalte gibt, bin ich schon im richtigen Modus 337*cdf0e10cSrcweir if ( BROWSER_HIDESELECT == ( nMode & BROWSER_HIDESELECT ) ) 338*cdf0e10cSrcweir { 339*cdf0e10cSrcweir nMode &= ~BROWSER_HIDESELECT; 340*cdf0e10cSrcweir nMode |= BROWSER_MULTISELECTION; 341*cdf0e10cSrcweir m_pBrowseBox->SetMode( nMode ); 342*cdf0e10cSrcweir } 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir m_pBrowseBox->SelectColumnId( GetCurItemId() ); 345*cdf0e10cSrcweir m_pBrowseBox->DeactivateCell(); 346*cdf0e10cSrcweir } 347*cdf0e10cSrcweir } 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 350*cdf0e10cSrcweir BrowserHeader* OSelectionBrowseBox::imp_CreateHeaderBar(BrowseBox* /*pParent*/) 351*cdf0e10cSrcweir { 352*cdf0e10cSrcweir return new OSelectionBrwBoxHeader(this); 353*cdf0e10cSrcweir } 354*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 355*cdf0e10cSrcweir void OSelectionBrowseBox::ColumnMoved( sal_uInt16 nColId,sal_Bool _bCreateUndo ) 356*cdf0e10cSrcweir { 357*cdf0e10cSrcweir EditBrowseBox::ColumnMoved( nColId ); 358*cdf0e10cSrcweir // swap the two columns 359*cdf0e10cSrcweir sal_uInt16 nNewPos = GetColumnPos( nColId ); 360*cdf0e10cSrcweir OTableFields& rFields = getFields(); 361*cdf0e10cSrcweir if ( rFields.size() > sal_uInt16(nNewPos-1) ) 362*cdf0e10cSrcweir { 363*cdf0e10cSrcweir sal_uInt16 nOldPos = 0; 364*cdf0e10cSrcweir OTableFields::iterator aEnd = rFields.end(); 365*cdf0e10cSrcweir OTableFields::iterator aIter = rFields.begin(); 366*cdf0e10cSrcweir for (; aIter != aEnd && ( (*aIter)->GetColumnId() != nColId ); ++aIter,++nOldPos) 367*cdf0e10cSrcweir ; 368*cdf0e10cSrcweir 369*cdf0e10cSrcweir OSL_ENSURE( (nNewPos-1) != nOldPos && nOldPos < rFields.size(),"Old and new position are equal!"); 370*cdf0e10cSrcweir if ( aIter != aEnd ) 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir OTableFieldDescRef pOldEntry = rFields[nOldPos]; 373*cdf0e10cSrcweir rFields.erase(rFields.begin() + nOldPos); 374*cdf0e10cSrcweir rFields.insert(rFields.begin() + nNewPos - 1,pOldEntry); 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir // create the undo action 377*cdf0e10cSrcweir if ( !m_bInUndoMode && _bCreateUndo ) 378*cdf0e10cSrcweir { 379*cdf0e10cSrcweir OTabFieldMovedUndoAct* pUndoAct = new OTabFieldMovedUndoAct(this); 380*cdf0e10cSrcweir pUndoAct->SetColumnPosition( nOldPos + 1); 381*cdf0e10cSrcweir pUndoAct->SetTabFieldDescr(pOldEntry); 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir getDesignView()->getController().addUndoActionAndInvalidate(pUndoAct); 384*cdf0e10cSrcweir } // if ( !m_bInUndoMode && _bCreateUndo ) 385*cdf0e10cSrcweir } 386*cdf0e10cSrcweir } 387*cdf0e10cSrcweir else 388*cdf0e10cSrcweir OSL_ENSURE(0,"Invalid column id!"); 389*cdf0e10cSrcweir } 390*cdf0e10cSrcweir //------------------------------------------------------------------------------ 391*cdf0e10cSrcweir void OSelectionBrowseBox::Init() 392*cdf0e10cSrcweir { 393*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 394*cdf0e10cSrcweir 395*cdf0e10cSrcweir EditBrowseBox::Init(); 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir // set the header bar 398*cdf0e10cSrcweir BrowserHeader* pNewHeaderBar = CreateHeaderBar(this); 399*cdf0e10cSrcweir pNewHeaderBar->SetMouseTransparent(sal_False); 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir SetHeaderBar(pNewHeaderBar); 402*cdf0e10cSrcweir SetMode(m_nMode); 403*cdf0e10cSrcweir 404*cdf0e10cSrcweir Font aFont( GetDataWindow().GetFont() ); 405*cdf0e10cSrcweir aFont.SetWeight( WEIGHT_NORMAL ); 406*cdf0e10cSrcweir GetDataWindow().SetFont( aFont ); 407*cdf0e10cSrcweir 408*cdf0e10cSrcweir Size aHeight; 409*cdf0e10cSrcweir const Control* pControls[] = { m_pTextCell,m_pVisibleCell,m_pTableCell,m_pFieldCell }; 410*cdf0e10cSrcweir for(sal_Size i= 0; i < sizeof(pControls)/sizeof(pControls[0]);++i) 411*cdf0e10cSrcweir { 412*cdf0e10cSrcweir const Size aTemp( pControls[i]->GetOptimalSize(WINDOWSIZE_PREFERRED) ); 413*cdf0e10cSrcweir if ( aTemp.Height() > aHeight.Height() ) 414*cdf0e10cSrcweir aHeight.Height() = aTemp.Height(); 415*cdf0e10cSrcweir } // for(int i= 0; i < sizeof(pControls)/sizeof(pControls[0]);++i 416*cdf0e10cSrcweir SetDataRowHeight(aHeight.Height()); 417*cdf0e10cSrcweir SetTitleLines(1); 418*cdf0e10cSrcweir // Anzahl der sichtbaren Zeilen ermitteln 419*cdf0e10cSrcweir for(long i=0;i<BROW_ROW_CNT;i++) 420*cdf0e10cSrcweir { 421*cdf0e10cSrcweir if(m_bVisibleRow[i]) 422*cdf0e10cSrcweir m_nVisibleCount++; 423*cdf0e10cSrcweir } 424*cdf0e10cSrcweir RowInserted(0, m_nVisibleCount, sal_False); 425*cdf0e10cSrcweir try 426*cdf0e10cSrcweir { 427*cdf0e10cSrcweir Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection(); 428*cdf0e10cSrcweir if(xConnection.is()) 429*cdf0e10cSrcweir { 430*cdf0e10cSrcweir Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData(); 431*cdf0e10cSrcweir m_nMaxColumns = xMetaData.is() ? xMetaData->getMaxColumnsInSelect() : 0; 432*cdf0e10cSrcweir 433*cdf0e10cSrcweir } 434*cdf0e10cSrcweir else 435*cdf0e10cSrcweir m_nMaxColumns = 0; 436*cdf0e10cSrcweir } 437*cdf0e10cSrcweir catch(const SQLException&) 438*cdf0e10cSrcweir { 439*cdf0e10cSrcweir OSL_ENSURE(0,"Catched Exception when asking for database metadata options!"); 440*cdf0e10cSrcweir m_nMaxColumns = 0; 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir } 443*cdf0e10cSrcweir 444*cdf0e10cSrcweir //------------------------------------------------------------------------------ 445*cdf0e10cSrcweir void OSelectionBrowseBox::PreFill() 446*cdf0e10cSrcweir { 447*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 448*cdf0e10cSrcweir SetUpdateMode(sal_False); 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir if (GetCurRow() != 0) 451*cdf0e10cSrcweir GoToRow(0); 452*cdf0e10cSrcweir 453*cdf0e10cSrcweir 454*cdf0e10cSrcweir static_cast< OQueryController& >( getDesignView()->getController() ).clearFields(); 455*cdf0e10cSrcweir 456*cdf0e10cSrcweir DeactivateCell(); 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir RemoveColumns(); 459*cdf0e10cSrcweir InsertHandleColumn( HANDLE_COLUMN_WITDH ); 460*cdf0e10cSrcweir SetUpdateMode(sal_True); 461*cdf0e10cSrcweir } 462*cdf0e10cSrcweir //------------------------------------------------------------------------------ 463*cdf0e10cSrcweir void OSelectionBrowseBox::ClearAll() 464*cdf0e10cSrcweir { 465*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 466*cdf0e10cSrcweir SetUpdateMode(sal_False); 467*cdf0e10cSrcweir 468*cdf0e10cSrcweir OTableFields::reverse_iterator aIter = getFields().rbegin(); 469*cdf0e10cSrcweir for ( ;aIter != getFields().rend(); ++aIter ) 470*cdf0e10cSrcweir { 471*cdf0e10cSrcweir if ( !(*aIter)->IsEmpty() ) 472*cdf0e10cSrcweir { 473*cdf0e10cSrcweir RemoveField( (*aIter)->GetColumnId() ); 474*cdf0e10cSrcweir aIter = getFields().rbegin(); 475*cdf0e10cSrcweir } 476*cdf0e10cSrcweir } 477*cdf0e10cSrcweir SetUpdateMode(sal_True); 478*cdf0e10cSrcweir } 479*cdf0e10cSrcweir //------------------------------------------------------------------------------ 480*cdf0e10cSrcweir void OSelectionBrowseBox::SetReadOnly(sal_Bool bRO) 481*cdf0e10cSrcweir { 482*cdf0e10cSrcweir if (bRO) 483*cdf0e10cSrcweir { 484*cdf0e10cSrcweir DeactivateCell(); 485*cdf0e10cSrcweir m_nMode &= ~BROWSER_HIDECURSOR; 486*cdf0e10cSrcweir SetMode(m_nMode); 487*cdf0e10cSrcweir } 488*cdf0e10cSrcweir else 489*cdf0e10cSrcweir { 490*cdf0e10cSrcweir m_nMode |= BROWSER_HIDECURSOR; 491*cdf0e10cSrcweir SetMode(m_nMode); 492*cdf0e10cSrcweir ActivateCell(); 493*cdf0e10cSrcweir } 494*cdf0e10cSrcweir } 495*cdf0e10cSrcweir 496*cdf0e10cSrcweir //------------------------------------------------------------------------------ 497*cdf0e10cSrcweir CellController* OSelectionBrowseBox::GetController(long nRow, sal_uInt16 nColId) 498*cdf0e10cSrcweir { 499*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 500*cdf0e10cSrcweir if ( nColId > getFields().size() ) 501*cdf0e10cSrcweir return NULL; 502*cdf0e10cSrcweir OTableFieldDescRef pEntry = getFields()[nColId-1]; 503*cdf0e10cSrcweir DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::GetController : keine FieldDescription !"); 504*cdf0e10cSrcweir 505*cdf0e10cSrcweir if (!pEntry.isValid()) 506*cdf0e10cSrcweir return NULL; 507*cdf0e10cSrcweir 508*cdf0e10cSrcweir if (static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly()) 509*cdf0e10cSrcweir return NULL; 510*cdf0e10cSrcweir 511*cdf0e10cSrcweir long nCellIndex = GetRealRow(nRow); 512*cdf0e10cSrcweir switch (nCellIndex) 513*cdf0e10cSrcweir { 514*cdf0e10cSrcweir case BROW_FIELD_ROW: 515*cdf0e10cSrcweir return new ComboBoxCellController(m_pFieldCell); 516*cdf0e10cSrcweir case BROW_TABLE_ROW: 517*cdf0e10cSrcweir return new ListBoxCellController(m_pTableCell); 518*cdf0e10cSrcweir case BROW_VIS_ROW: 519*cdf0e10cSrcweir return new CheckBoxCellController(m_pVisibleCell); 520*cdf0e10cSrcweir case BROW_ORDER_ROW: 521*cdf0e10cSrcweir return new ListBoxCellController(m_pOrderCell); 522*cdf0e10cSrcweir case BROW_FUNCTION_ROW: 523*cdf0e10cSrcweir return new ListBoxCellController(m_pFunctionCell); 524*cdf0e10cSrcweir default: 525*cdf0e10cSrcweir return new EditCellController(m_pTextCell); 526*cdf0e10cSrcweir } 527*cdf0e10cSrcweir } 528*cdf0e10cSrcweir 529*cdf0e10cSrcweir //------------------------------------------------------------------------------ 530*cdf0e10cSrcweir void OSelectionBrowseBox::InitController(CellControllerRef& /*rController*/, long nRow, sal_uInt16 nColId) 531*cdf0e10cSrcweir { 532*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 533*cdf0e10cSrcweir OSL_ENSURE(nColId != BROWSER_INVALIDID,"An Invalid Id was set!"); 534*cdf0e10cSrcweir if ( nColId == BROWSER_INVALIDID ) 535*cdf0e10cSrcweir return; 536*cdf0e10cSrcweir sal_uInt16 nPos = GetColumnPos(nColId); 537*cdf0e10cSrcweir if ( nPos == 0 || nPos == BROWSER_INVALIDID || nPos > getFields().size() ) 538*cdf0e10cSrcweir return; 539*cdf0e10cSrcweir OTableFieldDescRef pEntry = getFields()[nPos-1]; 540*cdf0e10cSrcweir DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::InitController : keine FieldDescription !"); 541*cdf0e10cSrcweir long nCellIndex = GetRealRow(nRow); 542*cdf0e10cSrcweir 543*cdf0e10cSrcweir switch (nCellIndex) 544*cdf0e10cSrcweir { 545*cdf0e10cSrcweir case BROW_FIELD_ROW: 546*cdf0e10cSrcweir { 547*cdf0e10cSrcweir m_pFieldCell->Clear(); 548*cdf0e10cSrcweir m_pFieldCell->SetText(String()); 549*cdf0e10cSrcweir 550*cdf0e10cSrcweir String aField(pEntry->GetField()); 551*cdf0e10cSrcweir String aTable(pEntry->GetAlias()); 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir getDesignView()->fillValidFields(aTable, m_pFieldCell); 554*cdf0e10cSrcweir 555*cdf0e10cSrcweir // * durch alias.* ersetzen 556*cdf0e10cSrcweir if ((aField.GetChar(0) == '*') && aTable.Len()) 557*cdf0e10cSrcweir { 558*cdf0e10cSrcweir aField = aTable; 559*cdf0e10cSrcweir aField.AppendAscii(".*"); 560*cdf0e10cSrcweir } 561*cdf0e10cSrcweir m_pFieldCell->SetText(aField); 562*cdf0e10cSrcweir } break; 563*cdf0e10cSrcweir case BROW_TABLE_ROW: 564*cdf0e10cSrcweir { 565*cdf0e10cSrcweir m_pTableCell->Clear(); 566*cdf0e10cSrcweir enableControl(pEntry,m_pTableCell); 567*cdf0e10cSrcweir if ( !pEntry->isCondition() ) 568*cdf0e10cSrcweir { 569*cdf0e10cSrcweir OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap(); 570*cdf0e10cSrcweir if (pTabWinList) 571*cdf0e10cSrcweir { 572*cdf0e10cSrcweir OJoinTableView::OTableWindowMap::iterator aIter = pTabWinList->begin(); 573*cdf0e10cSrcweir OJoinTableView::OTableWindowMap::iterator aEnd = pTabWinList->end(); 574*cdf0e10cSrcweir 575*cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 576*cdf0e10cSrcweir m_pTableCell->InsertEntry(static_cast<OQueryTableWindow*>(aIter->second)->GetAliasName()); 577*cdf0e10cSrcweir 578*cdf0e10cSrcweir m_pTableCell->InsertEntry(String(ModuleRes(STR_QUERY_NOTABLE)), 0); 579*cdf0e10cSrcweir if (pEntry->GetAlias().getLength()) 580*cdf0e10cSrcweir m_pTableCell->SelectEntry(pEntry->GetAlias()); 581*cdf0e10cSrcweir else 582*cdf0e10cSrcweir m_pTableCell->SelectEntry(String(ModuleRes(STR_QUERY_NOTABLE))); 583*cdf0e10cSrcweir } 584*cdf0e10cSrcweir } 585*cdf0e10cSrcweir } break; 586*cdf0e10cSrcweir case BROW_VIS_ROW: 587*cdf0e10cSrcweir { 588*cdf0e10cSrcweir m_pVisibleCell->GetBox().Check(pEntry->IsVisible()); 589*cdf0e10cSrcweir m_pVisibleCell->GetBox().SaveValue(); 590*cdf0e10cSrcweir 591*cdf0e10cSrcweir enableControl(pEntry,m_pTextCell); 592*cdf0e10cSrcweir 593*cdf0e10cSrcweir if(!pEntry->IsVisible() && pEntry->GetOrderDir() != ORDER_NONE && !m_bOrderByUnRelated) 594*cdf0e10cSrcweir { 595*cdf0e10cSrcweir // Spalte muss sichtbar sein, um im ORDER BY aufzutauchen 596*cdf0e10cSrcweir pEntry->SetVisible(sal_True); 597*cdf0e10cSrcweir m_pVisibleCell->GetBox().Check(pEntry->IsVisible()); 598*cdf0e10cSrcweir m_pVisibleCell->GetBox().SaveValue(); 599*cdf0e10cSrcweir m_pVisibleCell->GetBox().Disable(); 600*cdf0e10cSrcweir m_pVisibleCell->GetBox().EnableInput(sal_False); 601*cdf0e10cSrcweir String aMessage(ModuleRes(STR_QRY_ORDERBY_UNRELATED)); 602*cdf0e10cSrcweir OQueryDesignView* paDView = getDesignView(); 603*cdf0e10cSrcweir InfoBox(paDView, aMessage).Execute(); 604*cdf0e10cSrcweir } 605*cdf0e10cSrcweir } break; 606*cdf0e10cSrcweir case BROW_ORDER_ROW: 607*cdf0e10cSrcweir m_pOrderCell->SelectEntryPos( 608*cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >(pEntry->GetOrderDir())); 609*cdf0e10cSrcweir enableControl(pEntry,m_pOrderCell); 610*cdf0e10cSrcweir break; 611*cdf0e10cSrcweir case BROW_COLUMNALIAS_ROW: 612*cdf0e10cSrcweir setTextCellContext(pEntry,pEntry->GetFieldAlias(),HID_QRYDGN_ROW_ALIAS); 613*cdf0e10cSrcweir break; 614*cdf0e10cSrcweir case BROW_FUNCTION_ROW: 615*cdf0e10cSrcweir setFunctionCell(pEntry); 616*cdf0e10cSrcweir break; 617*cdf0e10cSrcweir default: 618*cdf0e10cSrcweir { 619*cdf0e10cSrcweir sal_uInt16 nIdx = sal_uInt16(nCellIndex - BROW_CRIT1_ROW); 620*cdf0e10cSrcweir setTextCellContext(pEntry,pEntry->GetCriteria( nIdx ),HID_QRYDGN_ROW_CRIT); 621*cdf0e10cSrcweir } 622*cdf0e10cSrcweir } 623*cdf0e10cSrcweir Controller()->ClearModified(); 624*cdf0e10cSrcweir } 625*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 626*cdf0e10cSrcweir void OSelectionBrowseBox::notifyTableFieldChanged(const String& _sOldAlias,const String& _sAlias,sal_Bool& _bListAction,sal_uInt16 _nColumnId) 627*cdf0e10cSrcweir { 628*cdf0e10cSrcweir appendUndoAction(_sOldAlias,_sAlias,BROW_TABLE_ROW,_bListAction); 629*cdf0e10cSrcweir if ( m_bVisibleRow[BROW_TABLE_ROW] ) 630*cdf0e10cSrcweir RowModified(GetBrowseRow(BROW_TABLE_ROW), _nColumnId); 631*cdf0e10cSrcweir } 632*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 633*cdf0e10cSrcweir void OSelectionBrowseBox::notifyFunctionFieldChanged(const String& _sOldFunctionName,const String& _sFunctionName,sal_Bool& _bListAction,sal_uInt16 _nColumnId) 634*cdf0e10cSrcweir { 635*cdf0e10cSrcweir appendUndoAction(_sOldFunctionName,_sFunctionName,BROW_FUNCTION_ROW,_bListAction); 636*cdf0e10cSrcweir if ( !m_bVisibleRow[BROW_FUNCTION_ROW] ) 637*cdf0e10cSrcweir SetRowVisible(BROW_FUNCTION_ROW, sal_True); 638*cdf0e10cSrcweir RowModified(GetBrowseRow(BROW_FUNCTION_ROW), _nColumnId); 639*cdf0e10cSrcweir } 640*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 641*cdf0e10cSrcweir void OSelectionBrowseBox::clearEntryFunctionField(const String& _sFieldName,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction,sal_uInt16 _nColumnId) 642*cdf0e10cSrcweir { 643*cdf0e10cSrcweir if ( isFieldNameAsterix( _sFieldName ) && (!_pEntry->isNoneFunction() || _pEntry->IsGroupBy()) ) 644*cdf0e10cSrcweir { 645*cdf0e10cSrcweir String sFunctionName; 646*cdf0e10cSrcweir GetFunctionName(SQL_TOKEN_COUNT,sFunctionName); 647*cdf0e10cSrcweir String sOldLocalizedFunctionName = _pEntry->GetFunction(); 648*cdf0e10cSrcweir if ( !sOldLocalizedFunctionName.Equals(sFunctionName) || _pEntry->IsGroupBy() ) 649*cdf0e10cSrcweir { 650*cdf0e10cSrcweir // append undo action for the function field 651*cdf0e10cSrcweir _pEntry->SetFunctionType(FKT_NONE); 652*cdf0e10cSrcweir _pEntry->SetFunction(::rtl::OUString()); 653*cdf0e10cSrcweir _pEntry->SetGroupBy(sal_False); 654*cdf0e10cSrcweir notifyFunctionFieldChanged(sOldLocalizedFunctionName,_pEntry->GetFunction(),_bListAction,_nColumnId); 655*cdf0e10cSrcweir } 656*cdf0e10cSrcweir } 657*cdf0e10cSrcweir } 658*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 659*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::fillColumnRef(const OSQLParseNode* _pColumnRef, const Reference< XConnection >& _rxConnection, OTableFieldDescRef& _pEntry, sal_Bool& _bListAction ) 660*cdf0e10cSrcweir { 661*cdf0e10cSrcweir OSL_ENSURE(_pColumnRef,"No valid parsenode!"); 662*cdf0e10cSrcweir ::rtl::OUString sColumnName,sTableRange; 663*cdf0e10cSrcweir OSQLParseTreeIterator::getColumnRange(_pColumnRef,_rxConnection,sColumnName,sTableRange); 664*cdf0e10cSrcweir return fillColumnRef(sColumnName,sTableRange,_rxConnection->getMetaData(),_pEntry,_bListAction); 665*cdf0e10cSrcweir } 666*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 667*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::fillColumnRef(const ::rtl::OUString& _sColumnName,const ::rtl::OUString& _sTableRange,const Reference<XDatabaseMetaData>& _xMetaData,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction) 668*cdf0e10cSrcweir { 669*cdf0e10cSrcweir sal_Bool bError = sal_False; 670*cdf0e10cSrcweir ::comphelper::UStringMixEqual bCase(_xMetaData->supportsMixedCaseQuotedIdentifiers()); 671*cdf0e10cSrcweir // check if the table name is the same 672*cdf0e10cSrcweir if ( _sTableRange.getLength() && (bCase(_pEntry->GetTable(),_sTableRange) || bCase(_pEntry->GetAlias(),_sTableRange)) ) 673*cdf0e10cSrcweir { // a table was already inserted and the tables contains that column name 674*cdf0e10cSrcweir 675*cdf0e10cSrcweir if ( !_pEntry->GetTabWindow() ) 676*cdf0e10cSrcweir { // fill tab window 677*cdf0e10cSrcweir ::rtl::OUString sOldAlias = _pEntry->GetAlias(); 678*cdf0e10cSrcweir if ( !fillEntryTable(_pEntry,_pEntry->GetTable()) ) 679*cdf0e10cSrcweir fillEntryTable(_pEntry,_pEntry->GetAlias()); // only when the first failed 680*cdf0e10cSrcweir if ( !bCase(sOldAlias,_pEntry->GetAlias()) ) 681*cdf0e10cSrcweir notifyTableFieldChanged(sOldAlias,_pEntry->GetAlias(),_bListAction,GetCurColumnId()); 682*cdf0e10cSrcweir } 683*cdf0e10cSrcweir } 684*cdf0e10cSrcweir // check if the table window 685*cdf0e10cSrcweir OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(_pEntry->GetTabWindow()); 686*cdf0e10cSrcweir if ( !pEntryTab ) // no table found with this name so we have to travel through all tables 687*cdf0e10cSrcweir { 688*cdf0e10cSrcweir OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap(); 689*cdf0e10cSrcweir if ( pTabWinList ) 690*cdf0e10cSrcweir { 691*cdf0e10cSrcweir sal_uInt16 nTabCount = 0; 692*cdf0e10cSrcweir if ( !static_cast<OQueryTableView*>(getDesignView()->getTableView())->FindTableFromField(_sColumnName,_pEntry,nTabCount) ) // error occured: column not in table window 693*cdf0e10cSrcweir { 694*cdf0e10cSrcweir String sErrorMsg(ModuleRes(RID_STR_FIELD_DOESNT_EXIST)); 695*cdf0e10cSrcweir sErrorMsg.SearchAndReplaceAscii("$name$",_sColumnName); 696*cdf0e10cSrcweir OSQLWarningBox( this, sErrorMsg ).Execute(); 697*cdf0e10cSrcweir bError = sal_True; 698*cdf0e10cSrcweir } 699*cdf0e10cSrcweir else 700*cdf0e10cSrcweir { 701*cdf0e10cSrcweir pEntryTab = static_cast<OQueryTableWindow*>(_pEntry->GetTabWindow()); 702*cdf0e10cSrcweir notifyTableFieldChanged(String(),_pEntry->GetAlias(),_bListAction,GetCurColumnId()); 703*cdf0e10cSrcweir } 704*cdf0e10cSrcweir } 705*cdf0e10cSrcweir } 706*cdf0e10cSrcweir if ( pEntryTab ) // here we got a valid table 707*cdf0e10cSrcweir _pEntry->SetField(_sColumnName); 708*cdf0e10cSrcweir 709*cdf0e10cSrcweir return bError; 710*cdf0e10cSrcweir } 711*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 712*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::saveField(const String& _sFieldName,OTableFieldDescRef& _pEntry,sal_Bool& _bListAction) 713*cdf0e10cSrcweir { 714*cdf0e10cSrcweir sal_Bool bError = sal_False; 715*cdf0e10cSrcweir 716*cdf0e10cSrcweir OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController()); 717*cdf0e10cSrcweir 718*cdf0e10cSrcweir // first look if the name can be found in our tables 719*cdf0e10cSrcweir sal_uInt16 nTabCount = 0; 720*cdf0e10cSrcweir String sOldAlias = _pEntry->GetAlias(); 721*cdf0e10cSrcweir if ( static_cast<OQueryTableView*>(getDesignView()->getTableView())->FindTableFromField(_sFieldName,_pEntry,nTabCount) ) 722*cdf0e10cSrcweir { 723*cdf0e10cSrcweir // append undo action for the alias name 724*cdf0e10cSrcweir _pEntry->SetField(_sFieldName); 725*cdf0e10cSrcweir notifyTableFieldChanged(sOldAlias,_pEntry->GetAlias(),_bListAction,GetCurColumnId()); 726*cdf0e10cSrcweir clearEntryFunctionField(_sFieldName,_pEntry,_bListAction,_pEntry->GetColumnId()); 727*cdf0e10cSrcweir return bError; 728*cdf0e10cSrcweir } 729*cdf0e10cSrcweir 730*cdf0e10cSrcweir Reference<XConnection> xConnection( rController.getConnection() ); 731*cdf0e10cSrcweir Reference< XDatabaseMetaData > xMetaData; 732*cdf0e10cSrcweir if ( xConnection.is() ) 733*cdf0e10cSrcweir xMetaData = xConnection->getMetaData(); 734*cdf0e10cSrcweir OSL_ENSURE( xMetaData.is(), "OSelectionBrowseBox::saveField: invalid connection/meta data!" ); 735*cdf0e10cSrcweir if ( !xMetaData.is() ) 736*cdf0e10cSrcweir return sal_True; 737*cdf0e10cSrcweir 738*cdf0e10cSrcweir ::rtl::OUString sErrorMsg; 739*cdf0e10cSrcweir // second test if the name can be set as select columns in a pseudo statement 740*cdf0e10cSrcweir // we have to look which entries we should quote 741*cdf0e10cSrcweir 742*cdf0e10cSrcweir const ::rtl::OUString sFieldAlias = _pEntry->GetFieldAlias(); 743*cdf0e10cSrcweir size_t nPass = 4; 744*cdf0e10cSrcweir ::connectivity::OSQLParser& rParser( rController.getParser() ); 745*cdf0e10cSrcweir OSQLParseNode* pParseNode = NULL; 746*cdf0e10cSrcweir // 4 passes in trying to interprete the field name 747*cdf0e10cSrcweir // - don't quote the field name, parse internationally 748*cdf0e10cSrcweir // - don't quote the field name, parse en-US 749*cdf0e10cSrcweir // - quote the field name, parse internationally 750*cdf0e10cSrcweir // - quote the field name, parse en-US 751*cdf0e10cSrcweir do 752*cdf0e10cSrcweir { 753*cdf0e10cSrcweir bool bQuote = ( nPass <= 2 ); 754*cdf0e10cSrcweir bool bInternational = ( nPass % 2 ) == 0; 755*cdf0e10cSrcweir 756*cdf0e10cSrcweir ::rtl::OUString sSql; 757*cdf0e10cSrcweir if ( bQuote ) 758*cdf0e10cSrcweir sSql += ::dbtools::quoteName( xMetaData->getIdentifierQuoteString(), _sFieldName ); 759*cdf0e10cSrcweir else 760*cdf0e10cSrcweir sSql += _sFieldName; 761*cdf0e10cSrcweir 762*cdf0e10cSrcweir if ( _pEntry->isAggreateFunction() ) 763*cdf0e10cSrcweir { 764*cdf0e10cSrcweir DBG_ASSERT(_pEntry->GetFunction().getLength(),"Functionname darf hier nicht leer sein! ;-("); 765*cdf0e10cSrcweir ::rtl::OUStringBuffer aTmpStr2( _pEntry->GetFunction()); 766*cdf0e10cSrcweir aTmpStr2.appendAscii("("); 767*cdf0e10cSrcweir aTmpStr2.append(sSql); 768*cdf0e10cSrcweir aTmpStr2.appendAscii(")"); 769*cdf0e10cSrcweir sSql = aTmpStr2.makeStringAndClear(); 770*cdf0e10cSrcweir } 771*cdf0e10cSrcweir 772*cdf0e10cSrcweir sSql = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT ")) + sSql; 773*cdf0e10cSrcweir if ( sFieldAlias.getLength() ) 774*cdf0e10cSrcweir { // always quote the alias name there canbe no function in it 775*cdf0e10cSrcweir sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" ")); 776*cdf0e10cSrcweir sSql += ::dbtools::quoteName( xMetaData->getIdentifierQuoteString(), sFieldAlias ); 777*cdf0e10cSrcweir } 778*cdf0e10cSrcweir sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" FROM x")); 779*cdf0e10cSrcweir 780*cdf0e10cSrcweir pParseNode = rParser.parseTree( sErrorMsg, sSql, bInternational ); 781*cdf0e10cSrcweir } 782*cdf0e10cSrcweir while ( ( pParseNode == NULL ) && ( --nPass > 0 ) ); 783*cdf0e10cSrcweir 784*cdf0e10cSrcweir if ( pParseNode == NULL ) 785*cdf0e10cSrcweir { 786*cdf0e10cSrcweir // something different which we have to check (may be a select statement) 787*cdf0e10cSrcweir String sErrorMessage( ModuleRes( STR_QRY_COLUMN_NOT_FOUND ) ); 788*cdf0e10cSrcweir sErrorMessage.SearchAndReplaceAscii("$name$",_sFieldName); 789*cdf0e10cSrcweir OSQLWarningBox( this, sErrorMessage ).Execute(); 790*cdf0e10cSrcweir return sal_True; 791*cdf0e10cSrcweir } 792*cdf0e10cSrcweir 793*cdf0e10cSrcweir // we got a valid select column 794*cdf0e10cSrcweir // find what type of column has be inserted 795*cdf0e10cSrcweir ::connectivity::OSQLParseNode* pSelection = pParseNode->getChild(2); 796*cdf0e10cSrcweir if ( SQL_ISRULE(pSelection,selection) ) // we found the asterix 797*cdf0e10cSrcweir { 798*cdf0e10cSrcweir _pEntry->SetField(_sFieldName); 799*cdf0e10cSrcweir clearEntryFunctionField(_sFieldName,_pEntry,_bListAction,_pEntry->GetColumnId()); 800*cdf0e10cSrcweir } // travel through the select column parse node 801*cdf0e10cSrcweir else 802*cdf0e10cSrcweir { 803*cdf0e10cSrcweir ::comphelper::UStringMixEqual bCase(xMetaData->supportsMixedCaseQuotedIdentifiers()); 804*cdf0e10cSrcweir 805*cdf0e10cSrcweir OTableFieldDescRef aSelEntry = _pEntry; 806*cdf0e10cSrcweir sal_uInt16 nColumnId = aSelEntry->GetColumnId(); 807*cdf0e10cSrcweir 808*cdf0e10cSrcweir sal_uInt32 nCount = pSelection->count(); 809*cdf0e10cSrcweir for (sal_uInt32 i = 0; i < nCount; ++i) 810*cdf0e10cSrcweir { 811*cdf0e10cSrcweir if ( i > 0 ) // may we have to append more than one field 812*cdf0e10cSrcweir { 813*cdf0e10cSrcweir sal_uInt16 nColumnPostion; 814*cdf0e10cSrcweir aSelEntry = FindFirstFreeCol(nColumnPostion); 815*cdf0e10cSrcweir if ( !aSelEntry.isValid() ) 816*cdf0e10cSrcweir { 817*cdf0e10cSrcweir AppendNewCol(1); 818*cdf0e10cSrcweir aSelEntry = FindFirstFreeCol(nColumnPostion); 819*cdf0e10cSrcweir } 820*cdf0e10cSrcweir ++nColumnPostion; 821*cdf0e10cSrcweir nColumnId = GetColumnId(nColumnPostion); 822*cdf0e10cSrcweir } 823*cdf0e10cSrcweir 824*cdf0e10cSrcweir ::connectivity::OSQLParseNode* pChild = pSelection->getChild( i ); 825*cdf0e10cSrcweir OSL_ENSURE(SQL_ISRULE(pChild,derived_column), "No derived column found!"); 826*cdf0e10cSrcweir // get the column alias 827*cdf0e10cSrcweir ::rtl::OUString sColumnAlias = OSQLParseTreeIterator::getColumnAlias(pChild); 828*cdf0e10cSrcweir if ( sColumnAlias.getLength() ) // we found an as clause 829*cdf0e10cSrcweir { 830*cdf0e10cSrcweir String aSelectionAlias = aSelEntry->GetFieldAlias(); 831*cdf0e10cSrcweir aSelEntry->SetFieldAlias( sColumnAlias ); 832*cdf0e10cSrcweir // append undo 833*cdf0e10cSrcweir appendUndoAction(aSelectionAlias,aSelEntry->GetFieldAlias(),BROW_COLUMNALIAS_ROW,_bListAction); 834*cdf0e10cSrcweir if ( m_bVisibleRow[BROW_COLUMNALIAS_ROW] ) 835*cdf0e10cSrcweir RowModified(GetBrowseRow(BROW_COLUMNALIAS_ROW), nColumnId); 836*cdf0e10cSrcweir } 837*cdf0e10cSrcweir 838*cdf0e10cSrcweir ::connectivity::OSQLParseNode* pColumnRef = pChild->getChild(0); 839*cdf0e10cSrcweir if ( 840*cdf0e10cSrcweir pColumnRef->count() == 3 && 841*cdf0e10cSrcweir SQL_ISPUNCTUATION(pColumnRef->getChild(0),"(") && 842*cdf0e10cSrcweir SQL_ISPUNCTUATION(pColumnRef->getChild(2),")") 843*cdf0e10cSrcweir ) 844*cdf0e10cSrcweir pColumnRef = pColumnRef->getChild(1); 845*cdf0e10cSrcweir 846*cdf0e10cSrcweir if ( SQL_ISRULE(pColumnRef,column_ref) ) // we found a valid column name or more column names 847*cdf0e10cSrcweir { 848*cdf0e10cSrcweir // look if we can find the corresponding table 849*cdf0e10cSrcweir bError = fillColumnRef( pColumnRef, xConnection, aSelEntry, _bListAction ); 850*cdf0e10cSrcweir 851*cdf0e10cSrcweir // we found a simple column so we must clear the function fields but only when the column name is '*' 852*cdf0e10cSrcweir // and the function is different to count 853*cdf0e10cSrcweir clearEntryFunctionField(_sFieldName,aSelEntry,_bListAction,nColumnId); 854*cdf0e10cSrcweir } 855*cdf0e10cSrcweir else 856*cdf0e10cSrcweir { 857*cdf0e10cSrcweir // first check if we have a aggregate function and only a function 858*cdf0e10cSrcweir if ( SQL_ISRULE(pColumnRef,general_set_fct) ) 859*cdf0e10cSrcweir { 860*cdf0e10cSrcweir String sLocalizedFunctionName; 861*cdf0e10cSrcweir if ( GetFunctionName(pColumnRef->getChild(0)->getTokenID(),sLocalizedFunctionName) ) 862*cdf0e10cSrcweir { 863*cdf0e10cSrcweir String sOldLocalizedFunctionName = aSelEntry->GetFunction(); 864*cdf0e10cSrcweir aSelEntry->SetFunction(sLocalizedFunctionName); 865*cdf0e10cSrcweir sal_uInt32 nFunCount = pColumnRef->count() - 1; 866*cdf0e10cSrcweir sal_Int32 nFunctionType = FKT_AGGREGATE; 867*cdf0e10cSrcweir sal_Bool bQuote = sal_False; 868*cdf0e10cSrcweir // may be there exists only one parameter which is a column, fill all information into our fields 869*cdf0e10cSrcweir if ( nFunCount == 4 && SQL_ISRULE(pColumnRef->getChild(3),column_ref) ) 870*cdf0e10cSrcweir bError = fillColumnRef( pColumnRef->getChild(3), xConnection, aSelEntry, _bListAction ); 871*cdf0e10cSrcweir else if ( nFunCount == 3 ) // we have a COUNT(*) here, so take the first table 872*cdf0e10cSrcweir bError = fillColumnRef( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("*")), ::rtl::OUString(), xMetaData, aSelEntry, _bListAction ); 873*cdf0e10cSrcweir else 874*cdf0e10cSrcweir { 875*cdf0e10cSrcweir nFunctionType |= FKT_NUMERIC; 876*cdf0e10cSrcweir bQuote = sal_True; 877*cdf0e10cSrcweir aSelEntry->SetDataType(DataType::DOUBLE); 878*cdf0e10cSrcweir aSelEntry->SetFieldType(TAB_NORMAL_FIELD); 879*cdf0e10cSrcweir } 880*cdf0e10cSrcweir 881*cdf0e10cSrcweir // now parse the parameters 882*cdf0e10cSrcweir ::rtl::OUString sParameters; 883*cdf0e10cSrcweir for(sal_uInt32 function = 2; function < nFunCount; ++function) // we only want to parse the parameters of the function 884*cdf0e10cSrcweir pColumnRef->getChild(function)->parseNodeToStr( sParameters, xConnection, &rParser.getContext(), sal_True, bQuote ); 885*cdf0e10cSrcweir 886*cdf0e10cSrcweir aSelEntry->SetFunctionType(nFunctionType); 887*cdf0e10cSrcweir aSelEntry->SetField(sParameters); 888*cdf0e10cSrcweir if ( aSelEntry->IsGroupBy() ) 889*cdf0e10cSrcweir { 890*cdf0e10cSrcweir sOldLocalizedFunctionName = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount()-1); 891*cdf0e10cSrcweir aSelEntry->SetGroupBy(sal_False); 892*cdf0e10cSrcweir } 893*cdf0e10cSrcweir 894*cdf0e10cSrcweir // append undo action 895*cdf0e10cSrcweir notifyFunctionFieldChanged(sOldLocalizedFunctionName,sLocalizedFunctionName,_bListAction, nColumnId); 896*cdf0e10cSrcweir } 897*cdf0e10cSrcweir else 898*cdf0e10cSrcweir OSL_ENSURE(0,"Unsupported function inserted!"); 899*cdf0e10cSrcweir 900*cdf0e10cSrcweir } 901*cdf0e10cSrcweir else 902*cdf0e10cSrcweir { 903*cdf0e10cSrcweir // so we first clear the function field 904*cdf0e10cSrcweir clearEntryFunctionField(_sFieldName,aSelEntry,_bListAction,nColumnId); 905*cdf0e10cSrcweir ::rtl::OUString sFunction; 906*cdf0e10cSrcweir pColumnRef->parseNodeToStr( sFunction, 907*cdf0e10cSrcweir xConnection, 908*cdf0e10cSrcweir &rController.getParser().getContext(), 909*cdf0e10cSrcweir sal_True, 910*cdf0e10cSrcweir sal_True); // quote is to true because we need quoted elements inside the function 911*cdf0e10cSrcweir 912*cdf0e10cSrcweir getDesignView()->fillFunctionInfo(pColumnRef,sFunction,aSelEntry); 913*cdf0e10cSrcweir 914*cdf0e10cSrcweir if( SQL_ISRULEOR2(pColumnRef,position_exp,extract_exp) || 915*cdf0e10cSrcweir SQL_ISRULEOR2(pColumnRef,fold,char_substring_fct) || 916*cdf0e10cSrcweir SQL_ISRULEOR2(pColumnRef,length_exp,char_value_fct) ) 917*cdf0e10cSrcweir // a calculation has been found ( can be calc and function ) 918*cdf0e10cSrcweir { 919*cdf0e10cSrcweir // now parse the whole statement 920*cdf0e10cSrcweir sal_uInt32 nFunCount = pColumnRef->count(); 921*cdf0e10cSrcweir ::rtl::OUString sParameters; 922*cdf0e10cSrcweir for(sal_uInt32 function = 0; function < nFunCount; ++function) 923*cdf0e10cSrcweir pColumnRef->getChild(function)->parseNodeToStr( sParameters, xConnection, &rParser.getContext(), sal_True, sal_True ); 924*cdf0e10cSrcweir 925*cdf0e10cSrcweir sOldAlias = aSelEntry->GetAlias(); 926*cdf0e10cSrcweir sal_Int32 nNewFunctionType = aSelEntry->GetFunctionType() | FKT_NUMERIC | FKT_OTHER; 927*cdf0e10cSrcweir aSelEntry->SetFunctionType(nNewFunctionType); 928*cdf0e10cSrcweir aSelEntry->SetField(sParameters); 929*cdf0e10cSrcweir } 930*cdf0e10cSrcweir else 931*cdf0e10cSrcweir { 932*cdf0e10cSrcweir aSelEntry->SetFieldAlias(sColumnAlias); 933*cdf0e10cSrcweir if ( SQL_ISRULE(pColumnRef,set_fct_spec) ) 934*cdf0e10cSrcweir aSelEntry->SetFunctionType(/*FKT_NUMERIC | */FKT_OTHER); 935*cdf0e10cSrcweir else 936*cdf0e10cSrcweir { 937*cdf0e10cSrcweir if ( SQL_ISRULEOR2(pColumnRef,num_value_exp,term) || SQL_ISRULE(pColumnRef,factor) ) 938*cdf0e10cSrcweir aSelEntry->SetDataType(DataType::DOUBLE); 939*cdf0e10cSrcweir else if ( SQL_ISRULE(pColumnRef,value_exp) ) 940*cdf0e10cSrcweir aSelEntry->SetDataType(DataType::TIMESTAMP); 941*cdf0e10cSrcweir else 942*cdf0e10cSrcweir aSelEntry->SetDataType(DataType::VARCHAR); 943*cdf0e10cSrcweir aSelEntry->SetFunctionType(FKT_NUMERIC | FKT_OTHER); 944*cdf0e10cSrcweir } 945*cdf0e10cSrcweir } 946*cdf0e10cSrcweir 947*cdf0e10cSrcweir aSelEntry->SetAlias(::rtl::OUString()); 948*cdf0e10cSrcweir notifyTableFieldChanged(sOldAlias,aSelEntry->GetAlias(),_bListAction, nColumnId); 949*cdf0e10cSrcweir } 950*cdf0e10cSrcweir 951*cdf0e10cSrcweir } 952*cdf0e10cSrcweir if ( i > 0 && InsertField(aSelEntry,BROWSER_INVALIDID,sal_True,sal_False).isEmpty() ) // may we have to append more than one field 953*cdf0e10cSrcweir { // the field could not be isnerted 954*cdf0e10cSrcweir String sErrorMessage( ModuleRes( RID_STR_FIELD_DOESNT_EXIST ) ); 955*cdf0e10cSrcweir sErrorMessage.SearchAndReplaceAscii("$name$",aSelEntry->GetField()); 956*cdf0e10cSrcweir OSQLWarningBox( this, sErrorMessage ).Execute(); 957*cdf0e10cSrcweir bError = sal_True; 958*cdf0e10cSrcweir } 959*cdf0e10cSrcweir } 960*cdf0e10cSrcweir } 961*cdf0e10cSrcweir delete pParseNode; 962*cdf0e10cSrcweir 963*cdf0e10cSrcweir return bError; 964*cdf0e10cSrcweir } 965*cdf0e10cSrcweir //------------------------------------------------------------------------------ 966*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::SaveModified() 967*cdf0e10cSrcweir { 968*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 969*cdf0e10cSrcweir OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController()); 970*cdf0e10cSrcweir OTableFieldDescRef pEntry = NULL; 971*cdf0e10cSrcweir sal_uInt16 nCurrentColumnPos = GetColumnPos(GetCurColumnId()); 972*cdf0e10cSrcweir if(getFields().size() > static_cast<sal_uInt16>(nCurrentColumnPos - 1)) 973*cdf0e10cSrcweir pEntry = getEntry(nCurrentColumnPos - 1); 974*cdf0e10cSrcweir 975*cdf0e10cSrcweir sal_Bool bWasEmpty = pEntry.isValid() ? pEntry->IsEmpty() : sal_False; 976*cdf0e10cSrcweir sal_Bool bError = sal_False; 977*cdf0e10cSrcweir sal_Bool bListAction = sal_False; 978*cdf0e10cSrcweir 979*cdf0e10cSrcweir if (pEntry.isValid() && Controller().Is() && Controller()->IsModified()) 980*cdf0e10cSrcweir { 981*cdf0e10cSrcweir // fuer die Undo-Action 982*cdf0e10cSrcweir String strOldCellContents,sNewValue; 983*cdf0e10cSrcweir long nRow = GetRealRow(GetCurRow()); 984*cdf0e10cSrcweir sal_Bool bAppendRow = sal_False; 985*cdf0e10cSrcweir switch (nRow) 986*cdf0e10cSrcweir { 987*cdf0e10cSrcweir case BROW_VIS_ROW: 988*cdf0e10cSrcweir { 989*cdf0e10cSrcweir sal_Bool bOldValue = m_pVisibleCell->GetBox().GetSavedValue() != STATE_NOCHECK; 990*cdf0e10cSrcweir strOldCellContents = bOldValue ? g_strOne : g_strZero; 991*cdf0e10cSrcweir sNewValue = !bOldValue ? g_strOne : g_strZero; 992*cdf0e10cSrcweir } 993*cdf0e10cSrcweir if((m_bOrderByUnRelated || pEntry->GetOrderDir() == ORDER_NONE) && 994*cdf0e10cSrcweir (m_bGroupByUnRelated || !pEntry->IsGroupBy())) 995*cdf0e10cSrcweir { 996*cdf0e10cSrcweir pEntry->SetVisible(m_pVisibleCell->GetBox().IsChecked()); 997*cdf0e10cSrcweir } 998*cdf0e10cSrcweir else 999*cdf0e10cSrcweir { 1000*cdf0e10cSrcweir pEntry->SetVisible(sal_True); 1001*cdf0e10cSrcweir m_pVisibleCell->GetBox().Check(); 1002*cdf0e10cSrcweir } 1003*cdf0e10cSrcweir break; 1004*cdf0e10cSrcweir 1005*cdf0e10cSrcweir case BROW_FIELD_ROW: 1006*cdf0e10cSrcweir { 1007*cdf0e10cSrcweir String aFieldName(m_pFieldCell->GetText()); 1008*cdf0e10cSrcweir try 1009*cdf0e10cSrcweir { 1010*cdf0e10cSrcweir if (!aFieldName.Len()) 1011*cdf0e10cSrcweir { 1012*cdf0e10cSrcweir OTableFieldDescRef pNewEntry = new OTableFieldDesc(); 1013*cdf0e10cSrcweir pNewEntry->SetColumnId( pEntry->GetColumnId() ); 1014*cdf0e10cSrcweir ::std::replace(getFields().begin(),getFields().end(),pEntry,pNewEntry); 1015*cdf0e10cSrcweir sal_uInt16 nCol = GetCurColumnId(); 1016*cdf0e10cSrcweir for (int i = 0; i < m_nVisibleCount; i++) // Spalte neu zeichnen 1017*cdf0e10cSrcweir RowModified(i,nCol); 1018*cdf0e10cSrcweir } 1019*cdf0e10cSrcweir else 1020*cdf0e10cSrcweir { 1021*cdf0e10cSrcweir strOldCellContents = pEntry->GetField(); 1022*cdf0e10cSrcweir bListAction = sal_True; 1023*cdf0e10cSrcweir if ( !m_bInUndoMode ) 1024*cdf0e10cSrcweir rController.GetUndoManager().EnterListAction(String(),String()); 1025*cdf0e10cSrcweir 1026*cdf0e10cSrcweir sal_uInt16 nPos = m_pFieldCell->GetEntryPos(aFieldName); 1027*cdf0e10cSrcweir String aAliasName = pEntry->GetAlias(); 1028*cdf0e10cSrcweir if ( nPos != COMBOBOX_ENTRY_NOTFOUND && !aAliasName.Len() && aFieldName.GetTokenCount('.') > 1 ) 1029*cdf0e10cSrcweir { // special case, we have a table field so we must cut the table name 1030*cdf0e10cSrcweir String sTableAlias = aFieldName.GetToken(0,'.'); 1031*cdf0e10cSrcweir pEntry->SetAlias(sTableAlias); 1032*cdf0e10cSrcweir String sColumnName = aFieldName.Copy(sTableAlias.Len()+1,aFieldName.Len() - sTableAlias.Len() -1); 1033*cdf0e10cSrcweir Reference<XConnection> xConnection = rController.getConnection(); 1034*cdf0e10cSrcweir if ( !xConnection.is() ) 1035*cdf0e10cSrcweir return sal_False; 1036*cdf0e10cSrcweir bError = fillColumnRef( sColumnName, sTableAlias, xConnection->getMetaData(), pEntry, bListAction ); 1037*cdf0e10cSrcweir } 1038*cdf0e10cSrcweir else 1039*cdf0e10cSrcweir bError = sal_True; 1040*cdf0e10cSrcweir 1041*cdf0e10cSrcweir if ( bError ) 1042*cdf0e10cSrcweir bError = saveField(aFieldName,pEntry,bListAction); 1043*cdf0e10cSrcweir } 1044*cdf0e10cSrcweir } 1045*cdf0e10cSrcweir catch(Exception&) 1046*cdf0e10cSrcweir { 1047*cdf0e10cSrcweir bError = sal_True; 1048*cdf0e10cSrcweir } 1049*cdf0e10cSrcweir if ( bError ) 1050*cdf0e10cSrcweir { 1051*cdf0e10cSrcweir sNewValue = aFieldName; 1052*cdf0e10cSrcweir if ( !m_bInUndoMode ) 1053*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).GetUndoManager().LeaveListAction(); 1054*cdf0e10cSrcweir bListAction = sal_False; 1055*cdf0e10cSrcweir } 1056*cdf0e10cSrcweir else 1057*cdf0e10cSrcweir sNewValue = pEntry->GetField(); 1058*cdf0e10cSrcweir rController.InvalidateFeature( ID_BROWSER_QUERY_EXECUTE ); 1059*cdf0e10cSrcweir } 1060*cdf0e10cSrcweir break; 1061*cdf0e10cSrcweir 1062*cdf0e10cSrcweir case BROW_TABLE_ROW: 1063*cdf0e10cSrcweir { 1064*cdf0e10cSrcweir String aAliasName = m_pTableCell->GetSelectEntry(); 1065*cdf0e10cSrcweir strOldCellContents = pEntry->GetAlias(); 1066*cdf0e10cSrcweir if ( m_pTableCell->GetSelectEntryPos() != 0 ) 1067*cdf0e10cSrcweir { 1068*cdf0e10cSrcweir pEntry->SetAlias(aAliasName); 1069*cdf0e10cSrcweir // we have to set the table name as well as the table window 1070*cdf0e10cSrcweir OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap(); 1071*cdf0e10cSrcweir if (pTabWinList) 1072*cdf0e10cSrcweir { 1073*cdf0e10cSrcweir OJoinTableView::OTableWindowMapIterator aIter = pTabWinList->find(aAliasName); 1074*cdf0e10cSrcweir if(aIter != pTabWinList->end()) 1075*cdf0e10cSrcweir { 1076*cdf0e10cSrcweir OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(aIter->second); 1077*cdf0e10cSrcweir if (pEntryTab) 1078*cdf0e10cSrcweir { 1079*cdf0e10cSrcweir pEntry->SetTable(pEntryTab->GetTableName()); 1080*cdf0e10cSrcweir pEntry->SetTabWindow(pEntryTab); 1081*cdf0e10cSrcweir } 1082*cdf0e10cSrcweir } 1083*cdf0e10cSrcweir } 1084*cdf0e10cSrcweir } 1085*cdf0e10cSrcweir else 1086*cdf0e10cSrcweir { 1087*cdf0e10cSrcweir pEntry->SetAlias(::rtl::OUString()); 1088*cdf0e10cSrcweir pEntry->SetTable(::rtl::OUString()); 1089*cdf0e10cSrcweir pEntry->SetTabWindow(NULL); 1090*cdf0e10cSrcweir } 1091*cdf0e10cSrcweir sNewValue = pEntry->GetAlias(); 1092*cdf0e10cSrcweir 1093*cdf0e10cSrcweir } break; 1094*cdf0e10cSrcweir 1095*cdf0e10cSrcweir case BROW_ORDER_ROW: 1096*cdf0e10cSrcweir { 1097*cdf0e10cSrcweir strOldCellContents = String::CreateFromInt32((sal_uInt16)pEntry->GetOrderDir()); 1098*cdf0e10cSrcweir sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos(); 1099*cdf0e10cSrcweir if (nIdx == sal_uInt16(-1)) 1100*cdf0e10cSrcweir nIdx = 0; 1101*cdf0e10cSrcweir pEntry->SetOrderDir(EOrderDir(nIdx)); 1102*cdf0e10cSrcweir if(!m_bOrderByUnRelated) 1103*cdf0e10cSrcweir { 1104*cdf0e10cSrcweir pEntry->SetVisible(sal_True); 1105*cdf0e10cSrcweir m_pVisibleCell->GetBox().Check(); 1106*cdf0e10cSrcweir RowModified(GetBrowseRow(BROW_VIS_ROW), GetCurColumnId()); 1107*cdf0e10cSrcweir } 1108*cdf0e10cSrcweir sNewValue = String::CreateFromInt32((sal_uInt16)pEntry->GetOrderDir()); 1109*cdf0e10cSrcweir } break; 1110*cdf0e10cSrcweir 1111*cdf0e10cSrcweir case BROW_COLUMNALIAS_ROW: 1112*cdf0e10cSrcweir strOldCellContents = pEntry->GetFieldAlias(); 1113*cdf0e10cSrcweir pEntry->SetFieldAlias(m_pTextCell->GetText()); 1114*cdf0e10cSrcweir sNewValue = pEntry->GetFieldAlias(); 1115*cdf0e10cSrcweir break; 1116*cdf0e10cSrcweir case BROW_FUNCTION_ROW: 1117*cdf0e10cSrcweir { 1118*cdf0e10cSrcweir strOldCellContents = pEntry->GetFunction(); 1119*cdf0e10cSrcweir sal_uInt16 nPos = m_pFunctionCell->GetSelectEntryPos(); 1120*cdf0e10cSrcweir // Diese Funktionen stehen nur unter CORE zur Verf�gung 1121*cdf0e10cSrcweir String sFunctionName = m_pFunctionCell->GetEntry(nPos); 1122*cdf0e10cSrcweir String sGroupFunctionName = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount()-1); 1123*cdf0e10cSrcweir sal_Bool bGroupBy = sal_False; 1124*cdf0e10cSrcweir if ( sGroupFunctionName.Equals(sFunctionName) ) // check if the function name is GROUP 1125*cdf0e10cSrcweir { 1126*cdf0e10cSrcweir bGroupBy = sal_True; 1127*cdf0e10cSrcweir 1128*cdf0e10cSrcweir if ( !m_bGroupByUnRelated && !pEntry->IsVisible() ) 1129*cdf0e10cSrcweir { 1130*cdf0e10cSrcweir // we have to change the visblie flag, so we must append also an undo action 1131*cdf0e10cSrcweir pEntry->SetVisible(sal_True); 1132*cdf0e10cSrcweir m_pVisibleCell->GetBox().Check(); 1133*cdf0e10cSrcweir appendUndoAction(g_strZero,g_strOne,BROW_VIS_ROW,bListAction); 1134*cdf0e10cSrcweir RowModified(GetBrowseRow(BROW_VIS_ROW), GetCurColumnId()); 1135*cdf0e10cSrcweir } 1136*cdf0e10cSrcweir 1137*cdf0e10cSrcweir pEntry->SetFunction(String()); 1138*cdf0e10cSrcweir pEntry->SetFunctionType(pEntry->GetFunctionType() & ~FKT_AGGREGATE ); 1139*cdf0e10cSrcweir } 1140*cdf0e10cSrcweir else if ( nPos ) // we found an aggregate function 1141*cdf0e10cSrcweir { 1142*cdf0e10cSrcweir pEntry->SetFunctionType(pEntry->GetFunctionType() | FKT_AGGREGATE ); 1143*cdf0e10cSrcweir pEntry->SetFunction(sFunctionName); 1144*cdf0e10cSrcweir } 1145*cdf0e10cSrcweir else 1146*cdf0e10cSrcweir { 1147*cdf0e10cSrcweir sFunctionName = String(); 1148*cdf0e10cSrcweir pEntry->SetFunction(String()); 1149*cdf0e10cSrcweir pEntry->SetFunctionType(pEntry->GetFunctionType() & ~FKT_AGGREGATE ); 1150*cdf0e10cSrcweir } 1151*cdf0e10cSrcweir 1152*cdf0e10cSrcweir pEntry->SetGroupBy(bGroupBy); 1153*cdf0e10cSrcweir 1154*cdf0e10cSrcweir sNewValue = sFunctionName; 1155*cdf0e10cSrcweir } 1156*cdf0e10cSrcweir break; 1157*cdf0e10cSrcweir default: 1158*cdf0e10cSrcweir { 1159*cdf0e10cSrcweir Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection(); 1160*cdf0e10cSrcweir if(!xConnection.is()) 1161*cdf0e10cSrcweir break; 1162*cdf0e10cSrcweir 1163*cdf0e10cSrcweir sal_uInt16 nIdx = sal_uInt16(nRow - BROW_CRIT1_ROW); 1164*cdf0e10cSrcweir String aText = m_pTextCell->GetText(); 1165*cdf0e10cSrcweir 1166*cdf0e10cSrcweir aText.EraseLeadingChars(); 1167*cdf0e10cSrcweir ::rtl::OUString aCrit; 1168*cdf0e10cSrcweir if(aText.Len()) 1169*cdf0e10cSrcweir { 1170*cdf0e10cSrcweir ::rtl::OUString aErrorMsg; 1171*cdf0e10cSrcweir Reference<XPropertySet> xColumn; 1172*cdf0e10cSrcweir OSQLParseNode* pParseNode = getDesignView()->getPredicateTreeFromEntry(pEntry,aText,aErrorMsg,xColumn); 1173*cdf0e10cSrcweir 1174*cdf0e10cSrcweir if (pParseNode) 1175*cdf0e10cSrcweir { 1176*cdf0e10cSrcweir pParseNode->parseNodeToPredicateStr(aCrit, 1177*cdf0e10cSrcweir xConnection, 1178*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).getNumberFormatter(), 1179*cdf0e10cSrcweir xColumn, 1180*cdf0e10cSrcweir getDesignView()->getLocale(), 1181*cdf0e10cSrcweir static_cast<sal_Char>(getDesignView()->getDecimalSeparator().toChar()), 1182*cdf0e10cSrcweir &(static_cast<OQueryController&>(getDesignView()->getController()).getParser().getContext())); 1183*cdf0e10cSrcweir delete pParseNode; 1184*cdf0e10cSrcweir } 1185*cdf0e10cSrcweir else 1186*cdf0e10cSrcweir { 1187*cdf0e10cSrcweir if(xColumn.is()) 1188*cdf0e10cSrcweir { 1189*cdf0e10cSrcweir sal_Int32 nType = 0; 1190*cdf0e10cSrcweir xColumn->getPropertyValue(PROPERTY_TYPE) >>= nType; 1191*cdf0e10cSrcweir switch(nType) 1192*cdf0e10cSrcweir { 1193*cdf0e10cSrcweir case DataType::CHAR: 1194*cdf0e10cSrcweir case DataType::VARCHAR: 1195*cdf0e10cSrcweir case DataType::LONGVARCHAR: 1196*cdf0e10cSrcweir case DataType::CLOB: 1197*cdf0e10cSrcweir if(aText.GetChar(0) != '\'' || aText.GetChar(aText.Len() -1) != '\'') 1198*cdf0e10cSrcweir { 1199*cdf0e10cSrcweir aText.SearchAndReplaceAll(String::CreateFromAscii("'"),String::CreateFromAscii("''")); 1200*cdf0e10cSrcweir String aTmp(String::CreateFromAscii("'")); 1201*cdf0e10cSrcweir (aTmp += aText) += String::CreateFromAscii("'"); 1202*cdf0e10cSrcweir aText = aTmp; 1203*cdf0e10cSrcweir } 1204*cdf0e10cSrcweir break; 1205*cdf0e10cSrcweir default: 1206*cdf0e10cSrcweir ; 1207*cdf0e10cSrcweir } 1208*cdf0e10cSrcweir ::connectivity::OSQLParser& rParser = static_cast<OQueryController&>(getDesignView()->getController()).getParser(); 1209*cdf0e10cSrcweir pParseNode = rParser.predicateTree(aErrorMsg, 1210*cdf0e10cSrcweir aText, 1211*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).getNumberFormatter(), 1212*cdf0e10cSrcweir xColumn); 1213*cdf0e10cSrcweir if (pParseNode) 1214*cdf0e10cSrcweir { 1215*cdf0e10cSrcweir pParseNode->parseNodeToPredicateStr(aCrit, 1216*cdf0e10cSrcweir xConnection, 1217*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).getNumberFormatter(), 1218*cdf0e10cSrcweir xColumn, 1219*cdf0e10cSrcweir getDesignView()->getLocale(), 1220*cdf0e10cSrcweir static_cast<sal_Char>(getDesignView()->getDecimalSeparator().toChar()), 1221*cdf0e10cSrcweir &(static_cast<OQueryController&>(getDesignView()->getController()).getParser().getContext())); 1222*cdf0e10cSrcweir delete pParseNode; 1223*cdf0e10cSrcweir } 1224*cdf0e10cSrcweir else 1225*cdf0e10cSrcweir { 1226*cdf0e10cSrcweir if ( !m_bDisableErrorBox ) 1227*cdf0e10cSrcweir { 1228*cdf0e10cSrcweir OSQLWarningBox( this, aErrorMsg ).Execute(); 1229*cdf0e10cSrcweir } 1230*cdf0e10cSrcweir bError = sal_True; 1231*cdf0e10cSrcweir } 1232*cdf0e10cSrcweir } 1233*cdf0e10cSrcweir else 1234*cdf0e10cSrcweir { 1235*cdf0e10cSrcweir if ( !m_bDisableErrorBox ) 1236*cdf0e10cSrcweir { 1237*cdf0e10cSrcweir OSQLWarningBox( this, aErrorMsg ).Execute(); 1238*cdf0e10cSrcweir } 1239*cdf0e10cSrcweir bError = sal_True; 1240*cdf0e10cSrcweir } 1241*cdf0e10cSrcweir } 1242*cdf0e10cSrcweir // } 1243*cdf0e10cSrcweir } 1244*cdf0e10cSrcweir strOldCellContents = pEntry->GetCriteria(nIdx); 1245*cdf0e10cSrcweir pEntry->SetCriteria(nIdx, aCrit); 1246*cdf0e10cSrcweir sNewValue = pEntry->GetCriteria(nIdx); 1247*cdf0e10cSrcweir if(aCrit.getLength() && nRow >= (GetRowCount()-1)) 1248*cdf0e10cSrcweir bAppendRow = sal_True; 1249*cdf0e10cSrcweir } 1250*cdf0e10cSrcweir } 1251*cdf0e10cSrcweir if(!bError && Controller()) 1252*cdf0e10cSrcweir Controller()->ClearModified(); 1253*cdf0e10cSrcweir 1254*cdf0e10cSrcweir RowModified(GetCurRow(), GetCurColumnId()); 1255*cdf0e10cSrcweir 1256*cdf0e10cSrcweir if ( bAppendRow ) 1257*cdf0e10cSrcweir { 1258*cdf0e10cSrcweir RowInserted( GetRowCount()-1, 1, sal_True ); 1259*cdf0e10cSrcweir m_bVisibleRow.push_back(sal_True); 1260*cdf0e10cSrcweir ++m_nVisibleCount; 1261*cdf0e10cSrcweir } 1262*cdf0e10cSrcweir 1263*cdf0e10cSrcweir if(!bError) 1264*cdf0e10cSrcweir { 1265*cdf0e10cSrcweir // und noch die Undo-Action fuer das Ganze 1266*cdf0e10cSrcweir appendUndoAction(strOldCellContents,sNewValue,nRow); 1267*cdf0e10cSrcweir 1268*cdf0e10cSrcweir } 1269*cdf0e10cSrcweir } 1270*cdf0e10cSrcweir 1271*cdf0e10cSrcweir // habe ich Daten in einer FieldDescription gespeichert, die vorher leer war und es nach den Aenderungen nicht mehr ist ? 1272*cdf0e10cSrcweir if ( pEntry.isValid() && bWasEmpty && !pEntry->IsEmpty() && !bError ) 1273*cdf0e10cSrcweir { 1274*cdf0e10cSrcweir // Default auf sichtbar 1275*cdf0e10cSrcweir pEntry->SetVisible(sal_True); 1276*cdf0e10cSrcweir appendUndoAction(g_strZero,g_strOne,BROW_VIS_ROW,bListAction); 1277*cdf0e10cSrcweir RowModified(BROW_VIS_ROW, GetCurColumnId()); 1278*cdf0e10cSrcweir 1279*cdf0e10cSrcweir // wenn noetig neue freie Spalten anlegen 1280*cdf0e10cSrcweir sal_uInt16 nDummy; 1281*cdf0e10cSrcweir CheckFreeColumns(nDummy); 1282*cdf0e10cSrcweir } 1283*cdf0e10cSrcweir 1284*cdf0e10cSrcweir if ( bListAction && !m_bInUndoMode ) 1285*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).GetUndoManager().LeaveListAction(); 1286*cdf0e10cSrcweir 1287*cdf0e10cSrcweir return pEntry != NULL && !bError; 1288*cdf0e10cSrcweir } 1289*cdf0e10cSrcweir 1290*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1291*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::SeekRow(long nRow) 1292*cdf0e10cSrcweir { 1293*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1294*cdf0e10cSrcweir sal_Bool bRet = sal_False; 1295*cdf0e10cSrcweir 1296*cdf0e10cSrcweir m_nSeekRow = nRow; 1297*cdf0e10cSrcweir if (nRow < m_nVisibleCount ) 1298*cdf0e10cSrcweir bRet = sal_True; 1299*cdf0e10cSrcweir 1300*cdf0e10cSrcweir return bRet; 1301*cdf0e10cSrcweir } 1302*cdf0e10cSrcweir 1303*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1304*cdf0e10cSrcweir void OSelectionBrowseBox::PaintCell(OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId) const 1305*cdf0e10cSrcweir { 1306*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1307*cdf0e10cSrcweir rDev.SetClipRegion( rRect ); 1308*cdf0e10cSrcweir 1309*cdf0e10cSrcweir OTableFieldDescRef pEntry = NULL; 1310*cdf0e10cSrcweir sal_uInt16 nPos = GetColumnPos(nColumnId); 1311*cdf0e10cSrcweir if(getFields().size() > sal_uInt16(nPos - 1)) 1312*cdf0e10cSrcweir pEntry = getFields()[nPos - 1]; 1313*cdf0e10cSrcweir 1314*cdf0e10cSrcweir if (!pEntry.isValid()) 1315*cdf0e10cSrcweir return; 1316*cdf0e10cSrcweir 1317*cdf0e10cSrcweir long nRow = GetRealRow(m_nSeekRow); 1318*cdf0e10cSrcweir if (nRow == BROW_VIS_ROW) 1319*cdf0e10cSrcweir PaintTristate(rDev, rRect, pEntry->IsVisible() ? STATE_CHECK : STATE_NOCHECK); 1320*cdf0e10cSrcweir else 1321*cdf0e10cSrcweir rDev.DrawText(rRect, GetCellText(nRow, nColumnId),TEXT_DRAW_VCENTER); 1322*cdf0e10cSrcweir 1323*cdf0e10cSrcweir rDev.SetClipRegion( ); 1324*cdf0e10cSrcweir } 1325*cdf0e10cSrcweir 1326*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1327*cdf0e10cSrcweir void OSelectionBrowseBox::PaintStatusCell(OutputDevice& rDev, const Rectangle& rRect) const 1328*cdf0e10cSrcweir { 1329*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1330*cdf0e10cSrcweir Rectangle aRect(rRect); 1331*cdf0e10cSrcweir aRect.TopLeft().Y() -= 2; 1332*cdf0e10cSrcweir String aLabel(ModuleRes(STR_QUERY_HANDLETEXT)); 1333*cdf0e10cSrcweir 1334*cdf0e10cSrcweir // ab BROW_CRIT2_ROW werden alle Zeilen mit "oder" angegeben 1335*cdf0e10cSrcweir xub_StrLen nToken = (xub_StrLen) (m_nSeekRow >= GetBrowseRow(BROW_CRIT2_ROW)) 1336*cdf0e10cSrcweir ? 1337*cdf0e10cSrcweir xub_StrLen(BROW_CRIT2_ROW) : xub_StrLen(GetRealRow(m_nSeekRow)); 1338*cdf0e10cSrcweir rDev.DrawText(aRect, aLabel.GetToken(nToken),TEXT_DRAW_VCENTER); 1339*cdf0e10cSrcweir } 1340*cdf0e10cSrcweir 1341*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1342*cdf0e10cSrcweir void OSelectionBrowseBox::RemoveColumn(sal_uInt16 _nColumnId) 1343*cdf0e10cSrcweir { 1344*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1345*cdf0e10cSrcweir OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController()); 1346*cdf0e10cSrcweir 1347*cdf0e10cSrcweir sal_uInt16 nPos = GetColumnPos(_nColumnId); 1348*cdf0e10cSrcweir // das Control sollte immer genau eine Spalte mehr haben, naemlich die HandleColumn 1349*cdf0e10cSrcweir DBG_ASSERT((nPos == 0) || (nPos <= getFields().size()), "OSelectionBrowseBox::RemoveColumn : invalid parameter nColId"); 1350*cdf0e10cSrcweir // ColId ist bei mir gleichbedeutend mit Position, und da sollte die Bedingung natuerlich zutreffen 1351*cdf0e10cSrcweir 1352*cdf0e10cSrcweir sal_uInt16 nCurCol = GetCurColumnId(); 1353*cdf0e10cSrcweir long nCurrentRow = GetCurRow(); 1354*cdf0e10cSrcweir 1355*cdf0e10cSrcweir DeactivateCell(); 1356*cdf0e10cSrcweir 1357*cdf0e10cSrcweir getFields().erase( getFields().begin() + (nPos - 1) ); 1358*cdf0e10cSrcweir OTableFieldDescRef pEntry = new OTableFieldDesc(); 1359*cdf0e10cSrcweir pEntry->SetColumnId(_nColumnId); 1360*cdf0e10cSrcweir getFields().push_back(pEntry); 1361*cdf0e10cSrcweir 1362*cdf0e10cSrcweir EditBrowseBox::RemoveColumn( _nColumnId ); 1363*cdf0e10cSrcweir InsertDataColumn( _nColumnId , String(), DEFAULT_SIZE, HIB_STDSTYLE, HEADERBAR_APPEND); 1364*cdf0e10cSrcweir 1365*cdf0e10cSrcweir // Neuzeichnen 1366*cdf0e10cSrcweir Rectangle aInvalidRect = GetInvalidRect( _nColumnId ); 1367*cdf0e10cSrcweir Invalidate( aInvalidRect ); 1368*cdf0e10cSrcweir 1369*cdf0e10cSrcweir ActivateCell( nCurrentRow, nCurCol ); 1370*cdf0e10cSrcweir 1371*cdf0e10cSrcweir rController.setModified( sal_True ); 1372*cdf0e10cSrcweir 1373*cdf0e10cSrcweir invalidateUndoRedo(); 1374*cdf0e10cSrcweir } 1375*cdf0e10cSrcweir 1376*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1377*cdf0e10cSrcweir void OSelectionBrowseBox::RemoveField(sal_uInt16 nColumnId ) 1378*cdf0e10cSrcweir { 1379*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1380*cdf0e10cSrcweir OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController()); 1381*cdf0e10cSrcweir 1382*cdf0e10cSrcweir sal_uInt16 nPos = GetColumnPos(nColumnId); 1383*cdf0e10cSrcweir OSL_ENSURE(getFields().size() > sal_uInt16(nPos-1),"ID is to great!"); 1384*cdf0e10cSrcweir 1385*cdf0e10cSrcweir OTableFieldDescRef pDesc = getEntry((sal_uInt32)(nPos - 1)) ; 1386*cdf0e10cSrcweir pDesc->SetColWidth( (sal_uInt16)GetColumnWidth(nColumnId) ); // hat er sich vorher leider nicht gemerkt 1387*cdf0e10cSrcweir 1388*cdf0e10cSrcweir // UndoAction erzeugen 1389*cdf0e10cSrcweir if ( !m_bInUndoMode ) 1390*cdf0e10cSrcweir { 1391*cdf0e10cSrcweir OTabFieldDelUndoAct* pUndoAction = new OTabFieldDelUndoAct( this ); 1392*cdf0e10cSrcweir pUndoAction->SetTabFieldDescr(pDesc); 1393*cdf0e10cSrcweir pUndoAction->SetColumnPosition(nPos); 1394*cdf0e10cSrcweir rController.addUndoActionAndInvalidate( pUndoAction ); 1395*cdf0e10cSrcweir } 1396*cdf0e10cSrcweir 1397*cdf0e10cSrcweir RemoveColumn(nColumnId); 1398*cdf0e10cSrcweir 1399*cdf0e10cSrcweir invalidateUndoRedo(); 1400*cdf0e10cSrcweir } 1401*cdf0e10cSrcweir 1402*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1403*cdf0e10cSrcweir void OSelectionBrowseBox::adjustSelectionMode( sal_Bool _bClickedOntoHeader, sal_Bool _bClickedOntoHandleCol ) 1404*cdf0e10cSrcweir { 1405*cdf0e10cSrcweir // wenn ein Header selectiert wird, mu� die selection angezeigt werden, sonst nicht) 1406*cdf0e10cSrcweir if ( _bClickedOntoHeader ) 1407*cdf0e10cSrcweir { 1408*cdf0e10cSrcweir if (0 == GetSelectColumnCount() ) 1409*cdf0e10cSrcweir // wenn es schon eine selektierte Spalte gibt, bin ich schon im richtigen Modus 1410*cdf0e10cSrcweir if ( BROWSER_HIDESELECT == ( m_nMode & BROWSER_HIDESELECT ) ) 1411*cdf0e10cSrcweir { 1412*cdf0e10cSrcweir m_nMode &= ~BROWSER_HIDESELECT; 1413*cdf0e10cSrcweir m_nMode |= BROWSER_MULTISELECTION; 1414*cdf0e10cSrcweir SetMode( m_nMode ); 1415*cdf0e10cSrcweir } 1416*cdf0e10cSrcweir } 1417*cdf0e10cSrcweir else if ( BROWSER_HIDESELECT != ( m_nMode & BROWSER_HIDESELECT ) ) 1418*cdf0e10cSrcweir { 1419*cdf0e10cSrcweir if ( GetSelectColumnCount() != 0 ) 1420*cdf0e10cSrcweir SetNoSelection(); 1421*cdf0e10cSrcweir 1422*cdf0e10cSrcweir if ( _bClickedOntoHandleCol ) 1423*cdf0e10cSrcweir { 1424*cdf0e10cSrcweir m_nMode |= BROWSER_HIDESELECT; 1425*cdf0e10cSrcweir m_nMode &= ~BROWSER_MULTISELECTION; 1426*cdf0e10cSrcweir SetMode( m_nMode ); 1427*cdf0e10cSrcweir } 1428*cdf0e10cSrcweir } 1429*cdf0e10cSrcweir } 1430*cdf0e10cSrcweir 1431*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1432*cdf0e10cSrcweir void OSelectionBrowseBox::MouseButtonDown(const BrowserMouseEvent& rEvt) 1433*cdf0e10cSrcweir { 1434*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1435*cdf0e10cSrcweir if( rEvt.IsLeft() ) 1436*cdf0e10cSrcweir { 1437*cdf0e10cSrcweir sal_Bool bOnHandle = HANDLE_ID == rEvt.GetColumnId(); 1438*cdf0e10cSrcweir sal_Bool bOnHeader = ( rEvt.GetRow() < 0 ) && !bOnHandle; 1439*cdf0e10cSrcweir adjustSelectionMode( bOnHeader, bOnHandle ); 1440*cdf0e10cSrcweir } 1441*cdf0e10cSrcweir EditBrowseBox::MouseButtonDown(rEvt); 1442*cdf0e10cSrcweir } 1443*cdf0e10cSrcweir 1444*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1445*cdf0e10cSrcweir void OSelectionBrowseBox::MouseButtonUp(const BrowserMouseEvent& rEvt) 1446*cdf0e10cSrcweir { 1447*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1448*cdf0e10cSrcweir EditBrowseBox::MouseButtonUp( rEvt ); 1449*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( ID_BROWSER_QUERY_EXECUTE ); 1450*cdf0e10cSrcweir } 1451*cdf0e10cSrcweir 1452*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1453*cdf0e10cSrcweir void OSelectionBrowseBox::KeyInput( const KeyEvent& rEvt ) 1454*cdf0e10cSrcweir { 1455*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1456*cdf0e10cSrcweir if (IsColumnSelected(GetCurColumnId())) 1457*cdf0e10cSrcweir { 1458*cdf0e10cSrcweir if (rEvt.GetKeyCode().GetCode() == KEY_DELETE && // Delete rows 1459*cdf0e10cSrcweir !rEvt.GetKeyCode().IsShift() && 1460*cdf0e10cSrcweir !rEvt.GetKeyCode().IsMod1()) 1461*cdf0e10cSrcweir { 1462*cdf0e10cSrcweir RemoveField(GetCurColumnId()); 1463*cdf0e10cSrcweir return; 1464*cdf0e10cSrcweir } 1465*cdf0e10cSrcweir } 1466*cdf0e10cSrcweir EditBrowseBox::KeyInput(rEvt); 1467*cdf0e10cSrcweir } 1468*cdf0e10cSrcweir 1469*cdf0e10cSrcweir 1470*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1471*cdf0e10cSrcweir sal_Int8 OSelectionBrowseBox::AcceptDrop( const BrowserAcceptDropEvent& rEvt ) 1472*cdf0e10cSrcweir { 1473*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1474*cdf0e10cSrcweir sal_Int8 nDropAction = DND_ACTION_NONE; 1475*cdf0e10cSrcweir if ( rEvt.GetRow() >= -1 ) 1476*cdf0e10cSrcweir { 1477*cdf0e10cSrcweir if ( IsEditing() ) 1478*cdf0e10cSrcweir { 1479*cdf0e10cSrcweir // #100271# OJ allow the asterix again 1480*cdf0e10cSrcweir m_bDisableErrorBox = sal_True; 1481*cdf0e10cSrcweir SaveModified(); 1482*cdf0e10cSrcweir m_bDisableErrorBox = sal_False; 1483*cdf0e10cSrcweir DeactivateCell(); 1484*cdf0e10cSrcweir } 1485*cdf0e10cSrcweir // check if the format is already supported, if not deactivate the current cell and try again 1486*cdf0e10cSrcweir if ( OJoinExchObj::isFormatAvailable(GetDataFlavors()) ) 1487*cdf0e10cSrcweir nDropAction = DND_ACTION_LINK; 1488*cdf0e10cSrcweir } 1489*cdf0e10cSrcweir 1490*cdf0e10cSrcweir return nDropAction; 1491*cdf0e10cSrcweir } 1492*cdf0e10cSrcweir 1493*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1494*cdf0e10cSrcweir sal_Int8 OSelectionBrowseBox::ExecuteDrop( const BrowserExecuteDropEvent& _rEvt ) 1495*cdf0e10cSrcweir { 1496*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1497*cdf0e10cSrcweir 1498*cdf0e10cSrcweir TransferableDataHelper aDropped(_rEvt.maDropEvent.Transferable); 1499*cdf0e10cSrcweir if (!OJoinExchObj::isFormatAvailable(aDropped.GetDataFlavorExVector())) 1500*cdf0e10cSrcweir { 1501*cdf0e10cSrcweir DBG_ERROR("OSelectionBrowseBox::ExecuteDrop: this should never have passed AcceptDrop!"); 1502*cdf0e10cSrcweir return DND_ACTION_NONE; 1503*cdf0e10cSrcweir } 1504*cdf0e10cSrcweir 1505*cdf0e10cSrcweir OTableFieldDesc aInfo; 1506*cdf0e10cSrcweir // Einfuegen des Feldes an der gewuenschten Position 1507*cdf0e10cSrcweir OJoinExchangeData jxdSource = OJoinExchObj::GetSourceDescription(_rEvt.maDropEvent.Transferable); 1508*cdf0e10cSrcweir InsertField(jxdSource); 1509*cdf0e10cSrcweir 1510*cdf0e10cSrcweir return DND_ACTION_LINK; 1511*cdf0e10cSrcweir } 1512*cdf0e10cSrcweir 1513*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1514*cdf0e10cSrcweir OTableFieldDescRef OSelectionBrowseBox::AppendNewCol( sal_uInt16 nCnt) 1515*cdf0e10cSrcweir { 1516*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1517*cdf0e10cSrcweir // es koennen mehrere angelegt werden, aber der Erste 1518*cdf0e10cSrcweir // wird returnt 1519*cdf0e10cSrcweir sal_uInt32 nCount = getFields().size(); 1520*cdf0e10cSrcweir for (sal_uInt16 i=0 ; i<nCnt ; i++) 1521*cdf0e10cSrcweir { 1522*cdf0e10cSrcweir OTableFieldDescRef pEmptyEntry = new OTableFieldDesc(); 1523*cdf0e10cSrcweir getFields().push_back(pEmptyEntry); 1524*cdf0e10cSrcweir sal_uInt16 nColumnId = sal::static_int_cast< sal_uInt16 >(getFields().size()); 1525*cdf0e10cSrcweir pEmptyEntry->SetColumnId( nColumnId ); 1526*cdf0e10cSrcweir 1527*cdf0e10cSrcweir InsertDataColumn( nColumnId , String(), DEFAULT_SIZE, HIB_STDSTYLE, HEADERBAR_APPEND); 1528*cdf0e10cSrcweir } 1529*cdf0e10cSrcweir 1530*cdf0e10cSrcweir return getFields()[nCount]; 1531*cdf0e10cSrcweir } 1532*cdf0e10cSrcweir 1533*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1534*cdf0e10cSrcweir void OSelectionBrowseBox::DeleteFields(const String& rAliasName) 1535*cdf0e10cSrcweir { 1536*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1537*cdf0e10cSrcweir if (!getFields().empty()) 1538*cdf0e10cSrcweir { 1539*cdf0e10cSrcweir sal_uInt16 nColId = GetCurColumnId(); 1540*cdf0e10cSrcweir sal_uInt32 nRow = GetCurRow(); 1541*cdf0e10cSrcweir 1542*cdf0e10cSrcweir sal_Bool bWasEditing = IsEditing(); 1543*cdf0e10cSrcweir if (bWasEditing) 1544*cdf0e10cSrcweir DeactivateCell(); 1545*cdf0e10cSrcweir 1546*cdf0e10cSrcweir OTableFields::reverse_iterator aIter = getFields().rbegin(); 1547*cdf0e10cSrcweir OTableFieldDescRef pEntry = NULL; 1548*cdf0e10cSrcweir for(sal_uInt16 nPos=sal::static_int_cast< sal_uInt16 >(getFields().size());aIter != getFields().rend();++aIter,--nPos) 1549*cdf0e10cSrcweir { 1550*cdf0e10cSrcweir pEntry = *aIter; 1551*cdf0e10cSrcweir if ( pEntry->GetAlias().equals( rAliasName ) ) 1552*cdf0e10cSrcweir { 1553*cdf0e10cSrcweir RemoveField( GetColumnId( nPos ) ); 1554*cdf0e10cSrcweir break; 1555*cdf0e10cSrcweir } 1556*cdf0e10cSrcweir } 1557*cdf0e10cSrcweir 1558*cdf0e10cSrcweir if (bWasEditing) 1559*cdf0e10cSrcweir ActivateCell(nRow , nColId); 1560*cdf0e10cSrcweir } 1561*cdf0e10cSrcweir } 1562*cdf0e10cSrcweir 1563*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1564*cdf0e10cSrcweir void OSelectionBrowseBox::SetColWidth(sal_uInt16 nColId, long nNewWidth) 1565*cdf0e10cSrcweir { 1566*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1567*cdf0e10cSrcweir sal_Bool bWasEditing = IsEditing(); 1568*cdf0e10cSrcweir if (bWasEditing) 1569*cdf0e10cSrcweir DeactivateCell(); 1570*cdf0e10cSrcweir 1571*cdf0e10cSrcweir // die Basisklasse machen lassen 1572*cdf0e10cSrcweir SetColumnWidth(nColId, nNewWidth); 1573*cdf0e10cSrcweir 1574*cdf0e10cSrcweir // der FieldDescription Bescheid sagen 1575*cdf0e10cSrcweir OTableFieldDescRef pEntry = getEntry(GetColumnPos(nColId) - 1); 1576*cdf0e10cSrcweir if (pEntry.isValid()) 1577*cdf0e10cSrcweir pEntry->SetColWidth(sal_uInt16(GetColumnWidth(nColId))); 1578*cdf0e10cSrcweir 1579*cdf0e10cSrcweir if (bWasEditing) 1580*cdf0e10cSrcweir ActivateCell(GetCurRow(), GetCurColumnId()); 1581*cdf0e10cSrcweir } 1582*cdf0e10cSrcweir 1583*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1584*cdf0e10cSrcweir Rectangle OSelectionBrowseBox::GetInvalidRect( sal_uInt16 nColId ) 1585*cdf0e10cSrcweir { 1586*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1587*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 1588*cdf0e10cSrcweir // Rechteck ist erst einmal der gesamte Outputbereich des Fensters 1589*cdf0e10cSrcweir Rectangle aInvalidRect( Point(0,0), GetOutputSizePixel() ); 1590*cdf0e10cSrcweir 1591*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 1592*cdf0e10cSrcweir // Dann wird die linke Seite angepasst 1593*cdf0e10cSrcweir Rectangle aFieldRect(GetCellRect( 0, nColId )); // used instead of GetFieldRectPixel 1594*cdf0e10cSrcweir aInvalidRect.Left() = aFieldRect.Left(); 1595*cdf0e10cSrcweir 1596*cdf0e10cSrcweir return aInvalidRect; 1597*cdf0e10cSrcweir } 1598*cdf0e10cSrcweir 1599*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1600*cdf0e10cSrcweir void OSelectionBrowseBox::InsertColumn(OTableFieldDescRef pEntry, sal_uInt16& _nColumnPostion) 1601*cdf0e10cSrcweir { 1602*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1603*cdf0e10cSrcweir // das Control sollte immer genau eine Spalte mehr haben, naemlich die HandleColumn 1604*cdf0e10cSrcweir DBG_ASSERT(_nColumnPostion == BROWSER_INVALIDID || (_nColumnPostion <= (long)getFields().size()), "OSelectionBrowseBox::InsertColumn : invalid parameter nColId."); 1605*cdf0e10cSrcweir // -1 heisst ganz hinten, Count heisst ganz hinten, der Rest bezeichnet eine richtige Position 1606*cdf0e10cSrcweir 1607*cdf0e10cSrcweir sal_uInt16 nCurCol = GetCurColumnId(); 1608*cdf0e10cSrcweir long nCurrentRow = GetCurRow(); 1609*cdf0e10cSrcweir 1610*cdf0e10cSrcweir DeactivateCell(); 1611*cdf0e10cSrcweir 1612*cdf0e10cSrcweir // remember the column id of the current positon 1613*cdf0e10cSrcweir sal_uInt16 nColumnId = GetColumnId(_nColumnPostion); 1614*cdf0e10cSrcweir // Wenn zu klein oder zu gross, auf Ende der Liste setzen 1615*cdf0e10cSrcweir if ((_nColumnPostion == BROWSER_INVALIDID) || (_nColumnPostion >= getFields().size())) // Anhaengen des Feldes 1616*cdf0e10cSrcweir { 1617*cdf0e10cSrcweir if (FindFirstFreeCol(_nColumnPostion) == NULL) // keine freie Column mehr 1618*cdf0e10cSrcweir { 1619*cdf0e10cSrcweir AppendNewCol(1); 1620*cdf0e10cSrcweir _nColumnPostion = sal::static_int_cast< sal_uInt16 >( 1621*cdf0e10cSrcweir getFields().size()); 1622*cdf0e10cSrcweir } 1623*cdf0e10cSrcweir else 1624*cdf0e10cSrcweir ++_nColumnPostion; // innerhalb der vorgegebenen Liste 1625*cdf0e10cSrcweir nColumnId = GetColumnId(_nColumnPostion); 1626*cdf0e10cSrcweir pEntry->SetColumnId( nColumnId ); 1627*cdf0e10cSrcweir getFields()[ _nColumnPostion - 1] = pEntry; 1628*cdf0e10cSrcweir } 1629*cdf0e10cSrcweir 1630*cdf0e10cSrcweir // check if the column ids are identical, if not we have to move 1631*cdf0e10cSrcweir if ( pEntry->GetColumnId() != nColumnId ) 1632*cdf0e10cSrcweir { 1633*cdf0e10cSrcweir sal_uInt16 nOldPosition = GetColumnPos(pEntry->GetColumnId()); 1634*cdf0e10cSrcweir OSL_ENSURE( nOldPosition != 0,"Old position was 0. Not possible!"); 1635*cdf0e10cSrcweir SetColumnPos(pEntry->GetColumnId(),_nColumnPostion); 1636*cdf0e10cSrcweir // we have to delete an empty field for the fields list, because the columns must have equal length 1637*cdf0e10cSrcweir if ( nOldPosition > 0 && nOldPosition <= getFields().size() ) 1638*cdf0e10cSrcweir getFields()[nOldPosition - 1] = pEntry; 1639*cdf0e10cSrcweir 1640*cdf0e10cSrcweir ColumnMoved(pEntry->GetColumnId(),sal_False); 1641*cdf0e10cSrcweir } // if ( pEntry->GetColumnId() != nColumnId ) 1642*cdf0e10cSrcweir 1643*cdf0e10cSrcweir if ( pEntry->GetFunctionType() & (FKT_AGGREGATE) ) 1644*cdf0e10cSrcweir { 1645*cdf0e10cSrcweir String sFunctionName = pEntry->GetFunction(); 1646*cdf0e10cSrcweir if ( GetFunctionName(sal_uInt32(-1),sFunctionName) ) 1647*cdf0e10cSrcweir pEntry->SetFunction(sFunctionName); 1648*cdf0e10cSrcweir } 1649*cdf0e10cSrcweir 1650*cdf0e10cSrcweir nColumnId = pEntry->GetColumnId(); 1651*cdf0e10cSrcweir 1652*cdf0e10cSrcweir SetColWidth(nColumnId,getDesignView()->getColWidth(GetColumnPos(nColumnId)-1)); 1653*cdf0e10cSrcweir // Neuzeichnen 1654*cdf0e10cSrcweir Rectangle aInvalidRect = GetInvalidRect( nColumnId ); 1655*cdf0e10cSrcweir Invalidate( aInvalidRect ); 1656*cdf0e10cSrcweir 1657*cdf0e10cSrcweir ActivateCell( nCurrentRow, nCurCol ); 1658*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True ); 1659*cdf0e10cSrcweir 1660*cdf0e10cSrcweir invalidateUndoRedo(); 1661*cdf0e10cSrcweir } 1662*cdf0e10cSrcweir 1663*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1664*cdf0e10cSrcweir OTableFieldDescRef OSelectionBrowseBox::InsertField(const OJoinExchangeData& jxdSource, sal_uInt16 _nColumnPostion, sal_Bool bVis, sal_Bool bActivate) 1665*cdf0e10cSrcweir { 1666*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1667*cdf0e10cSrcweir OQueryTableWindow* pSourceWin = static_cast<OQueryTableWindow*>(jxdSource.pListBox->GetTabWin()); 1668*cdf0e10cSrcweir if (!pSourceWin) 1669*cdf0e10cSrcweir return NULL; 1670*cdf0e10cSrcweir 1671*cdf0e10cSrcweir // Namen/Position des selektierten Feldes 1672*cdf0e10cSrcweir String aFieldName = jxdSource.pListBox->GetEntryText(jxdSource.pEntry); 1673*cdf0e10cSrcweir sal_uInt32 nFieldIndex = jxdSource.pListBox->GetModel()->GetAbsPos(jxdSource.pEntry); 1674*cdf0e10cSrcweir OTableFieldInfo* pInf = static_cast<OTableFieldInfo*>(jxdSource.pEntry->GetUserData()); 1675*cdf0e10cSrcweir 1676*cdf0e10cSrcweir // eine DragInfo aufbauen, damit ich mich auf das andere InsertField zurueckziehen kann 1677*cdf0e10cSrcweir OTableFieldDescRef aInfo = new OTableFieldDesc(pSourceWin->GetTableName(),aFieldName); 1678*cdf0e10cSrcweir aInfo->SetTabWindow(pSourceWin); 1679*cdf0e10cSrcweir aInfo->SetFieldIndex(nFieldIndex); 1680*cdf0e10cSrcweir aInfo->SetFieldType(pInf->GetKeyType()); 1681*cdf0e10cSrcweir aInfo->SetAlias(pSourceWin->GetAliasName()); 1682*cdf0e10cSrcweir 1683*cdf0e10cSrcweir aInfo->SetDataType(pInf->GetDataType()); 1684*cdf0e10cSrcweir aInfo->SetVisible(bVis); 1685*cdf0e10cSrcweir 1686*cdf0e10cSrcweir return InsertField(aInfo, _nColumnPostion, bVis, bActivate); 1687*cdf0e10cSrcweir } 1688*cdf0e10cSrcweir 1689*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1690*cdf0e10cSrcweir OTableFieldDescRef OSelectionBrowseBox::InsertField(const OTableFieldDescRef& _rInfo, sal_uInt16 _nColumnPostion, sal_Bool bVis, sal_Bool bActivate) 1691*cdf0e10cSrcweir { 1692*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1693*cdf0e10cSrcweir 1694*cdf0e10cSrcweir if(m_nMaxColumns && m_nMaxColumns <= FieldsCount()) 1695*cdf0e10cSrcweir return NULL; 1696*cdf0e10cSrcweir if (bActivate) 1697*cdf0e10cSrcweir SaveModified(); 1698*cdf0e10cSrcweir 1699*cdf0e10cSrcweir // Neue Spaltenbeschreibung 1700*cdf0e10cSrcweir OTableFieldDescRef pEntry = _rInfo; 1701*cdf0e10cSrcweir pEntry->SetVisible(bVis); 1702*cdf0e10cSrcweir 1703*cdf0e10cSrcweir // Spalte einfuegen 1704*cdf0e10cSrcweir InsertColumn( pEntry, _nColumnPostion ); 1705*cdf0e10cSrcweir 1706*cdf0e10cSrcweir if ( !m_bInUndoMode ) 1707*cdf0e10cSrcweir { 1708*cdf0e10cSrcweir // UndoAction erzeugen 1709*cdf0e10cSrcweir OTabFieldCreateUndoAct* pUndoAction = new OTabFieldCreateUndoAct( this ); 1710*cdf0e10cSrcweir pUndoAction->SetTabFieldDescr( pEntry ); 1711*cdf0e10cSrcweir pUndoAction->SetColumnPosition(_nColumnPostion); 1712*cdf0e10cSrcweir getDesignView()->getController().addUndoActionAndInvalidate( pUndoAction ); 1713*cdf0e10cSrcweir } 1714*cdf0e10cSrcweir 1715*cdf0e10cSrcweir return pEntry; 1716*cdf0e10cSrcweir } 1717*cdf0e10cSrcweir 1718*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1719*cdf0e10cSrcweir sal_uInt16 OSelectionBrowseBox::FieldsCount() 1720*cdf0e10cSrcweir { 1721*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1722*cdf0e10cSrcweir OTableFields::iterator aIter = getFields().begin(); 1723*cdf0e10cSrcweir sal_uInt16 nCount = 0; 1724*cdf0e10cSrcweir 1725*cdf0e10cSrcweir while (aIter != getFields().end()) 1726*cdf0e10cSrcweir { 1727*cdf0e10cSrcweir if ((*aIter).isValid() && !(*aIter)->IsEmpty()) 1728*cdf0e10cSrcweir ++nCount; 1729*cdf0e10cSrcweir ++aIter; 1730*cdf0e10cSrcweir } 1731*cdf0e10cSrcweir 1732*cdf0e10cSrcweir return nCount; 1733*cdf0e10cSrcweir } 1734*cdf0e10cSrcweir 1735*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1736*cdf0e10cSrcweir OTableFieldDescRef OSelectionBrowseBox::FindFirstFreeCol(sal_uInt16& _rColumnPosition ) 1737*cdf0e10cSrcweir { 1738*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1739*cdf0e10cSrcweir OTableFields::iterator aIter = getFields().begin(); 1740*cdf0e10cSrcweir OTableFields::iterator aEnd = getFields().end(); 1741*cdf0e10cSrcweir 1742*cdf0e10cSrcweir _rColumnPosition = BROWSER_INVALIDID; 1743*cdf0e10cSrcweir 1744*cdf0e10cSrcweir while ( aIter != aEnd ) 1745*cdf0e10cSrcweir { 1746*cdf0e10cSrcweir ++_rColumnPosition; 1747*cdf0e10cSrcweir OTableFieldDescRef pEntry = (*aIter); 1748*cdf0e10cSrcweir if ( pEntry.isValid() && pEntry->IsEmpty() ) 1749*cdf0e10cSrcweir return pEntry; 1750*cdf0e10cSrcweir ++aIter; 1751*cdf0e10cSrcweir } 1752*cdf0e10cSrcweir 1753*cdf0e10cSrcweir return NULL; 1754*cdf0e10cSrcweir } 1755*cdf0e10cSrcweir 1756*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1757*cdf0e10cSrcweir void OSelectionBrowseBox::CheckFreeColumns(sal_uInt16& _rColumnPosition) 1758*cdf0e10cSrcweir { 1759*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1760*cdf0e10cSrcweir if (FindFirstFreeCol(_rColumnPosition) == NULL) 1761*cdf0e10cSrcweir { 1762*cdf0e10cSrcweir // es ist voll, also einen Packen Spalten anhaengen 1763*cdf0e10cSrcweir AppendNewCol(DEFAULT_QUERY_COLS); 1764*cdf0e10cSrcweir OSL_VERIFY(FindFirstFreeCol(_rColumnPosition).isValid()); 1765*cdf0e10cSrcweir } 1766*cdf0e10cSrcweir } 1767*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1768*cdf0e10cSrcweir void OSelectionBrowseBox::AddGroupBy( const OTableFieldDescRef& rInfo , sal_uInt32 /*_nCurrentPos*/) 1769*cdf0e10cSrcweir { 1770*cdf0e10cSrcweir Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection(); 1771*cdf0e10cSrcweir if(!xConnection.is()) 1772*cdf0e10cSrcweir return; 1773*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1774*cdf0e10cSrcweir DBG_ASSERT(!rInfo->IsEmpty(),"AddGroupBy:: OTableFieldDescRef sollte nicht Empty sein!"); 1775*cdf0e10cSrcweir OTableFieldDescRef pEntry; 1776*cdf0e10cSrcweir const Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData(); 1777*cdf0e10cSrcweir const ::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers()); 1778*cdf0e10cSrcweir //sal_Bool bAppend = sal_False; 1779*cdf0e10cSrcweir 1780*cdf0e10cSrcweir OTableFields& rFields = getFields(); 1781*cdf0e10cSrcweir OTableFields::iterator aIter = rFields.begin(); 1782*cdf0e10cSrcweir OTableFields::iterator aEnd = rFields.end(); 1783*cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1784*cdf0e10cSrcweir { 1785*cdf0e10cSrcweir pEntry = *aIter; 1786*cdf0e10cSrcweir OSL_ENSURE(pEntry.isValid(),"OTableFieldDescRef was null!"); 1787*cdf0e10cSrcweir 1788*cdf0e10cSrcweir const ::rtl::OUString aField = pEntry->GetField(); 1789*cdf0e10cSrcweir const ::rtl::OUString aAlias = pEntry->GetAlias(); 1790*cdf0e10cSrcweir 1791*cdf0e10cSrcweir if (bCase(aField,rInfo->GetField()) && 1792*cdf0e10cSrcweir bCase(aAlias,rInfo->GetAlias()) && 1793*cdf0e10cSrcweir pEntry->GetFunctionType() == rInfo->GetFunctionType() && 1794*cdf0e10cSrcweir pEntry->GetFunction() == rInfo->GetFunction()) 1795*cdf0e10cSrcweir { 1796*cdf0e10cSrcweir if ( pEntry->isNumericOrAggreateFunction() && rInfo->IsGroupBy() ) 1797*cdf0e10cSrcweir { 1798*cdf0e10cSrcweir pEntry->SetGroupBy(sal_False); 1799*cdf0e10cSrcweir aIter = rFields.end(); 1800*cdf0e10cSrcweir break; 1801*cdf0e10cSrcweir } 1802*cdf0e10cSrcweir else 1803*cdf0e10cSrcweir { 1804*cdf0e10cSrcweir if ( !pEntry->IsGroupBy() && !pEntry->HasCriteria() ) // here we have a where condition which is no having clause 1805*cdf0e10cSrcweir { 1806*cdf0e10cSrcweir pEntry->SetGroupBy(rInfo->IsGroupBy()); 1807*cdf0e10cSrcweir if(!m_bGroupByUnRelated && pEntry->IsGroupBy()) 1808*cdf0e10cSrcweir pEntry->SetVisible(sal_True); 1809*cdf0e10cSrcweir break; 1810*cdf0e10cSrcweir } 1811*cdf0e10cSrcweir } 1812*cdf0e10cSrcweir 1813*cdf0e10cSrcweir } 1814*cdf0e10cSrcweir } 1815*cdf0e10cSrcweir 1816*cdf0e10cSrcweir if (aIter == rFields.end()) 1817*cdf0e10cSrcweir { 1818*cdf0e10cSrcweir OTableFieldDescRef pTmp = InsertField(rInfo, BROWSER_INVALIDID, sal_False, sal_False ); 1819*cdf0e10cSrcweir if ( (pTmp->isNumericOrAggreateFunction() && rInfo->IsGroupBy()) ) // das GroupBy wird bereits von rInfo "ubernommen 1820*cdf0e10cSrcweir pTmp->SetGroupBy(sal_False); 1821*cdf0e10cSrcweir } 1822*cdf0e10cSrcweir } 1823*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1824*cdf0e10cSrcweir void OSelectionBrowseBox::DuplicateConditionLevel( const sal_uInt16 nLevel) 1825*cdf0e10cSrcweir { 1826*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1827*cdf0e10cSrcweir const sal_uInt16 nNewLevel = nLevel +1; 1828*cdf0e10cSrcweir OTableFields& rFields = getFields(); 1829*cdf0e10cSrcweir OTableFields::iterator aIter = rFields.begin(); 1830*cdf0e10cSrcweir OTableFields::iterator aEnd = rFields.end(); 1831*cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1832*cdf0e10cSrcweir { 1833*cdf0e10cSrcweir OTableFieldDescRef pEntry = *aIter; 1834*cdf0e10cSrcweir 1835*cdf0e10cSrcweir ::rtl::OUString sValue = pEntry->GetCriteria(nLevel); 1836*cdf0e10cSrcweir if ( sValue.getLength() ) 1837*cdf0e10cSrcweir { 1838*cdf0e10cSrcweir pEntry->SetCriteria( nNewLevel, sValue); 1839*cdf0e10cSrcweir if ( nNewLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1) ) 1840*cdf0e10cSrcweir { 1841*cdf0e10cSrcweir RowInserted( GetRowCount()-1, 1, sal_True ); 1842*cdf0e10cSrcweir m_bVisibleRow.push_back(sal_True); 1843*cdf0e10cSrcweir ++m_nVisibleCount; 1844*cdf0e10cSrcweir } 1845*cdf0e10cSrcweir m_bVisibleRow[BROW_CRIT1_ROW + nNewLevel] = sal_True; 1846*cdf0e10cSrcweir } // if (!pEntry->GetCriteria(nLevel).getLength() ) 1847*cdf0e10cSrcweir } // for(;aIter != getFields().end();++aIter) 1848*cdf0e10cSrcweir } 1849*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1850*cdf0e10cSrcweir void OSelectionBrowseBox::AddCondition( const OTableFieldDescRef& rInfo, const String& rValue, const sal_uInt16 nLevel,bool _bAddOrOnOneLine ) 1851*cdf0e10cSrcweir { 1852*cdf0e10cSrcweir Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection(); 1853*cdf0e10cSrcweir if(!xConnection.is()) 1854*cdf0e10cSrcweir return; 1855*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1856*cdf0e10cSrcweir DBG_ASSERT(rInfo.isValid() && !rInfo->IsEmpty(),"AddCondition:: OTableFieldDescRef sollte nicht Empty sein!"); 1857*cdf0e10cSrcweir 1858*cdf0e10cSrcweir OTableFieldDescRef pLastEntry; 1859*cdf0e10cSrcweir Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData(); 1860*cdf0e10cSrcweir ::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers()); 1861*cdf0e10cSrcweir 1862*cdf0e10cSrcweir OTableFields& rFields = getFields(); 1863*cdf0e10cSrcweir OTableFields::iterator aIter = rFields.begin(); 1864*cdf0e10cSrcweir OTableFields::iterator aEnd = rFields.end(); 1865*cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1866*cdf0e10cSrcweir { 1867*cdf0e10cSrcweir OTableFieldDescRef pEntry = *aIter; 1868*cdf0e10cSrcweir const ::rtl::OUString aField = pEntry->GetField(); 1869*cdf0e10cSrcweir const ::rtl::OUString aAlias = pEntry->GetAlias(); 1870*cdf0e10cSrcweir 1871*cdf0e10cSrcweir if (bCase(aField,rInfo->GetField()) && 1872*cdf0e10cSrcweir bCase(aAlias,rInfo->GetAlias()) && 1873*cdf0e10cSrcweir pEntry->GetFunctionType() == rInfo->GetFunctionType() && 1874*cdf0e10cSrcweir pEntry->GetFunction() == rInfo->GetFunction() && 1875*cdf0e10cSrcweir pEntry->IsGroupBy() == rInfo->IsGroupBy() ) 1876*cdf0e10cSrcweir { 1877*cdf0e10cSrcweir if ( pEntry->isNumericOrAggreateFunction() && rInfo->IsGroupBy() ) 1878*cdf0e10cSrcweir pEntry->SetGroupBy(sal_False); 1879*cdf0e10cSrcweir else 1880*cdf0e10cSrcweir { 1881*cdf0e10cSrcweir // pEntry->SetGroupBy(rInfo->IsGroupBy()); 1882*cdf0e10cSrcweir if(!m_bGroupByUnRelated && pEntry->IsGroupBy()) 1883*cdf0e10cSrcweir pEntry->SetVisible(sal_True); 1884*cdf0e10cSrcweir } 1885*cdf0e10cSrcweir if (!pEntry->GetCriteria(nLevel).getLength() ) 1886*cdf0e10cSrcweir { 1887*cdf0e10cSrcweir pEntry->SetCriteria( nLevel, rValue); 1888*cdf0e10cSrcweir if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1)) 1889*cdf0e10cSrcweir { 1890*cdf0e10cSrcweir RowInserted( GetRowCount()-1, 1, sal_True ); 1891*cdf0e10cSrcweir m_bVisibleRow.push_back(sal_True); 1892*cdf0e10cSrcweir ++m_nVisibleCount; 1893*cdf0e10cSrcweir } 1894*cdf0e10cSrcweir m_bVisibleRow[BROW_CRIT1_ROW + nLevel] = sal_True; 1895*cdf0e10cSrcweir break; 1896*cdf0e10cSrcweir } // if (!pEntry->GetCriteria(nLevel).getLength() ) 1897*cdf0e10cSrcweir if ( _bAddOrOnOneLine ) 1898*cdf0e10cSrcweir { 1899*cdf0e10cSrcweir pLastEntry = pEntry; 1900*cdf0e10cSrcweir } 1901*cdf0e10cSrcweir } 1902*cdf0e10cSrcweir } // for(;aIter != getFields().end();++aIter) 1903*cdf0e10cSrcweir if ( pLastEntry.isValid() ) 1904*cdf0e10cSrcweir { 1905*cdf0e10cSrcweir String sCriteria = rValue; 1906*cdf0e10cSrcweir String sOldCriteria = pLastEntry->GetCriteria( nLevel ); 1907*cdf0e10cSrcweir if ( sOldCriteria.Len() ) 1908*cdf0e10cSrcweir { 1909*cdf0e10cSrcweir sCriteria = String(RTL_CONSTASCII_USTRINGPARAM("( ")); 1910*cdf0e10cSrcweir sCriteria += sOldCriteria; 1911*cdf0e10cSrcweir sCriteria += String(RTL_CONSTASCII_USTRINGPARAM(" OR ")); 1912*cdf0e10cSrcweir sCriteria += rValue; 1913*cdf0e10cSrcweir sCriteria += String(RTL_CONSTASCII_USTRINGPARAM(" )")); 1914*cdf0e10cSrcweir } 1915*cdf0e10cSrcweir pLastEntry->SetCriteria( nLevel, sCriteria); 1916*cdf0e10cSrcweir if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1)) 1917*cdf0e10cSrcweir { 1918*cdf0e10cSrcweir RowInserted( GetRowCount()-1, 1, sal_True ); 1919*cdf0e10cSrcweir m_bVisibleRow.push_back(sal_True); 1920*cdf0e10cSrcweir ++m_nVisibleCount; 1921*cdf0e10cSrcweir } 1922*cdf0e10cSrcweir m_bVisibleRow[BROW_CRIT1_ROW + nLevel] = sal_True; 1923*cdf0e10cSrcweir } 1924*cdf0e10cSrcweir 1925*cdf0e10cSrcweir else if (aIter == getFields().end()) 1926*cdf0e10cSrcweir { 1927*cdf0e10cSrcweir OTableFieldDescRef pTmp = InsertField(rInfo, BROWSER_INVALIDID, sal_False, sal_False ); 1928*cdf0e10cSrcweir if ( pTmp->isNumericOrAggreateFunction() && rInfo->IsGroupBy() ) // das GroupBy wird bereits von rInfo "ubernommen 1929*cdf0e10cSrcweir pTmp->SetGroupBy(sal_False); 1930*cdf0e10cSrcweir if ( pTmp.isValid() ) 1931*cdf0e10cSrcweir { 1932*cdf0e10cSrcweir pTmp->SetCriteria( nLevel, rValue); 1933*cdf0e10cSrcweir if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1)) 1934*cdf0e10cSrcweir { 1935*cdf0e10cSrcweir RowInserted( GetRowCount()-1, 1, sal_True ); 1936*cdf0e10cSrcweir m_bVisibleRow.push_back(sal_True); 1937*cdf0e10cSrcweir ++m_nVisibleCount; 1938*cdf0e10cSrcweir } 1939*cdf0e10cSrcweir } 1940*cdf0e10cSrcweir } 1941*cdf0e10cSrcweir } 1942*cdf0e10cSrcweir 1943*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1944*cdf0e10cSrcweir void OSelectionBrowseBox::AddOrder( const OTableFieldDescRef& rInfo, const EOrderDir eDir, sal_uInt32 _nCurrentPos) 1945*cdf0e10cSrcweir { 1946*cdf0e10cSrcweir Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection(); 1947*cdf0e10cSrcweir if(!xConnection.is()) 1948*cdf0e10cSrcweir return; 1949*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1950*cdf0e10cSrcweir DBG_ASSERT(!rInfo->IsEmpty(),"AddOrder:: OTableFieldDescRef sollte nicht Empty sein!"); 1951*cdf0e10cSrcweir OTableFieldDescRef pEntry; 1952*cdf0e10cSrcweir Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData(); 1953*cdf0e10cSrcweir ::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers()); 1954*cdf0e10cSrcweir 1955*cdf0e10cSrcweir sal_Bool bAppend = sal_False; 1956*cdf0e10cSrcweir OTableFields& rFields = getFields(); 1957*cdf0e10cSrcweir OTableFields::iterator aIter = rFields.begin(); 1958*cdf0e10cSrcweir OTableFields::iterator aEnd = rFields.end(); 1959*cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 1960*cdf0e10cSrcweir { 1961*cdf0e10cSrcweir pEntry = *aIter; 1962*cdf0e10cSrcweir ::rtl::OUString aField = pEntry->GetField(); 1963*cdf0e10cSrcweir ::rtl::OUString aAlias = pEntry->GetAlias(); 1964*cdf0e10cSrcweir 1965*cdf0e10cSrcweir if (bCase(aField,rInfo->GetField()) && 1966*cdf0e10cSrcweir bCase(aAlias,rInfo->GetAlias())) 1967*cdf0e10cSrcweir { 1968*cdf0e10cSrcweir sal_uInt32 nPos = aIter - rFields.begin(); 1969*cdf0e10cSrcweir bAppend = _nCurrentPos > nPos; 1970*cdf0e10cSrcweir if ( bAppend ) 1971*cdf0e10cSrcweir aIter = rFields.end(); 1972*cdf0e10cSrcweir else 1973*cdf0e10cSrcweir { 1974*cdf0e10cSrcweir if ( !m_bOrderByUnRelated ) 1975*cdf0e10cSrcweir pEntry->SetVisible(sal_True); 1976*cdf0e10cSrcweir pEntry->SetOrderDir( eDir ); 1977*cdf0e10cSrcweir } 1978*cdf0e10cSrcweir break; 1979*cdf0e10cSrcweir } 1980*cdf0e10cSrcweir } 1981*cdf0e10cSrcweir 1982*cdf0e10cSrcweir if (aIter == rFields.end()) 1983*cdf0e10cSrcweir { 1984*cdf0e10cSrcweir OTableFieldDescRef pTmp = InsertField(rInfo, BROWSER_INVALIDID, sal_False, sal_False ); 1985*cdf0e10cSrcweir if(pTmp.isValid()) 1986*cdf0e10cSrcweir { 1987*cdf0e10cSrcweir if ( !m_bOrderByUnRelated && !bAppend ) 1988*cdf0e10cSrcweir pTmp->SetVisible(sal_True); 1989*cdf0e10cSrcweir pTmp->SetOrderDir( eDir ); 1990*cdf0e10cSrcweir } 1991*cdf0e10cSrcweir } 1992*cdf0e10cSrcweir } 1993*cdf0e10cSrcweir 1994*cdf0e10cSrcweir //------------------------------------------------------------------------------ 1995*cdf0e10cSrcweir void OSelectionBrowseBox::ArrangeControls(sal_uInt16& nX, sal_uInt16 nY) 1996*cdf0e10cSrcweir { 1997*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 1998*cdf0e10cSrcweir EditBrowseBox::ArrangeControls(nX, nY); 1999*cdf0e10cSrcweir } 2000*cdf0e10cSrcweir 2001*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2002*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::Save() 2003*cdf0e10cSrcweir { 2004*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2005*cdf0e10cSrcweir sal_Bool bRet = sal_True; 2006*cdf0e10cSrcweir if (IsModified()) 2007*cdf0e10cSrcweir bRet = SaveModified(); 2008*cdf0e10cSrcweir return bRet; 2009*cdf0e10cSrcweir } 2010*cdf0e10cSrcweir 2011*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2012*cdf0e10cSrcweir void OSelectionBrowseBox::CellModified() 2013*cdf0e10cSrcweir { 2014*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2015*cdf0e10cSrcweir long nRow = GetRealRow(GetCurRow()); 2016*cdf0e10cSrcweir switch (nRow) 2017*cdf0e10cSrcweir { 2018*cdf0e10cSrcweir case BROW_VIS_ROW: 2019*cdf0e10cSrcweir { 2020*cdf0e10cSrcweir OTableFieldDescRef pEntry = getEntry(GetColumnPos(GetCurColumnId()) - 1); 2021*cdf0e10cSrcweir 2022*cdf0e10cSrcweir sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos(); 2023*cdf0e10cSrcweir if(!m_bOrderByUnRelated && nIdx > 0 && 2024*cdf0e10cSrcweir nIdx != sal_uInt16(-1) && 2025*cdf0e10cSrcweir !pEntry->IsEmpty() && 2026*cdf0e10cSrcweir pEntry->GetOrderDir() != ORDER_NONE) 2027*cdf0e10cSrcweir { 2028*cdf0e10cSrcweir m_pVisibleCell->GetBox().Check(); 2029*cdf0e10cSrcweir pEntry->SetVisible(sal_True); 2030*cdf0e10cSrcweir } 2031*cdf0e10cSrcweir else 2032*cdf0e10cSrcweir pEntry->SetVisible(m_pVisibleCell->GetBox().IsChecked()); 2033*cdf0e10cSrcweir } 2034*cdf0e10cSrcweir break; 2035*cdf0e10cSrcweir } 2036*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True ); 2037*cdf0e10cSrcweir } 2038*cdf0e10cSrcweir 2039*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2040*cdf0e10cSrcweir void OSelectionBrowseBox::Fill() 2041*cdf0e10cSrcweir { 2042*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2043*cdf0e10cSrcweir DBG_ASSERT(ColCount() >= 1, "OSelectionBrowseBox::Fill : please call only after inserting the handle column !"); 2044*cdf0e10cSrcweir 2045*cdf0e10cSrcweir sal_uInt16 nColCount = ColCount() - 1; 2046*cdf0e10cSrcweir if (nColCount < DEFAULT_QUERY_COLS) 2047*cdf0e10cSrcweir AppendNewCol(DEFAULT_QUERY_COLS - nColCount); 2048*cdf0e10cSrcweir } 2049*cdf0e10cSrcweir 2050*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2051*cdf0e10cSrcweir Size OSelectionBrowseBox::CalcOptimalSize( const Size& _rAvailable ) 2052*cdf0e10cSrcweir { 2053*cdf0e10cSrcweir Size aReturn( _rAvailable.Width(), GetTitleHeight() ); 2054*cdf0e10cSrcweir 2055*cdf0e10cSrcweir aReturn.Height() += ( m_nVisibleCount ? m_nVisibleCount : 15 ) * GetDataRowHeight(); 2056*cdf0e10cSrcweir aReturn.Height() += 40; // just some space 2057*cdf0e10cSrcweir 2058*cdf0e10cSrcweir return aReturn; 2059*cdf0e10cSrcweir } 2060*cdf0e10cSrcweir 2061*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2062*cdf0e10cSrcweir void OSelectionBrowseBox::Command(const CommandEvent& rEvt) 2063*cdf0e10cSrcweir { 2064*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2065*cdf0e10cSrcweir switch (rEvt.GetCommand()) 2066*cdf0e10cSrcweir { 2067*cdf0e10cSrcweir case COMMAND_CONTEXTMENU: 2068*cdf0e10cSrcweir { 2069*cdf0e10cSrcweir Point aMenuPos( rEvt.GetMousePosPixel() ); 2070*cdf0e10cSrcweir 2071*cdf0e10cSrcweir if (!rEvt.IsMouseEvent()) 2072*cdf0e10cSrcweir { 2073*cdf0e10cSrcweir if ( 1 == GetSelectColumnCount() ) 2074*cdf0e10cSrcweir { 2075*cdf0e10cSrcweir sal_uInt16 nSelId = GetColumnId( 2076*cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 2077*cdf0e10cSrcweir FirstSelectedColumn() ) ); 2078*cdf0e10cSrcweir ::Rectangle aColRect( GetFieldRectPixel( 0, nSelId, sal_False ) ); 2079*cdf0e10cSrcweir 2080*cdf0e10cSrcweir aMenuPos = aColRect.TopCenter(); 2081*cdf0e10cSrcweir } 2082*cdf0e10cSrcweir else 2083*cdf0e10cSrcweir { 2084*cdf0e10cSrcweir EditBrowseBox::Command(rEvt); 2085*cdf0e10cSrcweir return; 2086*cdf0e10cSrcweir } 2087*cdf0e10cSrcweir } 2088*cdf0e10cSrcweir 2089*cdf0e10cSrcweir sal_uInt16 nColId = GetColumnId(GetColumnAtXPosPixel( aMenuPos.X() )); 2090*cdf0e10cSrcweir long nRow = GetRowAtYPosPixel( aMenuPos.Y() ); 2091*cdf0e10cSrcweir 2092*cdf0e10cSrcweir if (nRow < 0 && nColId > HANDLE_ID ) 2093*cdf0e10cSrcweir { 2094*cdf0e10cSrcweir if ( !IsColumnSelected( nColId ) ) 2095*cdf0e10cSrcweir { 2096*cdf0e10cSrcweir adjustSelectionMode( sal_True /* clicked onto a header */ , sal_False /* not onto the handle col */ ); 2097*cdf0e10cSrcweir SelectColumnId( nColId ); 2098*cdf0e10cSrcweir } 2099*cdf0e10cSrcweir 2100*cdf0e10cSrcweir if (!static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly()) 2101*cdf0e10cSrcweir { 2102*cdf0e10cSrcweir PopupMenu aContextMenu( ModuleRes( RID_QUERYCOLPOPUPMENU ) ); 2103*cdf0e10cSrcweir switch (aContextMenu.Execute(this, aMenuPos)) 2104*cdf0e10cSrcweir { 2105*cdf0e10cSrcweir case SID_DELETE: 2106*cdf0e10cSrcweir RemoveField(nColId); 2107*cdf0e10cSrcweir break; 2108*cdf0e10cSrcweir 2109*cdf0e10cSrcweir case ID_BROWSER_COLWIDTH: 2110*cdf0e10cSrcweir adjustBrowseBoxColumnWidth( this, nColId ); 2111*cdf0e10cSrcweir break; 2112*cdf0e10cSrcweir } 2113*cdf0e10cSrcweir } 2114*cdf0e10cSrcweir } 2115*cdf0e10cSrcweir else if(nRow >= 0 && nColId <= HANDLE_ID) 2116*cdf0e10cSrcweir { 2117*cdf0e10cSrcweir if (!static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly()) 2118*cdf0e10cSrcweir { 2119*cdf0e10cSrcweir PopupMenu aContextMenu(ModuleRes(RID_QUERYFUNCTION_POPUPMENU)); 2120*cdf0e10cSrcweir aContextMenu.CheckItem( ID_QUERY_FUNCTION, m_bVisibleRow[BROW_FUNCTION_ROW]); 2121*cdf0e10cSrcweir aContextMenu.CheckItem( ID_QUERY_TABLENAME, m_bVisibleRow[BROW_TABLE_ROW]); 2122*cdf0e10cSrcweir aContextMenu.CheckItem( ID_QUERY_ALIASNAME, m_bVisibleRow[BROW_COLUMNALIAS_ROW]); 2123*cdf0e10cSrcweir aContextMenu.CheckItem( ID_QUERY_DISTINCT, static_cast<OQueryController&>(getDesignView()->getController()).isDistinct()); 2124*cdf0e10cSrcweir 2125*cdf0e10cSrcweir switch (aContextMenu.Execute(this, aMenuPos)) 2126*cdf0e10cSrcweir { 2127*cdf0e10cSrcweir case ID_QUERY_FUNCTION: 2128*cdf0e10cSrcweir SetRowVisible(BROW_FUNCTION_ROW, !IsRowVisible(BROW_FUNCTION_ROW)); 2129*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_VIEW_FUNCTIONS ); 2130*cdf0e10cSrcweir break; 2131*cdf0e10cSrcweir case ID_QUERY_TABLENAME: 2132*cdf0e10cSrcweir SetRowVisible(BROW_TABLE_ROW, !IsRowVisible(BROW_TABLE_ROW)); 2133*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_VIEW_TABLES ); 2134*cdf0e10cSrcweir break; 2135*cdf0e10cSrcweir case ID_QUERY_ALIASNAME: 2136*cdf0e10cSrcweir SetRowVisible(BROW_COLUMNALIAS_ROW, !IsRowVisible(BROW_COLUMNALIAS_ROW)); 2137*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_VIEW_ALIASES ); 2138*cdf0e10cSrcweir break; 2139*cdf0e10cSrcweir case ID_QUERY_DISTINCT: 2140*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).setDistinct(!static_cast<OQueryController&>(getDesignView()->getController()).isDistinct()); 2141*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True ); 2142*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature( SID_QUERY_DISTINCT_VALUES ); 2143*cdf0e10cSrcweir break; 2144*cdf0e10cSrcweir } 2145*cdf0e10cSrcweir 2146*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True ); 2147*cdf0e10cSrcweir } 2148*cdf0e10cSrcweir } 2149*cdf0e10cSrcweir else 2150*cdf0e10cSrcweir { 2151*cdf0e10cSrcweir EditBrowseBox::Command(rEvt); 2152*cdf0e10cSrcweir return; 2153*cdf0e10cSrcweir } 2154*cdf0e10cSrcweir } 2155*cdf0e10cSrcweir default: 2156*cdf0e10cSrcweir EditBrowseBox::Command(rEvt); 2157*cdf0e10cSrcweir } 2158*cdf0e10cSrcweir } 2159*cdf0e10cSrcweir 2160*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2161*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::IsRowVisible(sal_uInt16 _nWhich) const 2162*cdf0e10cSrcweir { 2163*cdf0e10cSrcweir DBG_ASSERT(_nWhich<(m_bVisibleRow.size()), "OSelectionBrowseBox::IsRowVisible : invalid parameter !"); 2164*cdf0e10cSrcweir return m_bVisibleRow[_nWhich]; 2165*cdf0e10cSrcweir } 2166*cdf0e10cSrcweir 2167*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2168*cdf0e10cSrcweir void OSelectionBrowseBox::SetRowVisible(sal_uInt16 _nWhich, sal_Bool _bVis) 2169*cdf0e10cSrcweir { 2170*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2171*cdf0e10cSrcweir DBG_ASSERT(_nWhich<m_bVisibleRow.size(), "OSelectionBrowseBox::SetRowVisible : invalid parameter !"); 2172*cdf0e10cSrcweir 2173*cdf0e10cSrcweir sal_Bool bWasEditing = IsEditing(); 2174*cdf0e10cSrcweir if (bWasEditing) 2175*cdf0e10cSrcweir DeactivateCell(); 2176*cdf0e10cSrcweir 2177*cdf0e10cSrcweir // do this before removing or inserting rows, as this triggers ActivateCell-calls, which rely on m_bVisibleRow 2178*cdf0e10cSrcweir m_bVisibleRow[_nWhich] = !m_bVisibleRow[_nWhich]; 2179*cdf0e10cSrcweir 2180*cdf0e10cSrcweir long nId = GetBrowseRow(_nWhich); 2181*cdf0e10cSrcweir if (_bVis) 2182*cdf0e10cSrcweir { 2183*cdf0e10cSrcweir RowInserted(nId,1); 2184*cdf0e10cSrcweir ++m_nVisibleCount; 2185*cdf0e10cSrcweir } 2186*cdf0e10cSrcweir else 2187*cdf0e10cSrcweir { 2188*cdf0e10cSrcweir RowRemoved(nId,1); 2189*cdf0e10cSrcweir --m_nVisibleCount; 2190*cdf0e10cSrcweir } 2191*cdf0e10cSrcweir 2192*cdf0e10cSrcweir if (bWasEditing) 2193*cdf0e10cSrcweir ActivateCell(); 2194*cdf0e10cSrcweir } 2195*cdf0e10cSrcweir 2196*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2197*cdf0e10cSrcweir long OSelectionBrowseBox::GetBrowseRow(long nRowId) const 2198*cdf0e10cSrcweir { 2199*cdf0e10cSrcweir sal_uInt16 nCount(0); 2200*cdf0e10cSrcweir for(sal_uInt16 i = 0 ; i < nRowId ; ++i) 2201*cdf0e10cSrcweir { 2202*cdf0e10cSrcweir if ( m_bVisibleRow[i] ) 2203*cdf0e10cSrcweir ++nCount; 2204*cdf0e10cSrcweir } 2205*cdf0e10cSrcweir return nCount; 2206*cdf0e10cSrcweir } 2207*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2208*cdf0e10cSrcweir long OSelectionBrowseBox::GetRealRow(long nRowId) const 2209*cdf0e10cSrcweir { 2210*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2211*cdf0e10cSrcweir long nErg=0,i; 2212*cdf0e10cSrcweir const long nCount = m_bVisibleRow.size(); 2213*cdf0e10cSrcweir for(i=0;i < nCount; ++i) 2214*cdf0e10cSrcweir { 2215*cdf0e10cSrcweir if(m_bVisibleRow[i]) 2216*cdf0e10cSrcweir { 2217*cdf0e10cSrcweir if(nErg++ == nRowId) 2218*cdf0e10cSrcweir break; 2219*cdf0e10cSrcweir } 2220*cdf0e10cSrcweir } 2221*cdf0e10cSrcweir DBG_ASSERT(nErg <= long(m_bVisibleRow.size()),"nErg kann nicht groesser als BROW_ROW_CNT sein!"); 2222*cdf0e10cSrcweir return i; 2223*cdf0e10cSrcweir } 2224*cdf0e10cSrcweir static long nVisibleRowMask[] = 2225*cdf0e10cSrcweir { 2226*cdf0e10cSrcweir 0x0001, 2227*cdf0e10cSrcweir 0x0002, 2228*cdf0e10cSrcweir 0x0004, 2229*cdf0e10cSrcweir 0x0008, 2230*cdf0e10cSrcweir 0x0010, 2231*cdf0e10cSrcweir 0x0020, 2232*cdf0e10cSrcweir 0x0040, 2233*cdf0e10cSrcweir 0x0080, 2234*cdf0e10cSrcweir 0x0100, 2235*cdf0e10cSrcweir 0x0200, 2236*cdf0e10cSrcweir 0x0400, 2237*cdf0e10cSrcweir 0x0800 2238*cdf0e10cSrcweir }; 2239*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2240*cdf0e10cSrcweir sal_Int32 OSelectionBrowseBox::GetNoneVisibleRows() const 2241*cdf0e10cSrcweir { 2242*cdf0e10cSrcweir sal_Int32 nErg(0); 2243*cdf0e10cSrcweir // only the first 11 row are interesting 2244*cdf0e10cSrcweir sal_Int32 nSize = sizeof(nVisibleRowMask) / sizeof(nVisibleRowMask[0]); 2245*cdf0e10cSrcweir for(sal_Int32 i=0;i<nSize;i++) 2246*cdf0e10cSrcweir { 2247*cdf0e10cSrcweir if(!m_bVisibleRow[i]) 2248*cdf0e10cSrcweir nErg |= nVisibleRowMask[i]; 2249*cdf0e10cSrcweir } 2250*cdf0e10cSrcweir return nErg; 2251*cdf0e10cSrcweir } 2252*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2253*cdf0e10cSrcweir void OSelectionBrowseBox::SetNoneVisbleRow(long nRows) 2254*cdf0e10cSrcweir { 2255*cdf0e10cSrcweir // only the first 11 row are interesting 2256*cdf0e10cSrcweir sal_Int32 nSize = sizeof(nVisibleRowMask) / sizeof(nVisibleRowMask[0]); 2257*cdf0e10cSrcweir for(sal_Int32 i=0;i< nSize;i++) 2258*cdf0e10cSrcweir m_bVisibleRow[i] = !(nRows & nVisibleRowMask[i]); 2259*cdf0e10cSrcweir } 2260*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2261*cdf0e10cSrcweir String OSelectionBrowseBox::GetCellText(long nRow, sal_uInt16 nColId) const 2262*cdf0e10cSrcweir { 2263*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2264*cdf0e10cSrcweir 2265*cdf0e10cSrcweir sal_uInt16 nPos = GetColumnPos(nColId); 2266*cdf0e10cSrcweir 2267*cdf0e10cSrcweir OTableFieldDescRef pEntry = getFields()[nPos-1]; 2268*cdf0e10cSrcweir DBG_ASSERT(pEntry != NULL, "OSelectionBrowseBox::GetCellText : invalid column id, prepare for GPF ... "); 2269*cdf0e10cSrcweir if ( pEntry->IsEmpty() ) 2270*cdf0e10cSrcweir return String(); 2271*cdf0e10cSrcweir 2272*cdf0e10cSrcweir String aText; 2273*cdf0e10cSrcweir switch (nRow) 2274*cdf0e10cSrcweir { 2275*cdf0e10cSrcweir case BROW_TABLE_ROW: 2276*cdf0e10cSrcweir aText = pEntry->GetAlias(); 2277*cdf0e10cSrcweir break; 2278*cdf0e10cSrcweir case BROW_FIELD_ROW: 2279*cdf0e10cSrcweir { 2280*cdf0e10cSrcweir String aField = pEntry->GetField(); 2281*cdf0e10cSrcweir if (aField.GetChar(0) == '*') // * durch alias.* ersetzen 2282*cdf0e10cSrcweir { 2283*cdf0e10cSrcweir aField = pEntry->GetAlias(); 2284*cdf0e10cSrcweir if(aField.Len()) 2285*cdf0e10cSrcweir aField += '.'; 2286*cdf0e10cSrcweir aField += '*'; 2287*cdf0e10cSrcweir } 2288*cdf0e10cSrcweir aText = aField; 2289*cdf0e10cSrcweir } break; 2290*cdf0e10cSrcweir case BROW_ORDER_ROW: 2291*cdf0e10cSrcweir if (pEntry->GetOrderDir() != ORDER_NONE) 2292*cdf0e10cSrcweir aText = String(ModuleRes(STR_QUERY_SORTTEXT) ).GetToken(sal::static_int_cast< sal_uInt16 >(pEntry->GetOrderDir())); 2293*cdf0e10cSrcweir break; 2294*cdf0e10cSrcweir case BROW_VIS_ROW: 2295*cdf0e10cSrcweir break; 2296*cdf0e10cSrcweir case BROW_COLUMNALIAS_ROW: 2297*cdf0e10cSrcweir aText = pEntry->GetFieldAlias(); 2298*cdf0e10cSrcweir break; 2299*cdf0e10cSrcweir case BROW_FUNCTION_ROW: 2300*cdf0e10cSrcweir // we always show the group function at first 2301*cdf0e10cSrcweir if ( pEntry->IsGroupBy() ) 2302*cdf0e10cSrcweir aText = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount()-1); 2303*cdf0e10cSrcweir else if ( pEntry->isNumericOrAggreateFunction() ) 2304*cdf0e10cSrcweir aText = pEntry->GetFunction(); 2305*cdf0e10cSrcweir break; 2306*cdf0e10cSrcweir default: 2307*cdf0e10cSrcweir aText = pEntry->GetCriteria(sal_uInt16(nRow - BROW_CRIT1_ROW)); 2308*cdf0e10cSrcweir } 2309*cdf0e10cSrcweir return aText; 2310*cdf0e10cSrcweir } 2311*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2312*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::GetFunctionName(sal_uInt32 _nFunctionTokenId,String& rFkt) 2313*cdf0e10cSrcweir { 2314*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2315*cdf0e10cSrcweir sal_Bool bErg=sal_True; 2316*cdf0e10cSrcweir String aText; 2317*cdf0e10cSrcweir switch(_nFunctionTokenId) 2318*cdf0e10cSrcweir { 2319*cdf0e10cSrcweir case SQL_TOKEN_COUNT: 2320*cdf0e10cSrcweir rFkt = (m_pFunctionCell->GetEntryCount() < 3) ? m_pFunctionCell->GetEntry(1) : m_pFunctionCell->GetEntry(2); 2321*cdf0e10cSrcweir break; 2322*cdf0e10cSrcweir case SQL_TOKEN_AVG: 2323*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(1); 2324*cdf0e10cSrcweir break; 2325*cdf0e10cSrcweir case SQL_TOKEN_MAX: 2326*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(3); 2327*cdf0e10cSrcweir break; 2328*cdf0e10cSrcweir case SQL_TOKEN_MIN: 2329*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(4); 2330*cdf0e10cSrcweir break; 2331*cdf0e10cSrcweir case SQL_TOKEN_SUM: 2332*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(5); 2333*cdf0e10cSrcweir break; 2334*cdf0e10cSrcweir case SQL_TOKEN_EVERY: 2335*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(6); 2336*cdf0e10cSrcweir break; 2337*cdf0e10cSrcweir case SQL_TOKEN_ANY: 2338*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(7); 2339*cdf0e10cSrcweir break; 2340*cdf0e10cSrcweir case SQL_TOKEN_SOME: 2341*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(8); 2342*cdf0e10cSrcweir break; 2343*cdf0e10cSrcweir case SQL_TOKEN_STDDEV_POP: 2344*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(9); 2345*cdf0e10cSrcweir break; 2346*cdf0e10cSrcweir case SQL_TOKEN_STDDEV_SAMP: 2347*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(10); 2348*cdf0e10cSrcweir break; 2349*cdf0e10cSrcweir case SQL_TOKEN_VAR_SAMP: 2350*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(11); 2351*cdf0e10cSrcweir break; 2352*cdf0e10cSrcweir case SQL_TOKEN_VAR_POP: 2353*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(12); 2354*cdf0e10cSrcweir break; 2355*cdf0e10cSrcweir case SQL_TOKEN_COLLECT: 2356*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(13); 2357*cdf0e10cSrcweir break; 2358*cdf0e10cSrcweir case SQL_TOKEN_FUSION: 2359*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(14); 2360*cdf0e10cSrcweir break; 2361*cdf0e10cSrcweir case SQL_TOKEN_INTERSECTION: 2362*cdf0e10cSrcweir rFkt = m_pFunctionCell->GetEntry(15); 2363*cdf0e10cSrcweir break; 2364*cdf0e10cSrcweir default: 2365*cdf0e10cSrcweir { 2366*cdf0e10cSrcweir xub_StrLen nCount = m_aFunctionStrings.GetTokenCount(); 2367*cdf0e10cSrcweir xub_StrLen i; 2368*cdf0e10cSrcweir for ( i = 0; i < nCount-1; i++) // Gruppierung wird nicht mit gez"ahlt 2369*cdf0e10cSrcweir { 2370*cdf0e10cSrcweir if(rFkt.EqualsIgnoreCaseAscii(m_aFunctionStrings.GetToken(i))) 2371*cdf0e10cSrcweir { 2372*cdf0e10cSrcweir rFkt = m_aFunctionStrings.GetToken(i); 2373*cdf0e10cSrcweir break; 2374*cdf0e10cSrcweir } 2375*cdf0e10cSrcweir } 2376*cdf0e10cSrcweir if(i == nCount-1) 2377*cdf0e10cSrcweir bErg = sal_False; 2378*cdf0e10cSrcweir } 2379*cdf0e10cSrcweir } 2380*cdf0e10cSrcweir 2381*cdf0e10cSrcweir return bErg; 2382*cdf0e10cSrcweir } 2383*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2384*cdf0e10cSrcweir String OSelectionBrowseBox::GetCellContents(sal_Int32 nCellIndex, sal_uInt16 nColId) 2385*cdf0e10cSrcweir { 2386*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2387*cdf0e10cSrcweir // DBG_ASSERT(nCellIndex < (GetRowCount()-1),"CellIndex ist zu gross"); 2388*cdf0e10cSrcweir if ( GetCurColumnId() == nColId && !m_bInUndoMode ) 2389*cdf0e10cSrcweir SaveModified(); 2390*cdf0e10cSrcweir 2391*cdf0e10cSrcweir sal_uInt16 nPos = GetColumnPos(nColId); 2392*cdf0e10cSrcweir OTableFieldDescRef pEntry = getFields()[nPos - 1]; 2393*cdf0e10cSrcweir DBG_ASSERT(pEntry != NULL, "OSelectionBrowseBox::GetCellContents : invalid column id, prepare for GPF ... "); 2394*cdf0e10cSrcweir 2395*cdf0e10cSrcweir switch (nCellIndex) 2396*cdf0e10cSrcweir { 2397*cdf0e10cSrcweir case BROW_VIS_ROW : 2398*cdf0e10cSrcweir return pEntry->IsVisible() ? g_strOne : g_strZero; 2399*cdf0e10cSrcweir case BROW_ORDER_ROW: 2400*cdf0e10cSrcweir { 2401*cdf0e10cSrcweir sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos(); 2402*cdf0e10cSrcweir if (nIdx == sal_uInt16(-1)) 2403*cdf0e10cSrcweir nIdx = 0; 2404*cdf0e10cSrcweir return String(nIdx); 2405*cdf0e10cSrcweir } 2406*cdf0e10cSrcweir default: 2407*cdf0e10cSrcweir return GetCellText(nCellIndex, nColId); 2408*cdf0e10cSrcweir } 2409*cdf0e10cSrcweir } 2410*cdf0e10cSrcweir 2411*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2412*cdf0e10cSrcweir void OSelectionBrowseBox::SetCellContents(sal_Int32 nRow, sal_uInt16 nColId, const String& strNewText) 2413*cdf0e10cSrcweir { 2414*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2415*cdf0e10cSrcweir sal_Bool bWasEditing = IsEditing() && (GetCurColumnId() == nColId) && IsRowVisible(static_cast<sal_uInt16>(nRow)) && (GetCurRow() == static_cast<sal_uInt16>(GetBrowseRow(nRow))); 2416*cdf0e10cSrcweir if (bWasEditing) 2417*cdf0e10cSrcweir DeactivateCell(); 2418*cdf0e10cSrcweir 2419*cdf0e10cSrcweir sal_uInt16 nPos = GetColumnPos(nColId); 2420*cdf0e10cSrcweir OTableFieldDescRef pEntry = getEntry(nPos - 1); 2421*cdf0e10cSrcweir DBG_ASSERT(pEntry != NULL, "OSelectionBrowseBox::SetCellContents : invalid column id, prepare for GPF ... "); 2422*cdf0e10cSrcweir 2423*cdf0e10cSrcweir 2424*cdf0e10cSrcweir switch (nRow) 2425*cdf0e10cSrcweir { 2426*cdf0e10cSrcweir case BROW_VIS_ROW: 2427*cdf0e10cSrcweir pEntry->SetVisible(strNewText.Equals(g_strOne)); 2428*cdf0e10cSrcweir break; 2429*cdf0e10cSrcweir case BROW_FIELD_ROW: 2430*cdf0e10cSrcweir pEntry->SetField(strNewText); 2431*cdf0e10cSrcweir break; 2432*cdf0e10cSrcweir case BROW_TABLE_ROW: 2433*cdf0e10cSrcweir pEntry->SetAlias(strNewText); 2434*cdf0e10cSrcweir break; 2435*cdf0e10cSrcweir case BROW_ORDER_ROW: 2436*cdf0e10cSrcweir { 2437*cdf0e10cSrcweir sal_uInt16 nIdx = (sal_uInt16)strNewText.ToInt32(); 2438*cdf0e10cSrcweir pEntry->SetOrderDir(EOrderDir(nIdx)); 2439*cdf0e10cSrcweir } break; 2440*cdf0e10cSrcweir case BROW_COLUMNALIAS_ROW: 2441*cdf0e10cSrcweir pEntry->SetFieldAlias(strNewText); 2442*cdf0e10cSrcweir break; 2443*cdf0e10cSrcweir case BROW_FUNCTION_ROW: 2444*cdf0e10cSrcweir { 2445*cdf0e10cSrcweir String sOldFunctionName = pEntry->GetFunction(); 2446*cdf0e10cSrcweir String sGroupFunctionName = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount()-1); 2447*cdf0e10cSrcweir pEntry->SetFunction(strNewText); 2448*cdf0e10cSrcweir // first reset this two member 2449*cdf0e10cSrcweir sal_Int32 nFunctionType = pEntry->GetFunctionType(); 2450*cdf0e10cSrcweir nFunctionType &= ~FKT_AGGREGATE; 2451*cdf0e10cSrcweir pEntry->SetFunctionType(nFunctionType); 2452*cdf0e10cSrcweir if ( pEntry->IsGroupBy() && !sGroupFunctionName.EqualsIgnoreCaseAscii(strNewText) ) 2453*cdf0e10cSrcweir pEntry->SetGroupBy(sal_False); 2454*cdf0e10cSrcweir 2455*cdf0e10cSrcweir 2456*cdf0e10cSrcweir if ( sGroupFunctionName.EqualsIgnoreCaseAscii(strNewText) ) 2457*cdf0e10cSrcweir pEntry->SetGroupBy(sal_True); 2458*cdf0e10cSrcweir else if ( strNewText.Len() ) 2459*cdf0e10cSrcweir { 2460*cdf0e10cSrcweir nFunctionType |= FKT_AGGREGATE; 2461*cdf0e10cSrcweir pEntry->SetFunctionType(nFunctionType); 2462*cdf0e10cSrcweir } 2463*cdf0e10cSrcweir } break; 2464*cdf0e10cSrcweir default: 2465*cdf0e10cSrcweir pEntry->SetCriteria(sal_uInt16(nRow - BROW_CRIT1_ROW), strNewText); 2466*cdf0e10cSrcweir } 2467*cdf0e10cSrcweir 2468*cdf0e10cSrcweir long nCellIndex = GetRealRow(nRow); 2469*cdf0e10cSrcweir if(IsRowVisible(static_cast<sal_uInt16>(nRow))) 2470*cdf0e10cSrcweir RowModified(nCellIndex, nColId); 2471*cdf0e10cSrcweir 2472*cdf0e10cSrcweir // die entsprechende Feld-Beschreibung ist jetzt leer -> Visible auf sal_False (damit das konsistent mit normalen leeren Spalten ist) 2473*cdf0e10cSrcweir if (pEntry->IsEmpty()) 2474*cdf0e10cSrcweir pEntry->SetVisible(sal_False); 2475*cdf0e10cSrcweir 2476*cdf0e10cSrcweir if (bWasEditing) 2477*cdf0e10cSrcweir ActivateCell(nCellIndex, nColId); 2478*cdf0e10cSrcweir 2479*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True ); 2480*cdf0e10cSrcweir } 2481*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2482*cdf0e10cSrcweir sal_uInt32 OSelectionBrowseBox::GetTotalCellWidth(long nRow, sal_uInt16 nColId) const 2483*cdf0e10cSrcweir { 2484*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2485*cdf0e10cSrcweir 2486*cdf0e10cSrcweir long nRowId = GetRealRow(nRow); 2487*cdf0e10cSrcweir if (nRowId == BROW_VIS_ROW) 2488*cdf0e10cSrcweir return CHECKBOX_SIZE; 2489*cdf0e10cSrcweir else 2490*cdf0e10cSrcweir return GetDataWindow().GetTextWidth(GetCellText(nRowId, nColId)); 2491*cdf0e10cSrcweir } 2492*cdf0e10cSrcweir 2493*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2494*cdf0e10cSrcweir void OSelectionBrowseBox::ColumnResized(sal_uInt16 nColId) 2495*cdf0e10cSrcweir { 2496*cdf0e10cSrcweir if (static_cast<OQueryController&>(getDesignView()->getController()).isReadOnly()) 2497*cdf0e10cSrcweir return; 2498*cdf0e10cSrcweir // The resizing of columns can't be suppressed (BrowseBox doesn't support that) so we have to do this 2499*cdf0e10cSrcweir // fake. It's not _that_ bad : the user may change column widths while in read-only mode to see all details 2500*cdf0e10cSrcweir // but the changes aren't permanent ... 2501*cdf0e10cSrcweir 2502*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2503*cdf0e10cSrcweir sal_uInt16 nPos = GetColumnPos(nColId); 2504*cdf0e10cSrcweir DBG_ASSERT(nPos <= getFields().size(),"ColumnResized:: nColId sollte nicht groesser als List::count sein!"); 2505*cdf0e10cSrcweir OTableFieldDescRef pEntry = getEntry(nPos-1); 2506*cdf0e10cSrcweir DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::ColumnResized : keine FieldDescription !"); 2507*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).setModified( sal_True ); 2508*cdf0e10cSrcweir EditBrowseBox::ColumnResized(nColId); 2509*cdf0e10cSrcweir 2510*cdf0e10cSrcweir if ( pEntry.isValid()) 2511*cdf0e10cSrcweir { 2512*cdf0e10cSrcweir if ( !m_bInUndoMode ) 2513*cdf0e10cSrcweir { 2514*cdf0e10cSrcweir // create the undo action 2515*cdf0e10cSrcweir OTabFieldSizedUndoAct* pUndo = new OTabFieldSizedUndoAct(this); 2516*cdf0e10cSrcweir pUndo->SetColumnPosition( nPos ); 2517*cdf0e10cSrcweir pUndo->SetOriginalWidth(pEntry->GetColWidth()); 2518*cdf0e10cSrcweir getDesignView()->getController().addUndoActionAndInvalidate(pUndo); 2519*cdf0e10cSrcweir } 2520*cdf0e10cSrcweir pEntry->SetColWidth(sal_uInt16(GetColumnWidth(nColId))); 2521*cdf0e10cSrcweir } 2522*cdf0e10cSrcweir } 2523*cdf0e10cSrcweir 2524*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2525*cdf0e10cSrcweir sal_uInt32 OSelectionBrowseBox::GetTotalCellWidth(long nRowId, sal_uInt16 nColId) 2526*cdf0e10cSrcweir { 2527*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2528*cdf0e10cSrcweir sal_uInt16 nPos = GetColumnPos(nColId); 2529*cdf0e10cSrcweir DBG_ASSERT((nPos == 0) || (nPos <= getFields().size()), "OSelectionBrowseBox::GetTotalCellWidth : invalid parameter nColId"); 2530*cdf0e10cSrcweir 2531*cdf0e10cSrcweir OTableFieldDescRef pEntry = getFields()[nPos-1]; 2532*cdf0e10cSrcweir DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::GetTotalCellWidth : invalid FieldDescription !"); 2533*cdf0e10cSrcweir 2534*cdf0e10cSrcweir long nRow = GetRealRow(nRowId); 2535*cdf0e10cSrcweir String strText(GetCellText(nRow, nColId)); 2536*cdf0e10cSrcweir return GetDataWindow().LogicToPixel(Size(GetDataWindow().GetTextWidth(strText),0)).Width(); 2537*cdf0e10cSrcweir } 2538*cdf0e10cSrcweir 2539*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2540*cdf0e10cSrcweir sal_uInt16 OSelectionBrowseBox::GetDefaultColumnWidth(const String& /*rName*/) const 2541*cdf0e10cSrcweir { 2542*cdf0e10cSrcweir DBG_CHKTHIS(OSelectionBrowseBox,NULL); 2543*cdf0e10cSrcweir // die Baissklasse macht das von dem Text abhaengig, ich habe aber keine Spaltenueberschriften, daher haette ich 2544*cdf0e10cSrcweir // hier gern einen anderen Default-Wert 2545*cdf0e10cSrcweir return static_cast<sal_uInt16>(DEFAULT_SIZE); 2546*cdf0e10cSrcweir } 2547*cdf0e10cSrcweir //------------------------------------------------------------------------------ 2548*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::isCutAllowed() 2549*cdf0e10cSrcweir { 2550*cdf0e10cSrcweir sal_Bool bCutAllowed = sal_False; 2551*cdf0e10cSrcweir long nRow = GetRealRow(GetCurRow()); 2552*cdf0e10cSrcweir switch (nRow) 2553*cdf0e10cSrcweir { 2554*cdf0e10cSrcweir case BROW_VIS_ROW: 2555*cdf0e10cSrcweir case BROW_ORDER_ROW: 2556*cdf0e10cSrcweir case BROW_TABLE_ROW: 2557*cdf0e10cSrcweir case BROW_FUNCTION_ROW: 2558*cdf0e10cSrcweir break; 2559*cdf0e10cSrcweir case BROW_FIELD_ROW: 2560*cdf0e10cSrcweir bCutAllowed = m_pFieldCell->GetSelected().Len() != 0; 2561*cdf0e10cSrcweir break; 2562*cdf0e10cSrcweir default: 2563*cdf0e10cSrcweir bCutAllowed = m_pTextCell->GetSelected().Len() != 0; 2564*cdf0e10cSrcweir break; 2565*cdf0e10cSrcweir } 2566*cdf0e10cSrcweir return bCutAllowed; 2567*cdf0e10cSrcweir } 2568*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2569*cdf0e10cSrcweir void OSelectionBrowseBox::cut() 2570*cdf0e10cSrcweir { 2571*cdf0e10cSrcweir String sOldValue = GetCellContents(GetRealRow(GetCurRow()),GetCurColumnId()); 2572*cdf0e10cSrcweir long nRow = GetRealRow(GetCurRow()); 2573*cdf0e10cSrcweir switch (nRow) 2574*cdf0e10cSrcweir { 2575*cdf0e10cSrcweir case BROW_FIELD_ROW: 2576*cdf0e10cSrcweir m_pFieldCell->Cut(); 2577*cdf0e10cSrcweir m_pFieldCell->SetModifyFlag(); 2578*cdf0e10cSrcweir break; 2579*cdf0e10cSrcweir default: 2580*cdf0e10cSrcweir m_pTextCell->Cut(); 2581*cdf0e10cSrcweir m_pTextCell->SetModifyFlag(); 2582*cdf0e10cSrcweir } 2583*cdf0e10cSrcweir SaveModified(); 2584*cdf0e10cSrcweir RowModified(GetBrowseRow(nRow), GetCurColumnId()); 2585*cdf0e10cSrcweir 2586*cdf0e10cSrcweir invalidateUndoRedo(); 2587*cdf0e10cSrcweir } 2588*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2589*cdf0e10cSrcweir void OSelectionBrowseBox::paste() 2590*cdf0e10cSrcweir { 2591*cdf0e10cSrcweir long nRow = GetRealRow(GetCurRow()); 2592*cdf0e10cSrcweir switch (nRow) 2593*cdf0e10cSrcweir { 2594*cdf0e10cSrcweir case BROW_FIELD_ROW: 2595*cdf0e10cSrcweir m_pFieldCell->Paste(); 2596*cdf0e10cSrcweir m_pFieldCell->SetModifyFlag(); 2597*cdf0e10cSrcweir break; 2598*cdf0e10cSrcweir default: 2599*cdf0e10cSrcweir m_pTextCell->Paste(); 2600*cdf0e10cSrcweir m_pTextCell->SetModifyFlag(); 2601*cdf0e10cSrcweir } 2602*cdf0e10cSrcweir RowModified(GetBrowseRow(nRow), GetCurColumnId()); 2603*cdf0e10cSrcweir invalidateUndoRedo(); 2604*cdf0e10cSrcweir } 2605*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2606*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::isPasteAllowed() 2607*cdf0e10cSrcweir { 2608*cdf0e10cSrcweir sal_Bool bPasteAllowed = sal_True; 2609*cdf0e10cSrcweir long nRow = GetRealRow(GetCurRow()); 2610*cdf0e10cSrcweir switch (nRow) 2611*cdf0e10cSrcweir { 2612*cdf0e10cSrcweir case BROW_VIS_ROW: 2613*cdf0e10cSrcweir case BROW_ORDER_ROW: 2614*cdf0e10cSrcweir case BROW_TABLE_ROW: 2615*cdf0e10cSrcweir case BROW_FUNCTION_ROW: 2616*cdf0e10cSrcweir bPasteAllowed = sal_False; 2617*cdf0e10cSrcweir break; 2618*cdf0e10cSrcweir } 2619*cdf0e10cSrcweir return bPasteAllowed; 2620*cdf0e10cSrcweir } 2621*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2622*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::isCopyAllowed() 2623*cdf0e10cSrcweir { 2624*cdf0e10cSrcweir return isCutAllowed(); 2625*cdf0e10cSrcweir } 2626*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2627*cdf0e10cSrcweir void OSelectionBrowseBox::copy() 2628*cdf0e10cSrcweir { 2629*cdf0e10cSrcweir long nRow = GetRealRow(GetCurRow()); 2630*cdf0e10cSrcweir switch (nRow) 2631*cdf0e10cSrcweir { 2632*cdf0e10cSrcweir case BROW_FIELD_ROW: 2633*cdf0e10cSrcweir m_pFieldCell->Copy(); 2634*cdf0e10cSrcweir break; 2635*cdf0e10cSrcweir default: 2636*cdf0e10cSrcweir m_pTextCell->Copy(); 2637*cdf0e10cSrcweir } 2638*cdf0e10cSrcweir } 2639*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2640*cdf0e10cSrcweir void OSelectionBrowseBox::appendUndoAction(const String& _rOldValue,const String& _rNewValue,sal_Int32 _nRow,sal_Bool& _bListAction) 2641*cdf0e10cSrcweir { 2642*cdf0e10cSrcweir if ( !m_bInUndoMode && !_rNewValue.Equals(_rOldValue) ) 2643*cdf0e10cSrcweir { 2644*cdf0e10cSrcweir if ( !_bListAction ) 2645*cdf0e10cSrcweir { 2646*cdf0e10cSrcweir _bListAction = sal_True; 2647*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).GetUndoManager().EnterListAction(String(),String()); 2648*cdf0e10cSrcweir } 2649*cdf0e10cSrcweir appendUndoAction(_rOldValue,_rNewValue,_nRow); 2650*cdf0e10cSrcweir } 2651*cdf0e10cSrcweir } 2652*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2653*cdf0e10cSrcweir void OSelectionBrowseBox::appendUndoAction(const String& _rOldValue,const String& _rNewValue,sal_Int32 _nRow) 2654*cdf0e10cSrcweir { 2655*cdf0e10cSrcweir if ( !m_bInUndoMode && !_rNewValue.Equals(_rOldValue) ) 2656*cdf0e10cSrcweir { 2657*cdf0e10cSrcweir OTabFieldCellModifiedUndoAct* pUndoAct = new OTabFieldCellModifiedUndoAct(this); 2658*cdf0e10cSrcweir pUndoAct->SetCellIndex(_nRow); 2659*cdf0e10cSrcweir OSL_ENSURE(GetColumnPos(GetCurColumnId()) != BROWSER_INVALIDID,"Current position isn't valid!"); 2660*cdf0e10cSrcweir pUndoAct->SetColumnPosition( GetColumnPos(GetCurColumnId()) ); 2661*cdf0e10cSrcweir pUndoAct->SetCellContents(_rOldValue); 2662*cdf0e10cSrcweir getDesignView()->getController().addUndoActionAndInvalidate(pUndoAct); 2663*cdf0e10cSrcweir } 2664*cdf0e10cSrcweir } 2665*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2666*cdf0e10cSrcweir IMPL_LINK(OSelectionBrowseBox, OnInvalidateTimer, void*, EMPTYARG) 2667*cdf0e10cSrcweir { 2668*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature(SID_CUT); 2669*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature(SID_COPY); 2670*cdf0e10cSrcweir static_cast<OQueryController&>(getDesignView()->getController()).InvalidateFeature(SID_PASTE); 2671*cdf0e10cSrcweir if(!m_bStopTimer) 2672*cdf0e10cSrcweir m_timerInvalidate.Start(); 2673*cdf0e10cSrcweir return 0L; 2674*cdf0e10cSrcweir } 2675*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2676*cdf0e10cSrcweir void OSelectionBrowseBox::stopTimer() 2677*cdf0e10cSrcweir { 2678*cdf0e10cSrcweir m_bStopTimer = sal_True; 2679*cdf0e10cSrcweir if (m_timerInvalidate.IsActive()) 2680*cdf0e10cSrcweir m_timerInvalidate.Stop(); 2681*cdf0e10cSrcweir } 2682*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2683*cdf0e10cSrcweir void OSelectionBrowseBox::startTimer() 2684*cdf0e10cSrcweir { 2685*cdf0e10cSrcweir m_bStopTimer = sal_False; 2686*cdf0e10cSrcweir if (!m_timerInvalidate.IsActive()) 2687*cdf0e10cSrcweir m_timerInvalidate.Start(); 2688*cdf0e10cSrcweir } 2689*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2690*cdf0e10cSrcweir OTableFields& OSelectionBrowseBox::getFields() const 2691*cdf0e10cSrcweir { 2692*cdf0e10cSrcweir OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController()); 2693*cdf0e10cSrcweir return rController.getTableFieldDesc(); 2694*cdf0e10cSrcweir } 2695*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2696*cdf0e10cSrcweir void OSelectionBrowseBox::enableControl(const OTableFieldDescRef& _rEntry,Window* _pControl) 2697*cdf0e10cSrcweir { 2698*cdf0e10cSrcweir sal_Bool bEnable = !_rEntry->isCondition(); 2699*cdf0e10cSrcweir _pControl->Enable(bEnable); 2700*cdf0e10cSrcweir _pControl->EnableInput(bEnable); 2701*cdf0e10cSrcweir } 2702*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2703*cdf0e10cSrcweir void OSelectionBrowseBox::setTextCellContext(const OTableFieldDescRef& _rEntry,const String& _sText,const rtl::OString& _sHelpId) 2704*cdf0e10cSrcweir { 2705*cdf0e10cSrcweir m_pTextCell->SetText(_sText); 2706*cdf0e10cSrcweir m_pTextCell->ClearModifyFlag(); 2707*cdf0e10cSrcweir if (!m_pTextCell->HasFocus()) 2708*cdf0e10cSrcweir m_pTextCell->GrabFocus(); 2709*cdf0e10cSrcweir 2710*cdf0e10cSrcweir enableControl(_rEntry,m_pTextCell); 2711*cdf0e10cSrcweir 2712*cdf0e10cSrcweir if (m_pTextCell->GetHelpId() != _sHelpId) 2713*cdf0e10cSrcweir // da TextCell in verschiedenen Kontexten verwendet wird, muss ich den gecachten HelpText loeschen 2714*cdf0e10cSrcweir m_pTextCell->SetHelpText(String()); 2715*cdf0e10cSrcweir m_pTextCell->SetHelpId(_sHelpId); 2716*cdf0e10cSrcweir } 2717*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2718*cdf0e10cSrcweir void OSelectionBrowseBox::invalidateUndoRedo() 2719*cdf0e10cSrcweir { 2720*cdf0e10cSrcweir OQueryController& rController = static_cast<OQueryController&>(getDesignView()->getController()); 2721*cdf0e10cSrcweir rController.InvalidateFeature( ID_BROWSER_UNDO ); 2722*cdf0e10cSrcweir rController.InvalidateFeature( ID_BROWSER_REDO ); 2723*cdf0e10cSrcweir rController.InvalidateFeature( ID_BROWSER_QUERY_EXECUTE ); 2724*cdf0e10cSrcweir } 2725*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2726*cdf0e10cSrcweir OTableFieldDescRef OSelectionBrowseBox::getEntry(OTableFields::size_type _nPos) 2727*cdf0e10cSrcweir { 2728*cdf0e10cSrcweir // we have to check if we need a new entry at this position 2729*cdf0e10cSrcweir OTableFields& aFields = getFields(); 2730*cdf0e10cSrcweir OSL_ENSURE(aFields.size() > _nPos,"ColID is to great!"); 2731*cdf0e10cSrcweir 2732*cdf0e10cSrcweir OTableFieldDescRef pEntry = aFields[_nPos]; 2733*cdf0e10cSrcweir OSL_ENSURE(pEntry.isValid(),"Invalid entry!"); 2734*cdf0e10cSrcweir if ( !pEntry.isValid() ) 2735*cdf0e10cSrcweir { 2736*cdf0e10cSrcweir pEntry = new OTableFieldDesc(); 2737*cdf0e10cSrcweir pEntry->SetColumnId( 2738*cdf0e10cSrcweir GetColumnId(sal::static_int_cast< sal_uInt16 >(_nPos+1))); 2739*cdf0e10cSrcweir aFields[_nPos] = pEntry; 2740*cdf0e10cSrcweir } 2741*cdf0e10cSrcweir return pEntry; 2742*cdf0e10cSrcweir } 2743*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2744*cdf0e10cSrcweir void OSelectionBrowseBox::GetFocus() 2745*cdf0e10cSrcweir { 2746*cdf0e10cSrcweir if(!IsEditing() && !m_bWasEditing) 2747*cdf0e10cSrcweir ActivateCell(); 2748*cdf0e10cSrcweir EditBrowseBox::GetFocus(); 2749*cdf0e10cSrcweir } 2750*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2751*cdf0e10cSrcweir void OSelectionBrowseBox::DeactivateCell(sal_Bool _bUpdate) 2752*cdf0e10cSrcweir { 2753*cdf0e10cSrcweir m_bWasEditing = sal_True; 2754*cdf0e10cSrcweir EditBrowseBox::DeactivateCell(_bUpdate); 2755*cdf0e10cSrcweir m_bWasEditing = sal_False; 2756*cdf0e10cSrcweir } 2757*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2758*cdf0e10cSrcweir ::rtl::OUString OSelectionBrowseBox::GetRowDescription( sal_Int32 _nRow ) const 2759*cdf0e10cSrcweir { 2760*cdf0e10cSrcweir String aLabel(ModuleRes(STR_QUERY_HANDLETEXT)); 2761*cdf0e10cSrcweir 2762*cdf0e10cSrcweir // ab BROW_CRIT2_ROW werden alle Zeilen mit "oder" angegeben 2763*cdf0e10cSrcweir xub_StrLen nToken = (xub_StrLen) (_nRow >= GetBrowseRow(BROW_CRIT2_ROW)) 2764*cdf0e10cSrcweir ? 2765*cdf0e10cSrcweir xub_StrLen(BROW_CRIT2_ROW) : xub_StrLen(GetRealRow(_nRow)); 2766*cdf0e10cSrcweir return ::rtl::OUString(aLabel.GetToken(nToken)); 2767*cdf0e10cSrcweir } 2768*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2769*cdf0e10cSrcweir ::rtl::OUString OSelectionBrowseBox::GetAccessibleObjectName( ::svt::AccessibleBrowseBoxObjType _eObjType,sal_Int32 _nPosition) const 2770*cdf0e10cSrcweir { 2771*cdf0e10cSrcweir ::rtl::OUString sRetText; 2772*cdf0e10cSrcweir switch( _eObjType ) 2773*cdf0e10cSrcweir { 2774*cdf0e10cSrcweir case ::svt::BBTYPE_ROWHEADERCELL: 2775*cdf0e10cSrcweir sRetText = GetRowDescription(_nPosition); 2776*cdf0e10cSrcweir break; 2777*cdf0e10cSrcweir default: 2778*cdf0e10cSrcweir sRetText = EditBrowseBox::GetAccessibleObjectDescription(_eObjType,_nPosition); 2779*cdf0e10cSrcweir } 2780*cdf0e10cSrcweir return sRetText; 2781*cdf0e10cSrcweir } 2782*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2783*cdf0e10cSrcweir sal_Bool OSelectionBrowseBox::fillEntryTable(OTableFieldDescRef& _pEntry,const ::rtl::OUString& _sTableName) 2784*cdf0e10cSrcweir { 2785*cdf0e10cSrcweir sal_Bool bRet = sal_False; 2786*cdf0e10cSrcweir OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap(); 2787*cdf0e10cSrcweir if (pTabWinList) 2788*cdf0e10cSrcweir { 2789*cdf0e10cSrcweir OJoinTableView::OTableWindowMapIterator aIter = pTabWinList->find(_sTableName); 2790*cdf0e10cSrcweir if(aIter != pTabWinList->end()) 2791*cdf0e10cSrcweir { 2792*cdf0e10cSrcweir OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(aIter->second); 2793*cdf0e10cSrcweir if (pEntryTab) 2794*cdf0e10cSrcweir { 2795*cdf0e10cSrcweir _pEntry->SetTable(pEntryTab->GetTableName()); 2796*cdf0e10cSrcweir _pEntry->SetTabWindow(pEntryTab); 2797*cdf0e10cSrcweir bRet = sal_True; 2798*cdf0e10cSrcweir } 2799*cdf0e10cSrcweir } 2800*cdf0e10cSrcweir } 2801*cdf0e10cSrcweir return bRet; 2802*cdf0e10cSrcweir } 2803*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2804*cdf0e10cSrcweir void OSelectionBrowseBox::setFunctionCell(OTableFieldDescRef& _pEntry) 2805*cdf0e10cSrcweir { 2806*cdf0e10cSrcweir Reference< XConnection> xConnection = static_cast<OQueryController&>(getDesignView()->getController()).getConnection(); 2807*cdf0e10cSrcweir if ( xConnection.is() ) 2808*cdf0e10cSrcweir { 2809*cdf0e10cSrcweir // Diese Funktionen stehen nur unter CORE zur Verf�gung 2810*cdf0e10cSrcweir if ( lcl_SupportsCoreSQLGrammar(xConnection) ) 2811*cdf0e10cSrcweir { 2812*cdf0e10cSrcweir // if we have an asterix, no other function than count is allowed 2813*cdf0e10cSrcweir m_pFunctionCell->Clear(); 2814*cdf0e10cSrcweir m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(0)); 2815*cdf0e10cSrcweir if ( isFieldNameAsterix(_pEntry->GetField()) ) 2816*cdf0e10cSrcweir m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT 2817*cdf0e10cSrcweir else 2818*cdf0e10cSrcweir { 2819*cdf0e10cSrcweir xub_StrLen nCount = m_aFunctionStrings.GetTokenCount(); 2820*cdf0e10cSrcweir if ( _pEntry->isNumeric() ) 2821*cdf0e10cSrcweir --nCount; 2822*cdf0e10cSrcweir for (xub_StrLen nIdx = 1; nIdx < nCount; nIdx++) 2823*cdf0e10cSrcweir m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(nIdx)); 2824*cdf0e10cSrcweir } 2825*cdf0e10cSrcweir 2826*cdf0e10cSrcweir if ( _pEntry->IsGroupBy() ) 2827*cdf0e10cSrcweir { 2828*cdf0e10cSrcweir OSL_ENSURE(!_pEntry->isNumeric(),"Not allowed to combine group by and numeric values!"); 2829*cdf0e10cSrcweir m_pFunctionCell->SelectEntry(m_pFunctionCell->GetEntry(m_pFunctionCell->GetEntryCount() - 1)); 2830*cdf0e10cSrcweir } 2831*cdf0e10cSrcweir else if ( m_pFunctionCell->GetEntryPos(String(_pEntry->GetFunction())) != COMBOBOX_ENTRY_NOTFOUND ) 2832*cdf0e10cSrcweir m_pFunctionCell->SelectEntry(String(_pEntry->GetFunction())); 2833*cdf0e10cSrcweir else 2834*cdf0e10cSrcweir m_pFunctionCell->SelectEntryPos(0); 2835*cdf0e10cSrcweir 2836*cdf0e10cSrcweir enableControl(_pEntry,m_pFunctionCell); 2837*cdf0e10cSrcweir } 2838*cdf0e10cSrcweir else 2839*cdf0e10cSrcweir { 2840*cdf0e10cSrcweir // nur COUNT(*) erlaubt 2841*cdf0e10cSrcweir sal_Bool bCountRemoved = !isFieldNameAsterix(_pEntry->GetField()); 2842*cdf0e10cSrcweir if ( bCountRemoved ) 2843*cdf0e10cSrcweir m_pFunctionCell->RemoveEntry(1); 2844*cdf0e10cSrcweir 2845*cdf0e10cSrcweir if ( !bCountRemoved && m_pFunctionCell->GetEntryCount() < 2) 2846*cdf0e10cSrcweir m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT 2847*cdf0e10cSrcweir 2848*cdf0e10cSrcweir if(m_pFunctionCell->GetEntryPos(String(_pEntry->GetFunction())) != COMBOBOX_ENTRY_NOTFOUND) 2849*cdf0e10cSrcweir m_pFunctionCell->SelectEntry(_pEntry->GetFunction()); 2850*cdf0e10cSrcweir else 2851*cdf0e10cSrcweir m_pFunctionCell->SelectEntryPos(0); 2852*cdf0e10cSrcweir } 2853*cdf0e10cSrcweir } 2854*cdf0e10cSrcweir } 2855*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2856*cdf0e10cSrcweir Reference< XAccessible > OSelectionBrowseBox::CreateAccessibleCell( sal_Int32 _nRow, sal_uInt16 _nColumnPos ) 2857*cdf0e10cSrcweir { 2858*cdf0e10cSrcweir OTableFieldDescRef pEntry = NULL; 2859*cdf0e10cSrcweir if(getFields().size() > sal_uInt16(_nColumnPos - 1)) 2860*cdf0e10cSrcweir pEntry = getFields()[_nColumnPos - 1]; 2861*cdf0e10cSrcweir 2862*cdf0e10cSrcweir if ( _nRow == BROW_VIS_ROW && pEntry.isValid() ) 2863*cdf0e10cSrcweir return EditBrowseBox::CreateAccessibleCheckBoxCell( _nRow, _nColumnPos,pEntry->IsVisible() ? STATE_CHECK : STATE_NOCHECK ); 2864*cdf0e10cSrcweir 2865*cdf0e10cSrcweir return EditBrowseBox::CreateAccessibleCell( _nRow, _nColumnPos ); 2866*cdf0e10cSrcweir } 2867*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2868*cdf0e10cSrcweir bool OSelectionBrowseBox::HasFieldByAliasName(const ::rtl::OUString& rFieldName, OTableFieldDescRef& rInfo) const 2869*cdf0e10cSrcweir { 2870*cdf0e10cSrcweir OTableFields& aFields = getFields(); 2871*cdf0e10cSrcweir OTableFields::iterator aIter = aFields.begin(); 2872*cdf0e10cSrcweir OTableFields::iterator aEnd = aFields.end(); 2873*cdf0e10cSrcweir 2874*cdf0e10cSrcweir for(;aIter != aEnd;++aIter) 2875*cdf0e10cSrcweir { 2876*cdf0e10cSrcweir if ( (*aIter)->GetFieldAlias() == rFieldName ) 2877*cdf0e10cSrcweir { 2878*cdf0e10cSrcweir rInfo.getBody() = (*aIter).getBody(); 2879*cdf0e10cSrcweir break; 2880*cdf0e10cSrcweir } 2881*cdf0e10cSrcweir } 2882*cdf0e10cSrcweir return aIter != aEnd; 2883*cdf0e10cSrcweir } 2884*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2885*cdf0e10cSrcweir 2886