xref: /AOO41X/main/sc/source/ui/view/tabvwshc.cxx (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 
28 
29 //------------------------------------------------------------------
30 
31 // INCLUDE ---------------------------------------------------------------
32 #include "scitems.hxx"
33 #include <vcl/msgbox.hxx>
34 #include <sfx2/childwin.hxx>
35 #include <sfx2/dispatch.hxx>
36 
37 #include "tabvwsh.hxx"
38 #include "sc.hrc"
39 #include "globstr.hrc"
40 #include "global.hxx"
41 #include "scmod.hxx"
42 #include "docsh.hxx"
43 #include "document.hxx"
44 #include "uiitems.hxx"
45 #include "pivot.hxx"
46 #include "namedlg.hxx"
47 #include "solvrdlg.hxx"
48 #include "optsolver.hxx"
49 #include "tabopdlg.hxx"
50 #include "autoform.hxx"         // Core
51 #include "autofmt.hxx"          // Dialog
52 #include "consdlg.hxx"
53 //CHINA001 #include "sortdlg.hxx"
54 #include "filtdlg.hxx"
55 #include "dbnamdlg.hxx"
56 #include "pvlaydlg.hxx"
57 #include "areasdlg.hxx"
58 #include "condfrmt.hxx"
59 #include "rangeutl.hxx"
60 #include "crnrdlg.hxx"
61 #include "formula.hxx"
62 #include "cell.hxx"             // Input Status Edit-Zellen
63 #include "acredlin.hxx"
64 #include "highred.hxx"
65 #include "simpref.hxx"
66 #include "funcdesc.hxx"
67 #include "dpobject.hxx"
68 
69 //------------------------------------------------------------------
70 
71 void ScTabViewShell::SetCurRefDlgId( sal_uInt16 nNew )
72 {
73     //  CurRefDlgId is stored in ScModule to find if a ref dialog is open,
74     //  and in the view to identify the view that has opened the dialog
75     nCurRefDlgId = nNew;
76 }
77 
78 SfxModelessDialog* ScTabViewShell::CreateRefDialog(
79                         SfxBindings* pB, SfxChildWindow* pCW, SfxChildWinInfo* pInfo,
80                         Window* pParent, sal_uInt16 nSlotId )
81 {
82     //  Dialog nur aufmachen, wenn ueber ScModule::SetRefDialog gerufen, damit
83     //  z.B. nach einem Absturz offene Ref-Dialoge nicht wiederkommen (#42341#).
84 
85     if ( SC_MOD()->GetCurRefDlgId() != nSlotId )
86         return NULL;
87 
88     if ( nCurRefDlgId != nSlotId )
89     {
90         //  the dialog has been opened in a different view
91         //  -> lock the dispatcher for this view (modal mode)
92 
93         GetViewData()->GetDispatcher().Lock( sal_True );    // lock is reset when closing dialog
94         return NULL;
95     }
96 
97     SfxModelessDialog* pResult = 0;
98 
99     if(pCW)
100         pCW->SetHideNotDelete(sal_True);
101 
102     switch( nSlotId )
103     {
104         case FID_DEFINE_NAME:
105         pResult = new ScNameDlg( pB, pCW, pParent, GetViewData(),
106                                  ScAddress( GetViewData()->GetCurX(),
107                                             GetViewData()->GetCurY(),
108                                             GetViewData()->GetTabNo() ) );
109         break;
110 
111         case SID_DEFINE_COLROWNAMERANGES:
112         {
113             pResult = new ScColRowNameRangesDlg( pB, pCW, pParent, GetViewData() );
114         }
115         break;
116 
117         case SID_OPENDLG_CONSOLIDATE:
118         {
119             SfxItemSet aArgSet( GetPool(),
120                                 SCITEM_CONSOLIDATEDATA,
121                                 SCITEM_CONSOLIDATEDATA );
122 
123             const ScConsolidateParam* pDlgData =
124                             GetViewData()->GetDocument()->GetConsolidateDlgData();
125 
126             if ( !pDlgData )
127             {
128                 ScConsolidateParam  aConsParam;
129                 SCCOL nStartCol, nEndCol;
130                 SCROW nStartRow, nEndRow;
131                 SCTAB nStartTab, nEndTab;
132 
133                 GetViewData()->GetSimpleArea( nStartCol, nStartRow, nStartTab,
134                                               nEndCol,   nEndRow,   nEndTab );
135 
136                 PutInOrder( nStartCol, nEndCol );
137                 PutInOrder( nStartRow, nEndRow );
138                 PutInOrder( nStartTab, nEndTab );
139 
140                 aConsParam.nCol = nStartCol;
141                 aConsParam.nRow = nStartRow;
142                 aConsParam.nTab = nStartTab;
143 
144                 aArgSet.Put( ScConsolidateItem( SCITEM_CONSOLIDATEDATA,
145                                                 &aConsParam ) );
146             }
147             else
148             {
149                 aArgSet.Put( ScConsolidateItem( SCITEM_CONSOLIDATEDATA, pDlgData ) );
150             }
151             pResult = new ScConsolidateDlg( pB, pCW, pParent, aArgSet );
152         }
153         break;
154 
155         case SID_DEFINE_DBNAME:
156         {
157             //  wenn auf einem bestehenden Bereich aufgerufen, den markieren
158             GetDBData( sal_True, SC_DB_OLD );
159             const ScMarkData& rMark = GetViewData()->GetMarkData();
160             if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )
161                 MarkDataArea( sal_False );
162 
163             pResult = new ScDbNameDlg( pB, pCW, pParent, GetViewData() );
164         }
165         break;
166 
167         case SID_SPECIAL_FILTER:
168         {
169             ScQueryParam    aQueryParam;
170             SfxItemSet      aArgSet( GetPool(),
171                                      SCITEM_QUERYDATA,
172                                      SCITEM_QUERYDATA );
173 
174             ScDBData* pDBData = GetDBData( sal_True, SC_DB_MAKE_FILTER, SC_DBSEL_ROW_DOWN);
175             pDBData->GetQueryParam( aQueryParam );
176 
177             ScQueryItem aItem( SCITEM_QUERYDATA, GetViewData(), &aQueryParam );
178             ScRange aAdvSource;
179             if (pDBData->GetAdvancedQuerySource(aAdvSource))
180                 aItem.SetAdvancedQuerySource( &aAdvSource );
181 
182             aArgSet.Put( aItem );
183 
184             // aktuelle Tabelle merken (wg. RefInput im Dialog)
185             GetViewData()->SetRefTabNo( GetViewData()->GetTabNo() );
186 
187             pResult = new ScSpecialFilterDlg( pB, pCW, pParent, aArgSet );
188         }
189         break;
190 
191         case SID_FILTER:
192         {
193 
194             ScQueryParam    aQueryParam;
195             SfxItemSet      aArgSet( GetPool(),
196                                      SCITEM_QUERYDATA,
197                                      SCITEM_QUERYDATA );
198 
199             ScDBData* pDBData = GetDBData( sal_True, SC_DB_MAKE_FILTER, SC_DBSEL_ROW_DOWN);
200             pDBData->GetQueryParam( aQueryParam );
201 
202             aArgSet.Put( ScQueryItem( SCITEM_QUERYDATA,
203                                       GetViewData(),
204                                       &aQueryParam ) );
205 
206             // aktuelle Tabelle merken (wg. RefInput im Dialog)
207             GetViewData()->SetRefTabNo( GetViewData()->GetTabNo() );
208 
209             pResult = new ScFilterDlg( pB, pCW, pParent, aArgSet );
210         }
211         break;
212 
213         case SID_OPENDLG_TABOP:
214         {
215             ScViewData*  pViewData  = GetViewData();
216             ScRefAddress  aCurPos   ( pViewData->GetCurX(),
217                                       pViewData->GetCurY(),
218                                       pViewData->GetTabNo(),
219                                       sal_False, sal_False, sal_False );
220 
221             pResult = new ScTabOpDlg( pB, pCW, pParent, pViewData->GetDocument(), aCurPos );
222         }
223         break;
224 
225         case SID_OPENDLG_SOLVE:
226         {
227             ScViewData*  pViewData  = GetViewData();
228             ScAddress aCurPos(  pViewData->GetCurX(),
229                                 pViewData->GetCurY(),
230                                 pViewData->GetTabNo());
231             pResult = new ScSolverDlg( pB, pCW, pParent, pViewData->GetDocument(), aCurPos );
232         }
233         break;
234 
235         case SID_OPENDLG_OPTSOLVER:
236         {
237             ScViewData* pViewData = GetViewData();
238             ScAddress aCurPos( pViewData->GetCurX(), pViewData->GetCurY(), pViewData->GetTabNo());
239             pResult = new ScOptSolverDlg( pB, pCW, pParent, pViewData->GetDocShell(), aCurPos );
240         }
241         break;
242 
243         case SID_OPENDLG_PIVOTTABLE:
244         {
245             //  all settings must be in pDialogDPObject
246 
247             if( pDialogDPObject )
248             {
249                 GetViewData()->SetRefTabNo( GetViewData()->GetTabNo() );
250                 pResult = new ScPivotLayoutDlg( pB, pCW, pParent, *pDialogDPObject );
251             }
252         }
253         break;
254 
255         case SID_OPENDLG_EDIT_PRINTAREA:
256         {
257             pResult = new ScPrintAreasDlg( pB, pCW, pParent );
258         }
259         break;
260 
261         case SID_OPENDLG_CONDFRMT:
262         {
263             ScViewData* pViewData = GetViewData();
264 
265             ScDocument* pDoc = pViewData->GetDocument();
266             const ScConditionalFormat* pForm = pDoc->GetCondFormat(
267                 pViewData->GetCurX(), pViewData->GetCurY(), pViewData->GetTabNo() );
268 
269             // aktuelle Tabelle merken (wg. RefInput im Dialog)
270             pViewData->SetRefTabNo( pViewData->GetTabNo() );
271 
272             pResult = new ScConditionalFormatDlg( pB, pCW, pParent, pDoc, pForm );
273         }
274         break;
275 
276         case SID_OPENDLG_FUNCTION:
277         {
278             //  Dialog schaut selber, was in der Zelle steht
279 
280             pResult = new ScFormulaDlg( pB, pCW, pParent, GetViewData(),ScGlobal::GetStarCalcFunctionMgr() );
281         }
282         break;
283 
284         case FID_CHG_SHOW:
285         {
286             //  Dialog schaut selber, was in der Zelle steht
287 
288             pResult = new ScHighlightChgDlg( pB, pCW, pParent, GetViewData() );
289         }
290         break;
291 
292         case WID_SIMPLE_REF:
293         {
294             //  Dialog schaut selber, was in der Zelle steht
295 
296             ScViewData* pViewData = GetViewData();
297             pViewData->SetRefTabNo( pViewData->GetTabNo() );
298             pResult = new ScSimpleRefDlg( pB, pCW, pParent, pViewData );
299         }
300         break;
301 
302 
303         default:
304         DBG_ERROR( "ScTabViewShell::CreateRefDialog: unbekannte ID" );
305         break;
306     }
307 
308     if (pResult)
309     {
310         //  Die Dialoge gehen immer mit eingeklapptem Zusaetze-Button auf,
311         //  darum muss die Groesse ueber das Initialize gerettet werden
312         //  (oder den Zusaetze-Status mit speichern !!!)
313 
314         Size aSize = pResult->GetSizePixel();
315         pResult->Initialize( pInfo );
316         pResult->SetSizePixel(aSize);
317     }
318 
319     return pResult;
320 }
321 
322 
323 
324