Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #ifdef _MSC_VER
30 : : #pragma optimize ("", off)
31 : : #endif
32 : :
33 : : #include <sfx2/request.hxx>
34 : :
35 : : #include "cellsh.hxx"
36 : : #include "tabvwsh.hxx"
37 : : #include "global.hxx"
38 : : #include "scmod.hxx"
39 : : #include "inputhdl.hxx"
40 : : #include "inputwin.hxx"
41 : : #include "document.hxx"
42 : : #include "sc.hrc"
43 : :
44 : : #include "vcl/svapp.hxx"
45 : :
46 : 0 : void ScCellShell::ExecuteCursor( SfxRequest& rReq )
47 : : {
48 : 0 : ScViewData* pData = GetViewData();
49 : 0 : ScTabViewShell* pTabViewShell = pData->GetViewShell();
50 : 0 : const SfxItemSet* pReqArgs = rReq.GetArgs();
51 : 0 : sal_uInt16 nSlotId = rReq.GetSlot();
52 : 0 : SCsCOLROW nRepeat = 1;
53 : 0 : sal_Bool bSel = false;
54 : 0 : sal_Bool bKeep = false;
55 : :
56 [ # # ]: 0 : if ( pReqArgs != NULL )
57 : : {
58 : : const SfxPoolItem* pItem;
59 [ # # ][ # # ]: 0 : if (pReqArgs->HasItem(FN_PARAM_1, &pItem))
60 : 0 : nRepeat = static_cast<SCsCOLROW>(((const SfxInt16Item*)pItem)->GetValue());
61 [ # # ][ # # ]: 0 : if (pReqArgs->HasItem(FN_PARAM_2, &pItem))
62 : 0 : bSel = ((const SfxBoolItem*)pItem)->GetValue();
63 : : }
64 : : else
65 : : {
66 : : // evaluate locked selection mode
67 : :
68 : 0 : sal_uInt16 nLocked = pTabViewShell->GetLockedModifiers();
69 [ # # ]: 0 : if ( nLocked & KEY_SHIFT )
70 : 0 : bSel = sal_True; // EXT
71 [ # # ]: 0 : else if ( nLocked & KEY_MOD1 )
72 : : {
73 : : // ADD mode: keep the selection, start a new block when marking with shift again
74 : 0 : bKeep = true;
75 : : }
76 : : }
77 : :
78 [ # # ]: 0 : if (bSel)
79 : : {
80 [ # # # # : 0 : switch (nSlotId)
# # # # #
# # # # ]
81 : : {
82 : : case SID_CURSORDOWN:
83 : 0 : rReq.SetSlot(SID_CURSORDOWN_SEL);
84 : 0 : break;
85 : : case SID_CURSORUP:
86 : 0 : rReq.SetSlot(SID_CURSORUP_SEL);
87 : 0 : break;
88 : : case SID_CURSORRIGHT:
89 : 0 : rReq.SetSlot(SID_CURSORRIGHT_SEL);
90 : 0 : break;
91 : : case SID_CURSORLEFT:
92 : 0 : rReq.SetSlot(SID_CURSORLEFT_SEL);
93 : 0 : break;
94 : : case SID_CURSORPAGEDOWN:
95 : 0 : rReq.SetSlot(SID_CURSORPAGEDOWN_SEL);
96 : 0 : break;
97 : : case SID_CURSORPAGEUP:
98 : 0 : rReq.SetSlot(SID_CURSORPAGEUP_SEL);
99 : 0 : break;
100 : : case SID_CURSORPAGERIGHT:
101 : 0 : rReq.SetSlot(SID_CURSORPAGERIGHT_SEL);
102 : 0 : break;
103 : : case SID_CURSORPAGELEFT:
104 : 0 : rReq.SetSlot(SID_CURSORPAGELEFT_SEL);
105 : 0 : break;
106 : : case SID_CURSORBLKDOWN:
107 : 0 : rReq.SetSlot(SID_CURSORBLKDOWN_SEL);
108 : 0 : break;
109 : : case SID_CURSORBLKUP:
110 : 0 : rReq.SetSlot(SID_CURSORBLKUP_SEL);
111 : 0 : break;
112 : : case SID_CURSORBLKRIGHT:
113 : 0 : rReq.SetSlot(SID_CURSORBLKRIGHT_SEL);
114 : 0 : break;
115 : : case SID_CURSORBLKLEFT:
116 : 0 : rReq.SetSlot(SID_CURSORBLKLEFT_SEL);
117 : 0 : break;
118 : : default:
119 : : ;
120 : : }
121 : 0 : ExecuteCursorSel(rReq);
122 : 0 : return;
123 : : }
124 : :
125 : 0 : SCsCOLROW nRTLSign = 1;
126 [ # # ]: 0 : if ( pData->GetDocument()->IsLayoutRTL( pData->GetTabNo() ) )
127 : : {
128 : : //! evaluate cursor movement option?
129 : 0 : nRTLSign = -1;
130 : : }
131 : :
132 : : // once extra, so that the cursor will not be painted too often with ExecuteInputDirect:
133 : 0 : pTabViewShell->HideAllCursors();
134 : :
135 : : //OS: once for all should do, however!
136 : 0 : pTabViewShell->ExecuteInputDirect();
137 [ # # # # : 0 : switch ( nSlotId )
# # # # #
# # # # ]
138 : : {
139 : : case SID_CURSORDOWN:
140 : 0 : pTabViewShell->MoveCursorRel( 0, nRepeat, SC_FOLLOW_LINE, bSel, bKeep );
141 : 0 : break;
142 : :
143 : : case SID_CURSORBLKDOWN:
144 : 0 : pTabViewShell->MoveCursorArea( 0, nRepeat, SC_FOLLOW_JUMP, bSel, bKeep );
145 : 0 : break;
146 : :
147 : : case SID_CURSORUP:
148 : 0 : pTabViewShell->MoveCursorRel( 0, -nRepeat, SC_FOLLOW_LINE, bSel, bKeep );
149 : 0 : break;
150 : :
151 : : case SID_CURSORBLKUP:
152 : 0 : pTabViewShell->MoveCursorArea( 0, -nRepeat, SC_FOLLOW_JUMP, bSel, bKeep );
153 : 0 : break;
154 : :
155 : : case SID_CURSORLEFT:
156 : 0 : pTabViewShell->MoveCursorRel( static_cast<SCsCOL>(-nRepeat * nRTLSign), 0, SC_FOLLOW_LINE, bSel, bKeep );
157 : 0 : break;
158 : :
159 : : case SID_CURSORBLKLEFT:
160 : 0 : pTabViewShell->MoveCursorArea( static_cast<SCsCOL>(-nRepeat * nRTLSign), 0, SC_FOLLOW_JUMP, bSel, bKeep );
161 : 0 : break;
162 : :
163 : : case SID_CURSORRIGHT:
164 : 0 : pTabViewShell->MoveCursorRel( static_cast<SCsCOL>(nRepeat * nRTLSign), 0, SC_FOLLOW_LINE, bSel, bKeep );
165 : 0 : break;
166 : :
167 : : case SID_CURSORBLKRIGHT:
168 : 0 : pTabViewShell->MoveCursorArea( static_cast<SCsCOL>(nRepeat * nRTLSign), 0, SC_FOLLOW_JUMP, bSel, bKeep );
169 : 0 : break;
170 : :
171 : : case SID_CURSORPAGEDOWN:
172 : 0 : pTabViewShell->MoveCursorPage( 0, nRepeat, SC_FOLLOW_FIX, bSel, bKeep );
173 : 0 : break;
174 : :
175 : : case SID_CURSORPAGEUP:
176 : 0 : pTabViewShell->MoveCursorPage( 0, -nRepeat, SC_FOLLOW_FIX, bSel, bKeep );
177 : 0 : break;
178 : :
179 : : case SID_CURSORPAGERIGHT_: //XXX !!!
180 : 0 : pTabViewShell->MoveCursorPage( static_cast<SCsCOL>(nRepeat), 0, SC_FOLLOW_FIX, bSel, bKeep );
181 : 0 : break;
182 : :
183 : : case SID_CURSORPAGELEFT_: //XXX !!!
184 : 0 : pTabViewShell->MoveCursorPage( static_cast<SCsCOL>(-nRepeat), 0, SC_FOLLOW_FIX, bSel, bKeep );
185 : 0 : break;
186 : :
187 : : default:
188 : : OSL_FAIL("Unknown message in ViewShell (Cursor)");
189 : 0 : return;
190 : : }
191 : :
192 : 0 : pTabViewShell->ShowAllCursors();
193 : :
194 [ # # ]: 0 : rReq.AppendItem( SfxInt16Item(FN_PARAM_1, static_cast<sal_Int16>(nRepeat)) );
195 [ # # ]: 0 : rReq.AppendItem( SfxBoolItem(FN_PARAM_2, bSel) );
196 : 0 : rReq.Done();
197 : : }
198 : :
199 : 4 : void ScCellShell::GetStateCursor( SfxItemSet& /* rSet */ )
200 : : {
201 : 4 : }
202 : :
203 : 4 : void ScCellShell::ExecuteCursorSel( SfxRequest& rReq )
204 : : {
205 : 4 : sal_uInt16 nSlotId = rReq.GetSlot();
206 : 4 : ScTabViewShell* pViewShell = GetViewData()->GetViewShell();
207 : 4 : ScInputHandler* pInputHdl = pViewShell->GetInputHandler();
208 : 4 : pViewShell->HideAllCursors();
209 [ - + ][ - + ]: 4 : if (pInputHdl && pInputHdl->IsInputMode())
[ + - ]
210 : : {
211 : : // the current cell is in edit mode. Commit the text before moving on.
212 : 0 : pViewShell->ExecuteInputDirect();
213 : : }
214 : :
215 : 4 : SCsCOLROW nRepeat = 1;
216 : 4 : const SfxItemSet* pReqArgs = rReq.GetArgs();
217 : : // get repetition
218 [ + - ]: 4 : if ( pReqArgs != NULL )
219 : : {
220 : : const SfxPoolItem* pItem;
221 [ + - ][ + - ]: 4 : if (pReqArgs->HasItem(FN_PARAM_1, &pItem))
222 : 4 : nRepeat = static_cast<SCsCOLROW>(((const SfxInt16Item*)pItem)->GetValue());
223 : : }
224 : :
225 : 4 : SCsROW nMovY = nRepeat;
226 : : // Horizontal direction depends on whether or not the UI language is RTL.
227 : 4 : SCsCOL nMovX = nRepeat;
228 [ - + ]: 4 : if (GetViewData()->GetDocument()->IsLayoutRTL(GetViewData()->GetTabNo()))
229 : : {
230 : : // mirror horizontal movement for right-to-left mode.
231 : 0 : nMovX = -nRepeat;
232 : : }
233 : :
234 [ + - + - : 4 : switch (nSlotId)
- - - - -
- - - - ]
235 : : {
236 : : case SID_CURSORDOWN_SEL:
237 : 2 : pViewShell->ExpandBlock(0, nMovY, SC_FOLLOW_LINE);
238 : 2 : break;
239 : : case SID_CURSORUP_SEL:
240 : 0 : pViewShell->ExpandBlock(0, -nMovY, SC_FOLLOW_LINE);
241 : 0 : break;
242 : : case SID_CURSORRIGHT_SEL:
243 : 2 : pViewShell->ExpandBlock(nMovX, 0, SC_FOLLOW_LINE);
244 : 2 : break;
245 : : case SID_CURSORLEFT_SEL:
246 : 0 : pViewShell->ExpandBlock(-nMovX, 0, SC_FOLLOW_LINE);
247 : 0 : break;
248 : : case SID_CURSORPAGEUP_SEL:
249 : 0 : pViewShell->ExpandBlockPage(0, -nMovY);
250 : 0 : break;
251 : : case SID_CURSORPAGEDOWN_SEL:
252 : 0 : pViewShell->ExpandBlockPage(0, nMovY);
253 : 0 : break;
254 : : case SID_CURSORPAGERIGHT_SEL:
255 : 0 : pViewShell->ExpandBlockPage(nMovX, 0);
256 : 0 : break;
257 : : case SID_CURSORPAGELEFT_SEL:
258 : 0 : pViewShell->ExpandBlockPage(-nMovX, 0);
259 : 0 : break;
260 : : case SID_CURSORBLKDOWN_SEL:
261 : 0 : pViewShell->ExpandBlockArea(0, nMovY);
262 : 0 : break;
263 : : case SID_CURSORBLKUP_SEL:
264 : 0 : pViewShell->ExpandBlockArea(0, -nMovY);
265 : 0 : break;
266 : : case SID_CURSORBLKRIGHT_SEL:
267 : 0 : pViewShell->ExpandBlockArea(nMovX , 0);
268 : 0 : break;
269 : : case SID_CURSORBLKLEFT_SEL:
270 : 0 : pViewShell->ExpandBlockArea(-nMovX, 0);
271 : 0 : break;
272 : : default:
273 : : ;
274 : : }
275 : 4 : pViewShell->ShowAllCursors();
276 : :
277 [ + - ]: 4 : rReq.AppendItem( SfxInt16Item(FN_PARAM_1,static_cast<sal_Int16>(nRepeat)) );
278 : 4 : rReq.Done();
279 : 4 : }
280 : :
281 : 0 : void ScCellShell::ExecuteMove( SfxRequest& rReq )
282 : : {
283 : 0 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
284 : 0 : sal_uInt16 nSlotId = rReq.GetSlot();
285 : :
286 [ # # ][ # # ]: 0 : if(nSlotId != SID_CURSORTOPOFSCREEN && nSlotId != SID_CURSORENDOFSCREEN)
287 : 0 : pTabViewShell->ExecuteInputDirect();
288 [ # # # # : 0 : switch ( nSlotId )
# # # # #
# # # # #
# # # ]
289 : : {
290 : : case SID_NEXT_TABLE:
291 : : case SID_NEXT_TABLE_SEL:
292 : 0 : pTabViewShell->SelectNextTab( 1, (nSlotId == SID_NEXT_TABLE_SEL) );
293 : 0 : break;
294 : :
295 : : case SID_PREV_TABLE:
296 : : case SID_PREV_TABLE_SEL:
297 : 0 : pTabViewShell->SelectNextTab( -1, (nSlotId == SID_PREV_TABLE_SEL) );
298 : 0 : break;
299 : :
300 : : // cursor movements in range do not originate from Basic,
301 : : // because the ScSbxRange-object changes the marking at input
302 : :
303 : : case SID_NEXT_UNPROTECT:
304 : 0 : pTabViewShell->FindNextUnprot( false, !rReq.IsAPI() );
305 : 0 : break;
306 : :
307 : : case SID_PREV_UNPROTECT:
308 : 0 : pTabViewShell->FindNextUnprot( sal_True, !rReq.IsAPI() );
309 : 0 : break;
310 : :
311 : : case SID_CURSORENTERUP:
312 [ # # ]: 0 : if (rReq.IsAPI())
313 : 0 : pTabViewShell->MoveCursorRel( 0, -1, SC_FOLLOW_LINE, false );
314 : : else
315 : 0 : pTabViewShell->MoveCursorEnter( sal_True );
316 : 0 : break;
317 : :
318 : : case SID_CURSORENTERDOWN:
319 [ # # ]: 0 : if (rReq.IsAPI())
320 : 0 : pTabViewShell->MoveCursorRel( 0, 1, SC_FOLLOW_LINE, false );
321 : : else
322 : 0 : pTabViewShell->MoveCursorEnter( false );
323 : 0 : break;
324 : :
325 : : case SID_SELECT_COL:
326 : 0 : pTabViewShell->MarkColumns();
327 : 0 : break;
328 : :
329 : : case SID_SELECT_ROW:
330 : 0 : pTabViewShell->MarkRows();
331 : 0 : break;
332 : :
333 : : case SID_SELECT_NONE:
334 : 0 : pTabViewShell->Unmark();
335 : 0 : break;
336 : :
337 : : case SID_ALIGNCURSOR:
338 : 0 : pTabViewShell->AlignToCursor( GetViewData()->GetCurX(), GetViewData()->GetCurY(), SC_FOLLOW_JUMP );
339 : 0 : break;
340 : :
341 : : case SID_MARKDATAAREA:
342 : 0 : pTabViewShell->MarkDataArea();
343 : 0 : break;
344 : :
345 : : case SID_MARKARRAYFORMULA:
346 : 0 : pTabViewShell->MarkMatrixFormula();
347 : 0 : break;
348 : :
349 : : case SID_SETINPUTMODE:
350 : 0 : SC_MOD()->SetInputMode( SC_INPUT_TABLE );
351 : 0 : break;
352 : :
353 : : case SID_FOCUS_INPUTLINE:
354 : : {
355 : 0 : ScInputHandler* pHdl = SC_MOD()->GetInputHdl( pTabViewShell );
356 [ # # ]: 0 : if (pHdl)
357 : : {
358 : 0 : ScInputWindow* pWin = pHdl->GetInputWindow();
359 [ # # ]: 0 : if (pWin)
360 : 0 : pWin->SwitchToTextWin();
361 : : }
362 : : }
363 : 0 : break;
364 : :
365 : : case SID_CURSORTOPOFSCREEN:
366 : 0 : pTabViewShell->MoveCursorScreen( 0, -1, SC_FOLLOW_LINE, false );
367 : 0 : break;
368 : :
369 : : case SID_CURSORENDOFSCREEN:
370 : 0 : pTabViewShell->MoveCursorScreen( 0, 1, SC_FOLLOW_LINE, false );
371 : 0 : break;
372 : :
373 : : default:
374 : : OSL_FAIL("Unknown message in ViewShell (Cursor)");
375 : 0 : return;
376 : : }
377 : :
378 : 0 : rReq.Done();
379 : : }
380 : :
381 : 0 : void ScCellShell::ExecutePageSel( SfxRequest& rReq )
382 : : {
383 : 0 : sal_uInt16 nSlotId = rReq.GetSlot();
384 [ # # # # : 0 : switch ( nSlotId )
# ]
385 : : {
386 : 0 : case SID_CURSORHOME_SEL: rReq.SetSlot( SID_CURSORHOME ); break;
387 : 0 : case SID_CURSOREND_SEL: rReq.SetSlot( SID_CURSOREND ); break;
388 : 0 : case SID_CURSORTOPOFFILE_SEL: rReq.SetSlot( SID_CURSORTOPOFFILE ); break;
389 : 0 : case SID_CURSORENDOFFILE_SEL: rReq.SetSlot( SID_CURSORENDOFFILE ); break;
390 : : default:
391 : : OSL_FAIL("Unknown message in ViewShell (ExecutePageSel)");
392 : 0 : return;
393 : : }
394 [ # # ]: 0 : rReq.AppendItem( SfxBoolItem(FN_PARAM_2, sal_True) );
395 : 0 : ExecuteSlot( rReq, GetInterface() );
396 : : }
397 : :
398 : 0 : void ScCellShell::ExecutePage( SfxRequest& rReq )
399 : : {
400 : 0 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
401 : 0 : const SfxItemSet* pReqArgs = rReq.GetArgs();
402 : 0 : sal_uInt16 nSlotId = rReq.GetSlot();
403 : 0 : sal_Bool bSel = false;
404 : 0 : sal_Bool bKeep = false;
405 : :
406 [ # # ]: 0 : if ( pReqArgs != NULL )
407 : : {
408 : : const SfxPoolItem* pItem;
409 [ # # ][ # # ]: 0 : if (pReqArgs->HasItem(FN_PARAM_2, &pItem))
410 : 0 : bSel = ((const SfxBoolItem*)pItem)->GetValue();
411 : : }
412 : : else
413 : : {
414 : : // evaluate locked selection mode
415 : :
416 : 0 : sal_uInt16 nLocked = pTabViewShell->GetLockedModifiers();
417 [ # # ]: 0 : if ( nLocked & KEY_SHIFT )
418 : 0 : bSel = sal_True; // EXT
419 [ # # ]: 0 : else if ( nLocked & KEY_MOD1 )
420 : : {
421 : : // ADD mode: keep the selection, start a new block when marking with shift again
422 : 0 : bKeep = true;
423 : : }
424 : : }
425 : :
426 : 0 : pTabViewShell->ExecuteInputDirect();
427 [ # # # # : 0 : switch ( nSlotId )
# ]
428 : : {
429 : : case SID_CURSORHOME:
430 : 0 : pTabViewShell->MoveCursorEnd( -1, 0, SC_FOLLOW_LINE, bSel, bKeep );
431 : 0 : break;
432 : :
433 : : case SID_CURSOREND:
434 : 0 : pTabViewShell->MoveCursorEnd( 1, 0, SC_FOLLOW_JUMP, bSel, bKeep );
435 : 0 : break;
436 : :
437 : : case SID_CURSORTOPOFFILE:
438 : 0 : pTabViewShell->MoveCursorEnd( -1, -1, SC_FOLLOW_LINE, bSel, bKeep );
439 : 0 : break;
440 : :
441 : : case SID_CURSORENDOFFILE:
442 : 0 : pTabViewShell->MoveCursorEnd( 1, 1, SC_FOLLOW_JUMP, bSel, bKeep );
443 : 0 : break;
444 : :
445 : : default:
446 : : OSL_FAIL("Unknown message in ViewShell (ExecutePage)");
447 : 0 : return;
448 : : }
449 : :
450 [ # # ]: 0 : rReq.AppendItem( SfxBoolItem(FN_PARAM_2, bSel) );
451 : 0 : rReq.Done();
452 : : }
453 : :
454 : :
455 : :
456 : :
457 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|