diff options
Diffstat (limited to 'sw/source/ui/frmdlg/frmpage.cxx')
-rw-r--r-- | sw/source/ui/frmdlg/frmpage.cxx | 3148 |
1 files changed, 3148 insertions, 0 deletions
diff --git a/sw/source/ui/frmdlg/frmpage.cxx b/sw/source/ui/frmdlg/frmpage.cxx new file mode 100644 index 000000000000..30dfac09d297 --- /dev/null +++ b/sw/source/ui/frmdlg/frmpage.cxx @@ -0,0 +1,3148 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 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> +#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 + +#define LB_FRAME 0x00000001L // text region of the paragraph +#define LB_PRTAREA 0x00000002L // text region of the paragraph + indentions +#define LB_VERT_FRAME 0x00000004L // vertical text region of the paragraph +#define LB_VERT_PRTAREA 0x00000008L // vertival text region of the paragraph + indentions +#define LB_REL_FRM_LEFT 0x00000010L // left paragraph edge +#define LB_REL_FRM_RIGHT 0x00000020L // right paragraph edge + +#define LB_REL_PG_LEFT 0x00000040L // left page edge +#define LB_REL_PG_RIGHT 0x00000080L // right page edge +#define LB_REL_PG_FRAME 0x00000100L // whole page +#define LB_REL_PG_PRTAREA 0x00000200L // text region of the page + +#define LB_FLY_REL_PG_LEFT 0x00000400L // left frame edge +#define LB_FLY_REL_PG_RIGHT 0x00000800L // right frame edge +#define LB_FLY_REL_PG_FRAME 0x00001000L // whole frame +#define LB_FLY_REL_PG_PRTAREA 0x00002000L // inside of the frame + +#define LB_REL_BASE 0x00010000L // character alignment Base +#define LB_REL_CHAR 0x00020000L // character alignment Character +#define LB_REL_ROW 0x00040000L // character alignment Row + +#define LB_FLY_VERT_FRAME 0x00100000L // vertical entire frame +#define LB_FLY_VERT_PRTAREA 0x00200000L // vertical frame text area + +#define LB_VERT_LINE 0x00400000L // vertical text line + +static RelationMap 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}, + + {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}, + + {SwFPos::REL_LINE, SwFPos::REL_LINE, LB_VERT_LINE, text::RelOrientation::TEXT_LINE} +}; + +static RelationMap 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} +}; + +/*-------------------------------------------------------------------- + Description: site anchored + --------------------------------------------------------------------*/ +#define HORI_PAGE_REL (LB_REL_PG_FRAME|LB_REL_PG_PRTAREA|LB_REL_PG_LEFT| \ + LB_REL_PG_RIGHT) + +static FrmMap 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 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 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 aVPageHtmlMap[] = +{ + {SwFPos::FROMTOP, SwFPos::FROMTOP, text::VertOrientation::NONE, LB_REL_PG_FRAME} +}; + +/*-------------------------------------------------------------------- + Description: frame anchored + --------------------------------------------------------------------*/ +#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 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 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} +}; + +// own vertical alignment map for to frame anchored objects +#define VERT_FRAME_REL (LB_FLY_VERT_FRAME|LB_FLY_VERT_PRTAREA) + +static FrmMap 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 aVFlyHtmlMap[] = +{ + {SwFPos::TOP, SwFPos::TOP, text::VertOrientation::TOP, LB_FLY_VERT_FRAME}, + {SwFPos::FROMTOP, SwFPos::FROMTOP, text::VertOrientation::NONE, LB_FLY_VERT_FRAME} +}; + +/*-------------------------------------------------------------------- + Description: paragraph anchored + --------------------------------------------------------------------*/ +#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 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 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 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} +}; + +// 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 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 aVParaHtmlMap[] = +{ + {SwFPos::TOP, SwFPos::TOP, text::VertOrientation::TOP, LB_VERT_PRTAREA} +}; + +/*-------------------------------------------------------------------- + Description: anchored relative to the character + --------------------------------------------------------------------*/ +#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 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 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 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} +}; + +// allow vertical alignment at page areas +#define VERT_CHAR_REL (LB_VERT_FRAME|LB_VERT_PRTAREA| \ + LB_REL_PG_FRAME|LB_REL_PG_PRTAREA) + +static FrmMap aVCharMap[] = +{ + // 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 aVCharHtmlMap[] = +{ + {SwFPos::BELOW, SwFPos::BELOW, text::VertOrientation::CHAR_BOTTOM, LB_REL_CHAR} +}; + +static FrmMap aVCharHtmlAbsMap[] = +{ + {SwFPos::TOP, SwFPos::TOP, text::VertOrientation::TOP, LB_REL_CHAR}, + {SwFPos::BELOW, SwFPos::BELOW, text::VertOrientation::CHAR_BOTTOM, LB_REL_CHAR} +}; + +/*-------------------------------------------------------------------- + Description: anchored as character + --------------------------------------------------------------------*/ +static FrmMap 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 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 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 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 +}; + +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; + 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; +} + +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 ); +} + +// --> 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; +} + +// 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; +} + +// 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; +} + +/*-------------------------------------------------------------------- + Description: standard frame TabPage + --------------------------------------------------------------------*/ +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)), + 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(sal_False), + // <-- + bIsVerticalFrame(sal_False), + bIsVerticalL2R(sal_False), + bIsInRightToLeft(sal_False), + bHtmlMode(sal_False), + nHtmlMode(0), + nDlgType(0), + nUpperBorder(0), + nLowerBorder(0), + fWidthHeightRatio(1.0), + 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 ); + 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 ) ); +} + +/*-------------------------------------------------------------------- + Description: 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 ) +{ + // i#39692 - 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) + { + // at formats no anchor editing + 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 ) + { + OSL_ENSURE(pSh , "shell not found"); + //OS: only for the variant Insert/Graphic/Properties + 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(); + } + + 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 + { + aGrfSize = ((const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE)).GetSize(); + } + + // entering procent value made possible + 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 ); + } + + // general initialisation part + 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 + } + + // i#22341 - determine content position of character + // Note: content position can be NULL + mpToCharCntntPos = rAnchor.GetCntntAnchor(); + + // i#18732 - 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); + // i#18732 hide checkbox in HTML mode + aFollowTextFlowCB.Show(sal_False); + } + else + { + // enable/disable of check box 'Mirror on..' + aMirrorPagesCB.Enable(!aAnchorAsCharRB.IsChecked()); + + // enable/disable check box 'Follow text flow'. + // 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(); + aFollowTextFlowCB.SaveValue(); + + bNoModifyHdl = sal_False; + //lock PercentFields + aWidthED.LockAutoCalculation(sal_True); + aHeightED.LockAutoCalculation(sal_True); + RangeModifyHdl(&aWidthED); // set all maximum values initially + 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; +} + +/*-------------------------------------------------------------------- + Description: stuff attributes into the set when OK + --------------------------------------------------------------------*/ +sal_Bool SwFrmPage::FillItemSet(SfxItemSet &rSet) +{ + sal_Bool bRet = sal_False; + SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell() + : ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell(); + OSL_ENSURE( 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 ) + { + // alignment vertical + 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) ) + { + // vertival position + // recalculate offset for character bound frames + 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 ); + } + } + + // set size + // new exception: when the size of pMgr(, 0), then the properties + // for a graphic that isn't even loaded, are set. Then no SetSize + // is done here when the size settings were not changed by the + // user. + const SwFmtFrmSize& rOldSize = (const SwFmtFrmSize& )rOldSet.Get(RES_FRM_SIZE); + SwFmtFrmSize aSz( rOldSize ); + + 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) // there is no VAR_SIZE in frames + aSz.SetHeightSizeType(ATT_MIN_SIZE); + + bRet |= 0 != rSet.Put( aSz ); + } + if(aFollowTextFlowCB.IsChecked() != aFollowTextFlowCB.GetSavedValue()) + { + bRet |= 0 != rSet.Put(SwFmtFollowTextFlow(aFollowTextFlowCB.IsChecked())); + } + return bRet; +} + +/*-------------------------------------------------------------------- + Description: initialise horizonal and vertical Pos + --------------------------------------------------------------------*/ +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 ) + { + // 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 ); + + // select current Pos + // horizontal + if ( nH == USHRT_MAX ) + { + nH = nOldH; + nHRel = nOldHRel; + } + sal_uInt16 nMapPos = FillPosLB(pHMap, nH, nHRel, aHorizontalDLB); + FillRelLB(pHMap, nMapPos, nH, nHRel, aHoriRelationLB, aHoriRelationFT); + + // vertical + if ( nV == USHRT_MAX ) + { + nV = nOldV; + nVRel = nOldVRel; + } + nMapPos = FillPosLB(pVMap, nV, nVRel, aVerticalDLB); + FillRelLB(pVMap, nMapPos, nV, nVRel, aVertRelationLB, aVertRelationFT); + + 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(); +} + +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(); + + // i#22341 determine all possible listbox relations for + // given relation for map <aVCharMap> + const sal_uLong nLBRelations = (_pMap != aVCharMap) + ? 0L + : ::lcl_GetLBRelationsForRelations( _nRel ); + + // fill Listbox + size_t nCount = ::lcl_GetFrmMapCount(_pMap); + for (size_t i = 0; _pMap && i < nCount; ++i) + { +// Why not from the left/from inside or from above? + { + 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) + { + // don't insert entries when frames are character bound + _rLB.InsertEntry(sEntry); + } + // i#22341 - 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); +} + +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); + + // 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 + { + // Probably anchor switch. So look for similar relation + 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; +} + +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; +} + +short SwFrmPage::GetAlignment(FrmMap *pMap, sal_uInt16 nMapPos, + ListBox &/*rAlignLB*/, ListBox &rRelationLB) +{ + short nAlign = 0; + + // i#22341 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; +} + +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; +} + +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; +} + +/*-------------------------------------------------------------------- + Description: 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); // set all maximum values initially + aHeightED.LockAutoCalculation(sal_False); + aWidthED.LockAutoCalculation(sal_False); + aFollowTextFlowCB.SaveValue(); +} + +int SwFrmPage::DeactivatePage(SfxItemSet * _pSet) +{ + if ( _pSet ) + { + FillItemSet( *_pSet ); + + //FillItemSet doesn't set the anchor into the set when it matches + //the original. But for the other pages we need the current anchor. + SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell() + : ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell(); + RndStdIds eAnchorId = (RndStdIds)GetAnchor(); + SwFmtAnchor aAnc( eAnchorId, pSh->GetPhyPageNum() ); + _pSet->Put( aAnc ); + } + + return sal_True; +} + +/*-------------------------------------------------------------------- + Description: swap left/right with inside/outside + --------------------------------------------------------------------*/ +IMPL_LINK( SwFrmPage, MirrorHdl, CheckBox *, EMPTYARG ) +{ + RndStdIds eId = GetAnchor(); + InitPos( eId, USHRT_MAX, 0, USHRT_MAX, 0, LONG_MAX, LONG_MAX); + + return 0; +} + +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) // only when Handler was called by change of the controller + RangeModifyHdl(&aWidthED); // correct the values again + + if (pBtn == &aRelWidthCB) + ModifyHdl(&aWidthED); + else // pBtn == &aRelHeightCB + ModifyHdl(&aHeightED); + + return 0; +} + +/*-------------------------------------------------------------------- + Description: range check + --------------------------------------------------------------------*/ +IMPL_LINK( SwFrmPage, RangeModifyHdl, Edit *, EMPTYARG ) +{ + if (bNoModifyHdl) + return 0; + + SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell() + :((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell(); + OSL_ENSURE(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(); + aVal.bFollowTextFlow = aFollowTextFlowCB.IsChecked(); + + if ( pHMap ) + { + // alignment horizonal + 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 ) + { + // alignment vertical + 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); // one time, to get reference values for percental values + + // set reference values for percental values (100%) ... + aWidthED.SetRefValue(aVal.aPercentSize.Width()); + aHeightED.SetRefValue(aVal.aPercentSize.Height()); + + // ... and correctly convert width and height with it + 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); // one more time, to determine all remaining values with correct width and height. + + // all columns have to be correct + 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;//one was already in there! + } + } + + nWidth = aVal.nWidth; + nHeight = aVal.nHeight; + + // minimum range also for template + 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()); + + // i#18732 - enable check box 'Follow text flow' for anchor + // type to-paragraph' and to-character + // i#22305 - 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; +} + +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) // only when Handler was called by changing of the controller + 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; + + // special treatment for HTML-Mode with horizonal-vertical-dependencies + if(bHtmlMode && nHtmlMode&HTMLMODE_SOME_ABS_POS && + (FLY_AT_CHAR == GetAnchor())) + { + sal_Bool bSet = sal_False; + if(bHori) + { + // right is allowed only above - from the left only above + // from the left at character -> below + 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; +} + +/*-------------------------------------------------------------------- + Description: horizonal 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) // Only when Handler was called by changing of the controller + 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; +} + +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) + { + // value was changed by circulation-Tabpage and + // has to be set with Modify-Flag + aWidthED.SetUserValue(nWidth, FUNIT_TWIP); + } + else + aWidthED.SetPrcntValue(nWidth, FUNIT_TWIP); + } + + if (nHeight != aHeightED.GetValue(FUNIT_TWIP)) + { + if (!bReset) + { + // values was changed by circulation-Tabpage and + // has to be set with Modify-Flag + 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(); + + // organise circulation-gap for character bound frames + 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(); + } + + // columns + 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 for example + // circulation for example + 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()); + } + + // switch to percent if applicable + RangeModifyHdl(&aWidthED); // set reference values (for 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; +} + +void SwFrmPage::SetFormatUsed(sal_Bool bFmt) +{ + bFormat = bFmt; + if(bFormat) + { + aAnchorAtPageRB.Hide(); + aAnchorAtParaRB.Hide(); + aAnchorAtCharRB.Hide(); + aAnchorAsCharRB.Hide(); + aAnchorAtFrameRB.Hide(); + aTypeFL.Hide(); + aTypeSepFL.Hide(); + } +} + + +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 ); +} + + +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))), + 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)); +} + +SwGrfExtPage::~SwGrfExtPage() +{ + delete pGrfDlg; +} + +SfxTabPage* SwGrfExtPage::Create( Window *pParent, const SfxItemSet &rSet ) +{ + return new SwGrfExtPage( pParent, rSet ); +} + +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); +} + +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: // mirror at left / even pages + aLeftPagesRB.Check(); + aMirrorHorzBox.Check(sal_True); + break; + case 2: // mirror on all pages + aAllPagesRB.Check(); + break; + case 3: // mirror on right / odd pages + 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(); +} + +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; +} + +int SwGrfExtPage::DeactivatePage(SfxItemSet *_pSet) +{ + if( _pSet ) + FillItemSet( *_pSet ); + return sal_True; +} + +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 ) + { // remember selected filter + aFilterName = pGrfDlg->GetCurrentFilter(); + aNewGrfName = INetURLObject::decode( pGrfDlg->GetPath(), + INET_HEX_ESCAPE, + INetURLObject::DECODE_UNAMBIGUOUS, + RTL_TEXTENCODING_UTF8 ); + aConnectED.SetModifyFlag(); + aConnectED.SetText( aNewGrfName ); + //reset mirrors because maybe a Bitmap was swapped with + //another type of graphic that cannot be mirrored. + 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; +} + +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; +} + +/*-------------------------------------------------------------------- + Description: example window + --------------------------------------------------------------------*/ +BmpWindow::BmpWindow( Window* pPar, sal_uInt16 nId, + const Graphic& rGraphic, const BitmapEx& rBmp ) : + Window(pPar, SW_RES(nId)), + aGraphic(rGraphic), + aBmp(rBmp), + bHorz(sal_False), + bVert(sal_False), + bGraphic(sal_False), + bLeftAlign(sal_False) +{ + SetBackground(); +} + +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; + } + + if ( bGraphic ) + aGraphic.Draw( this, aPntPos, aPntSz ); + else + { + DrawBitmapEx( aPntPos, aPntSz, aBmp ); + } +} + +BmpWindow::~BmpWindow() +{ +} + +void BmpWindow::SetGraphic(const Graphic& rGrf) +{ + aGraphic = rGrf; + Size aGrfSize = ::GetGraphicSizeTwip(aGraphic, this); + bGraphic = aGrfSize.Width() && aGrfSize.Height(); + Invalidate(); +} + +/*************************************************************************** + Description: set URL and ImageMap at frames +***************************************************************************/ +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)); +} + +SwFrmURLPage::~SwFrmURLPage() +{ +} + +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); + if( !pList->empty() ) + { + size_t nCount = pList->size(); + for ( size_t i = 0; i < nCount; i++ ) + { + aFrameCB.InsertEntry( *pList->at( i ) ); + } + for ( size_t i = nCount; i; ) + { + delete pList->at( --i ); + } + } + 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(); +} + +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; +} + +SfxTabPage* SwFrmURLPage::Create(Window *pParent, const SfxItemSet &rSet) +{ + return new SwFrmURLPage( pParent, rSet ); +} + +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; +} + +void lcl_Move(Window& rWin, sal_Int32 nDiff) +{ + Point aPos(rWin.GetPosPixel()); + aPos.Y() -= nDiff; + rWin.SetPosPixel(aPos); +} + +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(); + +} + +SwFrmAddPage::~SwFrmAddPage() +{ +} + +SfxTabPage* SwFrmAddPage::Create(Window *pParent, const SfxItemSet &rSet) +{ + return new SwFrmAddPage(pParent, rSet); +} + +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) + { + // insert graphic - properties + // bNew is not set, so recognise by selection + String aTmpName1; + if(SFX_ITEM_SET == rSet.GetItemState(FN_SET_FRM_NAME, sal_False, &pItem)) + { + aTmpName1 = ((const SfxStringItem*)pItem)->GetValue(); + } + + OSL_ENSURE(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(); + + // print + 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(); + } +} + +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; +} + +sal_uInt16* SwFrmAddPage::GetRanges() +{ + return aAddPgRg; +} + +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); + } +} + +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; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |