--- sc.clean/source/ui/dbgui/fieldwnd.cxx 2008-02-05 11:16:56.000000000 -0500 +++ sc.clean/source/ui/dbgui/fieldwnd.cxx 2008-02-13 12:26:03.000000000 -0500 @@ -644,7 +644,7 @@ void ScDPFieldWindow::DelField( size_t n void ScDPFieldWindow::ClearFields() { - if( eType == TYPE_SELECT ) + if( eType == TYPE_SELECT || eType == TYPE_PAGE || eType == TYPE_COL || eType == TYPE_ROW || eType == TYPE_DATA) { com::sun::star::uno::Reference < com::sun::star::accessibility::XAccessible > xTempAcc = xAccessible; if (!xTempAcc.is() && pAccessible) --- sc.clean/source/ui/dbgui/pivot.hrc 2008-02-05 11:16:56.000000000 -0500 +++ sc.clean/source/ui/dbgui/pivot.hrc 2008-02-13 17:26:28.000000000 -0500 @@ -71,6 +71,10 @@ #define BTN_FILTER 29 #define BTN_DRILLDOWN 30 +#define FT_INAREA 40 +#define RB_INAREA 41 +#define ED_INAREA 42 + #define PIVOTSTR_SUM 1 #define PIVOTSTR_COUNT 2 #define PIVOTSTR_AVG 3 --- sc.clean/source/ui/dbgui/pivot.src 2008-02-05 11:16:56.000000000 -0500 +++ sc.clean/source/ui/dbgui/pivot.src 2008-02-14 09:52:45.000000000 -0500 @@ -163,7 +163,7 @@ ModelessDialog RID_SCDLG_PIVOT_LAYOUT Size = MAP_APPFONT ( 50 , 14 ) ; TabStop = TRUE ; MapUnit = MAP_APPFONT ; - Delta = 73 ; + Delta = 90 ; }; Window WND_FIELD { @@ -183,9 +183,50 @@ ModelessDialog RID_SCDLG_PIVOT_LAYOUT Text [ en-US ] = "Result" ; Hide = TRUE ; }; + + FixedText FT_INAREA + { + Pos = MAP_APPFONT ( 12 , 203 ) ; + Size = MAP_APPFONT ( 59 , 8 ) ; + Hide = TRUE ; + Text [ en-US ] = "Selection from" ; + Text[ de ] = "Auswahl aus"; + Text[ es ] = "Selección de"; + Text[ fr ] = "Sélection à partir de"; + Text[ it ] = "Seleziona da"; + Text[ ja ] = "選択元"; + Text[ pt-BR ] = "Seleção de "; + Text[ zh-CN ] = "选择范围"; + Text[ zh-TW ] = "選項來源"; + }; + Edit ED_INAREA + { + Border = TRUE ; + Pos = MAP_APPFONT ( 73 , 201 ) ; + Size = MAP_APPFONT ( 100 , 12 ) ; + TabStop = TRUE ; + Hide = TRUE ; + }; + ImageButton RB_INAREA + { + Pos = MAP_APPFONT ( 177 , 200 ) ; + Size = MAP_APPFONT ( 13 , 15 ) ; + TabStop = TRUE ; + Hide = TRUE ; + QuickHelpText [ de ] = "Verkleinern" ; + QuickHelpText [ en-US ] = "Shrink" ; + QuickHelpText[ es ] = "Reducir"; + QuickHelpText[ fr ] = "Comprimer"; + QuickHelpText[ it ] = "Comprimi"; + QuickHelpText[ ja ] = "縮小"; + QuickHelpText[ pt-BR ] = "Diminuir"; + QuickHelpText[ zh-CN ] = "收缩"; + QuickHelpText[ zh-TW ] = "縮小"; + }; + FixedText FT_OUTAREA { - Pos = MAP_APPFONT ( 12 , 203 ) ; + Pos = MAP_APPFONT ( 12 , 221 ) ; Size = MAP_APPFONT ( 59 , 8 ) ; Hide = TRUE ; Text [ en-US ] = "Results to" ; @@ -193,7 +234,7 @@ ModelessDialog RID_SCDLG_PIVOT_LAYOUT ListBox LB_OUTAREA { Border = TRUE ; - Pos = MAP_APPFONT ( 73 , 201 ) ; + Pos = MAP_APPFONT ( 73 , 219 ) ; Size = MAP_APPFONT ( 75 , 90 ) ; TabStop = TRUE ; DropDown = TRUE ; @@ -202,14 +243,14 @@ ModelessDialog RID_SCDLG_PIVOT_LAYOUT Edit ED_OUTAREA { Border = TRUE ; - Pos = MAP_APPFONT ( 152 , 201 ) ; + Pos = MAP_APPFONT ( 152 , 219 ) ; Size = MAP_APPFONT ( 100 , 12 ) ; TabStop = TRUE ; Hide = TRUE ; }; ImageButton RB_OUTAREA { - Pos = MAP_APPFONT ( 256 , 200 ) ; + Pos = MAP_APPFONT ( 256 , 218 ) ; Size = MAP_APPFONT ( 13 , 15 ) ; TabStop = TRUE ; Hide = TRUE ; @@ -217,7 +258,7 @@ ModelessDialog RID_SCDLG_PIVOT_LAYOUT }; CheckBox BTN_IGNEMPTYROWS { - Pos = MAP_APPFONT ( 12 , 219 ) ; + Pos = MAP_APPFONT ( 12 , 237 ) ; Size = MAP_APPFONT ( 124 , 10 ) ; TabStop = TRUE ; Hide = TRUE ; @@ -225,7 +266,7 @@ ModelessDialog RID_SCDLG_PIVOT_LAYOUT }; CheckBox BTN_DETECTCAT { - Pos = MAP_APPFONT ( 142 , 219 ) ; + Pos = MAP_APPFONT ( 142 , 237 ) ; Size = MAP_APPFONT ( 124 , 10 ) ; TabStop = TRUE ; Hide = TRUE ; @@ -233,7 +274,7 @@ ModelessDialog RID_SCDLG_PIVOT_LAYOUT }; CheckBox BTN_TOTALCOL { - Pos = MAP_APPFONT ( 12 , 233 ) ; + Pos = MAP_APPFONT ( 12 , 251 ) ; Size = MAP_APPFONT ( 124 , 10 ) ; TabStop = TRUE ; Hide = TRUE ; @@ -241,7 +282,7 @@ ModelessDialog RID_SCDLG_PIVOT_LAYOUT }; CheckBox BTN_TOTALROW { - Pos = MAP_APPFONT ( 142 , 233 ) ; + Pos = MAP_APPFONT ( 142 , 251 ) ; Size = MAP_APPFONT ( 124 , 10 ) ; TabStop = TRUE ; Hide = TRUE ; @@ -249,7 +290,7 @@ ModelessDialog RID_SCDLG_PIVOT_LAYOUT }; CheckBox BTN_FILTER { - Pos = MAP_APPFONT ( 12 , 247 ) ; + Pos = MAP_APPFONT ( 12 , 265 ) ; Size = MAP_APPFONT ( 124 , 10 ) ; TabStop = TRUE ; Hide = TRUE ; @@ -257,7 +298,7 @@ ModelessDialog RID_SCDLG_PIVOT_LAYOUT }; CheckBox BTN_DRILLDOWN { - Pos = MAP_APPFONT ( 142 , 247 ) ; + Pos = MAP_APPFONT ( 142 , 265 ) ; Size = MAP_APPFONT ( 124 , 10 ) ; TabStop = TRUE ; Hide = TRUE ; --- sc.clean/source/ui/dbgui/pvlaydlg.cxx 2008-02-05 11:16:56.000000000 -0500 +++ sc.clean/source/ui/dbgui/pvlaydlg.cxx 2008-02-14 17:14:03.000000000 -0500 @@ -41,6 +41,7 @@ //---------------------------------------------------------------------------- #include "pvlaydlg.hxx" +#include "dbdocfun.hxx" #include #include @@ -61,6 +62,7 @@ #include "pivot.hrc" #include "dpobject.hxx" #include "dpsave.hxx" +#include "dpshttab.hxx" #include "scmod.hxx" #include "sc.hrc" //CHINA001 @@ -125,6 +127,11 @@ ScDPLayoutDlg::ScDPLayoutDlg( SfxBinding aFtInfo ( this, ScResId( FT_INFO ) ), aFlAreas ( this, ScResId( FL_OUTPUT ) ), + + aFtInArea ( this, ScResId( FT_INAREA) ), + aEdInPos ( this, ScResId( ED_INAREA) ), + aRbInPos ( this, ScResId( RB_INAREA ), &aEdInPos ), + aLbOutPos ( this, ScResId( LB_OUTAREA ) ), aFtOutArea ( this, ScResId( FT_OUTAREA ) ), aEdOutPos ( this, ScResId( ED_OUTAREA ) ), @@ -148,6 +155,8 @@ ScDPLayoutDlg::ScDPLayoutDlg( SfxBinding bIsDrag ( FALSE ), + pEditActive ( NULL ), + eLastActiveType ( TYPE_SELECT ), nOffset ( 0 ), // @@ -209,6 +218,10 @@ void __EXPORT ScDPLayoutDlg::Init() for ( USHORT i = 0; i < FUNC_COUNT; ++i ) aFuncNameArr.push_back( String( ScResId( i + 1 ) ) ); + aBtnMore.AddWindow( &aFlAreas ); + aBtnMore.AddWindow( &aFtInArea ); + aBtnMore.AddWindow( &aEdInPos ); + aBtnMore.AddWindow( &aRbInPos ); aBtnMore.AddWindow( &aFtOutArea ); aBtnMore.AddWindow( &aLbOutPos ); aBtnMore.AddWindow( &aEdOutPos ); @@ -219,7 +232,6 @@ void __EXPORT ScDPLayoutDlg::Init() aBtnMore.AddWindow( &aBtnTotalRow ); aBtnMore.AddWindow( &aBtnFilter ); aBtnMore.AddWindow( &aBtnDrillDown ); - aBtnMore.AddWindow( &aFlAreas ); aBtnMore.SetClickHdl( LINK( this, ScDPLayoutDlg, MoreClickHdl ) ); { @@ -237,31 +249,35 @@ void __EXPORT ScDPLayoutDlg::Init() aRowArr.resize( MAX_FIELDS ); aDataArr.resize( MAX_FIELDS ); - InitWndSelect( thePivotData.ppLabelArr, static_cast(thePivotData.nLabels) ); - InitWnd( thePivotData.aPageArr, static_cast(thePivotData.nPageCount), TYPE_PAGE ); - InitWnd( thePivotData.aColArr, static_cast(thePivotData.nColCount), TYPE_COL ); - InitWnd( thePivotData.aRowArr, static_cast(thePivotData.nRowCount), TYPE_ROW ); - InitWnd( thePivotData.aDataArr, static_cast(thePivotData.nDataCount), TYPE_DATA ); - - aSlider.SetPageSize( PAGE_SIZE ); - aSlider.SetVisibleSize( PAGE_SIZE ); - aSlider.SetLineSize( LINE_SIZE ); - aSlider.SetRange( Range( 0, static_cast(((thePivotData.nLabels+LINE_SIZE-1)/LINE_SIZE)*LINE_SIZE) ) ); - - if ( thePivotData.nLabels > PAGE_SIZE ) - { - aSlider.SetEndScrollHdl( LINK( this, ScDPLayoutDlg, ScrollHdl ) ); - aSlider.Show(); - } - else - aSlider.Hide(); + ScRange inRange; + String inString; + if (xDlgDPObject->GetSheetDesc()) + { + aEdInPos.Enable(); + aRbInPos.Enable(); + aOldRange = xDlgDPObject->GetSheetDesc()->aSourceRange; + aOldRange.Format( inString, STD_FORMAT, pDoc); + aEdInPos.SetText(inString); + } + else + { + /* Data is not reachable, so could be a remote database */ + aEdInPos.Disable(); + aRbInPos.Disable(); + } - // Ein-/Ausgabebereiche: ---------------------------------------------- + InitFields(); aLbOutPos .SetSelectHdl( LINK( this, ScDPLayoutDlg, SelAreaHdl ) ); aEdOutPos .SetModifyHdl( LINK( this, ScDPLayoutDlg, EdModifyHdl ) ); + aEdInPos .SetModifyHdl( LINK( this, ScDPLayoutDlg, EdInModifyHdl ) ); aBtnOk .SetClickHdl ( LINK( this, ScDPLayoutDlg, OkHdl ) ); aBtnCancel.SetClickHdl ( LINK( this, ScDPLayoutDlg, CancelHdl ) ); + Link aLink = LINK( this, ScDPLayoutDlg, GetFocusHdl ); + if ( aEdInPos.IsEnabled() ) + // Once disabled it will never get enabled, so no need to handle focus. + aEdInPos.SetGetFocusHdl( aLink ); + aEdOutPos.SetGetFocusHdl( aLink ); if ( pViewData && pDoc ) { @@ -480,6 +496,27 @@ void ScDPLayoutDlg::InitFocus() aWndSelect.GrabFocus(); } +void ScDPLayoutDlg::InitFields() +{ + InitWndSelect( thePivotData.ppLabelArr, static_cast(thePivotData.nLabels) ); + InitWnd( thePivotData.aPageArr, static_cast(thePivotData.nPageCount), TYPE_PAGE ); + InitWnd( thePivotData.aColArr, static_cast(thePivotData.nColCount), TYPE_COL ); + InitWnd( thePivotData.aRowArr, static_cast(thePivotData.nRowCount), TYPE_ROW ); + InitWnd( thePivotData.aDataArr, static_cast(thePivotData.nDataCount), TYPE_DATA ); + + aSlider.SetPageSize( PAGE_SIZE ); + aSlider.SetVisibleSize( PAGE_SIZE ); + aSlider.SetLineSize( LINE_SIZE ); + aSlider.SetRange( Range( 0, static_cast(((thePivotData.nLabels+LINE_SIZE-1)/LINE_SIZE)*LINE_SIZE) ) ); + + if ( thePivotData.nLabels > PAGE_SIZE ) + { + aSlider.SetEndScrollHdl( LINK( this, ScDPLayoutDlg, ScrollHdl ) ); + aSlider.Show(); + } + else + aSlider.Hide(); +} //---------------------------------------------------------------------------- @@ -1314,23 +1351,79 @@ BOOL ScDPLayoutDlg::GetPivotArrays( P return bFit; } +void ScDPLayoutDlg::UpdateSrcRange() +{ + String theCurPosStr = aEdInPos.GetText(); + USHORT nResult = ScRange().Parse(theCurPosStr, pDoc); + + if ( SCA_VALID != (nResult & SCA_VALID) ) + // invalid source range. + return; + + ScRefAddress start, end; + ConvertDoubleRef(pDoc, theCurPosStr, 1, start, end); + ScRange aNewRange(start.GetAddress(), end.GetAddress()); + ScSheetSourceDesc inSheet = *xDlgDPObject->GetSheetDesc(); + + if (inSheet.aSourceRange == aNewRange) + // new range is identical to the current range. Nothing to do. + return; + + ScTabViewShell * pTabViewShell = pViewData->GetViewShell(); + inSheet.aSourceRange = aNewRange; + xDlgDPObject->SetSheetDesc(inSheet); + xDlgDPObject->InvalidateSource(); + xDlgDPObject->FillOldParam(thePivotData, true); + xDlgDPObject->FillLabelData(thePivotData); + + pTabViewShell->SetDialogDPObject(xDlgDPObject.get()); + aLabelDataArr.clear(); + aWndSelect.ClearFields(); + aWndData.ClearFields(); + aWndRow.ClearFields(); + aWndCol.ClearFields(); + aWndPage.ClearFields(); + + for (USHORT i = 0; i < MAX_LABELS; ++i) + aSelectArr[i].reset(); + + for (USHORT i = 0; i < MAX_FIELDS; ++i) + { + RemoveField(TYPE_COL, i); + RemoveField(TYPE_ROW, i); + RemoveField(TYPE_DATA, i); + } + + for (USHORT i = 0; i < MAX_PAGEFIELDS; ++i) + RemoveField(TYPE_PAGE, i); + + InitFields(); + + return; +} //---------------------------------------------------------------------------- void ScDPLayoutDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) { - if ( bRefInputMode ) - { - if ( rRef.aStart != rRef.aEnd ) - RefInputStart( &aEdOutPos ); -/* - ScAddress aAdr( nStartCol, nStartRow, nStartTab ); - aAdr.PutInOrder( ScAddress( nEndCol, nEndRow, nEndTab ) ); -*/ - String aRefStr; - rRef.aStart.Format( aRefStr, STD_FORMAT, pDocP ); - aEdOutPos.SetRefString( aRefStr ); - } + if ( !bRefInputMode || !pEditActive ) + return; + + if ( rRef.aStart != rRef.aEnd ) + RefInputStart( pEditActive ); + + if ( pEditActive == &aEdInPos ) + { + String aRefStr; + rRef.Format( aRefStr, STD_FORMAT, pDocP, pDocP->GetAddressConvention() ); + pEditActive->SetRefString( aRefStr ); + } + else if ( pEditActive == &aEdOutPos ) + { + String aRefStr; + rRef.aStart.Format( aRefStr, STD_FORMAT, pDocP, pDocP->GetAddressConvention() ); + pEditActive->SetRefString( aRefStr ); + } } @@ -1340,8 +1433,13 @@ void ScDPLayoutDlg::SetActive() { if ( bRefInputMode ) { - aEdOutPos.GrabFocus(); - EdModifyHdl( NULL ); + if ( pEditActive ) + pEditActive->GrabFocus(); + + if ( pEditActive == &aEdInPos ) + EdInModifyHdl( NULL ); + else if ( pEditActive == &aEdOutPos ) + EdModifyHdl( NULL ); } else { @@ -1497,12 +1595,17 @@ IMPL_LINK( ScDPLayoutDlg, OkHdl, OKButto //---------------------------------------------------------------------------- -IMPL_LINK_INLINE_START( ScDPLayoutDlg, CancelHdl, CancelButton *, EMPTYARG ) +IMPL_LINK( ScDPLayoutDlg, CancelHdl, CancelButton *, EMPTYARG ) { + ScSheetSourceDesc inSheet = *xDlgDPObject->GetSheetDesc(); + inSheet.aSourceRange = aOldRange; + xDlgDPObject->SetSheetDesc(inSheet); + xDlgDPObject->InvalidateSource(); + xDlgDPObject->FillOldParam(thePivotData, true); + xDlgDPObject->FillLabelData(thePivotData); Close(); return 0; } -IMPL_LINK_INLINE_END( ScDPLayoutDlg, CancelHdl, CancelButton *, EMPTYARG ) //---------------------------------------------------------------------------- @@ -1514,9 +1617,18 @@ IMPL_LINK( ScDPLayoutDlg, MoreClickHdl, bRefInputMode = TRUE; //@BugID 54702 Enablen/Disablen nur noch in Basisklasse //SFX_APPWINDOW->Enable(); - aEdOutPos.Enable(); - aEdOutPos.GrabFocus(); - aRbOutPos.Enable(); + if ( aEdInPos.IsEnabled() ) + { + aEdInPos.Enable(); + aEdInPos.GrabFocus(); + aEdInPos.Enable(); + } + else + { + aEdOutPos.Enable(); + aEdOutPos.GrabFocus(); + aEdOutPos.Enable(); + } } else { @@ -1557,6 +1669,13 @@ IMPL_LINK( ScDPLayoutDlg, EdModifyHdl, E } +IMPL_LINK( ScDPLayoutDlg, EdInModifyHdl, Edit *, EMPTYARG ) +{ + UpdateSrcRange(); + return 0; +} + + //---------------------------------------------------------------------------- IMPL_LINK( ScDPLayoutDlg, SelAreaHdl, ListBox *, EMPTYARG ) @@ -1610,4 +1729,16 @@ IMPL_LINK( ScDPLayoutDlg, ScrollHdl, Scr return 0; } +//---------------------------------------------------------------------------- + +IMPL_LINK( ScDPLayoutDlg, GetFocusHdl, Control*, pCtrl ) +{ + pEditActive = NULL; + if ( pCtrl == &aEdInPos ) + pEditActive = &aEdInPos; + else if ( pCtrl == &aEdOutPos ) + pEditActive = &aEdOutPos; + + return 0; +} --- sc.clean/source/ui/inc/pvlaydlg.hxx 2008-02-05 11:16:55.000000000 -0500 +++ sc.clean/source/ui/inc/pvlaydlg.hxx 2008-02-14 16:42:01.000000000 -0500 @@ -143,10 +143,18 @@ private: FixedInfo aFtInfo; FixedLine aFlAreas; + + // DP source selection + FixedText aFtInArea; + ScRefEdit aEdInPos; + ScRefButton aRbInPos; + + // DP output location ListBox aLbOutPos; FixedText aFtOutArea; ScRefEdit aEdOutPos; ScRefButton aRbOutPos; + CheckBox aBtnIgnEmptyRows; CheckBox aBtnDetectCat; CheckBox aBtnTotalCol; @@ -169,6 +177,8 @@ private: size_t nDnDFromIndex; BOOL bIsDrag; + ScRefEdit* pEditActive; + Rectangle aRectPage; Rectangle aRectRow; Rectangle aRectCol; @@ -187,6 +197,7 @@ private: ScDPFuncDataVec aDataArr; ScDPObjectPtr xDlgDPObject; + ScRange aOldRange; ScPivotParam thePivotData; ScViewData* pViewData; ScDocument* pDoc; @@ -198,6 +209,7 @@ private: void InitWndSelect ( LabelData** ppLabelArr, long nLabels ); void InitWnd ( PivotField* pArr, long nCount, ScDPFieldType eType ); void InitFocus (); + void InitFields (); void CalcWndSizes (); Point DlgPos2WndPos ( const Point& rPt, Window& rWnd ); ScDPLabelData* GetLabelData ( SCsCOL nCol, size_t* pPos = NULL ); @@ -221,14 +233,19 @@ private: USHORT& rColCount, USHORT& rRowCount, USHORT& rDataCount ); + + void UpdateSrcRange(); + // Handler DECL_LINK( ClickHdl, PushButton * ); DECL_LINK( ScrollHdl, ScrollBar * ); DECL_LINK( SelAreaHdl, ListBox * ); DECL_LINK( MoreClickHdl, MoreButton * ); DECL_LINK( EdModifyHdl, Edit * ); + DECL_LINK( EdInModifyHdl, Edit * ); DECL_LINK( OkHdl, OKButton * ); DECL_LINK( CancelHdl, CancelButton * ); + DECL_LINK( GetFocusHdl, Control* ); };