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



#ifndef _SC_ACCESSIBLETEXT_HXX
#define _SC_ACCESSIBLETEXT_HXX

#include "textuno.hxx"
#include "global.hxx"
#include "viewdata.hxx"
#include <editeng/svxenum.hxx>

#include <memory>

class ScDocShell;
class ScViewForwarder;
class ScEditObjectViewForwarder;
class ScPreviewViewForwarder;
class ScEditViewForwarder;
class ScPreviewShell;
class EditTextObject;
class ScCsvViewForwarder;
class ScAccessibleCell;


// ============================================================================

class ScAccessibleTextData : public SfxListener
{
public:
						ScAccessibleTextData() {}
	virtual				~ScAccessibleTextData() {}

	virtual	ScAccessibleTextData* Clone() const = 0;

    virtual void        Notify( SfxBroadcaster& /* rBC */, const SfxHint& /* rHint */ ) {}

	virtual SvxTextForwarder* GetTextForwarder() = 0;
	virtual SvxViewForwarder* GetViewForwarder() = 0;
	virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool bCreate ) = 0;
	virtual SfxBroadcaster& GetBroadcaster() const { return maBroadcaster; }

    virtual void				UpdateData() = 0;
	virtual void				SetDoUpdate(sal_Bool bValue) = 0;
	virtual sal_Bool			IsDirty() const = 0;

private:
	mutable SfxBroadcaster maBroadcaster;

	// prevent the using of this method of the base class
	ScSharedCellEditSource*	GetOriginalSource() { return NULL; }
};


// ============================================================================

class ScAccessibleCellBaseTextData : public ScAccessibleTextData,
                                     public ScCellTextData
{
public:
                        ScAccessibleCellBaseTextData(ScDocShell* pDocShellP,
                            const ScAddress& rP)
                            : ScCellTextData(pDocShellP, rP) {}
    virtual             ~ScAccessibleCellBaseTextData() {}
    virtual void		Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) { ScCellTextData::Notify(rBC, rHint); }

    virtual void				UpdateData() { ScCellTextData::UpdateData(); }
    virtual void				SetDoUpdate(sal_Bool bValue) { ScCellTextData::SetDoUpdate(bValue); }
    virtual sal_Bool			IsDirty() const { return ScCellTextData::IsDirty(); }
};


// ============================================================================

//	ScAccessibleCellTextData: shared data between sub objects of a accessible cell text object

class ScAccessibleCellTextData : public ScAccessibleCellBaseTextData
{
public:
						ScAccessibleCellTextData(ScTabViewShell* pViewShell,
                            const ScAddress& rP, ScSplitPos eSplitPos, ScAccessibleCell* pAccCell);
	virtual				~ScAccessibleCellTextData();

	virtual	ScAccessibleTextData* Clone() const;

	virtual void		Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

	virtual SvxTextForwarder* GetTextForwarder();
	virtual SvxViewForwarder* GetViewForwarder();
	virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool bCreate );

	DECL_LINK( NotifyHdl, EENotify* );
protected:
    virtual void            GetCellText(const ScAddress& rCellPos, String& rText);
private:
	ScViewForwarder* mpViewForwarder;
	ScEditViewForwarder* mpEditViewForwarder;
	ScTabViewShell*	mpViewShell;
	ScSplitPos meSplitPos;
	sal_Bool mbViewEditEngine;
    ScAccessibleCell* mpAccessibleCell;

	// prevent the using of this method of the base class
	ScSharedCellEditSource*	GetOriginalSource() { return NULL; }

    using ScAccessibleCellBaseTextData::GetDocShell;
	ScDocShell* GetDocShell(ScTabViewShell* pViewShell);
};


// ============================================================================

class ScAccessibleEditObjectTextData : public ScAccessibleTextData
{
public:
						ScAccessibleEditObjectTextData(EditView* pEditView, Window* pWin);
	virtual				~ScAccessibleEditObjectTextData();

	virtual	ScAccessibleTextData* Clone() const;

	virtual void		Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

	virtual SvxTextForwarder* GetTextForwarder();
	virtual SvxViewForwarder* GetViewForwarder();
	virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool bCreate );

    virtual void				UpdateData() {  }
    virtual void				SetDoUpdate(sal_Bool /* bValue */) {  }
    virtual sal_Bool			IsDirty() const { return sal_False; }

    DECL_LINK( NotifyHdl, EENotify* );
protected:
	ScEditObjectViewForwarder* mpViewForwarder;
	ScEditViewForwarder* mpEditViewForwarder;
    EditView* mpEditView;
    EditEngine* mpEditEngine;
    SvxEditEngineForwarder*	mpForwarder;
    Window* mpWindow;
};


// ============================================================================

class ScAccessibleEditLineTextData : public ScAccessibleEditObjectTextData
{
public:
                        ScAccessibleEditLineTextData(EditView* pEditView, Window* pWin);
    virtual             ~ScAccessibleEditLineTextData();

    virtual ScAccessibleTextData* Clone() const;

    virtual SvxTextForwarder* GetTextForwarder();
	virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool bCreate );

    void Dispose();
    void TextChanged();
    void StartEdit();
    void EndEdit();
private:
    void ResetEditMode();

    sal_Bool mbEditEngineCreated;
};


// ============================================================================

class ScAccessiblePreviewCellTextData : public ScAccessibleCellBaseTextData
{
public:
						ScAccessiblePreviewCellTextData(ScPreviewShell* pViewShell,
							const ScAddress& rP);
	virtual				~ScAccessiblePreviewCellTextData();

	virtual	ScAccessibleTextData* Clone() const;

	virtual void		Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

