summaryrefslogtreecommitdiff
path: root/svx/source/dialog/svxruler.cxx
diff options
context:
space:
mode:
authorKurt Zenker <kz@openoffice.org>2004-02-26 10:45:06 +0000
committerKurt Zenker <kz@openoffice.org>2004-02-26 10:45:06 +0000
commit883691ecb15a37ba7bdf64d2ea98d6a6b715a16f (patch)
tree8d3ae2e793a9b29bc965434a83a036d0ce4e11de /svx/source/dialog/svxruler.cxx
parentec872b1b17b1a621dcaee7d24cce859a0856637d (diff)
INTEGRATION: CWS os27 (1.22.144); FILE MERGED
2004/02/25 10:19:05 os 1.22.144.13: #i24134# prevent move of table row margin at automatic page break 2004/02/05 13:14:35 os 1.22.144.12: #i24134# proportional moving of rows horizontally fixed 2004/02/05 08:01:51 os 1.22.144.11: #i24134# proportional moving of rows completed 2004/02/02 14:38:26 os 1.22.144.10: #i24134# right border has to be calculated using the page width instead of height 2004/01/30 12:11:37 fme 1.22.144.9: #i24134# Feature - Modify table rows with the ruler 2004/01/30 11:36:29 os 1.22.144.8: #i24134# calc min/max of margins in vertical tables 2004/01/30 08:45:19 os 1.22.144.7: #i24134# rows in vertical tables 2004/01/28 16:20:30 os 1.22.144.6: #i24134# min/max reworked for columns, too 2004/01/28 12:42:03 os 1.22.144.5: #i24134# min/max of row moving 2004/01/27 14:29:23 os 1.22.144.4: #i24134# linear move of table rows 2004/01/26 15:50:50 os 1.22.144.3: #i24134# move table rows in-doc 2004/01/21 09:22:36 os 1.22.144.2: #i24134# array length corrected 2004/01/19 09:27:16 os 1.22.144.1: #i24134# modify table rows with the ruler
Diffstat (limited to 'svx/source/dialog/svxruler.cxx')
-rw-r--r--svx/source/dialog/svxruler.cxx579
1 files changed, 435 insertions, 144 deletions
diff --git a/svx/source/dialog/svxruler.cxx b/svx/source/dialog/svxruler.cxx
index 609c4331933e..cbf102c02cf6 100644
--- a/svx/source/dialog/svxruler.cxx
+++ b/svx/source/dialog/svxruler.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: svxruler.cxx,v $
*
- * $Revision: 1.22 $
+ * $Revision: 1.23 $
*
- * last change: $Author: hjs $ $Date: 2003-08-19 12:08:25 $
+ * last change: $Author: kz $ $Date: 2004-02-26 11:45:06 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -100,7 +100,7 @@
// STATIC DATA -----------------------------------------------------------
-#define CTRL_ITEM_COUNT 12
+#define CTRL_ITEM_COUNT 14
#define GAP 10
#define OBJECT_BORDER_COUNT 4
#define TAB_GAP 1
@@ -112,7 +112,7 @@
#define INDENT_RIGHT_BORDER 3
#define INDENT_COUNT 5 //without the first two old values
-#define PIXEL_H_ADJUST( l1, l2 ) (USHORT)PixelHAdjust(l1,l2)
+#define PIXEL_H_ADJUST( l1, l2 ) PixelHAdjust(l1,l2)
#ifdef DEBUGLIN
@@ -253,6 +253,7 @@ struct SvxRuler_Impl {
long lMaxLeftLogic;
long lMaxRightLogic;
long lLastLMargin;
+ long lLastRMargin;
SvxProtectItem aProtectItem;
SfxBoolItem* pTextRTLItem;
USHORT nControlerItems;
@@ -262,9 +263,12 @@ struct SvxRuler_Impl {
// zu vermeiden.
// Muesste vielleicht fuer weitere Werte
// aufgebohrt werden
+ BOOL bIsTableRows : 1; // pColumnItem contains table rows instead of columns
SvxRuler_Impl() :
pPercBuf(0), pBlockBuf(0), nPercSize(0), nTotalDist(0), nIdx(0),
- nColLeftPix(0), nColRightPix(0), lOldWinPos(0), pTextRTLItem(0)
+ nColLeftPix(0), nColRightPix(0), lOldWinPos(0), pTextRTLItem(0),
+ lLastRMargin(0),
+ bIsTableRows(FALSE)
{
}
~SvxRuler_Impl()
@@ -362,7 +366,7 @@ SvxRuler::SvxRuler
pBindings(&rBindings),
lLogicNullOffset(0),
lAppNullOffset(LONG_MAX),
- lMinFrame(10),
+ lMinFrame(5),
lInitialDragPos(0),
pCtrlItem(new SvxRulerItem *[CTRL_ITEM_COUNT]),
pRuler_Imp(new SvxRuler_Impl)
@@ -427,6 +431,7 @@ SvxRuler::SvxRuler
if((nFlags & SVXRULER_SUPPORT_BORDERS) == SVXRULER_SUPPORT_BORDERS)
{
pCtrlItem[i++] = new SvxRulerItem(bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL, *this, rBindings);
+ pCtrlItem[i++] = new SvxRulerItem(bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL, *this, rBindings);
}
pCtrlItem[i++] = new SvxRulerItem(SID_RULER_TEXT_RIGHT_TO_LEFT, *this, rBindings);
@@ -689,6 +694,7 @@ void SvxRuler::MouseMove( const MouseEvent& rMEvt )
pBindings->Update( bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL);
pBindings->Update( bHorz ? SID_ATTR_PARA_LRSPACE : SID_ATTR_PARA_LRSPACE_VERTICAL);
pBindings->Update( bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL);
+ pBindings->Update( bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL);
pBindings->Update( SID_RULER_OBJECT );
pBindings->Update( SID_RULER_PROTECT );
}
@@ -793,7 +799,8 @@ void SvxRuler::UpdateTextRTL(const SfxBoolItem* pItem)
void SvxRuler::Update
(
- const SvxColumnItem *pItem // neuer Wert
+ const SvxColumnItem *pItem, // neuer Wert
+ USHORT nSID //Slot Id to identify NULL items
)
/*
@@ -806,13 +813,25 @@ void SvxRuler::Update
{
if(bActive)
{
- delete pColumnItem; pColumnItem = 0;
if(pItem)
{
+ delete pColumnItem; pColumnItem = 0;
+ pRuler_Imp->bIsTableRows = (pItem->Which() == SID_RULER_ROWS || pItem->Which() == SID_RULER_ROWS_VERTICAL);
pColumnItem = new SvxColumnItem(*pItem);
- if(!bHorz)
+ if(!bHorz && !pRuler_Imp->bIsTableRows)
pColumnItem->SetWhich(SID_RULER_BORDERS_VERTICAL);
}
+ else if(pColumnItem && pColumnItem->Which() == nSID)
+ //there are two groups of column items table/frame columns and table rows
+ //both can occur in vertical or horizontal mode
+ //the horizontal ruler handles the SID_RULER_BORDERS and SID_RULER_ROWS_VERTICAL
+ //and the vertical handles SID_RULER_BORDERS_VERTICAL and SID_RULER_ROWS
+ //if pColumnItem is already set with one of the ids then a NULL pItem argument
+ //must not delete it
+ {
+ delete pColumnItem; pColumnItem = 0;
+ pRuler_Imp->bIsTableRows = FALSE;
+ }
StartListening_Impl();
}
}
@@ -847,16 +866,32 @@ void SvxRuler::UpdateColumns()
if ( !bProtectColumns )
nFlags |= RULER_BORDER_SIZEABLE;
- for(USHORT i = 0; i < pColumnItem->Count()-1;++i)
+ USHORT nBorders = pColumnItem->Count();
+ if(!pRuler_Imp->bIsTableRows)
+ --nBorders;
+ for(USHORT i = 0; i < nBorders; ++i)
{
pBorders[i].nStyle = nFlags;
if(!(*pColumnItem)[i].bVisible)
pBorders[i].nStyle |= RULER_STYLE_INVISIBLE;
pBorders[i].nPos =
ConvertPosPixel((*pColumnItem)[i].nEnd + lAppNullOffset);
- pBorders[i].nWidth =
- ConvertSizePixel((*pColumnItem)[i+1].nStart -
+ if(pColumnItem->Count() == i + 1)
+ {
+ //with table rows the end of the table is contained in the
+ //column item but it has no width!
+ pBorders[i].nWidth = 0;
+ }
+ else
+ {
+ pBorders[i].nWidth =
+ ConvertSizePixel((*pColumnItem)[i+1].nStart -
(*pColumnItem)[i].nEnd);
+ }
+ pBorders[i].nMinPos =
+ ConvertPosPixel((*pColumnItem)[i].nEndMin + lAppNullOffset);
+ pBorders[i].nMaxPos =
+ ConvertPosPixel((*pColumnItem)[i].nEndMax + lAppNullOffset);
}
const size_t nSize = sizeof(RulerBorder) * (pColumnItem->Count()-1);
SetBorders(pColumnItem->Count()-1, pBorders);
@@ -1563,9 +1598,10 @@ long SvxRuler::GetCorrectedDragPos( BOOL bLeft, BOOL bRight )
const long lNullPix = Ruler::GetNullOffset();
long lDragPos = GetDragPos() + lNullPix;
ADD_DEBUG_TEXT("lDragPos: ", String::CreateFromInt32(lDragPos))
- if(bLeft && lDragPos < nMaxLeft)
+ BOOL bHoriRows = bHorz && pRuler_Imp->bIsTableRows;
+ if((bLeft || (bHoriRows)) && lDragPos < nMaxLeft)
lDragPos = nMaxLeft;
- else if(bRight && lDragPos > nMaxRight)
+ else if((bRight||bHoriRows) && lDragPos > nMaxRight)
lDragPos = nMaxRight;
return lDragPos - lNullPix;
}
@@ -1603,12 +1639,16 @@ void SvxRuler::DragMargin1()
{
const long lDragPos = GetCorrectedDragPos( !TAB_FLAG || !NEG_FLAG, TRUE );
DrawLine_Impl(lTabPos, ( TAB_FLAG && NEG_FLAG ) ? 3 : 7, bHorz);
- const long nOld = bAppSetNullOffset? GetMargin1(): GetNullOffset();
if(pColumnItem&&
(//nDragType & DRAG_OBJECT_SIZE_LINEAR ||
nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL))
DragBorders();
-
+ AdjustMargin1(lDragPos);
+}
+void SvxRuler::AdjustMargin1(long lDiff)
+{
+ const long nOld = bAppSetNullOffset? GetMargin1(): GetNullOffset();
+ const long lDragPos = lDiff;
BOOL bProtectColumns =
pRuler_Imp->aProtectItem.IsSizeProtected() ||
pRuler_Imp->aProtectItem.IsPosProtected();
@@ -1733,6 +1773,11 @@ void SvxRuler::DragMargin2()
DrawLine_Impl(lTabPos, ( TAB_FLAG && NEG_FLAG ) ? 5 : 7, bHorz);
long lDiff = lDragPos - GetMargin2();
+ if(pRuler_Imp->bIsTableRows && !bHorz && pColumnItem&&
+ (//nDragType & DRAG_OBJECT_SIZE_LINEAR ||
+ nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL))
+ DragBorders();
+
BOOL bProtectColumns =
pRuler_Imp->aProtectItem.IsSizeProtected() ||
pRuler_Imp->aProtectItem.IsPosProtected();
@@ -2010,9 +2055,9 @@ void SvxRuler::DragBorders()
case RULER_DRAGSIZE_MOVE:
{
ADD_DEBUG_TEXT("lLastLMargin: ", String::CreateFromInt32(pRuler_Imp->lLastLMargin))
- lDiff=GetDragType()==RULER_TYPE_BORDER ?
+ lDiff = GetDragType()==RULER_TYPE_BORDER ?
lPos-nDragOffset - pBorders[nIdx].nPos
- : lPos - pRuler_Imp->lLastLMargin;
+ : GetDragType() == RULER_TYPE_MARGIN1 ? lPos - pRuler_Imp->lLastLMargin : lPos - pRuler_Imp->lLastRMargin;
// pBorders[nIdx].nPos += lDiff;
// lDiff = pBorders[nIdx].nPos - nOld;
@@ -2043,21 +2088,49 @@ ADD_DEBUG_TEXT("lLastLMargin: ", String::CreateFromInt32(pRuler_Imp->lLastLMargi
{
int nLimit;
long lLeft;
- if(GetDragType()==RULER_TYPE_BORDER)
- {
- nLimit=nIdx+1;
- lLeft=(pBorders[nIdx].nPos+=lDiff);
- }
- else
+ int nStartLimit = nBorderCount-2;
+ switch(GetDragType())
{
+ case RULER_TYPE_BORDER:
+ if(pRuler_Imp->bIsTableRows)
+ {
+ pBorders[nIdx].nPos += lDiff;
+ if(bHorz)
+ {
+ lLeft = pBorders[nIdx].nPos;
+ pRuler_Imp->nTotalDist -= lDiff;
+ nLimit=nIdx+1;
+ }
+ else
+ {
+ lLeft = 0;
+ nStartLimit = nIdx - 1;
+ pRuler_Imp->nTotalDist += lDiff;
+ nLimit = 0;
+ }
+ }
+ else
+ {
+ nLimit=nIdx+1;
+ pBorders[nIdx].nPos += lDiff;
+ lLeft = pBorders[nIdx].nPos;
+ pRuler_Imp->nTotalDist-=lDiff;
+ }
+ break;
+ case RULER_TYPE_MARGIN1:
nLimit=0;
lLeft=pRuler_Imp->lLastLMargin+lDiff;
+ pRuler_Imp->nTotalDist-=lDiff;
+ break;
+ case RULER_TYPE_MARGIN2:
+ nLimit = 0;
+ lLeft= 0;//pRuler_Imp->lLastRMargin + lDiff;
+ nStartLimit = nBorderCount - 2;
+ pRuler_Imp->nTotalDist += lDiff;
+ break;
}
-ADD_DEBUG_TEXT("lDiff: ", String::CreateFromInt32(lDiff))
- pRuler_Imp->nTotalDist-=lDiff;
-ADD_DEBUG_TEXT("nTotalDist: ", String::CreateFromInt32(pRuler_Imp->nTotalDist))
- for(int i = nBorderCount-2; i >= nLimit; --i)
+ for(int i = nStartLimit; i >= nLimit; --i)
{
long l = pBorders[i].nPos;
@@ -2066,17 +2139,74 @@ ADD_DEBUG_TEXT("nTotalDist: ", String::CreateFromInt32(pRuler_Imp->nTotalDist))
pRuler_Imp->pBlockBuf[i];
// RR der Spalte aktualisieren
- if(i == GetActRightColumn())
+ if(!pRuler_Imp->bIsTableRows)
{
- UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_RIGHT);
- bRightIndentsCorrected = TRUE;
+ if(i == GetActRightColumn())
+ {
+ UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_RIGHT);
+ bRightIndentsCorrected = TRUE;
+ }
+ // LAR, EZE der Spalte aktualisieren
+ else if(i == GetActLeftColumn())
+ {
+ UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_LEFT);
+ bLeftIndentsCorrected = TRUE;
+ }
}
- // LAR, EZE der Spalte aktualisieren
- else if(i == GetActLeftColumn())
+ }
+ if(pRuler_Imp->bIsTableRows)
+ {
+ //in vertical tables the left borders have to be moved
+ if(bHorz)
{
- UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_LEFT);
- bLeftIndentsCorrected = TRUE;
+ for(int i = 0; i < nIdx; ++i)
+ pBorders[i].nPos += lDiff;
+ AdjustMargin1(lDiff);
+ }
+ else
+ {
+ //otherwise the right borders are moved
+ for(int i = pColumnItem->Count() - 1; i > nIdx; --i)
+ pBorders[i].nPos += lDiff;
+ SetMargin2( GetMargin2() + lDiff, 0 );
+ }
+ }
+ }
+ else if(pRuler_Imp->bIsTableRows)
+ {
+ //moving rows: if a row is resized all following rows
+ //have to be moved by the same amount.
+ //This includes the left border when the table is not limited
+ //to a lower frame border.
+ int nLimit;
+ long lLeft;
+ if(GetDragType()==RULER_TYPE_BORDER)
+ {
+ nLimit=nIdx+1;
+ lLeft=(pBorders[nIdx].nPos+=lDiff);
+ }
+ else
+ {
+ nLimit=0;
+ lLeft=pRuler_Imp->lLastLMargin+lDiff;
+ }
+ //in vertical tables the left borders have to be moved
+ if(bHorz)
+ {
+ for(int i = 0; i < nIdx; ++i)
+ {
+ pBorders[i].nPos += lDiff;
}
+ AdjustMargin1(lDiff);
+ }
+ else
+ {
+ //otherwise the right borders are moved
+ for(int i = nBorderCount-2; i >= nLimit; --i)
+ {
+ pBorders[i].nPos += lDiff;
+ }
+ SetMargin2( GetMargin2() + lDiff, 0 );
}
}
else
@@ -2100,7 +2230,8 @@ ADD_DEBUG_TEXT("nTotalDist: ", String::CreateFromInt32(pRuler_Imp->nTotalDist))
}
if(!bRightIndentsCorrected &&
GetActRightColumn() == nIdx &&
- nDragSize != RULER_DRAGSIZE_2 && pIndents)
+ nDragSize != RULER_DRAGSIZE_2 && pIndents &&
+ !pRuler_Imp->bIsTableRows)
{
UpdateParaContents_Impl(lDiff, MOVE_RIGHT);
}
@@ -2387,17 +2518,20 @@ void SvxRuler::ApplyBorders()
ConvertHPosLogic(l) - lAppNullOffset, pColumnItem->GetLeft()));
l = GetMargin2();
if(l != pRuler_Imp->nColRightPix)
- pColumnItem->SetRight( PixelHAdjust( pPagePosItem->GetWidth() -
+ {
+ long nWidthOrHeight = bHorz ? pPagePosItem->GetWidth() : pPagePosItem->GetHeight();
+ pColumnItem->SetRight( PixelHAdjust( nWidthOrHeight -
pColumnItem->GetLeft() - ConvertHPosLogic(l) -
lAppNullOffset, pColumnItem->GetRight() ) );
+ }
}
for(USHORT i = 0; i < pColumnItem->Count()-1; ++i)
{
- USHORT& nEnd = (*pColumnItem)[i].nEnd;
+ long& nEnd = (*pColumnItem)[i].nEnd;
nEnd = PIXEL_H_ADJUST(
ConvertPosLogic(pBorders[i].nPos),
(*pColumnItem)[i].nEnd);
- USHORT& nStart = (*pColumnItem)[i+1].nStart;
+ long& nStart = (*pColumnItem)[i+1].nStart;
nStart = PIXEL_H_ADJUST(
ConvertSizeLogic(pBorders[i].nPos +
pBorders[i].nWidth) -
@@ -2405,14 +2539,16 @@ void SvxRuler::ApplyBorders()
(*pColumnItem)[i+1].nStart);
// Es kann sein, dass aufgrund der PIXEL_H_ADJUST rejustierung auf
// alte Werte die Breite < 0 wird. Das rerejustieren wir.
- if( nEnd > nStart ) nStart = nEnd;
+ if( nEnd > nStart )
+ nStart = nEnd;
}
#ifdef DEBUGLIN
Debug_Impl(pEditWin,*pColumnItem);
#endif // DEBUGLIN
SfxBoolItem aFlag(SID_RULER_ACT_LINE_ONLY,
nDragType & DRAG_OBJECT_ACTLINE_ONLY? TRUE: FALSE);
- USHORT nColId = bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL;
+ USHORT nColId = pRuler_Imp->bIsTableRows ? (bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL) :
+ (bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL);
pBindings->GetDispatcher()->Execute( nColId, SFX_CALLMODE_RECORD, pColumnItem, &aFlag, 0L );
}
@@ -2458,12 +2594,13 @@ void SvxRuler::PrepareProportional_Impl(RulerType eType)
pRuler_Imp->nTotalDist = GetMargin2();
switch((int)eType)
{
+ case RULER_TYPE_MARGIN2:
case RULER_TYPE_MARGIN1:
case RULER_TYPE_BORDER:
{
DBG_ASSERT(pColumnItem, "kein ColumnItem");
- pRuler_Imp->SetPercSize(nBorderCount);
+ pRuler_Imp->SetPercSize(pColumnItem->Count());
long lPos;
long lWidth=0;
@@ -2474,42 +2611,92 @@ void SvxRuler::PrepareProportional_Impl(RulerType eType)
long lActBorderSum;
long lOrigLPos;
- if(eType==RULER_TYPE_MARGIN1)
+ if(eType != RULER_TYPE_BORDER)
{
- lOrigLPos=GetMargin1();
- nStart=0;
- lActBorderSum=0;
+ lOrigLPos = GetMargin1();
+ nStart = 0;
+ lActBorderSum = 0;
}
else
{
- lOrigLPos=pBorders[nIdx].nPos+pBorders[nIdx].nWidth;
- nStart=1;
- lActBorderSum=pBorders[nIdx].nWidth;
+ if(pRuler_Imp->bIsTableRows &&!bHorz)
+ {
+ lOrigLPos = GetMargin1();
+ nStart = 0;
+ }
+ else
+ {
+ lOrigLPos = pBorders[nIdx].nPos + pBorders[nIdx].nWidth;
+ nStart = 1;
+ }
+ lActBorderSum = pBorders[nIdx].nWidth;
}
- lPos=lOrigLPos;
- for(USHORT ii = nStart; ii < nBorderCount-1; ++ii)
+ //in horizontal mode the percentage value has to be
+ //calculated on a "current change" position base
+ //because the height of the table changes while dragging
+ if(pRuler_Imp->bIsTableRows && RULER_TYPE_BORDER == eType)
{
- lWidth+=pBorders[ii].nPos-lPos;
- lPos=pBorders[ii].nPos+pBorders[ii].nWidth;
- }
+ USHORT nStartBorder;
+ USHORT nEndBorder;
+ if(bHorz)
+ {
+ nStartBorder = nIdx + 1;
+ nEndBorder = pColumnItem->Count() - 1;
+ }
+ else
+ {
+ nStartBorder = 0;
+ nEndBorder = nIdx;
+ }
- lWidth+=GetMargin2()-lPos;
- pRuler_Imp->nTotalDist=lWidth;
- lPos=lOrigLPos;
+ lWidth = pBorders[nIdx].nPos;
+ if(bHorz)
+ lWidth = GetMargin2() - lWidth;
+ pRuler_Imp->nTotalDist = lWidth;
+ lPos = lOrigLPos = pBorders[nIdx].nPos;
- for(USHORT i = nStart; i < nBorderCount-1; ++i)
+ for(USHORT i = nStartBorder; i < nEndBorder; ++i)
+ {
+ if(bHorz)
+ {
+ lActWidth += pBorders[i].nPos - lPos;
+ lPos = pBorders[i].nPos + pBorders[i].nWidth;
+ }
+ else
+ lActWidth = pBorders[i].nPos;
+ pRuler_Imp->pPercBuf[i] = (USHORT)((lActWidth * 1000)
+ / pRuler_Imp->nTotalDist);
+ pRuler_Imp->pBlockBuf[i] = (USHORT)lActBorderSum;
+ lActBorderSum += pBorders[i].nWidth;
+ }
+ }
+ else
{
- lActWidth+=pBorders[i].nPos-lPos;
- lPos=pBorders[i].nPos+pBorders[i].nWidth;
- pRuler_Imp->pPercBuf[i] = (USHORT)((lActWidth * 1000)
- / pRuler_Imp->nTotalDist);
- pRuler_Imp->pBlockBuf[i]=(USHORT)lActBorderSum;
- lActBorderSum+=pBorders[i].nWidth;
+ lPos = lOrigLPos;
+ for(USHORT ii = nStart; ii < pColumnItem->Count() - 1; ++ii)
+ {
+ lWidth += pBorders[ii].nPos - lPos;
+ lPos = pBorders[ii].nPos + pBorders[ii].nWidth;
+ }
+
+ lWidth += GetMargin2() - lPos;
+ pRuler_Imp->nTotalDist = lWidth;
+ lPos = lOrigLPos;
+
+ for(USHORT i = nStart; i < pColumnItem->Count() - 1; ++i)
+ {
+ lActWidth += pBorders[i].nPos - lPos;
+ lPos = pBorders[i].nPos + pBorders[i].nWidth;
+ pRuler_Imp->pPercBuf[i] = (USHORT)((lActWidth * 1000)
+ / pRuler_Imp->nTotalDist);
+ pRuler_Imp->pBlockBuf[i] = (USHORT)lActBorderSum;
+ lActBorderSum += pBorders[i].nWidth;
+ }
}
- break;
}
- case RULER_TYPE_TAB:
+ break;
+ case RULER_TYPE_TAB:
{
const USHORT nIdx = GetDragAryPos()+TAB_GAP;
pRuler_Imp->nTotalDist -= pTabs[nIdx].nPos;
@@ -2541,7 +2728,15 @@ void SvxRuler::EvalModifier()
*/
{
- switch(GetDragModifier()) {
+ USHORT nModifier = GetDragModifier();
+ if(pRuler_Imp->bIsTableRows)
+ {
+ //rows can only be moved in one way, additionally current column is possible
+ if(nModifier == KEY_SHIFT)
+ nModifier = 0;
+ }
+ switch(nModifier)
+ {
case KEY_SHIFT:
nDragType = DRAG_OBJECT_SIZE_LINEAR;
break;
@@ -2583,6 +2778,7 @@ void __EXPORT SvxRuler::Click()
pBindings->Update( bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL);
pBindings->Update( bHorz ? SID_ATTR_PARA_LRSPACE : SID_ATTR_PARA_LRSPACE_VERTICAL);
pBindings->Update( bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL);
+ pBindings->Update( bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL);
pBindings->Update( SID_RULER_OBJECT );
pBindings->Update( SID_RULER_PROTECT );
pBindings->Update( SID_ATTR_PARA_LRSPACE_VERTICAL );
@@ -2669,6 +2865,22 @@ void SvxRuler::CalcMinMax()
lMinFrame;
}
}
+ else if(pRuler_Imp->bIsTableRows)
+ {
+ //top border is not moveable when table rows are displayed
+ // protection of content means the margin is not moveable - it's just a page break inside of a cell
+ if(bHorz && !pRuler_Imp->aProtectItem.IsCntntProtected())
+ {
+ nMaxLeft = pBorders[0].nMinPos + lNullPix;
+ if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
+ nMaxRight = GetRightIndent() + lNullPix -
+ (pColumnItem->Count() - 1 ) * lMinFrame;
+ else
+ nMaxRight = pBorders[0].nPos - lMinFrame + lNullPix;
+ }
+ else
+ nMaxLeft = nMaxRight = lNullPix;
+ }
else
{
if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
@@ -2741,6 +2953,27 @@ void SvxRuler::CalcMinMax()
lMinFrame + lNullPix;
}
}
+ else if(pRuler_Imp->bIsTableRows)
+ {
+ // get the bottom move range from the last border position - only available for rows!
+ // protection of content means the margin is not moveable - it's just a page break inside of a cell
+ if(bHorz || pRuler_Imp->aProtectItem.IsCntntProtected())
+ {
+ nMaxLeft = nMaxRight = pBorders[pColumnItem->Count() - 1].nMaxPos + lNullPix;
+ }
+ else
+ {
+ if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
+ {
+ nMaxLeft = (pColumnItem->Count()) * lMinFrame + lNullPix;
+ }
+ else
+ {
+ nMaxLeft = pBorders[pColumnItem->Count() - 2].nPos + lMinFrame + lNullPix;
+ }
+ nMaxRight = pBorders[pColumnItem->Count() - 2].nMaxPos + lNullPix;
+ }
+ }
else
{
nMaxLeft = lMinFrame + lNullPix;
@@ -2812,107 +3045,162 @@ void SvxRuler::CalcMinMax()
{
if(pColumnItem)
{
+ //nIdx contains the position of the currently moved item
+ //next visible separator on the left
USHORT nLeftCol=GetActLeftColumn(FALSE, nIdx);
+ //next visible separator on the right
USHORT nRightCol=GetActRightColumn(FALSE, nIdx);
+ //next separator on the left - regardless if visible or not
USHORT nActLeftCol=GetActLeftColumn();
+ //next separator on the right - regardless if visible or not
USHORT nActRightCol=GetActRightColumn();
- if(nLeftCol==USHRT_MAX)
- nMaxLeft=lNullPix;
- else
- nMaxLeft = pBorders[nLeftCol].nPos +
- pBorders[nLeftCol].nWidth + lNullPix;
-
- if(nActRightCol == nIdx)
+ if(pColumnItem->IsTable())
{
- if(bRTL)
+ if(nDragType & DRAG_OBJECT_ACTLINE_ONLY)
{
- nMaxLeft += pBorders[nIdx].nPos +
- GetRightIndent() - Max(GetFirstLineIndent(),
- GetLeftIndent());
- if(nActLeftCol!=USHRT_MAX)
- nMaxLeft -= pBorders[nActLeftCol].nPos +
- pBorders[nActLeftCol].nWidth;
+ //the current row/column should be modified only
+ //then the next/previous visible border position
+ //marks the min/max positions
+ nMaxLeft = nLeftCol == USHRT_MAX ?
+ 0 :
+ pBorders[nLeftCol].nPos;
+ //rows can always be increased without a limit
+ if(pRuler_Imp->bIsTableRows)
+ nMaxRight = pBorders[nIdx].nMaxPos;
+ else
+ nMaxRight = nRightCol == USHRT_MAX ?
+ GetMargin2():
+ pBorders[nRightCol].nPos;
+ nMaxLeft += lNullPix;
+ nMaxRight += lNullPix;
}
else
{
- nMaxLeft += pBorders[nIdx].nPos -
- GetRightIndent() + Max(GetFirstLineIndent(),
- GetLeftIndent());
- if(nActLeftCol!=USHRT_MAX)
- nMaxLeft -= pBorders[nActLeftCol].nPos +
- pBorders[nActLeftCol].nWidth;
+ if(DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType && !bHorz && pRuler_Imp->bIsTableRows)
+ nMaxLeft = (nIdx + 1) * lMinFrame + lNullPix;
+ else
+ nMaxLeft = pBorders[nIdx].nMinPos + lNullPix;
+ if(DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType||
+ (DRAG_OBJECT_SIZE_LINEAR & nDragType) )
+ {
+ if(pRuler_Imp->bIsTableRows)
+ {
+ if(bHorz)
+ nMaxRight = GetRightIndent() + lNullPix -
+ (pColumnItem->Count() - nIdx - 1) * lMinFrame;
+ else
+ nMaxRight = pBorders[nIdx].nMaxPos + lNullPix;
+ }
+ else
+ nMaxRight=lNullPix+CalcPropMaxRight(nIdx);
+ }
+ else
+ nMaxRight = pBorders[nIdx].nMaxPos + lNullPix;
}
- }
- nMaxLeft += lMinFrame;
- nMaxLeft += nDragOffset;
+ nMaxLeft += lMinFrame;
+ nMaxRight -= lMinFrame;
- // nMaxRight
- // linear / proprotional verschieben
- if(DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType||
- (DRAG_OBJECT_SIZE_LINEAR & nDragType) )
- {
- nMaxRight=lNullPix+CalcPropMaxRight(nIdx);
- }
- else if(DRAG_OBJECT_SIZE_LINEAR & nDragType)
- {
- nMaxRight=lNullPix+GetMargin2()-GetMargin1()+
- (nBorderCount-nIdx-1)*lMinFrame;
}
else
{
- if(nRightCol==USHRT_MAX)
- { // letzte Spalte
- nMaxRight = GetMargin2() + lNullPix;
- if(IsActLastColumn())
+ if(nLeftCol==USHRT_MAX)
+ nMaxLeft=lNullPix;
+ else
+ nMaxLeft = pBorders[nLeftCol].nPos +
+ pBorders[nLeftCol].nWidth + lNullPix;
+
+ if(nActRightCol == nIdx)
+ {
+ if(bRTL)
{
- if(bRTL)
- {
- nMaxRight -=
- GetMargin2() + GetRightIndent() -
- Max(GetFirstLineIndent(),
- GetLeftIndent());
- }
- else
- {
- nMaxRight -=
- GetMargin2() - GetRightIndent() +
- Max(GetFirstLineIndent(),
- GetLeftIndent());
- }
- nMaxRight += pBorders[nIdx].nPos +
- pBorders[nIdx].nWidth;
+ nMaxLeft += pBorders[nIdx].nPos +
+ GetRightIndent() - Max(GetFirstLineIndent(),
+ GetLeftIndent());
+ if(nActLeftCol!=USHRT_MAX)
+ nMaxLeft -= pBorders[nActLeftCol].nPos +
+ pBorders[nActLeftCol].nWidth;
+ }
+ else
+ {
+ nMaxLeft += pBorders[nIdx].nPos -
+ GetRightIndent() + Max(GetFirstLineIndent(),
+ GetLeftIndent());
+ if(nActLeftCol!=USHRT_MAX)
+ nMaxLeft -= pBorders[nActLeftCol].nPos +
+ pBorders[nActLeftCol].nWidth;
}
}
+ nMaxLeft += lMinFrame;
+ nMaxLeft += nDragOffset;
+
+ // nMaxRight
+ // linear / proprotional verschieben
+ if(DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType||
+ (DRAG_OBJECT_SIZE_LINEAR & nDragType) )
+ {
+ nMaxRight=lNullPix+CalcPropMaxRight(nIdx);
+ }
+ else if(DRAG_OBJECT_SIZE_LINEAR & nDragType)
+ {
+ nMaxRight=lNullPix+GetMargin2()-GetMargin1()+
+ (nBorderCount-nIdx-1)*lMinFrame;
+ }
else
{
- nMaxRight = lNullPix + pBorders[nRightCol].nPos;
- USHORT nNotHiddenRightCol =
- GetActRightColumn(TRUE, nIdx);
-
- if( nActLeftCol == nIdx )
- {
- long nBorder = nNotHiddenRightCol ==
- USHRT_MAX ?
- GetMargin2() :
- pBorders[nNotHiddenRightCol].nPos;
- if(bRTL)
+ if(nRightCol==USHRT_MAX)
+ { // letzte Spalte
+ nMaxRight = GetMargin2() + lNullPix;
+ if(IsActLastColumn())
{
- nMaxRight -= nBorder + GetRightIndent() -
- Max(GetFirstLineIndent(),
- GetLeftIndent());
+ if(bRTL)
+ {
+ nMaxRight -=
+ GetMargin2() + GetRightIndent() -
+ Max(GetFirstLineIndent(),
+ GetLeftIndent());
+ }
+ else
+ {
+ nMaxRight -=
+ GetMargin2() - GetRightIndent() +
+ Max(GetFirstLineIndent(),
+ GetLeftIndent());
+ }
+ nMaxRight += pBorders[nIdx].nPos +
+ pBorders[nIdx].nWidth;
}
- else
+ }
+ else
+ {
+ nMaxRight = lNullPix + pBorders[nRightCol].nPos;
+ USHORT nNotHiddenRightCol =
+ GetActRightColumn(TRUE, nIdx);
+
+ if( nActLeftCol == nIdx )
{
- nMaxRight -= nBorder - GetRightIndent() +
- Max(GetFirstLineIndent(),
- GetLeftIndent());
+ long nBorder = nNotHiddenRightCol ==
+ USHRT_MAX ?
+ GetMargin2() :
+ pBorders[nNotHiddenRightCol].nPos;
+ if(bRTL)
+ {
+ nMaxRight -= nBorder + GetRightIndent() -
+ Max(GetFirstLineIndent(),
+ GetLeftIndent());
+ }
+ else
+ {
+ nMaxRight -= nBorder - GetRightIndent() +
+ Max(GetFirstLineIndent(),
+ GetLeftIndent());
+ }
+ nMaxRight += pBorders[nIdx].nPos +
+ pBorders[nIdx].nWidth;
}
- nMaxRight += pBorders[nIdx].nPos +
- pBorders[nIdx].nWidth;
}
+ nMaxRight -= lMinFrame;
+ nMaxRight -= pBorders[nIdx].nWidth;
}
- nMaxRight -= lMinFrame;
- nMaxRight -= pBorders[nIdx].nWidth;
}
}
// ObjectItem
@@ -3106,6 +3394,7 @@ long __EXPORT SvxRuler::StartDrag()
return FALSE;
pRuler_Imp->lLastLMargin=GetMargin1();
+ pRuler_Imp->lLastRMargin=GetMargin2();
long bOk = 1;
if(GetStartDragHdl().IsSet())
bOk = Ruler::StartDrag();
@@ -3189,6 +3478,7 @@ void __EXPORT SvxRuler::Drag()
break;
case RULER_TYPE_MARGIN2: // rechter Rand umgebender Frame
DragMargin2();
+ pRuler_Imp->lLastRMargin = GetMargin2();
break;
case RULER_TYPE_INDENT: // Absatzeinzuege
DragIndents();
@@ -3239,7 +3529,8 @@ void __EXPORT SvxRuler::EndDrag()
}
break;
case RULER_TYPE_BORDER: // Tabelle, Spalten
- if(lInitialDragPos != lPos)
+ if(lInitialDragPos != lPos ||
+ (pRuler_Imp->bIsTableRows && bHorz)) //special case - the null offset is changed here
{
if(pColumnItem)
{