/// <summary>ダブルクリック時の処理 /// </summary> /// <param name="sender">イベントの発生したオブジェクト</param> /// <param name="e">発生したイベント</param> private void BodyTable_CellMouseDoubleClick (object sender, DataGridViewCellMouseEventArgs e) { if (e.RowIndex >= 0) { CMember member = this.Members[e.RowIndex]; switch (e.ColumnIndex) { case 0: // メンバーの修正 TimeTableManager.UI.FMemberDialog dialogM = new TimeTableManager.UI.FMemberDialog(); dialogM.Member = member; if (dialogM.ShowDialog(this.MainForm) == DialogResult.OK) { Refresh(); } break; case 1: // シフトの修正 PatternWrapper wrapper = Member2PatternWrapper[member]; CPattern pattern = wrapper.Pattern; if (pattern != null && !pattern.BuiltIn) { TimeTableManager.UI.FPatternDialog dialogP = new TimeTableManager.UI.FPatternDialog(); dialogP.Pattern = pattern; if (dialogP.ShowDialog(this.MainForm) == DialogResult.OK) { Refresh(); } } break; case 2: // コメントの追加・修正 if (Dates.Count == 1 && Editable) { BodyTable.CurrentCell = BodyTable[e.ColumnIndex, e.RowIndex]; BodyTable.BeginEdit(true); } break; } } else { } }
/// <summary>マウスダウン時ステータスを更新する /// </summary> /// <param name="sender">イベントの発生したオブジェクト</param> /// <param name="e">発生したイベント</param> private void BodyTable_CellMouseDown (object sender, DataGridViewCellMouseEventArgs e) { this.BarLabelStatus = EnumBarLabelStatus.None; CurrentRowIndex = e.RowIndex; if (this.TimeTable != null && CurrentRowIndex >= 0 && e.ColumnIndex == 2 && Editable) { CMember member = this.Members[CurrentRowIndex]; PatternWrapper wrapper = Member2PatternWrapper[member]; Rectangle CellBounds1 = BodyTable.GetCellDisplayRectangle(e.ColumnIndex, CurrentRowIndex, false); if (wrapper.Pattern != null && (!wrapper.Pattern.BuiltIn || wrapper.Pattern == CPattern.MULTI)) { Rectangle CellBounds2 = new Rectangle(new Point(0, 0), CellBounds1.Size); RectangleF rect = GetPattern2Rect(CellBounds2, wrapper); if (rect.Top < e.Y && e.Y < rect.Bottom) { if (rect.X - SplitBuffer < e.X && e.X < rect.X + SplitBuffer) { // 左端 this.BarLabelStatus = EnumBarLabelStatus.StartMoving; } else if (rect.Right - SplitBuffer < e.X && e.X < rect.Right + SplitBuffer) { // 右端 this.BarLabelStatus = EnumBarLabelStatus.EndMoving; } else if (rect.X < e.X && e.X < rect.Right) { // 内部 this.BarLabelStatus = EnumBarLabelStatus.AllMoving; } } } else { this.BarLabelStatus = EnumBarLabelStatus.Creating; } StartPoint = e.Location; MovingPoint = e.Location; } }
/// <summary>マウスカーソルをどうする? /// </summary> /// <param name="sender">イベントの発生したオブジェクト</param> /// <param name="e">発生したイベント</param> private void BodyTable_CellMouseMove (object sender, DataGridViewCellMouseEventArgs e) { if (this.TimeTable != null && e.RowIndex >= 0 && e.ColumnIndex == 2 && Editable) { CMember member = this.Members[e.RowIndex]; PatternWrapper wrapper = Member2PatternWrapper[member]; if (wrapper.Pattern != null && (!wrapper.Pattern.BuiltIn || wrapper.Pattern == CPattern.MULTI) && BarLabelStatus == EnumBarLabelStatus.None) { Rectangle CellBounds1 = BodyTable.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); Rectangle CellBounds2 = new Rectangle(new Point(0, 0), CellBounds1.Size); RectangleF rect = GetPattern2Rect(CellBounds2, wrapper); if (rect.Top < e.Y && e.Y < rect.Bottom) { if (rect.X - SplitBuffer < e.X && e.X < rect.X + SplitBuffer) { // 左端 this.Cursor = Cursors.VSplit; } else if (rect.Right - SplitBuffer < e.X && e.X < rect.Right + SplitBuffer) { // 右端 this.Cursor = Cursors.VSplit; } else if (rect.X < e.X && e.X < rect.Right) { // 内部 this.Cursor = Cursors.Hand; } else { this.Cursor = Cursors.Default; } } } if (BarLabelStatus != EnumBarLabelStatus.None) { MovingPoint = e.Location; BodyTable.Refresh(); } } }
/// <summary>座標の計算 /// </summary> /// <param name="CellBounds"></param> /// <param name="wrapper"></param> /// <returns></returns> private RectangleF GetPattern2Rect (Rectangle CellBounds, PatternWrapper wrapper) { RectangleF BarRect = CellBounds; float WidthOf1Hour = CellBounds.Width / (TotalHours); // 1時間の幅 BarRect.Y += CellBounds.Height / 4; BarRect.Height = CellBounds.Height / 2; TimeSpan PatternStart = wrapper.StartTime - AreaStartTime; TimeSpan PatternEnd = wrapper.EndTime - AreaStartTime; float RangeStart = (float)(PatternStart.TotalHours * WidthOf1Hour) + BarRect.X; float RangeEnd = (float)(PatternEnd.TotalHours * WidthOf1Hour) + BarRect.X; if (BarRect.X < RangeStart && RangeStart < BarRect.Right) { // 計算したバーの左端がセルのセルの表示範囲内に収まっている場合(収まっていなければセルの左端のまま) BarRect.X = RangeStart; //} else if (BarRect.X > RangeStart) { // BarRect.X = BarRect.X; } else if (RangeStart > BarRect.Right) { BarRect.X = BarRect.Right; } if (BarRect.X < RangeEnd && RangeEnd < BarRect.Right) { // 1.左右が逆転していないこと // 2.計算したバーの右端がセルのセル表示範囲内に収まっている場合幅を計算する(収まっていなければセルの右端のまま) BarRect.Width = RangeEnd - BarRect.X; } else if (BarRect.X > RangeEnd) { BarRect.Width = 0; } return BarRect; }
private static void Output(PatternWrapper wrapper, IMatchResult results) { Output((IWrapper)wrapper, (IMatchResult)results); Console.WriteLine("User-Agent -> {0}", results.UserAgent); Console.WriteLine("Rank -> {0}", results.Rank); Console.WriteLine("Difference -> {0}", results.Difference); Console.WriteLine("Method -> {0}", results.Method); }
/// <summary>メンバーの就業状態の作成 /// </summary> /// <param name="member"></param> private void SetUpMember2Pattern (CMember member) { PatternWrapper wrapper = new PatternWrapper(); wrapper.Pattern = CPattern.NULL; wrapper.StartTime = TimeSpan.MaxValue; wrapper.EndTime = TimeSpan.MinValue; if ((member == null) || (Dates.Count <= 0) || (TimeTable == null)) { // 存在しない if (member != null && Member2PatternWrapper.ContainsKey(member)) { Member2PatternWrapper.Remove(member); } return; } else { // 繰り返し int i = 0; foreach (DateTime date in Dates) { CScheduledDate sdate = TimeTable[date]; CSchedule schedule = sdate[member]; CPattern work = schedule.Pattern; if (i == 0) { // 最初のシフト wrapper.Pattern = work; if (work != null && !work.BuiltIn) { wrapper.StartTime = work.Start; wrapper.EndTime = work.End; i++; } wrapper.Notes = schedule.Notes; //wrapper.Notes = schedule["notes"]; } else if (wrapper.Pattern != work) { if (schedule.Notes != "") { // メモの追加 wrapper.Notes += "," + schedule.Notes; } // 複数選択されている wrapper.Pattern = CPattern.MULTI; if (work != null && !work.BuiltIn) { if (wrapper.StartTime > work.Start) { wrapper.StartTime = work.Start; } if (wrapper.EndTime < work.End) { wrapper.EndTime = work.End; } } i++; } } // 追加する if (Member2PatternWrapper.ContainsKey(member)) { Member2PatternWrapper[member] = wrapper; } else { Member2PatternWrapper.Add(member, wrapper); } } }
/// <summary> /// Creates the device detection providers. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Application_Start(object sender, EventArgs e) { _pattern = new PatternWrapper( Path.Combine( AppDomain.CurrentDomain.BaseDirectory, "..\\..\\data\\51Degrees-LiteV3.2.dat")); _trie = new TrieWrapper( Path.Combine( AppDomain.CurrentDomain.BaseDirectory, "..\\..\\data\\51Degrees-LiteV3.2.trie")); }
static void Main(string[] args) { using (var pattern = new PatternWrapper("../../../../../data/51Degrees-LiteV3.2.dat")) { Process(pattern); } using (var trie = new TrieWrapper("../../../../../data/51Degrees-LiteV3.4.trie")) { Process(trie); } }
/// <summary>勤務シフトの修正 /// </summary> /// <param name="sender">イベントの発生したオブジェクト</param> /// <param name="e">発生したイベント</param> private void TsmiEditPattern_Click (object sender, EventArgs e) { CMember member = this.Members[CurrentRowIndex]; PatternWrapper wrapper = Member2PatternWrapper[member]; CPattern pattern = wrapper.Pattern; if (pattern != null && !pattern.BuiltIn) { TimeTableManager.UI.FPatternDialog dialog = new TimeTableManager.UI.FPatternDialog(); dialog.Pattern = pattern; if (dialog.ShowDialog(this.MainForm) == DialogResult.OK) { Refresh(); } } }
/// <summary> /// Disposes of the device detection providers. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Application_End(object sender, EventArgs e) { if (_pattern != null) { _pattern.Dispose(); _pattern = null; } if (_trie != null) { _trie.Dispose(); _trie = null; } }
/// <summary>勤務シフトの削除 /// </summary> /// <param name="sender">イベントの発生したオブジェクト</param> /// <param name="e">発生したイベント</param> private void TsmiRemovePattern_Click (object sender, EventArgs e) { CMember member = this.Members[CurrentRowIndex]; PatternWrapper wrapper = Member2PatternWrapper[member]; CPattern pattern = wrapper.Pattern; if (pattern != null && !pattern.BuiltIn) { TimeTableManager.UI.FPatternDialog dialog = new TimeTableManager.UI.FPatternDialog(); dialog.Pattern = pattern; pattern.SetAvailable(false, StartDate.AddDays(-1.0)); if (dialog.ShowDialog(this.MainForm) == DialogResult.OK) { this.TimeTable.Patterns.DelPattern(pattern); SetUpValidMembers(); Refresh(); } else { pattern.SetAvailable(true); } } }
static void Main(string[] args) { // Initialise the pattern provider with a list of 4 properties. using (var pattern = new PatternWrapper( new FileInfo("..\\..\\..\\..\\..\\data\\51Degrees-LiteV3.2.dat").FullName, new[] { "Id", "DeviceType", "IsMobile", "ScreenPixelsWidth", "ScreenPixelsHeight" })) { // Initialise the trie provider with a data file and a list of 4 properties. using (var trie = new TrieWrapper( new FileInfo("..\\..\\..\\..\\..\\data\\51Degrees-LiteV3.2.trie").FullName, new[] { "Id", "DeviceType", "IsMobile", "ScreenPixelsWidth", "ScreenPixelsHeight" })) { // IMPORTANT: For a full list of properties see: https://51degrees.com/resources/property-dictionary using (var reader = new FileInfo(args.Length > 0 ? args[0] : "..\\..\\..\\..\\..\\data\\20000 User Agents.csv").OpenText()) { var start = DateTime.UtcNow; Console.WriteLine("Started -> {0}", start); var line = reader.ReadLine(); while (line != null) { using (var patternResults = pattern.Match(line.Trim())) { Output(pattern, patternResults); } using (var trieResults = trie.Match(line.Trim())) { Output(trie, trieResults); } line = reader.ReadLine(); } Console.WriteLine("Elapsed Time -> {0} seconds", (DateTime.UtcNow - start).TotalSeconds); } } } Console.ReadKey(); }
public PatternTypeInfo(AutomationPattern id, PatternWrapper clientSideWrapper) { this._id = id; this._clientSideWrapper = clientSideWrapper; }
/// <summary>バー部分の描画 /// </summary> /// <param name="sender">イベントの発生したオブジェクト</param> /// <param name="e">発生したイベント</param> private void PaintBarColumn (object sender, DataGridViewCellPaintingEventArgs e) { if (TimeTable != null) { e.Paint(e.CellBounds, e.PaintParts); CMember member = Members[e.RowIndex]; PatternWrapper wrapper = Member2PatternWrapper[member]; e.Handled = true; float WidthOf1Hour = e.CellBounds.Width / (TotalHours); // 1時間の幅 float AreaStart = e.CellBounds.X + (WidthOf1Hour / 2); // 時間領域の開始位置 #region 1時間毎の縦線 Pen pen = Pens.LightGray; TimeSpan work = TableStart; // 初期値 for (int i = 0; i < TotalHours; i++) { // 時刻を表示する float WorkX = AreaStart + (WidthOf1Hour * i); PointF point1 = new PointF(WorkX, e.CellBounds.Top); PointF point2 = new PointF(WorkX, e.CellBounds.Bottom); e.Graphics.DrawLine(pen, point1, point2); work = work.Add(TimeSpan.FromHours(1.0)); } #endregion if (wrapper.Pattern == CPattern.NULL || wrapper.Pattern == CPattern.DAYOFF) { // 休みなら処理しない if (BarLabelStatus == EnumBarLabelStatus.Creating && CurrentRowIndex == e.RowIndex) { float WorkW = (MovingPoint.X > StartPoint.X ? MovingPoint.X - StartPoint.X : StartPoint.X - MovingPoint.X); float WorkX = (MovingPoint.X > StartPoint.X ? e.CellBounds.X + StartPoint.X : e.CellBounds.X + MovingPoint.X); float WorkY = e.CellBounds.Y + e.CellBounds.Height / 4; float WorkH = e.CellBounds.Height / 2; e.Graphics.DrawRectangle(Pens.Black, WorkX, WorkY, WorkW, WorkH); } } else { // バーチャートの描画 RectangleF BarRect = GetPattern2Rect(e.CellBounds, wrapper); Brush BarBrush = (member.IsChief ? Brushes.Red : Brushes.Blue); e.Graphics.FillRectangle(BarBrush, BarRect); // バーチャートの移動中 if (BarLabelStatus != EnumBarLabelStatus.None && CurrentRowIndex == e.RowIndex) { float WorkW = (MovingPoint.X > StartPoint.X ? MovingPoint.X - StartPoint.X : StartPoint.X - MovingPoint.X); float WorkX = (MovingPoint.X > StartPoint.X ? e.CellBounds.X + StartPoint.X : e.CellBounds.X + MovingPoint.X); switch (BarLabelStatus) { case EnumBarLabelStatus.StartMoving: WorkW = BarRect.Width + (StartPoint.X - MovingPoint.X); if (WorkW >= 0) { WorkX = BarRect.X + BarRect.Width - WorkW; } else { WorkW = -WorkW; WorkX = BarRect.X + BarRect.Width; } break; case EnumBarLabelStatus.EndMoving: WorkX = BarRect.X; WorkW = BarRect.Width + (MovingPoint.X - StartPoint.X); if (WorkW < 0) { WorkW = -WorkW; WorkX = BarRect.X - WorkW; } break; case EnumBarLabelStatus.AllMoving: WorkX = BarRect.X + (MovingPoint.X - StartPoint.X); WorkW = BarRect.Width; break; } e.Graphics.DrawRectangle(Pens.LightGray, WorkX, BarRect.Top, WorkW, BarRect.Height); Brush brush = (member.IsChief ? Brushes.Green : Brushes.HotPink); e.Graphics.FillRectangle(brush, WorkX, BarRect.Top + (BarRect.Height / 2), WorkW, BarRect.Height / 2); } } e.PaintContent(e.ClipBounds); } }