/**************************************************************
 * 
 * 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_sw.hxx"
#ifdef SW_DLLIMPLEMENTATION
#undef SW_DLLIMPLEMENTATION
#endif

#include <com/sun/star/embed/Aspects.hpp>
#include <com/sun/star/embed/EmbedMisc.hpp>

#include <cmdid.h>
#include <helpid.h>
#include <hintids.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/mnemonic.hxx>
#include <svl/urihelper.hxx>
#include <svl/stritem.hxx>
#include <svx/htmlmode.hxx>
#include <editeng/sizeitem.hxx>
#include <editeng/opaqitem.hxx>
#include <editeng/protitem.hxx>
#include <editeng/prntitem.hxx>
#include <editeng/brshitem.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/frmdiritem.hxx>
#include <svx/swframevalidation.hxx>
#include <sot/clsids.hxx>

#include <sfx2/viewfrm.hxx>
#include <fmturl.hxx>
#include <fmteiro.hxx>
#include <fmtcnct.hxx>
#include <view.hxx>
#include <wrtsh.hxx>
#include <swmodule.hxx>
#include <uitool.hxx>
#include <docsh.hxx>
#include <viewopt.hxx>
#include <frmatr.hxx>
#include <frmdlg.hxx>
#include <frmmgr.hxx>
#include <frmpage.hxx>
#include <wrap.hxx>
#include <colmgr.hxx>
#include <grfatr.hxx>
#include <uiitems.hxx>
// OD 19.09.2003 #i18732#
#include <fmtfollowtextflow.hxx>

#include <frmui.hrc>
#include <frmpage.hrc>
#include <sfx2/filedlghelper.hxx>
#include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
#include <com/sun/star/ui/dialogs/XFilePicker.hpp>
#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
#include <svtools/filter.hxx>

using namespace ::com::sun::star;
using ::rtl::OUString;
using namespace ::sfx2;

#define SwFPos SvxSwFramePosString

struct FrmMap
{
    SvxSwFramePosString::StringId eStrId;
    SvxSwFramePosString::StringId eMirrorStrId;
	sal_uInt16 nAlign;
	sal_uLong  nLBRelations;
};

struct RelationMap
{
    SvxSwFramePosString::StringId eStrId;
    SvxSwFramePosString::StringId eMirrorStrId;
	sal_uLong  nLBRelation;
	sal_uInt16 nRelation;
};

struct StringIdPair_Impl
{
    SvxSwFramePosString::StringId eHori;
    SvxSwFramePosString::StringId eVert;
};

#define MAX_PERCENT_WIDTH   254L
#define MAX_PERCENT_HEIGHT  254L

// OD 19.09.2003 #i18732# - change order of alignments
#define LB_FRAME                0x00000001L // Textbereich des Absatzes
#define LB_PRTAREA				0x00000002L	// Textbereich des Absatzes + Einzuege
#define LB_VERT_FRAME           0x00000004L // Vertikaler Textbereich des Absatzes
#define LB_VERT_PRTAREA         0x00000008L // Vertikaler Textbereich des Absatzes + Einzuege
#define LB_REL_FRM_LEFT         0x00000010L // Linker Absatzrand
#define LB_REL_FRM_RIGHT        0x00000020L // Rechter Absatzrand

#define LB_REL_PG_LEFT          0x00000040L // Linker Seitenrand
#define LB_REL_PG_RIGHT         0x00000080L    // Rechter Seitenrand
#define LB_REL_PG_FRAME         0x00000100L // Gesamte Seite
#define LB_REL_PG_PRTAREA       0x00000200L    // Textbereich der Seite

#define LB_FLY_REL_PG_LEFT      0x00000400L    // Linker Rahmenrand
#define LB_FLY_REL_PG_RIGHT     0x00000800L    // Rechter Rahmenrand
#define LB_FLY_REL_PG_FRAME     0x00001000L    // Gesamte Rahmen
#define LB_FLY_REL_PG_PRTAREA   0x00002000L    // Rahmeninneres

#define LB_REL_BASE				0x00010000L	// Zeichenausrichtung Basis
#define LB_REL_CHAR				0x00020000L	// Zeichenausrichtung Zeichen
#define LB_REL_ROW				0x00040000L	// Zeichenausrichtung Zeile

// OD 10.11.2003 #i22305#
#define LB_FLY_VERT_FRAME       0x00100000L // vertical entire frame
#define LB_FLY_VERT_PRTAREA     0x00200000L // vertical frame text area

// OD 11.11.2003 #i22341#
#define LB_VERT_LINE            0x00400000L // vertical text line

static RelationMap __FAR_DATA aRelationMap[] =
{
    {SwFPos::FRAME,  SwFPos::FRAME, LB_FRAME, text::RelOrientation::FRAME},
    {SwFPos::PRTAREA,           SwFPos::PRTAREA,                LB_PRTAREA,             text::RelOrientation::PRINT_AREA},
    {SwFPos::REL_PG_LEFT,       SwFPos::MIR_REL_PG_LEFT,        LB_REL_PG_LEFT,         text::RelOrientation::PAGE_LEFT},
    {SwFPos::REL_PG_RIGHT,      SwFPos::MIR_REL_PG_RIGHT,       LB_REL_PG_RIGHT,        text::RelOrientation::PAGE_RIGHT},
    {SwFPos::REL_FRM_LEFT,      SwFPos::MIR_REL_FRM_LEFT,       LB_REL_FRM_LEFT,        text::RelOrientation::FRAME_LEFT},
    {SwFPos::REL_FRM_RIGHT,     SwFPos::MIR_REL_FRM_RIGHT,      LB_REL_FRM_RIGHT,       text::RelOrientation::FRAME_RIGHT},
    {SwFPos::REL_PG_FRAME,      SwFPos::REL_PG_FRAME,           LB_REL_PG_FRAME,        text::RelOrientation::PAGE_FRAME},
    {SwFPos::REL_PG_PRTAREA,    SwFPos::REL_PG_PRTAREA,         LB_REL_PG_PRTAREA,      text::RelOrientation::PAGE_PRINT_AREA},
    {SwFPos::REL_CHAR,          SwFPos::REL_CHAR,               LB_REL_CHAR,            text::RelOrientation::CHAR},

    {SwFPos::FLY_REL_PG_LEFT,       SwFPos::FLY_MIR_REL_PG_LEFT,    LB_FLY_REL_PG_LEFT,     text::RelOrientation::PAGE_LEFT},
    {SwFPos::FLY_REL_PG_RIGHT,      SwFPos::FLY_MIR_REL_PG_RIGHT,   LB_FLY_REL_PG_RIGHT,    text::RelOrientation::PAGE_RIGHT},
    {SwFPos::FLY_REL_PG_FRAME,      SwFPos::FLY_REL_PG_FRAME,       LB_FLY_REL_PG_FRAME,    text::RelOrientation::PAGE_FRAME},
    {SwFPos::FLY_REL_PG_PRTAREA,    SwFPos::FLY_REL_PG_PRTAREA,     LB_FLY_REL_PG_PRTAREA,  text::RelOrientation::PAGE_PRINT_AREA},

    {SwFPos::REL_BORDER,        SwFPos::REL_BORDER,             LB_VERT_FRAME,          text::RelOrientation::FRAME},
    {SwFPos::REL_PRTAREA,       SwFPos::REL_PRTAREA,            LB_VERT_PRTAREA,        text::RelOrientation::PRINT_AREA},

    // OD 10.11.2003 #i22305#
    {SwFPos::FLY_REL_PG_FRAME,      SwFPos::FLY_REL_PG_FRAME,   LB_FLY_VERT_FRAME,      text::RelOrientation::FRAME},
    {SwFPos::FLY_REL_PG_PRTAREA,    SwFPos::FLY_REL_PG_PRTAREA,     LB_FLY_VERT_PRTAREA,    text::RelOrientation::PRINT_AREA},

    // OD 11.11.2003 #i22341#
    {SwFPos::REL_LINE,  SwFPos::REL_LINE,   LB_VERT_LINE,   text::RelOrientation::TEXT_LINE}
};

static RelationMap __FAR_DATA aAsCharRelationMap[] =
{
    {SwFPos::REL_BASE,  SwFPos::REL_BASE,   LB_REL_BASE,    text::RelOrientation::FRAME},
    {SwFPos::REL_CHAR,   SwFPos::REL_CHAR,   LB_REL_CHAR,   text::RelOrientation::FRAME},
    {SwFPos::REL_ROW,    SwFPos::REL_ROW,   LB_REL_ROW,     text::RelOrientation::FRAME}
};

/*--------------------------------------------------------------------
	Beschreibung: Seite verankert
 --------------------------------------------------------------------*/

#define HORI_PAGE_REL	(LB_REL_PG_FRAME|LB_REL_PG_PRTAREA|LB_REL_PG_LEFT| \
						LB_REL_PG_RIGHT)

static FrmMap __FAR_DATA aHPageMap[] =
{
    {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      HORI_PAGE_REL},
    {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     HORI_PAGE_REL},
    {SwFPos::CENTER_HORI,   SwFPos::CENTER_HORI,    text::HoriOrientation::CENTER,    HORI_PAGE_REL},
    {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      HORI_PAGE_REL}
};

static FrmMap __FAR_DATA aHPageHtmlMap[] =
{
    {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      LB_REL_PG_FRAME}
};

#define VERT_PAGE_REL	(LB_REL_PG_FRAME|LB_REL_PG_PRTAREA)

static FrmMap __FAR_DATA aVPageMap[] =
{
    {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,       VERT_PAGE_REL},
    {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::BOTTOM,    VERT_PAGE_REL},
    {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,    VERT_PAGE_REL},
    {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,      VERT_PAGE_REL}
};

static FrmMap __FAR_DATA aVPageHtmlMap[] =
{
    {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,      LB_REL_PG_FRAME}
};

/*--------------------------------------------------------------------
	Beschreibung: Rahmen verankert
 --------------------------------------------------------------------*/

#define HORI_FRAME_REL	(LB_FLY_REL_PG_FRAME|LB_FLY_REL_PG_PRTAREA| \
						LB_FLY_REL_PG_LEFT|LB_FLY_REL_PG_RIGHT)

static FrmMap __FAR_DATA aHFrameMap[] =
{
    {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,  HORI_FRAME_REL},
    {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     HORI_FRAME_REL},
    {SwFPos::CENTER_HORI,   SwFPos::CENTER_HORI,    text::HoriOrientation::CENTER,    HORI_FRAME_REL},
    {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      HORI_FRAME_REL}
};

static FrmMap __FAR_DATA aHFlyHtmlMap[] =
{
    {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      LB_FLY_REL_PG_FRAME},
    {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      LB_FLY_REL_PG_FRAME}
};

// OD 19.09.2003 #i18732# - own vertical alignment map for to frame anchored objects
// OD 10.11.2003 #i22305#
#define VERT_FRAME_REL   (LB_FLY_VERT_FRAME|LB_FLY_VERT_PRTAREA)

static FrmMap __FAR_DATA aVFrameMap[] =
{
    {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,       VERT_FRAME_REL},
    {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::BOTTOM,    VERT_FRAME_REL},
    {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,    VERT_FRAME_REL},
    {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,      VERT_FRAME_REL}
};

static FrmMap __FAR_DATA aVFlyHtmlMap[] =
{
    // OD 10.11.2003 #i22305#
    {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,       LB_FLY_VERT_FRAME},
    {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,      LB_FLY_VERT_FRAME}
};

/*--------------------------------------------------------------------
	Beschreibung: Absatz verankert
 --------------------------------------------------------------------*/

#define HORI_PARA_REL	(LB_FRAME|LB_PRTAREA|LB_REL_PG_LEFT|LB_REL_PG_RIGHT| \
						LB_REL_PG_FRAME|LB_REL_PG_PRTAREA|LB_REL_FRM_LEFT| \
						LB_REL_FRM_RIGHT)

static FrmMap __FAR_DATA aHParaMap[] =
{
    {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      HORI_PARA_REL},
    {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     HORI_PARA_REL},
    {SwFPos::CENTER_HORI,   SwFPos::CENTER_HORI,    text::HoriOrientation::CENTER,    HORI_PARA_REL},
    {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      HORI_PARA_REL}
};

#define HTML_HORI_PARA_REL	(LB_FRAME|LB_PRTAREA)

static FrmMap __FAR_DATA aHParaHtmlMap[] =
{
    {SwFPos::LEFT,  SwFPos::LEFT,   text::HoriOrientation::LEFT,      HTML_HORI_PARA_REL},
    {SwFPos::RIGHT, SwFPos::RIGHT,  text::HoriOrientation::RIGHT,     HTML_HORI_PARA_REL}
};

static FrmMap __FAR_DATA aHParaHtmlAbsMap[] =
{
    {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      HTML_HORI_PARA_REL},
    {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     HTML_HORI_PARA_REL}
};

// OD 19.09.2003 #i18732# - allow vertical alignment at page areas
#define VERT_PARA_REL   (LB_VERT_FRAME|LB_VERT_PRTAREA| \
                         LB_REL_PG_FRAME|LB_REL_PG_PRTAREA)

static FrmMap __FAR_DATA aVParaMap[] =
{
    {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,       VERT_PARA_REL},
    {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::BOTTOM,    VERT_PARA_REL},
    {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,    VERT_PARA_REL},
    {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,      VERT_PARA_REL}
};

static FrmMap __FAR_DATA aVParaHtmlMap[] =
{
    {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,       LB_VERT_PRTAREA}
};

/*--------------------------------------------------------------------
	Beschreibung: Relativ zum Zeichen verankert
 --------------------------------------------------------------------*/

#define HORI_CHAR_REL	(LB_FRAME|LB_PRTAREA|LB_REL_PG_LEFT|LB_REL_PG_RIGHT| \
						LB_REL_PG_FRAME|LB_REL_PG_PRTAREA|LB_REL_FRM_LEFT| \
						LB_REL_FRM_RIGHT|LB_REL_CHAR)

static FrmMap __FAR_DATA aHCharMap[] =
{
    {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      HORI_CHAR_REL},
    {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     HORI_CHAR_REL},
    {SwFPos::CENTER_HORI,   SwFPos::CENTER_HORI,    text::HoriOrientation::CENTER,    HORI_CHAR_REL},
    {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      HORI_CHAR_REL}
};

#define HTML_HORI_CHAR_REL	(LB_FRAME|LB_PRTAREA|LB_REL_CHAR)

static FrmMap __FAR_DATA aHCharHtmlMap[] =
{
    {SwFPos::LEFT,          SwFPos::LEFT,           text::HoriOrientation::LEFT,      HTML_HORI_CHAR_REL},
    {SwFPos::RIGHT,         SwFPos::RIGHT,          text::HoriOrientation::RIGHT,     HTML_HORI_CHAR_REL}
};

static FrmMap __FAR_DATA aHCharHtmlAbsMap[] =
{
    {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      LB_PRTAREA|LB_REL_CHAR},
    {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     LB_PRTAREA},
    {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      LB_REL_PG_FRAME}
};

// OD 19.09.2003 #i18732# - allow vertical alignment at page areas
// OD 12.11.2003 #i22341# - handle <LB_REL_CHAR> on its own
#define VERT_CHAR_REL   (LB_VERT_FRAME|LB_VERT_PRTAREA| \
                         LB_REL_PG_FRAME|LB_REL_PG_PRTAREA)

static FrmMap __FAR_DATA aVCharMap[] =
{
    // OD 11.11.2003 #i22341#
    // introduce mappings for new vertical alignment at top of line <LB_VERT_LINE>
    // and correct mapping for vertical alignment at character for position <FROM_BOTTOM>
    // Note: Because of these adjustments the map becomes ambigous in its values
    //       <eStrId>/<eMirrorStrId> and <nAlign>. These ambiguities are considered
    //       in the methods <SwFrmPage::FillRelLB(..)>, <SwFrmPage::GetAlignment(..)>
    //       and <SwFrmPage::FillPosLB(..)>
    {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,           VERT_CHAR_REL|LB_REL_CHAR},
    {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::BOTTOM,        VERT_CHAR_REL|LB_REL_CHAR},
    {SwFPos::BELOW,         SwFPos::BELOW,          text::VertOrientation::CHAR_BOTTOM,   LB_REL_CHAR},
    {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,        VERT_CHAR_REL|LB_REL_CHAR},
    {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,          VERT_CHAR_REL},
    {SwFPos::FROMBOTTOM,    SwFPos::FROMBOTTOM,     text::VertOrientation::NONE,          LB_REL_CHAR|LB_VERT_LINE},
    {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::LINE_TOP,      LB_VERT_LINE},
    {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::LINE_BOTTOM,   LB_VERT_LINE},
    {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::LINE_CENTER,   LB_VERT_LINE}
};


static FrmMap __FAR_DATA aVCharHtmlMap[] =
{
    {SwFPos::BELOW,         SwFPos::BELOW,          text::VertOrientation::CHAR_BOTTOM,   LB_REL_CHAR}
};

static FrmMap __FAR_DATA aVCharHtmlAbsMap[] =
{
    {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,           LB_REL_CHAR},
    {SwFPos::BELOW,             SwFPos::BELOW,          text::VertOrientation::CHAR_BOTTOM,   LB_REL_CHAR}
};
/*--------------------------------------------------------------------
	Beschreibung: Als Zeichen verankert
 --------------------------------------------------------------------*/

