|
using System;
namespace SampleApp.ViewModels
{
/// <summary>
/// View-model for the 'Document Overview' pane.
/// </summary>
public sealed class DocumentOverviewPaneViewModel : AbstractPaneViewModel
{
/// <summary>
/// The number of lines in the file.
/// </summary>
private int lineCount = 0;
/// <summary>
/// The word count in the file.
/// </summary>
private int wordCount = 0;
public DocumentOverviewPaneViewModel(MainWindowViewModel mainWindowViewModel)
{
if (mainWindowViewModel == null)
{
throw new ArgumentNullException("mainWindowViewModel");
}
this.MainWindowViewModel = mainWindowViewModel;
this.MainWindowViewModel.ActiveDocumentChanged += new EventHandler<EventArgs>(MainWindowViewModel_ActiveDocumentChanged);
}
/// <summary>
/// Get the name of the active file.
/// </summary>
public string FileName
{
get
{
if (this.MainWindowViewModel.ActiveDocument == null)
{
return string.Empty;
}
return this.MainWindowViewModel.ActiveDocument.FileName;
}
}
/// <summary>
/// Get the path of the directory that contains the active file.
/// </summary>
public string DirectoryPath
{
get
{
if (this.MainWindowViewModel.ActiveDocument == null)
{
return string.Empty;
}
return this.MainWindowViewModel.ActiveDocument.DirectoryPath;
}
}
/// <summary>
/// Gets the number of lines in the file.
/// </summary>
public int LineCount
{
get
{
return lineCount;
}
}
/// <summary>
/// Gets the word count in the file.
/// </summary>
public int WordCount
{
get
{
return wordCount;
}
}
/// <summary>
/// View-model for main window.
/// </summary>
private MainWindowViewModel MainWindowViewModel
{
get;
set;
}
/// <summary>
/// Event raised when the active document in the main window's view model has changed.
/// </summary>
private void MainWindowViewModel_ActiveDocumentChanged(object sender, EventArgs e)
{
ComputeWordAndLineCount();
OnPropertyChanged("FileName");
OnPropertyChanged("DirectoryPath");
OnPropertyChanged("LineCount");
OnPropertyChanged("WordCount");
}
/// <summary>
/// Parse the active file and compute word and line counts.
/// </summary>
private void ComputeWordAndLineCount()
{
wordCount = 0;
lineCount = 0;
if (this.MainWindowViewModel.ActiveDocument == null)
{
// Nothing to do.
return;
}
string fileText = this.MainWindowViewModel.ActiveDocument.Text;
int pos = 0;
bool word = false;
while (pos < fileText.Length)
{
if (fileText[pos] == '\n')
{
++lineCount;
}
if (Char.IsWhiteSpace(fileText[pos]))
{
if (word)
{
++wordCount;
word = false;
}
}
else
{
if (!word)
{
word = true;
}
}
++pos;
}
if (word)
{
++wordCount;
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Software craftsman | Author | Writing rapidfullstackdevelopment.com - Posting about how to survive and flourish as a software developer
Follow on Twitter for news and updates: https://twitter.com/codecapers
I'm writing a new book: Rapid Fullstack Development. Learn from my years of experience and become a better developer.
My second book, Bootstrapping Microservices, is a practical and project-based guide to building distributed applications with microservices.
My first book Data Wrangling with JavaScript is a comprehensive overview of working with data in JavaScript.
Data-Forge Notebook is my notebook-style application for data transformation, analysis and transformation in JavaScript.
I have a long history in software development with many years in apps, web apps, backends, serious games, simulations and VR. Making technology work for business is what I do: building bespoke software solutions that span multiple platforms.
I have years of experience managing development teams, preparing technical strategies and creation of software products. I can explain complicated technology to senior management. I have delivered cutting-edge products in fast-paced and high-pressure environments. I know how to focus and prioritize to get the important things done.
Author
- Rapid Fullstack Development
- Bootstrapping Microservices
- Data Wrangling with JavaScript
Creator of Market Wizard
- https://www.market-wizard.com.au/
Creator of Data-Forge and Data-Forge Notebook
- http://www.data-forge-js.com
- http://www.data-forge-notebook.com
Web
- www.codecapers.com.au
Open source
- https://github.com/ashleydavis
- https://github.com/data-forge
- https://github.com/data-forge-notebook
Skills
- Quickly building MVPs for startups
- Understanding how to get the most out of technology for business
- Developing technical strategies
- Management and coaching of teams & projects
- Microservices, devops, mobile and fullstack software development