using MonoDevelop.Ide; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using MonoDevelop.Core; using MonoDevelop.Ide.Gui; using Xwt.Drawing; using MonoDevelop.Components.MainToolbar; using MonoDevelop.Ide.Tasks; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows.Media.Animation; using MonoDevelop.Ide.Gui.Components; namespace WindowsPlatform.MainToolbar { public enum StatusBarStatus { Normal, Ready, Warning, Error, } /// /// Interaction logic for StatusBar.xaml /// public partial class StatusBarControl : UserControl, StatusBar, INotifyPropertyChanged { StatusBarContextHandler ctxHandler; TaskEventHandler updateHandler; public StatusBarControl () { InitializeComponent (); DataContext = this; ctxHandler = new StatusBarContextHandler (this); ShowReady (); updateHandler = delegate { int ec = 0, wc = 0; foreach (MonoDevelop.Ide.Tasks.TaskListEntry t in TaskService.Errors) { if (t.Severity == TaskSeverity.Error) ec++; else if (t.Severity == TaskSeverity.Warning) wc++; } Runtime.RunInMainThread (delegate { if (ec > 0) { BuildResultPanelVisibility = Visibility.Visible; BuildResultCount = ec; BuildResultIcon = Stock.Error.GetImageSource (Xwt.IconSize.Small); } else if (wc > 0) { BuildResultPanelVisibility = Visibility.Visible; BuildResultCount = wc; BuildResultIcon = Stock.Warning.GetImageSource (Xwt.IconSize.Small); } else BuildResultPanelVisibility = Visibility.Collapsed; }); }; TaskService.Errors.TasksAdded += updateHandler; TaskService.Errors.TasksRemoved += updateHandler; StatusText.ToolTipOpening += (o, e) => { e.Handled = !TextTrimmed (); }; } bool TextTrimmed () { StatusText.Measure (new Size (double.PositiveInfinity, double.PositiveInfinity)); return StatusText.ActualWidth < StatusText.DesiredSize.Width; } public bool AutoPulse { get { return ProgressBar.IsIndeterminate; } set { ProgressBar.IsIndeterminate = value; } } public StatusBar MainContext { get { return ctxHandler.MainContext; } } public void BeginProgress (string name) { EndProgress(); Status = StatusBarStatus.Normal; ShowMessage (name); } public void BeginProgress (IconId image, string name) { EndProgress(); Status = StatusBarStatus.Normal; ShowMessage(image, name); } public StatusBarContext CreateContext () { return ctxHandler.CreateContext (); } public void Dispose () { TaskService.Errors.TasksAdded -= updateHandler; TaskService.Errors.TasksRemoved -= updateHandler; } public void EndProgress () { oldWork = 0; ProgressBar.BeginAnimation(System.Windows.Controls.Primitives.RangeBase.ValueProperty, null); } public void Pulse () { // Nothing to do here. } static Pad sourcePad; public void SetMessageSourcePad (Pad pad) { sourcePad = pad; } void OnShowError(object sender, MouseButtonEventArgs e) { IdeApp.Workbench.GetPad().BringToFront(); } void OnShowPad(object sender, MouseButtonEventArgs e) { if (sourcePad != null) sourcePad.BringToFront(true); } double oldWork = 0; public void SetProgressFraction (double work) { if (work == oldWork) return; var anim = new DoubleAnimation { From = oldWork, To = work, Duration = TimeSpan.FromSeconds(0.2), FillBehavior = FillBehavior.HoldEnd, }; oldWork = work; ProgressBar.BeginAnimation(System.Windows.Controls.Primitives.RangeBase.ValueProperty, anim, HandoffBehavior.SnapshotAndReplace); } public void ShowError (string error) { Status = StatusBarStatus.Error; ShowMessage (error); } public void ShowMessage (string message) { ShowMessage (null, message, false); } public void ShowMessage (IconId image, string message) { ShowMessage (image, message, false); } public void ShowMessage (string message, bool isMarkup) { ShowMessage (null, message, true); } IconId currentIcon; AnimatedIcon animatedIcon; IDisposable xwtAnimation; public void ShowMessage (IconId iconId, string message, bool isMarkup) { Message = message; StatusText.ToolTip = message; if (iconId.IsNull) iconId = BrandingService.StatusSteadyIconId; // don't reload same icon if (currentIcon == iconId) return; currentIcon = iconId; if (xwtAnimation != null) { xwtAnimation.Dispose (); xwtAnimation = null; } if (ImageService.IsAnimation (currentIcon, Gtk.IconSize.Menu)) { animatedIcon = ImageService.GetAnimatedIcon (currentIcon, Gtk.IconSize.Menu); StatusImage = animatedIcon.FirstFrame.GetImageSource (); xwtAnimation = animatedIcon.StartAnimation (p => { StatusImage = p.GetImageSource (); }); } else StatusImage = currentIcon.GetImageSource (Xwt.IconSize.Small); } public void ShowReady () { Status = StatusBarStatus.Ready; ShowMessage (BrandingService.StatusSteadyIconId, BrandingService.ApplicationName); } public StatusBarIcon ShowStatusIcon (Xwt.Drawing.Image pixbuf) { var icon = new StatusIcon (this) { Image = pixbuf, Margin = new Thickness (5, 5, 5, 5), MaxWidth = 16, MaxHeight = 16, }; StatusIconsPanel.Children.Add (icon); return icon; } public void ShowWarning (string warning) { Status = StatusBarStatus.Warning; ShowMessage (warning); } string message; public string Message { get { return message; } set { message = value; RaisePropertyChanged (); } } public static readonly DependencyProperty StatusProperty = DependencyProperty.Register("Status", typeof(StatusBarStatus), typeof(StatusBarControl), new FrameworkPropertyMetadata(StatusBarStatus.Normal, FrameworkPropertyMetadataOptions.AffectsRender)); public StatusBarStatus Status { get { return (StatusBarStatus)GetValue(StatusProperty); } private set { SetValue(StatusProperty, value); RaisePropertyChanged (); } } public static readonly DependencyProperty StatusTextBrushProperty = DependencyProperty.Register("StatusTextBrush", typeof(Brush), typeof(StatusBarControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender)); public Brush StatusTextBrush { get { return GetValue (StatusTextBrushProperty) as Brush; } set { SetValue (StatusTextBrushProperty, value); } } ImageSource statusImage; public ImageSource StatusImage { get { return statusImage; } set { statusImage = value; RaisePropertyChanged (); } } int buildResultCount; public int BuildResultCount { get { return buildResultCount; } set { buildResultCount = value; RaisePropertyChanged (); } } ImageSource buildResultIcon; public ImageSource BuildResultIcon { get { return buildResultIcon; } set { buildResultIcon = value; RaisePropertyChanged (); } } Visibility buildResultPanelVisibility = Visibility.Collapsed; public Visibility BuildResultPanelVisibility { get { return buildResultPanelVisibility; } set { buildResultPanelVisibility = value; RaisePropertyChanged (); } } void RaisePropertyChanged ([CallerMemberName] string propName = null) { if (PropertyChanged != null) PropertyChanged (this, new System.ComponentModel.PropertyChangedEventArgs (propName)); } public event PropertyChangedEventHandler PropertyChanged; } class StatusIcon : System.Windows.Controls.Image, StatusBarIcon { StatusBar bar; public StatusIcon (StatusBar bar) { this.bar = bar; } public void SetAlertMode (int seconds) { // Create fade-out fade-in animation. } public void Dispose () { ((StackPanel)Parent).Children.Remove (this); } public new string ToolTip { get { return (string)base.ToolTip; } set { base.ToolTip = value; } } protected override void OnMouseUp (MouseButtonEventArgs e) { base.OnMouseUp (e); Xwt.PointerButton button; switch (e.ChangedButton) { case MouseButton.Left: button = Xwt.PointerButton.Left; break; case MouseButton.Middle: button = Xwt.PointerButton.Middle; break; case MouseButton.Right: button = Xwt.PointerButton.Right; break; case MouseButton.XButton1: button = Xwt.PointerButton.ExtendedButton1; break; case MouseButton.XButton2: button = Xwt.PointerButton.ExtendedButton2; break; default: throw new NotSupportedException (); } if (Clicked != null) Clicked (this, new StatusBarIconClickedEventArgs { Button = button, }); } Xwt.Drawing.Image image; public Xwt.Drawing.Image Image { get { return image; } set { image = value; Source = value.WithSize (Xwt.IconSize.Small).GetImageSource (); } } public event EventHandler Clicked; } }