static FrmMap __FAR_DATA aVAsCharMap[] =
{
    {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::TOP,           LB_REL_BASE},
    {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::BOTTOM,        LB_REL_BASE},
    {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,        LB_REL_BASE},

    {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::CHAR_TOP,      LB_REL_CHAR},
    {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::CHAR_BOTTOM,   LB_REL_CHAR},
    {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CHAR_CENTER,   LB_REL_CHAR},

    {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::LINE_TOP,      LB_REL_ROW},
    {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::LINE_BOTTOM,   LB_REL_ROW},
    {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::LINE_CENTER,   LB_REL_ROW},

    {SwFPos::FROMBOTTOM,    SwFPos::FROMBOTTOM,     text::VertOrientation::NONE,          LB_REL_BASE}
};

static FrmMap __FAR_DATA aVAsCharHtmlMap[] =
{
    {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::TOP,           LB_REL_BASE},
    {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,        LB_REL_BASE},

    {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::CHAR_TOP,      LB_REL_CHAR},

    {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::LINE_TOP,      LB_REL_ROW},
    {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::LINE_BOTTOM,   LB_REL_ROW},
    {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::LINE_CENTER,   LB_REL_ROW}
};

static sal_uInt16 __FAR_DATA aPageRg[] = {
	RES_FRM_SIZE, RES_FRM_SIZE,
	RES_VERT_ORIENT, RES_ANCHOR,
	RES_COL, RES_COL,
    RES_FOLLOW_TEXT_FLOW, RES_FOLLOW_TEXT_FLOW,
	0
};
static sal_uInt16 __FAR_DATA aAddPgRg[] = {
	RES_PROTECT, 			RES_PROTECT,
	RES_PRINT, 				RES_PRINT,
	FN_SET_FRM_NAME,		FN_SET_FRM_NAME,
	FN_SET_FRM_ALT_NAME,	FN_SET_FRM_ALT_NAME,
	0
};

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

size_t lcl_GetFrmMapCount( const FrmMap* pMap)
{
	if ( pMap )
	{
		int aSizeOf = sizeof(FrmMap);
		if( pMap == aVParaHtmlMap)
			return sizeof(aVParaHtmlMap) / aSizeOf;
		if( pMap == aVAsCharHtmlMap)
			return sizeof(aVAsCharHtmlMap) / aSizeOf;
		if( pMap == aHParaHtmlMap)
			return sizeof(aHParaHtmlMap) / aSizeOf;
		if( pMap == aHParaHtmlAbsMap)
			return sizeof(aHParaHtmlAbsMap) / aSizeOf;
		if ( pMap == aVPageMap )
			return sizeof(aVPageMap) / aSizeOf;
		if ( pMap == aVPageHtmlMap )
			return sizeof(aVPageHtmlMap) / aSizeOf;
		if ( pMap == aVAsCharMap )
			return sizeof(aVAsCharMap) / aSizeOf;
		if ( pMap == aVParaMap )
			return sizeof(aVParaMap) / aSizeOf;
		if ( pMap == aHParaMap )
			return sizeof(aHParaMap) / aSizeOf;
		if ( pMap == aHFrameMap )
			return sizeof(aHFrameMap) / aSizeOf;
        // OD 19.09.2003 #i18732# - own vertical alignment map for to frame anchored objects
        if ( pMap == aVFrameMap )
            return sizeof(aVFrameMap) / aSizeOf;
		if ( pMap == aHCharMap )
			return sizeof(aHCharMap) / aSizeOf;
		if ( pMap == aHCharHtmlMap )
			return sizeof(aHCharHtmlMap) / aSizeOf;
		if ( pMap == aHCharHtmlAbsMap )
			return sizeof(aHCharHtmlAbsMap) / aSizeOf;
		if ( pMap == aVCharMap )
			return sizeof(aVCharMap) / aSizeOf;
		if ( pMap == aVCharHtmlMap )
			return sizeof(aVCharHtmlMap) / aSizeOf;
		if ( pMap == aVCharHtmlAbsMap )
			return sizeof(aVCharHtmlAbsMap) / aSizeOf;
		if ( pMap == aHPageHtmlMap )
			return sizeof(aHPageHtmlMap) / aSizeOf;
		if ( pMap == aHFlyHtmlMap )
			return sizeof(aHFlyHtmlMap) / aSizeOf;
		if ( pMap == aVFlyHtmlMap )
			return sizeof(aVFlyHtmlMap) / aSizeOf;
		return sizeof(aHPageMap) / aSizeOf;
	}
	return 0;
}
/* -----------------------------08.08.2002 14:45------------------------------

 ---------------------------------------------------------------------------*/
void lcl_InsertVectors(ListBox& rBox,
    const ::std::vector< String >& rPrev, const ::std::vector< String >& rThis,
    const ::std::vector< String >& rNext, const ::std::vector< String >& rRemain)
{
    ::std::vector< String >::const_iterator aIt;
    sal_uInt16 nEntry = 0;
    for(aIt = rPrev.begin(); aIt != rPrev.end(); aIt++)
        nEntry = rBox.InsertEntry(*aIt);
    for(aIt = rThis.begin(); aIt != rThis.end(); aIt++)
        nEntry = rBox.InsertEntry(*aIt);
    for(aIt = rNext.begin(); aIt != rNext.end(); aIt++)
        nEntry = rBox.InsertEntry(*aIt);
    rBox.SetSeparatorPos(nEntry);
	//now insert all strings sorted
	sal_uInt16 nStartPos = rBox.GetEntryCount();

    for(aIt = rPrev.begin(); aIt != rPrev.end(); aIt++)
		::InsertStringSorted(*aIt, rBox, nStartPos );
    for(aIt = rThis.begin(); aIt != rThis.end(); aIt++)
		::InsertStringSorted(*aIt, rBox, nStartPos );
    for(aIt = rNext.begin(); aIt != rNext.end(); aIt++)
		::InsertStringSorted(*aIt, rBox, nStartPos );
    for(aIt = rRemain.begin(); aIt != rRemain.end(); aIt++)
		::InsertStringSorted(*aIt, rBox, nStartPos );
}

/* -----------------------------20.08.2002 16:12------------------------------

 ---------------------------------------------------------------------------*/
// --> OD 2009-08-31 #mongolianlayout#
// add input parameter
SvxSwFramePosString::StringId lcl_ChangeResIdToVerticalOrRTL(SvxSwFramePosString::StringId eStringId, sal_Bool bVertical, sal_Bool bVerticalL2R, sal_Bool bRTL)
{
    //special handling of STR_FROMLEFT
    if ( SwFPos::FROMLEFT == eStringId )
    {
        eStringId = bVertical
                    ? ( bRTL
                        ? SwFPos::FROMBOTTOM
                        : SwFPos::FROMTOP )
                    : ( bRTL
                        ? SwFPos::FROMRIGHT
                        : SwFPos::FROMLEFT );
        return eStringId;
    }
    // --> OD 2009-08-31 #mongolianlayout#
    // special handling of STR_FROMTOP in case of mongolianlayout (vertical left-to-right)
    if ( SwFPos::FROMTOP == eStringId &&
         bVertical && bVerticalL2R )
    {
        eStringId = SwFPos::FROMLEFT;
        return eStringId;
    }
    // <--
    if ( bVertical )
    {
        //exchange horizontal strings with vertical strings and vice versa
        static const StringIdPair_Impl aHoriIds[] =
        {
            {SwFPos::LEFT,           SwFPos::TOP},
            {SwFPos::RIGHT,          SwFPos::BOTTOM},
            {SwFPos::CENTER_HORI,    SwFPos::CENTER_VERT},
            {SwFPos::FROMTOP,        SwFPos::FROMRIGHT},
            {SwFPos::REL_PG_LEFT,    SwFPos::REL_PG_TOP},
            {SwFPos::REL_PG_RIGHT,   SwFPos::REL_PG_BOTTOM} ,
            {SwFPos::REL_FRM_LEFT,   SwFPos::REL_FRM_TOP},
            {SwFPos::REL_FRM_RIGHT,  SwFPos::REL_FRM_BOTTOM}
        };
        static const StringIdPair_Impl aVertIds[] =
        {
            {SwFPos::TOP,            SwFPos::RIGHT},
            {SwFPos::BOTTOM,         SwFPos::LEFT },
            {SwFPos::CENTER_VERT,    SwFPos::CENTER_HORI},
            {SwFPos::FROMTOP,        SwFPos::FROMRIGHT },
            {SwFPos::REL_PG_TOP,     SwFPos::REL_PG_LEFT },
            {SwFPos::REL_PG_BOTTOM,  SwFPos::REL_PG_RIGHT } ,
            {SwFPos::REL_FRM_TOP,    SwFPos::REL_FRM_LEFT },
            {SwFPos::REL_FRM_BOTTOM, SwFPos::REL_FRM_RIGHT }
        };
        // --> OD 2009-08-31 #monglianlayout#
        static const StringIdPair_Impl aVertL2RIds[] =
        {
            {SwFPos::TOP,            SwFPos::LEFT },
            {SwFPos::BOTTOM,         SwFPos::RIGHT },
            {SwFPos::CENTER_VERT,    SwFPos::CENTER_HORI },
            {SwFPos::FROMTOP,        SwFPos::FROMLEFT },
            {SwFPos::REL_PG_TOP,     SwFPos::REL_PG_LEFT },
            {SwFPos::REL_PG_BOTTOM,  SwFPos::REL_PG_RIGHT } ,
            {SwFPos::REL_FRM_TOP,    SwFPos::REL_FRM_LEFT },
            {SwFPos::REL_FRM_BOTTOM, SwFPos::REL_FRM_RIGHT }
        };
        // <--
        sal_uInt16 nIndex;
        for(nIndex = 0; nIndex < sizeof(aHoriIds) / sizeof(StringIdPair_Impl); ++nIndex)
        {
            if(aHoriIds[nIndex].eHori == eStringId)
            {
                eStringId = aHoriIds[nIndex].eVert;
                return eStringId;
            }
        }
        nIndex = 0;
        for(nIndex = 0; nIndex < sizeof(aVertIds) / sizeof(StringIdPair_Impl); ++nIndex)
        {
            // --> OD 2009-08-31 #mongolianlayout#
            if ( !bVerticalL2R )
            {
                if(aVertIds[nIndex].eHori == eStringId)
                {
                    eStringId = aVertIds[nIndex].eVert;
                    break;
                }
            }
            else
            {
                if(aVertL2RIds[nIndex].eHori == eStringId)
                {
                    eStringId = aVertL2RIds[nIndex].eVert;
                    break;
                }
            }
            // <--
        }
    }
    return eStringId;
}

// OD 12.11.2003 #i22341# - helper method in order to determine all possible
// listbox relations in a relation map for a given relation
sal_uLong lcl_GetLBRelationsForRelations( const sal_uInt16 _nRel )
{
    sal_uLong nLBRelations = 0L;

    sal_uInt16 nRelMapSize = sizeof(aRelationMap) / sizeof(RelationMap);
    for ( sal_uInt16 nRelMapPos = 0; nRelMapPos < nRelMapSize; ++nRelMapPos )
    {
        if ( aRelationMap[nRelMapPos].nRelation == _nRel )
        {
            nLBRelations |= aRelationMap[nRelMapPos].nLBRelation;
        }
    }

    return nLBRelations;
}

// OD 14.11.2003 #i22341# - helper method on order to determine all possible
// listbox relations in a relation map for a given string ID
sal_uLong lcl_GetLBRelationsForStrID( const FrmMap* _pMap,
                                  const SvxSwFramePosString::StringId _eStrId,
                                  const bool _bUseMirrorStr )
{
    sal_uLong nLBRelations = 0L;

    size_t nRelMapSize = lcl_GetFrmMapCount( _pMap );
    for ( size_t nRelMapPos = 0; nRelMapPos < nRelMapSize; ++nRelMapPos )
    {
        if ( ( !_bUseMirrorStr && _pMap[nRelMapPos].eStrId == _eStrId ) ||
             ( _bUseMirrorStr && _pMap[nRelMapPos].eMirrorStrId == _eStrId ) )
        {
            nLBRelations |= _pMap[nRelMapPos].nLBRelations;
        }
    }

    return nLBRelations;
}

/*--------------------------------------------------------------------
	Beschreibung:	StandardRahmenTabPage
 --------------------------------------------------------------------*/

namespace
{
	void HandleAutoCB( sal_Bool _bChecked, FixedText& _rFT_man, FixedText& _rFT_auto )
	{
		_rFT_man.Show( !_bChecked );
		_rFT_auto.Show( _bChecked );
	}
}


SwFrmPage::SwFrmPage ( Window *pParent, const SfxItemSet &rSet ) :
	SfxTabPage		(pParent, SW_RES(TP_FRM_STD), rSet),

    aSizeFL         (this, SW_RES(FL_SIZE)),
    aWidthFT        (this, SW_RES(FT_WIDTH)),
	aWidthAutoFT	(this, SW_RES(FT_WIDTH_AUTO)),
	aWidthED		(this, SW_RES(ED_WIDTH)),
	aRelWidthCB		(this, SW_RES(CB_REL_WIDTH)),
	aAutoWidthCB	(this, SW_RES(CB_AUTOWIDTH)),
	aHeightFT		(this, SW_RES(FT_HEIGHT)),
	aHeightAutoFT	(this, SW_RES(FT_HEIGHT_AUTO)),
	aHeightED		(this, SW_RES(ED_HEIGHT)),
	aRelHeightCB	(this, SW_RES(CB_REL_HEIGHT)),
	aAutoHeightCB	(this, SW_RES(CB_AUTOHEIGHT)),
	aFixedRatioCB	(this, SW_RES(CB_FIXEDRATIO)),
    aRealSizeBT     (this, SW_RES(BT_REALSIZE)),

    aTypeSepFL     (this, SW_RES(FL_TYPE_SEP)),
    aTypeFL        (this, SW_RES(FL_TYPE)),
    aAnchorAtPageRB (this, SW_RES(RB_ANCHOR_PAGE)),
	aAnchorAtParaRB	(this, SW_RES(RB_ANCHOR_PARA)),
	aAnchorAtCharRB	(this, SW_RES(RB_ANCHOR_AT_CHAR)),
	aAnchorAsCharRB	(this, SW_RES(RB_ANCHOR_AS_CHAR)),
	aAnchorAtFrameRB(this, SW_RES(RB_ANCHOR_FRAME)),

    aPositionFL     (this, SW_RES(FL_POSITION)),
	aHorizontalFT	(this, SW_RES(FT_HORIZONTAL)),
	aHorizontalDLB	(this, SW_RES(DLB_HORIZONTAL)),
	aAtHorzPosFT	(this, SW_RES(FT_AT_HORZ_POS)),
	aAtHorzPosED	(this, SW_RES(ED_AT_HORZ_POS)),
	aHoriRelationFT (this, SW_RES(FT_HORI_RELATION)),
	aHoriRelationLB (this, SW_RES(LB_HORI_RELATION)),
	aMirrorPagesCB  (this, SW_RES(CB_MIRROR)),
	aVerticalFT		(this, SW_RES(FT_VERTICAL)),
	aVerticalDLB	(this, SW_RES(DLB_VERTICAL)),
	aAtVertPosFT	(this, SW_RES(FT_AT_VERT_POS)),
	aAtVertPosED	(this, SW_RES(ED_AT_VERT_POS)),
	aVertRelationFT (this, SW_RES(FT_VERT_RELATION)),
	aVertRelationLB (this, SW_RES(LB_VERT_RELATION)),
    // OD 19.09.2003 #i18732# - new checkbox
    aFollowTextFlowCB(this, SW_RES(CB_FOLLOWTEXTFLOW)),

    aExampleWN      (this, SW_RES(WN_BSP)),

    bAtHorzPosModified( sal_False ),
    bAtVertPosModified( sal_False ),
    bFormat(sal_False),
    bNew(sal_True),
    bNoModifyHdl(sal_True),
    // --> OD 2009-08-31 #mongolianlayout# - no used
//    bVerticalChanged(FALSE),
    // <--
    bIsVerticalFrame(sal_False),
    // --> OD 2009-08-31 #mongolianlayou#
    bIsVerticalL2R(sal_False),
    // <--
    bIsInRightToLeft(sal_False),
    bHtmlMode(sal_False),
    nHtmlMode(0),
    nDlgType(0),
    nUpperBorder(0),
	nLowerBorder(0),
    fWidthHeightRatio(1.0),
    // OD 12.11.2003 #i22341#
    mpToCharCntntPos( NULL ),

    nOldH(text::HoriOrientation::CENTER),
    nOldHRel(text::RelOrientation::FRAME),
    nOldV(text::VertOrientation::TOP),
    nOldVRel(text::RelOrientation::PRINT_AREA),
    pVMap( 0 ),
    pHMap( 0 ),
    m_bAllowVertPositioning( true ),
    m_bIsMathOLE( false ),
    m_bIsMathBaselineAlignment( true )
{
	FreeResource();
	SetExchangeSupport();

	aRealSizeBT.SetAccessibleRelationMemberOf(&aSizeFL);

	Link aLk = LINK(this, SwFrmPage, RangeModifyHdl);
	aWidthED.	 SetLoseFocusHdl( aLk );
	aHeightED.	 SetLoseFocusHdl( aLk );
	aAtHorzPosED.SetLoseFocusHdl( aLk );
	aAtVertPosED.SetLoseFocusHdl( aLk );
    // OD 25.09.2003 #i18732# - click handler for new checkbox
    aFollowTextFlowCB.SetClickHdl( aLk );

	aLk = LINK(this, SwFrmPage, ModifyHdl);
	aWidthED.	 SetModifyHdl( aLk );
	aHeightED.	 SetModifyHdl( aLk );
	aAtHorzPosED.SetModifyHdl( aLk );
	aAtVertPosED.SetModifyHdl( aLk );

	aLk = LINK(this, SwFrmPage, AnchorTypeHdl);
	aAnchorAtPageRB.SetClickHdl( aLk );
	aAnchorAtParaRB.SetClickHdl( aLk );
	aAnchorAtCharRB.SetClickHdl( aLk );
	aAnchorAsCharRB.SetClickHdl( aLk );
	aAnchorAtFrameRB.SetClickHdl( aLk );

	aHorizontalDLB.SetSelectHdl(LINK(this, SwFrmPage, PosHdl));
	aVerticalDLB.  SetSelectHdl(LINK(this, SwFrmPage, PosHdl));

	aHoriRelationLB.SetSelectHdl(LINK(this, SwFrmPage, RelHdl));
	aVertRelationLB.SetSelectHdl(LINK(this, SwFrmPage, RelHdl));

	aMirrorPagesCB.SetClickHdl(LINK(this, SwFrmPage, MirrorHdl));

	aLk = LINK(this, SwFrmPage, RelSizeClickHdl);
	aRelWidthCB.SetClickHdl( aLk );
	aRelHeightCB.SetClickHdl( aLk );

	aAutoWidthCB.SetClickHdl( LINK( this, SwFrmPage, AutoWidthClickHdl ) );
	aAutoHeightCB.SetClickHdl( LINK( this, SwFrmPage, AutoHeightClickHdl ) );
}

