/**************************************************************
 * 
 * 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_TABLEGRANTCONTROL_HXX
#include "TableGrantCtrl.hxx"
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_PRIVILEGE_HPP_
#include <com/sun/star/sdbcx/Privilege.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_PRIVILEGEOBJECT_HPP_
#include <com/sun/star/sdbcx/PrivilegeObject.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XUSERSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XUsersSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XAUTHORIZABLE_HPP_
#include <com/sun/star/sdbcx/XAuthorizable.hpp>
#endif
#ifndef _DBU_CONTROL_HRC_
#include "dbu_control.hrc"
#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif

using namespace ::com::sun::star::accessibility;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::uno;
using namespace ::dbaui;
using namespace ::svt;

const sal_uInt16 COL_TABLE_NAME = 1;
const sal_uInt16 COL_SELECT		= 2;
const sal_uInt16 COL_INSERT		= 3;
const sal_uInt16 COL_DELETE		= 4;
const sal_uInt16 COL_UPDATE		= 5;
const sal_uInt16 COL_ALTER		= 6;
const sal_uInt16 COL_REF		= 7;
const sal_uInt16 COL_DROP		= 8;

DBG_NAME(OTableGrantControl)

//================================================================================
// OTableGrantControl
//================================================================================
OTableGrantControl::OTableGrantControl( Window* pParent,const ResId& _RsId)
	:EditBrowseBox( pParent,_RsId, EBBF_SMART_TAB_TRAVEL | EBBF_NOROWPICTURE )
	,m_pCheckCell( NULL )
	,m_pEdit( NULL )
    ,m_nDataPos( 0 )
	,m_bEnable(sal_True)
	,m_nDeactivateEvent(0)
{
	DBG_CTOR(OTableGrantControl,NULL);
	//////////////////////////////////////////////////////////////////////
	// Spalten einfuegen
	sal_uInt16 i=1;
	InsertDataColumn( i, String(ModuleRes(STR_TABLE_PRIV_NAME)	), 75);
	FreezeColumn(i++);
	InsertDataColumn( i++, String(ModuleRes(STR_TABLE_PRIV_SELECT)), 75);
	InsertDataColumn( i++, String(ModuleRes(STR_TABLE_PRIV_INSERT)), 75);
	InsertDataColumn( i++, String(ModuleRes(STR_TABLE_PRIV_DELETE)), 75);
	InsertDataColumn( i++, String(ModuleRes(STR_TABLE_PRIV_UPDATE)), 75);
	InsertDataColumn( i++, String(ModuleRes(STR_TABLE_PRIV_ALTER)), 75);
	InsertDataColumn( i++, String(ModuleRes(STR_TABLE_PRIV_REFERENCE)), 75);
	InsertDataColumn( i++, String(ModuleRes(STR_TABLE_PRIV_DROP)), 75);

	while(--i)
		SetColumnWidth(i,GetAutoColumnWidth(i));
}

//------------------------------------------------------------------------
OTableGrantControl::~OTableGrantControl()
{
	DBG_DTOR(OTableGrantControl,NULL);
	if (m_nDeactivateEvent)
	{
		Application::RemoveUserEvent(m_nDeactivateEvent);
		m_nDeactivateEvent = 0;
	}

	delete m_pCheckCell;
	delete m_pEdit;

	m_xTables		= NULL;
}
// -----------------------------------------------------------------------------
void OTableGrantControl::setTablesSupplier(const Reference< XTablesSupplier >& _xTablesSup)
{
	// first we need the users
	Reference< XUsersSupplier> xUserSup(_xTablesSup,UNO_QUERY);
	if(xUserSup.is())
		m_xUsers = xUserSup->getUsers();

	// second we need the tables to determine which privileges the user has
	if(_xTablesSup.is())
		m_xTables = _xTablesSup->getTables();

	if(m_xTables.is())
		m_aTableNames = m_xTables->getElementNames();

	OSL_ENSURE(m_xUsers.is(),"No user access supported!");
	OSL_ENSURE(m_xTables.is(),"No tables supported!");
}
// -----------------------------------------------------------------------------
void OTableGrantControl::setORB(const Reference< ::com::sun::star::lang::XMultiServiceFactory>& _xORB)
{
	m_xORB = _xORB;
}
//------------------------------------------------------------------------
void OTableGrantControl::UpdateTables()
{
	RemoveRows();

	if(m_xTables.is())
		RowInserted(0, m_aTableNames.getLength());
	//	m_bEnable = m_xDb->GetUser() != ((OUserAdmin*)GetParent())->GetUser();
}
//------------------------------------------------------------------------
void OTableGrantControl::Init()
{
	DBG_CHKTHIS(OTableGrantControl,NULL);
	EditBrowseBox::Init();

	//////////////////////////////////////////////////////////////////////
	// ComboBox instanzieren
	if(!m_pCheckCell)
	{
		m_pCheckCell	= new CheckBoxControl( &GetDataWindow() );
		m_pCheckCell->GetBox().EnableTriState(sal_False);

		m_pEdit			= new Edit( &GetDataWindow() );
		m_pEdit->SetReadOnly();
		m_pEdit->Enable(sal_False);
	}

	UpdateTables();
	//////////////////////////////////////////////////////////////////////
	// Browser Mode setzen
	BrowserMode nMode = BROWSER_COLUMNSELECTION | BROWSER_HLINESFULL | BROWSER_VLINESFULL |
						BROWSER_HIDECURSOR		| BROWSER_HIDESELECT;

	SetMode(nMode);
}

//------------------------------------------------------------------------------
void OTableGrantControl::Resize()
{
	DBG_CHKTHIS(OTableGrantControl,NULL);
	EditBrowseBox::Resize();
}

//------------------------------------------------------------------------------
long OTableGrantControl::PreNotify(NotifyEvent& rNEvt)
{
	DBG_CHKTHIS(OTableGrantControl,NULL);
	if (rNEvt.GetType() == EVENT_LOSEFOCUS)
		if (!HasChildPathFocus())
		{
			if (m_nDeactivateEvent)
				Application::RemoveUserEvent(m_nDeactivateEvent);
			m_nDeactivateEvent = Application::PostUserEvent(LINK(this, OTableGrantControl, AsynchDeactivate));
		}
	if (rNEvt.GetType() == EVENT_GETFOCUS)
	{
		if (m_nDeactivateEvent)
			Application::RemoveUserEvent(m_nDeactivateEvent);
		m_nDeactivateEvent = Application::PostUserEvent(LINK(this, OTableGrantControl, AsynchActivate));
	}
	return EditBrowseBox::PreNotify(rNEvt);
}

//------------------------------------------------------------------------------
IMPL_LINK(OTableGrantControl, AsynchActivate, void*, EMPTYARG)
{
	m_nDeactivateEvent = 0;
	ActivateCell();
	return 0L;
}

//------------------------------------------------------------------------------
IMPL_LINK(OTableGrantControl, AsynchDeactivate, void*, EMPTYARG)
{
	m_nDeactivateEvent = 0;
	DeactivateCell();
	return 0L;
}

//------------------------------------------------------------------------------
sal_Bool OTableGrantControl::IsTabAllowed(sal_Bool bForward) const
{
	DBG_CHKTHIS(OTableGrantControl,NULL);
	long nRow = GetCurRow();
	sal_uInt16 nCol = GetCurColumnId();

	if (bForward && (nCol == 2) && (nRow == GetRowCount() - 1))
		return sal_False;

	if (!bForward && (nCol == 1) && (nRow == 0))
		return sal_False;

	return EditBrowseBox::IsTabAllowed(bForward);
}
//------------------------------------------------------------------------------
#define GRANT_REVOKE_RIGHT(what)				\
	if(m_pCheckCell->GetBox().IsChecked())		\
		xAuth->grantPrivileges(sTableName,PrivilegeObject::TABLE,what);\
	else										\
		xAuth->revokePrivileges(sTableName,PrivilegeObject::TABLE,what)

//------------------------------------------------------------------------------
sal_Bool OTableGrantControl::SaveModified()
{
	DBG_CHKTHIS(OTableGrantControl,NULL);

	sal_Int32 nRow = GetCurRow();
	if(nRow == -1 || nRow >= m_aTableNames.getLength())
		return sal_False;

	::rtl::OUString sTableName = m_aTableNames[nRow];
	sal_Bool bErg = sal_True;
	try
	{
		
		if ( m_xUsers->hasByName(m_sUserName) )
		{
			Reference<XAuthorizable> xAuth(m_xUsers->getByName(m_sUserName),UNO_QUERY);
			if ( xAuth.is() )
			{
				switch( GetCurColumnId() )
				{
					case COL_INSERT:
						GRANT_REVOKE_RIGHT(Privilege::INSERT);
						break;
					case COL_DELETE:
						GRANT_REVOKE_RIGHT(Privilege::DELETE);
						break;
					case COL_UPDATE:
						GRANT_REVOKE_RIGHT(Privilege::UPDATE);
						break;
					case COL_ALTER:
						GRANT_REVOKE_RIGHT(Privilege::ALTER);
						break;
					case COL_SELECT:
						GRANT_REVOKE_RIGHT(Privilege::SELECT);
						break;
					case COL_REF:
						GRANT_REVOKE_RIGHT(Privilege::REFERENCE);
						break;
					case COL_DROP:
						GRANT_REVOKE_RIGHT(Privilege::DROP);
						break;
				}
				fillPrivilege(nRow);
			}
		}
	}
	catch(SQLException& e)
	{
		bErg = sal_False;
		::dbaui::showError(::dbtools::SQLExceptionInfo(e),GetParent(),m_xORB);
	}
	if(bErg && Controller().Is())
		Controller()->ClearModified();
	if(!bErg)
		UpdateTables();

	return bErg;
}

//------------------------------------------------------------------------------
String OTableGrantControl::GetCellText( long nRow, sal_uInt16 nColId ) const
{
	DBG_CHKTHIS(OTableGrantControl,NULL);
	if(COL_TABLE_NAME == nColId)
		return m_aTableNames[nRow];
	
	sal_Int32 nPriv = 0;
	TTablePrivilegeMap::const_iterator aFind = findPrivilege(nRow);
	if(aFind != m_aPrivMap.end())
		nPriv = aFind->second.nRights;

	return String::CreateFromInt32(isAllowed(nColId,nPriv) ? 1 :0);
}

//------------------------------------------------------------------------------
void OTableGrantControl::InitController( CellControllerRef& /*rController*/, long nRow, sal_uInt16 nColumnId )
{
	DBG_CHKTHIS(OTableGrantControl,NULL);
	String sTablename = m_aTableNames[nRow];
	// special case for tablename
	if(nColumnId == COL_TABLE_NAME)
		m_pEdit->SetText(sTablename);
	else
	{
		// get the privileges from the user
		TTablePrivilegeMap::const_iterator aFind = findPrivilege(nRow);
		m_pCheckCell->GetBox().Check(aFind != m_aPrivMap.end() ? isAllowed(nColumnId,aFind->second.nRights) : sal_False);
	}
}
// -----------------------------------------------------------------------------
void OTableGrantControl::fillPrivilege(sal_Int32 _nRow)	const
{
	
	if ( m_xUsers->hasByName(m_sUserName) )
	{
		try
		{
			Reference<XAuthorizable> xAuth(m_xUsers->getByName(m_sUserName),UNO_QUERY);
			if ( xAuth.is() )
			{
				// get the privileges
				TPrivileges nRights;
				nRights.nRights	= xAuth->getPrivileges(m_aTableNames[_nRow],PrivilegeObject::TABLE);
				if(m_xGrantUser.is())
					nRights.nWithGrant = m_xGrantUser->getGrantablePrivileges(m_aTableNames[_nRow],PrivilegeObject::TABLE);
				else
					nRights.nWithGrant = 0;

				m_aPrivMap[m_aTableNames[_nRow]] = nRights;
			}
		}
		catch(SQLException& e)
		{
			::dbaui::showError(::dbtools::SQLExceptionInfo(e),GetParent(),m_xORB);
		}
		catch(Exception& )
		{
		}
	}
}
// -----------------------------------------------------------------------------
sal_Bool OTableGrantControl::isAllowed(sal_uInt16 _nColumnId,sal_Int32 _nPrivilege) const
{
	sal_Bool bAllowed = sal_False;
	switch (_nColumnId)
	{
		case COL_INSERT:
			bAllowed = (Privilege::INSERT & _nPrivilege) == Privilege::INSERT;
			break;
		case COL_DELETE:
			bAllowed = (Privilege::DELETE & _nPrivilege) == Privilege::DELETE;
			break;
		case COL_UPDATE:
			bAllowed = (Privilege::UPDATE & _nPrivilege) == Privilege::UPDATE;
			break;
		case COL_ALTER:
			bAllowed = (Privilege::ALTER & _nPrivilege) == Privilege::ALTER;
			break;
		case COL_SELECT:
			bAllowed = (Privilege::SELECT & _nPrivilege) == Privilege::SELECT;
			break;
		case COL_REF:
			bAllowed = (Privilege::REFERENCE & _nPrivilege) == Privilege::REFERENCE;
			break;
		case COL_DROP:
			bAllowed = (Privilege::DROP & _nPrivilege) == Privilege::DROP;
			break;
	}
	return bAllowed;
}
// -----------------------------------------------------------------------------
void OTableGrantControl::setUserName(const ::rtl::OUString _sUserName)
{
	m_sUserName = _sUserName;
	m_aPrivMap = TTablePrivilegeMap();
}
// -----------------------------------------------------------------------------
void OTableGrantControl::setGrantUser(const Reference< XAuthorizable>& _xGrantUser)
{
	OSL_ENSURE(_xGrantUser.is(),"OTableGrantControl::setGrantUser: GrantUser is null!");
	m_xGrantUser = _xGrantUser;
}
//------------------------------------------------------------------------------
CellController* OTableGrantControl::GetController( long nRow, sal_uInt16 nColumnId )
{
	DBG_CHKTHIS(OTableGrantControl,NULL);

	CellController* pController = NULL;
	switch( nColumnId )
	{
		case COL_TABLE_NAME:
			break;
		case COL_INSERT:
		case COL_DELETE:
		case COL_UPDATE:
		case COL_ALTER:
		case COL_SELECT:
		case COL_REF:
		case COL_DROP:
			{
				TTablePrivilegeMap::const_iterator aFind = findPrivilege(nRow);
				if(aFind != m_aPrivMap.end() && isAllowed(nColumnId,aFind->second.nWithGrant))
					pController = new CheckBoxCellController( m_pCheckCell );
			}
			break;
		default:
			;
	}
	return pController;
}
//------------------------------------------------------------------------------
sal_Bool OTableGrantControl::SeekRow( long nRow )
{
	DBG_CHKTHIS(OTableGrantControl,NULL);
	m_nDataPos = nRow;

	return (nRow <= m_aTableNames.getLength());
}