	virtual SvxTextForwarder* GetTextForwarder();
	virtual SvxViewForwarder* GetViewForwarder();
	virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool /* bCreate */ ) { return NULL; }

//UNUSED2008-05  DECL_LINK( NotifyHdl, EENotify* );
private:
	ScPreviewViewForwarder* mpViewForwarder;
	ScPreviewShell*	mpViewShell;

	// prevent the using of this method of the base class
	ScSharedCellEditSource*	GetOriginalSource() { return NULL; }

    using ScAccessibleCellBaseTextData::GetDocShell;
	ScDocShell* GetDocShell(ScPreviewShell* pViewShell);
};


// ============================================================================

class ScAccessiblePreviewHeaderCellTextData : public ScAccessibleCellBaseTextData
{
public:
						ScAccessiblePreviewHeaderCellTextData(ScPreviewShell* pViewShell,
							const String& rText, const ScAddress& rP, sal_Bool bColHeader, sal_Bool bRowHeader);
	virtual				~ScAccessiblePreviewHeaderCellTextData();

	virtual	ScAccessibleTextData* Clone() const;

	virtual void		Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

	virtual SvxTextForwarder* GetTextForwarder();
	virtual SvxViewForwarder* GetViewForwarder();
	virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool /* bCreate */ ) { return NULL; }

//UNUSED2008-05  DECL_LINK( NotifyHdl, EENotify* );
private:
	ScPreviewViewForwarder* mpViewForwarder;
	ScPreviewShell*	mpViewShell;
	String			maText;
	sal_Bool		mbColHeader;
	sal_Bool		mbRowHeader;

	// prevent the using of this method of the base class
	ScSharedCellEditSource*	GetOriginalSource() { return NULL; }

    using ScAccessibleCellBaseTextData::GetDocShell;
	ScDocShell* GetDocShell(ScPreviewShell* pViewShell);
};


// ============================================================================

class ScAccessibleHeaderTextData : public ScAccessibleTextData
{
public:
                        ScAccessibleHeaderTextData(ScPreviewShell* pViewShell,
                            const EditTextObject* pEditObj, sal_Bool bHeader, SvxAdjust eAdjust);
    virtual             ~ScAccessibleHeaderTextData();

    virtual ScAccessibleTextData* Clone() const;

	virtual void		Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

	virtual SvxTextForwarder* GetTextForwarder();
	virtual SvxViewForwarder* GetViewForwarder();
	virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool /* bCreate */ ) { return NULL; }

    virtual void				UpdateData() {  }
    virtual void				SetDoUpdate(sal_Bool /* bValue */) {  }
    virtual sal_Bool			IsDirty() const { return sal_False; }
private:
    ScPreviewViewForwarder* mpViewForwarder;
    ScPreviewShell*         mpViewShell;
	ScEditEngineDefaulter*	mpEditEngine;
	SvxEditEngineForwarder*	mpForwarder;
    ScDocShell*             mpDocSh;
    const EditTextObject*   mpEditObj;
    sal_Bool                mbHeader;
    sal_Bool                mbDataValid;
    SvxAdjust               meAdjust;
};


// ============================================================================

class ScAccessibleNoteTextData : public ScAccessibleTextData
{
public:
                        ScAccessibleNoteTextData(ScPreviewShell* pViewShell,
                            const String& sText, const ScAddress& aCellPos, sal_Bool bMarkNote);
    virtual             ~ScAccessibleNoteTextData();

    virtual ScAccessibleTextData* Clone() const;

	virtual void		Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

	virtual SvxTextForwarder* GetTextForwarder();
	virtual SvxViewForwarder* GetViewForwarder();
	virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool /* bCreate */ ) { return NULL; }

    virtual void				UpdateData() {  }
    virtual void				SetDoUpdate(sal_Bool /* bValue */) {  }
    virtual sal_Bool			IsDirty() const { return sal_False; }
private:
    ScPreviewViewForwarder* mpViewForwarder;
    ScPreviewShell*         mpViewShell;
	ScEditEngineDefaulter*	mpEditEngine;
	SvxEditEngineForwarder*	mpForwarder;
    ScDocShell*             mpDocSh;
    String                  msText;
    ScAddress               maCellPos;
    sal_Bool                mbMarkNote;
    sal_Bool                mbDataValid;
};


// ============================================================================

class ScAccessibleCsvTextData : public ScAccessibleTextData
{
private:
    typedef ::std::auto_ptr< SvxTextForwarder > TextForwarderPtr;
    typedef ::std::auto_ptr< ScCsvViewForwarder > ViewForwarderPtr;

    Window*                     mpWindow;
    EditEngine*                 mpEditEngine;
    TextForwarderPtr            mpTextForwarder;
    ViewForwarderPtr            mpViewForwarder;
    String                      maCellText;
    Rectangle                   maBoundBox;
    Size                        maCellSize;

public:
    explicit                    ScAccessibleCsvTextData(
                                    Window* pWindow,
                                    EditEngine* pEditEngine,
                                    const String& rCellText,
                                    const Rectangle& rBoundBox,
                                    const Size& rCellSize );
    virtual                     ~ScAccessibleCsvTextData();

    virtual ScAccessibleTextData* Clone() const;

    virtual void                Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

    virtual SvxTextForwarder*   GetTextForwarder();
    virtual SvxViewForwarder*   GetViewForwarder();
    virtual SvxEditViewForwarder* GetEditViewForwarder( sal_Bool bCreate );

    virtual void                UpdateData() {}
    virtual void                SetDoUpdate( sal_Bool /* bValue */ ) {}
    virtual sal_Bool            IsDirty() const { return sal_False; }
};


// ============================================================================

#endif