/*--------------------------------------------------------------------
	Beschreibung:	Dtor
 --------------------------------------------------------------------*/

SwFrmPage::~SwFrmPage()
{
}

SfxTabPage* SwFrmPage::Create(Window *pParent, const SfxItemSet &rSet)
{
	return new SwFrmPage( pParent, rSet );
}

namespace
{
	void MoveControl( Control& _rCtrl, long _nOffsetY )
	{
		Point aPt( _rCtrl.GetPosPixel() );
		aPt.Move( 0, _nOffsetY );
		_rCtrl.SetPosPixel( aPt );
	}
}

void SwFrmPage::EnableGraficMode( void )
{
    // #i39692# mustn't be called more than once
    if(!aRealSizeBT.IsVisible())
    {
        long nOffset1 = aRelWidthCB.GetPosPixel().Y() - aAutoWidthCB.GetPosPixel().Y();
        long nOffset2 = nOffset1 + aRelHeightCB.GetPosPixel().Y() - aAutoHeightCB.GetPosPixel().Y();

        MoveControl( aHeightFT, nOffset1 );
        MoveControl( aHeightED, nOffset1 );
        MoveControl( aRelHeightCB, nOffset1 );
        MoveControl( aFixedRatioCB, nOffset2 );

        aWidthFT.Show();
        aWidthAutoFT.Hide();
        aAutoHeightCB.Hide();

        aHeightFT.Show();
        aHeightAutoFT.Hide();
        aAutoWidthCB.Hide();

        aRealSizeBT.Show();
    }
}

void SwFrmPage::Reset( const SfxItemSet &rSet )
{

	SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell() :
			((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();

	nHtmlMode = ::GetHtmlMode(pSh->GetView().GetDocShell());
	bHtmlMode = nHtmlMode & HTMLMODE_ON ? sal_True : sal_False;

	FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
	SetMetric( aWidthED, aMetric );
	SetMetric( aHeightED, aMetric );
	SetMetric( aAtHorzPosED, aMetric );
	SetMetric( aAtVertPosED, aMetric );

	const SfxPoolItem* pItem = NULL;

	const SwFmtAnchor& rAnchor = (const SwFmtAnchor&)rSet.Get(RES_ANCHOR);

    if (SFX_ITEM_SET == rSet.GetItemState(FN_OLE_IS_MATH, sal_False, &pItem))
        m_bIsMathOLE = ((const SfxBoolItem*)pItem)->GetValue();
    if (SFX_ITEM_SET == rSet.GetItemState(FN_MATH_BASELINE_ALIGNMENT, sal_False, &pItem))
        m_bIsMathBaselineAlignment = ((const SfxBoolItem*)pItem)->GetValue();
    EnableVerticalPositioning( !(m_bIsMathOLE && m_bIsMathBaselineAlignment 
            && FLY_AS_CHAR == rAnchor.GetAnchorId()) );

	if (bFormat)
	{
		// Bei Formaten keine Ankerbearbeitung
		aAnchorAtPageRB.Enable( sal_False );
		aAnchorAtParaRB.Enable( sal_False );
		aAnchorAtCharRB.Enable( sal_False );
		aAnchorAsCharRB.Enable( sal_False );
		aAnchorAtFrameRB.Enable( sal_False );
        aTypeFL.Enable( sal_False );
		aFixedRatioCB.Enable(sal_False);
	}
    else
    {
        if (rAnchor.GetAnchorId() != FLY_AT_FLY && !pSh->IsFlyInFly())
            aAnchorAtFrameRB.Hide();
        // --> OD 2009-08-31 #mongolianlayout#
//        if ( !bVerticalChanged && pSh->IsFrmVertical(sal_True, bIsInRightToLeft) )
        if ( pSh->IsFrmVertical( sal_True, bIsInRightToLeft, bIsVerticalL2R ) )
        // <--
        {
            String sHLabel = aHorizontalFT.GetText();
            aHorizontalFT.SetText(aVerticalFT.GetText());
            aVerticalFT.SetText(sHLabel);
            bIsVerticalFrame = sal_True;
        }
    }

    if ( nDlgType == DLG_FRM_GRF || nDlgType == DLG_FRM_OLE )
	{
		ASSERT(pSh , "shell not found");
		//OS: nur fuer die Variante Einfuegen/Grafik/Eigenschaften
		if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_GRF_REALSIZE, sal_False, &pItem))
			aGrfSize = ((const SvxSizeItem*)pItem)->GetSize();
		else
			pSh->GetGrfSize( aGrfSize );

		if ( !bNew )
		{
			aRealSizeBT.SetClickHdl(LINK(this, SwFrmPage, RealSizeHdl));
			EnableGraficMode();
		}
//		else
//          aTypeFL.SetSizePixel(Size(aTypeFL.GetSizePixel().Width(), aSizeFL.GetSizePixel().Height()));

		if ( nDlgType == DLG_FRM_GRF )
			aFixedRatioCB.Check( sal_False );
		else
		{
			if ( bNew )
				SetText( SW_RESSTR(STR_OLE_INSERT));
			else
				SetText( SW_RESSTR(STR_OLE_EDIT));
		}
	}
	else
	{
//      aTypeFL.SetSizePixel(Size(aTypeFL.GetSizePixel().Width(), aSizeFL.GetSizePixel().Height()));
		aGrfSize = ((const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE)).GetSize();
	}

	//Prozenteingabe ermoeglichen.
	aWidthED. SetBaseValue( aWidthED.Normalize(aGrfSize.Width()), FUNIT_TWIP );
	aHeightED.SetBaseValue( aHeightED.Normalize(aGrfSize.Height()), FUNIT_TWIP );
	//the available space is not yet known so the RefValue has to be calculated from size and relative size values
    //this is needed only if relative values are already set

    const SwFmtFrmSize& rFrmSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);

    if (rFrmSize.GetWidthPercent() != 0xff && rFrmSize.GetWidthPercent() != 0)
    {
        //calculate the rerference value from the with and relative width values
        sal_Int32 nSpace = rFrmSize.GetWidth() * 100 / rFrmSize.GetWidthPercent();
        aWidthED. SetRefValue( nSpace );
    }

    if (rFrmSize.GetHeightPercent() != 0xff && rFrmSize.GetHeightPercent() != 0)
    {
        //calculate the rerference value from the with and relative width values
        sal_Int32 nSpace = rFrmSize.GetHeight() * 100 / rFrmSize.GetHeightPercent();
        aHeightED.SetRefValue( nSpace );
    }

	// Allgemeiner Initialisierungteil
	switch(rAnchor.GetAnchorId())
    {
        case FLY_AT_PAGE: aAnchorAtPageRB.Check(); break;
        case FLY_AT_PARA: aAnchorAtParaRB.Check(); break;
        case FLY_AT_CHAR: aAnchorAtCharRB.Check(); break;
        case FLY_AS_CHAR: aAnchorAsCharRB.Check(); break;
		case FLY_AT_FLY: aAnchorAtFrameRB.Check();break;
        default:; //prevent warning
	}

    // OD 12.11.2003 #i22341# - determine content position of character
    // Note: content position can be NULL
    mpToCharCntntPos = rAnchor.GetCntntAnchor();

    // OD 19.09.2003 #i18732# - init checkbox value
    {
        const bool bFollowTextFlow =
            static_cast<const SwFmtFollowTextFlow&>(rSet.Get(RES_FOLLOW_TEXT_FLOW)).GetValue();
        aFollowTextFlowCB.Check( bFollowTextFlow );
    }

    if(bHtmlMode)
	{
		if(nDlgType == DLG_FRM_STD &&
				0 == (nHtmlMode & HTMLMODE_FULL_ABS_POS))
		{
			aHeightFT	.Enable( sal_False );
			aHeightED	.Enable( sal_False );
			aRelHeightCB.Enable( sal_False );
		}
		if( 0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS))
        {
            if (GetAnchor() == FLY_AT_PAGE)
            {
				aAnchorAtParaRB.Check();
			}
			aAnchorAtPageRB.Enable(sal_False);
		}
		aAutoHeightCB.Enable(sal_False);
		aAutoWidthCB.Enable(sal_False);
		aMirrorPagesCB.Show(sal_False);
		if(nDlgType == DLG_FRM_STD)
			aFixedRatioCB.Enable(sal_False);
        // OD 19.09.2003 #i18732# - hide checkbox in HTML mode
        aFollowTextFlowCB.Show(sal_False);
	}
    else
    {
        // OD 06.11.2003 #i18732# correct enable/disable of check box 'Mirror on..'
        aMirrorPagesCB.Enable(!aAnchorAsCharRB.IsChecked());

        // OD 06.11.2003 #i18732# - enable/disable check box 'Follow text flow'.
        // OD 10.11.2003 #i22305# - enable check box 'Follow text
        // flow' also for anchor type to-frame.
        aFollowTextFlowCB.Enable( aAnchorAtParaRB.IsChecked() ||
                                  aAnchorAtCharRB.IsChecked() ||
                                  aAnchorAtFrameRB.IsChecked() );
    }

	Init( rSet, sal_True );
    aAtVertPosED.SaveValue();
	aAtHorzPosED.SaveValue();
    // OD 19.09.2003 #i18732#
    aFollowTextFlowCB.SaveValue();

	bNoModifyHdl = sal_False;
    //lock PercentFields
    aWidthED.LockAutoCalculation(sal_True);
    aHeightED.LockAutoCalculation(sal_True);
    RangeModifyHdl(&aWidthED);  // Alle Maximalwerte initial setzen
    aHeightED.LockAutoCalculation(sal_False);
    aWidthED.LockAutoCalculation(sal_False);

	aAutoHeightCB.SaveValue();
	aAutoWidthCB.SaveValue();

    SwTwips nWidth  = static_cast< SwTwips >(aWidthED.DenormalizePercent(aWidthED.GetValue(FUNIT_TWIP)));
    SwTwips nHeight = static_cast< SwTwips >(aHeightED.DenormalizePercent(aHeightED.GetValue(FUNIT_TWIP)));
    fWidthHeightRatio = nHeight ? double(nWidth) / double(nHeight) : 1.0;
}


/*--------------------------------------------------------------------
	Beschreibung:	Attribute in den Set stopfen bei OK
 --------------------------------------------------------------------*/

sal_Bool SwFrmPage::FillItemSet(SfxItemSet &rSet)
{
	sal_Bool bRet = sal_False;
	SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell()
						: ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
	ASSERT( pSh , "shell not found");
	const SfxItemSet& rOldSet = GetItemSet();
	const SfxPoolItem* pOldItem = 0;

	RndStdIds eAnchorId = (RndStdIds)GetAnchor();

	if ( !bFormat )
	{
		pOldItem = GetOldItem(rSet, RES_ANCHOR);
		if (bNew || !pOldItem || eAnchorId != ((const SwFmtAnchor*)pOldItem)->GetAnchorId())
		{
			SwFmtAnchor aAnc( eAnchorId, pSh->GetPhyPageNum() );
			bRet = 0 != rSet.Put( aAnc );
		}
	}

	if ( pHMap )
	{
		SwFmtHoriOrient aHoriOrient( (const SwFmtHoriOrient&)
												rOldSet.Get(RES_HORI_ORIENT) );

		sal_uInt16 nMapPos = GetMapPos(pHMap, aHorizontalDLB);
        short nAlign = GetAlignment(pHMap, nMapPos, aHorizontalDLB, aHoriRelationLB);
        short nRel = GetRelation(pHMap, aHoriRelationLB);

        const sal_Int16 eHOri = nAlign;
        const sal_Int16 eRel  = nRel;

		aHoriOrient.SetHoriOrient( eHOri );
		aHoriOrient.SetRelationOrient( eRel );
		aHoriOrient.SetPosToggle(aMirrorPagesCB.IsChecked());

		sal_Bool bMod = aAtHorzPosED.GetText() != aAtHorzPosED.GetSavedValue();
		bMod |= aMirrorPagesCB.GetState() != aMirrorPagesCB.GetSavedValue();

        if ( eHOri == text::HoriOrientation::NONE &&
			 (bNew || (bAtHorzPosModified || bMod) || nOldH != eHOri ) )
		{
            SwTwips nX = static_cast< SwTwips >(aAtHorzPosED.Denormalize(aAtHorzPosED.GetValue(FUNIT_TWIP)));
			aHoriOrient.SetPos( nX );
		}

		pOldItem = GetOldItem(rSet, FN_HORI_ORIENT);
		sal_Bool bSame = sal_False;
		if ((bNew == bFormat) && pOldItem)
		{
             bSame = static_cast< sal_Bool >(aHoriOrient == (SwFmtHoriOrient&)*pOldItem);
		}
		if ((bNew && !bFormat) || ((bAtHorzPosModified || bMod) && !bSame))
		{
			bRet |= 0 != rSet.Put( aHoriOrient );
		}
	}

	if ( pVMap )
	{
		// Ausrichtung Vertikal
		SwFmtVertOrient aVertOrient( (const SwFmtVertOrient&)
												rOldSet.Get(RES_VERT_ORIENT) );

		sal_uInt16 nMapPos = GetMapPos(pVMap, aVerticalDLB);
        short nAlign = GetAlignment(pVMap, nMapPos, aVerticalDLB, aVertRelationLB);
        short nRel = GetRelation(pVMap, aVertRelationLB);

        const sal_Int16     eVOri = nAlign;
        const sal_Int16     eRel  = nRel;

        aVertOrient.SetVertOrient    ( eVOri);
		aVertOrient.SetRelationOrient( eRel );

		sal_Bool bMod = aAtVertPosED.GetText() != aAtVertPosED.GetSavedValue();

        if ( eVOri == text::VertOrientation::NONE &&
			 ( bNew || (bAtVertPosModified || bMod) || nOldV != eVOri) )
		{
			// Vertikale Position
			// fuer zeichengebundene Rahmen Offset umrechenen
            SwTwips nY = static_cast< SwTwips >(aAtVertPosED.Denormalize(aAtVertPosED.GetValue(FUNIT_TWIP)));
            if (eAnchorId == FLY_AS_CHAR)
            {
				nY *= -1;
            }
			aVertOrient.SetPos( nY );
		}
		pOldItem = GetOldItem(rSet, FN_VERT_ORIENT);
		sal_Bool bSame = sal_False;
		if((bNew == bFormat) && pOldItem)
		{
             bSame = static_cast< sal_Bool >( bFormat ?
				aVertOrient.GetVertOrient() == ((SwFmtVertOrient*)pOldItem)->GetVertOrient() &&
				aVertOrient.GetRelationOrient() == ((SwFmtVertOrient*)pOldItem)->GetRelationOrient() &&
				aVertOrient.GetPos() == ((SwFmtVertOrient*)pOldItem)->GetPos()

                    : aVertOrient == (SwFmtVertOrient&)*pOldItem );
		}
		if( ( bNew && !bFormat ) || ((bAtVertPosModified || bMod) && !bSame ))
		{
			bRet |= 0 != rSet.Put( aVertOrient );
		}
	}

	//Size setzen
	//Neuer Sonderfall: Ist die Groesse von pMgr(0, 0), so werden die
	//Eigenschaften fuer eine Grafik festgelegt, die noch gar nicht geladen
	//ist. Dann wird hier kein SetSize() gemacht, wenn die
	//Groesseneinstellungen vom Anwender nicht veraendert wurden.
	const SwFmtFrmSize& rOldSize = (const SwFmtFrmSize& )rOldSet.Get(RES_FRM_SIZE);
	SwFmtFrmSize aSz( rOldSize );

/*	// Folgende Zeilen nur zum debuggen:
	sal_Bool bModified = aWidthED.IsValueModified();
	sal_uInt16 nOldWidth = rOldSize.GetWidth ();
	sal_uInt16 nWidth = aWidthED .GetValue();
	sal_uInt16 nMinWidth = aWidthED .GetMin();*/

	sal_Bool bValueModified = (aWidthED.IsValueModified() || aHeightED.IsValueModified());
	sal_Bool bCheckChanged = (aRelWidthCB.GetSavedValue() != aRelWidthCB.IsChecked()
						|| aRelHeightCB.GetSavedValue() != aRelHeightCB.IsChecked());

	sal_Bool bLegalValue = !(!rOldSize.GetWidth () && !rOldSize.GetHeight() &&
							aWidthED .GetValue() == aWidthED .GetMin() &&
							aHeightED.GetValue() == aHeightED.GetMin());

	if ((bNew && !bFormat) || ((bValueModified || bCheckChanged) && bLegalValue))
	{
        sal_Int64 nNewWidth  = aWidthED.DenormalizePercent(aWidthED.GetRealValue(FUNIT_TWIP));
        sal_Int64 nNewHeight = aHeightED.DenormalizePercent(aHeightED.GetRealValue(FUNIT_TWIP));
        aSz.SetWidth (static_cast< SwTwips >(nNewWidth));
        aSz.SetHeight(static_cast< SwTwips >(nNewHeight));

		if (aRelWidthCB.IsChecked())
		{
            aSz.SetWidthPercent((sal_uInt8)Min( static_cast< sal_Int64 >(MAX_PERCENT_WIDTH), aWidthED.Convert(aWidthED.NormalizePercent(nNewWidth), FUNIT_TWIP, FUNIT_CUSTOM)));
		}
		else
			aSz.SetWidthPercent(0);
		if (aRelHeightCB.IsChecked())
            aSz.SetHeightPercent((sal_uInt8)Min(static_cast< sal_Int64 >(MAX_PERCENT_HEIGHT), aHeightED.Convert(aHeightED.NormalizePercent(nNewHeight), FUNIT_TWIP, FUNIT_CUSTOM)));
		else
			aSz.SetHeightPercent(0);

		if (aFixedRatioCB.IsChecked() && (aRelWidthCB.IsChecked() ^ aRelHeightCB.IsChecked()))
		{
			if (aRelWidthCB.IsChecked())
				aSz.SetHeightPercent(0xff);
			else
				aSz.SetWidthPercent(0xff);
		}
	}
	if( !IsInGraficMode() )
	{
		if( aAutoHeightCB.GetState() != aAutoHeightCB.GetSavedValue() )
		{
			SwFrmSize eFrmSize = (SwFrmSize) aAutoHeightCB.IsChecked()? ATT_MIN_SIZE : ATT_FIX_SIZE;
			if( eFrmSize != aSz.GetHeightSizeType() )
                aSz.SetHeightSizeType(eFrmSize);
		}
		if( aAutoWidthCB.GetState() != aAutoWidthCB.GetSavedValue() )
		{
			SwFrmSize eFrmSize = (SwFrmSize) aAutoWidthCB.IsChecked()? ATT_MIN_SIZE : ATT_FIX_SIZE;
            if( eFrmSize != aSz.GetWidthSizeType() )
                aSz.SetWidthSizeType( eFrmSize );
		}
	}
	if( !bFormat && aFixedRatioCB.GetSavedValue() != aFixedRatioCB.IsChecked())
		bRet |= 0 != rSet.Put(SfxBoolItem(FN_KEEP_ASPECT_RATIO, aFixedRatioCB.IsChecked()));

	pOldItem = GetOldItem(rSet, RES_FRM_SIZE);

	if ((pOldItem && aSz != *pOldItem) || (!pOldItem && !bFormat) ||
			(bFormat &&
				(aSz.GetWidth() > 0 || aSz.GetWidthPercent() > 0) &&
					(aSz.GetHeight() > 0 || aSz.GetHeightPercent() > 0)))
	{
        if (aSz.GetHeightSizeType() == ATT_VAR_SIZE)    // VAR_SIZE gibts nicht bei Rahmen
            aSz.SetHeightSizeType(ATT_MIN_SIZE);        // Bug #45776 (Vorlagen ohne Breite/Hoehe)

		bRet |= 0 != rSet.Put( aSz );
	}
    // OD 19.09.2003 #i18732#
    if(aFollowTextFlowCB.IsChecked() != aFollowTextFlowCB.GetSavedValue())
    {
        bRet |= 0 != rSet.Put(SwFmtFollowTextFlow(aFollowTextFlowCB.IsChecked()));
    }
	return bRet;
}

