#include "noesis_shim.h"
#include <NsCore/Noesis.h>
#include <NsCore/DynamicCast.h>
#include <NsCore/Nullable.h>
#include <NsGui/ContextMenu.h>
#include <NsGui/ContextMenuService.h>
#include <NsGui/DependencyObject.h>
#include <NsGui/Expander.h>
#include <NsGui/FrameworkElement.h>
#include <NsGui/FreezableCollection.h>
#include <NsGui/GridView.h>
#include <NsGui/GridViewColumn.h>
#include <NsGui/Image.h>
#include <NsGui/ImageSource.h>
#include <NsGui/ItemCollection.h>
#include <NsGui/ItemContainerGenerator.h>
#include <NsGui/ItemsControl.h>
#include <NsGui/ListView.h>
#include <NsGui/PasswordBox.h>
#include <NsGui/Popup.h>
#include <NsGui/RangeBase.h>
#include <NsGui/ScrollViewer.h>
#include <NsGui/Selector.h>
#include <NsGui/TextBox.h>
#include <NsGui/ToggleButton.h>
#include <NsGui/ToolTip.h>
#include <NsGui/ToolTipService.h>
#include <NsGui/TreeView.h>
#include <NsGui/TreeViewItem.h>
namespace {
template<class T>
T* as(void* element) {
return Noesis::DynamicCast<T*>(static_cast<Noesis::BaseComponent*>(element));
}
}
extern "C" bool noesis_selector_get_selected_index(void* element, int32_t* out) {
if (!element || !out) return false;
auto* s = as<Noesis::Selector>(element);
if (!s) return false;
*out = s->GetSelectedIndex();
return true;
}
extern "C" bool noesis_selector_set_selected_index(void* element, int32_t index) {
if (!element) return false;
auto* s = as<Noesis::Selector>(element);
if (!s) return false;
s->SetSelectedIndex(index);
return true;
}
extern "C" void* noesis_selector_get_selected_item(void* element) {
if (!element) return nullptr;
auto* s = as<Noesis::Selector>(element);
return s ? s->GetSelectedItem() : nullptr;
}
extern "C" bool noesis_selector_set_selected_item(void* element, void* item) {
if (!element) return false;
auto* s = as<Noesis::Selector>(element);
if (!s) return false;
s->SetSelectedItem(static_cast<Noesis::BaseComponent*>(item));
return true;
}
extern "C" int32_t noesis_items_control_items_add(void* element, void* item) {
if (!element) return -1;
auto* ic = as<Noesis::ItemsControl>(element);
if (!ic) return -1;
Noesis::ItemCollection* items = ic->GetItems();
if (!items) return -1;
return items->Add(static_cast<Noesis::BaseComponent*>(item));
}
extern "C" bool noesis_items_control_items_insert(void* element, uint32_t index, void* item) {
if (!element) return false;
auto* ic = as<Noesis::ItemsControl>(element);
if (!ic) return false;
Noesis::ItemCollection* items = ic->GetItems();
if (!items || index > (uint32_t)items->Count()) return false;
items->Insert(index, static_cast<Noesis::BaseComponent*>(item));
return true;
}
extern "C" bool noesis_items_control_items_remove_at(void* element, uint32_t index) {
if (!element) return false;
auto* ic = as<Noesis::ItemsControl>(element);
if (!ic) return false;
Noesis::ItemCollection* items = ic->GetItems();
if (!items || index >= (uint32_t)items->Count()) return false;
items->RemoveAt(index);
return true;
}
extern "C" bool noesis_items_control_items_clear(void* element) {
if (!element) return false;
auto* ic = as<Noesis::ItemsControl>(element);
if (!ic) return false;
Noesis::ItemCollection* items = ic->GetItems();
if (!items) return false;
items->Clear();
return true;
}
extern "C" bool noesis_rangebase_get(void* element, int32_t which, float* out) {
if (!element || !out) return false;
auto* r = as<Noesis::RangeBase>(element);
if (!r) return false;
switch (which) {
case 0: *out = r->GetValue(); return true;
case 1: *out = r->GetMinimum(); return true;
case 2: *out = r->GetMaximum(); return true;
default: return false;
}
}
extern "C" bool noesis_rangebase_set(void* element, int32_t which, float value) {
if (!element) return false;
auto* r = as<Noesis::RangeBase>(element);
if (!r) return false;
switch (which) {
case 0: r->SetValue(value); return true;
case 1: r->SetMinimum(value); return true;
case 2: r->SetMaximum(value); return true;
default: return false;
}
}
extern "C" bool noesis_toggle_get_is_checked(void* element, int8_t* out_state) {
if (!element || !out_state) return false;
auto* tb = as<Noesis::ToggleButton>(element);
if (!tb) return false;
const Noesis::Nullable<bool>& v = tb->GetIsChecked();
*out_state = !v.HasValue() ? 2 : (v.GetValue() ? 1 : 0);
return true;
}
extern "C" bool noesis_toggle_set_is_checked(void* element, int8_t state) {
if (!element) return false;
auto* tb = as<Noesis::ToggleButton>(element);
if (!tb) return false;
if (state == 2) {
tb->SetIsChecked(Noesis::Nullable<bool>());
} else {
tb->SetIsChecked(Noesis::Nullable<bool>(state != 0));
}
return true;
}
extern "C" bool noesis_popup_get_is_open(void* element, bool* out) {
if (!element || !out) return false;
auto* p = as<Noesis::Popup>(element);
if (!p) return false;
*out = p->GetIsOpen();
return true;
}
extern "C" bool noesis_popup_set_is_open(void* element, bool open) {
if (!element) return false;
auto* p = as<Noesis::Popup>(element);
if (!p) return false;
p->SetIsOpen(open);
return true;
}
extern "C" bool noesis_expander_get_is_expanded(void* element, bool* out) {
if (!element || !out) return false;
auto* e = as<Noesis::Expander>(element);
if (!e) return false;
*out = e->GetIsExpanded();
return true;
}
extern "C" bool noesis_expander_set_is_expanded(void* element, bool expanded) {
if (!element) return false;
auto* e = as<Noesis::Expander>(element);
if (!e) return false;
e->SetIsExpanded(expanded);
return true;
}
extern "C" bool noesis_scrollviewer_get(void* element, int32_t which, float* out) {
if (!element || !out) return false;
auto* sv = as<Noesis::ScrollViewer>(element);
if (!sv) return false;
switch (which) {
case 0: *out = sv->GetHorizontalOffset(); return true;
case 1: *out = sv->GetVerticalOffset(); return true;
case 2: *out = sv->GetScrollableWidth(); return true;
case 3: *out = sv->GetScrollableHeight(); return true;
case 4: *out = sv->GetExtentHeight(); return true;
case 5: *out = sv->GetViewportHeight(); return true;
default: return false;
}
}
extern "C" bool noesis_scrollviewer_scroll_to_horizontal(void* element, float offset) {
if (!element) return false;
auto* sv = as<Noesis::ScrollViewer>(element);
if (!sv) return false;
sv->ScrollToHorizontalOffset(offset);
return true;
}
extern "C" bool noesis_scrollviewer_scroll_to_vertical(void* element, float offset) {
if (!element) return false;
auto* sv = as<Noesis::ScrollViewer>(element);
if (!sv) return false;
sv->ScrollToVerticalOffset(offset);
return true;
}
extern "C" bool noesis_scrollviewer_scroll_to_home(void* element) {
if (!element) return false;
auto* sv = as<Noesis::ScrollViewer>(element);
if (!sv) return false;
sv->ScrollToHome();
return true;
}
extern "C" bool noesis_scrollviewer_scroll_to_end(void* element) {
if (!element) return false;
auto* sv = as<Noesis::ScrollViewer>(element);
if (!sv) return false;
sv->ScrollToEnd();
return true;
}
extern "C" bool noesis_textbox_get_int(void* element, int32_t which, int32_t* out) {
if (!element || !out) return false;
auto* tb = as<Noesis::TextBox>(element);
if (!tb) return false;
switch (which) {
case 0: *out = tb->GetSelectionStart(); return true;
case 1: *out = tb->GetSelectionLength(); return true;
case 2: *out = tb->GetCaretIndex(); return true;
default: return false;
}
}
extern "C" bool noesis_textbox_set_int(void* element, int32_t which, int32_t value) {
if (!element) return false;
auto* tb = as<Noesis::TextBox>(element);
if (!tb) return false;
switch (which) {
case 0: tb->SetSelectionStart(value); return true;
case 1: tb->SetSelectionLength(value); return true;
case 2: tb->SetCaretIndex(value); return true;
default: return false;
}
}
extern "C" bool noesis_textbox_select(void* element, int32_t start, int32_t length) {
if (!element) return false;
auto* tb = as<Noesis::TextBox>(element);
if (!tb) return false;
tb->Select(start, length);
return true;
}
extern "C" bool noesis_textbox_select_all(void* element) {
if (!element) return false;
auto* tb = as<Noesis::TextBox>(element);
if (!tb) return false;
tb->SelectAll();
return true;
}
extern "C" const char* noesis_textbox_get_selected_text(void* element) {
if (!element) return nullptr;
auto* tb = as<Noesis::TextBox>(element);
return tb ? tb->GetSelectedText() : nullptr;
}
extern "C" const char* noesis_passwordbox_get_password(void* element) {
if (!element) return nullptr;
auto* pb = as<Noesis::PasswordBox>(element);
return pb ? pb->GetPassword() : nullptr;
}
extern "C" bool noesis_passwordbox_set_password(void* element, const char* password) {
if (!element) return false;
auto* pb = as<Noesis::PasswordBox>(element);
if (!pb) return false;
pb->SetPassword(password ? password : "");
return true;
}
extern "C" void* noesis_controls_selector_get_selected_value(void* element) {
if (!element) return nullptr;
auto* s = as<Noesis::Selector>(element);
return s ? static_cast<Noesis::BaseComponent*>(s->GetSelectedValue()) : nullptr;
}
extern "C" bool noesis_controls_selector_set_selected_value(void* element, void* value) {
if (!element) return false;
auto* s = as<Noesis::Selector>(element);
if (!s) return false;
s->SetSelectedValue(static_cast<Noesis::BaseComponent*>(value));
return true;
}
extern "C" const char* noesis_controls_selector_get_selected_value_path(void* element) {
if (!element) return nullptr;
auto* s = as<Noesis::Selector>(element);
return s ? s->GetSelectedValuePath() : nullptr;
}
extern "C" bool noesis_controls_selector_set_selected_value_path(void* element,
const char* path) {
if (!element) return false;
auto* s = as<Noesis::Selector>(element);
if (!s) return false;
s->SetSelectedValuePath(path ? path : "");
return true;
}
extern "C" void* noesis_controls_treeview_get_selected_item(void* element) {
if (!element) return nullptr;
auto* tv = as<Noesis::TreeView>(element);
return tv ? static_cast<Noesis::BaseComponent*>(tv->GetSelectedItem()) : nullptr;
}
extern "C" bool noesis_controls_treeviewitem_get_is_selected(void* element, bool* out) {
if (!element || !out) return false;
auto* item = as<Noesis::TreeViewItem>(element);
if (!item) return false;
*out = item->GetIsSelected();
return true;
}
extern "C" bool noesis_controls_treeviewitem_set_is_selected(void* element, bool selected) {
if (!element) return false;
auto* item = as<Noesis::TreeViewItem>(element);
if (!item) return false;
item->SetIsSelected(selected);
return true;
}
extern "C" bool noesis_controls_treeviewitem_get_is_expanded(void* element, bool* out) {
if (!element || !out) return false;
auto* item = as<Noesis::TreeViewItem>(element);
if (!item) return false;
*out = item->GetIsExpanded();
return true;
}
extern "C" bool noesis_controls_treeviewitem_set_is_expanded(void* element, bool expanded) {
if (!element) return false;
auto* item = as<Noesis::TreeViewItem>(element);
if (!item) return false;
item->SetIsExpanded(expanded);
return true;
}
extern "C" void* noesis_controls_generator_container_from_index(void* element, int32_t index) {
if (!element) return nullptr;
auto* ic = as<Noesis::ItemsControl>(element);
if (!ic) return nullptr;
Noesis::ItemContainerGenerator* g = ic->GetItemContainerGenerator();
if (!g) return nullptr;
return static_cast<Noesis::BaseComponent*>(g->ContainerFromIndex(index));
}
extern "C" void* noesis_controls_generator_container_from_item(void* element, void* item) {
if (!element) return nullptr;
auto* ic = as<Noesis::ItemsControl>(element);
if (!ic) return nullptr;
Noesis::ItemContainerGenerator* g = ic->GetItemContainerGenerator();
if (!g) return nullptr;
return static_cast<Noesis::BaseComponent*>(
g->ContainerFromItem(static_cast<Noesis::BaseComponent*>(item)));
}
extern "C" int32_t noesis_controls_generator_index_from_container(void* element,
void* container) {
if (!element || !container) return -1;
auto* ic = as<Noesis::ItemsControl>(element);
if (!ic) return -1;
Noesis::ItemContainerGenerator* g = ic->GetItemContainerGenerator();
if (!g) return -1;
auto* dobj = Noesis::DynamicCast<Noesis::DependencyObject*>(
static_cast<Noesis::BaseComponent*>(container));
if (!dobj) return -1;
return g->IndexFromContainer(dobj);
}
extern "C" void* noesis_controls_generator_item_from_container(void* element, void* container) {
if (!element || !container) return nullptr;
auto* ic = as<Noesis::ItemsControl>(element);
if (!ic) return nullptr;
Noesis::ItemContainerGenerator* g = ic->GetItemContainerGenerator();
if (!g) return nullptr;
auto* dobj = Noesis::DynamicCast<Noesis::DependencyObject*>(
static_cast<Noesis::BaseComponent*>(container));
if (!dobj) return nullptr;
return static_cast<Noesis::BaseComponent*>(g->ItemFromContainer(dobj));
}
extern "C" void* noesis_controls_listview_get_view(void* element) {
if (!element) return nullptr;
auto* lv = as<Noesis::ListView>(element);
if (!lv) return nullptr;
auto* gv = Noesis::DynamicCast<Noesis::GridView*>(lv->GetView());
return gv ? static_cast<Noesis::BaseComponent*>(gv) : nullptr;
}
extern "C" int32_t noesis_controls_gridview_column_count(void* gridview) {
if (!gridview) return -1;
auto* gv = as<Noesis::GridView>(gridview);
if (!gv) return -1;
Noesis::GridViewColumnCollection* cols = gv->GetColumns();
return cols ? cols->Count() : -1;
}
namespace {
Noesis::GridViewColumn* column_at(void* gridview, uint32_t index) {
auto* gv = Noesis::DynamicCast<Noesis::GridView*>(
static_cast<Noesis::BaseComponent*>(gridview));
if (!gv) return nullptr;
Noesis::GridViewColumnCollection* cols = gv->GetColumns();
if (!cols || index >= (uint32_t)cols->Count()) return nullptr;
return cols->Get(index);
}
}
extern "C" bool noesis_controls_gridview_column_get_width(void* gridview, uint32_t index,
float* out) {
if (!gridview || !out) return false;
Noesis::GridViewColumn* col = column_at(gridview, index);
if (!col) return false;
*out = col->GetWidth();
return true;
}
extern "C" bool noesis_controls_gridview_column_set_width(void* gridview, uint32_t index,
float width) {
if (!gridview) return false;
Noesis::GridViewColumn* col = column_at(gridview, index);
if (!col) return false;
col->SetWidth(width);
return true;
}
extern "C" bool noesis_controls_gridview_column_get_actual_width(void* gridview, uint32_t index,
float* out) {
if (!gridview || !out) return false;
Noesis::GridViewColumn* col = column_at(gridview, index);
if (!col) return false;
*out = col->GetActualWidth();
return true;
}
extern "C" void* noesis_controls_gridview_column_get_header(void* gridview, uint32_t index) {
if (!gridview) return nullptr;
Noesis::GridViewColumn* col = column_at(gridview, index);
if (!col) return nullptr;
return static_cast<Noesis::BaseComponent*>(col->GetHeader());
}
extern "C" void* noesis_controls_fe_get_tooltip(void* element) {
if (!element) return nullptr;
auto* fe = as<Noesis::FrameworkElement>(element);
return fe ? static_cast<Noesis::BaseComponent*>(fe->GetToolTip()) : nullptr;
}
extern "C" bool noesis_controls_fe_set_tooltip(void* element, void* tooltip) {
if (!element) return false;
auto* fe = as<Noesis::FrameworkElement>(element);
if (!fe) return false;
fe->SetToolTip(static_cast<Noesis::BaseComponent*>(tooltip));
return true;
}
extern "C" bool noesis_controls_fe_set_tooltip_string(void* element, const char* text) {
if (!element) return false;
auto* fe = as<Noesis::FrameworkElement>(element);
if (!fe) return false;
fe->SetToolTip(text ? text : "");
return true;
}
extern "C" void* noesis_controls_tooltipservice_get_tooltip(void* obj) {
if (!obj) return nullptr;
auto* d = as<Noesis::DependencyObject>(obj);
return d ? static_cast<Noesis::BaseComponent*>(Noesis::ToolTipService::GetToolTip(d)) : nullptr;
}
extern "C" bool noesis_controls_tooltipservice_set_tooltip(void* obj, void* tooltip) {
if (!obj) return false;
auto* d = as<Noesis::DependencyObject>(obj);
if (!d) return false;
Noesis::ToolTipService::SetToolTip(d, static_cast<Noesis::BaseComponent*>(tooltip));
return true;
}
extern "C" bool noesis_controls_tooltip_get_is_open(void* element, bool* out) {
if (!element || !out) return false;
auto* t = as<Noesis::ToolTip>(element);
if (!t) return false;
*out = t->GetIsOpen();
return true;
}
extern "C" bool noesis_controls_tooltip_set_is_open(void* element, bool open) {
if (!element) return false;
auto* t = as<Noesis::ToolTip>(element);
if (!t) return false;
t->SetIsOpen(open);
return true;
}
extern "C" void* noesis_controls_fe_get_context_menu(void* element) {
if (!element) return nullptr;
auto* fe = as<Noesis::FrameworkElement>(element);
return fe ? static_cast<Noesis::BaseComponent*>(fe->GetContextMenu()) : nullptr;
}
extern "C" bool noesis_controls_fe_set_context_menu(void* element, void* menu) {
if (!element) return false;
auto* fe = as<Noesis::FrameworkElement>(element);
if (!fe) return false;
Noesis::ContextMenu* cm = menu ? as<Noesis::ContextMenu>(menu) : nullptr;
if (menu && !cm) return false;
fe->SetContextMenu(cm);
return true;
}
extern "C" void* noesis_controls_contextmenuservice_get_context_menu(void* obj) {
if (!obj) return nullptr;
auto* d = as<Noesis::DependencyObject>(obj);
return d ? static_cast<Noesis::BaseComponent*>(Noesis::ContextMenuService::GetContextMenu(d))
: nullptr;
}
extern "C" bool noesis_controls_contextmenuservice_set_context_menu(void* obj, void* menu) {
if (!obj) return false;
auto* d = as<Noesis::DependencyObject>(obj);
if (!d) return false;
Noesis::ContextMenu* cm = menu ? as<Noesis::ContextMenu>(menu) : nullptr;
if (menu && !cm) return false;
Noesis::ContextMenuService::SetContextMenu(d, cm);
return true;
}
extern "C" bool noesis_controls_contextmenu_get_is_open(void* element, bool* out) {
if (!element || !out) return false;
auto* cm = as<Noesis::ContextMenu>(element);
if (!cm) return false;
*out = cm->GetIsOpen();
return true;
}
extern "C" bool noesis_controls_contextmenu_set_is_open(void* element, bool open) {
if (!element) return false;
auto* cm = as<Noesis::ContextMenu>(element);
if (!cm) return false;
cm->SetIsOpen(open);
return true;
}
extern "C" bool noesis_controls_scrollviewer_line(void* element, int32_t which) {
if (!element) return false;
auto* sv = as<Noesis::ScrollViewer>(element);
if (!sv) return false;
switch (which) {
case 0: sv->LineUp(); return true;
case 1: sv->LineDown(); return true;
case 2: sv->LineLeft(); return true;
case 3: sv->LineRight(); return true;
default: return false;
}
}
extern "C" bool noesis_controls_scrollviewer_page(void* element, int32_t which) {
if (!element) return false;
auto* sv = as<Noesis::ScrollViewer>(element);
if (!sv) return false;
switch (which) {
case 0: sv->PageUp(); return true;
case 1: sv->PageDown(); return true;
case 2: sv->PageLeft(); return true;
case 3: sv->PageRight(); return true;
default: return false;
}
}
extern "C" bool noesis_controls_scrollviewer_edge(void* element, int32_t which) {
if (!element) return false;
auto* sv = as<Noesis::ScrollViewer>(element);
if (!sv) return false;
switch (which) {
case 0: sv->ScrollToTop(); return true;
case 1: sv->ScrollToBottom(); return true;
case 2: sv->ScrollToLeftEnd(); return true;
case 3: sv->ScrollToRightEnd(); return true;
default: return false;
}
}
extern "C" bool noesis_controls_scrollviewer_metric(void* element, int32_t which, float* out) {
if (!element || !out) return false;
auto* sv = as<Noesis::ScrollViewer>(element);
if (!sv) return false;
switch (which) {
case 6: *out = sv->GetExtentWidth(); return true;
case 7: *out = sv->GetViewportWidth(); return true;
default: return false;
}
}
extern "C" void* noesis_controls_image_get_source(void* element) {
if (!element) return nullptr;
auto* img = as<Noesis::Image>(element);
return img ? static_cast<Noesis::BaseComponent*>(img->GetSource()) : nullptr;
}
extern "C" bool noesis_controls_image_set_source(void* element, void* source) {
if (!element) return false;
auto* img = as<Noesis::Image>(element);
if (!img) return false;
Noesis::ImageSource* src = source ? as<Noesis::ImageSource>(source) : nullptr;
if (source && !src) return false;
img->SetSource(src);
return true;
}