/**************************************************************
 *
 * 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.
 *
 *************************************************************/



#include "precompiled_dbui.hxx"

#include "dbaundomanager.hxx"
#include "singledoccontroller.hxx"
#include "browserids.hxx"
#include "dbu_misc.hrc"
#include "dbustrings.hrc"
#include "moduledbu.hxx"

/** === begin UNO includes === **/
/** === end UNO includes === **/

#include <svl/undo.hxx>

#include <boost/scoped_ptr.hpp>

//......................................................................................................................
namespace dbaui
{
//......................................................................................................................

	/** === begin UNO using === **/
	using ::com::sun::star::uno::Reference;
	using ::com::sun::star::uno::XInterface;
	using ::com::sun::star::uno::UNO_QUERY;
	using ::com::sun::star::uno::UNO_QUERY_THROW;
	using ::com::sun::star::uno::UNO_SET_THROW;
	using ::com::sun::star::uno::Exception;
	using ::com::sun::star::uno::RuntimeException;
	using ::com::sun::star::uno::Any;
	using ::com::sun::star::uno::makeAny;
	using ::com::sun::star::uno::Sequence;
	using ::com::sun::star::uno::Type;
    using ::com::sun::star::document::XUndoManager;
    using ::com::sun::star::lang::XMultiServiceFactory;
    using ::com::sun::star::beans::PropertyValue;
    using ::com::sun::star::lang::EventObject;
	/** === end UNO using === **/

	//==================================================================================================================
	//= OSingleDocumentController_Data
	//==================================================================================================================
    struct OSingleDocumentController_Data
    {
        ::boost::scoped_ptr< UndoManager >  m_pUndoManager;

        OSingleDocumentController_Data( ::cppu::OWeakObject& i_parent, ::osl::Mutex& i_mutex )
            :m_pUndoManager( new UndoManager( i_parent, i_mutex ) )
        {
        }
    };

	//==================================================================================================================
	//= OSingleDocumentController
	//==================================================================================================================
	//------------------------------------------------------------------------------------------------------------------
    OSingleDocumentController::OSingleDocumentController( const Reference< XMultiServiceFactory >& _rxORB )
        :OSingleDocumentController_Base( _rxORB )
        ,m_pData( new OSingleDocumentController_Data( *this, getMutex() ) )
    {
    }

	//------------------------------------------------------------------------------------------------------------------
    OSingleDocumentController::~OSingleDocumentController()
    {
    }

	// -----------------------------------------------------------------------------
    void SAL_CALL OSingleDocumentController::disposing()
    {
        OSingleDocumentController_Base::disposing();
		ClearUndoManager();
        m_pData->m_pUndoManager->disposing();
    }

	// -----------------------------------------------------------------------------
	void SAL_CALL OSingleDocumentController::disposing( const EventObject& i_event ) throw( RuntimeException )
    {
        // simply disambiguate
        OSingleDocumentController_Base::disposing( i_event );
    }

	// -----------------------------------------------------------------------------
    void OSingleDocumentController::ClearUndoManager()
    {
        GetUndoManager().Clear();
    }

	// -----------------------------------------------------------------------------
	SfxUndoManager& OSingleDocumentController::GetUndoManager() const
	{
		return m_pData->m_pUndoManager->GetSfxUndoManager();
	}

    // -----------------------------------------------------------------------------
	void OSingleDocumentController::addUndoActionAndInvalidate(SfxUndoAction *_pAction)
	{
		// add undo action
		GetUndoManager().AddUndoAction( _pAction );

        // when we add an undo action the controller was modified
		setModified( sal_True );

        // now inform me that or states changed
		InvalidateFeature( ID_BROWSER_UNDO );
		InvalidateFeature( ID_BROWSER_REDO );
	}

    // -----------------------------------------------------------------------------
    Reference< XUndoManager > SAL_CALL OSingleDocumentController::getUndoManager(  ) throw (RuntimeException)
    {
        return m_pData->m_pUndoManager.get();
    }

    // -----------------------------------------------------------------------------
	FeatureState OSingleDocumentController::GetState(sal_uInt16 _nId) const
	{
		FeatureState aReturn;
		switch ( _nId )
		{
			case ID_BROWSER_UNDO:
				aReturn.bEnabled = isEditable() && GetUndoManager().GetUndoActionCount() != 0;
				if ( aReturn.bEnabled )
				{
					String sUndo(ModuleRes(STR_UNDO_COLON));
					sUndo += String(RTL_CONSTASCII_USTRINGPARAM(" "));
					sUndo += GetUndoManager().GetUndoActionComment();
					aReturn.sTitle = sUndo;
				}
				break;

			case ID_BROWSER_REDO:
				aReturn.bEnabled = isEditable() && GetUndoManager().GetRedoActionCount() != 0;
				if ( aReturn.bEnabled )
				{
					String sRedo(ModuleRes(STR_REDO_COLON));
					sRedo += String(RTL_CONSTASCII_USTRINGPARAM(" "));
					sRedo += GetUndoManager().GetRedoActionComment();
					aReturn.sTitle = sRedo;
				}
				break;

			default:
				aReturn = OSingleDocumentController_Base::GetState(_nId);
		}
		return aReturn;
	}
	// -----------------------------------------------------------------------------
	void OSingleDocumentController::Execute( sal_uInt16 _nId, const Sequence< PropertyValue >& _rArgs )
	{
		switch ( _nId )
		{
			case ID_BROWSER_UNDO:
				GetUndoManager().Undo();
				InvalidateFeature( ID_BROWSER_UNDO );
				InvalidateFeature( ID_BROWSER_REDO );
				break;

            case ID_BROWSER_REDO:
				GetUndoManager().Redo();
				InvalidateFeature( ID_BROWSER_UNDO );
				InvalidateFeature( ID_BROWSER_REDO );
				break;

            default:
                OSingleDocumentController_Base::Execute( _nId, _rArgs );
                break;
		}
		InvalidateFeature(_nId);
	}

//......................................................................................................................
} // namespace dbaui
//......................................................................................................................
