1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: pivotsh.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sc.hxx"
36 //------------------------------------------------------------------
38 #include "scitems.hxx"
39 #include <svx/srchitem.hxx>
40 #include <sfx2/app.hxx>
41 #include <sfx2/objface.hxx>
42 #include <sfx2/objsh.hxx>
43 #include <sfx2/request.hxx>
44 #include <svtools/whiter.hxx>
45 #include <vcl/msgbox.hxx>
48 #include "pivotsh.hxx"
49 #include "tabvwsh.hxx"
51 #include "scresid.hxx"
52 #include "document.hxx"
53 #include "dpobject.hxx"
54 #include "dpshttab.hxx"
55 #include "dbdocfun.hxx"
56 #include "uiitems.hxx"
57 //CHINA001 #include "pfiltdlg.hxx"
58 #include "scabstdlg.hxx" //CHINA001
60 #include "autoform.hxx"
61 #include "scuiautofmt.hxx"
62 #include "editable.hxx"
65 //------------------------------------------------------------------------
68 #include "scslots.hxx"
70 //------------------------------------------------------------------------
72 TYPEINIT1( ScPivotShell
, SfxShell
);
74 SFX_IMPL_INTERFACE(ScPivotShell
, SfxShell
, ScResId(SCSTR_PIVOTSHELL
))
76 SFX_POPUPMENU_REGISTRATION( ScResId(RID_POPUP_PIVOT
) );
80 //------------------------------------------------------------------------
82 ScPivotShell::ScPivotShell( ScTabViewShell
* pViewSh
) :
86 SetPool( &pViewSh
->GetPool() );
87 ScViewData
* pViewData
= pViewSh
->GetViewData();
88 SfxUndoManager
* pMgr
= pViewData
->GetSfxDocShell()->GetUndoManager();
89 SetUndoManager( pMgr
);
90 if ( !pViewData
->GetDocument()->IsUndoEnabled() )
92 pMgr
->SetMaxUndoActionCount( 0 );
94 SetHelpId( HID_SCSHELL_PIVOTSH
);
95 SetName(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Pivot")));
98 //------------------------------------------------------------------------
99 ScPivotShell::~ScPivotShell()
103 //------------------------------------------------------------------------
104 void ScPivotShell::Execute( SfxRequest
& rReq
)
106 switch ( rReq
.GetSlot() )
108 case SID_PIVOT_RECALC
:
109 pViewShell
->RecalcPivotTable();
113 ScViewData
* pViewData
= pViewShell
->GetViewData();
115 pViewShell
->GetDBData( TRUE
, SC_DB_OLD
);
116 const ScMarkData
& rMark1
= pViewData
->GetMarkData();
117 if ( !rMark1
.IsMarked() && !rMark1
.IsMultiMarked() )
118 pViewShell
->MarkDataArea( TRUE
);
120 Window
* pDlgParent
= pViewShell
->GetDialogParent();
122 pViewData
->MoveNextRow();
124 ScGlobal::ClearAutoFormat();
125 ScAutoFormatData
* pNewEntry
= pViewShell
->CreateAutoFormatData();
126 ScAutoFormatDlg
* pDlg
= new ScAutoFormatDlg(
127 pDlgParent
, ScGlobal::GetAutoFormat(), pNewEntry
, pViewData
->GetDocument() );
129 if ( pDlg
->Execute() == RET_OK
)
131 ScEditableTester
aTester( pViewShell
);
132 if ( !aTester
.IsEditable() )
134 pViewShell
->ErrorMessage(aTester
.GetMessageId());
138 /* AutoFormat and Store the index */
139 pViewShell
->AutoFormat( pDlg
->GetIndex() );
140 pViewShell
->AutoFormatPivotTable( pDlg
->GetIndex() );
146 //pViewShell->DeletePivotTable();
147 //pViewShell->RecalcPivotTable();
151 pViewShell
->DeletePivotTable();
156 ScDPObject
* pDPObj
= GetCurrDPObject();
159 ScQueryParam aQueryParam
;
161 const ScSheetSourceDesc
* pDesc
= pDPObj
->GetSheetDesc();
162 DBG_ASSERT( pDesc
, "no sheet source for DP filter dialog" );
165 aQueryParam
= pDesc
->aQueryParam
;
166 nSrcTab
= pDesc
->aSourceRange
.aStart
.Tab();
169 ScViewData
* pViewData
= pViewShell
->GetViewData();
170 SfxItemSet
aArgSet( pViewShell
->GetPool(),
171 SCITEM_QUERYDATA
, SCITEM_QUERYDATA
);
172 aArgSet
.Put( ScQueryItem( SCITEM_QUERYDATA
, pViewData
, &aQueryParam
) );
174 //CHINA001 ScPivotFilterDlg* pDlg = new ScPivotFilterDlg(
175 //CHINA001 pViewShell->GetDialogParent(), aArgSet, nSrcTab );
177 ScAbstractDialogFactory
* pFact
= ScAbstractDialogFactory::Create();
178 DBG_ASSERT(pFact
, "ScAbstractFactory create fail!");//CHINA001
180 AbstractScPivotFilterDlg
* pDlg
= pFact
->CreateScPivotFilterDlg( pViewShell
->GetDialogParent(),
182 RID_SCDLG_PIVOTFILTER
);
183 DBG_ASSERT(pDlg
, "Dialog create fail!");//CHINA001
185 if( pDlg
->Execute() == RET_OK
)
187 ScSheetSourceDesc aNewDesc
;
191 const ScQueryItem
& rQueryItem
= pDlg
->GetOutputItem();
192 aNewDesc
.aQueryParam
= rQueryItem
.GetQueryData();
194 ScDPObject
aNewObj( *pDPObj
);
195 aNewObj
.SetSheetDesc( aNewDesc
);
196 ScDBDocFunc
aFunc( *pViewData
->GetDocShell() );
197 aFunc
.DataPilotUpdate( pDPObj
, &aNewObj
, TRUE
, FALSE
);
198 pViewData
->GetView()->CursorPosChanged(); // shells may be switched
207 //------------------------------------------------------------------------
208 void __EXPORT
ScPivotShell::GetState( SfxItemSet
& rSet
)
210 ScDocShell
* pDocSh
= pViewShell
->GetViewData()->GetDocShell();
211 ScDocument
* pDoc
= pDocSh
->GetDocument();
212 BOOL bDisable
= pDocSh
->IsReadOnly() || pDoc
->GetChangeTrack();
214 SfxWhichIter
aIter(rSet
);
215 USHORT nWhich
= aIter
.FirstWhich();
220 case SID_PIVOT_RECALC
:
223 //! move ReadOnly check to idl flags
226 rSet
.DisableItem( nWhich
);
232 ScDPObject
* pDPObj
= GetCurrDPObject();
233 if( bDisable
|| !pDPObj
|| !pDPObj
->IsSheetData() )
234 rSet
.DisableItem( nWhich
);
238 nWhich
= aIter
.NextWhich();
243 //------------------------------------------------------------------------
245 ScDPObject
* ScPivotShell::GetCurrDPObject()
247 const ScViewData
& rViewData
= *pViewShell
->GetViewData();
248 return rViewData
.GetDocument()->GetDPAtCursor(
249 rViewData
.GetCurX(), rViewData
.GetCurY(), rViewData
.GetTabNo() );