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
27 #ifdef SW_DLLIMPLEMENTATION
28 #undef SW_DLLIMPLEMENTATION
29 #endif
30
31
32
33 #ifndef _CMDID_H
34 #include <cmdid.h>
35 #endif
36 #include <hintids.hxx>
37 #include <tools/ref.hxx>
38 #ifndef _SVX_DIALOGS_HRC
39 #include <svx/dialogs.hrc>
40 #endif
41 #include <vcl/field.hxx>
42 #include <vcl/svapp.hxx>
43 #include <unotools/localedatawrapper.hxx>
44 #include <unotools/syslocale.hxx>
45 #include <editeng/sizeitem.hxx>
46 #include <svx/pageitem.hxx>
47 #include <svl/eitem.hxx>
48 #include <editeng/ulspitem.hxx>
49 #include <uitool.hxx>
50 #include <pagedesc.hxx>
51 #include <pgfnote.hxx>
52 #include <uiitems.hxx>
53
54 #ifndef _GLOBALS_HRC
55 #include <globals.hrc>
56 #endif
57 #ifndef _MISC_HRC
58 #include <misc.hrc>
59 #endif
60 #ifndef _PGFNOTE_HRC
61 #include <pgfnote.hrc>
62 #endif
63
64 #define TWIP_TO_LBOX 5
65 /*-----------------------------------------------------#---------------
66 Beschreibung: vordefinierte Linien in Point
67 --------------------------------------------------------------------*/
68
69 static const sal_uInt16 __FAR_DATA nLines[] = {
70 0,
71 50,
72 100,
73 150,
74 200,
75 500
76 };
77
78 static const sal_uInt16 nLineCount = sizeof(nLines) / sizeof(nLines[0]);
79
80 static sal_uInt16 __FAR_DATA aPageRg[] = {
81 FN_PARAM_FTN_INFO, FN_PARAM_FTN_INFO,
82 0
83 };
84
85
86 /*------------------------------------------------------------------------
87 Beschreibung: liefert zurueck, ob die Linienbreite nWidth bereits
88 in der Listbox enthalten ist.
89 ------------------------------------------------------------------------*/
90
91
lcl_HasLineWidth(sal_uInt16 nWidth)92 sal_Bool lcl_HasLineWidth(sal_uInt16 nWidth)
93 {
94 for(sal_uInt16 i = 0; i < nLineCount; ++i) {
95 if(nLines[i] == nWidth)
96 return sal_True;
97 }
98 return sal_False;
99 }
100
101 /*------------------------------------------------------------------------
102 Beschreibung: Handler fuer umschalten zwischen den unterschiedlichen
103 Arten, wie die Hoehe des Fussnotenbereiches angegeben
104 werden kann.
105 ------------------------------------------------------------------------*/
106
107
IMPL_LINK_INLINE_START(SwFootNotePage,HeightPage,Button *,EMPTYARG)108 IMPL_LINK_INLINE_START( SwFootNotePage, HeightPage, Button *, EMPTYARG )
109 {
110 aMaxHeightEdit.Enable(sal_False);
111 return 0;
112 }
IMPL_LINK_INLINE_END(SwFootNotePage,HeightPage,Button *,EMPTYARG)113 IMPL_LINK_INLINE_END( SwFootNotePage, HeightPage, Button *, EMPTYARG )
114
115
116 IMPL_LINK_INLINE_START( SwFootNotePage, HeightMetric, Button *, EMPTYARG )
117 {
118 aMaxHeightEdit.Enable();
119 aMaxHeightEdit.GrabFocus();
120 return 0;
121 }
IMPL_LINK_INLINE_END(SwFootNotePage,HeightMetric,Button *,EMPTYARG)122 IMPL_LINK_INLINE_END( SwFootNotePage, HeightMetric, Button *, EMPTYARG )
123
124 /*------------------------------------------------------------------------
125 Beschreibung: Handler Grenzwerte
126 ------------------------------------------------------------------------*/
127
128
129 IMPL_LINK( SwFootNotePage, HeightModify, MetricField *, EMPTYARG )
130 {
131 aMaxHeightEdit.SetMax(aMaxHeightEdit.Normalize(lMaxHeight -
132 (aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)) +
133 aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)))),
134 FUNIT_TWIP);
135 if(aMaxHeightEdit.GetValue() < 0)
136 aMaxHeightEdit.SetValue(0);
137 aDistEdit.SetMax(aDistEdit.Normalize(lMaxHeight -
138 (aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)) +
139 aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)))),
140 FUNIT_TWIP);
141 if(aDistEdit.GetValue() < 0)
142 aDistEdit.SetValue(0);
143 aLineDistEdit.SetMax(aLineDistEdit.Normalize(lMaxHeight -
144 (aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)) +
145 aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)))),
146 FUNIT_TWIP);
147 return 0;
148 }
149
150 // CTOR / DTOR -----------------------------------------------------------
151
SwFootNotePage(Window * pParent,const SfxItemSet & rSet)152 SwFootNotePage::SwFootNotePage(Window *pParent, const SfxItemSet &rSet) :
153
154 SfxTabPage(pParent, SW_RES(TP_FOOTNOTE_PAGE), rSet),
155 aPosHeader(this, SW_RES(FL_FOOTNOTE_SIZE)),
156 aMaxHeightPageBtn(this, SW_RES(RB_MAXHEIGHT_PAGE)),
157 aMaxHeightBtn(this, SW_RES(RB_MAXHEIGHT)),
158 aMaxHeightEdit(this, SW_RES(ED_MAXHEIGHT)),
159 aDistLbl(this, SW_RES(FT_DIST)),
160 aDistEdit(this, SW_RES(ED_DIST)),
161
162 aLineHeader(this, SW_RES(FL_LINE)),
163 aLinePosLbl(this, SW_RES(FT_LINEPOS)),
164 aLinePosBox(this, SW_RES(DLB_LINEPOS)),
165 aLineTypeLbl(this, SW_RES(FT_LINETYPE)),
166 aLineTypeBox(this, SW_RES(DLB_LINETYPE)),
167 aLineWidthLbl(this, SW_RES(FT_LINEWIDTH)),
168 aLineWidthEdit(this, SW_RES(ED_LINEWIDTH)),
169 aLineDistLbl(this, SW_RES(FT_LINEDIST)),
170 aLineDistEdit(this, SW_RES(ED_LINEDIST))
171 {
172 FreeResource();
173
174 SetExchangeSupport();
175 FieldUnit aMetric = ::GetDfltMetric(sal_False);
176 SetMetric( aMaxHeightEdit, aMetric );
177 SetMetric( aDistEdit, aMetric );
178 SetMetric( aLineDistEdit, aMetric );
179 MeasurementSystem eSys = SvtSysLocale().GetLocaleData().getMeasurementSystemEnum();
180 long nHeightValue = MEASURE_METRIC != eSys ? 1440 : 1134;
181 aMaxHeightEdit.SetValue(aMaxHeightEdit.Normalize(nHeightValue),FUNIT_TWIP);;
182 aMaxHeightEdit.SetAccessibleRelationLabeledBy(&aMaxHeightBtn);
183 }
184
~SwFootNotePage()185 SwFootNotePage::~SwFootNotePage()
186 {
187 }
188
189
Create(Window * pParent,const SfxItemSet & rSet)190 SfxTabPage* SwFootNotePage::Create(Window *pParent, const SfxItemSet &rSet)
191 {
192 return new SwFootNotePage(pParent, rSet);
193 }
194
195
196 /*--------------------------------------------------------------------
197 Beschreibung:
198 --------------------------------------------------------------------*/
199
200
Reset(const SfxItemSet & rSet)201 void SwFootNotePage::Reset(const SfxItemSet &rSet)
202 {
203 // Falls noch kein Bsp vorhanden Init hier sonst im Activate
204 //
205 SwPageFtnInfo* pDefFtnInfo = 0;
206 const SwPageFtnInfo* pFtnInfo;
207 const SfxPoolItem* pItem = SfxTabPage::GetItem(rSet, FN_PARAM_FTN_INFO);
208 if( pItem )
209 {
210 pFtnInfo = &((const SwPageFtnInfoItem*)pItem)->GetPageFtnInfo();
211 }
212 else
213 {
214 // wenn "Standard" betaetigt wird, wird das Fussnotenitem geloescht,
215 // deswegen muss hier eine Fussnotenstruktur erzeugt werden
216 pDefFtnInfo = new SwPageFtnInfo();
217 pFtnInfo = pDefFtnInfo;
218 }
219 // Hoehe Fussnotenbereich
220 SwTwips lHeight = pFtnInfo->GetHeight();
221 if(lHeight)
222 {
223 aMaxHeightEdit.SetValue(aMaxHeightEdit.Normalize(lHeight),FUNIT_TWIP);
224 aMaxHeightBtn.Check(sal_True);
225 }
226 else
227 {
228 aMaxHeightPageBtn.Check(sal_True);
229 aMaxHeightEdit.Enable(sal_False);
230 }
231 aMaxHeightPageBtn.SetClickHdl(LINK(this,SwFootNotePage,HeightPage));
232 aMaxHeightBtn.SetClickHdl(LINK(this,SwFootNotePage,HeightMetric));
233 Link aLk = LINK(this, SwFootNotePage, HeightModify);
234 aMaxHeightEdit.SetLoseFocusHdl( aLk );
235 aDistEdit.SetLoseFocusHdl( aLk );
236 aLineDistEdit.SetLoseFocusHdl( aLk );
237
238 // Trennlinie
239 for(sal_uInt16 i = 0; i < nLineCount; ++i)
240 aLineTypeBox.InsertEntry(nLines[i]);
241
242 const sal_uInt16 nWidth = (sal_uInt16)pFtnInfo->GetLineWidth() * TWIP_TO_LBOX;
243 if ( !lcl_HasLineWidth(nWidth) )
244 aLineTypeBox.InsertEntry(nWidth);
245 aLineTypeBox.SelectEntry(nWidth);
246
247 // Position
248 aLinePosBox.SelectEntryPos( static_cast< sal_uInt16 >(pFtnInfo->GetAdj()) );
249
250 // Breite
251 Fraction aTmp( 100, 1 );
252 aTmp *= pFtnInfo->GetWidth();
253 aLineWidthEdit.SetValue( static_cast<long>(aTmp) );
254
255 // Abstand Fussnotenbereich
256 aDistEdit.SetValue(aDistEdit.Normalize(pFtnInfo->GetTopDist()),FUNIT_TWIP);
257 aLineDistEdit.SetValue(
258 aLineDistEdit.Normalize(pFtnInfo->GetBottomDist()), FUNIT_TWIP);
259 ActivatePage( rSet );
260 delete pDefFtnInfo;
261 }
262
263 /*--------------------------------------------------------------------
264 Beschreibung: Attribute in den Set stopfen bei OK
265 --------------------------------------------------------------------*/
266
267
FillItemSet(SfxItemSet & rSet)268 sal_Bool SwFootNotePage::FillItemSet(SfxItemSet &rSet)
269 {
270 SwPageFtnInfoItem aItem((const SwPageFtnInfoItem&)GetItemSet().Get(FN_PARAM_FTN_INFO));
271
272 // Das ist das Original
273 SwPageFtnInfo &rFtnInfo = aItem.GetPageFtnInfo();
274
275 // Hoehe Fussnotenbereich
276 if(aMaxHeightBtn.IsChecked())
277 rFtnInfo.SetHeight( static_cast< SwTwips >(
278 aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP))));
279 else
280 rFtnInfo.SetHeight(0);
281
282 // Abstand Fussnotenbereich
283 rFtnInfo.SetTopDist( static_cast< SwTwips >(
284 aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP))));
285 rFtnInfo.SetBottomDist( static_cast< SwTwips >(
286 aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP))));
287
288 // Trennlinie
289 const sal_uInt16 nPos = aLineTypeBox.GetSelectEntryPos();
290 if( LISTBOX_ENTRY_NOTFOUND != nPos )
291 rFtnInfo.SetLineWidth(nLines[nPos] / TWIP_TO_LBOX);
292
293 // Position
294 rFtnInfo.SetAdj((SwFtnAdj)aLinePosBox.GetSelectEntryPos());
295
296 // Breite
297 rFtnInfo.SetWidth(Fraction( static_cast< long >(aLineWidthEdit.GetValue()), 100));
298
299 const SfxPoolItem* pOldItem;
300 if(0 == (pOldItem = GetOldItem( rSet, FN_PARAM_FTN_INFO )) ||
301 aItem != *pOldItem )
302 rSet.Put(aItem);
303
304 return sal_True;
305 }
306
ActivatePage(const SfxItemSet & rSet)307 void SwFootNotePage::ActivatePage(const SfxItemSet& rSet)
308 {
309 const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get( RES_FRM_SIZE );
310 lMaxHeight = rSize.GetSize().Height();
311
312 const SfxPoolItem* pItem;
313 if( SFX_ITEM_SET == rSet.GetItemState( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_HEADERSET), sal_False, &pItem ) )
314 {
315 const SfxItemSet& rHeaderSet = ((SvxSetItem*)pItem)->GetItemSet();
316 const SfxBoolItem& rHeaderOn =
317 (const SfxBoolItem&)rHeaderSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_ON ) );
318
319 if ( rHeaderOn.GetValue() )
320 {
321 const SvxSizeItem& rSizeItem =
322 (const SvxSizeItem&)rHeaderSet.Get(rSet.GetPool()->GetWhich(SID_ATTR_PAGE_SIZE));
323 lMaxHeight -= rSizeItem.GetSize().Height();
324 }
325 }
326
327 if( SFX_ITEM_SET == rSet.GetItemState( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_FOOTERSET),
328 sal_False, &pItem ) )
329 {
330 const SfxItemSet& rFooterSet = ((SvxSetItem*)pItem)->GetItemSet();
331 const SfxBoolItem& rFooterOn =
332 (const SfxBoolItem&)rFooterSet.Get( SID_ATTR_PAGE_ON );
333
334 if ( rFooterOn.GetValue() )
335 {
336 const SvxSizeItem& rSizeItem =
337 (const SvxSizeItem&)rFooterSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_SIZE ) );
338 lMaxHeight -= rSizeItem.GetSize().Height();
339 }
340 }
341
342 if ( rSet.GetItemState( RES_UL_SPACE , sal_False ) == SFX_ITEM_SET )
343 {
344 const SvxULSpaceItem &rUL = (const SvxULSpaceItem&)rSet.Get( RES_UL_SPACE );
345 lMaxHeight -= rUL.GetUpper() + rUL.GetLower();
346 }
347
348 lMaxHeight *= 8;
349 lMaxHeight /= 10;
350
351 // Maximalwerte setzen
352 HeightModify(0);
353 }
354
DeactivatePage(SfxItemSet * _pSet)355 int SwFootNotePage::DeactivatePage( SfxItemSet* _pSet)
356 {
357 if(_pSet)
358 FillItemSet(*_pSet);
359
360 return sal_True;
361 }
362
GetRanges()363 sal_uInt16* SwFootNotePage::GetRanges()
364 {
365 return aPageRg;
366 }
367
368
369
370