/**************************************************************
 * 
 * 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_sw.hxx"

#include <com/sun/star/frame/XTitle.hpp>

#include <tools/list.hxx>
#include <svl/eitem.hxx>
#include <svl/stritem.hxx>
#include <sfx2/printer.hxx>
#include <sfx2/request.hxx>
#include <sfx2/sfxsids.hrc>
#include <svl/srchitem.hxx>
#include <svl/macitem.hxx>
#include <gloshdl.hxx>

#include <editeng/acorrcfg.hxx>
#include <sfx2/app.hxx>
#include <sfx2/objface.hxx>
#include <sfx2/viewfrm.hxx>
#include <uitool.hxx>
#include <wrtsh.hxx>
#include <view.hxx>
#include <glshell.hxx>
#include <doc.hxx>
#include <IDocumentUndoRedo.hxx>
#include <glosdoc.hxx>
#include <shellio.hxx>
#include <initui.hxx>					// fuer ::GetGlossaries()
#include <cmdid.h>
#include <swerror.h>
#include <misc.hrc>


#define SwWebGlosDocShell
#define SwGlosDocShell
#include <sfx2/msg.hxx>
#include <swslots.hxx>

using namespace ::com::sun::star;

SFX_IMPL_INTERFACE( SwGlosDocShell, SwDocShell, SW_RES(0) )
{
}

SFX_IMPL_INTERFACE( SwWebGlosDocShell, SwWebDocShell, SW_RES(0) )
{
}

void lcl_Execute( SwDocShell& rSh, SfxRequest& rReq )
{
	if ( rReq.GetSlot() == SID_SAVEDOC )
	{
		if( !rSh.HasName() )
		{
			rReq.SetReturnValue( SfxBoolItem( 0, rSh.Save() ) );
		}
		else
		{
			const SfxBoolItem* pRes = ( const SfxBoolItem* )
										rSh.ExecuteSlot( rReq,
										rSh.SfxObjectShell::GetInterface() );
			if( pRes->GetValue() )
				rSh.GetDoc()->ResetModified();
		}
	}
}


void lcl_GetState( SwDocShell& rSh, SfxItemSet& rSet )
{
	if( SFX_ITEM_AVAILABLE >= rSet.GetItemState( SID_SAVEDOC, sal_False ))
	{
		if( !rSh.GetDoc()->IsModified() )
			rSet.DisableItem( SID_SAVEDOC );
		else
			rSet.Put( SfxStringItem( SID_SAVEDOC, SW_RESSTR(STR_SAVE_GLOSSARY)));
	}
}


sal_Bool lcl_Save( SwWrtShell& rSh, const String& rGroupName,
				const String& rShortNm, const String& rLongNm )
{
	const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
	SwTextBlocks * pBlock = ::GetGlossaries()->GetGroupDoc( rGroupName );

	SvxMacro aStart(aEmptyStr, aEmptyStr);
	SvxMacro aEnd(aEmptyStr, aEmptyStr);
	SwGlossaryHdl* pGlosHdl;

	pGlosHdl = rSh.GetView().GetGlosHdl();
	pGlosHdl->GetMacros( rShortNm, aStart, aEnd, pBlock );

	sal_uInt16 nRet = rSh.SaveGlossaryDoc( *pBlock, rLongNm, rShortNm,
                                pCfg->IsSaveRelFile(),
								pBlock->IsOnlyTextBlock( rShortNm ) );

	if(aStart.GetMacName().Len() || aEnd.GetMacName().Len() )
	{
		SvxMacro* pStart = aStart.GetMacName().Len() ? &aStart : 0;
		SvxMacro* pEnd = aEnd.GetMacName().Len() ? &aEnd : 0;
		pGlosHdl->SetMacros( rShortNm, pStart, pEnd, pBlock );
	}

	rSh.EnterStdMode();
	if( USHRT_MAX != nRet )
		rSh.ResetModified();
	delete pBlock;
	return nRet != USHRT_MAX;
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


SwGlosDocShell::SwGlosDocShell(sal_Bool bNewShow)
    : SwDocShell( (bNewShow)
            ? SFX_CREATE_MODE_STANDARD : SFX_CREATE_MODE_INTERNAL )
    , bShow ( bNewShow )
{
	SetHelpId(SW_GLOSDOCSHELL);
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


SwGlosDocShell::~SwGlosDocShell(  )
{
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


void SwGlosDocShell::Execute( SfxRequest& rReq )
{
	::lcl_Execute( *this, rReq );
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


void SwGlosDocShell::GetState( SfxItemSet& rSet )
{
	::lcl_GetState( *this, rSet );
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


sal_Bool SwGlosDocShell::Save()
{
	// In case of an API object which holds this document, it is possible that the WrtShell is already
	// dead. For instance, if the doc is modified via this API object, and then, upon office shutdown,
	// the document's view is closed (by the SFX framework) _before_ the API object is release and
	// tries to save the doc, again.
	// 96380 - 2002-03-03 - fs@openoffice.org
	if ( GetWrtShell() )
		return ::lcl_Save( *GetWrtShell(), aGroupName, aShortName, aLongName );
	else
	{
		SetModified( sal_False );
		return sal_False;
	}
}


/**/

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


