Kaydet (Commit) dda8877b authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl

Ruler: minimal unit 1/16 inch, 1/10 cm, dynamic tick draw, various

- minimal unit for inch is 1/16 and for cm 1/10 (1mm)
- additional tick level (now 4 in total)
- top and bottom tick in addition to the number (highes tick level)
- dynamically draw tick levels depending on the tick gap (should be
  at least 6 pixel wide)

Change-Id: I0598b16e32d19eb1294a2358eacbeb19a70966a2
üst be075928
...@@ -592,9 +592,10 @@ struct RulerUnitData ...@@ -592,9 +592,10 @@ struct RulerUnitData
{ {
MapUnit eMapUnit; // MAP_UNIT for calculaion MapUnit eMapUnit; // MAP_UNIT for calculaion
long nTickUnit; // Unit divider long nTickUnit; // Unit divider
long nTick1; // Minimal step double nTick1; // Minimal step
long nTick2; // Tick half unit double nTick2; // Tick quarter unit
long nTick3; // Tick whole unit double nTick3; // Tick half unit
double nTick4; // Tick whole unit
long n100THMM; // 100mm Unit divider long n100THMM; // 100mm Unit divider
sal_uInt16 nUnitDigits; // Number of digits sal_uInt16 nUnitDigits; // Number of digits
sal_Char aUnitStr[8]; // Unit string sal_Char aUnitStr[8]; // Unit string
...@@ -665,7 +666,7 @@ private: ...@@ -665,7 +666,7 @@ private:
SVT_DLLPRIVATE void ImplVDrawRect( long nX1, long nY1, long nX2, long nY2 ); SVT_DLLPRIVATE void ImplVDrawRect( long nX1, long nY1, long nX2, long nY2 );
SVT_DLLPRIVATE void ImplVDrawText( long nX, long nY, const OUString& rText, long nMin = LONG_MIN, long nMax = LONG_MAX ); SVT_DLLPRIVATE void ImplVDrawText( long nX, long nY, const OUString& rText, long nMin = LONG_MIN, long nMax = LONG_MAX );
SVT_DLLPRIVATE void ImplDrawTicks( long nMin, long nMax, long nStart, long nCenter ); SVT_DLLPRIVATE void ImplDrawTicks( long nMin, long nMax, long nStart, long nVirTop, long nVirBottom );
SVT_DLLPRIVATE void ImplDrawBorders( long nMin, long nMax, long nVirTop, long nVirBottom ); SVT_DLLPRIVATE void ImplDrawBorders( long nMin, long nMax, long nVirTop, long nVirBottom );
SVT_DLLPRIVATE void ImplDrawIndent( const Polygon& rPoly, sal_uInt16 nStyle, bool bIsHit = false ); SVT_DLLPRIVATE void ImplDrawIndent( const Polygon& rPoly, sal_uInt16 nStyle, bool bIsHit = false );
SVT_DLLPRIVATE void ImplDrawIndents( long nMin, long nMax, long nVirTop, long nVirBottom ); SVT_DLLPRIVATE void ImplDrawIndents( long nMin, long nMax, long nVirTop, long nVirBottom );
......
...@@ -333,10 +333,10 @@ long SvxRuler::MakePositionSticky(long aPosition, bool aSnapToFrameMargin) const ...@@ -333,10 +333,10 @@ long SvxRuler::MakePositionSticky(long aPosition, bool aSnapToFrameMargin) const
long aLeftFramePosition = ConvertHPosPixel(GetLeftFrameMargin()); long aLeftFramePosition = ConvertHPosPixel(GetLeftFrameMargin());
long aRightFramePosition = ConvertHPosPixel(GetRightFrameMargin()); long aRightFramePosition = ConvertHPosPixel(GetRightFrameMargin());
long aTick = GetCurrentRulerUnit().nTick1; double aTick = GetCurrentRulerUnit().nTick1;
long aTickPixel = pEditWin->LogicToPixel(Size(0, aTick), GetCurrentMapMode()).Height(); long aTickPixel = pEditWin->LogicToPixel(Size(0, aTick), GetCurrentMapMode()).Height();
long aHalfTick = aTick / 2; double aHalfTick = aTick / 2;
long aHalfTickPixel = aTickPixel / 2; double aHalfTickPixel = aTickPixel / 2;
if (aSnapToFrameMargin) if (aSnapToFrameMargin)
{ {
...@@ -354,7 +354,7 @@ long SvxRuler::MakePositionSticky(long aPosition, bool aSnapToFrameMargin) const ...@@ -354,7 +354,7 @@ long SvxRuler::MakePositionSticky(long aPosition, bool aSnapToFrameMargin) const
long aTranslatedPosition = aPosition - aLeftFramePosition; long aTranslatedPosition = aPosition - aLeftFramePosition;
// Convert position to current selected map mode // Convert position to current selected map mode
long aPositionLogic = pEditWin->PixelToLogic(Size(0, aTranslatedPosition), GetCurrentMapMode()).Height(); long aPositionLogic = pEditWin->PixelToLogic(Size(0, aTranslatedPosition), GetCurrentMapMode()).Height();
aPositionLogic = ((aPositionLogic + aHalfTick) / aTick) * aTick; aPositionLogic = std::floor((aPositionLogic + aHalfTick) / aTick) * aTick;
// Convert back to pixels // Convert back to pixels
aPosition = pEditWin->LogicToPixel(Size(0, aPositionLogic), GetCurrentMapMode()).Height(); aPosition = pEditWin->LogicToPixel(Size(0, aPositionLogic), GetCurrentMapMode()).Height();
// Move "coordinate system" back to original position // Move "coordinate system" back to original position
...@@ -934,11 +934,16 @@ void SvxRuler::UpdateTabs() ...@@ -934,11 +934,16 @@ void SvxRuler::UpdateTabs()
{ {
if(IsDrag()) if(IsDrag())
return; return;
if(mpPagePosItem.get() && mpParaItem.get() && mpTabStopItem.get() && !mpObjectItem.get())
if( mpPagePosItem.get() &&
mpParaItem.get() &&
mpTabStopItem.get() &&
!mpObjectItem.get() )
{ {
// buffer for DefaultTabStop // buffer for DefaultTabStop
// Distance last Tab <-> Right paragraph margin / DefaultTabDist // Distance last Tab <-> Right paragraph margin / DefaultTabDist
sal_Bool bRTL = mpRulerImpl->pTextRTLItem && mpRulerImpl->pTextRTLItem->GetValue(); sal_Bool bRTL = mpRulerImpl->pTextRTLItem && mpRulerImpl->pTextRTLItem->GetValue();
long nLeftFrameMargin = GetLeftFrameMargin(); long nLeftFrameMargin = GetLeftFrameMargin();
long nRightFrameMargin = GetRightFrameMargin(); long nRightFrameMargin = GetRightFrameMargin();
...@@ -947,20 +952,20 @@ void SvxRuler::UpdateTabs() ...@@ -947,20 +952,20 @@ void SvxRuler::UpdateTabs()
const long lParaIndent = nLeftFrameMargin + nParaItemTxtLeft; const long lParaIndent = nLeftFrameMargin + nParaItemTxtLeft;
const long lLastTab = const long lLastTab = mpTabStopItem->Count()
mpTabStopItem->Count()? ? ConvertHPosPixel((*mpTabStopItem.get())[mpTabStopItem->Count()-1].GetTabPos())
ConvertHPosPixel((*mpTabStopItem.get())[mpTabStopItem->Count()-1].GetTabPos()): 0; : 0;
const long lPosPixel = const long lPosPixel = ConvertHPosPixel(lParaIndent) + lLastTab;
ConvertHPosPixel(lParaIndent) + lLastTab; const long lRightIndent = ConvertHPosPixel(nRightFrameMargin - mpParaItem->GetRight());
const long lRightIndent =
ConvertHPosPixel(nRightFrameMargin - mpParaItem->GetRight());
long nDefTabDist = ConvertHPosPixel(lDefTabDist); long nDefTabDist = ConvertHPosPixel(lDefTabDist);
if( !nDefTabDist ) if( !nDefTabDist )
nDefTabDist = 1; nDefTabDist = 1;
const sal_uInt16 nDefTabBuf = lPosPixel > lRightIndent ||
lLastTab > lRightIndent const sal_uInt16 nDefTabBuf = lPosPixel > lRightIndent || lLastTab > lRightIndent
? 0 ? 0
: (sal_uInt16)( (lRightIndent - lPosPixel) / nDefTabDist ); : (sal_uInt16)( (lRightIndent - lPosPixel) / nDefTabDist );
if(mpTabStopItem->Count() + TAB_GAP + nDefTabBuf > nTabBufSize) if(mpTabStopItem->Count() + TAB_GAP + nDefTabBuf > nTabBufSize)
{ {
...@@ -971,22 +976,29 @@ void SvxRuler::UpdateTabs() ...@@ -971,22 +976,29 @@ void SvxRuler::UpdateTabs()
nTabCount = 0; nTabCount = 0;
sal_uInt16 j; sal_uInt16 j;
//#i24363# tab stops relative to indent //#i24363# tab stops relative to indent
const long lRightPixMargin = ConvertSizePixel(nRightFrameMargin - nParaItemTxtLeft ); const long lRightPixMargin = ConvertSizePixel(nRightFrameMargin - nParaItemTxtLeft );
const long lParaIndentPix = ConvertSizePixel(lParaIndent); const long lParaIndentPix = ConvertSizePixel(lParaIndent);
for(j = 0; j < mpTabStopItem->Count(); ++j) for(j = 0; j < mpTabStopItem->Count(); ++j)
{ {
const SvxTabStop *pTab = &(*mpTabStopItem.get())[j]; const SvxTabStop* pTab = &(*mpTabStopItem.get())[j];
mpTabs[nTabCount+TAB_GAP].nPos = if (mpRulerImpl->bIsTabsRelativeToIndent)
ConvertHPosPixel( mpTabs[nTabCount + TAB_GAP].nPos =
(mpRulerImpl->bIsTabsRelativeToIndent ? lParaIndent : 0 ) + pTab->GetTabPos() + lAppNullOffset); ConvertHPosPixel( lParaIndent + pTab->GetTabPos() + lAppNullOffset);
else
mpTabs[nTabCount + TAB_GAP].nPos =
ConvertHPosPixel( 0 + pTab->GetTabPos() + lAppNullOffset);
if(bRTL) if(bRTL)
{ {
mpTabs[nTabCount+TAB_GAP].nPos = lParaIndentPix + lRightPixMargin - mpTabs[nTabCount+TAB_GAP].nPos; mpTabs[nTabCount + TAB_GAP].nPos = lParaIndentPix + lRightPixMargin - mpTabs[nTabCount+TAB_GAP].nPos;
} }
mpTabs[nTabCount+TAB_GAP].nStyle = ToSvTab_Impl(pTab->GetAdjustment()); mpTabs[nTabCount + TAB_GAP].nStyle = ToSvTab_Impl(pTab->GetAdjustment());
++nTabCount; ++nTabCount;
} }
if(!mpTabStopItem->Count()) if(!mpTabStopItem->Count())
mpTabs[0].nPos = bRTL ? lRightPixMargin : lParaIndentPix; mpTabs[0].nPos = bRTL ? lRightPixMargin : lParaIndentPix;
...@@ -3240,7 +3252,7 @@ void SvxRuler::Command( const CommandEvent& rCommandEvent ) ...@@ -3240,7 +3252,7 @@ void SvxRuler::Command( const CommandEvent& rCommandEvent )
PopupMenu aMenu; PopupMenu aMenu;
aMenu.SetSelectHdl(LINK(this, SvxRuler, TabMenuSelect)); aMenu.SetSelectHdl(LINK(this, SvxRuler, TabMenuSelect));
VirtualDevice aDev; VirtualDevice aDev;
const Size aSz(RULER_TAB_WIDTH+2, RULER_TAB_HEIGHT+2); const Size aSz(RULER_TAB_WIDTH + 2, RULER_TAB_HEIGHT + 2);
aDev.SetOutputSize(aSz); aDev.SetOutputSize(aSz);
aDev.SetBackground(Wallpaper(Color(COL_WHITE))); aDev.SetBackground(Wallpaper(Color(COL_WHITE)));
Color aFillColor(aDev.GetSettings().GetStyleSettings().GetShadowColor()); Color aFillColor(aDev.GetSettings().GetStyleSettings().GetShadowColor());
...@@ -3249,12 +3261,12 @@ void SvxRuler::Command( const CommandEvent& rCommandEvent ) ...@@ -3249,12 +3261,12 @@ void SvxRuler::Command( const CommandEvent& rCommandEvent )
for ( sal_uInt16 i = RULER_TAB_LEFT; i < RULER_TAB_DEFAULT; ++i ) for ( sal_uInt16 i = RULER_TAB_LEFT; i < RULER_TAB_DEFAULT; ++i )
{ {
sal_uInt16 nStyle = bRTL ? i|RULER_TAB_RTL : i; sal_uInt16 nStyle = bRTL ? i|RULER_TAB_RTL : i;
nStyle |= (sal_uInt16)(bHorz ? WB_HORZ : WB_VERT); nStyle |= static_cast<sal_uInt16>(bHorz ? WB_HORZ : WB_VERT);
DrawTab(&aDev, aFillColor, aPt, nStyle); DrawTab(&aDev, aFillColor, aPt, nStyle);
aMenu.InsertItem(i + 1, aMenu.InsertItem(i + 1,
ResId(RID_SVXSTR_RULER_START + i, DIALOG_MGR()).toString(), ResId(RID_SVXSTR_RULER_START + i, DIALOG_MGR()).toString(),
Image(aDev.GetBitmap(Point(), aSz), Color(COL_WHITE))); Image(aDev.GetBitmap(Point(), aSz), Color(COL_WHITE)));
aMenu.CheckItem(i+1, i == mpTabs[mpRulerImpl->nIdx + TAB_GAP].nStyle); aMenu.CheckItem(i + 1, i == mpTabs[mpRulerImpl->nIdx + TAB_GAP].nStyle);
aDev.SetOutputSize(aSz); // delete device aDev.SetOutputSize(aSz); // delete device
} }
aMenu.Execute( this, rCommandEvent.GetMousePosPixel() ); aMenu.Execute( this, rCommandEvent.GetMousePosPixel() );
...@@ -3271,20 +3283,23 @@ void SvxRuler::Command( const CommandEvent& rCommandEvent ) ...@@ -3271,20 +3283,23 @@ void SvxRuler::Command( const CommandEvent& rCommandEvent )
{ {
const sal_uInt16 nId = aMenu.GetItemId(i - 1); const sal_uInt16 nId = aMenu.GetItemId(i - 1);
aMenu.CheckItem(nId, nId == (sal_uInt16)eUnit); aMenu.CheckItem(nId, nId == (sal_uInt16)eUnit);
if(bReduceMetric && if( bReduceMetric )
(nId == FUNIT_M ||
nId == FUNIT_KM ||
nId == FUNIT_FOOT ||
nId == FUNIT_MILE ||
nId == FUNIT_CHAR ||
nId == FUNIT_LINE ))
{ {
if (( nId == FUNIT_CHAR ) && bHorz ) if ( nId == FUNIT_M ||
; nId == FUNIT_KM ||
else if (( nId == FUNIT_LINE ) && !bHorz ) nId == FUNIT_FOOT ||
; nId == FUNIT_MILE )
else {
aMenu.RemoveItem(i - 1); aMenu.RemoveItem(i - 1);
}
else if (( nId == FUNIT_CHAR ) && !bHorz )
{
aMenu.RemoveItem(i - 1);
}
else if (( nId == FUNIT_LINE ) && bHorz )
{
aMenu.RemoveItem(i - 1);
}
} }
} }
aMenu.Execute( this, rCommandEvent.GetMousePosPixel() ); aMenu.Execute( this, rCommandEvent.GetMousePosPixel() );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment