xref: /trunk/main/svx/source/sidebar/tools/ValueSetWithTextControl.cxx (revision fe617e93560c0575040cf13b538ba840fa9e2479)
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 "svx/sidebar/ValueSetWithTextControl.hxx"
23 
24 #include <sfx2/sidebar/Theme.hxx>
25 
26 #include <i18npool/mslangid.hxx>
27 
28 namespace svx { namespace sidebar {
29 
30 ValueSetWithTextControl::ValueSetWithTextControl(
31     const tControlType eControlType,
32     Window* pParent,
33     const ResId& rResId)
34     : ValueSet( pParent, rResId )
35     , meControlType( eControlType )
36     , maItems()
37     ,   bHaveCus(false)
38     ,   bCusEnable(false)
39 {
40     SetColCount( 1 );
41 }
42 
43 
44 ValueSetWithTextControl::~ValueSetWithTextControl(void)
45 {
46 }
47 
48 void ValueSetWithTextControl::InsertCustom(Image imgEnable, Image imgDisable, XubString str)
49 {
50     bHaveCus = true;
51     imgCusEnable = imgEnable;
52     imgCusDisable = imgDisable;
53     strLastCustom = str;
54     InsertItem(maItems.size() + 1);
55 }
56 
57 void  ValueSetWithTextControl::SetDefaultTip(XubString* pStrList, sal_Bool bRealTip)
58 {
59     for(sal_uInt16 i=1; i <= maItems.size(); i++)
60     {
61         //if (bRealTip)
62         //  SetItemHelpText(i, pStrList[i-1]);
63         //else
64             SetItemText(i, pStrList[i-1]);
65     }
66 }
67 
68 void  ValueSetWithTextControl::SetCustomTip(XubString str, sal_Bool bRealTip)
69 {
70     if(bHaveCus)
71     {
72         //if (bRealTip)
73         //  SetItemHelpText(GetItemCount() + 1 , str);
74         //else
75             SetItemText(maItems.size()+ 1 , str);
76     }
77 }
78 
79 void ValueSetWithTextControl::SetCusEnable(bool bEnable)
80 {
81     bCusEnable = bEnable;
82 }
83 
84 void ValueSetWithTextControl::SetSelItem(sal_uInt16 nSel)
85 {
86     //nSelItem = nSel;
87     //add by wj for sym2_5397
88     if(nSel == 0)
89     {
90         SelectItem(1);
91         SetNoSelection();
92     }
93     else
94     {
95         SelectItem(nSel);
96         GrabFocus();
97     }
98 }
99 
100 
101 void ValueSetWithTextControl::AddItem(
102     const Image& rItemImage,
103     const Image* pSelectedItemImage,
104     const XubString& rItemText,
105     const XubString* pItemHelpText )
106 {
107     if ( meControlType != IMAGE_TEXT )
108     {
109         return;
110     }
111 
112     ValueSetWithTextItem aItem;
113     aItem.maItemImage = rItemImage;
114     aItem.maSelectedItemImage = (pSelectedItemImage != 0)
115                                 ? *pSelectedItemImage
116                                 : rItemImage;
117     aItem.maItemText = rItemText;
118 
119     maItems.push_back( aItem );
120 
121     InsertItem( maItems.size() );
122     SetItemText( maItems.size(),
123                     (pItemHelpText != 0) ? *pItemHelpText : rItemText );
124 }
125 
126 
127 void ValueSetWithTextControl::AddItem(
128     const XubString& rItemText,
129     const XubString& rItemText2,
130     const XubString* pItemHelpText )
131 {
132     if ( meControlType != TEXT_TEXT )
133     {
134         return;
135     }
136 
137     ValueSetWithTextItem aItem;
138     aItem.maItemText = rItemText;
139     aItem.maItemText2 = rItemText2;
140 
141     maItems.push_back( aItem );
142 
143     InsertItem( maItems.size() );
144     SetItemText( maItems.size(),
145                     (pItemHelpText != 0) ? *pItemHelpText : rItemText );
146 }
147 
148 
149 void ValueSetWithTextControl::ReplaceItemImages(
150     const sal_uInt16 nItemId,
151     const Image& rItemImage,
152     const Image* pSelectedItemImage )
153 {
154     if ( meControlType != IMAGE_TEXT )
155     {
156         return;
157     }
158 
159     if ( nItemId == 0 ||
160          nItemId > maItems.size() )
161     {
162         return;
163     }
164 
165     maItems[nItemId-1].maItemImage = rItemImage;
166     maItems[nItemId-1].maSelectedItemImage = (pSelectedItemImage != 0)
167                                              ? *pSelectedItemImage
168                                              : rItemImage;
169 }
170 
171 
172 void ValueSetWithTextControl::UserDraw( const UserDrawEvent& rUDEvt )
173 {
174     const Rectangle aRect = rUDEvt.GetRect();
175     OutputDevice* pDev = rUDEvt.GetDevice();
176     pDev->Push( PUSH_ALL );
177     const sal_uInt16 nItemId = rUDEvt.GetItemId();
178 
179     const long nRectHeight = aRect.GetHeight();
180     const Point aBLPos = aRect.TopLeft();
181 
182     Font aFont(OutputDevice::GetDefaultFont(DEFAULTFONT_UI_SANS, MsLangId::getSystemLanguage(), DEFAULTFONT_FLAGS_ONLYONE));
183     {
184         Size aSize = aFont.GetSize();
185         aSize.Height() = (nRectHeight*4)/9;
186         aFont.SetSize( aSize );
187     }
188     if(nItemId == (maItems.size() + 1)  && bHaveCus)
189     {
190         //Point aStrStart(aBLPos.X() + imgCusEnable.GetSizePixel().Width() + 20 , aBLPos.Y() + nRectHeight/6);
191         Rectangle aStrRect = aRect;
192         aStrRect.Top() += nRectHeight/6;
193         aStrRect.Bottom() -= nRectHeight/6;
194         aStrRect.Left() += imgCusEnable.GetSizePixel().Width() + 20;
195 
196         pDev->SetFillColor( COL_TRANSPARENT );
197         pDev->DrawRect(aRect);
198 
199         if(bCusEnable)
200         {
201             Point aImgStart(aBLPos.X() + 5,         aBLPos.Y() + ( nRectHeight - imgCusEnable.GetSizePixel().Height() ) / 2);
202             pDev->DrawImage(aImgStart, imgCusEnable);
203             aFont.SetColor(GetSettings().GetStyleSettings().GetFieldTextColor());       //GetSettings().GetStyleSettings().GetHighContrastMode() ? COL_WHITE : COL_BLACKadd for sym2_7246 for high contrast
204         }
205         else
206         {
207             Point aImgStart(aBLPos.X() + 5,         aBLPos.Y() + ( nRectHeight - imgCusDisable.GetSizePixel().Height() ) / 2);
208             pDev->DrawImage(aImgStart, imgCusDisable);
209             //Color aCol(155,155,155);
210             aFont.SetColor(GetSettings().GetStyleSettings().GetDisableColor());
211         }
212         pDev->SetFont(aFont);
213         pDev->DrawText(aStrRect, strLastCustom, TEXT_DRAW_ENDELLIPSIS); //add by wj for sym2_4049
214     }
215     else
216     {
217         //draw backgroud
218         if ( GetSelectItemId() == nItemId )
219         {
220             Rectangle aBackRect = aRect;
221             aBackRect.Top() += 3;
222             aBackRect.Bottom() -= 2;
223             pDev->SetFillColor( sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Color_Highlight ) );
224             pDev->DrawRect(aBackRect);
225         }
226         else
227         {
228             pDev->SetFillColor( COL_TRANSPARENT );
229             pDev->DrawRect(aRect);
230         }
231 
232         //draw image + text resp. text + text
233         Image* pImage = 0;
234         if ( GetSelectItemId() == nItemId )
235         {
236             aFont.SetColor( sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Color_HighlightText ) );
237             pImage = &maItems[nItemId-1].maSelectedItemImage;
238         }
239         else
240         {
241             aFont.SetColor( GetSettings().GetStyleSettings().GetFieldTextColor() );
242             pImage = &maItems[nItemId-1].maItemImage;
243         }
244 
245         Rectangle aStrRect = aRect;
246         aStrRect.Top() += nRectHeight/4;
247         aStrRect.Bottom() -= nRectHeight/4;
248 
249         switch ( meControlType )
250         {
251         case IMAGE_TEXT:
252             {
253                 Point aImgStart(
254                     aBLPos.X() + 4,
255                     aBLPos.Y() + ( ( nRectHeight - pImage->GetSizePixel().Height() ) / 2 ) );
256                 pDev->DrawImage( aImgStart, *pImage );
257 
258                 aStrRect.Left() += pImage->GetSizePixel().Width() + 12;
259                 pDev->SetFont(aFont);
260                 pDev->DrawText(aStrRect, maItems[nItemId-1].maItemText, TEXT_DRAW_ENDELLIPSIS);
261             }
262             break;
263         case TEXT_TEXT:
264             {
265                 const long nRectWidth = aRect.GetWidth();
266                 aStrRect.Left() += 8;
267                 aStrRect.Right() -= (nRectWidth*2)/3;
268                 pDev->SetFont(aFont);
269                 pDev->DrawText(aStrRect, maItems[nItemId-1].maItemText, TEXT_DRAW_ENDELLIPSIS);
270                 aStrRect.Left() += nRectWidth/3;
271                 aStrRect.Right() += (nRectWidth*2)/3;
272                 pDev->DrawText(aStrRect, maItems[nItemId-1].maItemText2, TEXT_DRAW_ENDELLIPSIS);
273             }
274             break;
275         }
276     }
277 
278     Invalidate( aRect );
279     pDev->Pop();
280 }
281 
282 } } // end of namespace svx::sidebar
283