initial commit

This commit is contained in:
Zechert, Frank (EXTERN: Capgemini) 2020-12-17 17:45:20 +01:00
parent 9691e6b54e
commit 4c9fa6feff
26 changed files with 3419 additions and 0 deletions

52
App.config Normal file
View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="MeetingClock.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="MeetingClock.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<applicationSettings>
<MeetingClock.Properties.Settings>
<setting name="Version" serializeAs="String">
<value>v. 1.0.0</value>
</setting>
</MeetingClock.Properties.Settings>
</applicationSettings>
<userSettings>
<MeetingClock.Properties.Settings>
<setting name="CheckForUpdates" serializeAs="String">
<value>True</value>
</setting>
<setting name="StartMinimized" serializeAs="String">
<value>False</value>
</setting>
<setting name="StartBluetooth" serializeAs="String">
<value>False</value>
</setting>
<setting name="IgnoreAllDayAppointments" serializeAs="String">
<value>True</value>
</setting>
<setting name="IgnoreCancelledAppointments" serializeAs="String">
<value>True</value>
</setting>
<setting name="IgnoreFreeAppointments" serializeAs="String">
<value>False</value>
</setting>
<setting name="IgnoreOutOfOfficeAppointments" serializeAs="String">
<value>False</value>
</setting>
<setting name="IgnoreTentativeAppointments" serializeAs="String">
<value>False</value>
</setting>
<setting name="ReminderTime" serializeAs="String">
<value>10</value>
</setting>
</MeetingClock.Properties.Settings>
</userSettings>
</configuration>

171
BluetoothManager.cs Normal file
View File

@ -0,0 +1,171 @@
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Timers;
using Windows.Devices.Bluetooth;
using Windows.Devices.Radios;
namespace MeetingClock
{
public class BluetoothManager
{
public enum BluetoothState
{
NotInitialized,
Exception,
NoBluetoothAdapter,
NoBluetoothRadio,
Disabled,
Off,
On,
Unknown
}
public delegate void BluetoothStateChangeHandler(BluetoothManager manager, BluetoothState oldState, BluetoothState newState);
public event BluetoothStateChangeHandler StateChanged;
public BluetoothState State { get; private set; } = BluetoothState.NotInitialized;
private BluetoothAdapter adapter;
private Radio radio;
private Timer updateTimer;
public BluetoothManager()
{
this.updateTimer = new Timer(100);
this.updateTimer.Elapsed += UpdateTimer_Elapsed;
}
public async Task Initialize()
{
await this.InitializePrivate(true);
}
private async Task InitializePrivate(bool withLog)
{
try
{
this.adapter = await BluetoothAdapter.GetDefaultAsync();
if (this.adapter == null)
{
if (withLog)
{
Debug.WriteLine("No BluetoothAdapter found");
}
this.State = BluetoothState.NoBluetoothAdapter;
this.StateChanged(this, BluetoothState.NotInitialized, BluetoothState.NoBluetoothAdapter);
this.updateTimer.Start();
return;
}
if (withLog)
{
Debug.WriteLine(String.Format("Found BluetoothAdapter device id: {0}, address: {1}", this.adapter.DeviceId, this.adapter.BluetoothAddress));
}
this.radio = await this.adapter.GetRadioAsync();
if (this.radio == null)
{
if (withLog)
{
Debug.WriteLine("No Radio found");
}
this.State = BluetoothState.NoBluetoothRadio;
this.StateChanged(this, BluetoothState.NotInitialized, BluetoothState.NoBluetoothRadio);
this.updateTimer.Start();
return;
}
if (withLog)
{
Debug.WriteLine(String.Format("Found Bluetooth Radio device: {0}", this.radio.Name));
}
this.radio.StateChanged += Radio_StateChanged;
this.UpdateState();
if (withLog)
{
Debug.WriteLine(String.Format("Bluetooth State: {0}", this.State));
}
this.updateTimer.Start();
}
catch (Exception exception)
{
if (withLog)
{
Debug.WriteLine(String.Format("Exception while discovering bluetooth adapter, radio, and state: {0}", exception.Message));
}
this.State = BluetoothState.Exception;
this.StateChanged(this, BluetoothState.NotInitialized, BluetoothState.Exception);
}
}
private void UpdateState() {
RadioState state = this.radio.State;
BluetoothState oldState = this.State;
BluetoothState btState;
switch (state)
{
case RadioState.Disabled:
btState = BluetoothState.Disabled;
break;
case RadioState.Off:
btState = BluetoothState.Off;
break;
case RadioState.On:
btState = BluetoothState.On;
break;
default:
btState = BluetoothState.Unknown;
break;
}
if (btState != this.State)
{
Debug.WriteLine(String.Format("New Bluetooth state detected. Old state {0}, new state {1}", this.State, btState));
this.State = btState;
if (this.StateChanged != null)
{
this.StateChanged(this, oldState, btState);
}
}
}
private void Radio_StateChanged(Radio sender, object args)
{
this.UpdateState();
}
private async void UpdateTimer_Elapsed(object sender, ElapsedEventArgs e)
{
switch (this.State)
{
case BluetoothState.Exception:
this.updateTimer.Stop();
break;
case BluetoothState.NotInitialized:
case BluetoothState.NoBluetoothAdapter:
case BluetoothState.NoBluetoothRadio:
await this.InitializePrivate(false);
break;
default:
this.UpdateState();
break;
}
}
public async Task<RadioAccessStatus> Enable()
{
if (this.radio != null) {
return await this.radio.SetStateAsync(RadioState.On);
}
return RadioAccessStatus.Unspecified;
}
public void Stop()
{
this.updateTimer.Stop();
}
}
}

752
MainWindow.Designer.cs generated Normal file
View File

@ -0,0 +1,752 @@

