/********************************************************/
/* RCKTWL						*/
/*------------------------------------------------------*/
/* Yet another window library on curses.		*/
/*							*/
/********************************************************/

#include <stdlib.h>
#include "rcktwl.h"


//==========================================================================
// オーバーラップウインドウ作成
//--------------------------------------------------------------------------
//  普通にウインドウオブジェクトを作成するだけ。
//  
// 20,4の位置から、幅25,高さ10のウインドウを作り、
// ウインドウの 5,2の位置にテキストを表示。
//
RC_WINDOW *make_overlap_window( const char *text )
{
    RC_WINDOW *pw = new RC_WINDOW( 20, 4, 25, 10, "OVERLAP" );
    pw->mvprintstr( 5, 2, text );
    pw->draw();
    return pw;
}



//==========================================================================
// パッドウインドウ作成
//--------------------------------------------------------------------------
//  実表示領域より広い仮想画面を持ち、その一部を表示する。
//
// 30,12の位置から、幅20,高さ10のウインドウを作り、
// 幅80,高さ25の仮想画面を持たせる。
// 
RC_PADWIN *make_pad_window()
{
    RC_PADWIN *pw = new RC_PADWIN( 30, 12, 20, 10, 80, 25, "PAD WINDOW" );
    for( int x = 0; x < 80; x += 5 ) {
	for( int y = 0; y < 25; y += 3 ) {
	    pw->mvprintf( x, y, "%d", x );
	}
    }
    pw->draw();
    return pw;
}



//==========================================================================
// ウインドウの移動
//--------------------------------------------------------------------------
//  
//
void move_window( RC_WINDOW *pw )
{
    if( pw == NULL ) return;
    pw->moveTo( pw->getX()+(rand()%3-1), pw->getY()+(rand()%3-1) );
}



//==========================================================================
// パッドのスクロール
//--------------------------------------------------------------------------
//  
//
void scroll_pad( RC_PADWIN *pw )
{
    static int dx = 1, dy = 0;
    int err;

    if( pw == NULL ) return;
    while( err = pw->scrollTo( pw->getDispX()+dx, pw->getDispY()+dy ) )
    {
	do {
	    dx = rand() % 3 - 1;
	    dy = rand() % 3 - 1;
	} while( dx == 0 && dy == 0 );
    }
}




/***** Main functions *******************************************************/
main()
{
    RC_TEXTBOX *textbox;
    RC_SELECT *selbox;
    RC_BUTTON *button1, *button2;
    RC_WINDOW *overwin = NULL;
    RC_PADWIN *padwin = NULL;

/* 初期化 */
    RC_ROOTWIN.initialize();
    
/*
 * ウインドウの作成
 *  普通にオブジェクトを作るだけでOK。
 *  ウインドウの寿命は、通常の変数のスコープと同じ。
 *  (この例では、関数から帰る時に自動消去。newで生成すれば、deleteするまで。)
 */
    RC_WINDOW win( 2, 1, 40, 20, "SAMPLE WINDOW" );

/* ウインドウ内の任意の位置へ、文字を表示。*/
    win.mvprintstr( 2, 3, "TextBox:" );
    win.mvprintstr( 2, 5, "SelectBox:" );
    win.mvprintstr( 2, 7, "Buttons:" );

/*
 * アイテムの生成と、ウインドウへの配置
 *  この例では、テキストボックス、セレクトボックス、ボタンを生成している。
 *  アイテム類は、newで生成しなければならないという制限が有る。
 *  アイテム類の消去は、windowのデストラクタが担当するので、ユーザプログラムでは
 *  気にしなくてよい。
 */
/* テキストボックス */
    textbox = (RC_TEXTBOX*)win.insert( new RC_TEXTBOX( 14, 3, 16, "sample text." ) );

/* セレクトボックス */
    char *sv[] = { "Message Box", "Redraw all windows",
		   "Toggle overlap window", "Toggle pad window",
		   "Move overlap window", "Move pad window", "Scroll pad window", 0 };
    selbox = (RC_SELECT*)win.insert( new RC_SELECT( 14, 5, 25, sv ) );

/* ボタン */
    button1 = (RC_BUTTON*)win.insert( new RC_BUTTON( 14,  7, 10, "Submit" ) );
    button2 = (RC_BUTTON*)win.insert( new RC_BUTTON( 14, 10, 10, "End" ) );
    
/* ウインドウ描画 */
    if( ! win ) abort();	// error check.
    win.draw();

/* イベント(キー入力) 処理 */
    do
    {
	win.handleEvent();
	if( button1->isPress() )		// ボタン１が押されたら、
	{
	    button1->setValue( 0 );
	    switch( selbox->getValue() )	// セレクトボックス選ばれた動作を実行
	    {
	    case 0:				// message box
		rc_msgbox( "メッセージ\nボックス", RC_OKONLY );
		break;

	    case 1:				// redraw all windows
		rc_redraw();
		break;

	    case 2:				// Toggle overlap window
		if( overwin == NULL )
		    overwin = make_overlap_window( textbox->getValue() );
		else
		    { delete overwin; overwin = NULL; }
		break;
		
	    case 3:				// Toggle pad window
		if( padwin == NULL )
		    padwin = make_pad_window();
		else
		    { delete padwin; padwin = NULL; }
		break;

	    case 4:				// Move overlap window
		move_window( overwin );
		break;

	    case 5:				// Move pad window
		move_window( padwin );
		break;

	    case 6:				// Scroll pad window
		scroll_pad( padwin );
	    }
	}
    } while( ! button2->isPress() );
}
