2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <dali-toolkit/internal/controls/text-controls/text-editor-property-handler.h>
19 #include <dali-toolkit/devel-api/focus-manager/keyinput-focus-manager.h>
21 #include <dali-toolkit/internal/text/decorator/text-decorator.h>
22 #include <dali-toolkit/internal/text/text-controller.h>
23 #include <dali-toolkit/internal/text/text-effects-style.h>
24 #include <dali-toolkit/internal/text/text-enumerations-impl.h>
25 #include <dali-toolkit/internal/text/text-font-style.h>
26 #include <dali-toolkit/public-api/text/text-enumerations.h>
27 #include <dali/integration-api/debug.h>
29 #if defined(DEBUG_ENABLED)
30 extern Debug::Filter* gTextEditorLogFilter;
33 namespace Dali::Toolkit::Internal
35 const char* const TextEditor::PropertyHandler::IMAGE_MAP_FILENAME_STRING{"filename"};
37 /// Retrieves a filename from a value that is a Property::Map
38 std::string TextEditor::PropertyHandler::GetImageFileNameFromPropertyValue(const Property::Value& value)
41 const Property::Map* map = value.GetMap();
44 const Property::Value* filenameValue = map->Find(TextEditor::PropertyHandler::IMAGE_MAP_FILENAME_STRING);
47 filenameValue->Get(filename);
53 void TextEditor::PropertyHandler::SetProperty(Toolkit::TextEditor textEditor, Property::Index index, const Property::Value& value)
55 TextEditor& impl(GetImpl(textEditor));
56 DALI_ASSERT_DEBUG(impl.mController && "No text controller");
57 DALI_ASSERT_DEBUG(impl.mDecorator && "No text decorator");
61 case Toolkit::DevelTextEditor::Property::RENDERING_BACKEND:
63 int backend = value.Get<int>();
64 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor %p RENDERING_BACKEND %d\n", impl.mController.Get(), backend);
66 if(impl.mRenderingBackend != backend)
68 impl.mRenderingBackend = backend;
69 impl.mRenderer.Reset();
70 impl.RequestTextRelayout();
74 case Toolkit::TextEditor::Property::TEXT:
76 const std::string& text = value.Get<std::string>();
77 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p TEXT %s\n", impl.mController.Get(), text.c_str());
79 impl.mController->SetText(text);
82 case Toolkit::TextEditor::Property::TEXT_COLOR:
84 const Vector4& textColor = value.Get<Vector4>();
85 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a);
87 if(impl.mController->GetDefaultColor() != textColor)
89 impl.mController->SetDefaultColor(textColor);
90 impl.mController->SetInputColor(textColor);
91 impl.mRenderer.Reset();
95 case Toolkit::TextEditor::Property::FONT_FAMILY:
97 const std::string& fontFamily = value.Get<std::string>();
98 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str());
99 impl.mController->SetDefaultFontFamily(fontFamily);
102 case Toolkit::TextEditor::Property::FONT_STYLE:
104 SetFontStyleProperty(impl.mController, value, Text::FontStyle::DEFAULT);
107 case Toolkit::TextEditor::Property::POINT_SIZE:
109 const float pointSize = value.Get<float>();
110 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p POINT_SIZE %f\n", impl.mController.Get(), pointSize);
112 if(!Equals(impl.mController->GetDefaultFontSize(Text::Controller::POINT_SIZE), pointSize))
114 impl.mController->SetDefaultFontSize(pointSize, Text::Controller::POINT_SIZE);
118 case Toolkit::TextEditor::Property::HORIZONTAL_ALIGNMENT:
120 Text::HorizontalAlignment::Type alignment(static_cast<Text::HorizontalAlignment::Type>(-1)); // Set to invalid value to ensure a valid mode does get set
121 if(Text::GetHorizontalAlignmentEnumeration(value, alignment))
123 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p HORIZONTAL_ALIGNMENT %d\n", impl.mController.Get(), alignment);
124 impl.mController->SetHorizontalAlignment(alignment);
128 case Toolkit::TextEditor::Property::SCROLL_THRESHOLD:
130 const float threshold = value.Get<float>();
131 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor %p SCROLL_THRESHOLD %f\n", impl.mController.Get(), threshold);
133 impl.mDecorator->SetScrollThreshold(threshold);
136 case Toolkit::TextEditor::Property::SCROLL_SPEED:
138 const float speed = value.Get<float>();
139 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor %p SCROLL_SPEED %f\n", impl.mController.Get(), speed);
141 impl.mDecorator->SetScrollSpeed(speed);
144 case Toolkit::TextEditor::Property::PRIMARY_CURSOR_COLOR:
146 const Vector4& color = value.Get<Vector4>();
147 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p PRIMARY_CURSOR_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a);
149 impl.mDecorator->SetCursorColor(Toolkit::Text::PRIMARY_CURSOR, color);
150 impl.RequestTextRelayout();
153 case Toolkit::TextEditor::Property::SECONDARY_CURSOR_COLOR:
155 const Vector4& color = value.Get<Vector4>();
156 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p SECONDARY_CURSOR_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a);
158 impl.mDecorator->SetCursorColor(Toolkit::Text::SECONDARY_CURSOR, color);
159 impl.RequestTextRelayout();
162 case Toolkit::TextEditor::Property::ENABLE_CURSOR_BLINK:
164 const bool enable = value.Get<bool>();
165 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor %p ENABLE_CURSOR_BLINK %d\n", impl.mController.Get(), enable);
167 impl.mController->SetEnableCursorBlink(enable);
168 impl.RequestTextRelayout();
171 case Toolkit::TextEditor::Property::CURSOR_BLINK_INTERVAL:
173 const float interval = value.Get<float>();
174 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor %p CURSOR_BLINK_INTERVAL %f\n", impl.mController.Get(), interval);
176 impl.mDecorator->SetCursorBlinkInterval(interval);
179 case Toolkit::TextEditor::Property::CURSOR_BLINK_DURATION:
181 const float duration = value.Get<float>();
182 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor %p CURSOR_BLINK_DURATION %f\n", impl.mController.Get(), duration);
184 impl.mDecorator->SetCursorBlinkDuration(duration);
187 case Toolkit::TextEditor::Property::CURSOR_WIDTH:
189 const int width = value.Get<int>();
190 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor %p CURSOR_WIDTH %d\n", impl.mController.Get(), width);
192 impl.mDecorator->SetCursorWidth(width);
193 impl.mController->GetLayoutEngine().SetCursorWidth(width);
196 case Toolkit::TextEditor::Property::GRAB_HANDLE_IMAGE:
198 const std::string imageFileName = value.Get<std::string>();
199 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor %p GRAB_HANDLE_IMAGE %s\n", impl.mController.Get(), imageFileName.c_str());
201 if(imageFileName.size())
203 impl.mDecorator->SetHandleImage(Toolkit::Text::GRAB_HANDLE, Toolkit::Text::HANDLE_IMAGE_RELEASED, imageFileName);
204 impl.RequestTextRelayout();
208 case Toolkit::TextEditor::Property::GRAB_HANDLE_PRESSED_IMAGE:
210 const std::string imageFileName = value.Get<std::string>();
211 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor %p GRAB_HANDLE_PRESSED_IMAGE %s\n", impl.mController.Get(), imageFileName.c_str());
213 if(imageFileName.size())
215 impl.mDecorator->SetHandleImage(Toolkit::Text::GRAB_HANDLE, Toolkit::Text::HANDLE_IMAGE_PRESSED, imageFileName);
216 impl.RequestTextRelayout();
220 case Toolkit::TextEditor::Property::SELECTION_HANDLE_IMAGE_LEFT:
222 const std::string filename = GetImageFileNameFromPropertyValue(value);
226 impl.mDecorator->SetHandleImage(Toolkit::Text::LEFT_SELECTION_HANDLE, Toolkit::Text::HANDLE_IMAGE_RELEASED, filename);
227 impl.RequestTextRelayout();
231 case Toolkit::TextEditor::Property::SELECTION_HANDLE_IMAGE_RIGHT:
233 const std::string filename = GetImageFileNameFromPropertyValue(value);
237 impl.mDecorator->SetHandleImage(Toolkit::Text::RIGHT_SELECTION_HANDLE, Toolkit::Text::HANDLE_IMAGE_RELEASED, filename);
238 impl.RequestTextRelayout();
242 case Toolkit::TextEditor::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT:
244 const std::string filename = GetImageFileNameFromPropertyValue(value);
248 impl.mDecorator->SetHandleImage(Toolkit::Text::LEFT_SELECTION_HANDLE, Toolkit::Text::HANDLE_IMAGE_PRESSED, filename);
249 impl.RequestTextRelayout();
253 case Toolkit::TextEditor::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT:
255 const std::string filename = GetImageFileNameFromPropertyValue(value);
259 impl.mDecorator->SetHandleImage(Toolkit::Text::RIGHT_SELECTION_HANDLE, Toolkit::Text::HANDLE_IMAGE_PRESSED, filename);
260 impl.RequestTextRelayout();
264 case Toolkit::TextEditor::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT:
266 const std::string filename = GetImageFileNameFromPropertyValue(value);
270 impl.mDecorator->SetHandleImage(Toolkit::Text::LEFT_SELECTION_HANDLE_MARKER,
271 Toolkit::Text::HANDLE_IMAGE_RELEASED,
273 impl.RequestTextRelayout();
277 case Toolkit::TextEditor::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT:
279 const std::string filename = GetImageFileNameFromPropertyValue(value);
283 impl.mDecorator->SetHandleImage(Toolkit::Text::RIGHT_SELECTION_HANDLE_MARKER,
284 Toolkit::Text::HANDLE_IMAGE_RELEASED,
286 impl.RequestTextRelayout();
290 case Toolkit::TextEditor::Property::SELECTION_HIGHLIGHT_COLOR:
292 const Vector4 color = value.Get<Vector4>();
293 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p SELECTION_HIGHLIGHT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a);
295 impl.mDecorator->SetHighlightColor(color);
296 impl.RequestTextRelayout();
299 case Toolkit::TextEditor::Property::DECORATION_BOUNDING_BOX:
301 const Rect<int>& box = value.Get<Rect<int> >();
302 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p DECORATION_BOUNDING_BOX %d,%d %dx%d\n", impl.mController.Get(), box.x, box.y, box.width, box.height);
304 impl.mDecorator->SetBoundingBox(box);
305 impl.RequestTextRelayout();
308 case Toolkit::TextEditor::Property::ENABLE_MARKUP:
310 const bool enableMarkup = value.Get<bool>();
311 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p ENABLE_MARKUP %d\n", impl.mController.Get(), enableMarkup);
313 impl.mController->SetMarkupProcessorEnabled(enableMarkup);
316 case Toolkit::TextEditor::Property::INPUT_COLOR:
318 const Vector4& inputColor = value.Get<Vector4>();
319 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p INPUT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), inputColor.r, inputColor.g, inputColor.b, inputColor.a);
321 impl.mController->SetInputColor(inputColor);
324 case Toolkit::TextEditor::Property::INPUT_FONT_FAMILY:
326 const std::string& fontFamily = value.Get<std::string>();
327 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p INPUT_FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str());
328 impl.mController->SetInputFontFamily(fontFamily);
331 case Toolkit::TextEditor::Property::INPUT_FONT_STYLE:
333 SetFontStyleProperty(impl.mController, value, Text::FontStyle::INPUT);
336 case Toolkit::TextEditor::Property::INPUT_POINT_SIZE:
338 const float pointSize = value.Get<float>();
339 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p INPUT_POINT_SIZE %f\n", impl.mController.Get(), pointSize);
340 impl.mController->SetInputFontPointSize(pointSize);
343 case Toolkit::TextEditor::Property::LINE_SPACING:
345 const float lineSpacing = value.Get<float>();
346 impl.mController->SetDefaultLineSpacing(lineSpacing);
347 impl.mRenderer.Reset();
350 case Toolkit::TextEditor::Property::INPUT_LINE_SPACING:
352 const float lineSpacing = value.Get<float>();
353 impl.mController->SetInputLineSpacing(lineSpacing);
354 impl.mRenderer.Reset();
357 case Toolkit::TextEditor::Property::UNDERLINE:
359 const bool update = SetUnderlineProperties(impl.mController, value, Text::EffectStyle::DEFAULT);
362 impl.mRenderer.Reset();
366 case Toolkit::TextEditor::Property::INPUT_UNDERLINE:
368 const bool update = SetUnderlineProperties(impl.mController, value, Text::EffectStyle::INPUT);
371 impl.mRenderer.Reset();
375 case Toolkit::TextEditor::Property::SHADOW:
377 const bool update = SetShadowProperties(impl.mController, value, Text::EffectStyle::DEFAULT);
380 impl.mRenderer.Reset();
384 case Toolkit::TextEditor::Property::INPUT_SHADOW:
386 const bool update = SetShadowProperties(impl.mController, value, Text::EffectStyle::INPUT);
389 impl.mRenderer.Reset();
393 case Toolkit::TextEditor::Property::EMBOSS:
395 const bool update = SetEmbossProperties(impl.mController, value, Text::EffectStyle::DEFAULT);
398 impl.mRenderer.Reset();
402 case Toolkit::TextEditor::Property::INPUT_EMBOSS:
404 const bool update = SetEmbossProperties(impl.mController, value, Text::EffectStyle::INPUT);
407 impl.mRenderer.Reset();
411 case Toolkit::TextEditor::Property::OUTLINE:
413 const bool update = SetOutlineProperties(impl.mController, value, Text::EffectStyle::DEFAULT);
416 impl.mRenderer.Reset();
420 case Toolkit::TextEditor::Property::INPUT_OUTLINE:
422 const bool update = SetOutlineProperties(impl.mController, value, Text::EffectStyle::INPUT);
425 impl.mRenderer.Reset();
429 case Toolkit::TextEditor::Property::SMOOTH_SCROLL:
431 const bool enable = value.Get<bool>();
432 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor SMOOTH_SCROLL %d\n", enable);
434 impl.mScrollAnimationEnabled = enable;
437 case Toolkit::TextEditor::Property::SMOOTH_SCROLL_DURATION:
439 const float duration = value.Get<float>();
440 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor SMOOTH_SCROLL_DURATION %f\n", duration);
442 impl.mScrollAnimationDuration = duration;
443 if(impl.mTextVerticalScroller)
445 impl.mTextVerticalScroller->SetDuration(duration);
449 case Toolkit::TextEditor::Property::ENABLE_SCROLL_BAR:
451 const bool enable = value.Get<bool>();
452 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor SHOW_SCROLL_BAR %d\n", enable);
454 impl.mScrollBarEnabled = enable;
457 case Toolkit::TextEditor::Property::SCROLL_BAR_SHOW_DURATION:
459 const float duration = value.Get<float>();
460 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor SCROLL_BAR_SHOW_DURATION %f\n", duration);
462 impl.mAnimationPeriod.delaySeconds = duration;
465 case Toolkit::TextEditor::Property::SCROLL_BAR_FADE_DURATION:
467 const float duration = value.Get<float>();
468 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor SCROLL_BAR_FADE_DURATION %f\n", duration);
470 impl.mAnimationPeriod.durationSeconds = duration;
473 case Toolkit::TextEditor::Property::PIXEL_SIZE:
475 const float pixelSize = value.Get<float>();
476 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p PIXEL_SIZE %f\n", impl.mController.Get(), pixelSize);
478 if(!Equals(impl.mController->GetDefaultFontSize(Text::Controller::PIXEL_SIZE), pixelSize))
480 impl.mController->SetDefaultFontSize(pixelSize, Text::Controller::PIXEL_SIZE);
484 case Toolkit::DevelTextEditor::Property::PLACEHOLDER_TEXT:
486 const std::string& text = value.Get<std::string>();
487 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor::OnPropertySet %p PLACEHOLDER_TEXT %s\n", impl.mController.Get(), text.c_str());
489 impl.mController->SetPlaceholderText(Text::Controller::PLACEHOLDER_TYPE_INACTIVE, text);
492 case Toolkit::DevelTextEditor::Property::PLACEHOLDER_TEXT_COLOR:
494 const Vector4& textColor = value.Get<Vector4>();
495 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p PLACEHOLDER_TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a);
497 if(impl.mController->GetPlaceholderTextColor() != textColor)
499 impl.mController->SetPlaceholderTextColor(textColor);
500 impl.mRenderer.Reset();
504 case Toolkit::TextEditor::Property::ENABLE_SELECTION:
506 const bool enableSelection = value.Get<bool>();
507 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p ENABLE_SELECTION %d\n", impl.mController.Get(), enableSelection);
508 impl.mController->SetSelectionEnabled(enableSelection);
511 case Toolkit::TextEditor::Property::PLACEHOLDER:
513 const Property::Map* map = value.GetMap();
516 impl.mController->SetPlaceholderProperty(*map);
520 case Toolkit::TextEditor::Property::LINE_WRAP_MODE:
522 Text::LineWrap::Mode lineWrapMode(static_cast<Text::LineWrap::Mode>(-1)); // Set to invalid value to ensure a valid mode does get set
523 if(Toolkit::Text::GetLineWrapModeEnumeration(value, lineWrapMode))
525 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p LineWrap::MODE %d\n", impl.mController.Get(), lineWrapMode);
526 impl.mController->SetLineWrapMode(lineWrapMode);
530 case Toolkit::DevelTextEditor::Property::ENABLE_SHIFT_SELECTION:
532 const bool shiftSelection = value.Get<bool>();
533 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p ENABLE_SHIFT_SELECTION %d\n", impl.mController.Get(), shiftSelection);
535 impl.mController->SetShiftSelectionEnabled(shiftSelection);
538 case Toolkit::DevelTextEditor::Property::ENABLE_GRAB_HANDLE:
540 const bool grabHandleEnabled = value.Get<bool>();
541 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p ENABLE_GRAB_HANDLE %d\n", impl.mController.Get(), grabHandleEnabled);
543 impl.mController->SetGrabHandleEnabled(grabHandleEnabled);
546 case Toolkit::DevelTextEditor::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION:
548 impl.mController->SetMatchLayoutDirection(value.Get<bool>() ? DevelText::MatchLayoutDirection::LOCALE : DevelText::MatchLayoutDirection::CONTENTS);
551 case Toolkit::DevelTextEditor::Property::MAX_LENGTH:
553 const int max = value.Get<int>();
554 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p MAX_LENGTH %d\n", impl.mController.Get(), max);
556 impl.mController->SetMaximumNumberOfCharacters(max);
559 case Toolkit::DevelTextEditor::Property::SELECTED_TEXT_START:
561 uint32_t start = static_cast<uint32_t>(value.Get<int>());
562 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p SELECTED_TEXT_START %d\n", impl.mController.Get(), start);
563 impl.SetTextSelectionRange(&start, nullptr);
566 case Toolkit::DevelTextEditor::Property::SELECTED_TEXT_END:
568 uint32_t end = static_cast<uint32_t>(value.Get<int>());
569 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p SELECTED_TEXT_END %d\n", impl.mController.Get(), end);
570 impl.SetTextSelectionRange(nullptr, &end);
573 case Toolkit::DevelTextEditor::Property::ENABLE_EDITING:
575 const bool editable = value.Get<bool>();
576 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p ENABLE_EDITING %d\n", impl.mController.Get(), editable);
577 impl.SetEditable(editable);
580 case Toolkit::DevelTextEditor::Property::HORIZONTAL_SCROLL_POSITION:
582 float horizontalScroll = value.Get<float>();
583 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p HORIZONTAL_SCROLL_POSITION %d\n", impl.mController.Get(), horizontalScroll);
584 if(horizontalScroll >= 0.0f)
586 impl.ScrollBy(Vector2(horizontalScroll - impl.GetHorizontalScrollPosition(), 0));
590 case Toolkit::DevelTextEditor::Property::VERTICAL_SCROLL_POSITION:
592 float verticalScroll = value.Get<float>();
593 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p VERTICAL_SCROLL_POSITION %d\n", impl.mController.Get(), verticalScroll);
594 if(verticalScroll >= 0.0f)
596 impl.ScrollBy(Vector2(0, verticalScroll - impl.GetVerticalScrollPosition()));
600 case Toolkit::DevelTextEditor::Property::FONT_SIZE_SCALE:
602 const float scale = value.Get<float>();
603 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p FONT_SIZE_SCALE %f\n", impl.mController.Get(), scale);
605 if(!Equals(impl.mController->GetFontSizeScale(), scale))
607 impl.mController->SetFontSizeScale(scale);
611 case Toolkit::DevelTextEditor::Property::PRIMARY_CURSOR_POSITION:
613 uint32_t position = static_cast<uint32_t>(value.Get<int>());
614 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p PRIMARY_CURSOR_POSITION %d\n", impl.mController.Get(), position);
615 if(impl.mController->SetPrimaryCursorPosition(position, impl.HasKeyInputFocus()))
617 impl.SetKeyInputFocus();
621 case Toolkit::DevelTextEditor::Property::GRAB_HANDLE_COLOR:
623 const Vector4 color = value.Get<Vector4>();
624 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p GRAB_HANDLE_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a);
626 impl.mDecorator->SetHandleColor(color);
627 impl.RequestTextRelayout();
630 case Toolkit::DevelTextEditor::Property::ENABLE_GRAB_HANDLE_POPUP:
632 const bool grabHandlePopupEnabled = value.Get<bool>();
633 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p ENABLE_GRAB_HANDLE_POPUP %d\n", impl.mController.Get(), grabHandlePopupEnabled);
635 impl.mController->SetGrabHandlePopupEnabled(grabHandlePopupEnabled);
638 case Toolkit::DevelTextEditor::Property::INPUT_METHOD_SETTINGS:
640 const Property::Map* map = value.GetMap();
643 impl.mInputMethodOptions.ApplyProperty(*map);
645 impl.mController->SetInputModePassword(impl.mInputMethodOptions.IsPassword());
647 Toolkit::Control control = Toolkit::KeyInputFocusManager::Get().GetCurrentFocusControl();
648 if(control == textEditor)
650 impl.mInputMethodContext.ApplyOptions(impl.mInputMethodOptions);
654 case Toolkit::DevelTextEditor::Property::INPUT_FILTER:
656 const Property::Map* map = value.GetMap();
659 impl.mController->SetInputFilterOption(*map);
663 case Toolkit::DevelTextEditor::Property::ELLIPSIS:
665 const bool ellipsis = value.Get<bool>();
666 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p ELLIPSIS %d\n", impl.mController.Get(), ellipsis);
668 impl.mController->SetTextElideEnabled(ellipsis);
671 case Toolkit::DevelTextEditor::Property::ELLIPSIS_POSITION:
673 DevelText::EllipsisPosition::Type ellipsisPositionType(static_cast<DevelText::EllipsisPosition::Type>(-1)); // Set to invalid value to ensure a valid mode does get set
674 if(Text::GetEllipsisPositionTypeEnumeration(value, ellipsisPositionType))
676 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p EllipsisPosition::Type %d\n", impl.mController.Get(), ellipsisPositionType);
677 impl.mController->SetEllipsisPosition(ellipsisPositionType);
681 case Toolkit::DevelTextEditor::Property::MIN_LINE_SIZE:
683 const float minLineSize = value.Get<float>();
684 DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor %p MIN_LINE_SIZE %f\n", impl.mController.Get(), minLineSize);
686 impl.mController->SetDefaultLineSize(minLineSize);
687 impl.mRenderer.Reset();
693 Property::Value TextEditor::PropertyHandler::GetProperty(Toolkit::TextEditor textEditor, Property::Index index)
695 Property::Value value;
696 TextEditor& impl(GetImpl(textEditor));
697 DALI_ASSERT_DEBUG(impl.mController && "No text controller");
698 DALI_ASSERT_DEBUG(impl.mDecorator && "No text decorator");
702 case Toolkit::DevelTextEditor::Property::RENDERING_BACKEND:
704 value = impl.mRenderingBackend;
707 case Toolkit::TextEditor::Property::TEXT:
710 impl.mController->GetText(text);
711 DALI_LOG_INFO(gTextEditorLogFilter, Debug::General, "TextEditor %p returning text: %s\n", impl.mController.Get(), text.c_str());
715 case Toolkit::TextEditor::Property::TEXT_COLOR:
717 value = impl.mController->GetDefaultColor();
720 case Toolkit::TextEditor::Property::FONT_FAMILY:
722 value = impl.mController->GetDefaultFontFamily();
725 case Toolkit::TextEditor::Property::FONT_STYLE:
727 GetFontStyleProperty(impl.mController, value, Text::FontStyle::DEFAULT);
730 case Toolkit::TextEditor::Property::POINT_SIZE:
732 value = impl.mController->GetDefaultFontSize(Text::Controller::POINT_SIZE);
735 case Toolkit::TextEditor::Property::HORIZONTAL_ALIGNMENT:
737 const char* name = Text::GetHorizontalAlignmentString(impl.mController->GetHorizontalAlignment());
740 value = std::string(name);
744 case Toolkit::TextEditor::Property::SCROLL_THRESHOLD:
746 value = impl.mDecorator->GetScrollThreshold();
749 case Toolkit::TextEditor::Property::SCROLL_SPEED:
751 value = impl.mDecorator->GetScrollSpeed();
754 case Toolkit::TextEditor::Property::PRIMARY_CURSOR_COLOR:
756 value = impl.mDecorator->GetColor(Text::PRIMARY_CURSOR);
759 case Toolkit::TextEditor::Property::SECONDARY_CURSOR_COLOR:
761 value = impl.mDecorator->GetColor(Text::SECONDARY_CURSOR);
764 case Toolkit::TextEditor::Property::ENABLE_CURSOR_BLINK:
766 value = impl.mController->GetEnableCursorBlink();
769 case Toolkit::TextEditor::Property::CURSOR_BLINK_INTERVAL:
771 value = impl.mDecorator->GetCursorBlinkInterval();
774 case Toolkit::TextEditor::Property::CURSOR_BLINK_DURATION:
776 value = impl.mDecorator->GetCursorBlinkDuration();
779 case Toolkit::TextEditor::Property::CURSOR_WIDTH:
781 value = impl.mDecorator->GetCursorWidth();
784 case Toolkit::TextEditor::Property::GRAB_HANDLE_IMAGE:
786 value = impl.mDecorator->GetHandleImage(Text::GRAB_HANDLE, Text::HANDLE_IMAGE_RELEASED);
789 case Toolkit::TextEditor::Property::GRAB_HANDLE_PRESSED_IMAGE:
791 value = impl.mDecorator->GetHandleImage(Text::GRAB_HANDLE, Text::HANDLE_IMAGE_PRESSED);
794 case Toolkit::TextEditor::Property::SELECTION_HANDLE_IMAGE_LEFT:
796 impl.GetHandleImagePropertyValue(value, Text::LEFT_SELECTION_HANDLE, Text::HANDLE_IMAGE_RELEASED);
799 case Toolkit::TextEditor::Property::SELECTION_HANDLE_IMAGE_RIGHT:
801 impl.GetHandleImagePropertyValue(value, Text::RIGHT_SELECTION_HANDLE, Text::HANDLE_IMAGE_RELEASED);
804 case Toolkit::TextEditor::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT:
806 impl.GetHandleImagePropertyValue(value, Text::LEFT_SELECTION_HANDLE, Text::HANDLE_IMAGE_PRESSED);
809 case Toolkit::TextEditor::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT:
811 impl.GetHandleImagePropertyValue(value, Text::RIGHT_SELECTION_HANDLE, Text::HANDLE_IMAGE_PRESSED);
814 case Toolkit::TextEditor::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT:
816 impl.GetHandleImagePropertyValue(value, Text::LEFT_SELECTION_HANDLE_MARKER, Text::HANDLE_IMAGE_RELEASED);
819 case Toolkit::TextEditor::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT:
821 impl.GetHandleImagePropertyValue(value, Text::RIGHT_SELECTION_HANDLE_MARKER, Text::HANDLE_IMAGE_RELEASED);
824 case Toolkit::TextEditor::Property::SELECTION_HIGHLIGHT_COLOR:
826 value = impl.mDecorator->GetHighlightColor();
829 case Toolkit::TextEditor::Property::DECORATION_BOUNDING_BOX:
831 Rect<int> boundingBox;
832 impl.mDecorator->GetBoundingBox(boundingBox);
836 case Toolkit::TextEditor::Property::ENABLE_MARKUP:
838 value = impl.mController->IsMarkupProcessorEnabled();
841 case Toolkit::TextEditor::Property::INPUT_COLOR:
843 value = impl.mController->GetInputColor();
846 case Toolkit::TextEditor::Property::INPUT_FONT_FAMILY:
848 value = impl.mController->GetInputFontFamily();
851 case Toolkit::TextEditor::Property::INPUT_FONT_STYLE:
853 GetFontStyleProperty(impl.mController, value, Text::FontStyle::INPUT);
856 case Toolkit::TextEditor::Property::INPUT_POINT_SIZE:
858 value = impl.mController->GetInputFontPointSize();
861 case Toolkit::TextEditor::Property::LINE_SPACING:
863 value = impl.mController->GetDefaultLineSpacing();
866 case Toolkit::TextEditor::Property::INPUT_LINE_SPACING:
868 value = impl.mController->GetInputLineSpacing();
871 case Toolkit::TextEditor::Property::UNDERLINE:
873 GetUnderlineProperties(impl.mController, value, Text::EffectStyle::DEFAULT);
876 case Toolkit::TextEditor::Property::INPUT_UNDERLINE:
878 GetUnderlineProperties(impl.mController, value, Text::EffectStyle::INPUT);
881 case Toolkit::TextEditor::Property::SHADOW:
883 GetShadowProperties(impl.mController, value, Text::EffectStyle::DEFAULT);
886 case Toolkit::TextEditor::Property::INPUT_SHADOW:
888 GetShadowProperties(impl.mController, value, Text::EffectStyle::INPUT);
891 case Toolkit::TextEditor::Property::EMBOSS:
893 GetEmbossProperties(impl.mController, value, Text::EffectStyle::DEFAULT);
896 case Toolkit::TextEditor::Property::INPUT_EMBOSS:
898 GetEmbossProperties(impl.mController, value, Text::EffectStyle::INPUT);
901 case Toolkit::TextEditor::Property::OUTLINE:
903 GetOutlineProperties(impl.mController, value, Text::EffectStyle::DEFAULT);
906 case Toolkit::TextEditor::Property::INPUT_OUTLINE:
908 GetOutlineProperties(impl.mController, value, Text::EffectStyle::INPUT);
911 case Toolkit::TextEditor::Property::SMOOTH_SCROLL:
913 value = impl.mScrollAnimationEnabled;
916 case Toolkit::TextEditor::Property::SMOOTH_SCROLL_DURATION:
918 value = impl.mScrollAnimationDuration;
921 case Toolkit::TextEditor::Property::ENABLE_SCROLL_BAR:
923 value = impl.mScrollBarEnabled;
926 case Toolkit::TextEditor::Property::SCROLL_BAR_SHOW_DURATION:
928 value = impl.mAnimationPeriod.delaySeconds;
931 case Toolkit::TextEditor::Property::SCROLL_BAR_FADE_DURATION:
933 value = impl.mAnimationPeriod.durationSeconds;
936 case Toolkit::TextEditor::Property::PIXEL_SIZE:
938 value = impl.mController->GetDefaultFontSize(Text::Controller::PIXEL_SIZE);
941 case Toolkit::TextEditor::Property::LINE_COUNT:
943 float width = textEditor.GetProperty(Actor::Property::SIZE_WIDTH).Get<float>();
944 value = impl.mController->GetLineCount(width);
947 case Toolkit::DevelTextEditor::Property::PLACEHOLDER_TEXT:
950 impl.mController->GetPlaceholderText(Text::Controller::PLACEHOLDER_TYPE_INACTIVE, text);
954 case Toolkit::DevelTextEditor::Property::PLACEHOLDER_TEXT_COLOR:
956 value = impl.mController->GetPlaceholderTextColor();
959 case Toolkit::TextEditor::Property::ENABLE_SELECTION:
961 value = impl.mController->IsSelectionEnabled();
964 case Toolkit::TextEditor::Property::PLACEHOLDER:
967 impl.mController->GetPlaceholderProperty(map);
971 case Toolkit::TextEditor::Property::LINE_WRAP_MODE:
973 value = impl.mController->GetLineWrapMode();
976 case Toolkit::DevelTextEditor::Property::ENABLE_SHIFT_SELECTION:
978 value = impl.mController->IsShiftSelectionEnabled();
981 case Toolkit::DevelTextEditor::Property::ENABLE_GRAB_HANDLE:
983 value = impl.mController->IsGrabHandleEnabled();
986 case Toolkit::DevelTextEditor::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION:
988 value = impl.mController->GetMatchLayoutDirection() != DevelText::MatchLayoutDirection::CONTENTS;
991 case Toolkit::DevelTextEditor::Property::MAX_LENGTH:
993 value = impl.mController->GetMaximumNumberOfCharacters();
996 case Toolkit::DevelTextEditor::Property::SELECTED_TEXT:
998 value = impl.mController->GetSelectedText();
1001 case Toolkit::DevelTextEditor::Property::SELECTED_TEXT_START:
1003 Uint32Pair range = impl.GetTextSelectionRange();
1004 value = static_cast<int>(range.first);
1007 case Toolkit::DevelTextEditor::Property::SELECTED_TEXT_END:
1009 Uint32Pair range = impl.GetTextSelectionRange();
1010 value = static_cast<int>(range.second);
1013 case Toolkit::DevelTextEditor::Property::ENABLE_EDITING:
1015 value = impl.IsEditable();
1018 case Toolkit::DevelTextEditor::Property::HORIZONTAL_SCROLL_POSITION:
1020 value = impl.GetHorizontalScrollPosition();
1023 case Toolkit::DevelTextEditor::Property::VERTICAL_SCROLL_POSITION:
1025 value = impl.GetVerticalScrollPosition();
1028 case Toolkit::DevelTextEditor::Property::FONT_SIZE_SCALE:
1030 value = impl.mController->GetFontSizeScale();
1033 case Toolkit::DevelTextEditor::Property::PRIMARY_CURSOR_POSITION:
1035 value = static_cast<int>(impl.mController->GetPrimaryCursorPosition());
1038 case Toolkit::DevelTextEditor::Property::GRAB_HANDLE_COLOR:
1040 value = impl.mDecorator->GetHandleColor();
1043 case Toolkit::DevelTextEditor::Property::ENABLE_GRAB_HANDLE_POPUP:
1045 value = impl.mController->IsGrabHandlePopupEnabled();
1048 case Toolkit::DevelTextEditor::Property::INPUT_METHOD_SETTINGS:
1051 impl.mInputMethodOptions.RetrieveProperty(map);
1055 case Toolkit::DevelTextEditor::Property::INPUT_FILTER:
1058 impl.mController->GetInputFilterOption(map);
1062 case Toolkit::DevelTextEditor::Property::ELLIPSIS:
1064 value = impl.mController->IsTextElideEnabled();
1067 case Toolkit::DevelTextEditor::Property::ELLIPSIS_POSITION:
1069 value = impl.mController->GetEllipsisPosition();
1072 case Toolkit::DevelTextEditor::Property::MIN_LINE_SIZE:
1074 value = impl.mController->GetDefaultLineSize();
1081 } // namespace Dali::Toolkit::Internal