Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <vcl/morebtn.hxx>
21 :
22 : #include <tools/rc.h>
23 : #include <vector>
24 :
25 : // =======================================================================
26 :
27 : typedef ::std::vector< Window* > ImplMoreWindowList;
28 :
29 0 : struct ImplMoreButtonData
30 : {
31 : ImplMoreWindowList *mpItemList;
32 : XubString maMoreText;
33 : XubString maLessText;
34 : };
35 :
36 : // =======================================================================
37 :
38 0 : void MoreButton::ImplInit( Window* pParent, WinBits nStyle )
39 : {
40 0 : mpMBData = new ImplMoreButtonData;
41 0 : mnDelta = 0;
42 0 : meUnit = MAP_PIXEL;
43 0 : mbState = sal_False;
44 :
45 0 : mpMBData->mpItemList = NULL;
46 :
47 0 : PushButton::ImplInit( pParent, nStyle );
48 :
49 0 : mpMBData->maMoreText = Button::GetStandardText( BUTTON_MORE );
50 0 : mpMBData->maLessText = Button::GetStandardText( BUTTON_LESS );
51 :
52 0 : SetHelpText( Button::GetStandardHelpText( BUTTON_MORE ) );
53 :
54 0 : ShowState();
55 :
56 0 : SetSymbolAlign(SYMBOLALIGN_RIGHT);
57 0 : SetSmallSymbol(true);
58 :
59 0 : if ( ! ( nStyle & ( WB_RIGHT | WB_LEFT ) ) )
60 : {
61 0 : nStyle |= WB_CENTER;
62 0 : SetStyle( nStyle );
63 : }
64 0 : }
65 :
66 : // -----------------------------------------------------------------------
67 0 : void MoreButton::ShowState()
68 : {
69 0 : if ( mbState )
70 : {
71 0 : SetSymbol( SYMBOL_PAGEUP );
72 0 : SetText( mpMBData->maLessText );
73 : }
74 : else
75 : {
76 0 : SetSymbol( SYMBOL_PAGEDOWN );
77 0 : SetText( mpMBData->maMoreText );
78 : }
79 0 : }
80 :
81 : // -----------------------------------------------------------------------
82 :
83 0 : MoreButton::MoreButton( Window* pParent, WinBits nStyle ) :
84 0 : PushButton( WINDOW_MOREBUTTON )
85 : {
86 0 : ImplInit( pParent, nStyle );
87 0 : }
88 :
89 : // -----------------------------------------------------------------------
90 :
91 0 : MoreButton::MoreButton( Window* pParent, const ResId& rResId ) :
92 0 : PushButton( WINDOW_MOREBUTTON )
93 : {
94 0 : rResId.SetRT( RSC_MOREBUTTON );
95 0 : WinBits nStyle = ImplInitRes( rResId );
96 0 : ImplInit( pParent, nStyle );
97 0 : ImplLoadRes( rResId );
98 :
99 0 : if ( !(nStyle & WB_HIDE) )
100 0 : Show();
101 0 : }
102 :
103 : // -----------------------------------------------------------------------
104 :
105 0 : void MoreButton::ImplLoadRes( const ResId& rResId )
106 : {
107 0 : PushButton::ImplLoadRes( rResId );
108 :
109 0 : sal_uLong nObjMask = ReadLongRes();
110 :
111 0 : if ( nObjMask & RSC_MOREBUTTON_STATE )
112 : {
113 : // Nicht Methode rufen, da Dialog nicht umgeschaltet werden soll
114 0 : mbState = (sal_Bool)ReadShortRes();
115 : // SetText( GetText() );
116 0 : ShowState();
117 : }
118 0 : if ( nObjMask & RSC_MOREBUTTON_MAPUNIT )
119 0 : meUnit = (MapUnit)ReadLongRes();
120 0 : if ( nObjMask & RSC_MOREBUTTON_DELTA )
121 : // Groesse fuer Erweitern des Dialogs
122 0 : mnDelta = ReadShortRes();
123 0 : }
124 :
125 : // -----------------------------------------------------------------------
126 :
127 0 : MoreButton::~MoreButton()
128 : {
129 0 : if ( mpMBData->mpItemList )
130 0 : delete mpMBData->mpItemList;
131 0 : delete mpMBData;
132 0 : }
133 :
134 : // -----------------------------------------------------------------------
135 :
136 0 : void MoreButton::Click()
137 : {
138 0 : Window* pParent = GetParent();
139 0 : Size aSize( pParent->GetSizePixel() );
140 0 : long nDeltaPixel = LogicToPixel( Size( 0, mnDelta ), meUnit ).Height();
141 :
142 : // Status aendern
143 0 : mbState = !mbState;
144 0 : ShowState();
145 :
146 : // Hier den Click-Handler rufen, damit vorher die Controls initialisiert
147 : // werden koennen
148 0 : PushButton::Click();
149 :
150 : // Je nach Status die Fenster updaten
151 0 : if ( mbState )
152 : {
153 : // Fenster anzeigen
154 0 : if ( mpMBData->mpItemList ) {
155 0 : for ( size_t i = 0, n = mpMBData->mpItemList->size(); i < n; ++i ) {
156 0 : (*mpMBData->mpItemList)[ i ]->Show();
157 : }
158 : }
159 :
160 : // Dialogbox anpassen
161 0 : Point aPos( pParent->GetPosPixel() );
162 0 : Rectangle aDeskRect( pParent->ImplGetFrameWindow()->GetDesktopRectPixel() );
163 :
164 0 : aSize.Height() += nDeltaPixel;
165 0 : if ( (aPos.Y()+aSize.Height()) > aDeskRect.Bottom() )
166 : {
167 0 : aPos.Y() = aDeskRect.Bottom()-aSize.Height();
168 :
169 0 : if ( aPos.Y() < aDeskRect.Top() )
170 0 : aPos.Y() = aDeskRect.Top();
171 :
172 0 : pParent->SetPosSizePixel( aPos, aSize );
173 : }
174 : else
175 0 : pParent->SetSizePixel( aSize );
176 : }
177 : else
178 : {
179 : // Dialogbox anpassen
180 0 : aSize.Height() -= nDeltaPixel;
181 0 : pParent->SetSizePixel( aSize );
182 :
183 : // Fenster nicht mehr anzeigen
184 0 : if ( mpMBData->mpItemList ) {
185 0 : for ( size_t i = 0, n = mpMBData->mpItemList->size(); i < n; ++i ) {
186 0 : (*mpMBData->mpItemList)[ i ]->Hide();
187 : }
188 : }
189 : }
190 0 : }
191 :
192 : // -----------------------------------------------------------------------
193 :
194 0 : void MoreButton::AddWindow( Window* pWindow )
195 : {
196 0 : if ( !mpMBData->mpItemList )
197 0 : mpMBData->mpItemList = new ImplMoreWindowList();
198 :
199 0 : mpMBData->mpItemList->push_back( pWindow );
200 :
201 0 : if ( mbState )
202 0 : pWindow->Show();
203 : else
204 0 : pWindow->Hide();
205 0 : }
206 :
207 : // -----------------------------------------------------------------------
208 :
209 0 : void MoreButton::SetText( const XubString& rText )
210 : {
211 0 : PushButton::SetText( rText );
212 0 : }
213 :
214 : // -----------------------------------------------------------------------
215 :
216 0 : XubString MoreButton::GetText() const
217 : {
218 0 : return PushButton::GetText();
219 : }
220 :
221 : // -----------------------------------------------------------------------
222 0 : void MoreButton::SetMoreText( const XubString& rText )
223 : {
224 0 : if ( mpMBData )
225 0 : mpMBData->maMoreText = rText;
226 :
227 0 : if ( !mbState )
228 0 : SetText( rText );
229 0 : }
230 :
231 : // -----------------------------------------------------------------------
232 0 : XubString MoreButton::GetMoreText() const
233 : {
234 0 : if ( mpMBData )
235 0 : return mpMBData->maMoreText;
236 : else
237 0 : return PushButton::GetText();
238 : }
239 :
240 : // -----------------------------------------------------------------------
241 0 : void MoreButton::SetLessText( const XubString& rText )
242 : {
243 0 : if ( mpMBData )
244 0 : mpMBData->maLessText = rText;
245 :
246 0 : if ( mbState )
247 0 : SetText( rText );
248 0 : }
249 :
250 : // -----------------------------------------------------------------------
251 0 : XubString MoreButton::GetLessText() const
252 : {
253 0 : if ( mpMBData )
254 0 : return mpMBData->maLessText;
255 : else
256 0 : return PushButton::GetText();
257 : }
258 :
259 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|