namespace MeetingClock
{
partial class MainWindow
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow));
this.groupBoxState = new System.Windows.Forms.GroupBox();
this.buttonWebsite = new System.Windows.Forms.Button();
this.buttonOpenSystemSettingsBluetooth = new System.Windows.Forms.Button();
this.labelMeetingClockState = new System.Windows.Forms.Label();
this.labelMeetingClockStateTitle = new System.Windows.Forms.Label();
this.buttonOpenSystemSettingsPrivacy = new System.Windows.Forms.Button();
this.buttonEnableBluetooth = new System.Windows.Forms.Button();
this.labelBluetoothState = new System.Windows.Forms.Label();
this.labelBluetoothStateTitle = new System.Windows.Forms.Label();
this.groupBoxApplicationSettings = new System.Windows.Forms.GroupBox();
this.checkBoxEnableBluetooth = new System.Windows.Forms.CheckBox();
this.checkBoxCheckForUpdates = new System.Windows.Forms.CheckBox();
this.checkBoxStartMinimized = new System.Windows.Forms.CheckBox();
this.checkBoxAutostart = new System.Windows.Forms.CheckBox();
this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
this.timerEnableBalloon = new System.Windows.Forms.Timer(this.components);
this.groupBoxAppointmentSettings = new System.Windows.Forms.GroupBox();
this.checkBoxIgnoreTentativeAppointments = new System.Windows.Forms.CheckBox();
this.checkBoxIgnoreOutOfOfficeAppointments = new System.Windows.Forms.CheckBox();
this.checkBoxIgnoreFreeAppointments = new System.Windows.Forms.CheckBox();
this.checkBoxIgnoreCancelledAppointments = new System.Windows.Forms.CheckBox();
this.checkBoxIgnoreAllDayAppointments = new System.Windows.Forms.CheckBox();
this.groupBoxClockSettings = new System.Windows.Forms.GroupBox();
this.label1 = new System.Windows.Forms.Label();
this.numericUpDownScrollWait = new System.Windows.Forms.NumericUpDown();
this.labelScrollWaitTitle = new System.Windows.Forms.Label();
this.labelScrollSpeed = new System.Windows.Forms.Label();
this.labelScrollSpeedTitle = new System.Windows.Forms.Label();
this.trackBarScrollSpeed = new System.Windows.Forms.TrackBar();
this.labelBrightness = new System.Windows.Forms.Label();
this.labelBrightnessTitle = new System.Windows.Forms.Label();
this.trackBarBrightness = new System.Windows.Forms.TrackBar();
this.labelTemperatureIntervalTitleSeconds = new System.Windows.Forms.Label();
this.numericUpDownTemperatureInterval = new System.Windows.Forms.NumericUpDown();
this.checkBoxTemperatureEnabled = new System.Windows.Forms.CheckBox();
this.labelDateIntervalTitleSeconds = new System.Windows.Forms.Label();
this.numericUpDownDateInterval = new System.Windows.Forms.NumericUpDown();
this.labelTimeIntervalTitleSeconds = new System.Windows.Forms.Label();
this.numericUpDownTimeInterval = new System.Windows.Forms.NumericUpDown();
this.labelTimeIntervalTitle = new System.Windows.Forms.Label();
this.checkBoxDateEnabled = new System.Windows.Forms.CheckBox();
this.timerScrollDemo = new System.Windows.Forms.Timer(this.components);
this.buttonResetDefault = new System.Windows.Forms.Button();
this.timerAdjustClock = new System.Windows.Forms.Timer(this.components);
this.timerGetAppointment = new System.Windows.Forms.Timer(this.components);
this.label2 = new System.Windows.Forms.Label();
this.numericUpDownReminderTime = new System.Windows.Forms.NumericUpDown();
this.labelStartReminderTitle = new System.Windows.Forms.Label();
this.groupBoxState.SuspendLayout();
this.groupBoxApplicationSettings.SuspendLayout();
this.groupBoxAppointmentSettings.SuspendLayout();
this.groupBoxClockSettings.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownScrollWait)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.trackBarScrollSpeed)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.trackBarBrightness)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTemperatureInterval)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownDateInterval)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeInterval)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownReminderTime)).BeginInit();
this.SuspendLayout();
//
// groupBoxState
//
this.groupBoxState.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBoxState.Controls.Add(this.buttonWebsite);
this.groupBoxState.Controls.Add(this.buttonOpenSystemSettingsBluetooth);
this.groupBoxState.Controls.Add(this.labelMeetingClockState);
this.groupBoxState.Controls.Add(this.labelMeetingClockStateTitle);
this.groupBoxState.Controls.Add(this.buttonOpenSystemSettingsPrivacy);
this.groupBoxState.Controls.Add(this.buttonEnableBluetooth);
this.groupBoxState.Controls.Add(this.labelBluetoothState);
this.groupBoxState.Controls.Add(this.labelBluetoothStateTitle);
this.groupBoxState.Location = new System.Drawing.Point(12, 12);
this.groupBoxState.Name = "groupBoxState";
this.groupBoxState.Size = new System.Drawing.Size(560, 100);
this.groupBoxState.TabIndex = 0;
this.groupBoxState.TabStop = false;
this.groupBoxState.Text = "State";
//
// buttonWebsite
//
this.buttonWebsite.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.buttonWebsite.Location = new System.Drawing.Point(392, 65);
this.buttonWebsite.Name = "buttonWebsite";
this.buttonWebsite.Size = new System.Drawing.Size(162, 23);
this.buttonWebsite.TabIndex = 8;
this.buttonWebsite.Text = "Open Website";
this.buttonWebsite.UseVisualStyleBackColor = true;
this.buttonWebsite.Click += new System.EventHandler(this.buttonWebsite_Click);
//
// buttonOpenSystemSettingsBluetooth
//
this.buttonOpenSystemSettingsBluetooth.Location = new System.Drawing.Point(197, 65);
this.buttonOpenSystemSettingsBluetooth.Name = "buttonOpenSystemSettingsBluetooth";
this.buttonOpenSystemSettingsBluetooth.Size = new System.Drawing.Size(185, 23);
this.buttonOpenSystemSettingsBluetooth.TabIndex = 7;
this.buttonOpenSystemSettingsBluetooth.Text = "Open System Settings: Bluetooth";
this.buttonOpenSystemSettingsBluetooth.UseVisualStyleBackColor = true;
this.buttonOpenSystemSettingsBluetooth.Click += new System.EventHandler(this.buttonOpenSystemSettingsBluetooth_Click);
//
// labelMeetingClockState
//
this.labelMeetingClockState.AutoSize = true;
this.labelMeetingClockState.Location = new System.Drawing.Point(99, 46);
this.labelMeetingClockState.Name = "labelMeetingClockState";
this.labelMeetingClockState.Size = new System.Drawing.Size(51, 13);
this.labelMeetingClockState.TabIndex = 6;
this.labelMeetingClockState.Text = "unknown";
//
// labelMeetingClockStateTitle
//
this.labelMeetingClockStateTitle.AutoSize = true;
this.labelMeetingClockStateTitle.Location = new System.Drawing.Point(7, 46);
this.labelMeetingClockStateTitle.Name = "labelMeetingClockStateTitle";
this.labelMeetingClockStateTitle.Size = new System.Drawing.Size(78, 13);
this.labelMeetingClockStateTitle.TabIndex = 5;
this.labelMeetingClockStateTitle.Text = "Meeting Clock:";
//
// buttonOpenSystemSettingsPrivacy
//
this.buttonOpenSystemSettingsPrivacy.Location = new System.Drawing.Point(6, 65);
this.buttonOpenSystemSettingsPrivacy.Name = "buttonOpenSystemSettingsPrivacy";
this.buttonOpenSystemSettingsPrivacy.Size = new System.Drawing.Size(185, 23);
this.buttonOpenSystemSettingsPrivacy.TabIndex = 3;
this.buttonOpenSystemSettingsPrivacy.Text = "Open System Settings: Privacy";
this.buttonOpenSystemSettingsPrivacy.UseVisualStyleBackColor = true;
this.buttonOpenSystemSettingsPrivacy.Click += new System.EventHandler(this.ButtonOpenSystemSettingsPrivacy_Click);
//
// buttonEnableBluetooth
//
this.buttonEnableBluetooth.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.buttonEnableBluetooth.Enabled = false;
this.buttonEnableBluetooth.Location = new System.Drawing.Point(392, 19);
this.buttonEnableBluetooth.Name = "buttonEnableBluetooth";
this.buttonEnableBluetooth.Size = new System.Drawing.Size(162, 40);
this.buttonEnableBluetooth.TabIndex = 2;
this.buttonEnableBluetooth.Text = "Enable Bluetooth";
this.buttonEnableBluetooth.UseVisualStyleBackColor = true;
this.buttonEnableBluetooth.Click += new System.EventHandler(this.ButtonEnableBluetooth_Click);
//
// labelBluetoothState
//
this.labelBluetoothState.AutoSize = true;
this.labelBluetoothState.Location = new System.Drawing.Point(99, 24);
this.labelBluetoothState.Name = "labelBluetoothState";
this.labelBluetoothState.Size = new System.Drawing.Size(51, 13);
this.labelBluetoothState.TabIndex = 1;
this.labelBluetoothState.Text = "unknown";
//
// labelBluetoothStateTitle
//
this.labelBluetoothStateTitle.AutoSize = true;
this.labelBluetoothStateTitle.Location = new System.Drawing.Point(7, 24);
this.labelBluetoothStateTitle.Name = "labelBluetoothStateTitle";
this.labelBluetoothStateTitle.Size = new System.Drawing.Size(83, 13);
this.labelBluetoothStateTitle.TabIndex = 0;
this.labelBluetoothStateTitle.Text = "Bluetooth State:";
//
// groupBoxApplicationSettings
//
this.groupBoxApplicationSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBoxApplicationSettings.Controls.Add(this.checkBoxEnableBluetooth);
this.groupBoxApplicationSettings.Controls.Add(this.checkBoxCheckForUpdates);
this.groupBoxApplicationSettings.Controls.Add(this.checkBoxStartMinimized);
this.groupBoxApplicationSettings.Controls.Add(this.checkBoxAutostart);
this.groupBoxApplicationSettings.Location = new System.Drawing.Point(12, 118);
this.groupBoxApplicationSettings.Name = "groupBoxApplicationSettings";
this.groupBoxApplicationSettings.Size = new System.Drawing.Size(560, 116);
this.groupBoxApplicationSettings.TabIndex = 1;
this.groupBoxApplicationSettings.TabStop = false;
this.groupBoxApplicationSettings.Text = "Application Settings";
//
// checkBoxEnableBluetooth
//
this.checkBoxEnableBluetooth.AutoSize = true;
this.checkBoxEnableBluetooth.Location = new System.Drawing.Point(6, 91);
this.checkBoxEnableBluetooth.Name = "checkBoxEnableBluetooth";
this.checkBoxEnableBluetooth.Size = new System.Drawing.Size(172, 17);
this.checkBoxEnableBluetooth.TabIndex = 3;
this.checkBoxEnableBluetooth.Text = "Automatically Enable Bluetooth";
this.checkBoxEnableBluetooth.UseVisualStyleBackColor = true;
this.checkBoxEnableBluetooth.CheckedChanged += new System.EventHandler(this.checkBoxEnableBluetooth_CheckedChanged);
//
// checkBoxCheckForUpdates
//
this.checkBoxCheckForUpdates.AutoSize = true;
this.checkBoxCheckForUpdates.Location = new System.Drawing.Point(6, 67);
this.checkBoxCheckForUpdates.Name = "checkBoxCheckForUpdates";
this.checkBoxCheckForUpdates.Size = new System.Drawing.Size(180, 17);
this.checkBoxCheckForUpdates.TabIndex = 2;
this.checkBoxCheckForUpdates.Text = "Automatically Check for Updates";
this.checkBoxCheckForUpdates.UseVisualStyleBackColor = true;
this.checkBoxCheckForUpdates.CheckedChanged += new System.EventHandler(this.checkBoxCheckForUpdates_CheckedChanged);
//
// checkBoxStartMinimized
//
this.checkBoxStartMinimized.AutoSize = true;
this.checkBoxStartMinimized.Location = new System.Drawing.Point(6, 43);
this.checkBoxStartMinimized.Name = "checkBoxStartMinimized";
this.checkBoxStartMinimized.Size = new System.Drawing.Size(97, 17);
this.checkBoxStartMinimized.TabIndex = 1;
this.checkBoxStartMinimized.Text = "Start Minimized";
this.checkBoxStartMinimized.UseVisualStyleBackColor = true;
this.checkBoxStartMinimized.CheckedChanged += new System.EventHandler(this.checkBoxStartMinimized_CheckedChanged);
//
// checkBoxAutostart
//
this.checkBoxAutostart.AutoSize = true;
this.checkBoxAutostart.Location = new System.Drawing.Point(6, 19);
this.checkBoxAutostart.Name = "checkBoxAutostart";
this.checkBoxAutostart.Size = new System.Drawing.Size(182, 17);
this.checkBoxAutostart.TabIndex = 0;
this.checkBoxAutostart.Text = "Automatically Start with Windows";
this.checkBoxAutostart.UseVisualStyleBackColor = true;
this.checkBoxAutostart.CheckedChanged += new System.EventHandler(this.checkBoxAutostart_CheckedChanged);
//
// notifyIcon
//
this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
this.notifyIcon.BalloonTipText = "Meeting Clock was minimized to the tray";
this.notifyIcon.BalloonTipTitle = "Minimized to Tray";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon")));
this.notifyIcon.Text = "Meeting Clock";
this.notifyIcon.Visible = true;
this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon_MouseDoubleClick);
//
// timerEnableBalloon
//
this.timerEnableBalloon.Enabled = true;
this.timerEnableBalloon.Interval = 1000;
this.timerEnableBalloon.Tick += new System.EventHandler(this.timerEnableBalloon_Tick);
//
// groupBoxAppointmentSettings
//
this.groupBoxAppointmentSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBoxAppointmentSettings.Controls.Add(this.label2);
this.groupBoxAppointmentSettings.Controls.Add(this.checkBoxIgnoreTentativeAppointments);
this.groupBoxAppointmentSettings.Controls.Add(this.numericUpDownReminderTime);
this.groupBoxAppointmentSettings.Controls.Add(this.labelStartReminderTitle);
this.groupBoxAppointmentSettings.Controls.Add(this.checkBoxIgnoreOutOfOfficeAppointments);
this.groupBoxAppointmentSettings.Controls.Add(this.checkBoxIgnoreFreeAppointments);
this.groupBoxAppointmentSettings.Controls.Add(this.checkBoxIgnoreCancelledAppointments);
this.groupBoxAppointmentSettings.Controls.Add(this.checkBoxIgnoreAllDayAppointments);
this.groupBoxAppointmentSettings.Location = new System.Drawing.Point(12, 241);
this.groupBoxAppointmentSettings.Name = "groupBoxAppointmentSettings";
this.groupBoxAppointmentSettings.Size = new System.Drawing.Size(560, 166);
this.groupBoxAppointmentSettings.TabIndex = 2;
this.groupBoxAppointmentSettings.TabStop = false;
this.groupBoxAppointmentSettings.Text = "Appointment Settings";
//
// checkBoxIgnoreTentativeAppointments
//
this.checkBoxIgnoreTentativeAppointments.AutoSize = true;
this.checkBoxIgnoreTentativeAppointments.Location = new System.Drawing.Point(6, 115);
this.checkBoxIgnoreTentativeAppointments.Name = "checkBoxIgnoreTentativeAppointments";
this.checkBoxIgnoreTentativeAppointments.Size = new System.Drawing.Size(234, 17);
this.checkBoxIgnoreTentativeAppointments.TabIndex = 4;
this.checkBoxIgnoreTentativeAppointments.Text = "Ignore Appointments Marked as \"Tentative\"";
this.checkBoxIgnoreTentativeAppointments.UseVisualStyleBackColor = true;
this.checkBoxIgnoreTentativeAppointments.CheckedChanged += new System.EventHandler(this.checkBoxIgnoreTentativeAppointments_CheckedChanged);
//
// checkBoxIgnoreOutOfOfficeAppointments
//
this.checkBoxIgnoreOutOfOfficeAppointments.AutoSize = true;
this.checkBoxIgnoreOutOfOfficeAppointments.Location = new System.Drawing.Point(6, 91);
this.checkBoxIgnoreOutOfOfficeAppointments.Name = "checkBoxIgnoreOutOfOfficeAppointments";
this.checkBoxIgnoreOutOfOfficeAppointments.Size = new System.Drawing.Size(249, 17);
this.checkBoxIgnoreOutOfOfficeAppointments.TabIndex = 3;
this.checkBoxIgnoreOutOfOfficeAppointments.Text = "Ignore Appointments Marked as \"Out of Office\"";
this.checkBoxIgnoreOutOfOfficeAppointments.UseVisualStyleBackColor = true;
this.checkBoxIgnoreOutOfOfficeAppointments.CheckedChanged += new System.EventHandler(this.checkBoxIgnoreOutOfOfficeAppointments_CheckedChanged);
//
// checkBoxIgnoreFreeAppointments
//
this.checkBoxIgnoreFreeAppointments.AutoSize = true;
this.checkBoxIgnoreFreeAppointments.Location = new System.Drawing.Point(6, 67);
this.checkBoxIgnoreFreeAppointments.Name = "checkBoxIgnoreFreeAppointments";
this.checkBoxIgnoreFreeAppointments.Size = new System.Drawing.Size(210, 17);
this.checkBoxIgnoreFreeAppointments.TabIndex = 2;
this.checkBoxIgnoreFreeAppointments.Text = "Ignore Appointments Marked as \"Free\"";
this.checkBoxIgnoreFreeAppointments.UseVisualStyleBackColor = true;
this.checkBoxIgnoreFreeAppointments.CheckedChanged += new System.EventHandler(this.checkBoxIgnoreFreeAppointments_CheckedChanged);
//
// checkBoxIgnoreCancelledAppointments
//
this.checkBoxIgnoreCancelledAppointments.AutoSize = true;
this.checkBoxIgnoreCancelledAppointments.Location = new System.Drawing.Point(6, 43);
this.checkBoxIgnoreCancelledAppointments.Name = "checkBoxIgnoreCancelledAppointments";
this.checkBoxIgnoreCancelledAppointments.Size = new System.Drawing.Size(173, 17);
this.checkBoxIgnoreCancelledAppointments.TabIndex = 1;
this.checkBoxIgnoreCancelledAppointments.Text = "Ignore Cancelled Appointments";
this.checkBoxIgnoreCancelledAppointments.UseVisualStyleBackColor = true;
this.checkBoxIgnoreCancelledAppointments.CheckedChanged += new System.EventHandler(this.checkBoxIgnoreCancelledAppointments_CheckedChanged);
//
// checkBoxIgnoreAllDayAppointments
//
this.checkBoxIgnoreAllDayAppointments.AutoSize = true;
this.checkBoxIgnoreAllDayAppointments.Location = new System.Drawing.Point(6, 19);
this.checkBoxIgnoreAllDayAppointments.Name = "checkBoxIgnoreAllDayAppointments";
this.checkBoxIgnoreAllDayAppointments.Size = new System.Drawing.Size(159, 17);
this.checkBoxIgnoreAllDayAppointments.TabIndex = 0;
this.checkBoxIgnoreAllDayAppointments.Text = "Ignore All-Day Appointments";
this.checkBoxIgnoreAllDayAppointments.UseVisualStyleBackColor = true;
this.checkBoxIgnoreAllDayAppointments.CheckedChanged += new System.EventHandler(this.checkBoxIgnoreAllDayAppointments_CheckedChanged);
//
// groupBoxClockSettings
//
this.groupBoxClockSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBoxClockSettings.Controls.Add(this.buttonResetDefault);
this.groupBoxClockSettings.Controls.Add(this.label1);
this.groupBoxClockSettings.Controls.Add(this.numericUpDownScrollWait);
this.groupBoxClockSettings.Controls.Add(this.labelScrollWaitTitle);
this.groupBoxClockSettings.Controls.Add(this.labelScrollSpeed);
this.groupBoxClockSettings.Controls.Add(this.labelScrollSpeedTitle);
this.groupBoxClockSettings.Controls.Add(this.trackBarScrollSpeed);
this.groupBoxClockSettings.Controls.Add(this.labelBrightness);
this.groupBoxClockSettings.Controls.Add(this.labelBrightnessTitle);
this.groupBoxClockSettings.Controls.Add(this.trackBarBrightness);
this.groupBoxClockSettings.Controls.Add(this.labelTemperatureIntervalTitleSeconds);
this.groupBoxClockSettings.Controls.Add(this.numericUpDownTemperatureInterval);
this.groupBoxClockSettings.Controls.Add(this.checkBoxTemperatureEnabled);
this.groupBoxClockSettings.Controls.Add(this.labelDateIntervalTitleSeconds);
this.groupBoxClockSettings.Controls.Add(this.numericUpDownDateInterval);
this.groupBoxClockSettings.Controls.Add(this.labelTimeIntervalTitleSeconds);
this.groupBoxClockSettings.Controls.Add(this.numericUpDownTimeInterval);
this.groupBoxClockSettings.Controls.Add(this.labelTimeIntervalTitle);
this.groupBoxClockSettings.Controls.Add(this.checkBoxDateEnabled);
this.groupBoxClockSettings.Enabled = false;
this.groupBoxClockSettings.Location = new System.Drawing.Point(12, 413);
this.groupBoxClockSettings.Name = "groupBoxClockSettings";
this.groupBoxClockSettings.Size = new System.Drawing.Size(560, 200);
this.groupBoxClockSettings.TabIndex = 3;
this.groupBoxClockSettings.TabStop = false;
this.groupBoxClockSettings.Text = "Clock Settings";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(227, 170);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(49, 13);
this.label1.TabIndex = 18;
this.label1.Text = "Seconds";
//
// numericUpDownScrollWait
//
this.numericUpDownScrollWait.DecimalPlaces = 1;
this.numericUpDownScrollWait.Location = new System.Drawing.Point(162, 166);
this.numericUpDownScrollWait.Maximum = new decimal(new int[] {
255,
0,
0,
65536});
this.numericUpDownScrollWait.Name = "numericUpDownScrollWait";
this.numericUpDownScrollWait.Size = new System.Drawing.Size(63, 20);
this.numericUpDownScrollWait.TabIndex = 17;
this.numericUpDownScrollWait.Value = new decimal(new int[] {
4,
0,
0,
0});
this.numericUpDownScrollWait.ValueChanged += new System.EventHandler(this.numericUpDownScrollWait_ValueChanged);
//
// labelScrollWaitTitle
//
this.labelScrollWaitTitle.AutoSize = true;
this.labelScrollWaitTitle.Location = new System.Drawing.Point(6, 170);
this.labelScrollWaitTitle.Name = "labelScrollWaitTitle";
this.labelScrollWaitTitle.Size = new System.Drawing.Size(106, 13);
this.labelScrollWaitTitle.TabIndex = 16;
this.labelScrollWaitTitle.Text = "Wait Before Scrolling";
//
// labelScrollSpeed
//
this.labelScrollSpeed.AutoSize = true;
this.labelScrollSpeed.Location = new System.Drawing.Point(503, 131);
this.labelScrollSpeed.Name = "labelScrollSpeed";
this.labelScrollSpeed.Size = new System.Drawing.Size(13, 13);
this.labelScrollSpeed.TabIndex = 15;
this.labelScrollSpeed.Text = "5";
//
// labelScrollSpeedTitle
//
this.labelScrollSpeedTitle.AutoSize = true;
this.labelScrollSpeedTitle.Location = new System.Drawing.Point(6, 131);
this.labelScrollSpeedTitle.Name = "labelScrollSpeedTitle";
this.labelScrollSpeedTitle.Size = new System.Drawing.Size(67, 13);
this.labelScrollSpeedTitle.TabIndex = 14;
this.labelScrollSpeedTitle.Text = "Scroll Speed";
//
// trackBarScrollSpeed
//
this.trackBarScrollSpeed.Location = new System.Drawing.Point(162, 126);
this.trackBarScrollSpeed.Maximum = 100;
this.trackBarScrollSpeed.Name = "trackBarScrollSpeed";
this.trackBarScrollSpeed.Size = new System.Drawing.Size(334, 45);
this.trackBarScrollSpeed.TabIndex = 13;
this.trackBarScrollSpeed.TickFrequency = 5;
this.trackBarScrollSpeed.Value = 5;
this.trackBarScrollSpeed.ValueChanged += new System.EventHandler(this.trackBarScrollSpeed_ValueChanged);
//
// labelBrightness
//
this.labelBrightness.AutoSize = true;
this.labelBrightness.Location = new System.Drawing.Point(503, 93);
this.labelBrightness.Name = "labelBrightness";
this.labelBrightness.Size = new System.Drawing.Size(19, 13);
this.labelBrightness.TabIndex = 12;
this.labelBrightness.Text = "15";
//
// labelBrightnessTitle
//
this.labelBrightnessTitle.AutoSize = true;
this.labelBrightnessTitle.Location = new System.Drawing.Point(6, 93);
this.labelBrightnessTitle.Name = "labelBrightnessTitle";
this.labelBrightnessTitle.Size = new System.Drawing.Size(56, 13);
this.labelBrightnessTitle.TabIndex = 11;
this.labelBrightnessTitle.Text = "Brightness";
//
// trackBarBrightness
//
this.trackBarBrightness.Location = new System.Drawing.Point(162, 88);
this.trackBarBrightness.Maximum = 15;
this.trackBarBrightness.Minimum = 1;
this.trackBarBrightness.Name = "trackBarBrightness";
this.trackBarBrightness.Size = new System.Drawing.Size(334, 45);
this.trackBarBrightness.TabIndex = 10;
this.trackBarBrightness.Value = 15;
this.trackBarBrightness.ValueChanged += new System.EventHandler(this.trackBarBrightness_ValueChanged);
//
// labelTemperatureIntervalTitleSeconds
//
this.labelTemperatureIntervalTitleSeconds.AutoSize = true;
this.labelTemperatureIntervalTitleSeconds.Location = new System.Drawing.Point(227, 68);
this.labelTemperatureIntervalTitleSeconds.Name = "labelTemperatureIntervalTitleSeconds";
this.labelTemperatureIntervalTitleSeconds.Size = new System.Drawing.Size(49, 13);
this.labelTemperatureIntervalTitleSeconds.TabIndex = 9;
this.labelTemperatureIntervalTitleSeconds.Text = "Seconds";
//
// numericUpDownTemperatureInterval
//
this.numericUpDownTemperatureInterval.Location = new System.Drawing.Point(162, 64);
this.numericUpDownTemperatureInterval.Maximum = new decimal(new int[] {
255,
0,
0,
0});
this.numericUpDownTemperatureInterval.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownTemperatureInterval.Name = "numericUpDownTemperatureInterval";
this.numericUpDownTemperatureInterval.Size = new System.Drawing.Size(63, 20);
this.numericUpDownTemperatureInterval.TabIndex = 8;
this.numericUpDownTemperatureInterval.Value = new decimal(new int[] {
3,
0,
0,
0});
this.numericUpDownTemperatureInterval.ValueChanged += new System.EventHandler(this.numericUpDownTemperatureInterval_ValueChanged);
//
// checkBoxTemperatureEnabled
//
this.checkBoxTemperatureEnabled.AutoSize = true;
this.checkBoxTemperatureEnabled.Location = new System.Drawing.Point(6, 66);
this.checkBoxTemperatureEnabled.Name = "checkBoxTemperatureEnabled";
this.checkBoxTemperatureEnabled.Size = new System.Drawing.Size(149, 17);
this.checkBoxTemperatureEnabled.TabIndex = 7;
this.checkBoxTemperatureEnabled.Text = "Show the Temperature for";
this.checkBoxTemperatureEnabled.UseVisualStyleBackColor = true;
this.checkBoxTemperatureEnabled.CheckedChanged += new System.EventHandler(this.checkBoxTemperatureEnabled_CheckedChanged);
//
// labelDateIntervalTitleSeconds
//
this.labelDateIntervalTitleSeconds.AutoSize = true;
this.labelDateIntervalTitleSeconds.Location = new System.Drawing.Point(227, 45);
this.labelDateIntervalTitleSeconds.Name = "labelDateIntervalTitleSeconds";
this.labelDateIntervalTitleSeconds.Size = new System.Drawing.Size(49, 13);
this.labelDateIntervalTitleSeconds.TabIndex = 6;
this.labelDateIntervalTitleSeconds.Text = "Seconds";
//
// numericUpDownDateInterval
//
this.numericUpDownDateInterval.Location = new System.Drawing.Point(162, 41);
this.numericUpDownDateInterval.Maximum = new decimal(new int[] {
255,
0,
0,
0});
this.numericUpDownDateInterval.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownDateInterval.Name = "numericUpDownDateInterval";
this.numericUpDownDateInterval.Size = new System.Drawing.Size(63, 20);
this.numericUpDownDateInterval.TabIndex = 5;
this.numericUpDownDateInterval.Value = new decimal(new int[] {
3,
0,
0,
0});
this.numericUpDownDateInterval.ValueChanged += new System.EventHandler(this.numericUpDownDateInterval_ValueChanged);
//
// labelTimeIntervalTitleSeconds
//
this.labelTimeIntervalTitleSeconds.AutoSize = true;
this.labelTimeIntervalTitleSeconds.Location = new System.Drawing.Point(227, 22);
this.labelTimeIntervalTitleSeconds.Name = "labelTimeIntervalTitleSeconds";
this.labelTimeIntervalTitleSeconds.Size = new System.Drawing.Size(49, 13);
this.labelTimeIntervalTitleSeconds.TabIndex = 4;
this.labelTimeIntervalTitleSeconds.Text = "Seconds";
//
// numericUpDownTimeInterval
//
this.numericUpDownTimeInterval.Location = new System.Drawing.Point(162, 18);
this.numericUpDownTimeInterval.Maximum = new decimal(new int[] {
255,
0,
0,
0});
this.numericUpDownTimeInterval.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownTimeInterval.Name = "numericUpDownTimeInterval";
this.numericUpDownTimeInterval.Size = new System.Drawing.Size(63, 20);
this.numericUpDownTimeInterval.TabIndex = 3;
this.numericUpDownTimeInterval.Value = new decimal(new int[] {
35,
0,
0,
0});
this.numericUpDownTimeInterval.ValueChanged += new System.EventHandler(this.numericUpDownTimeInterval_ValueChanged);
//
// labelTimeIntervalTitle
//
this.labelTimeIntervalTitle.AutoSize = true;
this.labelTimeIntervalTitle.Location = new System.Drawing.Point(6, 22);
this.labelTimeIntervalTitle.Name = "labelTimeIntervalTitle";
this.labelTimeIntervalTitle.Size = new System.Drawing.Size(93, 13);
this.labelTimeIntervalTitle.TabIndex = 2;
this.labelTimeIntervalTitle.Text = "Show the Time for";
//
// checkBoxDateEnabled
//
this.checkBoxDateEnabled.AutoSize = true;
this.checkBoxDateEnabled.Location = new System.Drawing.Point(6, 43);
this.checkBoxDateEnabled.Name = "checkBoxDateEnabled";
this.checkBoxDateEnabled.Size = new System.Drawing.Size(112, 17);
this.checkBoxDateEnabled.TabIndex = 1;
this.checkBoxDateEnabled.Text = "Show the Date for";
this.checkBoxDateEnabled.UseVisualStyleBackColor = true;
this.checkBoxDateEnabled.CheckedChanged += new System.EventHandler(this.checkBoxDateEnabled_CheckedChanged);
//
// timerScrollDemo
//
this.timerScrollDemo.Interval = 10000;
this.timerScrollDemo.Tick += new System.EventHandler(this.timerScrollDemo_Tick);
//
// buttonResetDefault
//
this.buttonResetDefault.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.buttonResetDefault.Location = new System.Drawing.Point(392, 18);
this.buttonResetDefault.Name = "buttonResetDefault";
this.buttonResetDefault.Size = new System.Drawing.Size(162, 43);
this.buttonResetDefault.TabIndex = 19;
this.buttonResetDefault.Text = "Reset All to Default";
this.buttonResetDefault.UseVisualStyleBackColor = true;
this.buttonResetDefault.Click += new System.EventHandler(this.buttonResetDefault_Click);
//
// timerAdjustClock
//
this.timerAdjustClock.Enabled = true;
this.timerAdjustClock.Interval = 7200000;
this.timerAdjustClock.Tick += new System.EventHandler(this.timerAdjustClock_Tick);
//
// timerGetAppointment
//
this.timerGetAppointment.Enabled = true;
this.timerGetAppointment.Interval = 60000;
this.timerGetAppointment.Tick += new System.EventHandler(this.timerGetAppointment_Tick);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(227, 142);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(188, 13);
this.label2.TabIndex = 22;
this.label2.Text = "Minutes Before the Appointment Starts";
//
// numericUpDownReminderTime
//
this.numericUpDownReminderTime.Location = new System.Drawing.Point(162, 138);
this.numericUpDownReminderTime.Maximum = new decimal(new int[] {
60,
0,
0,
0});
this.numericUpDownReminderTime.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownReminderTime.Name = "numericUpDownReminderTime";
this.numericUpDownReminderTime.Size = new System.Drawing.Size(63, 20);
this.numericUpDownReminderTime.TabIndex = 21;
this.numericUpDownReminderTime.Value = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDownReminderTime.ValueChanged += new System.EventHandler(this.numericUpDownReminderTime_ValueChanged);
//
// labelStartReminderTitle
//
this.labelStartReminderTitle.AutoSize = true;
this.labelStartReminderTitle.Location = new System.Drawing.Point(6, 142);
this.labelStartReminderTitle.Name = "labelStartReminderTitle";
this.labelStartReminderTitle.Size = new System.Drawing.Size(149, 13);
this.labelStartReminderTitle.TabIndex = 20;
this.labelStartReminderTitle.Text = "Show Appointment Reminders";
//
// MainWindow
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(584, 641);
this.Controls.Add(this.groupBoxClockSettings);
this.Controls.Add(this.groupBoxAppointmentSettings);
this.Controls.Add(this.groupBoxApplicationSettings);
this.Controls.Add(this.groupBoxState);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximumSize = new System.Drawing.Size(800, 800);
this.MinimumSize = new System.Drawing.Size(600, 680);
this.Name = "MainWindow";
this.Text = "Meeting Clock";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainWindow_FormClosed);
this.Load += new System.EventHandler(this.MainWindow_Load);
this.Resize += new System.EventHandler(this.MainWindow_Resize);
this.groupBoxState.ResumeLayout(false);
this.groupBoxState.PerformLayout();
this.groupBoxApplicationSettings.ResumeLayout(false);
this.groupBoxApplicationSettings.PerformLayout();
this.groupBoxAppointmentSettings.ResumeLayout(false);
this.groupBoxAppointmentSettings.PerformLayout();
this.groupBoxClockSettings.ResumeLayout(false);
this.groupBoxClockSettings.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownScrollWait)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.trackBarScrollSpeed)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.trackBarBrightness)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTemperatureInterval)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownDateInterval)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTimeInterval)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownReminderTime)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox groupBoxState;
private System.Windows.Forms.Label labelBluetoothState;
private System.Windows.Forms.Label labelBluetoothStateTitle;
private System.Windows.Forms.Button buttonOpenSystemSettingsPrivacy;
private System.Windows.Forms.Button buttonEnableBluetooth;
private System.Windows.Forms.Label labelMeetingClockState;
private System.Windows.Forms.Label labelMeetingClockStateTitle;
private System.Windows.Forms.Button buttonOpenSystemSettingsBluetooth;
private System.Windows.Forms.Button buttonWebsite;
private System.Windows.Forms.GroupBox groupBoxApplicationSettings;
private System.Windows.Forms.CheckBox checkBoxEnableBluetooth;
private System.Windows.Forms.CheckBox checkBoxCheckForUpdates;
private System.Windows.Forms.CheckBox checkBoxStartMinimized;
private System.Windows.Forms.CheckBox checkBoxAutostart;
private System.Windows.Forms.NotifyIcon notifyIcon;
private System.Windows.Forms.Timer timerEnableBalloon;
private System.Windows.Forms.GroupBox groupBoxAppointmentSettings;
private System.Windows.Forms.CheckBox checkBoxIgnoreAllDayAppointments;
private System.Windows.Forms.CheckBox checkBoxIgnoreCancelledAppointments;
private System.Windows.Forms.CheckBox checkBoxIgnoreFreeAppointments;
private System.Windows.Forms.CheckBox checkBoxIgnoreOutOfOfficeAppointments;
private System.Windows.Forms.CheckBox checkBoxIgnoreTentativeAppointments;
private System.Windows.Forms.GroupBox groupBoxClockSettings;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.NumericUpDown numericUpDownScrollWait;
private System.Windows.Forms.Label labelScrollWaitTitle;
private System.Windows.Forms.Label labelScrollSpeed;
private System.Windows.Forms.Label labelScrollSpeedTitle;
private System.Windows.Forms.TrackBar trackBarScrollSpeed;
private System.Windows.Forms.Label labelBrightness;
private System.Windows.Forms.Label labelBrightnessTitle;
private System.Windows.Forms.TrackBar trackBarBrightness;
private System.Windows.Forms.Label labelTemperatureIntervalTitleSeconds;
private System.Windows.Forms.NumericUpDown numericUpDownTemperatureInterval;
private System.Windows.Forms.CheckBox checkBoxTemperatureEnabled;
private System.Windows.Forms.Label labelDateIntervalTitleSeconds;
private System.Windows.Forms.NumericUpDown numericUpDownDateInterval;
private System.Windows.Forms.Label labelTimeIntervalTitleSeconds;
private System.Windows.Forms.NumericUpDown numericUpDownTimeInterval;
private System.Windows.Forms.Label labelTimeIntervalTitle;
private System.Windows.Forms.CheckBox checkBoxDateEnabled;
private System.Windows.Forms.Timer timerScrollDemo;
private System.Windows.Forms.Button buttonResetDefault;
private System.Windows.Forms.Timer timerAdjustClock;
private System.Windows.Forms.Timer timerGetAppointment;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.NumericUpDown numericUpDownReminderTime;
private System.Windows.Forms.Label labelStartReminderTitle;
}
}

