/**************************************************************
 * 
 * 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_dbaccess.hxx"
#ifndef DBAUI_QUERY_TABLEWINDOWDATA_HXX
#include "QTableWindow.hxx"
#endif
#ifndef DBAUI_QUERYTABLEVIEW_HXX
#include "QueryTableView.hxx"
#endif
#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
#include "dbustrings.hrc"
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#include "dbaccess_helpid.hrc"
#ifndef DBAUI_QUERYDESIGNVIEW_HXX
#include "QueryDesignView.hxx"
#endif
#ifndef DBACCESS_UI_BROWSER_ID_HXX
#include "browserids.hxx"
#endif
#ifndef DBAUI_QUERYCONTROLLER_HXX
#include "querycontroller.hxx"
#endif
#ifndef _SV_IMAGE_HXX
#include <vcl/image.hxx>
#endif
#ifndef DBAUI_TABLEWINDOWLISTBOX_HXX
#include "TableWindowListBox.hxx"
#endif
#ifndef _DBU_QRY_HRC_
#include "dbu_qry.hrc"
#endif
#ifndef DBAUI_QUERY_HRC
#include "Query.hrc"
#endif
#ifndef _COM_SUN_STAR_SDBCX_XKEYSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XKeysSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_
#include <com/sun/star/container/XIndexAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_KEYTYPE_HPP_
#include <com/sun/star/sdbcx/KeyType.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
#endif
#ifndef DBAUI_TABLEFIELDINFO_HXX
#include "TableFieldInfo.hxx"
#endif
#ifndef _COMPHELPER_UNO3_HXX_
#include <comphelper/uno3.hxx>
#endif
#ifndef _COMPHELPER_EXTRACT_HXX_
#include <comphelper/extract.hxx>
#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif


using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::beans;
using namespace dbaui;
//========================================================================
// class OQueryTableWindow
//========================================================================
DBG_NAME(OQueryTableWindow)
//------------------------------------------------------------------------------
OQueryTableWindow::OQueryTableWindow( Window* pParent, const TTableWindowData::value_type& pTabWinData, sal_Unicode* pszInitialAlias)
	:OTableWindow( pParent, pTabWinData )
	,m_nAliasNum(0)
{
	DBG_CTOR(OQueryTableWindow,NULL);
	if (pszInitialAlias != NULL)
		m_strInitialAlias = ::rtl::OUString(pszInitialAlias);
	else
		m_strInitialAlias = GetAliasName();

	// wenn der Tabellen- gleich dem Aliasnamen ist, dann darf ich das nicht an InitialAlias weiterreichen, denn das Anhaengen
	// eines eventuelle Tokens nicht klappen ...
	if (m_strInitialAlias == pTabWinData->GetTableName())
		m_strInitialAlias = ::rtl::OUString();

	SetHelpId(HID_CTL_QRYDGNTAB);
}

//------------------------------------------------------------------------------
OQueryTableWindow::~OQueryTableWindow()
{
	DBG_DTOR(OQueryTableWindow,NULL);
}

//------------------------------------------------------------------------------
sal_Bool OQueryTableWindow::Init()
{
	sal_Bool bSuccess = OTableWindow::Init();
	if(!bSuccess)
		return bSuccess;

	OQueryTableView* pContainer = static_cast<OQueryTableView*>(getTableView());

	// zuerst Alias bestimmen
	::rtl::OUString sAliasName;

	TTableWindowData::value_type pWinData = GetData();

	if (m_strInitialAlias.getLength() )
		// Der Alias wurde explizit mit angegeben
		sAliasName = m_strInitialAlias;
	else if ( GetTable().is() )
		GetTable()->getPropertyValue( PROPERTY_NAME ) >>= sAliasName;
    else
        return sal_False;

	// Alias mit fortlaufender Nummer versehen
	if (pContainer->CountTableAlias(sAliasName, m_nAliasNum))
	{
		sAliasName += ::rtl::OUString('_');
		sAliasName += ::rtl::OUString::valueOf(m_nAliasNum);
	}


	sAliasName = String(sAliasName).EraseAllChars('"');
	SetAliasName(sAliasName);
		// SetAliasName reicht das als WinName weiter, dadurch benutzt es die Basisklasse
	// reset the titel
	m_aTitle.SetText( pWinData->GetWinName() );
	m_aTitle.Show();

	//	sal_Bool bSuccess(sal_True);
	if (!bSuccess)
	{	// es soll nur ein Dummy-Window aufgemacht werden ...
		DBG_ASSERT(GetAliasName().getLength(), "OQueryTableWindow::Init : kein Alias- UND kein Tabellenname geht nicht !");
			// .. aber das braucht wenigstens einen Alias

		// ::com::sun::star::form::ListBox anlegen
		if (!m_pListBox)
			m_pListBox = CreateListBox();

		// Titel setzen
		m_aTitle.SetText(GetAliasName());
		m_aTitle.Show();

		clearListBox();
			// neu zu fuellen brauche ich die nicht, da ich ja keine Tabelle habe
		m_pListBox->Show();
	}

	getTableView()->getDesignView()->getController().InvalidateFeature(ID_BROWSER_QUERY_EXECUTE);
	return bSuccess;
}
// -----------------------------------------------------------------------------
void* OQueryTableWindow::createUserData(const Reference< XPropertySet>& _xColumn,bool _bPrimaryKey)
{
	OTableFieldInfo* pInfo = new OTableFieldInfo();
	pInfo->SetKey(_bPrimaryKey ? TAB_PRIMARY_FIELD : TAB_NORMAL_FIELD);
	if ( _xColumn.is() )
		pInfo->SetDataType(::comphelper::getINT32(_xColumn->getPropertyValue(PROPERTY_TYPE)));
	return pInfo;
}
// -----------------------------------------------------------------------------
void OQueryTableWindow::deleteUserData(void*& _pUserData)
{
	delete static_cast<OTableFieldInfo*>(_pUserData);
	_pUserData = NULL;
}
//------------------------------------------------------------------------------
void OQueryTableWindow::OnEntryDoubleClicked(SvLBoxEntry* pEntry)
{
	DBG_ASSERT(pEntry != NULL, "OQueryTableWindow::OnEntryDoubleClicked : pEntry darf nicht NULL sein !");
		// man koennte das auch abfragen und dann ein return hinsetzen, aber so weist es vielleicht auf Fehler bei Aufrufer hin

	if (getTableView()->getDesignView()->getController().isReadOnly())
		return;

	OTableFieldInfo* pInf = static_cast<OTableFieldInfo*>(pEntry->GetUserData());
	DBG_ASSERT(pInf != NULL, "OQueryTableWindow::OnEntryDoubleClicked : Feld hat keine FieldInfo !");

	// eine DragInfo aufbauen
	OTableFieldDescRef aInfo = new OTableFieldDesc(GetTableName(),m_pListBox->GetEntryText(pEntry));
	aInfo->SetTabWindow(this);
	aInfo->SetAlias(GetAliasName());
	aInfo->SetFieldIndex(m_pListBox->GetModel()->GetAbsPos(pEntry));
	aInfo->SetDataType(pInf->GetDataType());

	// und das entsprechende Feld einfuegen
	static_cast<OQueryTableView*>(getTableView())->InsertField(aInfo);
}

//------------------------------------------------------------------------------
sal_Bool OQueryTableWindow::ExistsField(const ::rtl::OUString& strFieldName, OTableFieldDescRef& rInfo)
{
	DBG_ASSERT(m_pListBox != NULL, "OQueryTableWindow::ExistsField : habe keine ::com::sun::star::form::ListBox !");
	OSL_ENSURE(rInfo.isValid(),"OQueryTableWindow::ExistsField: invlid argument for OTableFieldDescRef!");
	Reference< XConnection> xConnection = getTableView()->getDesignView()->getController().getConnection();
	sal_Bool bExists = sal_False;
	if(xConnection.is())
	{
		SvLBoxEntry* pEntry = m_pListBox->First();
		try
		{
			Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData();
			::comphelper::UStringMixEqual bCase(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers());

			while (pEntry)
			{
				if (bCase(strFieldName,::rtl::OUString(m_pListBox->GetEntryText(pEntry))))
				{
					OTableFieldInfo* pInf = static_cast<OTableFieldInfo*>(pEntry->GetUserData());
					DBG_ASSERT(pInf != NULL, "OQueryTableWindow::ExistsField : Feld hat keine FieldInfo !");

					rInfo->SetTabWindow(this);
					rInfo->SetField(strFieldName);
					rInfo->SetTable(GetTableName());
					rInfo->SetAlias(GetAliasName());
					rInfo->SetFieldIndex(m_pListBox->GetModel()->GetAbsPos(pEntry));
					rInfo->SetDataType(pInf->GetDataType());
					bExists = sal_True;
					break;
				}
				pEntry = m_pListBox->Next(pEntry);
			}
		}
		catch(SQLException&)
		{
		}
	}

	return bExists;
}

//------------------------------------------------------------------------------
sal_Bool OQueryTableWindow::ExistsAVisitedConn() const
{
	return static_cast<const OQueryTableView*>(getTableView())->ExistsAVisitedConn(this);
}

//------------------------------------------------------------------------------
void OQueryTableWindow::KeyInput( const KeyEvent& rEvt )
{
	OTableWindow::KeyInput( rEvt );
}
// -----------------------------------------------------------------------------



