public void Apply() { BeginList(); try { if (active == null) { active = new List <JumpItemTask>(); } if (active.Count > 0) { foreach (var t in active) { t.Dispose(); } active.Clear(); } var count = tasks.Count; if (count > 0) { IObjectCollection content = null; var categories = new Dictionary <string, IObjectCollection>(); for (var i = 0; i < count; ++i) { var t = tasks[i]; if (i > 0) { if (tasks[i - 1].CustomCategory != t.CustomCategory) { content = null; } } if (content == null) { var c = t.CustomCategory; if (c == null) { c = ""; } if (!categories.TryGetValue(c, out content)) { content = categories[c] = (IObjectCollection) new CEnumerableObjectCollection(); } } var jit = new JumpItemTask(t); active.Add(jit); content.AddObject(jit.NativeShellLink); } foreach (var k in categories.Keys) { if (k.Length == 0) { list.AddUserTasks((IObjectArray)categories[k]); } else { var r = list.AppendCategory(k, (IObjectArray)categories[k]); if (r < 0) { if (r == -2147024891) //denied (tracking of recent files is disabled) { throw new CustomCategoryException(); } throw Marshal.GetExceptionForHR(r); } } } } } finally { list.CommitList(); } }
private void BeginList() { uint slots; object o; var r = list.BeginList(out slots, ref GUID_IObjectArray, out o); if (r < 0) { throw Marshal.GetExceptionForHR(r); } var oa = (IObjectArray)o; uint count; oa.GetCount(out count); if (count > 0) { var removed = new List <IJumpItem>((int)count); var buffer = new StringBuilder(512); for (uint i = 0; i < count; ++i) { oa.GetAt(i, ref GUID_IUnknown, out o); if (o is Shortcut.IShellLink) { var link = (Shortcut.IShellLink)o; var title = JumpItemTask.GetTitle(link); string args = null; for (var j = tasks.Count - 1; j >= 0; --j) { var t = tasks[j]; if (t.Title == title) { if (args == null) { link.GetArguments(buffer, buffer.Capacity); args = buffer.ToString(); buffer.Length = 0; } if (Compare(t.Arguments, args)) { tasks.RemoveAt(j); removed.Add(t); break; } } } } //else if (o is Dialogs.FileDialogNative.IShellItem) //{ // var item = (Dialogs.FileDialogNative.IShellItem)o; //} } if (removed.Count > 0) { try { if (Removed != null) { Removed(this, removed); } } catch (Exception e) { Util.Logging.Log(e); } } } }