• R/O
  • SSH
  • HTTPS

bugspots-net: Commit


Commit MetaInfo

Revision2 (tree)
Time2014-01-15 00:16:55
Authormantarou

Log Message

新規作成

Change Summary

Incremental Difference

--- trunk/bugspots.net/App.xaml.cs (nonexistent)
+++ trunk/bugspots.net/App.xaml.cs (revision 2)
@@ -0,0 +1,17 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Configuration;
4+using System.Data;
5+using System.Linq;
6+using System.Threading.Tasks;
7+using System.Windows;
8+
9+namespace bugspots.net
10+{
11+ /// <summary>
12+ /// App.xaml の相互作用ロジック
13+ /// </summary>
14+ public partial class App : Application
15+ {
16+ }
17+}
--- trunk/bugspots.net/src/ProcessingSplashWindow/ProcessingSplashWindow.xaml.cs (nonexistent)
+++ trunk/bugspots.net/src/ProcessingSplashWindow/ProcessingSplashWindow.xaml.cs (revision 2)
@@ -0,0 +1,73 @@
1+using System;
2+using System.Collections.Generic;
3+using System.ComponentModel;
4+using System.Linq;
5+using System.Text;
6+using System.Windows;
7+using System.Windows.Controls;
8+using System.Windows.Data;
9+using System.Windows.Documents;
10+using System.Windows.Input;
11+using System.Windows.Media;
12+using System.Windows.Media.Imaging;
13+using System.Windows.Shapes;
14+
15+namespace bugspots.net
16+{
17+ /// <seealso cref="http://qiita.com/dhq_boiler/items/930ff2dc960fd950d7a3"/>
18+ public partial class ProcessingSplashWindow : Window
19+ {
20+ public bool Complete { get; private set; }
21+ private BackgroundWorker m_backgroundWorker = new BackgroundWorker();
22+ private Action m_action;
23+ private bool m_close;
24+
25+ public ProcessingSplashWindow(string a_message, Action a_action)
26+ {
27+ InitializeComponent();
28+ this.m_action = a_action;
29+ DataContext = a_message;
30+ Complete = false;
31+ m_close = false;
32+
33+ m_backgroundWorker.DoWork += _backgroundWorker_DoWork;
34+ m_backgroundWorker.RunWorkerCompleted += _backgroundWorker_RunWorkerCompleted;
35+ m_backgroundWorker.RunWorkerAsync();
36+ }
37+
38+ private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
39+ {
40+ if (m_action != null)
41+ m_action.Invoke();
42+ }
43+
44+ private void _backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
45+ {
46+ if (e.Cancelled)
47+ {
48+ //Cancelled
49+ Complete = false;
50+ m_close = true;
51+ }
52+ else if (e.Error != null)
53+ {
54+ //Exception Thrown
55+ Complete = false;
56+ m_close = true;
57+ }
58+ else
59+ {
60+ //Completed
61+ Complete = true;
62+ m_close = true;
63+ }
64+ Close();
65+ }
66+
67+ protected override void OnClosing(CancelEventArgs e)
68+ {
69+ if (!m_close)
70+ e.Cancel = true;
71+ }
72+ }
73+}
--- trunk/bugspots.net/src/RegexTestWindow/RegexIsMatchConverter.cs (nonexistent)
+++ trunk/bugspots.net/src/RegexTestWindow/RegexIsMatchConverter.cs (revision 2)
@@ -0,0 +1,38 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Globalization;
4+using System.Linq;
5+using System.Text;
6+using System.Text.RegularExpressions;
7+using System.Windows.Data;
8+
9+namespace bugspots.net
10+{
11+ class RegexIsMatchConverter : IMultiValueConverter
12+ {
13+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
14+ {
15+ if (values[0] == null || !(values[0] is string)
16+ || values[1] == null || !(values[1] is string))
17+ {
18+ return false.ToString();
19+ }
20+
21+ try
22+ {
23+ Regex regex = new Regex((string)values[0]);
24+ return regex.IsMatch((string)values[1]).ToString();
25+ }
26+ catch (ArgumentException)
27+ {
28+ }
29+
30+ return false.ToString();
31+ }
32+
33+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
34+ {
35+ throw new NotImplementedException();
36+ }
37+ }
38+}
--- trunk/bugspots.net/src/RegexTestWindow/RegexTestWindow.xaml.cs (nonexistent)
+++ trunk/bugspots.net/src/RegexTestWindow/RegexTestWindow.xaml.cs (revision 2)
@@ -0,0 +1,33 @@
1+using System;
2+using System.Collections.Generic;
3+using System.ComponentModel;
4+using System.Linq;
5+using System.Text;
6+using System.Windows;
7+using System.Windows.Controls;
8+using System.Windows.Data;
9+using System.Windows.Documents;
10+using System.Windows.Input;
11+using System.Windows.Media;
12+using System.Windows.Media.Imaging;
13+using System.Windows.Shapes;
14+
15+namespace bugspots.net
16+{
17+ /// <summary>
18+ /// RegexTestWindow.xaml の相互作用ロジック
19+ /// </summary>
20+ public partial class RegexTestWindow : Window
21+ {
22+ public RegexTestWindow(string a_regex)
23+ {
24+ InitializeComponent();
25+ FilterRegexTbx.Text = a_regex;
26+ }
27+
28+ private void applyBtn_Click(object sender, RoutedEventArgs e)
29+ {
30+ DialogResult = true;
31+ }
32+ }
33+}
--- trunk/bugspots.net/src/RegexTestWindow/RegexTextExtractConverter.cs (nonexistent)
+++ trunk/bugspots.net/src/RegexTestWindow/RegexTextExtractConverter.cs (revision 2)
@@ -0,0 +1,53 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Globalization;
4+using System.Linq;
5+using System.Text;
6+using System.Text.RegularExpressions;
7+using System.Windows.Data;
8+
9+namespace bugspots.net
10+{
11+ class RegexTextExtractConverter : IMultiValueConverter
12+ {
13+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
14+ {
15+ if (values[0] == null || !(values[0] is string)
16+ || values[1] == null || !(values[1] is string))
17+ {
18+ return "";
19+ }
20+
21+ try
22+ {
23+ Regex regex = new Regex((string)values[0]);
24+ string message = (string)values[1];
25+ Match m = regex.Match(message);
26+ if (m.Success)
27+ {
28+ // 空文字以外を使用する
29+ for (int i = 1; i < m.Groups.Count; ++i)
30+ {
31+ if (!string.IsNullOrEmpty(m.Groups[i].Value))
32+ {
33+ return m.Groups[i].Value;
34+ }
35+ }
36+ }
37+ else
38+ {
39+ return message;
40+ }
41+ }
42+ catch (ArgumentException)
43+ {
44+ }
45+ return "";
46+ }
47+
48+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
49+ {
50+ throw new NotImplementedException();
51+ }
52+ }
53+}
--- trunk/bugspots.net/src/MainWindow/MainWindow.xaml.cs (nonexistent)
+++ trunk/bugspots.net/src/MainWindow/MainWindow.xaml.cs (revision 2)
@@ -0,0 +1,255 @@
1+using Microsoft.VisualBasic.FileIO;
2+using Microsoft.Win32;
3+using SharpSvn;
4+using System;
5+using System.Collections.Generic;
6+using System.Collections.ObjectModel;
7+using System.ComponentModel;
8+using System.IO;
9+using System.Linq;
10+using System.Text;
11+using System.Text.RegularExpressions;
12+using System.Threading.Tasks;
13+using System.Windows;
14+using System.Windows.Controls;
15+using System.Windows.Data;
16+using System.Windows.Documents;
17+using System.Windows.Input;
18+using System.Windows.Media;
19+using System.Windows.Media.Imaging;
20+using System.Windows.Navigation;
21+using System.Windows.Shapes;
22+
23+namespace bugspots.net
24+{
25+ /// <summary>
26+ /// MainWindow.xaml の相互作用ロジック
27+ /// </summary>
28+ public partial class MainWindow : Window
29+ {
30+ public MainWindow()
31+ {
32+ InitializeComponent();
33+ }
34+
35+ private void ExecuteBtn_Click(object sender, RoutedEventArgs e)
36+ {
37+ // URIを生成。おかしいと例外吐くのでキャッチしておく
38+ Uri uri;
39+ try
40+ {
41+ uri = new Uri(Properties.Settings.Default.RepositoryURL);
42+ }
43+ catch (ArgumentException ex)
44+ {
45+ MessageBox.Show(ex.Message, "URI Error");
46+ return;
47+ }
48+ catch (UriFormatException ex)
49+ {
50+ MessageBox.Show(ex.Message, "URI Error");
51+ return;
52+ }
53+
54+ // 重いので、別スレッドで実行
55+ Action action = () =>
56+ {
57+ // BugSpotsSvnInfo生成
58+ int startRev = -1;
59+ int.TryParse(Properties.Settings.Default.StartRevision, out startRev);
60+
61+ int endRev = -1;
62+ int.TryParse(Properties.Settings.Default.EndRevision, out endRev);
63+
64+ int limit = -1;
65+ int.TryParse(Properties.Settings.Default.Limit, out limit);
66+
67+ BugSpotsSvnInfo svnInfo = new BugSpotsSvnInfo(uri,
68+ Properties.Settings.Default.UserName,
69+ passwordBox.Password,
70+ startRev,
71+ endRev,
72+ limit);
73+
74+ // Filterの生成
75+ IBugSpotsModelFilter filter = null;
76+ if (!string.IsNullOrEmpty(Properties.Settings.Default.FilterCheckFile))
77+ {
78+ try
79+ {
80+ filter = new BugSpotsModelListFileFilter(Properties.Settings.Default.FilterRegex,
81+ Properties.Settings.Default.FilterCheckFile);
82+ }
83+ catch (FileNotFoundException ex)
84+ {
85+ // ファイルが存在しないとき
86+ MessageBox.Show(ex.Message, "Filter check file Error");
87+ return;
88+ }
89+ catch (ArgumentException ex)
90+ {
91+ // 正規表現がおかしいとき
92+ MessageBox.Show(ex.Message, "Filter check file Error");
93+ return;
94+ }
95+ }
96+ else if (!string.IsNullOrEmpty(Properties.Settings.Default.FilterRegex))
97+ {
98+ try
99+ {
100+ filter = new BugSpotsModelRegexFilter(Properties.Settings.Default.FilterRegex);
101+ }
102+ catch (ArgumentException ex)
103+ {
104+ // 正規表現がおかしいとき
105+ MessageBox.Show(ex.Message, "Filter regex Error");
106+ return;
107+ }
108+ }
109+
110+ // BugSpotsGetListViewFilesを生成
111+ BugSpotsModelFactory.BugSpotsGetListViewFiles viewFiles;
112+ if (Properties.Settings.Default.ViewFileListDisable)
113+ {
114+ viewFiles = BugSpotsModelFactory.BugSpotsGetListViewFiles.DisableViewFiles;
115+ }
116+ else if (Properties.Settings.Default.ViewFileListAllFiles)
117+ {
118+ viewFiles = BugSpotsModelFactory.BugSpotsGetListViewFiles.EnableViewFiles;
119+ }
120+ else
121+ {
122+ viewFiles = BugSpotsModelFactory.BugSpotsGetListViewFiles.EnableViewFilesExternals;
123+ }
124+
125+ // リポジトリへのアクセスなどを行いBugSpotsModelを生成する
126+ BugSpotsModel bugSpotsModel = null;
127+ try
128+ {
129+ bugSpotsModel = BugSpotsModelFactory.CreateBugSpotsModel(svnInfo,
130+ viewFiles,
131+ filter);
132+ }
133+ catch (SvnFileSystemException ex)
134+ {
135+ // URLが存在しないとき
136+ MessageBox.Show(ex.Message, "URI Error");
137+ return;
138+ }
139+ catch (SvnRepositoryIOException ex)
140+ {
141+ // URLがおかしいとき
142+ MessageBox.Show(ex.Message, "URI Error");
143+ return;
144+ }
145+ catch (SvnAuthenticationException ex)
146+ {
147+ // ユーザ名・パスワードがおかしいとき
148+ MessageBox.Show(ex.Message, "Username/Password Error");
149+ return;
150+ }
151+ catch (SvnClientUnrelatedResourcesException ex)
152+ {
153+ // リビジョン
154+ MessageBox.Show(ex.Message, "Start revision/End revision");
155+ return;
156+ }
157+ catch (Exception ex)
158+ {
159+ // 想定外の例外がありそうなので、全キャッチ
160+ MessageBox.Show(ex.Message, "Unknown Error");
161+ return;
162+ }
163+
164+ // 画面への設定
165+ this.Dispatcher.BeginInvoke(new Action(() =>
166+ {
167+ _tree.Model = bugSpotsModel;
168+ }), null);
169+ };
170+ ProcessingSplashWindow window = new ProcessingSplashWindow("Bug Spots Processing...", action);
171+ window.ShowDialog();
172+ }
173+
174+ private void BrowseBtn_Click(object sender, RoutedEventArgs e)
175+ {
176+ OpenFileDialog ofd = new OpenFileDialog();
177+ ofd.FileName = "";
178+ ofd.DefaultExt = "*.*";
179+ if (ofd.ShowDialog() == true)
180+ {
181+ Properties.Settings.Default.FilterCheckFile = ofd.FileName;
182+ }
183+ }
184+
185+ private void ExportCsvBtn_Click(object sender, RoutedEventArgs e)
186+ {
187+ SaveFileDialog sfd = new SaveFileDialog();
188+ sfd.FileName = "result.csv";
189+ sfd.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
190+ sfd.Filter = "CSV File (*.csv)|*.csv|All files (*.*)|*.*";
191+ sfd.FilterIndex = 1;
192+ sfd.Title = "Save a Result File";
193+ sfd.RestoreDirectory = true;
194+
195+ // ダイアログを表示して、キャンセルを押したら終了
196+ if (sfd.ShowDialog() == false)
197+ {
198+ return;
199+ }
200+
201+ Stream stream = sfd.OpenFile();
202+ if (stream == null)
203+ {
204+ return;
205+ }
206+
207+ StreamWriter sw = new StreamWriter(stream);
208+
209+ string viewFiles;
210+ if (Properties.Settings.Default.ViewFileListDisable)
211+ {
212+ viewFiles = "Disable";
213+ }
214+ else if (Properties.Settings.Default.ViewFileListAllFiles)
215+ {
216+ viewFiles = "All files";
217+ }
218+ else
219+ {
220+ viewFiles = "All files (including externals)";
221+ }
222+
223+ sw.WriteLine("Export Date," + DateTime.Now.ToString());
224+ sw.WriteLine("URL," + Properties.Settings.Default.RepositoryURL);
225+ sw.WriteLine("UserName," + Properties.Settings.Default.UserName);
226+ sw.WriteLine("View file list," + viewFiles);
227+ sw.WriteLine("Start revision," + Properties.Settings.Default.StartRevision);
228+ sw.WriteLine("End revision," + Properties.Settings.Default.EndRevision);
229+ sw.WriteLine("Limit," + Properties.Settings.Default.Limit);
230+ sw.WriteLine("Filter regex," + Properties.Settings.Default.FilterRegex);
231+ sw.WriteLine("Filter check file," + Properties.Settings.Default.FilterCheckFile);
232+ sw.WriteLine("");
233+ if (_tree.Model != null)
234+ {
235+ sw.Write(_tree.Model.ToString());
236+ }
237+ sw.Close();
238+ stream.Close();
239+ }
240+
241+ private void Window_Closing(object sender, CancelEventArgs e)
242+ {
243+ Properties.Settings.Default.Save();
244+ }
245+
246+ private void TestBtn_Click(object sender, RoutedEventArgs e)
247+ {
248+ RegexTestWindow window = new RegexTestWindow(Properties.Settings.Default.FilterRegex);
249+ if (window.ShowDialog() == true)
250+ {
251+ Properties.Settings.Default.FilterRegex = window.FilterRegexTbx.Text;
252+ }
253+ }
254+ }
255+}
--- trunk/bugspots.net/src/MainWindow/GridViewRowPresenterWithGridLines.cs (nonexistent)
+++ trunk/bugspots.net/src/MainWindow/GridViewRowPresenterWithGridLines.cs (revision 2)
@@ -0,0 +1,89 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.Windows;
6+using System.Windows.Controls;
7+using System.Windows.Media;
8+using System.Windows.Shapes;
9+
10+namespace bugspots.net
11+{
12+ /// <seealso cref="http://webcache.googleusercontent.com/search?q=cache%3acjRrhaaJ414J%3ablog.bulatgafurov.name/post/ListView-Horizontal-and-Vertical-Gridlines.aspx%20&cd=9&hl=en&ct=clnk&gl=uk"/>
13+ public class GridViewRowPresenterWithGridLines : GridViewRowPresenter
14+ {
15+ private static readonly Style DefaultSeparatorStyle;
16+ public static readonly DependencyProperty SeparatorStyleProperty;
17+ private readonly List<FrameworkElement> _lines = new List<FrameworkElement>();
18+
19+ static GridViewRowPresenterWithGridLines()
20+ {
21+ DefaultSeparatorStyle = new Style(typeof(Rectangle));
22+ DefaultSeparatorStyle.Setters.Add(new Setter(Shape.FillProperty, SystemColors.ControlLightBrush));
23+ SeparatorStyleProperty = DependencyProperty.Register("SeparatorStyle", typeof(Style), typeof(GridViewRowPresenterWithGridLines),
24+ new UIPropertyMetadata(DefaultSeparatorStyle, SeparatorStyleChanged));
25+ }
26+
27+ public Style SeparatorStyle
28+ {
29+ get { return (Style)GetValue(SeparatorStyleProperty); }
30+ set { SetValue(SeparatorStyleProperty, value); }
31+ }
32+
33+ private IEnumerable<FrameworkElement> Children
34+ {
35+ get { return LogicalTreeHelper.GetChildren(this).OfType<FrameworkElement>(); }
36+ }
37+
38+ private static void SeparatorStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
39+ {
40+ var presenter = (GridViewRowPresenterWithGridLines)d;
41+ var style = (Style)e.NewValue;
42+ foreach (FrameworkElement line in presenter._lines)
43+ {
44+ line.Style = style;
45+ }
46+ }
47+
48+ protected override Size ArrangeOverride(Size arrangeSize)
49+ {
50+ var size = base.ArrangeOverride(arrangeSize);
51+ var children = Children.ToList();
52+ EnsureLines(children.Count);
53+ for (var i = 0; i < _lines.Count; i++)
54+ {
55+ var child = children[i];
56+ var x = child.TransformToAncestor(this).Transform(new Point(child.ActualWidth, 0)).X + child.Margin.Right;
57+ var rect = new Rect(x, -Margin.Top, 1, size.Height + Margin.Top + Margin.Bottom);
58+ var line = _lines[i];
59+ line.Measure(rect.Size);
60+ line.Arrange(rect);
61+ }
62+ return size;
63+ }
64+
65+ private void EnsureLines(int count)
66+ {
67+ count = count - _lines.Count;
68+ for (var i = 0; i < count; i++)
69+ {
70+ var line = (FrameworkElement)Activator.CreateInstance(SeparatorStyle.TargetType);
71+ line = new Rectangle { Fill = Brushes.LightGray };
72+ line.Style = SeparatorStyle;
73+ AddVisualChild(line);
74+ _lines.Add(line);
75+ }
76+ }
77+
78+ protected override int VisualChildrenCount
79+ {
80+ get { return base.VisualChildrenCount + _lines.Count; }
81+ }
82+
83+ protected override Visual GetVisualChild(int index)
84+ {
85+ var count = base.VisualChildrenCount;
86+ return index < count ? base.GetVisualChild(index) : _lines[index - count];
87+ }
88+ }
89+}
--- trunk/bugspots.net/src/MainWindow/BugSpotsModelFactory.cs (nonexistent)
+++ trunk/bugspots.net/src/MainWindow/BugSpotsModelFactory.cs (revision 2)
@@ -0,0 +1,155 @@
1+using SharpSvn;
2+using System;
3+using System.Collections.Generic;
4+using System.Collections.ObjectModel;
5+using System.Linq;
6+using System.Net;
7+using System.Text;
8+
9+namespace bugspots.net
10+{
11+ static public class BugSpotsModelFactory
12+ {
13+ public enum BugSpotsGetListExternals
14+ {
15+ DisableExternals,
16+ EnableExternals
17+ }
18+ public enum BugSpotsGetListViewFiles
19+ {
20+ DisableViewFiles,
21+ EnableViewFiles,
22+ EnableViewFilesExternals
23+ }
24+
25+ static public BugSpotsModel CreateBugSpotsModel(BugSpotsSvnInfo a_svnInfo,
26+ BugSpotsGetListViewFiles a_viewFiles,
27+ IBugSpotsModelFilter a_filter)
28+ {
29+ var bugSpotsModel = new BugSpotsModel();
30+ var client = new SvnClient();
31+
32+ // 指定されていれば、ユーザ名・パスワードを設定する
33+ if (!string.IsNullOrEmpty(a_svnInfo.UserName))
34+ {
35+ // http://stackoverflow.com/questions/3099392/svn-repository-authentication-using-sharpsvn
36+ client.Authentication.Clear();
37+ client.Authentication.DefaultCredentials = new NetworkCredential(a_svnInfo.UserName,
38+ a_svnInfo.Password);
39+ }
40+
41+ // ファイル一覧を登録
42+ if (a_viewFiles == BugSpotsGetListViewFiles.EnableViewFiles
43+ || a_viewFiles == BugSpotsGetListViewFiles.EnableViewFilesExternals)
44+ {
45+ fillBugSpotsModel(client, a_svnInfo.RepositoryUri, a_viewFiles, ref bugSpotsModel);
46+ }
47+
48+ // 履歴を取得
49+ calcHotSpots(client, a_svnInfo.RepositoryUri, a_svnInfo.ArgsForGetLog, a_filter, ref bugSpotsModel);
50+
51+ // Average/Minumum/Maximumを再計算
52+ bugSpotsModel.Reconstruction();
53+
54+ return bugSpotsModel;
55+ }
56+
57+ static private void fillBugSpotsModel(SvnClient a_client,
58+ Uri a_uri,
59+ BugSpotsGetListViewFiles a_viewFiles,
60+ ref BugSpotsModel a_model)
61+ {
62+ Collection<SvnListEventArgs> svnList;
63+ a_client.GetList(a_uri, out svnList);
64+ if (svnList == null)
65+ {
66+ return;
67+ }
68+
69+ foreach (var v in svnList)
70+ {
71+ // 最初に「自分自身」がある。このときに外部参照をチェックする
72+ if (string.IsNullOrEmpty(v.Path))
73+ {
74+ if (a_viewFiles == BugSpotsGetListViewFiles.EnableViewFilesExternals)
75+ {
76+ string externals;
77+ a_client.GetProperty(v.Uri, "svn:externals", out externals);
78+ if (!string.IsNullOrEmpty(externals))
79+ {
80+ string[] sepByCrLf = externals.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
81+ foreach (var ext in sepByCrLf)
82+ {
83+ string[] sepBySpace = ext.Split(new char[] { ' ' });
84+ Uri externalsPath = new Uri(sepBySpace[0]);
85+ fillBugSpotsModel(a_client, externalsPath, a_viewFiles, ref a_model);
86+ }
87+ }
88+ }
89+ }
90+ // 最初に「自分自身」があるので、そこを除いて確認する
91+ else
92+ {
93+ if (v.Entry.NodeKind == SvnNodeKind.Directory)
94+ {
95+ Uri childPath = new Uri(v.BaseUri + "/" + v.Path);
96+ fillBugSpotsModel(a_client, childPath, a_viewFiles, ref a_model);
97+ }
98+ // ファイルなのにSvnNodeKind.Unknownの場合があるので、
99+ // SvnNodeKind.Directory以外はファイルとして扱う
100+ else
101+ {
102+ a_model.Add(v.BasePath + "/" + v.Path, SvnNodeKind.File, 0);
103+ }
104+ }
105+ }
106+ }
107+
108+ private static void calcHotSpots(SvnClient a_client,
109+ Uri a_uri,
110+ SvnLogArgs a_logArgs,
111+ IBugSpotsModelFilter a_filter,
112+ ref BugSpotsModel a_bugSpotsModel)
113+ {
114+ Collection<SvnLogEventArgs> logItems;
115+ a_client.GetLog(a_uri, a_logArgs, out logItems);
116+ if (logItems == null || logItems.Count() == 0)
117+ {
118+ return;
119+ }
120+
121+ // 履歴からhotspotsを計算
122+ var hotspots = new Dictionary<string, double>();
123+ var nodeKind = new Dictionary<string, SvnNodeKind>();
124+ DateTime now = DateTime.Now;
125+ DateTime last = logItems[logItems.Count() - 1].Time;
126+ foreach (var logEntry in logItems.Reverse()) // 情報落ち防止のため小さい方から加算。そのためのReverse()
127+ {
128+ if (a_filter == null
129+ || a_filter.IsMatch(logEntry.LogMessage))
130+ {
131+ double t = 1 - (now - logEntry.Time).TotalHours / (now - last).TotalHours;
132+ double v = 1.0 / (1 + Math.Exp((-12 * t) + 12));
133+ foreach (var file in logEntry.ChangedPaths)
134+ {
135+ if (hotspots.ContainsKey(file.Path))
136+ {
137+ hotspots[file.Path] += v;
138+ }
139+ else
140+ {
141+ hotspots[file.Path] = v;
142+ nodeKind[file.Path] = file.NodeKind;
143+ }
144+ }
145+ }
146+ }
147+
148+ // hotspotsを更新
149+ foreach (var v in hotspots)
150+ {
151+ a_bugSpotsModel.Add(v.Key, nodeKind[v.Key], v.Value);
152+ }
153+ }
154+ }
155+}
--- trunk/bugspots.net/src/MainWindow/BugSpotsModelFilters.cs (nonexistent)
+++ trunk/bugspots.net/src/MainWindow/BugSpotsModelFilters.cs (revision 2)
@@ -0,0 +1,77 @@
1+using System;
2+using System.Collections.Generic;
3+using System.IO;
4+using System.Linq;
5+using System.Text;
6+using System.Text.RegularExpressions;
7+
8+namespace bugspots.net
9+{
10+ public interface IBugSpotsModelFilter
11+ {
12+ bool IsMatch(string a_message);
13+ }
14+
15+ public class BugSpotsModelRegexFilter : IBugSpotsModelFilter
16+ {
17+ private Regex m_regex;
18+
19+ public BugSpotsModelRegexFilter(string a_pattern)
20+ {
21+ m_regex = new Regex(a_pattern);
22+ }
23+
24+ public bool IsMatch(string a_message)
25+ {
26+ return m_regex.IsMatch(a_message);
27+ }
28+ }
29+
30+ public class BugSpotsModelListFileFilter : IBugSpotsModelFilter
31+ {
32+ private Regex m_regex;
33+ private HashSet<string> m_set;
34+
35+ public BugSpotsModelListFileFilter(string a_pattern, string a_listPath)
36+ {
37+ m_regex = new Regex(a_pattern);
38+ m_set = new HashSet<string>();
39+
40+ // ファイルを読み込んで、条件リストを生成
41+ using (FileStream fs = new FileStream(a_listPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
42+ using (StreamReader sr = new StreamReader(fs))
43+ {
44+ string[] lines = sr.ReadToEnd().Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
45+ foreach (var v in lines)
46+ {
47+ m_set.Add(v);
48+ }
49+ }
50+ }
51+
52+ public bool IsMatch(string a_message)
53+ {
54+ Match m = m_regex.Match(a_message);
55+
56+ string checkString = "";
57+ if (m.Success)
58+ {
59+ // 空文字以外を使用する
60+ for (int i = 1; i < m.Groups.Count; ++i)
61+ {
62+ if (!string.IsNullOrEmpty(m.Groups[i].Value))
63+ {
64+ checkString = m.Groups[i].Value;
65+ break;
66+ }
67+ }
68+ }
69+ else
70+ {
71+ checkString = a_message;
72+ }
73+
74+ return m_set.Contains(checkString);
75+ }
76+ }
77+}
--- trunk/bugspots.net/src/MainWindow/NumericTextBox.cs (nonexistent)
+++ trunk/bugspots.net/src/MainWindow/NumericTextBox.cs (revision 2)
@@ -0,0 +1,49 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.Windows;
6+using System.Windows.Controls;
7+using System.Windows.Input;
8+
9+namespace bugspots.net
10+{
11+ /// <seealso cref="http://takopp.wordpress.com/2012/11/26/wpf-%E6%95%B0%E5%80%A4%E4%BB%A5%E5%A4%96%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84textbox/"/>
12+ public class NumericTextBox : TextBox
13+ {
14+ static NumericTextBox()
15+ {
16+ // IMEを無効化。
17+ InputMethod.IsInputMethodEnabledProperty.OverrideMetadata(typeof(NumericTextBox), new FrameworkPropertyMetadata(false));
18+ }
19+
20+ public NumericTextBox()
21+ {
22+ // ペーストのキーボードショートカットを無効化。
23+ this.InputBindings.Add(new KeyBinding(ApplicationCommands.NotACommand, Key.V, ModifierKeys.Control));
24+ this.InputBindings.Add(new KeyBinding(ApplicationCommands.NotACommand, Key.Insert, ModifierKeys.Shift));
25+ }
26+
27+ protected override void OnPreviewKeyDown(KeyEventArgs e)
28+ {
29+ // 数値以外、または数値の入力に関係しないキーが押された場合、イベントを処理済みに。
30+ if (!((Key.D0 <= e.Key && e.Key <= Key.D9) ||
31+ (Key.NumPad0 <= e.Key && e.Key <= Key.NumPad9) ||
32+ Key.Back == e.Key ||
33+ Key.Delete == e.Key ||
34+ Key.Tab == e.Key) ||
35+ (Keyboard.Modifiers & ModifierKeys.Shift) > 0)
36+ {
37+ e.Handled = true;
38+ }
39+
40+ base.OnKeyDown(e);
41+ }
42+
43+ // 右クリックを無効化。
44+ protected override void OnPreviewMouseRightButtonUp(MouseButtonEventArgs e)
45+ {
46+ e.Handled = true;
47+ }
48+ }
49+}
--- trunk/bugspots.net/src/MainWindow/BugSpotsModelImageConverter.cs (nonexistent)
+++ trunk/bugspots.net/src/MainWindow/BugSpotsModelImageConverter.cs (revision 2)
@@ -0,0 +1,37 @@
1+using SharpSvn;
2+using System;
3+using System.Collections.Generic;
4+using System.Globalization;
5+using System.Linq;
6+using System.Text;
7+using System.Windows.Data;
8+
9+namespace bugspots.net
10+{
11+ /// <seealso cref="http://www.codeproject.com/Articles/30721/WPF-TreeListView-Control"/>
12+ /// <seealso cref="http://www.small-icons.com/packs/16x16-free-toolbar-icons.htm"/>
13+ class BugSpotsModelImageConverter : IValueConverter
14+ {
15+ public object Convert(object o, Type type, object parameter, CultureInfo culture)
16+ {
17+ if (o is BugSpotsModel)
18+ {
19+ if (((BugSpotsModel) o).NodeKind == SvnNodeKind.Directory)
20+ {
21+ return "/img/directory.png";
22+ }
23+ else
24+ {
25+ return "/img/file.png";
26+ }
27+ }
28+
29+ return "";
30+ }
31+
32+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
33+ {
34+ throw new NotImplementedException();
35+ }
36+ }
37+}
--- trunk/bugspots.net/src/MainWindow/DataBarConverter.cs (nonexistent)
+++ trunk/bugspots.net/src/MainWindow/DataBarConverter.cs (revision 2)
@@ -0,0 +1,30 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Globalization;
4+using System.Linq;
5+using System.Text;
6+using System.Windows.Data;
7+
8+namespace bugspots.net
9+{
10+ public class DataBarConverter : IMultiValueConverter
11+ {
12+ public object Convert(object[] o, Type type, object parameter, CultureInfo culture)
13+ {
14+ if ((o[0] is double) && (o[1] is double))
15+ {
16+ double value = (double) o[0];
17+ double maximum = (double) o[1];
18+
19+ return (maximum == 0) ? 0 : value / maximum;
20+ }
21+
22+ return 0;
23+ }
24+
25+ public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
26+ {
27+ throw new NotImplementedException();
28+ }
29+ }
30+}
--- trunk/bugspots.net/src/MainWindow/BugSpotsModel.cs (nonexistent)
+++ trunk/bugspots.net/src/MainWindow/BugSpotsModel.cs (revision 2)
@@ -0,0 +1,262 @@
1+using Aga.Controls.Tree;
2+using SharpSvn;
3+using System;
4+using System.Collections;
5+using System.Collections.Generic;
6+using System.Collections.ObjectModel;
7+using System.Linq;
8+using System.Text;
9+
10+namespace bugspots.net
11+{
12+ public class BugSpotsModel : ITreeModel
13+ {
14+ private Dictionary<string, BugSpotsModel> m_children;
15+
16+ static public double MaximumOfScore
17+ {
18+ get;
19+ private set;
20+ }
21+ static public double MaximumOfAverage
22+ {
23+ get;
24+ private set;
25+ }
26+ static public double MaximumOfMaximum
27+ {
28+ get;
29+ private set;
30+ }
31+ static public double MaximumOfTotalScore
32+ {
33+ private get;
34+ set;
35+ }
36+
37+ public string Path
38+ {
39+ get;
40+ private set;
41+ }
42+ public SvnNodeKind NodeKind
43+ {
44+ get;
45+ private set;
46+ }
47+ public double Score
48+ {
49+ get;
50+ private set;
51+ }
52+ public double Average
53+ {
54+ get;
55+ private set;
56+ }
57+ public double Maximum
58+ {
59+ get;
60+ private set;
61+ }
62+ public double TotalScore
63+ {
64+ private get;
65+ set;
66+ }
67+ public int ChildrenCount
68+ {
69+ private get;
70+ set;
71+ }
72+
73+
74+ public IEnumerable GetChildren(object parent)
75+ {
76+ if (parent == null)
77+ {
78+ yield return this;
79+ }
80+ else
81+ {
82+ var parentModel = parent as BugSpotsModel;
83+ if (parentModel != null)
84+ {
85+ // 最初にフォルダ、その後ファイルの順番で返す
86+ // そのとき、フォルダ名・ファイル名はソートされた順番で返す
87+
88+ // Path名でソートする
89+ List<BugSpotsModel> sortedList = new List<BugSpotsModel>(parentModel.m_children.Values);
90+ sortedList.Sort((lhs, rhs) => string.Compare(lhs.Path, rhs.Path));
91+
92+ // フォルダ
93+ foreach (var v in sortedList)
94+ {
95+ if (v.NodeKind == SvnNodeKind.Directory)
96+ {
97+ yield return v;
98+ }
99+ }
100+ // ファイル
101+ foreach (var v in sortedList)
102+ {
103+ // 古いSVNが原因なのかはよくわからないが、
104+ // ファイルなのにSvnNodeKind.Unknownとなることがある。
105+ // その場合も表示したいので、
106+ // SvnNodeKind.Directory以外をファイルとして表示する
107+ if (v.NodeKind != SvnNodeKind.Directory)
108+ {
109+ yield return v;
110+ }
111+ }
112+ }
113+ }
114+ }
115+
116+ public bool HasChildren(object parent)
117+ {
118+ if (parent == null)
119+ {
120+ return m_children.Count() != 0;
121+ }
122+ else
123+ {
124+ var parentModel = parent as BugSpotsModel;
125+ if (parentModel != null)
126+ {
127+ return parentModel.m_children.Count() != 0;
128+ }
129+ }
130+ return false;
131+ }
132+
133+ public BugSpotsModel()
134+ {
135+ m_children = new Dictionary<string, BugSpotsModel>();
136+ Path = "";
137+ Score = 0;
138+ }
139+
140+ private BugSpotsModel(string a_path, SvnNodeKind a_kind, double a_score)
141+ {
142+ m_children = new Dictionary<string, BugSpotsModel>();
143+ Add(a_path, a_kind, a_score);
144+ }
145+
146+ public void Add(string a_path, SvnNodeKind a_kind, double a_score)
147+ {
148+ // a_path = "/xxx/yyy/zzz/・・・"
149+ // → split[0] = "";
150+ // → split[1] = "xxx";
151+ // → split[2] = "yyy";
152+ string[] split = a_path.Split(new char[] { '/' });
153+ if (split.Length == 2) // 必ず[0]に空欄が入るため、最終のパスの場合は==2になる
154+ {
155+ Path = split[1];
156+ Score = a_score;
157+ NodeKind = a_kind;
158+ }
159+ else
160+ {
161+ Path = split[1];
162+ Score = 0;
163+ NodeKind = SvnNodeKind.Directory;
164+
165+ if (m_children.ContainsKey(split[2]))
166+ {
167+ int secondSlashPos = a_path.IndexOf('/', 1);
168+ m_children[split[2]].Add(a_path.Substring(secondSlashPos), a_kind, a_score);
169+ }
170+ else
171+ {
172+ int secondSlashPos = a_path.IndexOf('/', 1);
173+ m_children[split[2]] = new BugSpotsModel(a_path.Substring(secondSlashPos), a_kind, a_score);
174+ }
175+ }
176+ }
177+
178+ public void Reconstruction()
179+ {
180+ MaximumOfScore = 0;
181+ MaximumOfAverage = 0;
182+ MaximumOfMaximum = 0;
183+ MaximumOfTotalScore = 0;
184+ reconstructionSub();
185+ }
186+
187+ public override string ToString()
188+ {
189+ StringBuilder builder = new StringBuilder();
190+
191+ // ヘッダ
192+ builder.Append("Path,Score,Average,Maximum,Total\r\n");
193+
194+ // データ
195+ toStringSub(builder, "");
196+
197+ return builder.ToString();
198+ }
199+
200+ private void reconstructionSub()
201+ {
202+ if (m_children.Count() == 0)
203+ {
204+ Average = Maximum = TotalScore = Score;
205+ ChildrenCount = 1;
206+
207+ MaximumOfScore = Math.Max(MaximumOfScore, Score);
208+ MaximumOfAverage = Math.Max(MaximumOfAverage, Score);
209+ MaximumOfMaximum = Math.Max(MaximumOfMaximum, Score);
210+ MaximumOfTotalScore = Math.Max(MaximumOfTotalScore, Score);
211+ }
212+ else
213+ {
214+ // 子の計算
215+ foreach (var v in m_children)
216+ {
217+ v.Value.reconstructionSub();
218+ }
219+
220+ // 子を使って再計算
221+ int totalCount = 1;
222+ double totalScore = Score;
223+ Maximum = Score;
224+ foreach (var v in m_children)
225+ {
226+ totalScore += v.Value.TotalScore;
227+ if (Maximum < v.Value.Maximum)
228+ {
229+ Maximum = v.Value.Maximum;
230+ }
231+ totalCount += v.Value.ChildrenCount;
232+ }
233+ Average = totalScore / totalCount;
234+ TotalScore = totalScore;
235+ ChildrenCount = totalCount;
236+
237+ // データバーのための最大値系 (Total以外は子の計算の時だけでいい)
238+ MaximumOfTotalScore = Math.Max(MaximumOfTotalScore, TotalScore);
239+ }
240+ }
241+
242+ private void toStringSub(StringBuilder a_builder, string a_parent)
243+ {
244+ a_builder.Append("\"" + a_parent + "/" + Path + "\"").Append(",")
245+ .Append(Score).Append(",")
246+ .Append(Average).Append(",")
247+ .Append(Maximum).Append(",")
248+ .Append(TotalScore).Append(",")
249+ .Append("\r\n");
250+
251+ // 子の出力 (ソートして出力したいので、m_childrenではなくGetChildrenを使用する)
252+ foreach (var v in this.GetChildren(this))
253+ {
254+ var model = v as BugSpotsModel;
255+ if (model != null)
256+ {
257+ model.toStringSub(a_builder, a_parent + "/" + Path);
258+ }
259+ }
260+ }
261+ }
262+}
--- trunk/bugspots.net/src/MainWindow/BugSpotsSvnInfo.cs (nonexistent)
+++ trunk/bugspots.net/src/MainWindow/BugSpotsSvnInfo.cs (revision 2)
@@ -0,0 +1,96 @@
1+using SharpSvn;
2+using System;
3+using System.Collections.Generic;
4+using System.Linq;
5+using System.Text;
6+
7+namespace bugspots.net
8+{
9+ public class BugSpotsSvnInfo
10+ {
11+ private Uri m_uri;
12+ private string m_username;
13+ private string m_password;
14+ private SvnLogArgs m_args;
15+
16+ public Uri RepositoryUri
17+ {
18+ get
19+ {
20+ return m_uri;
21+ }
22+ }
23+
24+ public string UserName
25+ {
26+ get
27+ {
28+ return m_username;
29+ }
30+ }
31+
32+ public string Password
33+ {
34+ get
35+ {
36+ return m_password;
37+ }
38+ }
39+
40+ public SvnLogArgs ArgsForGetLog
41+ {
42+ get
43+ {
44+ return m_args;
45+ }
46+ }
47+
48+ public BugSpotsSvnInfo(Uri a_uri,
49+ string a_username,
50+ string a_password,
51+ int a_startRevision,
52+ int a_endRevision,
53+ int a_limit)
54+ {
55+ m_uri = a_uri;
56+ m_username = a_username;
57+ m_password = a_password;
58+
59+ // 両方から
60+ if (a_startRevision <= 0 && a_endRevision <= 0)
61+ {
62+ // リビジョン指定なし
63+ m_args = new SvnLogArgs();
64+ }
65+ else
66+ {
67+ SvnRevision startRev;
68+ if (a_startRevision <= 0)
69+ {
70+ startRev = SvnRevision.Head;
71+ }
72+ else
73+ {
74+ startRev = new SvnRevision(a_startRevision);
75+ }
76+
77+ SvnRevision endRev;
78+ if (a_endRevision <= 0)
79+ {
80+ endRev = SvnRevision.Zero;
81+ }
82+ else
83+ {
84+ endRev = new SvnRevision(a_endRevision);
85+ }
86+
87+ m_args = new SvnLogArgs(new SvnRevisionRange(startRev, endRev));
88+ }
89+
90+ if (a_limit > 0)
91+ {
92+ m_args.Limit = a_limit;
93+ }
94+ }
95+ }
96+}
--- trunk/bugspots.net/Properties/AssemblyInfo.cs (nonexistent)
+++ trunk/bugspots.net/Properties/AssemblyInfo.cs (revision 2)
@@ -0,0 +1,55 @@
1+using System.Reflection;
2+using System.Resources;
3+using System.Runtime.CompilerServices;
4+using System.Runtime.InteropServices;
5+using System.Windows;
6+
7+// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
8+// アセンブリに関連付けられている情報を変更するには、
9+// これらの属性値を変更してください。
10+[assembly: AssemblyTitle("bugspots.net")]
11+[assembly: AssemblyDescription("")]
12+[assembly: AssemblyConfiguration("")]
13+[assembly: AssemblyCompany("")]
14+[assembly: AssemblyProduct("bugspots.net")]
15+[assembly: AssemblyCopyright("Copyright © 2014")]
16+[assembly: AssemblyTrademark("")]
17+[assembly: AssemblyCulture("")]
18+
19+// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから
20+// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、
21+// その型の ComVisible 属性を true に設定してください。
22+[assembly: ComVisible(false)]
23+
24+//ローカライズ可能なアプリケーションのビルドを開始するには、
25+//.csproj ファイルの <UICulture>CultureYouAreCodingWith</UICulture> を
26+//<PropertyGroup> 内部で設定します。たとえば、
27+//ソース ファイルで英語を使用している場合、<UICulture> を en-US に設定します。次に、
28+//下の NeutralResourceLanguage 属性のコメントを解除します。下の行の "en-US" を
29+//プロジェクト ファイルの UICulture 設定と一致するよう更新します。
30+
31+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32+
33+
34+[assembly: ThemeInfo(
35+ ResourceDictionaryLocation.None, //テーマ固有のリソース ディクショナリが置かれている場所
36+ //(リソースがページ、
37+ //またはアプリケーション リソース ディクショナリに見つからない場合に使用されます)
38+ ResourceDictionaryLocation.SourceAssembly //汎用リソース ディクショナリが置かれている場所
39+ //(リソースがページ、
40+ //アプリケーション、またはいずれのテーマ固有のリソース ディクショナリにも見つからない場合に使用されます)
41+)]
42+
43+
44+// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
45+//
46+// Major Version
47+// Minor Version
48+// Build Number
49+// Revision
50+//
51+// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を
52+// 既定値にすることができます:
53+// [assembly: AssemblyVersion("1.0.*")]
54+[assembly: AssemblyVersion("1.0.0.0")]
55+[assembly: AssemblyFileVersion("1.0.0.0")]
--- trunk/bugspots.net/Properties/Settings.Designer.cs (nonexistent)
+++ trunk/bugspots.net/Properties/Settings.Designer.cs (revision 2)
@@ -0,0 +1,146 @@
1+//------------------------------------------------------------------------------
2+// <auto-generated>
3+// このコードはツールによって生成されました。
4+// ランタイム バージョン:4.0.30319.18408
5+//
6+// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
7+// コードが再生成されるときに損失したりします。
8+// </auto-generated>
9+//------------------------------------------------------------------------------
10+
11+namespace bugspots.net.Properties {
12+
13+
14+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
16+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17+
18+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19+
20+ public static Settings Default {
21+ get {
22+ return defaultInstance;
23+ }
24+ }
25+
26+ [global::System.Configuration.UserScopedSettingAttribute()]
27+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
28+ [global::System.Configuration.DefaultSettingValueAttribute("")]
29+ public string RepositoryURL {
30+ get {
31+ return ((string)(this["RepositoryURL"]));
32+ }
33+ set {
34+ this["RepositoryURL"] = value;
35+ }
36+ }
37+
38+ [global::System.Configuration.UserScopedSettingAttribute()]
39+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
40+ [global::System.Configuration.DefaultSettingValueAttribute("")]
41+ public string UserName {
42+ get {
43+ return ((string)(this["UserName"]));
44+ }
45+ set {
46+ this["UserName"] = value;
47+ }
48+ }
49+
50+ [global::System.Configuration.UserScopedSettingAttribute()]
51+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
52+ [global::System.Configuration.DefaultSettingValueAttribute("")]
53+ public string StartRevision {
54+ get {
55+ return ((string)(this["StartRevision"]));
56+ }
57+ set {
58+ this["StartRevision"] = value;
59+ }
60+ }
61+
62+ [global::System.Configuration.UserScopedSettingAttribute()]
63+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
64+ [global::System.Configuration.DefaultSettingValueAttribute("")]
65+ public string EndRevision {
66+ get {
67+ return ((string)(this["EndRevision"]));
68+ }
69+ set {
70+ this["EndRevision"] = value;
71+ }
72+ }
73+
74+ [global::System.Configuration.UserScopedSettingAttribute()]
75+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
76+ [global::System.Configuration.DefaultSettingValueAttribute("500")]
77+ public string Limit {
78+ get {
79+ return ((string)(this["Limit"]));
80+ }
81+ set {
82+ this["Limit"] = value;
83+ }
84+ }
85+
86+ [global::System.Configuration.UserScopedSettingAttribute()]
87+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
88+ [global::System.Configuration.DefaultSettingValueAttribute("")]
89+ public string FilterRegex {
90+ get {
91+ return ((string)(this["FilterRegex"]));
92+ }
93+ set {
94+ this["FilterRegex"] = value;
95+ }
96+ }
97+
98+ [global::System.Configuration.UserScopedSettingAttribute()]
99+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
100+ [global::System.Configuration.DefaultSettingValueAttribute("")]
101+ public string FilterCheckFile {
102+ get {
103+ return ((string)(this["FilterCheckFile"]));
104+ }
105+ set {
106+ this["FilterCheckFile"] = value;
107+ }
108+ }
109+
110+ [global::System.Configuration.UserScopedSettingAttribute()]
111+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
112+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
113+ public bool ViewFileListDisable {
114+ get {
115+ return ((bool)(this["ViewFileListDisable"]));
116+ }
117+ set {
118+ this["ViewFileListDisable"] = value;
119+ }
120+ }
121+
122+ [global::System.Configuration.UserScopedSettingAttribute()]
123+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
124+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
125+ public bool ViewFileListAllFiles {
126+ get {
127+ return ((bool)(this["ViewFileListAllFiles"]));
128+ }
129+ set {
130+ this["ViewFileListAllFiles"] = value;
131+ }
132+ }
133+
134+ [global::System.Configuration.UserScopedSettingAttribute()]
135+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
136+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
137+ public bool ViewFileListAllFilesExternals {
138+ get {
139+ return ((bool)(this["ViewFileListAllFilesExternals"]));
140+ }
141+ set {
142+ this["ViewFileListAllFilesExternals"] = value;
143+ }
144+ }
145+ }
146+}
--- trunk/bugspots.net/Properties/Resources.Designer.cs (nonexistent)
+++ trunk/bugspots.net/Properties/Resources.Designer.cs (revision 2)
@@ -0,0 +1,63 @@
1+//------------------------------------------------------------------------------
2+// <auto-generated>
3+// このコードはツールによって生成されました。
4+// ランタイム バージョン:4.0.30319.18408
5+//
6+// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
7+// コードが再生成されるときに損失したりします。
8+// </auto-generated>
9+//------------------------------------------------------------------------------
10+
11+namespace bugspots.net.Properties {
12+ using System;
13+
14+
15+ /// <summary>
16+ /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
17+ /// </summary>
18+ // このクラスは StronglyTypedResourceBuilder クラスが ResGen
19+ // または Visual Studio のようなツールを使用して自動生成されました。
20+ // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
21+ // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。
22+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25+ internal class Resources {
26+
27+ private static global::System.Resources.ResourceManager resourceMan;
28+
29+ private static global::System.Globalization.CultureInfo resourceCulture;
30+
31+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32+ internal Resources() {
33+ }
34+
35+ /// <summary>
36+ /// このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。
37+ /// </summary>
38+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39+ internal static global::System.Resources.ResourceManager ResourceManager {
40+ get {
41+ if (object.ReferenceEquals(resourceMan, null)) {
42+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("bugspots.net.Properties.Resources", typeof(Resources).Assembly);
43+ resourceMan = temp;
44+ }
45+ return resourceMan;
46+ }
47+ }
48+
49+ /// <summary>
50+ /// 厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、
51+ /// 現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
52+ /// </summary>
53+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54+ internal static global::System.Globalization.CultureInfo Culture {
55+ get {
56+ return resourceCulture;
57+ }
58+ set {
59+ resourceCulture = value;
60+ }
61+ }
62+ }
63+}
Show on old repository browser