xref: /AOO42X/main/sw/source/ui/frmdlg/frmpage.cxx (revision ffad8df045fe8db79e3e50f731c1fa6ab6501c83)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 #ifdef SW_DLLIMPLEMENTATION
27 #undef SW_DLLIMPLEMENTATION
28 #endif
29 
30 #include <com/sun/star/embed/Aspects.hpp>
31 #include <com/sun/star/embed/EmbedMisc.hpp>
32 
33 #include <cmdid.h>
34 #include <helpid.h>
35 #include <hintids.hxx>
36 #include <vcl/msgbox.hxx>
37 #include <vcl/mnemonic.hxx>
38 #include <svl/urihelper.hxx>
39 #include <svl/stritem.hxx>
40 #include <svx/htmlmode.hxx>
41 #include <editeng/sizeitem.hxx>
42 #include <editeng/opaqitem.hxx>
43 #include <editeng/protitem.hxx>
44 #include <editeng/prntitem.hxx>
45 #include <editeng/brshitem.hxx>
46 #include <editeng/ulspitem.hxx>
47 #include <editeng/frmdiritem.hxx>
48 #include <svx/swframevalidation.hxx>
49 #include <sot/clsids.hxx>
50 
51 #include <sfx2/viewfrm.hxx>
52 #include <fmturl.hxx>
53 #include <fmteiro.hxx>
54 #include <fmtcnct.hxx>
55 #include <view.hxx>
56 #include <wrtsh.hxx>
57 #include <swmodule.hxx>
58 #include <uitool.hxx>
59 #include <docsh.hxx>
60 #include <viewopt.hxx>
61 #include <frmatr.hxx>
62 #include <frmdlg.hxx>
63 #include <frmmgr.hxx>
64 #include <frmpage.hxx>
65 #include <wrap.hxx>
66 #include <colmgr.hxx>
67 #include <grfatr.hxx>
68 #include <uiitems.hxx>
69 // OD 19.09.2003 #i18732#
70 #include <fmtfollowtextflow.hxx>
71 
72 #include <frmui.hrc>
73 #include <frmpage.hrc>
74 #include <sfx2/filedlghelper.hxx>
75 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
76 #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
77 #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
78 #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
79 #include <svtools/filter.hxx>
80 
81 using namespace ::com::sun::star;
82 using ::rtl::OUString;
83 using namespace ::sfx2;
84 
85 #define SwFPos SvxSwFramePosString
86 
87 struct FrmMap
88 {
89     SvxSwFramePosString::StringId eStrId;
90     SvxSwFramePosString::StringId eMirrorStrId;
91     sal_uInt16 nAlign;
92     sal_uLong  nLBRelations;
93 };
94 
95 struct RelationMap
96 {
97     SvxSwFramePosString::StringId eStrId;
98     SvxSwFramePosString::StringId eMirrorStrId;
99     sal_uLong  nLBRelation;
100     sal_uInt16 nRelation;
101 };
102 
103 struct StringIdPair_Impl
104 {
105     SvxSwFramePosString::StringId eHori;
106     SvxSwFramePosString::StringId eVert;
107 };
108 
109 #define MAX_PERCENT_WIDTH   254L
110 #define MAX_PERCENT_HEIGHT  254L
111 
112 // OD 19.09.2003 #i18732# - change order of alignments
113 #define LB_FRAME                0x00000001L // Textbereich des Absatzes
114 #define LB_PRTAREA              0x00000002L // Textbereich des Absatzes + Einzuege
115 #define LB_VERT_FRAME           0x00000004L // Vertikaler Textbereich des Absatzes
116 #define LB_VERT_PRTAREA         0x00000008L // Vertikaler Textbereich des Absatzes + Einzuege
117 #define LB_REL_FRM_LEFT         0x00000010L // Linker Absatzrand
118 #define LB_REL_FRM_RIGHT        0x00000020L // Rechter Absatzrand
119 
120 #define LB_REL_PG_LEFT          0x00000040L // Linker Seitenrand
121 #define LB_REL_PG_RIGHT         0x00000080L    // Rechter Seitenrand
122 #define LB_REL_PG_FRAME         0x00000100L // Gesamte Seite
123 #define LB_REL_PG_PRTAREA       0x00000200L    // Textbereich der Seite
124 
125 #define LB_FLY_REL_PG_LEFT      0x00000400L    // Linker Rahmenrand
126 #define LB_FLY_REL_PG_RIGHT     0x00000800L    // Rechter Rahmenrand
127 #define LB_FLY_REL_PG_FRAME     0x00001000L    // Gesamte Rahmen
128 #define LB_FLY_REL_PG_PRTAREA   0x00002000L    // Rahmeninneres
129 
130 #define LB_REL_BASE             0x00010000L // Zeichenausrichtung Basis
131 #define LB_REL_CHAR             0x00020000L // Zeichenausrichtung Zeichen
132 #define LB_REL_ROW              0x00040000L // Zeichenausrichtung Zeile
133 
134 // OD 10.11.2003 #i22305#
135 #define LB_FLY_VERT_FRAME       0x00100000L // vertical entire frame
136 #define LB_FLY_VERT_PRTAREA     0x00200000L // vertical frame text area
137 
138 // OD 11.11.2003 #i22341#
139 #define LB_VERT_LINE            0x00400000L // vertical text line
140 
141 static RelationMap __FAR_DATA aRelationMap[] =
142 {
143     {SwFPos::FRAME,  SwFPos::FRAME, LB_FRAME, text::RelOrientation::FRAME},
144     {SwFPos::PRTAREA,           SwFPos::PRTAREA,                LB_PRTAREA,             text::RelOrientation::PRINT_AREA},
145     {SwFPos::REL_PG_LEFT,       SwFPos::MIR_REL_PG_LEFT,        LB_REL_PG_LEFT,         text::RelOrientation::PAGE_LEFT},
146     {SwFPos::REL_PG_RIGHT,      SwFPos::MIR_REL_PG_RIGHT,       LB_REL_PG_RIGHT,        text::RelOrientation::PAGE_RIGHT},
147     {SwFPos::REL_FRM_LEFT,      SwFPos::MIR_REL_FRM_LEFT,       LB_REL_FRM_LEFT,        text::RelOrientation::FRAME_LEFT},
148     {SwFPos::REL_FRM_RIGHT,     SwFPos::MIR_REL_FRM_RIGHT,      LB_REL_FRM_RIGHT,       text::RelOrientation::FRAME_RIGHT},
149     {SwFPos::REL_PG_FRAME,      SwFPos::REL_PG_FRAME,           LB_REL_PG_FRAME,        text::RelOrientation::PAGE_FRAME},
150     {SwFPos::REL_PG_PRTAREA,    SwFPos::REL_PG_PRTAREA,         LB_REL_PG_PRTAREA,      text::RelOrientation::PAGE_PRINT_AREA},
151     {SwFPos::REL_CHAR,          SwFPos::REL_CHAR,               LB_REL_CHAR,            text::RelOrientation::CHAR},
152 
153     {SwFPos::FLY_REL_PG_LEFT,       SwFPos::FLY_MIR_REL_PG_LEFT,    LB_FLY_REL_PG_LEFT,     text::RelOrientation::PAGE_LEFT},
154     {SwFPos::FLY_REL_PG_RIGHT,      SwFPos::FLY_MIR_REL_PG_RIGHT,   LB_FLY_REL_PG_RIGHT,    text::RelOrientation::PAGE_RIGHT},
155     {SwFPos::FLY_REL_PG_FRAME,      SwFPos::FLY_REL_PG_FRAME,       LB_FLY_REL_PG_FRAME,    text::RelOrientation::PAGE_FRAME},
156     {SwFPos::FLY_REL_PG_PRTAREA,    SwFPos::FLY_REL_PG_PRTAREA,     LB_FLY_REL_PG_PRTAREA,  text::RelOrientation::PAGE_PRINT_AREA},
157 
158     {SwFPos::REL_BORDER,        SwFPos::REL_BORDER,             LB_VERT_FRAME,          text::RelOrientation::FRAME},
159     {SwFPos::REL_PRTAREA,       SwFPos::REL_PRTAREA,            LB_VERT_PRTAREA,        text::RelOrientation::PRINT_AREA},
160 
161     // OD 10.11.2003 #i22305#
162     {SwFPos::FLY_REL_PG_FRAME,      SwFPos::FLY_REL_PG_FRAME,   LB_FLY_VERT_FRAME,      text::RelOrientation::FRAME},
163     {SwFPos::FLY_REL_PG_PRTAREA,    SwFPos::FLY_REL_PG_PRTAREA,     LB_FLY_VERT_PRTAREA,    text::RelOrientation::PRINT_AREA},
164 
165     // OD 11.11.2003 #i22341#
166     {SwFPos::REL_LINE,  SwFPos::REL_LINE,   LB_VERT_LINE,   text::RelOrientation::TEXT_LINE}
167 };
168 
169 static RelationMap __FAR_DATA aAsCharRelationMap[] =
170 {
171     {SwFPos::REL_BASE,  SwFPos::REL_BASE,   LB_REL_BASE,    text::RelOrientation::FRAME},
172     {SwFPos::REL_CHAR,   SwFPos::REL_CHAR,   LB_REL_CHAR,   text::RelOrientation::FRAME},
173     {SwFPos::REL_ROW,    SwFPos::REL_ROW,   LB_REL_ROW,     text::RelOrientation::FRAME}
174 };
175 
176 /*--------------------------------------------------------------------
177     Beschreibung: Seite verankert
178  --------------------------------------------------------------------*/
179 
180 #define HORI_PAGE_REL   (LB_REL_PG_FRAME|LB_REL_PG_PRTAREA|LB_REL_PG_LEFT| \
181                         LB_REL_PG_RIGHT)
182 
183 static FrmMap __FAR_DATA aHPageMap[] =
184 {
185     {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      HORI_PAGE_REL},
186     {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     HORI_PAGE_REL},
187     {SwFPos::CENTER_HORI,   SwFPos::CENTER_HORI,    text::HoriOrientation::CENTER,    HORI_PAGE_REL},
188     {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      HORI_PAGE_REL}
189 };
190 
191 static FrmMap __FAR_DATA aHPageHtmlMap[] =
192 {
193     {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      LB_REL_PG_FRAME}
194 };
195 
196 #define VERT_PAGE_REL   (LB_REL_PG_FRAME|LB_REL_PG_PRTAREA)
197 
198 static FrmMap __FAR_DATA aVPageMap[] =
199 {
200     {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,       VERT_PAGE_REL},
201     {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::BOTTOM,    VERT_PAGE_REL},
202     {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,    VERT_PAGE_REL},
203     {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,      VERT_PAGE_REL}
204 };
205 
206 static FrmMap __FAR_DATA aVPageHtmlMap[] =
207 {
208     {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,      LB_REL_PG_FRAME}
209 };
210 
211 /*--------------------------------------------------------------------
212     Beschreibung: Rahmen verankert
213  --------------------------------------------------------------------*/
214 
215 #define HORI_FRAME_REL  (LB_FLY_REL_PG_FRAME|LB_FLY_REL_PG_PRTAREA| \
216                         LB_FLY_REL_PG_LEFT|LB_FLY_REL_PG_RIGHT)
217 
218 static FrmMap __FAR_DATA aHFrameMap[] =
219 {
220     {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,  HORI_FRAME_REL},
221     {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     HORI_FRAME_REL},
222     {SwFPos::CENTER_HORI,   SwFPos::CENTER_HORI,    text::HoriOrientation::CENTER,    HORI_FRAME_REL},
223     {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      HORI_FRAME_REL}
224 };
225 
226 static FrmMap __FAR_DATA aHFlyHtmlMap[] =
227 {
228     {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      LB_FLY_REL_PG_FRAME},
229     {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      LB_FLY_REL_PG_FRAME}
230 };
231 
232 // OD 19.09.2003 #i18732# - own vertical alignment map for to frame anchored objects
233 // OD 10.11.2003 #i22305#
234 #define VERT_FRAME_REL   (LB_FLY_VERT_FRAME|LB_FLY_VERT_PRTAREA)
235 
236 static FrmMap __FAR_DATA aVFrameMap[] =
237 {
238     {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,       VERT_FRAME_REL},
239     {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::BOTTOM,    VERT_FRAME_REL},
240     {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,    VERT_FRAME_REL},
241     {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,      VERT_FRAME_REL}
242 };
243 
244 static FrmMap __FAR_DATA aVFlyHtmlMap[] =
245 {
246     // OD 10.11.2003 #i22305#
247     {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,       LB_FLY_VERT_FRAME},
248     {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,      LB_FLY_VERT_FRAME}
249 };
250 
251 /*--------------------------------------------------------------------
252     Beschreibung: Absatz verankert
253  --------------------------------------------------------------------*/
254 
255 #define HORI_PARA_REL   (LB_FRAME|LB_PRTAREA|LB_REL_PG_LEFT|LB_REL_PG_RIGHT| \
256                         LB_REL_PG_FRAME|LB_REL_PG_PRTAREA|LB_REL_FRM_LEFT| \
257                         LB_REL_FRM_RIGHT)
258 
259 static FrmMap __FAR_DATA aHParaMap[] =
260 {
261     {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      HORI_PARA_REL},
262     {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     HORI_PARA_REL},
263     {SwFPos::CENTER_HORI,   SwFPos::CENTER_HORI,    text::HoriOrientation::CENTER,    HORI_PARA_REL},
264     {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      HORI_PARA_REL}
265 };
266 
267 #define HTML_HORI_PARA_REL  (LB_FRAME|LB_PRTAREA)
268 
269 static FrmMap __FAR_DATA aHParaHtmlMap[] =
270 {
271     {SwFPos::LEFT,  SwFPos::LEFT,   text::HoriOrientation::LEFT,      HTML_HORI_PARA_REL},
272     {SwFPos::RIGHT, SwFPos::RIGHT,  text::HoriOrientation::RIGHT,     HTML_HORI_PARA_REL}
273 };
274 
275 static FrmMap __FAR_DATA aHParaHtmlAbsMap[] =
276 {
277     {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      HTML_HORI_PARA_REL},
278     {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     HTML_HORI_PARA_REL}
279 };
280 
281 // OD 19.09.2003 #i18732# - allow vertical alignment at page areas
282 #define VERT_PARA_REL   (LB_VERT_FRAME|LB_VERT_PRTAREA| \
283                          LB_REL_PG_FRAME|LB_REL_PG_PRTAREA)
284 
285 static FrmMap __FAR_DATA aVParaMap[] =
286 {
287     {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,       VERT_PARA_REL},
288     {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::BOTTOM,    VERT_PARA_REL},
289     {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,    VERT_PARA_REL},
290     {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,      VERT_PARA_REL}
291 };
292 
293 static FrmMap __FAR_DATA aVParaHtmlMap[] =
294 {
295     {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,       LB_VERT_PRTAREA}
296 };
297 
298 /*--------------------------------------------------------------------
299     Beschreibung: Relativ zum Zeichen verankert
300  --------------------------------------------------------------------*/
301 
302 #define HORI_CHAR_REL   (LB_FRAME|LB_PRTAREA|LB_REL_PG_LEFT|LB_REL_PG_RIGHT| \
303                         LB_REL_PG_FRAME|LB_REL_PG_PRTAREA|LB_REL_FRM_LEFT| \
304                         LB_REL_FRM_RIGHT|LB_REL_CHAR)
305 
306 static FrmMap __FAR_DATA aHCharMap[] =
307 {
308     {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      HORI_CHAR_REL},
309     {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     HORI_CHAR_REL},
310     {SwFPos::CENTER_HORI,   SwFPos::CENTER_HORI,    text::HoriOrientation::CENTER,    HORI_CHAR_REL},
311     {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      HORI_CHAR_REL}
312 };
313 
314 #define HTML_HORI_CHAR_REL  (LB_FRAME|LB_PRTAREA|LB_REL_CHAR)
315 
316 static FrmMap __FAR_DATA aHCharHtmlMap[] =
317 {
318     {SwFPos::LEFT,          SwFPos::LEFT,           text::HoriOrientation::LEFT,      HTML_HORI_CHAR_REL},
319     {SwFPos::RIGHT,         SwFPos::RIGHT,          text::HoriOrientation::RIGHT,     HTML_HORI_CHAR_REL}
320 };
321 
322 static FrmMap __FAR_DATA aHCharHtmlAbsMap[] =
323 {
324     {SwFPos::LEFT,          SwFPos::MIR_LEFT,       text::HoriOrientation::LEFT,      LB_PRTAREA|LB_REL_CHAR},
325     {SwFPos::RIGHT,         SwFPos::MIR_RIGHT,      text::HoriOrientation::RIGHT,     LB_PRTAREA},
326     {SwFPos::FROMLEFT,      SwFPos::MIR_FROMLEFT,   text::HoriOrientation::NONE,      LB_REL_PG_FRAME}
327 };
328 
329 // OD 19.09.2003 #i18732# - allow vertical alignment at page areas
330 // OD 12.11.2003 #i22341# - handle <LB_REL_CHAR> on its own
331 #define VERT_CHAR_REL   (LB_VERT_FRAME|LB_VERT_PRTAREA| \
332                          LB_REL_PG_FRAME|LB_REL_PG_PRTAREA)
333 
334 static FrmMap __FAR_DATA aVCharMap[] =
335 {
336     // OD 11.11.2003 #i22341#
337     // introduce mappings for new vertical alignment at top of line <LB_VERT_LINE>
338     // and correct mapping for vertical alignment at character for position <FROM_BOTTOM>
339     // Note: Because of these adjustments the map becomes ambigous in its values
340     //       <eStrId>/<eMirrorStrId> and <nAlign>. These ambiguities are considered
341     //       in the methods <SwFrmPage::FillRelLB(..)>, <SwFrmPage::GetAlignment(..)>
342     //       and <SwFrmPage::FillPosLB(..)>
343     {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,           VERT_CHAR_REL|LB_REL_CHAR},
344     {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::BOTTOM,        VERT_CHAR_REL|LB_REL_CHAR},
345     {SwFPos::BELOW,         SwFPos::BELOW,          text::VertOrientation::CHAR_BOTTOM,   LB_REL_CHAR},
346     {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,        VERT_CHAR_REL|LB_REL_CHAR},
347     {SwFPos::FROMTOP,       SwFPos::FROMTOP,        text::VertOrientation::NONE,          VERT_CHAR_REL},
348     {SwFPos::FROMBOTTOM,    SwFPos::FROMBOTTOM,     text::VertOrientation::NONE,          LB_REL_CHAR|LB_VERT_LINE},
349     {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::LINE_TOP,      LB_VERT_LINE},
350     {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::LINE_BOTTOM,   LB_VERT_LINE},
351     {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::LINE_CENTER,   LB_VERT_LINE}
352 };
353 
354 
355 static FrmMap __FAR_DATA aVCharHtmlMap[] =
356 {
357     {SwFPos::BELOW,         SwFPos::BELOW,          text::VertOrientation::CHAR_BOTTOM,   LB_REL_CHAR}
358 };
359 
360 static FrmMap __FAR_DATA aVCharHtmlAbsMap[] =
361 {
362     {SwFPos::TOP,           SwFPos::TOP,            text::VertOrientation::TOP,           LB_REL_CHAR},
363     {SwFPos::BELOW,             SwFPos::BELOW,          text::VertOrientation::CHAR_BOTTOM,   LB_REL_CHAR}
364 };
365 /*--------------------------------------------------------------------
366     Beschreibung: Als Zeichen verankert
367  --------------------------------------------------------------------*/
368 
369 static FrmMap __FAR_DATA aVAsCharMap[] =
370 {
371     {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::TOP,           LB_REL_BASE},
372     {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::BOTTOM,        LB_REL_BASE},
373     {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,        LB_REL_BASE},
374 
375     {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::CHAR_TOP,      LB_REL_CHAR},
376     {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::CHAR_BOTTOM,   LB_REL_CHAR},
377     {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CHAR_CENTER,   LB_REL_CHAR},
378 
379     {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::LINE_TOP,      LB_REL_ROW},
380     {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::LINE_BOTTOM,   LB_REL_ROW},
381     {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::LINE_CENTER,   LB_REL_ROW},
382 
383     {SwFPos::FROMBOTTOM,    SwFPos::FROMBOTTOM,     text::VertOrientation::NONE,          LB_REL_BASE}
384 };
385 
386 static FrmMap __FAR_DATA aVAsCharHtmlMap[] =
387 {
388     {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::TOP,           LB_REL_BASE},
389     {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::CENTER,        LB_REL_BASE},
390 
391     {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::CHAR_TOP,      LB_REL_CHAR},
392 
393     {SwFPos::TOP,               SwFPos::TOP,            text::VertOrientation::LINE_TOP,      LB_REL_ROW},
394     {SwFPos::BOTTOM,        SwFPos::BOTTOM,         text::VertOrientation::LINE_BOTTOM,   LB_REL_ROW},
395     {SwFPos::CENTER_VERT,   SwFPos::CENTER_VERT,    text::VertOrientation::LINE_CENTER,   LB_REL_ROW}
396 };
397 
398 static sal_uInt16 __FAR_DATA aPageRg[] = {
399     RES_FRM_SIZE, RES_FRM_SIZE,
400     RES_VERT_ORIENT, RES_ANCHOR,
401     RES_COL, RES_COL,
402     RES_FOLLOW_TEXT_FLOW, RES_FOLLOW_TEXT_FLOW,
403     0
404 };
405 static sal_uInt16 __FAR_DATA aAddPgRg[] = {
406     RES_PROTECT,            RES_PROTECT,
407     RES_PRINT,              RES_PRINT,
408     FN_SET_FRM_NAME,        FN_SET_FRM_NAME,
409     FN_SET_FRM_ALT_NAME,    FN_SET_FRM_ALT_NAME,
410     0
411 };
412 
413 /*--------------------------------------------------------------------
414     Beschreibung:
415  --------------------------------------------------------------------*/
416 
417 size_t lcl_GetFrmMapCount( const FrmMap* pMap)
418 {
419     if ( pMap )
420     {
421         int aSizeOf = sizeof(FrmMap);
422         if( pMap == aVParaHtmlMap)
423             return sizeof(aVParaHtmlMap) / aSizeOf;
424         if( pMap == aVAsCharHtmlMap)
425             return sizeof(aVAsCharHtmlMap) / aSizeOf;
426         if( pMap == aHParaHtmlMap)
427             return sizeof(aHParaHtmlMap) / aSizeOf;
428         if( pMap == aHParaHtmlAbsMap)
429             return sizeof(aHParaHtmlAbsMap) / aSizeOf;
430         if ( pMap == aVPageMap )
431             return sizeof(aVPageMap) / aSizeOf;
432         if ( pMap == aVPageHtmlMap )
433             return sizeof(aVPageHtmlMap) / aSizeOf;
434         if ( pMap == aVAsCharMap )
435             return sizeof(aVAsCharMap) / aSizeOf;
436         if ( pMap == aVParaMap )
437             return sizeof(aVParaMap) / aSizeOf;
438         if ( pMap == aHParaMap )
439             return sizeof(aHParaMap) / aSizeOf;
440         if ( pMap == aHFrameMap )
441             return sizeof(aHFrameMap) / aSizeOf;
442         // OD 19.09.2003 #i18732# - own vertical alignment map for to frame anchored objects
443         if ( pMap == aVFrameMap )
444             return sizeof(aVFrameMap) / aSizeOf;
445         if ( pMap == aHCharMap )
446             return sizeof(aHCharMap) / aSizeOf;
447         if ( pMap == aHCharHtmlMap )
448             return sizeof(aHCharHtmlMap) / aSizeOf;
449         if ( pMap == aHCharHtmlAbsMap )
450             return sizeof(aHCharHtmlAbsMap) / aSizeOf;
451         if ( pMap == aVCharMap )
452             return sizeof(aVCharMap) / aSizeOf;
453         if ( pMap == aVCharHtmlMap )
454             return sizeof(aVCharHtmlMap) / aSizeOf;
455         if ( pMap == aVCharHtmlAbsMap )
456             return sizeof(aVCharHtmlAbsMap) / aSizeOf;
457         if ( pMap == aHPageHtmlMap )
458             return sizeof(aHPageHtmlMap) / aSizeOf;
459         if ( pMap == aHFlyHtmlMap )
460             return sizeof(aHFlyHtmlMap) / aSizeOf;
461         if ( pMap == aVFlyHtmlMap )
462             return sizeof(aVFlyHtmlMap) / aSizeOf;
463         return sizeof(aHPageMap) / aSizeOf;
464     }
465     return 0;
466 }
467 /* -----------------------------08.08.2002 14:45------------------------------
468 
469  ---------------------------------------------------------------------------*/
470 void lcl_InsertVectors(ListBox& rBox,
471     const ::std::vector< String >& rPrev, const ::std::vector< String >& rThis,
472     const ::std::vector< String >& rNext, const ::std::vector< String >& rRemain)
473 {
474     ::std::vector< String >::const_iterator aIt;
475     sal_uInt16 nEntry = 0;
476     for(aIt = rPrev.begin(); aIt != rPrev.end(); aIt++)
477         nEntry = rBox.InsertEntry(*aIt);
478     for(aIt = rThis.begin(); aIt != rThis.end(); aIt++)
479         nEntry = rBox.InsertEntry(*aIt);
480     for(aIt = rNext.begin(); aIt != rNext.end(); aIt++)
481         nEntry = rBox.InsertEntry(*aIt);
482     rBox.SetSeparatorPos(nEntry);
483     //now insert all strings sorted
484     sal_uInt16 nStartPos = rBox.GetEntryCount();
485 
486     for(aIt = rPrev.begin(); aIt != rPrev.end(); aIt++)
487         ::InsertStringSorted(*aIt, rBox, nStartPos );
488     for(aIt = rThis.begin(); aIt != rThis.end(); aIt++)
489         ::InsertStringSorted(*aIt, rBox, nStartPos );
490     for(aIt = rNext.begin(); aIt != rNext.end(); aIt++)
491         ::InsertStringSorted(*aIt, rBox, nStartPos );
492     for(aIt = rRemain.begin(); aIt != rRemain.end(); aIt++)
493         ::InsertStringSorted(*aIt, rBox, nStartPos );
494 }
495 
496 /* -----------------------------20.08.2002 16:12------------------------------
497 
498  ---------------------------------------------------------------------------*/
499 // --> OD 2009-08-31 #mongolianlayout#
500 // add input parameter
501 SvxSwFramePosString::StringId lcl_ChangeResIdToVerticalOrRTL(SvxSwFramePosString::StringId eStringId, sal_Bool bVertical, sal_Bool bVerticalL2R, sal_Bool bRTL)
502 {
503     //special handling of STR_FROMLEFT
504     if ( SwFPos::FROMLEFT == eStringId )
505     {
506         eStringId = bVertical
507                     ? ( bRTL
508                         ? SwFPos::FROMBOTTOM
509                         : SwFPos::FROMTOP )
510                     : ( bRTL
511                         ? SwFPos::FROMRIGHT
512                         : SwFPos::FROMLEFT );
513         return eStringId;
514     }
515     // --> OD 2009-08-31 #mongolianlayout#
516     // special handling of STR_FROMTOP in case of mongolianlayout (vertical left-to-right)
517     if ( SwFPos::FROMTOP == eStringId &&
518          bVertical && bVerticalL2R )
519     {
520         eStringId = SwFPos::FROMLEFT;
521         return eStringId;
522     }
523     // <--
524     if ( bVertical )
525     {
526         //exchange horizontal strings with vertical strings and vice versa
527         static const StringIdPair_Impl aHoriIds[] =
528         {
529             {SwFPos::LEFT,           SwFPos::TOP},
530             {SwFPos::RIGHT,          SwFPos::BOTTOM},
531             {SwFPos::CENTER_HORI,    SwFPos::CENTER_VERT},
532             {SwFPos::FROMTOP,        SwFPos::FROMRIGHT},
533             {SwFPos::REL_PG_LEFT,    SwFPos::REL_PG_TOP},
534             {SwFPos::REL_PG_RIGHT,   SwFPos::REL_PG_BOTTOM} ,
535             {SwFPos::REL_FRM_LEFT,   SwFPos::REL_FRM_TOP},
536             {SwFPos::REL_FRM_RIGHT,  SwFPos::REL_FRM_BOTTOM}
537         };
538         static const StringIdPair_Impl aVertIds[] =
539         {
540             {SwFPos::TOP,            SwFPos::RIGHT},
541             {SwFPos::BOTTOM,         SwFPos::LEFT },
542             {SwFPos::CENTER_VERT,    SwFPos::CENTER_HORI},
543             {SwFPos::FROMTOP,        SwFPos::FROMRIGHT },
544             {SwFPos::REL_PG_TOP,     SwFPos::REL_PG_LEFT },
545             {SwFPos::REL_PG_BOTTOM,  SwFPos::REL_PG_RIGHT } ,
546             {SwFPos::REL_FRM_TOP,    SwFPos::REL_FRM_LEFT },
547             {SwFPos::REL_FRM_BOTTOM, SwFPos::REL_FRM_RIGHT }
548         };
549         // --> OD 2009-08-31 #monglianlayout#
550         static const StringIdPair_Impl aVertL2RIds[] =
551         {
552             {SwFPos::TOP,            SwFPos::LEFT },
553             {SwFPos::BOTTOM,         SwFPos::RIGHT },
554             {SwFPos::CENTER_VERT,    SwFPos::CENTER_HORI },
555             {SwFPos::FROMTOP,        SwFPos::FROMLEFT },
556             {SwFPos::REL_PG_TOP,     SwFPos::REL_PG_LEFT },
557             {SwFPos::REL_PG_BOTTOM,  SwFPos::REL_PG_RIGHT } ,
558             {SwFPos::REL_FRM_TOP,    SwFPos::REL_FRM_LEFT },
559             {SwFPos::REL_FRM_BOTTOM, SwFPos::REL_FRM_RIGHT }
560         };
561         // <--
562         sal_uInt16 nIndex;
563         for(nIndex = 0; nIndex < sizeof(aHoriIds) / sizeof(StringIdPair_Impl); ++nIndex)
564         {
565             if(aHoriIds[nIndex].eHori == eStringId)
566             {
567                 eStringId = aHoriIds[nIndex].eVert;
568                 return eStringId;
569             }
570         }
571         nIndex = 0;
572         for(nIndex = 0; nIndex < sizeof(aVertIds) / sizeof(StringIdPair_Impl); ++nIndex)
573         {
574             // --> OD 2009-08-31 #mongolianlayout#
575             if ( !bVerticalL2R )
576             {
577                 if(aVertIds[nIndex].eHori == eStringId)
578                 {
579                     eStringId = aVertIds[nIndex].eVert;
580                     break;
581                 }
582             }
583             else
584             {
585                 if(aVertL2RIds[nIndex].eHori == eStringId)
586                 {
587                     eStringId = aVertL2RIds[nIndex].eVert;
588                     break;
589                 }
590             }
591             // <--
592         }
593     }
594     return eStringId;
595 }
596 
597 // OD 12.11.2003 #i22341# - helper method in order to determine all possible
598 // listbox relations in a relation map for a given relation
599 sal_uLong lcl_GetLBRelationsForRelations( const sal_uInt16 _nRel )
600 {
601     sal_uLong nLBRelations = 0L;
602 
603     sal_uInt16 nRelMapSize = sizeof(aRelationMap) / sizeof(RelationMap);
604     for ( sal_uInt16 nRelMapPos = 0; nRelMapPos < nRelMapSize; ++nRelMapPos )
605     {
606         if ( aRelationMap[nRelMapPos].nRelation == _nRel )
607         {
608             nLBRelations |= aRelationMap[nRelMapPos].nLBRelation;
609         }
610     }
611 
612     return nLBRelations;
613 }
614 
615 // OD 14.11.2003 #i22341# - helper method on order to determine all possible
616 // listbox relations in a relation map for a given string ID
617 sal_uLong lcl_GetLBRelationsForStrID( const FrmMap* _pMap,
618                                   const SvxSwFramePosString::StringId _eStrId,
619                                   const bool _bUseMirrorStr )
620 {
621     sal_uLong nLBRelations = 0L;
622 
623     size_t nRelMapSize = lcl_GetFrmMapCount( _pMap );
624     for ( size_t nRelMapPos = 0; nRelMapPos < nRelMapSize; ++nRelMapPos )
625     {
626         if ( ( !_bUseMirrorStr && _pMap[nRelMapPos].eStrId == _eStrId ) ||
627              ( _bUseMirrorStr && _pMap[nRelMapPos].eMirrorStrId == _eStrId ) )
628         {
629             nLBRelations |= _pMap[nRelMapPos].nLBRelations;
630         }
631     }
632 
633     return nLBRelations;
634 }
635 
636 /*--------------------------------------------------------------------
637     Beschreibung:   StandardRahmenTabPage
638  --------------------------------------------------------------------*/
639 
640 namespace
641 {
642     //IAccessibility2 Implementation 2009-----
643     void HandleAutoCB( sal_Bool _bChecked, FixedText& _rFT_man, FixedText& _rFT_auto, PercentField& _rPF_Edit)
644     {
645         _rFT_man.Show( !_bChecked );
646         _rFT_auto.Show( _bChecked );
647         String accName = _bChecked ? _rFT_auto.GetText() : _rFT_man.GetText();
648         _rPF_Edit.SetAccessibleName(accName);
649     }
650     //-----IAccessibility2 Implementation 2009
651 }
652 
653 
654 SwFrmPage::SwFrmPage ( Window *pParent, const SfxItemSet &rSet ) :
655     SfxTabPage      (pParent, SW_RES(TP_FRM_STD), rSet),
656 
657     aSizeFL         (this, SW_RES(FL_SIZE)),
658     aWidthFT        (this, SW_RES(FT_WIDTH)),
659     aWidthAutoFT    (this, SW_RES(FT_WIDTH_AUTO)),
660     aWidthED        (this, SW_RES(ED_WIDTH)),
661     aRelWidthCB     (this, SW_RES(CB_REL_WIDTH)),
662     aAutoWidthCB    (this, SW_RES(CB_AUTOWIDTH)),
663     aHeightFT       (this, SW_RES(FT_HEIGHT)),
664     aHeightAutoFT   (this, SW_RES(FT_HEIGHT_AUTO)),
665     aHeightED       (this, SW_RES(ED_HEIGHT)),
666     aRelHeightCB    (this, SW_RES(CB_REL_HEIGHT)),
667     aAutoHeightCB   (this, SW_RES(CB_AUTOHEIGHT)),
668     aFixedRatioCB   (this, SW_RES(CB_FIXEDRATIO)),
669     aRealSizeBT     (this, SW_RES(BT_REALSIZE)),
670 
671     aTypeSepFL     (this, SW_RES(FL_TYPE_SEP)),
672     aTypeFL        (this, SW_RES(FL_TYPE)),
673     aAnchorAtPageRB (this, SW_RES(RB_ANCHOR_PAGE)),
674     aAnchorAtParaRB (this, SW_RES(RB_ANCHOR_PARA)),
675     aAnchorAtCharRB (this, SW_RES(RB_ANCHOR_AT_CHAR)),
676     aAnchorAsCharRB (this, SW_RES(RB_ANCHOR_AS_CHAR)),
677     aAnchorAtFrameRB(this, SW_RES(RB_ANCHOR_FRAME)),
678 
679     aPositionFL     (this, SW_RES(FL_POSITION)),
680     aHorizontalFT   (this, SW_RES(FT_HORIZONTAL)),
681     aHorizontalDLB  (this, SW_RES(DLB_HORIZONTAL)),
682     aAtHorzPosFT    (this, SW_RES(FT_AT_HORZ_POS)),
683     aAtHorzPosED    (this, SW_RES(ED_AT_HORZ_POS)),
684     aHoriRelationFT (this, SW_RES(FT_HORI_RELATION)),
685     aHoriRelationLB (this, SW_RES(LB_HORI_RELATION)),
686     aMirrorPagesCB  (this, SW_RES(CB_MIRROR)),
687     aVerticalFT     (this, SW_RES(FT_VERTICAL)),
688     aVerticalDLB    (this, SW_RES(DLB_VERTICAL)),
689     aAtVertPosFT    (this, SW_RES(FT_AT_VERT_POS)),
690     aAtVertPosED    (this, SW_RES(ED_AT_VERT_POS)),
691     aVertRelationFT (this, SW_RES(FT_VERT_RELATION)),
692     aVertRelationLB (this, SW_RES(LB_VERT_RELATION)),
693     // OD 19.09.2003 #i18732# - new checkbox
694     aFollowTextFlowCB(this, SW_RES(CB_FOLLOWTEXTFLOW)),
695 
696     aExampleWN      (this, SW_RES(WN_BSP)),
697 
698     bAtHorzPosModified( sal_False ),
699     bAtVertPosModified( sal_False ),
700     bFormat(sal_False),
701     bNew(sal_True),
702     bNoModifyHdl(sal_True),
703     // --> OD 2009-08-31 #mongolianlayout# - no used
704 //    bVerticalChanged(FALSE),
705     // <--
706     bIsVerticalFrame(sal_False),
707     // --> OD 2009-08-31 #mongolianlayou#
708     bIsVerticalL2R(sal_False),
709     // <--
710     bIsInRightToLeft(sal_False),
711     bHtmlMode(sal_False),
712     nHtmlMode(0),
713     nDlgType(0),
714     nUpperBorder(0),
715     nLowerBorder(0),
716     fWidthHeightRatio(1.0),
717     // OD 12.11.2003 #i22341#
718     mpToCharCntntPos( NULL ),
719 
720     nOldH(text::HoriOrientation::CENTER),
721     nOldHRel(text::RelOrientation::FRAME),
722     nOldV(text::VertOrientation::TOP),
723     nOldVRel(text::RelOrientation::PRINT_AREA),
724     pVMap( 0 ),
725     pHMap( 0 ),
726     m_bAllowVertPositioning( true ),
727     m_bIsMathOLE( false ),
728     m_bIsMathBaselineAlignment( true )
729 {
730     FreeResource();
731     SetExchangeSupport();
732 
733     aRealSizeBT.SetAccessibleRelationMemberOf(&aSizeFL);
734 
735     Link aLk = LINK(this, SwFrmPage, RangeModifyHdl);
736     aWidthED.    SetLoseFocusHdl( aLk );
737     aHeightED.   SetLoseFocusHdl( aLk );
738     aAtHorzPosED.SetLoseFocusHdl( aLk );
739     aAtVertPosED.SetLoseFocusHdl( aLk );
740     // OD 25.09.2003 #i18732# - click handler for new checkbox
741     aFollowTextFlowCB.SetClickHdl( aLk );
742 
743     aLk = LINK(this, SwFrmPage, ModifyHdl);
744     aWidthED.    SetModifyHdl( aLk );
745     aHeightED.   SetModifyHdl( aLk );
746     aAtHorzPosED.SetModifyHdl( aLk );
747     aAtVertPosED.SetModifyHdl( aLk );
748 
749     aLk = LINK(this, SwFrmPage, AnchorTypeHdl);
750     aAnchorAtPageRB.SetClickHdl( aLk );
751     aAnchorAtParaRB.SetClickHdl( aLk );
752     aAnchorAtCharRB.SetClickHdl( aLk );
753     aAnchorAsCharRB.SetClickHdl( aLk );
754     aAnchorAtFrameRB.SetClickHdl( aLk );
755 
756     aHorizontalDLB.SetSelectHdl(LINK(this, SwFrmPage, PosHdl));
757     aVerticalDLB.  SetSelectHdl(LINK(this, SwFrmPage, PosHdl));
758 
759     aHoriRelationLB.SetSelectHdl(LINK(this, SwFrmPage, RelHdl));
760     aVertRelationLB.SetSelectHdl(LINK(this, SwFrmPage, RelHdl));
761 
762     aMirrorPagesCB.SetClickHdl(LINK(this, SwFrmPage, MirrorHdl));
763 
764     aLk = LINK(this, SwFrmPage, RelSizeClickHdl);
765     aRelWidthCB.SetClickHdl( aLk );
766     aRelHeightCB.SetClickHdl( aLk );
767 
768     aAutoWidthCB.SetClickHdl( LINK( this, SwFrmPage, AutoWidthClickHdl ) );
769     aAutoHeightCB.SetClickHdl( LINK( this, SwFrmPage, AutoHeightClickHdl ) );
770 }
771 
772 /*--------------------------------------------------------------------
773     Beschreibung:   Dtor
774  --------------------------------------------------------------------*/
775 
776 SwFrmPage::~SwFrmPage()
777 {
778 }
779 
780 SfxTabPage* SwFrmPage::Create(Window *pParent, const SfxItemSet &rSet)
781 {
782     return new SwFrmPage( pParent, rSet );
783 }
784 
785 namespace
786 {
787     void MoveControl( Control& _rCtrl, long _nOffsetY )
788     {
789         Point aPt( _rCtrl.GetPosPixel() );
790         aPt.Move( 0, _nOffsetY );
791         _rCtrl.SetPosPixel( aPt );
792     }
793 }
794 
795 void SwFrmPage::EnableGraficMode( void )
796 {
797     // #i39692# mustn't be called more than once
798     if(!aRealSizeBT.IsVisible())
799     {
800         long nOffset1 = aRelWidthCB.GetPosPixel().Y() - aAutoWidthCB.GetPosPixel().Y();
801         long nOffset2 = nOffset1 + aRelHeightCB.GetPosPixel().Y() - aAutoHeightCB.GetPosPixel().Y();
802 
803         MoveControl( aHeightFT, nOffset1 );
804         MoveControl( aHeightED, nOffset1 );
805         MoveControl( aRelHeightCB, nOffset1 );
806         MoveControl( aFixedRatioCB, nOffset2 );
807 
808         aWidthFT.Show();
809         aWidthAutoFT.Hide();
810         aAutoHeightCB.Hide();
811 
812         aHeightFT.Show();
813         aHeightAutoFT.Hide();
814         aAutoWidthCB.Hide();
815 
816         aRealSizeBT.Show();
817     }
818 }
819 
820 void SwFrmPage::Reset( const SfxItemSet &rSet )
821 {
822 
823     SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell() :
824             ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
825 
826     nHtmlMode = ::GetHtmlMode(pSh->GetView().GetDocShell());
827     bHtmlMode = nHtmlMode & HTMLMODE_ON ? sal_True : sal_False;
828 
829     FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
830     SetMetric( aWidthED, aMetric );
831     SetMetric( aHeightED, aMetric );
832     SetMetric( aAtHorzPosED, aMetric );
833     SetMetric( aAtVertPosED, aMetric );
834 
835     const SfxPoolItem* pItem = NULL;
836 
837     const SwFmtAnchor& rAnchor = (const SwFmtAnchor&)rSet.Get(RES_ANCHOR);
838 
839     if (SFX_ITEM_SET == rSet.GetItemState(FN_OLE_IS_MATH, sal_False, &pItem))
840         m_bIsMathOLE = ((const SfxBoolItem*)pItem)->GetValue();
841     if (SFX_ITEM_SET == rSet.GetItemState(FN_MATH_BASELINE_ALIGNMENT, sal_False, &pItem))
842         m_bIsMathBaselineAlignment = ((const SfxBoolItem*)pItem)->GetValue();
843     EnableVerticalPositioning( !(m_bIsMathOLE && m_bIsMathBaselineAlignment
844             && FLY_AS_CHAR == rAnchor.GetAnchorId()) );
845 
846     if (bFormat)
847     {
848         // Bei Formaten keine Ankerbearbeitung
849         aAnchorAtPageRB.Enable( sal_False );
850         aAnchorAtParaRB.Enable( sal_False );
851         aAnchorAtCharRB.Enable( sal_False );
852         aAnchorAsCharRB.Enable( sal_False );
853         aAnchorAtFrameRB.Enable( sal_False );
854         aTypeFL.Enable( sal_False );
855         aFixedRatioCB.Enable(sal_False);
856     }
857     else
858     {
859         if (rAnchor.GetAnchorId() != FLY_AT_FLY && !pSh->IsFlyInFly())
860             aAnchorAtFrameRB.Hide();
861         // --> OD 2009-08-31 #mongolianlayout#
862 //        if ( !bVerticalChanged && pSh->IsFrmVertical(sal_True, bIsInRightToLeft) )
863         if ( pSh->IsFrmVertical( sal_True, bIsInRightToLeft, bIsVerticalL2R ) )
864         // <--
865         {
866             String sHLabel = aHorizontalFT.GetText();
867             aHorizontalFT.SetText(aVerticalFT.GetText());
868             aVerticalFT.SetText(sHLabel);
869             bIsVerticalFrame = sal_True;
870         }
871     }
872 
873     if ( nDlgType == DLG_FRM_GRF || nDlgType == DLG_FRM_OLE )
874     {
875         ASSERT(pSh , "shell not found");
876         //OS: nur fuer die Variante Einfuegen/Grafik/Eigenschaften
877         if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_GRF_REALSIZE, sal_False, &pItem))
878             aGrfSize = ((const SvxSizeItem*)pItem)->GetSize();
879         else
880             pSh->GetGrfSize( aGrfSize );
881 
882         if ( !bNew )
883         {
884             aRealSizeBT.SetClickHdl(LINK(this, SwFrmPage, RealSizeHdl));
885             EnableGraficMode();
886         }
887 //      else
888 //          aTypeFL.SetSizePixel(Size(aTypeFL.GetSizePixel().Width(), aSizeFL.GetSizePixel().Height()));
889 
890         if ( nDlgType == DLG_FRM_GRF )
891             aFixedRatioCB.Check( sal_False );
892         else
893         {
894             if ( bNew )
895                 SetText( SW_RESSTR(STR_OLE_INSERT));
896             else
897                 SetText( SW_RESSTR(STR_OLE_EDIT));
898         }
899     }
900     else
901     {
902 //      aTypeFL.SetSizePixel(Size(aTypeFL.GetSizePixel().Width(), aSizeFL.GetSizePixel().Height()));
903         aGrfSize = ((const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE)).GetSize();
904     }
905 
906     //Prozenteingabe ermoeglichen.
907     aWidthED. SetBaseValue( aWidthED.Normalize(aGrfSize.Width()), FUNIT_TWIP );
908     aHeightED.SetBaseValue( aHeightED.Normalize(aGrfSize.Height()), FUNIT_TWIP );
909     //the available space is not yet known so the RefValue has to be calculated from size and relative size values
910     //this is needed only if relative values are already set
911 
912     const SwFmtFrmSize& rFrmSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
913 
914     if (rFrmSize.GetWidthPercent() != 0xff && rFrmSize.GetWidthPercent() != 0)
915     {
916         //calculate the rerference value from the with and relative width values
917         sal_Int32 nSpace = rFrmSize.GetWidth() * 100 / rFrmSize.GetWidthPercent();
918         aWidthED. SetRefValue( nSpace );
919     }
920 
921     if (rFrmSize.GetHeightPercent() != 0xff && rFrmSize.GetHeightPercent() != 0)
922     {
923         //calculate the rerference value from the with and relative width values
924         sal_Int32 nSpace = rFrmSize.GetHeight() * 100 / rFrmSize.GetHeightPercent();
925         aHeightED.SetRefValue( nSpace );
926     }
927 
928     // Allgemeiner Initialisierungteil
929     switch(rAnchor.GetAnchorId())
930     {
931         case FLY_AT_PAGE: aAnchorAtPageRB.Check(); break;
932         case FLY_AT_PARA: aAnchorAtParaRB.Check(); break;
933         case FLY_AT_CHAR: aAnchorAtCharRB.Check(); break;
934         case FLY_AS_CHAR: aAnchorAsCharRB.Check(); break;
935         case FLY_AT_FLY: aAnchorAtFrameRB.Check();break;
936         default:; //prevent warning
937     }
938 
939     // OD 12.11.2003 #i22341# - determine content position of character
940     // Note: content position can be NULL
941     mpToCharCntntPos = rAnchor.GetCntntAnchor();
942 
943     // OD 19.09.2003 #i18732# - init checkbox value
944     {
945         const bool bFollowTextFlow =
946             static_cast<const SwFmtFollowTextFlow&>(rSet.Get(RES_FOLLOW_TEXT_FLOW)).GetValue();
947         aFollowTextFlowCB.Check( bFollowTextFlow );
948     }
949 
950     if(bHtmlMode)
951     {
952         if(nDlgType == DLG_FRM_STD &&
953                 0 == (nHtmlMode & HTMLMODE_FULL_ABS_POS))
954         {
955             aHeightFT   .Enable( sal_False );
956             aHeightED   .Enable( sal_False );
957             aRelHeightCB.Enable( sal_False );
958         }
959         if( 0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS))
960         {
961             if (GetAnchor() == FLY_AT_PAGE)
962             {
963                 aAnchorAtParaRB.Check();
964             }
965             aAnchorAtPageRB.Enable(sal_False);
966         }
967         aAutoHeightCB.Enable(sal_False);
968         aAutoWidthCB.Enable(sal_False);
969         aMirrorPagesCB.Show(sal_False);
970         if(nDlgType == DLG_FRM_STD)
971             aFixedRatioCB.Enable(sal_False);
972         // OD 19.09.2003 #i18732# - hide checkbox in HTML mode
973         aFollowTextFlowCB.Show(sal_False);
974     }
975     else
976     {
977         // OD 06.11.2003 #i18732# correct enable/disable of check box 'Mirror on..'
978         aMirrorPagesCB.Enable(!aAnchorAsCharRB.IsChecked());
979 
980         // OD 06.11.2003 #i18732# - enable/disable check box 'Follow text flow'.
981         // OD 10.11.2003 #i22305# - enable check box 'Follow text
982         // flow' also for anchor type to-frame.
983         aFollowTextFlowCB.Enable( aAnchorAtParaRB.IsChecked() ||
984                                   aAnchorAtCharRB.IsChecked() ||
985                                   aAnchorAtFrameRB.IsChecked() );
986     }
987 
988     Init( rSet, sal_True );
989     aAtVertPosED.SaveValue();
990     aAtHorzPosED.SaveValue();
991     // OD 19.09.2003 #i18732#
992     aFollowTextFlowCB.SaveValue();
993 
994     bNoModifyHdl = sal_False;
995     //lock PercentFields
996     aWidthED.LockAutoCalculation(sal_True);
997     aHeightED.LockAutoCalculation(sal_True);
998     RangeModifyHdl(&aWidthED);  // Alle Maximalwerte initial setzen
999     aHeightED.LockAutoCalculation(sal_False);
1000     aWidthED.LockAutoCalculation(sal_False);
1001 
1002     aAutoHeightCB.SaveValue();
1003     aAutoWidthCB.SaveValue();
1004 
1005     SwTwips nWidth  = static_cast< SwTwips >(aWidthED.DenormalizePercent(aWidthED.GetValue(FUNIT_TWIP)));
1006     SwTwips nHeight = static_cast< SwTwips >(aHeightED.DenormalizePercent(aHeightED.GetValue(FUNIT_TWIP)));
1007     fWidthHeightRatio = nHeight ? double(nWidth) / double(nHeight) : 1.0;
1008 }
1009 
1010 
1011 /*--------------------------------------------------------------------
1012     Beschreibung:   Attribute in den Set stopfen bei OK
1013  --------------------------------------------------------------------*/
1014 
1015 sal_Bool SwFrmPage::FillItemSet(SfxItemSet &rSet)
1016 {
1017     sal_Bool bRet = sal_False;
1018     SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell()
1019                         : ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
1020     ASSERT( pSh , "shell not found");
1021     const SfxItemSet& rOldSet = GetItemSet();
1022     const SfxPoolItem* pOldItem = 0;
1023 
1024     RndStdIds eAnchorId = (RndStdIds)GetAnchor();
1025 
1026     if ( !bFormat )
1027     {
1028         pOldItem = GetOldItem(rSet, RES_ANCHOR);
1029         if (bNew || !pOldItem || eAnchorId != ((const SwFmtAnchor*)pOldItem)->GetAnchorId())
1030         {
1031             SwFmtAnchor aAnc( eAnchorId, pSh->GetPhyPageNum() );
1032             bRet = 0 != rSet.Put( aAnc );
1033         }
1034     }
1035 
1036     if ( pHMap )
1037     {
1038         SwFmtHoriOrient aHoriOrient( (const SwFmtHoriOrient&)
1039                                                 rOldSet.Get(RES_HORI_ORIENT) );
1040 
1041         sal_uInt16 nMapPos = GetMapPos(pHMap, aHorizontalDLB);
1042         short nAlign = GetAlignment(pHMap, nMapPos, aHorizontalDLB, aHoriRelationLB);
1043         short nRel = GetRelation(pHMap, aHoriRelationLB);
1044 
1045         const sal_Int16 eHOri = nAlign;
1046         const sal_Int16 eRel  = nRel;
1047 
1048         aHoriOrient.SetHoriOrient( eHOri );
1049         aHoriOrient.SetRelationOrient( eRel );
1050         aHoriOrient.SetPosToggle(aMirrorPagesCB.IsChecked());
1051 
1052         sal_Bool bMod = aAtHorzPosED.GetText() != aAtHorzPosED.GetSavedValue();
1053         bMod |= aMirrorPagesCB.GetState() != aMirrorPagesCB.GetSavedValue();
1054 
1055         if ( eHOri == text::HoriOrientation::NONE &&
1056              (bNew || (bAtHorzPosModified || bMod) || nOldH != eHOri ) )
1057         {
1058             SwTwips nX = static_cast< SwTwips >(aAtHorzPosED.Denormalize(aAtHorzPosED.GetValue(FUNIT_TWIP)));
1059             aHoriOrient.SetPos( nX );
1060         }
1061 
1062         pOldItem = GetOldItem(rSet, FN_HORI_ORIENT);
1063         sal_Bool bSame = sal_False;
1064         if ((bNew == bFormat) && pOldItem)
1065         {
1066              bSame = static_cast< sal_Bool >(aHoriOrient == (SwFmtHoriOrient&)*pOldItem);
1067         }
1068         if ((bNew && !bFormat) || ((bAtHorzPosModified || bMod) && !bSame))
1069         {
1070             bRet |= 0 != rSet.Put( aHoriOrient );
1071         }
1072     }
1073 
1074     if ( pVMap )
1075     {
1076         // Ausrichtung Vertikal
1077         SwFmtVertOrient aVertOrient( (const SwFmtVertOrient&)
1078                                                 rOldSet.Get(RES_VERT_ORIENT) );
1079 
1080         sal_uInt16 nMapPos = GetMapPos(pVMap, aVerticalDLB);
1081         short nAlign = GetAlignment(pVMap, nMapPos, aVerticalDLB, aVertRelationLB);
1082         short nRel = GetRelation(pVMap, aVertRelationLB);
1083 
1084         const sal_Int16     eVOri = nAlign;
1085         const sal_Int16     eRel  = nRel;
1086 
1087         aVertOrient.SetVertOrient    ( eVOri);
1088         aVertOrient.SetRelationOrient( eRel );
1089 
1090         sal_Bool bMod = aAtVertPosED.GetText() != aAtVertPosED.GetSavedValue();
1091 
1092         if ( eVOri == text::VertOrientation::NONE &&
1093              ( bNew || (bAtVertPosModified || bMod) || nOldV != eVOri) )
1094         {
1095             // Vertikale Position
1096             // fuer zeichengebundene Rahmen Offset umrechenen
1097             SwTwips nY = static_cast< SwTwips >(aAtVertPosED.Denormalize(aAtVertPosED.GetValue(FUNIT_TWIP)));
1098             if (eAnchorId == FLY_AS_CHAR)
1099             {
1100                 nY *= -1;
1101             }
1102             aVertOrient.SetPos( nY );
1103         }
1104         pOldItem = GetOldItem(rSet, FN_VERT_ORIENT);
1105         sal_Bool bSame = sal_False;
1106         if((bNew == bFormat) && pOldItem)
1107         {
1108              bSame = static_cast< sal_Bool >( bFormat ?
1109                 aVertOrient.GetVertOrient() == ((SwFmtVertOrient*)pOldItem)->GetVertOrient() &&
1110                 aVertOrient.GetRelationOrient() == ((SwFmtVertOrient*)pOldItem)->GetRelationOrient() &&
1111                 aVertOrient.GetPos() == ((SwFmtVertOrient*)pOldItem)->GetPos()
1112 
1113                     : aVertOrient == (SwFmtVertOrient&)*pOldItem );
1114         }
1115         if( ( bNew && !bFormat ) || ((bAtVertPosModified || bMod) && !bSame ))
1116         {
1117             bRet |= 0 != rSet.Put( aVertOrient );
1118         }
1119     }
1120 
1121     //Size setzen
1122     //Neuer Sonderfall: Ist die Groesse von pMgr(0, 0), so werden die
1123     //Eigenschaften fuer eine Grafik festgelegt, die noch gar nicht geladen
1124     //ist. Dann wird hier kein SetSize() gemacht, wenn die
1125     //Groesseneinstellungen vom Anwender nicht veraendert wurden.
1126     const SwFmtFrmSize& rOldSize = (const SwFmtFrmSize& )rOldSet.Get(RES_FRM_SIZE);
1127     SwFmtFrmSize aSz( rOldSize );
1128 
1129 /*  // Folgende Zeilen nur zum debuggen:
1130     sal_Bool bModified = aWidthED.IsValueModified();
1131     sal_uInt16 nOldWidth = rOldSize.GetWidth ();
1132     sal_uInt16 nWidth = aWidthED .GetValue();
1133     sal_uInt16 nMinWidth = aWidthED .GetMin();*/
1134 
1135     sal_Bool bValueModified = (aWidthED.IsValueModified() || aHeightED.IsValueModified());
1136     sal_Bool bCheckChanged = (aRelWidthCB.GetSavedValue() != aRelWidthCB.IsChecked()
1137                         || aRelHeightCB.GetSavedValue() != aRelHeightCB.IsChecked());
1138 
1139     sal_Bool bLegalValue = !(!rOldSize.GetWidth () && !rOldSize.GetHeight() &&
1140                             aWidthED .GetValue() == aWidthED .GetMin() &&
1141                             aHeightED.GetValue() == aHeightED.GetMin());
1142 
1143     if ((bNew && !bFormat) || ((bValueModified || bCheckChanged) && bLegalValue))
1144     {
1145         sal_Int64 nNewWidth  = aWidthED.DenormalizePercent(aWidthED.GetRealValue(FUNIT_TWIP));
1146         sal_Int64 nNewHeight = aHeightED.DenormalizePercent(aHeightED.GetRealValue(FUNIT_TWIP));
1147         aSz.SetWidth (static_cast< SwTwips >(nNewWidth));
1148         aSz.SetHeight(static_cast< SwTwips >(nNewHeight));
1149 
1150         if (aRelWidthCB.IsChecked())
1151         {
1152             aSz.SetWidthPercent((sal_uInt8)Min( static_cast< sal_Int64 >(MAX_PERCENT_WIDTH), aWidthED.Convert(aWidthED.NormalizePercent(nNewWidth), FUNIT_TWIP, FUNIT_CUSTOM)));
1153         }
1154         else
1155             aSz.SetWidthPercent(0);
1156         if (aRelHeightCB.IsChecked())
1157             aSz.SetHeightPercent((sal_uInt8)Min(static_cast< sal_Int64 >(MAX_PERCENT_HEIGHT), aHeightED.Convert(aHeightED.NormalizePercent(nNewHeight), FUNIT_TWIP, FUNIT_CUSTOM)));
1158         else
1159             aSz.SetHeightPercent(0);
1160 
1161         if (aFixedRatioCB.IsChecked() && (aRelWidthCB.IsChecked() ^ aRelHeightCB.IsChecked()))
1162         {
1163             if (aRelWidthCB.IsChecked())
1164                 aSz.SetHeightPercent(0xff);
1165             else
1166                 aSz.SetWidthPercent(0xff);
1167         }
1168     }
1169     if( !IsInGraficMode() )
1170     {
1171         if( aAutoHeightCB.GetState() != aAutoHeightCB.GetSavedValue() )
1172         {
1173             SwFrmSize eFrmSize = (SwFrmSize) aAutoHeightCB.IsChecked()? ATT_MIN_SIZE : ATT_FIX_SIZE;
1174             if( eFrmSize != aSz.GetHeightSizeType() )
1175                 aSz.SetHeightSizeType(eFrmSize);
1176         }
1177         if( aAutoWidthCB.GetState() != aAutoWidthCB.GetSavedValue() )
1178         {
1179             SwFrmSize eFrmSize = (SwFrmSize) aAutoWidthCB.IsChecked()? ATT_MIN_SIZE : ATT_FIX_SIZE;
1180             if( eFrmSize != aSz.GetWidthSizeType() )
1181                 aSz.SetWidthSizeType( eFrmSize );
1182         }
1183     }
1184     if( !bFormat && aFixedRatioCB.GetSavedValue() != aFixedRatioCB.IsChecked())
1185         bRet |= 0 != rSet.Put(SfxBoolItem(FN_KEEP_ASPECT_RATIO, aFixedRatioCB.IsChecked()));
1186 
1187     pOldItem = GetOldItem(rSet, RES_FRM_SIZE);
1188 
1189     if ((pOldItem && aSz != *pOldItem) || (!pOldItem && !bFormat) ||
1190             (bFormat &&
1191                 (aSz.GetWidth() > 0 || aSz.GetWidthPercent() > 0) &&
1192                     (aSz.GetHeight() > 0 || aSz.GetHeightPercent() > 0)))
1193     {
1194         if (aSz.GetHeightSizeType() == ATT_VAR_SIZE)    // VAR_SIZE gibts nicht bei Rahmen
1195             aSz.SetHeightSizeType(ATT_MIN_SIZE);        // Bug #45776 (Vorlagen ohne Breite/Hoehe)
1196 
1197         bRet |= 0 != rSet.Put( aSz );
1198     }
1199     // OD 19.09.2003 #i18732#
1200     if(aFollowTextFlowCB.IsChecked() != aFollowTextFlowCB.GetSavedValue())
1201     {
1202         bRet |= 0 != rSet.Put(SwFmtFollowTextFlow(aFollowTextFlowCB.IsChecked()));
1203     }
1204     return bRet;
1205 }
1206 
1207 /*--------------------------------------------------------------------
1208     Beschreibung:   Horizontale und vertikale Pos initialisieren
1209  --------------------------------------------------------------------*/
1210 
1211 void SwFrmPage::InitPos(RndStdIds eId,
1212                                 sal_uInt16 nH,
1213                                 sal_uInt16 nHRel,
1214                                 sal_uInt16 nV,
1215                                 sal_uInt16 nVRel,
1216                                 long   nX,
1217                                 long   nY)
1218 {
1219     sal_uInt16 nPos = aVerticalDLB.GetSelectEntryPos();
1220     if ( nPos != LISTBOX_ENTRY_NOTFOUND && pVMap )
1221     {
1222         nOldV    = pVMap[nPos].nAlign;
1223 
1224         nPos = aVertRelationLB.GetSelectEntryPos();
1225         if (nPos != LISTBOX_ENTRY_NOTFOUND)
1226             nOldVRel = ((RelationMap *)aVertRelationLB.GetEntryData(nPos))->nRelation;
1227     }
1228 
1229     nPos = aHorizontalDLB.GetSelectEntryPos();
1230     if ( nPos != LISTBOX_ENTRY_NOTFOUND && pHMap )
1231     {
1232         nOldH    = pHMap[nPos].nAlign;
1233 
1234         nPos = aHoriRelationLB.GetSelectEntryPos();
1235         if (nPos != LISTBOX_ENTRY_NOTFOUND)
1236             nOldHRel = ((RelationMap *)aHoriRelationLB.GetEntryData(nPos))->nRelation;
1237     }
1238 
1239     sal_Bool bEnable = sal_True;
1240     if ( eId == FLY_AT_PAGE )
1241     {
1242         pVMap = bHtmlMode ? aVPageHtmlMap : aVPageMap;
1243         pHMap = bHtmlMode ? aHPageHtmlMap : aHPageMap;
1244     }
1245     else if ( eId == FLY_AT_FLY )
1246     {
1247         // OD 19.09.2003 #i18732# - own vertical alignment map for to frame
1248         // anchored objects.
1249         pVMap = bHtmlMode ? aVFlyHtmlMap : aVFrameMap;
1250         pHMap = bHtmlMode ? aHFlyHtmlMap : aHFrameMap;
1251     }
1252     else if ( eId == FLY_AT_PARA )
1253     {
1254         if(bHtmlMode)
1255         {
1256             pVMap = aVParaHtmlMap;
1257             pHMap = nHtmlMode & HTMLMODE_SOME_ABS_POS ? aHParaHtmlAbsMap : aHParaHtmlMap;
1258         }
1259         else
1260         {
1261             pVMap = aVParaMap;
1262             pHMap = aHParaMap;
1263         }
1264     }
1265     else if ( eId == FLY_AT_CHAR )
1266     {
1267         if(bHtmlMode)
1268         {
1269             pVMap = nHtmlMode & HTMLMODE_SOME_ABS_POS ? aVCharHtmlAbsMap    : aVCharHtmlMap;
1270             pHMap = nHtmlMode & HTMLMODE_SOME_ABS_POS ? aHCharHtmlAbsMap    : aHCharHtmlMap;
1271         }
1272         else
1273         {
1274             pVMap = aVCharMap;
1275             pHMap = aHCharMap;
1276         }
1277     }
1278     else if ( eId == FLY_AS_CHAR )
1279     {
1280         pVMap = bHtmlMode ? aVAsCharHtmlMap     : aVAsCharMap;
1281         pHMap = 0;
1282         bEnable = sal_False;
1283     }
1284     aHorizontalDLB.Enable( bEnable );
1285     aHorizontalFT.Enable( bEnable );
1286 
1287     // aktuelle Pos selektieren
1288     // Horizontal
1289     if ( nH == USHRT_MAX )
1290     {
1291         nH    = nOldH;
1292         nHRel = nOldHRel;
1293     }
1294     // OD 12.11.2003 #i22341# - pass <nHRel> as 3rd parameter to method <FillPosLB>
1295     sal_uInt16 nMapPos = FillPosLB(pHMap, nH, nHRel, aHorizontalDLB);
1296     FillRelLB(pHMap, nMapPos, nH, nHRel, aHoriRelationLB, aHoriRelationFT);
1297 
1298     // Vertikal
1299     if ( nV == USHRT_MAX )
1300     {
1301         nV    = nOldV;
1302         nVRel = nOldVRel;
1303     }
1304     // OD 12.11.2003 #i22341# - pass <nVRel> as 3rd parameter to method <FillPosLB>
1305     nMapPos = FillPosLB(pVMap, nV, nVRel, aVerticalDLB);
1306     FillRelLB(pVMap, nMapPos, nV, nVRel, aVertRelationLB, aVertRelationFT);
1307 
1308     // Edits init
1309     bEnable = nH == text::HoriOrientation::NONE && eId != FLY_AS_CHAR;
1310     if (!bEnable)
1311     {
1312         aAtHorzPosED.SetValue( 0, FUNIT_TWIP );
1313         if (nX != LONG_MAX && bHtmlMode)
1314             aAtHorzPosED.SetModifyFlag();
1315     }
1316     else
1317     {
1318         if (nX != LONG_MAX)
1319             aAtHorzPosED.SetValue( aAtHorzPosED.Normalize(nX), FUNIT_TWIP );
1320     }
1321     aAtHorzPosFT.Enable( bEnable );
1322     aAtHorzPosED.Enable( bEnable );
1323 
1324     bEnable = nV == text::VertOrientation::NONE;
1325     if ( !bEnable )
1326     {
1327         aAtVertPosED.SetValue( 0, FUNIT_TWIP );
1328         if(nY != LONG_MAX && bHtmlMode)
1329             aAtVertPosED.SetModifyFlag();
1330     }
1331     else
1332     {
1333         if ( eId == FLY_AS_CHAR )
1334         {
1335             if ( nY == LONG_MAX )
1336                 nY = 0;
1337             else
1338                 nY *= -1;
1339         }
1340         if ( nY != LONG_MAX )
1341             aAtVertPosED.SetValue( aAtVertPosED.Normalize(nY), FUNIT_TWIP );
1342     }
1343     aAtVertPosFT.Enable( bEnable && m_bAllowVertPositioning );
1344     aAtVertPosED.Enable( bEnable && m_bAllowVertPositioning );
1345     UpdateExample();
1346 }
1347 
1348 /*--------------------------------------------------------------------
1349     Beschreibung:
1350  --------------------------------------------------------------------*/
1351 
1352 sal_uInt16 SwFrmPage::FillPosLB(const FrmMap* _pMap,
1353                             const sal_uInt16 _nAlign,
1354                             const sal_uInt16 _nRel,
1355                             ListBox& _rLB )
1356 {
1357     String sSelEntry, sOldEntry;
1358     sOldEntry = _rLB.GetSelectEntry();
1359 
1360     _rLB.Clear();
1361 
1362     // OD 12.11.2003 #i22341# - determine all possible listbox relations for
1363     // given relation for map <aVCharMap>
1364     const sal_uLong nLBRelations = (_pMap != aVCharMap)
1365                                ? 0L
1366                                : ::lcl_GetLBRelationsForRelations( _nRel );
1367 
1368     // Listbox fuellen
1369     size_t nCount = ::lcl_GetFrmMapCount(_pMap);
1370     for (size_t i = 0; _pMap && i < nCount; ++i)
1371     {
1372 //      #61359# Warum nicht von links/von innen bzw. von oben?
1373 //      if (!bFormat || (pMap[i].eStrId != SwFPos::FROMLEFT && pMap[i].eStrId != SwFPos::FROMTOP))
1374         {
1375             SvxSwFramePosString::StringId eStrId = aMirrorPagesCB.IsChecked() ? _pMap[i].eMirrorStrId : _pMap[i].eStrId;
1376             // --> OD 2009-08-31 #mongolianlayout#
1377             eStrId = lcl_ChangeResIdToVerticalOrRTL( eStrId,
1378                                                      bIsVerticalFrame,
1379                                                      bIsVerticalL2R,
1380                                                      bIsInRightToLeft);
1381             // <--
1382             String sEntry(aFramePosString.GetString(eStrId));
1383             if (_rLB.GetEntryPos(sEntry) == LISTBOX_ENTRY_NOTFOUND)
1384             {
1385                 // bei zeichengebundenen Rahmen keine doppelten Eintraege einfuegen
1386                 _rLB.InsertEntry(sEntry);
1387             }
1388             // OD 12.11.2003 #i22341# - add condition to handle map <aVCharMap>
1389             // that is ambigous in the alignment.
1390             if ( _pMap[i].nAlign == _nAlign &&
1391                  ( !(_pMap == aVCharMap) || _pMap[i].nLBRelations & nLBRelations ) )
1392             {
1393                 sSelEntry = sEntry;
1394             }
1395         }
1396     }
1397 
1398     _rLB.SelectEntry(sSelEntry);
1399     if (!_rLB.GetSelectEntryCount())
1400         _rLB.SelectEntry(sOldEntry);
1401 
1402     if (!_rLB.GetSelectEntryCount())
1403         _rLB.SelectEntryPos(0);
1404 
1405     PosHdl(&_rLB);
1406 
1407     return GetMapPos(_pMap, _rLB);
1408 }
1409 
1410 /*--------------------------------------------------------------------
1411     Beschreibung:
1412  --------------------------------------------------------------------*/
1413 sal_uLong SwFrmPage::FillRelLB( const FrmMap* _pMap,
1414                             const sal_uInt16 _nLBSelPos,
1415                             const sal_uInt16 _nAlign,
1416                             sal_uInt16 _nRel,
1417                             ListBox& _rLB,
1418                             FixedText& _rFT )
1419 {
1420     String sSelEntry;
1421     sal_uLong  nLBRelations = 0;
1422     size_t nMapCount = ::lcl_GetFrmMapCount(_pMap);
1423 
1424     _rLB.Clear();
1425 
1426     if (_nLBSelPos < nMapCount)
1427     {
1428         if (_pMap == aVAsCharHtmlMap || _pMap == aVAsCharMap)
1429         {
1430             String sOldEntry(_rLB.GetSelectEntry());
1431             sal_uInt16 nRelCount = sizeof(aAsCharRelationMap) / sizeof(RelationMap);
1432             SvxSwFramePosString::StringId eStrId = _pMap[_nLBSelPos].eStrId;
1433 
1434             for (size_t nMapPos = 0; nMapPos < nMapCount; nMapPos++)
1435             {
1436                 if (_pMap[nMapPos].eStrId == eStrId)
1437                 {
1438                     nLBRelations = _pMap[nMapPos].nLBRelations;
1439                     for (sal_uInt16 nRelPos = 0; nRelPos < nRelCount; nRelPos++)
1440                     {
1441                         if (nLBRelations & aAsCharRelationMap[nRelPos].nLBRelation)
1442                         {
1443                             SvxSwFramePosString::StringId sStrId1 = aAsCharRelationMap[nRelPos].eStrId;
1444 
1445                             // --> OD 2009-08-31 #mongolianlayout#
1446                             sStrId1 =
1447                                 lcl_ChangeResIdToVerticalOrRTL( sStrId1,
1448                                                                 bIsVerticalFrame,
1449                                                                 bIsVerticalL2R,
1450                                                                 bIsInRightToLeft);
1451                             // <--
1452                             String sEntry = aFramePosString.GetString(sStrId1);
1453                             sal_uInt16 nPos = _rLB.InsertEntry(sEntry);
1454                             _rLB.SetEntryData(nPos, &aAsCharRelationMap[nRelPos]);
1455                             if (_pMap[nMapPos].nAlign == _nAlign)
1456                                 sSelEntry = sEntry;
1457                             break;
1458                         }
1459                     }
1460                 }
1461             }
1462             if (sSelEntry.Len())
1463                 _rLB.SelectEntry(sSelEntry);
1464             else
1465             {
1466                 _rLB.SelectEntry(sOldEntry);
1467 
1468                 if (!_rLB.GetSelectEntryCount())
1469                 {
1470                     for (sal_uInt16 i = 0; i < _rLB.GetEntryCount(); i++)
1471                     {
1472                         RelationMap *pEntry = (RelationMap *)_rLB.GetEntryData(i);
1473                         if (pEntry->nLBRelation == LB_REL_CHAR) // Default
1474                         {
1475                             _rLB.SelectEntryPos(i);
1476                             break;
1477                         }
1478                     }
1479                 }
1480             }
1481         }
1482         else
1483         {
1484             sal_uInt16 nRelCount = sizeof(aRelationMap) / sizeof(RelationMap);
1485 
1486             // OD 14.11.2003 #i22341# - special handling for map <aVCharMap>,
1487             // because its ambigous in its <eStrId>/<eMirrorStrId>.
1488             if ( _pMap == aVCharMap )
1489             {
1490                 nLBRelations = ::lcl_GetLBRelationsForStrID( _pMap,
1491                                              ( aMirrorPagesCB.IsChecked()
1492                                                ? _pMap[_nLBSelPos].eMirrorStrId
1493                                                : _pMap[_nLBSelPos].eStrId),
1494                                              aMirrorPagesCB.IsChecked() );
1495             }
1496             else
1497             {
1498                 nLBRelations = _pMap[_nLBSelPos].nLBRelations;
1499             }
1500 
1501             for (sal_uLong nBit = 1; nBit < 0x80000000; nBit <<= 1)
1502             {
1503                 if (nLBRelations & nBit)
1504                 {
1505                     for (sal_uInt16 nRelPos = 0; nRelPos < nRelCount; nRelPos++)
1506                     {
1507                         if (aRelationMap[nRelPos].nLBRelation == nBit)
1508                         {
1509                             SvxSwFramePosString::StringId eStrId1 = aMirrorPagesCB.IsChecked() ?
1510                                             aRelationMap[nRelPos].eMirrorStrId : aRelationMap[nRelPos].eStrId;
1511                             // --> OD 2009-08-31 #mongolianlayout#
1512                             eStrId1 =
1513                                 lcl_ChangeResIdToVerticalOrRTL( eStrId1,
1514                                                                 bIsVerticalFrame,
1515                                                                 bIsVerticalL2R,
1516                                                                 bIsInRightToLeft);
1517                             // <--
1518                             String sEntry = aFramePosString.GetString(eStrId1);
1519                             sal_uInt16 nPos = _rLB.InsertEntry(sEntry);
1520                             _rLB.SetEntryData(nPos, &aRelationMap[nRelPos]);
1521                             if (!sSelEntry.Len() && aRelationMap[nRelPos].nRelation == _nRel)
1522                                 sSelEntry = sEntry;
1523                         }
1524                     }
1525                 }
1526             }
1527             if (sSelEntry.Len())
1528                 _rLB.SelectEntry(sSelEntry);
1529             else
1530             {
1531                 // Warscheinlich Ankerwechsel. Daher aehnliche Relation suchen
1532                 switch (_nRel)
1533                 {
1534                     case text::RelOrientation::FRAME:           _nRel = text::RelOrientation::PAGE_FRAME;   break;
1535                     case text::RelOrientation::PRINT_AREA:      _nRel = text::RelOrientation::PAGE_PRINT_AREA; break;
1536                     case text::RelOrientation::PAGE_LEFT:       _nRel = text::RelOrientation::FRAME_LEFT;   break;
1537                     case text::RelOrientation::PAGE_RIGHT:      _nRel = text::RelOrientation::FRAME_RIGHT;  break;
1538                     case text::RelOrientation::FRAME_LEFT:      _nRel = text::RelOrientation::PAGE_LEFT;    break;
1539                     case text::RelOrientation::FRAME_RIGHT:     _nRel = text::RelOrientation::PAGE_RIGHT;   break;
1540                     case text::RelOrientation::PAGE_FRAME:      _nRel = text::RelOrientation::FRAME;          break;
1541                     case text::RelOrientation::PAGE_PRINT_AREA: _nRel = text::RelOrientation::PRINT_AREA;        break;
1542 
1543                     default:
1544                         if (_rLB.GetEntryCount())
1545                         {
1546                             RelationMap *pEntry = (RelationMap *)_rLB.GetEntryData(_rLB.GetEntryCount() - 1);
1547                             _nRel = pEntry->nRelation;
1548                         }
1549                         break;
1550                 }
1551 
1552                 for (sal_uInt16 i = 0; i < _rLB.GetEntryCount(); i++)
1553                 {
1554                     RelationMap *pEntry = (RelationMap *)_rLB.GetEntryData(i);
1555                     if (pEntry->nRelation == _nRel)
1556                     {
1557                         _rLB.SelectEntryPos(i);
1558                         break;
1559                     }
1560                 }
1561 
1562                 if (!_rLB.GetSelectEntryCount())
1563                     _rLB.SelectEntryPos(0);
1564             }
1565         }
1566     }
1567 
1568     const bool bEnable = _rLB.GetEntryCount() != 0
1569             && (&_rLB != &aVertRelationLB || m_bAllowVertPositioning);
1570     _rLB.Enable( bEnable );
1571     _rFT.Enable( bEnable );
1572 
1573     RelHdl(&_rLB);
1574 
1575     return nLBRelations;
1576 }
1577 
1578 /*--------------------------------------------------------------------
1579     Beschreibung:
1580  --------------------------------------------------------------------*/
1581 
1582 short SwFrmPage::GetRelation(FrmMap * /*pMap*/, ListBox &rRelationLB)
1583 {
1584     short nRel = 0;
1585     sal_uInt16 nPos = rRelationLB.GetSelectEntryPos();
1586 
1587     if (nPos != LISTBOX_ENTRY_NOTFOUND)
1588     {
1589         RelationMap *pEntry = (RelationMap *)rRelationLB.GetEntryData(nPos);
1590         nRel = pEntry->nRelation;
1591     }
1592 
1593     return nRel;
1594 }
1595 
1596 /*--------------------------------------------------------------------
1597     Beschreibung:
1598  --------------------------------------------------------------------*/
1599 
1600 short SwFrmPage::GetAlignment(FrmMap *pMap, sal_uInt16 nMapPos,
1601         ListBox &/*rAlignLB*/, ListBox &rRelationLB)
1602 {
1603     short nAlign = 0;
1604 
1605     // OD 14.11.2003 #i22341# - special handling also for map <aVCharMap>,
1606     // because it contains ambigous items for alignment
1607     if ( pMap == aVAsCharHtmlMap || pMap == aVAsCharMap ||
1608          pMap == aVCharMap )
1609     {
1610         if (rRelationLB.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND)
1611         {
1612             sal_uLong  nRel = ((RelationMap *)rRelationLB.GetEntryData(rRelationLB.GetSelectEntryPos()))->nLBRelation;
1613             size_t nMapCount = ::lcl_GetFrmMapCount(pMap);
1614             SvxSwFramePosString::StringId eStrId = pMap[nMapPos].eStrId;
1615 
1616             for (size_t i = 0; i < nMapCount; i++)
1617             {
1618                 if (pMap[i].eStrId == eStrId)
1619                 {
1620                     sal_uLong nLBRelations = pMap[i].nLBRelations;
1621                     if (nLBRelations & nRel)
1622                     {
1623                         nAlign = pMap[i].nAlign;
1624                         break;
1625                     }
1626                 }
1627             }
1628         }
1629     }
1630     else if (pMap)
1631         nAlign = pMap[nMapPos].nAlign;
1632 
1633     return nAlign;
1634 }
1635 
1636 /*--------------------------------------------------------------------
1637     Beschreibung:
1638  --------------------------------------------------------------------*/
1639 
1640 sal_uInt16 SwFrmPage::GetMapPos( const FrmMap *pMap, ListBox &rAlignLB )
1641 {
1642     sal_uInt16 nMapPos = 0;
1643     sal_uInt16 nLBSelPos = rAlignLB.GetSelectEntryPos();
1644 
1645     if (nLBSelPos != LISTBOX_ENTRY_NOTFOUND)
1646     {
1647         if (pMap == aVAsCharHtmlMap || pMap == aVAsCharMap)
1648         {
1649             size_t nMapCount = ::lcl_GetFrmMapCount(pMap);
1650             String sSelEntry(rAlignLB.GetSelectEntry());
1651 
1652             for (size_t i = 0; i < nMapCount; i++)
1653             {
1654                 SvxSwFramePosString::StringId eResId = pMap[i].eStrId;
1655 
1656                 String sEntry = aFramePosString.GetString(eResId);
1657                 sEntry = MnemonicGenerator::EraseAllMnemonicChars( sEntry );
1658 
1659                 if (sEntry == sSelEntry)
1660                 {
1661                     nMapPos = static_cast< sal_uInt16 >(i);
1662                     break;
1663                 }
1664             }
1665         }
1666         else
1667             nMapPos = nLBSelPos;
1668     }
1669 
1670     return nMapPos;
1671 }
1672 
1673 /*--------------------------------------------------------------------
1674     Beschreibung:
1675  --------------------------------------------------------------------*/
1676 
1677 RndStdIds SwFrmPage::GetAnchor()
1678 {
1679     RndStdIds nRet = FLY_AT_PAGE;
1680     if(aAnchorAtParaRB.IsChecked())
1681     {
1682         nRet = FLY_AT_PARA;
1683     }
1684     else if(aAnchorAtCharRB.IsChecked())
1685     {
1686         nRet = FLY_AT_CHAR;
1687     }
1688     else if(aAnchorAsCharRB.IsChecked())
1689     {
1690         nRet = FLY_AS_CHAR;
1691     }
1692     else if(aAnchorAtFrameRB.IsChecked())
1693     {
1694         nRet = FLY_AT_FLY;
1695     }
1696     return nRet;
1697 }
1698 
1699 /*--------------------------------------------------------------------
1700     Beschreibung:   Bsp - Update
1701  --------------------------------------------------------------------*/
1702 
1703 void SwFrmPage::ActivatePage(const SfxItemSet& rSet)
1704 {
1705     bNoModifyHdl = sal_True;
1706     Init(rSet);
1707     bNoModifyHdl = sal_False;
1708     //lock PercentFields
1709     aWidthED.LockAutoCalculation(sal_True);
1710     aHeightED.LockAutoCalculation(sal_True);
1711     RangeModifyHdl(&aWidthED);  // Alle Maximalwerte initial setzen
1712     aHeightED.LockAutoCalculation(sal_False);
1713     aWidthED.LockAutoCalculation(sal_False);
1714     aFollowTextFlowCB.SaveValue();
1715 }
1716 
1717 int SwFrmPage::DeactivatePage(SfxItemSet * _pSet)
1718 {
1719     if ( _pSet )
1720     {
1721         FillItemSet( *_pSet );
1722 
1723         //FillItemSet setzt den Anker nicht in den Set, wenn er mit dem
1724         //Original uebereinstimmt. Fuer die anderen Pages brauchen wir aber
1725         //den aktuellen Anker.
1726         SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell()
1727                             : ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
1728         RndStdIds eAnchorId = (RndStdIds)GetAnchor();
1729         SwFmtAnchor aAnc( eAnchorId, pSh->GetPhyPageNum() );
1730         _pSet->Put( aAnc );
1731     }
1732 
1733     return sal_True;
1734 }
1735 
1736 /*--------------------------------------------------------------------
1737     Beschreibung: Links/rechts mit Innen/aussen tauschen
1738  --------------------------------------------------------------------*/
1739 
1740 IMPL_LINK( SwFrmPage, MirrorHdl, CheckBox *, EMPTYARG )
1741 {
1742     RndStdIds eId = GetAnchor();
1743     InitPos( eId, USHRT_MAX, 0, USHRT_MAX, 0, LONG_MAX, LONG_MAX);
1744 
1745     return 0;
1746 }
1747 
1748 /*--------------------------------------------------------------------
1749     Beschreibung:
1750  --------------------------------------------------------------------*/
1751 
1752 IMPL_LINK( SwFrmPage, RelSizeClickHdl, CheckBox *, pBtn )
1753 {
1754     if (pBtn == &aRelWidthCB)
1755     {
1756         aWidthED.ShowPercent(pBtn->IsChecked());
1757         if(pBtn->IsChecked())
1758             aWidthED.MetricField::SetMax(MAX_PERCENT_WIDTH);
1759     }
1760     else // pBtn == &aRelHeightCB
1761     {
1762         aHeightED.ShowPercent(pBtn->IsChecked());
1763         if(pBtn->IsChecked())
1764             aHeightED.MetricField::SetMax(MAX_PERCENT_HEIGHT);
1765     }
1766 
1767     if (pBtn)   // Nur wenn Handler durch Aenderung des Controllers gerufen wurde
1768         RangeModifyHdl(&aWidthED);  // Werte wieder korrigieren
1769 
1770     if (pBtn == &aRelWidthCB)
1771         ModifyHdl(&aWidthED);
1772     else // pBtn == &aRelHeightCB
1773         ModifyHdl(&aHeightED);
1774 
1775     return 0;
1776 }
1777 
1778 /*--------------------------------------------------------------------
1779     Beschreibung:   Bereichspruefung
1780  --------------------------------------------------------------------*/
1781 
1782 IMPL_LINK( SwFrmPage, RangeModifyHdl, Edit *, EMPTYARG )
1783 {
1784     if (bNoModifyHdl)
1785         return 0;
1786 
1787     SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell()
1788                         :((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
1789     ASSERT(pSh , "shell not found");
1790     SwFlyFrmAttrMgr aMgr( bNew, pSh, (const SwAttrSet&)GetItemSet() );
1791     SvxSwFrameValidation        aVal;
1792 
1793     aVal.nAnchorType = static_cast< sal_uInt16 >(GetAnchor());
1794     aVal.bAutoHeight = aAutoHeightCB.IsChecked();
1795     aVal.bAutoWidth = aAutoWidthCB.IsChecked();
1796     aVal.bMirror = aMirrorPagesCB.IsChecked();
1797     // OD 18.09.2003 #i18732#
1798     aVal.bFollowTextFlow = aFollowTextFlowCB.IsChecked();
1799 
1800     if ( pHMap )
1801     {
1802         // Ausrichtung Horizontal
1803         sal_uInt16 nMapPos = GetMapPos(pHMap, aHorizontalDLB);
1804         short nAlign = GetAlignment(pHMap, nMapPos, aHorizontalDLB, aHoriRelationLB);
1805         short nRel = GetRelation(pHMap, aHoriRelationLB);
1806 
1807         aVal.nHoriOrient = nAlign;
1808         aVal.nHRelOrient = nRel;
1809     }
1810     else
1811         aVal.nHoriOrient = text::HoriOrientation::NONE;
1812 
1813     if ( pVMap )
1814     {
1815         // Ausrichtung Vertikal
1816         sal_uInt16 nMapPos = GetMapPos(pVMap, aVerticalDLB);
1817         short nAlign = GetAlignment(pVMap, nMapPos, aVerticalDLB, aVertRelationLB);
1818         short nRel = GetRelation(pVMap, aVertRelationLB);
1819 
1820         aVal.nVertOrient = nAlign;
1821         aVal.nVRelOrient = nRel;
1822     }
1823     else
1824         aVal.nVertOrient = text::VertOrientation::NONE;
1825 
1826     const long nAtHorzPosVal = static_cast< long >(
1827                     aAtHorzPosED.Denormalize(aAtHorzPosED.GetValue(FUNIT_TWIP)) );
1828     const long nAtVertPosVal = static_cast< long >(
1829                     aAtVertPosED.Denormalize(aAtVertPosED.GetValue(FUNIT_TWIP)) );
1830 
1831     aVal.nHPos = nAtHorzPosVal;
1832     aVal.nVPos = nAtVertPosVal;
1833 
1834     aMgr.ValidateMetrics(aVal, mpToCharCntntPos, sal_True);   // Einmal, um Referenzwerte fuer prozentuale Werte zu erhalten
1835 
1836     // Referenzwerte fuer fuer Prozentwerte setzen (100%) ...
1837     aWidthED.SetRefValue(aVal.aPercentSize.Width());
1838     aHeightED.SetRefValue(aVal.aPercentSize.Height());
1839 
1840     // ... und damit Breite und Hoehe korrekt umrechnen
1841     SwTwips nWidth  = static_cast< SwTwips >(aWidthED. DenormalizePercent(aWidthED.GetValue(FUNIT_TWIP)));
1842     SwTwips nHeight = static_cast< SwTwips >(aHeightED.DenormalizePercent(aHeightED.GetValue(FUNIT_TWIP)));
1843     aVal.nWidth  = nWidth;
1844     aVal.nHeight = nHeight;
1845 
1846     aMgr.ValidateMetrics(aVal, mpToCharCntntPos);    // Nochmal um mit korrekter Breite und Hoehe alle restlichen Werte zu ermitteln
1847 
1848     // alle Spalten muessen passen
1849     if(GetTabDialog()->GetExampleSet() &&
1850             SFX_ITEM_DEFAULT <= GetTabDialog()->GetExampleSet()->GetItemState(RES_COL))
1851     {
1852         const SwFmtCol& rCol = (const SwFmtCol&)GetTabDialog()->GetExampleSet()->Get(RES_COL);
1853         if ( rCol.GetColumns().Count() > 1 )
1854         {
1855             for ( sal_uInt16 i = 0; i < rCol.GetColumns().Count(); ++i )
1856             {
1857                 aVal.nMinWidth += rCol.GetColumns()[i]->GetLeft() +
1858                                   rCol.GetColumns()[i]->GetRight() +
1859                                   MINFLY;
1860             }
1861             aVal.nMinWidth -= MINFLY;//einen hatten wir schon mit drin!
1862         }
1863     }
1864 
1865     nWidth = aVal.nWidth;
1866     nHeight = aVal.nHeight;
1867 
1868     // Mindestbreite auch fuer Vorlage
1869     aHeightED.SetMin(aHeightED.NormalizePercent(aVal.nMinHeight), FUNIT_TWIP);
1870     aWidthED. SetMin(aWidthED.NormalizePercent(aVal.nMinWidth), FUNIT_TWIP);
1871 
1872     SwTwips nMaxWidth(aVal.nMaxWidth);
1873     SwTwips nMaxHeight(aVal.nMaxHeight);
1874 
1875     if (aVal.bAutoHeight && (nDlgType == DLG_FRM_GRF || nDlgType == DLG_FRM_OLE))
1876     {
1877         SwTwips nTmp = Min(nWidth * nMaxHeight / Max(nHeight, 1L), nMaxHeight);
1878         aWidthED.SetMax(aWidthED.NormalizePercent(nTmp), FUNIT_TWIP);
1879 
1880         nTmp = Min(nHeight * nMaxWidth / Max(nWidth, 1L), nMaxWidth);
1881         aHeightED.SetMax(aWidthED.NormalizePercent(nTmp), FUNIT_TWIP);
1882     }
1883     else
1884     {
1885         SwTwips nTmp = static_cast< SwTwips >(aHeightED.NormalizePercent(nMaxHeight));
1886         aHeightED.SetMax(nTmp, FUNIT_TWIP);
1887 
1888         nTmp = static_cast< SwTwips >(aWidthED.NormalizePercent(nMaxWidth));
1889         aWidthED.SetMax(nTmp, FUNIT_TWIP);
1890     }
1891 
1892     aAtHorzPosED.SetMin(aAtHorzPosED.Normalize(aVal.nMinHPos), FUNIT_TWIP);
1893     aAtHorzPosED.SetMax(aAtHorzPosED.Normalize(aVal.nMaxHPos), FUNIT_TWIP);
1894     if ( aVal.nHPos != nAtHorzPosVal )
1895         aAtHorzPosED.SetValue(aAtHorzPosED.Normalize(aVal.nHPos), FUNIT_TWIP);
1896 
1897     const SwTwips nUpperOffset = (aVal.nAnchorType == FLY_AS_CHAR)
1898         ? nUpperBorder : 0;
1899     const SwTwips nLowerOffset = (aVal.nAnchorType == FLY_AS_CHAR)
1900         ? nLowerBorder : 0;
1901 
1902     aAtVertPosED.SetMin(aAtVertPosED.Normalize(aVal.nMinVPos + nLowerOffset + nUpperOffset), FUNIT_TWIP);
1903     aAtVertPosED.SetMax(aAtVertPosED.Normalize(aVal.nMaxVPos), FUNIT_TWIP);
1904     if ( aVal.nVPos != nAtVertPosVal )
1905         aAtVertPosED.SetValue(aAtVertPosED.Normalize(aVal.nVPos), FUNIT_TWIP);
1906 
1907     return 0;
1908 }
1909 
1910 IMPL_LINK( SwFrmPage, AnchorTypeHdl, RadioButton *, EMPTYARG )
1911 {
1912     aMirrorPagesCB.Enable(!aAnchorAsCharRB.IsChecked());
1913 
1914     // OD 06.11.2003 #i18732# - enable check box 'Follow text flow' for anchor
1915     // type to-paragraph' and to-character
1916     // OD 10.11.2003 #i22305# - enable check box 'Follow text
1917     // flow' also for anchor type to-frame.
1918     aFollowTextFlowCB.Enable( aAnchorAtParaRB.IsChecked() ||
1919                               aAnchorAtCharRB.IsChecked() ||
1920                               aAnchorAtFrameRB.IsChecked() );
1921 
1922     RndStdIds eId = GetAnchor();
1923 
1924     InitPos( eId, USHRT_MAX, 0, USHRT_MAX, 0, LONG_MAX, LONG_MAX);
1925     RangeModifyHdl(0);
1926 
1927     if(bHtmlMode)
1928     {
1929         PosHdl(&aHorizontalDLB);
1930         PosHdl(&aVerticalDLB);
1931     }
1932 
1933     EnableVerticalPositioning( !(m_bIsMathOLE && m_bIsMathBaselineAlignment
1934             && FLY_AS_CHAR == eId) );
1935 
1936     return 0;
1937 }
1938 
1939 /*--------------------------------------------------------------------
1940     Beschreibung:
1941  --------------------------------------------------------------------*/
1942 
1943 IMPL_LINK( SwFrmPage, PosHdl, ListBox *, pLB )
1944 {
1945     sal_Bool bHori = pLB == &aHorizontalDLB;
1946     ListBox *pRelLB = bHori ? &aHoriRelationLB : &aVertRelationLB;
1947     FixedText *pRelFT = bHori ? &aHoriRelationFT : &aVertRelationFT;
1948     FrmMap *pMap = bHori ? pHMap : pVMap;
1949 
1950     sal_uInt16 nMapPos = GetMapPos(pMap, *pLB);
1951     short nAlign = GetAlignment(pMap, nMapPos, *pLB, *pRelLB);
1952 
1953     if (bHori)
1954     {
1955         sal_Bool bEnable = text::HoriOrientation::NONE == nAlign;
1956         aAtHorzPosED.Enable( bEnable );
1957         aAtHorzPosFT.Enable( bEnable );
1958     }
1959     else
1960     {
1961         sal_Bool bEnable = text::VertOrientation::NONE == nAlign && m_bAllowVertPositioning;
1962         aAtVertPosED.Enable( bEnable );
1963         aAtVertPosFT.Enable( bEnable );
1964     }
1965 
1966     if (pLB)    // Nur wenn Handler durch Aenderung des Controllers gerufen wurde
1967         RangeModifyHdl( 0 );
1968 
1969     sal_uInt16 nRel = 0;
1970     if (pLB->GetSelectEntryCount())
1971     {
1972 
1973         if (pRelLB->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND)
1974             nRel = ((RelationMap *)pRelLB->GetEntryData(pRelLB->GetSelectEntryPos()))->nRelation;
1975 
1976         FillRelLB(pMap, nMapPos, nAlign, nRel, *pRelLB, *pRelFT);
1977     }
1978     else
1979         pRelLB->Clear();
1980 
1981     UpdateExample();
1982 
1983     if (bHori)
1984         bAtHorzPosModified = sal_True;
1985     else
1986         bAtVertPosModified = sal_True;
1987 
1988     // Sonderbehandlung fuer HTML-Mode mit horz-vert-Abhaengigkeiten
1989     if(bHtmlMode && nHtmlMode&HTMLMODE_SOME_ABS_POS &&
1990             (FLY_AT_CHAR == GetAnchor()))
1991     {
1992         sal_Bool bSet = sal_False;
1993         if(bHori)
1994         {
1995             // rechts ist nur unterhalb erlaubt - von links nur oben
1996             // von links am Zeichen -> unterhalb
1997             if((text::HoriOrientation::LEFT == nAlign || text::HoriOrientation::RIGHT == nAlign) &&
1998                     0 == aVerticalDLB.GetSelectEntryPos())
1999             {
2000                 if(text::RelOrientation::FRAME == nRel)
2001                     aVerticalDLB.SelectEntryPos(1);
2002                 else
2003                     aVerticalDLB.SelectEntryPos(0);
2004                 bSet = sal_True;
2005             }
2006             else if(text::HoriOrientation::LEFT == nAlign && 1 == aVerticalDLB.GetSelectEntryPos())
2007             {
2008                 aVerticalDLB.SelectEntryPos(0);
2009                 bSet = sal_True;
2010             }
2011             else if(text::HoriOrientation::NONE == nAlign && 1 == aVerticalDLB.GetSelectEntryPos())
2012             {
2013                 aVerticalDLB.SelectEntryPos(0);
2014                 bSet = sal_True;
2015             }
2016             if(bSet)
2017                 PosHdl(&aVerticalDLB);
2018         }
2019         else
2020         {
2021             if(text::VertOrientation::TOP == nAlign)
2022             {
2023                 if(1 == aHorizontalDLB.GetSelectEntryPos())
2024                 {
2025                     aHorizontalDLB.SelectEntryPos(0);
2026                     bSet = sal_True;
2027                 }
2028                 aHoriRelationLB.SelectEntryPos(1);
2029             }
2030             else if(text::VertOrientation::CHAR_BOTTOM == nAlign)
2031             {
2032                 if(2 == aHorizontalDLB.GetSelectEntryPos())
2033                 {
2034                     aHorizontalDLB.SelectEntryPos(0);
2035                     bSet = sal_True;
2036                 }
2037                 aHoriRelationLB.SelectEntryPos(0) ;
2038             }
2039             if(bSet)
2040                 PosHdl(&aHorizontalDLB);
2041         }
2042 
2043     }
2044     return 0;
2045 }
2046 
2047 /*--------------------------------------------------------------------
2048     Beschreibung:   Horizontale Pos
2049  --------------------------------------------------------------------*/
2050 
2051 IMPL_LINK( SwFrmPage, RelHdl, ListBox *, pLB )
2052 {
2053     sal_Bool bHori = pLB == &aHoriRelationLB;
2054 
2055     UpdateExample();
2056 
2057     if (bHori)
2058         bAtHorzPosModified = sal_True;
2059     else
2060         bAtVertPosModified = sal_True;
2061 
2062     if (bHtmlMode && (FLY_AT_CHAR == GetAnchor()))
2063     {
2064         if(bHori)
2065         {
2066             sal_uInt16 nRel = GetRelation(pHMap, aHoriRelationLB);
2067             if(text::RelOrientation::PRINT_AREA == nRel && 0 == aVerticalDLB.GetSelectEntryPos())
2068             {
2069                 aVerticalDLB.SelectEntryPos(1);
2070             }
2071             else if(text::RelOrientation::CHAR == nRel && 1 == aVerticalDLB.GetSelectEntryPos())
2072             {
2073                 aVerticalDLB.SelectEntryPos(0);
2074             }
2075         }
2076     }
2077     if (pLB)    // Nur wenn Handler durch Aenderung des Controllers gerufen wurde
2078         RangeModifyHdl(0);
2079 
2080     return 0;
2081 }
2082 
2083 
2084 IMPL_LINK_INLINE_START( SwFrmPage, RealSizeHdl, Button *, EMPTYARG )
2085 {
2086     aWidthED.SetUserValue( aWidthED. NormalizePercent(aGrfSize.Width() ), FUNIT_TWIP);
2087     aHeightED.SetUserValue(aHeightED.NormalizePercent(aGrfSize.Height()), FUNIT_TWIP);
2088     fWidthHeightRatio = aGrfSize.Height() ? double(aGrfSize.Width()) / double(aGrfSize.Height()) : 1.0;
2089     UpdateExample();
2090     return 0;
2091 }
2092 IMPL_LINK_INLINE_END( SwFrmPage, RealSizeHdl, Button *, EMPTYARG )
2093 
2094 
2095 IMPL_LINK( SwFrmPage, AutoWidthClickHdl, void*, EMPTYARG )
2096 {
2097     if( !IsInGraficMode() )
2098         //IAccessibility2 Implementation 2009-----
2099         HandleAutoCB( aAutoWidthCB.IsChecked(), aWidthFT, aWidthAutoFT, aWidthED );
2100         //-----IAccessibility2 Implementation 2009
2101     return 0;
2102 }
2103 
2104 IMPL_LINK( SwFrmPage, AutoHeightClickHdl, void*, EMPTYARG )
2105 {
2106     if( !IsInGraficMode() )
2107         //IAccessibility2 Implementation 2009-----
2108         HandleAutoCB( aAutoHeightCB.IsChecked(), aHeightFT, aHeightAutoFT, aWidthED );
2109         //-----IAccessibility2 Implementation 2009
2110     return 0;
2111 }
2112 
2113 IMPL_LINK( SwFrmPage, ModifyHdl, Edit *, pEdit )
2114 {
2115     SwTwips nWidth  = static_cast< SwTwips >(aWidthED.DenormalizePercent(aWidthED.GetValue(FUNIT_TWIP)));
2116     SwTwips nHeight = static_cast< SwTwips >(aHeightED.DenormalizePercent(aHeightED.GetValue(FUNIT_TWIP)));
2117     if ( aFixedRatioCB.IsChecked() )
2118     {
2119         if ( pEdit == &aWidthED )
2120         {
2121             nHeight = SwTwips((double)nWidth / fWidthHeightRatio);
2122             aHeightED.SetPrcntValue(aHeightED.NormalizePercent(nHeight), FUNIT_TWIP);
2123         }
2124         else if(pEdit == &aHeightED)
2125         {
2126             nWidth = SwTwips((double)nHeight * fWidthHeightRatio);
2127             aWidthED.SetPrcntValue(aWidthED.NormalizePercent(nWidth), FUNIT_TWIP);
2128         }
2129     }
2130     fWidthHeightRatio = nHeight ? double(nWidth) / double(nHeight) : 1.0;
2131     UpdateExample();
2132     return 0;
2133 }
2134 
2135 /*--------------------------------------------------------------------
2136     Beschreibung:
2137  --------------------------------------------------------------------*/
2138 
2139 void SwFrmPage::UpdateExample()
2140 {
2141     sal_uInt16 nPos = aHorizontalDLB.GetSelectEntryPos();
2142     if ( pHMap && nPos != LISTBOX_ENTRY_NOTFOUND )
2143     {
2144         sal_uInt16 nMapPos = GetMapPos(pHMap, aHorizontalDLB);
2145         short nAlign = GetAlignment(pHMap, nMapPos, aHorizontalDLB, aHoriRelationLB);
2146         short nRel = GetRelation(pHMap, aHoriRelationLB);
2147 
2148         aExampleWN.SetHAlign(nAlign);
2149         aExampleWN.SetHoriRel(nRel);
2150     }
2151 
2152     nPos = aVerticalDLB.GetSelectEntryPos();
2153     if ( pVMap && nPos != LISTBOX_ENTRY_NOTFOUND )
2154     {
2155         sal_uInt16 nMapPos = GetMapPos(pVMap, aVerticalDLB);
2156         short nAlign = GetAlignment(pVMap, nMapPos, aVerticalDLB, aVertRelationLB);
2157         short nRel = GetRelation(pVMap, aVertRelationLB);
2158 
2159         aExampleWN.SetVAlign(nAlign);
2160         aExampleWN.SetVertRel(nRel);
2161     }
2162 
2163     // Size
2164     long nXPos = static_cast< long >(aAtHorzPosED.Denormalize(aAtHorzPosED.GetValue(FUNIT_TWIP)));
2165     long nYPos = static_cast< long >(aAtVertPosED.Denormalize(aAtVertPosED.GetValue(FUNIT_TWIP)));
2166     aExampleWN.SetRelPos(Point(nXPos, nYPos));
2167 
2168     aExampleWN.SetAnchor( static_cast< sal_uInt16 >(GetAnchor()) );
2169     aExampleWN.Invalidate();
2170 }
2171 
2172 void SwFrmPage::Init(const SfxItemSet& rSet, sal_Bool bReset)
2173 {
2174     if(!bFormat)
2175     {
2176         SwWrtShell* pSh = ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
2177 
2178         // Size
2179         const sal_Bool bSizeFixed = pSh->IsSelObjProtected( FLYPROTECT_FIXED );
2180 
2181         aWidthED .Enable( !bSizeFixed );
2182         aHeightED.Enable( !bSizeFixed );
2183 
2184         // size controls for math OLE objects
2185         if ( DLG_FRM_OLE == nDlgType && ! bNew )
2186         {
2187             // disable width and height for math objects
2188             const SvGlobalName& rFactNm( pSh->GetOLEObject()->getClassID() );
2189 
2190             struct _GlobalNameId {
2191                 sal_uInt32 n1;
2192                 sal_uInt16 n2, n3;
2193                 sal_uInt8 b8, b9, b10, b11, b12, b13, b14, b15;
2194             } aGlbNmIds[4] = { { SO3_SM_CLASSID_60 }, { SO3_SM_CLASSID_50 },
2195                                { SO3_SM_CLASSID_40 }, { SO3_SM_CLASSID_30 } };
2196 
2197             for ( int i = 0; i < 4; ++i ) {
2198                 const _GlobalNameId& rId = aGlbNmIds[ i ];
2199 
2200                 SvGlobalName aGlbNm( rId.n1, rId.n2, rId.n3,
2201                                      rId.b8, rId.b9, rId.b10, rId.b11,
2202                                      rId.b12, rId.b13, rId.b14, rId.b15 );
2203 
2204                 if( rFactNm == aGlbNm )
2205                 {
2206                     // disable size controls for math OLE objects
2207                     aWidthFT.Disable();
2208                     aWidthED.Disable();
2209                     aRelWidthCB.Disable();
2210                     aHeightFT.Disable();
2211                     aHeightED.Disable();
2212                     aRelHeightCB.Disable();
2213                     aFixedRatioCB.Disable();
2214                     aRealSizeBT.Disable();
2215                     break;
2216                 }
2217             }
2218 
2219             // TODO/LATER: get correct aspect
2220             if(0 != (pSh->GetOLEObject()->getStatus( embed::Aspects::MSOLE_CONTENT ) & embed::EmbedMisc::MS_EMBED_RECOMPOSEONRESIZE ) )
2221                 aRealSizeBT.Disable();
2222         }
2223     }
2224 
2225     const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
2226     sal_Int64 nWidth  = aWidthED.NormalizePercent(rSize.GetWidth());
2227     sal_Int64 nHeight = aHeightED.NormalizePercent(rSize.GetHeight());
2228 
2229     if (nWidth != aWidthED.GetValue(FUNIT_TWIP))
2230     {
2231         if(!bReset)
2232         {
2233             // Wert wurde von Umlauf-Tabpage geaendert und muss
2234             // mit Modify-Flag gesetzt werden
2235             aWidthED.SetUserValue(nWidth, FUNIT_TWIP);
2236         }
2237         else
2238             aWidthED.SetPrcntValue(nWidth, FUNIT_TWIP);
2239     }
2240 
2241     if (nHeight != aHeightED.GetValue(FUNIT_TWIP))
2242     {
2243         if (!bReset)
2244         {
2245             // Wert wurde von Umlauf-Tabpage geaendert und muss
2246             // mit Modify-Flag gesetzt werden
2247             aHeightED.SetUserValue(nHeight, FUNIT_TWIP);
2248         }
2249         else
2250             aHeightED.SetPrcntValue(nHeight, FUNIT_TWIP);
2251     }
2252 
2253     if (!IsInGraficMode())
2254     {
2255         SwFrmSize eSize = rSize.GetHeightSizeType();
2256         sal_Bool bCheck = eSize != ATT_FIX_SIZE;
2257         aAutoHeightCB.Check( bCheck );
2258         //IAccessibility2 Implementation 2009-----
2259         HandleAutoCB( bCheck, aHeightFT, aHeightAutoFT, aWidthED );
2260         //-----IAccessibility2 Implementation 2009
2261         if( eSize == ATT_VAR_SIZE )
2262             aHeightED.SetValue( aHeightED.GetMin(), FUNIT_NONE );
2263 
2264         eSize = rSize.GetWidthSizeType();
2265         bCheck = eSize != ATT_FIX_SIZE;
2266         aAutoWidthCB.Check( bCheck );
2267         //IAccessibility2 Implementation 2009-----
2268         HandleAutoCB( bCheck, aWidthFT, aWidthAutoFT, aWidthED );
2269         //-----IAccessibility2 Implementation 2009
2270         if( eSize == ATT_VAR_SIZE )
2271             aWidthED.SetValue( aWidthED.GetMin(), FUNIT_NONE );
2272 
2273         if ( !bFormat )
2274         {
2275             SwWrtShell* pSh = ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
2276             const SwFrmFmt* pFmt = pSh->GetFlyFrmFmt();
2277             if( pFmt && pFmt->GetChain().GetNext() )
2278                 aAutoHeightCB.Enable( sal_False );
2279         }
2280     }
2281     else
2282         aAutoHeightCB.Hide();
2283 
2284     // Umlauf-Abstand fuer zeichengebundene Rahmen organisieren
2285     const SvxULSpaceItem &rUL = (const SvxULSpaceItem &)rSet.Get(RES_UL_SPACE);
2286     nUpperBorder = rUL.GetUpper();
2287     nLowerBorder = rUL.GetLower();
2288 
2289     if(SFX_ITEM_SET == rSet.GetItemState(FN_KEEP_ASPECT_RATIO))
2290     {
2291         aFixedRatioCB.Check(((const SfxBoolItem&)rSet.Get(FN_KEEP_ASPECT_RATIO)).GetValue());
2292         aFixedRatioCB.SaveValue();
2293     }
2294 
2295     // Spalten
2296     SwFmtCol aCol( (const SwFmtCol&)rSet.Get(RES_COL) );
2297     ::FitToActualSize( aCol, (sal_uInt16)rSize.GetWidth() );
2298 
2299     RndStdIds eAnchorId = (RndStdIds)GetAnchor();
2300 
2301     if ( bNew && !bFormat )
2302         InitPos(eAnchorId, USHRT_MAX, 0, USHRT_MAX, USHRT_MAX, LONG_MAX, LONG_MAX);
2303     else
2304     {
2305         const SwFmtHoriOrient& rHori = (const SwFmtHoriOrient&)rSet.Get(RES_HORI_ORIENT);
2306         const SwFmtVertOrient& rVert = (const SwFmtVertOrient&)rSet.Get(RES_VERT_ORIENT);
2307         nOldH    = rHori.GetHoriOrient();
2308         nOldHRel = rHori.GetRelationOrient();
2309         nOldV    = rVert.GetVertOrient(),
2310         nOldVRel = rVert.GetRelationOrient();
2311 
2312         if (eAnchorId == FLY_AT_PAGE)
2313         {
2314             if (nOldHRel == text::RelOrientation::FRAME)
2315                 nOldHRel = text::RelOrientation::PAGE_FRAME;
2316             else if (nOldHRel == text::RelOrientation::PRINT_AREA)
2317                 nOldHRel = text::RelOrientation::PAGE_PRINT_AREA;
2318             if (nOldVRel == text::RelOrientation::FRAME)
2319                 nOldVRel = text::RelOrientation::PAGE_FRAME;
2320             else if (nOldVRel == text::RelOrientation::PRINT_AREA)
2321                 nOldVRel = text::RelOrientation::PAGE_PRINT_AREA;
2322         }
2323 
2324         aMirrorPagesCB.Check(rHori.IsPosToggle());
2325         aMirrorPagesCB.SaveValue();
2326 
2327         InitPos(eAnchorId,
2328                 nOldH,
2329                 nOldHRel,
2330                 nOldV,
2331                 nOldVRel,
2332                 rHori.GetPos(),
2333                 rVert.GetPos());
2334     }
2335 
2336     // Transparent fuers Bsp
2337     // Umlauf fuers Bsp
2338     const SwFmtSurround& rSurround = (const SwFmtSurround&)rSet.Get(RES_SURROUND);
2339     aExampleWN.SetWrap ( static_cast< sal_uInt16 >(rSurround.GetSurround()) );
2340 
2341     if ( rSurround.GetSurround() == SURROUND_THROUGHT )
2342     {
2343         const SvxOpaqueItem& rOpaque = (const SvxOpaqueItem&)rSet.Get(RES_OPAQUE);
2344         aExampleWN.SetTransparent(!rOpaque.GetValue());
2345     }
2346 
2347     // ggf auf Prozent umschalten
2348     RangeModifyHdl(&aWidthED);  // Referenzwerte setzen (fuer 100%)
2349 
2350     if (rSize.GetWidthPercent() == 0xff || rSize.GetHeightPercent() == 0xff)
2351         aFixedRatioCB.Check(sal_True);
2352     if (rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff &&
2353         !aRelWidthCB.IsChecked())
2354     {
2355         aRelWidthCB.Check(sal_True);
2356         RelSizeClickHdl(&aRelWidthCB);
2357         aWidthED.SetPrcntValue(rSize.GetWidthPercent(), FUNIT_CUSTOM);
2358     }
2359     if (rSize.GetHeightPercent() && rSize.GetHeightPercent() != 0xff &&
2360         !aRelHeightCB.IsChecked())
2361     {
2362         aRelHeightCB.Check(sal_True);
2363         RelSizeClickHdl(&aRelHeightCB);
2364         aHeightED.SetPrcntValue(rSize.GetHeightPercent(), FUNIT_CUSTOM);
2365     }
2366     aRelWidthCB.SaveValue();
2367     aRelHeightCB.SaveValue();
2368 }
2369 
2370 sal_uInt16* SwFrmPage::GetRanges()
2371 {
2372     return aPageRg;
2373 }
2374 /* -----------------------------03.11.00 10:52--------------------------------
2375 
2376  ---------------------------------------------------------------------------*/
2377 void SwFrmPage::SetFormatUsed(sal_Bool bFmt)
2378 {
2379     bFormat     = bFmt;
2380     if(bFormat)
2381     {
2382         aAnchorAtPageRB.Hide();
2383         aAnchorAtParaRB.Hide();
2384         aAnchorAtCharRB.Hide();
2385         aAnchorAsCharRB.Hide();
2386         aAnchorAtFrameRB.Hide();
2387         aTypeFL.Hide();
2388         aTypeSepFL.Hide();
2389 
2390 //        Point aSizePos = aSizeFL.GetPosPixel();
2391 //        Size aSizeSize = aSizeFL.GetSizePixel();
2392 //        aSizeSize.Width() = aTypeFL.GetPosPixel().X() +
2393 //                    aTypeFL.GetSizePixel().Width() - aSizePos.X();
2394 //        aSizeFL.SetSizePixel(aSizeSize);
2395     }
2396 }
2397 
2398 
2399 void SwFrmPage::EnableVerticalPositioning( bool bEnable )
2400 {
2401     m_bAllowVertPositioning = bEnable;
2402     aVerticalFT.Enable( bEnable );
2403     aVerticalDLB.Enable( bEnable );
2404     aAtVertPosFT.Enable( bEnable );
2405     aAtVertPosED.Enable( bEnable );
2406     aVertRelationFT.Enable( bEnable );
2407     aVertRelationLB.Enable( bEnable );
2408 }
2409 
2410 
2411 /*--------------------------------------------------------------------
2412     Beschreibung:
2413  --------------------------------------------------------------------*/
2414 
2415 SwGrfExtPage::SwGrfExtPage(Window *pParent, const SfxItemSet &rSet) :
2416     SfxTabPage( pParent, SW_RES(TP_GRF_EXT), rSet ),
2417     aMirrorFL       (this, SW_RES( FL_MIRROR )),
2418     aMirrorVertBox  (this, SW_RES( CB_VERT )),
2419     aMirrorHorzBox  (this, SW_RES( CB_HOR )),
2420     aAllPagesRB     (this, SW_RES( RB_MIRROR_ALL_PAGES )),
2421     aLeftPagesRB    (this, SW_RES( RB_MIRROR_LEFT_PAGES )),
2422     aRightPagesRB   (this, SW_RES( RB_MIRROR_RIGHT_PAGES )),
2423     aBmpWin         (this, WN_BMP, Graphic(), BitmapEx(SW_RES(BMP_EXAMPLE)), BitmapEx(SW_RES(BMP_EXAMPLE_HC)) ),
2424     aConnectFL      (this, SW_RES( FL_CONNECT )),
2425     aConnectFT      (this, SW_RES( FT_CONNECT )),
2426     aConnectED      (this, SW_RES( ED_CONNECT )),
2427     aBrowseBT       (this, SW_RES( PB_BROWSE )),
2428     pGrfDlg         ( 0 )
2429 {
2430     FreeResource();
2431 
2432     aBrowseBT.SetAccessibleRelationMemberOf(&aConnectFL);
2433 
2434     SetExchangeSupport();
2435     aMirrorHorzBox.SetClickHdl( LINK(this, SwGrfExtPage, MirrorHdl));
2436     aMirrorVertBox.SetClickHdl( LINK(this, SwGrfExtPage, MirrorHdl));
2437     aBrowseBT.SetClickHdl    ( LINK(this, SwGrfExtPage, BrowseHdl));
2438 }
2439 
2440 /*--------------------------------------------------------------------
2441     Beschreibung:
2442  --------------------------------------------------------------------*/
2443 
2444 SwGrfExtPage::~SwGrfExtPage()
2445 {
2446     delete pGrfDlg;
2447 }
2448 
2449 /*--------------------------------------------------------------------
2450     Beschreibung:
2451  --------------------------------------------------------------------*/
2452 
2453 SfxTabPage* SwGrfExtPage::Create( Window *pParent, const SfxItemSet &rSet )
2454 {
2455     return new SwGrfExtPage( pParent, rSet );
2456 }
2457 
2458 /*--------------------------------------------------------------------
2459     Beschreibung:
2460  --------------------------------------------------------------------*/
2461 
2462 void SwGrfExtPage::Reset(const SfxItemSet &rSet)
2463 {
2464     const SfxPoolItem* pItem;
2465     sal_uInt16 nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
2466     bHtmlMode = nHtmlMode & HTMLMODE_ON ? sal_True : sal_False;
2467 
2468     if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_GRF_CONNECT, sal_True, &pItem)
2469         && ((const SfxBoolItem *)pItem)->GetValue() )
2470     {
2471         aBrowseBT.Enable();
2472         aConnectED.SetReadOnly(sal_False);
2473     }
2474 
2475     ActivatePage(rSet);
2476 }
2477 
2478 /*--------------------------------------------------------------------
2479     Beschreibung:
2480  --------------------------------------------------------------------*/
2481 
2482 void SwGrfExtPage::ActivatePage(const SfxItemSet& rSet)
2483 {
2484     const SvxProtectItem& rProt = (const SvxProtectItem& )rSet.Get(RES_PROTECT);
2485     sal_Bool bProtCntnt = rProt.IsCntntProtected();
2486 
2487     const SfxPoolItem* pItem = 0;
2488     sal_Bool bEnable = sal_False;
2489     sal_Bool bEnableMirrorRB = sal_False;
2490 
2491     SfxItemState eState = rSet.GetItemState(RES_GRFATR_MIRRORGRF, sal_True, &pItem);
2492     if( SFX_ITEM_UNKNOWN != eState && !bProtCntnt && !bHtmlMode )
2493     {
2494         if( SFX_ITEM_SET != eState )
2495             pItem = &rSet.Get( RES_GRFATR_MIRRORGRF );
2496 
2497         bEnable = sal_True;
2498 
2499         MirrorGraph eMirror = static_cast< MirrorGraph >(((const SwMirrorGrf* )pItem)->GetValue());
2500         switch( eMirror )
2501         {
2502         case RES_MIRROR_GRAPH_DONT: break;
2503         case RES_MIRROR_GRAPH_VERT: aMirrorHorzBox.Check(sal_True); break;
2504         case RES_MIRROR_GRAPH_HOR:  aMirrorVertBox.Check(sal_True); break;
2505         case RES_MIRROR_GRAPH_BOTH: aMirrorHorzBox.Check(sal_True);
2506                                     aMirrorVertBox.Check(sal_True);
2507                                     break;
2508         default:
2509             ;
2510         }
2511 
2512         sal_uInt16 nPos = ((const SwMirrorGrf* )pItem)->IsGrfToggle() ? 1 : 0;
2513         nPos += (eMirror == RES_MIRROR_GRAPH_VERT || eMirror == RES_MIRROR_GRAPH_BOTH)
2514                  ? 2 : 0;
2515 
2516         bEnableMirrorRB = nPos != 0;
2517 
2518         switch (nPos)
2519         {
2520             case 1: // Auf linken bzw geraden Seiten spiegeln
2521                 aLeftPagesRB.Check();
2522                 aMirrorHorzBox.Check(sal_True);
2523                 break;
2524             case 2: // Auf allen Seiten spiegeln
2525                 aAllPagesRB.Check();
2526                 break;
2527             case 3: // Auf rechten bzw ungeraden Seiten spiegeln
2528                 aRightPagesRB.Check();
2529                 break;
2530             default:
2531                 aAllPagesRB.Check();
2532                 break;
2533         }
2534     }
2535 
2536     if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_GRAF_GRAPHIC, sal_False, &pItem ) )
2537     {
2538         const SvxBrushItem& rBrush = *(SvxBrushItem*)pItem;
2539         if( rBrush.GetGraphicLink() )
2540         {
2541             aGrfName = aNewGrfName = *rBrush.GetGraphicLink();
2542             aConnectED.SetText( aNewGrfName );
2543         }
2544         const Graphic* pGrf = rBrush.GetGraphic();
2545         if( pGrf )
2546             aBmpWin.SetGraphic( *pGrf );
2547     }
2548 
2549     aAllPagesRB .Enable(bEnableMirrorRB);
2550     aLeftPagesRB.Enable(bEnableMirrorRB);
2551     aRightPagesRB.Enable(bEnableMirrorRB);
2552     aMirrorHorzBox.Enable(bEnable);
2553     aMirrorVertBox.Enable(bEnable);
2554     aMirrorFL.Enable(bEnable);
2555 
2556     aAllPagesRB .SaveValue();
2557     aLeftPagesRB.SaveValue();
2558     aRightPagesRB.SaveValue();
2559     aMirrorHorzBox.SaveValue();
2560     aMirrorVertBox.SaveValue();
2561 
2562     aBmpWin.MirrorHorz( aMirrorVertBox.IsChecked() );
2563     aBmpWin.MirrorVert( aMirrorHorzBox.IsChecked() );
2564     aBmpWin.Invalidate();
2565 }
2566 
2567 /*--------------------------------------------------------------------
2568     Beschreibung:
2569  --------------------------------------------------------------------*/
2570 
2571 sal_Bool SwGrfExtPage::FillItemSet( SfxItemSet &rSet )
2572 {
2573     sal_Bool bModified = sal_False;
2574     if ( aMirrorHorzBox.GetSavedValue() != aMirrorHorzBox.IsChecked() ||
2575          aMirrorVertBox.GetSavedValue() != aMirrorVertBox.IsChecked() ||
2576          aAllPagesRB .GetSavedValue() != aAllPagesRB .IsChecked() ||
2577          aLeftPagesRB.GetSavedValue() != aLeftPagesRB.IsChecked() ||
2578          aRightPagesRB.GetSavedValue() != aRightPagesRB.IsChecked())
2579     {
2580         bModified = sal_True;
2581 
2582         sal_Bool bHori = sal_False;
2583 
2584         if (aMirrorHorzBox.IsChecked() &&
2585                 !aLeftPagesRB.IsChecked())
2586             bHori = sal_True;
2587 
2588         MirrorGraph eMirror;
2589         eMirror = aMirrorVertBox.IsChecked() && bHori ?
2590                     RES_MIRROR_GRAPH_BOTH : bHori ?
2591                     RES_MIRROR_GRAPH_VERT : aMirrorVertBox.IsChecked() ?
2592                     RES_MIRROR_GRAPH_HOR  : RES_MIRROR_GRAPH_DONT;
2593 
2594         sal_Bool bMirror = !aAllPagesRB.IsChecked();
2595         SwMirrorGrf aMirror( eMirror );
2596         aMirror.SetGrfToggle(bMirror );
2597         rSet.Put( aMirror );
2598     }
2599 
2600     if( aGrfName != aNewGrfName || aConnectED.IsModified() )
2601     {
2602         bModified = sal_True;
2603         aGrfName = aConnectED.GetText();
2604         rSet.Put( SvxBrushItem( aGrfName, aFilterName, GPOS_LT,
2605                                 SID_ATTR_GRAF_GRAPHIC ));
2606     }
2607     return bModified;
2608 }
2609 /*--------------------------------------------------------------------
2610     Beschreibung:
2611  --------------------------------------------------------------------*/
2612 
2613 int SwGrfExtPage::DeactivatePage(SfxItemSet *_pSet)
2614 {
2615     if( _pSet )
2616         FillItemSet( *_pSet );
2617     return sal_True;
2618 }
2619 
2620 /*--------------------------------------------------------------------
2621     Beschreibung:
2622  --------------------------------------------------------------------*/
2623 
2624 IMPL_LINK( SwGrfExtPage, BrowseHdl, Button *, EMPTYARG )
2625 {
2626     if(!pGrfDlg)
2627     {
2628         pGrfDlg = new FileDialogHelper( SFXWB_GRAPHIC );
2629         pGrfDlg->SetTitle(SW_RESSTR(STR_EDIT_GRF ));
2630     }
2631     pGrfDlg->SetDisplayDirectory( aConnectED.GetText() );
2632     uno::Reference < ui::dialogs::XFilePicker > xFP = pGrfDlg->GetFilePicker();
2633     uno::Reference < ui::dialogs::XFilePickerControlAccess > xCtrlAcc(xFP, uno::UNO_QUERY);
2634     sal_Bool bTrue = sal_True;
2635     uno::Any aVal(&bTrue, ::getBooleanCppuType());
2636     xCtrlAcc->setValue( ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0, aVal);
2637 
2638     if ( pGrfDlg->Execute() == ERRCODE_NONE )
2639     {   // ausgewaehlten Filter merken
2640         aFilterName = pGrfDlg->GetCurrentFilter();
2641         aNewGrfName = INetURLObject::decode( pGrfDlg->GetPath(),
2642                                         INET_HEX_ESCAPE,
2643                                         INetURLObject::DECODE_UNAMBIGUOUS,
2644                                         RTL_TEXTENCODING_UTF8 );
2645         aConnectED.SetModifyFlag();
2646         aConnectED.SetText( aNewGrfName );
2647         //Spiegeln zuruecksetzen, da u. U. eine Bitmap
2648         //gegen eine andere Art von Grafik ausgetauscht worden ist,
2649         //die nicht gespiegelt werden kann.
2650         aMirrorVertBox.Check(sal_False);
2651         aMirrorHorzBox.Check(sal_False);
2652         aAllPagesRB .Enable(sal_False);
2653         aLeftPagesRB.Enable(sal_False);
2654         aRightPagesRB.Enable(sal_False);
2655         aBmpWin.MirrorHorz(sal_False);
2656         aBmpWin.MirrorVert(sal_False);
2657 
2658         Graphic aGraphic;
2659         GraphicFilter::LoadGraphic( pGrfDlg->GetPath(), aEmptyStr, aGraphic );
2660         aBmpWin.SetGraphic(aGraphic);
2661 
2662         sal_Bool bEnable = GRAPHIC_BITMAP      == aGraphic.GetType() ||
2663                             GRAPHIC_GDIMETAFILE == aGraphic.GetType();
2664         aMirrorVertBox.Enable(bEnable);
2665         aMirrorHorzBox.Enable(bEnable);
2666         aAllPagesRB .Enable(bEnable);
2667         aLeftPagesRB.Enable(bEnable);
2668         aRightPagesRB.Enable(bEnable);
2669     }
2670     return 0;
2671 }
2672 /*--------------------------------------------------------------------
2673     Beschreibung:
2674  --------------------------------------------------------------------*/
2675 
2676 IMPL_LINK( SwGrfExtPage, MirrorHdl, CheckBox *, EMPTYARG )
2677 {
2678     sal_Bool bEnable = aMirrorHorzBox.IsChecked();
2679 
2680     aBmpWin.MirrorHorz( aMirrorVertBox.IsChecked() );
2681     aBmpWin.MirrorVert( bEnable );
2682 
2683     aAllPagesRB .Enable(bEnable);
2684     aLeftPagesRB.Enable(bEnable);
2685     aRightPagesRB.Enable(bEnable);
2686 
2687     if (!aAllPagesRB.IsChecked() && !aLeftPagesRB.IsChecked() && !aRightPagesRB.IsChecked())
2688         aAllPagesRB.Check();
2689 
2690     return 0;
2691 }
2692 
2693 /*--------------------------------------------------------------------
2694     Beschreibung: BeispielWindow
2695  --------------------------------------------------------------------*/
2696 
2697 BmpWindow::BmpWindow( Window* pPar, sal_uInt16 nId,
2698                         const Graphic& rGraphic, const BitmapEx& rBmp, const BitmapEx& rBmpHC ) :
2699     Window(pPar, SW_RES(nId)),
2700     aGraphic(rGraphic),
2701     aBmp(rBmp),
2702     aBmpHC(rBmpHC),
2703     bHorz(sal_False),
2704     bVert(sal_False),
2705     bGraphic(sal_False),
2706     bLeftAlign(sal_False)
2707 {
2708     // #119307# use background, the graphic might have transparency
2709     SetBackground(Wallpaper(Color(COL_WHITE)));
2710 }
2711 
2712 void BmpWindow::Paint( const Rectangle& )
2713 {
2714     Point aPntPos;
2715     Size  aPntSz( GetSizePixel() );
2716     Size  aGrfSize;
2717     if(bGraphic)
2718         aGrfSize = ::GetGraphicSizeTwip(aGraphic, this);
2719     //it should show the default bitmap also if no graphic can be found
2720     if(!aGrfSize.Width() && !aGrfSize.Height())
2721         aGrfSize =  PixelToLogic(aBmp.GetSizePixel());
2722 
2723     long nRelGrf = aGrfSize.Width() * 100L / aGrfSize.Height();
2724     long nRelWin = aPntSz.Width() * 100L / aPntSz.Height();
2725     if(nRelGrf < nRelWin)
2726     {
2727         const long nWidth = aPntSz.Width();
2728         aPntSz.Width() = aPntSz.Height() * nRelGrf /100;
2729         if(!bLeftAlign)
2730             aPntPos.X() += nWidth - aPntSz.Width() ;
2731     }
2732 
2733     if ( bHorz )
2734     {
2735         aPntPos.Y()     += aPntSz.Height();
2736         aPntPos.Y() --;
2737         aPntSz.Height() *= -1;
2738     }
2739     if ( bVert )
2740     {
2741         aPntPos.X()     += aPntSz.Width();
2742         aPntPos.X()--;
2743         aPntSz.Width()  *= -1;
2744     }
2745 
2746     // #119307# clear window background, the graphic might have transparency
2747     Erase();
2748 
2749     if ( bGraphic )
2750         aGraphic.Draw( this, aPntPos, aPntSz );
2751     else
2752     {
2753         bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
2754         DrawBitmapEx( aPntPos, aPntSz, bHC ? aBmpHC : aBmp );
2755     }
2756 }
2757 
2758 BmpWindow::~BmpWindow()
2759 {
2760 }
2761 
2762 void BmpWindow::SetGraphic(const Graphic& rGrf)
2763 {
2764     aGraphic = rGrf;
2765     Size aGrfSize = ::GetGraphicSizeTwip(aGraphic, this);
2766     bGraphic = aGrfSize.Width() && aGrfSize.Height();
2767     Invalidate();
2768 }
2769 
2770 /***************************************************************************
2771     Beschreibung:   URL und ImageMap an Rahmen einstellen
2772 ***************************************************************************/
2773 
2774 
2775 SwFrmURLPage::SwFrmURLPage( Window *pParent, const SfxItemSet &rSet ) :
2776     SfxTabPage(pParent,     SW_RES(TP_FRM_URL), rSet),
2777     aHyperLinkFL    (this, SW_RES( FL_HYPERLINK )),
2778     aURLFT          (this, SW_RES( FT_URL    )),
2779     aURLED          (this, SW_RES( ED_URL    )),
2780     aSearchPB       (this, SW_RES( PB_SEARCH  )),
2781     aNameFT         (this, SW_RES( FT_NAME   )),
2782     aNameED         (this, SW_RES( ED_NAME   )),
2783     aFrameFT        (this, SW_RES( FT_FRAME   )),
2784     aFrameCB        (this, SW_RES( CB_FRAME   )),
2785 
2786     aImageFL        (this, SW_RES( FL_IMAGE   )),
2787     aServerCB       (this, SW_RES( CB_SERVER  )),
2788     aClientCB       (this, SW_RES( CB_CLIENT  ))
2789 {
2790     FreeResource();
2791     aSearchPB.SetClickHdl(LINK(this, SwFrmURLPage, InsertFileHdl));
2792 }
2793 
2794 /***************************************************************************
2795     Beschreibung:
2796 ***************************************************************************/
2797 
2798 SwFrmURLPage::~SwFrmURLPage()
2799 {
2800 }
2801 
2802 /***************************************************************************
2803     Beschreibung:
2804 ***************************************************************************/
2805 
2806 void SwFrmURLPage::Reset( const SfxItemSet &rSet )
2807 {
2808     const SfxPoolItem* pItem;
2809     if ( SFX_ITEM_SET == rSet.GetItemState( SID_DOCFRAME, sal_True, &pItem))
2810     {
2811         TargetList* pList = new TargetList;
2812         ((const SfxFrameItem*)pItem)->GetFrame()->GetTargetList(*pList);
2813         sal_uInt16 nCount = (sal_uInt16)pList->Count();
2814         if( nCount )
2815         {
2816             sal_uInt16 i;
2817             for ( i = 0; i < nCount; i++ )
2818             {
2819                 aFrameCB.InsertEntry(*pList->GetObject(i));
2820             }
2821             for ( i = nCount; i; i-- )
2822             {
2823                 delete pList->GetObject( i - 1 );
2824             }
2825         }
2826         delete pList;
2827     }
2828 
2829     if ( SFX_ITEM_SET == rSet.GetItemState( RES_URL, sal_True, &pItem ) )
2830     {
2831         const SwFmtURL* pFmtURL = (const SwFmtURL*)pItem;
2832         aURLED.SetText( INetURLObject::decode( pFmtURL->GetURL(),
2833                                         INET_HEX_ESCAPE,
2834                                         INetURLObject::DECODE_UNAMBIGUOUS,
2835                                         RTL_TEXTENCODING_UTF8 ));
2836         aNameED.SetText( pFmtURL->GetName());
2837 
2838         aClientCB.Enable( pFmtURL->GetMap() != 0 );
2839         aClientCB.Check ( pFmtURL->GetMap() != 0 );
2840         aServerCB.Check ( pFmtURL->IsServerMap() );
2841 
2842         aFrameCB.SetText(pFmtURL->GetTargetFrameName());
2843         aFrameCB.SaveValue();
2844     }
2845     else
2846         aClientCB.Enable( sal_False );
2847 
2848     aServerCB.SaveValue();
2849     aClientCB.SaveValue();
2850 }
2851 
2852 
2853 
2854 /***************************************************************************
2855     Beschreibung:
2856 ***************************************************************************/
2857 
2858 sal_Bool SwFrmURLPage::FillItemSet(SfxItemSet &rSet)
2859 {
2860     sal_Bool bModified = sal_False;
2861     const SwFmtURL* pOldURL = (SwFmtURL*)GetOldItem(rSet, RES_URL);
2862     SwFmtURL* pFmtURL;
2863     if(pOldURL)
2864         pFmtURL = (SwFmtURL*)pOldURL->Clone();
2865     else
2866         pFmtURL = new SwFmtURL();
2867 
2868     {
2869         String sText = aURLED.GetText();
2870 
2871         if( pFmtURL->GetURL() != sText ||
2872             pFmtURL->GetName() != aNameED.GetText() ||
2873             aServerCB.IsChecked() != pFmtURL->IsServerMap() )
2874         {
2875             pFmtURL->SetURL( sText, aServerCB.IsChecked() );
2876             pFmtURL->SetName( aNameED.GetText() );
2877             bModified = sal_True;
2878         }
2879     }
2880 
2881     if(!aClientCB.IsChecked() && pFmtURL->GetMap() != 0)
2882     {
2883         pFmtURL->SetMap(0);
2884         bModified = sal_True;
2885     }
2886 
2887     if(pFmtURL->GetTargetFrameName() != aFrameCB.GetText())
2888     {
2889         pFmtURL->SetTargetFrameName(aFrameCB.GetText());
2890         bModified = sal_True;
2891     }
2892     rSet.Put(*pFmtURL);
2893     delete pFmtURL;
2894     return bModified;
2895 }
2896 
2897 /***************************************************************************
2898     Beschreibung:
2899 ***************************************************************************/
2900 
2901 SfxTabPage* SwFrmURLPage::Create(Window *pParent, const SfxItemSet &rSet)
2902 {
2903     return new SwFrmURLPage( pParent, rSet );
2904 }
2905 
2906 /***************************************************************************
2907     Beschreibung:
2908 ***************************************************************************/
2909 
2910 IMPL_LINK( SwFrmURLPage, InsertFileHdl, PushButton *, EMPTYARG )
2911 {
2912     FileDialogHelper aDlgHelper( ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
2913     uno::Reference < ui::dialogs::XFilePicker > xFP = aDlgHelper.GetFilePicker();
2914 
2915     try
2916     {
2917         String sTemp(aURLED.GetText());
2918         if(sTemp.Len())
2919             xFP->setDisplayDirectory(sTemp);
2920     }
2921     catch( const uno::Exception& rEx )
2922     {
2923         (void) rEx;
2924     }
2925     if( aDlgHelper.Execute() == ERRCODE_NONE )
2926     {
2927         aURLED.SetText( xFP->getFiles().getConstArray()[0] );
2928     }
2929 
2930     return 0;
2931 }
2932 
2933 /* -----------------------------03.11.00 10:56--------------------------------
2934 
2935  ---------------------------------------------------------------------------*/
2936 void lcl_Move(Window& rWin, sal_Int32 nDiff)
2937 {
2938     Point aPos(rWin.GetPosPixel());
2939     aPos.Y() -= nDiff;
2940     rWin.SetPosPixel(aPos);
2941 }
2942 
2943 /*-----------------13.11.96 13.15-------------------
2944 
2945 --------------------------------------------------*/
2946 
2947 SwFrmAddPage::SwFrmAddPage(Window *pParent, const SfxItemSet &rSet ) :
2948     SfxTabPage(pParent,     SW_RES(TP_FRM_ADD), rSet),
2949 
2950     aNamesFL           (this, SW_RES(FL_NAME)),
2951     aNameFT            (this, SW_RES(FT_NAME)),
2952     aNameED            (this, SW_RES(ED_NAME)),
2953     aAltNameFT         (this, SW_RES(FT_ALT_NAME)),
2954     aAltNameED         (this, SW_RES(ED_ALT_NAME)),
2955     aPrevFT            (this, SW_RES(FT_PREV)),
2956     aPrevLB            (this, SW_RES(LB_PREV)),
2957     aNextFT            (this, SW_RES(FT_NEXT)),
2958     aNextLB            (this, SW_RES(LB_NEXT)),
2959 
2960     aProtectFL         (this, SW_RES(FL_PROTECT)),
2961     aProtectContentCB  (this, SW_RES(CB_PROTECT_CONTENT)),
2962     aProtectFrameCB    (this, SW_RES(CB_PROTECT_FRAME)),
2963     aProtectSizeCB     (this, SW_RES(CB_PROTECT_SIZE)),
2964     aExtFL             (this, SW_RES(FL_EXT)),
2965 
2966     aEditInReadonlyCB  (this, SW_RES(CB_EDIT_IN_READONLY)),
2967     aPrintFrameCB      (this, SW_RES(CB_PRINT_FRAME)),
2968     aTextFlowFT        (this, SW_RES(FT_TEXTFLOW)),
2969     aTextFlowLB        (this, SW_RES(LB_TEXTFLOW)),
2970 
2971     pWrtSh(0),
2972 
2973     nDlgType(0),
2974     bHtmlMode(sal_False),
2975     bFormat(sal_False),
2976     bNew(sal_False)
2977 {
2978     FreeResource();
2979 
2980 }
2981 
2982 /*-----------------13.11.96 13.15-------------------
2983 
2984 --------------------------------------------------*/
2985 
2986 SwFrmAddPage::~SwFrmAddPage()
2987 {
2988 }
2989 
2990 /*-----------------13.11.96 13.15-------------------
2991 
2992 --------------------------------------------------*/
2993 
2994 SfxTabPage* SwFrmAddPage::Create(Window *pParent, const SfxItemSet &rSet)
2995 {
2996     return new SwFrmAddPage(pParent, rSet);
2997 }
2998 
2999 /*-----------------13.11.96 13.14-------------------
3000 
3001 --------------------------------------------------*/
3002 
3003 void SwFrmAddPage::Reset(const SfxItemSet &rSet )
3004 {
3005     const SfxPoolItem* pItem;
3006     sal_uInt16 nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
3007     bHtmlMode = nHtmlMode & HTMLMODE_ON ? sal_True : sal_False;
3008     if(bHtmlMode)
3009     {
3010         aProtectContentCB .Hide();
3011         aProtectFrameCB   .Hide();
3012         aProtectSizeCB    .Hide();
3013         aEditInReadonlyCB .Hide();
3014         aPrintFrameCB     .Hide();
3015         aExtFL            .Hide();
3016         aProtectFL.Hide();
3017     }
3018     if ( DLG_FRM_GRF == nDlgType || DLG_FRM_OLE == nDlgType )
3019     {
3020         aEditInReadonlyCB.Hide();
3021         aPrintFrameCB.SetPosPixel(aEditInReadonlyCB.GetPosPixel());
3022     }
3023 
3024     if(SFX_ITEM_SET == rSet.GetItemState(FN_SET_FRM_ALT_NAME, sal_False, &pItem))
3025     {
3026         aAltNameED.SetText(((const SfxStringItem*)pItem)->GetValue());
3027         aAltNameED.SaveValue();
3028     }
3029 
3030     if(!bFormat)
3031     {
3032         // Grafik einfuegen - Eigenschaften
3033         // bNew ist nicht gesetzt, deswegen ueber Selektion erkennen
3034         String aTmpName1;
3035         if(SFX_ITEM_SET == rSet.GetItemState(FN_SET_FRM_NAME, sal_False, &pItem))
3036         {
3037             aTmpName1 = ((const SfxStringItem*)pItem)->GetValue();
3038         }
3039 
3040         DBG_ASSERT(pWrtSh, "keine Shell?");
3041         if( bNew || !aTmpName1.Len() )
3042 
3043             switch( nDlgType )
3044             {
3045                 case DLG_FRM_GRF:
3046                     aTmpName1 = pWrtSh->GetUniqueGrfName();
3047                     break;
3048                 case DLG_FRM_OLE:
3049                     aTmpName1 = pWrtSh->GetUniqueOLEName();
3050                     break;
3051                 default:
3052                     aTmpName1 = pWrtSh->GetUniqueFrameName();
3053                     break;
3054             }
3055 
3056         aNameED.SetText( aTmpName1 );
3057         aNameED.SaveValue();
3058     }
3059     else
3060     {
3061         aNameED.Enable( sal_False );
3062         aAltNameED.Enable(sal_False);
3063         aNameFT.Enable( sal_False );
3064         aAltNameFT.Enable(sal_False);
3065         aNamesFL.Enable(sal_False);
3066     }
3067     if(nDlgType == DLG_FRM_STD && aAltNameFT.IsVisible())
3068     {
3069         aAltNameFT.Hide();
3070         aAltNameED.Hide();
3071         //move all controls one step up
3072         Window* aWindows[] =
3073         {
3074             &aPrevFT,
3075             &aPrevLB,
3076             &aNextFT,
3077             &aNextLB,
3078             &aNamesFL,
3079             &aProtectContentCB,
3080             &aProtectFrameCB,
3081             &aProtectSizeCB,
3082             &aProtectFL,
3083             &aEditInReadonlyCB,
3084             &aPrintFrameCB,
3085             &aTextFlowFT,
3086             &aTextFlowLB,
3087             &aExtFL,
3088             0
3089         };
3090         sal_Int32 nOffset = aAltNameED.GetPosPixel().Y() - aNameED.GetPosPixel().Y();
3091         sal_Int32 nIdx = 0;
3092         while(aWindows[nIdx])
3093         {
3094             lcl_Move(*aWindows[nIdx++], nOffset);
3095         }
3096     }
3097     else
3098     {
3099         aNameED.SetModifyHdl(LINK(this, SwFrmAddPage, EditModifyHdl));
3100     }
3101 
3102     if (!bNew)
3103     {
3104         SwFrmFmt* pFmt = pWrtSh->GetFlyFrmFmt();
3105 
3106         if (pFmt)
3107         {
3108             const SwFmtChain &rChain = pFmt->GetChain();
3109             const SwFlyFrmFmt* pFlyFmt;
3110             String sNextChain, sPrevChain;
3111             if ((pFlyFmt = rChain.GetPrev()) != 0)
3112             {
3113                 sPrevChain = pFlyFmt->GetName();
3114             }
3115 
3116             if ((pFlyFmt = rChain.GetNext()) != 0)
3117             {
3118                 sNextChain = pFlyFmt->GetName();
3119             }
3120             //determine chainable frames
3121             ::std::vector< String > aPrevPageFrames;
3122             ::std::vector< String > aThisPageFrames;
3123             ::std::vector< String > aNextPageFrames;
3124             ::std::vector< String > aRemainFrames;
3125             pWrtSh->GetConnectableFrmFmts(*pFmt, sNextChain, sal_False,
3126                             aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames );
3127             lcl_InsertVectors(aPrevLB, aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames);
3128             if(sPrevChain.Len())
3129             {
3130                 if(LISTBOX_ENTRY_NOTFOUND == aPrevLB.GetEntryPos(sPrevChain))
3131                     aPrevLB.InsertEntry(sPrevChain, 1);
3132                 aPrevLB.SelectEntry(sPrevChain);
3133             }
3134             else
3135                 aPrevLB.SelectEntryPos(0);
3136             aPrevPageFrames.erase(aPrevPageFrames.begin(), aPrevPageFrames.end());
3137             aNextPageFrames.erase(aNextPageFrames.begin(), aNextPageFrames.end());
3138             aThisPageFrames.erase(aThisPageFrames.begin(), aThisPageFrames.end());
3139             aRemainFrames.erase(aRemainFrames.begin(), aRemainFrames.end());
3140 
3141 
3142             pWrtSh->GetConnectableFrmFmts(*pFmt, sPrevChain, sal_True,
3143                             aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames );
3144             lcl_InsertVectors(aNextLB, aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames);
3145             if(sNextChain.Len())
3146             {
3147                 if(LISTBOX_ENTRY_NOTFOUND == aNextLB.GetEntryPos(sNextChain))
3148                     aNextLB.InsertEntry(sNextChain, 1);
3149                 aNextLB.SelectEntry(sNextChain);
3150             }
3151             else
3152                 aNextLB.SelectEntryPos(0);
3153             Link aLink(LINK(this, SwFrmAddPage, ChainModifyHdl));
3154             aPrevLB.SetSelectHdl(aLink);
3155             aNextLB.SetSelectHdl(aLink);
3156         }
3157     }
3158     // Pos Protected
3159     const SvxProtectItem& rProt = (const SvxProtectItem& )rSet.Get(RES_PROTECT);
3160     aProtectFrameCB.Check(rProt.IsPosProtected());
3161     aProtectContentCB.Check(rProt.IsCntntProtected());
3162     aProtectSizeCB.Check(rProt.IsSizeProtected());
3163 
3164     const SwFmtEditInReadonly& rEdit = (const SwFmtEditInReadonly& )rSet.Get(RES_EDIT_IN_READONLY);
3165     aEditInReadonlyCB.Check(rEdit.GetValue());          aEditInReadonlyCB.SaveValue();
3166 
3167     // drucken
3168     const SvxPrintItem& rPrt = (const SvxPrintItem&)rSet.Get(RES_PRINT);
3169     aPrintFrameCB.Check(rPrt.GetValue());               aPrintFrameCB.SaveValue();
3170 
3171     // textflow
3172     SfxItemState eState;
3173     if( (!bHtmlMode || (0 != (nHtmlMode&HTMLMODE_SOME_STYLES)))
3174             && DLG_FRM_GRF != nDlgType && DLG_FRM_OLE != nDlgType &&
3175         SFX_ITEM_UNKNOWN != ( eState = rSet.GetItemState(
3176                                         RES_FRAMEDIR, sal_True )) )
3177     {
3178         aTextFlowFT.Show();
3179         aTextFlowLB.Show();
3180 
3181         //vertical text flow is not possible in HTML
3182         if(bHtmlMode)
3183         {
3184             sal_uLong nData = FRMDIR_VERT_TOP_RIGHT;
3185             aTextFlowLB.RemoveEntry(aTextFlowLB.GetEntryPos((void*)nData));
3186         }
3187         sal_uInt16 nPos, nVal = ((SvxFrameDirectionItem&)rSet.Get(RES_FRAMEDIR)).GetValue();
3188         for( nPos = aTextFlowLB.GetEntryCount(); nPos; )
3189             if( (sal_uInt16)(long)aTextFlowLB.GetEntryData( --nPos ) == nVal )
3190                 break;
3191         aTextFlowLB.SelectEntryPos( nPos );
3192         aTextFlowLB.SaveValue();
3193     }
3194     else
3195     {
3196         aTextFlowFT.Hide();
3197         aTextFlowLB.Hide();
3198     }
3199 }
3200 
3201 /*-----------------13.11.96 13.20-------------------
3202 
3203 --------------------------------------------------*/
3204 
3205 sal_Bool SwFrmAddPage::FillItemSet(SfxItemSet &rSet)
3206 {
3207     sal_Bool bRet = sal_False;
3208     if (aNameED.GetText() != aNameED.GetSavedValue())
3209         bRet |= 0 != rSet.Put(SfxStringItem(FN_SET_FRM_NAME, aNameED.GetText()));
3210     if (aAltNameED.GetText()  != aAltNameED.GetSavedValue())
3211         bRet |= 0 != rSet.Put(SfxStringItem(FN_SET_FRM_ALT_NAME, aAltNameED.GetText()));
3212 
3213     const SfxPoolItem* pOldItem;
3214     SvxProtectItem aProt ( (const SvxProtectItem& )GetItemSet().Get(RES_PROTECT) );
3215     aProt.SetCntntProtect( aProtectContentCB.IsChecked() );
3216     aProt.SetSizeProtect ( aProtectSizeCB.IsChecked() );
3217     aProt.SetPosProtect  ( aProtectFrameCB.IsChecked() );
3218     if ( 0 == (pOldItem = GetOldItem(rSet, FN_SET_PROTECT)) ||
3219                 aProt != *pOldItem )
3220         bRet |= 0 != rSet.Put( aProt);
3221 
3222     sal_Bool bChecked;
3223     if ( (bChecked = aEditInReadonlyCB.IsChecked()) != aEditInReadonlyCB.GetSavedValue() )
3224         bRet |= 0 != rSet.Put( SwFmtEditInReadonly( RES_EDIT_IN_READONLY, bChecked));
3225 
3226     if ( (bChecked = aPrintFrameCB.IsChecked()) != aPrintFrameCB.GetSavedValue() )
3227         bRet |= 0 != rSet.Put( SvxPrintItem( RES_PRINT, bChecked));
3228 
3229     // textflow
3230     if( aTextFlowLB.IsVisible() )
3231     {
3232         sal_uInt16 nPos = aTextFlowLB.GetSelectEntryPos();
3233         if( nPos != aTextFlowLB.GetSavedValue() )
3234         {
3235             nPos = (sal_uInt16)(long)aTextFlowLB.GetEntryData( nPos );
3236             bRet |= 0 != rSet.Put( SvxFrameDirectionItem(
3237                                     (SvxFrameDirection)nPos, RES_FRAMEDIR ));
3238         }
3239     }
3240     if(pWrtSh)
3241     {
3242         const SwFrmFmt* pFmt = pWrtSh->GetFlyFrmFmt();
3243         if (pFmt)
3244         {
3245             String sCurrentPrevChain, sCurrentNextChain;
3246             if(aPrevLB.GetSelectEntryPos())
3247                 sCurrentPrevChain = aPrevLB.GetSelectEntry();
3248             if(aNextLB.GetSelectEntryPos())
3249                 sCurrentNextChain = aNextLB.GetSelectEntry();
3250             const SwFmtChain &rChain = pFmt->GetChain();
3251             const SwFlyFrmFmt* pFlyFmt;
3252             String sNextChain, sPrevChain;
3253             if ((pFlyFmt = rChain.GetPrev()) != 0)
3254                 sPrevChain = pFlyFmt->GetName();
3255 
3256             if ((pFlyFmt = rChain.GetNext()) != 0)
3257                 sNextChain = pFlyFmt->GetName();
3258             if(sPrevChain != sCurrentPrevChain)
3259                 bRet |= 0 != rSet.Put(SfxStringItem(FN_PARAM_CHAIN_PREVIOUS, sCurrentPrevChain));
3260             if(sNextChain != sCurrentNextChain)
3261                 bRet |= 0 != rSet.Put(SfxStringItem(FN_PARAM_CHAIN_NEXT, sCurrentNextChain));
3262         }
3263     }
3264     return bRet;
3265 }
3266 
3267 /*-----------------13.11.96 15.05-------------------
3268 
3269 --------------------------------------------------*/
3270 
3271 sal_uInt16* SwFrmAddPage::GetRanges()
3272 {
3273     return aAddPgRg;
3274 }
3275 
3276 /*-----------------13.11.96 16.12-------------------
3277 
3278 --------------------------------------------------*/
3279 
3280 IMPL_LINK(SwFrmAddPage, EditModifyHdl, Edit*, EMPTYARG)
3281 {
3282     sal_Bool bEnable = 0 != aNameED.GetText().Len();
3283     aAltNameED.Enable(bEnable);
3284     aAltNameFT.Enable(bEnable);
3285 
3286     return 0;
3287 }
3288 //-----------------------------------------------------------------------------
3289 void    SwFrmAddPage::SetFormatUsed(sal_Bool bFmt)
3290 {
3291     bFormat  = bFmt;
3292     if(bFormat)
3293     {
3294         aNameFT.Show(sal_False);
3295         aNameED.Show(sal_False);
3296         aAltNameFT.Show(sal_False);
3297         aAltNameED.Show(sal_False);
3298         aPrevFT.Show(sal_False);
3299         aPrevLB.Show(sal_False);
3300         aNextFT.Show(sal_False);
3301         aNextLB.Show(sal_False);
3302         aNamesFL.Show(sal_False);
3303 
3304         sal_Int32 nDiff = aExtFL.GetPosPixel().Y() - aNamesFL.GetPosPixel().Y();
3305         Window* aWindows[] =
3306         {
3307             &aProtectContentCB,
3308             &aProtectFrameCB,
3309             &aProtectSizeCB,
3310             &aProtectFL,
3311             &aEditInReadonlyCB,
3312             &aPrintFrameCB,
3313             &aExtFL,
3314             &aTextFlowFT,
3315             &aTextFlowLB,
3316             0
3317         };
3318         sal_Int32 nIdx = 0;
3319         while(aWindows[nIdx])
3320             lcl_Move(*aWindows[nIdx++], nDiff);
3321     }
3322 }
3323 /* -----------------------------08.08.2002 16:24------------------------------
3324 
3325  ---------------------------------------------------------------------------*/
3326 IMPL_LINK(SwFrmAddPage, ChainModifyHdl, ListBox*, pBox)
3327 {
3328     String sCurrentPrevChain, sCurrentNextChain;
3329     if(aPrevLB.GetSelectEntryPos())
3330         sCurrentPrevChain = aPrevLB.GetSelectEntry();
3331     if(aNextLB.GetSelectEntryPos())
3332         sCurrentNextChain = aNextLB.GetSelectEntry();
3333     SwFrmFmt* pFmt = pWrtSh->GetFlyFrmFmt();
3334     if (pFmt)
3335     {
3336         sal_Bool bNextBox = &aNextLB == pBox;
3337         ListBox& rChangeLB = bNextBox ? aPrevLB : aNextLB;
3338         for(sal_uInt16 nEntry = rChangeLB.GetEntryCount(); nEntry > 1; nEntry--)
3339             rChangeLB.RemoveEntry(nEntry - 1);
3340         //determine chainable frames
3341         ::std::vector< String > aPrevPageFrames;
3342         ::std::vector< String > aThisPageFrames;
3343         ::std::vector< String > aNextPageFrames;
3344         ::std::vector< String > aRemainFrames;
3345         pWrtSh->GetConnectableFrmFmts(*pFmt, bNextBox ? sCurrentNextChain : sCurrentPrevChain, !bNextBox,
3346                         aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames );
3347         lcl_InsertVectors(rChangeLB,
3348                 aPrevPageFrames, aThisPageFrames, aNextPageFrames, aRemainFrames);
3349         String sToSelect = bNextBox ? sCurrentPrevChain : sCurrentNextChain;
3350         if(rChangeLB.GetEntryPos(sToSelect) != LISTBOX_ENTRY_NOTFOUND)
3351             rChangeLB.SelectEntry(sToSelect);
3352         else
3353             rChangeLB.SelectEntryPos(0);
3354 
3355     }
3356     return 0;
3357 }
3358