ext/wxTreeCtrl.cpp

Summary

Maintainability
Test Coverage
/*
 * wxTreeCtrl.cpp
 *
 *  Created on: 12.03.2012
 *      Author: hanmac
 */

#include "wxTreeCtrl.hpp"
#include "wxFont.hpp"
#include "wxColor.hpp"
#include "wxImageList.hpp"

#include "wxPoint.hpp"

VALUE rb_cWXTreeCtrl,rb_cWXTreeCtrlItem,rb_cWXTreeCtrlEvent;
#if wxUSE_TREECTRL

template <>
wxTreeItemId unwrap< wxTreeItemId >(const VALUE &vwindow)
{
    return unwrapTypedPtr<RubyTreeCtrlItem>(vwindow, rb_cWXTreeCtrl)->GetId();
}

namespace RubyWX {
namespace TreeCtrl {

#define _self unwrap<wxTreeCtrl*>(self)

macro_attr(Indent,unsigned int)
macro_attr(Spacing,unsigned int)

macro_attr(ImageList,wxImageList*)
macro_attr(StateImageList,wxImageList*)


APP_PROTECT(wxTreeCtrl)

DLL_LOCAL VALUE _initialize(int argc,VALUE *argv,VALUE self)
{
    VALUE parent,name,hash;
    rb_scan_args(argc, argv, "11:",&parent,&name,&hash);
    if(!_created && !rb_obj_is_kind_of(name,rb_cString)) {
        wxWindowID id(wxID_ANY);
        wxString label(wxEmptyString);
        int style(wxTR_DEFAULT_STYLE);

        if(rb_obj_is_kind_of(hash,rb_cHash)) {
            set_hash_option(hash,"id",id,unwrapID);
            set_hash_option(hash,"label",label);
            set_hash_option(hash,"style",style);
        }

        if(nil_check(parent)) {
            _self->Create(
                unwrap<wxWindow*>(parent),id,
                wxDefaultPosition,wxDefaultSize,
                style
            );
        }
    }

    rb_call_super(argc,argv);
    return self;
}

DLL_LOCAL VALUE _root(int argc,VALUE *argv,VALUE self)
{
    VALUE str, id, selid;
    rb_scan_args(argc, argv, "03",&str, &id, &selid);
    int cid = -1,cselid = -1;
    if(NIL_P(str) || _self->GetRootItem().IsOk())
        return wrap(_self,_self->GetRootItem());
    if(!NIL_P(id))
        cid = RB_NUM2INT(id);
    if(!NIL_P(selid))
        cid = RB_NUM2INT(selid);
    VALUE result = wrap(_self,_self->AddRoot(unwrap<wxString>(str),cid,cselid));
    if(rb_block_given_p())
        rb_yield(result);
    return result;
}

DLL_LOCAL VALUE _getSelection(VALUE self)
{
    return wrap(_self,_self->GetSelection());


}
DLL_LOCAL VALUE _setSelection(VALUE self,VALUE item)
{
    _self->SelectItem(unwrap<wxTreeItemId>(item));
    return item;
}

namespace Item {
#undef _self
#define _self unwrapTypedPtr<RubyTreeCtrlItem>(self, rb_cWXTreeCtrlItem)

macro_attr(State,int)
macro_attr(Bold,bool)
macro_attr(Text,wxString)
macro_attr(Font,wxFont)
macro_attr(TextColour,wxColour)
macro_attr(BackgroundColour,wxColour)

singlefunc(Delete)

DLL_LOCAL VALUE _AppendItem(int argc,VALUE *argv,VALUE self)
{
    VALUE str, id, selid;
    rb_scan_args(argc, argv, "12",&str, &id, &selid);
    int cid = -1,cselid = -1;
    if(!NIL_P(id))
        cid = RB_NUM2INT(id);
    if(!NIL_P(selid))
        cid = RB_NUM2INT(selid);
    VALUE result = _self->AppendItem(unwrap<wxString>(str),cid,cselid);

    if(rb_block_given_p())
        rb_yield(result);
    return result;

}

DLL_LOCAL VALUE _PrependItem(int argc,VALUE *argv,VALUE self)
{
    VALUE str, id, selid;
    rb_scan_args(argc, argv, "12",&str, &id, &selid);
    int cid = -1,cselid = -1;
    if(!NIL_P(id))
        cid = RB_NUM2INT(id);
    if(!NIL_P(selid))
        cid = RB_NUM2INT(selid);
    VALUE result = _self->PrependItem(unwrap<wxString>(str),cid,cselid);

    if(rb_block_given_p())
        rb_yield(result);
    return result;

}

DLL_LOCAL VALUE _GetNextSibling(VALUE self)
{
    return _self->GetNextSibling();
}

DLL_LOCAL VALUE _GetPrevSibling(VALUE self)
{
    return _self->GetPrevSibling();
}

DLL_LOCAL VALUE _compare(VALUE self,VALUE other)
{
    return _self->compare(unwrapTypedPtr<RubyTreeCtrlItem>(self, rb_cWXTreeCtrlItem));
}

DLL_LOCAL VALUE _each(VALUE self)
{
    RETURN_ENUMERATOR(self,0,NULL);
    _self->each();
    return self;
}


}

namespace Event {

#undef _self
#define _self unwrapTypedPtr<wxTreeEvent>(self, rb_cWXTreeCtrlEvent)

macro_attr(Label,wxString)
macro_attr(ToolTip,wxString)

macro_attr(Point,wxPoint)

DLL_LOCAL VALUE _GetItem(VALUE self)
{
    return wrap(static_cast<wxTreeCtrl*>(_self->GetEventObject()),_self->GetItem());
}
DLL_LOCAL VALUE _SetItem(VALUE self,VALUE val)
{
    _self->SetItem(unwrap< wxTreeItemId >(val));
    return val;
}
DLL_LOCAL VALUE _GetOldItem(VALUE self)
{
    return wrap(static_cast<wxTreeCtrl*>(_self->GetEventObject()),_self->GetOldItem());
}
DLL_LOCAL VALUE _SetOldItem(VALUE self,VALUE val)
{
    _self->SetOldItem(unwrap< wxTreeItemId >(val));
    return val;
}

}

}
}

