Files
wxWidgets/utils/configtool/src/configtree.cpp

229 lines
7.2 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: configtree.h
// Purpose: wxWidgets Configuration Tool tree class
// Author: Julian Smart
// Modified by:
// Created: 2003-06-03
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence:
/////////////////////////////////////////////////////////////////////////////
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "configtree.h"
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/cshelp.h"
#include "wx/imaglist.h"
// Include XPM icons
#include "bitmaps/closedfolder.xpm"
#include "bitmaps/closedfolder_dis.xpm"
#include "bitmaps/checked.xpm"
#include "bitmaps/checked_dis.xpm"
#include "bitmaps/unchecked.xpm"
#include "bitmaps/unchecked_dis.xpm"
#include "bitmaps/radioon.xpm"
#include "bitmaps/radioon_dis.xpm"
#include "bitmaps/radiooff.xpm"
#include "bitmaps/radiooff_dis.xpm"
#include "bitmaps/checkedfolder.xpm"
#include "bitmaps/checkedfolder_dis.xpm"
#include "bitmaps/uncheckedfolder.xpm"
#include "bitmaps/uncheckedfolder_dis.xpm"
#include "bitmaps/radiofolderon.xpm"
#include "bitmaps/radiofolderon_dis.xpm"
#include "bitmaps/radiofolderoff.xpm"
#include "bitmaps/radiofolderoff_dis.xpm"
#include "configtree.h"
#include "configtooldoc.h"
#include "configtoolview.h"
#include "wxconfigtool.h"
#include "mainframe.h"
/*
* ctConfigTreeCtrl
*/
IMPLEMENT_CLASS(ctConfigTreeCtrl, wxTreeCtrl)
BEGIN_EVENT_TABLE(ctConfigTreeCtrl, wxTreeCtrl)
EVT_MOUSE_EVENTS(ctConfigTreeCtrl::OnMouseEvent)
EVT_CHAR(ctConfigTreeCtrl::OnKeyDown)
EVT_TREE_SEL_CHANGED(wxID_ANY, ctConfigTreeCtrl::OnSelChanged)
EVT_HELP(wxID_ANY, ctConfigTreeCtrl::OnHelp)
END_EVENT_TABLE()
ctConfigTreeCtrl::ctConfigTreeCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pt,
const wxSize& sz, long style):
wxTreeCtrl(parent, id, pt, sz, style)
{
LoadIcons();
m_contextMenu = NULL;
m_contextMenu = new wxMenu;
m_contextMenu->Append(ctID_TREE_PASTE_BEFORE, _("Paste &before this option"));
m_contextMenu->Append(ctID_TREE_PASTE_AFTER, _("Paste &after this option"));
m_contextMenu->Append(ctID_TREE_PASTE_AS_CHILD, _("Paste as &child of this option"));
m_contextMenu->AppendSeparator();
m_contextMenu->Append(ctID_TREE_COPY, _("C&opy"));
m_contextMenu->Append(ctID_TREE_CUT, _("Cu&t"));
SetHelpText(_("This shows configuration settings that you can enable and disable."));
}
// Load the icons and initialize the tree
void ctConfigTreeCtrl::LoadIcons()
{
m_imageList = new wxImageList(16, 16, true);
m_iconTable.SetImageList(m_imageList);
SetImageList(m_imageList);
m_iconTable.AddInfo(_T("Group"), wxIcon(closedfolder_xpm), 0, true);
m_iconTable.AddInfo(_T("Group"), wxIcon(closedfolder_dis_xpm), 0, false);
m_iconTable.AddInfo(_T("Checkbox"), wxIcon(checked_xpm), 0, true);
m_iconTable.AddInfo(_T("Checkbox"), wxIcon(checked_dis_xpm), 0, false);
m_iconTable.AddInfo(_T("Checkbox"), wxIcon(unchecked_xpm), 1, true);
m_iconTable.AddInfo(_T("Checkbox"), wxIcon(unchecked_dis_xpm), 1, false);
m_iconTable.AddInfo(_T("CheckGroup"), wxIcon(checkedfolder_xpm), 0, true);
m_iconTable.AddInfo(_T("CheckGroup"), wxIcon(checkedfolder_dis_xpm), 0, false);
m_iconTable.AddInfo(_T("CheckGroup"), wxIcon(uncheckedfolder_xpm), 1, true);
m_iconTable.AddInfo(_T("CheckGroup"), wxIcon(uncheckedfolder_dis_xpm), 1, false);
m_iconTable.AddInfo(_T("RadioGroup"), wxIcon(radiofolderon_xpm), 0, true);
m_iconTable.AddInfo(_T("RadioGroup"), wxIcon(radiofolderon_dis_xpm), 0, false);
m_iconTable.AddInfo(_T("RadioGroup"), wxIcon(radiofolderoff_xpm), 1, true);
m_iconTable.AddInfo(_T("RadioGroup"), wxIcon(radiofolderoff_dis_xpm), 1, false);
m_iconTable.AddInfo(_T("Radiobutton"), wxIcon(radioon_xpm), 0, true);
m_iconTable.AddInfo(_T("Radiobutton"), wxIcon(radioon_dis_xpm), 0, false);
m_iconTable.AddInfo(_T("Radiobutton"), wxIcon(radiooff_xpm), 1, true);
m_iconTable.AddInfo(_T("Radiobutton"), wxIcon(radiooff_dis_xpm), 1, false);
}
ctConfigTreeCtrl::~ctConfigTreeCtrl()
{
SetImageList(NULL);
delete m_imageList;
delete m_contextMenu;
}
void ctConfigTreeCtrl::OnSelChanged(wxTreeEvent& WXUNUSED(event))
{
ctConfigToolDoc* doc = wxGetApp().GetMainFrame()->GetDocument();
if (doc)
{
ctConfigToolHint hint(NULL, ctSelChanged);
doc->UpdateAllViews(NULL, & hint);
}
}
void ctConfigTreeCtrl::OnMouseEvent(wxMouseEvent& event)
{
int flags = 0;
wxTreeItemId item = HitTest(wxPoint(event.GetX(), event.GetY()), flags);
if (event.LeftDown())
{
if (flags & wxTREE_HITTEST_ONITEMICON)
{
ctTreeItemData* data = (ctTreeItemData*) GetItemData(item);
ctConfigToolDoc* doc = wxGetApp().GetMainFrame()->GetDocument();
if (doc)
{
ctConfigToolView* view = wxDynamicCast(doc->GetFirstView(), ctConfigToolView);
if (view)
view->OnIconLeftDown(this, data->GetConfigItem());
}
}
}
else if (event.RightDown())
{
if ((flags & wxTREE_HITTEST_ONITEMBUTTON) ||
(flags & wxTREE_HITTEST_ONITEMICON) ||
(flags & wxTREE_HITTEST_ONITEMINDENT) ||
(flags & wxTREE_HITTEST_ONITEMLABEL))
{
ctTreeItemData* data = (ctTreeItemData*) GetItemData(item);
ctConfigToolDoc* doc = wxGetApp().GetMainFrame()->GetDocument();
if (doc && data)
{
m_contextItem = data->GetConfigItem();
PopupMenu(m_contextMenu, event.GetX(), event.GetY());
}
}
}
event.Skip();
}
void ctConfigTreeCtrl::OnKeyDown(wxKeyEvent& event)
{
wxTreeItemId id = GetSelection();
if (event.GetKeyCode() == WXK_SPACE)
{
if (id.IsOk())
{
ctConfigItem* item = ((ctTreeItemData*) GetItemData(id))->GetConfigItem();
ctConfigToolDoc* doc = wxGetApp().GetMainFrame()->GetDocument();
if (doc)
{
ctConfigToolView* view = wxDynamicCast(doc->GetFirstView(), ctConfigToolView);
if (view)
view->OnIconLeftDown(this, item);
}
}
}
else
{
event.Skip();
}
}
// Show help for this window
void ctConfigTreeCtrl::OnHelp(wxHelpEvent& event)
{
wxPoint pt = ScreenToClient(event.GetPosition());
int flags = 0;
wxTreeItemId id = HitTest(pt, flags);
ctTreeItemData *itemData = (ctTreeItemData*) GetItemData(id);
wxHelpProvider *helpProvider = wxHelpProvider::Get();
if ( helpProvider && itemData)
{
ctConfigItem* item = itemData->GetConfigItem();
if (item)
{
wxString helpTopic = item->GetPropertyString(wxT("help-topic"));
if (!helpTopic.IsEmpty())
{
wxGetApp().GetReferenceHelpController().DisplaySection(helpTopic);
return;
}
}
}
event.Skip();
}
ctTreeItemData::~ctTreeItemData()
{
if (m_configItem) delete m_configItem;
}