* Fixes some text related svace issues.
Change-Id: I88f91a0d43981a99f070c800e446066e6deb8874
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
mOrderListOfButtons.reserve( 8u );
// Create button for each possible option using Option priority
- mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::CUT, mCutOptionPriority, OPTION_CUT, POPUP_CUT_STRING , mCutIconImage, ( mEnabledButtons & Toolkit::TextSelectionPopup::CUT) ) );
- mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::COPY, mCopyOptionPriority, OPTION_COPY, POPUP_COPY_STRING, mCopyIconImage, ( mEnabledButtons & Toolkit::TextSelectionPopup::COPY) ) );
- mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::PASTE, mPasteOptionPriority, OPTION_PASTE, POPUP_PASTE_STRING, mPasteIconImage, ( mEnabledButtons & Toolkit::TextSelectionPopup::PASTE) ) );
- mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::SELECT, mSelectOptionPriority, OPTION_SELECT_WORD, POPUP_SELECT_STRING, mSelectIconImage, ( mEnabledButtons & Toolkit::TextSelectionPopup::SELECT) ) );
- mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::SELECT_ALL, mSelectAllOptionPriority, OPTION_SELECT_ALL, POPUP_SELECT_ALL_STRING, mSelectAllIconImage, ( mEnabledButtons & Toolkit::TextSelectionPopup::SELECT_ALL) ) );
- mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::CLIPBOARD, mClipboardOptionPriority, OPTION_CLIPBOARD, POPUP_CLIPBOARD_STRING, mClipboardIconImage, ( mEnabledButtons & Toolkit::TextSelectionPopup::CLIPBOARD) ) );
+ mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::CUT, mCutOptionPriority, OPTION_CUT, POPUP_CUT_STRING , mCutIconImage, 0 != ( mEnabledButtons & Toolkit::TextSelectionPopup::CUT) ) );
+ mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::COPY, mCopyOptionPriority, OPTION_COPY, POPUP_COPY_STRING, mCopyIconImage, 0 != ( mEnabledButtons & Toolkit::TextSelectionPopup::COPY) ) );
+ mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::PASTE, mPasteOptionPriority, OPTION_PASTE, POPUP_PASTE_STRING, mPasteIconImage, 0 != ( mEnabledButtons & Toolkit::TextSelectionPopup::PASTE) ) );
+ mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::SELECT, mSelectOptionPriority, OPTION_SELECT_WORD, POPUP_SELECT_STRING, mSelectIconImage, 0 != ( mEnabledButtons & Toolkit::TextSelectionPopup::SELECT) ) );
+ mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::SELECT_ALL, mSelectAllOptionPriority, OPTION_SELECT_ALL, POPUP_SELECT_ALL_STRING, mSelectAllIconImage, 0 != ( mEnabledButtons & Toolkit::TextSelectionPopup::SELECT_ALL) ) );
+ mOrderListOfButtons.push_back( ButtonRequirement( Toolkit::TextSelectionPopup::CLIPBOARD, mClipboardOptionPriority, OPTION_CLIPBOARD, POPUP_CLIPBOARD_STRING, mClipboardIconImage, 0 != ( mEnabledButtons & Toolkit::TextSelectionPopup::CLIPBOARD) ) );
// Sort the buttons according their priorities.
std::sort( mOrderListOfButtons.begin(), mOrderListOfButtons.end(), TextSelectionPopup::ButtonPriorityCompare() );
{
// Need to add a new line with no characters but with height to increase the layoutSize.height
LineRun newLine;
+ Initialize( newLine );
lines.PushBack( newLine );
UpdateTextLayout( layoutParameters,
}
}
+ void Initialize( LineRun& line )
+ {
+ line.glyphRun.glyphIndex = 0u;
+ line.glyphRun.numberOfGlyphs = 0u;
+ line.characterRun.characterIndex = 0u;
+ line.characterRun.numberOfCharacters = 0u;
+ line.width = 0.f;
+ line.ascender = 0.f;
+ line.descender = 0.f;
+ line.extraLength = 0.f;
+ line.alignmentOffset = 0.f;
+ line.direction = !RTL;
+ line.ellipsis = false;
+ }
+
LayoutEngine::Layout mLayout;
LayoutEngine::HorizontalAlignment mHorizontalAlignment;
LayoutEngine::VerticalAlignment mVerticalAlignment;
};
/**
+ * @brief Initializes a font run description to its defaults.
+ *
+ * @param[in,out] fontRun The font description run to initialize.
+ */
+void Initialize( FontDescriptionRun& fontRun )
+{
+ fontRun.characterRun.characterIndex = 0u;
+ fontRun.characterRun.numberOfCharacters = 0u;
+ fontRun.familyName = NULL;
+ fontRun.familyLength = 0u;
+ fontRun.weight = TextAbstraction::FontWeight::NORMAL;
+ fontRun.width = TextAbstraction::FontWidth::NORMAL;
+ fontRun.slant = TextAbstraction::FontSlant::NORMAL;
+ fontRun.size = 0u;
+ fontRun.familyDefined = false;
+ fontRun.weightDefined = false;
+ fontRun.widthDefined = false;
+ fontRun.slantDefined = false;
+ fontRun.sizeDefined = false;
+}
+
+/**
* @brief Splits the tag string into the tag name and its attributes.
*
* The attributes are stored in a vector in the tag.
{
// Create a new font run.
FontDescriptionRun fontRun;
- fontRun.characterRun.numberOfCharacters = 0u;
+ Initialize( fontRun );
// Fill the run with the parameters.
fontRun.characterRun.characterIndex = characterIndex;
fontRun.slant = TextAbstraction::FontSlant::ITALIC;
-
- fontRun.familyName = NULL;
- fontRun.familyDefined = false;
- fontRun.weightDefined = false;
- fontRun.widthDefined = false;
fontRun.slantDefined = true;
- fontRun.sizeDefined = false;
// Push the font run in the logical model.
markupProcessData.fontRuns.PushBack( fontRun );
{
// Create a new font run.
FontDescriptionRun fontRun;
- fontRun.characterRun.numberOfCharacters = 0u;
+ Initialize( fontRun );
// Fill the run with the parameters.
fontRun.characterRun.characterIndex = characterIndex;
-
fontRun.weight = TextAbstraction::FontWeight::BOLD;
-
- fontRun.familyName = NULL;
- fontRun.familyDefined = false;
fontRun.weightDefined = true;
- fontRun.widthDefined = false;
- fontRun.slantDefined = false;
- fontRun.sizeDefined = false;
// Push the font run in the logical model.
markupProcessData.fontRuns.PushBack( fontRun );
{
// Create a new font run.
FontDescriptionRun fontRun;
- fontRun.characterRun.numberOfCharacters = 0u;
+ Initialize( fontRun );
// Fill the run with the parameters.
fontRun.characterRun.characterIndex = characterIndex;
- fontRun.familyName = NULL;
- fontRun.familyDefined = false;
- fontRun.weightDefined = false;
- fontRun.widthDefined = false;
- fontRun.slantDefined = false;
- fontRun.sizeDefined = false;
-
ProcessFontTag( tag, fontRun );
// Push the font run in the logical model.
}
else
{
- CharacterIndex lastIndex = 0u;
+ Length numberOfCharactersToUpdate = 0u;
if( mTextUpdateInfo.mFullRelayoutNeeded )
{
- lastIndex = mTextUpdateInfo.mPreviousNumberOfCharacters;
+ numberOfCharactersToUpdate = mTextUpdateInfo.mPreviousNumberOfCharacters;
}
else
{
- lastIndex = ( mTextUpdateInfo.mNumberOfCharactersToRemove > 0u ) ? mTextUpdateInfo.mNumberOfCharactersToRemove : 1u;
+ numberOfCharactersToUpdate = ( mTextUpdateInfo.mNumberOfCharactersToRemove > 0u ) ? mTextUpdateInfo.mNumberOfCharactersToRemove : 1u;
}
mLogicalModel->FindParagraphs( mTextUpdateInfo.mCharacterIndex,
- lastIndex,
+ numberOfCharactersToUpdate,
paragraphsToBeUpdated );
}
void Controller::Impl::ClearFullModelData( OperationsMask operations )
{
- if( GET_LINE_BREAKS & operations )
+ if( NO_OPERATION != ( GET_LINE_BREAKS & operations ) )
{
mLogicalModel->mLineBreakInfo.Clear();
mLogicalModel->mParagraphInfo.Clear();
}
- if( GET_WORD_BREAKS & operations )
+ if( NO_OPERATION != ( GET_WORD_BREAKS & operations ) )
{
mLogicalModel->mLineBreakInfo.Clear();
}
- if( GET_SCRIPTS & operations )
+ if( NO_OPERATION != ( GET_SCRIPTS & operations ) )
{
mLogicalModel->mScriptRuns.Clear();
}
- if( VALIDATE_FONTS & operations )
+ if( NO_OPERATION != ( VALIDATE_FONTS & operations ) )
{
mLogicalModel->mFontRuns.Clear();
}
if( 0u != mLogicalModel->mBidirectionalParagraphInfo.Count() )
{
- if( BIDI_INFO & operations )
+ if( NO_OPERATION != ( BIDI_INFO & operations ) )
{
mLogicalModel->mBidirectionalParagraphInfo.Clear();
mLogicalModel->mCharacterDirections.Clear();
}
- if( REORDER & operations )
+ if( NO_OPERATION != ( REORDER & operations ) )
{
// Free the allocated memory used to store the conversion table in the bidirectional line info run.
for( Vector<BidirectionalLineInfoRun>::Iterator it = mLogicalModel->mBidirectionalLineInfo.Begin(),
}
}
- if( SHAPE_TEXT & operations )
+ if( NO_OPERATION != ( SHAPE_TEXT & operations ) )
{
mVisualModel->mGlyphs.Clear();
mVisualModel->mGlyphsToCharacters.Clear();
mVisualModel->mGlyphPositions.Clear();
}
- if( LAYOUT & operations )
+ if( NO_OPERATION != ( LAYOUT & operations ) )
{
mVisualModel->mLines.Clear();
}
- if( COLOR & operations )
+ if( NO_OPERATION != ( COLOR & operations ) )
{
mVisualModel->mColorIndices.Clear();
}
{
const CharacterIndex endIndexPlusOne = endIndex + 1u;
- if( GET_LINE_BREAKS & operations )
+ if( NO_OPERATION != ( GET_LINE_BREAKS & operations ) )
{
// Clear the line break info.
LineBreakInfo* lineBreakInfoBuffer = mLogicalModel->mLineBreakInfo.Begin();
mLogicalModel->mParagraphInfo );
}
- if( GET_WORD_BREAKS & operations )
+ if( NO_OPERATION != ( GET_WORD_BREAKS & operations ) )
{
// Clear the word break info.
WordBreakInfo* wordBreakInfoBuffer = mLogicalModel->mWordBreakInfo.Begin();
wordBreakInfoBuffer + endIndexPlusOne );
}
- if( GET_SCRIPTS & operations )
+ if( NO_OPERATION != ( GET_SCRIPTS & operations ) )
{
// Clear the scripts.
ClearCharacterRuns( startIndex,
mLogicalModel->mScriptRuns );
}
- if( VALIDATE_FONTS & operations )
+ if( NO_OPERATION != ( VALIDATE_FONTS & operations ) )
{
// Clear the fonts.
ClearCharacterRuns( startIndex,
if( 0u != mLogicalModel->mBidirectionalParagraphInfo.Count() )
{
- if( BIDI_INFO & operations )
+ if( NO_OPERATION != ( BIDI_INFO & operations ) )
{
// Clear the bidirectional paragraph info.
ClearCharacterRuns( startIndex,
characterDirectionsBuffer + endIndexPlusOne );
}
- if( REORDER & operations )
+ if( NO_OPERATION != ( REORDER & operations ) )
{
uint32_t startRemoveIndex = mLogicalModel->mBidirectionalLineInfo.Count();
uint32_t endRemoveIndex = startRemoveIndex;
const GlyphIndex endGlyphIndexPlusOne = *( charactersToGlyphBuffer + endIndex ) + *( glyphsPerCharacterBuffer + endIndex );
const Length numberOfGlyphsRemoved = endGlyphIndexPlusOne - mTextUpdateInfo.mStartGlyphIndex;
- if( SHAPE_TEXT & operations )
+ if( NO_OPERATION != ( SHAPE_TEXT & operations ) )
{
// Update the character to glyph indices.
for( Vector<GlyphIndex>::Iterator it = charactersToGlyphBuffer + endIndexPlusOne,
positionsBuffer + endGlyphIndexPlusOne );
}
- if( LAYOUT & operations )
+ if( NO_OPERATION != ( LAYOUT & operations ) )
{
// Clear the lines.
uint32_t startRemoveIndex = mVisualModel->mLines.Count();
linesBuffer + endRemoveIndex );
}
- if( COLOR & operations )
+ if( NO_OPERATION != ( COLOR & operations ) )
{
if( 0u != mVisualModel->mColorIndices.Count() )
{
Vector<LineBreakInfo>& lineBreakInfo = mLogicalModel->mLineBreakInfo;
const Length requestedNumberOfCharacters = mTextUpdateInfo.mRequestedNumberOfCharacters;
- if( GET_LINE_BREAKS & operations )
+ if( NO_OPERATION != ( GET_LINE_BREAKS & operations ) )
{
// Retrieves the line break info. The line break info is used to split the text in 'paragraphs' to
// calculate the bidirectional info for each 'paragraph'.
}
Vector<WordBreakInfo>& wordBreakInfo = mLogicalModel->mWordBreakInfo;
- if( GET_WORD_BREAKS & operations )
+ if( NO_OPERATION != ( GET_WORD_BREAKS & operations ) )
{
// Retrieves the word break info. The word break info is used to layout the text (where to wrap the text in lines).
wordBreakInfo.Resize( numberOfCharacters, TextAbstraction::WORD_NO_BREAK );
updated = true;
}
- const bool getScripts = GET_SCRIPTS & operations;
- const bool validateFonts = VALIDATE_FONTS & operations;
+ const bool getScripts = NO_OPERATION != ( GET_SCRIPTS & operations );
+ const bool validateFonts = NO_OPERATION != ( VALIDATE_FONTS & operations );
Vector<ScriptRun>& scripts = mLogicalModel->mScriptRuns;
Vector<FontRun>& validFonts = mLogicalModel->mFontRuns;
Vector<Character> mirroredUtf32Characters;
bool textMirrored = false;
const Length numberOfParagraphs = mLogicalModel->mParagraphInfo.Count();
- if( BIDI_INFO & operations )
+ if( NO_OPERATION != ( BIDI_INFO & operations ) )
{
Vector<BidirectionalParagraphInfoRun>& bidirectionalInfo = mLogicalModel->mBidirectionalParagraphInfo;
bidirectionalInfo.Reserve( numberOfParagraphs );
newParagraphGlyphs.Reserve( numberOfParagraphs );
const Length currentNumberOfGlyphs = glyphs.Count();
- if( SHAPE_TEXT & operations )
+ if( NO_OPERATION != ( SHAPE_TEXT & operations ) )
{
const Vector<Character>& textToShape = textMirrored ? mirroredUtf32Characters : utf32Characters;
// Shapes the text.
const Length numberOfGlyphs = glyphs.Count() - currentNumberOfGlyphs;
- if( GET_GLYPH_METRICS & operations )
+ if( NO_OPERATION != ( GET_GLYPH_METRICS & operations ) )
{
GlyphInfo* glyphsBuffer = glyphs.Begin();
mMetrics->GetGlyphMetrics( glyphsBuffer + mTextUpdateInfo.mStartGlyphIndex, numberOfGlyphs );
updated = true;
}
- if( COLOR & operationsRequired )
+ if( NO_OPERATION != ( COLOR & operationsRequired ) )
{
// Set the color runs in glyphs.
SetColorSegmentationInfo( mLogicalModel->mColorRuns,
*/
void ScrollTextToMatchCursor( const CursorInfo& cursorInfo );
+private:
+ // Declared private and left undefined to avoid copies.
+ Impl( const Impl& );
+ // Declared private and left undefined to avoid copies.
+ Impl& operator=( const Impl& );
+
+public:
+
ControlInterface& mControlInterface; ///< Reference to the text controller.
LogicalModelPtr mLogicalModel; ///< Pointer to the logical model.
VisualModelPtr mVisualModel; ///< Pointer to the visual model.
const CharacterIndex startIndex = mImpl->mTextUpdateInfo.mParagraphCharacterIndex;
const Length requestedNumberOfCharacters = mImpl->mTextUpdateInfo.mRequestedNumberOfCharacters;
- if( LAYOUT & operations )
+ if( NO_OPERATION != ( LAYOUT & operations ) )
{
// Some vectors with data needed to layout and reorder may be void
// after the first time the text has been laid out.
if( 0u == totalNumberOfGlyphs )
{
- if( UPDATE_ACTUAL_SIZE & operations )
+ if( NO_OPERATION != ( UPDATE_ACTUAL_SIZE & operations ) )
{
mImpl->mVisualModel->SetLayoutSize( Size::ZERO );
}
if( viewUpdated )
{
// Reorder the lines
- if( REORDER & operations )
+ if( NO_OPERATION != ( REORDER & operations ) )
{
Vector<BidirectionalParagraphInfoRun>& bidirectionalInfo = mImpl->mLogicalModel->mBidirectionalParagraphInfo;
Vector<BidirectionalLineInfoRun>& bidirectionalLineInfo = mImpl->mLogicalModel->mBidirectionalLineInfo;
} // REORDER
// Sets the actual size.
- if( UPDATE_ACTUAL_SIZE & operations )
+ if( NO_OPERATION != ( UPDATE_ACTUAL_SIZE & operations ) )
{
mImpl->mVisualModel->SetLayoutSize( layoutSize );
}
layoutSize = mImpl->mVisualModel->GetLayoutSize();
}
- if( ALIGN & operations )
+ if( NO_OPERATION != ( ALIGN & operations ) )
{
// The laid-out lines.
Vector<LineRun>& lines = mImpl->mVisualModel->mLines;
// This is to avoid unnecessary relayouts when tapping an empty text-field
bool relayoutNeeded( false );
- if( ( EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState ) ||
+ if( ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) ||
( EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState ) )
{
- mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE); // If Popup shown hide it here so can be shown again if required.
+ mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE ); // If Popup shown hide it here so can be shown again if required.
}
if( mImpl->IsShowingRealText() && ( EventData::INACTIVE != mImpl->mEventData->mState ) )
{
const TreeNode* const node = parser.GetRoot();
- CreateFontStyleMap( node, map );
+ if( NULL != node )
+ {
+ CreateFontStyleMap( node, map );
+ }
}
}