xref: /trunk/main/basic/source/runtime/inputbox.cxx (revision e1f63238)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_basic.hxx"
26 
27 #ifndef _SV_BUTTON_HXX //autogen
28 #include <vcl/button.hxx>
29 #endif
30 #include <vcl/fixed.hxx>
31 #include <vcl/edit.hxx>
32 #include <vcl/dialog.hxx>
33 #include <vcl/svapp.hxx>
34 #include "runtime.hxx"
35 #include "stdobj.hxx"
36 #include "rtlproto.hxx"
37 
38 class SvRTLInputBox : public ModalDialog
39 {
40 	Edit aEdit;
41 	OKButton aOk;
42 	CancelButton aCancel;
43 	FixedText aPromptText;
44 	String aText;
45 
46 	void PositionDialog( long nXTwips, long nYTwips, const Size& rDlgSize );
47 	void InitButtons( const Size& rDlgSize );
48 	void PositionEdit( const Size& rDlgSize );
49 	void PositionPrompt( const String& rPrompt, const Size& rDlgSize );
50 	DECL_LINK( OkHdl, Button * );
51 	DECL_LINK( CancelHdl, Button * );
52 
53 public:
54 	SvRTLInputBox( Window* pParent, const String& rPrompt, const String& rTitle,
55 		const String& rDefault, long nXTwips = -1, long nYTwips = -1 );
GetText() const56 	String GetText() const { return aText; }
57 };
58 
SvRTLInputBox(Window * pParent,const String & rPrompt,const String & rTitle,const String & rDefault,long nXTwips,long nYTwips)59 SvRTLInputBox::SvRTLInputBox( Window* pParent, const String& rPrompt,
60 		const String& rTitle, const String& rDefault,
61 		long nXTwips, long nYTwips ) :
62 	ModalDialog( pParent,WB_3DLOOK | WB_MOVEABLE | WB_CLOSEABLE ),
63 	aEdit( this,  WB_LEFT | WB_BORDER ),
64 	aOk( this ), aCancel( this ), aPromptText( this, WB_WORDBREAK )
65 {
66 	SetMapMode( MapMode( MAP_APPFONT ) );
67 	Size aDlgSizeApp( 280, 80 );
68 	PositionDialog( nXTwips, nYTwips, aDlgSizeApp );
69 	InitButtons( aDlgSizeApp );
70 	PositionEdit( aDlgSizeApp );
71 	PositionPrompt( rPrompt, aDlgSizeApp );
72 	aOk.Show();
73 	aCancel.Show();
74 	aEdit.Show();
75 	aPromptText.Show();
76 	SetText( rTitle );
77 	Font aFont( GetFont());
78 	Color aColor( GetBackground().GetColor() );
79 	aFont.SetFillColor( aColor );
80 	aEdit.SetFont( aFont );
81 	aEdit.SetText( rDefault );
82 	aEdit.SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) );
83 }
84 
InitButtons(const Size & rDlgSize)85 void SvRTLInputBox::InitButtons( const Size& rDlgSize )
86 {
87 	aOk.SetSizePixel( LogicToPixel( Size( 45, 15) ));
88 	aCancel.SetSizePixel( LogicToPixel( Size( 45, 15) ));
89 	Point aPos( rDlgSize.Width()-45-10, 5 );
90 	aOk.SetPosPixel( LogicToPixel( Point(aPos) ));
91 	aPos.Y() += 16;
92 	aCancel.SetPosPixel( LogicToPixel( Point(aPos) ));
93 	aOk.SetClickHdl(LINK(this,SvRTLInputBox, OkHdl));
94 	aCancel.SetClickHdl(LINK(this,SvRTLInputBox,CancelHdl));
95 }
96 
PositionDialog(long nXTwips,long nYTwips,const Size & rDlgSize)97 void SvRTLInputBox::PositionDialog(long nXTwips, long nYTwips, const Size& rDlgSize)
98 {
99 	SetSizePixel( LogicToPixel(rDlgSize) );
100 	if( nXTwips != -1 && nYTwips != -1 )
101     {
102     	Point aDlgPosApp( nXTwips, nYTwips );
103     	SetPosPixel( LogicToPixel( aDlgPosApp, MAP_TWIP ) );
104     }
105 }
106 
PositionEdit(const Size & rDlgSize)107 void SvRTLInputBox::PositionEdit( const Size& rDlgSize )
108 {
109 	aEdit.SetPosPixel( LogicToPixel( Point( 5,rDlgSize.Height()-35)));
110 	aEdit.SetSizePixel( LogicToPixel( Size(rDlgSize.Width()-15,12)));
111 }
112 
113 
PositionPrompt(const String & rPrompt,const Size & rDlgSize)114 void SvRTLInputBox::PositionPrompt(const String& rPrompt,const Size& rDlgSize)
115 {
116 	if ( rPrompt.Len() == 0 )
117 		return;
118 	String aText_( rPrompt );
119 	aText_.ConvertLineEnd( LINEEND_CR );
120 	aPromptText.SetPosPixel( LogicToPixel(Point(5,5)));
121 	aPromptText.SetText( aText_ );
122 	Size aSize( rDlgSize );
123 	aSize.Width() -= 70;
124 	aSize.Height() -= 50;
125 	aPromptText.SetSizePixel( LogicToPixel(aSize));
126 }
127 
128 
IMPL_LINK_INLINE_START(SvRTLInputBox,OkHdl,Button *,pButton)129 IMPL_LINK_INLINE_START( SvRTLInputBox, OkHdl, Button *, pButton )
130 {
131     (void)pButton;
132 
133 	aText = aEdit.GetText();
134 	EndDialog( 1 );
135 	return 0;
136 }
IMPL_LINK_INLINE_END(SvRTLInputBox,OkHdl,Button *,pButton)137 IMPL_LINK_INLINE_END( SvRTLInputBox, OkHdl, Button *, pButton )
138 
139 IMPL_LINK_INLINE_START( SvRTLInputBox, CancelHdl, Button *, pButton )
140 {
141     (void)pButton;
142 
143 	aText.Erase();
144 	EndDialog( 0 );
145 	return 0;
146 }
IMPL_LINK_INLINE_END(SvRTLInputBox,CancelHdl,Button *,pButton)147 IMPL_LINK_INLINE_END( SvRTLInputBox, CancelHdl, Button *, pButton )
148 
149 
150 // *********************************************************************
151 // *********************************************************************
152 // *********************************************************************
153 
154 // Syntax: String InputBox( Prompt, [Title], [Default] [, nXpos, nYpos ] )
155 
156 RTLFUNC(InputBox)
157 {
158     (void)pBasic;
159     (void)bWrite;
160 
161 	sal_uIntPtr nArgCount = rPar.Count();
162 	if ( nArgCount < 2 )
163 		StarBASIC::Error( SbERR_BAD_ARGUMENT );
164 	else
165 	{
166 		String aTitle;
167 		String aDefault;
168 		sal_Int32 nX = -1, nY = -1;  // zentrieren
169 		const String& rPrompt = rPar.Get(1)->GetString();
170 		if ( nArgCount > 2 && !rPar.Get(2)->IsErr() )
171 			aTitle = rPar.Get(2)->GetString();
172 		if ( nArgCount > 3 && !rPar.Get(3)->IsErr() )
173 			aDefault = rPar.Get(3)->GetString();
174 		if ( nArgCount > 4 )
175 		{
176 			if ( nArgCount != 6 )
177 			{
178 				StarBASIC::Error( SbERR_BAD_ARGUMENT );
179 				return;
180 			}
181 			nX = rPar.Get(4)->GetLong();
182 			nY = rPar.Get(5)->GetLong();
183 		}
184 		SvRTLInputBox *pDlg=new SvRTLInputBox(GetpApp()->GetDefDialogParent(),
185 					rPrompt,aTitle,aDefault,nX,nY);
186 		pDlg->Execute();
187 		rPar.Get(0)->PutString( pDlg->GetText() );
188 		delete pDlg;
189 	}
190 }
191 
192 
193 
194