SwWebGlosDocShell::SwWebGlosDocShell()
	: SwWebDocShell( SFX_CREATE_MODE_STANDARD )
{
	SetHelpId(SW_WEBGLOSDOCSHELL);
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


SwWebGlosDocShell::~SwWebGlosDocShell(  )
{
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


void SwWebGlosDocShell::Execute( SfxRequest& rReq )
{
	::lcl_Execute( *this, rReq );
}
/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


void SwWebGlosDocShell::GetState( SfxItemSet& rSet )
{
	::lcl_GetState( *this, rSet );
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


sal_Bool SwWebGlosDocShell::Save()
{
	// same comment as in SwGlosDocShell::Save - see there
	if ( GetWrtShell() )
		return ::lcl_Save( *GetWrtShell(), aGroupName, aShortName, aLongName );
	else
	{
		SetModified( sal_False );
		return sal_False;
	}
}

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/

SV_IMPL_REF ( SwDocShell )

SwDocShellRef SwGlossaries::EditGroupDoc( const String& rGroup, const String& rShortName, sal_Bool bShow )
{
	SwDocShellRef xDocSh;

	SwTextBlocks* pGroup = GetGroupDoc( rGroup );
	if( pGroup && pGroup->GetCount() )
	{
		// erfrage welche View registriert ist. Im WebWriter gibts es keine
		// normale View
		sal_uInt16 nViewId = 0 != &SwView::Factory() ? 2 : 6;
		String sLongName = pGroup->GetLongName(pGroup->GetIndex( rShortName ));

		if( 6 == nViewId )
		{
			SwWebGlosDocShell* pDocSh = new SwWebGlosDocShell();
			xDocSh = pDocSh;
			pDocSh->DoInitNew( 0 );
			pDocSh->SetLongName( sLongName );
			pDocSh->SetShortName( rShortName);
			pDocSh->SetGroupName( rGroup );
		}
		else
		{
			SwGlosDocShell* pDocSh = new SwGlosDocShell(bShow);
			xDocSh = pDocSh;
			pDocSh->DoInitNew( 0 );
			pDocSh->SetLongName( sLongName );
			pDocSh->SetShortName( rShortName );
			pDocSh->SetGroupName( rGroup );
		}

		// Dokumenttitel setzen
        SfxViewFrame* pFrame = bShow ? SfxViewFrame::LoadDocument( *xDocSh, nViewId ) : SfxViewFrame::LoadHiddenDocument( *xDocSh, nViewId );
		String aDocTitle(SW_RES( STR_GLOSSARY ));
        aDocTitle += ' ';
        aDocTitle += sLongName;

        bool const bDoesUndo =
            xDocSh->GetDoc()->GetIDocumentUndoRedo().DoesUndo();
        xDocSh->GetDoc()->GetIDocumentUndoRedo().DoUndo( false );

		xDocSh->GetWrtShell()->InsertGlossary( *pGroup, rShortName );
        if( !xDocSh->GetDoc()->getPrinter( false ) )
		{
			// wir erzeugen einen default SfxPrinter.
			// Das ItemSet wird vom Sfx geloescht!
			SfxItemSet *pSet = new SfxItemSet( xDocSh->GetDoc()->GetAttrPool(),
						FN_PARAM_ADDPRINTER, FN_PARAM_ADDPRINTER,
						SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
						SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
						0 );
			SfxPrinter* pPrinter = new SfxPrinter( pSet );

			// und haengen ihn ans Dokument.
            xDocSh->GetDoc()->setPrinter( pPrinter, true, true );
		}

		xDocSh->SetTitle( aDocTitle );
        try
        {
            // set the UI-title
            uno::Reference< frame::XTitle > xTitle( xDocSh->GetModel(), uno::UNO_QUERY_THROW );
            xTitle->setTitle( aDocTitle );
        }
        catch( uno::Exception& )
        {}

        xDocSh->GetDoc()->GetIDocumentUndoRedo().DoUndo( bDoesUndo );
		xDocSh->GetDoc()->ResetModified();
		if ( bShow )
			pFrame->GetFrame().Appear();

		delete pGroup;
	}
	return xDocSh;
}


