source: branches/eraser6/6.0/Eraser/MainForm.cs @ 1735

Revision 1735, 11.1 KB checked in by lowjoel, 4 years ago (diff)

Slightly better fix than r1734.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1/*
2 * $Id$
3 * Copyright 2008-2010 The Eraser Project
4 * Original Author: Joel Low <lowjoel@users.sourceforge.net>
5 * Modified By:
6 *
7 * This file is part of Eraser.
8 *
9 * Eraser is free software: you can redistribute it and/or modify it under the
10 * terms of the GNU General Public License as published by the Free Software
11 * Foundation, either version 3 of the License, or (at your option) any later
12 * version.
13 *
14 * Eraser is distributed in the hope that it will be useful, but WITHOUT ANY
15 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
16 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 *
18 * A copy of the GNU General Public License can be found at
19 * <http://www.gnu.org/licenses/>.
20 */
21
22using System;
23using System.Collections.Generic;
24using System.ComponentModel;
25using System.Data;
26using System.Drawing;
27using System.Drawing.Drawing2D;
28using System.Text;
29using System.Windows.Forms;
30using Eraser.Util;
31using Eraser.Manager;
32using Eraser.Properties;
33using System.IO;
34using System.Diagnostics;
35using System.Reflection;
36
37namespace Eraser
38{
39    public partial class MainForm : Form
40    {
41        private BasePanel CurrPage;
42        private SchedulerPanel SchedulerPage = new SchedulerPanel();
43        private SettingsPanel SettingsPage = new SettingsPanel();
44
45        public MainForm()
46        {
47            InitializeComponent();
48            contentPanel.Controls.Add(SchedulerPage);
49            contentPanel.Controls.Add(SettingsPage);
50            if (!IsHandleCreated)
51                CreateHandle();
52
53            UXThemeApi.UpdateControlTheme(this);
54            UXThemeApi.UpdateControlTheme(notificationMenu);
55
56            //Connect to the executor task processing and processed events.
57            Program.eraserClient.TaskProcessing += OnTaskProcessing;
58            Program.eraserClient.TaskProcessed += OnTaskProcessed;
59
60            //Check the notification area context menu's minimise to tray item.
61            hideWhenMinimisedToolStripMenuItem.Checked = EraserSettings.Get().HideWhenMinimised;
62
63            //Set the docking style for each of the pages
64            SchedulerPage.Dock = DockStyle.Fill;
65            SettingsPage.Visible = false;
66
67            //Show the default page.
68            ChangePage(MainFormPage.Scheduler);
69        }
70
71        /// <summary>
72        /// Diplays the given title, message and icon as a system notification area balloon.
73        /// </summary>
74        /// <param name="title">The title of the balloon.</param>
75        /// <param name="message">The message to display.</param>
76        /// <param name="icon">The icon to show.</param>
77        public void ShowNotificationBalloon(string title, string message, ToolTipIcon icon)
78        {
79            notificationIcon.BalloonTipTitle = title;
80            notificationIcon.BalloonTipText = message;
81            notificationIcon.BalloonTipIcon = icon;
82            notificationIcon.ShowBalloonTip(0);
83        }
84
85        /// <summary>
86        /// Changes the active page displayed in the form.
87        /// </summary>
88        /// <param name="page">The new page to change to. No action is done when the
89        /// current page is the same as the new page requested</param>
90        public void ChangePage(MainFormPage page)
91        {
92            BasePanel oldPage = CurrPage;
93            switch (page)
94            {
95                case MainFormPage.Scheduler:
96                    CurrPage = SchedulerPage;
97                    break;
98                case MainFormPage.Settings:
99                    CurrPage = SettingsPage;
100                    break;
101            }
102
103            if (oldPage != CurrPage)
104            {
105                contentPanel.SuspendLayout();
106
107                //Hide the old page before showing the new one
108                if (oldPage != null)
109                    oldPage.Visible = false;
110
111                //If the page is not set to dock, we need to specify the dimensions of the page
112                //so it fits properly.
113                if (CurrPage.Dock == DockStyle.None)
114                {
115                    CurrPage.Anchor = AnchorStyles.Left | AnchorStyles.Right |
116                        AnchorStyles.Top;
117                    CurrPage.Left = 0;
118                    CurrPage.Top = 0;
119                    CurrPage.Width = contentPanel.Width;
120                }
121
122                //Show the new page then bring it to the top of the z-order.
123                CurrPage.Visible = true;
124                CurrPage.BringToFront();
125                contentPanel.ResumeLayout();
126            }
127        }
128
129        private static GraphicsPath CreateRoundRect(float X, float Y, float width,
130            float height, float radius)
131        {
132            GraphicsPath result = new GraphicsPath();
133
134            //Top line.
135            result.AddLine(X + radius, Y, X + width - 2 * radius, Y);
136
137            //Top-right corner
138            result.AddArc(X + width - 2 * radius, Y, 2 * radius, 2 * radius, 270, 90);
139
140            //Right line.
141            result.AddLine(X + width, Y + radius, X + width, Y + height - 2 * radius);
142
143            //Bottom-right corner
144            result.AddArc(X + width - 2 * radius, Y + height - 2 * radius, 2 * radius, 2 * radius, 0, 90);
145
146            //Bottom line.
147            result.AddLine(X + width - 2 * radius, Y + height, X + radius, Y + height);
148
149            //Bottom-left corner
150            result.AddArc(X, Y + height - 2 *radius, 2 * radius, 2 * radius, 90, 90);
151
152            //Left line
153            result.AddLine(X, Y + height - 2 * radius, X, Y + radius);
154
155            //Top-left corner
156            result.AddArc(X, Y, 2 * radius, 2 * radius, 180, 90);
157            result.CloseFigure();
158
159            return result;
160        }
161
162        private void DrawBackground(Graphics dc)
163        {
164            //Draw the base background
165            dc.FillRectangle(new SolidBrush(Color.FromArgb(unchecked((int)0xFF292929))),
166                new Rectangle(new Point(0, 0), Size));
167
168            //Then the side gradient
169            dc.FillRectangle(new LinearGradientBrush(new Rectangle(0, 0, 338, Math.Max(1, ClientSize.Height)),
170                    Color.FromArgb(unchecked((int)0xFF363636)),
171                    Color.FromArgb(unchecked((int)0xFF292929)), 0.0),
172                0, 0, 338, ClientSize.Height);
173
174            //Draw the top background
175            dc.FillRectangle(new SolidBrush(Color.FromArgb(unchecked((int)0xFF414141))),
176                new Rectangle(0, 0, ClientSize.Width, 32));
177
178            //The top gradient
179            dc.DrawImage(Properties.Resources.BackgroundGradient, new Point(0, 0));
180
181            dc.SmoothingMode = SmoothingMode.AntiAlias;
182            dc.FillPath(Brushes.White, CreateRoundRect(11, 74, contentPanel.Width + 8, ClientSize.Height - 85, 3));
183        }
184
185        private void MainForm_Paint(object sender, PaintEventArgs e)
186        {
187            e.Graphics.SetClip(new Rectangle(0, 0, Width, Height), CombineMode.Intersect);
188            DrawBackground(e.Graphics);
189        }
190
191        private void MainForm_Resize(object sender, EventArgs e)
192        {
193            if (WindowState != FormWindowState.Minimized)
194            {
195                Bitmap bmp = new Bitmap(Width, Height);
196                Graphics dc = Graphics.FromImage(bmp);
197                DrawBackground(dc);
198
199                CreateGraphics().DrawImage(bmp, new Point(0, 0));
200            }
201            else if (EraserSettings.Get().HideWhenMinimised)
202            {
203                Visible = false;
204            }
205        }
206
207        private void tbSchedule_Click(object sender, EventArgs e)
208        {
209            ChangePage(MainFormPage.Scheduler);
210        }
211
212        private void tbSettings_Click(object sender, EventArgs e)
213        {
214            ChangePage(MainFormPage.Settings);
215        }
216
217        private void newTaskToolStripMenuItem_Click(object sender, EventArgs e)
218        {
219            using (TaskPropertiesForm form = new TaskPropertiesForm())
220            {
221                if (form.ShowDialog() == DialogResult.OK)
222                {
223                    Task task = form.Task;
224                    Program.eraserClient.Tasks.Add(task);
225                }
226            }
227        }
228
229        private void exportTaskListToolStripMenuItem_Click(object sender, EventArgs e)
230        {
231            using (SaveFileDialog dialog = new SaveFileDialog())
232            {
233                dialog.Filter = "Eraser 6 task lists (*.ersx)|*.ersx";
234                dialog.DefaultExt = "ersx";
235                dialog.OverwritePrompt = true;
236
237                if (dialog.ShowDialog() == DialogResult.OK)
238                {
239                    using (FileStream stream = new FileStream(dialog.FileName,
240                        FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
241                    {
242                        Program.eraserClient.Tasks.SaveToStream(stream);
243                    }
244                }
245            }
246        }
247
248        private void importTaskListToolStripMenuItem_Click(object sender, EventArgs e)
249        {
250            using (OpenFileDialog dialog = new OpenFileDialog())
251            {
252                dialog.Filter = "Eraser 6 task lists (*.ersx)|*.ersx";
253                dialog.DefaultExt = "ersx";
254
255                if (dialog.ShowDialog() == DialogResult.OK)
256                {
257                    using (FileStream stream = new FileStream(dialog.FileName,
258                        FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
259                    {
260                        Program.eraserClient.Tasks.LoadFromStream(stream);
261                    }
262                }
263            }
264        }
265
266        private void tbHelp_Click(object sender, EventArgs e)
267        {
268            try
269            {
270                Process.Start(Path.Combine(Path.GetDirectoryName(
271                        Assembly.GetEntryAssembly().Location),
272                    "Eraser Documentation.pdf"));
273            }
274            catch (Win32Exception ex)
275            {
276                MessageBox.Show(this, S._("The Eraser documentation file could not be " +
277                    "opened. Check that Adobe Reader installed and that your Eraser " +
278                    "install is not corrupt.\n\nThe error returned was: {0}", ex.Message),
279                    S._("Eraser"), MessageBoxButtons.OK, MessageBoxIcon.Error,
280                    MessageBoxDefaultButton.Button1, S.IsRightToLeft(this) ?
281                        MessageBoxOptions.RtlReading : 0);
282            }
283        }
284
285        private void checkForUpdatesToolStripMenuItem_Click(object sender, EventArgs e)
286        {
287            using (UpdateForm form = new UpdateForm())
288            {
289                form.ShowDialog();
290            }
291        }
292
293        private void aboutEraserToolStripMenuItem_Click(object sender, EventArgs e)
294        {
295            using (AboutForm form = new AboutForm(this))
296            {
297                form.ShowDialog();
298            }
299        }
300
301        private void eraserLogo_Click(object sender, EventArgs e)
302        {
303            Process.Start("http://eraser.heidi.ie/");
304        }
305
306        #region Task processing code (for notification area animation)
307        void OnTaskProcessing(object sender, TaskEventArgs e)
308        {
309            if (InvokeRequired)
310            {
311                Invoke(new EventHandler<TaskEventArgs>(OnTaskProcessing), sender, e);
312                return;
313            }
314
315            string iconText = S._("Eraser") + " - " + S._("Processing:") + ' ' + e.Task.UIText;
316            if (iconText.Length >= 64)
317                iconText = iconText.Remove(60) + "...";
318
319            ProcessingAnimationFrame = 0;
320            notificationIcon.Text = iconText;
321            notificationIconTimer.Enabled = true;
322        }
323
324        void OnTaskProcessed(object sender, TaskEventArgs e)
325        {
326            if (InvokeRequired)
327            {
328                Invoke(new EventHandler<TaskEventArgs>(OnTaskProcessed), sender, e);
329                return;
330            }
331
332            //Reset the notification area icon.
333            notificationIconTimer.Enabled = false;
334            if (notificationIcon.Icon != null)
335            {
336                ComponentResourceManager resources = new ComponentResourceManager(typeof(MainForm));
337                resources.ApplyResources(notificationIcon, "notificationIcon");
338            }
339        }
340
341        private void notificationIconTimer_Tick(object sender, EventArgs e)
342        {
343            notificationIcon.Icon = ProcessingAnimationFrames[ProcessingAnimationFrame++];
344            if (ProcessingAnimationFrame == ProcessingAnimationFrames.Length)
345                ProcessingAnimationFrame = 0;
346        }
347
348        private int ProcessingAnimationFrame;
349        private Icon[] ProcessingAnimationFrames = new Icon[] {
350            Resources.NotifyBusy1,
351            Resources.NotifyBusy2,
352            Resources.NotifyBusy3,
353            Resources.NotifyBusy4,
354            Resources.NotifyBusy5,
355            Resources.NotifyBusy4,
356            Resources.NotifyBusy3,
357            Resources.NotifyBusy2,
358            Resources.NotifyBusy1
359        };
360        #endregion
361
362        #region Minimise to tray code
363        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
364        {
365            if (EraserSettings.Get().HideWhenMinimised && e.CloseReason == CloseReason.UserClosing)
366            {
367                e.Cancel = true;
368                Visible = false;
369            }
370        }
371
372        private void MainForm_VisibleChanged(object sender, EventArgs e)
373        {
374            if (Visible)
375            {
376                WindowState = FormWindowState.Normal;
377                Activate();
378            }
379        }
380
381        private void openToolStripMenuItem_Click(object sender, EventArgs e)
382        {
383            Visible = true;
384        }
385
386        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
387        {
388            Application.Exit();
389        }
390
391        private void hideWhenMinimiseToolStripMenuItem_Click(object sender, EventArgs e)
392        {
393            EraserSettings.Get().HideWhenMinimised =
394                hideWhenMinimisedToolStripMenuItem.Checked;
395        }
396        #endregion
397    }
398
399    public enum MainFormPage
400    {
401        Scheduler = 0,
402        Settings
403    }
404}
Note: See TracBrowser for help on using the repository browser.