📄 xhtmltreetestdlg.cpp
字号:
// XHtmlTreeTestDlg.cpp : implementation file
//
#include "stdafx.h"
#include "XHtmlTreeTest.h"
#include "XHtmlTreeTestDlg.h"
#include "about.h"
#include "ResourceTextFile.h"
#include "XString.h"
#include "XHtmlDraw.h"
#include "XMessageBox.h"
#include "FindDialog.h"
#include "ColorDlg.h"
#include "XNamedColors.h"
#include "PPTooltip.h"
#include "XTrace.h"
#include "XmlDocument.h" // not compatible with windowsx.h
#include "mmsystem.h"
// from windowsx.h
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
typedef CXBreadCrumbBar::XHTMLDRAW_APP_COMMAND APP_COMMAND;
#pragma warning(disable : 4996) // disable bogus deprecation warning
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma message("automatic link to WINMM.LIB")
#pragma comment(lib, "winmm.lib")
//=============================================================================
// define app command message used by <a href=\"app:WM_APP_COMMAND\">
//=============================================================================
#define WM_APP_COMMAND_1 (WM_APP+100)
#define WM_APP_COMMAND_2 (WM_APP+101)
#define WM_APP_COMMAND_SEL (WM_APP+102)
//=============================================================================
BEGIN_MESSAGE_MAP(CXHtmlTreeTestDlg, CDialog)
//=============================================================================
//{{AFX_MSG_MAP(CXHtmlTreeTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_CONTEXTMENU()
ON_WM_TIMER()
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_UPDATE, OnUpdate)
ON_BN_CLICKED(IDC_COLLAPSE_ALL, OnCollapseAll)
ON_BN_CLICKED(IDC_EXPAND_ALL, OnExpandAll)
ON_BN_CLICKED(IDC_CHECKBOXES, OnUpdateTree)
ON_BN_CLICKED(IDC_SHOW_CHECKED, OnShowChecked)
ON_BN_CLICKED(IDC_FIND, OnFind)
ON_BN_CLICKED(IDC_CHECK_ALL, OnCheckAll)
ON_BN_CLICKED(IDC_COLORS, OnColors)
ON_BN_CLICKED(IDC_LOG, OnLog)
ON_BN_CLICKED(IDC_SMART_CHECKBOXES, OnUpdateTree)
ON_BN_CLICKED(IDC_HTML, OnUpdateTree)
ON_BN_CLICKED(IDC_STRIP_HTML, OnUpdateTree)
ON_BN_CLICKED(IDC_IMAGES, OnUpdateTree)
ON_BN_CLICKED(IDC_READONLY, OnUpdateTree)
ON_BN_CLICKED(ID_FINDNEXT, FindNext)
ON_BN_CLICKED(ID_FINDPREV, FindPrev)
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
ON_COMMAND(ID_DISABLE, OnDisable)
ON_COMMAND(ID_ENABLE, OnEnable)
ON_COMMAND(ID_FIND, OnFind)
ON_COMMAND(ID_TREE_SEPARATOR, OnSeparator)
ON_COMMAND(ID_TREE_DELETE, OnDelete)
ON_NOTIFY(NM_RCLICK, IDC_TREE1, OnRclickTree1)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree1)
ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE1, OnBeginlabeleditTree1)
ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE1, OnEndlabeleditTree1)
//}}AFX_MSG_MAP
ON_REGISTERED_MESSAGE(WM_XHTMLTREE_CHECKBOX_CLICKED, OnCheckbox)
ON_REGISTERED_MESSAGE(WM_XHTMLTREE_ITEM_EXPANDED, OnExpanded)
ON_REGISTERED_MESSAGE(WM_CHECKEDITEMSDIALOG_CLOSING, OnCheckedItemsDialogClosing)
ON_REGISTERED_MESSAGE(WM_XHTMLTREE_DISPLAY_TOOLTIP, OnDisplayTreeToolTip)
ON_REGISTERED_MESSAGE(WM_XHTMLTREE_INIT_TOOLTIP, OnInitTreeToolTip)
#ifdef XHTMLDRAGDROP
#ifdef XHTMLTREE_DEMO
ON_REGISTERED_MESSAGE(WM_XHTMLTREE_SCROLL_SPEED, OnScrollSpeed)
#endif // XHTMLTREE_DEMO
ON_REGISTERED_MESSAGE(WM_XHTMLTREE_BEGIN_DRAG, OnBeginDrag)
ON_REGISTERED_MESSAGE(WM_XHTMLTREE_END_DRAG, OnEndDrag)
ON_REGISTERED_MESSAGE(WM_XHTMLTREE_DROP_HOVER, OnDropHover)
#endif // XHTMLDRAGDROP
ON_MESSAGE(WM_APP_COMMAND_SEL, OnAppCommandSel)
ON_MESSAGE(WM_APP_COMMAND_1, OnAppCommand1)
ON_MESSAGE(WM_APP_COMMAND_2, OnAppCommand2)
END_MESSAGE_MAP()
//=============================================================================
CXHtmlTreeTestDlg::CXHtmlTreeTestDlg(CWnd* pParent /*=NULL*/, int nInput /*= 0*/)
: CDialog(CXHtmlTreeTestDlg::IDD, pParent)
//=============================================================================
{
//{{AFX_DATA_INIT(CXHtmlTreeTestDlg)
m_bCheckBoxes = TRUE;
m_bSmartCheckBoxes = TRUE;
m_bHtml = TRUE;
m_bStripHtml = FALSE;
m_bImages = TRUE;
m_bReadOnly = FALSE;
m_bCheckAll = TRUE;
m_nInput = nInput;
m_nLineNo = 1;
m_nCount = 0;
m_pCheckedItemsDlg = NULL;
m_strResourceName = _T("");
m_strFind = _T("");
m_nFindStart = 0;
m_nFindDir = 1;
m_bFindCheck = FALSE;
m_rectFind = CRect(0,0,0,0);
m_rgbText = GetSysColor(COLOR_WINDOWTEXT);
m_rgbBackground = GetSysColor(COLOR_WINDOW);
m_ptCheckedItems = CPoint(0,0);
m_bLog = TRUE;
m_hTrackItem = 0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
//=============================================================================
void CXHtmlTreeTestDlg::DoDataExchange(CDataExchange* pDX)
//=============================================================================
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXHtmlTreeTestDlg)
DDX_Control(pDX, IDC_SCROLL1, m_ScrollSpeed1);
DDX_Control(pDX, IDC_SCROLL2, m_ScrollSpeed2);
DDX_Control(pDX, IDC_SCROLL3, m_ScrollSpeed3);
DDX_Control(pDX, IDC_BREAD_CRUMB, m_BreadCrumb);
DDX_Control(pDX, IDC_STATIC_ITEM_INFO, m_ItemInfo);
DDX_Control(pDX, IDC_CHECK_ALL, m_btnCheckAll);
DDX_Control(pDX, IDC_COLLAPSE_ALL, m_btnCollapseAll);
DDX_Control(pDX, IDC_EXPAND_ALL, m_btnExpandAll);
DDX_Control(pDX, IDC_TREE_INFO, m_TreeInfo);
DDX_Control(pDX, IDC_ITEMIMAGE, m_ItemImage);
DDX_Control(pDX, IDC_NOSEPARATORS, m_NoSeparators);
DDX_Control(pDX, IDC_NOCHILDREN, m_NoChildren);
DDX_Control(pDX, IDC_NOCHECKED, m_NoChecked);
DDX_Control(pDX, IDC_ISCHECKED, m_IsChecked);
DDX_Control(pDX, IDC_EXPANDED, m_Expanded);
DDX_Control(pDX, IDC_EDIT1, m_Edit);
DDX_Control(pDX, IDC_LIST1, m_List);
DDX_Control(pDX, IDC_TREE1, m_Tree);
DDX_Check(pDX, IDC_CHECKBOXES, m_bCheckBoxes);
DDX_Check(pDX, IDC_SMART_CHECKBOXES, m_bSmartCheckBoxes);
DDX_Check(pDX, IDC_HTML, m_bHtml);
DDX_Check(pDX, IDC_STRIP_HTML, m_bStripHtml);
DDX_Check(pDX, IDC_IMAGES, m_bImages);
DDX_Check(pDX, IDC_READONLY, m_bReadOnly);
DDX_Check(pDX, IDC_LOG, m_bLog);
//}}AFX_DATA_MAP
}
//=============================================================================
BOOL CXHtmlTreeTestDlg::OnInitDialog()
//=============================================================================
{
CDialog::OnInitDialog();
m_hAccel = LoadAccelerators(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_ACCELERATOR));
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CreateTooltips(); // set up tooltips for app
m_List.SetContextMenuId(IDR_XLISTBOX);
m_List.Printf(CXListBox::Blue, CXListBox::White, 0, _T("XHtmlTreeTest v1.6"));
m_List.Printf(CXListBox::Blue, CXListBox::White, 0, _T(""));
#ifdef XHTMLHTML
CXHtmlDraw::XHTMLDRAW_APP_COMMAND AppCommands[] =
{
{ m_hWnd, WM_APP_COMMAND_1, 123, _T("WM_APP_COMMAND1") },
{ m_hWnd, WM_APP_COMMAND_2, 456, _T("WM_APP_COMMAND2") },
};
m_Tree.m_Links.SetAppCommands(AppCommands,
sizeof(AppCommands)/sizeof(AppCommands[0]));
#endif
// set + / - buttons
m_btnCheckAll.SetGlyph(0, 12, FW_NORMAL, _T("Arial"), 0xD7);
m_btnExpandAll.SetGlyph(0, 10, FW_NORMAL, _T("Arial"), 0x2B);
m_btnCollapseAll.SetGlyph(0, 16, FW_NORMAL, _T("Arial"), 0x2D);
GetDlgItem(IDC_UPDATE)->EnableWindow(FALSE);
m_Edit.EnableWindow(FALSE);
if (m_Tree.GetHasCheckBoxes())
m_bCheckBoxes = TRUE;
CButton *pBtn = (CButton*) GetDlgItem(IDC_CHECKBOXES);
pBtn->SetCheck(m_bCheckBoxes);
// create image list for level 0 items
m_Images.Create(IDB_DOGS, 16, 9, RGB(0,255,255));
m_Tree.SetImageList(&m_Images, TVSIL_NORMAL);
m_BreadCrumb.SetWindowText(_T(""));
UpdateTree(FALSE);
DumpInfo(NULL);
#ifdef XHTMLDRAGDROP
OnScrollSpeed(0, 0);
#else
m_ScrollSpeed1.ShowWindow(FALSE);
m_ScrollSpeed2.ShowWindow(FALSE);
m_ScrollSpeed3.ShowWindow(FALSE);
#endif // XHTMLDRAGDROP
//CXNamedColors nc;
//nc.Dump(_T("namedcolors.html"));
return TRUE; // return TRUE unless you set the focus to a control
}
//=============================================================================
void CXHtmlTreeTestDlg::CreateTooltips()
//=============================================================================
{
m_ToolTips.Create(this, TTS_ALWAYSTIP);
::SendMessage(m_ToolTips.m_hWnd, TTM_SETMAXTIPWIDTH, 0, SHRT_MAX);
m_ToolTips.AddTool(GetDlgItem(IDC_CHECK_ALL),
_T("Toggle checkbox for all items"));
m_ToolTips.AddTool(GetDlgItem(IDC_EXPAND_ALL),
_T("Expand all items"));
m_ToolTips.AddTool(GetDlgItem(IDC_COLLAPSE_ALL),
_T("Collapse all items"));
m_ToolTips.AddTool(GetDlgItem(IDC_SCROLL1),
_T("Low speed indicator for dragging scroll"));
m_ToolTips.AddTool(GetDlgItem(IDC_SCROLL2),
_T("Medium speed indicator for dragging scroll"));
m_ToolTips.AddTool(GetDlgItem(IDC_SCROLL3),
_T("High speed indicator for dragging scroll"));
}
//=============================================================================
void CXHtmlTreeTestDlg::LoadXmlFileFromResource(LPCTSTR lpszResource)
//=============================================================================
{
//m_Tree.LoadXmlFromFile(_T("D:\\CP Articles\\XHtmlTreeTest\\1.0\\src\\dogs.xml"), CXHtmlTree::NoConvertAction);
//m_Tree.LoadXmlFromFile(_T("D:\\CP Articles\\XHtmlTreeTest\\1.0\\vs2005\\utf16le.xml"), CXHtmlTree::NoConvertAction);
//m_Tree.LoadXmlFromFile(_T("D:\\CP Articles\\XHtmlTreeTest\\1.0\\vs2005\\utf16le.xml"), CXHtmlTree::ConvertToAnsi);
//return;
m_strResourceName = lpszResource;
#ifdef XHTMLXML
CXHtmlTree::ConvertAction eConvertAction = CXHtmlTree::NoConvertAction;
#ifdef UNICODE
eConvertAction = CXHtmlTree::ConvertToUnicode;
#endif
m_Tree.LoadXmlFromResource(NULL, lpszResource, _T("TEXT"), eConvertAction);
m_Tree.SaveXml(m_Tree.GetRootItem(), _T("save.xml"), TRUE); // test of saving XML
#else
AfxMessageBox(_T("XML is currently disabled.\r\n\r\n")
_T("Define XHTMLXML and re-compile to enable XML.\r\n"));
#endif
m_nCount = m_Tree.GetXmlCount();
}
//=============================================================================
void CXHtmlTreeTestDlg::LoadTextFileFromResource(LPCTSTR lpszResource,
int nRoot /*=0*/)
//=============================================================================
{
TRACE(_T("in CXHtmlTreeTestDlg::LoadTextFileFromResource: %s\n"), lpszResource);
m_strResourceName = lpszResource;
CResourceTextFile::ConvertAction eConvertAction =
CResourceTextFile::NoConvertAction;
#ifdef _UNICODE
eConvertAction = CResourceTextFile::ConvertToUnicode;
#endif
CResourceTextFile rtf;
if (!rtf.Open(NULL, lpszResource, _T("TEXT"), eConvertAction))
{
CString msg;
msg.Format(_T("Can't find resource %s"), lpszResource);
AfxMessageBox(msg);
return;
}
//HTREEITEM hItems[100];
HTREEITEM hParent[5] = { 0 };
CString strTitle = _T("<font color=\"dodgerblue\">Dogs of the World</font>");
CString strRoot = _T("");
if (nRoot)
strRoot.Format(_T(" %d"), nRoot);
strTitle += strRoot;
hParent[0] = m_Tree.InsertItem(strTitle, TV_NOIMAGE, TV_NOIMAGE);
int nLevel = 0;
// nLevel = 0: root
// 1: dog category
// 2: dog breed
// 3: breed sub-list
BOOL bSubList = FALSE;
int nImage = 1;
int nItem = 1;
TCHAR szLine[1000];
while (!rtf.IsAtEOF())
{
int index = 0;
rtf.ReadLine(szLine, sizeof(szLine)/sizeof(TCHAR)-2);
// hack to stop display
if (_tcscmp(szLine, _T("...")) == 0)
break;
_tcsrtrim(szLine, NULL);
XHTMLTREEDATA xhtd;
if (szLine[0] == _T('\0'))
{
// line is empty - back to level 0
nLevel = 0;
bSubList = FALSE;
continue;
}
else if (szLine[0] == _T(';'))
{
// comment line - ignore
continue;
}
else if (szLine[0] == _T(' '))
{
// line begins with space - this is sublist
if (!bSubList)
nLevel++;
bSubList = TRUE;
index = 1; // skip space
}
else
{
// line does not begin with space - not a sublist
if (bSubList)
nLevel--;
bSubList = FALSE;
}
TRACE(_T("szLine=<%s>\n"), szLine);
int nNoteWidth = 0;
CString strNote = _T("");
TCHAR *cp = _tcschr(szLine, _T('~'));
if (cp)
{
*cp++ = _T('\0');
TCHAR digit = *cp++;
if (digit != _T('0'))
xhtd.bChecked = TRUE;
if (*cp++ == _T('~'))
{
digit = *cp++;
if (digit != _T('1'))
xhtd.bEnabled = FALSE;
}
if (*cp == _T('~'))
{
cp++;
nNoteWidth = _ttoi(cp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -