/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_toolkit.hxx"
#include <tools/debug.hxx>

#include <vcl/window.hxx>
#include <vcl/svapp.hxx>
#include <vcl/wrkwin.hxx>
#include <vcl/msgbox.hxx>


#include <stardiv/uno/awt/window.hxx>
#include <stardiv/uno/awt/vclwin.hxx>
#include <stardiv/uno/awt/printer.hxx>
#include <stardiv/uno/repos/serinfo.hxx>
#include <stardiv/uno/lang/factory.hxx>


#include <unoctrl.hxx>
// #include <unoctrl2.hxx>

#include <svtools/unoiface.hxx>	// InitExtToolkit

UsrAny UsrAny_UINT16( UINT16 n )
{
	UsrAny aVal;
	aVal.setUINT16( n );
	return aVal;
}

// -----------------------------------------------------------------------

class MyApp : public Application
{
public:
    void        Main();
};

MyApp aMyApp;

// -----------------------------------------------------------------------

class MyWin : public WorkWindow
{
	XControlRef				xCtrl;
	XPropertySetRef			xCtrlModel;
	XControlContainerRef	xCont;
	XPropertySetRef			xContModel;
	XControlRef				xDrawCtrl;
	XGraphicsRef			xG;

public:
                MyWin( Window* pParent, WinBits nWinStyle );
                ~MyWin();

    void        MouseButtonDown( const MouseEvent& rMEvt );
    void        Resize();
    void        Paint( const Rectangle& r );
};

// -----------------------------------------------------------------------

void MyApp::Main()
{
	createAndSetDefaultServiceManager();

    MyWin aMainWin( NULL, WB_APP | WB_STDWORK );
    aMainWin.SetText( "Uno-Controls - Workbench" );
    aMainWin.Show();
    Execute();
}

// -----------------------------------------------------------------------

MyWin::MyWin( Window* pParent, WinBits nWinStyle ) :
    WorkWindow( pParent, nWinStyle )
{
}

// -----------------------------------------------------------------------
MyWin::~MyWin()
{
	XComponentRef xC1( xCont, USR_QUERY );
	xC1->dispose();
	XComponentRef xC2( xContModel, USR_QUERY );
	xC2->dispose();
}

// -----------------------------------------------------------------------

void MyWin::MouseButtonDown( const MouseEvent& rMEvt )
{
	if( rMEvt.GetClicks() == 2 )
	{
		XViewRef xV( xDrawCtrl, USR_QUERY );
		XWindowRef xC( xDrawCtrl, USR_QUERY );
		xV->draw( xC->getPosSize().Left(), xC->getPosSize().Top() );

		// Printer Testen...
/*
		XServiceManagerRef xProv = getGlobalServiceManager();
		XServiceProviderRef xSSI = xProv->queryServiceProvider( L"stardiv.vcl.PrinterServer" );
		XPrinterServerRef xPrinterServer( xSSI->createInstance(), USR_QUERY );

		Sequence< UString >	aPrinterNames = xPrinterServer->getPrinterNames();
		USHORT nPrinters = aPrinterNames.getLen();
		String aInfo( "Printers: " );
		aInfo += nPrinters;
		if ( nPrinters )
		{
			for ( USHORT n = 0; n < nPrinters; n++ )
			{
				aInfo += '\n';
				aInfo += OUStringToString( aPrinterNames.getConstArray()[n], CHARSET_SYSTEM );
			}

			XPrinterRef xPrinter = xPrinterServer->createPrinter( aPrinterNames.getConstArray()[0] );
			xPrinter->start( L"UNOPrinterTest", 1, TRUE );
			XDeviceRef xDev = xPrinter->startPage();
			XGraphicsRef xGraphics = xDev->createGraphics();
			xGraphics->drawText( 200, 200, L"Printed with UNO"  );
			xPrinter->endPage();
			xPrinter->end();
		}
		InfoBox( this, aInfo ).Execute();
*/
	}
	else if( rMEvt.GetClicks() == 1 )
	{
		if( xContModel )
		{
			static INT32 nColor = 0x001788ab;
 			xContModel->setPropertyValue( L"BackgroundColor", UsrAny( nColor ) );
			nColor += 0x00111111;
			nColor &= 0xFFFFFF;
		}
		else
		{
			XServiceManagerRef xProv = getGlobalServiceManager();

			XMultiServiceFactoryRef xMSF = NAMESPACE_USR( getProcessServiceManager )();

			XServiceProviderRef xSSI = xProv->queryServiceProvider( L"stardiv.vcl.VclToolkit" );
			XToolkitRef xToolkit( xMSF->createInstance( L"stardiv.vcl.VclToolkit" ), USR_QUERY );
			DBG_ASSERT( xToolkit, "No Toolkit!" );

			// Uno Container + Model erzeugen
			XServiceProviderRef xModelProv; // = xProv->queryServiceProvider( L"stardiv.vcl.controlmodel.ControlContainer" );
			XInterfaceRef xCMRef( xMSF->createInstance(L"stardiv.vcl.controlmodel.ControlContainer") );
			xCMRef->queryInterface( XPropertySet::getSmartUik(), xContModel );
 			xContModel->setPropertyValue( L"Border", UsrAny_UINT16( 1 ) );
 			xContModel->setPropertyValue( L"BackgroundColor", UsrAny( (UINT32)0x00CCCCCC) );

			xModelProv = xProv->queryServiceProvider( L"stardiv.vcl.control.ControlContainer" );
			XInterfaceRef xCCRef( xModelProv->createInstance(), USR_QUERY );
			xCCRef->queryInterface( XControlContainer::getSmartUik(), xCont );

			XControlModelRef xCM( xContModel, USR_QUERY );
			XControlRef xContControl( xCont, USR_QUERY );
			xContControl->setModel( xCM );
			XWindowRef xContComp( xCont, USR_QUERY );
			xContComp->setPosSize( 0, 0, 500, 600, PosSize_POSSIZE );

			// Zwei EditControls auf einem Model...
//			xModelProv = xProv->queryServiceProvider( L"stardiv.uno.awt.UnoControlEditModel" );
			XInterfaceRef xModel( xMSF->createInstance(L"stardiv.uno.awt.UnoControlEditModel") );
			DBG_ASSERT( xModel, "No Model!" );

			XPropertySetRef xPSet( xModel, USR_QUERY );
			xPSet->setPropertyValue( L"Text", UsrAny( UString( L"Hallo!" ) ) );
			xPSet->setPropertyValue( L"FontName", UsrAny( UString( L"Times New Roman" ) ) );
//			xPSet->setPropertyValue( L"FontWeight", UsrAny( 200 ) );

			XServiceProviderRef xEditCtrlProv = xProv->queryServiceProvider( L"stardiv.uno.awt.UnoControlEdit" );
			// Edit1
			XControlRef xEdit1( xMSF->createInstance(L"stardiv.uno.awt.UnoControlEdit"), USR_QUERY );
			xModel->queryInterface( XControlModel::getSmartUik(), xCM );
			xEdit1->setModel( xCM );
			XWindowRef xEditCmp1( xEdit1, USR_QUERY );
			xEditCmp1->setPosSize( 50, 50, 100, 60, PosSize_POSSIZE );
			xCont->addControl( L"", xEdit1 );
			// Edit2
			XControlRef xEdit2( xMSF->createInstance(L"stardiv.uno.awt.UnoControlEdit"), USR_QUERY );
			xModel->queryInterface( XControlModel::getSmartUik(), xCM );
			xEdit2->setModel( xCM );
			XWindowRef xEditCmp2( xEdit2, USR_QUERY );
			XLayoutConstrainsRef xL( xEdit2, USR_QUERY );
			if ( xL.is() )
			{
				Size aSz = xL->getPreferredSize();
				xEditCmp2->setPosSize( 100, 180, aSz.Width(), aSz.Height(), PosSize_POSSIZE );
			}
			else
				xEditCmp2->setPosSize( 100, 180, 100, 40, PosSize_POSSIZE );
			xCont->addControl( L"", xEdit2 );

			xModelProv = xProv->queryServiceProvider( L"stardiv.vcl.controlmodel.NumericField" );
			XInterfaceRef xNumModel( xModelProv->createInstance(), USR_QUERY );
			DBG_ASSERT( xNumModel, "No Model!" );


			XServiceProviderRef xNumFieldProv = xProv->queryServiceProvider( L"stardiv.vcl.control.NumericField" );
			XControlRef xNumField( xNumFieldProv->createInstance(), USR_QUERY );
			xNumModel->queryInterface( XControlModel::getSmartUik(), xCM );
			xNumField->setModel( xCM );
			XWindowRef xNumFieldWin( xNumField, USR_QUERY );
			xNumFieldWin->setPosSize( 50, 250, 100, 60, PosSize_POSSIZE );
			xCont->addControl( L"", xNumField );

			XMultiPropertySetRef xPSet2( xNumModel, USR_QUERY );
			Sequence<UString> Names( 2 );
			Names.getArray()[0] = L"Value";
			Names.getArray()[1] = L"ValueMin";
			Sequence<UsrAny> Values( 2 );
			Values.getArray()[0] = UsrAny( -2000000.0 );
			Values.getArray()[1] = UsrAny( -2000000.0 );
			xPSet2->setPropertyValues( Names, Values );


			// Button...
			xModelProv = xProv->queryServiceProvider( L"stardiv.vcl.controlmodel.Button" );
			xModelProv->createInstance()->queryInterface( XInterface::getSmartUik(), xModel );
			DBG_ASSERT( xModel, "No Model!" );

			xModel->queryInterface( XPropertySet::getSmartUik(), xPSet );
			xPSet->setPropertyValue( L"Label", UsrAny( L"Press!" ) );

			XServiceProviderRef xButtonCtrlProv = xProv->queryServiceProvider( L"stardiv.vcl.control.Button" );
			XControlRef xButton1( xButtonCtrlProv->createInstance(), USR_QUERY );
			xModel->queryInterface( XControlModel::getSmartUik(), xCM );
			xButton1->setModel( xCM );
			XWindowRef xButtonCmp1( xButton1, USR_QUERY );
			xButtonCmp1->setPosSize( 170, 80, 80, 80, PosSize_POSSIZE );
			// Unsichtbar, nur im MBDown mit DrawRoutine bei Doppel-Klick...
			xButtonCmp1->setVisible( FALSE );
			xDrawCtrl = xButton1;

			xCont->addControl( L"", xButton1 );

/*

			// ListBox...
			xModelProv = xProv->queryServiceProvider( L"stardiv.vcl.controlmodel.ListBox" );
			xModel = (XInterface*)xModelProv->createInstance()->queryInterface( XInterface::getSmartUik() );

			xPSet = (XPropertySet*)xModel->queryInterface( XPropertySet::getSmartUik() );
			Sequence<UString> aSeq( 7 );
			aSeq.getArray()[0] = L"Item1";
			aSeq.getArray()[1] = L"Item2";
			aSeq.getArray()[2] = L"Item3";
			aSeq.getArray()[3] = L"Item4";
			aSeq.getArray()[4] = L"Item5";
			aSeq.getArray()[5] = L"Item6";
			aSeq.getArray()[6] = L"Item7";
			xPSet->setPropertyValue( L"StringItemList", UsrAny( &aSeq, Sequence<UString>::getReflection() ) );
			xPSet->setPropertyValue( L"LineCount", UsrAny_UINT16( 4 ) );
			xPSet->setPropertyValue( L"Dropdown", UsrAny( (BOOL)TRUE ) );

			XServiceProviderRef xListBoxCtrlProv = xProv->queryServiceProvider( L"stardiv.vcl.control.ListBox" );
			XControlRef xListBox1 = (XControl*)xListBoxCtrlProv->createInstance()->queryInterface( XControl::getSmartUik() );
			xListBox1->setModel( (XControlModel*)xModel->queryInterface( XControlModel::getSmartUik() ) );
			XWindowRef xListBoxCmp1 = (XWindow*)xListBox1->queryInterface( XWindow::getSmartUik() );
			xListBoxCmp1->setPosSize( 20, 250, 200, 20, PosSize_POSSIZE );
			xCont->addControl( L"", xListBox1 );

			// FixedText...
			xModelProv = xProv->queryServiceProvider( L"stardiv.vcl.controlmodel.FixedText" );
			xModel = (XInterface*)xModelProv->createInstance()->queryInterface( XInterface::getSmartUik() );
			DBG_ASSERT( xModel, "No Model!" );

			xPSet = (XPropertySet*)xModel->queryInterface( XPropertySet::getSmartUik() );
			xPSet->setPropertyValue( L"Label", UsrAny( L"Label:" ) );
 			xPSet->setPropertyValue( L"BackgroundColor", UsrAny( (UINT32)0x00888888) );

			Font_Attribs aFontAttrs;
			aFontAttrs.Italic = ITALIC_NORMAL;
			xPSet->setPropertyValue( L"Font_Attribs", UsrAny( &aFontAttrs, Font_Attribs_getReflection() ) );

			XPropertyStateRef xState = (XPropertyState*)xPSet->queryInterface( XPropertyState::getSmartUik() );
			xState->getPropertyState( L"Font_Attribs" );
			xState->getPropertyState( L"Font_Size" );

			XServiceProviderRef xFixedTextCtrlProv = xProv->queryServiceProvider( L"stardiv.vcl.control.FixedText" );
			XControlRef xFixedText1 = (XControl*)xFixedTextCtrlProv->createInstance()->queryInterface( XControl::getSmartUik() );
			DBG_ASSERT( xFixedText1, "No FixedText!" );
			xFixedText1->setModel( (XControlModel*)xModel->queryInterface( XControlModel::getSmartUik() ) );
			XWindowRef xFixedTextCmp1 = (XWindow*)xFixedText1->queryInterface( XWindow::getSmartUik() );
			xFixedTextCmp1->setPosSize( 20, 20, 120, 20, PosSize_POSSIZE );
			xCont->addControl( L"", xFixedText1 );

			// TabTest...
			xModelProv = xProv->queryServiceProvider( L"stardiv.vcl.controlmodel.GroupBox" );
			xModel = (XInterface*)xModelProv->createInstance()->queryInterface( XInterface::getSmartUik() );
			xPSet = (XPropertySet*)xModel->queryInterface( XPropertySet::getSmartUik() );
			xPSet->setPropertyValue( L"Label", UsrAny( L"Radio-Test:" ) );
			XServiceProviderRef xGroupBoxCtrlProv = xProv->queryServiceProvider( L"stardiv.vcl.control.GroupBox" );
			XControlRef xGroupBox1 = (XControl*)xGroupBoxCtrlProv->createInstance()->queryInterface( XControl::getSmartUik() );
			xGroupBox1->setModel( (XControlModel*)xModel->queryInterface( XControlModel::getSmartUik() ) );
			XWindowRef xGroupBoxCmp1 = (XWindow*)xGroupBox1->queryInterface( XWindow::getSmartUik() );
			xGroupBoxCmp1->setPosSize( 30, 410, 100, 130, PosSize_POSSIZE );
			xCont->addControl( L"", xGroupBox1 );

			XServiceProviderRef xRadioButtonModelProv = xProv->queryServiceProvider( L"stardiv.vcl.controlmodel.RadioButton" );
			XServiceProviderRef xRadioButtonCtrlProv = xProv->queryServiceProvider( L"stardiv.vcl.control.RadioButton" );

			xModel = (XInterface*)xRadioButtonModelProv->createInstance()->queryInterface( XInterface::getSmartUik() );
			XControlRef xT1 = (XControl*)xRadioButtonCtrlProv->createInstance()->queryInterface( XControl::getSmartUik() );
			xT1->setModel( (XControlModel*)xModel->queryInterface( XControlModel::getSmartUik() ) );
			XWindowRef xTC1 = (XWindow*)xT1->queryInterface( XWindow::getSmartUik() );
			xTC1->setPosSize( 40, 430, 80, 20, PosSize_POSSIZE );
			xCont->addControl( L"", xT1 );
			xPSet = (XPropertySet*)xModel->queryInterface( XPropertySet::getSmartUik() );
			xPSet->setPropertyValue( L"Label", UsrAny( L"Radio1" ) );
			xPSet->setPropertyValue( L"State", UsrAny_UINT16( 1 ) );

			xModel = (XInterface*)xRadioButtonModelProv->createInstance()->queryInterface( XInterface::getSmartUik() );
			XControlRef xT2 = (XControl*)xRadioButtonCtrlProv->createInstance()->queryInterface( XControl::getSmartUik() );
			xT2->setModel( (XControlModel*)xModel->queryInterface( XControlModel::getSmartUik() ) );
			XWindowRef xTC2 = (XWindow*)xT2->queryInterface( XWindow::getSmartUik() );
			xTC2->setPosSize( 40, 470, 80, 20, PosSize_POSSIZE );
			xCont->addControl( L"", xT2 );
			xPSet = (XPropertySet*)xModel->queryInterface( XPropertySet::getSmartUik() );
			xPSet->setPropertyValue( L"Label", UsrAny( L"Radio2" ) );

			xModel = (XInterface*)xRadioButtonModelProv->createInstance()->queryInterface( XInterface::getSmartUik() );
			XControlRef xT3 = (XControl*)xRadioButtonCtrlProv->createInstance()->queryInterface( XControl::getSmartUik() );
			xT3->setModel( (XControlModel*)xModel->queryInterface( XControlModel::getSmartUik() ) );
			XWindowRef xTC3 = (XWindow*)xT3->queryInterface( XWindow::getSmartUik() );
			xTC3->setPosSize( 40, 510, 80, 20, PosSize_POSSIZE );
			xCont->addControl( L"", xT3 );
			xPSet = (XPropertySet*)xModel->queryInterface( XPropertySet::getSmartUik() );
			xPSet->setPropertyValue( L"Label", UsrAny( L"Radio3" ) );

			xModel = (XInterface*)xRadioButtonModelProv->createInstance()->queryInterface( XInterface::getSmartUik() );
			XControlRef xT4 = (XControl*)xRadioButtonCtrlProv->createInstance()->queryInterface( XControl::getSmartUik() );
			xT4->setModel( (XControlModel*)xModel->queryInterface( XControlModel::getSmartUik() ) );
			XWindowRef xTC4 = (XWindow*)xT4->queryInterface( XWindow::getSmartUik() );
			xTC4->setPosSize( 40, 550, 80, 20, PosSize_POSSIZE );
			xCont->addControl( L"", xT4 );
			xPSet = (XPropertySet*)xModel->queryInterface( XPropertySet::getSmartUik() );
			xPSet->setPropertyValue( L"Label", UsrAny( L"Radio4 - no" ) );
    		xPSet->setPropertyValue( L"Tabstop", UsrAny( (BOOL)TRUE ) );

			// TabController:
			xModelProv = xProv->queryServiceProvider( L"stardiv.vcl.controlmodel.TabController" );
			xModel = (XInterface*)xModelProv->createInstance()->queryInterface( XInterface::getSmartUik() );
			XTabControllerModelRef xTCModel = (XTabControllerModel*)xModel->queryInterface( XTabControllerModel::getSmartUik() );

			XServiceProviderRef xTCProv = xProv->queryServiceProvider( L"stardiv.vcl.control.TabController" );
			XTabControllerRef xTC = (XTabController*)xTCProv->createInstance()->queryInterface( XTabController::getSmartUik() );
			xTC->setModel( (XTabControllerModel*)xModel->queryInterface( XTabControllerModel::getSmartUik() ) );
			XUnoControlContainerRef xUCC = (XUnoControlContainer*)xCont->queryInterface( XUnoControlContainer::getSmartUik() );
			xUCC->addTabController( xTC );

			Sequence<XControlModelRef> aControls( 5 );
			aControls.getArray()[0] = xGroupBox1->getModel();
			aControls.getArray()[1] = xT1->getModel();
			aControls.getArray()[2] = xT3->getModel();
			aControls.getArray()[3] = xT2->getModel();
			aControls.getArray()[4] = xT4->getModel();
			xTCModel->setControls( aControls );

			Sequence<XControlModelRef> aGroup( 3 );
			aGroup.getArray()[0] = xT1->getModel();
			aGroup.getArray()[1] = xT3->getModel();
			aGroup.getArray()[2] = xT2->getModel();
			xTCModel->setGroup( aGroup, L"test" );
*/
			// Container anzeigen...
			// Als Child zu diesem Fenster
			xContControl->createPeer( XToolkitRef(), GetComponentInterface( TRUE ) );

			XDeviceRef xD( xContControl->getPeer(), USR_QUERY );
			xG = xD->createGraphics();
			XViewRef xV ( xDrawCtrl, USR_QUERY );
			xV->setGraphics( xG );

//		((UnoControl*)(XControl*)xNumField))->updateFromModel();

/*
			// TEST:
			WindowDecriptor aDescr;
			aDescr.ComponentServiceName = "window";
			aDescr.Type = VCLCOMPONENTTYPE_CONTAINER;
			aDescr.Parent = GetComponentInterface( TRUE );
			aDescr.WindowAttributes = WA_SHOW|WA_BORDER;
			aDescr.Bounds = Rectangle( Point( 500, 50 ), Size( 300, 200 ) );
			XVclWindowPeerRef xSPWin = xToolkit->createComponent( aDescr );

			WindowDecriptor aDescr2;
			aDescr2.ComponentServiceName = "scrollbar";
			aDescr2.Type = VCLCOMPONENTTYPE_SIMPLE;
			aDescr2.Parent = xSPWin;
			aDescr2.WindowAttributes = WA_SHOW|WA_BORDER|WA_VSCROLL;
			aDescr2.Bounds = Rectangle( Point( 250, 0 ), Size( 50, 200 ) );
			XVclWindowPeerRef xSB = xToolkit->createComponent( aDescr2 );
*/
		}
		return;
	}
    WorkWindow::MouseButtonDown( rMEvt );
}


// -----------------------------------------------------------------------

void MyWin::Resize()
{
    WorkWindow::Resize();
}

void MyWin::Paint( const Rectangle& r )
{
	// Muss ueber PaintListener geschehen...
	if ( xDrawCtrl.is() )
	{
		XViewRef xV( xDrawCtrl, USR_QUERY );
		XWindowRef xC( xDrawCtrl, USR_QUERY );
		xV->draw( xC->getPosSize().Left(), xC->getPosSize().Top() );
	}

}
