/* Copyright (c) Citrix Systems Inc. * All rights reserved. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided * that the following conditions are met: * * * Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using XenAdmin.Actions; using XenAdmin.Core; using XenAdmin.Network; namespace XenAdmin.Controls { public class ActionRow : CustomHistoryRow { /// /// should never be null /// public ActionBase Action; public List AppliesTo = new List(); private DateTime finished = DateTime.MinValue; protected override string TimeTaken { get { if (!Action.IsCompleted || finished == DateTime.MinValue) { TimeSpan time = DateTime.Now.Subtract(Action.Started); time = new TimeSpan(time.Days, time.Hours, time.Minutes, time.Seconds, 0); return time.ToString(); } else { TimeSpan time = finished.Subtract(Action.Started); time = new TimeSpan(time.Days, time.Hours, time.Minutes, time.Seconds, 0); return time.ToString(); } } } public ActionRow(ActionBase action) { AppliesTo = action.AppliesTo; Action = action; this.Image = getImage(); TimeOccurred = HelpersGUI.DateTimeToString(Action.Started, Messages.DATEFORMAT_DMY_HMS, true); this.CancelButtonClicked += new EventHandler(CancelAction); setupRowDetails(); if (!Action.IsCompleted) { Action.Changed += Action_Changed; Action.Completed += Action_Completed; } } protected override void Dispose(bool disposing) { if(disposing) { if(Action != null) { Action.Changed -= Action_Changed; Action.Completed -= Action_Completed; } } base.Dispose(disposing); } private void Action_Completed(ActionBase sender) { setupRowDetails(); } private void CancelAction(object sender, EventArgs e) { Action.Cancel(); setupRowDetails(); } private void setupRowDetails() { AppliesTo = Action.AppliesTo; AsyncAction asyncAction = Action as AsyncAction; if (Action.Title == null) { // Should occur rarely if ever IXenConnection conn = asyncAction == null ? null : asyncAction.Connection; string conn_name = conn == null ? null : Helpers.GetName(conn); string vm_name = Action.VM == null ? null : Action.VM.Name; string desc = Action.Description; if (conn_name != null && vm_name != null && desc != null) { this.Title = string.Format(Messages.HISTORYROW_ON_WITH, conn_name, vm_name, desc); } else if (vm_name != null && desc != null) { this.Title = string.Format(Messages.HISTORYROW_WITH, vm_name, desc); } else if (conn_name != null && desc != null) { this.Title = string.Format(Messages.HISTORYROW_ON, conn_name, desc); } else if (desc != null) { this.Title = desc; } else { this.Title = ""; } } else { this.Title = Action.Title; } Error = (Action.Exception != null) && !(Action.Exception is CancelledException); Image = getImage(); ShowTime = Action.Finished - Action.Started >= TimeSpan.FromSeconds(1); if (Action.Exception == null) { Description = Action.Description; } else if (Action.Exception is CancelledException) { Description = Messages.EXCEPTION_USER_CANCELLED; } else if (Action.Exception is I18NException) { Description = ((I18NException)Action.Exception).I18NMessage; } else { Description = Action.Exception.Message; } ShowProgress = Action.ShowProgress && !Action.IsCompleted; ShowCancel = !Action.IsCompleted; Progress = Action.PercentComplete; CancelEnabled = Action.CanCancel; if (Action.IsCompleted) { finished = Action.Finished; if (ParentPanel != null) { Program.BeginInvoke(ParentPanel, delegate() { ParentPanel.Refresh(); }); } } } private void Action_Changed(ActionBase sender) { if (Action is AsyncAction) (Action as AsyncAction).RecomputeCanCancel(); setupRowDetails(); } private Image getImage() { if (Action.IsCompleted) return Action.Succeeded ? Properties.Resources._000_Tick_h32bit_16 : Properties.Resources._000_error_h32bit_16; if (Action.PercentComplete < 10) return Properties.Resources.usagebar_0; if (Action.PercentComplete < 20) return Properties.Resources.usagebar_1; if (Action.PercentComplete < 30) return Properties.Resources.usagebar_2; if (Action.PercentComplete < 40) return Properties.Resources.usagebar_3; if (Action.PercentComplete < 50) return Properties.Resources.usagebar_4; if (Action.PercentComplete < 60) return Properties.Resources.usagebar_5; if (Action.PercentComplete < 70) return Properties.Resources.usagebar_6; if (Action.PercentComplete < 80) return Properties.Resources.usagebar_7; if (Action.PercentComplete < 90) return Properties.Resources.usagebar_8; return Properties.Resources.usagebar_9; } } }