blob: 481477d1262abfb4b25393dbabd3969d0748fe9d [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"
// INCLUDE ---------------------------------------------------------------
#include <string.h>
#include <limits.h>
#include <tools/shl.hxx>
#include <vcl/image.hxx>
#include <svl/eitem.hxx>
#include <svl/rectitem.hxx>
#include <sfx2/dispatch.hxx>
#include <svl/smplhint.hxx>
#include <svx/dialogs.hrc>
#include <svx/dialmgr.hxx>
#include <svx/ruler.hxx>
#include "rlrcitem.hxx"
#include "svx/rulritem.hxx"
#include <editeng/tstpitem.hxx>
#include <editeng/lrspitem.hxx>
#include "editeng/protitem.hxx"
#ifndef _APP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef RULER_TAB_RTL
#define RULER_TAB_RTL ((sal_uInt16)0x0010)
#endif
#include <comphelper/uieventslogger.hxx>
namespace
{
void lcl_logRulerUse(const ::rtl::OUString& sURL) //#i99729#
{
using namespace ::com::sun::star;
util::URL aTargetURL;
aTargetURL.Complete = sURL;
aTargetURL.Main = sURL;
if(::comphelper::UiEventsLogger::isEnabled()) //#i88653#
{
::rtl::OUString sAppName;
uno::Sequence<beans::PropertyValue> source;
::comphelper::UiEventsLogger::appendDispatchOrigin(source, sAppName, ::rtl::OUString::createFromAscii("SfxRuler"));
::comphelper::UiEventsLogger::logDispatch(aTargetURL, source);
}
}
}
// STATIC DATA -----------------------------------------------------------
#define CTRL_ITEM_COUNT 14
#define GAP 10
#define OBJECT_BORDER_COUNT 4
#define TAB_GAP 1
#define INDENT_GAP 2
#define INDENT_FIRST_LINE 4
#define INDENT_LEFT_MARGIN 5
#define INDENT_RIGHT_MARGIN 6
#define INDENT_LEFT_BORDER 2
#define INDENT_RIGHT_BORDER 3
#define INDENT_COUNT 5 //without the first two old values
#define PIXEL_H_ADJUST( l1, l2 ) PixelHAdjust(l1,l2)
#ifdef DEBUGLIN
inline long ToMM(Window *pWin, long lVal)
{
return pWin->PixelToLogic(Size(lVal, 0), MapMode(MAP_MM)).Width();
}
void Debug_Impl(Window *pWin, SvxColumnItem& rColItem)
{
String aTmp("Aktuell: ");
aTmp += rColItem.GetActColumn();
aTmp += " ColLeft: ";
aTmp += String(ToMM(pWin, rColItem.GetLeft()));
aTmp += " ColRight: ";
aTmp += String(ToMM(pWin, rColItem.GetRight()));
for(sal_uInt16 i = 0; i < rColItem.Count(); ++i) {
aTmp += " Start: ";
aTmp += String(ToMM(pWin, rColItem[i].nStart));
aTmp += " End: ";
aTmp += String(ToMM(pWin, rColItem[i].nEnd));
}
InfoBox(0, aTmp).Execute();
}
void Debug_Impl(Window *pWin, const SvxLongLRSpaceItem& rLRSpace)
{
String aTmp("Left: ");
aTmp += pWin->PixelToLogic(Size(rLRSpace.GetLeft(), 0), MapMode(MAP_MM)).Width();
aTmp += " Right: ";
aTmp +=pWin->PixelToLogic(Size(rLRSpace.GetRight(), 0), MapMode(MAP_MM)).Width();
InfoBox(0, aTmp).Execute();
}
void Debug_Impl(Window *pWin, const SvxLongULSpaceItem& rULSpace)
{
String aTmp("Upper: ");
aTmp += pWin->PixelToLogic(Size(rULSpace.GetUpper(), 0), MapMode(MAP_MM)).Width();
aTmp += " Lower: ";
aTmp += pWin->PixelToLogic(Size(rULSpace.GetLower(), 0), MapMode(MAP_MM)).Width();
InfoBox(0, aTmp).Execute();
}
void DebugTabStops_Impl(const SvxTabStopItem& rTabs)
{
String aTmp("Tabs: ");
// Def Tabs loeschen
for(sal_uInt16 i = 0; i < rTabs.Count(); ++i)
{
aTmp += String(rTabs[i].GetTabPos() / 56);
aTmp += " : ";
}
InfoBox(0, aTmp).Execute();
}
void DebugParaMargin_Impl(const SvxLRSpaceItem& rLRSpace)
{
String aTmp("ParaLeft: ");
aTmp += rLRSpace.GetTxtLeft() / 56;
aTmp += " ParaRight: ";
aTmp += rLRSpace.GetRight() / 56;
aTmp += " FLI: ";
aTmp += rLRSpace.GetTxtFirstLineOfst() / 56;
InfoBox(0, aTmp).Execute();
}
#endif // DEBUGLIN
#ifdef DEBUG_RULER
#include <vcl/svapp.hxx>
#include <vcl/lstbox.hxx>
class RulerDebugWindow : public Window
{
ListBox aBox;
public:
RulerDebugWindow(Window* pParent) :
Window(pParent, WB_BORDER|WB_SIZEMOVE|WB_DIALOGCONTROL|WB_CLIPCHILDREN|WB_SYSTEMWINDOW),
aBox(this, WB_BORDER)
{
Size aOutput(200, 400);
SetOutputSizePixel(aOutput);
aBox.SetSizePixel(aOutput);
aBox.Show();
Show();
Size aParentSize(pParent->GetOutputSizePixel());
Size aOwnSize(GetSizePixel());
aParentSize.Width() -= aOwnSize.Width();
aParentSize.Height() -= aOwnSize.Height();
SetPosPixel(Point(aParentSize.Width(), aParentSize.Height()));
}
~RulerDebugWindow();
ListBox& GetLBox() {return aBox;}
static void AddDebugText(const sal_Char* pDescription, const String& rText );
};
static RulerDebugWindow* pDebugWindow = 0;
RulerDebugWindow::~RulerDebugWindow()
{
pDebugWindow = 0;
}
void RulerDebugWindow::AddDebugText(const sal_Char* pDescription, const String& rText )
{
if(!pDebugWindow)
{
Window* pParent = Application::GetFocusWindow();
while(pParent->GetParent())
pParent = pParent->GetParent();
pDebugWindow = new RulerDebugWindow(pParent);
}
String sContent(String::CreateFromAscii(pDescription));
sContent += rText;
sal_uInt16 nPos = pDebugWindow->GetLBox().InsertEntry(sContent);
pDebugWindow->GetLBox().SelectEntryPos(nPos);
pDebugWindow->GrabFocus();
}
#define ADD_DEBUG_TEXT(cDescription, sValue) \
RulerDebugWindow::AddDebugText(cDescription, sValue);
#define REMOVE_DEBUG_WINDOW \
delete pDebugWindow; \
pDebugWindow = 0;
#else
#define ADD_DEBUG_TEXT(cDescription, sValue)
#define REMOVE_DEBUG_WINDOW
#endif
struct SvxRuler_Impl {
sal_uInt16 *pPercBuf;
sal_uInt16 *pBlockBuf;
sal_uInt16 nPercSize;
long nTotalDist;
long lOldWinPos;
long lMaxLeftLogic;
long lMaxRightLogic;
long lLastLMargin;
long lLastRMargin;
SvxProtectItem aProtectItem;
SfxBoolItem* pTextRTLItem;
sal_uInt16 nControlerItems;
sal_uInt16 nIdx;
sal_uInt16 nColLeftPix, nColRightPix; // Pixelwerte fuer linken / rechten Rand
// bei Spalten; gepuffert, um Umrechenfehler
// zu vermeiden.
// Muesste vielleicht fuer weitere Werte
// aufgebohrt werden
sal_Bool bIsTableRows : 1; // pColumnItem contains table rows instead of columns
//#i24363# tab stops relative to indent
sal_Bool bIsTabsRelativeToIndent : 1; // Tab stops relative to paragraph indent?
SvxRuler_Impl() :
pPercBuf(0), pBlockBuf(0),
nPercSize(0), nTotalDist(0),
lOldWinPos(0),
lMaxLeftLogic(0), lMaxRightLogic(0),
lLastLMargin(0), lLastRMargin(0),
aProtectItem(SID_RULER_PROTECT),
pTextRTLItem(0), nControlerItems(0),
nIdx(0),
nColLeftPix(0), nColRightPix(0),
bIsTableRows(sal_False),
bIsTabsRelativeToIndent(sal_True)
{
}
~SvxRuler_Impl()
{
nPercSize = 0; nTotalDist = 0;
delete[] pPercBuf; delete[] pBlockBuf; pPercBuf = 0;
delete pTextRTLItem;
}
void SetPercSize(sal_uInt16 nSize);
};
void SvxRuler_Impl::SetPercSize(sal_uInt16 nSize)
{
if(nSize > nPercSize)
{
delete[] pPercBuf;
delete[] pBlockBuf;
pPercBuf = new sal_uInt16[nPercSize = nSize];
pBlockBuf = new sal_uInt16[nPercSize = nSize];
}
size_t nSize2 = sizeof(sal_uInt16) * nPercSize;
memset(pPercBuf, 0, nSize2);
memset(pBlockBuf, 0, nSize2);
}
// Konstruktor des Lineals
// SID_ATTR_ULSPACE, SID_ATTR_LRSPACE
// erwartet als Parameter SvxULSpaceItem f"ur Seitenr"ander
// (entweder links/rechts oder oben/unten)
// Lineal: SetMargin1, SetMargin2
// SID_RULER_PAGE_POS
// erwartet als Parameter Anfangswert der Seite sowie Seitenbreite
// Lineal: SetPagePos
// SID_ATTR_TABSTOP
// erwartet: SvxTabStopItem
// Lineal: SetTabs
// SID_ATTR_PARA_LRSPACE
// linker, rechter Absatzrand bei H-Lineal
// Lineal: SetIndents
// SID_RULER_BORDERS
// Tabellenraender, Spalten
// erwartet: so etwas wie SwTabCols
// Lineal: SetBorders
SvxRuler::SvxRuler
(
Window* pParent, // StarView Parent
Window* pWin, // Ausgabefenster; wird fuer Umrechnung logische
// Einheiten <-> Pixel verwendet
sal_uInt16 flags, // Anzeige Flags, siehe ruler.hxx
SfxBindings &rBindings, // zugeordnete Bindings
WinBits nWinStyle // StarView WinBits
)
: Ruler(pParent, nWinStyle),
pCtrlItem(new SvxRulerItem *[CTRL_ITEM_COUNT]),
pLRSpaceItem(0),
pMinMaxItem(0),
pULSpaceItem(0),
pTabStopItem(0),
pParaItem(0),
pParaBorderItem(0),
pPagePosItem(0),
pColumnItem(0),
pObjectItem(0),
pEditWin(pWin),
pRuler_Imp(new SvxRuler_Impl),
bAppSetNullOffset(sal_False), //Wird der 0-Offset des Lineals
//durch die appl. gesetzt?
lLogicNullOffset(0),
lAppNullOffset(LONG_MAX),
lMinFrame(5),
lInitialDragPos(0),
nFlags(flags),
nDragType(NONE),
nDefTabType(RULER_TAB_LEFT),
nTabCount(0),
nTabBufSize(0),
lDefTabDist(50),
lTabPos(-1),
pTabs(0),
pIndents(0),
pBorders(new RulerBorder[1]), //wg 1 Spaltiger Tabellen
nBorderCount(0),
pObjectBorders(0),
pBindings(&rBindings),
nDragOffset(0),
nMaxLeft(0),
nMaxRight(0),
bValid(sal_False),
bListening(sal_False),
bActive(sal_True)
/*
[Beschreibung]
ctor;
Datenpuffer initialisieren; ControllerItems werden erzeugt
*/
{
memset(pCtrlItem, 0, sizeof(SvxRulerItem *) * CTRL_ITEM_COUNT);
rBindings.EnterRegistrations();
// Unterstuetzte Items anlegen
sal_uInt16 i = 0;
// Seitenraender
pCtrlItem[i++] = new SvxRulerItem(SID_RULER_LR_MIN_MAX, *this, rBindings);
if((nWinStyle & WB_VSCROLL) == WB_VSCROLL)
{
bHorz = sal_False;
pCtrlItem[i++] = new SvxRulerItem(SID_ATTR_LONG_ULSPACE, *this, rBindings);
}
else
{
bHorz = sal_True;
pCtrlItem[i++] = new SvxRulerItem(SID_ATTR_LONG_LRSPACE, *this, rBindings);
}
// Seitenposition
pCtrlItem[i++] = new SvxRulerItem(SID_RULER_PAGE_POS, *this, rBindings);
if((nFlags & SVXRULER_SUPPORT_TABS) == SVXRULER_SUPPORT_TABS)
{
sal_uInt16 nTabStopId = bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL;
pCtrlItem[i++] = new SvxRulerItem(nTabStopId, *this, rBindings);
SetExtraType(RULER_EXTRA_TAB, nDefTabType);
}
if(0 != (nFlags & (SVXRULER_SUPPORT_PARAGRAPH_MARGINS |SVXRULER_SUPPORT_PARAGRAPH_MARGINS_VERTICAL)))
{
if(bHorz)
pCtrlItem[i++] = new SvxRulerItem(SID_ATTR_PARA_LRSPACE, *this, rBindings);
else
pCtrlItem[i++] = new SvxRulerItem(SID_ATTR_PARA_LRSPACE_VERTICAL, *this, rBindings);
pIndents = new RulerIndent[5+INDENT_GAP];
memset(pIndents, 0, sizeof(RulerIndent)*(3+INDENT_GAP));
pIndents[0].nStyle = RULER_STYLE_DONTKNOW;
pIndents[1].nStyle = RULER_STYLE_DONTKNOW;
pIndents[INDENT_FIRST_LINE].nStyle = RULER_INDENT_TOP;
pIndents[INDENT_LEFT_MARGIN].nStyle = RULER_INDENT_BOTTOM;
pIndents[INDENT_RIGHT_MARGIN].nStyle = RULER_INDENT_BOTTOM;
pIndents[INDENT_LEFT_BORDER].nStyle = RULER_INDENT_BORDER;
pIndents[INDENT_RIGHT_BORDER].nStyle = RULER_INDENT_BORDER;
for(sal_uInt16 nIn = 0; nIn < 7; nIn++)
pIndents[nIn].nPos = 0;
}
if((nFlags & SVXRULER_SUPPORT_BORDERS) == SVXRULER_SUPPORT_BORDERS)
{
pCtrlItem[i++] = new SvxRulerItem(bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL, *this, rBindings);
pCtrlItem[i++] = new SvxRulerItem(bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL, *this, rBindings);
}
pCtrlItem[i++] = new SvxRulerItem(SID_RULER_TEXT_RIGHT_TO_LEFT, *this, rBindings);
if((nFlags & SVXRULER_SUPPORT_OBJECT) == SVXRULER_SUPPORT_OBJECT)
{
pCtrlItem[i++] = new SvxRulerItem(SID_RULER_OBJECT, *this, rBindings );
pObjectBorders = new RulerBorder[OBJECT_BORDER_COUNT];
size_t nSize = sizeof( RulerBorder ) * OBJECT_BORDER_COUNT;
memset(pObjectBorders, 0, nSize);
for(sal_uInt16 nBorder = 0; nBorder < OBJECT_BORDER_COUNT; ++nBorder)
{
pObjectBorders[nBorder].nPos = 0;
pObjectBorders[nBorder].nWidth = 0;
pObjectBorders[nBorder].nStyle = RULER_BORDER_MOVEABLE;
}
}
pCtrlItem[i++] = new SvxRulerItem( SID_RULER_PROTECT, *this, rBindings );
pCtrlItem[i++] = new SvxRulerItem(SID_RULER_BORDER_DISTANCE, *this, rBindings);
pRuler_Imp->nControlerItems=i;
if((nFlags & SVXRULER_SUPPORT_SET_NULLOFFSET) ==
SVXRULER_SUPPORT_SET_NULLOFFSET)
SetExtraType(RULER_EXTRA_NULLOFFSET, 0);
rBindings.LeaveRegistrations();
}
__EXPORT SvxRuler::~SvxRuler()
/*
[Beschreibung]
Destruktor Lineal
Freigabe interner Puffer
*/
{
REMOVE_DEBUG_WINDOW
if(bListening)
EndListening(*pBindings);
pBindings->EnterRegistrations();
for(sal_uInt16 i = 0; i < CTRL_ITEM_COUNT && pCtrlItem[i]; ++i)
delete pCtrlItem[i];
delete[] pCtrlItem;
delete pLRSpaceItem;
delete pMinMaxItem;
delete pULSpaceItem;
delete pTabStopItem;
delete pParaItem;
delete pParaBorderItem;
delete pPagePosItem;
delete pColumnItem;
delete pObjectItem;
delete[] pIndents;
delete[] pBorders;
delete[] pObjectBorders;
delete[] pTabs;
delete pRuler_Imp;
pBindings->LeaveRegistrations();
}
/*
[Beschreibung]
Interne Umrechenroutinen
*/
long SvxRuler::ConvertHPosPixel(long nVal) const
{
return pEditWin->LogicToPixel(Size(nVal, 0)).Width();
}
long SvxRuler::ConvertVPosPixel(long nVal) const
{
return pEditWin->LogicToPixel(Size(0, nVal)).Height();
}
long SvxRuler::ConvertHSizePixel(long nVal) const
{
return pEditWin->LogicToPixel(Size(nVal, 0)).Width();
}
long SvxRuler::ConvertVSizePixel(long nVal) const
{
return pEditWin->LogicToPixel(Size(0, nVal)).Height();
}
long SvxRuler::ConvertPosPixel(long nVal) const
{
return bHorz ? ConvertHPosPixel(nVal): ConvertVPosPixel(nVal);
}
long SvxRuler::ConvertSizePixel(long nVal) const
{
return bHorz? ConvertHSizePixel(nVal): ConvertVSizePixel(nVal);
}
inline long SvxRuler::ConvertHPosLogic(long nVal) const
{
return pEditWin->PixelToLogic(Size(nVal, 0)).Width();
}
inline long SvxRuler::ConvertVPosLogic(long nVal) const
{
return pEditWin->PixelToLogic(Size(0, nVal)).Height();
}
inline long SvxRuler::ConvertHSizeLogic(long nVal) const
{
return pEditWin->PixelToLogic(Size(nVal, 0)).Width();
}
inline long SvxRuler::ConvertVSizeLogic(long nVal) const
{
return pEditWin->PixelToLogic(Size(0, nVal)).Height();
}
inline long SvxRuler::ConvertPosLogic(long nVal) const
{
return bHorz? ConvertHPosLogic(nVal): ConvertVPosLogic(nVal);
}
inline long SvxRuler::ConvertSizeLogic(long nVal) const
{
return bHorz? ConvertHSizeLogic(nVal): ConvertVSizeLogic(nVal);
}
long SvxRuler::PixelHAdjust(long nVal, long nValOld) const
{
if(ConvertHSizePixel(nVal)!=ConvertHSizePixel(nValOld))
return nVal;
else
return nValOld;
}
long SvxRuler::PixelVAdjust(long nVal, long nValOld) const
{
if(ConvertVSizePixel(nVal)!=ConvertVSizePixel(nValOld))
return nVal;
else
return nValOld;
}
long SvxRuler::PixelAdjust(long nVal, long nValOld) const
{
if(ConvertSizePixel(nVal)!=ConvertSizePixel(nValOld))
return nVal;
else
return nValOld;
}
inline sal_uInt16 SvxRuler::GetObjectBordersOff(sal_uInt16 nIdx) const
{
return bHorz? nIdx: nIdx + 2;
}
void SvxRuler::UpdateFrame()
/*
[Beschreibung]
Linken, oberen Rand aktualisieren
Items werden in die Darstellung des Lineals uebersetzt.
*/
{
const sal_uInt16 nMarginStyle =
( pRuler_Imp->aProtectItem.IsSizeProtected() ||
pRuler_Imp->aProtectItem.IsPosProtected() ) ?
0 : RULER_MARGIN_SIZEABLE;
if(pLRSpaceItem && pPagePosItem)
{
// wenn keine Initialisierung durch App Defaultverhalten
const long nOld = lLogicNullOffset;
lLogicNullOffset = pColumnItem?
pColumnItem->GetLeft(): pLRSpaceItem->GetLeft();
if(bAppSetNullOffset)
lAppNullOffset += lLogicNullOffset - nOld;
if(!bAppSetNullOffset || lAppNullOffset == LONG_MAX)
{
Ruler::SetNullOffset(ConvertHPosPixel(lLogicNullOffset));
SetMargin1( 0, nMarginStyle );
lAppNullOffset = 0;
}
else
SetMargin1( ConvertHPosPixel( lAppNullOffset ), nMarginStyle );
long lRight = 0;
// bei Tabelle rechten Rand der Tabelle auswerten
if(pColumnItem && pColumnItem->IsTable())
lRight = pColumnItem->GetRight();
else
lRight = pLRSpaceItem->GetRight();
sal_uIntPtr aWidth=
ConvertHPosPixel(pPagePosItem->GetWidth() - lRight -
lLogicNullOffset + lAppNullOffset);
SetMargin2( aWidth, nMarginStyle );
}
else
if(pULSpaceItem && pPagePosItem)
{
// Nullpunkt aus oberem Rand des umgebenden Rahmens
const long nOld = lLogicNullOffset;
lLogicNullOffset = pColumnItem?
pColumnItem->GetLeft(): pULSpaceItem->GetUpper();
if(bAppSetNullOffset)
lAppNullOffset += lLogicNullOffset - nOld;
if(!bAppSetNullOffset || lAppNullOffset == LONG_MAX) {
Ruler::SetNullOffset(ConvertVPosPixel(lLogicNullOffset));
lAppNullOffset = 0;
SetMargin1( 0, nMarginStyle );
}
else
SetMargin1( ConvertVPosPixel( lAppNullOffset ),nMarginStyle );
long lLower = pColumnItem ?
pColumnItem->GetRight() : pULSpaceItem->GetLower();
SetMargin2(ConvertVPosPixel(pPagePosItem->GetHeight() - lLower -
lLogicNullOffset + lAppNullOffset),
nMarginStyle );
}
else
{
// schaltet die Anzeige aus
SetMargin1();
SetMargin2();
}
if(pColumnItem)
{
pRuler_Imp->nColLeftPix = (sal_uInt16) ConvertSizePixel(pColumnItem->GetLeft());
pRuler_Imp->nColRightPix = (sal_uInt16) ConvertSizePixel(pColumnItem->GetRight());
}
}
void SvxRuler::MouseMove( const MouseEvent& rMEvt )
{
if( bActive )
{
pBindings->Update( SID_RULER_LR_MIN_MAX );
pBindings->Update( SID_ATTR_LONG_ULSPACE );
pBindings->Update( SID_ATTR_LONG_LRSPACE );
pBindings->Update( SID_RULER_PAGE_POS );
pBindings->Update( bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL);
pBindings->Update( bHorz ? SID_ATTR_PARA_LRSPACE : SID_ATTR_PARA_LRSPACE_VERTICAL);
pBindings->Update( bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL);
pBindings->Update( bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL);
pBindings->Update( SID_RULER_OBJECT );
pBindings->Update( SID_RULER_PROTECT );
}
Ruler::MouseMove( rMEvt );
}
void SvxRuler::StartListening_Impl()
{
if(!bListening)
{
bValid = sal_False;
StartListening(*pBindings);
bListening = sal_True;
}
}
void SvxRuler::UpdateFrame
(
const SvxLongLRSpaceItem *pItem // neuer Wert LRSpace
)
/*
[Beschreibung]
Neuen Wert fuer LRSpace merken; alten gfs. loeschen
*/
{
if(bActive)
{
delete pLRSpaceItem; pLRSpaceItem = 0;
if(pItem)
pLRSpaceItem = new SvxLongLRSpaceItem(*pItem);
StartListening_Impl();
}
}
void SvxRuler::UpdateFrameMinMax
(
const SfxRectangleItem *pItem // Werte fuer MinMax
)
/*
[Beschreibung]
Neuen Wert fuer MinMax setzen; alten gfs. loeschen
*/
{
if(bActive)
{
delete pMinMaxItem; pMinMaxItem = 0;
if(pItem)
pMinMaxItem = new SfxRectangleItem(*pItem);
}
}
void SvxRuler::UpdateFrame
(
const SvxLongULSpaceItem *pItem // neuer Wert
)
/*
[Beschreibung]
Rechten / unteren Rand aktualisieren
*/
{
if(bActive && !bHorz)
{
delete pULSpaceItem; pULSpaceItem = 0;
if(pItem)
pULSpaceItem = new SvxLongULSpaceItem(*pItem);
StartListening_Impl();
}
}
void SvxRuler::Update( const SvxProtectItem* pItem )
{
if( pItem ) pRuler_Imp->aProtectItem = *pItem;
}
/* -----------------------------22.08.2002 13:10------------------------------
---------------------------------------------------------------------------*/
void SvxRuler::UpdateTextRTL(const SfxBoolItem* pItem)
{
if(bActive && bHorz)
{
delete pRuler_Imp->pTextRTLItem; pRuler_Imp->pTextRTLItem = 0;
if(pItem)
pRuler_Imp->pTextRTLItem = new SfxBoolItem(*pItem);
SetTextRTL(pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue());
StartListening_Impl();
}
}
void SvxRuler::Update
(
const SvxColumnItem *pItem, // neuer Wert
sal_uInt16 nSID //Slot Id to identify NULL items
)
/*
[Beschreibung]
Neuen Wert fuer Spaltendarstellung setzen
*/
{
if(bActive)
{
if(pItem)
{
delete pColumnItem; pColumnItem = 0;
pRuler_Imp->bIsTableRows = (pItem->Which() == SID_RULER_ROWS || pItem->Which() == SID_RULER_ROWS_VERTICAL);
pColumnItem = new SvxColumnItem(*pItem);
if(!bHorz && !pRuler_Imp->bIsTableRows)
pColumnItem->SetWhich(SID_RULER_BORDERS_VERTICAL);
}
else if(pColumnItem && pColumnItem->Which() == nSID)
//there are two groups of column items table/frame columns and table rows
//both can occur in vertical or horizontal mode
//the horizontal ruler handles the SID_RULER_BORDERS and SID_RULER_ROWS_VERTICAL
//and the vertical handles SID_RULER_BORDERS_VERTICAL and SID_RULER_ROWS
//if pColumnItem is already set with one of the ids then a NULL pItem argument
//must not delete it
{
delete pColumnItem; pColumnItem = 0;
pRuler_Imp->bIsTableRows = sal_False;
}
StartListening_Impl();
}
}
void SvxRuler::UpdateColumns()
/*
[Beschreibung]
Anzeige der Spaltendarstellung aktualisieren
*/
{
if(pColumnItem && pColumnItem->Count() > 1)
{
if( nBorderCount < pColumnItem->Count())
{
delete[] pBorders;
nBorderCount = pColumnItem->Count();
pBorders = new RulerBorder[nBorderCount];
}
sal_uInt16 _nFlags = RULER_BORDER_VARIABLE;
sal_Bool bProtectColumns =
pRuler_Imp->aProtectItem.IsSizeProtected() ||
pRuler_Imp->aProtectItem.IsPosProtected();
if( !bProtectColumns )
_nFlags |= RULER_BORDER_MOVEABLE;
if( pColumnItem->IsTable() )
_nFlags |= RULER_BORDER_TABLE;
else
if ( !bProtectColumns )
_nFlags |= RULER_BORDER_SIZEABLE;
sal_uInt16 nBorders = pColumnItem->Count();
if(!pRuler_Imp->bIsTableRows)
--nBorders;
for(sal_uInt16 i = 0; i < nBorders; ++i)
{
pBorders[i].nStyle = _nFlags;
if(!(*pColumnItem)[i].bVisible)
pBorders[i].nStyle |= RULER_STYLE_INVISIBLE;
pBorders[i].nPos =
ConvertPosPixel((*pColumnItem)[i].nEnd + lAppNullOffset);
if(pColumnItem->Count() == i + 1)
{
//with table rows the end of the table is contained in the
//column item but it has no width!
pBorders[i].nWidth = 0;
}
else
{
pBorders[i].nWidth =
ConvertSizePixel((*pColumnItem)[i+1].nStart -
(*pColumnItem)[i].nEnd);
}
pBorders[i].nMinPos =
ConvertPosPixel((*pColumnItem)[i].nEndMin + lAppNullOffset);
pBorders[i].nMaxPos =
ConvertPosPixel((*pColumnItem)[i].nEndMax + lAppNullOffset);
}
SetBorders(pColumnItem->Count()-1, pBorders);
}
else
{
SetBorders();
}
}
void SvxRuler::UpdateObject()
/*
[Beschreibung]
Anzeige der Objektdarstellung aktualisieren
*/
{
if(pObjectItem)
{
DBG_ASSERT(pObjectBorders, "kein Buffer");
// !! zum Seitenrand
long nMargin = pLRSpaceItem? pLRSpaceItem->GetLeft(): 0;
pObjectBorders[0].nPos =
ConvertPosPixel(pObjectItem->GetStartX() -
nMargin + lAppNullOffset);
pObjectBorders[1].nPos =
ConvertPosPixel(pObjectItem->GetEndX() - nMargin + lAppNullOffset);
nMargin = pULSpaceItem? pULSpaceItem->GetUpper(): 0;
pObjectBorders[2].nPos =
ConvertPosPixel(pObjectItem->GetStartY() -
nMargin + lAppNullOffset);
pObjectBorders[3].nPos =
ConvertPosPixel(pObjectItem->GetEndY() - nMargin + lAppNullOffset);
const sal_uInt16 nOff = GetObjectBordersOff(0);
SetBorders(2, pObjectBorders + nOff);
}
else
{
SetBorders();
}
}
void SvxRuler::UpdatePara()
/*
[Beschreibung]
Anzeige der Absatzeinzuege aktualisieren:
Linken Rand, Erstzeileneinzug, rechten Rand Absatz aktualisieren
pIndents[0] = Buffer fuer alten Einzug
pIndents[1] = Buffer fuer alten Einzug
pIndents[INDENT_FIRST_LINE] = Erstzeileneinzug
pIndents[3] = linker Rand
pIndents[4] = rechter Rand
pIndents[5] = left border distance
pIndents[6] = right border distance
*/
{
// Abhaengigkeit zu PagePosItem
if(pParaItem && pPagePosItem && !pObjectItem)
{
sal_Bool bRTLText = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
// Erstzeileneinzug, ist negativ zum linken Absatzrand
long nLeftFrameMargin = GetLeftFrameMargin();
long nRightFrameMargin = GetRightFrameMargin();
if(bRTLText)
pIndents[INDENT_FIRST_LINE].nPos =
ConvertHPosPixel(
nRightFrameMargin -
pParaItem->GetTxtLeft() -
pParaItem->GetTxtFirstLineOfst() + lAppNullOffset );
else
pIndents[INDENT_FIRST_LINE].nPos =
ConvertHPosPixel(
nLeftFrameMargin +
pParaItem->GetTxtLeft() +
pParaItem->GetTxtFirstLineOfst() +
lAppNullOffset);
if( pParaItem->IsAutoFirst() )
pIndents[INDENT_FIRST_LINE].nStyle |= RULER_STYLE_INVISIBLE;
else
pIndents[INDENT_FIRST_LINE].nStyle &= ~RULER_STYLE_INVISIBLE;
if(bRTLText)
{
// left margin
pIndents[INDENT_LEFT_MARGIN].nPos =
ConvertHPosPixel(
nRightFrameMargin -
pParaItem->GetTxtLeft() + lAppNullOffset);
// right margin
pIndents[INDENT_RIGHT_MARGIN].nPos =
ConvertHPosPixel(
nLeftFrameMargin +
pParaItem->GetRight() + lAppNullOffset);
}
else
{
// linker Rand
pIndents[INDENT_LEFT_MARGIN].nPos =
ConvertHPosPixel(
nLeftFrameMargin +
pParaItem->GetTxtLeft() + lAppNullOffset);
// rechter Rand, immer negativ zum rechten Rand des umgebenden Frames
pIndents[INDENT_RIGHT_MARGIN].nPos =
ConvertHPosPixel(
nRightFrameMargin -
pParaItem->GetRight() + lAppNullOffset);
}
if(pParaBorderItem)
{
pIndents[INDENT_LEFT_BORDER].nPos =
ConvertHPosPixel( nLeftFrameMargin + lAppNullOffset);
pIndents[INDENT_RIGHT_BORDER].nPos =
ConvertHPosPixel(nRightFrameMargin - lAppNullOffset);
pIndents[INDENT_LEFT_BORDER].nStyle = pIndents[INDENT_RIGHT_BORDER].nStyle &= ~RULER_STYLE_INVISIBLE;
}
else
pIndents[INDENT_LEFT_BORDER].nStyle = pIndents[INDENT_RIGHT_BORDER].nStyle |= RULER_STYLE_INVISIBLE;
SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
}
else
{
if(pIndents)
{
pIndents[INDENT_FIRST_LINE].nPos =
pIndents[INDENT_LEFT_MARGIN].nPos =
pIndents[INDENT_RIGHT_MARGIN].nPos = 0;
}
SetIndents(); // ausschalten
}
}
void SvxRuler::UpdatePara
(
const SvxLRSpaceItem *pItem // neuer Wert Absatzeinzuege
)
/*
[Beschreibung]
Neuen Wert Absatzeinzuege merken
*/
{
if(bActive)
{
delete pParaItem; pParaItem = 0;
if(pItem)
pParaItem = new SvxLRSpaceItem(*pItem);
StartListening_Impl();
}
}
void SvxRuler::UpdateParaBorder(const SvxLRSpaceItem * pItem )
/*
[Description]
Border distance
*/
{
if(bActive)
{
delete pParaBorderItem; pParaBorderItem = 0;
if(pItem)
pParaBorderItem = new SvxLRSpaceItem(*pItem);
StartListening_Impl();
}
}
void SvxRuler::UpdatePage()
/*
[Beschreibung]
Anzeige von Postion und Breite der Seite aktualisieren
*/
{
if(pPagePosItem)
{
// alle Objekte werden automatisch angepasst
if(bHorz)
SetPagePos(
pEditWin->LogicToPixel(pPagePosItem->GetPos()).X(),
pEditWin->LogicToPixel(Size(pPagePosItem->GetWidth(),0)).
Width());
else
SetPagePos(
pEditWin->LogicToPixel(pPagePosItem->GetPos()).Y(),
pEditWin->LogicToPixel(Size(0, pPagePosItem->GetHeight())).
Height());
if(bAppSetNullOffset)
SetNullOffset(ConvertSizePixel(-lAppNullOffset + lLogicNullOffset));
}
else
SetPagePos();
long lPos = 0;
Point aOwnPos = GetPosPixel();
Point aEdtWinPos = pEditWin->GetPosPixel();
if( Application::GetSettings().GetLayoutRTL() && bHorz )
{
//#i73321# in RTL the window and the ruler is not mirrored but the
// influence of the vertical ruler is inverted
Size aOwnSize = GetSizePixel();
Size aEdtWinSize = pEditWin->GetSizePixel();
lPos = aOwnSize.Width() - aEdtWinSize.Width();
lPos -= (aEdtWinPos - aOwnPos).X();
}
else
{
Point aPos(aEdtWinPos - aOwnPos);
lPos= bHorz ? aPos.X() : aPos.Y();
}
// Leider bekommen wir den Offset des Editfensters zum Lineal nie
// per Statusmeldung. Also setzen wir ihn selbst, wenn noetig.
if(lPos!=pRuler_Imp->lOldWinPos)
{
pRuler_Imp->lOldWinPos=lPos;
SetWinPos(lPos);
}
}
void SvxRuler::Update
(
const SvxPagePosSizeItem *pItem // neuer Wert Seitenattribute
)
/*
[Beschreibung]
Neuen Wert Seitenattribute merken
*/
{
if(bActive)
{
delete pPagePosItem; pPagePosItem = 0;
if(pItem)
pPagePosItem = new SvxPagePosSizeItem(*pItem);
StartListening_Impl();
}
}
//
void SvxRuler::SetDefTabDist
(
long l // Neuer Abstand fuer DefaultTabs in App-Metrik
)
/*
[Beschreibung]
Neuer Abstand fuer DefaultTabs wird gesetzt
*/
{
lDefTabDist = l;
UpdateTabs();
}
long SvxRuler::GetDefTabDist() const
/*
[Beschreibung]
Wert fuer DefaultTabs erfragen (wird in App.-Methik geliefert)
*/
{
return lDefTabDist;
}
sal_uInt16 ToSvTab_Impl(SvxTabAdjust eAdj)
/*
[Beschreibung]
Interne Konvertierungsroutinen zwischen SV-Tab.-Enum und Svx
*/
{
switch(eAdj) {
case SVX_TAB_ADJUST_LEFT: return RULER_TAB_LEFT;
case SVX_TAB_ADJUST_RIGHT: return RULER_TAB_RIGHT;
case SVX_TAB_ADJUST_DECIMAL: return RULER_TAB_DECIMAL;
case SVX_TAB_ADJUST_CENTER: return RULER_TAB_CENTER;
case SVX_TAB_ADJUST_DEFAULT: return RULER_TAB_DEFAULT;
default: ;//prevent warning
}
return 0;
}
SvxTabAdjust ToAttrTab_Impl(sal_uInt16 eAdj)
{
switch(eAdj) {
case RULER_TAB_LEFT: return SVX_TAB_ADJUST_LEFT ;
case RULER_TAB_RIGHT: return SVX_TAB_ADJUST_RIGHT ;
case RULER_TAB_DECIMAL: return SVX_TAB_ADJUST_DECIMAL ;
case RULER_TAB_CENTER: return SVX_TAB_ADJUST_CENTER ;
case RULER_TAB_DEFAULT: return SVX_TAB_ADJUST_DEFAULT ;
}
return SVX_TAB_ADJUST_LEFT;
}
void SvxRuler::UpdateTabs()
/*
[Beschreibung]
Anzeige der Tabulatoren
*/
{
if(IsDrag())
return;
if(pPagePosItem && pParaItem && pTabStopItem && !pObjectItem)
{
// Puffer fuer DefaultTabStop
// Abstand letzter Tab <-> Rechter Absatzrand / DefaultTabDist
sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
long nLeftFrameMargin = GetLeftFrameMargin();
long nRightFrameMargin = GetRightFrameMargin();
//#i24363# tab stops relative to indent
const long nParaItemTxtLeft = pParaItem->GetTxtLeft();
const long lParaIndent = nLeftFrameMargin + nParaItemTxtLeft;
const long lLastTab =
pTabStopItem->Count()?
ConvertHPosPixel((*pTabStopItem)[pTabStopItem->Count()-1].GetTabPos()): 0;
const long lPosPixel =
ConvertHPosPixel(lParaIndent) + lLastTab;
const long lRightIndent =
ConvertHPosPixel(nRightFrameMargin - pParaItem->GetRight());
long nDefTabDist = ConvertHPosPixel(lDefTabDist);
if( !nDefTabDist )
nDefTabDist = 1;
const sal_uInt16 nDefTabBuf = lPosPixel > lRightIndent ||
lLastTab > lRightIndent
? 0
: (sal_uInt16)( (lRightIndent - lPosPixel) / nDefTabDist );
if(pTabStopItem->Count() + TAB_GAP + nDefTabBuf > nTabBufSize)
{
delete[] pTabs;
// 10 (GAP) auf Vorrat
nTabBufSize = pTabStopItem->Count() + TAB_GAP + nDefTabBuf + GAP;
pTabs = new RulerTab[nTabBufSize];
}
nTabCount = 0;
sal_uInt16 j;
//#i24363# tab stops relative to indent
const long lRightPixMargin = ConvertSizePixel(nRightFrameMargin - nParaItemTxtLeft );
const long lParaIndentPix = ConvertSizePixel(lParaIndent);
for(j = 0; j < pTabStopItem->Count(); ++j)
{
const SvxTabStop *pTab = &(*pTabStopItem)[j];
pTabs[nTabCount+TAB_GAP].nPos =
ConvertHPosPixel(
(pRuler_Imp->bIsTabsRelativeToIndent ? lParaIndent : 0 ) + pTab->GetTabPos() + lAppNullOffset);
if(bRTL)
{
pTabs[nTabCount+TAB_GAP].nPos = lParaIndentPix + lRightPixMargin - pTabs[nTabCount+TAB_GAP].nPos;
}
pTabs[nTabCount+TAB_GAP].nStyle = ToSvTab_Impl(pTab->GetAdjustment());
++nTabCount;
}
if(!pTabStopItem->Count())
pTabs[0].nPos = bRTL ? lRightPixMargin : lParaIndentPix;
// Rest mit Default-Tabs fuellen
if(bRTL)
{
for(j = 0; j < nDefTabBuf; ++j)
{
pTabs[nTabCount + TAB_GAP].nPos =
pTabs[nTabCount].nPos - nDefTabDist;
if(j == 0 )
pTabs[nTabCount + TAB_GAP].nPos -=
((pTabs[nTabCount + TAB_GAP].nPos - lRightPixMargin)
% nDefTabDist );
if(pTabs[nTabCount+TAB_GAP].nPos <= lParaIndentPix)
break;
pTabs[nTabCount + TAB_GAP].nStyle = RULER_TAB_DEFAULT;
++nTabCount;
}
}
else
{
for(j = 0; j < nDefTabBuf; ++j)
{
if( j == 0 )
{
//set the first default tab stop
if(pRuler_Imp->bIsTabsRelativeToIndent)
{
pTabs[nTabCount + TAB_GAP].nPos =
(pTabs[nTabCount].nPos + nDefTabDist);
pTabs[nTabCount + TAB_GAP].nPos -=
((pTabs[nTabCount + TAB_GAP].nPos - lParaIndentPix)
% nDefTabDist );
}
else
{
if( pTabs[nTabCount].nPos < 0 )
{
pTabs[nTabCount + TAB_GAP].nPos = ( pTabs[nTabCount].nPos / nDefTabDist ) * nDefTabDist;
}
else
{
pTabs[nTabCount + TAB_GAP].nPos = ( pTabs[nTabCount].nPos / nDefTabDist + 1 ) * nDefTabDist;
}
}
}
else
{
//simply add the default distance to the last position
pTabs[nTabCount + TAB_GAP].nPos =
pTabs[nTabCount].nPos + nDefTabDist;
}
if(pTabs[nTabCount+TAB_GAP].nPos >= lRightIndent)
break;
pTabs[nTabCount + TAB_GAP].nStyle = RULER_TAB_DEFAULT;
++nTabCount;
}
}
SetTabs(nTabCount, pTabs+TAB_GAP);
DBG_ASSERT(nTabCount + TAB_GAP <= nTabBufSize, "BufferSize zu klein");
}
else
{
SetTabs();
}
}
void SvxRuler::Update
(
const SvxTabStopItem *pItem // Neuer Wert fuer Tabulatoren
)
/*
[Beschreibung]
Neuen Wert fuer Tabulatoren merken; alten gfs. loeschen
*/
{
if(bActive)
{
delete pTabStopItem; pTabStopItem = 0;
if(pItem)
{
pTabStopItem = new SvxTabStopItem(*pItem);
if(!bHorz)
pTabStopItem->SetWhich(SID_ATTR_TABSTOP_VERTICAL);
}
StartListening_Impl();
}
}
void SvxRuler::Update
(
const SvxObjectItem *pItem // Neuer Wert fuer Objekte
)
/*
[Beschreibung]
Neuen Wert fuer Objekte merken
*/
{
if(bActive)
{
delete pObjectItem; pObjectItem = 0;
if(pItem)
pObjectItem = new SvxObjectItem(*pItem);
StartListening_Impl();
}
}
void SvxRuler::SetNullOffsetLogic
(
long lVal // Setzen des logischen NullOffsets
)
{
lAppNullOffset = lLogicNullOffset - lVal;
bAppSetNullOffset = sal_True;
Ruler::SetNullOffset(ConvertSizePixel(lVal));
Update();
}
void SvxRuler::Update()
/*
[Beschreibung]
Aktualisierung der Anzeige anstossen
*/
{
if(IsDrag())
return;
UpdatePage();
UpdateFrame();
if((nFlags & SVXRULER_SUPPORT_OBJECT) == SVXRULER_SUPPORT_OBJECT)
UpdateObject();
else
UpdateColumns();
if(0 != (nFlags & (SVXRULER_SUPPORT_PARAGRAPH_MARGINS |SVXRULER_SUPPORT_PARAGRAPH_MARGINS_VERTICAL)))
UpdatePara();
if(0 != (nFlags & SVXRULER_SUPPORT_TABS))
UpdateTabs();
}
inline long SvxRuler::GetPageWidth() const
{
return bHorz ? pPagePosItem->GetWidth() : pPagePosItem->GetHeight();
}
inline long SvxRuler::GetFrameLeft() const
/*
[Beschreibung]
Erfragen des linken Randes in Pixeln
*/
{
return bAppSetNullOffset?
GetMargin1() + ConvertSizePixel(lLogicNullOffset):
Ruler::GetNullOffset();
}
inline void SvxRuler::SetFrameLeft(long l)
/*
[Beschreibung]
Setzen des linken Randes in Pixeln
*/
{
sal_Bool bProtectColumns =
pRuler_Imp->aProtectItem.IsSizeProtected() ||
pRuler_Imp->aProtectItem.IsPosProtected();
if(bAppSetNullOffset)
SetMargin1(l - ConvertSizePixel(lLogicNullOffset),
bProtectColumns ? 0 : RULER_MARGIN_SIZEABLE);
else
Ruler::SetNullOffset(l);
}
long SvxRuler::GetFirstLineIndent() const
/*
[Beschreibung]
Erstzeileneinzug in Pixels erfragen
*/
{
return pParaItem? pIndents[INDENT_FIRST_LINE].nPos: GetMargin1();
}
long SvxRuler::GetLeftIndent() const
/*
[Beschreibung]
Linken Absatzrand in Pixels erfragen
*/
{
return pParaItem? pIndents[INDENT_LEFT_MARGIN].nPos: GetMargin1();
}
long SvxRuler::GetRightIndent() const
/*
[Beschreibung]
Rechten Absatzrand in Pixels erfragen
*/
{
return pParaItem? pIndents[INDENT_RIGHT_MARGIN].nPos: GetMargin2();
}
long SvxRuler::GetLogicRightIndent() const
/*
[Beschreibung]
Rechten Absatzrand in Logic erfragen
*/
{
return pParaItem ? GetRightFrameMargin()-pParaItem->GetRight() : GetRightFrameMargin();
}
// linker Rand in App-Werten; ist entweder der Seitenrand (=0)
// oder der linke Rand der Spalte, die im Spaltenattribut als
// altuelle Spalte eingestellt ist.
long SvxRuler::GetLeftFrameMargin() const
{
// #126721# for some unknown reason the current column is set to 0xffff
DBG_ASSERT(!pColumnItem || pColumnItem->GetActColumn() < pColumnItem->Count(),
"issue #126721# - invalid current column!");
long nLeft =
pColumnItem && pColumnItem->Count() && pColumnItem->GetActColumn() < pColumnItem->Count() ?
(*pColumnItem)[pColumnItem->GetActColumn()].nStart : 0;
if(pParaBorderItem && (!pColumnItem || pColumnItem->IsTable()))
nLeft += pParaBorderItem->GetLeft();
return nLeft;
}
inline long SvxRuler::GetLeftMin() const
{
DBG_ASSERT(pMinMaxItem, "kein MinMax-Wert gesetzt");
return pMinMaxItem?
bHorz? pMinMaxItem->GetValue().Left(): pMinMaxItem->GetValue().Top()
: 0;
}
inline long SvxRuler::GetRightMax() const
{
DBG_ASSERT(pMinMaxItem, "kein MinMax-Wert gesetzt");
return pMinMaxItem?
bHorz? pMinMaxItem->GetValue().Right(): pMinMaxItem->GetValue().Bottom()
: 0;
}
long SvxRuler::GetRightFrameMargin() const
/*
[Beschreibung]
Rechten umgebenden Rand erfragen (in logischen Einheiten)
*/
{
if(pColumnItem)
{
if(!IsActLastColumn( sal_True ))
{
long nRet = (*pColumnItem)[GetActRightColumn( sal_True )].nEnd;
if(pColumnItem->IsTable() && pParaBorderItem)
nRet -= pParaBorderItem->GetRight();
return nRet;
}
}
long l = lLogicNullOffset;
// gfs. rechten Tabelleneinzug abziehen
if(pColumnItem && pColumnItem->IsTable())
l += pColumnItem->GetRight();
else if(bHorz && pLRSpaceItem)
l += pLRSpaceItem->GetRight();
else if(!bHorz && pULSpaceItem)
l += pULSpaceItem->GetLower();
if(pParaBorderItem &&
(!pColumnItem || pColumnItem->IsTable()||IsActLastColumn( sal_True )))
l += pParaBorderItem->GetRight();
if(bHorz)
l = pPagePosItem->GetWidth() - l;
else
l = pPagePosItem->GetHeight() - l;
return l;
}
#define NEG_FLAG ( (nFlags & SVXRULER_SUPPORT_NEGATIVE_MARGINS) == \
SVXRULER_SUPPORT_NEGATIVE_MARGINS )
#define TAB_FLAG ( pColumnItem && pColumnItem->IsTable() )
long SvxRuler::GetCorrectedDragPos( sal_Bool bLeft, sal_Bool bRight )
/*
[Beschreibung]
Korrigiert die Position innerhalb der errechneten Grenzwerte.
Die Grenzwerte sind in Pixel relativ zum Seitenrand.
*/
{
const long lNullPix = Ruler::GetNullOffset();
long lDragPos = GetDragPos() + lNullPix;
ADD_DEBUG_TEXT("lDragPos: ", String::CreateFromInt32(lDragPos))
sal_Bool bHoriRows = bHorz && pRuler_Imp->bIsTableRows;
if((bLeft || (bHoriRows)) && lDragPos < nMaxLeft)
lDragPos = nMaxLeft;
else if((bRight||bHoriRows) && lDragPos > nMaxRight)
lDragPos = nMaxRight;
return lDragPos - lNullPix;
}
void ModifyTabs_Impl
(
sal_uInt16 nCount, // Anzahl Tabs
RulerTab *pTabs, // Tab-Puffer
long lDiff // zu addierende Differenz
)
/*
[Beschreibung]
Hilfsroutine; alle Tabs um einen festen Wert verschieben
*/
{
if( pTabs )
for(sal_uInt16 i = 0; i < nCount; ++i) pTabs[i].nPos += lDiff;
}
void SvxRuler::DragMargin1()
/*
[Beschreibung]
Draggen des linken Frame-Randes
*/
{
const long lDragPos = GetCorrectedDragPos( !TAB_FLAG || !NEG_FLAG, sal_True );
DrawLine_Impl(lTabPos, ( TAB_FLAG && NEG_FLAG ) ? 3 : 7, bHorz);
if(pColumnItem&&
(//nDragType & DRAG_OBJECT_SIZE_LINEAR ||
nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL))
DragBorders();
AdjustMargin1(lDragPos);
}
void SvxRuler::AdjustMargin1(long lDiff)
{
const long nOld = bAppSetNullOffset? GetMargin1(): GetNullOffset();
const long lDragPos = lDiff;
sal_Bool bProtectColumns =
pRuler_Imp->aProtectItem.IsSizeProtected() ||
pRuler_Imp->aProtectItem.IsPosProtected();
const sal_uInt16 nMarginStyle =
bProtectColumns ? 0 : RULER_MARGIN_SIZEABLE;
if(!bAppSetNullOffset)
{
long _lDiff = lDragPos;
SetNullOffset(nOld + _lDiff);
if(!pColumnItem||!(nDragType & DRAG_OBJECT_SIZE_LINEAR))
{
SetMargin2( GetMargin2() - _lDiff, nMarginStyle );
if(!pColumnItem && !pObjectItem && pParaItem)
{
// Rechten Einzug an alter Position
pIndents[INDENT_RIGHT_MARGIN].nPos -= _lDiff;
SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
}
if(pObjectItem)
{
pObjectBorders[GetObjectBordersOff(0)].nPos -= _lDiff;
pObjectBorders[GetObjectBordersOff(1)].nPos -= _lDiff;
SetBorders(2, pObjectBorders + GetObjectBordersOff(0));
}
if(pColumnItem)
{
for(sal_uInt16 i = 0; i < pColumnItem->Count()-1; ++i)
pBorders[i].nPos -= _lDiff;
SetBorders(pColumnItem->Count()-1, pBorders);
if(pColumnItem->IsFirstAct())
{
// Rechten Einzug an alter Position
if(pParaItem)
{
pIndents[INDENT_RIGHT_MARGIN].nPos -= _lDiff;
SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
}
}
else
{
if(pParaItem)
{
pIndents[INDENT_FIRST_LINE].nPos -= _lDiff;
pIndents[INDENT_LEFT_MARGIN].nPos -= _lDiff;
pIndents[INDENT_RIGHT_MARGIN].nPos -= _lDiff;
SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
}
}
if(pTabStopItem&& (nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
&&!IsActFirstColumn())
{
ModifyTabs_Impl(nTabCount+TAB_GAP, pTabs, -_lDiff);
SetTabs(nTabCount, pTabs+TAB_GAP);
}
}
}
}
else
{
long _lDiff = lDragPos - nOld;
SetMargin1(nOld + _lDiff, nMarginStyle );
if(!pColumnItem||!(nDragType & (DRAG_OBJECT_SIZE_LINEAR |
DRAG_OBJECT_SIZE_PROPORTIONAL)))
{
if(!pColumnItem && !pObjectItem && pParaItem)
{
// Linke Einzuege an alter Position
pIndents[INDENT_FIRST_LINE].nPos += _lDiff;
pIndents[INDENT_LEFT_MARGIN].nPos += _lDiff;
SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
}
if(pColumnItem)
{
for(sal_uInt16 i = 0; i < pColumnItem->Count()-1; ++i)
pBorders[i].nPos += _lDiff;
SetBorders(pColumnItem->Count()-1, pBorders);
if(pColumnItem->IsFirstAct())
{
// Linke Einzuege an alter Position
if(pParaItem)
{
pIndents[INDENT_FIRST_LINE].nPos += _lDiff;
pIndents[INDENT_LEFT_MARGIN].nPos += _lDiff;
SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
}
}
else
{
if(pParaItem)
{
pIndents[INDENT_FIRST_LINE].nPos += _lDiff;
pIndents[INDENT_LEFT_MARGIN].nPos += _lDiff;
pIndents[INDENT_RIGHT_MARGIN].nPos += _lDiff;
SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
}
}
}
if(pTabStopItem)
{
ModifyTabs_Impl(nTabCount+TAB_GAP, pTabs, _lDiff);
SetTabs(nTabCount, pTabs+TAB_GAP);
}
}
}
}
void SvxRuler::DragMargin2()
/*
[Beschreibung]
Draggen des rechten Frame-Randes
*/
{
const long lDragPos = GetCorrectedDragPos( sal_True, !TAB_FLAG || !NEG_FLAG);
DrawLine_Impl(lTabPos, ( TAB_FLAG && NEG_FLAG ) ? 5 : 7, bHorz);
long lDiff = lDragPos - GetMargin2();
if(pRuler_Imp->bIsTableRows && !bHorz && pColumnItem&&
(//nDragType & DRAG_OBJECT_SIZE_LINEAR ||
nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL))
DragBorders();
sal_Bool bProtectColumns =
pRuler_Imp->aProtectItem.IsSizeProtected() ||
pRuler_Imp->aProtectItem.IsPosProtected();
const sal_uInt16 nMarginStyle =
bProtectColumns ? 0 : RULER_MARGIN_SIZEABLE;
SetMargin2( lDragPos, nMarginStyle );
// Rechten Einzug an alter Position
if((!pColumnItem || IsActLastColumn()) && pParaItem)
{
pIndents[INDENT_FIRST_LINE].nPos += lDiff;
SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
}
}
void SvxRuler::DragIndents()
/*
[Beschreibung]
Draggen der Absatzeinzuege
*/
{
const long lDragPos = NEG_FLAG ? GetDragPos() : GetCorrectedDragPos();
const sal_uInt16 nIdx = GetDragAryPos()+INDENT_GAP;
const long lDiff = pIndents[nIdx].nPos - lDragPos;
if((nIdx == INDENT_FIRST_LINE ||
nIdx == INDENT_LEFT_MARGIN ) &&
(nDragType & DRAG_OBJECT_LEFT_INDENT_ONLY) !=
DRAG_OBJECT_LEFT_INDENT_ONLY)
pIndents[INDENT_FIRST_LINE].nPos -= lDiff;
pIndents[nIdx].nPos = lDragPos;
SetIndents(INDENT_COUNT, pIndents + INDENT_GAP);
DrawLine_Impl(lTabPos, 1, bHorz);
}
void SvxRuler::DrawLine_Impl(long &_lTabPos, int nNew, sal_Bool Hori)
/*
[Beschreibung]
Ausgaberoutine fuer Hilfslinie beim Vereschieben von Tabs, Tabellen-
und anderen Spalten
*/
{
if(Hori)
{
const long nHeight = pEditWin->GetOutputSize().Height();
Point aZero=pEditWin->GetMapMode().GetOrigin();
if(_lTabPos!=-1)
pEditWin->InvertTracking(
Rectangle( Point(_lTabPos, -aZero.Y()),
Point(_lTabPos, -aZero.Y()+nHeight)),
SHOWTRACK_SPLIT | SHOWTRACK_CLIP );
if( nNew & 1 )
{
_lTabPos = ConvertHSizeLogic(
GetCorrectedDragPos( ( nNew&4 ) != 0, ( nNew&2 ) != 0 ) +
GetNullOffset() );
if(pPagePosItem)
_lTabPos += pPagePosItem->GetPos().X();
pEditWin->InvertTracking(
Rectangle(Point(_lTabPos, -aZero.Y()),
Point(_lTabPos, -aZero.Y()+nHeight)),
SHOWTRACK_CLIP | SHOWTRACK_SPLIT );
}
}
else
{
const long nWidth = pEditWin->GetOutputSize().Width();
Point aZero=pEditWin->GetMapMode().GetOrigin();
if(_lTabPos != -1)
{
pEditWin->InvertTracking(
Rectangle( Point(-aZero.X(), _lTabPos),
Point(-aZero.X()+nWidth, _lTabPos)),
SHOWTRACK_SPLIT | SHOWTRACK_CLIP );
}
if(nNew & 1)
{
_lTabPos = ConvertVSizeLogic(GetCorrectedDragPos()+GetNullOffset());
if(pPagePosItem)
_lTabPos += pPagePosItem->GetPos().Y();
pEditWin->InvertTracking(
Rectangle( Point(-aZero.X(), _lTabPos),
Point(-aZero.X()+nWidth, _lTabPos)),
SHOWTRACK_CLIP | SHOWTRACK_SPLIT );
}
}
}
void SvxRuler::DragTabs()
/*
[Beschreibung]
Draggen von Tabs
*/
{
long lDragPos = GetCorrectedDragPos(sal_True, sal_False);
sal_uInt16 nIdx = GetDragAryPos()+TAB_GAP;
DrawLine_Impl(lTabPos, 7, bHorz);
long nDiff = lDragPos - pTabs[nIdx].nPos;
if(nDragType & DRAG_OBJECT_SIZE_LINEAR)
{
for(sal_uInt16 i = nIdx; i < nTabCount; ++i)
{
pTabs[i].nPos += nDiff;
// auf Maximum begrenzen
if(pTabs[i].nPos > GetMargin2())
pTabs[nIdx].nStyle |= RULER_STYLE_INVISIBLE;
else
pTabs[nIdx].nStyle &= ~RULER_STYLE_INVISIBLE;
}
}
else if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
{
pRuler_Imp->nTotalDist -= nDiff;
pTabs[nIdx].nPos = lDragPos;
for(sal_uInt16 i = nIdx+1; i < nTabCount; ++i)
{
if(pTabs[i].nStyle & RULER_TAB_DEFAULT)
// bei den DefaultTabs kann abgebrochen werden
break;
long nDelta = pRuler_Imp->nTotalDist * pRuler_Imp->pPercBuf[i];
nDelta /= 1000;
pTabs[i].nPos = pTabs[nIdx].nPos + nDelta;
if(pTabs[i].nPos+GetNullOffset() > nMaxRight)
pTabs[i].nStyle |= RULER_STYLE_INVISIBLE;
else
pTabs[i].nStyle &= ~RULER_STYLE_INVISIBLE;
}
}
else
pTabs[nIdx].nPos = lDragPos;
if(IsDragDelete())
pTabs[nIdx].nStyle |= RULER_STYLE_INVISIBLE;
else
pTabs[nIdx].nStyle &= ~RULER_STYLE_INVISIBLE;
SetTabs(nTabCount, pTabs+TAB_GAP);
}
void SvxRuler::SetActive(sal_Bool bOn)
{
if(bOn)
{
Activate();
/* pBindings->Invalidate( SID_RULER_LR_MIN_MAX, sal_True, sal_True );
pBindings->Update( SID_RULER_LR_MIN_MAX );
pBindings->Invalidate( SID_ATTR_LONG_ULSPACE, sal_True, sal_True );
pBindings->Update( SID_ATTR_LONG_ULSPACE );
pBindings->Invalidate( SID_ATTR_LONG_LRSPACE, sal_True, sal_True );
pBindings->Update( SID_ATTR_LONG_LRSPACE );
pBindings->Invalidate( SID_RULER_PAGE_POS, sal_True, sal_True );
pBindings->Update( SID_RULER_PAGE_POS );
pBindings->Invalidate( SID_ATTR_TABSTOP, sal_True, sal_True );
pBindings->Update( SID_ATTR_TABSTOP );
pBindings->Invalidate( SID_ATTR_PARA_LRSPACE, sal_True, sal_True );
pBindings->Update( SID_ATTR_PARA_LRSPACE );
pBindings->Invalidate( SID_RULER_BORDERS, sal_True, sal_True );
pBindings->Update( SID_RULER_BORDERS );
pBindings->Invalidate( SID_RULER_OBJECT, sal_True, sal_True );
pBindings->Update( SID_RULER_OBJECT );
pBindings->Invalidate( SID_RULER_PROTECT, sal_True, sal_True );
pBindings->Update( SID_RULER_PROTECT );*/
}
else
Deactivate();
if(bActive!=bOn)
{
pBindings->EnterRegistrations();
if(bOn)
for(sal_uInt16 i=0;i<pRuler_Imp->nControlerItems;i++)
pCtrlItem[i]->ReBind();
else
for(sal_uInt16 j=0;j<pRuler_Imp->nControlerItems;j++)
pCtrlItem[j]->UnBind();
pBindings->LeaveRegistrations();
}
bActive = bOn;
}
void SvxRuler::UpdateParaContents_Impl
(
long l, // Differenz
UpdateType eType // Art (alle, links oder rechts)
)
/*
[Beschreibung]
Hilfsroutine; Mitfuehren von Tabulatoren und Absatzraendern
*/
{
switch(eType) {
case MOVE_RIGHT:
pIndents[INDENT_RIGHT_MARGIN].nPos += l;
break;
case MOVE_ALL:
pIndents[INDENT_RIGHT_MARGIN].nPos += l;
// no break
case MOVE_LEFT:
{
pIndents[INDENT_FIRST_LINE].nPos += l;
pIndents[INDENT_LEFT_MARGIN].nPos += l;
if ( pTabs )
{
for(sal_uInt16 i = 0; i < nTabCount+TAB_GAP;++i)
pTabs[i].nPos += l;
SetTabs(nTabCount, pTabs+TAB_GAP);
}
break;
}
}
SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
}
void SvxRuler::DragBorders()
/*
[Beschreibung]
Draggen von Borders (Tabellen- und anderen Spalten)
*/
{
sal_Bool bLeftIndentsCorrected = sal_False, bRightIndentsCorrected = sal_False;
int nIdx;
if(GetDragType()==RULER_TYPE_BORDER)
{
DrawLine_Impl(lTabPos, 7, bHorz);
nIdx = GetDragAryPos();
}
else
nIdx=0;
sal_uInt16 nDragSize = GetDragSize();
long lDiff = 0;
// the drag position has to be corrected to be able to prevent borders from passing each other
long lPos = GetCorrectedDragPos();
switch(nDragSize)
{
case RULER_DRAGSIZE_MOVE:
{
ADD_DEBUG_TEXT("lLastLMargin: ", String::CreateFromInt32(pRuler_Imp->lLastLMargin))
lDiff = GetDragType()==RULER_TYPE_BORDER ?
lPos-nDragOffset - pBorders[nIdx].nPos
: GetDragType() == RULER_TYPE_MARGIN1 ? lPos - pRuler_Imp->lLastLMargin : lPos - pRuler_Imp->lLastRMargin;
// pBorders[nIdx].nPos += lDiff;
// lDiff = pBorders[nIdx].nPos - nOld;
if(nDragType & DRAG_OBJECT_SIZE_LINEAR)
{
long nRight = GetMargin2()-lMinFrame; // rechter Begrenzer
for(int i = nBorderCount-2; i >= nIdx; --i)
{
long l = pBorders[i].nPos;
pBorders[i].nPos += lDiff;
pBorders[i].nPos = Min(pBorders[i].nPos, nRight - pBorders[i].nWidth);
nRight = pBorders[i].nPos - lMinFrame;
// RR der Spalte aktualisieren
if(i == GetActRightColumn())
{
UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_RIGHT);
bRightIndentsCorrected = sal_True;
}
// LAR, EZE der Spalte aktualisieren
else if(i == GetActLeftColumn())
{
UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_LEFT);
bLeftIndentsCorrected = sal_True;
}
}
}
else if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
{
int nLimit;
long lLeft;
int nStartLimit = nBorderCount-2;
switch(GetDragType())
{
default: ;//prevent warning
DBG_ERROR("svx::SvxRuler::DragBorders(), unknown drag type!" );
case RULER_TYPE_BORDER:
if(pRuler_Imp->bIsTableRows)
{
pBorders[nIdx].nPos += lDiff;
if(bHorz)
{
lLeft = pBorders[nIdx].nPos;
pRuler_Imp->nTotalDist -= lDiff;
nLimit=nIdx+1;
}
else
{
lLeft = 0;
nStartLimit = nIdx - 1;
pRuler_Imp->nTotalDist += lDiff;
nLimit = 0;
}
}
else
{
nLimit=nIdx+1;
pBorders[nIdx].nPos += lDiff;
lLeft = pBorders[nIdx].nPos;
pRuler_Imp->nTotalDist-=lDiff;
}
break;
case RULER_TYPE_MARGIN1:
nLimit=0;
lLeft=pRuler_Imp->lLastLMargin+lDiff;
pRuler_Imp->nTotalDist-=lDiff;
break;
case RULER_TYPE_MARGIN2:
nLimit = 0;
lLeft= 0;//pRuler_Imp->lLastRMargin + lDiff;
nStartLimit = nBorderCount - 2;
pRuler_Imp->nTotalDist += lDiff;
break;
}
for(int i = nStartLimit; i >= nLimit; --i)
{
long l = pBorders[i].nPos;
pBorders[i].nPos=lLeft+
(pRuler_Imp->nTotalDist*pRuler_Imp->pPercBuf[i])/1000+
pRuler_Imp->pBlockBuf[i];
// RR der Spalte aktualisieren
if(!pRuler_Imp->bIsTableRows)
{
if(i == GetActRightColumn())
{
UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_RIGHT);
bRightIndentsCorrected = sal_True;
}
// LAR, EZE der Spalte aktualisieren
else if(i == GetActLeftColumn())
{
UpdateParaContents_Impl(pBorders[i].nPos - l, MOVE_LEFT);
bLeftIndentsCorrected = sal_True;
}
}
}
if(pRuler_Imp->bIsTableRows)
{
//in vertical tables the left borders have to be moved
if(bHorz)
{
for(int i = 0; i < nIdx; ++i)
pBorders[i].nPos += lDiff;
AdjustMargin1(lDiff);
}
else
{
//otherwise the right borders are moved
for(int i = pColumnItem->Count() - 1; i > nIdx; --i)
pBorders[i].nPos += lDiff;
SetMargin2( GetMargin2() + lDiff, 0 );
}
}
}
else if(pRuler_Imp->bIsTableRows)
{
//moving rows: if a row is resized all following rows
//have to be moved by the same amount.
//This includes the left border when the table is not limited
//to a lower frame border.
int nLimit;
long lLeft;
if(GetDragType()==RULER_TYPE_BORDER)
{
nLimit=nIdx+1;
lLeft=(pBorders[nIdx].nPos+=lDiff);
}
else
{
nLimit=0;
lLeft=pRuler_Imp->lLastLMargin+lDiff;
}
//in vertical tables the left borders have to be moved
if(bHorz)
{
for(int i = 0; i < nIdx; ++i)
{
pBorders[i].nPos += lDiff;
}
AdjustMargin1(lDiff);
}
else
{
//otherwise the right borders are moved
for(int i = nBorderCount-2; i >= nLimit; --i)
{
pBorders[i].nPos += lDiff;
}
SetMargin2( GetMargin2() + lDiff, 0 );
}
}
else
pBorders[nIdx].nPos+=lDiff;
break;
}
case RULER_DRAGSIZE_1:
{
lDiff = lPos - pBorders[nIdx].nPos;
pBorders[nIdx].nWidth += pBorders[nIdx].nPos - lPos;
pBorders[nIdx].nPos = lPos;
break;
}
case RULER_DRAGSIZE_2:
{
const long nOld = pBorders[nIdx].nWidth;
pBorders[nIdx].nWidth = lPos - pBorders[nIdx].nPos;
lDiff = pBorders[nIdx].nWidth - nOld;
break;
}
}
if(!bRightIndentsCorrected &&
GetActRightColumn() == nIdx &&
nDragSize != RULER_DRAGSIZE_2 && pIndents &&
!pRuler_Imp->bIsTableRows)
{
UpdateParaContents_Impl(lDiff, MOVE_RIGHT);
}
else if(!bLeftIndentsCorrected &&
GetActLeftColumn()==nIdx &&
nDragSize != RULER_DRAGSIZE_1 && pIndents)
{
UpdateParaContents_Impl(lDiff, MOVE_LEFT);
}
SetBorders(pColumnItem->Count()-1, pBorders);
}
void SvxRuler::DragObjectBorder()
/*
[Beschreibung]
Draggen von Objektraendern
*/
{
if(RULER_DRAGSIZE_MOVE == GetDragSize())
{
const long lPos = GetCorrectedDragPos();
const sal_uInt16 nIdx = GetDragAryPos();
pObjectBorders[GetObjectBordersOff(nIdx)].nPos = lPos;
SetBorders(2, pObjectBorders + GetObjectBordersOff(0));
DrawLine_Impl(lTabPos, 7, bHorz);
}
}
void SvxRuler::ApplyMargins()
/*
[Beschreibung]
Anwenden von Randeinstellungen; durch Draggen veraendert.
*/
{
const SfxPoolItem *pItem = 0;
sal_uInt16 nId = SID_ATTR_LONG_LRSPACE;
if(bHorz)
{
const long lOldNull = lLogicNullOffset;
if(pRuler_Imp->lMaxLeftLogic!=-1&&nMaxLeft==GetMargin1()+Ruler::GetNullOffset())
pLRSpaceItem->SetLeft(lLogicNullOffset=pRuler_Imp->lMaxLeftLogic);
else
pLRSpaceItem->SetLeft(PixelHAdjust(
lLogicNullOffset = ConvertHPosLogic(GetFrameLeft()) -
lAppNullOffset, pLRSpaceItem->GetLeft()));
if(bAppSetNullOffset)
lAppNullOffset += lLogicNullOffset - lOldNull;
if(pRuler_Imp->lMaxRightLogic!=-1
&&nMaxRight==GetMargin2()+Ruler::GetNullOffset())
pLRSpaceItem->SetRight(GetPageWidth()-pRuler_Imp->lMaxRightLogic);
else
pLRSpaceItem->SetRight(
PixelHAdjust(
Max((long)0,pPagePosItem->GetWidth() -
pLRSpaceItem->GetLeft() -
(ConvertHPosLogic(GetMargin2()) -
lAppNullOffset)),pLRSpaceItem->GetRight()));
pItem = pLRSpaceItem;
#ifdef DEBUGLIN
Debug_Impl(pEditWin,*pLRSpaceItem);
#endif // DEBUGLIN
}
else {
const long lOldNull = lLogicNullOffset;
pULSpaceItem->SetUpper(
PixelVAdjust(
lLogicNullOffset =
ConvertVPosLogic(GetFrameLeft()) -
lAppNullOffset,pULSpaceItem->GetUpper()));
if(bAppSetNullOffset)
lAppNullOffset += lLogicNullOffset - lOldNull;
pULSpaceItem->SetLower(
PixelVAdjust(
Max((long)0, pPagePosItem->GetHeight() -
pULSpaceItem->GetUpper() -
(ConvertVPosLogic(GetMargin2()) -
lAppNullOffset)),pULSpaceItem->GetLower()));
pItem = pULSpaceItem;
nId = SID_ATTR_LONG_ULSPACE;
#ifdef DEBUGLIN
Debug_Impl(pEditWin,*pULSpaceItem);
#endif // DEBUGLIN
}
pBindings->GetDispatcher()->Execute( nId, SFX_CALLMODE_RECORD, pItem, 0L );
if(pTabStopItem)
UpdateTabs();
}
void SvxRuler::ApplyIndents()
/*
[Beschreibung]
Anwenden von Absatzeinstellungen; durch Draggen veraendert.
*/
{
long nNewTxtLeft;
if(pColumnItem&&!IsActFirstColumn( sal_True ))
{
long nLeftCol=GetActLeftColumn( sal_True );
nNewTxtLeft =
PixelHAdjust(
ConvertHPosLogic(
pIndents[INDENT_LEFT_MARGIN].nPos-
(pBorders[nLeftCol].nPos +
pBorders[nLeftCol].nWidth))-
lAppNullOffset,pParaItem->GetTxtLeft());
}
else
nNewTxtLeft =
PixelHAdjust(
ConvertHPosLogic(pIndents[INDENT_LEFT_MARGIN].nPos),
pParaItem->GetTxtLeft());
sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
long nNewFirstLineOffset;
if(bRTL)
{
long nRightFrameMargin = GetRightFrameMargin();
nNewFirstLineOffset = PixelHAdjust(nRightFrameMargin -
ConvertHPosLogic(pIndents[INDENT_FIRST_LINE].nPos ) -
lAppNullOffset,
pParaItem->GetTxtFirstLineOfst());
}
else
nNewFirstLineOffset=
PixelHAdjust(
ConvertHPosLogic(pIndents[INDENT_FIRST_LINE].nPos -
pIndents[INDENT_LEFT_MARGIN].nPos) -
lAppNullOffset,
pParaItem->GetTxtFirstLineOfst());
// #62986# : Ist der neue TxtLeft kleiner als der alte FirstLineIndent,
// dann geht die Differenz verloren und der Absatz wird insgesamt
// zu weit eingerueckt, deswegen erst den FirstLineOffset setzen, dann den TxtLeft
if(bRTL)
{
long nLeftFrameMargin = GetLeftFrameMargin();
long nRightFrameMargin = GetRightFrameMargin();
nNewTxtLeft = nRightFrameMargin - nNewTxtLeft - nLeftFrameMargin;
nNewFirstLineOffset -= nNewTxtLeft;
if(pParaBorderItem)
{
nNewTxtLeft += pParaBorderItem->GetLeft() + pParaBorderItem->GetRight();
nNewFirstLineOffset -= pParaBorderItem->GetRight();
}
}
pParaItem->SetTxtFirstLineOfst(
sal::static_int_cast< short >(nNewFirstLineOffset));
pParaItem->SetTxtLeft(nNewTxtLeft);
if(pColumnItem && ((!bRTL && !IsActLastColumn( sal_True ))|| (bRTL && !IsActFirstColumn())))
{
if(bRTL)
{
long nActBorder = pBorders[GetActLeftColumn( sal_True )].nPos;
long nRightMargin = pIndents[INDENT_RIGHT_MARGIN].nPos;
long nConvert = ConvertHPosLogic( nRightMargin - nActBorder );
pParaItem->SetRight( PixelHAdjust( nConvert - lAppNullOffset, pParaItem->GetRight() ) );
}
else
{
pParaItem->SetRight(
PixelHAdjust(
ConvertHPosLogic(
pBorders[GetActRightColumn( sal_True )].nPos -
pIndents[INDENT_RIGHT_MARGIN].nPos) -
lAppNullOffset,
pParaItem->GetRight()));
}
}
else
{
if(bRTL)
{
pParaItem->SetRight( PixelHAdjust(
ConvertHPosLogic(GetMargin1() +
pIndents[INDENT_RIGHT_MARGIN].nPos) - GetLeftFrameMargin() +
(pParaBorderItem ? pParaBorderItem->GetLeft() : 0) -
lAppNullOffset, pParaItem->GetRight()));
}
else
{
pParaItem->SetRight( PixelHAdjust(
ConvertHPosLogic(GetMargin2() -
pIndents[INDENT_RIGHT_MARGIN].nPos) -
lAppNullOffset, pParaItem->GetRight()));
}
}
sal_uInt16 nParaId = bHorz ? SID_ATTR_PARA_LRSPACE : SID_ATTR_PARA_LRSPACE_VERTICAL;
pBindings->GetDispatcher()->Execute( nParaId, SFX_CALLMODE_RECORD, pParaItem, 0L );
UpdateTabs();
}
void SvxRuler::ApplyTabs()
/*
[Beschreibung]
Anwenden von Tabulatoreinstellungen; durch Draggen veraendert.
*/
{
sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
const sal_uInt16 nCoreIdx = GetDragAryPos();
if(IsDragDelete())
{
pTabStopItem->Remove(nCoreIdx);
}
else if(DRAG_OBJECT_SIZE_LINEAR & nDragType ||
DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType)
{
SvxTabStopItem *pItem = new SvxTabStopItem(pTabStopItem->Which());
//remove default tab stops
for ( sal_uInt16 i = 0; i < pItem->Count(); )
{
if ( SVX_TAB_ADJUST_DEFAULT == (*pItem)[i].GetAdjustment() )
{
pItem->Remove(i);
continue;
}
++i;
}
sal_uInt16 j;
for(j = 0; j < nCoreIdx; ++j)
{
pItem->Insert((*pTabStopItem)[j]);
}
for(; j < pTabStopItem->Count(); ++j)
{
SvxTabStop aTabStop = (*pTabStopItem)[j];
aTabStop.GetTabPos() = PixelHAdjust(
ConvertHPosLogic(pTabs[j+TAB_GAP].nPos -
GetLeftIndent()) -
lAppNullOffset,
aTabStop.GetTabPos());
pItem->Insert(aTabStop);
}
delete pTabStopItem;
pTabStopItem = pItem;
}
else if( pTabStopItem->Count() == 0 )
return;
else
{
SvxTabStop aTabStop = (*pTabStopItem)[nCoreIdx];
if(pRuler_Imp->lMaxRightLogic!=-1&&
pTabs[nCoreIdx+TAB_GAP].nPos+Ruler::GetNullOffset()==nMaxRight)
aTabStop.GetTabPos() = pRuler_Imp->lMaxRightLogic-lLogicNullOffset;
else
{
if(bRTL)
{
//#i24363# tab stops relative to indent
const long nTmpLeftIndent = pRuler_Imp->bIsTabsRelativeToIndent ?
GetLeftIndent() :
ConvertHPosPixel( GetRightFrameMargin() + lAppNullOffset );
aTabStop.GetTabPos() = PixelHAdjust(
ConvertHPosLogic( nTmpLeftIndent - pTabs[nCoreIdx+TAB_GAP].nPos) - lAppNullOffset,
aTabStop.GetTabPos());
}
else
{
//#i24363# tab stops relative to indent
const long nTmpLeftIndent = pRuler_Imp->bIsTabsRelativeToIndent ?
GetLeftIndent() :
0;
aTabStop.GetTabPos() = PixelHAdjust(
ConvertHPosLogic( pTabs[nCoreIdx+TAB_GAP].nPos - nTmpLeftIndent ) - lAppNullOffset,
aTabStop.GetTabPos() );
}
}
pTabStopItem->Remove(nCoreIdx);
pTabStopItem->Insert(aTabStop);
}
sal_uInt16 nTabStopId = bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL;
pBindings->GetDispatcher()->Execute( nTabStopId, SFX_CALLMODE_RECORD, pTabStopItem, 0L );
UpdateTabs();
}
void SvxRuler::ApplyBorders()
/*
[Beschreibung]
Anwenden von (Tabellen-)Spalteneinstellungen; durch Draggen veraendert.
*/
{
if(pColumnItem->IsTable())
{
long l = GetFrameLeft();
if(l != pRuler_Imp->nColLeftPix)
pColumnItem->SetLeft( PixelHAdjust(
ConvertHPosLogic(l) - lAppNullOffset, pColumnItem->GetLeft()));
l = GetMargin2();
if(l != pRuler_Imp->nColRightPix)
{
long nWidthOrHeight = bHorz ? pPagePosItem->GetWidth() : pPagePosItem->GetHeight();
pColumnItem->SetRight( PixelHAdjust( nWidthOrHeight -
pColumnItem->GetLeft() - ConvertHPosLogic(l) -
lAppNullOffset, pColumnItem->GetRight() ) );
}
}
for(sal_uInt16 i = 0; i < pColumnItem->Count()-1; ++i)
{
long& nEnd = (*pColumnItem)[i].nEnd;
nEnd = PIXEL_H_ADJUST(
ConvertPosLogic(pBorders[i].nPos),
(*pColumnItem)[i].nEnd);
long& nStart = (*pColumnItem)[i+1].nStart;
nStart = PIXEL_H_ADJUST(
ConvertSizeLogic(pBorders[i].nPos +
pBorders[i].nWidth) -
lAppNullOffset,
(*pColumnItem)[i+1].nStart);
// Es kann sein, dass aufgrund der PIXEL_H_ADJUST rejustierung auf
// alte Werte die Breite < 0 wird. Das rerejustieren wir.
if( nEnd > nStart )
nStart = nEnd;
}
#ifdef DEBUGLIN
Debug_Impl(pEditWin,*pColumnItem);
#endif // DEBUGLIN
SfxBoolItem aFlag(SID_RULER_ACT_LINE_ONLY,
nDragType & DRAG_OBJECT_ACTLINE_ONLY? sal_True : sal_False);
sal_uInt16 nColId = pRuler_Imp->bIsTableRows ? (bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL) :
(bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL);
pBindings->GetDispatcher()->Execute( nColId, SFX_CALLMODE_RECORD, pColumnItem, &aFlag, 0L );
}
void SvxRuler::ApplyObject()
/*
[Beschreibung]
Anwenden von Objekteinstellungen; durch Draggen veraendert.
*/
{
// zum Seitenrand
long nMargin = pLRSpaceItem? pLRSpaceItem->GetLeft(): 0;
pObjectItem->SetStartX(
PixelAdjust(
ConvertPosLogic(pObjectBorders[0].nPos)
+ nMargin - lAppNullOffset,pObjectItem->GetStartX()));
pObjectItem->SetEndX(
PixelAdjust(
ConvertPosLogic(pObjectBorders[1].nPos)
+ nMargin - lAppNullOffset,pObjectItem->GetEndX()));
nMargin = pULSpaceItem? pULSpaceItem->GetUpper(): 0;
pObjectItem->SetStartY(
PixelAdjust(
ConvertPosLogic(pObjectBorders[2].nPos)
+ nMargin - lAppNullOffset,pObjectItem->GetStartY()));
pObjectItem->SetEndY(
PixelAdjust(
ConvertPosLogic(pObjectBorders[3].nPos)
+ nMargin - lAppNullOffset,pObjectItem->GetEndY()));
pBindings->GetDispatcher()->Execute( SID_RULER_OBJECT, SFX_CALLMODE_RECORD, pObjectItem, 0L );
}
void SvxRuler::PrepareProportional_Impl(RulerType eType)
/*
[Beschreibung]
Vorbereitung proportionales Draggen; es wird der proportionale
Anteil bezogen auf die Gesamtbreite in Promille berechnet.
*/
{
pRuler_Imp->nTotalDist = GetMargin2();
switch((int)eType)
{
case RULER_TYPE_MARGIN2:
case RULER_TYPE_MARGIN1:
case RULER_TYPE_BORDER:
{
DBG_ASSERT(pColumnItem, "kein ColumnItem");
pRuler_Imp->SetPercSize(pColumnItem->Count());
long lPos;
long lWidth=0;
sal_uInt16 nStart;
sal_uInt16 nIdx=GetDragAryPos();
lWidth=0;
long lActWidth=0;
long lActBorderSum;
long lOrigLPos;
if(eType != RULER_TYPE_BORDER)
{
lOrigLPos = GetMargin1();
nStart = 0;
lActBorderSum = 0;
}
else
{
if(pRuler_Imp->bIsTableRows &&!bHorz)
{
lOrigLPos = GetMargin1();
nStart = 0;
}
else
{
lOrigLPos = pBorders[nIdx].nPos + pBorders[nIdx].nWidth;
nStart = 1;
}
lActBorderSum = pBorders[nIdx].nWidth;
}
//in horizontal mode the percentage value has to be
//calculated on a "current change" position base
//because the height of the table changes while dragging
if(pRuler_Imp->bIsTableRows && RULER_TYPE_BORDER == eType)
{
sal_uInt16 nStartBorder;
sal_uInt16 nEndBorder;
if(bHorz)
{
nStartBorder = nIdx + 1;
nEndBorder = pColumnItem->Count() - 1;
}
else
{
nStartBorder = 0;
nEndBorder = nIdx;
}
lWidth = pBorders[nIdx].nPos;
if(bHorz)
lWidth = GetMargin2() - lWidth;
pRuler_Imp->nTotalDist = lWidth;
lPos = lOrigLPos = pBorders[nIdx].nPos;
for(sal_uInt16 i = nStartBorder; i < nEndBorder; ++i)
{
if(bHorz)
{
lActWidth += pBorders[i].nPos - lPos;
lPos = pBorders[i].nPos + pBorders[i].nWidth;
}
else
lActWidth = pBorders[i].nPos;
pRuler_Imp->pPercBuf[i] = (sal_uInt16)((lActWidth * 1000)
/ pRuler_Imp->nTotalDist);
pRuler_Imp->pBlockBuf[i] = (sal_uInt16)lActBorderSum;
lActBorderSum += pBorders[i].nWidth;
}
}
else
{
lPos = lOrigLPos;
for(sal_uInt16 ii = nStart; ii < pColumnItem->Count() - 1; ++ii)
{
lWidth += pBorders[ii].nPos - lPos;
lPos = pBorders[ii].nPos + pBorders[ii].nWidth;
}
lWidth += GetMargin2() - lPos;
pRuler_Imp->nTotalDist = lWidth;
lPos = lOrigLPos;
for(sal_uInt16 i = nStart; i < pColumnItem->Count() - 1; ++i)
{
lActWidth += pBorders[i].nPos - lPos;
lPos = pBorders[i].nPos + pBorders[i].nWidth;
pRuler_Imp->pPercBuf[i] = (sal_uInt16)((lActWidth * 1000)
/ pRuler_Imp->nTotalDist);
pRuler_Imp->pBlockBuf[i] = (sal_uInt16)lActBorderSum;
lActBorderSum += pBorders[i].nWidth;
}
}
}
break;
case RULER_TYPE_TAB:
{
const sal_uInt16 nIdx = GetDragAryPos()+TAB_GAP;
pRuler_Imp->nTotalDist -= pTabs[nIdx].nPos;
pRuler_Imp->SetPercSize(nTabCount);
for(sal_uInt16 n=0;n<=nIdx;pRuler_Imp->pPercBuf[n++]=0) ;
for(sal_uInt16 i = nIdx+1; i < nTabCount; ++i)
{
const long nDelta = pTabs[i].nPos - pTabs[nIdx].nPos;
pRuler_Imp->pPercBuf[i] = (sal_uInt16)((nDelta * 1000) / pRuler_Imp->nTotalDist);
}
break;
}
}
}
void SvxRuler::EvalModifier()
/*
[Beschreibung]
Modifier Draggen auswerten
Shift: Linear verschieben
Control: Proportional verschieben
Shift+Control: Tabelle: nur aktuelle Zeile
alt: Bemassungspfeile (n.i.) //!!
*/
{
sal_uInt16 nModifier = GetDragModifier();
if(pRuler_Imp->bIsTableRows)
{
//rows can only be moved in one way, additionally current column is possible
if(nModifier == KEY_SHIFT)
nModifier = 0;
}
switch(nModifier)
{
case KEY_SHIFT:
nDragType = DRAG_OBJECT_SIZE_LINEAR;
break;
case KEY_MOD1: {
const RulerType eType = GetDragType();
nDragType = DRAG_OBJECT_SIZE_PROPORTIONAL;
if( RULER_TYPE_TAB == eType ||
( ( RULER_TYPE_BORDER == eType || RULER_TYPE_MARGIN1 == eType || RULER_TYPE_MARGIN2 == eType) &&
pColumnItem ) )
PrepareProportional_Impl(eType);
break;
}
case KEY_MOD1 | KEY_SHIFT:
if(GetDragType()!=RULER_TYPE_MARGIN1&&
GetDragType()!=RULER_TYPE_MARGIN2)
nDragType = DRAG_OBJECT_ACTLINE_ONLY;
break;
// alt: Bemassungspfeile
}
}
void __EXPORT SvxRuler::Click()
/*
[Beschreibung]
Ueberladener Handler SV; setzt Tab per Dispatcheraufruf
*/
{
lcl_logRulerUse(::rtl::OUString::createFromAscii(".special://SfxRuler/Click"));
Ruler::Click();
if( bActive )
{
pBindings->Update( SID_RULER_LR_MIN_MAX );
pBindings->Update( SID_ATTR_LONG_ULSPACE );
pBindings->Update( SID_ATTR_LONG_LRSPACE );
pBindings->Update( SID_RULER_PAGE_POS );
pBindings->Update( bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL);
pBindings->Update( bHorz ? SID_ATTR_PARA_LRSPACE : SID_ATTR_PARA_LRSPACE_VERTICAL);
pBindings->Update( bHorz ? SID_RULER_BORDERS : SID_RULER_BORDERS_VERTICAL);
pBindings->Update( bHorz ? SID_RULER_ROWS : SID_RULER_ROWS_VERTICAL);
pBindings->Update( SID_RULER_OBJECT );
pBindings->Update( SID_RULER_PROTECT );
pBindings->Update( SID_ATTR_PARA_LRSPACE_VERTICAL );
}
sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
if(pTabStopItem &&
(nFlags & SVXRULER_SUPPORT_TABS) == SVXRULER_SUPPORT_TABS)
{
sal_Bool bContentProtected = pRuler_Imp->aProtectItem.IsCntntProtected();
if( bContentProtected ) return;
const long lPos = GetClickPos();
if((bRTL && lPos < Min(GetFirstLineIndent(), GetLeftIndent()) && lPos > GetRightIndent()) ||
(!bRTL && lPos > Min(GetFirstLineIndent(), GetLeftIndent()) && lPos < GetRightIndent()))
{
//convert position in left-to-right text
long nTabPos;
//#i24363# tab stops relative to indent
if(bRTL)
nTabPos = ( pRuler_Imp->bIsTabsRelativeToIndent ?
GetLeftIndent() :
ConvertHPosPixel( GetRightFrameMargin() + lAppNullOffset ) ) -
lPos;
else
nTabPos = lPos -
( pRuler_Imp->bIsTabsRelativeToIndent ?
GetLeftIndent() :
0 );
SvxTabStop aTabStop(ConvertHPosLogic(nTabPos),
ToAttrTab_Impl(nDefTabType));
pTabStopItem->Insert(aTabStop);
UpdateTabs();
}
}
}
sal_Bool SvxRuler::CalcLimits
(
long &nMax1, // zu setzenden Minimalwert
long &nMax2, // zu setzenden Maximalwert
sal_Bool
) const
/*
[Beschreibung]
Defaultimplementierung der virtuellen Funktion; kann die Applikation
ueberladen, um eine eigene Grenzwertbehandlung zu implementieren.
Die Werte sind auf die Seite bezogen.
*/
{
nMax1 = LONG_MIN;
nMax2 = LONG_MAX;
return sal_False;
}
void SvxRuler::CalcMinMax()
/*
[Beschreibung]
Berechnet die Grenzwerte fuers Draggen; diese sind in Pixeln
relativ zum Seitenrand
*/
{
sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
const long lNullPix = ConvertPosPixel(lLogicNullOffset);
pRuler_Imp->lMaxLeftLogic=pRuler_Imp->lMaxRightLogic=-1;
switch(GetDragType())
{
case RULER_TYPE_MARGIN1:
{ // linker Rand umgebender Frame
// DragPos - NOf zwischen links - rechts
pRuler_Imp->lMaxLeftLogic = GetLeftMin();
nMaxLeft=ConvertSizePixel(pRuler_Imp->lMaxLeftLogic);
if(!pColumnItem || pColumnItem->Count() == 1 )
{
if(bRTL)
{
nMaxRight = lNullPix - GetRightIndent() +
Max(GetFirstLineIndent(), GetLeftIndent()) -
lMinFrame;
}
else
{
nMaxRight = lNullPix + GetRightIndent() -
Max(GetFirstLineIndent(), GetLeftIndent()) -
lMinFrame;
}
}
else if(pRuler_Imp->bIsTableRows)
{
//top border is not moveable when table rows are displayed
// protection of content means the margin is not moveable - it's just a page break inside of a cell
if(bHorz && !pRuler_Imp->aProtectItem.IsCntntProtected())
{
nMaxLeft = pBorders[0].nMinPos + lNullPix;
if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
nMaxRight = GetRightIndent() + lNullPix -
(pColumnItem->Count() - 1 ) * lMinFrame;
else
nMaxRight = pBorders[0].nPos - lMinFrame + lNullPix;
}
else
nMaxLeft = nMaxRight = lNullPix;
}
else
{
if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
//nDragType & DRAG_OBJECT_SIZE_LINEAR)
{
nMaxRight=lNullPix+CalcPropMaxRight();
}
else if(nDragType & DRAG_OBJECT_SIZE_LINEAR)
{
nMaxRight = ConvertPosPixel(
GetPageWidth() - (
(pColumnItem->IsTable() && pLRSpaceItem)
? pLRSpaceItem->GetRight() : 0))
- GetMargin2() + GetMargin1();
}
else
{
nMaxRight = lNullPix - lMinFrame;
if(pColumnItem->IsFirstAct())
{
if(bRTL)
{
nMaxRight += Min(
pBorders[0].nPos,
Max(GetFirstLineIndent(), GetLeftIndent()) - GetRightIndent());
}
else
{
nMaxRight += Min(
pBorders[0].nPos, GetRightIndent() -
Max(GetFirstLineIndent(), GetLeftIndent()));
}
}
else if( pColumnItem->Count() > 1 )
nMaxRight += pBorders[0].nPos;
else
nMaxRight +=GetRightIndent() -
Max(GetFirstLineIndent(), GetLeftIndent());
// den linken Tabellen-Rand nicht ueber den Seitenrand ziehen
if(pLRSpaceItem&&pColumnItem->IsTable())
{
long nTmp=ConvertSizePixel(pLRSpaceItem->GetLeft());
if(nTmp>nMaxLeft)
nMaxLeft=nTmp;
}
}
}
break;
}
case RULER_TYPE_MARGIN2:
{ // rechter Rand umgebender Frame
pRuler_Imp->lMaxRightLogic =
pMinMaxItem ?
GetPageWidth() - GetRightMax() : GetPageWidth();
nMaxRight = ConvertSizePixel(pRuler_Imp->lMaxRightLogic);
if(!pColumnItem)
{
if(bRTL)
{
nMaxLeft = GetMargin2() + GetRightIndent() -
Max(GetFirstLineIndent(),GetLeftIndent()) - GetMargin1()+
lMinFrame + lNullPix;
}
else
{
nMaxLeft = GetMargin2() - GetRightIndent() +
Max(GetFirstLineIndent(),GetLeftIndent()) - GetMargin1()+
lMinFrame + lNullPix;
}
}
else if(pRuler_Imp->bIsTableRows)
{
// get the bottom move range from the last border position - only available for rows!
// protection of content means the margin is not moveable - it's just a page break inside of a cell
if(bHorz || pRuler_Imp->aProtectItem.IsCntntProtected())
{
nMaxLeft = nMaxRight = pBorders[pColumnItem->Count() - 1].nMaxPos + lNullPix;
}
else
{
if(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)
{
nMaxLeft = (pColumnItem->Count()) * lMinFrame + lNullPix;
}
else
{
if(pColumnItem->Count() > 1)
nMaxLeft = pBorders[pColumnItem->Count() - 2].nPos + lMinFrame + lNullPix;
else
nMaxLeft = lMinFrame + lNullPix;
}
if(pColumnItem->Count() > 1)
nMaxRight = pBorders[pColumnItem->Count() - 2].nMaxPos + lNullPix;
else
nMaxRight -= GetRightIndent() - lNullPix;
}
}
else
{
nMaxLeft = lMinFrame + lNullPix;
if(IsActLastColumn() || pColumnItem->Count() < 2 ) //Falls letzte Spalte aktiv
{
if(bRTL)
{
nMaxLeft = lMinFrame + lNullPix + GetMargin2() +
GetRightIndent() - Max(GetFirstLineIndent(),
GetLeftIndent());
}
else
{
nMaxLeft = lMinFrame + lNullPix + GetMargin2() -
GetRightIndent() + Max(GetFirstLineIndent(),
GetLeftIndent());
}
}
if( pColumnItem->Count() >= 2 )
{
long nNewMaxLeft =
lMinFrame + lNullPix +
pBorders[pColumnItem->Count()-2].nPos +
pBorders[pColumnItem->Count()-2].nWidth;
nMaxLeft=Max(nMaxLeft,nNewMaxLeft);
}
}
break;
}
case RULER_TYPE_BORDER:
{ // Tabelle, Spalten (Modifier)
const sal_uInt16 nIdx = GetDragAryPos();
switch(GetDragSize())
{
case RULER_DRAGSIZE_1 :
{
nMaxRight = pBorders[nIdx].nPos +
pBorders[nIdx].nWidth + lNullPix;
if(0 == nIdx)
nMaxLeft = lNullPix;
else
nMaxLeft = pBorders[nIdx-1].nPos +
pBorders[nIdx-1].nWidth + lNullPix;
if(nIdx == pColumnItem->GetActColumn())
{
if(bRTL)
{
nMaxLeft += pBorders[nIdx].nPos +
GetRightIndent() - Max(GetFirstLineIndent(),
GetLeftIndent());
}
else
{
nMaxLeft += pBorders[nIdx].nPos -
GetRightIndent() + Max(GetFirstLineIndent(),
GetLeftIndent());
}
if(0 != nIdx)
nMaxLeft -= pBorders[nIdx-1].nPos +
pBorders[nIdx-1].nWidth;
}
nMaxLeft += lMinFrame;
nMaxLeft += nDragOffset;
break;
}
case RULER_DRAGSIZE_MOVE:
{
if(pColumnItem)
{
//nIdx contains the position of the currently moved item
//next visible separator on the left
sal_uInt16 nLeftCol=GetActLeftColumn(sal_False, nIdx);
//next visible separator on the right
sal_uInt16 nRightCol=GetActRightColumn(sal_False, nIdx);
//next separator on the left - regardless if visible or not
sal_uInt16 nActLeftCol=GetActLeftColumn();
//next separator on the right - regardless if visible or not
sal_uInt16 nActRightCol=GetActRightColumn();
if(pColumnItem->IsTable())
{
if(nDragType & DRAG_OBJECT_ACTLINE_ONLY)
{
//the current row/column should be modified only
//then the next/previous visible border position
//marks the min/max positions
nMaxLeft = nLeftCol == USHRT_MAX ?
0 :
pBorders[nLeftCol].nPos;
//rows can always be increased without a limit
if(pRuler_Imp->bIsTableRows)
nMaxRight = pBorders[nIdx].nMaxPos;
else
nMaxRight = nRightCol == USHRT_MAX ?
GetMargin2():
pBorders[nRightCol].nPos;
nMaxLeft += lNullPix;
nMaxRight += lNullPix;
}
else
{
if(DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType && !bHorz && pRuler_Imp->bIsTableRows)
nMaxLeft = (nIdx + 1) * lMinFrame + lNullPix;
else
nMaxLeft = pBorders[nIdx].nMinPos + lNullPix;
if(DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType||
(DRAG_OBJECT_SIZE_LINEAR & nDragType) )
{
if(pRuler_Imp->bIsTableRows)
{
if(bHorz)
nMaxRight = GetRightIndent() + lNullPix -
(pColumnItem->Count() - nIdx - 1) * lMinFrame;
else
nMaxRight = pBorders[nIdx].nMaxPos + lNullPix;
}
else
nMaxRight=lNullPix+CalcPropMaxRight(nIdx);
}
else
nMaxRight = pBorders[nIdx].nMaxPos + lNullPix;
}
nMaxLeft += lMinFrame;
nMaxRight -= lMinFrame;
}
else
{
if(nLeftCol==USHRT_MAX)
nMaxLeft=lNullPix;
else
nMaxLeft = pBorders[nLeftCol].nPos +
pBorders[nLeftCol].nWidth + lNullPix;
if(nActRightCol == nIdx)
{
if(bRTL)
{
nMaxLeft += pBorders[nIdx].nPos +
GetRightIndent() - Max(GetFirstLineIndent(),
GetLeftIndent());
if(nActLeftCol!=USHRT_MAX)
nMaxLeft -= pBorders[nActLeftCol].nPos +
pBorders[nActLeftCol].nWidth;
}
else
{
nMaxLeft += pBorders[nIdx].nPos -
GetRightIndent() + Max(GetFirstLineIndent(),
GetLeftIndent());
if(nActLeftCol!=USHRT_MAX)
nMaxLeft -= pBorders[nActLeftCol].nPos +
pBorders[nActLeftCol].nWidth;
}
}
nMaxLeft += lMinFrame;
nMaxLeft += nDragOffset;
// nMaxRight
// linear / proprotional verschieben
if(DRAG_OBJECT_SIZE_PROPORTIONAL & nDragType||
(DRAG_OBJECT_SIZE_LINEAR & nDragType) )
{
nMaxRight=lNullPix+CalcPropMaxRight(nIdx);
}
else if(DRAG_OBJECT_SIZE_LINEAR & nDragType)
{
nMaxRight=lNullPix+GetMargin2()-GetMargin1()+
(nBorderCount-nIdx-1)*lMinFrame;
}
else
{
if(nRightCol==USHRT_MAX)
{ // letzte Spalte
nMaxRight = GetMargin2() + lNullPix;
if(IsActLastColumn())
{
if(bRTL)
{
nMaxRight -=
GetMargin2() + GetRightIndent() -
Max(GetFirstLineIndent(),
GetLeftIndent());
}
else
{
nMaxRight -=
GetMargin2() - GetRightIndent() +
Max(GetFirstLineIndent(),
GetLeftIndent());
}
nMaxRight += pBorders[nIdx].nPos +
pBorders[nIdx].nWidth;
}
}
else
{
nMaxRight = lNullPix + pBorders[nRightCol].nPos;
sal_uInt16 nNotHiddenRightCol =
GetActRightColumn(sal_True, nIdx);
if( nActLeftCol == nIdx )
{
long nBorder = nNotHiddenRightCol ==
USHRT_MAX ?
GetMargin2() :
pBorders[nNotHiddenRightCol].nPos;
if(bRTL)
{
nMaxRight -= nBorder + GetRightIndent() -
Max(GetFirstLineIndent(),
GetLeftIndent());
}
else
{
nMaxRight -= nBorder - GetRightIndent() +
Max(GetFirstLineIndent(),
GetLeftIndent());
}
nMaxRight += pBorders[nIdx].nPos +
pBorders[nIdx].nWidth;
}
}
nMaxRight -= lMinFrame;
nMaxRight -= pBorders[nIdx].nWidth;
}
}
}
// ObjectItem
else
{
if(pObjectItem->HasLimits())
{
if(CalcLimits(nMaxLeft, nMaxRight, nIdx & 1? sal_False : sal_True))
{
nMaxLeft = ConvertPosPixel(nMaxLeft);
nMaxRight = ConvertPosPixel(nMaxRight);
}
}
else
{
nMaxLeft = LONG_MIN;
nMaxRight = LONG_MAX;
}
}
break;
}
case RULER_DRAGSIZE_2:
{
nMaxLeft = lNullPix + pBorders[nIdx].nPos;
if(nIdx == pColumnItem->Count()-2) { // letzte Spalte
nMaxRight = GetMargin2() + lNullPix;
if(pColumnItem->IsLastAct()) {
nMaxRight -=
GetMargin2() - GetRightIndent() +
Max(GetFirstLineIndent(),
GetLeftIndent());
nMaxRight += pBorders[nIdx].nPos +
pBorders[nIdx].nWidth;
}
}
else {
nMaxRight = lNullPix + pBorders[nIdx+1].nPos;
if(pColumnItem->GetActColumn()-1 == nIdx) {
nMaxRight -= pBorders[nIdx+1].nPos - GetRightIndent() +
Max(GetFirstLineIndent(),
GetLeftIndent());
nMaxRight += pBorders[nIdx].nPos +
pBorders[nIdx].nWidth;
}
}
nMaxRight -= lMinFrame;
nMaxRight -= pBorders[nIdx].nWidth;
break;
}
}
nMaxRight += nDragOffset;
break;
}
case RULER_TYPE_INDENT:
{
const sal_uInt16 nIdx = GetDragAryPos();
switch(nIdx) {
case INDENT_FIRST_LINE - INDENT_GAP:
case INDENT_LEFT_MARGIN - INDENT_GAP:
{
if(bRTL)
{
nMaxLeft = lNullPix + GetRightIndent();
if(pColumnItem && !pColumnItem->IsFirstAct())
nMaxLeft += pBorders[pColumnItem->GetActColumn()-1].nPos +
pBorders[pColumnItem->GetActColumn()-1].nWidth;
nMaxRight = lNullPix + GetMargin2();
// zusammem draggen
if((INDENT_FIRST_LINE - INDENT_GAP) != nIdx &&
(nDragType & DRAG_OBJECT_LEFT_INDENT_ONLY) !=
DRAG_OBJECT_LEFT_INDENT_ONLY)
{
if(GetLeftIndent() > GetFirstLineIndent())
nMaxLeft += GetLeftIndent() - GetFirstLineIndent();
else
nMaxRight -= GetFirstLineIndent() - GetLeftIndent();
}
}
else
{
nMaxLeft = lNullPix;
if(pColumnItem && !pColumnItem->IsFirstAct())
nMaxLeft += pBorders[pColumnItem->GetActColumn()-1].nPos +
pBorders[pColumnItem->GetActColumn()-1].nWidth;
nMaxRight = lNullPix + GetRightIndent() - lMinFrame;
// zusammem draggen
if((INDENT_FIRST_LINE - INDENT_GAP) != nIdx &&
(nDragType & DRAG_OBJECT_LEFT_INDENT_ONLY) !=
DRAG_OBJECT_LEFT_INDENT_ONLY)
{
if(GetLeftIndent() > GetFirstLineIndent())
nMaxLeft += GetLeftIndent() - GetFirstLineIndent();
else
nMaxRight -= GetFirstLineIndent() - GetLeftIndent();
}
}
}
break;
case INDENT_RIGHT_MARGIN - INDENT_GAP:
{
if(bRTL)
{
nMaxLeft = lNullPix;
nMaxRight = lNullPix + Min(GetFirstLineIndent(), GetLeftIndent()) - lMinFrame;
if(pColumnItem)
{
sal_uInt16 nRightCol=GetActRightColumn( sal_True );
if(!IsActLastColumn( sal_True ))
nMaxRight += pBorders[nRightCol].nPos;
else
nMaxRight += GetMargin2();
}
else
nMaxLeft += GetMargin1();
nMaxLeft += lMinFrame;
}
else
{
nMaxLeft = lNullPix +
Max(GetFirstLineIndent(), GetLeftIndent());
nMaxRight = lNullPix;
if(pColumnItem)
{
sal_uInt16 nRightCol=GetActRightColumn( sal_True );
if(!IsActLastColumn( sal_True ))
nMaxRight += pBorders[nRightCol].nPos;
else
nMaxRight += GetMargin2();
}
else
nMaxRight += GetMargin2();
nMaxLeft += lMinFrame;
}
}
break;
}
break;
}
case RULER_TYPE_TAB: // Tabs (Modifier)
/*
links = NOf + Max(LAR, EZ)
rechts = NOf + RAR
*/
nMaxLeft = bRTL ? lNullPix + GetRightIndent()
: lNullPix + Min(GetFirstLineIndent(), GetLeftIndent());
pRuler_Imp->lMaxRightLogic=GetLogicRightIndent()+lLogicNullOffset;
nMaxRight = ConvertSizePixel(pRuler_Imp->lMaxRightLogic);
break;
default: ; //prevent warning
}
#ifdef DEBUGLIN
{
String aStr("MinLeft: ");
Size aSize(nMaxLeft + lNullPix, 0);
Size aSize2(nMaxRight + lNullPix, 0);
aSize = pEditWin->PixelToLogic(aSize, MapMode(MAP_MM));
aSize2 = pEditWin->PixelToLogic(aSize2, MapMode(MAP_MM));
aStr += String(aSize.Width());
aStr += " MaxRight: ";
aStr += String(aSize2.Width());
InfoBox(0, aStr).Execute();
}
#endif
}
long __EXPORT SvxRuler::StartDrag()
/*
[Beschreibung]
Beginn eines Drag-Vorgangs (SV-Handler); wertet Modifier aus
und berechnet Grenzwerte
[Querverweise]
<SvxRuler::EvalModifier()>
<SvxRuler::CalcMinMax()>
<SvxRuler::EndDrag()>
*/
{
lcl_logRulerUse(::rtl::OUString::createFromAscii(".special://SfxRuler/StartDrag"));
sal_Bool bContentProtected = pRuler_Imp->aProtectItem.IsCntntProtected();
if(!bValid)
return sal_False;
pRuler_Imp->lLastLMargin=GetMargin1();
pRuler_Imp->lLastRMargin=GetMargin2();
long bOk = 1;
if(GetStartDragHdl().IsSet())
bOk = Ruler::StartDrag();
if(bOk) {
lInitialDragPos = GetDragPos();
switch(GetDragType()) {
case RULER_TYPE_MARGIN1: // linker Rand umgebender Frame
case RULER_TYPE_MARGIN2: // rechter Rand umgebender Frame
if((bHorz && pLRSpaceItem) || (!bHorz && pULSpaceItem))
{
if(pColumnItem)
EvalModifier();
else
nDragType = DRAG_OBJECT;
}
else
bOk = sal_False;
break;
case RULER_TYPE_BORDER: // Tabelle, Spalten (Modifier)
if(pColumnItem)
{
nDragOffset = pColumnItem->IsTable()? 0 :
GetDragPos() - pBorders[GetDragAryPos()].nPos;
EvalModifier();
}
else
nDragOffset = 0;
break;
case RULER_TYPE_INDENT: { // Absatzeinzuege (Modifier)
if( bContentProtected )
return sal_False;
sal_uInt16 nIndent = INDENT_LEFT_MARGIN;
if((nIndent) == GetDragAryPos() + INDENT_GAP) { // Linker Absatzeinzug
pIndents[0] = pIndents[INDENT_FIRST_LINE];
pIndents[0].nStyle |= RULER_STYLE_DONTKNOW;
EvalModifier();
}
else
nDragType = DRAG_OBJECT;
pIndents[1] = pIndents[GetDragAryPos()+INDENT_GAP];
pIndents[1].nStyle |= RULER_STYLE_DONTKNOW;
break;
}
case RULER_TYPE_TAB: // Tabs (Modifier)
if( bContentProtected ) return sal_False;
EvalModifier();
pTabs[0] = pTabs[GetDragAryPos()+1];
pTabs[0].nStyle |= RULER_STYLE_DONTKNOW;
break;
default:
nDragType = NONE;
}
}
else
nDragType = NONE;
if(bOk)
CalcMinMax();
return bOk;
}
void __EXPORT SvxRuler::Drag()
/*
[Beschreibung]
SV-Draghandler
*/
{
if(IsDragCanceled())
{
Ruler::Drag();
return;
}
switch(GetDragType()) {
case RULER_TYPE_MARGIN1: // linker Rand umgebender Frame
DragMargin1();
pRuler_Imp->lLastLMargin=GetMargin1();
break;
case RULER_TYPE_MARGIN2: // rechter Rand umgebender Frame
DragMargin2();
pRuler_Imp->lLastRMargin = GetMargin2();
break;
case RULER_TYPE_INDENT: // Absatzeinzuege
DragIndents();
break;
case RULER_TYPE_BORDER: // Tabelle, Spalten
if(pColumnItem)
DragBorders();
else if(pObjectItem)
DragObjectBorder();
break;
case RULER_TYPE_TAB: // Tabs
DragTabs();
break;
default: ;//prevent warning
}
Ruler::Drag();
}
void __EXPORT SvxRuler::EndDrag()
/*
[Beschreibung]
SV-Handler; wird beim Beenden des Draggens gerufen.
Stoesst die Aktualisierung der Daten der Applikation an, indem
durch Aufruf der jeweiligen Apply...()- Methoden die Daten an die
Applikation geschickt werden.
*/
{
lcl_logRulerUse(::rtl::OUString::createFromAscii(".special://SfxRuler/EndDrag"));
const sal_Bool bUndo = IsDragCanceled();
const long lPos = GetDragPos();
DrawLine_Impl(lTabPos, 6, bHorz);
lTabPos=-1;
if(!bUndo)
switch(GetDragType())
{
case RULER_TYPE_MARGIN1: // linker, oberer Rand umgebender Frame
case RULER_TYPE_MARGIN2: // rechter, unterer Rand umgebender Frame
{
if(!pColumnItem || !pColumnItem->IsTable())
ApplyMargins();
if(pColumnItem &&
(pColumnItem->IsTable() ||
(nDragType & DRAG_OBJECT_SIZE_PROPORTIONAL)))
ApplyBorders();
}
break;
case RULER_TYPE_BORDER: // Tabelle, Spalten
if(lInitialDragPos != lPos ||
(pRuler_Imp->bIsTableRows && bHorz)) //special case - the null offset is changed here
{
if(pColumnItem)
{
ApplyBorders();
if(bHorz)
UpdateTabs();
}
else if(pObjectItem)
ApplyObject();
}
break;
case RULER_TYPE_INDENT: // Absatzeinzuege
if(lInitialDragPos != lPos)
ApplyIndents();
SetIndents(INDENT_COUNT, pIndents+INDENT_GAP);
break;
case RULER_TYPE_TAB: // Tabs
{
ApplyTabs();
pTabs[GetDragAryPos()].nStyle &= ~RULER_STYLE_INVISIBLE;
SetTabs(nTabCount, pTabs+TAB_GAP);
}
break;
default: ; //prevent warning
}
nDragType = NONE;
Ruler::EndDrag();
if(bUndo)
for(sal_uInt16 i=0;i<pRuler_Imp->nControlerItems;i++)
{
pCtrlItem[i]->ClearCache();
pCtrlItem[i]->GetBindings().Invalidate(pCtrlItem[i]->GetId());
// pCtrlItem[i]->UnBind();
// pCtrlItem[i]->ReBind();
}
}
void __EXPORT SvxRuler::ExtraDown()
/*
[Beschreibung]
Ueberladene SV-Methode; setzt den neuen Typ fuer den Defaulttabulator.
*/
{
// Tabulator Typ umschalten
if(pTabStopItem &&
(nFlags & SVXRULER_SUPPORT_TABS) == SVXRULER_SUPPORT_TABS) {
++nDefTabType;
if(RULER_TAB_DEFAULT == nDefTabType)
nDefTabType = RULER_TAB_LEFT;
SetExtraType(RULER_EXTRA_TAB, nDefTabType);
}
Ruler::ExtraDown();
}
void __EXPORT SvxRuler::Notify(SfxBroadcaster&, const SfxHint& rHint)
/*
[Beschreibung]
Benachrichtigung durch die Bindings, dass die Statusaktualisierung
beendet ist.
Das Lineal aktualisiert seine Darstellung und meldet sich bei den
Bindings wieder ab.
*/
{
// Aktualisierung anstossen
if(bActive &&
rHint.Type() == TYPE(SfxSimpleHint) &&
((SfxSimpleHint&) rHint ).GetId() == SFX_HINT_UPDATEDONE ) {
Update();
EndListening(*pBindings);
bValid = sal_True;
bListening = sal_False;
}
}
IMPL_LINK_INLINE_START( SvxRuler, MenuSelect, Menu *, pMenu )
/*
[Beschreibung]
Handler des Kontextmenues fuer das Umschalten der Masseinheit
*/
{
SetUnit(FieldUnit(pMenu->GetCurItemId()));
return 0;
}
IMPL_LINK_INLINE_END( SvxRuler, MenuSelect, Menu *, pMenu )
IMPL_LINK( SvxRuler, TabMenuSelect, Menu *, pMenu )
/*
[Beschreibung]
Handler des Tabulatormenues fuer das Setzen des Typs
*/
{
if(pTabStopItem && pTabStopItem->Count() > pRuler_Imp->nIdx)
{
SvxTabStop aTabStop = (*pTabStopItem)[pRuler_Imp->nIdx];
aTabStop.GetAdjustment() = ToAttrTab_Impl(pMenu->GetCurItemId()-1);
pTabStopItem->Remove(pRuler_Imp->nIdx);
pTabStopItem->Insert(aTabStop);
sal_uInt16 nTabStopId = bHorz ? SID_ATTR_TABSTOP : SID_ATTR_TABSTOP_VERTICAL;
pBindings->GetDispatcher()->Execute( nTabStopId, SFX_CALLMODE_RECORD, pTabStopItem, 0L );
UpdateTabs();
pRuler_Imp->nIdx = 0;
}
return 0;
}
void SvxRuler::Command( const CommandEvent& rCEvt )
/*
[Beschreibung]
Mauskontextmenue fuer das Umschalten der Masseinheit
*/
{
if ( COMMAND_CONTEXTMENU == rCEvt.GetCommand() )
{
CancelDrag();
sal_Bool bRTL = pRuler_Imp->pTextRTLItem && pRuler_Imp->pTextRTLItem->GetValue();
if ( pTabs &&
RULER_TYPE_TAB ==
GetType( rCEvt.GetMousePosPixel(), &pRuler_Imp->nIdx ) &&
pTabs[pRuler_Imp->nIdx+TAB_GAP].nStyle < RULER_TAB_DEFAULT )
{
PopupMenu aMenu;
aMenu.SetSelectHdl(LINK(this, SvxRuler, TabMenuSelect));
VirtualDevice aDev;
const Size aSz(RULER_TAB_WIDTH+2, RULER_TAB_HEIGHT+2);
aDev.SetOutputSize(aSz);
aDev.SetBackground(Wallpaper(Color(COL_WHITE)));
const Point aPt(aSz.Width() / 2, aSz.Height() / 2);
for ( sal_uInt16 i = RULER_TAB_LEFT; i < RULER_TAB_DEFAULT; ++i )
{
sal_uInt16 nStyle = bRTL ? i|RULER_TAB_RTL : i;
nStyle |= (sal_uInt16)(bHorz ? WB_HORZ : WB_VERT);
DrawTab(&aDev, aPt, nStyle);
aMenu.InsertItem(i+1,
String(ResId(RID_SVXSTR_RULER_START+i, DIALOG_MGR())),
Image(aDev.GetBitmap(Point(), aSz), Color(COL_WHITE)));
aMenu.CheckItem(i+1, i == pTabs[pRuler_Imp->nIdx+TAB_GAP].nStyle);
aDev.SetOutputSize(aSz); // device loeschen
}
aMenu.Execute( this, rCEvt.GetMousePosPixel() );
}
else
{
PopupMenu aMenu(ResId(RID_SVXMN_RULER, DIALOG_MGR()));
aMenu.SetSelectHdl(LINK(this, SvxRuler, MenuSelect));
FieldUnit eUnit = GetUnit();
const sal_uInt16 nCount = aMenu.GetItemCount();
sal_Bool bReduceMetric = 0 != (nFlags &SVXRULER_SUPPORT_REDUCED_METRIC);
for ( sal_uInt16 i = nCount; i; --i )
{
const sal_uInt16 nId = aMenu.GetItemId(i - 1);
aMenu.CheckItem(nId, nId == (sal_uInt16)eUnit);
if(bReduceMetric &&
(nId == FUNIT_M ||
nId == FUNIT_KM ||
nId == FUNIT_FOOT ||
nId == FUNIT_MILE ))
aMenu.RemoveItem(i - 1);
}
aMenu.Execute( this, rCEvt.GetMousePosPixel() );
}
}
else
Ruler::Command( rCEvt );
}
sal_uInt16 SvxRuler::GetActRightColumn(
sal_Bool bForceDontConsiderHidden, sal_uInt16 nAct ) const
{
if( nAct == USHRT_MAX )
nAct = pColumnItem->GetActColumn();
else nAct++; //Damit man die ActDrag uebergeben kann
sal_Bool bConsiderHidden = !bForceDontConsiderHidden &&
!( nDragType & DRAG_OBJECT_ACTLINE_ONLY );
while( nAct < pColumnItem->Count() - 1 )
{
if( (*pColumnItem)[nAct].bVisible || bConsiderHidden )
return nAct;
else
nAct++;
}
return USHRT_MAX;
}
sal_uInt16 SvxRuler::GetActLeftColumn(
sal_Bool bForceDontConsiderHidden, sal_uInt16 nAct ) const
{
if(nAct==USHRT_MAX)
nAct=pColumnItem->GetActColumn();
sal_uInt16 nLOffs=1;
sal_Bool bConsiderHidden = !bForceDontConsiderHidden &&
!( nDragType & DRAG_OBJECT_ACTLINE_ONLY );
while(nAct>=nLOffs)
{
if( (*pColumnItem)[ nAct - nLOffs ].bVisible || bConsiderHidden )
return nAct-nLOffs;
else
nLOffs++;
}
return USHRT_MAX;
}
sal_Bool SvxRuler::IsActLastColumn(
sal_Bool bForceDontConsiderHidden, sal_uInt16 nAct) const
{
return GetActRightColumn(bForceDontConsiderHidden, nAct)==USHRT_MAX;
}
sal_Bool SvxRuler::IsActFirstColumn(
sal_Bool bForceDontConsiderHidden, sal_uInt16 nAct) const
{
return GetActLeftColumn(bForceDontConsiderHidden, nAct)==USHRT_MAX;
}
long SvxRuler::CalcPropMaxRight(sal_uInt16 nCol) const
{
if(!(nDragType & DRAG_OBJECT_SIZE_LINEAR))
{
// ausgehend vom rechten Rand die Mindestbreiten
// aller betroffenen Spalten abziehen
long _nMaxRight = GetMargin2()-GetMargin1();
long lFences=0;
long lMinSpace=USHRT_MAX;
long lOldPos;
long lColumns=0;
sal_uInt16 nStart;
if(!pColumnItem->IsTable())
{
if(nCol==USHRT_MAX)
{
lOldPos=GetMargin1();
nStart=0;
}
else
{
lOldPos=pBorders[nCol].nPos+pBorders[nCol].nWidth;
nStart=nCol+1;
lFences=pBorders[nCol].nWidth;
}
for(sal_uInt16 i = nStart; i < nBorderCount-1; ++i)
{
long lWidth=pBorders[i].nPos-lOldPos;
lColumns+=lWidth;
if(lWidth<lMinSpace)
lMinSpace=lWidth;
lOldPos=pBorders[i].nPos+pBorders[i].nWidth;
lFences+=pBorders[i].nWidth;
}
long lWidth=GetMargin2()-lOldPos;
lColumns+=lWidth;
if(lWidth<lMinSpace)
lMinSpace=lWidth;
}
else
{
sal_uInt16 nActCol;
if(nCol==USHRT_MAX) //CalcMinMax fuer LeftMargin
{
lOldPos=GetMargin1();
}
else
{
lOldPos=pBorders[nCol].nPos;
}
lColumns=GetMargin2()-lOldPos;
nActCol=nCol;
lFences=0;
while(nActCol<nBorderCount||nActCol==USHRT_MAX)
{
sal_uInt16 nRight;
if(nActCol==USHRT_MAX)
{
nRight=0;
while(!(*pColumnItem)[nRight].bVisible)
nRight++;
}
else
nRight=GetActRightColumn(sal_False, nActCol);
long lWidth;
if(nRight!=USHRT_MAX)
{
lWidth=pBorders[nRight].nPos-lOldPos;
lOldPos=pBorders[nRight].nPos;
}
else
lWidth=GetMargin2()-lOldPos;
nActCol=nRight;
if(lWidth<lMinSpace)
lMinSpace=lWidth;
if(nActCol==USHRT_MAX)
break;
}
}
_nMaxRight-=(long)(lFences+lMinFrame/(float)lMinSpace*lColumns);
return _nMaxRight;
}
else
{
if(pColumnItem->IsTable())
{
sal_uInt16 nVisCols=0;
for(sal_uInt16 i=GetActRightColumn(sal_False, nCol);i<nBorderCount;)
{
if((*pColumnItem)[i].bVisible)
nVisCols++;
i=GetActRightColumn(sal_False, i);
}
return GetMargin2()-GetMargin1()-(nVisCols+1)*lMinFrame;
}
else
{
long lWidth=0;
for(sal_uInt16 i=nCol;i<nBorderCount-1;i++)
{
lWidth+=lMinFrame+pBorders[i].nWidth;
}
return GetMargin2()-GetMargin1()-lWidth;
}
}
}
/*-- 29.11.2007 08:24:23---------------------------------------------------
//#i24363# tab stops relative to indent
-----------------------------------------------------------------------*/
void SvxRuler::SetTabsRelativeToIndent( sal_Bool bRel )
{
pRuler_Imp->bIsTabsRelativeToIndent = bRel;
}