Merge branch 'master' of http://www.scserverddns.top:13000/sc/SunlightCentralizedControlManagement
This commit is contained in:
commit
11f0ffd0ea
13 files changed
+489
-67
No files matched your search
@@ -1,10 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Timeline.Model;
|
||||
using Timelines.Model;
|
||||
using System.Windows.Forms;
|
||||
using System.Drawing;
|
||||
|
||||
namespace Timeline
|
||||
namespace Timelines
|
||||
{
|
||||
public static class ChartConstants
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
|
||||
namespace Timeline.Model
|
||||
namespace Timelines.Model
|
||||
{
|
||||
public class BarModel
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace Timeline.Model
|
||||
namespace Timelines.Model
|
||||
{
|
||||
public class HeaderModel
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
|
||||
namespace Timeline.Model
|
||||
namespace Timelines.Model
|
||||
{
|
||||
public class ItemModel
|
||||
{
|
||||
|
||||
@@ -3,11 +3,11 @@ using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Runtime.Remoting.Messaging;
|
||||
using Timeline.Model;
|
||||
using Timeline;
|
||||
using Timelines.Model;
|
||||
using Timelines;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Timeline.Processor
|
||||
namespace Timelines.Processor
|
||||
{
|
||||
public class BarChartProcessor
|
||||
{
|
||||
|
||||
@@ -2,35 +2,32 @@
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("Timeline")]
|
||||
// 有关程序集的一般信息由以下
|
||||
// 控制。更改这些特性值可修改
|
||||
// 与程序集关联的信息。
|
||||
[assembly: AssemblyTitle("Timelines")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Timeline")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2014")]
|
||||
[assembly: AssemblyProduct("Timelines")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2024")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
// 将 ComVisible 设置为 false 会使此程序集中的类型
|
||||
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
|
||||
//请将此类型的 ComVisible 特性设置为 true。
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("40f4c82a-50c5-4880-a19b-dec078fac398")]
|
||||
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
|
||||
[assembly: Guid("fcaa62db-0f2f-449c-8511-c6f0821688a7")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
// 程序集的版本信息由下列四个值组成:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
// 主版本
|
||||
// 次版本
|
||||
// 生成号
|
||||
// 修订号
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
Generated
+38
@@ -0,0 +1,38 @@
|
||||
namespace Timelines
|
||||
{
|
||||
partial class Timeline
|
||||
{
|
||||
/// <summary>
|
||||
/// 必需的设计器变量。
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// 清理所有正在使用的资源。
|
||||
/// </summary>
|
||||
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region 组件设计器生成的代码
|
||||
|
||||
/// <summary>
|
||||
/// 设计器支持所需的方法 - 不要修改
|
||||
/// 使用代码编辑器修改此方法的内容。
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
components = new System.ComponentModel.Container();
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(800, 450);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,314 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Timelines.Model;
|
||||
using Timelines.Processor;
|
||||
|
||||
namespace Timelines
|
||||
{
|
||||
public partial class Timeline : UserControl
|
||||
{
|
||||
#region public properties
|
||||
public SolidBrush HoverClickSolidBrush { get; set; }
|
||||
public Font RowFont { get; set; }
|
||||
public Font DateFont { get; set; }
|
||||
public Font TimeFont { get; set; }
|
||||
#endregion
|
||||
|
||||
#region private properties
|
||||
private ToolTip ToolTip { get; set; }
|
||||
private VScrollBar VScrollBar1 { get; set; }
|
||||
private int AvailableWidth { get; set; }
|
||||
private Point OldMousePosition { get; set; }
|
||||
private int ScrollPosition { get; set; }
|
||||
private List<string> ToolTipTextList { get; set; }
|
||||
private string ToolTipTextTitle { get; set; }
|
||||
private List<BarModel> BarList { get; set; }
|
||||
private DateTime StartDate { get; set; }
|
||||
private int DistinctItemCount { get; set; }
|
||||
private DateTime EndDate { get; set; }
|
||||
#endregion
|
||||
public Timeline()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
public void ShowBarChart(DateTime chartStartDate, DateTime chartEndDate, List<ItemModel> items)
|
||||
{
|
||||
this.StartDate = chartStartDate;
|
||||
this.EndDate = chartEndDate;
|
||||
var proc = new BarChartProcessor();
|
||||
this.BarList = proc.GetBarList(items);
|
||||
this.DistinctItemCount = items.Select(i => i.ItemName).Distinct().Count();
|
||||
|
||||
this.Refresh();
|
||||
}
|
||||
private void ChartMouseMove(Object sender, MouseEventArgs e)
|
||||
{
|
||||
var localMousePosition = new Point(e.X, e.Y);
|
||||
|
||||
if (BarList == null || BarList.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (localMousePosition == this.OldMousePosition)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var proc = new BarChartProcessor();
|
||||
|
||||
var mouseOverObject = false;
|
||||
var tempText = new List<string>();
|
||||
var tempTitle = "";
|
||||
|
||||
Parallel.ForEach(this.BarList, bar =>
|
||||
{
|
||||
if (proc.MouseInsideBar(localMousePosition, bar) && bar.Visible)
|
||||
{
|
||||
bar.IsMouseOver = true;
|
||||
tempTitle = bar.Name;
|
||||
tempText.Add("Event Start: " + bar.StartValue.ToUniversalTime());
|
||||
tempText.Add("Event End: " + bar.EndValue.ToUniversalTime());
|
||||
mouseOverObject = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
bar.IsMouseOver = false;
|
||||
}
|
||||
});
|
||||
|
||||
this.ToolTipTextList = tempText;
|
||||
this.ToolTipTextTitle = tempTitle;
|
||||
this.ToolTip.SetToolTip(this, this.ToolTipTextList.Count > 0 ? this.ToolTipTextList.ToString() : "");
|
||||
|
||||
if (mouseOverObject)
|
||||
{
|
||||
this.Refresh();
|
||||
}
|
||||
|
||||
this.OldMousePosition = localMousePosition;
|
||||
}
|
||||
private void ChartMouseClick(Object sender, MouseEventArgs e)
|
||||
{
|
||||
if (BarList == null || BarList.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var localMousePosition = new Point(e.X, e.Y);
|
||||
|
||||
var proc = new BarChartProcessor();
|
||||
|
||||
this.BarList = proc.MouseClickHandler(this.BarList, localMousePosition);
|
||||
}
|
||||
private void ChartMouseWheel(object sender, MouseEventArgs e)
|
||||
{
|
||||
this.VScrollBar1.Focus();
|
||||
}
|
||||
private void Timeline_Load(object sender, EventArgs e)
|
||||
{
|
||||
//initialize public properties
|
||||
RowFont = TimeFont = DateFont = new Font("Segoe UI", 10, FontStyle.Regular, GraphicsUnit.Point);
|
||||
HoverClickSolidBrush = new SolidBrush(Color.LightBlue);
|
||||
BackColor = Color.White;
|
||||
|
||||
//initialize mouse controls
|
||||
MouseMove += ChartMouseMove;
|
||||
MouseWheel += ChartMouseWheel;
|
||||
MouseClick += ChartMouseClick;
|
||||
|
||||
//initialize Tooltip
|
||||
this.ToolTip = new ToolTip
|
||||
{
|
||||
OwnerDraw = true
|
||||
};
|
||||
this.ToolTip.Draw += ToolTipText_Draw;
|
||||
this.ToolTip.Popup += ToolTipText_Popup;
|
||||
|
||||
//Flicker free drawing
|
||||
SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
|
||||
|
||||
//ScrollBar
|
||||
this.VScrollBar1 = new VScrollBar
|
||||
{
|
||||
Dock = DockStyle.Right,
|
||||
Visible = false
|
||||
};
|
||||
Controls.Add(this.VScrollBar1);
|
||||
this.VScrollBar1.Scroll += vScrollBar1_Scroll;
|
||||
}
|
||||
private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
|
||||
{
|
||||
this.ScrollPosition = this.VScrollBar1.Value;
|
||||
this.Refresh();
|
||||
}
|
||||
private void ToolTipText_Draw(Object sender, DrawToolTipEventArgs e)
|
||||
{
|
||||
if (this.ToolTipTextList.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
e.Graphics.FillRectangle(Brushes.White, e.Bounds);
|
||||
e.Graphics.DrawString(this.ToolTipTextTitle, ChartConstants.TitleFont, Brushes.Black, 5, 0);
|
||||
|
||||
// Draws the lines in the text box
|
||||
foreach (var item in this.ToolTipTextList)
|
||||
{
|
||||
var stringY = (ChartConstants.ToolTipTitleHeight - ChartConstants.ToolTipfontHeight - e.Graphics.MeasureString(item, ChartConstants.RowFont).Height) / 2 +
|
||||
10 + ((this.ToolTipTextList.IndexOf(item) + 1) * 14);
|
||||
e.Graphics.DrawString(item, ChartConstants.RowFont, Brushes.Black, 5, stringY);
|
||||
}
|
||||
}
|
||||
private void ToolTipText_Popup(Object sender, PopupEventArgs e)
|
||||
{
|
||||
var toolTipHeight = (ChartConstants.ToolTipTitleHeight + 4) + (this.ToolTipTextList.Count * (ChartConstants.ToolTipfontHeight + 3));
|
||||
e.ToolTipSize = new Size(230, toolTipHeight);
|
||||
}
|
||||
private void PaintChart(Graphics graphics)
|
||||
{
|
||||
if (BarList == null || BarList.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var proc = new BarChartProcessor();
|
||||
var headerList = proc.GetFullHeaderList(this.StartDate, this.EndDate, this.Width, this.TimeFont);
|
||||
if (headerList.Count == 0 || this.DistinctItemCount == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var pixelsPerSecond = proc.GetPixelsPerSecond(headerList);
|
||||
|
||||
this.AvailableWidth = Width - ChartConstants.BarStartLeft - ChartConstants.BarStartRight;
|
||||
|
||||
if (this.DistinctItemCount * (ChartConstants.BarHeight + ChartConstants.BarSpace) > Height)
|
||||
{
|
||||
this.VScrollBar1.Visible = true;
|
||||
this.VScrollBar1.Maximum = this.DistinctItemCount - 3;
|
||||
}
|
||||
|
||||
graphics.Clear(BackColor);
|
||||
DrawChartHeadersAndNet(graphics, headerList);
|
||||
|
||||
DrawBars(graphics, this.BarList, pixelsPerSecond);
|
||||
}
|
||||
protected override void OnPaint(PaintEventArgs pe)
|
||||
{
|
||||
PaintChart(pe.Graphics);
|
||||
}
|
||||
private void DrawBars(Graphics graphics, IEnumerable<BarModel> barList, double pixelsPerSecond)
|
||||
{
|
||||
//list of machineNames to add to the left of each row
|
||||
var rowTitleList = new List<string>();
|
||||
|
||||
var proc = new BarChartProcessor();
|
||||
|
||||
// Draws each bar
|
||||
foreach (var bar in barList)
|
||||
{
|
||||
var numberOfBarsInControl = (Height - ChartConstants.BarStartTop) / (ChartConstants.BarHeight + ChartConstants.BarSpace);
|
||||
|
||||
if ((bar.RowIndex >= this.ScrollPosition &&
|
||||
bar.RowIndex < numberOfBarsInControl + this.ScrollPosition))
|
||||
{
|
||||
var newBar = proc.GetBar(bar, this.StartDate, pixelsPerSecond, ScrollPosition, this.Width);
|
||||
DrawBarAndRowText(newBar, rowTitleList, graphics);
|
||||
}
|
||||
else
|
||||
{
|
||||
bar.Visible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
private void DrawBarAndRowText(BarModel newBar, ICollection<string> rowTitleList, Graphics graphics)
|
||||
{
|
||||
var barBrush = new SolidBrush(newBar.Color);
|
||||
if (newBar.IsMouseOver || newBar.IsClicked)
|
||||
{
|
||||
barBrush = HoverClickSolidBrush;
|
||||
}
|
||||
|
||||
graphics.FillRectangle(barBrush, newBar.BarRectangle);
|
||||
graphics.DrawRectangle(Pens.Black, newBar.BarRectangle);
|
||||
|
||||
// Draws the rowtext, only once for each machine
|
||||
if (!rowTitleList.Contains(newBar.Name))
|
||||
{
|
||||
graphics.DrawString(newBar.Name,
|
||||
RowFont,
|
||||
Brushes.Black,
|
||||
0,
|
||||
ChartConstants.BarStartTop + (ChartConstants.BarHeight * (newBar.RowIndex - this.ScrollPosition)) +
|
||||
(ChartConstants.BarSpace * (newBar.RowIndex - this.ScrollPosition)));
|
||||
|
||||
rowTitleList.Add(newBar.Name);
|
||||
}
|
||||
}
|
||||
private void DrawChartHeadersAndNet(Graphics graphics, IList<HeaderModel> headerList)
|
||||
{
|
||||
var verticalLineLastY = ChartConstants.BarStartTop + (this.DistinctItemCount - this.ScrollPosition) * (ChartConstants.BarHeight + ChartConstants.BarSpace);
|
||||
|
||||
//draw headers
|
||||
foreach (var header in headerList)
|
||||
{
|
||||
//draw the date when there is a change of day
|
||||
var index = headerList.IndexOf(header);
|
||||
|
||||
if (headerList.IndexOf(header) == 0
|
||||
|| header.HeaderDateTime.Day != headerList[index - 1].HeaderDateTime.Day)
|
||||
{
|
||||
graphics.DrawString(
|
||||
header.HeaderDateTime.ToShortDateString(),
|
||||
DateFont,
|
||||
Brushes.Black,
|
||||
header.StartLocation,
|
||||
0);
|
||||
}
|
||||
|
||||
graphics.DrawString(
|
||||
header.HeaderDateTime.ToShortTimeString(),
|
||||
TimeFont,
|
||||
Brushes.Black,
|
||||
header.StartLocation,
|
||||
ChartConstants.HeaderTimeStartTop);
|
||||
|
||||
//draw vertical line under header
|
||||
graphics.DrawLine(
|
||||
ChartConstants.GridColor,
|
||||
header.StartLocation,
|
||||
ChartConstants.HeaderTimeStartTop,
|
||||
header.StartLocation,
|
||||
verticalLineLastY);
|
||||
|
||||
}
|
||||
|
||||
//draw last vertical line
|
||||
graphics.DrawLine(
|
||||
ChartConstants.GridColor,
|
||||
ChartConstants.BarStartLeft + this.AvailableWidth,
|
||||
ChartConstants.HeaderTimeStartTop,
|
||||
ChartConstants.BarStartLeft + this.AvailableWidth,
|
||||
verticalLineLastY);
|
||||
|
||||
//draw horizontal net
|
||||
for (var index = 0; index < this.DistinctItemCount; index++)
|
||||
{
|
||||
var y = ChartConstants.BarStartTop + index * (ChartConstants.BarHeight + ChartConstants.BarSpace);
|
||||
graphics.DrawLine(
|
||||
ChartConstants.GridColor,
|
||||
ChartConstants.BarStartLeft,
|
||||
y,
|
||||
ChartConstants.BarStartLeft + this.AvailableWidth,
|
||||
y
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{77D9FB0A-D628-4002-A118-B3D6E6601092}</ProjectGuid>
|
||||
<ProjectGuid>{FCAA62DB-0F2F-449C-8511-C6F0821688A7}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Timeline</RootNamespace>
|
||||
<AssemblyName>Timeline</AssemblyName>
|
||||
<RootNamespace>Timelines</RootNamespace>
|
||||
<AssemblyName>Timelines</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile />
|
||||
<Deterministic>true</Deterministic>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
@@ -38,6 +37,7 @@
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
@@ -47,27 +47,14 @@
|
||||
<Compile Include="Model\HeaderModel.cs" />
|
||||
<Compile Include="Model\ItemModel.cs" />
|
||||
<Compile Include="Processor\BarChartProcessor.cs" />
|
||||
<Compile Include="TimelineChart.cs">
|
||||
<Compile Include="Timeline.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="TimelineChart.Designer.cs">
|
||||
<DependentUpon>TimelineChart.cs</DependentUpon>
|
||||
<Compile Include="Timeline.Designer.cs">
|
||||
<DependentUpon>Timeline.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="TimelineChart.resx">
|
||||
<DependentUpon>TimelineChart.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
Reference in new issue
Block a user