/**************************************************************
 *
 * 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_QUERYVIEWSWITCH_HXX
#include "QueryViewSwitch.hxx"
#endif
#ifndef DBAUI_QUERYDESIGNVIEW_HXX
#include "QueryDesignView.hxx"
#endif
#ifndef DBAUI_QUERYVIEW_TEXT_HXX
#include "QueryTextView.hxx"
#endif
#ifndef DBAUI_QUERYCONTAINERWINDOW_HXX
#include "querycontainerwindow.hxx"
#endif
#ifndef _DBU_QRY_HRC_
#include "dbu_qry.hrc"
#endif
#ifndef DBACCESS_UI_BROWSER_ID_HXX
#include "browserids.hxx"
#endif
#ifndef DBAUI_QYDLGTAB_HXX
#include "adtabdlg.hxx"
#endif
#ifndef DBAUI_QUERYCONTROLLER_HXX
#include "querycontroller.hxx"
#endif
#ifndef DBAUI_SQLEDIT_HXX
#include "sqledit.hxx"
#endif
#ifndef DBAUI_QUERYCONTAINERWINDOW_HXX
#include "querycontainerwindow.hxx"
#endif

using namespace dbaui;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;

DBG_NAME(OQueryViewSwitch)
OQueryViewSwitch::OQueryViewSwitch(OQueryContainerWindow* _pParent, OQueryController& _rController,const Reference< XMultiServiceFactory >& _rFactory)
: m_bAddTableDialogWasVisible(sal_False)
{
	DBG_CTOR(OQueryViewSwitch,NULL);

	m_pTextView		= new OQueryTextView(_pParent);
	m_pDesignView	= new OQueryDesignView( _pParent, _rController, _rFactory );
}
// -----------------------------------------------------------------------------
OQueryViewSwitch::~OQueryViewSwitch()
{
	DBG_DTOR(OQueryViewSwitch,NULL);
	{
		::std::auto_ptr<Window> aTemp(m_pTextView);
		m_pTextView = NULL;
	}
	{
		::std::auto_ptr<Window> aTemp(m_pDesignView);
		m_pDesignView = NULL;
	}
}
// -------------------------------------------------------------------------
void OQueryViewSwitch::Construct()
{
	m_pDesignView->Construct( );
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::initialize()
{
	// initially be in SQL mode
	m_pTextView->Show();
	m_pDesignView->initialize();
}
// -------------------------------------------------------------------------
void OQueryViewSwitch::resizeDocumentView(Rectangle& _rPlayground)
{
	m_pTextView->SetPosSizePixel( _rPlayground.TopLeft(), _rPlayground.GetSize() );
	m_pDesignView->SetPosSizePixel( _rPlayground.TopLeft(), _rPlayground.GetSize() );

	// just for completeness: there is no space left, we occupied it all ...
	_rPlayground.SetPos( _rPlayground.BottomRight() );
	_rPlayground.SetSize( Size( 0, 0 ) );
}
// -----------------------------------------------------------------------------
sal_Bool OQueryViewSwitch::checkStatement()
{
	if(m_pTextView->IsVisible())
		return m_pTextView->checkStatement();
	return m_pDesignView->checkStatement();
}
// -----------------------------------------------------------------------------
::rtl::OUString OQueryViewSwitch::getStatement()
{
	if(m_pTextView->IsVisible())
		return m_pTextView->getStatement();
	return m_pDesignView->getStatement();
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::setReadOnly(sal_Bool _bReadOnly)
{
	if(m_pTextView->IsVisible())
		m_pTextView->setReadOnly(_bReadOnly);
	else
		m_pDesignView->setReadOnly(_bReadOnly);
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::clear()
{
	if(m_pTextView->IsVisible())
		m_pTextView->clear();
	else
		m_pDesignView->clear();
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::GrabFocus()
{
	if ( m_pTextView && m_pTextView->IsVisible() )
		m_pTextView->GrabFocus();
	else if ( m_pDesignView && m_pDesignView->IsVisible() )
		m_pDesignView->GrabFocus();
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::setStatement(const ::rtl::OUString& _rsStatement)
{
	if(m_pTextView->IsVisible())
		m_pTextView->setStatement(_rsStatement);
	else
		m_pDesignView->setStatement(_rsStatement);
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::copy()
{
	if(m_pTextView->IsVisible())
		m_pTextView->copy();
	else
		m_pDesignView->copy();
}
// -----------------------------------------------------------------------------
sal_Bool OQueryViewSwitch::isCutAllowed()
{
	if(m_pTextView->IsVisible())
		return m_pTextView->isCutAllowed();
	return m_pDesignView->isCutAllowed();
}
// -----------------------------------------------------------------------------
sal_Bool OQueryViewSwitch::isCopyAllowed()
{
	if(m_pTextView->IsVisible())
		return m_pTextView->isCopyAllowed();
	return m_pDesignView->isCopyAllowed();
}
// -----------------------------------------------------------------------------
sal_Bool OQueryViewSwitch::isPasteAllowed()
{
	if(m_pTextView->IsVisible())
		return m_pTextView->isPasteAllowed();
	return m_pDesignView->isPasteAllowed();
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::cut()
{
	if(m_pTextView->IsVisible())
		m_pTextView->cut();
	else
		m_pDesignView->cut();
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::paste()
{
	if(m_pTextView->IsVisible())
		m_pTextView->paste();
	else
		m_pDesignView->paste();
}
// -----------------------------------------------------------------------------
OQueryContainerWindow* OQueryViewSwitch::getContainer() const
{
	Window* pDesignParent = getDesignView() ? getDesignView()->GetParent() : NULL;
	return static_cast< OQueryContainerWindow* >( pDesignParent );
}

// -----------------------------------------------------------------------------
void OQueryViewSwitch::impl_forceSQLView()
{
    OAddTableDlg* pAddTabDialog( getAddTableDialog() );

    // hide the "Add Table" dialog
    m_bAddTableDialogWasVisible = pAddTabDialog ? pAddTabDialog->IsVisible() : false;
    if ( m_bAddTableDialogWasVisible )
        pAddTabDialog->Hide();

    // tell the views they're in/active
	m_pDesignView->stopTimer();
	m_pTextView->getSqlEdit()->startTimer();

    // set the most recent statement at the text view
	m_pTextView->clear();
	m_pTextView->setStatement(static_cast<OQueryController&>(m_pDesignView->getController()).getStatement());
}

// -----------------------------------------------------------------------------
void OQueryViewSwitch::forceInitialView()
{
    OQueryController& rQueryController( static_cast< OQueryController& >( m_pDesignView->getController() ) );
	const sal_Bool bGraphicalDesign = rQueryController.isGraphicalDesign();
    if ( !bGraphicalDesign )
        impl_forceSQLView();
    else
    {
        // tell the text view it's inactive now
		m_pTextView->getSqlEdit()->stopTimer();

        // update the "Add Table" dialog
        OAddTableDlg* pAddTabDialog( getAddTableDialog() );
        if ( pAddTabDialog )
		    pAddTabDialog->Update();

        // initialize the design view
		m_pDesignView->initByFieldDescriptions( rQueryController.getFieldInformation() );

		// tell the design view it's active now
		m_pDesignView->startTimer();
    }

    impl_postViewSwitch( bGraphicalDesign, true );
}

// -----------------------------------------------------------------------------
bool OQueryViewSwitch::switchView( ::dbtools::SQLExceptionInfo* _pErrorInfo )
{
	sal_Bool bRet = sal_True;
	sal_Bool bGraphicalDesign = static_cast<OQueryController&>(m_pDesignView->getController()).isGraphicalDesign();

	if ( !bGraphicalDesign )
	{
        impl_forceSQLView();
	}
	else
	{
        // tell the text view it's inactive now
		m_pTextView->getSqlEdit()->stopTimer();

        // update the "Add Table" dialog
        OAddTableDlg* pAddTabDialog( getAddTableDialog() );
        if ( pAddTabDialog )
		    pAddTabDialog->Update();

        // initialize the design view
		bRet = m_pDesignView->initByParseIterator( _pErrorInfo );

		// tell the design view it's active now
		m_pDesignView->startTimer();
	}

    return impl_postViewSwitch( bGraphicalDesign, bRet );
}

// -----------------------------------------------------------------------------
bool OQueryViewSwitch::impl_postViewSwitch( const bool i_bGraphicalDesign, const bool i_bSuccess )
{
	if ( i_bSuccess )
	{
		m_pTextView->Show	( !i_bGraphicalDesign );
		m_pDesignView->Show	( i_bGraphicalDesign );
        OAddTableDlg* pAddTabDialog( getAddTableDialog() );
        if ( pAddTabDialog )
		    if ( i_bGraphicalDesign && m_bAddTableDialogWasVisible )
			    pAddTabDialog->Show();

		GrabFocus();
	}

	OQueryContainerWindow* pContainer = getContainer();
	if ( pContainer )
		pContainer->Resize();

	m_pDesignView->getController().ClearUndoManager();
	m_pDesignView->getController().InvalidateAll();

	return i_bSuccess;
}

// -----------------------------------------------------------------------------
OAddTableDlg* OQueryViewSwitch::getAddTableDialog()
{
    if ( !m_pDesignView )
        return NULL;
    return m_pDesignView->getController().getAddTableDialog();
}
// -----------------------------------------------------------------------------
sal_Bool OQueryViewSwitch::isSlotEnabled(sal_Int32 _nSlotId)
{
	return m_pDesignView->isSlotEnabled(_nSlotId);
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::setSlotEnabled(sal_Int32 _nSlotId,sal_Bool _bEnable)
{
	m_pDesignView->setSlotEnabled(_nSlotId,_bEnable);
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::SaveUIConfig()
{
	if(m_pDesignView->IsVisible())
		m_pDesignView->SaveUIConfig();
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::SetPosSizePixel( Point _rPt,Size _rSize)
{
	m_pDesignView->SetPosSizePixel( _rPt,_rSize);
	m_pDesignView->Resize();
	m_pTextView->SetPosSizePixel( _rPt,_rSize);
}
// -----------------------------------------------------------------------------
Reference< XMultiServiceFactory > OQueryViewSwitch::getORB() const
{
	return m_pDesignView->getORB();
}
// -----------------------------------------------------------------------------
bool OQueryViewSwitch::reset( ::dbtools::SQLExceptionInfo* _pErrorInfo )
{
	m_pDesignView->reset();
	if ( !m_pDesignView->initByParseIterator( _pErrorInfo ) )
        return false;

    if ( switchView( _pErrorInfo ) )
        return false;

    return true;
}
// -----------------------------------------------------------------------------
void OQueryViewSwitch::setNoneVisbleRow(sal_Int32 _nRows)
{
	if(m_pDesignView)
		m_pDesignView->setNoneVisbleRow(_nRows);
}
// -----------------------------------------------------------------------------
