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