1d4aefcaeSZheng Fan /************************************************************** 2d4aefcaeSZheng Fan * 3d4aefcaeSZheng Fan * Licensed to the Apache Software Foundation (ASF) under one 4d4aefcaeSZheng Fan * or more contributor license agreements. See the NOTICE file 5d4aefcaeSZheng Fan * distributed with this work for additional information 6d4aefcaeSZheng Fan * regarding copyright ownership. The ASF licenses this file 7d4aefcaeSZheng Fan * to you under the Apache License, Version 2.0 (the 8d4aefcaeSZheng Fan * "License"); you may not use this file except in compliance 9d4aefcaeSZheng Fan * with the License. You may obtain a copy of the License at 10d4aefcaeSZheng Fan * 11d4aefcaeSZheng Fan * http://www.apache.org/licenses/LICENSE-2.0 12d4aefcaeSZheng Fan * 13d4aefcaeSZheng Fan * Unless required by applicable law or agreed to in writing, 14d4aefcaeSZheng Fan * software distributed under the License is distributed on an 15d4aefcaeSZheng Fan * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16d4aefcaeSZheng Fan * KIND, either express or implied. See the License for the 17d4aefcaeSZheng Fan * specific language governing permissions and limitations 18d4aefcaeSZheng Fan * under the License. 19d4aefcaeSZheng Fan * 20d4aefcaeSZheng Fan *************************************************************/ 21d4aefcaeSZheng Fan 22d4aefcaeSZheng Fan #include "precompiled_svx.hxx" 23d4aefcaeSZheng Fan #include "TextUnderlineControl.hxx" 24d4aefcaeSZheng Fan #include "TextPropertyPanel.hrc" 25d4aefcaeSZheng Fan #include <sfx2/sidebar/propertypanel.hrc> 26d4aefcaeSZheng Fan #include <svx/dialogs.hrc> 27d4aefcaeSZheng Fan #include <svx/dialmgr.hxx> 28d4aefcaeSZheng Fan #include <unotools/viewoptions.hxx> 29d4aefcaeSZheng Fan #include <editeng/kernitem.hxx> 30d4aefcaeSZheng Fan #include <sfx2/bindings.hxx> 31d4aefcaeSZheng Fan #include <sfx2/dispatch.hxx> 32d4aefcaeSZheng Fan #include <sfx2/sidebar/Theme.hxx> 33d4aefcaeSZheng Fan #include <editeng/udlnitem.hxx> 34d4aefcaeSZheng Fan 35d4aefcaeSZheng Fan namespace svx { namespace sidebar { 36d4aefcaeSZheng Fan 37*45da7d5eSAndre Fischer TextUnderlineControl::TextUnderlineControl ( 38*45da7d5eSAndre Fischer Window* pParent, 39*45da7d5eSAndre Fischer svx::sidebar::TextPropertyPanel& rPanel, 40*45da7d5eSAndre Fischer SfxBindings* pBindings) 41d4aefcaeSZheng Fan : svx::sidebar::PopupControl( pParent,SVX_RES(RID_POPUPPANEL_TEXTPAGE_UNDERLINE)) 42d4aefcaeSZheng Fan , mrTextPropertyPanel(rPanel) 43*45da7d5eSAndre Fischer , mpBindings(pBindings) 44d4aefcaeSZheng Fan , maVSUnderline( this, SVX_RES(VS_UNDERLINE)) 45d4aefcaeSZheng Fan , maPBOptions (this, SVX_RES(PB_OPTIONS) ) 46d4aefcaeSZheng Fan 47d4aefcaeSZheng Fan , maIMGSingle (SVX_RES(IMG_SINGLE)) 48d4aefcaeSZheng Fan , maIMGDouble (SVX_RES(IMG_DOUBLE)) 49d4aefcaeSZheng Fan , maIMGBold (SVX_RES(IMG_BOLD2)) 50d4aefcaeSZheng Fan , maIMGDot (SVX_RES(IMG_DOT)) 51d4aefcaeSZheng Fan , maIMGDotBold (SVX_RES(IMG_DOT_BOLD)) 52d4aefcaeSZheng Fan , maIMGDash (SVX_RES(IMG_DASH)) 53d4aefcaeSZheng Fan , maIMGDashLong (SVX_RES(IMG_DASH_LONG)) 54d4aefcaeSZheng Fan , maIMGDashDot (SVX_RES(IMG_DASH_DOT)) 55d4aefcaeSZheng Fan , maIMGDashDotDot (SVX_RES(IMG_DASH_DOT_DOT)) 56d4aefcaeSZheng Fan , maIMGWave (SVX_RES(IMG_WAVE)) 57d4aefcaeSZheng Fan 58d4aefcaeSZheng Fan // high contrast 59d4aefcaeSZheng Fan , maIMGSingleH (SVX_RES(IMG_SINGLE_H)) 60d4aefcaeSZheng Fan , maIMGDoubleH (SVX_RES(IMG_DOUBLE_H)) 61d4aefcaeSZheng Fan , maIMGBoldH (SVX_RES(IMG_BOLD2_H)) 62d4aefcaeSZheng Fan , maIMGDotH (SVX_RES(IMG_DOT_H)) 63d4aefcaeSZheng Fan , maIMGDotBoldH (SVX_RES(IMG_DOT_BOLD_H)) 64d4aefcaeSZheng Fan , maIMGDashH (SVX_RES(IMG_DASH_H)) 65d4aefcaeSZheng Fan , maIMGDashLongH (SVX_RES(IMG_DASH_LONG_H)) 66d4aefcaeSZheng Fan , maIMGDashDotH (SVX_RES(IMG_DASH_DOT_H)) 67d4aefcaeSZheng Fan , maIMGDashDotDotH(SVX_RES(IMG_DASH_DOT_DOT_H)) 68d4aefcaeSZheng Fan , maIMGWaveH (SVX_RES(IMG_WAVE_H)) 69d4aefcaeSZheng Fan 70d4aefcaeSZheng Fan , maIMGSingleSel (SVX_RES(IMG_SINGLE_SEL)) 71d4aefcaeSZheng Fan , maIMGDoubleSel (SVX_RES(IMG_DOUBLE_SEL)) 72d4aefcaeSZheng Fan , maIMGBoldSel (SVX_RES(IMG_BOLD2_SEL)) 73d4aefcaeSZheng Fan , maIMGDotSel (SVX_RES(IMG_DOT_SEL)) 74d4aefcaeSZheng Fan , maIMGDotBoldSel (SVX_RES(IMG_DOT_BOLD_SEL)) 75d4aefcaeSZheng Fan , maIMGDashSel (SVX_RES(IMG_DASH_SEL)) 76d4aefcaeSZheng Fan , maIMGDashLongSel (SVX_RES(IMG_DASH_LONG_SEL)) 77d4aefcaeSZheng Fan , maIMGDashDotSel (SVX_RES(IMG_DASH_DOT_SEL)) 78d4aefcaeSZheng Fan , maIMGDashDotDotSel (SVX_RES(IMG_DASH_DOT_DOT_SEL)) 79d4aefcaeSZheng Fan , maIMGWaveSel (SVX_RES(IMG_WAVE_SEL)) 80d4aefcaeSZheng Fan 81d4aefcaeSZheng Fan { 82d4aefcaeSZheng Fan initial(); 83d4aefcaeSZheng Fan FreeResource(); 84d4aefcaeSZheng Fan } 85d4aefcaeSZheng Fan 86d4aefcaeSZheng Fan void TextUnderlineControl::initial() 87d4aefcaeSZheng Fan { 88d4aefcaeSZheng Fan /*maPBOptions.SetDefBkColor(GetSettings().GetStyleSettings().GetHighContrastMode()? 89d4aefcaeSZheng Fan GetSettings().GetStyleSettings().GetMenuColor(): 90d4aefcaeSZheng Fan sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_DropDownBackground ));//Color(244,245,249)//for high contract 91d4aefcaeSZheng Fan maPBOptions.SetHoverBkColor(GetSettings().GetStyleSettings().GetHighContrastMode()? 92d4aefcaeSZheng Fan GetSettings().GetStyleSettings().GetMenuColor(): 93d4aefcaeSZheng Fan sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground ) );//Color( 93, 120, 163 ) 94d4aefcaeSZheng Fan maPBOptions.SetHoverTxtColor( sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Color_PanelTitleFont ) );//Color( 255, 255, 255 ) 95d4aefcaeSZheng Fan maPBOptions.SetIcoPosX( 2);*/ 96d4aefcaeSZheng Fan maVSUnderline.SetColor(GetSettings().GetStyleSettings().GetHighContrastMode()? 97d4aefcaeSZheng Fan GetSettings().GetStyleSettings().GetMenuColor(): 98d4aefcaeSZheng Fan sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground )); 99d4aefcaeSZheng Fan maVSUnderline.SetBackground(GetSettings().GetStyleSettings().GetHighContrastMode()? 100d4aefcaeSZheng Fan GetSettings().GetStyleSettings().GetMenuColor(): 101d4aefcaeSZheng Fan sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Paint_PanelBackground )); 102d4aefcaeSZheng Fan 103d4aefcaeSZheng Fan Link aLink = LINK( this, TextUnderlineControl, PBClickHdl ) ; 104d4aefcaeSZheng Fan maPBOptions.SetClickHdl(aLink); 105d4aefcaeSZheng Fan 106d4aefcaeSZheng Fan maVSUnderline.SetStyle( maVSUnderline.GetStyle()| WB_3DLOOK | WB_NO_DIRECTSELECT );// WB_NAMEFIELD | WB_ITEMBORDER |WB_DOUBLEBORDER | WB_NONEFIELD | 107d4aefcaeSZheng Fan 108d4aefcaeSZheng Fan maVSUnderline.InsertItem(1, maIMGSingle ,String(SVX_RES(STR_SINGLE))); 109d4aefcaeSZheng Fan maVSUnderline.SetItemData(1, (void*)(sal_uInt64)UNDERLINE_SINGLE); 110d4aefcaeSZheng Fan 111d4aefcaeSZheng Fan maVSUnderline.InsertItem(2, maIMGDouble ,String(SVX_RES(STR_DOUBLE))); 112d4aefcaeSZheng Fan maVSUnderline.SetItemData(2, (void*)(sal_uInt64)UNDERLINE_DOUBLE); 113d4aefcaeSZheng Fan 114d4aefcaeSZheng Fan maVSUnderline.InsertItem(3, maIMGBold, String(SVX_RES(STR_BOLD))); 115d4aefcaeSZheng Fan maVSUnderline.SetItemData(3,(void*)(sal_uInt64)UNDERLINE_BOLD); 116d4aefcaeSZheng Fan 117d4aefcaeSZheng Fan maVSUnderline.InsertItem(4, maIMGDot, String(SVX_RES(STR_DOT))); 118d4aefcaeSZheng Fan maVSUnderline.SetItemData(4,(void*)(sal_uInt64)UNDERLINE_DOTTED); 119d4aefcaeSZheng Fan 120d4aefcaeSZheng Fan maVSUnderline.InsertItem(5, maIMGDotBold, String(SVX_RES(STR_DOT_BOLD))); 121d4aefcaeSZheng Fan maVSUnderline.SetItemData(5,(void*)(sal_uInt64)UNDERLINE_BOLDDOTTED); 122d4aefcaeSZheng Fan 123d4aefcaeSZheng Fan maVSUnderline.InsertItem(6, maIMGDash, String(SVX_RES(STR_DASH))); 124d4aefcaeSZheng Fan maVSUnderline.SetItemData(6,(void*)(sal_uInt64)UNDERLINE_DASH); 125d4aefcaeSZheng Fan 126d4aefcaeSZheng Fan maVSUnderline.InsertItem(7, maIMGDashLong,String(SVX_RES(STR_DASH_LONG))); 127d4aefcaeSZheng Fan maVSUnderline.SetItemData(7,(void*)(sal_uInt64)UNDERLINE_LONGDASH); 128d4aefcaeSZheng Fan 129d4aefcaeSZheng Fan maVSUnderline.InsertItem(8, maIMGDashDot, String(SVX_RES(STR_DASH_DOT))); 130d4aefcaeSZheng Fan maVSUnderline.SetItemData(8,(void*)(sal_uInt64)UNDERLINE_DASHDOT); 131d4aefcaeSZheng Fan 132d4aefcaeSZheng Fan maVSUnderline.InsertItem(9, maIMGDashDotDot, String(SVX_RES(STR_DASH_DOT_DOT))); 133d4aefcaeSZheng Fan maVSUnderline.SetItemData(9,(void*)(sal_uInt64)UNDERLINE_DASHDOTDOT); 134d4aefcaeSZheng Fan 135d4aefcaeSZheng Fan maVSUnderline.InsertItem(10, maIMGWave, String(SVX_RES(STR_WAVE))); 136d4aefcaeSZheng Fan maVSUnderline.SetItemData(10,(void*)(sal_uInt64)UNDERLINE_WAVE); 137d4aefcaeSZheng Fan 138d4aefcaeSZheng Fan maVSUnderline.SetColCount( 1 ); 139d4aefcaeSZheng Fan aLink = LINK( this, TextUnderlineControl, VSSelectHdl ) ; 140d4aefcaeSZheng Fan maVSUnderline.SetSelectHdl(aLink); 141d4aefcaeSZheng Fan 142d4aefcaeSZheng Fan maVSUnderline.StartSelection(); 143d4aefcaeSZheng Fan maVSUnderline.Show(); 144d4aefcaeSZheng Fan } 145d4aefcaeSZheng Fan 146d4aefcaeSZheng Fan void TextUnderlineControl::GetFocus() 147d4aefcaeSZheng Fan { 148d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 149d4aefcaeSZheng Fan } 150d4aefcaeSZheng Fan void TextUnderlineControl::Rearrange(FontUnderline eLine) 151d4aefcaeSZheng Fan { 152d4aefcaeSZheng Fan // high contrast 153d4aefcaeSZheng Fan maVSUnderline.SetItemImage(1, GetDisplayBackground().GetColor().IsDark()? maIMGSingleH :maIMGSingle); 154d4aefcaeSZheng Fan maVSUnderline.SetItemImage(2, GetDisplayBackground().GetColor().IsDark()? maIMGDoubleH : maIMGDouble ); 155d4aefcaeSZheng Fan maVSUnderline.SetItemImage(3, GetDisplayBackground().GetColor().IsDark()? maIMGBoldH : maIMGBold); 156d4aefcaeSZheng Fan maVSUnderline.SetItemImage(4, GetDisplayBackground().GetColor().IsDark()? maIMGDotH : maIMGDot); 157d4aefcaeSZheng Fan maVSUnderline.SetItemImage(5, GetDisplayBackground().GetColor().IsDark()? maIMGDotBoldH :maIMGDotBold); 158d4aefcaeSZheng Fan maVSUnderline.SetItemImage(6, GetDisplayBackground().GetColor().IsDark()? maIMGDashH :maIMGDash); 159d4aefcaeSZheng Fan maVSUnderline.SetItemImage(7, GetDisplayBackground().GetColor().IsDark()? maIMGDashLongH : maIMGDashLong); 160d4aefcaeSZheng Fan maVSUnderline.SetItemImage(8, GetDisplayBackground().GetColor().IsDark()? maIMGDashDotH : maIMGDashDot); 161d4aefcaeSZheng Fan maVSUnderline.SetItemImage(9, GetDisplayBackground().GetColor().IsDark()? maIMGDashDotDotH : maIMGDashDotDot); 162d4aefcaeSZheng Fan maVSUnderline.SetItemImage(10, GetDisplayBackground().GetColor().IsDark()? maIMGWaveH : maIMGWave); 163d4aefcaeSZheng Fan // maVSUnderline.SelectItem(0); //delete 164d4aefcaeSZheng Fan // maVSUnderline.SetNoSelection(); 165d4aefcaeSZheng Fan 166d4aefcaeSZheng Fan switch(eLine) 167d4aefcaeSZheng Fan { 168d4aefcaeSZheng Fan case UNDERLINE_SINGLE: 169d4aefcaeSZheng Fan maVSUnderline.SetItemImage(1, maIMGSingleSel); 170d4aefcaeSZheng Fan maVSUnderline.SelectItem(1); //add 171d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 172d4aefcaeSZheng Fan break; 173d4aefcaeSZheng Fan case UNDERLINE_DOUBLE: 174d4aefcaeSZheng Fan maVSUnderline.SetItemImage(2, maIMGDoubleSel); 175d4aefcaeSZheng Fan maVSUnderline.SelectItem(2); //add 176d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 177d4aefcaeSZheng Fan break; 178d4aefcaeSZheng Fan case UNDERLINE_BOLD: 179d4aefcaeSZheng Fan maVSUnderline.SetItemImage(3, maIMGBoldSel); 180d4aefcaeSZheng Fan maVSUnderline.SelectItem(3); //add 181d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 182d4aefcaeSZheng Fan break; 183d4aefcaeSZheng Fan case UNDERLINE_DOTTED: 184d4aefcaeSZheng Fan maVSUnderline.SetItemImage(4, maIMGDotSel); 185d4aefcaeSZheng Fan maVSUnderline.SelectItem(4); //add 186d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 187d4aefcaeSZheng Fan break; 188d4aefcaeSZheng Fan case UNDERLINE_BOLDDOTTED: 189d4aefcaeSZheng Fan maVSUnderline.SetItemImage(5, maIMGDotBoldSel); 190d4aefcaeSZheng Fan maVSUnderline.SelectItem(5); //add 191d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 192d4aefcaeSZheng Fan break; 193d4aefcaeSZheng Fan case UNDERLINE_DASH: 194d4aefcaeSZheng Fan maVSUnderline.SetItemImage(6, maIMGDashSel); 195d4aefcaeSZheng Fan maVSUnderline.SelectItem(6); //add 196d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 197d4aefcaeSZheng Fan break; 198d4aefcaeSZheng Fan case UNDERLINE_LONGDASH: 199d4aefcaeSZheng Fan maVSUnderline.SetItemImage(7, maIMGDashLongSel); 200d4aefcaeSZheng Fan maVSUnderline.SelectItem(7); //add 201d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 202d4aefcaeSZheng Fan break; 203d4aefcaeSZheng Fan case UNDERLINE_DASHDOT: 204d4aefcaeSZheng Fan maVSUnderline.SetItemImage(8, maIMGDashDotSel); 205d4aefcaeSZheng Fan maVSUnderline.SelectItem(8); //add 206d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 207d4aefcaeSZheng Fan break; 208d4aefcaeSZheng Fan case UNDERLINE_DASHDOTDOT: 209d4aefcaeSZheng Fan maVSUnderline.SetItemImage(9, maIMGDashDotDotSel); 210d4aefcaeSZheng Fan maVSUnderline.SelectItem(9); //add 211d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 212d4aefcaeSZheng Fan break; 213d4aefcaeSZheng Fan case UNDERLINE_WAVE: 214d4aefcaeSZheng Fan maVSUnderline.SetItemImage(10, maIMGWaveSel); 215d4aefcaeSZheng Fan maVSUnderline.SelectItem(10); //add 216d4aefcaeSZheng Fan maVSUnderline.GrabFocus(); 217d4aefcaeSZheng Fan break; 218d4aefcaeSZheng Fan case UNDERLINE_NONE: 219d4aefcaeSZheng Fan default: 220d4aefcaeSZheng Fan maVSUnderline.SelectItem(1); 221d4aefcaeSZheng Fan maVSUnderline.SetNoSelection();//add 222d4aefcaeSZheng Fan maPBOptions.GrabFocus(); 223d4aefcaeSZheng Fan } 224d4aefcaeSZheng Fan maVSUnderline.StartSelection(); 225d4aefcaeSZheng Fan //removed 226d4aefcaeSZheng Fan //if(mpPage->meContextType == PROPERTY_CONTEXT_SC_CELL) 227d4aefcaeSZheng Fan // maPBOptions.Disable(); 228d4aefcaeSZheng Fan //else 229d4aefcaeSZheng Fan // maPBOptions.Enable(); 230d4aefcaeSZheng Fan //removed end 231d4aefcaeSZheng Fan } 232d4aefcaeSZheng Fan ValueSet& TextUnderlineControl::GetValueSet() 233d4aefcaeSZheng Fan { 234d4aefcaeSZheng Fan return maVSUnderline; 235d4aefcaeSZheng Fan } 236d4aefcaeSZheng Fan Control& TextUnderlineControl::GetPB() 237d4aefcaeSZheng Fan { 238d4aefcaeSZheng Fan return maPBOptions; 239d4aefcaeSZheng Fan } 240d4aefcaeSZheng Fan IMPL_LINK(TextUnderlineControl, VSSelectHdl, void *, pControl) 241d4aefcaeSZheng Fan { 242d4aefcaeSZheng Fan if(pControl == &maVSUnderline) 243d4aefcaeSZheng Fan { 244d4aefcaeSZheng Fan sal_uInt16 iPos = maVSUnderline.GetSelectItemId(); 245d4aefcaeSZheng Fan FontUnderline eUnderline = (FontUnderline)(sal_uInt64)maVSUnderline.GetItemData( iPos ); 246d4aefcaeSZheng Fan 247d4aefcaeSZheng Fan //<<modified 248d4aefcaeSZheng Fan //SvxTextLineItem aLineItem(eUnderline, SID_ATTR_CHAR_UNDERLINE); 249d4aefcaeSZheng Fan SvxUnderlineItem aLineItem(eUnderline, SID_ATTR_CHAR_UNDERLINE); 250d4aefcaeSZheng Fan //modify end>> 251d4aefcaeSZheng Fan 252d4aefcaeSZheng Fan //<<add , this line of code will keep the new underline use pre-color 253d4aefcaeSZheng Fan aLineItem.SetColor(mrTextPropertyPanel.GetUnderlineColor()); 254d4aefcaeSZheng Fan //add end>> 255d4aefcaeSZheng Fan mpBindings->GetDispatcher()->Execute(SID_ATTR_CHAR_UNDERLINE, SFX_CALLMODE_RECORD, &aLineItem, 0L); 256d4aefcaeSZheng Fan 257d4aefcaeSZheng Fan //add , for the popup page not update immediately 258d4aefcaeSZheng Fan mrTextPropertyPanel.SetUnderline(eUnderline); 259d4aefcaeSZheng Fan //add end 260d4aefcaeSZheng Fan //mrTextPropertyPanel.SetDefaultUnderline(eUnderline); 261d4aefcaeSZheng Fan 262d4aefcaeSZheng Fan mrTextPropertyPanel.EndUnderlinePopupMode(); 263d4aefcaeSZheng Fan } 264d4aefcaeSZheng Fan return( 0L ); 265d4aefcaeSZheng Fan } 266d4aefcaeSZheng Fan 267d4aefcaeSZheng Fan IMPL_LINK(TextUnderlineControl, PBClickHdl, PushButton *, pPBtn) 268d4aefcaeSZheng Fan { 269d4aefcaeSZheng Fan if(pPBtn == &maPBOptions) 270d4aefcaeSZheng Fan { 271d4aefcaeSZheng Fan if (mpBindings) 272d4aefcaeSZheng Fan { 273d4aefcaeSZheng Fan SfxDispatcher* pDisp = mpBindings->GetDispatcher(); 274d4aefcaeSZheng Fan pDisp->Execute( SID_CHAR_DLG_EFFECT, SFX_CALLMODE_ASYNCHRON ); 275d4aefcaeSZheng Fan } 276d4aefcaeSZheng Fan //add 277d4aefcaeSZheng Fan mrTextPropertyPanel.EndUnderlinePopupMode(); 278d4aefcaeSZheng Fan //add end 279d4aefcaeSZheng Fan } 280d4aefcaeSZheng Fan return 0; 281d4aefcaeSZheng Fan } 282d4aefcaeSZheng Fan 283d4aefcaeSZheng Fan }} 284