563
MainWindow.cs Normal file
View File

@ -0,0 +1,563 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.Net.Http;
using System.Windows.Forms;
using Outlook = Microsoft.Office.Interop.Outlook;
namespace MeetingClock
{
public partial class MainWindow : Form
{
private readonly string LINK_URL = "https://zechert.net/meeting-clock";
private readonly string LINK_URL_UPDATE = "https://zechert.net/meeting-clock/update.txt";
private BluetoothManager bluetoothManager;
private MeetingClockManager meetingClockManager;
private readonly HttpClient client = new HttpClient();
private string clockVersion = null;
private Settings settings = new Settings();
private bool showBalloon = false;
private OutlookManager outlookManager = new OutlookManager();
private bool clockSettingsCanBeChanged;
private string currentAppointment = "";
public MainWindow()
{
InitializeComponent();
this.Text += " - " + Properties.Settings.Default.Version;
}
private async void MainWindow_Load(object sender, System.EventArgs e)
{
this.clockSettingsCanBeChanged = false;
this.checkBoxAutostart.Checked = this.settings.Autostart;
this.checkBoxStartMinimized.Checked = this.settings.StartMinimized;
this.checkBoxCheckForUpdates.Checked = this.settings.CheckForUpdates;
this.checkBoxEnableBluetooth.Checked = this.settings.StartBluetooth;
this.checkBoxIgnoreAllDayAppointments.Checked = this.settings.IgnoreAllDayAppointments;
this.checkBoxIgnoreCancelledAppointments.Checked = this.settings.IgnoreCancelledAppointments;
this.checkBoxIgnoreFreeAppointments.Checked = this.settings.IgnoreFreeAppointments;
this.checkBoxIgnoreOutOfOfficeAppointments.Checked = this.settings.IgnoreOutOfOfficeAppointments;
this.checkBoxIgnoreTentativeAppointments.Checked = this.settings.IgnoreTentativeAppointments;
this.numericUpDownReminderTime.Value = this.settings.ReminderTime;
if (this.settings.StartMinimized)
{
this.WindowState = FormWindowState.Minimized;
}
if (this.settings.CheckForUpdates)
{
this.CheckForUpdate();
}
this.bluetoothManager = new BluetoothManager();
this.bluetoothManager.StateChanged += BluetoothManager_StateChanged;
this.meetingClockManager = new MeetingClockManager(bluetoothManager);
this.meetingClockManager.StateChanged += MeetingClockManager_StateChanged;
await this.bluetoothManager.Initialize();
if (this.settings.StartBluetooth && this.bluetoothManager.State != BluetoothManager.BluetoothState.On)
{
await this.bluetoothManager.Enable();
}
}
private void UpdateBluetoothState()
{
switch (this.bluetoothManager.State)
{
case BluetoothManager.BluetoothState.NotInitialized:
this.labelBluetoothState.Text = "not initialized";
this.labelBluetoothState.ForeColor = SystemColors.ControlText;
this.UpdateIcon(Properties.Resources.icon_neutral);
this.buttonEnableBluetooth.Enabled = false;
break;
case BluetoothManager.BluetoothState.Exception:
this.labelBluetoothState.Text = "system exception";
this.labelBluetoothState.ForeColor = Color.Red;
this.UpdateIcon(Properties.Resources.icon_error);
this.buttonEnableBluetooth.Enabled = false;
ShowArchitectureWarning();
break;
case BluetoothManager.BluetoothState.NoBluetoothAdapter:
this.labelBluetoothState.Text = "no bluetooth adapter found";
this.labelBluetoothState.ForeColor = Color.Red;
this.UpdateIcon(Properties.Resources.icon_error);
this.buttonEnableBluetooth.Enabled = false;
break;
case BluetoothManager.BluetoothState.NoBluetoothRadio:
this.labelBluetoothState.Text = "no bluetooth radio found";
this.labelBluetoothState.ForeColor = Color.Red;
this.UpdateIcon(Properties.Resources.icon_error);
this.buttonEnableBluetooth.Enabled = false;
break;
case BluetoothManager.BluetoothState.Disabled:
this.labelBluetoothState.Text = "disabled";
this.labelBluetoothState.ForeColor = SystemColors.ControlText;
this.UpdateIcon(Properties.Resources.icon_warning);
this.buttonEnableBluetooth.Enabled = true;
break;
case BluetoothManager.BluetoothState.Off:
this.labelBluetoothState.Text = "off";
this.labelBluetoothState.ForeColor = Color.DarkOrange;
this.UpdateIcon(Properties.Resources.icon_warning);
this.buttonEnableBluetooth.Enabled = true;
break;
case BluetoothManager.BluetoothState.On:
this.labelBluetoothState.Text = "on";
this.UpdateIcon(Properties.Resources.icon_neutral);
this.labelBluetoothState.ForeColor = Color.Green;
this.buttonEnableBluetooth.Enabled = false;
break;
case BluetoothManager.BluetoothState.Unknown:
this.labelBluetoothState.Text = "unknown";
this.UpdateIcon(Properties.Resources.icon_off);
this.labelBluetoothState.ForeColor = SystemColors.ControlText;
this.buttonEnableBluetooth.Enabled = false;
break;
}
}
private void BluetoothManager_StateChanged(BluetoothManager manager, BluetoothManager.BluetoothState oldState, BluetoothManager.BluetoothState newState)
{
this.BeginInvoke((Action) (() => { this.UpdateBluetoothState(); }));
}
private void UpdateMeetingClockState()
{
this.clockSettingsCanBeChanged = false;
switch (this.meetingClockManager.State)
{
case MeetingClockManager.MeetingClockState.NotInitialized:
this.labelMeetingClockState.Text = "not initialized";
this.labelMeetingClockState.ForeColor = SystemColors.ControlText;
this.UpdateIcon(Properties.Resources.icon_neutral);
this.groupBoxClockSettings.Enabled = false;
break;
case MeetingClockManager.MeetingClockState.NoComPort:
if (this.bluetoothManager.State == BluetoothManager.BluetoothState.On)
{
this.labelMeetingClockState.Text = "not paired";
}
else
{
this.labelMeetingClockState.Text = "bluetooth disabled";
}
this.labelMeetingClockState.ForeColor = Color.Red;
this.UpdateIcon(Properties.Resources.icon_error);
this.groupBoxClockSettings.Enabled = false;
break;
case MeetingClockManager.MeetingClockState.Disconnected:
this.labelMeetingClockState.Text = "not connected";
this.labelMeetingClockState.ForeColor = Color.DarkOrange;
this.UpdateIcon(Properties.Resources.icon_neutral);
this.groupBoxClockSettings.Enabled = false;
break;
case MeetingClockManager.MeetingClockState.Connected:
this.labelMeetingClockState.Text = "connected on " + this.meetingClockManager.Port + ", " + this.meetingClockManager.Version;
this.labelMeetingClockState.ForeColor = Color.Green;
this.UpdateIcon(Properties.Resources.icon_ok);
if (this.clockVersion != null && this.meetingClockManager.Version != this.clockVersion)
{
DialogResult result = MessageBox.Show("A new version of the meeting clock firmware is available.\n\n" +
"Do you want to open " + LINK_URL + " to download the new version now?", "New Firmware Available", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (result == DialogResult.Yes)
{
System.Diagnostics.Process.Start(LINK_URL);
}
}
this.groupBoxClockSettings.Enabled = true;
this.ReadClockSettings();
this.ShowNextAppointment();
break;
}
}
private void MeetingClockManager_StateChanged(MeetingClockManager manager, MeetingClockManager.MeetingClockState oldState, MeetingClockManager.MeetingClockState newState)
{
this.BeginInvoke((Action)(() => { this.UpdateMeetingClockState(); }));
}
private void ShowArchitectureWarning()
{
String computerArchitecture = Environment.Is64BitOperatingSystem ? "x64" : "x86";
String programArchitecture = Environment.Is64BitProcess ? "x64" : "x86";
String message = "" +
"This application cannot access the Bluetooth device on your computer. " +
"This is normally a sign that you downloaded the wrong architecture (x64, x86) of this application.\n" +
"\n" +
"Your computer uses " + computerArchitecture + " architecture.\n" +
"This application is " + programArchitecture + " architecture.\n" +
"\n" +
"This application will only work on Windows 10.\n\n" +
"Please download the correct version of this application from " + LINK_URL + ".\n" +
"\n" +
"This application will now exit!\n" +
"\n" +
"Do you want to open " + LINK_URL + " now?";
DialogResult result = MessageBox.Show(message, "Bluetooth Error", MessageBoxButtons.YesNo, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
if (result == DialogResult.Yes)
{
System.Diagnostics.Process.Start(LINK_URL);
}
Application.Exit();
}
private void ButtonOpenSystemSettingsPrivacy_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("ms-settings:privacy-radios");
}
private void buttonOpenSystemSettingsBluetooth_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("ms-settings:bluetooth");
}
private void buttonWebsite_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(LINK_URL);
}
private async void ButtonEnableBluetooth_Click(object sender, EventArgs e)
{
Windows.Devices.Radios.RadioAccessStatus result = await this.bluetoothManager.Enable();
DialogResult open = DialogResult.Cancel;
String openLink = "";
switch (result)
{
case Windows.Devices.Radios.RadioAccessStatus.DeniedBySystem:
open = MessageBox.Show(
"The operating system denied access to the bluetooth radio. Please enable bluetooth yourself.\n\nDo you want to open bluetooth settings now?",
"Access denied", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
openLink = "ms-settings:bluetooth";
break;
case Windows.Devices.Radios.RadioAccessStatus.DeniedByUser:
open = MessageBox.Show(
"Switching the bluetooth state automatically is forbidden by your privacy settings.\n\nDo you want to open privacy settings now?",
"Access denied", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
openLink = "ms-settings:privacy-radios";
break;
case Windows.Devices.Radios.RadioAccessStatus.Unspecified:
open = MessageBox.Show(
"Switching the bluetooth state failed for an unknown reason. Please enable bluetooth yourself.\n\nDo you want to open bluetooth settings now?",
"Access denied", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
openLink = "ms-settings:bluetooth";
break;
}
if (open == DialogResult.Yes)
{
System.Diagnostics.Process.Start(openLink);
}
}
private void UpdateIcon(Icon newIcon)
{
this.Icon = newIcon;
this.notifyIcon.Icon = newIcon;
}
private async void CheckForUpdate()
{
HttpResponseMessage response = await this.client.GetAsync(LINK_URL_UPDATE);
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
string responseBody = await response.Content.ReadAsStringAsync();
string[] versions = responseBody.Split('\n');
Debug.WriteLine(String.Format("Versions available:\n{0}", responseBody));
if (versions.Length >= 2)
{
string winVersion = versions[0].Trim();
this.clockVersion = versions[1].Trim();
if (winVersion != Properties.Settings.Default.Version)
{
DialogResult result = MessageBox.Show("A new version of this software is available.\n\n" +
"Do you want to open " + LINK_URL + " to download the new version now?", "New Version Available", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (result == DialogResult.Yes)
{
System.Diagnostics.Process.Start(LINK_URL);
}
}
}
} else
{
Debug.WriteLine(String.Format("Check for update failed: {0}", response.StatusCode));
}
}
private void MainWindow_FormClosed(object sender, FormClosedEventArgs e)
{
Debug.WriteLine(String.Format("Form was closed because of {0}", e.CloseReason.ToString()));
this.bluetoothManager.Stop();
this.meetingClockManager.Stop();
}
private void checkBoxAutostart_CheckedChanged(object sender, EventArgs e)
{
this.settings.Autostart = this.checkBoxAutostart.Checked;
}
private void checkBoxStartMinimized_CheckedChanged(object sender, EventArgs e)
{
this.settings.StartMinimized = this.checkBoxStartMinimized.Checked;
}
private void checkBoxCheckForUpdates_CheckedChanged(object sender, EventArgs e)
{
this.settings.CheckForUpdates = this.checkBoxCheckForUpdates.Checked;
}
private void checkBoxEnableBluetooth_CheckedChanged(object sender, EventArgs e)
{
this.settings.StartBluetooth = this.checkBoxEnableBluetooth.Checked;
}
private void MainWindow_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
if (this.showBalloon)
{
this.notifyIcon.ShowBalloonTip(3000);
}
this.ShowInTaskbar = false;
this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
}
}
private void NotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.FormBorderStyle = FormBorderStyle.Sizable;
this.WindowState = FormWindowState.Normal;
this.ShowInTaskbar = true;
}
private void timerEnableBalloon_Tick(object sender, EventArgs e)
{
this.showBalloon = true;
this.timerEnableBalloon.Stop();
}
private void checkBoxIgnoreAllDayAppointments_CheckedChanged(object sender, EventArgs e)
{
this.settings.IgnoreAllDayAppointments = this.checkBoxIgnoreAllDayAppointments.Checked;
}
private void checkBoxIgnoreCancelledAppointments_CheckedChanged(object sender, EventArgs e)
{
this.settings.IgnoreCancelledAppointments = this.checkBoxIgnoreCancelledAppointments.Checked;
}
private void checkBoxIgnoreFreeAppointments_CheckedChanged(object sender, EventArgs e)
{
this.settings.IgnoreFreeAppointments = this.checkBoxIgnoreFreeAppointments.Checked;
}
private void checkBoxIgnoreOutOfOfficeAppointments_CheckedChanged(object sender, EventArgs e)
{
this.settings.IgnoreOutOfOfficeAppointments = this.checkBoxIgnoreOutOfOfficeAppointments.Checked;
}
private void checkBoxIgnoreTentativeAppointments_CheckedChanged(object sender, EventArgs e)
{
this.settings.IgnoreTentativeAppointments = this.checkBoxIgnoreTentativeAppointments.Checked;
}
private void ReadClockSettings()
{
this.numericUpDownTimeInterval.Value = this.meetingClockManager.GetTimeInterval() ?? this.numericUpDownTimeInterval.Value;
this.numericUpDownDateInterval.Value = this.meetingClockManager.GetDateInterval() ?? this.numericUpDownDateInterval.Value;
this.numericUpDownTemperatureInterval.Value = this.meetingClockManager.GetTemperatureInterval() ?? this.numericUpDownTemperatureInterval.Value;
this.trackBarBrightness.Value = this.meetingClockManager.GetBrightness() ?? this.trackBarBrightness.Value;
this.labelBrightness.Text = this.trackBarBrightness.Value.ToString();
this.trackBarScrollSpeed.Value = this.meetingClockManager.GetScrollSpeed() ?? this.trackBarScrollSpeed.Value;
this.labelScrollSpeed.Text = this.trackBarScrollSpeed.Value.ToString();
this.numericUpDownScrollWait.Value = (this.meetingClockManager.GetScrollWait() / 10) ?? this.numericUpDownScrollWait.Value;
this.checkBoxDateEnabled.Checked = this.meetingClockManager.GetDateEnabled() ?? this.checkBoxDateEnabled.Checked;
this.checkBoxTemperatureEnabled.Checked = this.meetingClockManager.GetTemperatureEnabled() ?? this.checkBoxTemperatureEnabled.Checked;
this.clockSettingsCanBeChanged = true;
}
private void trackBarBrightness_ValueChanged(object sender, EventArgs e)
{
this.labelBrightness.Text = trackBarBrightness.Value.ToString();
if (this.clockSettingsCanBeChanged)
{
this.meetingClockManager.SetBrightness(trackBarBrightness.Value);
}
}
private void trackBarScrollSpeed_ValueChanged(object sender, EventArgs e)
{
this.labelScrollSpeed.Text = trackBarScrollSpeed.Value.ToString();
if (this.clockSettingsCanBeChanged)
{
this.meetingClockManager.SetScrollSpeed(trackBarScrollSpeed.Value);
this.StartScrollDemo();
}
}
private void numericUpDownScrollWait_ValueChanged(object sender, EventArgs e)
{
if (this.clockSettingsCanBeChanged)
{
this.meetingClockManager.SetScrollWait((int)(this.numericUpDownScrollWait.Value * 10));
this.StartScrollDemo();
}
}
private void StartScrollDemo()
{
if (this.timerScrollDemo.Enabled)
{
this.timerScrollDemo.Stop();
}
else
{
this.meetingClockManager.ScrollText("Beispiel-Text");
}
this.timerScrollDemo.Start();
}
private void timerScrollDemo_Tick(object sender, EventArgs e)
{
this.meetingClockManager.ScrollText("");
timerScrollDemo.Stop();
}
private void numericUpDownTimeInterval_ValueChanged(object sender, EventArgs e)
{
if (this.clockSettingsCanBeChanged)
{
this.meetingClockManager.SetTimeInterval((int)(this.numericUpDownTimeInterval.Value));
}
}
private void numericUpDownDateInterval_ValueChanged(object sender, EventArgs e)
{
if (this.clockSettingsCanBeChanged)
{
this.meetingClockManager.SetDateInterval((int)(this.numericUpDownDateInterval.Value));
}
}
private void numericUpDownTemperatureInterval_ValueChanged(object sender, EventArgs e)
{
if (this.clockSettingsCanBeChanged)
{
this.meetingClockManager.SetTemperatureInterval((int)(this.numericUpDownTemperatureInterval.Value));
}
}
private void checkBoxDateEnabled_CheckedChanged(object sender, EventArgs e)
{
if (this.clockSettingsCanBeChanged)
{
this.meetingClockManager.SetDateEnabled(this.checkBoxDateEnabled.Checked);
}
}
private void checkBoxTemperatureEnabled_CheckedChanged(object sender, EventArgs e)
{
if (this.clockSettingsCanBeChanged)
{
this.meetingClockManager.SetTemperatureEnabled(this.checkBoxTemperatureEnabled.Checked);
}
}
private void buttonResetDefault_Click(object sender, EventArgs e)
{
DialogResult dialogResult = MessageBox.Show("Are you sure? All clock settings will be reset to their default values!", "Confirm Reset",
MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
if (dialogResult == DialogResult.Yes)
{
this.clockSettingsCanBeChanged = false;
this.meetingClockManager.SetBrightness(15);
this.meetingClockManager.SetTimeInterval(35);
this.meetingClockManager.SetDateInterval(3);
this.meetingClockManager.SetDateEnabled(true);
this.meetingClockManager.SetDateInterval(3);
this.meetingClockManager.SetTemperatureEnabled(true);
this.meetingClockManager.SetTemperatureInterval(3);
this.meetingClockManager.SetScrollSpeed(5);
this.meetingClockManager.SetScrollWait(40);
this.ReadClockSettings();
}
}
private void timerAdjustClock_Tick(object sender, EventArgs e)
{
if (this.clockSettingsCanBeChanged)
{
this.meetingClockManager.Adjust();
}
}
private void timerGetAppointment_Tick(object sender, EventArgs e)
{
this.ShowNextAppointment();
}
private async void ShowNextAppointment() {
if (!this.clockSettingsCanBeChanged)
{
this.currentAppointment = "";
return;
}
Outlook.AppointmentItem appointment = await this.outlookManager.GetNextAppointment(
this.settings.IgnoreAllDayAppointments, this.settings.IgnoreCancelledAppointments, this.settings.IgnoreFreeAppointments,
this.settings.IgnoreOutOfOfficeAppointments, this.settings.IgnoreTentativeAppointments);
if (appointment == null)
{
Debug.WriteLine("No upcoming appointment send to clock");
this.currentAppointment = "";
return;
}
string appointmentName = String.Format("{0} - {1} {2}", appointment.Start.ToString("t"), appointment.End.ToString("t"), appointment.Subject);
if (appointment.Start > DateTime.Now.AddMinutes(this.settings.ReminderTime))
{
Debug.WriteLine(String.Format("Upcoming appointment is too far in future, not displaying: {0}", appointmentName));
this.currentAppointment = "";
return;
}
if (this.currentAppointment == appointmentName)
{
Debug.WriteLine("Current appointment is already displayed, not doing anything");
return;
}
this.currentAppointment = appointmentName;
this.meetingClockManager.ScrollText(this.currentAppointment);
this.meetingClockManager.NextDate(appointment.Start);
Debug.WriteLine(String.Format("Current appointment is set to: {0}", this.currentAppointment));
}
private void numericUpDownReminderTime_ValueChanged(object sender, EventArgs e)
{
this.settings.ReminderTime = (int)this.numericUpDownReminderTime.Value;
}
}
}

