/// <summary>
        /// A control has send an event that it has (been) browsing to a new location.
        /// Lets sync this with all other controls.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Control_BrowseEvent(object sender,
                                         FileSystemModels.Browse.BrowsingEventArgs e)
        {
            if (e.IsBrowsing == false && e.Result == BrowseResult.Complete)
            {
                var request = new BrowseRequest(e.Location);
                FinalBrowseResult browseResult = null;

                if (FolderTextPath != sender)
                {
                    // Navigate Folder ComboBox to this folder
                    browseResult = FolderTextPath.NavigateTo(request);

                    if (browseResult.Result != BrowseResult.Complete)
                    {
                        return;
                    }
                }

                if (FolderItemsView != sender)
                {
                    // Navigate Folder/File ListView to this folder
                    browseResult = FolderItemsView.NavigateTo(request);

                    if (browseResult.Result != BrowseResult.Complete)
                    {
                        return;
                    }
                }

                if (browseResult != null) // There should be at least one succesfull browse
                {                         // to change selection and log history
                    if (browseResult.Result == BrowseResult.Complete)
                    {
                        // Log location into history of recent locations
                        SelectedFolder = request.NewLocation.Path;
                        NaviHistory.Forward(request.NewLocation);
                    }
                }
            }
            else
            {
                if (e.IsBrowsing == true)
                {
                    if (FolderTextPath != sender)
                    {
                        // Navigate Folder ComboBox to this folder
                        FolderTextPath.SetExternalBrowsingState(true);
                    }

                    if (FolderItemsView != sender)
                    {
                        // Navigate Folder/File ListView to this folder
                        FolderItemsView.SetExternalBrowsingState(true);
                    }
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Can be invoked to refresh the currently visible set of data.
        /// </summary>
        public FinalBrowseResult PopulateView(BrowseRequest request)
        {
            IPathModel newPath = request.NewLocation;

            // Make sure the task always processes the last input but is not started twice
            _SlowStuffSemaphore.WaitAsync();
            try
            {
                if (request.CancelTok != null)
                {
                    request.CancelTok.ThrowIfCancellationRequested();
                }

                // Initialize view with current path
                if (_CurrentItems.Count() == 0)
                {
                    CurrentItemsClear();
                    SelectedItem = InitializeView(newPath);
                }
                else
                {
                    var match = _CurrentItems.TryGet(newPath.Path);
                    if (match != null)
                    {
                        SelectedItem = match;
                    }
                    else
                    {
                        var folderItem = new FolderItemViewModel(newPath, newPath.Name);
                        SelectedItem = CurrentItemsAdd(folderItem);
                    }
                }

                // Force a selection on to the control when there is no selected item, yet
                // Select last item in the list (hoping this is what we want...)
                if (_CurrentItems.Count > 0 && SelectedItem == null)
                {
                    SelectedItem = _CurrentItems.Last();
                }

                return(FinalBrowseResult.FromRequest(request, BrowseResult.Complete));
            }
            catch (Exception exp)
            {
                //// Console.WriteLine("{0} -> {1}", exp.Message, exp.StackTrace);
                var result = FinalBrowseResult.FromRequest(request, BrowseResult.InComplete);
                result.UnexpectedError = exp;
                return(result);
            }
            finally
            {
                _SlowStuffSemaphore.Release();
            }
        }
Beispiel #3
0
        /// <summary>
        /// Internal method for browsing the control along a given path.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="ResetBrowserStatus"></param>
        /// <returns>Whether path exists and was successfully browsed or not.</returns>
        private FinalBrowseResult InternalBrowsePath(BrowseRequest request,
                                                     bool ResetBrowserStatus)
        {
            IPathModel        pmodel = request.NewLocation;
            CancellationToken ct     = request.CancelTok;

            if (ResetBrowserStatus == true)
            {
                ClearBrowserStates();
            }

            if (pmodel.DirectoryPathExists() == false)
            {
                DisplayMessage.IsErrorMessageAvailable = true;
                DisplayMessage.Message = string.Format(FileSystemModels.Local.Strings.STR_ERROR_FOLDER_DOES_NOT_EXIST, pmodel.Path);

                return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
            }

            if (_Root.Count == 0)        // Make sure drives are available
            {
                SetInitialDrives(ct);
            }

            if (ct != null)
            {
                ct.ThrowIfCancellationRequested();
            }

            var pathItem = SelectDirectory(pmodel, ct);

            if (pathItem != null)
            {
                if (pathItem.Length > 0)
                {
                    SelectedItem = pathItem[pathItem.Length - 1];
                }

                return(FinalBrowseResult.FromRequest(request, BrowseResult.Complete));
            }

            return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
        }
        /// <summary>
        /// Master controler interface method to navigate all views
        /// to the folder indicated in <paramref name="folder"/>
        /// - updates all related viewmodels.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="requestor"</param>
        private async Task <FinalBrowseResult <IDirectoryBrowser> > NavigateToFolderAsync(
            BrowseRequest <IDirectoryBrowser> request
            , object sender)
        {
            Logger.InfoFormat("'{0}'", request.NewLocation);

            // Make sure the task always processes the last input but is not started twice
            await _Semaphore.WaitAsync();

            try
            {
                var newPath = request.NewLocation;
                var cancel  = request.CancelTok;

                if (cancel != null)
                {
                    cancel.ThrowIfCancellationRequested();
                }

                var browseResult = await BreadcrumbBrowser.NavigateToAsync(
                    request,
                    "AppViewModel.NavigateToFolderAsync"
                    );

                return(browseResult);
            }
            catch (Exception exp)
            {
                var result = FinalBrowseResult <IDirectoryBrowser> .FromRequest(null, BrowseResult.InComplete);

                result.UnexpectedError = exp;
                return(result);
            }
            finally
            {
                _Semaphore.Release();
            }
        }
Beispiel #5
0
        /// <summary>
        /// Start browser process initiated by controller or control specific
        /// events (e.g.: Expand path on initial load...)
        /// </summary>
        /// <param name="request"></param>
        /// <param name="ResetBrowserStatus"></param>
        /// <returns></returns>
        private FinalBrowseResult InternalNavigateTo(BrowseRequest request,
                                                     bool ResetBrowserStatus = true)
        {
            IsBrowsing          = true;
            IsBrowseViewEnabled = UpdateView = false;

            try
            {
                return(InternalBrowsePath(request, ResetBrowserStatus));
            }
            catch (Exception exp)
            {
                var result = FinalBrowseResult.FromRequest(request, BrowseResult.InComplete);
                result.UnexpectedError = exp;
                return(result);
            }
            finally
            {
                // Make sure that view updates at the end of browsing process
                IsBrowsing          = false;
                IsBrowseViewEnabled = UpdateView = true;
            }
        }
Beispiel #6
0
        private async Task InternalPopulateViewAsync(BrowseRequest request, bool sendNotification)
        {
            IPathModel newPath = request.NewLocation;

            IsBrowsing = true;
            try
            {
                if (sendNotification == true && this.SelectedItem != null)
                {
                    if (BrowseEvent != null)
                    {
                        BrowseEvent(this, new BrowsingEventArgs(newPath, true, BrowseResult.Unknown));
                    }
                }

                await Task.Run(() =>
                {
                    FinalBrowseResult result = null;
                    result = PopulateView(request);

                    if (sendNotification == true && this.SelectedItem != null)
                    {
                        if (BrowseEvent != null)
                        {
                            BrowseEvent(this, new BrowsingEventArgs(
                                            newPath, false, (result == null ? BrowseResult.InComplete :
                                                             result.Result)));
                        }
                    }
                });
            }
            finally
            {
                IsBrowsing = false;
            }
        }
Beispiel #7
0
        /// <summary>
        /// Fills the CurrentItems property for display in ItemsControl
        /// based view (ListBox, ListView etc.).
        ///
        /// This method wraps a parameterized version of the same method
        /// with a call that contains the standard data field.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="browseEvent">Defines whether a request should result
        /// in an explicit event relayed to a controller or not.</param>
        protected FinalBrowseResult PopulateView(BrowseRequest request,
                                                 bool browseEvent)
        {
            //Logger.DebugFormat("PopulateView method");
            //Logger.DebugFormat("Populating view for request id: {0} - '{1}'", request.RequestId, request.NewLocation.Path);

            // This can happen when the viewmodel is configured at start-up
            // but the current folder is not configured, yet
            if (request == null)
            {
                return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
            }

            IPathModel newPathToNavigateTo = request.NewLocation;

            bool result = false;

            IsBrowsing = true;
            try
            {
                if (newPathToNavigateTo != null && browseEvent == true)
                {
                    BrowseEvent?.Invoke(this,
                                        new BrowsingEventArgs(newPathToNavigateTo, true));
                }

                DirectoryInfo cur = new DirectoryInfo(newPathToNavigateTo.Path);

                if (cur.Exists == false)
                {
                    return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
                }

                CurrentItemClear();

                result = InternalPopulateView(_ParsedFilter, cur, ShowIcons);

                if (result == true)
                {
                    SetCurrentLocation(newPathToNavigateTo);
                    return(FinalBrowseResult.FromRequest(request, BrowseResult.Complete));
                }

                return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
            }
            catch (Exception exp)
            {
                var bresult = FinalBrowseResult.FromRequest(request, BrowseResult.InComplete);
                bresult.UnexpectedError = exp;
                return(bresult);
            }
            finally
            {
                if (newPathToNavigateTo != null && browseEvent == true)
                {
                    BrowseEvent?.Invoke(this, new BrowsingEventArgs(
                                            newPathToNavigateTo, false,
                                            result == true ? BrowseResult.Complete : BrowseResult.InComplete));
                }

                IsBrowsing = false;
            }
        }
Beispiel #8
0
        /// <summary>
        /// Fills the CurrentItems property for display in ItemsControl
        /// based view (ListBox, ListView etc.).
        ///
        /// This method wraps a parameterized version of the same method
        /// with a call that contains the standard data field.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="browseEvent">Defines whether a request should result
        /// in an explicit event relayed to a controller or not.</param>
        protected FinalBrowseResult PopulateView(BrowseRequest request,
                                                 bool browseEvent)
        {
            Logger.DebugFormat("PopulateView method");
            Logger.DebugFormat("Populating view for request id: {0} - '{1}'", request.RequestId, request.NewLocation.Path);

            IPathModel newPathToNavigateTo = request.NewLocation;

            bool result = false;

            IsBrowsing = true;
            try
            {
                if (newPathToNavigateTo != null && browseEvent == true)
                {
                    if (this.BrowseEvent != null)
                    {
                        this.BrowseEvent(this,
                                         new BrowsingEventArgs(newPathToNavigateTo, true));
                    }
                }

                DirectoryInfo cur = new DirectoryInfo(newPathToNavigateTo.Path);

                if (cur.Exists == false)
                {
                    return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
                }

                CurrentItemClear();

                result = InternalPopulateView(_ParsedFilter, cur, ShowIcons);

                if (result == true)
                {
                    SetCurrentLocation(newPathToNavigateTo);
                    return(FinalBrowseResult.FromRequest(request, BrowseResult.Complete));
                }

                return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
            }
            catch (Exception exp)
            {
                var bresult = FinalBrowseResult.FromRequest(request, BrowseResult.InComplete);
                bresult.UnexpectedError = exp;
                return(bresult);
            }
            finally
            {
                if (newPathToNavigateTo != null && browseEvent == true)
                {
                    if (this.BrowseEvent != null)
                    {
                        this.BrowseEvent(this,
                                         new BrowsingEventArgs(newPathToNavigateTo, false,
                                                               (result == true ? BrowseResult.Complete :
                                                                BrowseResult.InComplete)));
                    }
                }

                IsBrowsing = false;
            }
        }
Beispiel #9
0
        /// <summary>
        /// Master controler interface method to navigate all views
        /// to the folder indicated in <paramref name="folder"/>
        /// - updates all related viewmodels.
        /// </summary>
        /// <param name="request"></param>
        private async Task <FinalBrowseResult> NavigateToFolderAsync(BrowseRequest request,
                                                                     object sender)
        {
            // Make sure the task always processes the last input but is not started twice
            await _SlowStuffSemaphore.WaitAsync();

            try
            {
                var newPath = request.NewLocation;
                var cancel  = request.CancelTok;

                if (cancel != null)
                {
                    cancel.ThrowIfCancellationRequested();
                }

                TreeBrowser.SetExternalBrowsingState(true);
                FolderItemsView.SetExternalBrowsingState(true);
                FolderTextPath.SetExternalBrowsingState(true);

                FinalBrowseResult browseResult = null;

                // Navigate TreeView to this file system location
                if (TreeBrowser != sender)
                {
                    browseResult = await TreeBrowser.NavigateToAsync(request);

                    if (cancel != null)
                    {
                        cancel.ThrowIfCancellationRequested();
                    }

                    if (browseResult.Result != BrowseResult.Complete)
                    {
                        return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
                    }
                }

                // Navigate Folder ComboBox to this folder
                if (FolderTextPath != sender)
                {
                    browseResult = await FolderTextPath.NavigateToAsync(request);

                    if (cancel != null)
                    {
                        cancel.ThrowIfCancellationRequested();
                    }

                    if (browseResult.Result != BrowseResult.Complete)
                    {
                        return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
                    }
                }

                if (cancel != null)
                {
                    cancel.ThrowIfCancellationRequested();
                }

                // Navigate Folder/File ListView to this folder
                if (FolderItemsView != sender)
                {
                    browseResult = await FolderItemsView.NavigateToAsync(request);

                    if (cancel != null)
                    {
                        cancel.ThrowIfCancellationRequested();
                    }

                    if (browseResult.Result != BrowseResult.Complete)
                    {
                        return(FinalBrowseResult.FromRequest(request, BrowseResult.InComplete));
                    }
                }

                if (browseResult != null)
                {
                    if (browseResult.Result == BrowseResult.Complete)
                    {
                        SelectedFolder = newPath.Path;

                        // Log location into history of recent locations
                        NaviHistory.Forward(newPath);
                    }
                }

                return(browseResult);
            }
            catch (Exception exp)
            {
                var result = FinalBrowseResult.FromRequest(request, BrowseResult.InComplete);
                result.UnexpectedError = exp;
                return(result);
            }
            finally
            {
                TreeBrowser.SetExternalBrowsingState(true);
                FolderItemsView.SetExternalBrowsingState(false);
                FolderTextPath.SetExternalBrowsingState(false);

                _SlowStuffSemaphore.Release();
            }
        }