xref: /AOO41X/main/sc/source/ui/view/tabvwshe.cxx (revision 6da5f31158a7dd09f46f041b4f15bb7ae3eb92a4)
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 // INCLUDE ---------------------------------------------------------------
30 #include <editeng/eeitem.hxx>
31 
32 #include "scitems.hxx"
33 #include <editeng/editview.hxx>
34 #include <editeng/flditem.hxx>
35 #include <svx/hlnkitem.hxx>
36 #include <svl/srchitem.hxx>
37 #include <sfx2/dispatch.hxx>
38 #include <sfx2/viewfrm.hxx>
39 #include <sfx2/request.hxx>
40 #include <sfx2/objface.hxx>
41 #include <svl/stritem.hxx>
42 #include <vcl/sound.hxx>
43 
44 #include "tabvwsh.hxx"
45 #include "sc.hrc"
46 #include "scmod.hxx"
47 #include "impex.hxx"
48 #include "editsh.hxx"
49 #include "dociter.hxx"
50 #include "inputhdl.hxx"
51 #include "document.hxx"
52 
53 //==================================================================
54 
55 String __EXPORT ScTabViewShell::GetSelectionText( sal_Bool bWholeWord )
56 {
57 	String aStrSelection;
58 
59 	if ( pEditShell && pEditShell == GetMySubShell() )
60 	{
61 		aStrSelection = pEditShell->GetSelectionText( bWholeWord );
62 	}
63 	else
64 	{
65 		ScRange aRange;
66 
67 		if ( GetViewData()->GetSimpleArea( aRange ) == SC_MARK_SIMPLE )
68 		{
69 			ScDocument* pDoc = GetViewData()->GetDocument();
70 			if ( bInFormatDialog && aRange.aStart.Row() != aRange.aEnd.Row() )
71 			{
72 				// Range auf eine Datenzeile begrenzen
73 				// (#48613# nur wenn der Aufruf aus einem Format-Dialog kommt)
74 				ScHorizontalCellIterator aIter( pDoc, aRange.aStart.Tab(),
75 					aRange.aStart.Col(), aRange.aStart.Row(),
76 					aRange.aEnd.Col(), aRange.aEnd.Row() );
77                 SCCOL nCol;
78                 SCROW nRow;
79                 if ( aIter.GetNext( nCol, nRow ) )
80 				{
81 					aRange.aStart.SetCol( nCol );
82 					aRange.aStart.SetRow( nRow );
83 					aRange.aEnd.SetRow( nRow );
84 				}
85 				else
86 					aRange.aEnd = aRange.aStart;
87 			}
88             else
89             {
90                 // #i111531# with 1M rows it was necessary to limit the range
91                 // to the actually used data area.
92                 SCCOL nCol1, nCol2;
93                 SCROW nRow1, nRow2;
94                 SCTAB nTab1, nTab2;
95                 aRange.GetVars( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2);
96                 bool bShrunk;
97                 pDoc->ShrinkToUsedDataArea( bShrunk, nTab1, nCol1, nRow1, nCol2, nRow2, false);
98                 if (bShrunk)
99                 {
100                     aRange.aStart.SetCol( nCol1 );
101                     aRange.aStart.SetRow( nRow1 );
102                     aRange.aEnd.SetCol( nCol2 );
103                     aRange.aEnd.SetRow( nRow2 );
104                 }
105             }
106 
107 			ScImportExport aObj( pDoc, aRange );
108 			aObj.SetFormulas( GetViewData()->GetOptions().GetOption( VOPT_FORMULAS ) );
109 			rtl::OUString aExportOUString;
110 			aObj.ExportString( aExportOUString );
111 			aStrSelection = aExportOUString;
112 
113 			aStrSelection.ConvertLineEnd( LINEEND_CR );
114 
115 			//	Tab/CR durch Space ersetzen, wenn fuer Dialog oder per Basic/SelectionTextExt,
116 			//	oder wenn es eine einzelne Zeile ist.
117 			//	Sonst mehrzeilig mit Tabs beibehalten (z.B. Mail oder Basic/SelectionText).
118 			//	Fuer Mail werden die Tabs dann spaeter in (mehrere) Spaces gewandelt.
119 
120 			if ( bInFormatDialog || bWholeWord || aRange.aEnd.Row() == aRange.aStart.Row() )
121 			{
122 				xub_StrLen nAt;
123 				while (  (nAt = aStrSelection.Search( CHAR_CR )) != STRING_NOTFOUND )
124 					aStrSelection.SetChar( nAt, ' ' );
125 				while (  (nAt = aStrSelection.Search( '\t' )) != STRING_NOTFOUND )
126 					aStrSelection.SetChar( nAt, ' ' );
127 
128 				aStrSelection.EraseTrailingChars( ' ' );
129 			}
130 		}
131 	}
132 
133 	return aStrSelection;
134 }
135 
136 //------------------------------------------------------------------------
137 
138 void ScTabViewShell::InsertURL( const String& rName, const String& rURL, const String& rTarget,
139 								sal_uInt16 nMode )
140 {
141 	SvxLinkInsertMode eMode = (SvxLinkInsertMode) nMode;
142 	sal_Bool bAsText = ( eMode != HLINK_BUTTON );		// Default ist jetzt Text
143 
144 	if ( bAsText )
145 	{
146 		if ( GetViewData()->IsActive() )
147 		{
148 			//	if the view is active, always use InsertURLField, which starts EditMode
149 			//	and selects the URL, so it can be changed from the URL bar / dialog
150 
151 			InsertURLField( rName, rURL, rTarget );
152 		}
153 		else
154 		{
155 			//	#91216# if the view is not active, InsertURLField doesn't work
156 			//	-> use InsertBookmark to directly manipulate cell content
157 			//	bTryReplace=sal_True -> if cell contains only one URL, replace it
158 
159 			SCCOL nPosX = GetViewData()->GetCurX();
160 			SCROW nPosY = GetViewData()->GetCurY();
161 			InsertBookmark( rName, rURL, nPosX, nPosY, &rTarget, sal_True );
162 		}
163 	}
164 	else
165 	{
166 		SC_MOD()->InputEnterHandler();
167 		InsertURLButton( rName, rURL, rTarget );
168 	}
169 }
170 
171 //------------------------------------------------------------------------
172 
173 // wenn CLOOKs: -> mit <editview.hxx> <flditem.hxx>in neue tabvwsh
174 
175 void lcl_SelectFieldAfterInsert( EditView& rView )
176 {
177 	ESelection aSel = rView.GetSelection();
178 	if ( aSel.nStartPos == aSel.nEndPos && aSel.nStartPos > 0 )
179 	{
180 		//	Cursor is behind the inserted field -> extend selection to the left
181 
182 		--aSel.nStartPos;
183 		rView.SetSelection( aSel );
184 	}
185 }
186 
187 void ScTabViewShell::InsertURLField( const String& rName, const String& rURL, const String& rTarget )
188 {
189 	SvxURLField aURLField( rURL, rName, SVXURLFORMAT_REPR );
190 	aURLField.SetTargetFrame( rTarget );
191     SvxFieldItem aURLItem( aURLField, EE_FEATURE_FIELD );
192 
193 	ScViewData*		pViewData	= GetViewData();
194 	ScModule*		pScMod		= SC_MOD();
195 	ScInputHandler*	pHdl		= pScMod->GetInputHdl( pViewData->GetViewShell() );
196 
197 	sal_Bool bSelectFirst = sal_False;
198 	if ( !pScMod->IsEditMode() )
199 	{
200 		if ( !SelectionEditable() )
201 		{
202 			// no error message (may be called from drag&drop)
203 			Sound::Beep();
204 			return;
205 		}
206 
207 		// single url in cell is shown in the dialog and replaced
208 		bSelectFirst = HasBookmarkAtCursor( NULL );
209 		pScMod->SetInputMode( SC_INPUT_TABLE );
210 	}
211 
212 	EditView*		pTopView	= pHdl->GetTopView();
213 	EditView*		pTableView	= pHdl->GetTableView();
214 	DBG_ASSERT( pTopView || pTableView, "No EditView" );
215 
216 	if ( bSelectFirst )
217 	{
218 		if ( pTopView )
219 			pTopView->SetSelection( ESelection(0,0,0,1) );
220 		if ( pTableView )
221 			pTableView->SetSelection( ESelection(0,0,0,1) );
222 	}
223 
224 	pHdl->DataChanging();
225 
226 	if ( pTopView )
227 	{
228 		pTopView->InsertField( aURLItem );
229 		lcl_SelectFieldAfterInsert( *pTopView );
230 	}
231 	if ( pTableView )
232 	{
233 		pTableView->InsertField( aURLItem );
234 		lcl_SelectFieldAfterInsert( *pTableView );
235 	}
236 
237 	pHdl->DataChanged();
238 }
239 
240 void ScTabViewShell::ExecSearch( SfxRequest& rReq )
241 {
242 	const SfxItemSet*	pReqArgs	= rReq.GetArgs();
243 	sal_uInt16				nSlot		= rReq.GetSlot();
244 	const SfxPoolItem*	pItem;
245 
246 	switch ( nSlot )
247 	{
248 		case FID_SEARCH_NOW:
249 			{
250 				if ( pReqArgs &&
251 					 SFX_ITEM_SET == pReqArgs->GetItemState(SID_SEARCH_ITEM, sal_False, &pItem) )
252 				{
253 					DBG_ASSERT( pItem->ISA(SvxSearchItem), "falsches Item" );
254 					const SvxSearchItem* pSearchItem = (const SvxSearchItem*) pItem;
255 
256 					ScGlobal::SetSearchItem( *pSearchItem );
257 					SearchAndReplace( pSearchItem, sal_True, rReq.IsAPI() );
258 					rReq.Done();
259 				}
260 			}
261 			break;
262 
263 		case SID_SEARCH_ITEM:
264 			if (pReqArgs && SFX_ITEM_SET ==
265 							pReqArgs->GetItemState(SID_SEARCH_ITEM, sal_False, &pItem))
266 			{
267 				//	Search-Item merken
268 				DBG_ASSERT( pItem->ISA(SvxSearchItem), "falsches Item" );
269 				ScGlobal::SetSearchItem( *(const SvxSearchItem*) pItem );
270 			}
271 			else
272 			{
273 				DBG_ERROR("SID_SEARCH_ITEM ohne Parameter");
274 			}
275 			break;
276 		case FID_SEARCH:
277 		case FID_REPLACE:
278 		case FID_REPLACE_ALL:
279 		case FID_SEARCH_ALL:
280 			{
281 				if (pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState(nSlot, sal_False, &pItem))
282 				{
283 					//	SearchItem holen
284 
285 					SvxSearchItem aSearchItem = ScGlobal::GetSearchItem();
286 
287 					//	SearchItem fuellen
288 
289 					aSearchItem.SetSearchString(((SfxStringItem*)pItem)->GetValue());
290 					if(SFX_ITEM_SET == pReqArgs->GetItemState(FN_PARAM_1, sal_False, &pItem))
291 						aSearchItem.SetReplaceString(((SfxStringItem*)pItem)->GetValue());
292 
293 					if (nSlot == FID_SEARCH)
294 						aSearchItem.SetCommand(SVX_SEARCHCMD_FIND);
295 					else if(nSlot == FID_REPLACE)
296 						aSearchItem.SetCommand(SVX_SEARCHCMD_REPLACE);
297 					else if(nSlot == FID_REPLACE_ALL)
298 						aSearchItem.SetCommand(SVX_SEARCHCMD_REPLACE_ALL);
299 					else
300 						aSearchItem.SetCommand(SVX_SEARCHCMD_FIND_ALL);
301 
302 					//	Request ausfuehren (dabei wird das SearchItem gespeichert)
303 
304 					aSearchItem.SetWhich(SID_SEARCH_ITEM);
305 					GetViewData()->GetDispatcher().Execute( FID_SEARCH_NOW,
306 							rReq.IsAPI() ? SFX_CALLMODE_API|SFX_CALLMODE_SYNCHRON :
307 											SFX_CALLMODE_STANDARD,
308 							&aSearchItem, 0L );
309 				}
310 				else
311 				{
312 					GetViewData()->GetDispatcher().Execute(
313 							SID_SEARCH_DLG, SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD );
314 				}
315 			}
316 			break;
317 		case FID_REPEAT_SEARCH:
318 			{
319 				//	nochmal mit ScGlobal::GetSearchItem()
320 
321 				SvxSearchItem aSearchItem = ScGlobal::GetSearchItem();
322 				aSearchItem.SetWhich(SID_SEARCH_ITEM);
323 				GetViewData()->GetDispatcher().Execute( FID_SEARCH_NOW,
324 						rReq.IsAPI() ? SFX_CALLMODE_API|SFX_CALLMODE_SYNCHRON :
325 										SFX_CALLMODE_STANDARD,
326 						&aSearchItem, 0L );
327 			}
328 			break;
329 //		case FID_SEARCH_COUNT:
330 	}
331 }
332 
333 //--------------------------------------------------------------------
334 
335 
336 
337 
338 
339 
340