xref: /trunk/main/vcl/source/control/morebtn.cxx (revision f85112c9f80c2da7fe21770423c3eda52ab5be71)
19f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
39f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
49f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
59f62ea84SAndrew Rist  * distributed with this work for additional information
69f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
79f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
89f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
99f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
119f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
139f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
149f62ea84SAndrew Rist  * software distributed under the License is distributed on an
159f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
179f62ea84SAndrew Rist  * specific language governing permissions and limitations
189f62ea84SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
209f62ea84SAndrew Rist  *************************************************************/
219f62ea84SAndrew Rist 
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_vcl.hxx"
24cdf0e10cSrcweir #include <vcl/morebtn.hxx>
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #ifndef _SV_RD_H
27cdf0e10cSrcweir #include <tools/rc.h>
28cdf0e10cSrcweir #endif
29cdf0e10cSrcweir 
30cdf0e10cSrcweir 
31cdf0e10cSrcweir // =======================================================================
32cdf0e10cSrcweir 
33cdf0e10cSrcweir DECLARE_LIST( ImplMoreWindowList, Window* )
34cdf0e10cSrcweir 
35cdf0e10cSrcweir struct ImplMoreButtonData
36cdf0e10cSrcweir {
37cdf0e10cSrcweir     ImplMoreWindowList *mpItemList;
38cdf0e10cSrcweir     XubString           maMoreText;
39cdf0e10cSrcweir     XubString           maLessText;
40cdf0e10cSrcweir };
41cdf0e10cSrcweir 
42cdf0e10cSrcweir // =======================================================================
43cdf0e10cSrcweir 
ImplInit(Window * pParent,WinBits nStyle)44cdf0e10cSrcweir void MoreButton::ImplInit( Window* pParent, WinBits nStyle )
45cdf0e10cSrcweir {
46cdf0e10cSrcweir     mpMBData    = new ImplMoreButtonData;
47cdf0e10cSrcweir     mnDelta     = 0;
48cdf0e10cSrcweir     meUnit      = MAP_PIXEL;
49cdf0e10cSrcweir     mbState     = sal_False;
50cdf0e10cSrcweir 
51cdf0e10cSrcweir     mpMBData->mpItemList = NULL;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir     PushButton::ImplInit( pParent, nStyle );
54cdf0e10cSrcweir 
55cdf0e10cSrcweir     mpMBData->maMoreText = Button::GetStandardText( BUTTON_MORE );
56cdf0e10cSrcweir     mpMBData->maLessText = Button::GetStandardText( BUTTON_LESS );
57cdf0e10cSrcweir 
58cdf0e10cSrcweir     SetHelpText( Button::GetStandardHelpText( BUTTON_MORE ) );
59cdf0e10cSrcweir 
60cdf0e10cSrcweir     ShowState();
61cdf0e10cSrcweir 
62cdf0e10cSrcweir     SetSymbolAlign( SYMBOLALIGN_RIGHT );
63cdf0e10cSrcweir     ImplSetSmallSymbol( sal_True );
64cdf0e10cSrcweir 
65cdf0e10cSrcweir     if ( ! ( nStyle & ( WB_RIGHT | WB_LEFT ) ) )
66cdf0e10cSrcweir     {
67cdf0e10cSrcweir         nStyle |= WB_CENTER;
68cdf0e10cSrcweir         SetStyle( nStyle );
69cdf0e10cSrcweir     }
70cdf0e10cSrcweir }
71cdf0e10cSrcweir 
72cdf0e10cSrcweir // -----------------------------------------------------------------------
ShowState()73cdf0e10cSrcweir void MoreButton::ShowState()
74cdf0e10cSrcweir {
75cdf0e10cSrcweir     if ( mbState )
76cdf0e10cSrcweir     {
774466f44bSmseidel         SetSymbol( SYMBOL_SPIN_UP );
78cdf0e10cSrcweir         SetText( mpMBData->maLessText );
79cdf0e10cSrcweir     }
80cdf0e10cSrcweir     else
81cdf0e10cSrcweir     {
824466f44bSmseidel         SetSymbol( SYMBOL_SPIN_DOWN );
83cdf0e10cSrcweir         SetText( mpMBData->maMoreText );
84cdf0e10cSrcweir     }
85cdf0e10cSrcweir }
86cdf0e10cSrcweir 
87cdf0e10cSrcweir // -----------------------------------------------------------------------
88cdf0e10cSrcweir 
MoreButton(Window * pParent,WinBits nStyle)89cdf0e10cSrcweir MoreButton::MoreButton( Window* pParent, WinBits nStyle ) :
90cdf0e10cSrcweir     PushButton( WINDOW_MOREBUTTON )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir     ImplInit( pParent, nStyle );
93cdf0e10cSrcweir }
94cdf0e10cSrcweir 
95cdf0e10cSrcweir // -----------------------------------------------------------------------
96cdf0e10cSrcweir 
MoreButton(Window * pParent,const ResId & rResId)97cdf0e10cSrcweir MoreButton::MoreButton( Window* pParent, const ResId& rResId ) :
98cdf0e10cSrcweir     PushButton( WINDOW_MOREBUTTON )
99cdf0e10cSrcweir {
100cdf0e10cSrcweir     rResId.SetRT( RSC_MOREBUTTON );
101cdf0e10cSrcweir     WinBits nStyle = ImplInitRes( rResId );
102cdf0e10cSrcweir     ImplInit( pParent, nStyle );
103cdf0e10cSrcweir     ImplLoadRes( rResId );
104cdf0e10cSrcweir 
105cdf0e10cSrcweir     if ( !(nStyle & WB_HIDE) )
106cdf0e10cSrcweir         Show();
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
109cdf0e10cSrcweir // -----------------------------------------------------------------------
110cdf0e10cSrcweir 
ImplLoadRes(const ResId & rResId)111cdf0e10cSrcweir void MoreButton::ImplLoadRes( const ResId& rResId )
112cdf0e10cSrcweir {
113cdf0e10cSrcweir     PushButton::ImplLoadRes( rResId );
114cdf0e10cSrcweir 
115cdf0e10cSrcweir     sal_uLong nObjMask = ReadLongRes();
116cdf0e10cSrcweir 
117cdf0e10cSrcweir     if ( nObjMask & RSC_MOREBUTTON_STATE )
118cdf0e10cSrcweir     {
119cdf0e10cSrcweir         // Nicht Methode rufen, da Dialog nicht umgeschaltet werden soll
120cdf0e10cSrcweir         mbState = (sal_Bool)ReadShortRes();
121cdf0e10cSrcweir         // SetText( GetText() );
122cdf0e10cSrcweir         ShowState();
123cdf0e10cSrcweir     }
124cdf0e10cSrcweir     if ( nObjMask & RSC_MOREBUTTON_MAPUNIT )
125cdf0e10cSrcweir         meUnit = (MapUnit)ReadLongRes();
126cdf0e10cSrcweir     if ( nObjMask & RSC_MOREBUTTON_DELTA )
127cdf0e10cSrcweir         // Groesse fuer Erweitern des Dialogs
128cdf0e10cSrcweir         mnDelta = ReadShortRes();
129cdf0e10cSrcweir }
130cdf0e10cSrcweir 
131cdf0e10cSrcweir // -----------------------------------------------------------------------
132cdf0e10cSrcweir 
~MoreButton()133cdf0e10cSrcweir MoreButton::~MoreButton()
134cdf0e10cSrcweir {
135cdf0e10cSrcweir     if ( mpMBData->mpItemList )
136cdf0e10cSrcweir         delete mpMBData->mpItemList;
137cdf0e10cSrcweir     delete mpMBData;
138cdf0e10cSrcweir }
139cdf0e10cSrcweir 
140cdf0e10cSrcweir // -----------------------------------------------------------------------
141cdf0e10cSrcweir 
Click()142cdf0e10cSrcweir void MoreButton::Click()
143cdf0e10cSrcweir {
144cdf0e10cSrcweir     Window*     pParent = GetParent();
145cdf0e10cSrcweir     Size        aSize( pParent->GetSizePixel() );
146cdf0e10cSrcweir     Window*     pWindow = (mpMBData->mpItemList) ? mpMBData->mpItemList->First() : NULL;
147cdf0e10cSrcweir     long        nDeltaPixel = LogicToPixel( Size( 0, mnDelta ), meUnit ).Height();
148cdf0e10cSrcweir 
149cdf0e10cSrcweir     // Status aendern
150cdf0e10cSrcweir     mbState = !mbState;
151cdf0e10cSrcweir     ShowState();
152cdf0e10cSrcweir 
153cdf0e10cSrcweir     // Je nach Status die Fenster updaten
154cdf0e10cSrcweir     if ( mbState )
155cdf0e10cSrcweir     {
156cdf0e10cSrcweir         // Fenster anzeigen
157cdf0e10cSrcweir         while ( pWindow )
158cdf0e10cSrcweir         {
159cdf0e10cSrcweir             pWindow->Show();
160cdf0e10cSrcweir             pWindow = mpMBData->mpItemList->Next();
161cdf0e10cSrcweir         }
162cdf0e10cSrcweir 
163cdf0e10cSrcweir         // Dialogbox anpassen
164cdf0e10cSrcweir         Point aPos( pParent->GetPosPixel() );
165cdf0e10cSrcweir         Rectangle aDeskRect( pParent->ImplGetFrameWindow()->GetDesktopRectPixel() );
166cdf0e10cSrcweir 
167cdf0e10cSrcweir         aSize.Height() += nDeltaPixel;
168cdf0e10cSrcweir         if ( (aPos.Y()+aSize.Height()) > aDeskRect.Bottom() )
169cdf0e10cSrcweir         {
170cdf0e10cSrcweir             aPos.Y() = aDeskRect.Bottom()-aSize.Height();
171cdf0e10cSrcweir 
172cdf0e10cSrcweir             if ( aPos.Y() < aDeskRect.Top() )
173cdf0e10cSrcweir                 aPos.Y() = aDeskRect.Top();
174cdf0e10cSrcweir 
175cdf0e10cSrcweir             pParent->SetPosSizePixel( aPos, aSize );
176cdf0e10cSrcweir         }
177cdf0e10cSrcweir         else
178cdf0e10cSrcweir             pParent->SetSizePixel( aSize );
179cdf0e10cSrcweir     }
180cdf0e10cSrcweir     else
181cdf0e10cSrcweir     {
182cdf0e10cSrcweir         // Dialogbox anpassen
183cdf0e10cSrcweir         aSize.Height() -= nDeltaPixel;
184cdf0e10cSrcweir         pParent->SetSizePixel( aSize );
185cdf0e10cSrcweir 
186cdf0e10cSrcweir         // Fenster nicht mehr anzeigen
187cdf0e10cSrcweir         while ( pWindow )
188cdf0e10cSrcweir         {
189cdf0e10cSrcweir             pWindow->Hide();
190cdf0e10cSrcweir             pWindow = mpMBData->mpItemList->Next();
191cdf0e10cSrcweir         }
192cdf0e10cSrcweir     }
193ad3a95a3SSteve Yin     PushButton::Click();
194cdf0e10cSrcweir }
195cdf0e10cSrcweir 
196cdf0e10cSrcweir // -----------------------------------------------------------------------
197cdf0e10cSrcweir 
AddWindow(Window * pWindow)198cdf0e10cSrcweir void MoreButton::AddWindow( Window* pWindow )
199cdf0e10cSrcweir {
200cdf0e10cSrcweir     if ( !mpMBData->mpItemList )
201cdf0e10cSrcweir         mpMBData->mpItemList = new ImplMoreWindowList( 1024, 16, 16 );
202cdf0e10cSrcweir 
203cdf0e10cSrcweir     mpMBData->mpItemList->Insert( pWindow, LIST_APPEND );
204cdf0e10cSrcweir 
205cdf0e10cSrcweir     if ( mbState )
206cdf0e10cSrcweir         pWindow->Show();
207cdf0e10cSrcweir     else
208cdf0e10cSrcweir         pWindow->Hide();
209cdf0e10cSrcweir }
210cdf0e10cSrcweir 
211cdf0e10cSrcweir // -----------------------------------------------------------------------
212cdf0e10cSrcweir 
RemoveWindow(Window * pWindow)213cdf0e10cSrcweir void MoreButton::RemoveWindow( Window* pWindow )
214cdf0e10cSrcweir {
215cdf0e10cSrcweir     if ( mpMBData->mpItemList )
216cdf0e10cSrcweir         mpMBData->mpItemList->Remove( pWindow );
217cdf0e10cSrcweir }
218cdf0e10cSrcweir 
219cdf0e10cSrcweir // -----------------------------------------------------------------------
220cdf0e10cSrcweir 
SetText(const XubString & rText)221cdf0e10cSrcweir void MoreButton::SetText( const XubString& rText )
222cdf0e10cSrcweir {
223cdf0e10cSrcweir     PushButton::SetText( rText );
224cdf0e10cSrcweir }
225cdf0e10cSrcweir 
226cdf0e10cSrcweir // -----------------------------------------------------------------------
227cdf0e10cSrcweir 
GetText() const228cdf0e10cSrcweir XubString MoreButton::GetText() const
229cdf0e10cSrcweir {
230cdf0e10cSrcweir     return PushButton::GetText();
231cdf0e10cSrcweir }
232cdf0e10cSrcweir 
233cdf0e10cSrcweir // -----------------------------------------------------------------------
SetMoreText(const XubString & rText)234cdf0e10cSrcweir void MoreButton::SetMoreText( const XubString& rText )
235cdf0e10cSrcweir {
236cdf0e10cSrcweir     if ( mpMBData )
237cdf0e10cSrcweir         mpMBData->maMoreText = rText;
238cdf0e10cSrcweir 
239cdf0e10cSrcweir     if ( !mbState )
240cdf0e10cSrcweir         SetText( rText );
241cdf0e10cSrcweir }
242cdf0e10cSrcweir 
243cdf0e10cSrcweir // -----------------------------------------------------------------------
GetMoreText() const244cdf0e10cSrcweir XubString MoreButton::GetMoreText() const
245cdf0e10cSrcweir {
246cdf0e10cSrcweir     if ( mpMBData )
247cdf0e10cSrcweir         return mpMBData->maMoreText;
248cdf0e10cSrcweir     else
249cdf0e10cSrcweir         return PushButton::GetText();
250cdf0e10cSrcweir }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir // -----------------------------------------------------------------------
SetLessText(const XubString & rText)253cdf0e10cSrcweir void MoreButton::SetLessText( const XubString& rText )
254cdf0e10cSrcweir {
255cdf0e10cSrcweir     if ( mpMBData )
256cdf0e10cSrcweir         mpMBData->maLessText = rText;
257cdf0e10cSrcweir 
258cdf0e10cSrcweir     if ( mbState )
259cdf0e10cSrcweir         SetText( rText );
260cdf0e10cSrcweir }
261cdf0e10cSrcweir 
262cdf0e10cSrcweir // -----------------------------------------------------------------------
GetLessText() const263cdf0e10cSrcweir XubString MoreButton::GetLessText() const
264cdf0e10cSrcweir {
265cdf0e10cSrcweir     if ( mpMBData )
266cdf0e10cSrcweir         return mpMBData->maLessText;
267cdf0e10cSrcweir     else
268cdf0e10cSrcweir         return PushButton::GetText();
269cdf0e10cSrcweir }
270cdf0e10cSrcweir 
271*f85112c9Smseidel /* vim: set noet sw=4 ts=4: */
272