Ejemplo n.º 1
0
void KGTreeCtrl::SortTree(HTREEITEM hTreeItem)
{
	HTREEITEM hSubItem = NULL;
	if (!hTreeItem)
	{
		hTreeItem = GetRootItem();
//		hTreeItem = GetChildItem(TVI_ROOT);
		KG_PROCESS_ERROR(hTreeItem);
		SortChildren(NULL);
	}
	hSubItem = hTreeItem;
	SortChildren(hSubItem);
	HTREEITEM BrotherItem = hSubItem;
	if (ItemHasChildren(hSubItem))
	{
		hSubItem = GetChildItem(hSubItem);
		SortTree(hSubItem);
	}
	hSubItem = GetNextSiblingItem(BrotherItem);
	KG_PROCESS_ERROR(hSubItem);

	SortTree(hSubItem);
Exit0:
	return ;
}
Ejemplo n.º 2
0
// Recursively sort the entire tree
void CMultiSelTreeCtrl::SortTree(HTREEITEM topNode/*=NULL*/, HTREEITEM parentNode/*=NULL*/)
{
	HTREEITEM item;

	// Sort things at the this level
	if (parentNode && (m_SortByExtension || m_SortByResolveStat 
					|| m_SortByAction    || m_SortByFilename))
	{
		TVSORTCB tvsortcb;
		tvsortcb.hParent = topNode;
		tvsortcb.lParam = (m_SortByResolveStat ? 2 : 0) + (m_SortByExtension ? 1 : 0) 
						+ (m_SortByFilename ? 8 : 0)    + (m_SortByAction ? 4 : 0);
		tvsortcb.lpfnCompare = SortTreeCB;
		SortChildrenCB(&tvsortcb);
	}
	else 
		SortChildren(topNode);

	// Get the first item at this level
	if(topNode == NULL)
		item=GetNextItem(TVI_ROOT, TVGN_ROOT);
	else
		item=GetChildItem(topNode);   // Get first child

	// Recurse all items that have children
	while(item != NULL)
	{
		if(ItemHasChildren(item))
			SortTree(item, topNode);
		item=GetNextSiblingItem(item);
	}
}
Ejemplo n.º 3
0
void InfoFrom::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

	CRect m_wndRect;
	GetClientRect(&m_wndRect);
	CRect m_headerRect;


	// create the header
	{
		m_headerRect.left = m_headerRect.top = -1;
		m_headerRect.right = m_wndRect.Width();

		m_treeList.m_wndHeader.Create(WS_CHILD | WS_VISIBLE | HDS_BUTTONS | HDS_HORZ, m_headerRect, this, ID_TREE_LIST_HEADER);
	}

	static CFont font;
	font.CreateFont(100, 0, 0, 0, FW_NORMAL, FALSE,FALSE,FALSE,GB2312_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH|FF_MODERN,"宋体");
	//m_treeList.m_wndHeader.SetFont(&font);
	m_treeList.SetFont(&font);

	CSize textSize;
	// set header's pos, dimensions and image list
	{
		CDC *pDC = m_treeList.m_wndHeader.GetDC();
		pDC->SelectObject(&m_treeList.m_headerFont);
		textSize = pDC->GetTextExtent("A");

		m_treeList.m_wndHeader.SetWindowPos(&wndTop, 0, 0, m_headerRect.Width(), textSize.cy+4, SWP_SHOWWINDOW);

		//m_treeList.m_cImageList.Create(IDB_HEADER, 16, 10, 0);
		//m_treeList.m_wndHeader.SetImageList(&m_treeList.m_cImageList);

		m_treeList.m_wndHeader.UpdateWindow();
	}

	CRect m_treeListRect;
	// create the tree itself
	{
		GetClientRect(&m_wndRect);

		m_treeListRect.left=0;
		m_treeListRect.top = textSize.cy+4;
		m_treeListRect.right = m_headerRect.Width()-5;
		m_treeListRect.bottom = m_wndRect.Height()-GetSystemMetrics(SM_CYHSCROLL)-4;

		m_treeList.Create(WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS, m_treeListRect, this, ID_TREE_LIST_CTRL);
	}

	m_treeList.InsertColumn(0, "名称", LVCFMT_LEFT, 360);
	m_treeList.InsertColumn(1, "详细内容", LVCFMT_LEFT,  360);

	m_init = TRUE;
	SortTree(0, TRUE, m_treeList.GetRootItem());
}
void Comparer::Compare(Tree *tree1, Tree *tree2)
{
	std::multiset<Node *, NCompare> SNodes1, SNodes2;
	std::multiset<Node *, NCompare>::iterator SNIter1, SNIter2;
	std::vector<Node *> child;
	element e1, e2;
	bool delpair=false;
	std::pair<std::multiset<Node *, NCompare>::iterator, std::multiset<Node *, NCompare>::iterator> p;
	SortTree(tree1->getTRoot(), SNodes1);
	SortTree(tree2->getTRoot(), SNodes2);
	SNodes1.erase(tree1->getTRoot());
	SNodes2.erase(tree2->getTRoot());
	for (SNIter1 = SNodes1.begin(); SNIter1 != SNodes1.end(); SNIter1++)
	{

		p = SNodes2.equal_range(*SNIter1);

		//for (SNIter2 = SNodes2.begin(); SNIter2 != SNodes2.end(); SNIter2++)		
		for (SNIter2 = p.first; SNIter2 != p.second; SNIter2++)
		{
			
			if (IsSimilar(*SNIter1, *SNIter2))
			{
				delpair = true;
				similarnodes.push_back(std::make_pair(*SNIter1, *SNIter2));
			}
			else continue;

		}
			//similarnodes.push_back(std::make_pair(*SNIter1, *SNIter2));
			//delete children pairs
		child = (*SNIter1)->getChildren();
		if (delpair)
		{
			for (auto first : child)
				DeletePair(first);
			delpair = false;
		}
				
	}


}
Ejemplo n.º 5
0
void CMultiSelTreeCtrl::OnTimer(UINT nIDEvent) 
{
	CTreeCtrl::OnTimer(nIDEvent);
	if (nIDEvent == SORT_TIMER)
	{
		m_Timer = 0;
		::KillTimer(m_hWnd, SORT_TIMER);
		SortTree();
	}
}
void Comparer::SortTree(Node *p, std::multiset<Node *, NCompare> &setNodes)
{
	std::vector<Node *> temp;
	setNodes.insert(p);
	temp = p->getChildren();
	for (auto node : temp)
	{
		SortTree(node, setNodes);
	}
	temp.clear();
}
Ejemplo n.º 7
0
HTNode* CreatHFM(FILE *fp,short *n,WeightType *FileLength)
{
    HTNode *ht = NULL;
    int i,m,s1,s2;
    MyType ch;

    ht=(HTNode *)malloc( 2*N*sizeof(HTNode) );
    if(!ht) exit(1);

    for(i = 0;i < N;i++)
    {
        ht[i].weight = 0;
        ht[i].ch = (MyType)i;/*1-n号ch 为字符,初始化*/
    }
    /* 统计字符数量 */
    for(*FileLength = 0; !feof(fp) ;++(*FileLength) )
    {
        ch = fgetc(fp);//fread(&ch,1,1,fp);
        ht[ch].weight++;//printf("ht[%c].weight= %ld\n",0,ht[0].weight);
    }
    --(*FileLength);//去掉文件结束后的长度
    *n = SortTree(ht);
    m = *n*2-1;  //free(&ht[m+1]);
    //printf("叶子个数= %d\n",*n);//getchar();
    if(1 == *n)
    {
        ht[0].parent=1;
        return ht;
    }
    else if( 0 > *n)
        return NULL;

    for(i = m-1;i >= 0;i--)
    {
        ht[i].LChild = 0;
        ht[i].parent = 0;
        ht[i].RChild = 0;
    }
    /*	------------初始化完毕!对应算法步骤1---------*/
    for(i = *n;i < m;i++)    //创建非叶子结点,建哈夫曼树
    {  //在ht[0]~ht[i-1]的范围内选择两个parent为0且weight最小的结点,其序号分别赋值给s1、s2返回
        SelectMinTree(ht,i-1,&s1);
        ht[s1].parent=i;
        ht[i].LChild=s1;

        SelectMinTree(ht,i-1,&s2);
        ht[s2].parent=i;
        ht[i].RChild=s2;

        ht[i].weight=ht[s1].weight+ht[s2].weight;
    } /*哈夫曼树建立完毕*///	puts(" over^_^");

    return ht;
}
Ejemplo n.º 8
0
void SymbolTree::BuildTree(const wxFileName &fileName)
{
	// Clear the tree
	DeleteAllItems();
	m_items.clear();
	m_globalsNode = wxTreeItemId();
	m_prototypesNode = wxTreeItemId();
	m_macrosNode = wxTreeItemId();
	m_sortItems.clear();

	m_fileName = fileName;
	// Get the current tree
	m_tree = TagsManagerST::Get()->Load(m_fileName);
	if ( !m_tree ) {
		return;
	}

	// Add invisible root node
	wxTreeItemId root;
	root = AddRoot(fileName.GetFullName(), 15, 15);

	TreeWalker<wxString, TagEntry> walker(m_tree->GetRoot());

	// add three items here:
	// the globals node, the mcros and the prototype node
	m_globalsNode    = AppendItem(root, wxT("Global Functions and Variables"), 2, 2, new MyTreeItemData(wxT("Global Functions and Variables"), wxEmptyString));
	m_prototypesNode = AppendItem(root, wxT("Functions Prototypes"), 2, 2, new MyTreeItemData(wxT("Functions Prototypes"), wxEmptyString));
	m_macrosNode     = AppendItem(root, wxT("Macros"), 2, 2, new MyTreeItemData(wxT("Macros"), wxEmptyString));

	// Iterate over the tree and add items
	m_sortItems.clear();

	Freeze();
	for (; !walker.End(); walker++) {
		// Add the item to the tree
		TagNode* node = walker.GetNode();

		// Skip root node
		if (node->IsRoot())
			continue;

		// Add the node
		AddItem(node);
	}

	SortTree(m_sortItems);
	Thaw();

	//select the root node by default
	if (!(GetWindowStyleFlag() & wxTR_HIDE_ROOT)) {
		//root is visible, select it
		SelectItem(GetRootItem());
	}
}
Ejemplo n.º 9
0
BOOL InfoFrom::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
	HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam;	

	if((wParam == ID_TREE_LIST_HEADER) && (pHDN->hdr.code == HDN_ITEMCLICK))
	{
		int nCol = pHDN->iItem;

		BOOL bAscending = FALSE;

		if(m_treeList.m_wndHeader.GetItemImage(nCol)==-1)
			bAscending = TRUE;
		else
			if(m_treeList.m_wndHeader.GetItemImage(nCol)==1)
				bAscending = TRUE;

		for(int i=0;i<m_treeList.GetColumnsNum();i++)
		{
			m_treeList.m_wndHeader.SetItemImage(i, -1);
		}

		if(bAscending)
			m_treeList.m_wndHeader.SetItemImage(nCol, 0);
		else
			m_treeList.m_wndHeader.SetItemImage(nCol, 1);

		m_treeList.SortItems(nCol, bAscending, NULL);
		SortTree(nCol, bAscending, m_treeList.GetRootItem());

		m_treeList.UpdateWindow();
	}
	else
		if((wParam == ID_TREE_LIST_HEADER) && (pHDN->hdr.code == HDN_ITEMCHANGED))
		{
			int m_nPrevColumnsWidth = m_treeList.GetColumnsWidth();
			m_treeList.RecalcColumnsWidth();
			//ResetScrollBar();

			// in case we were at the scroll bar's end,
			// and some column's width was reduced,
			// update header's position (move to the right).
			CRect m_treeRect;
			m_treeList.GetClientRect(&m_treeRect);

			CRect m_headerRect;
			m_treeList.m_wndHeader.GetClientRect(&m_headerRect);
			m_treeList.Invalidate();
		}
		else
			GetParent()->SendMessage(WM_NOTIFY, wParam, lParam);

	return CFormView::OnNotify(wParam, lParam, pResult);
}
Ejemplo n.º 10
0
void ProjectExplorerWindow::UpdateFile(Project::File* file)
{
    int scroll_pos = m_tree->GetScrollPos(wxVERTICAL);
    m_tree->Freeze();

    wxArrayTreeItemIds selectedItems;
    m_tree->GetSelections(selectedItems);

    wxTreeItemId fileNode = FindFile(m_tree->GetRootItem(), file);
    bool isSelected = m_tree->IsSelected(fileNode);
    if (isSelected)
      m_tree->UnselectItem(fileNode);

    RemoveFileSymbols(m_tree->GetRootItem(), file);

    //If only one item is selected, need to remove it later
    if (isSelected && selectedItems.size() == 1)
    {
      selectedItems.clear();
      m_tree->GetSelections(selectedItems);
      //fileNode = m_tree->UnselectItem
    }

    wxTreeItemId node = m_root;
    if (file->directoryPath.IsEmpty() == false)
    {
      wxStack<wxTreeItemId> stack;

      wxTreeItemIdValue cookie;
      wxTreeItemId temp = m_tree->GetFirstChild(node, cookie);
      wxString target = file->directoryPath;
      
      while (temp.IsOk())
      {
        if (m_tree->GetItemText(temp) == target)
          break;

        temp = m_tree->GetNextChild(temp, cookie);
      }

      if (temp.IsOk() == false)
        temp = m_root;

      node = temp;
    }

    RebuildForFile(node, file);

    SortTree(m_tree->GetRootItem());

    m_tree->SetScrollPos(wxVERTICAL, scroll_pos);
    m_tree->Thaw();
}
Ejemplo n.º 11
0
void InfoFrom::SortTree(int nCol, BOOL bAscending, HTREEITEM hParent)
{
	HTREEITEM hChild;
	HTREEITEM hPa = hParent;
	while(hPa!=NULL)
	{
		if(m_treeList.ItemHasChildren(hPa))
		{
			hChild = m_treeList.GetChildItem(hPa);
			m_treeList.SortItems(nCol, bAscending, hPa);
			SortTree(nCol, bAscending, hChild);
		}

		hPa = m_treeList.GetNextSiblingItem(hPa);
	}
}
Ejemplo n.º 12
0
void ProjectExplorerWindow::SortTree(wxTreeItemId node)
{
  m_tree->SortChildren(node);

  //Sort all childen recursively
  wxTreeItemIdValue cookie;
  wxTreeItemId temp = m_tree->GetFirstChild(node, cookie);
  while (temp.IsOk())
  {
    if (m_tree->HasChildren(temp))
    {
      SortTree(temp);
    }

    temp = m_tree->GetNextChild(temp, cookie);
  }
}
Ejemplo n.º 13
0
void SymbolTree::AddSymbols(const std::vector<std::pair<wxString, TagEntry> > &items)
{
	if (!m_tree)
		return;

	m_sortItems.clear();
	Freeze();
	for (size_t i=0; i<items.size(); i++) {
		TagEntry data = items.at(i).second;
		if (m_tree) {
			TagNode *node = m_tree->AddEntry(data);
			if (node) {
				AddItem(node);
			}
		}
	} // for(size_t i=0; i<items.size(); i++)
	SortTree(m_sortItems);
	m_sortItems.clear();
	Thaw();
}
Ejemplo n.º 14
0
void CTreeListFrame::SortTree(int nCol, BOOL bAscending, HTREEITEM hParent)
{
   if (m_sortingEnabled)
   {
	   HTREEITEM hChild;
	   HTREEITEM hPa = hParent;

	   while (hPa != NULL)
	   {
		   if(getTree().ItemHasChildren(hPa))
		   {
			   hChild = getTree().GetChildItem(hPa);
			   getTree().SortItems(nCol, bAscending, hPa);
			   SortTree(nCol, bAscending, hChild);
		   }

		   hPa = getTree().GetNextSiblingItem(hPa);
	   }
   }
}
Ejemplo n.º 15
0
void ProjectExplorerWindow::Rebuild()
{

    m_tree->Freeze();

    m_tree->DeleteAllItems();
    m_root = m_tree->AddRoot("Root");

    if (m_project != NULL)
    {
        for (unsigned int i = 0; i < m_project->GetNumDirectories(); ++i)
        {
           RebuildForDirectory(m_project->GetDirectory(i));
        }

        for (unsigned int i = 0; i < m_project->GetNumFiles(); ++i)
        {
            RebuildForFile(m_root, m_project->GetFile(i));
        }
    }

    SortTree(m_tree->GetRootItem());

    TraverseTree(m_root, [&,this](wxTreeItemId const &id)
    {
      m_tree->SetItemSelectedColour(id, m_itemSelectBackground);
    });

    // For whatever reason the unselect event isn't reported properly
    // after deleting all items, so explicitly clear out the info box.
    m_infoBox->SetFile(NULL);

    m_tree->Thaw();

    // Select the first item in the newly created list
    wxTreeItemId firstItem = m_tree->GetFirstVisibleItem();
    if (firstItem.IsOk())
     m_tree->SelectItem(firstItem);

}
Ejemplo n.º 16
0
void SymbolTree::BuildTree(const wxFileName &fileName, TagEntryPtrVector_t* tags /*NULL*/)
{
    TagEntryPtrVector_t newTags;
    if ( !tags ) {
        
        // Get the current database
        ITagsStoragePtr db = TagsManagerST::Get()->GetDatabase();
        if ( ! db ) {
            Clear();
            return;
        }
        // Load the new tags from the database
        db->SelectTagsByFile(fileName.GetFullPath(), newTags);
        // Compare the new tags with the old ones
        if ( TagsManagerST::Get()->AreTheSame(newTags, m_currentTags) )
            return;
            
        m_currentTags.clear();
        m_currentTags.insert(m_currentTags.end(), newTags.begin(), newTags.end());
        
    } else {
        
        m_currentTags.clear();
        m_currentTags.insert(m_currentTags.end(), tags->begin(), tags->end());
        
    }
    
    wxWindowUpdateLocker locker(this);
    Clear();
    m_fileName = fileName;
    
    // Convert them into tree
    m_tree = TagsManagerST::Get()->Load(m_fileName, &m_currentTags);
    if ( !m_tree ) {
        return;
    }

    // Add invisible root node
    wxTreeItemId root;
    root = AddRoot(fileName.GetFullName(), 15, 15);

    TreeWalker<wxString, TagEntry> walker(m_tree->GetRoot());

    // add three items here:
    // the globals node, the mcros and the prototype node
    m_globalsNode    = AppendItem(root, wxT("Global Functions and Variables"), 2, 2, new MyTreeItemData(wxT("Global Functions and Variables"), wxEmptyString));
    m_prototypesNode = AppendItem(root, wxT("Functions Prototypes"), 2, 2, new MyTreeItemData(wxT("Functions Prototypes"), wxEmptyString));
    m_macrosNode     = AppendItem(root, wxT("Macros"), 2, 2, new MyTreeItemData(wxT("Macros"), wxEmptyString));

    // Iterate over the tree and add items
    m_sortItems.clear();

    Freeze();
    for (; !walker.End(); walker++) {
        // Add the item to the tree
        TagNode* node = walker.GetNode();

        // Skip root node
        if (node->IsRoot())
            continue;

        // Add the node
        AddItem(node);
    }
    
    SortTree(m_sortItems);
    if ( ItemHasChildren(m_globalsNode) == false ) {
        Delete(m_globalsNode);
    }
    if ( ItemHasChildren(m_prototypesNode) == false ) {
        Delete(m_prototypesNode);
    }
    if ( ItemHasChildren(m_macrosNode) == false ) {
        Delete(m_macrosNode);
    }
    Thaw();

    //select the root node by default
    if (!(GetWindowStyleFlag() & wxTR_HIDE_ROOT)) {
        //root is visible, select it
        SelectItem(GetRootItem());
    }
}
Ejemplo n.º 17
0
void ProjectExplorerWindow::InsertDirectory(Project::Directory* directory)
{
  RebuildForDirectory(directory);
  SortTree(m_tree->GetRootItem());
}
Ejemplo n.º 18
0
void ProjectExplorerWindow::InsertFile(Project::File* file)
{
    RebuildForFile(m_root, file);
    SortTree(m_tree->GetRootItem());
}
Ejemplo n.º 19
0
void CTLFrame::Initialize()
{
	// creates all the objects in frame -
	// header, tree, horizontal scroll bar

/*	CRect m_wndRect;
	GetWindowRect(&m_wndRect);
	CRect m_headerRect;

	// create the header
	{
		m_headerRect.left = m_headerRect.top = -1;
		m_headerRect.right = m_wndRect.Width();

		m_tree.m_wndHeader.Create(WS_CHILD | WS_VISIBLE | HDS_BUTTONS | HDS_HORZ, m_headerRect, this, ID_TREE_LIST_HEADER);
	}

	CSize textSize;
	// set header's pos, dimensions and image list
	{
		LOGFONT logfont;

		CFont *pFont = GetParent()->GetFont();
		pFont->GetLogFont( &logfont );

		m_tree.m_headerFont.CreateFontIndirect( &logfont );
		m_tree.m_wndHeader.SetFont(&m_tree.m_headerFont);

		CDC *pDC = m_tree.m_wndHeader.GetDC();
		pDC->SelectObject(&m_tree.m_headerFont);
		textSize = pDC->GetTextExtent("A");

		m_tree.m_wndHeader.UpdateWindow();
	}

	CRect m_treeRect;

	// create the tree itself
	{
		GetWindowRect(&m_wndRect);

		m_treeRect.left=0;
		m_treeRect.top = textSize.cy+4;
		m_treeRect.right = m_headerRect.Width()-5;
		m_treeRect.bottom = m_wndRect.Height()-GetSystemMetrics(SM_CYHSCROLL)-4;

		m_tree.Create(WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS, m_treeRect, this, ID_TREE_LIST_CTRL);
	}

	// finally, create the horizontal scroll bar
	{
		CRect m_scrollRect;
		m_scrollRect.left=0;
		m_scrollRect.top = m_treeRect.bottom;
		m_scrollRect.right = m_treeRect.Width()-GetSystemMetrics(SM_CXVSCROLL);
		m_scrollRect.bottom = m_wndRect.bottom;

		m_horScrollBar.Create(WS_CHILD | WS_VISIBLE | WS_DISABLED | SBS_HORZ | SBS_TOPALIGN, m_scrollRect, this, ID_TREE_LIST_SCROLLBAR);

		SCROLLINFO si;
		si.fMask = SIF_PAGE;
		si.nPage = m_treeRect.Width();
		m_horScrollBar.SetScrollInfo(&si, FALSE);
	}*/

	SortTree(0, TRUE, m_tree.GetRootItem());
}
Ejemplo n.º 20
0
BOOL CTreeListFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
	HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam;

	if((wParam == ID_TREE_LIST_HEADER) && (pHDN->hdr.code == HDN_ITEMCLICK))
	{
      if (m_sortingEnabled)
      {
		   int nCol = pHDN->iItem;

		   BOOL bAscending = FALSE;

		   if(getTree().m_wndHeader.GetItemImage(nCol)==-1)
			   bAscending = TRUE;
		   else
		   if(getTree().m_wndHeader.GetItemImage(nCol)==1)
			   bAscending = TRUE;

		   for(int i=0;i<getTree().GetColumnsNum();i++)
		   {
			   getTree().m_wndHeader.SetItemImage(i, -1);
		   }

		   if(bAscending)
			   getTree().m_wndHeader.SetItemImage(nCol, 0);
		   else
			   getTree().m_wndHeader.SetItemImage(nCol, 1);

		   getTree().SortItems(nCol, bAscending, NULL);
		   SortTree(nCol, bAscending, getTree().GetRootItem());

		   getTree().UpdateWindow();
      }
	}
	else if((wParam == ID_TREE_LIST_HEADER) && (pHDN->hdr.code == HDN_ITEMCHANGED))
	{
		int m_nPrevColumnsWidth = getTree().GetColumnsWidth();
		getTree().RecalcColumnsWidth();
		ResetScrollBar();

		// in case we were at the scroll bar's end,
		// and some column's width was reduced,
		// update header's position (move to the right).
		CRect m_treeRect;
		getTree().GetClientRect(&m_treeRect);

		CRect m_headerRect;
		getTree().m_wndHeader.GetClientRect(&m_headerRect);

		if((m_nPrevColumnsWidth > getTree().GetColumnsWidth()) &&
		   (m_horScrollBar.GetScrollPos() == m_horScrollBar.GetScrollLimit()-1) &&
		   (m_treeRect.Width() < getTree().GetColumnsWidth()))
		{
			getTree().m_nOffset = -getTree().GetColumnsWidth()+m_treeRect.Width();
			getTree().m_wndHeader.SetWindowPos(&wndTop, getTree().m_nOffset, 0, 0, 0, SWP_NOSIZE);
		}

		getTree().Invalidate();
		GetParent()->SendMessage(WM_NOTIFY, wParam, lParam);
	}
	else
   {
		GetParent()->SendMessage(WM_NOTIFY, wParam, lParam);
   }

	return CWnd::OnNotify(wParam, lParam, pResult);
}
Ejemplo n.º 21
0
void CTreeListFrame::Initialize()
{
	// creates all the objects in frame -
	// header, tree, horizontal scroll bar

   int scrollBarWidth  = GetSystemMetrics(SM_CXHSCROLL);
   int scrollBarHeight = GetSystemMetrics(SM_CYHSCROLL);

	CRect m_wndRect;
	GetWindowRect(&m_wndRect);
	CRect m_headerRect;

	// create the header
	{
		//m_headerRect.left = m_headerRect.top = -1;
		m_headerRect.left = m_headerRect.top = 0;
		m_headerRect.right = m_wndRect.Width();

		getTree().m_wndHeader.Create(WS_CHILD | WS_VISIBLE | HDS_BUTTONS | HDS_HORZ, m_headerRect, this, ID_TREE_LIST_HEADER);
	}

	CSize textSize;
	// set header's pos, dimensions and image list
	{
		LOGFONT logfont;

		CFont *pFont = GetParent()->GetFont();
		pFont->GetLogFont( &logfont );

		getTree().m_headerFont.CreateFontIndirect( &logfont );
		getTree().m_wndHeader.SetFont(&getTree().m_headerFont);

		CDC *pDC = getTree().m_wndHeader.GetDC();
		pDC->SelectObject(&getTree().m_headerFont);
		textSize = pDC->GetTextExtent("A");

		//getTree().m_wndHeader.SetWindowPos(&wndTop, -1, -1, m_headerRect.Width(), textSize.cy+4, SWP_SHOWWINDOW);
		getTree().m_wndHeader.SetWindowPos(&wndTop, 0, 0, m_headerRect.Width(), textSize.cy+4, SWP_SHOWWINDOW);

		getTree().m_cImageList.Create(IDB_HEADERSORTARROWS, 16, 10, RGB(192,192,192));
		getTree().m_wndHeader.SetImageList(&getTree().m_cImageList);
	}

	CRect m_treeRect;

	// create the tree itself
	{
		GetWindowRect(&m_wndRect);

		m_treeRect.left   = 0;
		m_treeRect.top    = textSize.cy + 4;
		m_treeRect.right  = m_headerRect.Width() - 5;
		//m_treeRect.bottom = m_wndRect.Height() - GetSystemMetrics(SM_CYHSCROLL) - 4;
		m_treeRect.bottom = m_wndRect.Height() - GetSystemMetrics(SM_CYHSCROLL);

		getTree().Create(WS_BORDER | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS, m_treeRect, this, ID_TREE_LIST_CTRL);
	}

	// finally, create the horizontal scroll bar
	{
		CRect m_scrollRect;
		m_scrollRect.left   = 0;
		m_scrollRect.top    = m_treeRect.bottom;
		int scrollRectTop   = m_wndRect.bottom   - GetSystemMetrics(SM_CYHSCROLL);
		m_scrollRect.right  = m_treeRect.Width() - GetSystemMetrics(SM_CXVSCROLL);
		m_scrollRect.bottom = m_wndRect.bottom;

		m_horScrollBar.Create(WS_CHILD | WS_VISIBLE | WS_DISABLED | SBS_HORZ | SBS_TOPALIGN, m_scrollRect, this, ID_TREE_LIST_SCROLLBAR);
	}

	SortTree(0, TRUE, getTree().GetRootItem());
}