/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" // System - Includes --------------------------------------------------------- // INCLUDE ------------------------------------------------------------------- #include #include #include #include "uiitems.hxx" #include "dbcolect.hxx" #include "reffact.hxx" #include "viewdata.hxx" #include "document.hxx" #include "docsh.hxx" #include "scresid.hxx" #include "foptmgr.hxx" #include "globstr.hrc" #include "filter.hrc" #define _FILTDLG_CXX #include "filtdlg.hxx" #undef _FILTDLG_CXX #include // DEFINE -------------------------------------------------------------------- #define ERRORBOX(rid) ErrorBox( this, WinBits( WB_OK|WB_DEF_OK), \ ScGlobal::GetRscString(rid) ).Execute() //============================================================================ // class ScFilterDlg //---------------------------------------------------------------------------- ScFilterDlg::ScFilterDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, const SfxItemSet& rArgSet ) : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_FILTER ), // aFlCriteria ( this, ScResId( FL_CRITERIA ) ), aLbConnect1 ( this, ScResId( LB_OP1 ) ), aLbField1 ( this, ScResId( LB_FIELD1 ) ), aLbCond1 ( this, ScResId( LB_COND1 ) ), aEdVal1 ( this, ScResId( ED_VAL1 ) ), aLbConnect2 ( this, ScResId( LB_OP2 ) ), aLbField2 ( this, ScResId( LB_FIELD2 ) ), aLbCond2 ( this, ScResId( LB_COND2 ) ), aEdVal2 ( this, ScResId( ED_VAL2 ) ), aLbConnect3 ( this, ScResId( LB_OP3 ) ), aLbField3 ( this, ScResId( LB_FIELD3 ) ), aLbCond3 ( this, ScResId( LB_COND3 ) ), aEdVal3 ( this, ScResId( ED_VAL3 ) ), aLbConnect4 ( this, ScResId( LB_OP4 ) ), aLbField4 ( this, ScResId( LB_FIELD4 ) ), aLbCond4 ( this, ScResId( LB_COND4 ) ), aEdVal4 ( this, ScResId( ED_VAL4 ) ), aFtConnect ( this, ScResId( FT_OP ) ), aFtField ( this, ScResId( FT_FIELD ) ), aFtCond ( this, ScResId( FT_COND ) ), aFtVal ( this, ScResId( FT_VAL ) ), aFlSeparator ( this, ScResId( FL_SEPARATOR ) ), aScrollBar ( this, ScResId( LB_SCROLL ) ), aFlOptions ( this, ScResId( FL_OPTIONS ) ), aBtnMore ( this, ScResId( BTN_MORE ) ), aBtnHelp ( this, ScResId( BTN_HELP ) ), aBtnOk ( this, ScResId( BTN_OK ) ), aBtnCancel ( this, ScResId( BTN_CANCEL ) ), _INIT_COMMON_FILTER_RSCOBJS aStrEmpty ( ScResId( SCSTR_EMPTY ) ), aStrNotEmpty ( ScResId( SCSTR_NOTEMPTY ) ), aStrRow ( ScResId( SCSTR_ROW ) ), aStrColumn ( ScResId( SCSTR_COLUMN ) ), // pOptionsMgr ( NULL ), nWhichQuery ( rArgSet.GetPool()->GetWhich( SID_QUERY ) ), theQueryData ( ((const ScQueryItem&) rArgSet.Get( nWhichQuery )).GetQueryData() ), pOutItem ( NULL ), pViewData ( NULL ), pDoc ( NULL ), nSrcTab ( 0 ), nFieldCount ( 0 ), bRefInputMode ( sal_False ), pTimer ( NULL ) { for (sal_uInt16 i=0; i<=MAXCOL; i++) pEntryLists[i] = NULL; for (SCSIZE i=0;iSetTimeout( 50 ); // 50ms warten pTimer->SetTimeoutHdl( LINK( this, ScFilterDlg, TimeOutHdl ) ); String sAccName (ScResId(RID_FILTER_OPERATOR)); String sIndexName(sAccName); sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 1")); aLbConnect1.SetAccessibleName(sIndexName); sIndexName = sAccName; sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 2")); aLbConnect2.SetAccessibleName(sIndexName); sAccName = String(ScResId(RID_FILTER_FIELDNAME)); sIndexName = sAccName; sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 1")); aLbField1.SetAccessibleName(sIndexName); sIndexName = sAccName; sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 2")); aLbField2.SetAccessibleName(sIndexName); sIndexName = sAccName; sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 3")); aLbField3.SetAccessibleName(sIndexName); sAccName = String(ScResId(RID_FILTER_CONDITION)); sIndexName = sAccName; sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 1")); aLbCond1.SetAccessibleName(sIndexName); sIndexName = sAccName; sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 2")); aLbCond2.SetAccessibleName(sIndexName); sIndexName = sAccName; sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 3")); aLbCond3.SetAccessibleName(sIndexName); sAccName = String(ScResId(RID_FILTER_VALUE)); sIndexName = sAccName; sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 1")); aEdVal1.SetAccessibleName(sIndexName); sIndexName = sAccName; sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 2")); aEdVal2.SetAccessibleName(sIndexName); sIndexName = sAccName; sIndexName.AppendAscii (RTL_CONSTASCII_STRINGPARAM (" 3")); aEdVal3.SetAccessibleName(sIndexName); aLbCopyArea.SetAccessibleName(ScResId(STR_COPY_AREA_TO)); aEdCopyArea.SetAccessibleName(ScResId(STR_COPY_AREA_TO)); aLbCopyArea.SetAccessibleRelationLabeledBy(&aBtnCopyResult); aEdCopyArea.SetAccessibleRelationLabeledBy(&aBtnCopyResult); aLbConnect1.SetAccessibleRelationLabeledBy(&aFtConnect); aLbConnect2.SetAccessibleRelationLabeledBy(&aFtConnect); aLbField1.SetAccessibleRelationLabeledBy(&aFtField); aLbField2.SetAccessibleRelationLabeledBy(&aFtField); aLbField3.SetAccessibleRelationLabeledBy(&aFtField); aLbCond1.SetAccessibleRelationLabeledBy(&aFtCond); aLbCond2.SetAccessibleRelationLabeledBy(&aFtCond); aLbCond3.SetAccessibleRelationLabeledBy(&aFtCond); aEdVal1.SetAccessibleRelationLabeledBy(&aFtVal); aEdVal2.SetAccessibleRelationLabeledBy(&aFtVal); aEdVal3.SetAccessibleRelationLabeledBy(&aFtVal); } //---------------------------------------------------------------------------- __EXPORT ScFilterDlg::~ScFilterDlg() { for (sal_uInt16 i=0; i<=MAXCOL; i++) delete pEntryLists[i]; delete pOptionsMgr; delete pOutItem; // Hack: RefInput-Kontrolle pTimer->Stop(); delete pTimer; } //---------------------------------------------------------------------------- void __EXPORT ScFilterDlg::Init( const SfxItemSet& rArgSet ) { const ScQueryItem& rQueryItem = (const ScQueryItem&) rArgSet.Get( nWhichQuery ); aBtnOk.SetClickHdl ( LINK( this, ScFilterDlg, EndDlgHdl ) ); aBtnCancel.SetClickHdl ( LINK( this, ScFilterDlg, EndDlgHdl ) ); aBtnMore.SetClickHdl ( LINK( this, ScFilterDlg, MoreClickHdl ) ); aBtnHeader.SetClickHdl ( LINK( this, ScFilterDlg, CheckBoxHdl ) ); aBtnCase.SetClickHdl ( LINK( this, ScFilterDlg, CheckBoxHdl ) ); // aLbField1.SetSelectHdl ( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbField2.SetSelectHdl ( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbField3.SetSelectHdl ( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbField4.SetSelectHdl ( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbConnect1.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbConnect2.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbConnect3.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbConnect4.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbCond1.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbCond2.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbCond3.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) ); aLbCond4.SetSelectHdl( LINK( this, ScFilterDlg, LbSelectHdl ) ); pViewData = rQueryItem.GetViewData(); pDoc = pViewData ? pViewData->GetDocument() : NULL; nSrcTab = pViewData ? pViewData->GetTabNo() : static_cast(0); // fuer leichteren Zugriff: aFieldLbArr [0] = &aLbField1; aFieldLbArr [1] = &aLbField2; aFieldLbArr [2] = &aLbField3; aFieldLbArr [3] = &aLbField4; aValueEdArr [0] = &aEdVal1; aValueEdArr [1] = &aEdVal2; aValueEdArr [2] = &aEdVal3; aValueEdArr [3] = &aEdVal4; aCondLbArr [0] = &aLbCond1; aCondLbArr [1] = &aLbCond2; aCondLbArr [2] = &aLbCond3; aCondLbArr [3] = &aLbCond4; aConnLbArr [0] = &aLbConnect1; aConnLbArr [1] = &aLbConnect2; aConnLbArr [2] = &aLbConnect3; aConnLbArr [3] = &aLbConnect4; // Optionen initialisieren lassen: pOptionsMgr = new ScFilterOptionsMgr( this, pViewData, theQueryData, aBtnMore, aBtnCase, aBtnRegExp, aBtnHeader, aBtnUnique, aBtnCopyResult, aBtnDestPers, aLbCopyArea, aEdCopyArea, aRbCopyArea, aFtDbAreaLabel, aFtDbArea, aFlOptions, aStrNoName, aStrUndefined ); // Feldlisten einlesen und Eintraege selektieren: FillFieldLists(); for ( SCSIZE i=0; i<4; i++ ) { String aValStr; sal_uInt16 nCondPos = 0; sal_uInt16 nFieldSelPos = 0; ScQueryEntry& rEntry = theQueryData.GetEntry(i); if ( rEntry.bDoQuery ) { nCondPos = (sal_uInt16)rEntry.eOp; nFieldSelPos = GetFieldSelPos( static_cast(rEntry.nField) ); if ( rEntry.nVal == SC_EMPTYFIELDS && !rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING ) { aValStr = aStrEmpty; aCondLbArr[i]->Disable(); } else if ( rEntry.nVal == SC_NONEMPTYFIELDS && !rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING ) { aValStr = aStrNotEmpty; aCondLbArr[i]->Disable(); } else aValStr = *rEntry.pStr; } else if ( i == 0 ) { nFieldSelPos = GetFieldSelPos( pViewData->GetCurX() ); rEntry.nField = nFieldSelPos ? (theQueryData.nCol1 + static_cast(nFieldSelPos) - 1) : static_cast(0); rEntry.bDoQuery=sal_True; bRefreshExceptQuery[i]=sal_True; } aFieldLbArr[i]->SelectEntryPos( nFieldSelPos ); aCondLbArr [i]->SelectEntryPos( nCondPos ); aValueEdArr[i]->SetText( aValStr ); aValueEdArr[i]->SetModifyHdl( LINK( this, ScFilterDlg, ValModifyHdl ) ); UpdateValueList( static_cast(i+1) ); } aScrollBar.SetEndScrollHdl( LINK( this, ScFilterDlg, ScrollHdl ) ); aScrollBar.SetScrollHdl( LINK( this, ScFilterDlg, ScrollHdl ) ); aScrollBar.SetRange( Range( 0, 4 ) ); aScrollBar.SetLineSize( 1 ); aLbConnect1.Hide(); // Disable/Enable Logik: (aLbField1.GetSelectEntryPos() != 0) && (aLbField2.GetSelectEntryPos() != 0) ? aLbConnect2.SelectEntryPos( (sal_uInt16)theQueryData.GetEntry(1).eConnect ) : aLbConnect2.SetNoSelection(); (aLbField2.GetSelectEntryPos() != 0) && (aLbField3.GetSelectEntryPos() != 0) ? aLbConnect3.SelectEntryPos( (sal_uInt16)theQueryData.GetEntry(2).eConnect ) : aLbConnect3.SetNoSelection(); (aLbField3.GetSelectEntryPos() != 0) && (aLbField4.GetSelectEntryPos() != 0) ? aLbConnect4.SelectEntryPos( (sal_uInt16)theQueryData.GetEntry(3).eConnect ) : aLbConnect4.SetNoSelection(); if ( aLbField1.GetSelectEntryPos() == 0 ) { aLbConnect2.Disable(); aLbField2.Disable(); aLbCond2.Disable(); aEdVal2.Disable(); } else if ( aLbConnect2.GetSelectEntryCount() == 0 ) { aLbField2.Disable(); aLbCond2.Disable(); aEdVal2.Disable(); } if ( aLbField2.GetSelectEntryPos() == 0 ) { aLbConnect3.Disable(); aLbField3.Disable(); aLbCond3.Disable(); aEdVal3.Disable(); } else if ( aLbConnect3.GetSelectEntryCount() == 0 ) { aLbField3.Disable(); aLbCond3.Disable(); aEdVal3.Disable(); } if ( aLbField3.GetSelectEntryPos() == 0 ) { aLbConnect4.Disable(); aLbField4.Disable(); aLbCond4.Disable(); aEdVal4.Disable(); } else if ( aLbConnect4.GetSelectEntryCount() == 0 ) { aLbField4.Disable(); aLbCond4.Disable(); aEdVal4.Disable(); } if(pDoc!=NULL && pDoc->GetChangeTrack()!=NULL) aBtnCopyResult.Disable(); // Modal-Modus einschalten // SetDispatcherLock( sal_True ); //@BugID 54702 Enablen/Disablen nur noch in Basisklasse // SFX_APPWINDOW->Disable(sal_False); //! allgemeine Methode im ScAnyRefDlg } //---------------------------------------------------------------------------- sal_Bool __EXPORT ScFilterDlg::Close() { if (pViewData) pViewData->GetDocShell()->CancelAutoDBRange(); return DoClose( ScFilterDlgWrapper::GetChildWindowId() ); } //---------------------------------------------------------------------------- // Uebergabe eines mit der Maus selektierten Tabellenbereiches, der dann als // neue Selektion im Referenz-Edit angezeigt wird. void ScFilterDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) { if ( bRefInputMode ) // Nur moeglich, wenn im Referenz-Editmodus { if ( rRef.aStart != rRef.aEnd ) RefInputStart( &aEdCopyArea ); String aRefStr; rRef.aStart.Format( aRefStr, SCA_ABS_3D, pDocP, pDocP->GetAddressConvention() ); aEdCopyArea.SetRefString( aRefStr ); } } //---------------------------------------------------------------------------- void ScFilterDlg::SetActive() { if ( bRefInputMode ) { aEdCopyArea.GrabFocus(); if ( aEdCopyArea.GetModifyHdl().IsSet() ) ((Link&)aEdCopyArea.GetModifyHdl()).Call( &aEdCopyArea ); } else GrabFocus(); RefInputDone(); } //---------------------------------------------------------------------------- void ScFilterDlg::FillFieldLists() { aLbField1.Clear(); aLbField2.Clear(); aLbField3.Clear(); aLbField4.Clear(); aLbField1.InsertEntry( aStrNone, 0 ); aLbField2.InsertEntry( aStrNone, 0 ); aLbField3.InsertEntry( aStrNone, 0 ); aLbField4.InsertEntry( aStrNone, 0 ); if ( pDoc ) { String aFieldName; SCTAB nTab = nSrcTab; SCCOL nFirstCol = theQueryData.nCol1; SCROW nFirstRow = theQueryData.nRow1; SCCOL nMaxCol = theQueryData.nCol2; SCCOL col = 0; sal_uInt16 i=1; for ( col=nFirstCol; col<=nMaxCol; col++ ) { pDoc->GetString( col, nFirstRow, nTab, aFieldName ); if ( !aBtnHeader.IsChecked() || (aFieldName.Len() == 0) ) { aFieldName = aStrColumn; aFieldName += ' '; aFieldName += ScColToAlpha( col ); } aLbField1.InsertEntry( aFieldName, i ); aLbField2.InsertEntry( aFieldName, i ); aLbField3.InsertEntry( aFieldName, i ); aLbField4.InsertEntry( aFieldName, i ); i++; } nFieldCount = i; } } //---------------------------------------------------------------------------- void ScFilterDlg::UpdateValueList( sal_uInt16 nList ) { if ( pDoc && nList>0 && nList<=4 ) { ComboBox* pValList = aValueEdArr[nList-1]; sal_uInt16 nFieldSelPos = aFieldLbArr[nList-1]->GetSelectEntryPos(); sal_uInt16 nListPos = 0; String aCurValue = pValList->GetText(); pValList->Clear(); pValList->InsertEntry( aStrNotEmpty, 0 ); pValList->InsertEntry( aStrEmpty, 1 ); nListPos = 2; if ( nFieldSelPos ) { WaitObject aWaiter( this ); // auch wenn nur die ListBox gefuellt wird SCCOL nColumn = theQueryData.nCol1 + static_cast(nFieldSelPos) - 1; if (!pEntryLists[nColumn]) { sal_uInt16 nOffset = GetSliderPos(); SCTAB nTab = nSrcTab; SCROW nFirstRow = theQueryData.nRow1; SCROW nLastRow = theQueryData.nRow2; mbHasDates[nOffset+nList-1] = false; // erstmal ohne die erste Zeile pEntryLists[nColumn] = new TypedScStrCollection( 128, 128 ); pEntryLists[nColumn]->SetCaseSensitive( aBtnCase.IsChecked() ); pDoc->GetFilterEntriesArea( nColumn, nFirstRow+1, nLastRow, nTab, *pEntryLists[nColumn], mbHasDates[nOffset+nList-1] ); // Eintrag fuer die erste Zeile //! Eintrag (pHdrEntry) ohne Collection erzeugen? nHeaderPos[nColumn] = USHRT_MAX; TypedScStrCollection aHdrColl( 1, 1 ); bool bDummy = false; pDoc->GetFilterEntriesArea( nColumn, nFirstRow, nFirstRow, nTab, aHdrColl, bDummy ); TypedStrData* pHdrEntry = aHdrColl[0]; if ( pHdrEntry ) { TypedStrData* pNewEntry = new TypedStrData(*pHdrEntry); if ( pEntryLists[nColumn]->Insert( pNewEntry ) ) { nHeaderPos[nColumn] = pEntryLists[nColumn]->IndexOf( pNewEntry ); DBG_ASSERT( nHeaderPos[nColumn] != USHRT_MAX, "Header-Eintrag nicht wiedergefunden" ); } else delete pNewEntry; // war schon drin } } TypedScStrCollection* pColl = pEntryLists[nColumn]; sal_uInt16 nValueCount = pColl->GetCount(); if ( nValueCount > 0 ) { for ( sal_uInt16 i=0; iInsertEntry( (*pColl)[i]->GetString(), nListPos ); nListPos++; } } } pValList->SetText( aCurValue ); } UpdateHdrInValueList( nList ); } void ScFilterDlg::UpdateHdrInValueList( sal_uInt16 nList ) { //! GetText / SetText ?? if ( pDoc && nList>0 && nList<=4 ) { sal_uInt16 nFieldSelPos = aFieldLbArr[nList-1]->GetSelectEntryPos(); if ( nFieldSelPos ) { SCCOL nColumn = theQueryData.nCol1 + static_cast(nFieldSelPos) - 1; if ( pEntryLists[nColumn] ) { sal_uInt16 nPos = nHeaderPos[nColumn]; if ( nPos != USHRT_MAX ) { ComboBox* pValList = aValueEdArr[nList-1]; sal_uInt16 nListPos = nPos + 2; // nach "leer" und "nicht leer" TypedStrData* pHdrEntry = (*pEntryLists[nColumn])[nPos]; if ( pHdrEntry ) { String aHdrStr = pHdrEntry->GetString(); sal_Bool bWasThere = ( pValList->GetEntry(nListPos) == aHdrStr ); sal_Bool bInclude = !aBtnHeader.IsChecked(); if (bInclude) // Eintrag aufnehmen { if (!bWasThere) pValList->InsertEntry(aHdrStr, nListPos); } else // Eintrag weglassen { if (bWasThere) pValList->RemoveEntry(nListPos); } } else { DBG_ERROR("Eintag in Liste nicht gefunden"); } } } else { DBG_ERROR("Spalte noch nicht initialisiert"); } } } } //---------------------------------------------------------------------------- void ScFilterDlg::ClearValueList( sal_uInt16 nList ) { if ( nList>0 && nList<=4 ) { ComboBox* pValList = aValueEdArr[nList-1]; pValList->Clear(); pValList->InsertEntry( aStrNotEmpty, 0 ); pValList->InsertEntry( aStrEmpty, 1 ); pValList->SetText( EMPTY_STRING ); } } //---------------------------------------------------------------------------- sal_uInt16 ScFilterDlg::GetFieldSelPos( SCCOL nField ) { if ( nField >= theQueryData.nCol1 && nField <= theQueryData.nCol2 ) return static_cast(nField - theQueryData.nCol1 + 1); else return 0; } //---------------------------------------------------------------------------- ScQueryItem* ScFilterDlg::GetOutputItem() { ScAddress theCopyPos; ScQueryParam theParam( theQueryData ); sal_Bool bCopyPosOk = sal_False; if ( aBtnCopyResult.IsChecked() ) { String theCopyStr( aEdCopyArea.GetText() ); xub_StrLen nColonPos = theCopyStr.Search( ':' ); if ( STRING_NOTFOUND != nColonPos ) theCopyStr.Erase( nColonPos ); sal_uInt16 nResult = theCopyPos.Parse( theCopyStr, pDoc, pDoc->GetAddressConvention() ); bCopyPosOk = ( SCA_VALID == (nResult & SCA_VALID) ); } if ( aBtnCopyResult.IsChecked() && bCopyPosOk ) { theParam.bInplace = sal_False; theParam.nDestTab = theCopyPos.Tab(); theParam.nDestCol = theCopyPos.Col(); theParam.nDestRow = theCopyPos.Row(); } else { theParam.bInplace = sal_True; theParam.nDestTab = 0; theParam.nDestCol = 0; theParam.nDestRow = 0; } theParam.bHasHeader = aBtnHeader.IsChecked(); theParam.bByRow = sal_True; theParam.bDuplicate = !aBtnUnique.IsChecked(); theParam.bCaseSens = aBtnCase.IsChecked(); theParam.bRegExp = aBtnRegExp.IsChecked(); theParam.bDestPers = aBtnDestPers.IsChecked(); // nur die drei eingestellten - alles andere zuruecksetzen DELETEZ( pOutItem ); pOutItem = new ScQueryItem( nWhichQuery, &theParam ); return pOutItem; } //---------------------------------------------------------------------------- sal_Bool ScFilterDlg::IsRefInputMode() const { return bRefInputMode; } //---------------------------------------------------------------------------- // Handler: // ======== IMPL_LINK( ScFilterDlg, EndDlgHdl, Button*, pBtn ) { if ( pBtn == &aBtnOk ) { sal_Bool bAreaInputOk = sal_True; if ( aBtnCopyResult.IsChecked() ) { if ( !pOptionsMgr->VerifyPosStr( aEdCopyArea.GetText() ) ) { if ( !aBtnMore.GetState() ) aBtnMore.SetState( sal_True ); ERRORBOX( STR_INVALID_TABREF ); aEdCopyArea.GrabFocus(); bAreaInputOk = sal_False; } } if ( bAreaInputOk ) { SetDispatcherLock( sal_False ); SwitchToDocument(); GetBindings().GetDispatcher()->Execute( FID_FILTER_OK, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, GetOutputItem(), 0L, 0L ); Close(); } } else if ( pBtn == &aBtnCancel ) { Close(); } return 0; } //---------------------------------------------------------------------------- IMPL_LINK( ScFilterDlg, MoreClickHdl, MoreButton*, EMPTYARG ) { if ( aBtnMore.GetState() ) pTimer->Start(); else { pTimer->Stop(); bRefInputMode = sal_False; //@BugID 54702 Enablen/Disablen nur noch in Basisklasse //SFX_APPWINDOW->Disable(sal_False); //! allgemeine Methode im ScAnyRefDlg } return 0; } //---------------------------------------------------------------------------- IMPL_LINK( ScFilterDlg, TimeOutHdl, Timer*, _pTimer ) { // alle 50ms nachschauen, ob RefInputMode noch stimmt if( _pTimer == pTimer && IsActive() ) bRefInputMode = (aEdCopyArea.HasFocus() || aRbCopyArea.HasFocus()); if ( aBtnMore.GetState() ) pTimer->Start(); return 0; } //---------------------------------------------------------------------------- IMPL_LINK( ScFilterDlg, LbSelectHdl, ListBox*, pLb ) { /* * Behandlung der Enable/Disable-Logik, * abhaengig davon, welche ListBox angefasst wurde: */ sal_uInt16 nOffset = GetSliderPos(); if ( pLb == &aLbConnect1 ) { aLbField1.Enable(); aLbCond1.Enable(); aEdVal1.Enable(); sal_uInt16 nConnect1 = aLbConnect1.GetSelectEntryPos(); sal_uInt16 nQE = nOffset; theQueryData.GetEntry(nQE).eConnect =(ScQueryConnect)nConnect1; bRefreshExceptQuery[nQE]=sal_True; } else if ( pLb == &aLbConnect2 ) { aLbField2.Enable(); aLbCond2.Enable(); aEdVal2.Enable(); sal_uInt16 nConnect2 = aLbConnect2.GetSelectEntryPos(); sal_uInt16 nQE = 1+nOffset; theQueryData.GetEntry(nQE).eConnect =(ScQueryConnect)nConnect2; bRefreshExceptQuery[nQE]=sal_True; } else if ( pLb == &aLbConnect3 ) { aLbField3.Enable(); aLbCond3.Enable(); aEdVal3.Enable(); sal_uInt16 nConnect3 = aLbConnect3.GetSelectEntryPos(); sal_uInt16 nQE = 2+nOffset; theQueryData.GetEntry(nQE).eConnect = (ScQueryConnect)nConnect3; bRefreshExceptQuery[nQE]=sal_True; } else if ( pLb == &aLbConnect4 ) { aLbField4.Enable(); aLbCond4.Enable(); aEdVal4.Enable(); sal_uInt16 nConnect4 = aLbConnect4.GetSelectEntryPos(); sal_uInt16 nQE = 3+nOffset; theQueryData.GetEntry(nQE).eConnect = (ScQueryConnect)nConnect4; bRefreshExceptQuery[nQE]=sal_True; } else if ( pLb == &aLbField1 ) { if ( aLbField1.GetSelectEntryPos() == 0 ) { aLbConnect2.SetNoSelection(); aLbConnect3.SetNoSelection(); aLbConnect4.SetNoSelection(); aLbField2.SelectEntryPos( 0 ); aLbField3.SelectEntryPos( 0 ); aLbField4.SelectEntryPos( 0 ); aLbCond2.SelectEntryPos( 0 ); aLbCond3.SelectEntryPos( 0 ); aLbCond4.SelectEntryPos( 0 ); ClearValueList( 1 ); ClearValueList( 2 ); ClearValueList( 3 ); ClearValueList( 4 ); aLbConnect2.Disable(); aLbConnect3.Disable(); aLbConnect4.Disable(); aLbField2.Disable(); aLbField3.Disable(); aLbField4.Disable(); aLbCond2.Disable(); aLbCond3.Disable(); aLbCond4.Disable(); aEdVal2.Disable(); aEdVal3.Disable(); aEdVal4.Disable(); for (sal_uInt16 i= nOffset; i< MAXQUERY; i++) { theQueryData.GetEntry(i).bDoQuery = sal_False; bRefreshExceptQuery[i]=sal_False; theQueryData.GetEntry(i).nField = static_cast(0); } bRefreshExceptQuery[nOffset] =sal_True; } else { UpdateValueList( 1 ); if ( !aLbConnect2.IsEnabled() ) { aLbConnect2.Enable(); } theQueryData.GetEntry(nOffset).bDoQuery = sal_True; sal_uInt16 nField = pLb->GetSelectEntryPos(); theQueryData.GetEntry(nOffset).nField = theQueryData.nCol1 + static_cast(nField) - 1 ; } } else if ( pLb == &aLbField2 ) { if ( aLbField2.GetSelectEntryPos() == 0 ) { aLbConnect3.SetNoSelection(); aLbConnect4.SetNoSelection(); aLbField3.SelectEntryPos( 0 ); aLbField4.SelectEntryPos( 0 ); aLbCond3.SelectEntryPos( 0 ); aLbCond4.SelectEntryPos( 0 ); ClearValueList( 2 ); ClearValueList( 3 ); ClearValueList( 4 ); aLbConnect3.Disable(); aLbConnect4.Disable(); aLbField3.Disable(); aLbField4.Disable(); aLbCond3.Disable(); aLbCond4.Disable(); aEdVal3.Disable(); aEdVal4.Disable(); sal_uInt16 nTemp=nOffset+1; for (sal_uInt16 i= nTemp; i< MAXQUERY; i++) { theQueryData.GetEntry(i).bDoQuery = sal_False; bRefreshExceptQuery[i]=sal_False; theQueryData.GetEntry(i).nField = static_cast(0); } bRefreshExceptQuery[nTemp]=sal_True; } else { UpdateValueList( 2 ); if ( !aLbConnect3.IsEnabled() ) { aLbConnect3.Enable(); } sal_uInt16 nField = pLb->GetSelectEntryPos(); sal_uInt16 nQ=1+nOffset; theQueryData.GetEntry(nQ).bDoQuery = sal_True; theQueryData.GetEntry(nQ).nField = theQueryData.nCol1 + static_cast(nField) - 1 ; } } else if ( pLb == &aLbField3 ) { if ( aLbField3.GetSelectEntryPos() == 0 ) { aLbConnect4.SetNoSelection(); aLbField4.SelectEntryPos( 0 ); aLbCond4.SelectEntryPos( 0 ); ClearValueList( 3 ); ClearValueList( 4 ); aLbConnect4.Disable(); aLbField4.Disable(); aLbCond4.Disable(); aEdVal4.Disable(); sal_uInt16 nTemp=nOffset+2; for (sal_uInt16 i= nTemp; i< MAXQUERY; i++) { theQueryData.GetEntry(i).bDoQuery = sal_False; bRefreshExceptQuery[i]=sal_False; theQueryData.GetEntry(i).nField = static_cast(0); } bRefreshExceptQuery[nTemp]=sal_True; } else { UpdateValueList( 3 ); if ( !aLbConnect4.IsEnabled() ) { aLbConnect4.Enable(); } sal_uInt16 nField = pLb->GetSelectEntryPos(); sal_uInt16 nQ=2+nOffset; theQueryData.GetEntry(nQ).bDoQuery = sal_True; theQueryData.GetEntry(nQ).nField = theQueryData.nCol1 + static_cast(nField) - 1 ; } } else if ( pLb == &aLbField4 ) { if ( aLbField4.GetSelectEntryPos() == 0 ) { ClearValueList( 4 ); sal_uInt16 nTemp=nOffset+3; for (sal_uInt16 i= nTemp; i< MAXQUERY; i++) { theQueryData.GetEntry(i).bDoQuery = sal_False; bRefreshExceptQuery[i]=sal_False; theQueryData.GetEntry(i).nField = static_cast(0); } bRefreshExceptQuery[nTemp]=sal_True; } else { UpdateValueList( 4 ); sal_uInt16 nField = pLb->GetSelectEntryPos(); sal_uInt16 nQ=3+nOffset; theQueryData.GetEntry(nQ).bDoQuery = sal_True; theQueryData.GetEntry(nQ).nField = theQueryData.nCol1 + static_cast(nField) - 1 ; } } else if ( pLb == &aLbCond1) { theQueryData.GetEntry(nOffset).eOp=(ScQueryOp)pLb->GetSelectEntryPos(); } else if ( pLb == &aLbCond2) { sal_uInt16 nQ=1+nOffset; theQueryData.GetEntry(nQ).eOp=(ScQueryOp)pLb->GetSelectEntryPos(); } else if ( pLb == &aLbCond3) { sal_uInt16 nQ=2+nOffset; theQueryData.GetEntry(nQ).eOp=(ScQueryOp)pLb->GetSelectEntryPos(); } else { sal_uInt16 nQ=3+nOffset; theQueryData.GetEntry(nQ).eOp=(ScQueryOp)pLb->GetSelectEntryPos(); } return 0; } //---------------------------------------------------------------------------- IMPL_LINK( ScFilterDlg, CheckBoxHdl, CheckBox*, pBox ) { // Spaltenkoepfe: // FeldListen: Spaltexx <-> Spaltenkopf-String // WertListen: Spaltenkopf-Wert entfaellt. // Gross-/Kleinschreibung: // WertListen: komplett neu if ( pBox == &aBtnHeader ) // Feldlisten und Wertlisten { sal_uInt16 nCurSel1 = aLbField1.GetSelectEntryPos(); sal_uInt16 nCurSel2 = aLbField2.GetSelectEntryPos(); sal_uInt16 nCurSel3 = aLbField3.GetSelectEntryPos(); sal_uInt16 nCurSel4 = aLbField4.GetSelectEntryPos(); FillFieldLists(); aLbField1.SelectEntryPos( nCurSel1 ); aLbField2.SelectEntryPos( nCurSel2 ); aLbField3.SelectEntryPos( nCurSel3 ); aLbField4.SelectEntryPos( nCurSel4 ); UpdateHdrInValueList( 1 ); UpdateHdrInValueList( 2 ); UpdateHdrInValueList( 3 ); UpdateHdrInValueList( 4 ); } if ( pBox == &aBtnCase ) // Wertlisten komplett { for (sal_uInt16 i=0; i<=MAXCOL; i++) DELETEZ( pEntryLists[i] ); UpdateValueList( 1 ); // aktueller Text wird gemerkt UpdateValueList( 2 ); UpdateValueList( 3 ); UpdateValueList( 4 ); } return 0; } //---------------------------------------------------------------------------- IMPL_LINK( ScFilterDlg, ValModifyHdl, ComboBox*, pEd ) { sal_uInt16 nOffset = GetSliderPos(); sal_uInt16 i=0; sal_uInt16 nQE =i + nOffset; if ( pEd ) { String aStrVal = pEd->GetText(); ListBox* pLbCond = &aLbCond1; ListBox* pLbField = &aLbField1; if ( pEd == &aEdVal2 ) { pLbCond = &aLbCond2; pLbField = &aLbField2; i=1; nQE=i+nOffset; } if ( pEd == &aEdVal3 ) { pLbCond = &aLbCond3; pLbField = &aLbField3; i=2; nQE=i+nOffset; } if ( pEd == &aEdVal4 ) { pLbCond = &aLbCond4; pLbField = &aLbField4; i=3; nQE=i+nOffset; } if ( aStrEmpty == aStrVal || aStrNotEmpty == aStrVal ) { pLbCond->SelectEntry( '=' ); pLbCond->Disable(); } else pLbCond->Enable(); ScQueryEntry& rEntry = theQueryData.GetEntry( nQE ); sal_Bool bDoThis = (pLbField->GetSelectEntryPos() != 0); rEntry.bDoQuery = bDoThis; if ( rEntry.bDoQuery || bRefreshExceptQuery[nQE] ) { if ( aStrVal == aStrEmpty ) { rEntry.pStr->Erase(); rEntry.nVal = SC_EMPTYFIELDS; rEntry.bQueryByString = sal_False; } else if ( aStrVal == aStrNotEmpty ) { rEntry.pStr->Erase(); rEntry.nVal = SC_NONEMPTYFIELDS; rEntry.bQueryByString = sal_False; } else { *rEntry.pStr = aStrVal; rEntry.nVal = 0; rEntry.bQueryByString = sal_True; } sal_uInt16 nField = pLbField->GetSelectEntryPos(); rEntry.nField = nField ? (theQueryData.nCol1 + static_cast(nField) - 1) : static_cast(0); ScQueryOp eOp = (ScQueryOp)pLbCond->GetSelectEntryPos(); rEntry.eOp = eOp; rEntry.bQueryByDate = mbHasDates[nQE]; } } return 0; } //---------------------------------------------------------------------------- IMPL_LINK( ScFilterDlg, ScrollHdl, ScrollBar*, EMPTYARG ) { SliderMoved(); return 0; } void ScFilterDlg::SliderMoved() { sal_uInt16 nOffset = GetSliderPos(); RefreshEditRow( nOffset); } sal_uInt16 ScFilterDlg::GetSliderPos() { return (sal_uInt16) aScrollBar.GetThumbPos(); } void ScFilterDlg::RefreshEditRow( sal_uInt16 nOffset ) { if (nOffset==0) aConnLbArr[0]->Hide(); else aConnLbArr[0]->Show(); for ( sal_uInt16 i=0; i<4; i++ ) { String aValStr; sal_uInt16 nCondPos = 0; sal_uInt16 nFieldSelPos = 0; sal_uInt16 nQE = i+nOffset; ScQueryEntry& rEntry = theQueryData.GetEntry( nQE); if ( rEntry.bDoQuery || bRefreshExceptQuery[nQE] ) { nCondPos = (sal_uInt16)rEntry.eOp; if(rEntry.bDoQuery) nFieldSelPos = GetFieldSelPos( static_cast(rEntry.nField) ); if ( rEntry.nVal == SC_EMPTYFIELDS && !rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING ) { aValStr = aStrEmpty; aCondLbArr[i]->Disable(); } else if ( rEntry.nVal == SC_NONEMPTYFIELDS && !rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING ) { aValStr = aStrNotEmpty; aCondLbArr[i]->Disable(); } else { aValStr = *rEntry.pStr; aCondLbArr[i]->Enable(); } aFieldLbArr[i]->Enable(); aValueEdArr[i]->Enable(); if (nOffset==0) { if (i<3) { if(rEntry.bDoQuery) aConnLbArr[i+1]->Enable(); else aConnLbArr[i+1]->Disable(); sal_uInt16 nQENext = nQE+1; if(theQueryData.GetEntry(nQENext).bDoQuery || bRefreshExceptQuery[nQENext]) aConnLbArr[i+1]->SelectEntryPos( (sal_uInt16) theQueryData.GetEntry(nQENext).eConnect ); else aConnLbArr[i+1]->SetNoSelection(); } } else { if(theQueryData.GetEntry( nQE-1).bDoQuery) aConnLbArr[i]->Enable(); else aConnLbArr[i]->Disable(); if(rEntry.bDoQuery || bRefreshExceptQuery[nQE]) aConnLbArr[i]->SelectEntryPos( (sal_uInt16) rEntry.eConnect ); else aConnLbArr[i]->SetNoSelection(); } } else { if (nOffset==0) { if(i<3) { aConnLbArr[i+1]->SetNoSelection(); aConnLbArr[i+1]->Disable(); } } else { if(theQueryData.GetEntry( nQE-1).bDoQuery) aConnLbArr[i]->Enable(); else aConnLbArr[i]->Disable(); aConnLbArr[i]->SetNoSelection(); } aFieldLbArr[i]->Disable(); aCondLbArr[i]->Disable(); aValueEdArr[i]->Disable(); } aFieldLbArr[i]->SelectEntryPos( nFieldSelPos ); aCondLbArr [i]->SelectEntryPos( nCondPos ); aValueEdArr[i]->SetText( aValStr ); UpdateValueList( static_cast(i+1) ); } }