/* * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed 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 "components/text_adapter.h" #include <cstdio> #include "securec.h" namespace OHOS { bool TextFormatter::Format(int16_t value, char* outText, uint16_t textLen) { if (sprintf_s(outText, textLen, "%d", value) < 0) { return false; } return true; } TextAdapter::TextAdapter() : dataMode_(DYNAMIC_TEXT_MODE), fontName_(nullptr), fontSize_(0), width_(0), height_(0), direct_(UITextLanguageDirect::TEXT_DIRECT_LTR), lineBreakMode_(UILabel::LINE_BREAK_ADAPT), integerTextStart_(0), integerTextEnd_(0), clickListener_(nullptr), formatter_(nullptr) { style_ = StyleDefault::GetBackgroundTransparentStyle(); fontId_ = style_.font_; } TextAdapter::~TextAdapter() { ClearDynamicText(); if (fontName_ != nullptr) { UIFree(fontName_); fontName_ = nullptr; } } void TextAdapter::SetFont(const char* name, uint8_t size) { Text::SetFont(name, size, fontName_, fontSize_); } UIView* TextAdapter::GetView(UIView* inView, int16_t index) { UILabel* newView = GetTextView(inView, index); if (newView == nullptr) { return nullptr; } newView->SetLineBreakMode(lineBreakMode_); newView->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); if (width_) { newView->SetWidth(width_); } if (height_) { newView->SetHeight(height_); } newView->SetViewIndex(index); newView->UIView::SetStyle(style_); newView->GetHeight(); if (clickListener_) { newView->SetOnClickListener(clickListener_); newView->SetTouchable(true); } return newView; } UILabel* TextAdapter::GetTextView(UIView* inView, int16_t index) { switch (dataMode_) { case DYNAMIC_TEXT_MODE: return GetDynamicText(inView, index); case CONTINUOUS_INTEGER_MODE: return GetIntegerText(inView, index); default: return nullptr; } } UILabel* TextAdapter::GetDynamicText(UIView* inView, int16_t index) { if (dynamicText_.IsEmpty() || (index > dynamicText_.Size() - 1) || (index < 0)) { return nullptr; } ListNode<const char*>* node = dynamicText_.Begin(); for (int16_t i = 0; i < index; i++) { node = node->next_; } UILabel* newView = CreateUILabel(inView); if (newView != nullptr) { newView->SetText(node->data_); if (fontName_ == nullptr) { newView->SetFontId(fontId_); } else { newView->SetFont(fontName_, fontSize_); } newView->SetDirect(direct_); } return newView; } UILabel* TextAdapter::GetIntegerText(UIView* inView, int16_t index) { if ((index < 0) || ((integerTextEnd_ - integerTextStart_) < index)) { return nullptr; } UILabel* newView = CreateUILabel(inView); if (newView != nullptr) { char buf[BUF_LEN] = {0}; if (formatter_ != nullptr) { if (!formatter_->Format(integerTextStart_ + index, buf, BUF_LEN)) { if (inView == nullptr) { delete newView; newView = nullptr; } return nullptr; } } else { if (sprintf_s(buf, sizeof(buf), "%02d", integerTextStart_ + index) < 0) { if (inView == nullptr) { delete newView; newView = nullptr; } return nullptr; } } buf[BUF_LEN - 1] = '\0'; newView->SetText(buf); if (fontName_ == nullptr) { newView->SetFontId(fontId_); } else { newView->SetFont(fontName_, fontSize_); } newView->SetDirect(direct_); } return newView; } UILabel* TextAdapter::CreateUILabel(UIView* inView) { if (inView == nullptr) { return new UILabel(); } return static_cast<UILabel*>(inView); } void TextAdapter::ClearDynamicText() { ListNode<const char*>* node = dynamicText_.Begin(); while (node != dynamicText_.End()) { if (node->data_) { UIFree(reinterpret_cast<void*>(const_cast<char*>(node->data_))); node->data_ = nullptr; } node = node->next_; } dynamicText_.Clear(); } void TextAdapter::SetData(List<const char*>* data) { if (data == nullptr) { return; } if (!dynamicText_.IsEmpty()) { ClearDynamicText(); } ListNode<const char*>* node = data->Begin(); while (node != data->End()) { uint32_t len = strlen(node->data_); char* stringData = static_cast<char*>(UIMalloc(len + 1)); if (stringData == nullptr) { return; } if (memcpy_s(stringData, len + 1, node->data_, len) != EOK) { UIFree(reinterpret_cast<void*>(stringData)); stringData = nullptr; return; } stringData[len] = '\0'; dynamicText_.PushBack(stringData); node = node->next_; } dataMode_ = DYNAMIC_TEXT_MODE; } void TextAdapter::SetData(int16_t start, int16_t end) { if (start <= end) { integerTextStart_ = start; integerTextEnd_ = end; dataMode_ = CONTINUOUS_INTEGER_MODE; } } uint16_t TextAdapter::GetCount() { switch (dataMode_) { case DYNAMIC_TEXT_MODE: return dynamicText_.Size(); case CONTINUOUS_INTEGER_MODE: return (integerTextStart_ <= integerTextEnd_) ? (integerTextEnd_ - integerTextStart_ + 1) : 0; default: return 0; } } } // namespace OHOS