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

#include <svl/intitem.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <tools/bigint.hxx>
#include <tools/stream.hxx>
#include <svl/metitem.hxx>

//============================================================================
//
//  class SfxByteItem
//
//============================================================================

TYPEINIT1_AUTOFACTORY(SfxByteItem, CntByteItem);

//============================================================================
// virtual
SfxPoolItem * SfxByteItem::Create(SvStream & rStream, sal_uInt16) const
{
	short nValue = 0;
	rStream >> nValue;
	return new SfxByteItem(Which(), sal_uInt8(nValue));
}

//============================================================================
//
//  class SfxInt16Item
//
//============================================================================

DBG_NAME(SfxInt16Item);

//============================================================================
TYPEINIT1_AUTOFACTORY(SfxInt16Item, SfxPoolItem);

//============================================================================
SfxInt16Item::SfxInt16Item(sal_uInt16 which, SvStream & rStream):
	SfxPoolItem(which)
{
	DBG_CTOR(SfxInt16Item, 0);
	short nTheValue = 0;
	rStream >> nTheValue;
	m_nValue = nTheValue;
}

//============================================================================
// virtual
int SfxInt16Item::operator ==(const SfxPoolItem & rItem) const
{
	DBG_CHKTHIS(SfxInt16Item, 0);
	DBG_ASSERT(SfxPoolItem::operator ==(rItem), "unequal type");
	return m_nValue == SAL_STATIC_CAST(const SfxInt16Item *, &rItem)->
	                    m_nValue;
}

//============================================================================
// virtual
int SfxInt16Item::Compare(const SfxPoolItem & rWith) const
{
	DBG_CHKTHIS(SfxInt16Item, 0);
	DBG_ASSERT(SfxPoolItem::operator ==(rWith), "unequal type");
	return SAL_STATIC_CAST(const SfxInt16Item *, &rWith)->m_nValue
	         < m_nValue ?
            -1 :
	       SAL_STATIC_CAST(const SfxInt16Item *, &rWith)->m_nValue
	         == m_nValue ?
	        0 : 1;
}

//============================================================================
// virtual
SfxItemPresentation SfxInt16Item::GetPresentation(SfxItemPresentation,
												  SfxMapUnit, SfxMapUnit,
												  XubString & rText,
                                                  const IntlWrapper *) const
{
	DBG_CHKTHIS(SfxInt16Item, 0);
	rText = UniString::CreateFromInt32(m_nValue);
	return SFX_ITEM_PRESENTATION_NAMELESS;
}


//============================================================================
// virtual
sal_Bool SfxInt16Item::QueryValue(com::sun::star::uno::Any& rVal, sal_uInt8) const
{
	sal_Int16 nValue = m_nValue;
	rVal <<= nValue;
	return sal_True;
}

//============================================================================
// virtual
sal_Bool SfxInt16Item::PutValue(const com::sun::star::uno::Any& rVal, sal_uInt8 )
{
	sal_Int16 nValue = sal_Int16();
	if (rVal >>= nValue)
	{
		m_nValue = nValue;
		return sal_True;
	}

	DBG_ERROR( "SfxInt16Item::PutValue - Wrong type!" );
	return sal_False;
}

//============================================================================
// virtual
SfxPoolItem * SfxInt16Item::Create(SvStream & rStream, sal_uInt16) const
{
	DBG_CHKTHIS(SfxInt16Item, 0);
	return new SfxInt16Item(Which(), rStream);
}

//============================================================================
// virtual
SvStream & SfxInt16Item::Store(SvStream & rStream, sal_uInt16) const
{
	DBG_CHKTHIS(SfxInt16Item, 0);
	rStream << short(m_nValue);
	return rStream;
}

//============================================================================
SfxPoolItem * SfxInt16Item::Clone(SfxItemPool *) const
{
	DBG_CHKTHIS(SfxInt16Item, 0);
	return new SfxInt16Item(*this);
}

//============================================================================
sal_Int16 SfxInt16Item::GetMin() const
{
	DBG_CHKTHIS(SfxInt16Item, 0);
	return -32768;
}

//============================================================================
sal_Int16 SfxInt16Item::GetMax() const
{
	DBG_CHKTHIS(SfxInt16Item, 0);
	return 32767;
}

//============================================================================
SfxFieldUnit SfxInt16Item::GetUnit() const
{
	DBG_CHKTHIS(SfxInt16Item, 0);
	return SFX_FUNIT_NONE;
}

//============================================================================
//
//  class SfxUInt16Item
//
//============================================================================

TYPEINIT1_AUTOFACTORY(SfxUInt16Item, CntUInt16Item);


//============================================================================
//
//  class SfxInt32Item
//
//============================================================================

TYPEINIT1_AUTOFACTORY(SfxInt32Item, CntInt32Item);


//============================================================================
//
//  class SfxUInt32Item
//
//============================================================================

TYPEINIT1_AUTOFACTORY(SfxUInt32Item, CntUInt32Item);


//============================================================================
//
//  class SfxMetricItem
//
//============================================================================

DBG_NAME(SfxMetricItem);

//============================================================================
TYPEINIT1_AUTOFACTORY(SfxMetricItem, SfxInt32Item);

//============================================================================
SfxMetricItem::SfxMetricItem(sal_uInt16 which, sal_uInt32 nValue):
	SfxInt32Item(which, nValue)
{
	DBG_CTOR(SfxMetricItem, 0);
}

//============================================================================
SfxMetricItem::SfxMetricItem(sal_uInt16 which, SvStream & rStream):
	SfxInt32Item(which, rStream)
{
	DBG_CTOR(SfxMetricItem, 0);
}

//============================================================================
SfxMetricItem::SfxMetricItem(const SfxMetricItem & rItem):
	SfxInt32Item(rItem)
{
	DBG_CTOR(SfxMetricItem, 0);
}

//============================================================================
// virtual
int SfxMetricItem::ScaleMetrics(long nMult, long nDiv)
{
	BigInt aTheValue(GetValue());
	aTheValue *= nMult;
	aTheValue += nDiv / 2;
	aTheValue /= nDiv;
	SetValue(aTheValue);
	return 1;
}

//============================================================================
// virtual
int SfxMetricItem::HasMetrics() const
{
	return 1;
}

