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 "LineWidthControl.hxx" 23 #include "LinePropertyPanel.hrc" 24 #include "LinePropertyPanel.hxx" 25 26 #include <svx/dialogs.hrc> 27 #include <svx/dialmgr.hxx> 28 #include <sfx2/sidebar/ResourceDefinitions.hrc> 29 #include <comphelper/processfactory.hxx> 30 #include <vcl/svapp.hxx> 31 #include <unotools/viewoptions.hxx> 32 #include <svx/xlnwtit.hxx> 33 #include <sfx2/bindings.hxx> 34 #include <sfx2/dispatch.hxx> 35 #include "svx/sidebar/PopupContainer.hxx" 36 37 38 namespace svx { namespace sidebar { 39 40 LineWidthControl::LineWidthControl ( 41 Window* pParent, 42 LinePropertyPanel& rPanel) 43 : svx::sidebar::PopupControl(pParent,SVX_RES(RID_POPUPPANEL_LINEPAGE_WIDTH)), 44 mrLinePropertyPanel(rPanel), 45 mpBindings(NULL), 46 maVSWidth( this, SVX_RES(VS_WIDTH)), 47 maFTCus( this, SVX_RES(FT_CUSTOME)), 48 maFTWidth( this, SVX_RES(FT_LINE_WIDTH)), 49 maMFWidth( this, SVX_RES(MF_WIDTH)), 50 meMapUnit(SFX_MAPUNIT_TWIP), 51 rStr(NULL), 52 mstrPT(SVX_RES(STR_PT)), 53 mnCustomWidth(0), 54 mbCustom(false), 55 mbColseByEdit(false), 56 mnTmpCusomWidth(0), 57 mbVSFocus(true), 58 maIMGCus(SVX_RES(IMG_WIDTH_CUSTOM)), 59 maIMGCusGray(SVX_RES(IMG_WIDTH_CUSTOM_GRAY)) 60 { 61 Initialize(); 62 FreeResource(); 63 mpBindings = mrLinePropertyPanel.GetBindings(); 64 } 65 66 67 68 69 LineWidthControl::~LineWidthControl (void) 70 { 71 delete[] rStr; 72 } 73 74 75 76 77 void LineWidthControl::Paint(const Rectangle& rect) 78 { 79 svx::sidebar::PopupControl::Paint(rect); 80 81 Color aOldLineColor = GetLineColor(); 82 Color aOldFillColor = GetFillColor(); 83 84 Point aPos( LogicToPixel( Point( CUSTOM_X, CUSTOM_Y), MAP_APPFONT )); 85 Size aSize( LogicToPixel( Size( CUSTOM_W, CUSTOM_H ), MAP_APPFONT )); 86 Rectangle aRect( aPos, aSize ); 87 aRect.Left() -= 1; 88 aRect.Top() -= 1; 89 aRect.Right() += 1; 90 aRect.Bottom() += 1; 91 92 Color aLineColor(189,201,219); 93 if(!GetSettings().GetStyleSettings().GetHighContrastMode()) 94 SetLineColor(aLineColor); 95 else 96 SetLineColor(GetSettings().GetStyleSettings().GetShadowColor()); 97 SetFillColor(COL_TRANSPARENT); 98 DrawRect(aRect); 99 100 SetLineColor(aOldLineColor); 101 SetFillColor(aOldFillColor); 102 } 103 104 105 106 107 void LineWidthControl::Initialize() 108 { 109 maVSWidth.SetStyle( maVSWidth.GetStyle()| WB_3DLOOK | WB_NO_DIRECTSELECT );// WB_NAMEFIELD | WB_ITEMBORDER |WB_DOUBLEBORDER | WB_NONEFIELD | 110 //for high contract wj 111 if(GetSettings().GetStyleSettings().GetHighContrastMode()) 112 { 113 maVSWidth.SetColor(GetSettings().GetStyleSettings().GetMenuColor()); 114 // maBorder.SetBackground(GetSettings().GetStyleSettings().GetMenuColor()); 115 maFTWidth.SetBackground(GetSettings().GetStyleSettings().GetMenuColor()); 116 } 117 else 118 { 119 maVSWidth.SetColor(COL_WHITE); 120 // maBorder.SetBackground(Wallpaper(COL_WHITE)); 121 maFTWidth.SetBackground(Wallpaper(COL_WHITE)); 122 } 123 124 sal_Int64 nFirst= maMFWidth.Denormalize( maMFWidth.GetFirst( FUNIT_TWIP ) ); 125 sal_Int64 nLast = maMFWidth.Denormalize( maMFWidth.GetLast( FUNIT_TWIP ) ); 126 sal_Int64 nMin = maMFWidth.Denormalize( maMFWidth.GetMin( FUNIT_TWIP ) ); 127 sal_Int64 nMax = maMFWidth.Denormalize( maMFWidth.GetMax( FUNIT_TWIP ) ); 128 maMFWidth.SetSpinSize( 10 ); 129 maMFWidth.SetUnit( FUNIT_POINT ); 130 if( maMFWidth.GetDecimalDigits() > 1 ) 131 maMFWidth.SetDecimalDigits( 1 ); 132 maMFWidth.SetFirst( maMFWidth.Normalize( nFirst ), FUNIT_TWIP ); 133 maMFWidth.SetLast( maMFWidth.Normalize( nLast ), FUNIT_TWIP ); 134 maMFWidth.SetMin( maMFWidth.Normalize( nMin ), FUNIT_TWIP ); 135 maMFWidth.SetMax( maMFWidth.Normalize( nMax ), FUNIT_TWIP ); 136 137 rStr = new XubString[9]; 138 //modify, 139 rStr[0] = String("05", 2, RTL_TEXTENCODING_ASCII_US); 140 rStr[1] = String("08", 2, RTL_TEXTENCODING_ASCII_US); 141 rStr[2] = String("10", 2, RTL_TEXTENCODING_ASCII_US); 142 rStr[3] = String("15", 2, RTL_TEXTENCODING_ASCII_US); 143 rStr[4] = String("23", 2, RTL_TEXTENCODING_ASCII_US); 144 rStr[5] = String("30", 2, RTL_TEXTENCODING_ASCII_US); 145 rStr[6] = String("45", 2, RTL_TEXTENCODING_ASCII_US); 146 rStr[7] = String("60", 2, RTL_TEXTENCODING_ASCII_US); 147 rStr[8] = String( SVX_RES(STR_WIDTH_LAST_CUSTOM) ); 148 149 LocaleDataWrapper aLocaleWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() ); 150 const sal_Unicode cSep = aLocaleWrapper.getNumDecimalSep().GetChar(0); 151 152 for(int i = 0; i <= 7 ; i++) 153 { 154 rStr[i] = rStr[i].Insert(cSep, 1);//Modify 155 rStr[i].Append(mstrPT); 156 } 157 //end 158 159 for(sal_uInt16 i = 1 ; i <= 9 ; i++) 160 { 161 maVSWidth.InsertItem(i); 162 maVSWidth.SetItemText(i, rStr[i-1]); 163 } 164 maVSWidth.SetUnit(rStr); 165 maVSWidth.SetItemData(1,(void*)5); 166 maVSWidth.SetItemData(2,(void*)8); 167 maVSWidth.SetItemData(3,(void*)10); 168 maVSWidth.SetItemData(4,(void*)15); 169 maVSWidth.SetItemData(5,(void*)23); 170 maVSWidth.SetItemData(6,(void*)30); 171 maVSWidth.SetItemData(7,(void*)45); 172 maVSWidth.SetItemData(8,(void*)60); 173 maVSWidth.SetImage(maIMGCusGray); 174 175 maVSWidth.SetSelItem(0); 176 Link aLink = LINK( this, LineWidthControl, VSSelectHdl ) ; 177 maVSWidth.SetSelectHdl(aLink); 178 aLink = LINK(this, LineWidthControl, MFModifyHdl); 179 maMFWidth.SetModifyHdl(aLink); 180 181 maVSWidth.StartSelection(); 182 maVSWidth.Show(); 183 } 184 185 186 187 188 void LineWidthControl::GetFocus() 189 { 190 if(!mbVSFocus) 191 maMFWidth.GrabFocus(); 192 else 193 maVSWidth.GrabFocus(); 194 } 195 196 197 198 199 ValueSet& LineWidthControl::GetValueSet() 200 { 201 return maVSWidth; 202 } 203 204 205 206 207 void LineWidthControl::SetWidthSelect( long lValue, bool bValuable, SfxMapUnit eMapUnit) 208 { 209 mbVSFocus = true; 210 maVSWidth.SetSelItem(0); 211 mbColseByEdit = false; 212 meMapUnit = eMapUnit; 213 SvtViewOptions aWinOpt( E_WINDOW, SIDEBAR_LINE_WIDTH_GLOBAL_VALUE ); 214 if ( aWinOpt.Exists() ) 215 { 216 ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = aWinOpt.GetUserData(); 217 ::rtl::OUString aTmp; 218 if ( aSeq.getLength()) 219 aSeq[0].Value >>= aTmp; 220 221 String aWinData( aTmp ); 222 mnCustomWidth = aWinData.ToInt32(); 223 mbCustom = true; 224 maVSWidth.SetImage(maIMGCus); 225 maVSWidth.SetCusEnable(true); 226 227 String aStrTip( String::CreateFromDouble( (double)mnCustomWidth / 10)); 228 aStrTip.Append(mstrPT); // 229 maVSWidth.SetItemText(9, aStrTip); 230 } 231 else 232 { 233 mbCustom = false; 234 maVSWidth.SetImage(maIMGCusGray); 235 maVSWidth.SetCusEnable(false); 236 //modify 237 //String aStrTip(String(SVX_RES(STR_WIDTH_LAST_CUSTOM))); 238 //maVSWidth.SetItemText(9, aStrTip); 239 maVSWidth.SetItemText(9, rStr[8]); 240 } 241 242 if(bValuable) 243 { 244 sal_Int64 nVal = OutputDevice::LogicToLogic( lValue, (MapUnit)eMapUnit, MAP_100TH_MM ); 245 nVal = maMFWidth.Normalize( nVal ); 246 maMFWidth.SetValue( nVal, FUNIT_100TH_MM ); 247 } 248 else 249 { 250 maMFWidth.SetText( String() ); 251 } 252 253 MapUnit eOrgUnit = (MapUnit)eMapUnit; 254 MapUnit ePntUnit( MAP_TWIP ); 255 lValue = LogicToLogic( lValue , eOrgUnit, ePntUnit ); 256 257 XubString strCurrValue = maMFWidth.GetText(); 258 sal_uInt16 i = 0; 259 for(; i < 8; i++) 260 if(strCurrValue == rStr[i]) 261 { 262 maVSWidth.SetSelItem(i+1); 263 break; 264 } 265 if (i>=8) 266 { 267 mbVSFocus = false; 268 maVSWidth.SetSelItem(0); 269 } 270 maVSWidth.Format(); 271 maVSWidth.StartSelection(); 272 } 273 274 275 276 277 IMPL_LINK(LineWidthControl, VSSelectHdl, void *, pControl) 278 { 279 if(pControl == &maVSWidth) 280 { 281 sal_uInt16 iPos = maVSWidth.GetSelectItemId(); 282 if(iPos >= 1 && iPos <= 8) 283 { 284 long nVal = LogicToLogic((long)(unsigned long)maVSWidth.GetItemData( iPos ) , MAP_POINT, (MapUnit)meMapUnit); 285 nVal = maMFWidth.Denormalize(nVal); 286 XLineWidthItem aWidthItem( nVal ); 287 mpBindings->GetDispatcher()->Execute(SID_ATTR_LINE_WIDTH, SFX_CALLMODE_RECORD, &aWidthItem, 0L); 288 mrLinePropertyPanel.SetWidthIcon(iPos); 289 mrLinePropertyPanel.SetWidth(nVal); 290 mbColseByEdit = false; 291 mnTmpCusomWidth = 0; 292 } 293 else if(iPos == 9) 294 {//last custom 295 //modified 296 if(mbCustom) 297 { 298 long nVal = LogicToLogic(mnCustomWidth , MAP_POINT, (MapUnit)meMapUnit); 299 nVal = maMFWidth.Denormalize(nVal); 300 XLineWidthItem aWidthItem( nVal ); 301 mpBindings->GetDispatcher()->Execute(SID_ATTR_LINE_WIDTH, SFX_CALLMODE_RECORD, &aWidthItem, 0L); 302 mrLinePropertyPanel.SetWidth(nVal); 303 mbColseByEdit = false; 304 mnTmpCusomWidth = 0; 305 } 306 else 307 { 308 maVSWidth.SetNoSelection(); //add , set no selection and keep the last select item 309 maVSWidth.Format(); 310 Invalidate(); 311 maVSWidth.StartSelection(); 312 } 313 //modify end 314 } 315 if((iPos >= 1 && iPos <= 8) || (iPos == 9 && mbCustom)) //add 316 mrLinePropertyPanel.EndLineWidthPopupMode(); 317 } 318 return( 0L ); 319 } 320 321 322 323 324 IMPL_LINK(LineWidthControl, MFModifyHdl, void *, pControl) 325 { 326 if(pControl == &maMFWidth) 327 { 328 if(maVSWidth.GetSelItem()) 329 { 330 maVSWidth.SetSelItem(0); 331 maVSWidth.Format(); 332 Invalidate(); 333 maVSWidth.StartSelection(); 334 } 335 long nTmp = static_cast<long>(maMFWidth.GetValue()); 336 long nVal = LogicToLogic( nTmp, MAP_POINT, (MapUnit)meMapUnit ); 337 sal_Int32 nNewWidth = (short)maMFWidth.Denormalize( nVal ); 338 XLineWidthItem aWidthItem(nNewWidth); 339 mpBindings->GetDispatcher()->Execute(SID_ATTR_LINE_WIDTH, SFX_CALLMODE_RECORD, &aWidthItem, 0L); 340 341 mbColseByEdit = true; 342 mnTmpCusomWidth = nTmp; 343 /*for(sal_uInt16 i = 0; i < 8; i++) 344 { 345 if(nTmp == (sal_Int32)maVSWidth.GetItemData(i)) 346 { 347 mbColseByEdit = false; 348 break; 349 } 350 }*/ 351 352 } 353 return( 0L ); 354 } 355 356 357 358 359 bool LineWidthControl::IsCloseByEdit() 360 { 361 return mbColseByEdit; 362 } 363 364 365 366 367 long LineWidthControl::GetTmpCustomWidth() 368 { 369 return mnTmpCusomWidth; 370 } 371 372 373 374 } } // end of namespace svx::sidebar 375 376 // eof 377