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
109f62ea84SAndrew Rist *
119f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
129f62ea84SAndrew Rist *
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.
199f62ea84SAndrew Rist *
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
36cdf0e10cSrcweir DECLARE_LIST( ImplMoreWindowList, Window* )
37cdf0e10cSrcweir
38cdf0e10cSrcweir struct ImplMoreButtonData
39cdf0e10cSrcweir {
40cdf0e10cSrcweir ImplMoreWindowList *mpItemList;
41cdf0e10cSrcweir XubString maMoreText;
42cdf0e10cSrcweir XubString maLessText;
43cdf0e10cSrcweir };
44cdf0e10cSrcweir
45cdf0e10cSrcweir // =======================================================================
46cdf0e10cSrcweir
ImplInit(Window * pParent,WinBits nStyle)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 // -----------------------------------------------------------------------
ShowState()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
MoreButton(Window * pParent,WinBits nStyle)92cdf0e10cSrcweir MoreButton::MoreButton( Window* pParent, WinBits nStyle ) :
93cdf0e10cSrcweir PushButton( WINDOW_MOREBUTTON )
94cdf0e10cSrcweir {
95cdf0e10cSrcweir ImplInit( pParent, nStyle );
96cdf0e10cSrcweir }
97cdf0e10cSrcweir
98cdf0e10cSrcweir // -----------------------------------------------------------------------
99cdf0e10cSrcweir
MoreButton(Window * pParent,const ResId & rResId)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
ImplLoadRes(const ResId & rResId)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
~MoreButton()136cdf0e10cSrcweir MoreButton::~MoreButton()
137cdf0e10cSrcweir {
138cdf0e10cSrcweir if ( mpMBData->mpItemList )
139cdf0e10cSrcweir delete mpMBData->mpItemList;
140cdf0e10cSrcweir delete mpMBData;
141cdf0e10cSrcweir }
142cdf0e10cSrcweir
143cdf0e10cSrcweir // -----------------------------------------------------------------------
144cdf0e10cSrcweir
Click()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 // Je nach Status die Fenster updaten
157cdf0e10cSrcweir if ( mbState )
158cdf0e10cSrcweir {
159cdf0e10cSrcweir // Fenster anzeigen
160cdf0e10cSrcweir while ( pWindow )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir pWindow->Show();
163cdf0e10cSrcweir pWindow = mpMBData->mpItemList->Next();
164cdf0e10cSrcweir }
165cdf0e10cSrcweir
166cdf0e10cSrcweir // Dialogbox anpassen
167cdf0e10cSrcweir Point aPos( pParent->GetPosPixel() );
168cdf0e10cSrcweir Rectangle aDeskRect( pParent->ImplGetFrameWindow()->GetDesktopRectPixel() );
169cdf0e10cSrcweir
170cdf0e10cSrcweir aSize.Height() += nDeltaPixel;
171cdf0e10cSrcweir if ( (aPos.Y()+aSize.Height()) > aDeskRect.Bottom() )
172cdf0e10cSrcweir {
173cdf0e10cSrcweir aPos.Y() = aDeskRect.Bottom()-aSize.Height();
174cdf0e10cSrcweir
175cdf0e10cSrcweir if ( aPos.Y() < aDeskRect.Top() )
176cdf0e10cSrcweir aPos.Y() = aDeskRect.Top();
177cdf0e10cSrcweir
178cdf0e10cSrcweir pParent->SetPosSizePixel( aPos, aSize );
179cdf0e10cSrcweir }
180cdf0e10cSrcweir else
181cdf0e10cSrcweir pParent->SetSizePixel( aSize );
182cdf0e10cSrcweir }
183cdf0e10cSrcweir else
184cdf0e10cSrcweir {
185cdf0e10cSrcweir // Dialogbox anpassen
186cdf0e10cSrcweir aSize.Height() -= nDeltaPixel;
187cdf0e10cSrcweir pParent->SetSizePixel( aSize );
188cdf0e10cSrcweir
189cdf0e10cSrcweir // Fenster nicht mehr anzeigen
190cdf0e10cSrcweir while ( pWindow )
191cdf0e10cSrcweir {
192cdf0e10cSrcweir pWindow->Hide();
193cdf0e10cSrcweir pWindow = mpMBData->mpItemList->Next();
194cdf0e10cSrcweir }
195cdf0e10cSrcweir }
196*ad3a95a3SSteve Yin PushButton::Click();
197cdf0e10cSrcweir }
198cdf0e10cSrcweir
199cdf0e10cSrcweir // -----------------------------------------------------------------------
200cdf0e10cSrcweir
AddWindow(Window * pWindow)201cdf0e10cSrcweir void MoreButton::AddWindow( Window* pWindow )
202cdf0e10cSrcweir {
203cdf0e10cSrcweir if ( !mpMBData->mpItemList )
204cdf0e10cSrcweir mpMBData->mpItemList = new ImplMoreWindowList( 1024, 16, 16 );
205cdf0e10cSrcweir
206cdf0e10cSrcweir mpMBData->mpItemList->Insert( pWindow, LIST_APPEND );
207cdf0e10cSrcweir
208cdf0e10cSrcweir if ( mbState )
209cdf0e10cSrcweir pWindow->Show();
210cdf0e10cSrcweir else
211cdf0e10cSrcweir pWindow->Hide();
212cdf0e10cSrcweir }
213cdf0e10cSrcweir
214cdf0e10cSrcweir // -----------------------------------------------------------------------
215cdf0e10cSrcweir
RemoveWindow(Window * pWindow)216cdf0e10cSrcweir void MoreButton::RemoveWindow( Window* pWindow )
217cdf0e10cSrcweir {
218cdf0e10cSrcweir if ( mpMBData->mpItemList )
219cdf0e10cSrcweir mpMBData->mpItemList->Remove( pWindow );
220cdf0e10cSrcweir }
221cdf0e10cSrcweir
222cdf0e10cSrcweir // -----------------------------------------------------------------------
223cdf0e10cSrcweir
SetText(const XubString & rText)224cdf0e10cSrcweir void MoreButton::SetText( const XubString& rText )
225cdf0e10cSrcweir {
226cdf0e10cSrcweir PushButton::SetText( rText );
227cdf0e10cSrcweir }
228cdf0e10cSrcweir
229cdf0e10cSrcweir // -----------------------------------------------------------------------
230cdf0e10cSrcweir
GetText() const231cdf0e10cSrcweir XubString MoreButton::GetText() const
232cdf0e10cSrcweir {
233cdf0e10cSrcweir return PushButton::GetText();
234cdf0e10cSrcweir }
235cdf0e10cSrcweir
236cdf0e10cSrcweir // -----------------------------------------------------------------------
SetMoreText(const XubString & rText)237cdf0e10cSrcweir void MoreButton::SetMoreText( const XubString& rText )
238cdf0e10cSrcweir {
239cdf0e10cSrcweir if ( mpMBData )
240cdf0e10cSrcweir mpMBData->maMoreText = rText;
241cdf0e10cSrcweir
242cdf0e10cSrcweir if ( !mbState )
243cdf0e10cSrcweir SetText( rText );
244cdf0e10cSrcweir }
245cdf0e10cSrcweir
246cdf0e10cSrcweir // -----------------------------------------------------------------------
GetMoreText() const247cdf0e10cSrcweir XubString MoreButton::GetMoreText() const
248cdf0e10cSrcweir {
249cdf0e10cSrcweir if ( mpMBData )
250cdf0e10cSrcweir return mpMBData->maMoreText;
251cdf0e10cSrcweir else
252cdf0e10cSrcweir return PushButton::GetText();
253cdf0e10cSrcweir }
254cdf0e10cSrcweir
255cdf0e10cSrcweir // -----------------------------------------------------------------------
SetLessText(const XubString & rText)256cdf0e10cSrcweir void MoreButton::SetLessText( const XubString& rText )
257cdf0e10cSrcweir {
258cdf0e10cSrcweir if ( mpMBData )
259cdf0e10cSrcweir mpMBData->maLessText = rText;
260cdf0e10cSrcweir
261cdf0e10cSrcweir if ( mbState )
262cdf0e10cSrcweir SetText( rText );
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
265cdf0e10cSrcweir // -----------------------------------------------------------------------
GetLessText() const266cdf0e10cSrcweir XubString MoreButton::GetLessText() const
267cdf0e10cSrcweir {
268cdf0e10cSrcweir if ( mpMBData )
269cdf0e10cSrcweir return mpMBData->maLessText;
270cdf0e10cSrcweir else
271cdf0e10cSrcweir return PushButton::GetText();
272cdf0e10cSrcweir }
273cdf0e10cSrcweir
274