RubyTreeCtrlItem::RubyTreeCtrlItem(wxTreeCtrl* tree,wxTreeItemId id) : wxTreeItemData(),
        mRuby(wrapTypedPtr(this,rb_cWXTreeCtrlItem)), mTree(tree)
{
    SetId(id);
    tree->SetItemData(id,this);
}

RubyTreeCtrlItem::~RubyTreeCtrlItem()
{
    SetId(NULL);
}

int RubyTreeCtrlItem::GetState()
{
    checkDestroyed();
    return mTree->GetItemState(GetId());
}

bool RubyTreeCtrlItem::GetBold()
{
    checkDestroyed();
    return mTree->IsBold(GetId());
}

wxString RubyTreeCtrlItem::GetText()
{
    checkDestroyed();
    return mTree->GetItemText(GetId());
}

wxColour RubyTreeCtrlItem::GetTextColour()
{
    checkDestroyed();
    return mTree->GetItemTextColour(GetId());
}

wxColour RubyTreeCtrlItem::GetBackgroundColour()
{
    checkDestroyed();
    return mTree->GetItemBackgroundColour(GetId());
}

wxFont RubyTreeCtrlItem::GetFont()
{
    checkDestroyed();
    return mTree->GetItemFont(GetId());
}


void RubyTreeCtrlItem::SetState(int state)
{
    checkDestroyed();
    mTree->SetItemState(GetId(),state);
}

void RubyTreeCtrlItem::SetBold(bool bold)
{
    checkDestroyed();
    mTree->SetItemBold(GetId(),bold);
}
void RubyTreeCtrlItem::SetText(const wxString& text)
{
    checkDestroyed();
    mTree->SetItemText(GetId(),text);
}
void RubyTreeCtrlItem::SetTextColour(const wxColour& col)
{
    checkDestroyed();
    mTree->SetItemTextColour(GetId(),col);
}
void RubyTreeCtrlItem::SetBackgroundColour(const wxColour& col)
{
    checkDestroyed();
    mTree->SetItemBackgroundColour(GetId(),col);
}
void RubyTreeCtrlItem::SetFont(const wxFont& font)
{
    checkDestroyed();
    mTree->SetItemFont(GetId(),font);
}

