xref: /trunk/main/svtools/workben/browser.cxx (revision 5900e8ec)
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_svtools.hxx"
26 #include <vcl/svapp.hxx>
27 #include <vcl/sound.hxx>
28 #include <vcl/msgbox.hxx>
29 #include <vcl/floatwin.hxx>
30 #include <vcl/menu.hxx>
31 #include <vcl/wrkwin.hxx>
32 #include <vcl/edit.hxx>
33 #include <svtools/brwbox.hxx>
34 #include <vcl/group.hxx>
35 
36 #ifndef _SV_BUTTON_HXX //autogen
37 #include <vcl/button.hxx>
38 #endif
39 #include <vcl/dialog.hxx>
40 
41 #define MID_BROWSER 			10
42 #define MID_MODE				11
43 #define MID_EVENTVIEW			12
44 #define MID_INVALIDATE			13
45 #define MID_CLEAR				14
46 #define MID_ROW                 20
47 #define MID_INSERTROW_BEFORE	21
48 #define MID_INSERTROW_AT		22
49 #define MID_INSERTROW_BEHIND	23
50 #define MID_REMOVEROW_BEFORE	24
51 #define MID_REMOVEROW_AT		25
52 #define MID_REMOVEROW_BEHIND	26
53 #define MID_MODIFYROW_BEFORE	27
54 #define MID_MODIFYROW_AT		28
55 #define MID_MODIFYROW_BEHIND	29
56 #define MID_COL                 30
57 #define MID_INSERTCOL			31
58 #define MID_REMOVECOL			32
59 #define MID_MOVECOLLEFT 		33
60 #define MID_MOVECOLRIGHT		34
61 #define MID_SELECTIONS			60
62 #define MID_SELECTROW			61
63 #define MID_SELECTALL			62
64 #define MID_SELECTNONE			63
65 #define MID_INVERSE 			64
66 #define MID_EXTRAS  			70
67 #define MID_STARMONEY_1 		71
68 
69 //==================================================================
70 
71 class BrowseModeDialog: public ModalDialog
72 {
73 	RadioButton     aSingleSel;
74 	RadioButton     aMultiSel;
75 	GroupBox        aSelGroup;
76 
77 	CheckBox        aKeepHighlight;
78 	CheckBox        aColumnCursor;
79 	CheckBox        aThumbDragging;
80 	GroupBox        aOptGroup;
81 
82 	RadioButton     aNoHLines;
83 	RadioButton     aDottedHLines;
84 	RadioButton     aFullHLines;
85 	GroupBox        aHLinGroup;
86 
87 	RadioButton     aNoVLines;
88 	RadioButton     aDottedVLines;
89 	RadioButton     aFullVLines;
90 	GroupBox        aVLinGroup;
91 
92 	OKButton        aOKButton;
93 	CancelButton    aCancelButton;
94 
95 public:
96 					BrowseModeDialog( Window *pParent );
97 
98 	void            SetMode( BrowserMode eMode );
99 	BrowserMode     GetMode() const;
100 };
101 
102 //==================================================================
103 
104 DECLARE_LIST(DataList,long);
105 
106 class Browser: public BrowseBox
107 {
108 friend class AppWindow;
109 
110 	DataList        aRows;
111 	sal_Bool            bInverse;
112 	Edit*			pEdit;
113 
114 protected:
115 	virtual long    GetRowCount() const;
116 	virtual sal_Bool    SeekRow( long nRow );
117 	virtual void	PaintField( OutputDevice& rDev, const Rectangle& rRect,
118 								sal_uInt16 nColumnId ) const;
119 
120 	virtual void    Select();
121 	virtual void	DoubleClick();
122 	virtual void    CursorMoved();
123 	virtual void    StartScroll();
124 	virtual void    EndScroll();
125 	virtual void    Command( const CommandEvent &eEvt );
126 
127 	virtual sal_Bool    StartDragging( Pointer& rMovePtr,
128 								   Pointer& rCopyPtr );
129 	virtual void    EndDragging( const DropAction &rAction );
130 	virtual	void	MouseButtonDown( const BrowserMouseEvent &rEvt );
131 
132 public:
133 					Browser( AppWindow* pParent, BrowserMode eMode );
134 					~Browser();
135 
SetInverseSelection(sal_Bool bInverseSel)136 	void            SetInverseSelection( sal_Bool bInverseSel )
137 					{ bInverse = bInverseSel; }
138 };
139 
140 //------------------------------------------------------------------
141 
142 class AppWindow: public WorkWindow
143 {
144 	MenuBar         aMenu;
145 	PopupMenu		aBrwMenu, aRowMenu, aColMenu, aSelMenu, aExtMenu;
146 	Edit			aEdit;
147 	Browser         aBrowser;
148 	BrowserMode     eCurMode;
149 	FloatingWindow *pEventView;
150 	sal_uLong           nNewRowNo;
151 
152 private:
153 	DECL_LINK( Modify, void * );
154 	DECL_LINK( MenuSelect, Menu * );
155 
156 protected:
157 	void            Resize();
158 	void            Activate();
159 
160 public:
161 					AppWindow();
162 					~AppWindow();
163 
164 	void            Event( const String &rEvent );
165 };
166 
167 //------------------------------------------------------------------
168 
169 class App: public Application
170 {
171 protected:
172 	void            Main();
173 
174 public:
175 					App();
176 					~App();
177 };
178 
179 //==================================================================
180 
181 App aApp;
182 
183 //==================================================================
184 
BrowseModeDialog(Window * pParent)185 BrowseModeDialog::BrowseModeDialog( Window *pParent ):
186 	ModalDialog( pParent, WinBits( WB_MOVEABLE | WB_CLOSEABLE | WB_3DLOOK ) ),
187 
188 	aSingleSel( this ),
189 	aMultiSel( this ),
190 	aSelGroup( this ),
191 
192 	aKeepHighlight( this ),
193 	aColumnCursor( this ),
194 	aThumbDragging( this ),
195 	aOptGroup( this ),
196 
197 	aNoHLines( this ),
198 	aDottedHLines( this ),
199 	aFullHLines( this ),
200 	aHLinGroup( this ),
201 
202 	aNoVLines( this, WinBits( WB_GROUP ) ),
203 	aDottedVLines( this ),
204 	aFullVLines( this ),
205 	aVLinGroup( this ),
206 
207 	aOKButton( this ),
208 	aCancelButton( this )
209 {
210 	SetOutputSizePixel( Size( 290, 220 ) );
211 	SetText( String( "Browse Mode", RTL_TEXTENCODING_IBM_850 ) );
212 
213 	aSingleSel.SetText( String( "single", RTL_TEXTENCODING_IBM_850 ) );
214 	aMultiSel.SetText( String( "multi", RTL_TEXTENCODING_IBM_850 ) );
215 	aSelGroup.SetText( String( " Selection ", RTL_TEXTENCODING_IBM_850 ) );
216 
217 	aKeepHighlight.SetText( String( "keep highlight", RTL_TEXTENCODING_IBM_850 ) );
218 	aColumnCursor.SetText( String( "column cursor", RTL_TEXTENCODING_IBM_850 ) );
219 	aThumbDragging.SetText( String( "thumb dragging", RTL_TEXTENCODING_IBM_850 ) );
220 	aOptGroup.SetText( String( " Options ", RTL_TEXTENCODING_IBM_850 ) );
221 
222 	aNoHLines.SetText( String( "none", RTL_TEXTENCODING_IBM_850 ) );
223 	aDottedHLines.SetText( String( "dotted", RTL_TEXTENCODING_IBM_850 ) );
224 	aFullHLines.SetText( String( "full", RTL_TEXTENCODING_IBM_850 ) );
225 	aHLinGroup.SetText( String( " Horizontal ", RTL_TEXTENCODING_IBM_850 ) );
226 
227 	aNoVLines.SetText( String( "none", RTL_TEXTENCODING_IBM_850 ) );
228 	aDottedVLines.SetText( String( "dotted", RTL_TEXTENCODING_IBM_850 ) );
229 	aFullVLines.SetText( String( "full", RTL_TEXTENCODING_IBM_850 ) );
230 	aVLinGroup.SetText( String( " Vertical ", RTL_TEXTENCODING_IBM_850 ) );
231 
232 	aSingleSel.SetPosSizePixel( Point( 20, 30 ), Size( 80, 14 ) );
233 	aMultiSel.SetPosSizePixel( Point( 20, 70 ), Size( 80, 14 ) );
234 	aSelGroup.SetPosSizePixel( Point( 10, 10 ), Size( 100, 80 ) );
235 	aSelGroup.SetText( String( " Selection ", RTL_TEXTENCODING_IBM_850 ) );
236 
237 	aKeepHighlight.SetPosSizePixel( Point( 130, 30 ), Size( 140, 14 ) );
238 	aColumnCursor.SetPosSizePixel( Point( 130, 50 ), Size( 140, 14 ) );
239 	aThumbDragging.SetPosSizePixel( Point( 130, 70 ), Size( 140, 14 ) );
240 	aOptGroup.SetPosSizePixel( Point( 120, 10 ), Size( 160, 80 ) );
241 	aOptGroup.SetText( String( " Options ", RTL_TEXTENCODING_IBM_850 ) );
242 
243 	aNoHLines.SetPosSizePixel( Point( 20, 120 ), Size( 80, 14 ) );
244 	aDottedHLines.SetPosSizePixel( Point( 20, 140 ), Size( 80, 14 ) );
245 	aFullHLines.SetPosSizePixel( Point( 20, 160 ), Size( 80, 14 ) );
246 	aHLinGroup.SetPosSizePixel( Point( 10, 100 ), Size( 100, 80 ) );
247 	aHLinGroup.SetText( String( " horizontal ", RTL_TEXTENCODING_IBM_850 ) );
248 
249 	aNoVLines.SetPosSizePixel( Point( 130, 120 ), Size( 80, 14 ) );
250 	aDottedVLines.SetPosSizePixel( Point( 130, 140 ), Size( 80, 14 ) );
251 	aFullVLines.SetPosSizePixel( Point( 130, 160 ), Size( 80, 14 ) );
252 	aVLinGroup.SetPosSizePixel( Point( 120, 100 ), Size( 100, 80 ) );
253 	aVLinGroup.SetText( String( " vertical ", RTL_TEXTENCODING_IBM_850 ) );
254 
255 	aOKButton.SetPosSizePixel( Point( 10, 190 ), Size( 100, 22 ) );
256 	aCancelButton.SetPosSizePixel( Point( 120, 190 ), Size( 100, 22 ) );
257 
258 	aSingleSel.Check();
259 	aNoHLines.Check();
260 	aNoVLines.Check();
261 
262 	aSingleSel.Show();
263 	aMultiSel.Show();
264 	aSelGroup.Show();
265 
266 	aKeepHighlight.Show();
267 	aColumnCursor.Show();
268 	aThumbDragging.Show();
269 	aOptGroup.Show();
270 
271 	aNoHLines.Show();
272 	aDottedHLines.Show();
273 	aFullHLines.Show();
274 	aHLinGroup.Show();
275 
276 	aNoVLines.Show();
277 	aDottedVLines.Show();
278 	aFullVLines.Show();
279 	aVLinGroup.Show();
280 
281 	aOKButton.Show();
282 	aCancelButton.Show();
283 }
284 
285 //------------------------------------------------------------------
286 
SetMode(BrowserMode eMode)287 void BrowseModeDialog::SetMode( BrowserMode eMode )
288 {
289 	if ( ( eMode & BROWSER_COLUMNSELECTION ) == BROWSER_COLUMNSELECTION )
290 		aColumnCursor.Check();
291 	if ( ( eMode & BROWSER_MULTISELECTION ) == BROWSER_MULTISELECTION )
292 		aMultiSel.Check();
293 	if ( ( eMode & BROWSER_THUMBDRAGGING ) == BROWSER_THUMBDRAGGING )
294 		aThumbDragging.Check();
295 	if ( ( eMode & BROWSER_KEEPHIGHLIGHT ) == BROWSER_KEEPHIGHLIGHT )
296 		aKeepHighlight.Check();
297 	if ( ( eMode & BROWSER_HLINESFULL ) == BROWSER_HLINESFULL )
298 		aFullHLines.Check();
299 	if ( ( eMode & BROWSER_VLINESFULL ) == BROWSER_VLINESFULL )
300 		aFullVLines.Check();
301 	if ( ( eMode & BROWSER_HLINESDOTS ) == BROWSER_HLINESDOTS )
302 		aDottedHLines.Check();
303 	if ( ( eMode & BROWSER_VLINESDOTS ) == BROWSER_VLINESDOTS )
304 		aDottedVLines.Check();
305 }
306 
307 //------------------------------------------------------------------
308 
GetMode() const309 BrowserMode BrowseModeDialog::GetMode() const
310 {
311 	BrowserMode eMode = 0;
312 
313 	if ( aColumnCursor.IsChecked() )
314 		eMode |= BROWSER_COLUMNSELECTION;
315 	if ( aMultiSel.IsChecked() )
316 		eMode |= BROWSER_MULTISELECTION;
317 
318 	if ( aKeepHighlight.IsChecked() )
319 		eMode |= BROWSER_KEEPHIGHLIGHT;
320 	if ( aThumbDragging.IsChecked() )
321 		eMode |= BROWSER_THUMBDRAGGING;
322 
323 	if ( aDottedHLines.IsChecked() )
324 		eMode |= BROWSER_HLINESDOTS;
325 	if ( aFullHLines.IsChecked() )
326 		eMode |= BROWSER_HLINESFULL;
327 
328 	if ( aDottedVLines.IsChecked() )
329 		eMode |= BROWSER_VLINESDOTS;
330 	if ( aFullVLines.IsChecked() )
331 		eMode |= BROWSER_VLINESFULL;
332 
333 	return eMode;
334 }
335 
336 //==================================================================
337 
Browser(AppWindow * pParent,BrowserMode eMode)338 Browser::Browser( AppWindow* pParent, BrowserMode eMode ):
339 	BrowseBox( pParent, WinBits(WB_DRAG), eMode ),
340 	bInverse(sal_False),
341 	pEdit( 0 )
342 {
343 	for ( long n = 0; n < 100; ++n )
344 		aRows.Insert( n, LIST_APPEND );
345 
346 	//InsertHandleColumn( 30 );
347 	InsertDataColumn( 1, String( "eins", RTL_TEXTENCODING_IBM_850 ), 85 ); // FreezeColumn( 1 );
348 	InsertDataColumn( 2, String( "zwei", RTL_TEXTENCODING_IBM_850 ), 85 ); // FreezeColumn( 2 );
349 	InsertDataColumn( 3, String( "drei", RTL_TEXTENCODING_IBM_850 ), 85 );
350 	InsertDataColumn( 4, String( "vier", RTL_TEXTENCODING_IBM_850 ), 85 );
351 	InsertDataColumn( 5, String( "fuenf", RTL_TEXTENCODING_IBM_850 ), 85 );
352 	InsertDataColumn( 6, String( "sechs", RTL_TEXTENCODING_IBM_850 ), 85 );
353 	InsertDataColumn( 7, String( "sieben", RTL_TEXTENCODING_IBM_850 ), 85 );
354 	InsertDataColumn( 8, String( "acht", RTL_TEXTENCODING_IBM_850 ), 85 );
355 	InsertDataColumn( 9, String( "neun", RTL_TEXTENCODING_IBM_850 ), 85 );
356 	InsertDataColumn(10, String( "zehn", RTL_TEXTENCODING_IBM_850 ), 85 );
357 }
358 
359 //------------------------------------------------------------------
360 
~Browser()361 Browser::~Browser()
362 {
363 	delete pEdit;
364 }
365 
366 //------------------------------------------------------------------
367 
StartDragging(Pointer & rMovePtr,Pointer & rCopyPtr)368 sal_Bool Browser::StartDragging( Pointer& rMovePtr, Pointer& rCopyPtr )
369 {
370 	rMovePtr = Pointer( POINTER_MOVEDATA );
371 	rCopyPtr = Pointer( POINTER_COPYDATA );
372 	return sal_True;
373 }
374 
375 //------------------------------------------------------------------
376 
MouseButtonDown(const BrowserMouseEvent & rEvt)377 void Browser::MouseButtonDown( const BrowserMouseEvent &rEvt )
378 {
379 	if ( 3 == rEvt.GetClicks() )
380 		InfoBox( 0, String( GetColumnAtXPosPixel(rEvt.GetPosPixel().X() ) ) ).Execute();
381 	else
382 		BrowseBox::MouseButtonDown( rEvt );
383 }
384 
385 //------------------------------------------------------------------
386 
EndDragging(const DropAction & rAction)387 void Browser::EndDragging( const DropAction &rAction )
388 {
389 }
390 
391 //------------------------------------------------------------------
392 
StartScroll()393 void Browser::StartScroll()
394 {
395 	( (AppWindow*) GetParent() )->Event( String( "StartScroll", RTL_TEXTENCODING_IBM_850 ) );
396 	if ( pEdit )
397 		pEdit->Hide();
398 	BrowseBox::StartScroll();
399 }
400 
401 //------------------------------------------------------------------
402 
EndScroll()403 void Browser::EndScroll()
404 {
405 	BrowseBox::EndScroll();
406 	( (AppWindow*) GetParent() )->Event( String( "EndScroll", RTL_TEXTENCODING_IBM_850 ) );
407 	if ( pEdit )
408 		pEdit->Show();
409 }
410 //------------------------------------------------------------------
411 
Command(const CommandEvent & rEvt)412 void Browser::Command( const CommandEvent &rEvt )
413 {
414 	String aEvent( String( "Command at ", RTL_TEXTENCODING_IBM_850 ) );
415 	aEvent += rEvt.GetMousePosPixel().X();
416 	aEvent += String( ":", RTL_TEXTENCODING_IBM_850 );
417 	aEvent += rEvt.GetMousePosPixel().Y();
418 	( (AppWindow*) GetParent() )->Event( aEvent );
419 	BrowseBox::Command(rEvt);
420 }
421 
422 //------------------------------------------------------------------
423 
Select()424 void Browser::Select()
425 {
426 	String aEvent( String( "Select: ", RTL_TEXTENCODING_IBM_850 ) );
427 	DELETEZ(pEdit);
428 	for ( long nRow = FirstSelectedRow(bInverse); nRow >= 0; nRow = NextSelectedRow() )
429 	{
430 		if ( bInverse )
431 			aEvent += String( String( "~", RTL_TEXTENCODING_IBM_850 ) );
432 		aEvent += String( nRow );
433 		aEvent += String( ", ", RTL_TEXTENCODING_IBM_850 );
434 	}
435 	aEvent.Erase( aEvent.Len() - 2 );
436 
437 	( (AppWindow*) GetParent() )->Event( aEvent );
438 }
439 
440 //------------------------------------------------------------------
441 
DoubleClick()442 void Browser::DoubleClick()
443 {
444 	String aEvent( String( "DoubleClick: ", RTL_TEXTENCODING_IBM_850 ) );
445 	aEvent += String( GetCurRow() );
446 	aEvent += String( String( ", ", RTL_TEXTENCODING_IBM_850 ) );
447 	aEvent += String( FirstSelectedRow() );
448 	( (AppWindow*) GetParent() )->Event( aEvent );
449 
450 	SetNoSelection();
451 	if ( !pEdit )
452 		pEdit = new Edit( &GetDataWindow() );
453 	Rectangle aRect( GetFieldRect( GetCurColumnId() ) );
454 	pEdit->SetPosSizePixel( aRect.TopLeft(), aRect.GetSize() );
455 	pEdit->Show();
456 	pEdit->GrabFocus();
457 }
458 
459 //------------------------------------------------------------------
460 
CursorMoved()461 void Browser::CursorMoved()
462 {
463 	String aEvent( String( "Cursor: ", RTL_TEXTENCODING_IBM_850 ) );
464 	aEvent += String( GetCurRow() );
465 	aEvent += String( ":", RTL_TEXTENCODING_IBM_850 );
466 	aEvent += String( GetCurColumnId() );
467 	( (AppWindow*) GetParent() )->Event( aEvent );
468 	if ( IsFieldVisible( GetCurRow(), GetCurColumnId(), sal_True ) )
469 		( (AppWindow*) GetParent() )->Event( String( "completely visible", RTL_TEXTENCODING_IBM_850 ) );
470 	else if ( IsFieldVisible( 1, GetCurColumnId(), sal_False) )
471 		( (AppWindow*) GetParent() )->Event( String( "partly visible", RTL_TEXTENCODING_IBM_850 ) );
472 	else
473 		( (AppWindow*) GetParent() )->Event( String( "not visible", RTL_TEXTENCODING_IBM_850 ) );
474 
475 	DELETEZ(pEdit);
476 }
477 
478 //------------------------------------------------------------------
479 
GetRowCount() const480 long Browser::GetRowCount() const
481 {
482 	return aRows.Count();
483 }
484 
485 //------------------------------------------------------------------
486 
SeekRow(long nRow)487 sal_Bool Browser::SeekRow( long nRow )
488 {
489 	if ( nRow >= 0 && nRow < (long) aRows.Count() )
490 	{
491 		aRows.Seek(nRow);
492 		return sal_True;
493 	}
494 	return sal_False;
495 }
496 
497 //------------------------------------------------------------------
498 
PaintField(OutputDevice & rDev,const Rectangle & rRect,sal_uInt16 nColumnId) const499 void Browser::PaintField( OutputDevice& rDev, const Rectangle& rRect,
500 						  sal_uInt16 nColumnId ) const
501 {
502 	rDev.SetClipRegion( rRect );
503 	String aText( aRows.GetCurObject() );
504 	aText += String( ".", RTL_TEXTENCODING_IBM_850 );
505 	aText += String( nColumnId );
506 	rDev.DrawText( rRect.TopLeft(), aText );
507 }
508 
509 //==================================================================
510 
AppWindow()511 AppWindow::AppWindow():
512 	WorkWindow( 0, WinBits(WB_APP|WB_STDWORK) ),
513 	aEdit( this, WinBits( WB_BORDER ) ),
514 	aBrowser( this, 0 ),
515 	eCurMode( 0 ),
516 	pEventView( 0 ),
517 	nNewRowNo( 2000L )
518 {
519 	SetText( String( "BrowseBox Testframe", RTL_TEXTENCODING_IBM_850 ) );
520 
521 	aMenu.InsertItem( MID_BROWSER, String( "~Browser", RTL_TEXTENCODING_IBM_850 ) );
522 	 aMenu.SetPopupMenu( MID_BROWSER, &aBrwMenu );
523 	 aBrwMenu.InsertItem( MID_MODE, String( "~Mode...", RTL_TEXTENCODING_IBM_850 ) );
524 	 aBrwMenu.InsertItem( MID_EVENTVIEW, String( "~Event-Viewer", RTL_TEXTENCODING_IBM_850 ) );
525 	 aBrwMenu.InsertSeparator();
526 	 aBrwMenu.InsertItem( MID_INVALIDATE, String( "~Invalidate", RTL_TEXTENCODING_IBM_850 ) );
527 	 aBrwMenu.InsertItem( MID_CLEAR, String( "~Clear", RTL_TEXTENCODING_IBM_850 ) );
528 	aMenu.InsertItem( MID_ROW, String( "~Row", RTL_TEXTENCODING_IBM_850 ) );
529 	 aMenu.SetPopupMenu( MID_ROW, &aRowMenu );
530 	 aRowMenu.InsertItem( MID_INSERTROW_BEFORE, String( "Insert before current", RTL_TEXTENCODING_IBM_850 ) );
531 	 aRowMenu.InsertItem( MID_INSERTROW_AT, String( "~Insert at current", RTL_TEXTENCODING_IBM_850 ) );
532 	 aRowMenu.InsertItem( MID_INSERTROW_BEHIND, String( "~Insert behind current", RTL_TEXTENCODING_IBM_850 ) );
533 	 aRowMenu.InsertSeparator();
534 	 aRowMenu.InsertItem( MID_REMOVEROW_BEFORE, String( "Remove before current", RTL_TEXTENCODING_IBM_850 ) );
535 	 aRowMenu.InsertItem( MID_REMOVEROW_AT, String( "~Remove at current", RTL_TEXTENCODING_IBM_850 ) );
536 	 aRowMenu.InsertItem( MID_REMOVEROW_BEHIND, String( "~Remove behind current", RTL_TEXTENCODING_IBM_850 ) );
537 	 aRowMenu.InsertSeparator();
538 	 aRowMenu.InsertItem( MID_MODIFYROW_BEFORE, String( "Modify before current", RTL_TEXTENCODING_IBM_850 ) );
539 	 aRowMenu.InsertItem( MID_MODIFYROW_AT, String( "~Modify at current", RTL_TEXTENCODING_IBM_850 ) );
540 	 aRowMenu.InsertItem( MID_MODIFYROW_BEHIND, String( "~Modify behind current", RTL_TEXTENCODING_IBM_850 ) );
541 	aMenu.InsertItem( MID_COL, String( "~Column", RTL_TEXTENCODING_IBM_850 ) );
542 	 aMenu.SetPopupMenu( MID_COL, &aColMenu );
543 	 aColMenu.InsertItem( MID_INSERTCOL, String( "~Insert", RTL_TEXTENCODING_IBM_850 ) );
544 	 aColMenu.InsertItem( MID_REMOVECOL, String( "Re~move", RTL_TEXTENCODING_IBM_850 ) );
545 	 aColMenu.InsertItem( MID_MOVECOLLEFT, String( "Move ~Left", RTL_TEXTENCODING_IBM_850 ) );
546 	 aColMenu.InsertItem( MID_MOVECOLRIGHT, String( "Move ~Right", RTL_TEXTENCODING_IBM_850 ) );
547 	aMenu.InsertItem( MID_SELECTIONS, String( "Selections", RTL_TEXTENCODING_IBM_850 ) );
548 	 aMenu.SetPopupMenu( MID_SELECTIONS, &aSelMenu );
549 	 aSelMenu.InsertItem( MID_SELECTROW, String( "Row", RTL_TEXTENCODING_IBM_850 ) );
550 	 aSelMenu.InsertItem( MID_SELECTALL, String( "All", RTL_TEXTENCODING_IBM_850 ) );
551 	 aSelMenu.InsertItem( MID_SELECTNONE, String( "None", RTL_TEXTENCODING_IBM_850 ) );
552 	 aSelMenu.InsertItem( MID_INVERSE, String( "Inverse", RTL_TEXTENCODING_IBM_850 ), MENU_APPEND, MIB_CHECKABLE );
553 	aMenu.InsertItem( MID_EXTRAS, String( "Extras", RTL_TEXTENCODING_IBM_850 ) );
554 	 aMenu.SetPopupMenu( MID_EXTRAS, &aExtMenu );
555 	 aExtMenu.InsertItem( MID_STARMONEY_1, String( "StarMoney: SelectRow(+1)+DeleteRow", RTL_TEXTENCODING_IBM_850 ) );
556 	aMenu.PushSelectHdl( LINK(this, AppWindow, MenuSelect) );
557 
558 	aEdit.SetModifyHdl( LINK(this,AppWindow,Modify) );
559 
560 	aEdit.Show();
561 	aBrowser.Show();
562 	Show();
563 }
564 
565 //------------------------------------------------------------------
566 
~AppWindow()567 AppWindow::~AppWindow()
568 {
569 	GetpApp()->SetAppMenu( 0 );
570 	if ( pEventView )
571 		delete pEventView;
572 }
573 
574 //------------------------------------------------------------------
575 
IMPL_LINK_INLINE_START(AppWindow,Modify,void *,pCaller)576 IMPL_LINK_INLINE_START( AppWindow, Modify, void *, pCaller )
577 {
578 	Edit *pEdit = (Edit*) pCaller;
579 	aBrowser.GoToRow( pEdit->GetText().ToInt32() );
580 	aBrowser.GrabFocus();
581 
582 	return sal_True;
583 }
IMPL_LINK_INLINE_END(AppWindow,Modify,void *,pCaller)584 IMPL_LINK_INLINE_END( AppWindow, Modify, void *, pCaller )
585 
586 //------------------------------------------------------------------
587 
588 IMPL_LINK( AppWindow, MenuSelect, Menu *, pMenu )
589 {
590 	sal_uLong nPos;
591 
592 	switch ( pMenu->GetCurItemId() )
593 	{
594 		case MID_MODE:
595 		{
596 			BrowseModeDialog *pDlg = new BrowseModeDialog( this );
597 			pDlg->SetMode( eCurMode );
598 			if ( pDlg->Execute() == RET_OK )
599 			{
600 				eCurMode = pDlg->GetMode();
601 				aBrowser.SetMode( eCurMode | BROWSER_AUTOSIZE_LASTCOL );
602 			}
603 			delete pDlg;
604 			break;
605 		}
606 
607 		case MID_INVALIDATE:
608 			aBrowser.Invalidate();
609 			break;
610 
611 		case MID_INSERTROW_BEFORE:
612 			if ( aBrowser.GetCurRow() == 0 )
613 			{
614 				Sound::Beep();
615 				break;
616 			}
617 			nPos = aBrowser.GetCurRow() - 1;
618 			aBrowser.aRows.Insert( nNewRowNo++, nPos );
619 			aBrowser.RowInserted( aBrowser.GetCurRow()-1 );
620 			break;
621 
622 		case MID_INSERTROW_AT:
623 			nPos = aBrowser.GetCurRow();
624 			if ( nPos == BROWSER_ENDOFSELECTION )
625 				nPos = 0;
626 			aBrowser.aRows.Insert( nNewRowNo++, nPos );
627 			aBrowser.RowInserted( nPos );
628 			break;
629 
630 		case MID_INSERTROW_BEHIND:
631 			nPos = aBrowser.GetCurRow() + 1;
632 			aBrowser.aRows.Insert( nNewRowNo++, nPos );
633 			aBrowser.RowInserted( nPos );
634 			break;
635 
636 		case MID_REMOVEROW_BEFORE:
637 			if ( aBrowser.GetCurRow() == 0 )
638 			{
639 				Sound::Beep();
640 				break;
641 			}
642 			nPos = aBrowser.GetCurRow() - 1;
643 			aBrowser.aRows.Remove( nPos );
644 			aBrowser.RowRemoved( nPos );
645 			break;
646 
647 		case MID_REMOVEROW_AT:
648 			nPos = aBrowser.GetCurRow();
649 			aBrowser.aRows.Remove( nPos );
650 			aBrowser.RowRemoved( nPos );
651 			break;
652 
653 		case MID_REMOVEROW_BEHIND:
654 			if ( (aBrowser.GetCurRow()+1) >= aBrowser.GetRowCount() )
655 			{
656 				Sound::Beep();
657 				break;
658 			}
659 			nPos = aBrowser.GetCurRow() + 1;
660 			aBrowser.aRows.Remove( nPos );
661 			aBrowser.RowRemoved( nPos );
662 			break;
663 
664 		case MID_MODIFYROW_BEFORE:
665 			if ( aBrowser.GetCurRow() == 0 )
666 			{
667 				Sound::Beep();
668 				break;
669 			}
670 			nPos = aBrowser.GetCurRow() - 1;
671 			aBrowser.aRows.Replace( nNewRowNo++, nPos );
672 			aBrowser.RowModified( nPos );
673 			break;
674 
675 		case MID_MODIFYROW_AT:
676 			nPos = aBrowser.GetCurRow();
677 			aBrowser.aRows.Replace( nNewRowNo++, nPos );
678 			aBrowser.RowModified( nPos );
679 			break;
680 
681 		case MID_MODIFYROW_BEHIND:
682 			if ( (aBrowser.GetCurRow()+1) >= aBrowser.GetRowCount() )
683 			{
684 				Sound::Beep();
685 				break;
686 			}
687 			nPos = aBrowser.GetCurRow() + 1;
688 			aBrowser.aRows.Replace( nNewRowNo++, nPos );
689 			aBrowser.RowModified( nPos );
690 			break;
691 
692 		case MID_EVENTVIEW:
693 			if ( pEventView )
694 			{
695 				delete pEventView;
696 				pEventView = 0;
697 			}
698 			else
699 			{
700 				pEventView = new FloatingWindow( this );
701 				pEventView->SetPosPixel( Point( 100, 100 ) );
702 				pEventView->SetOutputSizePixel(
703 					Size( 320, 8*GetTextHeight() ) );
704 				pEventView->Show();
705 				aBrowser.CursorMoved();
706 				aBrowser.Select();
707 			}
708 			break;
709 
710 		case MID_SELECTROW:
711 			aBrowser.SelectRow( aBrowser.GetCurRow(),
712 				!aBrowser.IsRowSelected( aBrowser.GetCurRow() ) );
713 			break;
714 
715 		case MID_SELECTALL:
716 			aBrowser.SelectAll();
717 			break;
718 
719 		case MID_SELECTNONE:
720 			aBrowser.SetNoSelection();
721 			break;
722 
723 		case MID_INVERSE:
724 		{
725 			sal_Bool bChecked = pMenu->IsItemChecked( MID_INVERSE );
726 			pMenu->CheckItem( MID_INVERSE, !bChecked );
727 			aBrowser.SetInverseSelection( !bChecked );
728 			break;
729 		}
730 
731 		case MID_CLEAR:
732 			aBrowser.Clear();
733 			break;
734 
735 		case MID_STARMONEY_1:
736 		{
737 			nPos = aBrowser.GetCurRow();
738 			aBrowser.SelectRow( nPos + 1, sal_True );
739 			aBrowser.aRows.Remove( nPos );
740 			aBrowser.RowRemoved( nPos );
741 			break;
742 		}
743 	}
744 
745 	return sal_True;
746 }
747 
748 //------------------------------------------------------------------
749 
Resize()750 void AppWindow::Resize()
751 {
752 	Size aOutSz( GetOutputSizePixel() );
753 
754 	aEdit.SetPosSizePixel(
755 		Point( 0, 0 ),
756 		Size( aOutSz.Width(), 24 ) );
757 
758 	aBrowser.SetPosSizePixel(
759 		Point( 0, aEdit.GetSizePixel().Height() ),
760 		Size( aOutSz.Width(), aOutSz.Height() - 24 ) );
761 }
762 
763 //------------------------------------------------------------------
764 
Activate()765 void AppWindow::Activate()
766 {
767 	GetpApp()->SetAppMenu( &aMenu );
768 	aBrowser.GrabFocus();
769 }
770 
771 //------------------------------------------------------------------
772 
Event(const String & rEvent)773 void AppWindow::Event( const String &rEvent )
774 {
775 	if ( pEventView )
776 	{
777 		pEventView->Scroll( 0, -GetTextHeight() );
778 		pEventView->Update();
779 		pEventView->DrawText( Point(0, 7*GetTextHeight() ), rEvent );
780 	}
781 }
782 
783 //==================================================================
784 
App()785 App::App()
786 {
787 }
788 
789 //------------------------------------------------------------------
790 
~App()791 App::~App()
792 {
793 }
794 
795 //------------------------------------------------------------------
796 
Main()797 void App::Main( )
798 {
799 	EnableSVLook();
800 
801 	AppWindow aAppWin;
802 
803 
804 	Execute();
805 }
806 
807