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