xref: /aoo42x/main/sw/source/ui/shells/textidx.cxx (revision 69a74367)
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_sw.hxx"
26 
27 #include <hintids.hxx>
28 #include <vcl/msgbox.hxx>
29 #include <sfx2/request.hxx>
30 #include <sfx2/viewfrm.hxx>
31 #include <svl/stritem.hxx>
32 #include <svl/eitem.hxx>
33 #include <editeng/sizeitem.hxx>
34 #include <fmtfsize.hxx>
35 #include <fldbas.hxx>
36 #include <uiitems.hxx>
37 #include "viewopt.hxx"
38 #include "cmdid.h"
39 #include "view.hxx"
40 #include "wrtsh.hxx"
41 #include "swundo.hxx"               	// fuer Undo-Ids
42 #include "textsh.hxx"
43 #include "idxmrk.hxx"
44 #include "cnttab.hxx"
45 #include "toxmgr.hxx"
46 #include "swabstdlg.hxx"
47 #include <index.hrc>
48 #include <globals.hrc>
49 
50 
51 // STATIC DATA -----------------------------------------------------------
52 
53 void SwTextShell::ExecIdx(SfxRequest &rReq)
54 {
55 	const SfxItemSet *pArgs = rReq.GetArgs();
56 	const SfxPoolItem* pItem = 0;
57 	sal_uInt16 nSlot = rReq.GetSlot();
58 	if(pArgs)
59 	   pArgs->GetItemState(nSlot, sal_False, &pItem );
60 
61 	SfxViewFrame* pVFrame = GetView().GetViewFrame();
62 	Window *pMDI = &pVFrame->GetWindow();
63 
64 	switch( nSlot )
65 	{
66 		case FN_EDIT_AUTH_ENTRY_DLG :
67 		{
68 			SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
69             DBG_ASSERT(pFact, "Dialogdiet fail!");
70             VclAbstractDialog* pDlg = pFact->CreateVclAbstractDialog( pMDI, GetShell(), DLG_EDIT_AUTHMARK);
71             DBG_ASSERT(pDlg, "Dialogdiet fail!");
72 			pDlg->Execute();
73 			delete pDlg;
74 		}
75 		break;
76 		case FN_INSERT_AUTH_ENTRY_DLG:
77 		{
78 			// no BASIC support
79 			pVFrame->ToggleChildWindow(FN_INSERT_AUTH_ENTRY_DLG);
80 			Invalidate(rReq.GetSlot());
81 		}
82 		break;
83 		case FN_INSERT_IDX_ENTRY_DLG:
84 		{
85 			pVFrame->ToggleChildWindow(FN_INSERT_IDX_ENTRY_DLG);
86 			Invalidate(rReq.GetSlot());
87 		}
88 		break;
89 		case FN_EDIT_IDX_ENTRY_DLG:
90 		{
91 			SwTOXMgr aMgr(GetShellPtr());
92 			sal_uInt16 nRet = RET_OK;
93 			if(aMgr.GetTOXMarkCount() > 1)
94 			{	// Mehrere Marken, welche solls denn sein ?
95 				//
96 				SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
97                 DBG_ASSERT(pFact, "Dialogdiet fail!");
98                 VclAbstractDialog* pMultDlg = pFact->CreateMultiTOXMarkDlg( DLG_MULTMRK,
99 														pMDI, aMgr);
100                 DBG_ASSERT(pMultDlg, "Dialogdiet fail!");
101 				nRet = pMultDlg->Execute();
102 				delete pMultDlg;
103 			}
104 			if(	nRet == RET_OK)
105 			{
106 				SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
107                 DBG_ASSERT(pFact, "Dialogdiet fail!");
108                 VclAbstractDialog* pDlg = pFact->CreateIndexMarkModalDlg( DLG_EDIT_IDXMARK, pMDI, GetShell(), aMgr.GetCurTOXMark() );
109                 DBG_ASSERT(pDlg, "Dialogdiet fail!");
110 				pDlg->Execute();
111 				delete pDlg;
112 			}
113 			break;
114 		}
115 		case FN_IDX_MARK_TO_IDX:
116 		{
117 			GetShell().GotoTOXMarkBase();
118 			break;
119 		}
120 		case FN_INSERT_MULTI_TOX:
121 		{
122 			SfxItemSet aSet(GetPool(),
123 							RES_COL, RES_COL,
124 							RES_BACKGROUND, RES_BACKGROUND,
125 							RES_FRM_SIZE, RES_FRM_SIZE,
126 							SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
127 							RES_LR_SPACE, RES_LR_SPACE,
128 							FN_PARAM_TOX_TYPE, FN_PARAM_TOX_TYPE,
129 							0	);
130 			SwWrtShell& rSh = GetShell();
131 			SwRect aRect;
132             rSh.CalcBoundRect(aRect, FLY_AS_CHAR);
133 
134 			long nWidth = aRect.Width();
135 			aSet.Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth));
136 			// Hoehe=Breite fuer konsistentere Vorschau (analog zu Bereich bearbeiten)
137 			aSet.Put(SvxSizeItem(SID_ATTR_PAGE_SIZE, Size(nWidth, nWidth)));
138 			const SwTOXBase* pCurTOX = 0;
139 			sal_Bool bGlobal = sal_False;
140 			if(pItem)
141 			{
142 				pCurTOX = (const SwTOXBase* )((SwPtrItem*)pItem)->GetValue();
143 				bGlobal = sal_True;
144 			}
145 			else
146 				pCurTOX = rSh.GetCurTOX();
147 			if(pCurTOX)
148 			{
149 				const SfxItemSet* pSet = pCurTOX->GetAttrSet();
150 				if(pSet)
151 					aSet.Put(*pSet);
152 			}
153 			SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
154             DBG_ASSERT(pFact, "Dialogdiet fail!");
155             AbstractMultiTOXTabDialog* pDlg = pFact->CreateMultiTOXTabDialog( DLG_MULTI_TOX,
156 														pMDI, aSet, rSh, (SwTOXBase* )pCurTOX,
157 														USHRT_MAX, bGlobal);
158             DBG_ASSERT(pDlg, "Dialogdiet fail!");
159 			pDlg->Execute();
160 			delete pDlg;
161 		}
162 		break;
163 		case FN_REMOVE_CUR_TOX:
164 		{
165 			SwWrtShell& rSh = GetShell();
166 			const SwTOXBase* pBase = rSh.GetCurTOX();
167 			DBG_ASSERT(pBase, "no TOXBase to remove");
168 			if( pBase )
169 				rSh.DeleteTOX(*pBase, sal_True);
170 		}
171 		break;
172 		default:
173 			ASSERT(!this, falscher Dispatcher);
174 			return;
175 	}
176 }
177 
178 
179 void SwTextShell::GetIdxState(SfxItemSet &rSet)
180 {
181 	SwWrtShell& rSh = GetShell();
182 	SfxViewFrame* pVFrame = GetView().GetViewFrame();
183 	SwInsertIdxMarkWrapper *pIdxMrk = (SwInsertIdxMarkWrapper*)
184 						pVFrame->GetChildWindow(FN_INSERT_IDX_ENTRY_DLG);
185 
186 	SfxChildWindow* pAuthMark = pVFrame->GetChildWindow(FN_INSERT_AUTH_ENTRY_DLG);
187 
188 	const sal_Bool bHtmlMode = 0 != ::GetHtmlMode( GetView().GetDocShell() );
189 	const SwTOXBase* pBase = 0;
190 	if( bHtmlMode || 0 != ( pBase = rSh.GetCurTOX()) )
191 	{
192 		if( pBase )
193 		{
194 			if(pBase->IsTOXBaseInReadonly())
195 			{
196 				rSet.DisableItem( FN_INSERT_MULTI_TOX );
197 			}
198 		}
199 
200 		rSet.DisableItem( FN_EDIT_IDX_ENTRY_DLG );
201 		rSet.DisableItem( FN_EDIT_AUTH_ENTRY_DLG );
202 
203 		if(!pIdxMrk)
204 			rSet.DisableItem( FN_INSERT_IDX_ENTRY_DLG );
205 		else
206 			rSet.Put(SfxBoolItem(FN_INSERT_IDX_ENTRY_DLG, sal_True));
207 
208 		if(!pAuthMark)
209 			rSet.DisableItem( FN_INSERT_AUTH_ENTRY_DLG );
210 		else
211 			rSet.Put(SfxBoolItem(FN_INSERT_AUTH_ENTRY_DLG, sal_True));
212 
213 	}
214     else if ( rSh.CrsrInsideInputFld() )
215     {
216         rSet.DisableItem( FN_INSERT_IDX_ENTRY_DLG );
217         rSet.DisableItem( FN_INSERT_AUTH_ENTRY_DLG );
218         rSet.DisableItem( FN_EDIT_AUTH_ENTRY_DLG );
219         rSet.DisableItem( FN_EDIT_IDX_ENTRY_DLG );
220         rSet.DisableItem( FN_INSERT_MULTI_TOX );
221         rSet.DisableItem( FN_REMOVE_CUR_TOX );
222     }
223 	else
224 	{
225 
226 		sal_Bool bEnableEdit = sal_True;
227 		sal_Bool bInReadonly = rSh.HasReadonlySel();
228 		if( rSh.HasSelection() || bInReadonly)
229 			bEnableEdit = sal_False;
230 		else
231 		{
232 			SwTOXMarks aArr;
233 			rSh.GetCurTOXMarks( aArr );
234 			if( !aArr.Count())
235 				bEnableEdit = sal_False;
236 		}
237 
238 		if(!bEnableEdit)
239 			rSet.DisableItem( FN_EDIT_IDX_ENTRY_DLG );
240 
241 		if(bInReadonly)
242 		{
243 			rSet.DisableItem(FN_INSERT_IDX_ENTRY_DLG);
244 			rSet.DisableItem( FN_INSERT_MULTI_TOX );
245 		}
246 		else
247 			rSet.Put(SfxBoolItem(FN_INSERT_IDX_ENTRY_DLG,
248 									0 != pIdxMrk));
249 
250 
251 		SwField* pField = rSh.GetCurFld();
252 
253 		if(bInReadonly)
254 			rSet.DisableItem(FN_INSERT_AUTH_ENTRY_DLG);
255 		else
256 			rSet.Put(SfxBoolItem(FN_INSERT_AUTH_ENTRY_DLG, 0 != pAuthMark));
257 
258 		if(	bInReadonly || !pField ||
259 			pField->GetTyp()->Which() != RES_AUTHORITY)
260 			rSet.DisableItem(FN_EDIT_AUTH_ENTRY_DLG);
261 		rSet.DisableItem(FN_REMOVE_CUR_TOX);
262 	}
263 }
264 
265 // -----------------------------------------------------------------------
266 
267