blob: 9a794ec79c530e6b69332a67f926eaa65caaa9ec [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file./*
#ifndef PositionWithAffinity_h
#define PositionWithAffinity_h
#include "core/CoreExport.h"
#include "core/editing/Position.h"
#include "core/editing/TextAffinity.h"
namespace blink {
template <typename Strategy>
class CORE_TEMPLATE_CLASS_EXPORT PositionWithAffinityTemplate {
DISALLOW_NEW();
public:
// TODO(yosin) We should have single parameter constructor not to use
// default parameter for avoiding include "TextAffinity.h"
PositionWithAffinityTemplate(const PositionTemplate<Strategy>&, TextAffinity = TextAffinity::Downstream);
PositionWithAffinityTemplate();
~PositionWithAffinityTemplate();
TextAffinity affinity() const { return m_affinity; }
const PositionTemplate<Strategy>& position() const { return m_position; }
// Returns true if both |this| and |other| is null or both |m_position|
// and |m_affinity| equal.
bool operator==(const PositionWithAffinityTemplate& other) const;
bool operator!=(const PositionWithAffinityTemplate& other) const { return !operator==(other); }
bool isNotNull() const { return m_position.isNotNull(); }
bool isNull() const { return m_position.isNull(); }
DEFINE_INLINE_TRACE()
{
visitor->trace(m_position);
}
private:
PositionTemplate<Strategy> m_position;
TextAffinity m_affinity;
};
extern template class CORE_EXTERN_TEMPLATE_EXPORT PositionWithAffinityTemplate<EditingStrategy>;
extern template class CORE_EXTERN_TEMPLATE_EXPORT PositionWithAffinityTemplate<EditingInFlatTreeStrategy>;
using PositionWithAffinity = PositionWithAffinityTemplate<EditingStrategy>;
using PositionInFlatTreeWithAffinity = PositionWithAffinityTemplate<EditingInFlatTreeStrategy>;
template <typename Strategy>
PositionWithAffinityTemplate<Strategy> fromPositionInDOMTree(const PositionWithAffinity&);
template <>
inline PositionWithAffinity fromPositionInDOMTree<EditingStrategy>(const PositionWithAffinity& positionWithAffinity)
{
return positionWithAffinity;
}
template <>
inline PositionInFlatTreeWithAffinity fromPositionInDOMTree<EditingInFlatTreeStrategy>(const PositionWithAffinity& positionWithAffinity)
{
return PositionInFlatTreeWithAffinity(toPositionInFlatTree(positionWithAffinity.position()), positionWithAffinity.affinity());
}
} // namespace blink
#endif // PositionWithAffinity_h