372
MainWindow.resx Normal file
View File

@ -0,0 +1,372 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="notifyIcon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="notifyIcon.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAIAQEAAAAEACAAoFgAAJgAAAEBAAgABAAEAMAQAAE4WAAAoAAAAQAAAAIAAAAABAAgAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/38AAP+ADQD/gyYA/4QqAP+HOAD/iDsA/4pAAP+KQgD/i0UA/4xHAP+P
TwD/kFEA/5FVAP+TWgD/lV8A/5djAP+YZQD/mWgA/51uAP+ecQD/n3MA/6F3AP+ieAD/onkA/6N6AP+l
fgD/pn8A/6aAAP+ngQD/p4IA/6yJAP+tiwD/ro0A/6+PAP+wkAD/sJEA/7GTAP+0lwD/tZgA/7WZAP+5
nwD/uqAA/7yjAP+8pAD/vqcA/7+nAP/BqgD/x7QA/8i2AP/JtgD/zbwA/829AP/OvgD/0MAA/9HCAP/S
wwD/0sQA/9PFAP/UxgD/1McA/9XIAP/YywD/2c4A/9vQAP/c0QD/3dIA/9/VAP/f1gD/4toA/+TcAP/l
3QD/5+AA/+jiAP/p4gD/6eMA/+3oAP/u6QD/7+sA//HtAP/x7gD/8u8A//PvAP/08AD/9PEA//XyAP/1
8wD/+PYA//n3AP/5+AD/+/oA//z7AP/9/AD//v0A//7+AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0snAQAAAAAAAAAAHF1A
EgAAAAAAAAAAADpWMQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNeXk0eAAAAAAAA
ABxeXl1CCgAAAAAAAAA6Xl5XLwAAAAAAAAAPOU1ZXl5eXl5bVEMgAAAAAAAAAAAAAAAAAABTXl5eOgAA
AAAAAAAcXl5eXhwAAAAAAAAAOl5eXlMAAAAAAAAhWV5eXl5eXl5eXl5eXjkAAAAAAAAAAAAAAAAAU15e
XjoAAAAAAAAAHF5eXl4cAAAAAAAAADpeXl5TAAAAAAALWF5eXl5eXl5eXl5eXl5eKAAAAAAAAAAAAAAA
AFNeXl46AAAAAAAAABxeXl5eHAAAAAAAAAA6Xl5eUwAAAAAAMF5eXl5eXl5eXl5eXl5eXksAAAAAAAAA
AAAAAABTXl5eOgAAAAAAAAAcXl5eXhwAAAAAAAAAOl5eXlMAAAAAAEVeXl5dMycmJiYmLVNeXl5eCAAA
AAAAAAAAAAAAU15eXjoAAAAAAAAAHF5eXl4cAAAAAAAAADpeXl5TAAAAAABNXl5eRAAAAAAAAAApXl5e
XhMAAAAAAAAAAAAAAFNeXl46AAAAAAAAABxeXl5eHAAAAAAAAAA6Xl5eUwAAAAAAUl5eXjsAAAAAAAAA
HV5eXl4bAAAAAAAAAAAAAABTXl5eOgAAAAAAAAAcXl5eXhwAAAAAAAAAOl5eXlMAAAAAAFNeXl46AAAA
AAAAABxeXl5eHAAAAAAAAAAAAAAAU15eXjoAAAAAAAAAHF5eXl4cAAAAAAAAADpeXl5TAAAAAABTXl5e
OgAAAAAAAAAOS15eXhwAAAAAAAAAAAAAAFNeXl46AAAAAAAAABxeXl5eHAAAAAAAAAA6Xl5eUwAAAAAA
U15eXjoAAAAAAAAAAAAiR14cAAAAAAAAAAAAAABTXl5eOgAAAAAAAAAcXl5eXhwAAAAAAAAAOl5eXlMA
AAAAAFNeXl46AAAAAAAAAAAAAAAMAwAAAAAAAAAAAAAAU15eXjoAAAAAAAAAHF5eXl4cAAAAAAAAADpe
Xl5TAAAAAABTXl5eOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNeXl46AAAAAAAAABxeXl5eHAAAAAAA
AAA6Xl5eUwAAAAAAU15eXjoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTXl5eOgAAAAAAAAAcXl5eXhwA
AAAAAAAAOl5eXlMAAAAAAFNeXl46AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU15eXjoAAAAAAAAAHF5e
Xl4cAAAAAAAAADpeXl5TAAAAAABTXl5eOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNeXl46AAAAAAAA
ABxeXl5eHAAAAAAAAAA6Xl5eUwAAAAAAU15eXjoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTXl5eOgAA
AAAAAAAcXl5eXhwAAAAAAAAAOl5eXlMAAAAAAFNeXl46AAAAAAAAABxdTT4uCAAAAAAAAAAAAAAAU15e
XjoAAAAAAAAAHF5eXl4cAAAAAAAAADpeXl5TAAAAAABTXl5eOgAAAAAAAAAcXl5eXhwAAAAAAAAAAAAA
AFNeXl46AAAAAAAAABxeXl5eHAAAAAAAAAA6Xl5eUwAAAAAAU15eXjoAAAAAAAAAHF5eXl4cAAAAAAAA
AAAAAABOXl5eQAAAAAAAAAAkXl5eXiQAAAAAAAAAQF5eXk4AAAAAAE9eXl4/AAAAAAAAAB5eXl5eFQAA
AAAAAAAAAAAASV5eXlgZAQAAAAAKRl5eXl5GCgAAAAABGVheXl5IAAAAAABKXl5eVxgBAAAAAAlBXl5e
Xg0AAAAAAAAAAAAAADheXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eNwAAAAAAOV5eXl5eXl5eXl5e
Xl5eXlUAAAAAAAAAAAAAAAAUXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXhMAAAAAABZeXl5eXl5e
Xl5eXl5eXl40AAAAAAAAAAAAAAAAADNeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXjIAAAAAAAAANV5e
Xl5eXl5eXl5eXl5MBAAAAAAAAAAAAAAAAAAAK1BeXl5eXl5eXl5cPTZaXl5eXl5eXl5eUCoAAAAAAAAA
AAAsUV5eXl5eXl5eXlk8BgAAAAAAAAAAAAAAAAAAAAAAEB8lJiYmJiQdBwAABRokJiYmJiUfEAAAAAAA
AAAAAAAAAAARHyUmJiYmIxcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAACgAAABAAAAAgAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA=
</value>
</data>
<metadata name="timerEnableBalloon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>123, 17</value>
</metadata>
<metadata name="timerScrollDemo.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>280, 17</value>
</metadata>
<metadata name="timerAdjustClock.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>423, 17</value>
</metadata>
<metadata name="timerGetAppointment.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>568, 17</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAIAQEAAAAEACAAoFgAAJgAAAEBAAgABAAEAMAQAAE4WAAAoAAAAQAAAAIAAAAABAAgAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/38AAP+ADQD/gyYA/4QqAP+HOAD/iDsA/4pAAP+KQgD/i0UA/4xHAP+P
TwD/kFEA/5FVAP+TWgD/lV8A/5djAP+YZQD/mWgA/51uAP+ecQD/n3MA/6F3AP+ieAD/onkA/6N6AP+l
fgD/pn8A/6aAAP+ngQD/p4IA/6yJAP+tiwD/ro0A/6+PAP+wkAD/sJEA/7GTAP+0lwD/tZgA/7WZAP+5
nwD/uqAA/7yjAP+8pAD/vqcA/7+nAP/BqgD/x7QA/8i2AP/JtgD/zbwA/829AP/OvgD/0MAA/9HCAP/S
wwD/0sQA/9PFAP/UxgD/1McA/9XIAP/YywD/2c4A/9vQAP/c0QD/3dIA/9/VAP/f1gD/4toA/+TcAP/l
3QD/5+AA/+jiAP/p4gD/6eMA/+3oAP/u6QD/7+sA//HtAP/x7gD/8u8A//PvAP/08AD/9PEA//XyAP/1
8wD/+PYA//n3AP/5+AD/+/oA//z7AP/9/AD//v0A//7+AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0snAQAAAAAAAAAAHF1A
EgAAAAAAAAAAADpWMQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNeXk0eAAAAAAAA
ABxeXl1CCgAAAAAAAAA6Xl5XLwAAAAAAAAAPOU1ZXl5eXl5bVEMgAAAAAAAAAAAAAAAAAABTXl5eOgAA
AAAAAAAcXl5eXhwAAAAAAAAAOl5eXlMAAAAAAAAhWV5eXl5eXl5eXl5eXjkAAAAAAAAAAAAAAAAAU15e
XjoAAAAAAAAAHF5eXl4cAAAAAAAAADpeXl5TAAAAAAALWF5eXl5eXl5eXl5eXl5eKAAAAAAAAAAAAAAA
AFNeXl46AAAAAAAAABxeXl5eHAAAAAAAAAA6Xl5eUwAAAAAAMF5eXl5eXl5eXl5eXl5eXksAAAAAAAAA
AAAAAABTXl5eOgAAAAAAAAAcXl5eXhwAAAAAAAAAOl5eXlMAAAAAAEVeXl5dMycmJiYmLVNeXl5eCAAA
AAAAAAAAAAAAU15eXjoAAAAAAAAAHF5eXl4cAAAAAAAAADpeXl5TAAAAAABNXl5eRAAAAAAAAAApXl5e
XhMAAAAAAAAAAAAAAFNeXl46AAAAAAAAABxeXl5eHAAAAAAAAAA6Xl5eUwAAAAAAUl5eXjsAAAAAAAAA
HV5eXl4bAAAAAAAAAAAAAABTXl5eOgAAAAAAAAAcXl5eXhwAAAAAAAAAOl5eXlMAAAAAAFNeXl46AAAA
AAAAABxeXl5eHAAAAAAAAAAAAAAAU15eXjoAAAAAAAAAHF5eXl4cAAAAAAAAADpeXl5TAAAAAABTXl5e
OgAAAAAAAAAOS15eXhwAAAAAAAAAAAAAAFNeXl46AAAAAAAAABxeXl5eHAAAAAAAAAA6Xl5eUwAAAAAA
U15eXjoAAAAAAAAAAAAiR14cAAAAAAAAAAAAAABTXl5eOgAAAAAAAAAcXl5eXhwAAAAAAAAAOl5eXlMA
AAAAAFNeXl46AAAAAAAAAAAAAAAMAwAAAAAAAAAAAAAAU15eXjoAAAAAAAAAHF5eXl4cAAAAAAAAADpe
Xl5TAAAAAABTXl5eOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNeXl46AAAAAAAAABxeXl5eHAAAAAAA
AAA6Xl5eUwAAAAAAU15eXjoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTXl5eOgAAAAAAAAAcXl5eXhwA
AAAAAAAAOl5eXlMAAAAAAFNeXl46AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU15eXjoAAAAAAAAAHF5e
Xl4cAAAAAAAAADpeXl5TAAAAAABTXl5eOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNeXl46AAAAAAAA
ABxeXl5eHAAAAAAAAAA6Xl5eUwAAAAAAU15eXjoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTXl5eOgAA
AAAAAAAcXl5eXhwAAAAAAAAAOl5eXlMAAAAAAFNeXl46AAAAAAAAABxdTT4uCAAAAAAAAAAAAAAAU15e
XjoAAAAAAAAAHF5eXl4cAAAAAAAAADpeXl5TAAAAAABTXl5eOgAAAAAAAAAcXl5eXhwAAAAAAAAAAAAA
AFNeXl46AAAAAAAAABxeXl5eHAAAAAAAAAA6Xl5eUwAAAAAAU15eXjoAAAAAAAAAHF5eXl4cAAAAAAAA
AAAAAABOXl5eQAAAAAAAAAAkXl5eXiQAAAAAAAAAQF5eXk4AAAAAAE9eXl4/AAAAAAAAAB5eXl5eFQAA
AAAAAAAAAAAASV5eXlgZAQAAAAAKRl5eXl5GCgAAAAABGVheXl5IAAAAAABKXl5eVxgBAAAAAAlBXl5e
Xg0AAAAAAAAAAAAAADheXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eNwAAAAAAOV5eXl5eXl5eXl5e
Xl5eXlUAAAAAAAAAAAAAAAAUXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXhMAAAAAABZeXl5eXl5e
Xl5eXl5eXl40AAAAAAAAAAAAAAAAADNeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXjIAAAAAAAAANV5e
Xl5eXl5eXl5eXl5MBAAAAAAAAAAAAAAAAAAAK1BeXl5eXl5eXl5cPTZaXl5eXl5eXl5eUCoAAAAAAAAA
AAAsUV5eXl5eXl5eXlk8BgAAAAAAAAAAAAAAAAAAAAAAEB8lJiYmJiQdBwAABRokJiYmJiUfEAAAAAAA
AAAAAAAAAAARHyUmJiYmIxcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAACgAAABAAAAAgAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA=
</value>
</data>
</root>

