/**************************************************************
 * 
 * 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_dbui.hxx"
#ifndef DBAUI_COLUMNCONTROL_HXX
#include "ColumnControl.hxx"
#endif
#ifndef DBAUI_COLUMNPEER_HXX
#include "ColumnPeer.hxx"
#endif
#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
#include "dbustrings.hrc"
#endif
#ifndef _DBASHARED_APITOOLS_HXX_
#include "apitools.hxx"
#endif
#ifndef _COM_SUN_STAR_AWT_POSSIZE_HPP_
#include <com/sun/star/awt/PosSize.hpp>
#endif
#ifndef _DBU_REGHELPER_HXX_
#include "dbu_reghelper.hxx"
#endif

extern "C" void SAL_CALL createRegistryInfo_OColumnControl()
{
	static ::dbaui::OMultiInstanceAutoRegistration< ::dbaui::OColumnControl> aAutoRegistration;
}
//.........................................................................
namespace dbaui
{
//.........................................................................
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::awt;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::sdbc;

OColumnControl::OColumnControl(const Reference<XMultiServiceFactory>& _rxFactory)
    :UnoControl( _rxFactory )
{
}
// -----------------------------------------------------------------------------
IMPLEMENT_SERVICE_INFO2_STATIC(OColumnControl,SERVICE_CONTROLDEFAULT,"com.sun.star.awt.UnoControl","com.sun.star.sdb.ColumnDescriptorControl")
// -----------------------------------------------------------------------------
::rtl::OUString	OColumnControl::GetComponentServiceName()
{
	return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.ColumnDescriptorControl"));
}
// -----------------------------------------------------------------------------
void SAL_CALL OColumnControl::createPeer(const Reference< XToolkit >& /*rToolkit*/, const Reference< XWindowPeer >& rParentPeer) throw( RuntimeException )
{
	::osl::ClearableMutexGuard aGuard( GetMutex() );
	if ( !getPeer().is() )
	{
		mbCreatingPeer = sal_True;

		Window* pParentWin = NULL;
		if (rParentPeer.is())
		{
			VCLXWindow* pParent = VCLXWindow::GetImplementation(rParentPeer);
			if (pParent)
				pParentWin = pParent->GetWindow();
		}

		OColumnPeer* pPeer = new OColumnPeer( pParentWin, maContext.getLegacyServiceFactory() );
		OSL_ENSURE(pPeer != NULL, "FmXGridControl::createPeer : imp_CreatePeer didn't return a peer !");
		setPeer( pPeer );

		UnoControlComponentInfos aComponentInfos(maComponentInfos);
		Reference< XGraphics > xGraphics( mxGraphics );
		Reference< XView >  xV(getPeer(), UNO_QUERY);
		Reference< XWindow >	xW(getPeer(), UNO_QUERY);

		aGuard.clear();

		updateFromModel();

		xV->setZoom( aComponentInfos.nZoomX, aComponentInfos.nZoomY );
		setPosSize( aComponentInfos.nX, aComponentInfos.nY, aComponentInfos.nWidth, aComponentInfos.nHeight, ::com::sun::star::awt::PosSize::POSSIZE );

		Reference<XPropertySet> xProp(getModel(), UNO_QUERY);
		if ( xProp.is() )
		{
			Reference<XConnection> xCon(xProp->getPropertyValue(PROPERTY_ACTIVE_CONNECTION),UNO_QUERY);
			pPeer->setConnection(xCon);
			Reference<XPropertySet> xColumn(xProp->getPropertyValue(PROPERTY_COLUMN),UNO_QUERY);
			pPeer->setColumn(xColumn);
			sal_Int32 nWidth = 50;
			xProp->getPropertyValue(PROPERTY_EDIT_WIDTH) >>= nWidth;
			pPeer->setEditWidth(nWidth);			
		}

		if (aComponentInfos.bVisible)
			xW->setVisible(sal_True);

		if (!aComponentInfos.bEnable)
			xW->setEnable(sal_False);

		if (maWindowListeners.getLength())
			xW->addWindowListener( &maWindowListeners );

		if (maFocusListeners.getLength())
			xW->addFocusListener( &maFocusListeners );

		if (maKeyListeners.getLength())
			xW->addKeyListener( &maKeyListeners );

		if (maMouseListeners.getLength())
			xW->addMouseListener( &maMouseListeners );

		if (maMouseMotionListeners.getLength())
			xW->addMouseMotionListener( &maMouseMotionListeners );

		if (maPaintListeners.getLength())
			xW->addPaintListener( &maPaintListeners );

		Reference< ::com::sun::star::awt::XView >  xPeerView(getPeer(), UNO_QUERY);
		xPeerView->setZoom( maComponentInfos.nZoomX, maComponentInfos.nZoomY );
		xPeerView->setGraphics( xGraphics );

		mbCreatingPeer = sal_False;
	}
}
//.........................................................................
}	// namespace dbaui
//.........................................................................
