/// <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); } } } }
/// <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(); } }
/// <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(); } }
/// <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; } }
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; } }
/// <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; } }
/// <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; } }
/// <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(); } }