//------------------------------------------------------------------------------
void OTableGrantControl::PaintCell( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId ) const
{
	DBG_CHKTHIS(OTableGrantControl,NULL);
	
	if(nColumnId != COL_TABLE_NAME)
	{
		TTablePrivilegeMap::const_iterator aFind = findPrivilege(m_nDataPos);
		if(aFind != m_aPrivMap.end())
			PaintTristate(rDev, rRect, isAllowed(nColumnId,aFind->second.nRights) ? STATE_CHECK : STATE_NOCHECK,isAllowed(nColumnId,aFind->second.nWithGrant));
		else
			PaintTristate(rDev, rRect, STATE_NOCHECK,sal_False);
	}
	else
	{
		String aText(((OTableGrantControl*)this)->GetCellText( m_nDataPos, nColumnId ));
		Point aPos( rRect.TopLeft() );
		sal_Int32 nWidth = GetDataWindow().GetTextWidth( aText );
		sal_Int32 nHeight = GetDataWindow().GetTextHeight();

		if( aPos.X() < rRect.Right() || aPos.X() + nWidth > rRect.Right() ||
			aPos.Y() < rRect.Top() || aPos.Y() + nHeight > rRect.Bottom() )
			rDev.SetClipRegion( rRect );

		rDev.DrawText( aPos, aText );
	}

	if( rDev.IsClipRegion() )
		rDev.SetClipRegion();
}

