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