/**************************************************************
 *
 * 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_OQueryTabWinUndoAct_HXX
#include "QueryTabWinUndoAct.hxx"
#endif
#ifndef _OSL_DIAGNOSE_H_
#include <osl/diagnose.h>
#endif
#ifndef DBAUI_QUERY_TABLEWINDOW_HXX
#include "QTableWindow.hxx"
#endif
#ifndef DBAUI_QUERY_TABLEWINDOWDATA_HXX
#include "QTableWindowData.hxx"
#endif
#ifndef DBAUI_TABLECONNECTION_HXX
#include "TableConnection.hxx"
#endif
#ifndef DBAUI_TABLECONNECTIONDATA_HXX
#include "TableConnectionData.hxx"
#endif
#ifndef DBAUI_QUERYDESIGNFIELDUNDOACT_HXX
#include "QueryDesignFieldUndoAct.hxx"
#endif
#ifndef DBAUI_QUERYTABLEVIEW_HXX
#include "QueryTableView.hxx"
#endif


using namespace dbaui;
DBG_NAME(OQueryDesignFieldUndoAct)
OQueryDesignFieldUndoAct::OQueryDesignFieldUndoAct(OSelectionBrowseBox* pSelBrwBox, sal_uInt16 nCommentID)
	: OCommentUndoAction(nCommentID)
	, pOwner(pSelBrwBox)
	, m_nColumnPostion(BROWSER_INVALIDID)
{
	DBG_CTOR(OQueryDesignFieldUndoAct,NULL);
}
// -----------------------------------------------------------------------------
OQueryDesignFieldUndoAct::~OQueryDesignFieldUndoAct()
{
	DBG_DTOR(OQueryDesignFieldUndoAct,NULL);
	pOwner = NULL;
}
// -----------------------------------------------------------------------------

DBG_NAME(OQueryTabWinUndoAct )
// ------------------------------------------------------------------------------------------------
OQueryTabWinUndoAct::OQueryTabWinUndoAct(OQueryTableView* pOwner, sal_uInt16 nCommentID)
	:OQueryDesignUndoAction(pOwner, nCommentID)
	,m_pTabWin(NULL)
{
	DBG_CTOR(OQueryTabWinUndoAct ,NULL);
}
//==============================================================================
OQueryTabWinUndoAct::~OQueryTabWinUndoAct()
{
	DBG_DTOR(OQueryTabWinUndoAct ,NULL);
	if (m_bOwnerOfObjects)
	{	// wenn ich der alleinige Owner des Fenster bin, muss ich dafuer sorgen, dass es geloescht wird
		OSL_ENSURE(m_pTabWin != NULL, "OQueryTabWinUndoAct::~OQueryTabWinUndoAct() : m_pTabWin sollte nicht NULL sein");
		OSL_ENSURE(!m_pTabWin->IsVisible(), "OQueryTabWinUndoAct::~OQueryTabWinUndoAct() : *m_pTabWin sollte nicht sichtbar sein");

		if ( m_pTabWin )
			m_pTabWin->clearListBox();
		delete m_pTabWin;

		// und natuerlich auch die entsprechenden Connections
		::std::vector<OTableConnection*>::iterator aIter = m_vTableConnection.begin();
        ::std::vector<OTableConnection*>::iterator aEnd = m_vTableConnection.end();
		for(;aIter != aEnd;++aIter)
		{
			m_pOwner->DeselectConn(*aIter);
			delete (*aIter);
		}
		m_vTableConnection.clear();
	}
}
//------------------------------------------------------------------------------
void OTabFieldCellModifiedUndoAct::Undo()
{
	pOwner->EnterUndoMode();
	OSL_ENSURE(m_nColumnPostion != BROWSER_INVALIDID,"Column position was not set add the undo action!");
	OSL_ENSURE(m_nColumnPostion < pOwner->GetColumnCount(),"Position outside the column count!");
	if ( m_nColumnPostion != BROWSER_INVALIDID )
	{
		sal_uInt16 nColumnId = pOwner->GetColumnId(m_nColumnPostion);
		String strNext = pOwner->GetCellContents(m_nCellIndex, nColumnId);
		pOwner->SetCellContents(m_nCellIndex, nColumnId, m_strNextCellContents);
		m_strNextCellContents = strNext;
	}
	pOwner->LeaveUndoMode();
}

//------------------------------------------------------------------------------
void OTabFieldSizedUndoAct::Undo()
{
	pOwner->EnterUndoMode();
	OSL_ENSURE(m_nColumnPostion != BROWSER_INVALIDID,"Column position was not set add the undo action!");
	if ( m_nColumnPostion != BROWSER_INVALIDID )
	{
		sal_uInt16 nColumnId = pOwner->GetColumnId(m_nColumnPostion);
		long nNextWidth = pOwner->GetColumnWidth(nColumnId);
		pOwner->SetColWidth(nColumnId, m_nNextWidth);
		m_nNextWidth = nNextWidth;
	}
	pOwner->LeaveUndoMode();
}
// -----------------------------------------------------------------------------
void OTabFieldMovedUndoAct::Undo()
{
	pOwner->EnterUndoMode();
	OSL_ENSURE(m_nColumnPostion != BROWSER_INVALIDID,"Column position was not set add the undo action!");
	if ( m_nColumnPostion != BROWSER_INVALIDID )
	{
		sal_uInt16 nId = pDescr->GetColumnId();
		sal_uInt16 nOldPos = pOwner->GetColumnPos(nId);
		pOwner->SetColumnPos(nId,m_nColumnPostion);
		pOwner->ColumnMoved(nId,sal_False);
		m_nColumnPostion = nOldPos;
	}
	pOwner->LeaveUndoMode();
}
// -----------------------------------------------------------------------------
