Lines 62-67
Link Here
|
62 |
#include "waitoff.hxx" |
62 |
#include "waitoff.hxx" |
63 |
#include "globstr.hrc" |
63 |
#include "globstr.hrc" |
64 |
#include "scmod.hxx" |
64 |
#include "scmod.hxx" |
|
|
65 |
#include "tabprotection.hxx" |
65 |
|
66 |
|
66 |
#define SC_BLOCKMODE_NONE 0 |
67 |
#define SC_BLOCKMODE_NONE 0 |
67 |
#define SC_BLOCKMODE_NORMAL 1 |
68 |
#define SC_BLOCKMODE_NORMAL 1 |
Lines 178-193
void ScTabView::InitBlockMode( SCCOL nCurX, SCROW nCurY, SCTAB nCurZ,
Link Here
|
178 |
InvertBlockMark( nBlockStartX,nBlockStartY,nBlockEndX,nBlockEndY ); |
179 |
InvertBlockMark( nBlockStartX,nBlockStartY,nBlockEndX,nBlockEndY ); |
179 |
#endif |
180 |
#endif |
180 |
UpdateSelectionOverlay(); |
181 |
UpdateSelectionOverlay(); |
181 |
|
|
|
182 |
bNewStartIfMarking = FALSE; // use only once |
183 |
} |
182 |
} |
184 |
} |
183 |
} |
185 |
|
184 |
|
186 |
void ScTabView::SetNewStartIfMarking() |
|
|
187 |
{ |
188 |
bNewStartIfMarking = TRUE; |
189 |
} |
190 |
|
191 |
void ScTabView::DoneBlockMode( BOOL bContinue ) // Default FALSE |
185 |
void ScTabView::DoneBlockMode( BOOL bContinue ) // Default FALSE |
192 |
{ |
186 |
{ |
193 |
// Wenn zwischen Tabellen- und Header SelectionEngine gewechselt wird, |
187 |
// Wenn zwischen Tabellen- und Header SelectionEngine gewechselt wird, |
Lines 414-419
void ScTabView::MarkCursor( SCCOL nCurX, SCROW nCurY, SCTAB nCurZ,
Link Here
|
414 |
aHdrFunc.SetAnchorFlag( FALSE ); |
408 |
aHdrFunc.SetAnchorFlag( FALSE ); |
415 |
} |
409 |
} |
416 |
|
410 |
|
|
|
411 |
void ScTabView::GetPageMoveEndPosition(SCsCOL nMovX, SCsROW nMovY, SCsCOL& rPageX, SCsROW& rPageY) |
412 |
{ |
413 |
SCCOL nCurX; |
414 |
SCROW nCurY; |
415 |
aViewData.GetMoveCursor( nCurX,nCurY ); |
416 |
|
417 |
ScSplitPos eWhich = aViewData.GetActivePart(); |
418 |
ScHSplitPos eWhichX = WhichH( eWhich ); |
419 |
ScVSplitPos eWhichY = WhichV( eWhich ); |
420 |
|
421 |
SCsCOL nPageX; |
422 |
SCsROW nPageY; |
423 |
if (nMovX >= 0) |
424 |
nPageX = ((SCsCOL) aViewData.CellsAtX( nCurX, 1, eWhichX )) * nMovX; |
425 |
else |
426 |
nPageX = ((SCsCOL) aViewData.CellsAtX( nCurX, -1, eWhichX )) * nMovX; |
427 |
|
428 |
if (nMovY >= 0) |
429 |
nPageY = ((SCsROW) aViewData.CellsAtY( nCurY, 1, eWhichY )) * nMovY; |
430 |
else |
431 |
nPageY = ((SCsROW) aViewData.CellsAtY( nCurY, -1, eWhichY )) * nMovY; |
432 |
|
433 |
if (nMovX != 0 && nPageX == 0) nPageX = (nMovX>0) ? 1 : -1; |
434 |
if (nMovY != 0 && nPageY == 0) nPageY = (nMovY>0) ? 1 : -1; |
435 |
|
436 |
rPageX = nPageX; |
437 |
rPageY = nPageY; |
438 |
} |
439 |
|
440 |
void ScTabView::GetAreaMoveEndPosition(SCsCOL nMovX, SCsROW nMovY, ScFollowMode eMode, |
441 |
SCsCOL& rAreaX, SCsROW& rAreaY, ScFollowMode& rMode) |
442 |
{ |
443 |
SCCOL nNewX = -1; |
444 |
SCROW nNewY = -1; |
445 |
SCCOL nCurX = -1; |
446 |
SCROW nCurY = -1; |
447 |
|
448 |
if (aViewData.IsRefMode()) |
449 |
{ |
450 |
nNewX = aViewData.GetRefEndX(); |
451 |
nNewY = aViewData.GetRefEndY(); |
452 |
} |
453 |
else if (IsBlockMode()) |
454 |
{ |
455 |
nNewX = nBlockEndX; |
456 |
nNewY = nBlockEndY; |
457 |
} |
458 |
else |
459 |
{ |
460 |
nNewX = nCurX = aViewData.GetCurX(); |
461 |
nNewY = nCurY = aViewData.GetCurY(); |
462 |
} |
463 |
|
464 |
ScDocument* pDoc = aViewData.GetDocument(); |
465 |
SCTAB nTab = aViewData.GetTabNo(); |
466 |
|
467 |
// FindAreaPos kennt nur -1 oder 1 als Richtung |
468 |
|
469 |
SCsCOLROW i; |
470 |
if ( nMovX > 0 ) |
471 |
for ( i=0; i<nMovX; i++ ) |
472 |
pDoc->FindAreaPos( nNewX, nNewY, nTab, 1, 0 ); |
473 |
if ( nMovX < 0 ) |
474 |
for ( i=0; i<-nMovX; i++ ) |
475 |
pDoc->FindAreaPos( nNewX, nNewY, nTab, -1, 0 ); |
476 |
if ( nMovY > 0 ) |
477 |
for ( i=0; i<nMovY; i++ ) |
478 |
pDoc->FindAreaPos( nNewX, nNewY, nTab, 0, 1 ); |
479 |
if ( nMovY < 0 ) |
480 |
for ( i=0; i<-nMovY; i++ ) |
481 |
pDoc->FindAreaPos( nNewX, nNewY, nTab, 0, -1 ); |
482 |
|
483 |
if (eMode==SC_FOLLOW_JUMP) // unten/rechts nicht zuviel grau anzeigen |
484 |
{ |
485 |
if (nMovX != 0 && nNewX == MAXCOL) |
486 |
eMode = SC_FOLLOW_LINE; |
487 |
if (nMovY != 0 && nNewY == MAXROW) |
488 |
eMode = SC_FOLLOW_LINE; |
489 |
} |
490 |
|
491 |
if (aViewData.IsRefMode()) |
492 |
{ |
493 |
rAreaX = nNewX - aViewData.GetRefEndX(); |
494 |
rAreaY = nNewY - aViewData.GetRefEndY(); |
495 |
} |
496 |
else if (IsBlockMode()) |
497 |
{ |
498 |
rAreaX = nNewX - nBlockEndX; |
499 |
rAreaY = nNewY - nBlockEndY; |
500 |
} |
501 |
else |
502 |
{ |
503 |
rAreaX = nNewX - nCurX; |
504 |
rAreaY = nNewY - nCurY; |
505 |
} |
506 |
rMode = eMode; |
507 |
} |
508 |
|
509 |
namespace { |
510 |
|
511 |
bool lcl_isCellQualified(ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB nTab, bool bSelectLocked, bool bSelectUnlocked) |
512 |
{ |
513 |
bool bCellProtected = pDoc->HasAttrib( |
514 |
nCol, nRow, nTab, nCol, nRow, nTab, HASATTR_PROTECTED); |
515 |
|
516 |
if (bCellProtected && !bSelectLocked) |
517 |
return false; |
518 |
|
519 |
if (!bCellProtected && !bSelectUnlocked) |
520 |
return false; |
521 |
|
522 |
return true; |
523 |
} |
524 |
|
525 |
void lcl_moveCursorByProtRule( |
526 |
SCCOL& rCol, SCROW& rRow, SCsCOL nMovX, SCsROW nMovY, SCTAB nTab, ScDocument* pDoc) |
527 |
{ |
528 |
bool bSelectLocked = true; |
529 |
bool bSelectUnlocked = true; |
530 |
ScTableProtection* pTabProtection = pDoc->GetTabProtection(nTab); |
531 |
if (pTabProtection && pTabProtection->isProtected()) |
532 |
{ |
533 |
bSelectLocked = pTabProtection->isOptionEnabled(ScTableProtection::SELECT_LOCKED_CELLS); |
534 |
bSelectUnlocked = pTabProtection->isOptionEnabled(ScTableProtection::SELECT_UNLOCKED_CELLS); |
535 |
} |
536 |
|
537 |
if (nMovX > 0) |
538 |
{ |
539 |
for (SCCOL i = 0; i < nMovX; ++i) |
540 |
{ |
541 |
if (!lcl_isCellQualified(pDoc, rCol+1, rRow, nTab, bSelectLocked, bSelectUnlocked)) |
542 |
break; |
543 |
++rCol; |
544 |
} |
545 |
} |
546 |
else if (nMovX < 0) |
547 |
{ |
548 |
nMovX = -nMovX; |
549 |
for (SCCOL i = 0; i < nMovX; ++i) |
550 |
{ |
551 |
if (!lcl_isCellQualified(pDoc, rCol-1, rRow, nTab, bSelectLocked, bSelectUnlocked)) |
552 |
break; |
553 |
--rCol; |
554 |
} |
555 |
} |
556 |
|
557 |
if (nMovY > 0) |
558 |
{ |
559 |
for (SCROW i = 0; i < nMovY; ++i) |
560 |
{ |
561 |
if (!lcl_isCellQualified(pDoc, rCol, rRow+1, nTab, bSelectLocked, bSelectUnlocked)) |
562 |
break; |
563 |
++rRow; |
564 |
} |
565 |
} |
566 |
else if (nMovY < 0) |
567 |
{ |
568 |
nMovY = -nMovY; |
569 |
for (SCROW i = 0; i < nMovY; ++i) |
570 |
{ |
571 |
if (!lcl_isCellQualified(pDoc, rCol, rRow-1, nTab, bSelectLocked, bSelectUnlocked)) |
572 |
break; |
573 |
--rRow; |
574 |
} |
575 |
} |
576 |
} |
577 |
|
578 |
} |
579 |
|
580 |
void ScTabView::ExpandBlock(SCsCOL nMovX, SCsROW nMovY, ScFollowMode eMode) |
581 |
{ |
582 |
if (!nMovX && !nMovY) |
583 |
// Nothing to do. Bail out. |
584 |
return; |
585 |
|
586 |
ScDocument* pDoc = aViewData.GetDocument(); |
587 |
|
588 |
if (aViewData.IsRefMode()) |
589 |
{ |
590 |
// formula reference mode |
591 |
|
592 |
SCCOL nNewX = aViewData.GetRefEndX(); |
593 |
SCROW nNewY = aViewData.GetRefEndY(); |
594 |
SCTAB nRefTab = aViewData.GetRefEndZ(); |
595 |
|
596 |
bool bSelectLocked = true; |
597 |
bool bSelectUnlocked = true; |
598 |
ScTableProtection* pTabProtection = pDoc->GetTabProtection(nRefTab); |
599 |
if (pTabProtection && pTabProtection->isProtected()) |
600 |
{ |
601 |
bSelectLocked = pTabProtection->isOptionEnabled(ScTableProtection::SELECT_LOCKED_CELLS); |
602 |
bSelectUnlocked = pTabProtection->isOptionEnabled(ScTableProtection::SELECT_UNLOCKED_CELLS); |
603 |
} |
604 |
|
605 |
lcl_moveCursorByProtRule(nNewX, nNewY, nMovX, nMovY, nRefTab, pDoc); |
606 |
|
607 |
if (nMovX) |
608 |
{ |
609 |
SCCOL nTempX = nNewX; |
610 |
while (pDoc->IsHorOverlapped(nTempX, nNewY, nRefTab)) |
611 |
{ |
612 |
if (nMovX > 0) |
613 |
++nTempX; |
614 |
else |
615 |
--nTempX; |
616 |
} |
617 |
if (lcl_isCellQualified(pDoc, nTempX, nNewY, nRefTab, bSelectLocked, bSelectUnlocked)) |
618 |
nNewX = nTempX; |
619 |
} |
620 |
|
621 |
if (nMovY) |
622 |
{ |
623 |
SCROW nTempY = nNewY; |
624 |
while (pDoc->IsVerOverlapped(nNewX, nTempY, nRefTab)) |
625 |
{ |
626 |
if (nMovY > 0) |
627 |
++nTempY; |
628 |
else |
629 |
--nTempY; |
630 |
} |
631 |
if (lcl_isCellQualified(pDoc, nNewX, nTempY, nRefTab, bSelectLocked, bSelectUnlocked)) |
632 |
nNewY = nTempY; |
633 |
} |
634 |
|
635 |
pDoc->SkipOverlapped(nNewX, nNewY, nRefTab); |
636 |
UpdateRef(nNewX, nNewY, nRefTab); |
637 |
} |
638 |
else |
639 |
{ |
640 |
// normal selection mode |
641 |
|
642 |
SCTAB nTab = aViewData.GetTabNo(); |
643 |
|
644 |
if (!IsBlockMode()) |
645 |
InitBlockMode(aViewData.GetCurX(), aViewData.GetCurY(), nTab, true); |
646 |
|
647 |
lcl_moveCursorByProtRule(nBlockEndX, nBlockEndY, nMovX, nMovY, nTab, pDoc); |
648 |
|
649 |
if (nBlockEndX < 0) |
650 |
nBlockEndX = 0; |
651 |
else if (nBlockEndX > MAXCOL) |
652 |
nBlockEndX = MAXCOL; |
653 |
|
654 |
if (nBlockEndY < 0) |
655 |
nBlockEndY = 0; |
656 |
else if (nBlockEndY > MAXROW) |
657 |
nBlockEndY = MAXROW; |
658 |
|
659 |
pDoc->SkipOverlapped(nBlockEndX, nBlockEndY, nTab); |
660 |
MarkCursor(nBlockEndX, nBlockEndY, nTab, false, false, true); |
661 |
AlignToCursor(nBlockEndX, nBlockEndY, eMode); |
662 |
} |
663 |
} |
664 |
|
665 |
void ScTabView::ExpandBlockPage(SCsCOL nMovX, SCsROW nMovY) |
666 |
{ |
667 |
SCsCOL nPageX; |
668 |
SCsROW nPageY; |
669 |
GetPageMoveEndPosition(nMovX, nMovY, nPageX, nPageY); |
670 |
ExpandBlock(nPageX, nPageY, SC_FOLLOW_FIX); |
671 |
} |
672 |
|
673 |
void ScTabView::ExpandBlockArea(SCsCOL nMovX, SCsROW nMovY) |
674 |
{ |
675 |
SCsCOL nAreaX; |
676 |
SCsROW nAreaY; |
677 |
ScFollowMode eMode; |
678 |
GetAreaMoveEndPosition(nMovX, nMovY, SC_FOLLOW_JUMP, nAreaX, nAreaY, eMode); |
679 |
ExpandBlock(nAreaX, nAreaY, eMode); |
680 |
} |
681 |
|
417 |
void ScTabView::UpdateSelectionOverlay() |
682 |
void ScTabView::UpdateSelectionOverlay() |
418 |
{ |
683 |
{ |
419 |
for (USHORT i=0; i<4; i++) |
684 |
for (USHORT i=0; i<4; i++) |