163
Meeting-Clock.csproj Normal file
View File

@ -0,0 +1,163 @@
<?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>{97CA08CF-C8F9-4D6C-8C15-77695A995169}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>MeetingClock</RootNamespace>
<AssemblyName>Meeting Clock</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject>MeetingClock.MeetingClock</StartupObject>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>
</ApplicationIcon>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Office.Interop.Outlook, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
<EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="BluetoothManager.cs" />
<Compile Include="MainWindow.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainWindow.Designer.cs">
<DependentUpon>MainWindow.cs</DependentUpon>
</Compile>
<Compile Include="MeetingClock.cs" />
<Compile Include="MeetingClockManager.cs" />
<Compile Include="OutlookManager.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Settings.cs" />
<EmbeddedResource Include="MainWindow.resx">
<DependentUpon>MainWindow.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Windows.SDK.Contracts">
<Version>10.0.19041.1</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-neutral.ico" />
</ItemGroup>
<ItemGroup>
<None Include="icons\icon-error.ico" />
</ItemGroup>
<ItemGroup>
<None Include="icons\icon-neutral.ico" />
</ItemGroup>
<ItemGroup>
<None Include="icons\icon-off.ico" />
</ItemGroup>
<ItemGroup>
<None Include="icons\icon-ok.ico" />
</ItemGroup>
<ItemGroup>
<None Include="icons\icon-warning.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