void RubyTreeCtrlItem::Delete()
{
    checkDestroyed();
    mTree->Delete(GetId());
}

void RubyTreeCtrlItem::each()
{
    wxTreeItemIdValue cookie;
    wxTreeItemId id = mTree->GetFirstChild(GetId(), cookie);
    while(id) {
        rb_yield(wrap(mTree,id));
        id = mTree->GetNextChild(GetId(),cookie);
    }
}

VALUE RubyTreeCtrlItem::compare(RubyTreeCtrlItem *cother)
{
    if(!cother || GetId().IsOk() || !cother->GetId().IsOk() || mTree != cother->mTree)
        return Qnil;
    return INT2FIX(mTree->OnCompareItems(GetId(),cother->GetId()));

}

VALUE RubyTreeCtrlItem::AppendItem(const wxString& text, int image, int selImage)
{
    checkDestroyed();
    return wrap(mTree,mTree->AppendItem(GetId(),text,image,selImage));
}

VALUE RubyTreeCtrlItem::PrependItem(const wxString& text, int image, int selImage)
{
    checkDestroyed();
    return wrap(mTree,mTree->PrependItem(GetId(),text,image,selImage));
}

VALUE RubyTreeCtrlItem::GetNextSibling()
{
    checkDestroyed();
    return wrap(mTree,mTree->GetNextSibling(GetId()));
}

VALUE RubyTreeCtrlItem::GetPrevSibling()
{
    checkDestroyed();
    return wrap(mTree,mTree->GetPrevSibling(GetId()));
}


void RubyTreeCtrlItem::checkDestroyed()
{
    if(!GetId().IsOk())
        rb_raise(rb_eTypeError,"%" PRIsVALUE " has been destroyed",rb_cWXTreeCtrlItem);
}


VALUE wrap(wxTreeCtrl* tree,wxTreeItemId id)
{
    if(!id.IsOk())
        return Qnil;
    if(tree->GetItemData(id))
    {
        return dynamic_cast<RubyTreeCtrlItem*>(tree->GetItemData(id))->getRuby();
    }else
    {
        RubyTreeCtrlItem *itemdata = new RubyTreeCtrlItem(tree,id);
        return itemdata->getRuby();
    }
}