/*--------------------------------------------------------------------
	Beschreibung:	Horizontale und vertikale Pos initialisieren
 --------------------------------------------------------------------*/

void SwFrmPage::InitPos(RndStdIds eId,
								sal_uInt16 nH,
								sal_uInt16 nHRel,
								sal_uInt16 nV,
								sal_uInt16 nVRel,
								long   nX,
								long   nY)
{
	sal_uInt16 nPos = aVerticalDLB.GetSelectEntryPos();
	if ( nPos != LISTBOX_ENTRY_NOTFOUND && pVMap )
	{
		nOldV	 = pVMap[nPos].nAlign;

		nPos = aVertRelationLB.GetSelectEntryPos();
		if (nPos != LISTBOX_ENTRY_NOTFOUND)
			nOldVRel = ((RelationMap *)aVertRelationLB.GetEntryData(nPos))->nRelation;
	}

	nPos = aHorizontalDLB.GetSelectEntryPos();
	if ( nPos != LISTBOX_ENTRY_NOTFOUND && pHMap )
	{
		nOldH	 = pHMap[nPos].nAlign;

		nPos = aHoriRelationLB.GetSelectEntryPos();
		if (nPos != LISTBOX_ENTRY_NOTFOUND)
			nOldHRel = ((RelationMap *)aHoriRelationLB.GetEntryData(nPos))->nRelation;
	}

	sal_Bool bEnable = sal_True;
    if ( eId == FLY_AT_PAGE )
	{
		pVMap = bHtmlMode ? aVPageHtmlMap : aVPageMap;
		pHMap = bHtmlMode ? aHPageHtmlMap : aHPageMap;
	}
    else if ( eId == FLY_AT_FLY )
	{
        // OD 19.09.2003 #i18732# - own vertical alignment map for to frame
        // anchored objects.
        pVMap = bHtmlMode ? aVFlyHtmlMap : aVFrameMap;
		pHMap = bHtmlMode ? aHFlyHtmlMap : aHFrameMap;
	}
    else if ( eId == FLY_AT_PARA )
	{
		if(bHtmlMode)
		{
			pVMap = aVParaHtmlMap;
			pHMap = nHtmlMode & HTMLMODE_SOME_ABS_POS ? aHParaHtmlAbsMap : aHParaHtmlMap;
		}
		else
		{
			pVMap = aVParaMap;
			pHMap = aHParaMap;
		}
	}
    else if ( eId == FLY_AT_CHAR )
	{
		if(bHtmlMode)
		{
			pVMap = nHtmlMode & HTMLMODE_SOME_ABS_POS ? aVCharHtmlAbsMap	: aVCharHtmlMap;
			pHMap = nHtmlMode & HTMLMODE_SOME_ABS_POS ? aHCharHtmlAbsMap	: aHCharHtmlMap;
		}
		else
		{
			pVMap = aVCharMap;
			pHMap = aHCharMap;
		}
	}
    else if ( eId == FLY_AS_CHAR )
	{
		pVMap = bHtmlMode ? aVAsCharHtmlMap 	: aVAsCharMap;
		pHMap = 0;
		bEnable = sal_False;
	}
	aHorizontalDLB.Enable( bEnable );
	aHorizontalFT.Enable( bEnable );

	// aktuelle Pos selektieren
	// Horizontal
	if ( nH == USHRT_MAX )
	{
		nH 	  = nOldH;
		nHRel = nOldHRel;
	}
    // OD 12.11.2003 #i22341# - pass <nHRel> as 3rd parameter to method <FillPosLB>
    sal_uInt16 nMapPos = FillPosLB(pHMap, nH, nHRel, aHorizontalDLB);
    FillRelLB(pHMap, nMapPos, nH, nHRel, aHoriRelationLB, aHoriRelationFT);

	// Vertikal
	if ( nV == USHRT_MAX )
	{
		nV	  = nOldV;
		nVRel = nOldVRel;
	}
    // OD 12.11.2003 #i22341# - pass <nVRel> as 3rd parameter to method <FillPosLB>
    nMapPos = FillPosLB(pVMap, nV, nVRel, aVerticalDLB);
    FillRelLB(pVMap, nMapPos, nV, nVRel, aVertRelationLB, aVertRelationFT);

	// Edits init
    bEnable = nH == text::HoriOrientation::NONE && eId != FLY_AS_CHAR;
	if (!bEnable)
	{
		aAtHorzPosED.SetValue( 0, FUNIT_TWIP );
		if (nX != LONG_MAX && bHtmlMode)
			aAtHorzPosED.SetModifyFlag();
	}
	else
	{
		if (nX != LONG_MAX)
			aAtHorzPosED.SetValue( aAtHorzPosED.Normalize(nX), FUNIT_TWIP );
	}
	aAtHorzPosFT.Enable( bEnable );
	aAtHorzPosED.Enable( bEnable );

    bEnable = nV == text::VertOrientation::NONE;
	if ( !bEnable )
	{
		aAtVertPosED.SetValue( 0, FUNIT_TWIP );
		if(nY != LONG_MAX && bHtmlMode)
			aAtVertPosED.SetModifyFlag();
	}
	else
	{
        if ( eId == FLY_AS_CHAR )
		{
			if ( nY == LONG_MAX )
				nY = 0;
			else
				nY *= -1;
		}
		if ( nY != LONG_MAX )
			aAtVertPosED.SetValue( aAtVertPosED.Normalize(nY), FUNIT_TWIP );
	}
	aAtVertPosFT.Enable( bEnable && m_bAllowVertPositioning );
	aAtVertPosED.Enable( bEnable && m_bAllowVertPositioning );
	UpdateExample();
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

sal_uInt16 SwFrmPage::FillPosLB(const FrmMap* _pMap,
                            const sal_uInt16 _nAlign,
                            const sal_uInt16 _nRel,
                            ListBox& _rLB )
{
	String sSelEntry, sOldEntry;
    sOldEntry = _rLB.GetSelectEntry();

    _rLB.Clear();

    // OD 12.11.2003 #i22341# - determine all possible listbox relations for
    // given relation for map <aVCharMap>
    const sal_uLong nLBRelations = (_pMap != aVCharMap)
                               ? 0L
                               : ::lcl_GetLBRelationsForRelations( _nRel );

    // Listbox fuellen
    size_t nCount = ::lcl_GetFrmMapCount(_pMap);
    for (size_t i = 0; _pMap && i < nCount; ++i)
	{
//		#61359# Warum nicht von links/von innen bzw. von oben?
//      if (!bFormat || (pMap[i].eStrId != SwFPos::FROMLEFT && pMap[i].eStrId != SwFPos::FROMTOP))
		{
            SvxSwFramePosString::StringId eStrId = aMirrorPagesCB.IsChecked() ? _pMap[i].eMirrorStrId : _pMap[i].eStrId;
            // --> OD 2009-08-31 #mongolianlayout#
            eStrId = lcl_ChangeResIdToVerticalOrRTL( eStrId,
                                                     bIsVerticalFrame,
                                                     bIsVerticalL2R,
                                                     bIsInRightToLeft);
            // <--
            String sEntry(aFramePosString.GetString(eStrId));
			if (_rLB.GetEntryPos(sEntry) == LISTBOX_ENTRY_NOTFOUND)
            {
				// bei zeichengebundenen Rahmen keine doppelten Eintraege einfuegen
                _rLB.InsertEntry(sEntry);
            }
            // OD 12.11.2003 #i22341# - add condition to handle map <aVCharMap>
            // that is ambigous in the alignment.
            if ( _pMap[i].nAlign == _nAlign &&
                 ( !(_pMap == aVCharMap) || _pMap[i].nLBRelations & nLBRelations ) )
            {
				sSelEntry = sEntry;
            }
		}
	}

    _rLB.SelectEntry(sSelEntry);
    if (!_rLB.GetSelectEntryCount())
        _rLB.SelectEntry(sOldEntry);

    if (!_rLB.GetSelectEntryCount())
        _rLB.SelectEntryPos(0);

    PosHdl(&_rLB);

    return GetMapPos(_pMap, _rLB);
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/
sal_uLong SwFrmPage::FillRelLB( const FrmMap* _pMap,
                            const sal_uInt16 _nLBSelPos,
                            const sal_uInt16 _nAlign,
                            sal_uInt16 _nRel,
                            ListBox& _rLB,
                            FixedText& _rFT )
{
	String sSelEntry;
	sal_uLong  nLBRelations = 0;
    size_t nMapCount = ::lcl_GetFrmMapCount(_pMap);

    _rLB.Clear();

    if (_nLBSelPos < nMapCount)
	{
        if (_pMap == aVAsCharHtmlMap || _pMap == aVAsCharMap)
		{
            String sOldEntry(_rLB.GetSelectEntry());
			sal_uInt16 nRelCount = sizeof(aAsCharRelationMap) / sizeof(RelationMap);
            SvxSwFramePosString::StringId eStrId = _pMap[_nLBSelPos].eStrId;

            for (size_t nMapPos = 0; nMapPos < nMapCount; nMapPos++)
			{
                if (_pMap[nMapPos].eStrId == eStrId)
				{
                    nLBRelations = _pMap[nMapPos].nLBRelations;
					for (sal_uInt16 nRelPos = 0; nRelPos < nRelCount; nRelPos++)
					{
						if (nLBRelations & aAsCharRelationMap[nRelPos].nLBRelation)
						{
                            SvxSwFramePosString::StringId sStrId1 = aAsCharRelationMap[nRelPos].eStrId;

                            // --> OD 2009-08-31 #mongolianlayout#
                            sStrId1 =
                                lcl_ChangeResIdToVerticalOrRTL( sStrId1,
                                                                bIsVerticalFrame,
                                                                bIsVerticalL2R,
                                                                bIsInRightToLeft);
                            // <--
                            String sEntry = aFramePosString.GetString(sStrId1);
                            sal_uInt16 nPos = _rLB.InsertEntry(sEntry);
                            _rLB.SetEntryData(nPos, &aAsCharRelationMap[nRelPos]);
                            if (_pMap[nMapPos].nAlign == _nAlign)
								sSelEntry = sEntry;
							break;
						}
					}
				}
			}
			if (sSelEntry.Len())
                _rLB.SelectEntry(sSelEntry);
			else
			{
                _rLB.SelectEntry(sOldEntry);

                if (!_rLB.GetSelectEntryCount())
				{
                    for (sal_uInt16 i = 0; i < _rLB.GetEntryCount(); i++)
					{
                        RelationMap *pEntry = (RelationMap *)_rLB.GetEntryData(i);
						if (pEntry->nLBRelation == LB_REL_CHAR)	// Default
						{
                            _rLB.SelectEntryPos(i);
							break;
						}
					}
				}
			}
		}
		else
		{
			sal_uInt16 nRelCount = sizeof(aRelationMap) / sizeof(RelationMap);

            // OD 14.11.2003 #i22341# - special handling for map <aVCharMap>,
            // because its ambigous in its <eStrId>/<eMirrorStrId>.
            if ( _pMap == aVCharMap )
            {
                nLBRelations = ::lcl_GetLBRelationsForStrID( _pMap,
                                             ( aMirrorPagesCB.IsChecked()
                                               ? _pMap[_nLBSelPos].eMirrorStrId
                                               : _pMap[_nLBSelPos].eStrId),
                                             aMirrorPagesCB.IsChecked() );
            }
            else
            {
                nLBRelations = _pMap[_nLBSelPos].nLBRelations;
            }

			for (sal_uLong nBit = 1; nBit < 0x80000000; nBit <<= 1)
			{
				if (nLBRelations & nBit)
				{
					for (sal_uInt16 nRelPos = 0; nRelPos < nRelCount; nRelPos++)
					{
						if (aRelationMap[nRelPos].nLBRelation == nBit)
						{
                            SvxSwFramePosString::StringId eStrId1 = aMirrorPagesCB.IsChecked() ?
                                            aRelationMap[nRelPos].eMirrorStrId : aRelationMap[nRelPos].eStrId;
                            // --> OD 2009-08-31 #mongolianlayout#
                            eStrId1 =
                                lcl_ChangeResIdToVerticalOrRTL( eStrId1,
                                                                bIsVerticalFrame,
                                                                bIsVerticalL2R,
                                                                bIsInRightToLeft);
                            // <--
                            String sEntry = aFramePosString.GetString(eStrId1);
                            sal_uInt16 nPos = _rLB.InsertEntry(sEntry);
                            _rLB.SetEntryData(nPos, &aRelationMap[nRelPos]);
                            if (!sSelEntry.Len() && aRelationMap[nRelPos].nRelation == _nRel)
								sSelEntry = sEntry;
						}
					}
				}
			}
			if (sSelEntry.Len())
                _rLB.SelectEntry(sSelEntry);
			else
			{
				// Warscheinlich Ankerwechsel. Daher aehnliche Relation suchen
                switch (_nRel)
				{
                    case text::RelOrientation::FRAME:           _nRel = text::RelOrientation::PAGE_FRAME;   break;
                    case text::RelOrientation::PRINT_AREA:      _nRel = text::RelOrientation::PAGE_PRINT_AREA; break;
                    case text::RelOrientation::PAGE_LEFT:       _nRel = text::RelOrientation::FRAME_LEFT;   break;
                    case text::RelOrientation::PAGE_RIGHT:      _nRel = text::RelOrientation::FRAME_RIGHT;  break;
                    case text::RelOrientation::FRAME_LEFT:      _nRel = text::RelOrientation::PAGE_LEFT;    break;
                    case text::RelOrientation::FRAME_RIGHT:     _nRel = text::RelOrientation::PAGE_RIGHT;   break;
                    case text::RelOrientation::PAGE_FRAME:      _nRel = text::RelOrientation::FRAME;          break;
                    case text::RelOrientation::PAGE_PRINT_AREA: _nRel = text::RelOrientation::PRINT_AREA;        break;

					default:
                        if (_rLB.GetEntryCount())
						{
                            RelationMap *pEntry = (RelationMap *)_rLB.GetEntryData(_rLB.GetEntryCount() - 1);
                            _nRel = pEntry->nRelation;
						}
						break;
				}

                for (sal_uInt16 i = 0; i < _rLB.GetEntryCount(); i++)
				{
                    RelationMap *pEntry = (RelationMap *)_rLB.GetEntryData(i);
                    if (pEntry->nRelation == _nRel)
					{
                        _rLB.SelectEntryPos(i);
						break;
					}
				}

                if (!_rLB.GetSelectEntryCount())
                    _rLB.SelectEntryPos(0);
			}
		}
	}

    const bool bEnable = _rLB.GetEntryCount() != 0
            && (&_rLB != &aVertRelationLB || m_bAllowVertPositioning);
    _rLB.Enable( bEnable );
    _rFT.Enable( bEnable );

    RelHdl(&_rLB);

	return nLBRelations;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

short SwFrmPage::GetRelation(FrmMap * /*pMap*/, ListBox &rRelationLB)
{
    short nRel = 0;
	sal_uInt16 nPos = rRelationLB.GetSelectEntryPos();

	if (nPos != LISTBOX_ENTRY_NOTFOUND)
	{
		RelationMap *pEntry = (RelationMap *)rRelationLB.GetEntryData(nPos);
		nRel = pEntry->nRelation;
	}

	return nRel;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

short SwFrmPage::GetAlignment(FrmMap *pMap, sal_uInt16 nMapPos,
        ListBox &/*rAlignLB*/, ListBox &rRelationLB)
{
    short nAlign = 0;

    // OD 14.11.2003 #i22341# - special handling also for map <aVCharMap>,
    // because it contains ambigous items for alignment
    if ( pMap == aVAsCharHtmlMap || pMap == aVAsCharMap ||
         pMap == aVCharMap )
	{
		if (rRelationLB.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND)
		{
			sal_uLong  nRel = ((RelationMap *)rRelationLB.GetEntryData(rRelationLB.GetSelectEntryPos()))->nLBRelation;
            size_t nMapCount = ::lcl_GetFrmMapCount(pMap);
            SvxSwFramePosString::StringId eStrId = pMap[nMapPos].eStrId;

            for (size_t i = 0; i < nMapCount; i++)
			{
                if (pMap[i].eStrId == eStrId)
				{
					sal_uLong nLBRelations = pMap[i].nLBRelations;
					if (nLBRelations & nRel)
					{
						nAlign = pMap[i].nAlign;
						break;
					}
				}
			}
		}
	}
	else if (pMap)
		nAlign = pMap[nMapPos].nAlign;

	return nAlign;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

sal_uInt16 SwFrmPage::GetMapPos( const FrmMap *pMap, ListBox &rAlignLB )
{
	sal_uInt16 nMapPos = 0;
	sal_uInt16 nLBSelPos = rAlignLB.GetSelectEntryPos();

	if (nLBSelPos != LISTBOX_ENTRY_NOTFOUND)
	{
		if (pMap == aVAsCharHtmlMap || pMap == aVAsCharMap)
		{
            size_t nMapCount = ::lcl_GetFrmMapCount(pMap);
			String sSelEntry(rAlignLB.GetSelectEntry());

            for (size_t i = 0; i < nMapCount; i++)
			{
                SvxSwFramePosString::StringId eResId = pMap[i].eStrId;

                String sEntry = aFramePosString.GetString(eResId);
				sEntry = MnemonicGenerator::EraseAllMnemonicChars( sEntry );

				if (sEntry == sSelEntry)
				{
                    nMapPos = static_cast< sal_uInt16 >(i);
					break;
				}
			}
		}
		else
			nMapPos = nLBSelPos;
	}

	return nMapPos;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

RndStdIds SwFrmPage::GetAnchor()
{
    RndStdIds nRet = FLY_AT_PAGE;
	if(aAnchorAtParaRB.IsChecked())
    {
        nRet = FLY_AT_PARA;
    }
	else if(aAnchorAtCharRB.IsChecked())
    {
        nRet = FLY_AT_CHAR;
    }
	else if(aAnchorAsCharRB.IsChecked())
    {
        nRet = FLY_AS_CHAR;
    }
	else if(aAnchorAtFrameRB.IsChecked())
    {
		nRet = FLY_AT_FLY;
    }
	return nRet;
}

/*--------------------------------------------------------------------
	Beschreibung:	Bsp - Update
 --------------------------------------------------------------------*/

void SwFrmPage::ActivatePage(const SfxItemSet& rSet)
{
	bNoModifyHdl = sal_True;
	Init(rSet);
	bNoModifyHdl = sal_False;
    //lock PercentFields
    aWidthED.LockAutoCalculation(sal_True);
    aHeightED.LockAutoCalculation(sal_True);
    RangeModifyHdl(&aWidthED);  // Alle Maximalwerte initial setzen
    aHeightED.LockAutoCalculation(sal_False);
    aWidthED.LockAutoCalculation(sal_False);
    aFollowTextFlowCB.SaveValue();
}

int SwFrmPage::DeactivatePage(SfxItemSet * _pSet)
{
    if ( _pSet )
	{
        FillItemSet( *_pSet );

		//FillItemSet setzt den Anker nicht in den Set, wenn er mit dem
		//Original uebereinstimmt. Fuer die anderen Pages brauchen wir aber
		//den aktuellen Anker.
		SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell()
							: ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
		RndStdIds eAnchorId = (RndStdIds)GetAnchor();
		SwFmtAnchor aAnc( eAnchorId, pSh->GetPhyPageNum() );
        _pSet->Put( aAnc );
	}

	return sal_True;
}

/*--------------------------------------------------------------------
	Beschreibung: Links/rechts mit Innen/aussen tauschen
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, MirrorHdl, CheckBox *, EMPTYARG )
{
    RndStdIds eId = GetAnchor();
    InitPos( eId, USHRT_MAX, 0, USHRT_MAX, 0, LONG_MAX, LONG_MAX);

	return 0;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, RelSizeClickHdl, CheckBox *, pBtn )
{
	if (pBtn == &aRelWidthCB)
    {
		aWidthED.ShowPercent(pBtn->IsChecked());
        if(pBtn->IsChecked())
            aWidthED.MetricField::SetMax(MAX_PERCENT_WIDTH);
    }
    else // pBtn == &aRelHeightCB
    {
		aHeightED.ShowPercent(pBtn->IsChecked());
        if(pBtn->IsChecked())
            aHeightED.MetricField::SetMax(MAX_PERCENT_HEIGHT);
    }

	if (pBtn)	// Nur wenn Handler durch Aenderung des Controllers gerufen wurde
		RangeModifyHdl(&aWidthED);	// Werte wieder korrigieren

	if (pBtn == &aRelWidthCB)
		ModifyHdl(&aWidthED);
    else // pBtn == &aRelHeightCB
		ModifyHdl(&aHeightED);

	return 0;
}

/*--------------------------------------------------------------------
	Beschreibung:	Bereichspruefung
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, RangeModifyHdl, Edit *, EMPTYARG )
{
	if (bNoModifyHdl)
		return 0;

	SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell()
						:((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
	ASSERT(pSh , "shell not found");
	SwFlyFrmAttrMgr aMgr( bNew, pSh, (const SwAttrSet&)GetItemSet() );
    SvxSwFrameValidation        aVal;

    aVal.nAnchorType = static_cast< sal_uInt16 >(GetAnchor());
	aVal.bAutoHeight = aAutoHeightCB.IsChecked();
	aVal.bAutoWidth = aAutoWidthCB.IsChecked();
	aVal.bMirror = aMirrorPagesCB.IsChecked();
    // OD 18.09.2003 #i18732#
    aVal.bFollowTextFlow = aFollowTextFlowCB.IsChecked();

	if ( pHMap )
	{
		// Ausrichtung Horizontal
		sal_uInt16 nMapPos = GetMapPos(pHMap, aHorizontalDLB);
        short nAlign = GetAlignment(pHMap, nMapPos, aHorizontalDLB, aHoriRelationLB);
        short nRel = GetRelation(pHMap, aHoriRelationLB);

        aVal.nHoriOrient = nAlign;
        aVal.nHRelOrient = nRel;
	}
	else
        aVal.nHoriOrient = text::HoriOrientation::NONE;

	if ( pVMap )
	{
		// Ausrichtung Vertikal
		sal_uInt16 nMapPos = GetMapPos(pVMap, aVerticalDLB);
        short nAlign = GetAlignment(pVMap, nMapPos, aVerticalDLB, aVertRelationLB);
        short nRel = GetRelation(pVMap, aVertRelationLB);

        aVal.nVertOrient = nAlign;
        aVal.nVRelOrient = nRel;
	}
	else
        aVal.nVertOrient = text::VertOrientation::NONE;

    const long nAtHorzPosVal = static_cast< long >(
                    aAtHorzPosED.Denormalize(aAtHorzPosED.GetValue(FUNIT_TWIP)) );
    const long nAtVertPosVal = static_cast< long >(
                    aAtVertPosED.Denormalize(aAtVertPosED.GetValue(FUNIT_TWIP)) );

	aVal.nHPos = nAtHorzPosVal;
	aVal.nVPos = nAtVertPosVal;

    aMgr.ValidateMetrics(aVal, mpToCharCntntPos, sal_True);   // Einmal, um Referenzwerte fuer prozentuale Werte zu erhalten

	// Referenzwerte fuer fuer Prozentwerte setzen (100%) ...
	aWidthED.SetRefValue(aVal.aPercentSize.Width());
	aHeightED.SetRefValue(aVal.aPercentSize.Height());

	// ... und damit Breite und Hoehe korrekt umrechnen
    SwTwips nWidth  = static_cast< SwTwips >(aWidthED. DenormalizePercent(aWidthED.GetValue(FUNIT_TWIP)));
    SwTwips nHeight = static_cast< SwTwips >(aHeightED.DenormalizePercent(aHeightED.GetValue(FUNIT_TWIP)));
	aVal.nWidth  = nWidth;
	aVal.nHeight = nHeight;

    aMgr.ValidateMetrics(aVal, mpToCharCntntPos);    // Nochmal um mit korrekter Breite und Hoehe alle restlichen Werte zu ermitteln

	// alle Spalten muessen passen
	if(GetTabDialog()->GetExampleSet() &&
			SFX_ITEM_DEFAULT <= GetTabDialog()->GetExampleSet()->GetItemState(RES_COL))
	{
		const SwFmtCol& rCol = (const SwFmtCol&)GetTabDialog()->GetExampleSet()->Get(RES_COL);
		if ( rCol.GetColumns().Count() > 1 )
		{
			for ( sal_uInt16 i = 0; i < rCol.GetColumns().Count(); ++i )
			{
				aVal.nMinWidth += rCol.GetColumns()[i]->GetLeft() +
								  rCol.GetColumns()[i]->GetRight() +
								  MINFLY;
			}
			aVal.nMinWidth -= MINFLY;//einen hatten wir schon mit drin!
		}
	}

	nWidth = aVal.nWidth;
	nHeight = aVal.nHeight;

	// Mindestbreite auch fuer Vorlage
	aHeightED.SetMin(aHeightED.NormalizePercent(aVal.nMinHeight), FUNIT_TWIP);
	aWidthED. SetMin(aWidthED.NormalizePercent(aVal.nMinWidth), FUNIT_TWIP);

	SwTwips nMaxWidth(aVal.nMaxWidth);
	SwTwips nMaxHeight(aVal.nMaxHeight);

	if (aVal.bAutoHeight && (nDlgType == DLG_FRM_GRF || nDlgType == DLG_FRM_OLE))
	{
		SwTwips nTmp = Min(nWidth * nMaxHeight / Max(nHeight, 1L), nMaxHeight);
		aWidthED.SetMax(aWidthED.NormalizePercent(nTmp), FUNIT_TWIP);

		nTmp = Min(nHeight * nMaxWidth / Max(nWidth, 1L), nMaxWidth);
		aHeightED.SetMax(aWidthED.NormalizePercent(nTmp), FUNIT_TWIP);
	}
	else
	{
        SwTwips nTmp = static_cast< SwTwips >(aHeightED.NormalizePercent(nMaxHeight));
		aHeightED.SetMax(nTmp, FUNIT_TWIP);

        nTmp = static_cast< SwTwips >(aWidthED.NormalizePercent(nMaxWidth));
		aWidthED.SetMax(nTmp, FUNIT_TWIP);
	}

	aAtHorzPosED.SetMin(aAtHorzPosED.Normalize(aVal.nMinHPos), FUNIT_TWIP);
	aAtHorzPosED.SetMax(aAtHorzPosED.Normalize(aVal.nMaxHPos), FUNIT_TWIP);
	if ( aVal.nHPos != nAtHorzPosVal )
		aAtHorzPosED.SetValue(aAtHorzPosED.Normalize(aVal.nHPos), FUNIT_TWIP);

    const SwTwips nUpperOffset = (aVal.nAnchorType == FLY_AS_CHAR)
        ? nUpperBorder : 0;
    const SwTwips nLowerOffset = (aVal.nAnchorType == FLY_AS_CHAR)
        ? nLowerBorder : 0;

	aAtVertPosED.SetMin(aAtVertPosED.Normalize(aVal.nMinVPos + nLowerOffset + nUpperOffset), FUNIT_TWIP);
	aAtVertPosED.SetMax(aAtVertPosED.Normalize(aVal.nMaxVPos), FUNIT_TWIP);
	if ( aVal.nVPos != nAtVertPosVal )
		aAtVertPosED.SetValue(aAtVertPosED.Normalize(aVal.nVPos), FUNIT_TWIP);

	return 0;
}

IMPL_LINK( SwFrmPage, AnchorTypeHdl, RadioButton *, EMPTYARG )
{
	aMirrorPagesCB.Enable(!aAnchorAsCharRB.IsChecked());

    // OD 06.11.2003 #i18732# - enable check box 'Follow text flow' for anchor
    // type to-paragraph' and to-character
    // OD 10.11.2003 #i22305# - enable check box 'Follow text
    // flow' also for anchor type to-frame.
    aFollowTextFlowCB.Enable( aAnchorAtParaRB.IsChecked() ||
                              aAnchorAtCharRB.IsChecked() ||
                              aAnchorAtFrameRB.IsChecked() );

    RndStdIds eId = GetAnchor();

    InitPos( eId, USHRT_MAX, 0, USHRT_MAX, 0, LONG_MAX, LONG_MAX);
	RangeModifyHdl(0);

	if(bHtmlMode)
	{
		PosHdl(&aHorizontalDLB);
		PosHdl(&aVerticalDLB);
	}

    EnableVerticalPositioning( !(m_bIsMathOLE && m_bIsMathBaselineAlignment 
            && FLY_AS_CHAR == eId) );

	return 0;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, PosHdl, ListBox *, pLB )
{
	sal_Bool bHori = pLB == &aHorizontalDLB;
	ListBox *pRelLB = bHori ? &aHoriRelationLB : &aVertRelationLB;
    FixedText *pRelFT = bHori ? &aHoriRelationFT : &aVertRelationFT;
	FrmMap *pMap = bHori ? pHMap : pVMap;

	sal_uInt16 nMapPos = GetMapPos(pMap, *pLB);
    short nAlign = GetAlignment(pMap, nMapPos, *pLB, *pRelLB);

	if (bHori)
	{
        sal_Bool bEnable = text::HoriOrientation::NONE == nAlign;
		aAtHorzPosED.Enable( bEnable );
		aAtHorzPosFT.Enable( bEnable );
	}
	else
	{
        sal_Bool bEnable = text::VertOrientation::NONE == nAlign && m_bAllowVertPositioning;
		aAtVertPosED.Enable( bEnable );
		aAtVertPosFT.Enable( bEnable );
	}

	if (pLB)	// Nur wenn Handler durch Aenderung des Controllers gerufen wurde
		RangeModifyHdl( 0 );

	sal_uInt16 nRel = 0;
	if (pLB->GetSelectEntryCount())
	{

		if (pRelLB->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND)
			nRel = ((RelationMap *)pRelLB->GetEntryData(pRelLB->GetSelectEntryPos()))->nRelation;

        FillRelLB(pMap, nMapPos, nAlign, nRel, *pRelLB, *pRelFT);
	}
	else
		pRelLB->Clear();

	UpdateExample();

	if (bHori)
		bAtHorzPosModified = sal_True;
	else
		bAtVertPosModified = sal_True;

	// Sonderbehandlung fuer HTML-Mode mit horz-vert-Abhaengigkeiten
	if(bHtmlMode && nHtmlMode&HTMLMODE_SOME_ABS_POS &&
            (FLY_AT_CHAR == GetAnchor()))
	{
		sal_Bool bSet = sal_False;
		if(bHori)
		{
			// rechts ist nur unterhalb erlaubt - von links nur oben
			// von links am Zeichen -> unterhalb
            if((text::HoriOrientation::LEFT == nAlign || text::HoriOrientation::RIGHT == nAlign) &&
					0 == aVerticalDLB.GetSelectEntryPos())
			{
                if(text::RelOrientation::FRAME == nRel)
					aVerticalDLB.SelectEntryPos(1);
				else
					aVerticalDLB.SelectEntryPos(0);
				bSet = sal_True;
			}
            else if(text::HoriOrientation::LEFT == nAlign && 1 == aVerticalDLB.GetSelectEntryPos())
			{
				aVerticalDLB.SelectEntryPos(0);
				bSet = sal_True;
			}
            else if(text::HoriOrientation::NONE == nAlign && 1 == aVerticalDLB.GetSelectEntryPos())
			{
				aVerticalDLB.SelectEntryPos(0);
				bSet = sal_True;
			}
			if(bSet)
				PosHdl(&aVerticalDLB);
		}
		else
		{
            if(text::VertOrientation::TOP == nAlign)
			{
				if(1 == aHorizontalDLB.GetSelectEntryPos())
				{
					aHorizontalDLB.SelectEntryPos(0);
					bSet = sal_True;
				}
				aHoriRelationLB.SelectEntryPos(1);
			}
            else if(text::VertOrientation::CHAR_BOTTOM == nAlign)
			{
				if(2 == aHorizontalDLB.GetSelectEntryPos())
				{
					aHorizontalDLB.SelectEntryPos(0);
					bSet = sal_True;
				}
				aHoriRelationLB.SelectEntryPos(0) ;
			}
			if(bSet)
				PosHdl(&aHorizontalDLB);
		}

	}
	return 0;
}

/*--------------------------------------------------------------------
	Beschreibung:	Horizontale Pos
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, RelHdl, ListBox *, pLB )
{
	sal_Bool bHori = pLB == &aHoriRelationLB;

	UpdateExample();

	if (bHori)
		bAtHorzPosModified = sal_True;
	else
		bAtVertPosModified = sal_True;

    if (bHtmlMode && (FLY_AT_CHAR == GetAnchor()))
	{
		if(bHori)
		{
			sal_uInt16 nRel = GetRelation(pHMap, aHoriRelationLB);
            if(text::RelOrientation::PRINT_AREA == nRel && 0 == aVerticalDLB.GetSelectEntryPos())
			{
				aVerticalDLB.SelectEntryPos(1);
			}
            else if(text::RelOrientation::CHAR == nRel && 1 == aVerticalDLB.GetSelectEntryPos())
			{
				aVerticalDLB.SelectEntryPos(0);
			}
		}
	}
	if (pLB)	// Nur wenn Handler durch Aenderung des Controllers gerufen wurde
		RangeModifyHdl(0);

	return 0;
}


IMPL_LINK_INLINE_START( SwFrmPage, RealSizeHdl, Button *, EMPTYARG )
{
	aWidthED.SetUserValue( aWidthED. NormalizePercent(aGrfSize.Width() ), FUNIT_TWIP);
	aHeightED.SetUserValue(aHeightED.NormalizePercent(aGrfSize.Height()), FUNIT_TWIP);
    fWidthHeightRatio = aGrfSize.Height() ? double(aGrfSize.Width()) / double(aGrfSize.Height()) : 1.0;
	UpdateExample();
	return 0;
}
IMPL_LINK_INLINE_END( SwFrmPage, RealSizeHdl, Button *, EMPTYARG )


IMPL_LINK( SwFrmPage, AutoWidthClickHdl, void*, EMPTYARG )
{
	if( !IsInGraficMode() )
		HandleAutoCB( aAutoWidthCB.IsChecked(), aWidthFT, aWidthAutoFT );
	return 0;
}

IMPL_LINK( SwFrmPage, AutoHeightClickHdl, void*, EMPTYARG )
{
	if( !IsInGraficMode() )
		HandleAutoCB( aAutoHeightCB.IsChecked(), aHeightFT, aHeightAutoFT );
	return 0;
}

IMPL_LINK( SwFrmPage, ModifyHdl, Edit *, pEdit )
{
    SwTwips nWidth  = static_cast< SwTwips >(aWidthED.DenormalizePercent(aWidthED.GetValue(FUNIT_TWIP)));
    SwTwips nHeight = static_cast< SwTwips >(aHeightED.DenormalizePercent(aHeightED.GetValue(FUNIT_TWIP)));
    if ( aFixedRatioCB.IsChecked() )
	{
		if ( pEdit == &aWidthED )
		{
            nHeight = SwTwips((double)nWidth / fWidthHeightRatio);
            aHeightED.SetPrcntValue(aHeightED.NormalizePercent(nHeight), FUNIT_TWIP);
		}
		else if(pEdit == &aHeightED)
		{
            nWidth = SwTwips((double)nHeight * fWidthHeightRatio);
            aWidthED.SetPrcntValue(aWidthED.NormalizePercent(nWidth), FUNIT_TWIP);
		}
	}
    fWidthHeightRatio = nHeight ? double(nWidth) / double(nHeight) : 1.0;
	UpdateExample();
	return 0;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

void SwFrmPage::UpdateExample()
{
	sal_uInt16 nPos = aHorizontalDLB.GetSelectEntryPos();
	if ( pHMap && nPos != LISTBOX_ENTRY_NOTFOUND )
	{
		sal_uInt16 nMapPos = GetMapPos(pHMap, aHorizontalDLB);
        short nAlign = GetAlignment(pHMap, nMapPos, aHorizontalDLB, aHoriRelationLB);
        short nRel = GetRelation(pHMap, aHoriRelationLB);

		aExampleWN.SetHAlign(nAlign);
		aExampleWN.SetHoriRel(nRel);
	}

	nPos = aVerticalDLB.GetSelectEntryPos();
	if ( pVMap && nPos != LISTBOX_ENTRY_NOTFOUND )
	{
		sal_uInt16 nMapPos = GetMapPos(pVMap, aVerticalDLB);
        short nAlign = GetAlignment(pVMap, nMapPos, aVerticalDLB, aVertRelationLB);
        short nRel = GetRelation(pVMap, aVertRelationLB);

		aExampleWN.SetVAlign(nAlign);
		aExampleWN.SetVertRel(nRel);
	}

	// Size
    long nXPos = static_cast< long >(aAtHorzPosED.Denormalize(aAtHorzPosED.GetValue(FUNIT_TWIP)));
    long nYPos = static_cast< long >(aAtVertPosED.Denormalize(aAtVertPosED.GetValue(FUNIT_TWIP)));
	aExampleWN.SetRelPos(Point(nXPos, nYPos));

    aExampleWN.SetAnchor( static_cast< sal_uInt16 >(GetAnchor()) );
	aExampleWN.Invalidate();
}

void SwFrmPage::Init(const SfxItemSet& rSet, sal_Bool bReset)
{
	if(!bFormat)
	{
		SwWrtShell* pSh = ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();

		// Size
		const sal_Bool bSizeFixed = pSh->IsSelObjProtected( FLYPROTECT_FIXED );

		aWidthED .Enable( !bSizeFixed );
		aHeightED.Enable( !bSizeFixed );

        // size controls for math OLE objects
        if ( DLG_FRM_OLE == nDlgType && ! bNew )
        {
            // disable width and height for math objects
            const SvGlobalName& rFactNm( pSh->GetOLEObject()->getClassID() );

            struct _GlobalNameId {
                sal_uInt32 n1;
                sal_uInt16 n2, n3;
                sal_uInt8 b8, b9, b10, b11, b12, b13, b14, b15;
            } aGlbNmIds[4] = { { SO3_SM_CLASSID_60 }, { SO3_SM_CLASSID_50 },
                               { SO3_SM_CLASSID_40 }, { SO3_SM_CLASSID_30 } };

            for ( int i = 0; i < 4; ++i ) {
                const _GlobalNameId& rId = aGlbNmIds[ i ];

                SvGlobalName aGlbNm( rId.n1, rId.n2, rId.n3,
                                     rId.b8, rId.b9, rId.b10, rId.b11,
                                     rId.b12, rId.b13, rId.b14, rId.b15 );

                if( rFactNm == aGlbNm )
                {
                    // disable size controls for math OLE objects
                    aWidthFT.Disable();
                    aWidthED.Disable();
                    aRelWidthCB.Disable();
                    aHeightFT.Disable();
                    aHeightED.Disable();
                    aRelHeightCB.Disable();
                    aFixedRatioCB.Disable();
                    aRealSizeBT.Disable();
                    break;
                }
            }

            // TODO/LATER: get correct aspect
            if(0 != (pSh->GetOLEObject()->getStatus( embed::Aspects::MSOLE_CONTENT ) & embed::EmbedMisc::MS_EMBED_RECOMPOSEONRESIZE ) )
                aRealSizeBT.Disable();
        }
	}

	const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
    sal_Int64 nWidth  = aWidthED.NormalizePercent(rSize.GetWidth());
    sal_Int64 nHeight = aHeightED.NormalizePercent(rSize.GetHeight());

	if (nWidth != aWidthED.GetValue(FUNIT_TWIP))
	{
		if(!bReset)
		{
			// Wert wurde von Umlauf-Tabpage geaendert und muss
			// mit Modify-Flag gesetzt werden
			aWidthED.SetUserValue(nWidth, FUNIT_TWIP);
		}
		else
            aWidthED.SetPrcntValue(nWidth, FUNIT_TWIP);
	}

	if (nHeight != aHeightED.GetValue(FUNIT_TWIP))
	{
		if (!bReset)
		{
			// Wert wurde von Umlauf-Tabpage geaendert und muss
			// mit Modify-Flag gesetzt werden
			aHeightED.SetUserValue(nHeight, FUNIT_TWIP);
		}
		else
            aHeightED.SetPrcntValue(nHeight, FUNIT_TWIP);
	}

	if (!IsInGraficMode())
	{
		SwFrmSize eSize = rSize.GetHeightSizeType();
		sal_Bool bCheck = eSize != ATT_FIX_SIZE;
		aAutoHeightCB.Check( bCheck );
		HandleAutoCB( bCheck, aHeightFT, aHeightAutoFT );
		if( eSize == ATT_VAR_SIZE )
			aHeightED.SetValue( aHeightED.GetMin(), FUNIT_NONE );

		eSize = rSize.GetWidthSizeType();
		bCheck = eSize != ATT_FIX_SIZE;
		aAutoWidthCB.Check( bCheck );
		HandleAutoCB( bCheck, aWidthFT, aWidthAutoFT );
		if( eSize == ATT_VAR_SIZE )
			aWidthED.SetValue( aWidthED.GetMin(), FUNIT_NONE );

		if ( !bFormat )
		{
			SwWrtShell* pSh = ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
			const SwFrmFmt* pFmt = pSh->GetFlyFrmFmt();
			if( pFmt && pFmt->GetChain().GetNext() )
				aAutoHeightCB.Enable( sal_False );
		}
	}
	else
		aAutoHeightCB.Hide();

	// Umlauf-Abstand fuer zeichengebundene Rahmen organisieren
	const SvxULSpaceItem &rUL = (const SvxULSpaceItem &)rSet.Get(RES_UL_SPACE);
	nUpperBorder = rUL.GetUpper();
	nLowerBorder = rUL.GetLower();

	if(SFX_ITEM_SET == rSet.GetItemState(FN_KEEP_ASPECT_RATIO))
	{
		aFixedRatioCB.Check(((const SfxBoolItem&)rSet.Get(FN_KEEP_ASPECT_RATIO)).GetValue());
		aFixedRatioCB.SaveValue();
	}

	// Spalten
	SwFmtCol aCol( (const SwFmtCol&)rSet.Get(RES_COL) );
	::FitToActualSize( aCol, (sal_uInt16)rSize.GetWidth() );

	RndStdIds eAnchorId = (RndStdIds)GetAnchor();

	if ( bNew && !bFormat )
        InitPos(eAnchorId, USHRT_MAX, 0, USHRT_MAX, USHRT_MAX, LONG_MAX, LONG_MAX);
	else
	{
		const SwFmtHoriOrient& rHori = (const SwFmtHoriOrient&)rSet.Get(RES_HORI_ORIENT);
		const SwFmtVertOrient& rVert = (const SwFmtVertOrient&)rSet.Get(RES_VERT_ORIENT);
		nOldH 	 = rHori.GetHoriOrient();
		nOldHRel = rHori.GetRelationOrient();
		nOldV 	 = rVert.GetVertOrient(),
		nOldVRel = rVert.GetRelationOrient();

        if (eAnchorId == FLY_AT_PAGE)
        {
            if (nOldHRel == text::RelOrientation::FRAME)
                nOldHRel = text::RelOrientation::PAGE_FRAME;
            else if (nOldHRel == text::RelOrientation::PRINT_AREA)
                nOldHRel = text::RelOrientation::PAGE_PRINT_AREA;
            if (nOldVRel == text::RelOrientation::FRAME)
                nOldVRel = text::RelOrientation::PAGE_FRAME;
            else if (nOldVRel == text::RelOrientation::PRINT_AREA)
                nOldVRel = text::RelOrientation::PAGE_PRINT_AREA;
		}

		aMirrorPagesCB.Check(rHori.IsPosToggle());
		aMirrorPagesCB.SaveValue();

		InitPos(eAnchorId,
				nOldH,
				nOldHRel,
				nOldV,
				nOldVRel,
				rHori.GetPos(),
				rVert.GetPos());
	}

	// Transparent fuers Bsp
	// Umlauf fuers Bsp
	const SwFmtSurround& rSurround = (const SwFmtSurround&)rSet.Get(RES_SURROUND);
    aExampleWN.SetWrap ( static_cast< sal_uInt16 >(rSurround.GetSurround()) );

	if ( rSurround.GetSurround() == SURROUND_THROUGHT )
	{
		const SvxOpaqueItem& rOpaque = (const SvxOpaqueItem&)rSet.Get(RES_OPAQUE);
		aExampleWN.SetTransparent(!rOpaque.GetValue());
	}

	// ggf auf Prozent umschalten
	RangeModifyHdl(&aWidthED);	// Referenzwerte setzen (fuer 100%)

	if (rSize.GetWidthPercent() == 0xff || rSize.GetHeightPercent() == 0xff)
		aFixedRatioCB.Check(sal_True);
	if (rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff &&
		!aRelWidthCB.IsChecked())
	{
		aRelWidthCB.Check(sal_True);
		RelSizeClickHdl(&aRelWidthCB);
        aWidthED.SetPrcntValue(rSize.GetWidthPercent(), FUNIT_CUSTOM);
	}
	if (rSize.GetHeightPercent() && rSize.GetHeightPercent() != 0xff &&
		!aRelHeightCB.IsChecked())
	{
		aRelHeightCB.Check(sal_True);
		RelSizeClickHdl(&aRelHeightCB);
        aHeightED.SetPrcntValue(rSize.GetHeightPercent(), FUNIT_CUSTOM);
	}
	aRelWidthCB.SaveValue();
	aRelHeightCB.SaveValue();
}

sal_uInt16* SwFrmPage::GetRanges()
{
	return aPageRg;
}
/* -----------------------------03.11.00 10:52--------------------------------

 ---------------------------------------------------------------------------*/
void SwFrmPage::SetFormatUsed(sal_Bool bFmt)
{
	bFormat  	= bFmt;
	if(bFormat)
	{
        aAnchorAtPageRB.Hide();
        aAnchorAtParaRB.Hide();
        aAnchorAtCharRB.Hide();
        aAnchorAsCharRB.Hide();
        aAnchorAtFrameRB.Hide();
        aTypeFL.Hide();
        aTypeSepFL.Hide();

//        Point aSizePos = aSizeFL.GetPosPixel();
//        Size aSizeSize = aSizeFL.GetSizePixel();
//        aSizeSize.Width() = aTypeFL.GetPosPixel().X() +
//                    aTypeFL.GetSizePixel().Width() - aSizePos.X();
//        aSizeFL.SetSizePixel(aSizeSize);
	}
}


void SwFrmPage::EnableVerticalPositioning( bool bEnable )
{
    m_bAllowVertPositioning = bEnable;
    aVerticalFT.Enable( bEnable );
    aVerticalDLB.Enable( bEnable );
    aAtVertPosFT.Enable( bEnable );
    aAtVertPosED.Enable( bEnable );
    aVertRelationFT.Enable( bEnable );
    aVertRelationLB.Enable( bEnable );
}


/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

SwGrfExtPage::SwGrfExtPage(Window *pParent, const SfxItemSet &rSet) :
	SfxTabPage( pParent, SW_RES(TP_GRF_EXT), rSet ),
    aMirrorFL       (this, SW_RES( FL_MIRROR )),
    aMirrorVertBox  (this, SW_RES( CB_VERT )),
    aMirrorHorzBox  (this, SW_RES( CB_HOR )),
    aAllPagesRB     (this, SW_RES( RB_MIRROR_ALL_PAGES )),
    aLeftPagesRB    (this, SW_RES( RB_MIRROR_LEFT_PAGES )),
    aRightPagesRB   (this, SW_RES( RB_MIRROR_RIGHT_PAGES )),
    aBmpWin         (this, WN_BMP, Graphic(), BitmapEx(SW_RES(BMP_EXAMPLE)), BitmapEx(SW_RES(BMP_EXAMPLE_HC)) ),
    aConnectFL      (this, SW_RES( FL_CONNECT )),
    aConnectFT      (this, SW_RES( FT_CONNECT )),
    aConnectED      (this, SW_RES( ED_CONNECT )),
    aBrowseBT       (this, SW_RES( PB_BROWSE )),
    pGrfDlg         ( 0 )
{
	FreeResource();

	aBrowseBT.SetAccessibleRelationMemberOf(&aConnectFL);

    SetExchangeSupport();
	aMirrorHorzBox.SetClickHdl( LINK(this, SwGrfExtPage, MirrorHdl));
	aMirrorVertBox.SetClickHdl( LINK(this, SwGrfExtPage, MirrorHdl));
	aBrowseBT.SetClickHdl	 ( LINK(this, SwGrfExtPage, BrowseHdl));
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

SwGrfExtPage::~SwGrfExtPage()
{
	delete pGrfDlg;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

SfxTabPage* SwGrfExtPage::Create( Window *pParent, const SfxItemSet &rSet )
{
	return new SwGrfExtPage( pParent, rSet );
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

void SwGrfExtPage::Reset(const SfxItemSet &rSet)
{
	const SfxPoolItem* pItem;
	sal_uInt16 nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
	bHtmlMode = nHtmlMode & HTMLMODE_ON ? sal_True : sal_False;

	if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_GRF_CONNECT, sal_True, &pItem)
		&& ((const SfxBoolItem *)pItem)->GetValue() )
	{
		aBrowseBT.Enable();
		aConnectED.SetReadOnly(sal_False);
	}

	ActivatePage(rSet);
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

void SwGrfExtPage::ActivatePage(const SfxItemSet& rSet)
{
	const SvxProtectItem& rProt = (const SvxProtectItem& )rSet.Get(RES_PROTECT);
    sal_Bool bProtCntnt = rProt.IsCntntProtected();

	const SfxPoolItem* pItem = 0;
	sal_Bool bEnable = sal_False;
	sal_Bool bEnableMirrorRB = sal_False;

	SfxItemState eState = rSet.GetItemState(RES_GRFATR_MIRRORGRF, sal_True, &pItem);
	if( SFX_ITEM_UNKNOWN != eState && !bProtCntnt && !bHtmlMode )
	{
		if( SFX_ITEM_SET != eState )
			pItem = &rSet.Get( RES_GRFATR_MIRRORGRF );

		bEnable = sal_True;

        MirrorGraph eMirror = static_cast< MirrorGraph >(((const SwMirrorGrf* )pItem)->GetValue());
		switch( eMirror )
		{
        case RES_MIRROR_GRAPH_DONT: break;
        case RES_MIRROR_GRAPH_VERT: aMirrorHorzBox.Check(sal_True); break;
        case RES_MIRROR_GRAPH_HOR:  aMirrorVertBox.Check(sal_True); break;
        case RES_MIRROR_GRAPH_BOTH: aMirrorHorzBox.Check(sal_True);
									aMirrorVertBox.Check(sal_True);
									break;
        default:
            ;
        }

		sal_uInt16 nPos = ((const SwMirrorGrf* )pItem)->IsGrfToggle() ? 1 : 0;
        nPos += (eMirror == RES_MIRROR_GRAPH_VERT || eMirror == RES_MIRROR_GRAPH_BOTH)
				 ? 2 : 0;

		bEnableMirrorRB = nPos != 0;

		switch (nPos)
		{
			case 1:	// Auf linken bzw geraden Seiten spiegeln
				aLeftPagesRB.Check();
				aMirrorHorzBox.Check(sal_True);
				break;
			case 2:	// Auf allen Seiten spiegeln
				aAllPagesRB.Check();
				break;
			case 3:	// Auf rechten bzw ungeraden Seiten spiegeln
				aRightPagesRB.Check();
				break;
			default:
				aAllPagesRB.Check();
				break;
		}
	}

	if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_GRAF_GRAPHIC, sal_False, &pItem ) )
	{
		const SvxBrushItem& rBrush = *(SvxBrushItem*)pItem;
		if( rBrush.GetGraphicLink() )
		{
			aGrfName = aNewGrfName = *rBrush.GetGraphicLink();
			aConnectED.SetText( aNewGrfName );
		}
		const Graphic* pGrf = rBrush.GetGraphic();
		if( pGrf )
			aBmpWin.SetGraphic( *pGrf );
	}

	aAllPagesRB .Enable(bEnableMirrorRB);
	aLeftPagesRB.Enable(bEnableMirrorRB);
	aRightPagesRB.Enable(bEnableMirrorRB);
	aMirrorHorzBox.Enable(bEnable);
	aMirrorVertBox.Enable(bEnable);
    aMirrorFL.Enable(bEnable);

	aAllPagesRB .SaveValue();
	aLeftPagesRB.SaveValue();
	aRightPagesRB.SaveValue();
	aMirrorHorzBox.SaveValue();
	aMirrorVertBox.SaveValue();

	aBmpWin.MirrorHorz( aMirrorVertBox.IsChecked() );
	aBmpWin.MirrorVert( aMirrorHorzBox.IsChecked() );
	aBmpWin.Invalidate();
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

sal_Bool SwGrfExtPage::FillItemSet( SfxItemSet &rSet )
{
	sal_Bool bModified = sal_False;
	if ( aMirrorHorzBox.GetSavedValue() != aMirrorHorzBox.IsChecked() ||
		 aMirrorVertBox.GetSavedValue() != aMirrorVertBox.IsChecked() ||
		 aAllPagesRB .GetSavedValue() != aAllPagesRB .IsChecked() ||
		 aLeftPagesRB.GetSavedValue() != aLeftPagesRB.IsChecked() ||
		 aRightPagesRB.GetSavedValue() != aRightPagesRB.IsChecked())
	{
		bModified = sal_True;

		sal_Bool bHori = sal_False;

		if (aMirrorHorzBox.IsChecked() &&
				!aLeftPagesRB.IsChecked())
			bHori = sal_True;

        MirrorGraph eMirror;
		eMirror = aMirrorVertBox.IsChecked() && bHori ?
                    RES_MIRROR_GRAPH_BOTH : bHori ?
                    RES_MIRROR_GRAPH_VERT : aMirrorVertBox.IsChecked() ?
                    RES_MIRROR_GRAPH_HOR  : RES_MIRROR_GRAPH_DONT;

		sal_Bool bMirror = !aAllPagesRB.IsChecked();
		SwMirrorGrf aMirror( eMirror );
		aMirror.SetGrfToggle(bMirror );
		rSet.Put( aMirror );
	}

	if( aGrfName != aNewGrfName || aConnectED.IsModified() )
	{
		bModified = sal_True;
		aGrfName = aConnectED.GetText();
		rSet.Put( SvxBrushItem( aGrfName, aFilterName, GPOS_LT,
								SID_ATTR_GRAF_GRAPHIC ));
	}
	return bModified;
}
/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

int SwGrfExtPage::DeactivatePage(SfxItemSet *_pSet)
{
    if( _pSet )
        FillItemSet( *_pSet );
	return sal_True;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwGrfExtPage, BrowseHdl, Button *, EMPTYARG )
{
	if(!pGrfDlg)
    {
        pGrfDlg = new FileDialogHelper( SFXWB_GRAPHIC );
        pGrfDlg->SetTitle(SW_RESSTR(STR_EDIT_GRF ));
    }
    pGrfDlg->SetDisplayDirectory( aConnectED.GetText() );
    uno::Reference < ui::dialogs::XFilePicker > xFP = pGrfDlg->GetFilePicker();
    uno::Reference < ui::dialogs::XFilePickerControlAccess > xCtrlAcc(xFP, uno::UNO_QUERY);
    sal_Bool bTrue = sal_True;
    uno::Any aVal(&bTrue, ::getBooleanCppuType());
    xCtrlAcc->setValue( ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0, aVal);

    if ( pGrfDlg->Execute() == ERRCODE_NONE )
	{	// ausgewaehlten Filter merken
        aFilterName = pGrfDlg->GetCurrentFilter();
		aNewGrfName = INetURLObject::decode( pGrfDlg->GetPath(),
										INET_HEX_ESCAPE,
						   				INetURLObject::DECODE_UNAMBIGUOUS,
										RTL_TEXTENCODING_UTF8 );
		aConnectED.SetModifyFlag();
		aConnectED.SetText( aNewGrfName );
		//Spiegeln zuruecksetzen, da u. U. eine Bitmap
		//gegen eine andere Art von Grafik ausgetauscht worden ist,
		//die nicht gespiegelt werden kann.
		aMirrorVertBox.Check(sal_False);
		aMirrorHorzBox.Check(sal_False);
		aAllPagesRB .Enable(sal_False);
		aLeftPagesRB.Enable(sal_False);
		aRightPagesRB.Enable(sal_False);
		aBmpWin.MirrorHorz(sal_False);
		aBmpWin.MirrorVert(sal_False);

        Graphic aGraphic;
        GraphicFilter::LoadGraphic( pGrfDlg->GetPath(), aEmptyStr, aGraphic );
        aBmpWin.SetGraphic(aGraphic);

        sal_Bool bEnable = GRAPHIC_BITMAP      == aGraphic.GetType() ||
                            GRAPHIC_GDIMETAFILE == aGraphic.GetType();
		aMirrorVertBox.Enable(bEnable);
		aMirrorHorzBox.Enable(bEnable);
		aAllPagesRB .Enable(bEnable);
		aLeftPagesRB.Enable(bEnable);
		aRightPagesRB.Enable(bEnable);
	}
	return 0;
}
/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwGrfExtPage, MirrorHdl, CheckBox *, EMPTYARG )
{
	sal_Bool bEnable = aMirrorHorzBox.IsChecked();

	aBmpWin.MirrorHorz( aMirrorVertBox.IsChecked() );
	aBmpWin.MirrorVert( bEnable );

	aAllPagesRB .Enable(bEnable);
	aLeftPagesRB.Enable(bEnable);
	aRightPagesRB.Enable(bEnable);

	if (!aAllPagesRB.IsChecked() && !aLeftPagesRB.IsChecked() && !aRightPagesRB.IsChecked())
		aAllPagesRB.Check();

	return 0;
}

/*--------------------------------------------------------------------
	Beschreibung: BeispielWindow
 --------------------------------------------------------------------*/

BmpWindow::BmpWindow( Window* pPar, sal_uInt16 nId,
                        const Graphic& rGraphic, const BitmapEx& rBmp, const BitmapEx& rBmpHC ) :
	Window(pPar, SW_RES(nId)),
	aGraphic(rGraphic),
    aBmp(rBmp),
    aBmpHC(rBmpHC),
	bHorz(sal_False),
	bVert(sal_False),
	bGraphic(sal_False),
	bLeftAlign(sal_False)
{
    // #119307# use background, the graphic might have transparency
    SetBackground(Wallpaper(Color(COL_WHITE)));
}

void BmpWindow::Paint( const Rectangle& )
{
	Point aPntPos;
	Size  aPntSz( GetSizePixel() );
	Size  aGrfSize;
	if(bGraphic)
		aGrfSize = ::GetGraphicSizeTwip(aGraphic, this);
    //it should show the default bitmap also if no graphic can be found
    if(!aGrfSize.Width() && !aGrfSize.Height())
        aGrfSize =  PixelToLogic(aBmp.GetSizePixel());

    long nRelGrf = aGrfSize.Width() * 100L / aGrfSize.Height();
    long nRelWin = aPntSz.Width() * 100L / aPntSz.Height();
    if(nRelGrf < nRelWin)
    {
        const long nWidth = aPntSz.Width();
        aPntSz.Width() = aPntSz.Height() * nRelGrf /100;
        if(!bLeftAlign)
            aPntPos.X() += nWidth - aPntSz.Width() ;
    }

    if ( bHorz )
    {
        aPntPos.Y()     += aPntSz.Height();
        aPntPos.Y() --;
        aPntSz.Height() *= -1;
    }
    if ( bVert )
    {
        aPntPos.X()     += aPntSz.Width();
        aPntPos.X()--;
        aPntSz.Width()  *= -1;
    }

    // #119307# clear window background, the graphic might have transparency
    Erase();

    if ( bGraphic )
        aGraphic.Draw( this, aPntPos, aPntSz );
    else
    {
        bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
        DrawBitmapEx( aPntPos, aPntSz, bHC ? aBmpHC : aBmp );
    }
}

BmpWindow::~BmpWindow()
{
}

void BmpWindow::SetGraphic(const Graphic& rGrf)
{
    aGraphic = rGrf;
    Size aGrfSize = ::GetGraphicSizeTwip(aGraphic, this);
    bGraphic = aGrfSize.Width() && aGrfSize.Height();
    Invalidate();
}

/***************************************************************************
	Beschreibung: 	URL und ImageMap an Rahmen einstellen
***************************************************************************/


SwFrmURLPage::SwFrmURLPage( Window *pParent, const SfxItemSet &rSet ) :
	SfxTabPage(pParent, 	SW_RES(TP_FRM_URL), rSet),
    aHyperLinkFL    (this, SW_RES( FL_HYPERLINK )),
	aURLFT      	(this, SW_RES( FT_URL  	 )),
	aURLED			(this, SW_RES( ED_URL 	 )),
    aSearchPB       (this, SW_RES( PB_SEARCH  )),
	aNameFT      	(this, SW_RES( FT_NAME   )),
	aNameED			(this, SW_RES( ED_NAME 	 )),
	aFrameFT        (this, SW_RES( FT_FRAME   )),
	aFrameCB        (this, SW_RES( CB_FRAME   )),

    aImageFL        (this, SW_RES( FL_IMAGE   )),
	aServerCB       (this, SW_RES( CB_SERVER  )),
	aClientCB       (this, SW_RES( CB_CLIENT  ))
{
	FreeResource();
	aSearchPB.SetClickHdl(LINK(this, SwFrmURLPage, InsertFileHdl));
}

/***************************************************************************
	Beschreibung:
***************************************************************************/

SwFrmURLPage::~SwFrmURLPage()
{
}

/***************************************************************************
	Beschreibung:
***************************************************************************/

void SwFrmURLPage::Reset( const SfxItemSet &rSet )
{
	const SfxPoolItem* pItem;
	if ( SFX_ITEM_SET == rSet.GetItemState( SID_DOCFRAME, sal_True, &pItem))
	{
		TargetList* pList = new TargetList;
		((const SfxFrameItem*)pItem)->GetFrame()->GetTargetList(*pList);
		sal_uInt16 nCount = (sal_uInt16)pList->Count();
		if( nCount )
		{
			sal_uInt16 i;
			for ( i = 0; i < nCount; i++ )
			{
				aFrameCB.InsertEntry(*pList->GetObject(i));
			}
			for ( i = nCount; i; i-- )
			{
				delete pList->GetObject( i - 1 );
			}
		}
		delete pList;
	}

	if ( SFX_ITEM_SET == rSet.GetItemState( RES_URL, sal_True, &pItem ) )
	{
		const SwFmtURL* pFmtURL = (const SwFmtURL*)pItem;
		aURLED.SetText( INetURLObject::decode( pFmtURL->GetURL(),
										INET_HEX_ESCAPE,
						   				INetURLObject::DECODE_UNAMBIGUOUS,
										RTL_TEXTENCODING_UTF8 ));
		aNameED.SetText( pFmtURL->GetName());

		aClientCB.Enable( pFmtURL->GetMap() != 0 );
		aClientCB.Check ( pFmtURL->GetMap() != 0 );
		aServerCB.Check ( pFmtURL->IsServerMap() );

		aFrameCB.SetText(pFmtURL->GetTargetFrameName());
		aFrameCB.SaveValue();
	}
	else
		aClientCB.Enable( sal_False );

	aServerCB.SaveValue();
	aClientCB.SaveValue();
}



/***************************************************************************
	Beschreibung:
***************************************************************************/

sal_Bool SwFrmURLPage::FillItemSet(SfxItemSet &rSet)
{
	sal_Bool bModified = sal_False;
	const SwFmtURL* pOldURL = (SwFmtURL*)GetOldItem(rSet, RES_URL);
	SwFmtURL* pFmtURL;
	if(pOldURL)
		pFmtURL = (SwFmtURL*)pOldURL->Clone();
	else
		pFmtURL = new SwFmtURL();

	{
		String sText = aURLED.GetText();

		if( pFmtURL->GetURL() != sText ||
			pFmtURL->GetName() != aNameED.GetText() ||
			aServerCB.IsChecked() != pFmtURL->IsServerMap() )
		{
			pFmtURL->SetURL( sText, aServerCB.IsChecked() );
			pFmtURL->SetName( aNameED.GetText() );
			bModified = sal_True;
		}
	}

	if(!aClientCB.IsChecked() && pFmtURL->GetMap() != 0)
	{
		pFmtURL->SetMap(0);
		bModified = sal_True;
	}

	if(pFmtURL->GetTargetFrameName() != aFrameCB.GetText())
	{
		pFmtURL->SetTargetFrameName(aFrameCB.GetText());
		bModified = sal_True;
	}
	rSet.Put(*pFmtURL);
	delete pFmtURL;
	return bModified;
}

/***************************************************************************
	Beschreibung:
***************************************************************************/

SfxTabPage* SwFrmURLPage::Create(Window *pParent, const SfxItemSet &rSet)
{
	return new SwFrmURLPage( pParent, rSet );
}

/***************************************************************************
	Beschreibung:
***************************************************************************/

IMPL_LINK( SwFrmURLPage, InsertFileHdl, PushButton *, EMPTYARG )
{
    FileDialogHelper aDlgHelper( ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
    uno::Reference < ui::dialogs::XFilePicker > xFP = aDlgHelper.GetFilePicker();

    try
    {
        String sTemp(aURLED.GetText());
        if(sTemp.Len())
            xFP->setDisplayDirectory(sTemp);
    }
    catch( const uno::Exception& rEx )
    {
        (void) rEx;
    }
    if( aDlgHelper.Execute() == ERRCODE_NONE )
    {
        aURLED.SetText( xFP->getFiles().getConstArray()[0] );
    }

	return 0;
}

/* -----------------------------03.11.00 10:56--------------------------------

 ---------------------------------------------------------------------------*/
void lcl_Move(Window& rWin, sal_Int32 nDiff)
{
	Point aPos(rWin.GetPosPixel());
	aPos.Y() -= nDiff;
	rWin.SetPosPixel(aPos);
}

/*-----------------13.11.96 13.15-------------------

--------------------------------------------------*/

SwFrmAddPage::SwFrmAddPage(Window *pParent, const SfxItemSet &rSet ) :
	SfxTabPage(pParent, 	SW_RES(TP_FRM_ADD), rSet),
    
    aNamesFL           (this, SW_RES(FL_NAME)),
    aNameFT            (this, SW_RES(FT_NAME)),
	aNameED            (this, SW_RES(ED_NAME)),
	aAltNameFT         (this, SW_RES(FT_ALT_NAME)),
	aAltNameED         (this, SW_RES(ED_ALT_NAME)),
	aPrevFT            (this, SW_RES(FT_PREV)),
    aPrevLB            (this, SW_RES(LB_PREV)),
	aNextFT            (this, SW_RES(FT_NEXT)),
    aNextLB            (this, SW_RES(LB_NEXT)),

    aProtectFL         (this, SW_RES(FL_PROTECT)),
    aProtectContentCB  (this, SW_RES(CB_PROTECT_CONTENT)),
    aProtectFrameCB    (this, SW_RES(CB_PROTECT_FRAME)),
    aProtectSizeCB     (this, SW_RES(CB_PROTECT_SIZE)),
    aExtFL             (this, SW_RES(FL_EXT)),

    aEditInReadonlyCB  (this, SW_RES(CB_EDIT_IN_READONLY)),
    aPrintFrameCB      (this, SW_RES(CB_PRINT_FRAME)),
    aTextFlowFT        (this, SW_RES(FT_TEXTFLOW)),
	aTextFlowLB		   (this, SW_RES(LB_TEXTFLOW)),

    pWrtSh(0),

    nDlgType(0),
    bHtmlMode(sal_False),
    bFormat(sal_False),
    bNew(sal_False)
{
	FreeResource();

}

/*-----------------13.11.96 13.15-------------------

--------------------------------------------------*/

SwFrmAddPage::~SwFrmAddPage()
{
}

/*-----------------13.11.96 13.15-------------------

--------------------------------------------------*/

SfxTabPage* SwFrmAddPage::Create(Window *pParent, const SfxItemSet &rSet)
{
	return new SwFrmAddPage(pParent, rSet);
}

/*-----------------13.11.96 13.14-------------------

--------------------------------------------------*/

void SwFrmAddPage::Reset(const SfxItemSet &rSet )
{
	const SfxPoolItem* pItem;
	sal_uInt16 nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
	bHtmlMode = nHtmlMode & HTMLMODE_ON ? sal_True : sal_False;
	if(bHtmlMode)
	{
		aProtectContentCB .Hide();
		aProtectFrameCB   .Hide();
		aProtectSizeCB    .Hide();
		aEditInReadonlyCB .Hide();
		aPrintFrameCB     .Hide();
        aExtFL            .Hide();
        aProtectFL.Hide();
	}
	if ( DLG_FRM_GRF == nDlgType || DLG_FRM_OLE == nDlgType )
	{
		aEditInReadonlyCB.Hide();
		aPrintFrameCB.SetPosPixel(aEditInReadonlyCB.GetPosPixel());
	}

	if(SFX_ITEM_SET == rSet.GetItemState(FN_SET_FRM_ALT_NAME, sal_False, &pItem))
	{
		aAltNameED.SetText(((const SfxStringItem*)pItem)->GetValue());
		aAltNameED.SaveValue();
	}

	if(!bFormat)
	{
		// Grafik einfuegen - Eigenschaften
		// bNew ist nicht gesetzt, deswegen ueber Selektion erkennen
		String aTmpName1;
		if(SFX_ITEM_SET == rSet.GetItemState(FN_SET_FRM_NAME, sal_False, &pItem))
		{
			aTmpName1 = ((const SfxStringItem*)pItem)->GetValue();
		}

		DBG_ASSERT(pWrtSh, "keine Shell?");
		if( bNew || !aTmpName1.Len() )

			switch( nDlgType )
			{
				case DLG_FRM_GRF:
					aTmpName1 = pWrtSh->GetUniqueGrfName();
					break;
				case DLG_FRM_OLE:
					aTmpName1 = pWrtSh->GetUniqueOLEName();
					break;
				default:
					aTmpName1 = pWrtSh->GetUniqueFrameName();
					break;
			}

		aNameED.SetText( aTmpName1 );
		aNameED.SaveValue();
	}
	else
	{
		aNameED.Enable( sal_False );
		aAltNameED.Enable(sal_False);
		aNameFT.Enable( sal_False );
		aAltNameFT.Enable(sal_False);
        aNamesFL.Enable(sal_False);
	}
    if(nDlgType == DLG_FRM_STD && aAltNameFT.IsVisible())
	{
		aAltNameFT.Hide();
		aAltNameED.Hide();
        //move all controls one step up
        Window* aWindows[] =
        {
            &aPrevFT,
            &aPrevLB,
            &aNextFT,
            &aNextLB,
            &aNamesFL,
            &aProtectContentCB,
            &aProtectFrameCB,
            &aProtectSizeCB,
            &aProtectFL,
            &aEditInReadonlyCB,
            &aPrintFrameCB,
            &aTextFlowFT,
            &aTextFlowLB,
            &aExtFL,
            0
        };
        sal_Int32 nOffset = aAltNameED.GetPosPixel().Y() - aNameED.GetPosPixel().Y();
        sal_Int32 nIdx = 0;
        while(aWindows[nIdx])
        {
            lcl_Move(*aWindows[nIdx++], nOffset);
        }
	}
	else
	{
		aNameED.SetModifyHdl(LINK(this, SwFrmAddPage, EditModifyHdl));
	}

	if (!bNew)
	{
		SwFrmFmt* pFmt = pWrtSh->GetFlyFrmFmt();

		if (pFmt)
		{
			const SwFmtChain &rChain = pFmt->GetChain();
			const SwFlyFrmFmt* pFlyFmt;
            String sNextChain, sPrevChain;
			if ((pFlyFmt = rChain.GetPrev()) != 0)
			{
                sPrevChain = pFlyFmt->GetName();
			}

			if ((pFlyFmt = rChain.GetNext()) != 0)
			{
                sNextChain = pFlyFmt->GetName();
			}
            //determine chainable frames
            ::std::vector< String > aPrevPageFrames;
            ::std::vector< String > aThisPageFrames;
            ::std::vector< String > aNextPageFrames;
            ::std::vector< String > aRemainFrames;
            pWrtSh->GetConnectableFrmFmts(*pFmt, sNextChain, sal_False,
                            aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames );
            lcl_InsertVectors(aPrevLB, aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames);
            if(sPrevChain.Len())
            {
                if(LISTBOX_ENTRY_NOTFOUND == aPrevLB.GetEntryPos(sPrevChain))
                    aPrevLB.InsertEntry(sPrevChain, 1);
                aPrevLB.SelectEntry(sPrevChain);
            }
            else
                aPrevLB.SelectEntryPos(0);
            aPrevPageFrames.erase(aPrevPageFrames.begin(), aPrevPageFrames.end());
            aNextPageFrames.erase(aNextPageFrames.begin(), aNextPageFrames.end());
            aThisPageFrames.erase(aThisPageFrames.begin(), aThisPageFrames.end());
            aRemainFrames.erase(aRemainFrames.begin(), aRemainFrames.end());


            pWrtSh->GetConnectableFrmFmts(*pFmt, sPrevChain, sal_True,
                            aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames );
            lcl_InsertVectors(aNextLB, aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames);
            if(sNextChain.Len())
            {
                if(LISTBOX_ENTRY_NOTFOUND == aNextLB.GetEntryPos(sNextChain))
                    aNextLB.InsertEntry(sNextChain, 1);
                aNextLB.SelectEntry(sNextChain);
            }
            else
                aNextLB.SelectEntryPos(0);
            Link aLink(LINK(this, SwFrmAddPage, ChainModifyHdl));
            aPrevLB.SetSelectHdl(aLink);
            aNextLB.SetSelectHdl(aLink);
        }
	}
	// Pos Protected
	const SvxProtectItem& rProt = (const SvxProtectItem& )rSet.Get(RES_PROTECT);
	aProtectFrameCB.Check(rProt.IsPosProtected());
	aProtectContentCB.Check(rProt.IsCntntProtected());
	aProtectSizeCB.Check(rProt.IsSizeProtected());

	const SwFmtEditInReadonly& rEdit = (const SwFmtEditInReadonly& )rSet.Get(RES_EDIT_IN_READONLY);
	aEditInReadonlyCB.Check(rEdit.GetValue());			aEditInReadonlyCB.SaveValue();

	// drucken
	const SvxPrintItem& rPrt = (const SvxPrintItem&)rSet.Get(RES_PRINT);
	aPrintFrameCB.Check(rPrt.GetValue());				aPrintFrameCB.SaveValue();

	// textflow
	SfxItemState eState;
    if( (!bHtmlMode || (0 != (nHtmlMode&HTMLMODE_SOME_STYLES)))
            && DLG_FRM_GRF != nDlgType && DLG_FRM_OLE != nDlgType &&
		SFX_ITEM_UNKNOWN != ( eState = rSet.GetItemState(
                                        RES_FRAMEDIR, sal_True )) )
	{
		aTextFlowFT.Show();
		aTextFlowLB.Show();

        //vertical text flow is not possible in HTML
        if(bHtmlMode)
        {
            sal_uLong nData = FRMDIR_VERT_TOP_RIGHT;
            aTextFlowLB.RemoveEntry(aTextFlowLB.GetEntryPos((void*)nData));
        }
        sal_uInt16 nPos, nVal = ((SvxFrameDirectionItem&)rSet.Get(RES_FRAMEDIR)).GetValue();
		for( nPos = aTextFlowLB.GetEntryCount(); nPos; )
			if( (sal_uInt16)(long)aTextFlowLB.GetEntryData( --nPos ) == nVal )
				break;
		aTextFlowLB.SelectEntryPos( nPos );
		aTextFlowLB.SaveValue();
	}
	else
	{
		aTextFlowFT.Hide();
		aTextFlowLB.Hide();
	}
}

/*-----------------13.11.96 13.20-------------------

--------------------------------------------------*/

sal_Bool SwFrmAddPage::FillItemSet(SfxItemSet &rSet)
{
	sal_Bool bRet = sal_False;
	if (aNameED.GetText() != aNameED.GetSavedValue())
		bRet |= 0 != rSet.Put(SfxStringItem(FN_SET_FRM_NAME, aNameED.GetText()));
	if (aAltNameED.GetText()  != aAltNameED.GetSavedValue())
		bRet |= 0 != rSet.Put(SfxStringItem(FN_SET_FRM_ALT_NAME, aAltNameED.GetText()));

	const SfxPoolItem* pOldItem;
	SvxProtectItem aProt ( (const SvxProtectItem& )GetItemSet().Get(RES_PROTECT) );
	aProt.SetCntntProtect( aProtectContentCB.IsChecked() );
	aProt.SetSizeProtect ( aProtectSizeCB.IsChecked() );
	aProt.SetPosProtect  ( aProtectFrameCB.IsChecked() );
	if ( 0 == (pOldItem = GetOldItem(rSet, FN_SET_PROTECT)) ||
				aProt != *pOldItem )
		bRet |= 0 != rSet.Put( aProt);

	sal_Bool bChecked;
	if ( (bChecked = aEditInReadonlyCB.IsChecked()) != aEditInReadonlyCB.GetSavedValue() )
		bRet |= 0 != rSet.Put( SwFmtEditInReadonly( RES_EDIT_IN_READONLY, bChecked));

	if ( (bChecked = aPrintFrameCB.IsChecked()) != aPrintFrameCB.GetSavedValue() )
		bRet |= 0 != rSet.Put( SvxPrintItem( RES_PRINT, bChecked));

	// textflow
	if( aTextFlowLB.IsVisible() )
	{
		sal_uInt16 nPos = aTextFlowLB.GetSelectEntryPos();
		if( nPos != aTextFlowLB.GetSavedValue() )
		{
			nPos = (sal_uInt16)(long)aTextFlowLB.GetEntryData( nPos );
			bRet |= 0 != rSet.Put( SvxFrameDirectionItem(
									(SvxFrameDirection)nPos, RES_FRAMEDIR ));
		}
	}
    if(pWrtSh)
    {
        const SwFrmFmt* pFmt = pWrtSh->GetFlyFrmFmt();
		if (pFmt)
		{
            String sCurrentPrevChain, sCurrentNextChain;
            if(aPrevLB.GetSelectEntryPos())
                sCurrentPrevChain = aPrevLB.GetSelectEntry();
            if(aNextLB.GetSelectEntryPos())
                sCurrentNextChain = aNextLB.GetSelectEntry();
            const SwFmtChain &rChain = pFmt->GetChain();
			const SwFlyFrmFmt* pFlyFmt;
            String sNextChain, sPrevChain;
			if ((pFlyFmt = rChain.GetPrev()) != 0)
                sPrevChain = pFlyFmt->GetName();

			if ((pFlyFmt = rChain.GetNext()) != 0)
                sNextChain = pFlyFmt->GetName();
            if(sPrevChain != sCurrentPrevChain)
                bRet |= 0 != rSet.Put(SfxStringItem(FN_PARAM_CHAIN_PREVIOUS, sCurrentPrevChain));
            if(sNextChain != sCurrentNextChain)
                bRet |= 0 != rSet.Put(SfxStringItem(FN_PARAM_CHAIN_NEXT, sCurrentNextChain));
        }
    }
    return bRet;
}

/*-----------------13.11.96 15.05-------------------

--------------------------------------------------*/

sal_uInt16* SwFrmAddPage::GetRanges()
{
	return aAddPgRg;
}

/*-----------------13.11.96 16.12-------------------

--------------------------------------------------*/

IMPL_LINK(SwFrmAddPage, EditModifyHdl, Edit*, EMPTYARG)
{
	sal_Bool bEnable = 0 != aNameED.GetText().Len();
	aAltNameED.Enable(bEnable);
	aAltNameFT.Enable(bEnable);

	return 0;
}
//-----------------------------------------------------------------------------
void	SwFrmAddPage::SetFormatUsed(sal_Bool bFmt)
{
	bFormat  = bFmt;
	if(bFormat)
	{
		aNameFT.Show(sal_False);
		aNameED.Show(sal_False);
		aAltNameFT.Show(sal_False);
		aAltNameED.Show(sal_False);
		aPrevFT.Show(sal_False);
        aPrevLB.Show(sal_False);
		aNextFT.Show(sal_False);
        aNextLB.Show(sal_False);
        aNamesFL.Show(sal_False);

        sal_Int32 nDiff = aExtFL.GetPosPixel().Y() - aNamesFL.GetPosPixel().Y();
        Window* aWindows[] =
        {
            &aProtectContentCB,
            &aProtectFrameCB,
            &aProtectSizeCB,
            &aProtectFL,
            &aEditInReadonlyCB,
            &aPrintFrameCB,
            &aExtFL,
            &aTextFlowFT,
            &aTextFlowLB,
            0
        };
        sal_Int32 nIdx = 0;
        while(aWindows[nIdx])
            lcl_Move(*aWindows[nIdx++], nDiff);
	}
}
/* -----------------------------08.08.2002 16:24------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwFrmAddPage, ChainModifyHdl, ListBox*, pBox)
{
    String sCurrentPrevChain, sCurrentNextChain;
    if(aPrevLB.GetSelectEntryPos())
        sCurrentPrevChain = aPrevLB.GetSelectEntry();
    if(aNextLB.GetSelectEntryPos())
        sCurrentNextChain = aNextLB.GetSelectEntry();
    SwFrmFmt* pFmt = pWrtSh->GetFlyFrmFmt();
    if (pFmt)
    {
        sal_Bool bNextBox = &aNextLB == pBox;
        ListBox& rChangeLB = bNextBox ? aPrevLB : aNextLB;
        for(sal_uInt16 nEntry = rChangeLB.GetEntryCount(); nEntry > 1; nEntry--)
            rChangeLB.RemoveEntry(nEntry - 1);
        //determine chainable frames
        ::std::vector< String > aPrevPageFrames;
        ::std::vector< String > aThisPageFrames;
        ::std::vector< String > aNextPageFrames;
        ::std::vector< String > aRemainFrames;
        pWrtSh->GetConnectableFrmFmts(*pFmt, bNextBox ? sCurrentNextChain : sCurrentPrevChain, !bNextBox,
                        aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames );
        lcl_InsertVectors(rChangeLB,
                aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames);
        String sToSelect = bNextBox ? sCurrentPrevChain : sCurrentNextChain;
        if(rChangeLB.GetEntryPos(sToSelect) != LISTBOX_ENTRY_NOTFOUND)
            rChangeLB.SelectEntry(sToSelect);
        else
            rChangeLB.SelectEntryPos(0);

    }
    return 0;
}
