#include "noesis_shim.h"
#include <NsCore/BaseComponent.h>
#include <NsCore/DynamicCast.h>
#include <NsCore/Noesis.h>
#include <NsCore/Ptr.h>
#include <NsGui/Bold.h>
#include <NsGui/Enums.h>
#include <NsGui/Hyperlink.h>
#include <NsGui/Inline.h>
#include <NsGui/InlineUIContainer.h>
#include <NsGui/Italic.h>
#include <NsGui/LineBreak.h>
#include <NsGui/Run.h>
#include <NsGui/Span.h>
#include <NsGui/TextBlock.h>
#include <NsGui/UICollection.h>
#include <NsGui/UIElement.h>
#include <NsGui/Underline.h>
namespace {
void* handout(Noesis::BaseComponent* c) {
if (!c) return nullptr;
c->AddReference();
return c;
}
template <class T>
T* cast(void* p) {
if (!p) return nullptr;
return Noesis::DynamicCast<T*>(static_cast<Noesis::BaseComponent*>(p));
}
using InlineColl = Noesis::UICollection<Noesis::Inline>;
InlineColl* as_inlines(void* p) {
if (!p) return nullptr;
return Noesis::DynamicCast<InlineColl*>(static_cast<Noesis::BaseComponent*>(p));
}
}
extern "C" void* noesis_text_inlines_run_create(const char* text) {
Noesis::Ptr<Noesis::Run> run = text ? *new Noesis::Run(text) : *new Noesis::Run();
return handout(run.GetPtr());
}
extern "C" void* noesis_text_inlines_span_create(void) {
Noesis::Ptr<Noesis::Span> span = *new Noesis::Span();
return handout(span.GetPtr());
}
extern "C" void* noesis_text_inlines_bold_create(void) {
Noesis::Ptr<Noesis::Bold> bold = *new Noesis::Bold();
return handout(bold.GetPtr());
}
extern "C" void* noesis_text_inlines_italic_create(void) {
Noesis::Ptr<Noesis::Italic> italic = *new Noesis::Italic();
return handout(italic.GetPtr());
}
extern "C" void* noesis_text_inlines_underline_create(void) {
Noesis::Ptr<Noesis::Underline> underline = *new Noesis::Underline();
return handout(underline.GetPtr());
}
extern "C" void* noesis_text_inlines_hyperlink_create(void) {
Noesis::Ptr<Noesis::Hyperlink> link = *new Noesis::Hyperlink();
return handout(link.GetPtr());
}
extern "C" void* noesis_text_inlines_line_break_create(void) {
Noesis::Ptr<Noesis::LineBreak> br = *new Noesis::LineBreak();
return handout(br.GetPtr());
}
extern "C" void* noesis_text_inlines_ui_container_create(void) {
Noesis::Ptr<Noesis::InlineUIContainer> c = *new Noesis::InlineUIContainer();
return handout(c.GetPtr());
}
extern "C" bool noesis_text_inlines_run_set_text(void* run, const char* text) {
auto* r = cast<Noesis::Run>(run);
if (!r) return false;
r->SetText(text ? text : "");
return true;
}
extern "C" const char* noesis_text_inlines_run_get_text(void* run) {
auto* r = cast<Noesis::Run>(run);
if (!r) return nullptr;
return r->GetText();
}
extern "C" bool noesis_text_inlines_hyperlink_set_navigate_uri(
void* link, const char* uri) {
auto* h = cast<Noesis::Hyperlink>(link);
if (!h) return false;
h->SetNavigateUri(uri ? uri : "");
return true;
}
extern "C" const char* noesis_text_inlines_hyperlink_get_navigate_uri(void* link) {
auto* h = cast<Noesis::Hyperlink>(link);
if (!h) return nullptr;
return h->GetNavigateUri();
}
extern "C" bool noesis_text_inlines_inline_set_text_decorations(
void* inl, int32_t decorations) {
auto* i = cast<Noesis::Inline>(inl);
if (!i) return false;
i->SetTextDecorations(static_cast<Noesis::TextDecorations>(decorations));
return true;
}
extern "C" int32_t noesis_text_inlines_inline_get_text_decorations(void* inl) {
auto* i = cast<Noesis::Inline>(inl);
if (!i) return -1;
return static_cast<int32_t>(i->GetTextDecorations());
}
extern "C" bool noesis_text_inlines_ui_container_set_child(
void* container, void* child) {
auto* c = cast<Noesis::InlineUIContainer>(container);
if (!c) return false;
if (!child) {
c->SetChild(nullptr);
return true;
}
auto* ui = cast<Noesis::UIElement>(child);
if (!ui) return false;
c->SetChild(ui);
return true;
}
extern "C" void* noesis_text_inlines_ui_container_get_child(void* container) {
auto* c = cast<Noesis::InlineUIContainer>(container);
if (!c) return nullptr;
Noesis::UIElement* child = c->GetChild();
return static_cast<Noesis::BaseComponent*>(child);
}
extern "C" void* noesis_text_inlines_text_block_get_inlines(void* text_block) {
auto* tb = cast<Noesis::TextBlock>(text_block);
if (!tb) return nullptr;
return handout(tb->GetInlines());
}
extern "C" void* noesis_text_inlines_span_get_inlines(void* span) {
auto* s = cast<Noesis::Span>(span);
if (!s) return nullptr;
return handout(s->GetInlines());
}
extern "C" int32_t noesis_text_inlines_collection_add(void* collection, void* inl) {
InlineColl* coll = as_inlines(collection);
auto* i = cast<Noesis::Inline>(inl);
if (!coll || !i) return -1;
return coll->Add(i);
}
extern "C" int32_t noesis_text_inlines_collection_count(void* collection) {
InlineColl* coll = as_inlines(collection);
return coll ? coll->Count() : -1;
}
extern "C" void* noesis_text_inlines_collection_get(void* collection, uint32_t index) {
InlineColl* coll = as_inlines(collection);
if (!coll || index >= (uint32_t)coll->Count()) return nullptr;
return static_cast<Noesis::BaseComponent*>(coll->Get(index));
}
extern "C" void noesis_text_inlines_collection_clear(void* collection) {
InlineColl* coll = as_inlines(collection);
if (coll) coll->Clear();
}