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

#include "Context.hxx"

#define AnyApplicationName "any"
#define AnyContextName "any"

namespace sfx2 { namespace sidebar {

const sal_Int32 Context::NoMatch = 4;
const sal_Int32 Context::ApplicationWildcardMatch = 1;
const sal_Int32 Context::ContextWildcardMatch = 2;
const sal_Int32 Context::OptimalMatch = 0; // Neither application nor context name is "any".

#define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))

Context::Context (void)
	: msApplication(A2S(AnyApplicationName)),
	  msContext(A2S(AnyContextName))
{
}

Context::Context (
	const ::rtl::OUString& rsApplication,
	const ::rtl::OUString& rsContext)
	: msApplication(rsApplication),
	  msContext(rsContext)
{
}

sal_Int32 Context::EvaluateMatch (
	const Context& rOther) const
{
	const bool bApplicationNameIsAny (rOther.msApplication.equalsAscii(AnyApplicationName));
	if (rOther.msApplication.equals(msApplication) || bApplicationNameIsAny)
	{
		// Application name matches.
		const bool bContextNameIsAny (rOther.msContext.equalsAscii(AnyContextName));
		if (rOther.msContext.equals(msContext) || bContextNameIsAny)
		{
			// Context name matches.
			return (bApplicationNameIsAny ? ApplicationWildcardMatch : 0)
				+ (bContextNameIsAny ? ContextWildcardMatch : 0);
		}
	}
	return NoMatch;
}

sal_Int32 Context::EvaluateMatch (const ::std::vector<Context>& rOthers) const
{
	sal_Int32 nBestMatch (NoMatch);

	for (::std::vector<Context>::const_iterator
			 iContext(rOthers.begin()),
			 iEnd(rOthers.end());
		 iContext!=iEnd;
		 ++iContext)
	{
		const sal_Int32 nMatch (EvaluateMatch(*iContext));
		if (nMatch < nBestMatch)
		{
			if (nMatch == OptimalMatch)
			{
				// We will find no better match so stop searching.
				return OptimalMatch;
			}
			nBestMatch = nMatch;
		}
	}
	return nBestMatch;
}

bool Context::operator== (const Context& rOther) const
{
	return msApplication.equals(rOther.msApplication)
		&& msContext.equals(rOther.msContext);
}

bool Context::operator!= (const Context& rOther) const
{
	return ( ! msApplication.equals(rOther.msApplication))
		|| ( ! msContext.equals(rOther.msContext));
}

} } // end of namespace sfx2::sidebar

/* vim: set noet sw=4 ts=4: */