//------------------------------------------------------------------------
void OTableGrantControl::CellModified()
{
	DBG_CHKTHIS(OTableGrantControl,NULL);
	EditBrowseBox::CellModified();
	SaveModified();
}
// -----------------------------------------------------------------------------
OTableGrantControl::TTablePrivilegeMap::const_iterator OTableGrantControl::findPrivilege(sal_Int32 _nRow) const
{
	TTablePrivilegeMap::const_iterator aFind = m_aPrivMap.find(m_aTableNames[_nRow]);
	if(aFind == m_aPrivMap.end())
	{
		fillPrivilege(_nRow);
		aFind = m_aPrivMap.find(m_aTableNames[_nRow]);
	}
	return aFind;
}
// -----------------------------------------------------------------------------
Reference< XAccessible > OTableGrantControl::CreateAccessibleCell( sal_Int32 _nRow, sal_uInt16 _nColumnPos )
{
	sal_uInt16 nColumnId = GetColumnId( _nColumnPos );
	if(nColumnId != COL_TABLE_NAME)
	{
		TriState eState = STATE_NOCHECK;
		sal_Bool bEnable = sal_False;
		TTablePrivilegeMap::const_iterator aFind = findPrivilege(_nRow);
		if(aFind != m_aPrivMap.end())
		{
			eState = isAllowed(nColumnId,aFind->second.nRights) ? STATE_CHECK : STATE_NOCHECK;
			bEnable = isAllowed(nColumnId,aFind->second.nWithGrant);
		}
		else
			eState = STATE_NOCHECK;

		return EditBrowseBox::CreateAccessibleCheckBoxCell( _nRow, _nColumnPos,eState,bEnable );
	}
	return EditBrowseBox::CreateAccessibleCell( _nRow, _nColumnPos );
}
// -----------------------------------------------------------------------------