#endif
DLL_LOCAL void Init_WXTreeCtrl(VALUE rb_mWX)
{
#if 0
    rb_mWX = rb_define_module("WX");
    rb_cWXWindow = rb_define_class_under(rb_mWX,"Window",rb_cObject);

    rb_cWXControl = rb_define_class_under(rb_mWX,"Control",rb_cWXWindow);
#endif

#if wxUSE_TREECTRL
    using namespace RubyWX::TreeCtrl;
    rb_cWXTreeCtrl = rb_define_class_under(rb_mWX,"TreeCtrl",rb_cWXControl);
    rb_define_alloc_func(rb_cWXTreeCtrl,_alloc);

    rb_define_method(rb_cWXTreeCtrl,"initialize",RUBY_METHOD_FUNC(_initialize),-1);

    rb_define_method(rb_cWXTreeCtrl,"root",RUBY_METHOD_FUNC(_root),-1);

    rb_define_attr_method(rb_cWXTreeCtrl,"indent",_getIndent,_setIndent);
    rb_define_attr_method(rb_cWXTreeCtrl,"spacing",_getSpacing,_setSpacing);

    rb_define_attr_method(rb_cWXTreeCtrl,"image_list",_getImageList,_setImageList);
    rb_define_attr_method(rb_cWXTreeCtrl,"state_image_list",_getStateImageList,_setStateImageList);

    rb_define_attr_method(rb_cWXTreeCtrl,"selection",_getSelection,_setSelection);


    registerInfo<wxTreeCtrl>(rb_cWXTreeCtrl);

    rb_cWXTreeCtrlItem = rb_define_class_under(rb_cWXTreeCtrl,"Item",rb_cObject);
    rb_undef_alloc_func(rb_cWXTreeCtrlItem);

    {

    using namespace Item;
    rb_define_attr_method(rb_cWXTreeCtrlItem,"state",_getState,_setState);
    rb_define_attr_method(rb_cWXTreeCtrlItem,"bold",_getBold,_setBold);
    rb_define_attr_method(rb_cWXTreeCtrlItem,"text",_getText,_setText);
    rb_define_attr_method(rb_cWXTreeCtrlItem,"font",_getFont,_setFont);
    rb_define_attr_method(rb_cWXTreeCtrlItem,"text_color",_getTextColour,_setTextColour);
    rb_define_attr_method(rb_cWXTreeCtrlItem,"background_color",_getBackgroundColour,_setBackgroundColour);

    rb_define_method(rb_cWXTreeCtrlItem,"each",RUBY_METHOD_FUNC(_each),0);
    rb_define_method(rb_cWXTreeCtrlItem,"<=>",RUBY_METHOD_FUNC(_compare),1);
    rb_include_module(rb_cWXTreeCtrlItem,rb_mEnumerable);
    rb_include_module(rb_cWXTreeCtrlItem,rb_mComparable);

    rb_define_method(rb_cWXTreeCtrlItem,"next_sibling",RUBY_METHOD_FUNC(_GetNextSibling),0);
    rb_define_method(rb_cWXTreeCtrlItem,"prev_sibling",RUBY_METHOD_FUNC(_GetPrevSibling),0);


    rb_define_method(rb_cWXTreeCtrlItem,"delete",RUBY_METHOD_FUNC(_Delete),0);

    rb_define_method(rb_cWXTreeCtrlItem,"append",RUBY_METHOD_FUNC(_AppendItem),-1);

    }

    rb_cWXTreeCtrlEvent = rb_define_class_under(rb_cWXEvent,"TreeCtrl",rb_cWXEvent);
    registerEventType<wxTreeEvent>("tree_begin_drag", wxEVT_TREE_BEGIN_DRAG, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_begin_rdrag", wxEVT_TREE_BEGIN_RDRAG, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_begin_label_edit", wxEVT_TREE_BEGIN_LABEL_EDIT, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_end_label_edit", wxEVT_TREE_END_LABEL_EDIT, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_delete_item", wxEVT_TREE_DELETE_ITEM, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_get_info", wxEVT_TREE_GET_INFO, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_set_info", wxEVT_TREE_SET_INFO, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_item_expanded", wxEVT_TREE_ITEM_EXPANDED, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_item_expanding", wxEVT_TREE_ITEM_EXPANDING, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_item_collapsed", wxEVT_TREE_ITEM_COLLAPSED, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_item_collaping", wxEVT_TREE_ITEM_COLLAPSING, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_sel_changed", wxEVT_TREE_SEL_CHANGED, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_sel_changing", wxEVT_TREE_SEL_CHANGING, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_key_down", wxEVT_TREE_KEY_DOWN, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_item_activated", wxEVT_TREE_ITEM_ACTIVATED, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_item_right_click", wxEVT_TREE_ITEM_RIGHT_CLICK, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_item_middle_click", wxEVT_TREE_ITEM_MIDDLE_CLICK, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_end_drag", wxEVT_TREE_END_DRAG, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_state_image_click", wxEVT_TREE_STATE_IMAGE_CLICK, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_item_gettooltip", wxEVT_TREE_ITEM_GETTOOLTIP, rb_cWXTreeCtrlEvent);
    registerEventType<wxTreeEvent>("tree_item_menu", wxEVT_TREE_ITEM_MENU, rb_cWXTreeCtrlEvent);


    using namespace Event;
    rb_define_attr_method(rb_cWXTreeCtrlEvent,"label",_getLabel,_setLabel);
    rb_define_attr_method(rb_cWXTreeCtrlEvent,"tooltip",_getToolTip,_setToolTip);
    rb_define_attr_method(rb_cWXTreeCtrlEvent,"point",_getPoint,_setPoint);
    rb_define_attr_method(rb_cWXTreeCtrlEvent,"item",_GetItem,_SetItem);
    rb_define_attr_method(rb_cWXTreeCtrlEvent,"old_item",_GetOldItem,_SetOldItem);
#endif
}