void mmCategDialog::fillControls()
{
    m_treeCtrl->DeleteAllItems();
    root_ = m_treeCtrl->AddRoot(_("Categories"));
    selectedItemId_ = root_;
    m_treeCtrl->SetItemBold(root_, true);
    m_treeCtrl->SetFocus();
    NormalColor_ = m_treeCtrl->GetItemTextColour(root_);
    bool show_hidden_categs = Model_Setting::instance().GetBoolSetting("SHOW_HIDDEN_CATEGS", true);
    m_cbShowAll->SetValue(show_hidden_categs);

    const auto &categories = Model_Category::instance().all();
    for (const Model_Category::Data& category : categories)
    {
        wxTreeItemId maincat;
        bool bShow = categShowStatus(category.CATEGID, -1);
        if (m_cbShowAll->IsChecked() || bShow || category.CATEGID == m_init_selected_categ_id)
        {
            maincat = m_treeCtrl->AppendItem(root_, category.CATEGNAME);
            Model_Subcategory::Data subcat;
            m_treeCtrl->SetItemData(maincat, new mmTreeItemCateg(category, subcat));
            if (!bShow)
                m_treeCtrl->SetItemTextColour(maincat, wxColour("GREY"));

            for (const auto &sub_category : Model_Category::sub_category(category))
            {
                bShow = categShowStatus(category.CATEGID, sub_category.SUBCATEGID);
                if (m_cbShowAll->IsChecked() || bShow || sub_category.SUBCATEGID == m_init_selected_subcateg_id)
                {
                    wxTreeItemId subcateg = m_treeCtrl->AppendItem(maincat, sub_category.SUBCATEGNAME);
                    m_treeCtrl->SetItemData(subcateg, new mmTreeItemCateg(category, sub_category));
                    if (!bShow) 
                        m_treeCtrl->SetItemTextColour(subcateg, wxColour("GREY"));

                    if (m_categ_id == category.CATEGID && m_subcateg_id == sub_category.SUBCATEGID)
                        selectedItemId_ = subcateg;
                }
            }
            m_treeCtrl->SortChildren(maincat);
        }
    }
    m_treeCtrl->Expand(root_);
    bool expand_categs_tree = Model_Setting::instance().GetBoolSetting("EXPAND_CATEGS_TREE", false);
    if (expand_categs_tree) m_treeCtrl->ExpandAll();
    m_cbExpand->SetValue(expand_categs_tree);

    m_treeCtrl->SortChildren(root_);
    m_treeCtrl->SelectItem(selectedItemId_);
    m_treeCtrl->EnsureVisible(selectedItemId_);

    m_buttonSelect->Disable();
    m_buttonEdit->Disable();
    m_buttonAdd->Enable();
    m_buttonRelocate->Enable(m_enable_relocate);

    setTreeSelection(m_categ_id, m_subcateg_id);
}
void mmCategDialog::setTreeSelection(int &category_id, int &subcategory_id)
{
    const auto &categories = Model_Category::instance().find(Model_Category::CATEGID(category_id));
    if (!categories.empty())
    {
        Model_Category::Data *category = Model_Category::instance().get(category_id);
        Model_Subcategory::Data *subcategory = (subcategory_id != -1 ? Model_Subcategory::instance().get(subcategory_id) : 0);
        wxString categoryName = "", subCategoryName = "";
        if (category) categoryName = category->CATEGNAME;
        if (subcategory) subCategoryName = subcategory->SUBCATEGNAME;
        setTreeSelection(categoryName, subCategoryName);
    }
}