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 #include "precompiled_sw.hxx"
23 
24 #include "PageSizeControl.hxx"
25 #include "PagePropertyPanel.hxx"
26 #include "PagePropertyPanel.hrc"
27 
28 #include <cmdid.h>
29 #include <swtypes.hxx>
30 
31 #include <svx/sidebar/ValueSetWithTextControl.hxx>
32 
33 #include <tools/inetmime.hxx>
34 #include <editeng/paperinf.hxx>
35 #include <sfx2/bindings.hxx>
36 #include <sfx2/dispatch.hxx>
37 
38 
39 namespace sw { namespace sidebar {
40 
41 PageSizeControl::PageSizeControl(
42     Window* pParent,
43     PagePropertyPanel& rPanel,
44     const Paper ePaper,
45     const sal_Bool bLandscape,
46     const FieldUnit eFUnit )
47     : ::svx::sidebar::PopupControl( pParent, SW_RES(RID_POPUP_SWPAGE_SIZE) )
48     , mpSizeValueSet( new ::svx::sidebar::ValueSetWithTextControl( ::svx::sidebar::ValueSetWithTextControl::TEXT_TEXT, this, SW_RES(VS_SIZE) ) )
49     , maMoreButton( this, SW_RES(CB_SIZE_MORE) )
50     , maWidthHeightField( this, SW_RES(FLD_WIDTH_HEIGHT) )
51     , mePaper( ePaper )
52     , maPaperList()
53     , mrPagePropPanel(rPanel)
54 {
55     maWidthHeightField.Hide();
56     SetFieldUnit( maWidthHeightField, eFUnit );
57 
58     maPaperList.push_back( PAPER_A3 );
59     maPaperList.push_back( PAPER_A4 );
60     maPaperList.push_back( PAPER_A5 );
61     maPaperList.push_back( PAPER_B4_ISO );
62     maPaperList.push_back( PAPER_B5_ISO );
63     maPaperList.push_back( PAPER_ENV_C5 );
64     maPaperList.push_back( PAPER_LETTER );
65     maPaperList.push_back( PAPER_LEGAL );
66 
67     mpSizeValueSet->SetStyle( mpSizeValueSet->GetStyle() | WB_3DLOOK | WB_NO_DIRECTSELECT );
68     mpSizeValueSet->SetColor( GetSettings().GetStyleSettings().GetMenuColor() );
69 
70     sal_uInt16 nSelectedItem = 0;
71     {
72         XubString aMetricStr;
73         {
74             const XubString aText = maWidthHeightField.GetText();
75             for (short i = aText.Len() - 1; i >= 0; i--)
76             {
77                 xub_Unicode c = aText.GetChar(i);
78                 if ( INetMIME::isAlpha(c) || (c == '\'') || (c == '\"') || (c == '%') )
79                 {
80                     aMetricStr.Insert(c, 0);
81                 }
82                 else
83                 {
84                     if (aMetricStr.Len())
85                     {
86                         break;
87                     }
88                 }
89             }
90         }
91 
92         const LocaleDataWrapper& localeDataWrapper = maWidthHeightField.GetLocaleDataWrapper();
93         String WidthStr;
94         String HeightStr;
95         String ItemText2;
96         for ( ::std::vector< Paper >::size_type nPaperIdx = 0;
97               nPaperIdx < maPaperList.size();
98               ++nPaperIdx )
99         {
100             Size aPaperSize = SvxPaperInfo::GetPaperSize( maPaperList[ nPaperIdx ] );
101             if ( bLandscape )
102             {
103                 Swap( aPaperSize );
104             }
105             maWidthHeightField.SetValue( maWidthHeightField.Normalize( aPaperSize.Width() ), FUNIT_TWIP );
106             WidthStr = localeDataWrapper.getNum(
107                 maWidthHeightField.GetValue(),
108                 maWidthHeightField.GetDecimalDigits(),
109                 maWidthHeightField.IsUseThousandSep(),
110                 maWidthHeightField.IsShowTrailingZeros() );
111 
112             maWidthHeightField.SetValue( maWidthHeightField.Normalize( aPaperSize.Height() ), FUNIT_TWIP);
113             HeightStr = localeDataWrapper.getNum(
114                 maWidthHeightField.GetValue(),
115                 maWidthHeightField.GetDecimalDigits(),
116                 maWidthHeightField.IsUseThousandSep(),
117                 maWidthHeightField.IsShowTrailingZeros() );
118 
119             ItemText2 = HeightStr;
120             ItemText2 += String::CreateFromAscii(" x ");
121             ItemText2 += WidthStr;
122             ItemText2 += String::CreateFromAscii(" ");
123             ItemText2 += aMetricStr;
124 
125             mpSizeValueSet->AddItem(
126                 SvxPaperInfo::GetName( maPaperList[ nPaperIdx ] ),
127                 ItemText2,
128                 0 );
129 
130             if ( maPaperList[ nPaperIdx ] == mePaper )
131             {
132                 nSelectedItem = nPaperIdx + 1;
133             }
134         }
135     }
136 
137     mpSizeValueSet->SetNoSelection();
138     mpSizeValueSet->SetSelectHdl( LINK(this, PageSizeControl,ImplSizeHdl ) );
139     mpSizeValueSet->Show();
140 
141     mpSizeValueSet->SelectItem( nSelectedItem );
142     mpSizeValueSet->Format();
143     mpSizeValueSet->StartSelection();
144 
145     maMoreButton.SetClickHdl( LINK( this, PageSizeControl, MoreButtonClickHdl_Impl ) );
146     maMoreButton.GrabFocus();
147 
148     FreeResource();
149 }
150 
151 
152 PageSizeControl::~PageSizeControl(void)
153 {
154     delete mpSizeValueSet;
155 }
156 
157 
158 IMPL_LINK(PageSizeControl, ImplSizeHdl, void *, pControl)
159 {
160     mpSizeValueSet->SetNoSelection();
161     if ( pControl == mpSizeValueSet )
162     {
163         const sal_uInt16 nSelectedPaper = mpSizeValueSet->GetSelectItemId();
164         const Paper ePaper = maPaperList[nSelectedPaper - 1];
165         if ( ePaper != mePaper )
166         {
167             mePaper = ePaper;
168             mrPagePropPanel.ExecuteSizeChange( mePaper );
169         }
170     }
171 
172     mrPagePropPanel.ClosePageSizePopup();
173     return 0;
174 }
175 
176 IMPL_LINK(PageSizeControl, MoreButtonClickHdl_Impl, void *, EMPTYARG)
177 {
178     mrPagePropPanel.GetBindings()->GetDispatcher()->Execute( FN_FORMAT_PAGE_SETTING_DLG, SFX_CALLMODE_ASYNCHRON );
179 
180     mrPagePropPanel.ClosePageSizePopup();
181     return 0;
182 }
183 
184 
185 } } // end of namespace sw::sidebar
186 
187