2010-11-01 3 views
1

Я создаю новый тип проекта, используя MPF.Как создать виртуальный узел с помощью MPF?

Я хочу создать тип узла, где поддержка этого узла фактически не существует. Чтобы это было просто, я просто хочу сгенерировать подписи на лету.

Я создал новый подкласс класса из HierarchyNode, потому что в конечном итоге у него будут дети. Я подклассифицировал FolderNode, поэтому я могу определить, какие папки будут иметь эти виртуальные узлы в качестве дочерних. Я использую Get/SetMetadata для этого, и он отлично работает. Я переопределял GetProperty в MyFolderNode, так что если тип папки является «обычной» папкой, он просто перенаправляется на базу. В противном случае он возвращает VirtualNode для FirstChild. VirtualNodes создают своего следующего брата и устанавливают NextSibling. TL; DR: Код следует.

Моя проблема в том, что она не работает. В частности, когда я нажимаю значок «Развернуть эту папку», он становится синим (так что клик регистрируется), но он остается синим, а узел не расширяется. Отладка показывает, что попытка расширения папки попадает в GetProperty с запросом FirstChild и возвращает идентификатор первого дочернего элемента. После этого VirtualNode запрашивается дважды, чтобы узнать, является ли он расширяемым. Затем он запрашивается для заголовка. Затем значок. Тогда ничего.

Вот код для моего FolderNode подкласса:

public class AndroidFolderNode : FolderNode 
{ 
    public enum FolderType 
    { 
     Normal, 
     JavaSource 
    } 

    public string[] VirtualNodes = new[] 
            { 
             "Virtual Node One", 
             "Virtual Node Two", 
             "Virtual Node Three" 
            }; 

    private FolderType mFolderType; 
    public FolderType Type 
    { 
     get 
     { 
      return mFolderType; 
     } 
     set 
     { 
      if (mFolderType != value) 
      { 
       mFolderType = value; 
       OnInvalidateItems(this); 
      } 
     } 
    } 

    private HierarchyNode mVirtualChild; 

    public AndroidFolderNode(ProjectNode root, string relativePath, ProjectElement element) 
     : base(root, relativePath, element) 
    { 
     var t = element.GetMetadata("Type"); 
     if (string.IsNullOrWhiteSpace(t)) 
     { 
      Type = FolderType.Normal; 
     } 
     else 
     { 
      FolderType tempType; 
      if (Enum.TryParse(t, true, out tempType)) 
      { 
       Type = tempType; 
      } 
     } 
    } 

    protected override NodeProperties CreatePropertiesObject() 
    { 
     return new AndroidFolderNodeProperties(this); 
    } 


    public override object GetProperty(int propId) 
    { 
     object result = null; 
     switch ((__VSHPROPID) propId) 
     { 
      case __VSHPROPID.VSHPROPID_FirstChild: 
       goto case __VSHPROPID.VSHPROPID_FirstVisibleChild; 

      case __VSHPROPID.VSHPROPID_FirstVisibleChild: 
       if (Type == FolderType.Normal) 
       { 
        result = (int)((this.FirstChild != null) ? this.FirstChild.ID : VSConstants.VSITEMID_NIL); 
       } 
       else 
       { 
        if (mVirtualChild == null) 
        { 
         mVirtualChild = new VirtualFolderNode(this, 0); 
        } 
        result = mVirtualChild.ID; 
       } 
       break; 
      default: 
       result = base.GetProperty(propId); 
       break; 
     } 
     return result; 
    } 
} 

Вот код для моего VirtualNode:

class VirtualFolderNode : HierarchyNode 
{ 
    private static Guid _guid = new Guid("DD264E51-2E66-4BCC-A8A6-DE3BDE890DED"); 

    private int mIdx; 
    private AndroidFolderNode mParent; 
    private VirtualFolderNode mSibling; 

    public VirtualFolderNode(AndroidFolderNode parent, int idx) 
     : base(parent.ProjectMgr) 
    { 
     mParent = parent; 
     mIdx = idx; 
     Parent = parent; 

     if (idx < parent.VirtualNodes.Length) 
     { 
      mSibling = new VirtualFolderNode(parent, idx + 1); 
      NextSibling = mSibling; 
     } 
    } 

    public override string Url 
    { 
     get { return Parent.Url + "\\VNode" + mIdx; } 
    } 

    public override string Caption 
    { 
     get { return mParent.VirtualNodes[mIdx]; } 
    } 

    public override Guid ItemTypeGuid 
    { 
     get { return _guid; } 
    } 
} 

ответ

1

Понял! (Замечание: мне никогда не приходилось отвечать на мой вопрос раньше.)

Проблема, похоже, в том, что HierarchyNode.GetIconHandle (bool open) просто возвращает null. Переопределение GetIconHandle в VirtualNode позволяет отображать его, как ожидалось. Поэтому я добавил это к VirtualNode и bada bing, bada boom:

public override object GetIconHandle(bool open) 
    { 
     return ProjectMgr.ImageHandler.GetIconHandle(open ? (int)ProjectNode.ImageName.OpenFolder : (int)ProjectNode.ImageName.Folder); 
    }