/**************************************************************
 *
 * 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_svx.hxx"
#include <svx/sdrmasterpagedescriptor.hxx>
#include <svx/sdr/contact/viewcontactofmasterpagedescriptor.hxx>
#include <svx/svdpage.hxx>

// #i42075#
#include <svx/svdobj.hxx>
#include <svx/xfillit0.hxx>
#include <svl/itemset.hxx>

//////////////////////////////////////////////////////////////////////////////

namespace sdr
{
	// ViewContact part
	sdr::contact::ViewContact* MasterPageDescriptor::CreateObjectSpecificViewContact()
	{
		return new sdr::contact::ViewContactOfMasterPageDescriptor(*this);
	}

	MasterPageDescriptor::MasterPageDescriptor(SdrPage& aOwnerPage, SdrPage& aUsedPage)
	:	maOwnerPage(aOwnerPage),
		maUsedPage(aUsedPage),
		mpViewContact(0L)
	{
		// all layers visible
		maVisibleLayers.SetAll();

		// register at used page
		maUsedPage.AddPageUser(*this);
	}

	MasterPageDescriptor::~MasterPageDescriptor()
	{
		// de-register at used page
		maUsedPage.RemovePageUser(*this);

		if(mpViewContact)
		{
			delete mpViewContact;
			mpViewContact = 0L;
		}
	}

	// ViewContact part
	sdr::contact::ViewContact& MasterPageDescriptor::GetViewContact() const
	{
		if(!mpViewContact)
		{
			const_cast< MasterPageDescriptor* >(this)->mpViewContact =
                const_cast< MasterPageDescriptor* >(this)->CreateObjectSpecificViewContact();
		}

		return *mpViewContact;
	}

	// this method is called form the destructor of the referenced page.
	// do all necessary action to forget the page. It is not necessary to call
	// RemovePageUser(), that is done form the destructor.
	void MasterPageDescriptor::PageInDestruction(const SdrPage& /*rPage*/)
	{
		maOwnerPage.TRG_ClearMasterPage();
	}

	void MasterPageDescriptor::SetVisibleLayers(const SetOfByte& rNew)
	{
		if(rNew != maVisibleLayers)
		{
			maVisibleLayers = rNew;
			GetViewContact().ActionChanged();
		}
	}

	// operators
	sal_Bool MasterPageDescriptor::operator==(const MasterPageDescriptor& rCandidate) const
	{
		return (&maOwnerPage == &rCandidate.maOwnerPage
			&& &maUsedPage == &rCandidate.maUsedPage
			&& maVisibleLayers == rCandidate.maVisibleLayers);
	}

	sal_Bool MasterPageDescriptor::operator!=(const MasterPageDescriptor& rCandidate) const
	{
		return (&maOwnerPage != &rCandidate.maOwnerPage
			|| &maUsedPage != &rCandidate.maUsedPage
			|| maVisibleLayers != rCandidate.maVisibleLayers);
	}

    const SdrPageProperties* MasterPageDescriptor::getCorrectSdrPageProperties() const
    {
        const SdrPage* pCorrectPage = &GetOwnerPage();
        const SdrPageProperties* pCorrectProperties = &pCorrectPage->getSdrPageProperties();

        if(XFILL_NONE == ((const XFillStyleItem&)pCorrectProperties->GetItemSet().Get(XATTR_FILLSTYLE)).GetValue())
        {
            pCorrectPage = &GetUsedPage();
            pCorrectProperties = &pCorrectPage->getSdrPageProperties();
        }

        if(pCorrectPage->IsMasterPage() && !pCorrectProperties->GetStyleSheet())
        {
            // #i110846# Suppress SdrPage FillStyle for MasterPages without StyleSheets,
            // else the PoolDefault (XFILL_COLOR and Blue8) will be used. Normally, all
            // MasterPages should have a StyleSheet excactly for this reason, but historically
            // e.g. the Notes MasterPage has no StyleSheet set (and there maybe others).
            pCorrectProperties = 0;
        }

        return pCorrectProperties;
    }
} // end of namespace sdr

//////////////////////////////////////////////////////////////////////////////
// eof
