/**************************************************************
 * 
 * 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_extensions.hxx"

#ifndef BIB_HRC
#include "bib.hrc"
#endif
#include "bibcont.hxx"
#include "bibbeam.hxx"
#include "bibmod.hxx"
#include "general.hxx"
#include "bibview.hxx"
#include "datman.hxx"
#include "bibresid.hxx"
#include "bibmod.hxx"
#include "sections.hrc"
#include "bibconfig.hxx"


#include <vcl/svapp.hxx>
#include <com/sun/star/sdbc/XResultSetUpdate.hpp>
#include <com/sun/star/form/XLoadable.hpp>
#include <vcl/msgbox.hxx>
#include <tools/debug.hxx>

using namespace ::com::sun::star;
using namespace ::com::sun::star::form;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::uno;

#define C2U( cChar ) ::rtl::OUString::createFromAscii( cChar )

//.........................................................................
namespace bib
{
//.........................................................................

	// -----------------------------------------------------------------------
	BibView::BibView( Window* _pParent, BibDataManager* _pManager, WinBits _nStyle )
		:BibWindow( _pParent, _nStyle )
		,m_pDatMan( _pManager )
		,m_xDatMan( _pManager )
		,m_pGeneralPage( NULL )
	{
		if ( m_xDatMan.is() )
			connectForm( m_xDatMan );
	}

	// -----------------------------------------------------------------------
	BibView::~BibView()
	{
		BibGeneralPage* pGeneralPage = m_pGeneralPage;
		m_pGeneralPage = NULL;

		pGeneralPage->CommitActiveControl();
		Reference< XForm > xForm = m_pDatMan->getForm();
		Reference< XPropertySet > xProps( xForm, UNO_QUERY );
		Reference< sdbc::XResultSetUpdate > xResUpd( xProps, UNO_QUERY );
		DBG_ASSERT( xResUpd.is(), "BibView::~BibView: invalid form!" );

		if ( xResUpd.is() )
		{
			Any aModified = xProps->getPropertyValue( C2U( "IsModified" ) );
			sal_Bool bFlag = sal_False;
			if ( ( aModified >>= bFlag ) && bFlag )
			{

                try
                {
                    Any aNew = xProps->getPropertyValue( C2U( "IsNew" ) );
                    aNew >>= bFlag;
                    if ( bFlag )
                        xResUpd->insertRow();
                    else
                        xResUpd->updateRow();
                }
                catch( const uno::Exception& rEx)
                {
                   (void) rEx; 
                }            
			}
		}

		if ( isFormConnected() )
			disconnectForm();

		pGeneralPage->RemoveListeners();
		m_xGeneralPage = NULL;
	}

	/* -----------------16.11.99 13:13-------------------

	 --------------------------------------------------*/
	void BibView::UpdatePages()
	{
		// TODO:
		// this is _strange_: Why not updating the existent general page?
		// I consider the current behaviour a HACK.
		// frank.schoenheit@sun.com
		if ( m_pGeneralPage )
		{
			m_pGeneralPage->Hide();
			m_pGeneralPage->RemoveListeners();
			m_xGeneralPage = 0;
		}

		m_xGeneralPage = m_pGeneralPage = new BibGeneralPage( this, m_pDatMan );

		Resize();

		if( HasFocus() )
			// "delayed" GetFocus() because GetFocus() is initially called before GeneralPage is created
			m_pGeneralPage->GrabFocus();

		String sErrorString( m_pGeneralPage->GetErrorString() );
		if ( sErrorString.Len() )
		{
            sal_Bool bExecute = BibModul::GetConfig()->IsShowColumnAssignmentWarning();
            if(!m_pDatMan->HasActiveConnection())
            {
                //no connection is available -> the data base has to be assigned
                m_pDatMan->DispatchDBChangeDialog();
                bExecute = sal_False;
            }
            else if(bExecute)
            {
                sErrorString += '\n';
                sErrorString += String( BibResId( RID_MAP_QUESTION ) );
                QueryBox aQuery( this, WB_YES_NO, sErrorString );
                aQuery.SetDefaultCheckBoxText();
                short nResult = aQuery.Execute();
                BibModul::GetConfig()->SetShowColumnAssignmentWarning(
                    !aQuery.GetCheckBoxState());
                if( RET_YES != nResult )
                {
                    bExecute = sal_False;
                }
            }
            if(bExecute)
			{
				Application::PostUserEvent( STATIC_LINK( this, BibView, CallMappingHdl ) );
			}
		}
	}
	//---------------------------------------------------------------------
	//--- 19.10.01 16:55:49 -----------------------------------------------

	void BibView::_loaded( const EventObject& _rEvent )
	{
		UpdatePages();
		FormControlContainer::_loaded( _rEvent );
	}

	void BibView::_reloaded( const EventObject& _rEvent )
	{
		UpdatePages();
		FormControlContainer::_loaded( _rEvent );
	}

	/* -----------------------------02.02.00 16:49--------------------------------

	 ---------------------------------------------------------------------------*/
	IMPL_STATIC_LINK( BibView, CallMappingHdl, BibView*, EMPTYARG )
	{
		pThis->m_pDatMan->CreateMappingDialog( pThis );
		return 0;
	}
	/* -----------------------------13.04.00 16:12--------------------------------

	 ---------------------------------------------------------------------------*/
	void BibView::Resize()
	{
		if ( m_pGeneralPage )
		{
			::Size aSz( GetOutputSizePixel() );
			m_pGeneralPage->SetSizePixel( aSz );
		}
		Window::Resize();
	}

	//---------------------------------------------------------------------
	//--- 18.10.01 18:52:45 -----------------------------------------------

	Reference< awt::XControlContainer > BibView::getControlContainer()
	{
		Reference< awt::XControlContainer > xReturn;
		if ( m_pGeneralPage )
			xReturn = m_pGeneralPage->GetControlContainer();
		return xReturn;
	}

	void BibView::GetFocus()
	{
		if( m_pGeneralPage )
			m_pGeneralPage->GrabFocus();
	}

	sal_Bool BibView::HandleShortCutKey( const KeyEvent& rKeyEvent )
	{
		return m_pGeneralPage? m_pGeneralPage->HandleShortCutKey( rKeyEvent ) : sal_False;
	}

//.........................................................................
}	// namespace bib
//.........................................................................