public override bool GetChildren(GetChildrenDelegate callback, bool async)
        {
            Assert.ArgumentNotNull(callback, nameof(callback));

            var result = new List <BaseSiteTreeViewItem>();

            var children = Site.DataService.GetRootItems(DatabaseUri).ToList();

            if (!children.Any())
            {
                return(false);
            }

            foreach (var child in children)
            {
                var item = new ItemTreeViewItem(child);

                if (child.HasChildren)
                {
                    item.MakeExpandable();
                }

                result.Add(item);
            }

            callback(result);

            return(true);
        }
        private void HandleSolutionExplorerDrop([NotNull] ItemTreeViewItem target, [NotNull] DragEventArgs e)
        {
            Diagnostics.Debug.ArgumentNotNull(target, nameof(target));
            Diagnostics.Debug.ArgumentNotNull(e, nameof(e));

            var droppedFileName = e.Data.GetData(DataFormats.Text, true) as string;

            if (droppedFileName == null)
            {
                return;
            }

            var project = AppHost.Projects.FirstOrDefault(p => droppedFileName.StartsWith(p.FolderName, StringComparison.InvariantCultureIgnoreCase));

            if (project == null)
            {
                return;
            }

            var relativeFileName = project.GetRelativeFileName(droppedFileName);

            if (AppHost.MessageBox(string.Format("Are you sure you want to bind:\n\n\\{0}\n\nto:\n\n{1}", relativeFileName, target.Item.Path), "Confirmation", MessageBoxButton.OKCancel, MessageBoxImage.Question) != MessageBoxResult.OK)
            {
                return;
            }

            project.LinkItemAndFile(target.ItemUri, relativeFileName);
        }
        private void TransferItems([NotNull] ItemTreeViewItem target, [NotNull] IEnumerable <IItem> items)
        {
            Diagnostics.Debug.ArgumentNotNull(target, nameof(target));
            Diagnostics.Debug.ArgumentNotNull(items, nameof(items));

            var options = new TaskDialogOptions
            {
                Owner           = this.GetAncestorOrSelf <Window>(),
                Title           = "Transfer Items",
                CommonButtons   = TaskDialogCommonButtons.None,
                MainInstruction = "Are you sure you want to transfer these items to another database?",
                Content         = "Any item dependencies will not be copied.",
                MainIcon        = VistaTaskDialogIcon.Information,
                CommandButtons  = new[]
                {
                    "Copy Items",
                    "Copy Items and SubItems",
                    "Copy Items - Change Item IDs",
                    "Copy Items and SubItems - Change Item IDs"
                },
                AllowDialogCancellation = true
            };

            var r = TaskDialog.Show(options).CommandButtonResult;

            if (r == null)
            {
                return;
            }

            var transfer = new TransferDialog(target, items, r == 1 || r == 3, r == 2 || r == 3);

            AppHost.Shell.ShowDialog(transfer);
        }
        private void HandleItemDrop([NotNull] ItemTreeViewItem target, [NotNull] DragEventArgs e)
        {
            Diagnostics.Debug.ArgumentNotNull(target, nameof(target));
            Diagnostics.Debug.ArgumentNotNull(e, nameof(e));

            var items = e.Data.GetData(DragManager.DragIdentifier) as IEnumerable <IItem>;

            if (items == null)
            {
                Diagnostics.Trace.Expected(typeof(IEnumerable <IItem>));
                return;
            }

            var isSameDatabase = items.All(i => i.ItemUri.DatabaseUri == target.ItemUri.DatabaseUri);

            if (!isSameDatabase)
            {
                TransferItems(target, items);
                return;
            }

            switch (GetDragOperation(e, target, items, true))
            {
            case DragOperation.Copy:
                DragCopyPipeline.Run().WithParameters(target, items, adorner.LastPosition, e.KeyStates);
                break;

            case DragOperation.Move:
                DragMovePipeline.Run().WithParameters(target, items, adorner.LastPosition, e.KeyStates);
                break;
            }
        }
        private void HandleDropFiles([NotNull] string[] droppedFilePaths)
        {
            Diagnostics.Debug.ArgumentNotNull(droppedFilePaths, nameof(droppedFilePaths));

            var site = Item.ItemUri.Site;

            if (!site.DataService.CanExecuteAsync("Media.Upload"))
            {
                AppHost.MessageBox(string.Format(Rocks.Resources.MediaSkinListBox_HandleDropFiles_, site.DataServiceName), Rocks.Resources.Information, MessageBoxButton.OK, MessageBoxImage.Information);
                return;
            }

            GetValueCompleted <ItemHeader> uploadCompleted = delegate(ItemHeader value)
            {
                if (droppedFilePaths.Length != 1)
                {
                    return;
                }

                var item = new ItemTreeViewItem(value);
                Items.Add(item);

                var itemVersionUri = new ItemVersionUri(value.ItemUri, LanguageManager.CurrentLanguage, Data.Version.Latest);

                AppHost.OpenContentEditor(itemVersionUri);
            };

            MediaManager.Upload(Item.ItemUri.DatabaseUri, Item.Path, droppedFilePaths, uploadCompleted);
        }
        private DragOperation GetDragOperation([NotNull] DragEventArgs e, [NotNull] ItemTreeViewItem target, [NotNull] IEnumerable <IItem> items, bool isSameDatabase)
        {
            Diagnostics.Debug.ArgumentNotNull(e, nameof(e));
            Diagnostics.Debug.ArgumentNotNull(target, nameof(target));
            Diagnostics.Debug.ArgumentNotNull(items, nameof(items));

            if (!isSameDatabase)
            {
                return(DragOperation.Copy);
            }

            if (items.Count() == 1 && (e.KeyStates & DragDropKeyStates.AltKey) == DragDropKeyStates.AltKey)
            {
                var item = items.First() as ItemTreeViewItem;

                if (item != null && item.IsTemplate)
                {
                    var path = target.GetPath();
                    if (!path.StartsWith(@"/sitecore/templates", StringComparison.InvariantCultureIgnoreCase))
                    {
                        return(DragOperation.CreateItem);
                    }
                }
            }

            if ((e.KeyStates & DragDropKeyStates.ControlKey) == DragDropKeyStates.ControlKey)
            {
                return(DragOperation.Copy);
            }

            return(DragOperation.Move);
        }
        BaseTreeViewItem IScopeable.GetScopedTreeViewItem()
        {
            var result = new ItemTreeViewItem(Item);

            if (Item.HasChildren)
            {
                result.MakeExpandable();
            }

            return(result);
        }
        private void HandleItemDragOver([NotNull] ItemTreeViewItem target, [NotNull] DragEventArgs e)
        {
            Diagnostics.Debug.ArgumentNotNull(target, nameof(target));
            Diagnostics.Debug.ArgumentNotNull(e, nameof(e));

            var items = e.Data.GetData(DragManager.DragIdentifier) as IEnumerable <IItem>;

            if (items == null)
            {
                Diagnostics.Trace.Expected(typeof(IEnumerable <IItem>));
                return;
            }

            var isSameDatabase = true;

            foreach (var s in items)
            {
                if (s == null)
                {
                    Diagnostics.Trace.EnumerableContainsNull();
                    return;
                }

                if (s.ItemUri.DatabaseUri != target.ItemUri.DatabaseUri)
                {
                    isSameDatabase = false;
                }

                if (s.ItemUri == target.ItemUri)
                {
                    return;
                }
            }

            switch (GetDragOperation(e, target, items, isSameDatabase))
            {
            case DragOperation.Copy:
                adorner.AllowedPositions = ControlDragAdornerPosition.All;
                e.Effects = DragDropEffects.Copy;
                break;

            case DragOperation.Move:
                adorner.AllowedPositions = ControlDragAdornerPosition.All;
                e.Effects = DragDropEffects.Move;
                break;

            case DragOperation.CreateItem:
                adorner.AllowedPositions = ControlDragAdornerPosition.Over;
                e.Effects = DragDropEffects.Link;
                break;
            }
        }