37
Meeting-Clock.sln Normal file
View File

@ -0,0 +1,37 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30717.126
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Meeting-Clock", "Meeting-Clock.csproj", "{97CA08CF-C8F9-4D6C-8C15-77695A995169}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Debug|Any CPU.Build.0 = Debug|Any CPU
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Debug|x64.ActiveCfg = Debug|x64
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Debug|x64.Build.0 = Debug|x64
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Debug|x86.ActiveCfg = Debug|x86
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Debug|x86.Build.0 = Debug|x86
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Release|Any CPU.ActiveCfg = Release|Any CPU
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Release|Any CPU.Build.0 = Release|Any CPU
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Release|x64.ActiveCfg = Release|x64
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Release|x64.Build.0 = Release|x64
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Release|x86.ActiveCfg = Release|x86
{97CA08CF-C8F9-4D6C-8C15-77695A995169}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8BF71566-EA72-4AF7-B52D-0D54EE96FC46}
EndGlobalSection
EndGlobal

19
MeetingClock.cs Normal file
View File

@ -0,0 +1,19 @@
using System;
using System.Windows.Forms;
namespace MeetingClock
{
static class MeetingClock
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainWindow());
}
}
}

479
MeetingClockManager.cs Normal file
View File

@ -0,0 +1,479 @@
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO.Ports;
using System.Text;
using System.Timers;
using System.Windows.Forms;
namespace MeetingClock
{
public class MeetingClockManager
{
private const string MTC = "MTC";
public enum MeetingClockState
{
NotInitialized,
NoComPort,
Disconnected,
Connected
}
public MeetingClockState State { get; private set; } = MeetingClockState.NotInitialized;
public string Version { get; private set; }
public string Port {
get
{
if (this.serialPort != null && this.serialPort.IsOpen)
{
return this.serialPort.PortName;
}
return "";
}
}
public delegate void MeetingClockStateChangeHandler(MeetingClockManager manager, MeetingClockState oldState, MeetingClockState newState);
public event MeetingClockStateChangeHandler StateChanged;
private System.Timers.Timer startTimer;
private System.Timers.Timer checkTimer;
private BluetoothManager bluetoothManager;
private SerialPort serialPort;
public MeetingClockManager(BluetoothManager bluetoothManager)
{
this.NewSerialPort();
this.startTimer = new System.Timers.Timer(1000);
this.startTimer.AutoReset = false;
this.startTimer.Elapsed += ConnectTimer_Elapsed;
this.checkTimer = new System.Timers.Timer(30000);
this.checkTimer.AutoReset = false;
this.checkTimer.Elapsed += CheckTimer_Elapsed;
this.checkTimer.Start();
this.bluetoothManager = bluetoothManager;
this.bluetoothManager.StateChanged += BluetoothManager_StateChanged;
}
private void NewSerialPort() {
lock (this) {
if (this.serialPort != null)
{
try
{
this.serialPort.Close();
}
catch (Exception)
{
// ignored
}
}
this.serialPort = new SerialPort();
this.serialPort.BaudRate = 9600;
this.serialPort.Parity = Parity.None;
this.serialPort.DataBits = 8;
this.serialPort.StopBits = StopBits.One;
this.serialPort.Encoding = Encoding.GetEncoding("iso8859-1");
this.serialPort.ReadTimeout = 1000;
this.serialPort.WriteTimeout = 1000;
}
}
private void BluetoothManager_StateChanged(BluetoothManager manager, BluetoothManager.BluetoothState oldState, BluetoothManager.BluetoothState newState)
{
switch (newState)
{
case BluetoothManager.BluetoothState.On:
this.startTimer.Start();
break;
default:
this.Disconnect();
break;
}
}
private void ConnectTimer_Elapsed(object sender, ElapsedEventArgs e)
{
this.Connect();
}
private void Connect()
{
lock (this)
{
if (this.State == MeetingClockState.Connected && this.serialPort.IsOpen)
{
Debug.WriteLine("Meeting clock already connected. Not trying to connect again.");
return;
}
string[] portNames = SerialPort.GetPortNames();
if (portNames.Length == 0)
{
Debug.WriteLine("No COM ports are available at the moment.");
this.ChangeState(MeetingClockState.NoComPort);
return;
}
this.ChangeState(MeetingClockState.Disconnected);
this.NewSerialPort();
foreach (string portName in portNames)
{
Debug.WriteLine(String.Format("Trying to connect to {0}", portName));
try
{
this.serialPort.PortName = portName;
this.serialPort.Open();
if (this.Handshake())
{
Debug.WriteLine(String.Format("Successfully connected to meeting clock {0} on port {1}", this.Version, portName));
this.Adjust();
this.ScrollText("");
this.NextDate(DateTime.Now.AddMinutes(-5));
this.ChangeState(MeetingClockState.Connected);
return;
}
else
{
Debug.WriteLine(String.Format("Failed to connect to meeting clock on port {0}. Invalid Handshake.", portName));
}
}
catch (Exception exception)
{
Debug.WriteLine(String.Format("Failed to connect to meeting clock on port {0}. {1}", portName, exception.Message));
}
this.Disconnect();
}
}
}
private void Disconnect()
{
lock (this)
{
if (this.serialPort.IsOpen)
{
Debug.WriteLine(String.Format("Closing connection on port {0}", this.serialPort.PortName));
try
{
this.serialPort.Close();
}
catch (Exception)
{
// ignored
}
}
this.ChangeState(MeetingClockState.Disconnected);
this.NewSerialPort();
}
}
private bool Handshake()
{
string rx = this.SendAndReceive(MTC);
if (rx == null)
{
return false;
}
if (rx.StartsWith(MTC))
{
this.Version = rx.Substring(MTC.Length).Trim();
return true;
}
return false;
}
public void Adjust()
{
this.SendAndReceive(String.Format("ADJ {0}", DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss")));
}
private string SendAndReceive(string tx)
{
lock (this)
{
try
{
if (this.serialPort.IsOpen)
{
Debug.WriteLine(String.Format(">>> {0}", tx));
this.serialPort.WriteLine(tx);
string rx = this.serialPort.ReadLine().Trim();
Debug.WriteLine(String.Format("<<< {0}", rx));
return rx;
}
}
catch (Exception exception)
{
Debug.WriteLine(String.Format("Failed to send/receiv on port {0}. {1}", this.serialPort.PortName, exception.Message));
this.Disconnect();
}
return null;
}
}
private void ChangeState(MeetingClockState newState)
{
MeetingClockState oldState = this.State;
this.State = newState;
if (newState != oldState)
{
Debug.WriteLine("Meeting Clock state change detected. Old state: {0}, new state {1}.", oldState, newState);
if (this.StateChanged != null)
{
this.StateChanged(this, oldState, newState);
}
}
}
private void CheckTimer_Elapsed(object sender, ElapsedEventArgs e)
{
if (this.serialPort.IsOpen)
{
if (!this.Handshake())
{
this.Disconnect();
}
}
else if (this.bluetoothManager.State == BluetoothManager.BluetoothState.On)
{
this.Connect();
}
this.checkTimer.Start();
}
public void Stop()
{
this.Disconnect();
this.checkTimer.Stop();
this.startTimer.Stop();
}
public int? GetTimeInterval()
{
try
{
string rx = this.SendAndReceive("GET TI").Substring(7);
return int.Parse(rx);
}
catch (Exception)
{
return null;
}
}
public void SetTimeInterval(int value)
{
try
{
this.SendAndReceive("SET TI " + value);
}
catch (Exception)
{
}
}
public int? GetDateInterval()
{
try
{
string rx = this.SendAndReceive("GET DI").Substring(7);
return int.Parse(rx);
}
catch (Exception)
{
return null;
}
}
public void SetDateInterval(int value)
{
try
{
this.SendAndReceive("SET DI " + value);
}
catch (Exception)
{
}
}
public int? GetTemperatureInterval()
{
try
{
string rx = this.SendAndReceive("GET CI").Substring(7);
return int.Parse(rx);
}
catch (Exception)
{
return null;
}
}
public void SetTemperatureInterval(int value)
{
try
{
this.SendAndReceive("SET CI " + value);
}
catch (Exception)
{
}
}
public int? GetBrightness()
{
try
{
string rx = this.SendAndReceive("GET IN").Substring(7);
return int.Parse(rx);
}
catch (Exception)
{
return null;
}
}
public int? GetScrollSpeed()
{
try
{
string rx = this.SendAndReceive("GET SS").Substring(7);
return int.Parse(rx);
}
catch (Exception)
{
return null;
}
}
public int? GetScrollWait()
{
try
{
string rx = this.SendAndReceive("GET SW").Substring(7);
return int.Parse(rx);
}
catch (Exception)
{
return null;
}
}
public void SetBrightness(int value)
{
try
{
this.SendAndReceive("SET IN " + value);
}
catch (Exception)
{
}
}
public void SetScrollSpeed(int value)
{
try
{
this.SendAndReceive("SET SS " + value);
}
catch (Exception)
{
}
}
public void SetScrollWait(int value)
{
try
{
this.SendAndReceive("SET SW " + value);
}
catch (Exception)
{
}
}
public void ScrollText(string value)
{
try
{
this.SendAndReceive("SCR " + value);
}
catch (Exception)
{
}
}
public bool? GetDateEnabled()
{
try
{
string rx = this.SendAndReceive("GET DE").Substring(7);
return int.Parse(rx) > 0;
}
catch (Exception)
{
return null;
}
}
public void SetDateEnabled(bool value)
{
try
{
this.SendAndReceive("SET DE " + (value ? "1" : "0"));
}
catch (Exception)
{
}
}
public bool? GetTemperatureEnabled()
{
try
{
string rx = this.SendAndReceive("GET CE").Substring(7);
return int.Parse(rx) > 0;
}
catch (Exception)
{
return null;
}
}
public void SetTemperatureEnabled(bool value)
{
try
{
this.SendAndReceive("SET CE " + (value ? "1" : "0"));
}
catch (Exception)
{
}
}
internal void NextDate(DateTime value)
{
try
{
this.SendAndReceive("NXT " + value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss"));
}
catch (Exception)
{
}
}
}
}

181
OutlookManager.cs Normal file
View File

@ -0,0 +1,181 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Outlook = Microsoft.Office.Interop.Outlook;
namespace MeetingClock
{
public class OutlookManager
{
private Outlook.Application application;
public OutlookManager()
{
}
public async Task<Outlook.AppointmentItem> GetNextAppointment(
bool ignoreAllDayEvents, bool ignoreCancelledMeetings, bool ignoreFreeMeetings, bool ignoreOutOfOfficeMeetings, bool ignoreTentativeMeetings)
{
await Task.Run(() =>
{
lock(this)
{
int retries = 5;
while (this.application == null && retries-- > 0)
{
try
{
this.application = new Outlook.Application();
}
catch (Exception exception)
{
this.application = null;
Debug.WriteLine(String.Format("Failed to start outlook application: {0}", exception.Message));
Thread.Sleep(3000);
}
}
}
});
List<Outlook.AppointmentItem> appointmentItems = new List<Outlook.AppointmentItem>();
lock (this)
{
if (this.application == null)
{
return null; // not available at the moment
}
try
{
Outlook.Folder calendarFolder = this.application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar) as Outlook.Folder;
DateTime start = DateTime.Now;
DateTime end = start.AddHours(2);
string filter = String.Format("[Start] >= '{0}' AND [Start] <= '{1}'", start.ToString("g"), end.ToString("g"));
Debug.WriteLine(String.Format("Filtering Outlook Events: {0}", filter));
Outlook.Items appointments = calendarFolder.Items;
appointments.IncludeRecurrences = true;
appointments.Sort("[Start]", Type.Missing);
Outlook.Items filteredAppointments = appointments.Restrict(filter);
Debug.WriteLine(String.Format("Found {0} outlook appointments between {1} and {2}", filteredAppointments.Count, start.ToString("g"), end.ToString("g")));
DateTime? firstAppointmentTime = null;
foreach (Outlook.AppointmentItem appointment in filteredAppointments)
{
Debug.WriteLine(String.Format("{0}-{5} ({6}): {1} ({2}), allday: {3}, busy: {4}, importance: {7}, recurring: {8}, scheduled: {9}, conflict: {10}",
appointment.Start.ToString("g"), appointment.Subject, appointment.MeetingStatus, appointment.AllDayEvent, appointment.BusyStatus, appointment.End.ToString("g"),
appointment.Duration, appointment.Importance, appointment.RecurrenceState, appointment.CreationTime.ToString("g"), appointment.IsConflict));
if (ignoreAllDayEvents && appointment.AllDayEvent)
{
continue; // ignore all day events
}
if (ignoreCancelledMeetings
&& (appointment.MeetingStatus == Outlook.OlMeetingStatus.olMeetingCanceled || appointment.MeetingStatus == Outlook.OlMeetingStatus.olMeetingReceivedAndCanceled))
{
continue; // ignore cancelled meetings
}
if (ignoreFreeMeetings && appointment.BusyStatus == Outlook.OlBusyStatus.olFree)
{
continue; // ignore free meetings
}
if (ignoreOutOfOfficeMeetings && appointment.BusyStatus == Outlook.OlBusyStatus.olOutOfOffice)
{
continue; // ignore out of office meetings
}
if (ignoreTentativeMeetings && appointment.BusyStatus == Outlook.OlBusyStatus.olTentative)
{
continue; // ignore tentative meetings
}
if (firstAppointmentTime == null)
{
firstAppointmentTime = appointment.Start;
}
// ignore appointments that do not start first
if (firstAppointmentTime < appointment.Start)
{
continue; // ignore later appointments
}
appointmentItems.Add(appointment);
Debug.WriteLine(String.Format("Next possible appointment is {0}-{1}: {2}", appointment.Start.ToString("t"), appointment.End.ToString("t"), appointment.Subject));
}
}
catch (Exception exception)
{
Debug.WriteLine(String.Format("Exception getting outlook appointments: {0}", exception.Message));
this.application = null;
}
}
if (appointmentItems.Count == 0)
{
return null; // no appointments upcoming
}
if (appointmentItems.Count == 1)
{
return appointmentItems[0]; // exactly one appointment upcoming
}
// remove cancelled events
appointmentItems = appointmentItems.AsQueryable()
.Where(item => item.MeetingStatus != Outlook.OlMeetingStatus.olMeetingCanceled && item.MeetingStatus != Outlook.OlMeetingStatus.olMeetingReceivedAndCanceled).ToList();
if (appointmentItems.Count == 1)
{
return appointmentItems[0]; // one appointment still left
}
// remove duplicates by priority, select highest priority
Outlook.OlImportance importance = appointmentItems.AsQueryable().OrderByDescending(item => (int)item.Importance).Select(item => item.Importance).First();
appointmentItems = appointmentItems.AsQueryable().Where(item => item.Importance == importance).ToList();
if (appointmentItems.Count == 1)
{
return appointmentItems[0]; // one appointment still left
}
// remove all day events
appointmentItems = appointmentItems.AsQueryable().Where(item => !item.AllDayEvent).ToList();
if (appointmentItems.Count == 1)
{
return appointmentItems[0]; // one appointment still left
}
// remove free appointment
appointmentItems = appointmentItems.AsQueryable().Where(item => item.BusyStatus != Outlook.OlBusyStatus.olFree).ToList();
if (appointmentItems.Count == 1)
{
return appointmentItems[0]; // one appointment still left
}
// remove tentative appointment
appointmentItems = appointmentItems.AsQueryable().Where(item => item.BusyStatus != Outlook.OlBusyStatus.olTentative).ToList();
if (appointmentItems.Count == 1)
{
return appointmentItems[0]; // one appointment still left
}
// remove out of office appointment
appointmentItems = appointmentItems.AsQueryable().Where(item => item.BusyStatus != Outlook.OlBusyStatus.olOutOfOffice).ToList();
if (appointmentItems.Count == 1)
{
return appointmentItems[0]; // one appointment still left
}
return appointmentItems[0];
}
}
}

View File

@ -0,0 +1,38 @@
using System.Resources;
using System.Reflection;
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("Meeting-Clock")]
[assembly: AssemblyDescription("Meeting Clock")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Frank Zechert")]
[assembly: AssemblyProduct("Meeting-Clock")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[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.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("97ca08cf-c8f9-4d6c-8c15-77695a995169")]
// 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")]
[assembly: NeutralResourcesLanguage("en")]

113
Properties/Resources.Designer.cs generated Normal file
View File

@ -0,0 +1,113 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace MeetingClock.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MeetingClock.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon icon_error {
get {
object obj = ResourceManager.GetObject("icon_error", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon icon_neutral {
get {
object obj = ResourceManager.GetObject("icon_neutral", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon icon_off {
get {
object obj = ResourceManager.GetObject("icon_off", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon icon_ok {
get {
object obj = ResourceManager.GetObject("icon_ok", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon icon_warning {
get {
object obj = ResourceManager.GetObject("icon_warning", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
}
}

136
Properties/Resources.resx Normal file
View File

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="icon_error" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\icons\icon-error.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon_neutral" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\icons\icon-neutral.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon_off" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\icons\icon-off.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon_ok" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\icons\icon-ok.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon_warning" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\icons\icon-warning.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

143
Properties/Settings.Designer.cs generated Normal file
View File

@ -0,0 +1,143 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace MeetingClock.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("v. 1.0.0")]
public string Version {
get {
return ((string)(this["Version"]));
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool CheckForUpdates {
get {
return ((bool)(this["CheckForUpdates"]));
}
set {
this["CheckForUpdates"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool StartMinimized {
get {
return ((bool)(this["StartMinimized"]));
}
set {
this["StartMinimized"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool StartBluetooth {
get {
return ((bool)(this["StartBluetooth"]));
}
set {
this["StartBluetooth"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool IgnoreAllDayAppointments {
get {
return ((bool)(this["IgnoreAllDayAppointments"]));
}
set {
this["IgnoreAllDayAppointments"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool IgnoreCancelledAppointments {
get {
return ((bool)(this["IgnoreCancelledAppointments"]));
}
set {
this["IgnoreCancelledAppointments"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool IgnoreFreeAppointments {
get {
return ((bool)(this["IgnoreFreeAppointments"]));
}
set {
this["IgnoreFreeAppointments"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool IgnoreOutOfOfficeAppointments {
get {
return ((bool)(this["IgnoreOutOfOfficeAppointments"]));
}
set {
this["IgnoreOutOfOfficeAppointments"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool IgnoreTentativeAppointments {
get {
return ((bool)(this["IgnoreTentativeAppointments"]));
}
set {
this["IgnoreTentativeAppointments"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("10")]
public int ReminderTime {
get {
return ((int)(this["ReminderTime"]));
}
set {
this["ReminderTime"] = value;
}
}
}
}

View File

@ -0,0 +1,36 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="MeetingClock.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="Version" Type="System.String" Scope="Application">
<Value Profile="(Default)">v. 1.0.0</Value>
</Setting>
<Setting Name="CheckForUpdates" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="StartMinimized" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="StartBluetooth" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="IgnoreAllDayAppointments" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="IgnoreCancelledAppointments" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="IgnoreFreeAppointments" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="IgnoreOutOfOfficeAppointments" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="IgnoreTentativeAppointments" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="ReminderTime" Type="System.Int32" Scope="User">
<Value Profile="(Default)">10</Value>
</Setting>
</Settings>
</SettingsFile>

164
Settings.cs Normal file
View File

@ -0,0 +1,164 @@
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MeetingClock
{
public class Settings
{
private readonly string AUTOSTART_REGKEY = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
private readonly string AUTOSTART_VALUE = "Meeting-Clock";
public bool Autostart
{
get
{
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(AUTOSTART_REGKEY, false))
{
return (string) key.GetValue(AUTOSTART_VALUE) == "\"" + Application.ExecutablePath + "\"";
}
}
set
{
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(AUTOSTART_REGKEY, true))
{
if (value)
{
key.SetValue(AUTOSTART_VALUE, "\"" + Application.ExecutablePath + "\"");
}
else
{
key.DeleteValue(AUTOSTART_VALUE, false);
}
}
}
}
public bool StartMinimized
{
get
{
return Properties.Settings.Default.StartMinimized;
}
set
{
Properties.Settings.Default.StartMinimized = value;
Properties.Settings.Default.Save();
}
}
public bool CheckForUpdates
{
get
{
return Properties.Settings.Default.CheckForUpdates;
}
set
{
Properties.Settings.Default.CheckForUpdates = value;
Properties.Settings.Default.Save();
}
}
public bool StartBluetooth
{
get
{
return Properties.Settings.Default.StartBluetooth;
}
set
{
Properties.Settings.Default.StartBluetooth = value;
Properties.Settings.Default.Save();
}
}
public bool IgnoreAllDayAppointments
{
get
{
return Properties.Settings.Default.IgnoreAllDayAppointments;
}
set
{
Properties.Settings.Default.IgnoreAllDayAppointments = value;
Properties.Settings.Default.Save();
}
}
public bool IgnoreCancelledAppointments
{
get
{
return Properties.Settings.Default.IgnoreCancelledAppointments;
}
set
{
Properties.Settings.Default.IgnoreCancelledAppointments = value;
Properties.Settings.Default.Save();
}
}
public bool IgnoreFreeAppointments
{
get
{
return Properties.Settings.Default.IgnoreFreeAppointments;
}
set
{
Properties.Settings.Default.IgnoreFreeAppointments = value;
Properties.Settings.Default.Save();
}
}
public bool IgnoreOutOfOfficeAppointments
{
get
{
return Properties.Settings.Default.IgnoreOutOfOfficeAppointments;
}
set
{
Properties.Settings.Default.IgnoreOutOfOfficeAppointments = value;
Properties.Settings.Default.Save();
}
}
public bool IgnoreTentativeAppointments
{
get
{
return Properties.Settings.Default.IgnoreTentativeAppointments;
}
set
{
Properties.Settings.Default.IgnoreTentativeAppointments = value;
Properties.Settings.Default.Save();
}
}
public int ReminderTime
{
get
{
return Properties.Settings.Default.ReminderTime;
}
set
{
Properties.Settings.Default.ReminderTime = value;
Properties.Settings.Default.Save();
}
}
}
}

BIN
icons/icon-error.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
icons/icon-error.xcf Normal file

Binary file not shown.

BIN
icons/icon-neutral.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
icons/icon-neutral.xcf Normal file

Binary file not shown.

BIN
icons/icon-off.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
icons/icon-off.xcf Normal file

Binary file not shown.

BIN
icons/icon-ok.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
icons/icon-ok.xcf Normal file

Binary file not shown.

BIN
icons/icon-warning.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
icons/icon-warning.xcf Normal file

Binary file not shown.