xref: /aoo42x/main/vcl/source/control/morebtn.cxx (revision 9e3ffa3c)
19f62ea84SAndrew Rist /**************************************************************
2*9e3ffa3cSmseidel  *
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
10*9e3ffa3cSmseidel  *
119f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*9e3ffa3cSmseidel  *
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.
19*9e3ffa3cSmseidel  *
209f62ea84SAndrew Rist  *************************************************************/
219f62ea84SAndrew Rist 
229f62ea84SAndrew 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 DECLARE_LIST( ImplMoreWindowList, Window* )
36cdf0e10cSrcweir 
37cdf0e10cSrcweir struct ImplMoreButtonData
38cdf0e10cSrcweir {
39*9e3ffa3cSmseidel 	ImplMoreWindowList *mpItemList;
40*9e3ffa3cSmseidel 	XubString			maMoreText;
41*9e3ffa3cSmseidel 	XubString			maLessText;
42cdf0e10cSrcweir };
43cdf0e10cSrcweir 
44cdf0e10cSrcweir // =======================================================================
45cdf0e10cSrcweir 
46cdf0e10cSrcweir void MoreButton::ImplInit( Window* pParent, WinBits nStyle )
47cdf0e10cSrcweir {
48*9e3ffa3cSmseidel 	mpMBData	= new ImplMoreButtonData;
49*9e3ffa3cSmseidel 	mnDelta		= 0;
50*9e3ffa3cSmseidel 	meUnit		= MAP_PIXEL;
51*9e3ffa3cSmseidel 	mbState		= sal_False;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir 	mpMBData->mpItemList = NULL;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 	PushButton::ImplInit( pParent, nStyle );
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 	mpMBData->maMoreText = Button::GetStandardText( BUTTON_MORE );
58*9e3ffa3cSmseidel 	mpMBData->maLessText = Button::GetStandardText( BUTTON_LESS );
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 	SetHelpText( Button::GetStandardHelpText( BUTTON_MORE ) );
61cdf0e10cSrcweir 
62*9e3ffa3cSmseidel 	ShowState();
63cdf0e10cSrcweir 
64*9e3ffa3cSmseidel 	SetSymbolAlign( SYMBOLALIGN_RIGHT );
65*9e3ffa3cSmseidel 	ImplSetSmallSymbol( sal_True );
66cdf0e10cSrcweir 
67*9e3ffa3cSmseidel 	if ( ! ( nStyle & ( WB_RIGHT | WB_LEFT ) ) )
68*9e3ffa3cSmseidel 	{
69*9e3ffa3cSmseidel 		nStyle |= WB_CENTER;
70*9e3ffa3cSmseidel 		SetStyle( nStyle );
71*9e3ffa3cSmseidel 	}
72cdf0e10cSrcweir }
73cdf0e10cSrcweir 
74cdf0e10cSrcweir // -----------------------------------------------------------------------
75cdf0e10cSrcweir void MoreButton::ShowState()
76cdf0e10cSrcweir {
77*9e3ffa3cSmseidel 	if ( mbState )
78*9e3ffa3cSmseidel 	{
79*9e3ffa3cSmseidel 		SetSymbol( SYMBOL_SPIN_UP );
80*9e3ffa3cSmseidel 		SetText( mpMBData->maLessText );
81*9e3ffa3cSmseidel 	}
82*9e3ffa3cSmseidel 	else
83*9e3ffa3cSmseidel 	{
84*9e3ffa3cSmseidel 		SetSymbol( SYMBOL_SPIN_DOWN );
85*9e3ffa3cSmseidel 		SetText( mpMBData->maMoreText );
86*9e3ffa3cSmseidel 	}
87cdf0e10cSrcweir }
88cdf0e10cSrcweir 
89cdf0e10cSrcweir // -----------------------------------------------------------------------
90cdf0e10cSrcweir 
91cdf0e10cSrcweir MoreButton::MoreButton( Window* pParent, WinBits nStyle ) :
92cdf0e10cSrcweir 	PushButton( WINDOW_MOREBUTTON )
93cdf0e10cSrcweir {
94cdf0e10cSrcweir 	ImplInit( pParent, nStyle );
95cdf0e10cSrcweir }
96cdf0e10cSrcweir 
97cdf0e10cSrcweir // -----------------------------------------------------------------------
98cdf0e10cSrcweir 
99cdf0e10cSrcweir MoreButton::MoreButton( Window* pParent, const ResId& rResId ) :
100cdf0e10cSrcweir 	PushButton( WINDOW_MOREBUTTON )
101cdf0e10cSrcweir {
102cdf0e10cSrcweir 	rResId.SetRT( RSC_MOREBUTTON );
103cdf0e10cSrcweir 	WinBits nStyle = ImplInitRes( rResId );
104cdf0e10cSrcweir 	ImplInit( pParent, nStyle );
105cdf0e10cSrcweir 	ImplLoadRes( rResId );
106cdf0e10cSrcweir 
107cdf0e10cSrcweir 	if ( !(nStyle & WB_HIDE) )
108cdf0e10cSrcweir 		Show();
109cdf0e10cSrcweir }
110cdf0e10cSrcweir 
111cdf0e10cSrcweir // -----------------------------------------------------------------------
112cdf0e10cSrcweir 
113cdf0e10cSrcweir void MoreButton::ImplLoadRes( const ResId& rResId )
114cdf0e10cSrcweir {
115cdf0e10cSrcweir 	PushButton::ImplLoadRes( rResId );
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	sal_uLong nObjMask = ReadLongRes();
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	if ( nObjMask & RSC_MOREBUTTON_STATE )
120cdf0e10cSrcweir 	{
121cdf0e10cSrcweir 		// Nicht Methode rufen, da Dialog nicht umgeschaltet werden soll
122cdf0e10cSrcweir 		mbState = (sal_Bool)ReadShortRes();
123cdf0e10cSrcweir 		// SetText( GetText() );
124*9e3ffa3cSmseidel 		ShowState();
125cdf0e10cSrcweir 	}
126cdf0e10cSrcweir 	if ( nObjMask & RSC_MOREBUTTON_MAPUNIT )
127cdf0e10cSrcweir 		meUnit = (MapUnit)ReadLongRes();
128cdf0e10cSrcweir 	if ( nObjMask & RSC_MOREBUTTON_DELTA )
129cdf0e10cSrcweir 		// Groesse fuer Erweitern des Dialogs
130cdf0e10cSrcweir 		mnDelta = ReadShortRes();
131cdf0e10cSrcweir }
132cdf0e10cSrcweir 
133cdf0e10cSrcweir // -----------------------------------------------------------------------
134cdf0e10cSrcweir 
135cdf0e10cSrcweir MoreButton::~MoreButton()
136cdf0e10cSrcweir {
137cdf0e10cSrcweir 	if ( mpMBData->mpItemList )
138cdf0e10cSrcweir 		delete mpMBData->mpItemList;
139*9e3ffa3cSmseidel 	delete mpMBData;
140cdf0e10cSrcweir }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir // -----------------------------------------------------------------------
143cdf0e10cSrcweir 
144cdf0e10cSrcweir void MoreButton::Click()
145cdf0e10cSrcweir {
146cdf0e10cSrcweir 	Window* 	pParent = GetParent();
147cdf0e10cSrcweir 	Size		aSize( pParent->GetSizePixel() );
148cdf0e10cSrcweir 	Window* 	pWindow = (mpMBData->mpItemList) ? mpMBData->mpItemList->First() : NULL;
149cdf0e10cSrcweir 	long		nDeltaPixel = LogicToPixel( Size( 0, mnDelta ), meUnit ).Height();
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 	// Status aendern
152cdf0e10cSrcweir 	mbState = !mbState;
153*9e3ffa3cSmseidel 	ShowState();
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 	// Je nach Status die Fenster updaten
156cdf0e10cSrcweir 	if ( mbState )
157cdf0e10cSrcweir 	{
158cdf0e10cSrcweir 		// Fenster anzeigen
159cdf0e10cSrcweir 		while ( pWindow )
160cdf0e10cSrcweir 		{
161cdf0e10cSrcweir 			pWindow->Show();
162cdf0e10cSrcweir 			pWindow = mpMBData->mpItemList->Next();
163cdf0e10cSrcweir 		}
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 		// Dialogbox anpassen
166cdf0e10cSrcweir 		Point aPos( pParent->GetPosPixel() );
167cdf0e10cSrcweir 		Rectangle aDeskRect( pParent->ImplGetFrameWindow()->GetDesktopRectPixel() );
168cdf0e10cSrcweir 
169cdf0e10cSrcweir 		aSize.Height() += nDeltaPixel;
170cdf0e10cSrcweir 		if ( (aPos.Y()+aSize.Height()) > aDeskRect.Bottom() )
171cdf0e10cSrcweir 		{
172cdf0e10cSrcweir 			aPos.Y() = aDeskRect.Bottom()-aSize.Height();
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 			if ( aPos.Y() < aDeskRect.Top() )
175cdf0e10cSrcweir 				aPos.Y() = aDeskRect.Top();
176cdf0e10cSrcweir 
177cdf0e10cSrcweir 			pParent->SetPosSizePixel( aPos, aSize );
178cdf0e10cSrcweir 		}
179cdf0e10cSrcweir 		else
180cdf0e10cSrcweir 			pParent->SetSizePixel( aSize );
181cdf0e10cSrcweir 	}
182cdf0e10cSrcweir 	else
183cdf0e10cSrcweir 	{
184cdf0e10cSrcweir 		// Dialogbox anpassen
185cdf0e10cSrcweir 		aSize.Height() -= nDeltaPixel;
186cdf0e10cSrcweir 		pParent->SetSizePixel( aSize );
187cdf0e10cSrcweir 
188cdf0e10cSrcweir 		// Fenster nicht mehr anzeigen
189cdf0e10cSrcweir 		while ( pWindow )
190cdf0e10cSrcweir 		{
191cdf0e10cSrcweir 			pWindow->Hide();
192cdf0e10cSrcweir 			pWindow = mpMBData->mpItemList->Next();
193cdf0e10cSrcweir 		}
194cdf0e10cSrcweir 	}
195ad3a95a3SSteve Yin 	PushButton::Click();
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
198cdf0e10cSrcweir // -----------------------------------------------------------------------
199cdf0e10cSrcweir 
200cdf0e10cSrcweir void MoreButton::AddWindow( Window* pWindow )
201cdf0e10cSrcweir {
202cdf0e10cSrcweir 	if ( !mpMBData->mpItemList )
203cdf0e10cSrcweir 		mpMBData->mpItemList = new ImplMoreWindowList( 1024, 16, 16 );
204cdf0e10cSrcweir 
205cdf0e10cSrcweir 	mpMBData->mpItemList->Insert( pWindow, LIST_APPEND );
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 	if ( mbState )
208cdf0e10cSrcweir 		pWindow->Show();
209cdf0e10cSrcweir 	else
210cdf0e10cSrcweir 		pWindow->Hide();
211cdf0e10cSrcweir }
212cdf0e10cSrcweir 
213cdf0e10cSrcweir // -----------------------------------------------------------------------
214cdf0e10cSrcweir 
215cdf0e10cSrcweir void MoreButton::RemoveWindow( Window* pWindow )
216cdf0e10cSrcweir {
217cdf0e10cSrcweir 	if ( mpMBData->mpItemList )
218cdf0e10cSrcweir 		mpMBData->mpItemList->Remove( pWindow );
219cdf0e10cSrcweir }
220cdf0e10cSrcweir 
221cdf0e10cSrcweir // -----------------------------------------------------------------------
222cdf0e10cSrcweir 
223cdf0e10cSrcweir void MoreButton::SetText( const XubString& rText )
224cdf0e10cSrcweir {
225cdf0e10cSrcweir 	PushButton::SetText( rText );
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
228cdf0e10cSrcweir // -----------------------------------------------------------------------
229cdf0e10cSrcweir 
230cdf0e10cSrcweir XubString MoreButton::GetText() const
231cdf0e10cSrcweir {
232cdf0e10cSrcweir 	return PushButton::GetText();
233cdf0e10cSrcweir }
234cdf0e10cSrcweir 
235cdf0e10cSrcweir // -----------------------------------------------------------------------
236cdf0e10cSrcweir void MoreButton::SetMoreText( const XubString& rText )
237cdf0e10cSrcweir {
238cdf0e10cSrcweir 	if ( mpMBData )
239*9e3ffa3cSmseidel 		mpMBData->maMoreText = rText;
240cdf0e10cSrcweir 
241*9e3ffa3cSmseidel 	if ( !mbState )
242*9e3ffa3cSmseidel 		SetText( rText );
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
245cdf0e10cSrcweir // -----------------------------------------------------------------------
246cdf0e10cSrcweir XubString MoreButton::GetMoreText() const
247cdf0e10cSrcweir {
248cdf0e10cSrcweir 	if ( mpMBData )
249*9e3ffa3cSmseidel 		return mpMBData->maMoreText;
250*9e3ffa3cSmseidel 	else
251*9e3ffa3cSmseidel 		return PushButton::GetText();
252cdf0e10cSrcweir }
253cdf0e10cSrcweir 
254cdf0e10cSrcweir // -----------------------------------------------------------------------
255cdf0e10cSrcweir void MoreButton::SetLessText( const XubString& rText )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir 	if ( mpMBData )
258*9e3ffa3cSmseidel 		mpMBData->maLessText = rText;
259cdf0e10cSrcweir 
260*9e3ffa3cSmseidel 	if ( mbState )
261*9e3ffa3cSmseidel 		SetText( rText );
262cdf0e10cSrcweir }
263cdf0e10cSrcweir 
264cdf0e10cSrcweir // -----------------------------------------------------------------------
265cdf0e10cSrcweir XubString MoreButton::GetLessText() const
266cdf0e10cSrcweir {
267cdf0e10cSrcweir 	if ( mpMBData )
268*9e3ffa3cSmseidel 		return mpMBData->maLessText;
269*9e3ffa3cSmseidel 	else
270*9e3ffa3cSmseidel 		return PushButton::GetText();
271cdf0e10cSrcweir }
272cdf0e10cSrcweir 
273