LCOV - code coverage report
Current view: top level - libreoffice/svx/source/dialog - svxruler.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 357 1630 21.9 %
Date: 2012-12-27 Functions: 33 94 35.1 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <string.h>
      21             : #include <limits.h>
      22             : #include <tools/shl.hxx>
      23             : #include <vcl/image.hxx>
      24             : #include <svl/eitem.hxx>
      25             : #include <svl/rectitem.hxx>
      26             : #include <sfx2/dispatch.hxx>
      27             : 
      28             : #include <svl/smplhint.hxx>
      29             : 
      30             : #include <svx/dialogs.hrc>
      31             : #include <svx/dialmgr.hxx>
      32             : #include <svx/ruler.hxx>
      33             : #include "rlrcitem.hxx"
      34             : #include "svx/rulritem.hxx"
      35             : #include <editeng/tstpitem.hxx>
      36             : #include <editeng/lrspitem.hxx>
      37             : #include "editeng/protitem.hxx"
      38             : #include <vcl/svapp.hxx>
      39             : #ifndef RULER_TAB_RTL
      40             : #define RULER_TAB_RTL           ((sal_uInt16)0x0010)
      41             : #endif
      42             : 
      43             : // STATIC DATA -----------------------------------------------------------
      44             : 
      45             : #define CTRL_ITEM_COUNT 14
      46             : #define GAP 10
      47             : #define OBJECT_BORDER_COUNT 4
      48             : #define TAB_GAP 1
      49             : #define INDENT_GAP 2
      50             : #define INDENT_FIRST_LINE   4
      51             : #define INDENT_LEFT_MARGIN  5
      52             : #define INDENT_RIGHT_MARGIN 6
      53             : #define INDENT_LEFT_BORDER  2
      54             : #define INDENT_RIGHT_BORDER 3
      55             : #define INDENT_COUNT        5 //without the first two old values
      56             : 
      57             : #define PIXEL_H_ADJUST( l1, l2 ) PixelHAdjust(l1,l2)
      58             : 
      59             : #ifdef DEBUGLIN
      60             : 
      61             : inline long ToMM(Window *pWin, long lVal)
      62             : {
      63             :     return pWin->PixelToLogic(Size(lVal, 0), MapMode(MAP_MM)).Width();
      64             : }
      65             : 
      66             : void Debug_Impl(Window *pWin, SvxColumnItem& rColItem)
      67             : {
      68             :     String aTmp("Aktuell: ");
      69             :     aTmp += rColItem.GetActColumn();
      70             :     aTmp += " ColLeft: ";
      71             :     aTmp +=  String(ToMM(pWin, rColItem.GetLeft()));
      72             :     aTmp += "   ColRight: ";
      73             :     aTmp +=  String(ToMM(pWin, rColItem.GetRight()));
      74             :     for(sal_uInt16 i = 0; i < rColItem.Count(); ++i) {
      75             :         aTmp += " Start: ";
      76             :         aTmp += String(ToMM(pWin, rColItem[i].nStart));
      77             :         aTmp += " End: ";
      78             :         aTmp += String(ToMM(pWin, rColItem[i].nEnd));
      79             :     }
      80             : 
      81             :     InfoBox(0, aTmp).Execute();
      82             : }
      83             : 
      84             : void Debug_Impl(Window *pWin, const SvxLongLRSpaceItem& rLRSpace)
      85             : {
      86             :     String aTmp("Left: ");
      87             :     aTmp += pWin->PixelToLogic(Size(rLRSpace.GetLeft(), 0), MapMode(MAP_MM)).Width();
      88             :     aTmp += "   Right: ";
      89             :     aTmp +=pWin->PixelToLogic(Size(rLRSpace.GetRight(), 0), MapMode(MAP_MM)).Width();
      90             :     InfoBox(0, aTmp).Execute();
      91             : }
      92             : 
      93             : void Debug_Impl(Window *pWin, const SvxLongULSpaceItem& rULSpace)
      94             : {
      95             :     String aTmp("Upper: ");
      96             :     aTmp += pWin->PixelToLogic(Size(rULSpace.GetUpper(), 0), MapMode(MAP_MM)).Width();
      97             :     aTmp += "   Lower: ";
      98             :     aTmp += pWin->PixelToLogic(Size(rULSpace.GetLower(), 0), MapMode(MAP_MM)).Width();
      99             : 
     100             :     InfoBox(0, aTmp).Execute();
     101             : }
     102             : 
     103             : void DebugTabStops_Impl(const SvxTabStopItem& rTabs)
     104             : {
     105             :     String aTmp("Tabs: ");
     106             : 
     107             :     // Delete Def Tabs
     108             :     for(sal_uInt16 i = 0; i < rTabs.Count(); ++i)
     109             :     {
     110             :         aTmp += String(rTabs[i].GetTabPos() / 56);
     111             :         aTmp += " : ";
     112             :     }
     113             :     InfoBox(0, aTmp).Execute();
     114             : }
     115             : 
     116             : void DebugParaMargin_Impl(const SvxLRSpaceItem& rLRSpace)
     117             : {
     118             :     String aTmp("ParaLeft: ");
     119             :     aTmp += rLRSpace.GetTxtLeft() / 56;
     120             :     aTmp += "   ParaRight: ";
     121             :     aTmp += rLRSpace.GetRight() / 56;
     122             :     aTmp += "   FLI: ";
     123             :     aTmp += rLRSpace.GetTxtFirstLineOfst() / 56;
     124             :     InfoBox(0, aTmp).Execute();
     125             : }
     126             : 
     127             : #endif // DEBUGLIN
     128             : #ifdef DEBUG_RULER
     129             : #include <vcl/lstbox.hxx>
     130             : class RulerDebugWindow : public Window
     131             : {
     132             :     ListBox aBox;
     133             : public:
     134             :         RulerDebugWindow(Window* pParent) :
     135             :             Window(pParent, WB_BORDER|WB_SIZEMOVE|WB_DIALOGCONTROL|WB_CLIPCHILDREN|WB_SYSTEMWINDOW),
     136             :             aBox(this, WB_BORDER)
     137             :             {
     138             :                 Size aOutput(200, 400);
     139             :                 SetOutputSizePixel(aOutput);
     140             :                 aBox.SetSizePixel(aOutput);
     141             :                 aBox.Show();
     142             :                 Show();
     143             :                 Size aParentSize(pParent->GetOutputSizePixel());
     144             :                 Size aOwnSize(GetSizePixel());
     145             :                 aParentSize.Width() -= aOwnSize.Width();
     146             :                 aParentSize.Height() -= aOwnSize.Height();
     147             :                 SetPosPixel(Point(aParentSize.Width(), aParentSize.Height()));
     148             :             }
     149             :         ~RulerDebugWindow();
     150             : 
     151             :         ListBox& GetLBox() {return aBox;}
     152             :         static void     AddDebugText(const sal_Char* pDescription, const String& rText );
     153             : };
     154             : static RulerDebugWindow* pDebugWindow = 0;
     155             : 
     156             : RulerDebugWindow::~RulerDebugWindow()
     157             : {
     158             :     pDebugWindow = 0;
     159             : }
     160             : void     RulerDebugWindow::AddDebugText(const sal_Char* pDescription, const String& rText )
     161             : {
     162             :     if(!pDebugWindow)
     163             :     {
     164             :         Window* pParent = Application::GetFocusWindow();
     165             :         while(pParent->GetParent())
     166             :             pParent = pParent->GetParent();
     167             :         pDebugWindow = new RulerDebugWindow(pParent);
     168             :     }
     169             :     String sContent(String::CreateFromAscii(pDescription));
     170             :     sContent += rText;
     171             :     sal_uInt16 nPos = pDebugWindow->GetLBox().InsertEntry(sContent);
     172             :     pDebugWindow->GetLBox().SelectEntryPos(nPos);
     173             :     pDebugWindow->GrabFocus();
     174             : }
     175             : 
     176             : #define ADD_DEBUG_TEXT(cDescription, sValue) \
     177             :     RulerDebugWindow::AddDebugText(cDescription, sValue);
     178             : 
     179             : #define REMOVE_DEBUG_WINDOW \
     180             :     delete pDebugWindow;    \
     181             :     pDebugWindow = 0;
     182             : 
     183             : #else
     184             : #define ADD_DEBUG_TEXT(cDescription, sValue)
     185             : #define REMOVE_DEBUG_WINDOW
     186             : #endif
     187             : 
     188             : struct SvxRuler_Impl  {
     189             :     sal_uInt16 *pPercBuf;
     190             :     sal_uInt16 *pBlockBuf;
     191             :     sal_uInt16 nPercSize;
     192             :     long   nTotalDist;
     193             :     long   lOldWinPos;
     194             :     long   lMaxLeftLogic;
     195             :     long   lMaxRightLogic;
     196             :     long   lLastLMargin;
     197             :     long   lLastRMargin;
     198             :     SvxProtectItem aProtectItem;
     199             :     SfxBoolItem* pTextRTLItem;
     200             :     sal_uInt16 nControlerItems;
     201             :     sal_uInt16 nIdx;
     202             :     sal_uInt16 nColLeftPix, nColRightPix; // Pixel values for left / right edge
     203             :                                       // For columns; buffered to prevent
     204             :                                       // recalculation errors
     205             :                                       // May be has to be widen for future values
     206             :     sal_Bool bIsTableRows : 1;      // pColumnItem contains table rows instead of columns
     207             :     //#i24363# tab stops relative to indent
     208             :     sal_Bool bIsTabsRelativeToIndent : 1; // Tab stops relative to paragraph indent?
     209         472 :     SvxRuler_Impl() :
     210             :     pPercBuf(0), pBlockBuf(0),
     211             :     nPercSize(0), nTotalDist(0),
     212             :     lOldWinPos(0),
     213             :     lMaxLeftLogic(0), lMaxRightLogic(0),
     214             :     lLastLMargin(0), lLastRMargin(0),
     215             :     aProtectItem(SID_RULER_PROTECT),
     216             :     pTextRTLItem(0), nControlerItems(0),
     217             :     nIdx(0),
     218             :     nColLeftPix(0), nColRightPix(0),
     219             : 
     220             :     bIsTableRows(sal_False),
     221         472 :     bIsTabsRelativeToIndent(sal_True)
     222             :     {
     223         472 :     }
     224         126 :     ~SvxRuler_Impl()
     225         126 :     {
     226         126 :         nPercSize = 0; nTotalDist = 0;
     227         126 :         delete[] pPercBuf; delete[] pBlockBuf; pPercBuf = 0;
     228         126 :         delete pTextRTLItem;
     229         126 :     }
     230             :     void SetPercSize(sal_uInt16 nSize);
     231             : 
     232             : };
     233             : 
     234             : 
     235             : 
     236           0 : void SvxRuler_Impl::SetPercSize(sal_uInt16 nSize)
     237             : {
     238           0 :     if(nSize > nPercSize)
     239             :     {
     240           0 :         delete[] pPercBuf;
     241           0 :         delete[] pBlockBuf;
     242           0 :         pPercBuf = new sal_uInt16[nPercSize = nSize];
     243           0 :         pBlockBuf = new sal_uInt16[nPercSize = nSize];
     244             :     }
     245           0 :     size_t nSize2 = sizeof(sal_uInt16) * nPercSize;
     246           0 :     memset(pPercBuf, 0, nSize2);
     247           0 :     memset(pBlockBuf, 0, nSize2);
     248           0 : }
     249             : 
     250             : 
     251             : // Constructor of the ruler
     252             : 
     253             : // SID_ATTR_ULSPACE, SID_ATTR_LRSPACE
     254             : // expects as parameter SvxULSpaceItem for page edge
     255             : // (either left/right or top/bottom)
     256             : // Ruler: SetMargin1, SetMargin2
     257             : 
     258             : // SID_RULER_PAGE_POS
     259             : // expectes as parameter the initial value of the page and page width
     260             : // Ruler: SetPagePos
     261             : 
     262             : // SID_ATTR_TABSTOP
     263             : // expects: SvxTabStopItem
     264             : // Ruler: SetTabs
     265             : 
     266             : // SID_ATTR_PARA_LRSPACE
     267             : // left, right paragraph edge in H-ruler
     268             : // Ruler: SetIndents
     269             : 
     270             : // SID_RULER_BORDERS
     271             : // Table borders, columns
     272             : // expects: something like SwTabCols
     273             : // Ruler: SetBorders
     274             : 
     275             : 
     276         472 : SvxRuler::SvxRuler
     277             : (
     278             :  Window* pParent,                               // StarView Parent
     279             :  Window* pWin,            // Output window: is used for conversion
     280             :                           // logical units <-> pixels
     281             :  sal_uInt16  flags,       // Display flags, see ruler.hxx
     282             :  SfxBindings &rBindings,  // associated Bindings
     283             :  WinBits nWinStyle                              // StarView WinBits
     284             : )
     285             : : Ruler(pParent, nWinStyle),
     286         472 :   pCtrlItem(new SvxRulerItem *[CTRL_ITEM_COUNT]),
     287             :   pLRSpaceItem(0),
     288             :   pMinMaxItem(0),
     289             :   pULSpaceItem(0),
     290             :   pTabStopItem(0),
     291             :   pParaItem(0),
     292             :   pParaBorderItem(0),
     293             :   pPagePosItem(0),
     294             :   pColumnItem(0),
     295             :   pObjectItem(0),
     296             :   pEditWin(pWin),
     297         472 :   pRuler_Imp(new SvxRuler_Impl),
     298             :   bAppSetNullOffset(sal_False),  // Is the 0-offset of the ruler set by the application?
     299             :   lLogicNullOffset(0),
     300             :   lAppNullOffset(LONG_MAX),
     301             :   lMinFrame(5),
     302             :   lInitialDragPos(0),
     303             :   nFlags(flags),
     304             :   nDragType(NONE),
     305             :   nDefTabType(RULER_TAB_LEFT),
     306             :   nTabCount(0),
     307             :   nTabBufSize(0),
     308             :   lDefTabDist(50),
     309             :   lTabPos(-1),
     310             :   pTabs(0),
     311             :   pIndents(0),
     312         472 :   pBorders(new RulerBorder[1]), // due to one column tables
     313             :   nBorderCount(0),
     314             :   pObjectBorders(0),
     315             :   pBindings(&rBindings),
     316             :   nDragOffset(0),
     317             :   nMaxLeft(0),
     318             :   nMaxRight(0),
     319             :   bValid(sal_False),
     320             :   bListening(sal_False),
     321        1888 :   bActive(sal_True)
     322             : 
     323             : /* [Description]
     324             : 
     325             :    Constructor; Initialize data buffer; controller items are created
     326             : */
     327             : {
     328         472 :     memset(pCtrlItem, 0, sizeof(SvxRulerItem *) * CTRL_ITEM_COUNT);
     329             : 
     330         472 :     rBindings.EnterRegistrations();
     331             : 
     332             :     // Create Supported Items
     333         472 :     sal_uInt16 i = 0;
     334             :     // Page edges
     335             : 
     336         472 :     pCtrlItem[i++] = new SvxRulerItem(SID_RULER_LR_MIN_MAX, *this, rBindings);
     337         472 :     if((nWinStyle & WB_VSCROLL) == WB_VSCROLL)
     338             :     {
     339         236 :         bHorz = sal_False;
     340         236 :         pCtrlItem[i++] = new SvxRulerItem(SID_ATTR_LONG_ULSPACE, *this, rBindings);
     341             :     }
     342             :     else
     343             :     {
     344         236 :         bHorz = sal_True;
     345         236 :         pCtrlItem[i++] = new SvxRulerItem(SID_ATTR_LONG_LRSPACE, *this, rBindings);
     346             :     }
     347             : 
     348             :     // Page Position
     349         472 :     pCtrlItem[i++] = new SvxRulerItem(SID_RULER_PAGE_POS, *this, rBindings);
     350             : 
     351         472 :     if((nFlags & SVXRULER_SUPPORT_TABS) == SVXRULER_SUPPORT_TABS)
     352             :     {
     353         472 :         sal_uInt16 nTabStopId = bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL;
     354         472 :         pCtrlItem[i++] = new SvxRulerItem(nTabStopId, *this, rBindings);
     355         472 :         SetExtraType(RULER_EXTRA_TAB, nDefTabType);
     356             :     }
     357             : 
     358             : 
     359         472 :     if(0 != (nFlags & (SVXRULER_SUPPORT_PARAGRAPH_MARGINS |SVXRULER_SUPPORT_PARAGRAPH_MARGINS_VERTICAL)))
     360             :     {
     361         472 :         if(bHorz)
     362         236 :             pCtrlItem[i++] = new SvxRulerItem(SID_ATTR_PARA_LRSPACE, *this, rBindings);
     363             :         else
     364         236 :             pCtrlItem[i++] = new SvxRulerItem(SID_ATTR_PARA_LRSPACE_VERTICAL, *this, rBindings);
     365         472 :         pIndents = new RulerIndent[5+INDENT_GAP];
     366         472 :         memset(pIndents, 0, sizeof(RulerIndent)*(3+INDENT_GAP));
     367         472 :         pIndents[0].nStyle = RULER_STYLE_DONTKNOW;
     368         472 :         pIndents[1].nStyle = RULER_STYLE_DONTKNOW;
     369         472 :         pIndents[INDENT_FIRST_LINE].nStyle = RULER_INDENT_TOP;
     370         472 :         pIndents[INDENT_LEFT_MARGIN].nStyle = RULER_INDENT_BOTTOM;
     371         472 :         pIndents[INDENT_RIGHT_MARGIN].nStyle = RULER_INDENT_BOTTOM;
     372         472 :         pIndents[INDENT_LEFT_BORDER].nStyle = RULER_INDENT_BORDER;
     373         472 :         pIndents[INDENT_RIGHT_BORDER].nStyle = RULER_INDENT_BORDER;
     374        3776 :         for(sal_uInt16 nIn = 0; nIn < 7; nIn++)
     375        3304 :             pIndents[nIn].nPos = 0;
     376             :     }
     377             : 
     378         472 :     if((nFlags & SVXRULER_SUPPORT_BORDERS) ==  SVXRULER_SUPPORT_BORDERS)
     379             :     {
     380         472 :         pCtrlItem[i++] = new SvxRulerItem(bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL, *this, rBindings);
     381         472 :         pCtrlItem[i++] = new SvxRulerItem(bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL, *this, rBindings);
     382             :     }
     383             : 
     384         472 :     pCtrlItem[i++] = new SvxRulerItem(SID_RULER_TEXT_RIGHT_TO_LEFT, *this, rBindings);
     385             : 
     386         472 :     if((nFlags & SVXRULER_SUPPORT_OBJECT) == SVXRULER_SUPPORT_OBJECT)
     387             :     {
     388           0 :         pCtrlItem[i++] = new SvxRulerItem(SID_RULER_OBJECT, *this, rBindings );
     389           0 :         pObjectBorders = new RulerBorder[OBJECT_BORDER_COUNT];
     390           0 :         size_t nSize = sizeof( RulerBorder ) * OBJECT_BORDER_COUNT;
     391           0 :         memset(pObjectBorders, 0, nSize);
     392           0 :         for(sal_uInt16 nBorder = 0; nBorder < OBJECT_BORDER_COUNT; ++nBorder)
     393             :         {
     394           0 :             pObjectBorders[nBorder].nPos   = 0;
     395           0 :             pObjectBorders[nBorder].nWidth = 0;
     396           0 :             pObjectBorders[nBorder].nStyle = RULER_BORDER_MOVEABLE;
     397             :         }
     398             :     }
     399             : 
     400         472 :     pCtrlItem[i++] = new SvxRulerItem( SID_RULER_PROTECT, *this, rBindings );
     401         472 :     pCtrlItem[i++] = new SvxRulerItem(SID_RULER_BORDER_DISTANCE, *this, rBindings);
     402         472 :     pRuler_Imp->nControlerItems=i;
     403             : 
     404         472 :     if((nFlags & SVXRULER_SUPPORT_SET_NULLOFFSET) ==
     405             :        SVXRULER_SUPPORT_SET_NULLOFFSET)
     406           0 :         SetExtraType(RULER_EXTRA_NULLOFFSET, 0);
     407             : 
     408         472 :     rBindings.LeaveRegistrations();
     409         472 : }
     410             : 
     411             : 
     412         378 : SvxRuler::~SvxRuler()
     413             : 
     414             : /* [Description]
     415             : 
     416             :    Destructor ruler; release internal buffer
     417             : */
     418             : {
     419             :     REMOVE_DEBUG_WINDOW
     420         126 :     if(bListening)
     421           0 :         EndListening(*pBindings);
     422             : 
     423         126 :     pBindings->EnterRegistrations();
     424             : 
     425        1386 :     for(sal_uInt16 i = 0; i < CTRL_ITEM_COUNT  && pCtrlItem[i]; ++i)
     426        1260 :         delete pCtrlItem[i];
     427         126 :     delete[] pCtrlItem;
     428             : 
     429         126 :     delete pLRSpaceItem;
     430         126 :     delete pMinMaxItem;
     431         126 :     delete pULSpaceItem;
     432         126 :     delete pTabStopItem;
     433         126 :     delete pParaItem;
     434         126 :     delete pParaBorderItem;
     435         126 :     delete pPagePosItem;
     436         126 :     delete pColumnItem;
     437         126 :     delete pObjectItem;
     438         126 :     delete[] pIndents;
     439         126 :     delete[] pBorders;
     440         126 :     delete[] pObjectBorders;
     441         126 :     delete[] pTabs;
     442         126 :     delete pRuler_Imp;
     443             : 
     444         126 :     pBindings->LeaveRegistrations();
     445         252 : }
     446             : 
     447             : /* [Description]
     448             : 
     449             :    Internal conversion routines
     450             : */
     451             : 
     452         100 : long SvxRuler::ConvertHPosPixel(long nVal) const
     453             : {
     454         100 :     return pEditWin->LogicToPixel(Size(nVal, 0)).Width();
     455             : }
     456             : 
     457          20 : long SvxRuler::ConvertVPosPixel(long nVal) const
     458             : {
     459          20 :     return pEditWin->LogicToPixel(Size(0, nVal)).Height();
     460             : }
     461             : 
     462          20 : long SvxRuler::ConvertHSizePixel(long nVal) const
     463             : {
     464          20 :     return pEditWin->LogicToPixel(Size(nVal, 0)).Width();
     465             : }
     466             : 
     467           0 : long SvxRuler::ConvertVSizePixel(long nVal) const
     468             : {
     469           0 :     return pEditWin->LogicToPixel(Size(0, nVal)).Height();
     470             : }
     471             : 
     472           0 : long SvxRuler::ConvertPosPixel(long nVal) const
     473             : {
     474           0 :     return bHorz ? ConvertHPosPixel(nVal): ConvertVPosPixel(nVal);
     475             : }
     476             : 
     477          20 : long SvxRuler::ConvertSizePixel(long nVal) const
     478             : {
     479          20 :     return bHorz? ConvertHSizePixel(nVal): ConvertVSizePixel(nVal);
     480             : }
     481             : 
     482             : 
     483           0 : inline long SvxRuler::ConvertHPosLogic(long nVal) const
     484             : {
     485           0 :     return pEditWin->PixelToLogic(Size(nVal, 0)).Width();
     486             : }
     487             : 
     488           0 : inline long SvxRuler::ConvertVPosLogic(long nVal) const
     489             : {
     490           0 :     return pEditWin->PixelToLogic(Size(0, nVal)).Height();
     491             : }
     492             : 
     493           0 : inline long SvxRuler::ConvertHSizeLogic(long nVal) const
     494             : {
     495           0 :     return pEditWin->PixelToLogic(Size(nVal, 0)).Width();
     496             : }
     497             : 
     498           0 : inline long SvxRuler::ConvertVSizeLogic(long nVal) const
     499             : {
     500           0 :     return pEditWin->PixelToLogic(Size(0, nVal)).Height();
     501             : }
     502             : 
     503           0 : inline long SvxRuler::ConvertPosLogic(long nVal) const
     504             : {
     505           0 :     return bHorz? ConvertHPosLogic(nVal): ConvertVPosLogic(nVal);
     506             : }
     507             : 
     508           0 : inline long SvxRuler::ConvertSizeLogic(long nVal) const
     509             : {
     510           0 :     return bHorz? ConvertHSizeLogic(nVal): ConvertVSizeLogic(nVal);
     511             : }
     512             : 
     513           0 : long SvxRuler::PixelHAdjust(long nVal, long nValOld) const
     514             : {
     515           0 :         if(ConvertHSizePixel(nVal)!=ConvertHSizePixel(nValOld))
     516           0 :                 return  nVal;
     517             :         else
     518           0 :                 return  nValOld;
     519             : }
     520             : 
     521           0 : long SvxRuler::PixelVAdjust(long nVal, long nValOld) const
     522             : {
     523           0 :         if(ConvertVSizePixel(nVal)!=ConvertVSizePixel(nValOld))
     524           0 :                 return  nVal;
     525             :         else
     526           0 :                 return  nValOld;
     527             : }
     528             : 
     529           0 : long SvxRuler::PixelAdjust(long nVal, long nValOld) const
     530             : {
     531           0 :         if(ConvertSizePixel(nVal)!=ConvertSizePixel(nValOld))
     532           0 :                 return  nVal;
     533             :         else
     534           0 :                 return  nValOld;
     535             : }
     536             : 
     537             : 
     538           0 : inline sal_uInt16 SvxRuler::GetObjectBordersOff(sal_uInt16 nIdx) const
     539             : {
     540           0 :     return bHorz? nIdx: nIdx + 2;
     541             : }
     542             : 
     543             : 
     544        2380 : void SvxRuler::UpdateFrame()
     545             : 
     546             : /* [Description]
     547             : 
     548             :    Update Upper Left edge.
     549             :    Items are translated into the representation of the ruler.
     550             : */
     551             : 
     552             : {
     553             :     const sal_uInt16 nMarginStyle =
     554        2380 :         ( pRuler_Imp->aProtectItem.IsSizeProtected() ||
     555        2380 :           pRuler_Imp->aProtectItem.IsPosProtected() ) ?
     556        4760 :         0 : RULER_MARGIN_SIZEABLE;
     557             : 
     558        2380 :     if(pLRSpaceItem && pPagePosItem)
     559             :     {
     560             :         // if no initialization by default app behavior
     561          10 :         const long nOld = lLogicNullOffset;
     562             :         lLogicNullOffset = pColumnItem?
     563          10 :             pColumnItem->GetLeft(): pLRSpaceItem->GetLeft();
     564          10 :         if(bAppSetNullOffset)
     565           0 :             lAppNullOffset += lLogicNullOffset - nOld;
     566          10 :         if(!bAppSetNullOffset || lAppNullOffset == LONG_MAX)
     567             :         {
     568          10 :             Ruler::SetNullOffset(ConvertHPosPixel(lLogicNullOffset));
     569          10 :             SetMargin1( 0, nMarginStyle );
     570          10 :             lAppNullOffset = 0;
     571             :         }
     572             :         else
     573           0 :             SetMargin1( ConvertHPosPixel( lAppNullOffset ), nMarginStyle );
     574          10 :         long lRight = 0;
     575             :             // evaluate the table right edge of the table
     576          10 :         if(pColumnItem && pColumnItem->IsTable())
     577           0 :             lRight = pColumnItem->GetRight();
     578             :         else
     579          10 :             lRight = pLRSpaceItem->GetRight();
     580             : 
     581             :         sal_uIntPtr aWidth=
     582          10 :             ConvertHPosPixel(pPagePosItem->GetWidth() - lRight -
     583          10 :                                     lLogicNullOffset + lAppNullOffset);
     584          10 :         SetMargin2( aWidth, nMarginStyle );
     585             :     }
     586             :     else
     587        2370 :         if(pULSpaceItem && pPagePosItem)
     588             :         {
     589             :             // relative the upper edge of the surrounding frame
     590          10 :             const long nOld = lLogicNullOffset;
     591             :             lLogicNullOffset = pColumnItem?
     592          10 :                 pColumnItem->GetLeft(): pULSpaceItem->GetUpper();
     593          10 :             if(bAppSetNullOffset)
     594           0 :                 lAppNullOffset += lLogicNullOffset - nOld;
     595          10 :             if(!bAppSetNullOffset || lAppNullOffset == LONG_MAX) {
     596          10 :                 Ruler::SetNullOffset(ConvertVPosPixel(lLogicNullOffset));
     597          10 :                 lAppNullOffset = 0;
     598          10 :                 SetMargin1( 0, nMarginStyle );
     599             :             }
     600             :             else
     601           0 :                 SetMargin1( ConvertVPosPixel( lAppNullOffset ),nMarginStyle );
     602             : 
     603             :             long lLower = pColumnItem ?
     604          10 :                 pColumnItem->GetRight() : pULSpaceItem->GetLower();
     605             : 
     606          10 :             SetMargin2(ConvertVPosPixel(pPagePosItem->GetHeight() - lLower -
     607             :                                         lLogicNullOffset + lAppNullOffset),
     608          20 :                                         nMarginStyle );
     609             :         }
     610             :     else
     611             :     {
     612             :         // turns off the view
     613        2360 :         SetMargin1();
     614        2360 :         SetMargin2();
     615             :     }
     616        2380 :     if(pColumnItem)
     617             :     {
     618           0 :         pRuler_Imp->nColLeftPix = (sal_uInt16) ConvertSizePixel(pColumnItem->GetLeft());
     619           0 :         pRuler_Imp->nColRightPix = (sal_uInt16) ConvertSizePixel(pColumnItem->GetRight());
     620             :     }
     621             : 
     622        2380 : }
     623             : 
     624           0 : void SvxRuler::MouseMove( const MouseEvent& rMEvt )
     625             : {
     626           0 :     if( bActive )
     627             :     {
     628           0 :         pBindings->Update( SID_RULER_LR_MIN_MAX );
     629           0 :         pBindings->Update( SID_ATTR_LONG_ULSPACE );
     630           0 :         pBindings->Update( SID_ATTR_LONG_LRSPACE );
     631           0 :         pBindings->Update( SID_RULER_PAGE_POS );
     632           0 :         pBindings->Update( bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL);
     633           0 :         pBindings->Update( bHorz ? SID_ATTR_PARA_LRSPACE : SID_ATTR_PARA_LRSPACE_VERTICAL);
     634           0 :         pBindings->Update( bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL);
     635           0 :         pBindings->Update( bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL);
     636           0 :         pBindings->Update( SID_RULER_OBJECT );
     637           0 :         pBindings->Update( SID_RULER_PROTECT );
     638             :     }
     639           0 :     Ruler::MouseMove( rMEvt );
     640           0 : }
     641         150 : void SvxRuler::StartListening_Impl()
     642             : {
     643         150 :     if(!bListening)
     644             :     {
     645          20 :         bValid = sal_False;
     646          20 :         StartListening(*pBindings);
     647          20 :         bListening = sal_True;
     648             :     }
     649         150 : }
     650             : 
     651          10 : void SvxRuler::UpdateFrame
     652             : (
     653             :  const SvxLongLRSpaceItem *pItem    // new value LRSpace
     654             : )
     655             : 
     656             : /* [Description]
     657             : 
     658             :    Store new value LRSpace; delete old ones if possible
     659             : */
     660             : 
     661             : {
     662          10 :   if(bActive)
     663             :   {
     664          10 :     delete pLRSpaceItem; pLRSpaceItem = 0;
     665          10 :     if(pItem)
     666          10 :         pLRSpaceItem = new SvxLongLRSpaceItem(*pItem);
     667          10 :     StartListening_Impl();
     668             :   }
     669          10 : }
     670             : 
     671             : 
     672          20 : void SvxRuler::UpdateFrameMinMax
     673             : (
     674             :  const SfxRectangleItem *pItem  // value for MinMax
     675             : )
     676             : 
     677             : /* [Description]
     678             : 
     679             :    Set new value for MinMax; delete old ones if possible
     680             : */
     681             : 
     682             : {
     683          20 :     if(bActive)
     684             :     {
     685          20 :         delete pMinMaxItem; pMinMaxItem = 0;
     686          20 :         if(pItem)
     687          20 :             pMinMaxItem = new SfxRectangleItem(*pItem);
     688             :     }
     689          20 : }
     690             : 
     691             : 
     692          10 : void SvxRuler::UpdateFrame
     693             : (
     694             :  const SvxLongULSpaceItem *pItem    // new value
     695             : )
     696             : 
     697             : /* [Description]
     698             : 
     699             :    Update Right/bottom margin
     700             : */
     701             : 
     702             : 
     703             : {
     704          10 :   if(bActive && !bHorz)
     705             :   {
     706          10 :     delete pULSpaceItem; pULSpaceItem = 0;
     707          10 :     if(pItem)
     708          10 :         pULSpaceItem = new SvxLongULSpaceItem(*pItem);
     709          10 :     StartListening_Impl();
     710             :   }
     711          10 : }
     712             : 
     713          20 : void SvxRuler::Update( const SvxProtectItem* pItem )
     714             : {
     715          20 :     if( pItem ) pRuler_Imp->aProtectItem = *pItem;
     716          20 : }
     717             : 
     718          20 : void SvxRuler::UpdateTextRTL(const SfxBoolItem* pItem)
     719             : {
     720          20 :   if(bActive && bHorz)
     721             :   {
     722          10 :     delete pRuler_Imp->pTextRTLItem; pRuler_Imp->pTextRTLItem = 0;
     723          10 :     if(pItem)
     724          10 :         pRuler_Imp->pTextRTLItem = new SfxBoolItem(*pItem);
     725          10 :     SetTextRTL(pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue());
     726          10 :     StartListening_Impl();
     727             :   }
     728          20 : }
     729             : 
     730          40 : void SvxRuler::Update
     731             : (
     732             :  const SvxColumnItem *pItem,  // new value
     733             :  sal_uInt16 nSID //Slot Id to identify NULL items
     734             : )
     735             : 
     736             : /* [Description]
     737             : 
     738             :    Set new value for column view
     739             : */
     740             : 
     741             : {
     742          40 :     if(bActive)
     743             :     {
     744          40 :         if(pItem)
     745             :         {
     746           0 :             delete pColumnItem; pColumnItem = 0;
     747           0 :             pRuler_Imp->bIsTableRows = (pItem->Which() == SID_RULER_ROWS || pItem->Which() == SID_RULER_ROWS_VERTICAL);
     748           0 :             pColumnItem = new SvxColumnItem(*pItem);
     749           0 :             if(!bHorz && !pRuler_Imp->bIsTableRows)
     750           0 :                 pColumnItem->SetWhich(SID_RULER_BORDERS_VERTICAL);
     751             :         }
     752          40 :         else if(pColumnItem && pColumnItem->Which() == nSID)
     753             :         //there are two groups of column items table/frame columns and table rows
     754             :         //both can occur in vertical or horizontal mode
     755             :         //the horizontal ruler handles the SID_RULER_BORDERS and SID_RULER_ROWS_VERTICAL
     756             :         //and the vertical handles SID_RULER_BORDERS_VERTICAL and SID_RULER_ROWS
     757             :         //if pColumnItem is already set with one of the ids then a NULL pItem argument
     758             :         //must not delete it
     759             :         {
     760           0 :             delete pColumnItem; pColumnItem = 0;
     761           0 :             pRuler_Imp->bIsTableRows = sal_False;
     762             :         }
     763          40 :         StartListening_Impl();
     764             :     }
     765          40 : }
     766             : 
     767             : 
     768        2380 : void SvxRuler::UpdateColumns()
     769             : 
     770             : /* [Description]
     771             : 
     772             :    Update column view
     773             : */
     774             : {
     775        2380 :     if(pColumnItem && pColumnItem->Count() > 1)
     776             :     {
     777           0 :         if( nBorderCount < pColumnItem->Count())
     778             :         {
     779           0 :             delete[] pBorders;
     780           0 :             nBorderCount = pColumnItem->Count();
     781           0 :             pBorders = new RulerBorder[nBorderCount];
     782             :         }
     783           0 :         sal_uInt16 _nFlags = RULER_BORDER_VARIABLE;
     784             :         sal_Bool bProtectColumns =
     785           0 :             pRuler_Imp->aProtectItem.IsSizeProtected() ||
     786           0 :             pRuler_Imp->aProtectItem.IsPosProtected();
     787           0 :         if( !bProtectColumns )
     788           0 :             _nFlags |= RULER_BORDER_MOVEABLE;
     789           0 :         if( pColumnItem->IsTable() )
     790           0 :             _nFlags |= RULER_BORDER_TABLE;
     791             :         else
     792           0 :             if ( !bProtectColumns )
     793           0 :                 _nFlags |= RULER_BORDER_SIZEABLE;
     794             : 
     795           0 :         sal_uInt16 nBorders = pColumnItem->Count();
     796           0 :         if(!pRuler_Imp->bIsTableRows)
     797           0 :             --nBorders;
     798           0 :         for(sal_uInt16 i = 0; i < nBorders; ++i)
     799             :         {
     800           0 :             pBorders[i].nStyle = _nFlags;
     801           0 :             if(!(*pColumnItem)[i].bVisible)
     802           0 :                 pBorders[i].nStyle |= RULER_STYLE_INVISIBLE;
     803           0 :             pBorders[i].nPos =
     804           0 :                 ConvertPosPixel((*pColumnItem)[i].nEnd + lAppNullOffset);
     805           0 :             if(pColumnItem->Count() == i + 1)
     806             :             {
     807             :                 //with table rows the end of the table is contained in the
     808             :                 //column item but it has no width!
     809           0 :                 pBorders[i].nWidth = 0;
     810             :             }
     811             :             else
     812             :             {
     813           0 :                 pBorders[i].nWidth =
     814           0 :                     ConvertSizePixel((*pColumnItem)[i+1].nStart -
     815           0 :                                  (*pColumnItem)[i].nEnd);
     816             :             }
     817           0 :             pBorders[i].nMinPos =
     818           0 :                 ConvertPosPixel((*pColumnItem)[i].nEndMin + lAppNullOffset);
     819           0 :             pBorders[i].nMaxPos =
     820           0 :                 ConvertPosPixel((*pColumnItem)[i].nEndMax + lAppNullOffset);
     821             :         }
     822           0 :         SetBorders(pColumnItem->Count()-1, pBorders);
     823             :     }
     824             :     else
     825             :     {
     826        2380 :         SetBorders();
     827             :     }
     828        2380 : }
     829             : 
     830             : 
     831           0 : void SvxRuler::UpdateObject()
     832             : 
     833             : /* [Description]
     834             : 
     835             :    Update view of object representation
     836             : */
     837             : 
     838             : {
     839           0 :     if(pObjectItem)
     840             :     {
     841             :         DBG_ASSERT(pObjectBorders, "no Buffer");
     842             :         // !! to the page margin
     843           0 :         long nMargin = pLRSpaceItem? pLRSpaceItem->GetLeft(): 0;
     844           0 :         pObjectBorders[0].nPos =
     845           0 :             ConvertPosPixel(pObjectItem->GetStartX() -
     846           0 :                             nMargin + lAppNullOffset);
     847           0 :         pObjectBorders[1].nPos =
     848           0 :             ConvertPosPixel(pObjectItem->GetEndX() - nMargin + lAppNullOffset);
     849           0 :         nMargin = pULSpaceItem? pULSpaceItem->GetUpper(): 0;
     850           0 :         pObjectBorders[2].nPos =
     851           0 :             ConvertPosPixel(pObjectItem->GetStartY() -
     852           0 :                             nMargin + lAppNullOffset);
     853           0 :         pObjectBorders[3].nPos =
     854           0 :             ConvertPosPixel(pObjectItem->GetEndY() - nMargin + lAppNullOffset);
     855             : 
     856           0 :         const sal_uInt16 nOff = GetObjectBordersOff(0);
     857           0 :         SetBorders(2, pObjectBorders + nOff);
     858             :     }
     859             :     else
     860             :     {
     861           0 :         SetBorders();
     862             :     }
     863           0 : }
     864             : 
     865             : 
     866        2380 : void SvxRuler::UpdatePara()
     867             : 
     868             : /* [Description]
     869             : 
     870             :    Update the view for paragraph indents:
     871             :    Left margin, first line indent, right margin paragraph update
     872             :    pIndents[0] = Buffer for old intent
     873             :    pIndents[1] = Buffer for old intent
     874             :    pIndents[INDENT_FIRST_LINE] = First line indent
     875             :    pIndents[3] = left margin
     876             :    pIndents[4] = right margin
     877             :    pIndents[5] = left border distance
     878             :    pIndents[6] = right border distance
     879             : 
     880             : */
     881             : 
     882             : {
     883             :     // Dependence on PagePosItem
     884        2380 :     if(pParaItem && pPagePosItem && !pObjectItem)
     885             :     {
     886          10 :         sal_Bool bRTLText = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
     887             :         // First-line indent is negative to the left paragraph margin
     888          10 :         long nLeftFrameMargin = GetLeftFrameMargin();
     889          10 :         long nRightFrameMargin = GetRightFrameMargin();
     890          10 :         if(bRTLText)
     891           0 :             pIndents[INDENT_FIRST_LINE].nPos =
     892             :                 ConvertHPosPixel(
     893             :                 nRightFrameMargin -
     894           0 :                 pParaItem->GetTxtLeft() -
     895           0 :                 pParaItem->GetTxtFirstLineOfst() + lAppNullOffset );
     896             :         else
     897          10 :             pIndents[INDENT_FIRST_LINE].nPos =
     898             :                 ConvertHPosPixel(
     899             :                     nLeftFrameMargin +
     900          10 :                     pParaItem->GetTxtLeft() +
     901          10 :                     pParaItem->GetTxtFirstLineOfst() +
     902          20 :                     lAppNullOffset);
     903          10 :         if( pParaItem->IsAutoFirst() )
     904           0 :             pIndents[INDENT_FIRST_LINE].nStyle |= RULER_STYLE_INVISIBLE;
     905             :         else
     906          10 :             pIndents[INDENT_FIRST_LINE].nStyle &= ~RULER_STYLE_INVISIBLE;
     907             : 
     908          10 :         if(bRTLText)
     909             :         {
     910             :             // left margin
     911           0 :             pIndents[INDENT_LEFT_MARGIN].nPos =
     912             :                 ConvertHPosPixel(
     913             :                     nRightFrameMargin -
     914           0 :                     pParaItem->GetTxtLeft() + lAppNullOffset);
     915             :             // right margin
     916           0 :             pIndents[INDENT_RIGHT_MARGIN].nPos =
     917             :                 ConvertHPosPixel(
     918             :                     nLeftFrameMargin +
     919           0 :                     pParaItem->GetRight() + lAppNullOffset);
     920             :         }
     921             :         else
     922             :         {
     923             :             // left margin
     924          10 :             pIndents[INDENT_LEFT_MARGIN].nPos =
     925             :                 ConvertHPosPixel(
     926             :                     nLeftFrameMargin +
     927          10 :                     pParaItem->GetTxtLeft() + lAppNullOffset);
     928             :             // right margin, always negative to the right edge of the surrounding frames
     929          10 :             pIndents[INDENT_RIGHT_MARGIN].nPos =
     930             :                 ConvertHPosPixel(
     931             :                     nRightFrameMargin -
     932          10 :                     pParaItem->GetRight() + lAppNullOffset);
     933             :         }
     934          10 :         if(pParaBorderItem)
     935             :         {
     936           9 :             pIndents[INDENT_LEFT_BORDER].nPos =
     937           9 :             ConvertHPosPixel( nLeftFrameMargin + lAppNullOffset);
     938           9 :             pIndents[INDENT_RIGHT_BORDER].nPos =
     939           9 :                 ConvertHPosPixel(nRightFrameMargin - lAppNullOffset);
     940           9 :             pIndents[INDENT_LEFT_BORDER].nStyle = pIndents[INDENT_RIGHT_BORDER].nStyle &= ~RULER_STYLE_INVISIBLE;
     941             :         }
     942             :         else
     943           1 :             pIndents[INDENT_LEFT_BORDER].nStyle = pIndents[INDENT_RIGHT_BORDER].nStyle |= RULER_STYLE_INVISIBLE;
     944             : 
     945          10 :         SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
     946             :     }
     947             :     else
     948             :     {
     949        2370 :         if(pIndents)
     950             :         {
     951        2370 :             pIndents[INDENT_FIRST_LINE].nPos =
     952        2370 :             pIndents[INDENT_LEFT_MARGIN].nPos =
     953        2370 :             pIndents[INDENT_RIGHT_MARGIN].nPos = 0;
     954             :         }
     955        2370 :         SetIndents();        // turn off
     956             :     }
     957        2380 : }
     958             : 
     959             : 
     960          20 : void SvxRuler::UpdatePara
     961             : (
     962             :  const SvxLRSpaceItem *pItem    // new value of paragraph indents
     963             : )
     964             : 
     965             : /* [Description]
     966             : 
     967             :    Store new value of paragraph indents
     968             : */
     969             : 
     970             : {
     971          20 :     if(bActive)
     972             :     {
     973          20 :         delete pParaItem; pParaItem = 0;
     974          20 :         if(pItem)
     975          10 :             pParaItem = new SvxLRSpaceItem(*pItem);
     976          20 :         StartListening_Impl();
     977             :     }
     978          20 : }
     979          20 : void SvxRuler::UpdateParaBorder(const SvxLRSpaceItem * pItem )
     980             : 
     981             : /* [Description]
     982             : 
     983             :    Border distance
     984             : */
     985             : 
     986             : {
     987          20 :     if(bActive)
     988             :     {
     989          20 :         delete pParaBorderItem; pParaBorderItem = 0;
     990          20 :         if(pItem)
     991          18 :             pParaBorderItem = new SvxLRSpaceItem(*pItem);
     992          20 :         StartListening_Impl();
     993             :     }
     994          20 : }
     995             : 
     996             : 
     997        2380 : void SvxRuler::UpdatePage()
     998             : 
     999             : /* [Description]
    1000             : 
    1001             :    Update view of position and width of page
    1002             : */
    1003             : 
    1004             : {
    1005        2380 :     if(pPagePosItem)
    1006             :     {
    1007             :         // all objects are automatically adjusted
    1008          20 :         if(bHorz)
    1009             :             SetPagePos(
    1010          20 :                 pEditWin->LogicToPixel(pPagePosItem->GetPos()).X(),
    1011          20 :                 pEditWin->LogicToPixel(Size(pPagePosItem->GetWidth(),0)).
    1012          30 :                 Width());
    1013             :         else
    1014             :             SetPagePos(
    1015          20 :                 pEditWin->LogicToPixel(pPagePosItem->GetPos()).Y(),
    1016          20 :                 pEditWin->LogicToPixel(Size(0, pPagePosItem->GetHeight())).
    1017          30 :                 Height());
    1018          20 :         if(bAppSetNullOffset)
    1019           0 :             SetNullOffset(ConvertSizePixel(-lAppNullOffset + lLogicNullOffset));
    1020             :     }
    1021             :     else
    1022        2360 :         SetPagePos();
    1023             : 
    1024        2380 :     long lPos = 0;
    1025        2380 :     Point aOwnPos = GetPosPixel();
    1026        2380 :     Point aEdtWinPos = pEditWin->GetPosPixel();
    1027        2380 :     if( Application::GetSettings().GetLayoutRTL() && bHorz )
    1028             :     {
    1029             :         //#i73321# in RTL the window and the ruler is not mirrored but the
    1030             :         // influence of the vertical ruler is inverted
    1031           0 :         Size aOwnSize = GetSizePixel();
    1032           0 :         Size aEdtWinSize = pEditWin->GetSizePixel();
    1033           0 :         lPos = aOwnSize.Width() - aEdtWinSize.Width();
    1034           0 :         lPos -= (aEdtWinPos - aOwnPos).X();
    1035             :     }
    1036             :     else
    1037             :     {
    1038        2380 :         Point aPos(aEdtWinPos - aOwnPos);
    1039        2380 :         lPos= bHorz ? aPos.X() : aPos.Y();
    1040             :     }
    1041             : 
    1042             : // Unfortunately, we get the offset of the edit window to the ruler never
    1043             : // through a status message. So we set it ourselves if necessary.
    1044        2380 :     if(lPos!=pRuler_Imp->lOldWinPos)
    1045             :     {
    1046         186 :         pRuler_Imp->lOldWinPos=lPos;
    1047         186 :         SetWinPos(lPos);
    1048             :     }
    1049        2380 : }
    1050             : 
    1051             : 
    1052          20 : void SvxRuler::Update
    1053             : (
    1054             :  const SvxPagePosSizeItem *pItem // new value of page attributes
    1055             : )
    1056             : 
    1057             : /* [Description]
    1058             : 
    1059             :    Store new value of page attributes
    1060             : */
    1061             : 
    1062             : {
    1063          20 :     if(bActive)
    1064             :     {
    1065          20 :         delete pPagePosItem; pPagePosItem = 0;
    1066          20 :         if(pItem)
    1067          20 :             pPagePosItem = new SvxPagePosSizeItem(*pItem);
    1068          20 :         StartListening_Impl();
    1069             :     }
    1070          20 : }
    1071             : 
    1072             : 
    1073             : //
    1074             : 
    1075         208 : void SvxRuler::SetDefTabDist
    1076             : (
    1077             :  long l  // New distance for DefaultTabs in App-Metrics
    1078             : )
    1079             : 
    1080             : /* [Description]
    1081             : 
    1082             :    New distance is set for DefaultTabs
    1083             : */
    1084             : 
    1085             : {
    1086             : 
    1087         208 :     lDefTabDist = l;
    1088         208 :     UpdateTabs();
    1089         208 : }
    1090             : 
    1091             : 
    1092           1 : sal_uInt16 ToSvTab_Impl(SvxTabAdjust eAdj)
    1093             : 
    1094             : /* [Description]
    1095             : 
    1096             :    Internal convertion routine between SV-Tab.-Enum and Svx
    1097             : */
    1098             : 
    1099             : {
    1100           1 :     switch(eAdj) {
    1101           1 :     case SVX_TAB_ADJUST_LEFT:    return RULER_TAB_LEFT;
    1102           0 :     case SVX_TAB_ADJUST_RIGHT:   return RULER_TAB_RIGHT;
    1103           0 :     case SVX_TAB_ADJUST_DECIMAL: return RULER_TAB_DECIMAL;
    1104           0 :     case SVX_TAB_ADJUST_CENTER:  return RULER_TAB_CENTER;
    1105           0 :     case SVX_TAB_ADJUST_DEFAULT: return RULER_TAB_DEFAULT;
    1106             :     default: ;//prevent warning
    1107             :     }
    1108           0 :     return 0;
    1109             : }
    1110             : 
    1111             : 
    1112           0 : SvxTabAdjust ToAttrTab_Impl(sal_uInt16 eAdj)
    1113             : {
    1114           0 :     switch(eAdj) {
    1115           0 :     case RULER_TAB_LEFT:    return SVX_TAB_ADJUST_LEFT    ;
    1116           0 :     case RULER_TAB_RIGHT:   return SVX_TAB_ADJUST_RIGHT   ;
    1117           0 :     case RULER_TAB_DECIMAL: return SVX_TAB_ADJUST_DECIMAL ;
    1118           0 :     case RULER_TAB_CENTER:  return SVX_TAB_ADJUST_CENTER  ;
    1119           0 :     case RULER_TAB_DEFAULT: return SVX_TAB_ADJUST_DEFAULT ;
    1120             :     }
    1121           0 :     return SVX_TAB_ADJUST_LEFT;
    1122             : }
    1123             : 
    1124             : 
    1125        2588 : void SvxRuler::UpdateTabs()
    1126             : 
    1127             : /* [Description]
    1128             : 
    1129             :    Update of Tabs
    1130             : */
    1131             : 
    1132             : {
    1133        2588 :     if(IsDrag())
    1134        2588 :         return;
    1135        2588 :     if(pPagePosItem && pParaItem && pTabStopItem && !pObjectItem)
    1136             :     {
    1137             :         // buffer for DefaultTabStop
    1138             :         // Distance last Tab <-> Right paragraph margin / DefaultTabDist
    1139          10 :         sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
    1140          10 :         long nLeftFrameMargin = GetLeftFrameMargin();
    1141          10 :         long nRightFrameMargin = GetRightFrameMargin();
    1142             : 
    1143             :     //#i24363# tab stops relative to indent
    1144          10 :         const long nParaItemTxtLeft = pParaItem->GetTxtLeft();
    1145             : 
    1146          10 :         const long lParaIndent = nLeftFrameMargin + nParaItemTxtLeft;
    1147             : 
    1148             :         const long lLastTab =
    1149          10 :              pTabStopItem->Count()?
    1150          10 :               ConvertHPosPixel((*pTabStopItem)[pTabStopItem->Count()-1].GetTabPos()): 0;
    1151             :         const long lPosPixel =
    1152          10 :             ConvertHPosPixel(lParaIndent) + lLastTab;
    1153             :         const long lRightIndent =
    1154          10 :             ConvertHPosPixel(nRightFrameMargin - pParaItem->GetRight());
    1155          10 :         long nDefTabDist = ConvertHPosPixel(lDefTabDist);
    1156          10 :         if( !nDefTabDist )
    1157           0 :             nDefTabDist = 1;
    1158             :         const sal_uInt16 nDefTabBuf = lPosPixel > lRightIndent ||
    1159             :             lLastTab > lRightIndent
    1160             :                 ? 0
    1161          10 :                 : (sal_uInt16)( (lRightIndent - lPosPixel) / nDefTabDist );
    1162             : 
    1163          10 :         if(pTabStopItem->Count() + TAB_GAP + nDefTabBuf > nTabBufSize)
    1164             :         {
    1165          10 :             delete[] pTabs;
    1166             :             // 10 (GAP) in stock
    1167          10 :             nTabBufSize = pTabStopItem->Count() + TAB_GAP + nDefTabBuf + GAP;
    1168          10 :             pTabs = new RulerTab[nTabBufSize];
    1169             :         }
    1170             : 
    1171          10 :         nTabCount = 0;
    1172             :         sal_uInt16 j;
    1173             :         //#i24363# tab stops relative to indent
    1174          10 :         const long lRightPixMargin = ConvertSizePixel(nRightFrameMargin - nParaItemTxtLeft );
    1175          10 :         const long lParaIndentPix = ConvertSizePixel(lParaIndent);
    1176          11 :         for(j = 0; j < pTabStopItem->Count(); ++j)
    1177             :         {
    1178           1 :             const SvxTabStop *pTab = &(*pTabStopItem)[j];
    1179           1 :             pTabs[nTabCount+TAB_GAP].nPos =
    1180             :                 ConvertHPosPixel(
    1181           1 :                 (pRuler_Imp->bIsTabsRelativeToIndent ? lParaIndent : 0 ) + pTab->GetTabPos() + lAppNullOffset);
    1182           1 :             if(bRTL)
    1183             :             {
    1184           0 :                 pTabs[nTabCount+TAB_GAP].nPos = lParaIndentPix + lRightPixMargin - pTabs[nTabCount+TAB_GAP].nPos;
    1185             :             }
    1186           1 :             pTabs[nTabCount+TAB_GAP].nStyle = ToSvTab_Impl(pTab->GetAdjustment());
    1187           1 :             ++nTabCount;
    1188             :         }
    1189          10 :         if(!pTabStopItem->Count())
    1190           9 :             pTabs[0].nPos = bRTL ? lRightPixMargin : lParaIndentPix;
    1191             : 
    1192             :         // fill the rest with default Tabs
    1193          10 :         if(bRTL)
    1194             :         {
    1195           0 :             for(j = 0; j < nDefTabBuf; ++j)
    1196             :             {
    1197           0 :                 pTabs[nTabCount + TAB_GAP].nPos =
    1198           0 :                     pTabs[nTabCount].nPos - nDefTabDist;
    1199             : 
    1200           0 :                 if(j == 0 )
    1201             :                     pTabs[nTabCount + TAB_GAP].nPos -=
    1202           0 :                         ((pTabs[nTabCount + TAB_GAP].nPos - lRightPixMargin)
    1203           0 :                          % nDefTabDist );
    1204           0 :                 if(pTabs[nTabCount+TAB_GAP].nPos <= lParaIndentPix)
    1205           0 :                     break;
    1206           0 :                 pTabs[nTabCount + TAB_GAP].nStyle = RULER_TAB_DEFAULT;
    1207           0 :                 ++nTabCount;
    1208             :             }
    1209             :         }
    1210             :         else
    1211             :         {
    1212         130 :             for(j = 0; j < nDefTabBuf; ++j)
    1213             :             {
    1214         124 :                 if( j == 0 )
    1215             :                 {
    1216             :                     //set the first default tab stop
    1217          10 :                     if(pRuler_Imp->bIsTabsRelativeToIndent)
    1218             :                     {
    1219           1 :                         pTabs[nTabCount + TAB_GAP].nPos =
    1220           1 :                             (pTabs[nTabCount].nPos + nDefTabDist);
    1221             :                         pTabs[nTabCount + TAB_GAP].nPos -=
    1222           1 :                             ((pTabs[nTabCount + TAB_GAP].nPos - lParaIndentPix)
    1223           2 :                                 % nDefTabDist );
    1224             :                     }
    1225             :                     else
    1226             :                     {
    1227           9 :                         if( pTabs[nTabCount].nPos < 0 )
    1228             :                         {
    1229           0 :                             pTabs[nTabCount + TAB_GAP].nPos = ( pTabs[nTabCount].nPos / nDefTabDist ) * nDefTabDist;
    1230             :                         }
    1231             :                         else
    1232             :                         {
    1233           9 :                             pTabs[nTabCount + TAB_GAP].nPos = ( pTabs[nTabCount].nPos / nDefTabDist + 1 ) * nDefTabDist;
    1234             :                         }
    1235             :                     }
    1236             : 
    1237             :                 }
    1238             :                 else
    1239             :                 {
    1240             :                     //simply add the default distance to the last position
    1241         114 :                     pTabs[nTabCount + TAB_GAP].nPos =
    1242         114 :                     pTabs[nTabCount].nPos + nDefTabDist;
    1243             :                 }
    1244             : 
    1245         124 :                 if(pTabs[nTabCount+TAB_GAP].nPos >= lRightIndent)
    1246           4 :                     break;
    1247         120 :                 pTabs[nTabCount + TAB_GAP].nStyle = RULER_TAB_DEFAULT;
    1248         120 :                 ++nTabCount;
    1249             :             }
    1250             :         }
    1251          10 :         SetTabs(nTabCount, pTabs+TAB_GAP);
    1252          10 :         DBG_ASSERT(nTabCount + TAB_GAP <= nTabBufSize, "BufferSize too small");
    1253             :     }
    1254             :     else
    1255             :     {
    1256        2578 :         SetTabs();
    1257             :     }
    1258             : }
    1259             : 
    1260             : 
    1261          20 : void SvxRuler::Update
    1262             : (
    1263             :  const SvxTabStopItem *pItem    // new value for tabs
    1264             : )
    1265             : 
    1266             : /* [Description]
    1267             : 
    1268             :    Store new value for tabs; delete old ones if possible
    1269             : */
    1270             : 
    1271             : {
    1272          20 :     if(bActive)
    1273             :     {
    1274          20 :         delete pTabStopItem; pTabStopItem = 0;
    1275          20 :         if(pItem)
    1276             :         {
    1277          10 :             pTabStopItem = new SvxTabStopItem(*pItem);
    1278          10 :             if(!bHorz)
    1279           0 :                 pTabStopItem->SetWhich(SID_ATTR_TABSTOP_VERTICAL);
    1280             :         }
    1281          20 :         StartListening_Impl();
    1282             :     }
    1283          20 : }
    1284             : 
    1285             : 
    1286           0 : void SvxRuler::Update
    1287             : (
    1288             :  const SvxObjectItem *pItem             // new value for objects
    1289             : )
    1290             : 
    1291             : /* [Description]
    1292             : 
    1293             :    Store new value for objects
    1294             : */
    1295             : 
    1296             : {
    1297           0 :     if(bActive)
    1298             :     {
    1299           0 :         delete pObjectItem; pObjectItem = 0;
    1300           0 :         if(pItem)
    1301           0 :             pObjectItem = new SvxObjectItem(*pItem);
    1302           0 :         StartListening_Impl();
    1303             :     }
    1304           0 : }
    1305             : 
    1306             : 
    1307           0 : void SvxRuler::SetNullOffsetLogic
    1308             : (
    1309             :  long lVal  // Setting of the logic NullOffsets
    1310             : )
    1311             : {
    1312           0 :     lAppNullOffset = lLogicNullOffset - lVal;
    1313           0 :     bAppSetNullOffset = sal_True;
    1314           0 :     Ruler::SetNullOffset(ConvertSizePixel(lVal));
    1315           0 :     Update();
    1316           0 : }
    1317             : 
    1318             : 
    1319        2380 : void SvxRuler::Update()
    1320             : 
    1321             : /* [Description]
    1322             : 
    1323             :    Perform update of view
    1324             : */
    1325             : 
    1326             : {
    1327        2380 :     if(IsDrag())
    1328        2380 :         return;
    1329        2380 :     UpdatePage();
    1330        2380 :     UpdateFrame();
    1331        2380 :     if((nFlags & SVXRULER_SUPPORT_OBJECT) == SVXRULER_SUPPORT_OBJECT)
    1332           0 :         UpdateObject();
    1333             :     else
    1334        2380 :         UpdateColumns();
    1335             : 
    1336        2380 :     if(0 != (nFlags & (SVXRULER_SUPPORT_PARAGRAPH_MARGINS |SVXRULER_SUPPORT_PARAGRAPH_MARGINS_VERTICAL)))
    1337        2380 :       UpdatePara();
    1338        2380 :     if(0 != (nFlags & SVXRULER_SUPPORT_TABS))
    1339        2380 :       UpdateTabs();
    1340             : }
    1341             : 
    1342             : 
    1343           0 : inline long SvxRuler::GetPageWidth() const
    1344             : {
    1345           0 :     return bHorz ? pPagePosItem->GetWidth() : pPagePosItem->GetHeight();
    1346             : 
    1347             : }
    1348             : 
    1349             : 
    1350           0 : inline long SvxRuler::GetFrameLeft() const
    1351             : 
    1352             : /* [Description]
    1353             : 
    1354             :    Get Left margin in Pixels
    1355             : */
    1356             : 
    1357             : 
    1358             : {
    1359             :     return  bAppSetNullOffset?
    1360           0 :             GetMargin1() + ConvertSizePixel(lLogicNullOffset):
    1361           0 :             Ruler::GetNullOffset();
    1362             : }
    1363             : 
    1364             : inline void SvxRuler::SetFrameLeft(long l)
    1365             : 
    1366             : /* [Description]
    1367             : 
    1368             :    Set Left margin in Pixels
    1369             : */
    1370             : 
    1371             : {
    1372             :     sal_Bool bProtectColumns =
    1373             :         pRuler_Imp->aProtectItem.IsSizeProtected() ||
    1374             :         pRuler_Imp->aProtectItem.IsPosProtected();
    1375             :     if(bAppSetNullOffset)
    1376             :         SetMargin1(l - ConvertSizePixel(lLogicNullOffset),
    1377             :                    bProtectColumns ? 0 : RULER_MARGIN_SIZEABLE);
    1378             :     else
    1379             :         Ruler::SetNullOffset(l);
    1380             : }
    1381             : 
    1382             : 
    1383           0 : long SvxRuler::GetFirstLineIndent() const
    1384             : 
    1385             : /* [Description]
    1386             : 
    1387             :    Get First-line indent in pixels
    1388             : */
    1389             : 
    1390             : {
    1391           0 :     return pParaItem? pIndents[INDENT_FIRST_LINE].nPos: GetMargin1();
    1392             : }
    1393             : 
    1394             : 
    1395           0 : long SvxRuler::GetLeftIndent() const
    1396             : 
    1397             : /* [Description]
    1398             : 
    1399             :    Get Left paragraph margin in Pixels
    1400             : */
    1401             : 
    1402             : {
    1403           0 :     return pParaItem? pIndents[INDENT_LEFT_MARGIN].nPos: GetMargin1();
    1404             : }
    1405             : 
    1406             : 
    1407             : 
    1408           0 : long SvxRuler::GetRightIndent() const
    1409             : 
    1410             : /* [Description]
    1411             : 
    1412             :    Get Right paragraph margin in Pixels
    1413             : */
    1414             : 
    1415             : {
    1416           0 :     return pParaItem? pIndents[INDENT_RIGHT_MARGIN].nPos: GetMargin2();
    1417             : }
    1418             : 
    1419             : 
    1420           0 : long SvxRuler::GetLogicRightIndent() const
    1421             : 
    1422             : /* [Description]
    1423             : 
    1424             :    Get Right paragraph margin in Logic
    1425             : */
    1426             : 
    1427             : {
    1428           0 :     return pParaItem ? GetRightFrameMargin()-pParaItem->GetRight() : GetRightFrameMargin();
    1429             : }
    1430             : 
    1431             : // Left margin in App values, is either the margin (= 0)  or the left edge of
    1432             : // the column that is set in the column attribute as current column.
    1433          20 : long SvxRuler::GetLeftFrameMargin() const
    1434             : {
    1435             :     // #126721# for some unknown reason the current column is set to 0xffff
    1436             :     DBG_ASSERT(!pColumnItem || pColumnItem->GetActColumn() < pColumnItem->Count(),
    1437             :                     "issue #126721# - invalid current column!");
    1438             :     long nLeft =
    1439           0 :         pColumnItem && pColumnItem->Count() && pColumnItem->GetActColumn() < pColumnItem->Count() ?
    1440          20 :         (*pColumnItem)[pColumnItem->GetActColumn()].nStart : 0;
    1441          20 :     if(pParaBorderItem && (!pColumnItem || pColumnItem->IsTable()))
    1442          18 :         nLeft += pParaBorderItem->GetLeft();
    1443          20 :     return nLeft;
    1444             : }
    1445             : 
    1446           0 : inline long SvxRuler::GetLeftMin() const
    1447             : {
    1448             :     DBG_ASSERT(pMinMaxItem, "no MinMax value set");
    1449             :     return pMinMaxItem?
    1450           0 :         bHorz?  pMinMaxItem->GetValue().Left(): pMinMaxItem->GetValue().Top()
    1451           0 :                 : 0;
    1452             : }
    1453             : 
    1454           0 : inline long SvxRuler::GetRightMax() const
    1455             : {
    1456             :     DBG_ASSERT(pMinMaxItem, "no MinMax value set");
    1457             :     return pMinMaxItem?
    1458           0 :         bHorz? pMinMaxItem->GetValue().Right(): pMinMaxItem->GetValue().Bottom()
    1459           0 :             : 0;
    1460             : }
    1461             : 
    1462             : 
    1463          20 : long SvxRuler::GetRightFrameMargin() const
    1464             : 
    1465             : /* [Description]
    1466             : 
    1467             :    Get right frame margin (in logical units)
    1468             : */
    1469             : 
    1470             : {
    1471          20 :     if(pColumnItem)
    1472             :     {
    1473           0 :         if(!IsActLastColumn( sal_True ))
    1474             :         {
    1475           0 :             long nRet = (*pColumnItem)[GetActRightColumn( sal_True )].nEnd;
    1476           0 :             if(pColumnItem->IsTable() && pParaBorderItem)
    1477           0 :                 nRet -= pParaBorderItem->GetRight();
    1478           0 :             return nRet;
    1479             :         }
    1480             :     }
    1481             : 
    1482          20 :     long l = lLogicNullOffset;
    1483             : 
    1484             :     // If possible deduct right table entry
    1485          20 :     if(pColumnItem && pColumnItem->IsTable())
    1486           0 :         l += pColumnItem->GetRight();
    1487          20 :     else if(bHorz && pLRSpaceItem)
    1488          20 :         l += pLRSpaceItem->GetRight();
    1489           0 :     else if(!bHorz && pULSpaceItem)
    1490           0 :         l += pULSpaceItem->GetLower();
    1491             : 
    1492          38 :     if(pParaBorderItem &&
    1493          18 :         (!pColumnItem || pColumnItem->IsTable()||IsActLastColumn( sal_True )))
    1494          18 :         l += pParaBorderItem->GetRight();
    1495             : 
    1496          20 :     if(bHorz)
    1497          20 :         l = pPagePosItem->GetWidth() - l;
    1498             :     else
    1499           0 :         l = pPagePosItem->GetHeight() - l;
    1500          20 :     return l;
    1501             : }
    1502             : 
    1503             : #define NEG_FLAG ( (nFlags & SVXRULER_SUPPORT_NEGATIVE_MARGINS) == \
    1504             :                    SVXRULER_SUPPORT_NEGATIVE_MARGINS )
    1505             : #define TAB_FLAG ( pColumnItem && pColumnItem->IsTable() )
    1506             : 
    1507           0 : long SvxRuler::GetCorrectedDragPos( sal_Bool bLeft, sal_Bool bRight )
    1508             : 
    1509             : /* [Description]
    1510             : 
    1511             :    Corrects the position within the calculated limits. The limit values are in
    1512             :    pixels relative to the page edge.
    1513             : */
    1514             : 
    1515             : {
    1516           0 :     const long lNullPix = Ruler::GetNullOffset();
    1517           0 :     long lDragPos = GetDragPos() + lNullPix;
    1518             : ADD_DEBUG_TEXT("lDragPos: ", String::CreateFromInt32(lDragPos))
    1519           0 :      sal_Bool bHoriRows = bHorz && pRuler_Imp->bIsTableRows;
    1520           0 :     if((bLeft || (bHoriRows)) && lDragPos < nMaxLeft)
    1521           0 :         lDragPos = nMaxLeft;
    1522           0 :     else if((bRight||bHoriRows) && lDragPos > nMaxRight)
    1523           0 :         lDragPos = nMaxRight;
    1524           0 :     return lDragPos - lNullPix;
    1525             : }
    1526             : 
    1527             : 
    1528             : 
    1529           0 : void ModifyTabs_Impl
    1530             : (
    1531             :  sal_uInt16 nCount,                             // Number of Tabs
    1532             :  RulerTab *pTabs,                               // Tab buffer
    1533             :  long lDiff                                     // difference to be added
    1534             :  )
    1535             : 
    1536             : /* [Description]
    1537             : 
    1538             :    Helper function, move all the tabs by a fixed value
    1539             : */
    1540             : {
    1541           0 :     if( pTabs )
    1542           0 :         for(sal_uInt16 i = 0; i < nCount; ++i)  pTabs[i].nPos += lDiff;
    1543           0 : }
    1544             : 
    1545             : 
    1546             : 
    1547           0 : void SvxRuler::DragMargin1()
    1548             : 
    1549             : /* [Description]
    1550             : 
    1551             :    Dragging the left edge of frame
    1552             : */
    1553             : {
    1554           0 :     const long lDragPos = GetCorrectedDragPos( !TAB_FLAG || !NEG_FLAG, sal_True );
    1555           0 :     DrawLine_Impl(lTabPos, ( TAB_FLAG && NEG_FLAG ) ? 3 : 7, bHorz);
    1556           0 :     if(pColumnItem&&
    1557             :        (nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL))
    1558           0 :         DragBorders();
    1559           0 :     AdjustMargin1(lDragPos);
    1560           0 : }
    1561           0 : void SvxRuler::AdjustMargin1(long lDiff)
    1562             : {
    1563           0 :     const long nOld = bAppSetNullOffset? GetMargin1(): GetNullOffset();
    1564           0 :     const long lDragPos = lDiff;
    1565             :     sal_Bool bProtectColumns =
    1566           0 :         pRuler_Imp->aProtectItem.IsSizeProtected() ||
    1567           0 :         pRuler_Imp->aProtectItem.IsPosProtected();
    1568             : 
    1569             :     const sal_uInt16 nMarginStyle =
    1570           0 :         bProtectColumns ? 0 : RULER_MARGIN_SIZEABLE;
    1571             : 
    1572           0 :     if(!bAppSetNullOffset)
    1573             :     {
    1574           0 :         long _lDiff = lDragPos;
    1575           0 :         SetNullOffset(nOld + _lDiff);
    1576           0 :         if(!pColumnItem||!(nDragType & DRAG_OBJECT_SIZE_LINEAR))
    1577             :         {
    1578           0 :             SetMargin2( GetMargin2() - _lDiff, nMarginStyle );
    1579             : 
    1580           0 :             if(!pColumnItem && !pObjectItem && pParaItem)
    1581             :             {
    1582             :                 // Right indent of the old position
    1583           0 :                 pIndents[INDENT_RIGHT_MARGIN].nPos -= _lDiff;
    1584           0 :                 SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
    1585             :             }
    1586           0 :             if(pObjectItem)
    1587             :             {
    1588           0 :                 pObjectBorders[GetObjectBordersOff(0)].nPos -= _lDiff;
    1589           0 :                 pObjectBorders[GetObjectBordersOff(1)].nPos -= _lDiff;
    1590           0 :                 SetBorders(2, pObjectBorders + GetObjectBordersOff(0));
    1591             :             }
    1592           0 :             if(pColumnItem)
    1593             :             {
    1594           0 :                 for(sal_uInt16 i = 0; i < pColumnItem->Count()-1; ++i)
    1595           0 :                     pBorders[i].nPos -= _lDiff;
    1596           0 :                 SetBorders(pColumnItem->Count()-1, pBorders);
    1597           0 :                 if(pColumnItem->IsFirstAct())
    1598             :                 {
    1599             :                     // Right indent of the old position
    1600           0 :                     if(pParaItem)
    1601             :                     {
    1602           0 :                         pIndents[INDENT_RIGHT_MARGIN].nPos -= _lDiff;
    1603           0 :                         SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
    1604             :                     }
    1605             :                 }
    1606             :                 else
    1607             :                 {
    1608           0 :                     if(pParaItem)
    1609             :                     {
    1610           0 :                         pIndents[INDENT_FIRST_LINE].nPos -= _lDiff;
    1611           0 :                         pIndents[INDENT_LEFT_MARGIN].nPos -= _lDiff;
    1612           0 :                         pIndents[INDENT_RIGHT_MARGIN].nPos -= _lDiff;
    1613           0 :                         SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
    1614             :                     }
    1615             :                 }
    1616           0 :                 if(pTabStopItem&& (nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
    1617           0 :                    &&!IsActFirstColumn())
    1618             :                 {
    1619           0 :                     ModifyTabs_Impl(nTabCount+TAB_GAP, pTabs, -_lDiff);
    1620           0 :                     SetTabs(nTabCount, pTabs+TAB_GAP);
    1621             :                 }
    1622             :             }
    1623             :         }
    1624             :     }
    1625             :     else
    1626             :     {
    1627           0 :         long _lDiff = lDragPos - nOld;
    1628           0 :         SetMargin1(nOld + _lDiff, nMarginStyle );
    1629             : 
    1630           0 :         if(!pColumnItem||!(nDragType & (DRAG_OBJECT_SIZE_LINEAR |
    1631           0 :                                         DRAG_OBJECT_SIZE_PROPORTIONAL)))
    1632             :         {
    1633           0 :             if(!pColumnItem && !pObjectItem && pParaItem)
    1634             :             {
    1635             :                 // Left indent of the old position
    1636           0 :                 pIndents[INDENT_FIRST_LINE].nPos += _lDiff;
    1637           0 :                 pIndents[INDENT_LEFT_MARGIN].nPos += _lDiff;
    1638           0 :                 SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
    1639             :             }
    1640             : 
    1641           0 :             if(pColumnItem)
    1642             :             {
    1643           0 :                 for(sal_uInt16 i = 0; i < pColumnItem->Count()-1; ++i)
    1644           0 :                     pBorders[i].nPos += _lDiff;
    1645           0 :                 SetBorders(pColumnItem->Count()-1, pBorders);
    1646           0 :                 if(pColumnItem->IsFirstAct())
    1647             :                 {
    1648             :                     // Left indent of the old position
    1649           0 :                     if(pParaItem)
    1650             :                     {
    1651           0 :                         pIndents[INDENT_FIRST_LINE].nPos += _lDiff;
    1652           0 :                         pIndents[INDENT_LEFT_MARGIN].nPos += _lDiff;
    1653           0 :                         SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
    1654             :                     }
    1655             :                 }
    1656             :                 else
    1657             :                 {
    1658           0 :                     if(pParaItem)
    1659             :                     {
    1660           0 :                         pIndents[INDENT_FIRST_LINE].nPos += _lDiff;
    1661           0 :                         pIndents[INDENT_LEFT_MARGIN].nPos += _lDiff;
    1662           0 :                         pIndents[INDENT_RIGHT_MARGIN].nPos += _lDiff;
    1663           0 :                         SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
    1664             :                     }
    1665             :                 }
    1666             :             }
    1667           0 :             if(pTabStopItem)
    1668             :             {
    1669           0 :                 ModifyTabs_Impl(nTabCount+TAB_GAP, pTabs, _lDiff);
    1670           0 :                 SetTabs(nTabCount, pTabs+TAB_GAP);
    1671             :             }
    1672             :         }
    1673             :     }
    1674           0 : }
    1675             : 
    1676             : 
    1677           0 : void SvxRuler::DragMargin2()
    1678             : 
    1679             : /* [Description]
    1680             : 
    1681             :    Dragging the right edge of frame
    1682             : */
    1683             : {
    1684           0 :     const long lDragPos = GetCorrectedDragPos( sal_True, !TAB_FLAG || !NEG_FLAG);
    1685           0 :     DrawLine_Impl(lTabPos, ( TAB_FLAG && NEG_FLAG ) ? 5 : 7, bHorz);
    1686           0 :     long lDiff = lDragPos - GetMargin2();
    1687             : 
    1688           0 :     if(pRuler_Imp->bIsTableRows && !bHorz && pColumnItem&&
    1689             :        (nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL))
    1690           0 :         DragBorders();
    1691             : 
    1692             :     sal_Bool bProtectColumns =
    1693           0 :         pRuler_Imp->aProtectItem.IsSizeProtected() ||
    1694           0 :         pRuler_Imp->aProtectItem.IsPosProtected();
    1695             :     const sal_uInt16 nMarginStyle =
    1696           0 :         bProtectColumns ? 0 : RULER_MARGIN_SIZEABLE;
    1697           0 :     SetMargin2( lDragPos, nMarginStyle );
    1698             : 
    1699             :     // Right indent of the old position
    1700           0 :     if((!pColumnItem || IsActLastColumn()) && pParaItem)
    1701             :     {
    1702           0 :         pIndents[INDENT_FIRST_LINE].nPos += lDiff;
    1703           0 :         SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
    1704             :     }
    1705           0 : }
    1706             : 
    1707             : 
    1708           0 : void SvxRuler::DragIndents()
    1709             : 
    1710             : /* [Description]
    1711             : 
    1712             :    Dragging the paragraph indents
    1713             : */
    1714             : {
    1715           0 :     const long lDragPos = NEG_FLAG ? GetDragPos() : GetCorrectedDragPos();
    1716           0 :     const sal_uInt16 nIdx = GetDragAryPos()+INDENT_GAP;
    1717           0 :     const long lDiff = pIndents[nIdx].nPos - lDragPos;
    1718             : 
    1719           0 :     if((nIdx == INDENT_FIRST_LINE ||
    1720             :             nIdx == INDENT_LEFT_MARGIN )  &&
    1721             :         (nDragType & DRAG_OBJECT_LEFT_INDENT_ONLY) !=
    1722             :         DRAG_OBJECT_LEFT_INDENT_ONLY)
    1723           0 :         pIndents[INDENT_FIRST_LINE].nPos -= lDiff;
    1724             : 
    1725           0 :     pIndents[nIdx].nPos = lDragPos;
    1726             : 
    1727           0 :     SetIndents(INDENT_COUNT, pIndents + INDENT_GAP);
    1728           0 :     DrawLine_Impl(lTabPos, 1, bHorz);
    1729           0 : }
    1730             : 
    1731             : 
    1732           0 : void SvxRuler::DrawLine_Impl(long &_lTabPos, int nNew, sal_Bool Hori)
    1733             : 
    1734             : /* [Description]
    1735             : 
    1736             :    Output routine for the ledger line when moving tabs, tables and other
    1737             :    columns
    1738             : */
    1739             : {
    1740           0 :     if(Hori)
    1741             :     {
    1742           0 :         const long nHeight = pEditWin->GetOutputSize().Height();
    1743           0 :         Point aZero=pEditWin->GetMapMode().GetOrigin();
    1744           0 :         if(_lTabPos!=-1)
    1745             :             pEditWin->InvertTracking(
    1746           0 :                 Rectangle( Point(_lTabPos, -aZero.Y()),
    1747           0 :                            Point(_lTabPos, -aZero.Y()+nHeight)),
    1748           0 :                 SHOWTRACK_SPLIT | SHOWTRACK_CLIP );
    1749           0 :         if( nNew & 1 )
    1750             :         {
    1751             : 
    1752             :             _lTabPos = ConvertHSizeLogic(
    1753           0 :                 GetCorrectedDragPos( ( nNew&4 ) != 0, ( nNew&2 ) != 0 ) +
    1754           0 :                 GetNullOffset() );
    1755           0 :             if(pPagePosItem)
    1756           0 :                 _lTabPos += pPagePosItem->GetPos().X();
    1757             :             pEditWin->InvertTracking(
    1758           0 :                 Rectangle(Point(_lTabPos, -aZero.Y()),
    1759           0 :                           Point(_lTabPos, -aZero.Y()+nHeight)),
    1760           0 :                 SHOWTRACK_CLIP | SHOWTRACK_SPLIT );
    1761             :         }
    1762             :     }
    1763             :     else
    1764             :     {
    1765           0 :         const long nWidth = pEditWin->GetOutputSize().Width();
    1766           0 :         Point aZero=pEditWin->GetMapMode().GetOrigin();
    1767           0 :         if(_lTabPos != -1)
    1768             :         {
    1769             :             pEditWin->InvertTracking(
    1770           0 :                 Rectangle( Point(-aZero.X(), _lTabPos),
    1771           0 :                            Point(-aZero.X()+nWidth, _lTabPos)),
    1772           0 :                 SHOWTRACK_SPLIT | SHOWTRACK_CLIP );
    1773             :         }
    1774             : 
    1775           0 :         if(nNew & 1)
    1776             :         {
    1777           0 :             _lTabPos = ConvertVSizeLogic(GetCorrectedDragPos()+GetNullOffset());
    1778           0 :             if(pPagePosItem)
    1779           0 :                 _lTabPos += pPagePosItem->GetPos().Y();
    1780             :             pEditWin->InvertTracking(
    1781           0 :                 Rectangle( Point(-aZero.X(), _lTabPos),
    1782           0 :                            Point(-aZero.X()+nWidth, _lTabPos)),
    1783           0 :                 SHOWTRACK_CLIP | SHOWTRACK_SPLIT );
    1784             :         }
    1785             :     }
    1786           0 : }
    1787             : 
    1788             : 
    1789             : 
    1790             : 
    1791           0 : void SvxRuler::DragTabs()
    1792             : 
    1793             : /* [Description]
    1794             : 
    1795             :    Dragging of Tabs
    1796             : */
    1797             : {
    1798             : 
    1799           0 :     long lDragPos = GetCorrectedDragPos(sal_True, sal_False);
    1800             : 
    1801           0 :     sal_uInt16 nIdx = GetDragAryPos()+TAB_GAP;
    1802           0 :     DrawLine_Impl(lTabPos, 7, bHorz);
    1803             : 
    1804           0 :     long nDiff = lDragPos - pTabs[nIdx].nPos;
    1805             : 
    1806           0 :     if(nDragType & DRAG_OBJECT_SIZE_LINEAR)
    1807             :     {
    1808             : 
    1809           0 :         for(sal_uInt16 i = nIdx; i < nTabCount; ++i)
    1810             :         {
    1811           0 :             pTabs[i].nPos += nDiff;
    1812             :             // limit on maximum
    1813           0 :             if(pTabs[i].nPos > GetMargin2())
    1814           0 :                 pTabs[nIdx].nStyle |= RULER_STYLE_INVISIBLE;
    1815             :             else
    1816           0 :                 pTabs[nIdx].nStyle &= ~RULER_STYLE_INVISIBLE;
    1817             :         }
    1818             :     }
    1819           0 :     else if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
    1820             :     {
    1821           0 :         pRuler_Imp->nTotalDist -= nDiff;
    1822           0 :         pTabs[nIdx].nPos = lDragPos;
    1823           0 :         for(sal_uInt16 i = nIdx+1; i < nTabCount; ++i)
    1824             :         {
    1825           0 :             if(pTabs[i].nStyle & RULER_TAB_DEFAULT)
    1826             :                 // can be canceled at the DefaultTabs
    1827           0 :                 break;
    1828           0 :             long nDelta = pRuler_Imp->nTotalDist * pRuler_Imp->pPercBuf[i];
    1829           0 :             nDelta /= 1000;
    1830           0 :             pTabs[i].nPos = pTabs[nIdx].nPos + nDelta;
    1831           0 :             if(pTabs[i].nPos+GetNullOffset() > nMaxRight)
    1832           0 :                 pTabs[i].nStyle |= RULER_STYLE_INVISIBLE;
    1833             :             else
    1834           0 :                 pTabs[i].nStyle &= ~RULER_STYLE_INVISIBLE;
    1835             :         }
    1836             :     }
    1837             :     else
    1838           0 :         pTabs[nIdx].nPos = lDragPos;
    1839             : 
    1840           0 :     if(IsDragDelete())
    1841           0 :         pTabs[nIdx].nStyle |= RULER_STYLE_INVISIBLE;
    1842             :     else
    1843           0 :         pTabs[nIdx].nStyle &= ~RULER_STYLE_INVISIBLE;
    1844           0 :     SetTabs(nTabCount, pTabs+TAB_GAP);
    1845           0 : }
    1846             : 
    1847             : 
    1848             : 
    1849        1888 : void SvxRuler::SetActive(sal_Bool bOn)
    1850             : {
    1851        1888 :     if(bOn)
    1852             :     {
    1853         944 :         Activate();
    1854             :     }
    1855             :     else
    1856         944 :         Deactivate();
    1857        1888 :     if(bActive!=bOn)
    1858             :     {
    1859        1416 :         pBindings->EnterRegistrations();
    1860        1416 :         if(bOn)
    1861        5192 :             for(sal_uInt16 i=0;i<pRuler_Imp->nControlerItems;i++)
    1862        4720 :                 pCtrlItem[i]->ReBind();
    1863             :         else
    1864       10384 :             for(sal_uInt16 j=0;j<pRuler_Imp->nControlerItems;j++)
    1865        9440 :                 pCtrlItem[j]->UnBind();
    1866        1416 :         pBindings->LeaveRegistrations();
    1867             :     }
    1868        1888 :     bActive = bOn;
    1869        1888 : }
    1870             : 
    1871             : 
    1872             : 
    1873             : 
    1874           0 : void SvxRuler::UpdateParaContents_Impl
    1875             : (
    1876             :  long l,           // Difference
    1877             :  UpdateType eType  // Art (all, left or right)
    1878             : )
    1879             : 
    1880             : /* [Description]
    1881             : 
    1882             :    Helper function; carry Tabs and Paragraph Margins
    1883             : */
    1884             : {
    1885           0 :     switch(eType) {
    1886             :     case MOVE_RIGHT:
    1887           0 :         pIndents[INDENT_RIGHT_MARGIN].nPos += l;
    1888           0 :         break;
    1889             :     case MOVE_ALL:
    1890           0 :         pIndents[INDENT_RIGHT_MARGIN].nPos += l;
    1891             :         // no break
    1892             :     case MOVE_LEFT:
    1893             :         {
    1894           0 :             pIndents[INDENT_FIRST_LINE].nPos += l;
    1895           0 :             pIndents[INDENT_LEFT_MARGIN].nPos += l;
    1896           0 :             if ( pTabs )
    1897             :             {
    1898           0 :                 for(sal_uInt16 i = 0; i < nTabCount+TAB_GAP;++i)
    1899           0 :                     pTabs[i].nPos += l;
    1900           0 :                 SetTabs(nTabCount, pTabs+TAB_GAP);
    1901             :             }
    1902           0 :             break;
    1903             :         }
    1904             :     }
    1905           0 :     SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
    1906           0 : }
    1907             : 
    1908             : 
    1909           0 : void SvxRuler::DragBorders()
    1910             : 
    1911             : /* [Description]
    1912             : 
    1913             :    Dragging of Borders (Tables and other columns)
    1914             : */
    1915             : {
    1916           0 :     sal_Bool bLeftIndentsCorrected = sal_False, bRightIndentsCorrected = sal_False;
    1917             :     int nIdx;
    1918             : 
    1919           0 :     if(GetDragType()==RULER_TYPE_BORDER)
    1920             :     {
    1921           0 :         DrawLine_Impl(lTabPos, 7, bHorz);
    1922           0 :         nIdx = GetDragAryPos();
    1923             :     }
    1924             :     else
    1925           0 :         nIdx=0;
    1926             : 
    1927           0 :     sal_uInt16 nDragSize = GetDragSize();
    1928           0 :     long lDiff = 0;
    1929             : 
    1930             :     // the drag position has to be corrected to be able to prevent borders from passing each other
    1931           0 :     long lPos = GetCorrectedDragPos();
    1932             : 
    1933             : 
    1934           0 :     switch(nDragSize)
    1935             :     {
    1936             :       case RULER_DRAGSIZE_MOVE:
    1937             :         {
    1938             : ADD_DEBUG_TEXT("lLastLMargin: ", String::CreateFromInt32(pRuler_Imp->lLastLMargin))
    1939           0 :             lDiff = GetDragType()==RULER_TYPE_BORDER ?
    1940           0 :                 lPos-nDragOffset - pBorders[nIdx].nPos
    1941           0 :                 : GetDragType() == RULER_TYPE_MARGIN1 ? lPos - pRuler_Imp->lLastLMargin : lPos - pRuler_Imp->lLastRMargin;
    1942             : 
    1943           0 :             if(nDragType & DRAG_OBJECT_SIZE_LINEAR)
    1944             :             {
    1945           0 :                 long nRight = GetMargin2()-lMinFrame; // Right limiters
    1946           0 :                 for(int i = nBorderCount-2; i >= nIdx; --i)
    1947             :                 {
    1948           0 :                     long l = pBorders[i].nPos;
    1949           0 :                     pBorders[i].nPos += lDiff;
    1950           0 :                     pBorders[i].nPos = Min(pBorders[i].nPos, nRight - pBorders[i].nWidth);
    1951           0 :                     nRight = pBorders[i].nPos - lMinFrame;
    1952             :                     // RR update the column
    1953           0 :                     if(i == GetActRightColumn())
    1954             :                     {
    1955           0 :                         UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_RIGHT);
    1956           0 :                         bRightIndentsCorrected = sal_True;
    1957             :                     }
    1958             :                     // LAR, EZE update the column
    1959           0 :                     else if(i == GetActLeftColumn())
    1960             :                     {
    1961           0 :                         UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_LEFT);
    1962           0 :                         bLeftIndentsCorrected = sal_True;
    1963             :                     }
    1964             :                 }
    1965             :             }
    1966           0 :             else if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
    1967             :             {
    1968             :                 int nLimit;
    1969             :                 long lLeft;
    1970           0 :                 int nStartLimit = nBorderCount-2;
    1971           0 :                 switch(GetDragType())
    1972             :                 {
    1973             :                 default: ;//prevent warning
    1974             :                     OSL_FAIL("svx::SvxRuler::DragBorders(), unknown drag type!" );
    1975             :                 case RULER_TYPE_BORDER:
    1976           0 :                     if(pRuler_Imp->bIsTableRows)
    1977             :                     {
    1978           0 :                         pBorders[nIdx].nPos += lDiff;
    1979           0 :                         if(bHorz)
    1980             :                         {
    1981           0 :                             lLeft = pBorders[nIdx].nPos;
    1982           0 :                             pRuler_Imp->nTotalDist -= lDiff;
    1983           0 :                             nLimit=nIdx+1;
    1984             :                         }
    1985             :                         else
    1986             :                         {
    1987           0 :                             lLeft = 0;
    1988           0 :                             nStartLimit = nIdx - 1;
    1989           0 :                             pRuler_Imp->nTotalDist += lDiff;
    1990           0 :                             nLimit = 0;
    1991             :                         }
    1992             :                     }
    1993             :                     else
    1994             :                     {
    1995           0 :                         nLimit=nIdx+1;
    1996           0 :                         pBorders[nIdx].nPos += lDiff;
    1997           0 :                         lLeft = pBorders[nIdx].nPos;
    1998           0 :                         pRuler_Imp->nTotalDist-=lDiff;
    1999             :                     }
    2000           0 :                 break;
    2001             :                 case RULER_TYPE_MARGIN1:
    2002           0 :                     nLimit=0;
    2003           0 :                     lLeft=pRuler_Imp->lLastLMargin+lDiff;
    2004           0 :                     pRuler_Imp->nTotalDist-=lDiff;
    2005           0 :                 break;
    2006             :                 case RULER_TYPE_MARGIN2:
    2007           0 :                     nLimit = 0;
    2008           0 :                     lLeft= 0;
    2009           0 :                     nStartLimit = nBorderCount - 2;
    2010           0 :                     pRuler_Imp->nTotalDist += lDiff;
    2011           0 :                 break;
    2012             :                 }
    2013             : 
    2014           0 :                 for(int i  = nStartLimit; i >= nLimit; --i)
    2015             :                 {
    2016             : 
    2017           0 :                     long l = pBorders[i].nPos;
    2018           0 :                     pBorders[i].nPos=lLeft+
    2019           0 :                         (pRuler_Imp->nTotalDist*pRuler_Imp->pPercBuf[i])/1000+
    2020           0 :                             pRuler_Imp->pBlockBuf[i];
    2021             : 
    2022             :                     // RR update the column
    2023           0 :                     if(!pRuler_Imp->bIsTableRows)
    2024             :                     {
    2025           0 :                         if(i == GetActRightColumn())
    2026             :                         {
    2027           0 :                             UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_RIGHT);
    2028           0 :                             bRightIndentsCorrected = sal_True;
    2029             :                         }
    2030             :                         // LAR, EZE update the column
    2031           0 :                         else if(i == GetActLeftColumn())
    2032             :                         {
    2033           0 :                             UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_LEFT);
    2034           0 :                             bLeftIndentsCorrected = sal_True;
    2035             :                         }
    2036             :                     }
    2037             :                 }
    2038           0 :                 if(pRuler_Imp->bIsTableRows)
    2039             :                 {
    2040             :                     //in vertical tables the left borders have to be moved
    2041           0 :                     if(bHorz)
    2042             :                     {
    2043           0 :                         for(int i  = 0; i < nIdx; ++i)
    2044           0 :                             pBorders[i].nPos += lDiff;
    2045           0 :                         AdjustMargin1(lDiff);
    2046             :                     }
    2047             :                     else
    2048             :                     {
    2049             :                         //otherwise the right borders are moved
    2050           0 :                         for(int i  = pColumnItem->Count() - 1; i > nIdx; --i)
    2051           0 :                             pBorders[i].nPos += lDiff;
    2052           0 :                         SetMargin2( GetMargin2() + lDiff, 0 );
    2053             :                     }
    2054             :                 }
    2055             :             }
    2056           0 :             else if(pRuler_Imp->bIsTableRows)
    2057             :             {
    2058             :                 //moving rows: if a row is resized all following rows
    2059             :                 //have to be moved by the same amount.
    2060             :                 //This includes the left border when the table is not limited
    2061             :                 //to a lower frame border.
    2062             :                 int nLimit;
    2063           0 :                 if(GetDragType()==RULER_TYPE_BORDER)
    2064             :                 {
    2065           0 :                     nLimit=nIdx+1;
    2066           0 :                     pBorders[nIdx].nPos+=lDiff;
    2067             :                 }
    2068             :                 else
    2069             :                 {
    2070           0 :                     nLimit=0;
    2071             :                 }
    2072             :                 //in vertical tables the left borders have to be moved
    2073           0 :                 if(bHorz)
    2074             :                 {
    2075           0 :                     for(int i  = 0; i < nIdx; ++i)
    2076             :                     {
    2077           0 :                         pBorders[i].nPos += lDiff;
    2078             :                     }
    2079           0 :                     AdjustMargin1(lDiff);
    2080             :                 }
    2081             :                 else
    2082             :                 {
    2083             :                     //otherwise the right borders are moved
    2084           0 :                     for(int i  = nBorderCount-2; i >= nLimit; --i)
    2085             :                     {
    2086           0 :                         pBorders[i].nPos += lDiff;
    2087             :                     }
    2088           0 :                     SetMargin2( GetMargin2() + lDiff, 0 );
    2089             :                 }
    2090             :             }
    2091             :             else
    2092           0 :                 pBorders[nIdx].nPos+=lDiff;
    2093           0 :             break;
    2094             :         }
    2095             :       case RULER_DRAGSIZE_1:
    2096             :         {
    2097           0 :             lDiff = lPos - pBorders[nIdx].nPos;
    2098           0 :             pBorders[nIdx].nWidth += pBorders[nIdx].nPos - lPos;
    2099           0 :             pBorders[nIdx].nPos = lPos;
    2100           0 :             break;
    2101             :         }
    2102             :       case RULER_DRAGSIZE_2:
    2103             :         {
    2104           0 :             const long nOld = pBorders[nIdx].nWidth;
    2105           0 :             pBorders[nIdx].nWidth = lPos - pBorders[nIdx].nPos;
    2106           0 :             lDiff = pBorders[nIdx].nWidth - nOld;
    2107           0 :             break;
    2108             :         }
    2109             :     }
    2110           0 :     if(!bRightIndentsCorrected &&
    2111           0 :        GetActRightColumn() == nIdx &&
    2112             :        nDragSize != RULER_DRAGSIZE_2 && pIndents &&
    2113           0 :        !pRuler_Imp->bIsTableRows)
    2114             :     {
    2115           0 :         UpdateParaContents_Impl(lDiff, MOVE_RIGHT);
    2116             :     }
    2117           0 :     else if(!bLeftIndentsCorrected &&
    2118           0 :             GetActLeftColumn()==nIdx &&
    2119             :             nDragSize != RULER_DRAGSIZE_1 && pIndents)
    2120             :     {
    2121           0 :         UpdateParaContents_Impl(lDiff, MOVE_LEFT);
    2122             :     }
    2123           0 :     SetBorders(pColumnItem->Count()-1, pBorders);
    2124           0 : }
    2125             : 
    2126             : 
    2127           0 : void SvxRuler::DragObjectBorder()
    2128             : 
    2129             : /* [Description]
    2130             : 
    2131             :    Dragging of object edges
    2132             : */
    2133             : {
    2134           0 :     if(RULER_DRAGSIZE_MOVE == GetDragSize())
    2135             :     {
    2136           0 :         const long lPos = GetCorrectedDragPos();
    2137           0 :         const sal_uInt16 nIdx = GetDragAryPos();
    2138           0 :         pObjectBorders[GetObjectBordersOff(nIdx)].nPos = lPos;
    2139           0 :         SetBorders(2, pObjectBorders + GetObjectBordersOff(0));
    2140           0 :         DrawLine_Impl(lTabPos, 7, bHorz);
    2141             : 
    2142             :     }
    2143           0 : }
    2144             : 
    2145             : 
    2146           0 : void SvxRuler::ApplyMargins()
    2147             : 
    2148             : /* [Description]
    2149             : 
    2150             :    Applying margins; changed by dragging.
    2151             : */
    2152             : {
    2153           0 :     const SfxPoolItem *pItem = 0;
    2154           0 :     sal_uInt16 nId = SID_ATTR_LONG_LRSPACE;
    2155           0 :     if(bHorz)
    2156             :     {
    2157           0 :         const long lOldNull = lLogicNullOffset;
    2158           0 :         if(pRuler_Imp->lMaxLeftLogic!=-1&&nMaxLeft==GetMargin1()+Ruler::GetNullOffset())
    2159           0 :             pLRSpaceItem->SetLeft(lLogicNullOffset=pRuler_Imp->lMaxLeftLogic);
    2160             :         else
    2161             :             pLRSpaceItem->SetLeft(PixelHAdjust(
    2162           0 :                 lLogicNullOffset =  ConvertHPosLogic(GetFrameLeft()) -
    2163           0 :                 lAppNullOffset, pLRSpaceItem->GetLeft()));
    2164             : 
    2165           0 :         if(bAppSetNullOffset)
    2166           0 :             lAppNullOffset += lLogicNullOffset - lOldNull;
    2167             : 
    2168           0 :         if(pRuler_Imp->lMaxRightLogic!=-1
    2169           0 :            &&nMaxRight==GetMargin2()+Ruler::GetNullOffset())
    2170           0 :             pLRSpaceItem->SetRight(GetPageWidth()-pRuler_Imp->lMaxRightLogic);
    2171             :         else
    2172             :             pLRSpaceItem->SetRight(
    2173             :                 PixelHAdjust(
    2174           0 :                     Max((long)0,pPagePosItem->GetWidth() -
    2175           0 :                         pLRSpaceItem->GetLeft() -
    2176           0 :                         (ConvertHPosLogic(GetMargin2()) -
    2177           0 :                          lAppNullOffset)),pLRSpaceItem->GetRight()));
    2178           0 :         pItem = pLRSpaceItem;
    2179             : #ifdef DEBUGLIN
    2180             :         Debug_Impl(pEditWin,*pLRSpaceItem);
    2181             : #endif // DEBUGLIN
    2182             :     }
    2183             :     else {
    2184           0 :         const long lOldNull = lLogicNullOffset;
    2185             :         pULSpaceItem->SetUpper(
    2186             :             PixelVAdjust(
    2187             :                 lLogicNullOffset =
    2188           0 :                 ConvertVPosLogic(GetFrameLeft()) -
    2189           0 :                 lAppNullOffset,pULSpaceItem->GetUpper()));
    2190           0 :         if(bAppSetNullOffset)
    2191           0 :             lAppNullOffset += lLogicNullOffset - lOldNull;
    2192             :         pULSpaceItem->SetLower(
    2193             :             PixelVAdjust(
    2194           0 :                 Max((long)0, pPagePosItem->GetHeight() -
    2195           0 :                     pULSpaceItem->GetUpper() -
    2196           0 :                     (ConvertVPosLogic(GetMargin2()) -
    2197           0 :                      lAppNullOffset)),pULSpaceItem->GetLower()));
    2198           0 :         pItem = pULSpaceItem;
    2199           0 :         nId = SID_ATTR_LONG_ULSPACE;
    2200             : #ifdef DEBUGLIN
    2201             :         Debug_Impl(pEditWin,*pULSpaceItem);
    2202             : #endif // DEBUGLIN
    2203             :     }
    2204           0 :     pBindings->GetDispatcher()->Execute( nId, SFX_CALLMODE_RECORD, pItem, 0L );
    2205           0 :     if(pTabStopItem)
    2206           0 :         UpdateTabs();
    2207           0 : }
    2208             : 
    2209             : 
    2210           0 : void SvxRuler::ApplyIndents()
    2211             : 
    2212             : /* [Description]
    2213             : 
    2214             :    Applying paragraph settings; changed by dragging.
    2215             : */
    2216             : {
    2217             :     long nNewTxtLeft;
    2218           0 :     if(pColumnItem&&!IsActFirstColumn( sal_True ))
    2219             :     {
    2220           0 :         long nLeftCol=GetActLeftColumn( sal_True );
    2221             :         nNewTxtLeft =
    2222             :             PixelHAdjust(
    2223             :                 ConvertHPosLogic(
    2224           0 :                     pIndents[INDENT_LEFT_MARGIN].nPos-
    2225           0 :                     (pBorders[nLeftCol].nPos +
    2226           0 :                      pBorders[nLeftCol].nWidth))-
    2227           0 :                 lAppNullOffset,pParaItem->GetTxtLeft());
    2228             :     }
    2229             :     else
    2230             :         nNewTxtLeft =
    2231             :             PixelHAdjust(
    2232           0 :                 ConvertHPosLogic(pIndents[INDENT_LEFT_MARGIN].nPos),
    2233           0 :                 pParaItem->GetTxtLeft());
    2234             : 
    2235           0 :     sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
    2236             : 
    2237             :     long nNewFirstLineOffset;
    2238           0 :     if(bRTL)
    2239             :     {
    2240           0 :         long nRightFrameMargin = GetRightFrameMargin();
    2241             :         nNewFirstLineOffset =   PixelHAdjust(nRightFrameMargin -
    2242           0 :                 ConvertHPosLogic(pIndents[INDENT_FIRST_LINE].nPos ) -
    2243             :                 lAppNullOffset,
    2244           0 :                 pParaItem->GetTxtFirstLineOfst());
    2245             :     }
    2246             :     else
    2247             :         nNewFirstLineOffset=
    2248             :             PixelHAdjust(
    2249           0 :                 ConvertHPosLogic(pIndents[INDENT_FIRST_LINE].nPos -
    2250           0 :                              pIndents[INDENT_LEFT_MARGIN].nPos) -
    2251             :                 lAppNullOffset,
    2252           0 :                 pParaItem->GetTxtFirstLineOfst());
    2253             : 
    2254             :     // If the new TxtLeft is smaller than the old FirstLineIndent, then the
    2255             :     // difference is lost and the paragraph is in total indented too far,
    2256             :     // so first set the FirstLineOffset, then the TxtLeft
    2257             : 
    2258           0 :     if(bRTL)
    2259             :     {
    2260           0 :         long nLeftFrameMargin = GetLeftFrameMargin();
    2261           0 :         long nRightFrameMargin = GetRightFrameMargin();
    2262           0 :         nNewTxtLeft = nRightFrameMargin - nNewTxtLeft - nLeftFrameMargin;
    2263           0 :         nNewFirstLineOffset -= nNewTxtLeft;
    2264           0 :         if(pParaBorderItem)
    2265             :         {
    2266           0 :             nNewTxtLeft += pParaBorderItem->GetLeft() + pParaBorderItem->GetRight();
    2267           0 :             nNewFirstLineOffset -= pParaBorderItem->GetRight();
    2268             :         }
    2269             :     }
    2270             :     pParaItem->SetTxtFirstLineOfst(
    2271           0 :         sal::static_int_cast< short >(nNewFirstLineOffset));
    2272           0 :     pParaItem->SetTxtLeft(nNewTxtLeft);
    2273             : 
    2274           0 :     if(pColumnItem && ((!bRTL && !IsActLastColumn( sal_True ))|| (bRTL && !IsActFirstColumn())))
    2275             :     {
    2276           0 :         if(bRTL)
    2277             :         {
    2278           0 :             long nActBorder = pBorders[GetActLeftColumn( sal_True )].nPos;
    2279           0 :             long nRightMargin = pIndents[INDENT_RIGHT_MARGIN].nPos;
    2280           0 :             long nConvert = ConvertHPosLogic( nRightMargin - nActBorder );
    2281           0 :             pParaItem->SetRight( PixelHAdjust( nConvert - lAppNullOffset, pParaItem->GetRight() ) );
    2282             :         }
    2283             :         else
    2284             :         {
    2285             :             pParaItem->SetRight(
    2286             :                 PixelHAdjust(
    2287             :                     ConvertHPosLogic(
    2288           0 :                         pBorders[GetActRightColumn( sal_True )].nPos -
    2289           0 :                         pIndents[INDENT_RIGHT_MARGIN].nPos) -
    2290             :                     lAppNullOffset,
    2291           0 :                     pParaItem->GetRight()));
    2292             :         }
    2293             : 
    2294             :     }
    2295             :     else
    2296             :     {
    2297           0 :         if(bRTL)
    2298             :         {
    2299             :             pParaItem->SetRight( PixelHAdjust(
    2300           0 :                 ConvertHPosLogic(GetMargin1() +
    2301           0 :                              pIndents[INDENT_RIGHT_MARGIN].nPos) - GetLeftFrameMargin() +
    2302           0 :                              (pParaBorderItem ? pParaBorderItem->GetLeft() : 0) -
    2303           0 :                 lAppNullOffset, pParaItem->GetRight()));
    2304             :         }
    2305             :         else
    2306             :         {
    2307             :             pParaItem->SetRight( PixelHAdjust(
    2308           0 :                 ConvertHPosLogic(GetMargin2() -
    2309           0 :                              pIndents[INDENT_RIGHT_MARGIN].nPos) -
    2310           0 :                 lAppNullOffset, pParaItem->GetRight()));
    2311             :         }
    2312             :     }
    2313           0 :     sal_uInt16 nParaId  = bHorz ? SID_ATTR_PARA_LRSPACE : SID_ATTR_PARA_LRSPACE_VERTICAL;
    2314           0 :     pBindings->GetDispatcher()->Execute( nParaId, SFX_CALLMODE_RECORD, pParaItem, 0L );
    2315           0 :     UpdateTabs();
    2316           0 : }
    2317             : 
    2318             : 
    2319           0 : void SvxRuler::ApplyTabs()
    2320             : 
    2321             : /* [Description]
    2322             : 
    2323             :    Apply tab settings, changed by dragging.
    2324             : */
    2325             : {
    2326           0 :     sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
    2327           0 :     const sal_uInt16 nCoreIdx = GetDragAryPos();
    2328           0 :     if(IsDragDelete())
    2329             :     {
    2330           0 :         pTabStopItem->Remove(nCoreIdx);
    2331             :     }
    2332           0 :     else if(DRAG_OBJECT_SIZE_LINEAR & nDragType ||
    2333             :             DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType)
    2334             :     {
    2335           0 :         SvxTabStopItem *pItem = new SvxTabStopItem(pTabStopItem->Which());
    2336             :         //remove default tab stops
    2337           0 :         for ( sal_uInt16 i = 0; i < pItem->Count(); )
    2338             :         {
    2339           0 :             if ( SVX_TAB_ADJUST_DEFAULT == (*pItem)[i].GetAdjustment() )
    2340             :             {
    2341           0 :                 pItem->Remove(i);
    2342           0 :                 continue;
    2343             :             }
    2344           0 :             ++i;
    2345             :         }
    2346             : 
    2347             :         sal_uInt16 j;
    2348           0 :         for(j = 0; j < nCoreIdx; ++j)
    2349             :         {
    2350           0 :             pItem->Insert((*pTabStopItem)[j]);
    2351             :         }
    2352           0 :         for(; j < pTabStopItem->Count(); ++j)
    2353             :         {
    2354           0 :             SvxTabStop aTabStop = (*pTabStopItem)[j];
    2355           0 :             aTabStop.GetTabPos() = PixelHAdjust(
    2356           0 :                 ConvertHPosLogic(pTabs[j+TAB_GAP].nPos -
    2357           0 :                                  GetLeftIndent()) -
    2358             :                 lAppNullOffset,
    2359           0 :                 aTabStop.GetTabPos());
    2360           0 :             pItem->Insert(aTabStop);
    2361             :         }
    2362           0 :         delete pTabStopItem;
    2363           0 :         pTabStopItem = pItem;
    2364             :     }
    2365           0 :     else if( pTabStopItem->Count() == 0 )
    2366           0 :         return;
    2367             :     else
    2368             :     {
    2369           0 :         SvxTabStop aTabStop = (*pTabStopItem)[nCoreIdx];
    2370           0 :         if(pRuler_Imp->lMaxRightLogic!=-1&&
    2371           0 :            pTabs[nCoreIdx+TAB_GAP].nPos+Ruler::GetNullOffset()==nMaxRight)
    2372           0 :             aTabStop.GetTabPos() = pRuler_Imp->lMaxRightLogic-lLogicNullOffset;
    2373             :         else
    2374             :         {
    2375           0 :             if(bRTL)
    2376             :             {
    2377             :                 //#i24363# tab stops relative to indent
    2378             :                 const long nTmpLeftIndent = pRuler_Imp->bIsTabsRelativeToIndent ?
    2379             :                                             GetLeftIndent() :
    2380           0 :                                             ConvertHPosPixel( GetRightFrameMargin() + lAppNullOffset );
    2381             : 
    2382           0 :                 aTabStop.GetTabPos() = PixelHAdjust(
    2383           0 :                     ConvertHPosLogic( nTmpLeftIndent - pTabs[nCoreIdx+TAB_GAP].nPos) - lAppNullOffset,
    2384           0 :                                                                                         aTabStop.GetTabPos());
    2385             :             }
    2386             :             else
    2387             :             {
    2388             :                 //#i24363# tab stops relative to indent
    2389             :                 const long nTmpLeftIndent = pRuler_Imp->bIsTabsRelativeToIndent ?
    2390             :                                             GetLeftIndent() :
    2391           0 :                                             0;
    2392             : 
    2393           0 :                 aTabStop.GetTabPos() = PixelHAdjust(
    2394           0 :                     ConvertHPosLogic( pTabs[nCoreIdx+TAB_GAP].nPos - nTmpLeftIndent ) - lAppNullOffset,
    2395           0 :                                                                                          aTabStop.GetTabPos() );
    2396             :             }
    2397             :         }
    2398           0 :         pTabStopItem->Remove(nCoreIdx);
    2399           0 :         pTabStopItem->Insert(aTabStop);
    2400             :     }
    2401           0 :     sal_uInt16 nTabStopId = bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL;
    2402           0 :     pBindings->GetDispatcher()->Execute( nTabStopId, SFX_CALLMODE_RECORD, pTabStopItem, 0L );
    2403           0 :     UpdateTabs();
    2404             : }
    2405             : 
    2406             : 
    2407           0 : void SvxRuler::ApplyBorders()
    2408             : 
    2409             : /* [Description]
    2410             : 
    2411             :    Applying (table) column settings; changed by dragging.
    2412             : */
    2413             : {
    2414           0 :     if(pColumnItem->IsTable())
    2415             :     {
    2416           0 :         long l = GetFrameLeft();
    2417           0 :         if(l != pRuler_Imp->nColLeftPix)
    2418             :             pColumnItem->SetLeft( PixelHAdjust(
    2419           0 :                 ConvertHPosLogic(l) - lAppNullOffset, pColumnItem->GetLeft()));
    2420           0 :         l = GetMargin2();
    2421           0 :         if(l != pRuler_Imp->nColRightPix)
    2422             :         {
    2423           0 :             long nWidthOrHeight = bHorz ? pPagePosItem->GetWidth() : pPagePosItem->GetHeight();
    2424             :             pColumnItem->SetRight( PixelHAdjust( nWidthOrHeight -
    2425           0 :                     pColumnItem->GetLeft() - ConvertHPosLogic(l) -
    2426           0 :                     lAppNullOffset, pColumnItem->GetRight() ) );
    2427             :         }
    2428             :     }
    2429           0 :     for(sal_uInt16 i = 0; i < pColumnItem->Count()-1; ++i)
    2430             :     {
    2431           0 :         long& nEnd = (*pColumnItem)[i].nEnd;
    2432           0 :         nEnd = PIXEL_H_ADJUST(
    2433             :             ConvertPosLogic(pBorders[i].nPos),
    2434           0 :             (*pColumnItem)[i].nEnd);
    2435           0 :         long& nStart = (*pColumnItem)[i+1].nStart;
    2436           0 :         nStart = PIXEL_H_ADJUST(
    2437             :             ConvertSizeLogic(pBorders[i].nPos +
    2438             :                              pBorders[i].nWidth) -
    2439             :             lAppNullOffset,
    2440           0 :             (*pColumnItem)[i+1].nStart);
    2441             :         // It may be that, due to the PIXEL_H_ADJUST readjustment to old values,
    2442             :         // the width becomes  < 0. This we readjust.
    2443           0 :         if( nEnd > nStart )
    2444           0 :             nStart = nEnd;
    2445             :     }
    2446             : #ifdef DEBUGLIN
    2447             :         Debug_Impl(pEditWin,*pColumnItem);
    2448             : #endif // DEBUGLIN
    2449             :     SfxBoolItem aFlag(SID_RULER_ACT_LINE_ONLY,
    2450           0 :                       nDragType & DRAG_OBJECT_ACTLINE_ONLY? sal_True : sal_False);
    2451             :     sal_uInt16 nColId = pRuler_Imp->bIsTableRows ? (bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL) :
    2452           0 :                             (bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL);
    2453           0 :     pBindings->GetDispatcher()->Execute( nColId, SFX_CALLMODE_RECORD, pColumnItem, &aFlag, 0L );
    2454           0 : }
    2455             : 
    2456           0 : void SvxRuler::ApplyObject()
    2457             : 
    2458             : /* [Description]
    2459             : 
    2460             :    Applying object settings, changed by dragging.
    2461             : */
    2462             : {
    2463             :     // to the page margin
    2464           0 :     long nMargin = pLRSpaceItem? pLRSpaceItem->GetLeft(): 0;
    2465             :     pObjectItem->SetStartX(
    2466             :                            PixelAdjust(
    2467           0 :                               ConvertPosLogic(pObjectBorders[0].nPos)
    2468           0 :                               + nMargin - lAppNullOffset,pObjectItem->GetStartX()));
    2469             :     pObjectItem->SetEndX(
    2470             :                          PixelAdjust(
    2471           0 :                              ConvertPosLogic(pObjectBorders[1].nPos)
    2472           0 :                          + nMargin -  lAppNullOffset,pObjectItem->GetEndX()));
    2473           0 :     nMargin = pULSpaceItem? pULSpaceItem->GetUpper(): 0;
    2474             :     pObjectItem->SetStartY(
    2475             :                          PixelAdjust(
    2476           0 :                              ConvertPosLogic(pObjectBorders[2].nPos)
    2477           0 :                            + nMargin - lAppNullOffset,pObjectItem->GetStartY()));
    2478             :     pObjectItem->SetEndY(
    2479             :                      PixelAdjust(
    2480           0 :                          ConvertPosLogic(pObjectBorders[3].nPos)
    2481           0 :                          + nMargin - lAppNullOffset,pObjectItem->GetEndY()));
    2482           0 :     pBindings->GetDispatcher()->Execute( SID_RULER_OBJECT, SFX_CALLMODE_RECORD, pObjectItem, 0L );
    2483           0 : }
    2484             : 
    2485           0 : void SvxRuler::PrepareProportional_Impl(RulerType eType)
    2486             : 
    2487             : /* [Description]
    2488             : 
    2489             :    Preparation proportional dragging, and it is calculated based on the
    2490             :    proportional share of the total width in parts per thousand.
    2491             : */
    2492             : {
    2493           0 :     pRuler_Imp->nTotalDist = GetMargin2();
    2494           0 :     switch((int)eType)
    2495             :     {
    2496             :       case RULER_TYPE_MARGIN2:
    2497             :       case RULER_TYPE_MARGIN1:
    2498             :       case RULER_TYPE_BORDER:
    2499             :         {
    2500             :             DBG_ASSERT(pColumnItem, "no ColumnItem");
    2501             : 
    2502           0 :             pRuler_Imp->SetPercSize(pColumnItem->Count());
    2503             : 
    2504             :             long lPos;
    2505           0 :             long lWidth=0;
    2506             :             sal_uInt16 nStart;
    2507           0 :             sal_uInt16 nIdx=GetDragAryPos();
    2508           0 :             long lActWidth=0;
    2509             :             long lActBorderSum;
    2510             :             long lOrigLPos;
    2511             : 
    2512           0 :             if(eType != RULER_TYPE_BORDER)
    2513             :             {
    2514           0 :                 lOrigLPos = GetMargin1();
    2515           0 :                 nStart = 0;
    2516           0 :                 lActBorderSum = 0;
    2517             :             }
    2518             :             else
    2519             :             {
    2520           0 :                 if(pRuler_Imp->bIsTableRows &&!bHorz)
    2521             :                 {
    2522           0 :                     lOrigLPos = GetMargin1();
    2523           0 :                     nStart = 0;
    2524             :                 }
    2525             :                 else
    2526             :                 {
    2527           0 :                     lOrigLPos = pBorders[nIdx].nPos + pBorders[nIdx].nWidth;
    2528           0 :                     nStart = 1;
    2529             :                 }
    2530           0 :                 lActBorderSum = pBorders[nIdx].nWidth;
    2531             :             }
    2532             : 
    2533             :             //in horizontal mode the percentage value has to be
    2534             :             //calculated on a "current change" position base
    2535             :             //because the height of the table changes while dragging
    2536           0 :             if(pRuler_Imp->bIsTableRows && RULER_TYPE_BORDER == eType)
    2537             :             {
    2538             :                 sal_uInt16 nStartBorder;
    2539             :                 sal_uInt16 nEndBorder;
    2540           0 :                 if(bHorz)
    2541             :                 {
    2542           0 :                     nStartBorder = nIdx + 1;
    2543           0 :                     nEndBorder = pColumnItem->Count() - 1;
    2544             :                 }
    2545             :                 else
    2546             :                 {
    2547           0 :                     nStartBorder = 0;
    2548           0 :                     nEndBorder = nIdx;
    2549             :                 }
    2550             : 
    2551           0 :                 lWidth = pBorders[nIdx].nPos;
    2552           0 :                 if(bHorz)
    2553           0 :                     lWidth = GetMargin2() - lWidth;
    2554           0 :                 pRuler_Imp->nTotalDist = lWidth;
    2555           0 :                 lPos = lOrigLPos = pBorders[nIdx].nPos;
    2556             : 
    2557           0 :                 for(sal_uInt16 i = nStartBorder; i < nEndBorder; ++i)
    2558             :                 {
    2559           0 :                     if(bHorz)
    2560             :                     {
    2561           0 :                         lActWidth += pBorders[i].nPos - lPos;
    2562           0 :                         lPos = pBorders[i].nPos + pBorders[i].nWidth;
    2563             :                     }
    2564             :                     else
    2565           0 :                         lActWidth = pBorders[i].nPos;
    2566           0 :                     pRuler_Imp->pPercBuf[i] = (sal_uInt16)((lActWidth * 1000)
    2567           0 :                                                     / pRuler_Imp->nTotalDist);
    2568           0 :                     pRuler_Imp->pBlockBuf[i] = (sal_uInt16)lActBorderSum;
    2569           0 :                     lActBorderSum += pBorders[i].nWidth;
    2570           0 :                 }
    2571             :             }
    2572             :             else
    2573             :             {
    2574           0 :                 lPos = lOrigLPos;
    2575           0 :                 for(sal_uInt16 ii = nStart; ii < pColumnItem->Count() - 1; ++ii)
    2576             :                 {
    2577           0 :                     lWidth += pBorders[ii].nPos - lPos;
    2578           0 :                     lPos = pBorders[ii].nPos + pBorders[ii].nWidth;
    2579             :                 }
    2580             : 
    2581           0 :                 lWidth += GetMargin2() - lPos;
    2582           0 :                 pRuler_Imp->nTotalDist = lWidth;
    2583           0 :                 lPos = lOrigLPos;
    2584             : 
    2585           0 :                 for(sal_uInt16 i = nStart; i < pColumnItem->Count() - 1; ++i)
    2586             :                 {
    2587           0 :                     lActWidth += pBorders[i].nPos - lPos;
    2588           0 :                     lPos = pBorders[i].nPos + pBorders[i].nWidth;
    2589           0 :                     pRuler_Imp->pPercBuf[i] = (sal_uInt16)((lActWidth * 1000)
    2590           0 :                                                     / pRuler_Imp->nTotalDist);
    2591           0 :                     pRuler_Imp->pBlockBuf[i] = (sal_uInt16)lActBorderSum;
    2592           0 :                     lActBorderSum += pBorders[i].nWidth;
    2593             :                 }
    2594             :             }
    2595             :         }
    2596           0 :         break;
    2597             :         case RULER_TYPE_TAB:
    2598             :         {
    2599           0 :             const sal_uInt16 nIdx = GetDragAryPos()+TAB_GAP;
    2600           0 :             pRuler_Imp->nTotalDist -= pTabs[nIdx].nPos;
    2601           0 :             pRuler_Imp->SetPercSize(nTabCount);
    2602           0 :             for(sal_uInt16 n=0;n<=nIdx;pRuler_Imp->pPercBuf[n++]=0) ;
    2603           0 :             for(sal_uInt16 i = nIdx+1; i < nTabCount; ++i)
    2604             :             {
    2605           0 :                 const long nDelta = pTabs[i].nPos - pTabs[nIdx].nPos;
    2606           0 :                 pRuler_Imp->pPercBuf[i] = (sal_uInt16)((nDelta * 1000) / pRuler_Imp->nTotalDist);
    2607             :             }
    2608           0 :             break;
    2609             :         }
    2610             :     }
    2611           0 : }
    2612             : 
    2613             : 
    2614           0 : void SvxRuler::EvalModifier()
    2615             : 
    2616             : /* [Description]
    2617             : 
    2618             :    Eval Drag Modifier
    2619             : 
    2620             :    Shift: move linear
    2621             :    Control: move proportional
    2622             :    Shift+Control: Table: only current line
    2623             :    Alt: dimension arrows (not implemented) //!!
    2624             : 
    2625             : */
    2626             : 
    2627             : {
    2628           0 :     sal_uInt16 nModifier = GetDragModifier();
    2629           0 :     if(pRuler_Imp->bIsTableRows)
    2630             :     {
    2631             :         //rows can only be moved in one way, additionally current column is possible
    2632           0 :         if(nModifier == KEY_SHIFT)
    2633           0 :             nModifier = 0;
    2634             :     }
    2635           0 :     switch(nModifier)
    2636             :     {
    2637             :      case KEY_SHIFT:
    2638           0 :         nDragType = DRAG_OBJECT_SIZE_LINEAR;
    2639           0 :         break;
    2640             :      case KEY_MOD1:  {
    2641           0 :          const RulerType eType = GetDragType();
    2642           0 :          nDragType = DRAG_OBJECT_SIZE_PROPORTIONAL;
    2643           0 :          if( RULER_TYPE_TAB == eType ||
    2644             :              ( ( RULER_TYPE_BORDER == eType || RULER_TYPE_MARGIN1 == eType ||
    2645             :                  RULER_TYPE_MARGIN2 == eType ) &&
    2646             :                pColumnItem ) )
    2647           0 :              PrepareProportional_Impl(eType);
    2648           0 :          break;
    2649             :      }
    2650             :      case KEY_MOD1 | KEY_SHIFT:
    2651           0 :         if(GetDragType()!=RULER_TYPE_MARGIN1&&
    2652           0 :            GetDragType()!=RULER_TYPE_MARGIN2)
    2653           0 :             nDragType = DRAG_OBJECT_ACTLINE_ONLY;
    2654           0 :         break;
    2655             :         // ALT: Dimension arrows
    2656             :     }
    2657           0 : }
    2658             : 
    2659             : 
    2660           0 : void SvxRuler::Click()
    2661             : 
    2662             : /* [Description]
    2663             : 
    2664             :    Overloaded handler SV; sets Tab per dispatcher call
    2665             : */
    2666             : 
    2667             : {
    2668           0 :     Ruler::Click();
    2669           0 :     if( bActive )
    2670             :     {
    2671           0 :         pBindings->Update( SID_RULER_LR_MIN_MAX );
    2672           0 :         pBindings->Update( SID_ATTR_LONG_ULSPACE );
    2673           0 :         pBindings->Update( SID_ATTR_LONG_LRSPACE );
    2674           0 :         pBindings->Update( SID_RULER_PAGE_POS );
    2675           0 :         pBindings->Update( bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL);
    2676           0 :         pBindings->Update( bHorz ? SID_ATTR_PARA_LRSPACE : SID_ATTR_PARA_LRSPACE_VERTICAL);
    2677           0 :         pBindings->Update( bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL);
    2678           0 :         pBindings->Update( bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL);
    2679           0 :         pBindings->Update( SID_RULER_OBJECT );
    2680           0 :         pBindings->Update( SID_RULER_PROTECT );
    2681           0 :         pBindings->Update( SID_ATTR_PARA_LRSPACE_VERTICAL );
    2682             :     }
    2683           0 :     sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
    2684           0 :     if(pTabStopItem &&
    2685             :        (nFlags & SVXRULER_SUPPORT_TABS) == SVXRULER_SUPPORT_TABS)
    2686             :     {
    2687           0 :         sal_Bool bContentProtected = pRuler_Imp->aProtectItem.IsCntntProtected();
    2688           0 :         if( bContentProtected ) return;
    2689           0 :         const long lPos = GetClickPos();
    2690           0 :         if((bRTL && lPos < Min(GetFirstLineIndent(), GetLeftIndent()) && lPos > GetRightIndent()) ||
    2691           0 :             (!bRTL && lPos > Min(GetFirstLineIndent(), GetLeftIndent()) && lPos < GetRightIndent()))
    2692             :         {
    2693             :             //convert position in left-to-right text
    2694             :             long nTabPos;
    2695             :     //#i24363# tab stops relative to indent
    2696           0 :             if(bRTL)
    2697             :                 nTabPos = ( pRuler_Imp->bIsTabsRelativeToIndent ?
    2698             :                             GetLeftIndent() :
    2699           0 :                             ConvertHPosPixel( GetRightFrameMargin() + lAppNullOffset ) ) -
    2700           0 :                           lPos;
    2701             :             else
    2702             :                 nTabPos = lPos -
    2703             :                           ( pRuler_Imp->bIsTabsRelativeToIndent ?
    2704             :                             GetLeftIndent() :
    2705           0 :                             0 );
    2706             : 
    2707             :             SvxTabStop aTabStop(ConvertHPosLogic(nTabPos),
    2708           0 :                                 ToAttrTab_Impl(nDefTabType));
    2709           0 :             pTabStopItem->Insert(aTabStop);
    2710           0 :             UpdateTabs();
    2711             :         }
    2712             :     }
    2713             : }
    2714             : 
    2715             : 
    2716           0 : sal_Bool SvxRuler::CalcLimits
    2717             : (
    2718             :  long &nMax1,                                   // minimum value to be set
    2719             :  long &nMax2,                                   // minimum value to be set
    2720             :  sal_Bool
    2721             : ) const
    2722             : 
    2723             : /* [Description]
    2724             : 
    2725             :    Default implementation of the virtual function; the application can be
    2726             :    overloaded to implement customized limits. The values are based on the page.
    2727             : */
    2728             : {
    2729           0 :     nMax1 = LONG_MIN;
    2730           0 :     nMax2 = LONG_MAX;
    2731           0 :     return sal_False;
    2732             : }
    2733             : 
    2734             : 
    2735           0 : void SvxRuler::CalcMinMax()
    2736             : 
    2737             : /* [Description]
    2738             : 
    2739             :    Calculates the limits for dragging; which are in pixels relative to the
    2740             :    page edge
    2741             : */
    2742             : 
    2743             : {
    2744           0 :     sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
    2745           0 :     const long lNullPix = ConvertPosPixel(lLogicNullOffset);
    2746           0 :     pRuler_Imp->lMaxLeftLogic=pRuler_Imp->lMaxRightLogic=-1;
    2747           0 :     switch(GetDragType())
    2748             :     {
    2749             :       case RULER_TYPE_MARGIN1:
    2750             :         {        // left edge of the surrounding Frame
    2751             :             // DragPos - NOf between left - right
    2752           0 :             pRuler_Imp->lMaxLeftLogic = GetLeftMin();
    2753           0 :             nMaxLeft=ConvertSizePixel(pRuler_Imp->lMaxLeftLogic);
    2754             : 
    2755           0 :             if(!pColumnItem || pColumnItem->Count() == 1 )
    2756             :             {
    2757           0 :                 if(bRTL)
    2758             :                 {
    2759           0 :                     nMaxRight = lNullPix - GetRightIndent() +
    2760           0 :                         Max(GetFirstLineIndent(), GetLeftIndent()) -
    2761           0 :                         lMinFrame;
    2762             :                 }
    2763             :                 else
    2764             :                 {
    2765           0 :                     nMaxRight = lNullPix + GetRightIndent() -
    2766           0 :                         Max(GetFirstLineIndent(), GetLeftIndent()) -
    2767           0 :                         lMinFrame;
    2768             :                 }
    2769             :             }
    2770           0 :             else if(pRuler_Imp->bIsTableRows)
    2771             :             {
    2772             :                 //top border is not moveable when table rows are displayed
    2773             :                 // protection of content means the margin is not moveable
    2774             :                 // - it's just a page break inside of a cell
    2775           0 :                 if(bHorz && !pRuler_Imp->aProtectItem.IsCntntProtected())
    2776             :                 {
    2777           0 :                     nMaxLeft = pBorders[0].nMinPos + lNullPix;
    2778           0 :                     if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
    2779           0 :                         nMaxRight = GetRightIndent() + lNullPix -
    2780           0 :                                 (pColumnItem->Count() - 1 ) * lMinFrame;
    2781             :                     else
    2782           0 :                         nMaxRight = pBorders[0].nPos - lMinFrame + lNullPix;
    2783             :                 }
    2784             :                 else
    2785           0 :                     nMaxLeft = nMaxRight = lNullPix;
    2786             :             }
    2787             :             else
    2788             :             {
    2789           0 :                 if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
    2790             :                 {
    2791           0 :                     nMaxRight=lNullPix+CalcPropMaxRight();
    2792             :                 }
    2793           0 :                 else if(nDragType & DRAG_OBJECT_SIZE_LINEAR)
    2794             :                 {
    2795             :                     nMaxRight = ConvertPosPixel(
    2796           0 :                         GetPageWidth() - (
    2797           0 :                             (pColumnItem->IsTable() && pLRSpaceItem)
    2798           0 :                             ? pLRSpaceItem->GetRight() : 0))
    2799           0 :                             - GetMargin2() + GetMargin1();
    2800             :                 }
    2801             :                 else
    2802             :                 {
    2803           0 :                     nMaxRight = lNullPix - lMinFrame;
    2804           0 :                     if(pColumnItem->IsFirstAct())
    2805             :                     {
    2806           0 :                         if(bRTL)
    2807             :                         {
    2808             :                             nMaxRight += Min(
    2809           0 :                                 pBorders[0].nPos,
    2810           0 :                                 Max(GetFirstLineIndent(), GetLeftIndent()) - GetRightIndent());
    2811             :                         }
    2812             :                         else
    2813             :                         {
    2814             :                             nMaxRight += Min(
    2815           0 :                                 pBorders[0].nPos, GetRightIndent() -
    2816           0 :                                 Max(GetFirstLineIndent(), GetLeftIndent()));
    2817             :                         }
    2818             :                     }
    2819           0 :                     else if( pColumnItem->Count() > 1 )
    2820           0 :                         nMaxRight += pBorders[0].nPos;
    2821             :                     else
    2822           0 :                         nMaxRight +=GetRightIndent() -
    2823           0 :                             Max(GetFirstLineIndent(), GetLeftIndent());
    2824             :                     // Do not drag the left table edge over the edge of the page
    2825           0 :                     if(pLRSpaceItem&&pColumnItem->IsTable())
    2826             :                     {
    2827           0 :                         long nTmp=ConvertSizePixel(pLRSpaceItem->GetLeft());
    2828           0 :                         if(nTmp>nMaxLeft)
    2829           0 :                             nMaxLeft=nTmp;
    2830             :                     }
    2831             :                 }
    2832             :             }
    2833           0 :             break;
    2834             :         }
    2835             :       case RULER_TYPE_MARGIN2:
    2836             :      {        // right edge of the surrounding Frame
    2837             :         pRuler_Imp->lMaxRightLogic =
    2838             :             pMinMaxItem ?
    2839           0 :                 GetPageWidth() - GetRightMax() : GetPageWidth();
    2840           0 :         nMaxRight = ConvertSizePixel(pRuler_Imp->lMaxRightLogic);
    2841             : 
    2842             : 
    2843           0 :         if(!pColumnItem)
    2844             :         {
    2845           0 :             if(bRTL)
    2846             :             {
    2847           0 :                 nMaxLeft =  GetMargin2() + GetRightIndent() -
    2848           0 :                     Max(GetFirstLineIndent(),GetLeftIndent())  - GetMargin1()+
    2849           0 :                         lMinFrame + lNullPix;
    2850             :             }
    2851             :             else
    2852             :             {
    2853           0 :                 nMaxLeft =  GetMargin2() - GetRightIndent() +
    2854           0 :                     Max(GetFirstLineIndent(),GetLeftIndent())  - GetMargin1()+
    2855           0 :                         lMinFrame + lNullPix;
    2856             :             }
    2857             :         }
    2858           0 :         else if(pRuler_Imp->bIsTableRows)
    2859             :         {
    2860             :             // get the bottom move range from the last border position - only available for rows!
    2861             :             // protection of content means the margin is not moveable - it's just a page break inside of a cell
    2862           0 :             if(bHorz || pRuler_Imp->aProtectItem.IsCntntProtected())
    2863             :             {
    2864           0 :                 nMaxLeft = nMaxRight = pBorders[pColumnItem->Count() - 1].nMaxPos + lNullPix;
    2865             :             }
    2866             :             else
    2867             :             {
    2868           0 :                 if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
    2869             :                 {
    2870           0 :                     nMaxLeft = (pColumnItem->Count()) * lMinFrame + lNullPix;
    2871             :                 }
    2872             :                 else
    2873             :                 {
    2874           0 :                     if(pColumnItem->Count() > 1)
    2875           0 :                         nMaxLeft = pBorders[pColumnItem->Count() - 2].nPos + lMinFrame + lNullPix;
    2876             :                     else
    2877           0 :                         nMaxLeft = lMinFrame + lNullPix;
    2878             :                 }
    2879           0 :                 if(pColumnItem->Count() > 1)
    2880           0 :                     nMaxRight = pBorders[pColumnItem->Count() - 2].nMaxPos + lNullPix;
    2881             :                 else
    2882           0 :                     nMaxRight -= GetRightIndent() - lNullPix;
    2883             :             }
    2884             :         }
    2885             :         else
    2886             :         {
    2887           0 :             nMaxLeft = lMinFrame + lNullPix;
    2888           0 :             if(IsActLastColumn() || pColumnItem->Count() < 2 ) //If last active column
    2889             :             {
    2890           0 :                 if(bRTL)
    2891             :                 {
    2892           0 :                     nMaxLeft = lMinFrame + lNullPix + GetMargin2() +
    2893           0 :                         GetRightIndent() - Max(GetFirstLineIndent(),
    2894           0 :                                                GetLeftIndent());
    2895             :                 }
    2896             :                 else
    2897             :                 {
    2898           0 :                     nMaxLeft = lMinFrame + lNullPix + GetMargin2() -
    2899           0 :                         GetRightIndent() + Max(GetFirstLineIndent(),
    2900           0 :                                                GetLeftIndent());
    2901             :                 }
    2902             :             }
    2903           0 :             if( pColumnItem->Count() >= 2 )
    2904             :             {
    2905             :                 long nNewMaxLeft =
    2906             :                     lMinFrame + lNullPix +
    2907           0 :                     pBorders[pColumnItem->Count()-2].nPos +
    2908           0 :                     pBorders[pColumnItem->Count()-2].nWidth;
    2909           0 :                 nMaxLeft=Max(nMaxLeft,nNewMaxLeft);
    2910             :             }
    2911             : 
    2912             :         }
    2913           0 :         break;
    2914             :     }
    2915             :     case RULER_TYPE_BORDER:
    2916             :     {                // Table, column (Modifier)
    2917           0 :         const sal_uInt16 nIdx = GetDragAryPos();
    2918           0 :         switch(GetDragSize())
    2919             :         {
    2920             :           case RULER_DRAGSIZE_1 :
    2921             :             {
    2922           0 :                 nMaxRight = pBorders[nIdx].nPos +
    2923           0 :                     pBorders[nIdx].nWidth + lNullPix;
    2924             : 
    2925           0 :                 if(0 == nIdx)
    2926           0 :                     nMaxLeft = lNullPix;
    2927             :                 else
    2928           0 :                     nMaxLeft = pBorders[nIdx-1].nPos +
    2929           0 :                         pBorders[nIdx-1].nWidth + lNullPix;
    2930           0 :                 if(nIdx == pColumnItem->GetActColumn())
    2931             :                 {
    2932           0 :                     if(bRTL)
    2933             :                     {
    2934           0 :                         nMaxLeft += pBorders[nIdx].nPos +
    2935           0 :                             GetRightIndent() - Max(GetFirstLineIndent(),
    2936           0 :                                                    GetLeftIndent());
    2937             :                     }
    2938             :                     else
    2939             :                     {
    2940           0 :                         nMaxLeft += pBorders[nIdx].nPos -
    2941           0 :                             GetRightIndent() + Max(GetFirstLineIndent(),
    2942           0 :                                                    GetLeftIndent());
    2943             :                     }
    2944           0 :                     if(0 != nIdx)
    2945           0 :                         nMaxLeft -= pBorders[nIdx-1].nPos +
    2946           0 :                             pBorders[nIdx-1].nWidth;
    2947             :                 }
    2948           0 :                 nMaxLeft += lMinFrame;
    2949           0 :                 nMaxLeft += nDragOffset;
    2950           0 :                 break;
    2951             :             }
    2952             :           case RULER_DRAGSIZE_MOVE:
    2953             :             {
    2954           0 :                 if(pColumnItem)
    2955             :                 {
    2956             :                     //nIdx contains the position of the currently moved item
    2957             :                     //next visible separator on the left
    2958           0 :                     sal_uInt16 nLeftCol=GetActLeftColumn(sal_False, nIdx);
    2959             :                     //next visible separator on the right
    2960           0 :                     sal_uInt16 nRightCol=GetActRightColumn(sal_False, nIdx);
    2961             :                     //next separator on the left - regardless if visible or not
    2962           0 :                     sal_uInt16 nActLeftCol=GetActLeftColumn();
    2963             :                     //next separator on the right - regardless if visible or not
    2964           0 :                     sal_uInt16 nActRightCol=GetActRightColumn();
    2965           0 :                     if(pColumnItem->IsTable())
    2966             :                     {
    2967           0 :                         if(nDragType & DRAG_OBJECT_ACTLINE_ONLY)
    2968             :                         {
    2969             :                             //the current row/column should be modified only
    2970             :                             //then the next/previous visible border position
    2971             :                             //marks the min/max positions
    2972             :                             nMaxLeft = nLeftCol == USHRT_MAX ?
    2973             :                                 0 :
    2974           0 :                                 pBorders[nLeftCol].nPos;
    2975             :                             //rows can always be increased without a limit
    2976           0 :                             if(pRuler_Imp->bIsTableRows)
    2977           0 :                                 nMaxRight = pBorders[nIdx].nMaxPos;
    2978             :                             else
    2979             :                                 nMaxRight = nRightCol == USHRT_MAX ?
    2980           0 :                                     GetMargin2():
    2981           0 :                                     pBorders[nRightCol].nPos;
    2982           0 :                             nMaxLeft += lNullPix;
    2983           0 :                             nMaxRight += lNullPix;
    2984             :                         }
    2985             :                         else
    2986             :                         {
    2987           0 :                             if(DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType && !bHorz && pRuler_Imp->bIsTableRows)
    2988           0 :                                 nMaxLeft = (nIdx + 1) * lMinFrame + lNullPix;
    2989             :                             else
    2990           0 :                                 nMaxLeft = pBorders[nIdx].nMinPos + lNullPix;
    2991           0 :                             if(DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType||
    2992             :                             (DRAG_OBJECT_SIZE_LINEAR & nDragType) )
    2993             :                             {
    2994           0 :                                 if(pRuler_Imp->bIsTableRows)
    2995             :                                 {
    2996           0 :                                     if(bHorz)
    2997           0 :                                         nMaxRight = GetRightIndent() + lNullPix -
    2998           0 :                                                 (pColumnItem->Count() - nIdx - 1) * lMinFrame;
    2999             :                                     else
    3000           0 :                                         nMaxRight = pBorders[nIdx].nMaxPos + lNullPix;
    3001             :                                 }
    3002             :                                 else
    3003           0 :                                     nMaxRight=lNullPix+CalcPropMaxRight(nIdx);
    3004             :                             }
    3005             :                             else
    3006           0 :                                 nMaxRight = pBorders[nIdx].nMaxPos + lNullPix;
    3007             :                         }
    3008           0 :                         nMaxLeft += lMinFrame;
    3009           0 :                         nMaxRight -= lMinFrame;
    3010             : 
    3011             :                     }
    3012             :                     else
    3013             :                     {
    3014           0 :                         if(nLeftCol==USHRT_MAX)
    3015           0 :                             nMaxLeft=lNullPix;
    3016             :                         else
    3017           0 :                             nMaxLeft = pBorders[nLeftCol].nPos +
    3018           0 :                                 pBorders[nLeftCol].nWidth + lNullPix;
    3019             : 
    3020           0 :                         if(nActRightCol == nIdx)
    3021             :                         {
    3022           0 :                             if(bRTL)
    3023             :                             {
    3024           0 :                                 nMaxLeft += pBorders[nIdx].nPos +
    3025           0 :                                     GetRightIndent() - Max(GetFirstLineIndent(),
    3026           0 :                                                            GetLeftIndent());
    3027           0 :                                 if(nActLeftCol!=USHRT_MAX)
    3028           0 :                                     nMaxLeft -= pBorders[nActLeftCol].nPos +
    3029           0 :                                         pBorders[nActLeftCol].nWidth;
    3030             :                             }
    3031             :                             else
    3032             :                             {
    3033           0 :                                 nMaxLeft += pBorders[nIdx].nPos -
    3034           0 :                                     GetRightIndent() + Max(GetFirstLineIndent(),
    3035           0 :                                                            GetLeftIndent());
    3036           0 :                                 if(nActLeftCol!=USHRT_MAX)
    3037           0 :                                     nMaxLeft -= pBorders[nActLeftCol].nPos +
    3038           0 :                                         pBorders[nActLeftCol].nWidth;
    3039             :                             }
    3040             :                         }
    3041           0 :                         nMaxLeft += lMinFrame;
    3042           0 :                         nMaxLeft += nDragOffset;
    3043             : 
    3044             :                         // nMaxRight
    3045             :                         // linear / proprotional move
    3046           0 :                         if(DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType||
    3047             :                            (DRAG_OBJECT_SIZE_LINEAR & nDragType) )
    3048             :                         {
    3049           0 :                             nMaxRight=lNullPix+CalcPropMaxRight(nIdx);
    3050             :                         }
    3051           0 :                         else if(DRAG_OBJECT_SIZE_LINEAR & nDragType)
    3052             :                         {
    3053           0 :                             nMaxRight=lNullPix+GetMargin2()-GetMargin1()+
    3054           0 :                                 (nBorderCount-nIdx-1)*lMinFrame;
    3055             :                         }
    3056             :                         else
    3057             :                         {
    3058           0 :                             if(nRightCol==USHRT_MAX)
    3059             :                             { // last column
    3060           0 :                                 nMaxRight = GetMargin2() + lNullPix;
    3061           0 :                                 if(IsActLastColumn())
    3062             :                                 {
    3063           0 :                                     if(bRTL)
    3064             :                                     {
    3065             :                                         nMaxRight -=
    3066           0 :                                             GetMargin2() + GetRightIndent() -
    3067             :                                                 Max(GetFirstLineIndent(),
    3068           0 :                                                     GetLeftIndent());
    3069             :                                     }
    3070             :                                     else
    3071             :                                     {
    3072             :                                         nMaxRight -=
    3073           0 :                                             GetMargin2() - GetRightIndent() +
    3074             :                                                 Max(GetFirstLineIndent(),
    3075           0 :                                                     GetLeftIndent());
    3076             :                                     }
    3077           0 :                                     nMaxRight += pBorders[nIdx].nPos +
    3078           0 :                                         pBorders[nIdx].nWidth;
    3079             :                                 }
    3080             :                             }
    3081             :                             else
    3082             :                             {
    3083           0 :                                 nMaxRight = lNullPix + pBorders[nRightCol].nPos;
    3084             :                                 sal_uInt16 nNotHiddenRightCol =
    3085           0 :                                     GetActRightColumn(sal_True, nIdx);
    3086             : 
    3087           0 :                                 if( nActLeftCol == nIdx )
    3088             :                                 {
    3089             :                                     long nBorder = nNotHiddenRightCol ==
    3090             :                                         USHRT_MAX ?
    3091           0 :                                         GetMargin2() :
    3092           0 :                                         pBorders[nNotHiddenRightCol].nPos;
    3093           0 :                                     if(bRTL)
    3094             :                                     {
    3095           0 :                                         nMaxRight -= nBorder + GetRightIndent() -
    3096             :                                             Max(GetFirstLineIndent(),
    3097           0 :                                                 GetLeftIndent());
    3098             :                                     }
    3099             :                                     else
    3100             :                                     {
    3101           0 :                                         nMaxRight -= nBorder - GetRightIndent() +
    3102             :                                             Max(GetFirstLineIndent(),
    3103           0 :                                                 GetLeftIndent());
    3104             :                                     }
    3105           0 :                                     nMaxRight += pBorders[nIdx].nPos +
    3106           0 :                                         pBorders[nIdx].nWidth;
    3107             :                                 }
    3108             :                             }
    3109           0 :                             nMaxRight -= lMinFrame;
    3110           0 :                             nMaxRight -= pBorders[nIdx].nWidth;
    3111             :                         }
    3112             :                     }
    3113             :                 }
    3114             :                 // ObjectItem
    3115             :                 else
    3116             :                 {
    3117           0 :                     if(pObjectItem->HasLimits())
    3118             :                     {
    3119           0 :                         if(CalcLimits(nMaxLeft, nMaxRight, nIdx & 1? sal_False : sal_True))
    3120             :                         {
    3121           0 :                             nMaxLeft = ConvertPosPixel(nMaxLeft);
    3122           0 :                             nMaxRight = ConvertPosPixel(nMaxRight);
    3123             :                         }
    3124             :                     }
    3125             :                     else
    3126             :                     {
    3127           0 :                         nMaxLeft = LONG_MIN;
    3128           0 :                         nMaxRight = LONG_MAX;
    3129             :                     }
    3130             :                 }
    3131           0 :                 break;
    3132             :             }
    3133             :           case RULER_DRAGSIZE_2:
    3134             :             {
    3135           0 :                 nMaxLeft = lNullPix + pBorders[nIdx].nPos;
    3136           0 :                 if(nIdx == pColumnItem->Count()-2) { // last column
    3137           0 :                     nMaxRight = GetMargin2() + lNullPix;
    3138           0 :                     if(pColumnItem->IsLastAct()) {
    3139             :                         nMaxRight -=
    3140           0 :                             GetMargin2() - GetRightIndent() +
    3141             :                                 Max(GetFirstLineIndent(),
    3142           0 :                                     GetLeftIndent());
    3143           0 :                         nMaxRight += pBorders[nIdx].nPos +
    3144           0 :                             pBorders[nIdx].nWidth;
    3145             :                     }
    3146             :                 }
    3147             :                 else {
    3148           0 :                     nMaxRight = lNullPix + pBorders[nIdx+1].nPos;
    3149           0 :                     if(pColumnItem->GetActColumn()-1 == nIdx) {
    3150           0 :                         nMaxRight -= pBorders[nIdx+1].nPos  - GetRightIndent() +
    3151             :                             Max(GetFirstLineIndent(),
    3152           0 :                                 GetLeftIndent());
    3153           0 :                         nMaxRight += pBorders[nIdx].nPos +
    3154           0 :                             pBorders[nIdx].nWidth;
    3155             :                     }
    3156             :             }
    3157           0 :                 nMaxRight -= lMinFrame;
    3158           0 :                 nMaxRight -= pBorders[nIdx].nWidth;
    3159           0 :                 break;
    3160             :             }
    3161             :         }
    3162           0 :         nMaxRight += nDragOffset;
    3163           0 :         break;
    3164             :     }
    3165             :       case RULER_TYPE_INDENT:
    3166             :         {
    3167           0 :         const sal_uInt16 nIdx = GetDragAryPos();
    3168           0 :         switch(nIdx) {
    3169             :         case INDENT_FIRST_LINE - INDENT_GAP:
    3170             :         case INDENT_LEFT_MARGIN - INDENT_GAP:
    3171             :             {
    3172           0 :                 if(bRTL)
    3173             :                 {
    3174           0 :                     nMaxLeft = lNullPix + GetRightIndent();
    3175             : 
    3176           0 :                     if(pColumnItem && !pColumnItem->IsFirstAct())
    3177           0 :                         nMaxLeft += pBorders[pColumnItem->GetActColumn()-1].nPos +
    3178           0 :                             pBorders[pColumnItem->GetActColumn()-1].nWidth;
    3179           0 :                     nMaxRight = lNullPix + GetMargin2();
    3180             : 
    3181             :                     // Dragging along
    3182           0 :                     if((INDENT_FIRST_LINE - INDENT_GAP) != nIdx &&
    3183             :                        (nDragType & DRAG_OBJECT_LEFT_INDENT_ONLY) !=
    3184             :                        DRAG_OBJECT_LEFT_INDENT_ONLY)
    3185             :                     {
    3186           0 :                         if(GetLeftIndent() > GetFirstLineIndent())
    3187           0 :                             nMaxLeft += GetLeftIndent() - GetFirstLineIndent();
    3188             :                         else
    3189           0 :                             nMaxRight -= GetFirstLineIndent() - GetLeftIndent();
    3190             :                     }
    3191             :                 }
    3192             :                 else
    3193             :                 {
    3194           0 :                     nMaxLeft = lNullPix;
    3195             : 
    3196           0 :                     if(pColumnItem && !pColumnItem->IsFirstAct())
    3197           0 :                         nMaxLeft += pBorders[pColumnItem->GetActColumn()-1].nPos +
    3198           0 :                             pBorders[pColumnItem->GetActColumn()-1].nWidth;
    3199           0 :                     nMaxRight = lNullPix + GetRightIndent() - lMinFrame;
    3200             : 
    3201             :                     // Dragging along
    3202           0 :                     if((INDENT_FIRST_LINE - INDENT_GAP) != nIdx &&
    3203             :                        (nDragType & DRAG_OBJECT_LEFT_INDENT_ONLY) !=
    3204             :                        DRAG_OBJECT_LEFT_INDENT_ONLY)
    3205             :                     {
    3206           0 :                         if(GetLeftIndent() > GetFirstLineIndent())
    3207           0 :                             nMaxLeft += GetLeftIndent() - GetFirstLineIndent();
    3208             :                         else
    3209           0 :                             nMaxRight -= GetFirstLineIndent() - GetLeftIndent();
    3210             :                     }
    3211             :                 }
    3212             :             }
    3213           0 :           break;
    3214             :           case INDENT_RIGHT_MARGIN - INDENT_GAP:
    3215             :             {
    3216           0 :                 if(bRTL)
    3217             :                 {
    3218           0 :                     nMaxLeft = lNullPix;
    3219           0 :                     nMaxRight = lNullPix + Min(GetFirstLineIndent(), GetLeftIndent()) - lMinFrame;
    3220           0 :                     if(pColumnItem)
    3221             :                     {
    3222           0 :                         sal_uInt16 nRightCol=GetActRightColumn( sal_True );
    3223           0 :                         if(!IsActLastColumn( sal_True ))
    3224           0 :                             nMaxRight += pBorders[nRightCol].nPos;
    3225             :                         else
    3226           0 :                             nMaxRight += GetMargin2();
    3227             :                     }
    3228             :                     else
    3229           0 :                         nMaxLeft += GetMargin1();
    3230           0 :                     nMaxLeft += lMinFrame;
    3231             :                 }
    3232             :                 else
    3233             :                 {
    3234             :                     nMaxLeft = lNullPix +
    3235           0 :                         Max(GetFirstLineIndent(), GetLeftIndent());
    3236           0 :                     nMaxRight = lNullPix;
    3237           0 :                     if(pColumnItem)
    3238             :                     {
    3239           0 :                         sal_uInt16 nRightCol=GetActRightColumn( sal_True );
    3240           0 :                         if(!IsActLastColumn( sal_True ))
    3241           0 :                             nMaxRight += pBorders[nRightCol].nPos;
    3242             :                         else
    3243           0 :                             nMaxRight += GetMargin2();
    3244             :                     }
    3245             :                     else
    3246           0 :                         nMaxRight += GetMargin2();
    3247           0 :                     nMaxLeft += lMinFrame;
    3248             :                 }
    3249             :             }
    3250           0 :             break;
    3251             :         }
    3252           0 :         break;
    3253             :     }
    3254             :     case RULER_TYPE_TAB:                // Tabs (Modifier)
    3255             :         /*
    3256             :            left = NOf + Max(LAR, EZ)
    3257             :            right = NOf + RAR
    3258             :            */
    3259           0 :         nMaxLeft = bRTL ? lNullPix + GetRightIndent()
    3260           0 :                             : lNullPix + Min(GetFirstLineIndent(), GetLeftIndent());
    3261           0 :         pRuler_Imp->lMaxRightLogic=GetLogicRightIndent()+lLogicNullOffset;
    3262           0 :         nMaxRight = ConvertSizePixel(pRuler_Imp->lMaxRightLogic);
    3263           0 :         break;
    3264             :     default: ; //prevent warning
    3265             :     }
    3266             : #ifdef DEBUGLIN
    3267             :     {
    3268             :         String aStr("MinLeft: ");
    3269             :         Size aSize(nMaxLeft + lNullPix, 0);
    3270             :         Size aSize2(nMaxRight + lNullPix, 0);
    3271             :         aSize = pEditWin->PixelToLogic(aSize, MapMode(MAP_MM));
    3272             :         aSize2 = pEditWin->PixelToLogic(aSize2, MapMode(MAP_MM));
    3273             :         aStr += String(aSize.Width());
    3274             :         aStr += " MaxRight: ";
    3275             :         aStr += String(aSize2.Width());
    3276             :         InfoBox(0, aStr).Execute();
    3277             :     }
    3278             : #endif
    3279           0 : }
    3280             : 
    3281             : 
    3282           0 : long SvxRuler::StartDrag()
    3283             : 
    3284             : /* [Description]
    3285             : 
    3286             :    Beginning of a drag operation (SV-handler) evaluates modifier and
    3287             :    calculated values
    3288             : 
    3289             :    [Cross-reference]
    3290             : 
    3291             :    <SvxRuler::EvalModifier()>
    3292             :    <SvxRuler::CalcMinMax()>
    3293             :    <SvxRuler::EndDrag()>
    3294             : */
    3295             : 
    3296             : {
    3297           0 :     sal_Bool bContentProtected = pRuler_Imp->aProtectItem.IsCntntProtected();
    3298           0 :     if(!bValid)
    3299           0 :         return sal_False;
    3300             : 
    3301           0 :     pRuler_Imp->lLastLMargin=GetMargin1();
    3302           0 :     pRuler_Imp->lLastRMargin=GetMargin2();
    3303           0 :     long bOk = 1;
    3304           0 :     if(GetStartDragHdl().IsSet())
    3305           0 :         bOk = Ruler::StartDrag();
    3306           0 :     if(bOk) {
    3307           0 :         lInitialDragPos = GetDragPos();
    3308           0 :         switch(GetDragType()) {
    3309             :         case RULER_TYPE_MARGIN1:        // left edge of the surrounding Frame
    3310             :         case RULER_TYPE_MARGIN2:        // right edge of the surrounding Frame
    3311           0 :             if((bHorz && pLRSpaceItem) || (!bHorz && pULSpaceItem))
    3312             :             {
    3313           0 :                 if(pColumnItem)
    3314           0 :                     EvalModifier();
    3315             :                 else
    3316           0 :                     nDragType = DRAG_OBJECT;
    3317             :             }
    3318             :             else
    3319           0 :                 bOk = sal_False;
    3320           0 :             break;
    3321             :         case RULER_TYPE_BORDER:                // Table, column (Modifier)
    3322           0 :             if(pColumnItem)
    3323             :             {
    3324           0 :                 nDragOffset = pColumnItem->IsTable()? 0 :
    3325           0 :                 GetDragPos() - pBorders[GetDragAryPos()].nPos;
    3326           0 :                 EvalModifier();
    3327             : 
    3328             :             }
    3329             :             else
    3330           0 :                 nDragOffset = 0;
    3331           0 :             break;
    3332             :         case RULER_TYPE_INDENT: {                // Paragraph indents (Modifier)
    3333           0 :             if( bContentProtected )
    3334           0 :                 return sal_False;
    3335           0 :             sal_uInt16 nIndent = INDENT_LEFT_MARGIN;
    3336           0 :             if((nIndent) == GetDragAryPos() + INDENT_GAP) {  // Left paragraph indent
    3337           0 :                 pIndents[0] = pIndents[INDENT_FIRST_LINE];
    3338           0 :                 pIndents[0].nStyle |= RULER_STYLE_DONTKNOW;
    3339           0 :                 EvalModifier();
    3340             :             }
    3341             :             else
    3342           0 :                 nDragType = DRAG_OBJECT;
    3343           0 :             pIndents[1] = pIndents[GetDragAryPos()+INDENT_GAP];
    3344           0 :             pIndents[1].nStyle |= RULER_STYLE_DONTKNOW;
    3345           0 :             break;
    3346             :         }
    3347             :         case RULER_TYPE_TAB:                // Tabs (Modifier)
    3348           0 :             if( bContentProtected ) return sal_False;
    3349           0 :             EvalModifier();
    3350           0 :             pTabs[0] = pTabs[GetDragAryPos()+1];
    3351           0 :             pTabs[0].nStyle |= RULER_STYLE_DONTKNOW;
    3352           0 :             break;
    3353             :         default:
    3354           0 :             nDragType = NONE;
    3355             :         }
    3356             :     }
    3357             :     else
    3358           0 :         nDragType = NONE;
    3359           0 :     if(bOk)
    3360           0 :         CalcMinMax();
    3361           0 :     return bOk;
    3362             : }
    3363             : 
    3364             : 
    3365           0 : void  SvxRuler::Drag()
    3366             : 
    3367             : /* [Description]
    3368             : 
    3369             :    SV-Draghandler
    3370             : */
    3371             : {
    3372           0 :     if(IsDragCanceled())
    3373             :     {
    3374           0 :         Ruler::Drag();
    3375           0 :         return;
    3376             :     }
    3377           0 :     switch(GetDragType()) {
    3378             :     case RULER_TYPE_MARGIN1:        // left edge of the surrounding Frame
    3379           0 :         DragMargin1();
    3380           0 :         pRuler_Imp->lLastLMargin=GetMargin1();
    3381           0 :         break;
    3382             :     case RULER_TYPE_MARGIN2:        // right edge of the surrounding Frame
    3383           0 :         DragMargin2();
    3384           0 :         pRuler_Imp->lLastRMargin = GetMargin2();
    3385           0 :         break;
    3386             :     case RULER_TYPE_INDENT:         // Paragraph indents
    3387           0 :         DragIndents();
    3388           0 :         break;
    3389             :     case RULER_TYPE_BORDER:         // Table, columns
    3390           0 :         if(pColumnItem)
    3391           0 :             DragBorders();
    3392           0 :         else if(pObjectItem)
    3393           0 :             DragObjectBorder();
    3394           0 :         break;
    3395             :     case RULER_TYPE_TAB:            // Tabs
    3396           0 :         DragTabs();
    3397           0 :         break;
    3398             :     default: ;//prevent warning
    3399             :     }
    3400           0 :     Ruler::Drag();
    3401             : }
    3402             : 
    3403             : 
    3404           0 : void SvxRuler::EndDrag()
    3405             : 
    3406             : /* [Description]
    3407             : 
    3408             :    SV-handler; is called when ending the dragging. Triggers the updating of data
    3409             :    on the application, by calling the respective Apply...() methods to send the
    3410             :    data to the application.
    3411             : */
    3412             : {
    3413           0 :     const sal_Bool bUndo = IsDragCanceled();
    3414           0 :     const long lPos = GetDragPos();
    3415           0 :     DrawLine_Impl(lTabPos, 6, bHorz);
    3416           0 :     lTabPos=-1;
    3417           0 :     if(!bUndo)
    3418           0 :         switch(GetDragType())
    3419             :         {
    3420             :           case RULER_TYPE_MARGIN1:   // upper left edge of the surrounding Frame
    3421             :           case RULER_TYPE_MARGIN2:   // lower right edge of the surrounding Frame
    3422             :             {
    3423           0 :                 if(!pColumnItem || !pColumnItem->IsTable())
    3424           0 :                     ApplyMargins();
    3425             : 
    3426           0 :                 if(pColumnItem &&
    3427           0 :                    (pColumnItem->IsTable() ||
    3428             :                     (nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)))
    3429           0 :                     ApplyBorders();
    3430             : 
    3431             :             }
    3432           0 :             break;
    3433             :           case RULER_TYPE_BORDER:                // Table, columns
    3434           0 :             if(lInitialDragPos != lPos ||
    3435             :                 (pRuler_Imp->bIsTableRows && bHorz)) //special case - the null offset is changed here
    3436             :             {
    3437           0 :                 if(pColumnItem)
    3438             :                 {
    3439           0 :                     ApplyBorders();
    3440           0 :                     if(bHorz)
    3441           0 :                         UpdateTabs();
    3442             :                 }
    3443           0 :                 else if(pObjectItem)
    3444           0 :                     ApplyObject();
    3445             :             }
    3446           0 :             break;
    3447             :           case RULER_TYPE_INDENT:                // Paragraph indents
    3448           0 :             if(lInitialDragPos != lPos)
    3449           0 :                 ApplyIndents();
    3450           0 :             SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
    3451           0 :             break;
    3452             :           case RULER_TYPE_TAB:                // Tabs
    3453             :             {
    3454           0 :                 ApplyTabs();
    3455           0 :                 pTabs[GetDragAryPos()].nStyle &= ~RULER_STYLE_INVISIBLE;
    3456           0 :                 SetTabs(nTabCount, pTabs+TAB_GAP);
    3457             :             }
    3458           0 :             break;
    3459             :             default: ; //prevent warning
    3460             :         }
    3461           0 :     nDragType = NONE;
    3462           0 :     Ruler::EndDrag();
    3463           0 :     if(bUndo)
    3464           0 :         for(sal_uInt16 i=0;i<pRuler_Imp->nControlerItems;i++)
    3465             :         {
    3466           0 :             pCtrlItem[i]->ClearCache();
    3467           0 :             pCtrlItem[i]->GetBindings().Invalidate(pCtrlItem[i]->GetId());
    3468             :         }
    3469           0 : }
    3470             : 
    3471             : 
    3472           0 : void SvxRuler::ExtraDown()
    3473             : 
    3474             : /* [Description]
    3475             : 
    3476             :    Overloaded SV method, sets the new type for the Default tab.
    3477             : */
    3478             : 
    3479             : {
    3480             :     // Switch Tab Type
    3481           0 :     if(pTabStopItem &&
    3482             :         (nFlags & SVXRULER_SUPPORT_TABS) ==        SVXRULER_SUPPORT_TABS) {
    3483           0 :         ++nDefTabType;
    3484           0 :         if(RULER_TAB_DEFAULT == nDefTabType)
    3485           0 :             nDefTabType = RULER_TAB_LEFT;
    3486           0 :         SetExtraType(RULER_EXTRA_TAB, nDefTabType);
    3487             :     }
    3488           0 :     Ruler::ExtraDown();
    3489           0 : }
    3490             : 
    3491             : 
    3492          20 : void SvxRuler::Notify(SfxBroadcaster&, const SfxHint& rHint)
    3493             : 
    3494             : /* [Description]
    3495             : 
    3496             :    Report through the bindings that the status update is completed. The ruler
    3497             :    updates its appearance and gets registered again in the bindings.
    3498             : */
    3499             : 
    3500             : {
    3501             :     // start update
    3502          60 :     if(bActive &&
    3503          20 :         rHint.Type() == TYPE(SfxSimpleHint) &&
    3504          20 :      ((SfxSimpleHint&) rHint ).GetId() == SFX_HINT_UPDATEDONE ) {
    3505          20 :         Update();
    3506          20 :         EndListening(*pBindings);
    3507          20 :         bValid = sal_True;
    3508          20 :         bListening = sal_False;
    3509             :     }
    3510          20 : }
    3511             : 
    3512             : 
    3513           0 : IMPL_LINK_INLINE_START( SvxRuler, MenuSelect, Menu *, pMenu )
    3514             : 
    3515             : /* [Description]
    3516             : 
    3517             :    Handler of the context menus for switching the unit of measurement
    3518             : */
    3519             : 
    3520             : {
    3521           0 :     SetUnit(FieldUnit(pMenu->GetCurItemId()));
    3522           0 :     return 0;
    3523             : }
    3524           0 : IMPL_LINK_INLINE_END( SvxRuler, MenuSelect, Menu *, pMenu )
    3525             : 
    3526             : 
    3527           0 : IMPL_LINK( SvxRuler, TabMenuSelect, Menu *, pMenu )
    3528             : 
    3529             : /* [Description]
    3530             : 
    3531             :    Handler of the tab menu for setting the type
    3532             : */
    3533             : 
    3534             : {
    3535           0 :     if(pTabStopItem && pTabStopItem->Count() > pRuler_Imp->nIdx)
    3536             :     {
    3537           0 :         SvxTabStop aTabStop = (*pTabStopItem)[pRuler_Imp->nIdx];
    3538           0 :         aTabStop.GetAdjustment() = ToAttrTab_Impl(pMenu->GetCurItemId()-1);
    3539           0 :         pTabStopItem->Remove(pRuler_Imp->nIdx);
    3540           0 :         pTabStopItem->Insert(aTabStop);
    3541           0 :         sal_uInt16 nTabStopId = bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL;
    3542           0 :         pBindings->GetDispatcher()->Execute( nTabStopId, SFX_CALLMODE_RECORD, pTabStopItem, 0L );
    3543           0 :         UpdateTabs();
    3544           0 :         pRuler_Imp->nIdx = 0;
    3545             :     }
    3546           0 :     return 0;
    3547             : }
    3548             : 
    3549             : 
    3550           0 : void SvxRuler::Command( const CommandEvent& rCEvt )
    3551             : 
    3552             : /* [Description]
    3553             : 
    3554             :    Mouse context menu for switching the unit of measurement
    3555             : */
    3556             : 
    3557             : {
    3558           0 :     if ( COMMAND_CONTEXTMENU == rCEvt.GetCommand() )
    3559             :     {
    3560           0 :         CancelDrag();
    3561           0 :         sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
    3562           0 :         if ( pTabs &&
    3563             :              RULER_TYPE_TAB ==
    3564           0 :              GetType( rCEvt.GetMousePosPixel(), &pRuler_Imp->nIdx ) &&
    3565           0 :              pTabs[pRuler_Imp->nIdx+TAB_GAP].nStyle < RULER_TAB_DEFAULT )
    3566             :         {
    3567           0 :             PopupMenu aMenu;
    3568           0 :             aMenu.SetSelectHdl(LINK(this, SvxRuler, TabMenuSelect));
    3569           0 :             VirtualDevice aDev;
    3570           0 :             const Size aSz(RULER_TAB_WIDTH+2, RULER_TAB_HEIGHT+2);
    3571           0 :             aDev.SetOutputSize(aSz);
    3572           0 :             aDev.SetBackground(Wallpaper(Color(COL_WHITE)));
    3573           0 :             const Point aPt(aSz.Width() / 2, aSz.Height() / 2);
    3574             : 
    3575           0 :             for ( sal_uInt16 i = RULER_TAB_LEFT; i < RULER_TAB_DEFAULT; ++i )
    3576             :             {
    3577           0 :                 sal_uInt16 nStyle = bRTL ? i|RULER_TAB_RTL : i;
    3578           0 :                 nStyle |= (sal_uInt16)(bHorz ? WB_HORZ : WB_VERT);
    3579           0 :                 DrawTab(&aDev, aPt, nStyle);
    3580             :                 aMenu.InsertItem(i+1,
    3581           0 :                                  String(ResId(RID_SVXSTR_RULER_START+i, DIALOG_MGR())),
    3582           0 :                                  Image(aDev.GetBitmap(Point(), aSz), Color(COL_WHITE)));
    3583           0 :                 aMenu.CheckItem(i+1, i == pTabs[pRuler_Imp->nIdx+TAB_GAP].nStyle);
    3584           0 :                 aDev.SetOutputSize(aSz); // delete device
    3585             :             }
    3586           0 :             aMenu.Execute( this, rCEvt.GetMousePosPixel() );
    3587             :         }
    3588             :         else
    3589             :         {
    3590           0 :             PopupMenu aMenu(ResId(RID_SVXMN_RULER, DIALOG_MGR()));
    3591           0 :             aMenu.SetSelectHdl(LINK(this, SvxRuler, MenuSelect));
    3592           0 :             FieldUnit eUnit = GetUnit();
    3593           0 :             const sal_uInt16 nCount = aMenu.GetItemCount();
    3594             : 
    3595           0 :             sal_Bool bReduceMetric = 0 != (nFlags &SVXRULER_SUPPORT_REDUCED_METRIC);
    3596           0 :             for ( sal_uInt16 i = nCount; i; --i )
    3597             :             {
    3598           0 :                 const sal_uInt16 nId = aMenu.GetItemId(i - 1);
    3599           0 :                 aMenu.CheckItem(nId, nId == (sal_uInt16)eUnit);
    3600           0 :                 if(bReduceMetric &&
    3601             :                         (nId == FUNIT_M ||
    3602             :                          nId == FUNIT_KM ||
    3603             :                          nId == FUNIT_FOOT ||
    3604             :                          nId == FUNIT_MILE ||
    3605             :                          nId == FUNIT_CHAR ||
    3606             :                          nId == FUNIT_LINE ))
    3607             :                 {
    3608           0 :                     if (( nId == FUNIT_CHAR ) && bHorz )
    3609             :                            ;
    3610           0 :                     else if (( nId == FUNIT_LINE ) && !bHorz )
    3611             :                            ;
    3612             :                     else
    3613           0 :                            aMenu.RemoveItem(i - 1);
    3614             :                 }
    3615             :             }
    3616           0 :             aMenu.Execute( this, rCEvt.GetMousePosPixel() );
    3617             :         }
    3618             :     }
    3619             :     else
    3620           0 :         Ruler::Command( rCEvt );
    3621           0 : }
    3622             : 
    3623             : 
    3624           0 : sal_uInt16 SvxRuler::GetActRightColumn(
    3625             :     sal_Bool bForceDontConsiderHidden, sal_uInt16 nAct ) const
    3626             : {
    3627           0 :     if( nAct == USHRT_MAX )
    3628           0 :         nAct = pColumnItem->GetActColumn();
    3629           0 :     else nAct++; //To be able to pass on the ActDrag
    3630             : 
    3631             :     sal_Bool bConsiderHidden = !bForceDontConsiderHidden &&
    3632           0 :         !( nDragType & DRAG_OBJECT_ACTLINE_ONLY );
    3633             : 
    3634           0 :     while( nAct < pColumnItem->Count() - 1 )
    3635             :     {
    3636           0 :         if( (*pColumnItem)[nAct].bVisible || bConsiderHidden )
    3637           0 :             return nAct;
    3638             :         else
    3639           0 :             nAct++;
    3640             :     }
    3641           0 :     return USHRT_MAX;
    3642             : }
    3643             : 
    3644             : 
    3645             : 
    3646           0 : sal_uInt16 SvxRuler::GetActLeftColumn(
    3647             :     sal_Bool bForceDontConsiderHidden, sal_uInt16 nAct ) const
    3648             : {
    3649           0 :     if(nAct==USHRT_MAX)
    3650           0 :         nAct=pColumnItem->GetActColumn();
    3651             : 
    3652           0 :     sal_uInt16 nLOffs=1;
    3653             : 
    3654             :     sal_Bool bConsiderHidden = !bForceDontConsiderHidden &&
    3655           0 :         !( nDragType & DRAG_OBJECT_ACTLINE_ONLY );
    3656             : 
    3657           0 :     while(nAct>=nLOffs)
    3658             :     {
    3659           0 :         if( (*pColumnItem)[ nAct - nLOffs ].bVisible || bConsiderHidden )
    3660           0 :             return nAct-nLOffs;
    3661             :         else
    3662           0 :             nLOffs++;
    3663             :     }
    3664           0 :     return USHRT_MAX;
    3665             : }
    3666             : 
    3667             : 
    3668           0 : sal_Bool SvxRuler::IsActLastColumn(
    3669             :     sal_Bool bForceDontConsiderHidden, sal_uInt16 nAct) const
    3670             : {
    3671           0 :     return GetActRightColumn(bForceDontConsiderHidden, nAct)==USHRT_MAX;
    3672             : }
    3673             : 
    3674           0 : sal_Bool SvxRuler::IsActFirstColumn(
    3675             :     sal_Bool bForceDontConsiderHidden, sal_uInt16 nAct) const
    3676             : {
    3677           0 :     return GetActLeftColumn(bForceDontConsiderHidden, nAct)==USHRT_MAX;
    3678             : }
    3679             : 
    3680           0 : long SvxRuler::CalcPropMaxRight(sal_uInt16 nCol) const
    3681             : {
    3682             : 
    3683           0 :     if(!(nDragType & DRAG_OBJECT_SIZE_LINEAR))
    3684             :     {
    3685             :         // Remove the minimum width for all affected columns
    3686             :         // starting from the right edge
    3687           0 :         long _nMaxRight = GetMargin2()-GetMargin1();
    3688             : 
    3689           0 :         long lFences=0;
    3690           0 :         long lMinSpace=USHRT_MAX;
    3691             :         long lOldPos;
    3692           0 :         long lColumns=0;
    3693             :         sal_uInt16 nStart;
    3694           0 :         if(!pColumnItem->IsTable())
    3695             :         {
    3696           0 :             if(nCol==USHRT_MAX)
    3697             :             {
    3698           0 :                 lOldPos=GetMargin1();
    3699           0 :                 nStart=0;
    3700             :             }
    3701             :             else
    3702             :             {
    3703           0 :                 lOldPos=pBorders[nCol].nPos+pBorders[nCol].nWidth;
    3704           0 :                 nStart=nCol+1;
    3705           0 :                 lFences=pBorders[nCol].nWidth;
    3706             :             }
    3707             : 
    3708           0 :             for(sal_uInt16 i = nStart; i < nBorderCount-1; ++i)
    3709             :             {
    3710           0 :                 long lWidth=pBorders[i].nPos-lOldPos;
    3711           0 :                 lColumns+=lWidth;
    3712           0 :                 if(lWidth<lMinSpace)
    3713           0 :                     lMinSpace=lWidth;
    3714           0 :                 lOldPos=pBorders[i].nPos+pBorders[i].nWidth;
    3715           0 :                 lFences+=pBorders[i].nWidth;
    3716             :             }
    3717           0 :             long lWidth=GetMargin2()-lOldPos;
    3718           0 :             lColumns+=lWidth;
    3719           0 :             if(lWidth<lMinSpace)
    3720           0 :                 lMinSpace=lWidth;
    3721             :         }
    3722             :         else
    3723             :         {
    3724             :             sal_uInt16 nActCol;
    3725           0 :             if(nCol==USHRT_MAX) //CalcMinMax for LeftMargin
    3726             :             {
    3727           0 :                 lOldPos=GetMargin1();
    3728             :             }
    3729             :             else
    3730             :             {
    3731           0 :                 lOldPos=pBorders[nCol].nPos;
    3732             :             }
    3733           0 :             lColumns=GetMargin2()-lOldPos;
    3734           0 :             nActCol=nCol;
    3735           0 :             lFences=0;
    3736           0 :             while(nActCol<nBorderCount||nActCol==USHRT_MAX)
    3737             :             {
    3738             :                 sal_uInt16 nRight;
    3739           0 :                 if(nActCol==USHRT_MAX)
    3740             :                 {
    3741           0 :                     nRight=0;
    3742           0 :                     while(!(*pColumnItem)[nRight].bVisible)
    3743           0 :                         nRight++;
    3744             :                 }
    3745             :                 else
    3746           0 :                     nRight=GetActRightColumn(sal_False, nActCol);
    3747             :                 long lWidth;
    3748           0 :                 if(nRight!=USHRT_MAX)
    3749             :                 {
    3750           0 :                     lWidth=pBorders[nRight].nPos-lOldPos;
    3751           0 :                     lOldPos=pBorders[nRight].nPos;
    3752             :                 }
    3753             :                 else
    3754           0 :                     lWidth=GetMargin2()-lOldPos;
    3755           0 :                 nActCol=nRight;
    3756           0 :                 if(lWidth<lMinSpace)
    3757           0 :                     lMinSpace=lWidth;
    3758           0 :                 if(nActCol==USHRT_MAX)
    3759           0 :                     break;
    3760             :             }
    3761             :         }
    3762             : 
    3763           0 :         _nMaxRight-=(long)(lFences+lMinFrame/(float)lMinSpace*lColumns);
    3764           0 :         return _nMaxRight;
    3765             :     }
    3766             :     else
    3767             :     {
    3768           0 :         if(pColumnItem->IsTable())
    3769             :         {
    3770           0 :             sal_uInt16 nVisCols=0;
    3771           0 :             for(sal_uInt16 i=GetActRightColumn(sal_False, nCol);i<nBorderCount;)
    3772             :             {
    3773           0 :                 if((*pColumnItem)[i].bVisible)
    3774           0 :                     nVisCols++;
    3775           0 :                 i=GetActRightColumn(sal_False, i);
    3776             :             }
    3777           0 :             return GetMargin2()-GetMargin1()-(nVisCols+1)*lMinFrame;
    3778             :         }
    3779             :         else
    3780             :         {
    3781           0 :             long lWidth=0;
    3782           0 :             for(sal_uInt16 i=nCol;i<nBorderCount-1;i++)
    3783             :             {
    3784           0 :                 lWidth+=lMinFrame+pBorders[i].nWidth;
    3785             :             }
    3786           0 :             return GetMargin2()-GetMargin1()-lWidth;
    3787             :         }
    3788             :     }
    3789             : }
    3790             : 
    3791             : // Tab stops relative to indent (#i24363#)
    3792         208 : void SvxRuler::SetTabsRelativeToIndent( sal_Bool bRel )
    3793             : {
    3794         208 :     pRuler_Imp->bIsTabsRelativeToIndent = bRel;
    3795         208 : }
    3796             : 
    3797             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10