#include <wx/wxprec.h>
#include <wx/wx.h>
#include "../include/wxdragon.h"
#include "../src/wxd_utils.h"
#include <wx/treectrl.h>
#include <wx/imaglist.h>
class LongValueTreeItemData : public wxTreeItemData {
public:
LongValueTreeItemData(long value) : m_value(value)
{
}
int64_t
GetValue() const
{
return m_value;
}
private:
int64_t m_value;
};
extern "C" {
#define WXD_UNWRAP_TREE_CTRL(ptr) reinterpret_cast<wxTreeCtrl*>(ptr)
#define WXD_WRAP_TREE_CTRL(ptr) reinterpret_cast<wxd_TreeCtrl_t*>(ptr)
#define WXD_UNWRAP_WINDOW(ptr) reinterpret_cast<wxWindow*>(ptr)
#define WXD_UNWRAP_TREE_ITEM_ID(ptr) reinterpret_cast<wxTreeItemId*>(ptr)
#define WXD_WRAP_TREE_ITEM_ID(ptr) reinterpret_cast<wxd_TreeItemId_t*>(ptr)
WXD_EXPORTED wxd_TreeCtrl_t*
wxd_TreeCtrl_Create(wxd_Window_t* parent, int id, wxd_Point pos, wxd_Size size, wxd_Style_t style)
{
wxWindow* p = WXD_UNWRAP_WINDOW(parent);
if (!p)
return nullptr;
wxPoint wxpos(pos.x, pos.y);
wxSize wxsize(size.width, size.height);
wxTreeCtrl* ctrl = new wxTreeCtrl(p, id, wxpos, wxsize, style);
return WXD_WRAP_TREE_CTRL(ctrl);
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_AddRoot(wxd_TreeCtrl_t* self, const char* text, int image, int selImage, void* data)
{
wxTreeCtrl* ctrl = WXD_UNWRAP_TREE_CTRL(self);
if (!ctrl)
return nullptr;
wxString wxText = wxString::FromUTF8(text ? text : "");
wxTreeItemId* id = new wxTreeItemId(
ctrl->AddRoot(wxText, image, selImage, reinterpret_cast<wxTreeItemData*>(data)));
return WXD_WRAP_TREE_ITEM_ID(id);
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_AppendItem(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* parent, const char* text, int image,
int selImage, void* data)
{
wxTreeCtrl* ctrl = WXD_UNWRAP_TREE_CTRL(self);
if (!ctrl)
return nullptr;
wxTreeItemId* parentId = WXD_UNWRAP_TREE_ITEM_ID(parent);
if (!parentId || !parentId->IsOk())
return nullptr;
wxString wxText = wxString::FromUTF8(text ? text : "");
wxTreeItemId* id = new wxTreeItemId(ctrl->AppendItem(*parentId, wxText, image, selImage,
reinterpret_cast<wxTreeItemData*>(data)));
return WXD_WRAP_TREE_ITEM_ID(id);
}
WXD_EXPORTED void
wxd_TreeCtrl_Delete(wxd_TreeCtrl_t* self, const wxd_TreeItemId_t* item_id)
{
wxTreeCtrl* ctrl = WXD_UNWRAP_TREE_CTRL(self);
if (!ctrl)
return;
const wxTreeItemId* id = reinterpret_cast<const wxTreeItemId*>(item_id);
if (!id || !id->IsOk())
return;
ctrl->Delete(*id);
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_GetSelection(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* ctrl = WXD_UNWRAP_TREE_CTRL(self);
if (!ctrl)
return nullptr;
wxTreeItemId* id = new wxTreeItemId(ctrl->GetSelection());
return WXD_WRAP_TREE_ITEM_ID(id);
}
WXD_EXPORTED void
wxd_TreeCtrl_SelectItem(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* item_id)
{
wxTreeCtrl* ctrl = WXD_UNWRAP_TREE_CTRL(self);
if (!ctrl)
return;
wxTreeItemId* id = WXD_UNWRAP_TREE_ITEM_ID(item_id);
if (!id || !id->IsOk())
return;
ctrl->SelectItem(*id);
}
WXD_EXPORTED void
wxd_TreeCtrl_Expand(wxd_TreeCtrl_t* self, const wxd_TreeItemId_t* item_id)
{
wxTreeCtrl* ctrl = WXD_UNWRAP_TREE_CTRL(self);
if (!ctrl)
return;
const wxTreeItemId* id = reinterpret_cast<const wxTreeItemId*>(item_id);
if (!id || !id->IsOk())
return;
ctrl->Expand(*id);
}
WXD_EXPORTED void
wxd_TreeItemId_Free(wxd_TreeItemId_t* item_id)
{
wxTreeItemId* id = WXD_UNWRAP_TREE_ITEM_ID(item_id);
delete id;
}
WXD_EXPORTED bool
wxd_TreeItemId_IsOk(wxd_TreeItemId_t* item_id)
{
wxTreeItemId* id = WXD_UNWRAP_TREE_ITEM_ID(item_id);
return id && id->IsOk();
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeItemId_Clone(const wxd_TreeItemId_t* item_id)
{
const wxTreeItemId* id = reinterpret_cast<const wxTreeItemId*>(item_id);
if (!id || !id->IsOk())
return nullptr;
wxTreeItemId* clone = new wxTreeItemId(*id);
return WXD_WRAP_TREE_ITEM_ID(clone);
}
WXD_EXPORTED bool
wxd_TreeCtrl_SetItemData(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* item_id, int64_t data)
{
wxTreeCtrl* tree = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* id = WXD_UNWRAP_TREE_ITEM_ID(item_id);
if (!tree || !id || !id->IsOk())
return false;
if (data == 0) {
tree->SetItemData(*id, nullptr);
return true;
}
LongValueTreeItemData* itemData = new LongValueTreeItemData(data);
tree->SetItemData(*id, itemData);
return true;
}
WXD_EXPORTED int64_t
wxd_TreeCtrl_GetItemData(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* item_id)
{
wxTreeCtrl* tree = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* id = WXD_UNWRAP_TREE_ITEM_ID(item_id);
if (!tree || !id || !id->IsOk())
return 0;
wxTreeItemData* data = tree->GetItemData(*id);
if (!data)
return 0;
LongValueTreeItemData* longData = dynamic_cast<LongValueTreeItemData*>(data);
if (longData)
return longData->GetValue();
return reinterpret_cast<int64_t>(data);
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_GetRootItem(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* tree = WXD_UNWRAP_TREE_CTRL(self);
if (!tree)
return nullptr;
wxTreeItemId rootId = tree->GetRootItem();
if (!rootId.IsOk())
return nullptr;
wxTreeItemId* id = new wxTreeItemId(rootId);
return WXD_WRAP_TREE_ITEM_ID(id);
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_GetFirstChild(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* item_id, void** cookie)
{
wxTreeCtrl* tree = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* id = WXD_UNWRAP_TREE_ITEM_ID(item_id);
if (!tree || !id || !id->IsOk() || !cookie)
return nullptr;
wxTreeItemIdValue wxCookie;
wxTreeItemId childId = tree->GetFirstChild(*id, wxCookie);
if (!childId.IsOk())
return nullptr;
*cookie = new wxTreeItemIdValue(wxCookie);
wxTreeItemId* childIdPtr = new wxTreeItemId(childId);
return WXD_WRAP_TREE_ITEM_ID(childIdPtr);
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_GetNextChild(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* item_id, void** cookie)
{
wxTreeCtrl* tree = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* id = WXD_UNWRAP_TREE_ITEM_ID(item_id);
if (!tree || !id || !id->IsOk() || !cookie || !*cookie)
return nullptr;
wxTreeItemIdValue& wxCookie = *reinterpret_cast<wxTreeItemIdValue*>(*cookie);
wxTreeItemId childId = tree->GetNextChild(*id, wxCookie);
if (!childId.IsOk()) {
delete reinterpret_cast<wxTreeItemIdValue*>(*cookie);
*cookie = nullptr;
return nullptr;
}
wxTreeItemId* childIdPtr = new wxTreeItemId(childId);
return WXD_WRAP_TREE_ITEM_ID(childIdPtr);
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_GetNextSibling(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* item_id)
{
wxTreeCtrl* tree = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* id = WXD_UNWRAP_TREE_ITEM_ID(item_id);
if (!tree || !id || !id->IsOk())
return nullptr;
wxTreeItemId siblingId = tree->GetNextSibling(*id);
if (!siblingId.IsOk())
return nullptr;
wxTreeItemId* siblingIdPtr = new wxTreeItemId(siblingId);
return WXD_WRAP_TREE_ITEM_ID(siblingIdPtr);
}
WXD_EXPORTED size_t
wxd_TreeCtrl_GetChildrenCount(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* item_id, bool recursively)
{
wxTreeCtrl* tree = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* id = WXD_UNWRAP_TREE_ITEM_ID(item_id);
if (!tree || !id || !id->IsOk())
return 0;
return tree->GetChildrenCount(*id, recursively);
}
static wxTreeEvent*
GetTreeEvent(wxd_Event_t* event)
{
if (!event)
return nullptr;
wxEvent* eventPtr = reinterpret_cast<wxEvent*>(event);
if (!eventPtr->IsKindOf(wxCLASSINFO(wxTreeEvent)))
return nullptr;
return static_cast<wxTreeEvent*>(eventPtr);
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeEvent_GetItem(wxd_Event_t* event)
{
wxTreeEvent* treeEvent = GetTreeEvent(event);
if (!treeEvent)
return nullptr;
wxTreeItemId itemId = treeEvent->GetItem();
if (!itemId.IsOk())
return nullptr;
wxTreeItemId* id = new wxTreeItemId(itemId);
return WXD_WRAP_TREE_ITEM_ID(id);
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeEvent_GetOldItem(wxd_Event_t* event)
{
wxTreeEvent* treeEvent = GetTreeEvent(event);
if (!treeEvent)
return nullptr;
wxTreeItemId oldItemId = treeEvent->GetOldItem();
if (!oldItemId.IsOk())
return nullptr;
wxTreeItemId* id = new wxTreeItemId(oldItemId);
return WXD_WRAP_TREE_ITEM_ID(id);
}
WXD_EXPORTED int
wxd_TreeEvent_GetLabel(wxd_Event_t* event, char* buffer, size_t buffer_len)
{
wxTreeEvent* treeEvent = GetTreeEvent(event);
if (!treeEvent)
return -1;
wxString label = treeEvent->GetLabel();
return (int)wxd_cpp_utils::copy_wxstring_to_buffer(label, buffer, buffer_len);
}
WXD_EXPORTED int
wxd_TreeEvent_IsEditCancelled(wxd_Event_t* event)
{
wxTreeEvent* treeEvent = GetTreeEvent(event);
if (!treeEvent)
return 0;
return treeEvent->IsEditCancelled() ? 1 : 0;
}
static wxTreeItemIcon
map_to_wx_tree_item_icon(wxd_TreeItemIconType_t which_wxd)
{
switch (which_wxd) {
case WXD_TreeItemIcon_Normal:
return wxTreeItemIcon_Normal;
case WXD_TreeItemIcon_Selected:
return wxTreeItemIcon_Selected;
case WXD_TreeItemIcon_Expanded:
return wxTreeItemIcon_Expanded;
case WXD_TreeItemIcon_SelectedExpanded:
return wxTreeItemIcon_SelectedExpanded;
default:
return wxTreeItemIcon_Normal; }
}
WXD_EXPORTED void
wxd_TreeCtrl_SetImageList(wxd_TreeCtrl_t* self, wxd_ImageList_t* imageList)
{
wxTreeCtrl* treeCtrl = reinterpret_cast<wxTreeCtrl*>(self);
wxImageList* wx_imageList = reinterpret_cast<wxImageList*>(imageList);
if (treeCtrl) {
treeCtrl->SetImageList(wx_imageList); }
}
WXD_EXPORTED wxd_ImageList_t*
wxd_TreeCtrl_GetImageList(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* treeCtrl = reinterpret_cast<wxTreeCtrl*>(self);
if (!treeCtrl)
return nullptr;
return reinterpret_cast<wxd_ImageList_t*>(treeCtrl->GetImageList());
}
WXD_EXPORTED void
wxd_TreeCtrl_SetItemImage(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, int image,
wxd_TreeItemIconType_t which)
{
wxTreeCtrl* treeCtrl = reinterpret_cast<wxTreeCtrl*>(self);
wxTreeItemId* wx_itemId = reinterpret_cast<wxTreeItemId*>(itemId);
if (treeCtrl && wx_itemId && wx_itemId->IsOk()) {
treeCtrl->SetItemImage(*wx_itemId, image, map_to_wx_tree_item_icon(which));
}
}
WXD_EXPORTED int
wxd_TreeCtrl_GetItemImage(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId,
wxd_TreeItemIconType_t which)
{
wxTreeCtrl* treeCtrl = reinterpret_cast<wxTreeCtrl*>(self);
wxTreeItemId* wx_itemId = reinterpret_cast<wxTreeItemId*>(itemId);
if (treeCtrl && wx_itemId && wx_itemId->IsOk()) {
return treeCtrl->GetItemImage(*wx_itemId, map_to_wx_tree_item_icon(which));
}
return -1; }
WXD_EXPORTED int
wxd_TreeCtrl_GetItemText(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, char* buffer, size_t buffer_len)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) {
return -1;
}
wxString text = treeCtrl->GetItemText(*wx_itemId);
return (int)wxd_cpp_utils::copy_wxstring_to_buffer(text, buffer, buffer_len);
}
WXD_EXPORTED void
wxd_TreeCtrl_EnsureVisible(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) {
return;
}
treeCtrl->EnsureVisible(*wx_itemId);
}
WXD_EXPORTED void
wxd_TreeCtrl_SetFocusedItem(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) {
return;
}
treeCtrl->SetFocusedItem(*wx_itemId);
}
WXD_EXPORTED void
wxd_TreeCtrl_ExpandAll(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return;
treeCtrl->ExpandAll();
}
WXD_EXPORTED void
wxd_TreeCtrl_SetItemText(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, const char* text)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->SetItemText(*wx_itemId, wxString::FromUTF8(text ? text : ""));
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_GetFocusedItem(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return nullptr;
wxTreeItemId focusedId = treeCtrl->GetFocusedItem();
if (!focusedId.IsOk()) return nullptr;
return WXD_WRAP_TREE_ITEM_ID(new wxTreeItemId(focusedId));
}
WXD_EXPORTED void
wxd_TreeCtrl_Collapse(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->Collapse(*wx_itemId);
}
WXD_EXPORTED void
wxd_TreeCtrl_CollapseAll(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return;
treeCtrl->CollapseAll();
}
WXD_EXPORTED void
wxd_TreeCtrl_CollapseAllChildren(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->CollapseAllChildren(*wx_itemId);
}
WXD_EXPORTED void
wxd_TreeCtrl_CollapseAndReset(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->CollapseAndReset(*wx_itemId);
}
WXD_EXPORTED void
wxd_TreeCtrl_Toggle(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->Toggle(*wx_itemId);
}
WXD_EXPORTED bool
wxd_TreeCtrl_IsExpanded(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return false;
return treeCtrl->IsExpanded(*wx_itemId);
}
WXD_EXPORTED bool
wxd_TreeCtrl_IsSelected(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return false;
return treeCtrl->IsSelected(*wx_itemId);
}
WXD_EXPORTED void
wxd_TreeCtrl_UnselectAll(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return;
treeCtrl->UnselectAll();
}
WXD_EXPORTED void
wxd_TreeCtrl_UnselectItem(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->UnselectItem(*wx_itemId);
}
WXD_EXPORTED void
wxd_TreeCtrl_SelectAll(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return;
(void)treeCtrl;
}
WXD_EXPORTED size_t
wxd_TreeCtrl_GetSelections(wxd_TreeCtrl_t* self, wxd_TreeItemId_t** items, size_t max_items)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return 0;
wxArrayTreeItemIds selections;
size_t count = treeCtrl->GetSelections(selections);
if (items && max_items > 0) {
size_t to_copy = (count < max_items) ? count : max_items;
for (size_t i = 0; i < to_copy; i++) {
items[i] = WXD_WRAP_TREE_ITEM_ID(new wxTreeItemId(selections[i]));
}
}
return count;
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_GetItemParent(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return nullptr;
wxTreeItemId parentId = treeCtrl->GetItemParent(*wx_itemId);
if (!parentId.IsOk()) return nullptr;
return WXD_WRAP_TREE_ITEM_ID(new wxTreeItemId(parentId));
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_GetPrevSibling(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return nullptr;
wxTreeItemId siblingId = treeCtrl->GetPrevSibling(*wx_itemId);
if (!siblingId.IsOk()) return nullptr;
return WXD_WRAP_TREE_ITEM_ID(new wxTreeItemId(siblingId));
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_GetLastChild(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return nullptr;
wxTreeItemId lastChildId = treeCtrl->GetLastChild(*wx_itemId);
if (!lastChildId.IsOk()) return nullptr;
return WXD_WRAP_TREE_ITEM_ID(new wxTreeItemId(lastChildId));
}
WXD_EXPORTED bool
wxd_TreeCtrl_IsVisible(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return false;
return treeCtrl->IsVisible(*wx_itemId);
}
WXD_EXPORTED bool
wxd_TreeCtrl_ItemHasChildren(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return false;
return treeCtrl->ItemHasChildren(*wx_itemId);
}
WXD_EXPORTED bool
wxd_TreeCtrl_IsBold(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return false;
return treeCtrl->IsBold(*wx_itemId);
}
WXD_EXPORTED void
wxd_TreeCtrl_SetItemBold(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, bool bold)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->SetItemBold(*wx_itemId, bold);
}
WXD_EXPORTED void
wxd_TreeCtrl_SetItemTextColour(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, wxd_Colour_t colour)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->SetItemTextColour(*wx_itemId, wxColour(colour.r, colour.g, colour.b, colour.a));
}
WXD_EXPORTED wxd_Colour_t
wxd_TreeCtrl_GetItemTextColour(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxd_Colour_t result = {0, 0, 0, 255};
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return result;
wxColour col = treeCtrl->GetItemTextColour(*wx_itemId);
result.r = col.Red(); result.g = col.Green(); result.b = col.Blue(); result.a = col.Alpha();
return result;
}
WXD_EXPORTED void
wxd_TreeCtrl_SetItemBackgroundColour(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, wxd_Colour_t colour)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->SetItemBackgroundColour(*wx_itemId, wxColour(colour.r, colour.g, colour.b, colour.a));
}
WXD_EXPORTED wxd_Colour_t
wxd_TreeCtrl_GetItemBackgroundColour(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxd_Colour_t result = {255, 255, 255, 255};
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return result;
wxColour col = treeCtrl->GetItemBackgroundColour(*wx_itemId);
result.r = col.Red(); result.g = col.Green(); result.b = col.Blue(); result.a = col.Alpha();
return result;
}
WXD_EXPORTED void
wxd_TreeCtrl_SetItemFont(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, wxd_Font_t* font)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
wxFont* wx_font = reinterpret_cast<wxFont*>(font);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk() || !wx_font) return;
treeCtrl->SetItemFont(*wx_itemId, *wx_font);
}
WXD_EXPORTED wxd_Font_t*
wxd_TreeCtrl_GetItemFont(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return nullptr;
wxFont font = treeCtrl->GetItemFont(*wx_itemId);
if (!font.IsOk()) return nullptr;
return reinterpret_cast<wxd_Font_t*>(new wxFont(font));
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_InsertItem(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* parent, wxd_TreeItemId_t* idPrevious,
const char* text, int image, int selImage, void* data)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_parent = WXD_UNWRAP_TREE_ITEM_ID(parent);
wxTreeItemId* wx_prev = WXD_UNWRAP_TREE_ITEM_ID(idPrevious);
if (!treeCtrl || !wx_parent || !wx_parent->IsOk() || !wx_prev || !wx_prev->IsOk()) return nullptr;
wxString wxText = wxString::FromUTF8(text ? text : "");
wxTreeItemId newId = treeCtrl->InsertItem(*wx_parent, *wx_prev, wxText, image, selImage,
reinterpret_cast<wxTreeItemData*>(data));
if (!newId.IsOk()) return nullptr;
return WXD_WRAP_TREE_ITEM_ID(new wxTreeItemId(newId));
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_InsertItemBefore(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* parent, size_t pos,
const char* text, int image, int selImage, void* data)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_parent = WXD_UNWRAP_TREE_ITEM_ID(parent);
if (!treeCtrl || !wx_parent || !wx_parent->IsOk()) return nullptr;
wxString wxText = wxString::FromUTF8(text ? text : "");
wxTreeItemId newId = treeCtrl->InsertItem(*wx_parent, pos, wxText, image, selImage,
reinterpret_cast<wxTreeItemData*>(data));
if (!newId.IsOk()) return nullptr;
return WXD_WRAP_TREE_ITEM_ID(new wxTreeItemId(newId));
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_PrependItem(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* parent, const char* text,
int image, int selImage, void* data)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_parent = WXD_UNWRAP_TREE_ITEM_ID(parent);
if (!treeCtrl || !wx_parent || !wx_parent->IsOk()) return nullptr;
wxString wxText = wxString::FromUTF8(text ? text : "");
wxTreeItemId newId = treeCtrl->PrependItem(*wx_parent, wxText, image, selImage,
reinterpret_cast<wxTreeItemData*>(data));
if (!newId.IsOk()) return nullptr;
return WXD_WRAP_TREE_ITEM_ID(new wxTreeItemId(newId));
}
WXD_EXPORTED void
wxd_TreeCtrl_DeleteAllItems(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return;
treeCtrl->DeleteAllItems();
}
WXD_EXPORTED void
wxd_TreeCtrl_DeleteChildren(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->DeleteChildren(*wx_itemId);
}
WXD_EXPORTED size_t
wxd_TreeCtrl_GetCount(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return 0;
return treeCtrl->GetCount();
}
WXD_EXPORTED wxd_TextCtrl_t*
wxd_TreeCtrl_EditLabel(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return nullptr;
wxTextCtrl* editCtrl = treeCtrl->EditLabel(*wx_itemId);
return reinterpret_cast<wxd_TextCtrl_t*>(editCtrl);
}
WXD_EXPORTED void
wxd_TreeCtrl_EndEditLabel(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, bool discardChanges)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->EndEditLabel(*wx_itemId, discardChanges);
}
WXD_EXPORTED wxd_TextCtrl_t*
wxd_TreeCtrl_GetEditControl(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return nullptr;
return reinterpret_cast<wxd_TextCtrl_t*>(treeCtrl->GetEditControl());
}
WXD_EXPORTED void
wxd_TreeCtrl_ScrollTo(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->ScrollTo(*wx_itemId);
}
WXD_EXPORTED void
wxd_TreeCtrl_SortChildren(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->SortChildren(*wx_itemId);
}
WXD_EXPORTED wxd_TreeItemId_t*
wxd_TreeCtrl_HitTest(wxd_TreeCtrl_t* self, wxd_Point point, int* flags)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return nullptr;
int hitFlags = 0;
wxTreeItemId hitId = treeCtrl->HitTest(wxPoint(point.x, point.y), hitFlags);
if (flags) *flags = hitFlags;
if (!hitId.IsOk()) return nullptr;
return WXD_WRAP_TREE_ITEM_ID(new wxTreeItemId(hitId));
}
WXD_EXPORTED bool
wxd_TreeCtrl_GetBoundingRect(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, wxd_Rect* rect, bool textOnly)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk() || !rect) return false;
wxRect wxRect;
bool result = treeCtrl->GetBoundingRect(*wx_itemId, wxRect, textOnly);
if (result) {
rect->x = wxRect.x; rect->y = wxRect.y;
rect->width = wxRect.width; rect->height = wxRect.height;
}
return result;
}
WXD_EXPORTED void
wxd_TreeCtrl_SetStateImageList(wxd_TreeCtrl_t* self, wxd_ImageList_t* imageList)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxImageList* wx_imageList = reinterpret_cast<wxImageList*>(imageList);
if (!treeCtrl) return;
treeCtrl->SetStateImageList(wx_imageList);
}
WXD_EXPORTED wxd_ImageList_t*
wxd_TreeCtrl_GetStateImageList(wxd_TreeCtrl_t* self)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
if (!treeCtrl) return nullptr;
return reinterpret_cast<wxd_ImageList_t*>(treeCtrl->GetStateImageList());
}
WXD_EXPORTED void
wxd_TreeCtrl_SetItemState(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, int state)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->SetItemState(*wx_itemId, state);
}
WXD_EXPORTED int
wxd_TreeCtrl_GetItemState(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return -1;
return treeCtrl->GetItemState(*wx_itemId);
}
WXD_EXPORTED void
wxd_TreeCtrl_SetItemHasChildren(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, bool has)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
treeCtrl->SetItemHasChildren(*wx_itemId, has);
}
WXD_EXPORTED void
wxd_TreeCtrl_EnableItem(wxd_TreeCtrl_t* self, wxd_TreeItemId_t* itemId, bool enable)
{
wxTreeCtrl* treeCtrl = WXD_UNWRAP_TREE_CTRL(self);
wxTreeItemId* wx_itemId = WXD_UNWRAP_TREE_ITEM_ID(itemId);
if (!treeCtrl || !wx_itemId || !wx_itemId->IsOk()) return;
(void)enable; }
}