#region License Information /* HeuristicLab * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using HeuristicLab.Common; using HeuristicLab.MainForm; using HeuristicLab.MainForm.WindowsForms; namespace HeuristicLab.Core.Views { public sealed partial class ViewHost : UserControl { private Type viewType; public Type ViewType { get { return this.viewType; } set { if (viewType != value) { if (value != null && !ViewCanShowContent(value, content)) throw new ArgumentException(string.Format("View \"{0}\" cannot display content \"{1}\".", value.GetPrettyName(), content.GetType().GetPrettyName())); viewType = value; UpdateView(); } } } private object content; public object Content { get { return content; } set { if (value != content) { content = value; viewContextMenuStrip.Item = content; Initialize(); } } } public new bool Enabled { get { return base.Enabled; } set { this.SuspendRepaint(); base.Enabled = value; this.ResumeRepaint(true); } } public ViewHost() { InitializeComponent(); viewType = null; content = null; Initialize(); } private void Initialize() { viewsLabel.Visible = false; viewContextMenuStrip.Enabled = false; messageLabel.Visible = false; viewPanel.Visible = false; if (viewPanel.Controls.Count > 0) viewPanel.Controls[0].Dispose(); viewPanel.Controls.Clear(); if (Content != null) { if (viewContextMenuStrip.Items.Count == 0) { messageLabel.Visible = true; } else { viewsLabel.Visible = true; viewContextMenuStrip.Enabled = true; } if (!ViewCanShowContent(viewType, Content)) { viewType = MainFormManager.GetDefaultViewType(Content.GetType()); if ((viewType == null) && (viewContextMenuStrip.Items.Count > 0)) // create first available view if default view is not available viewType = (Type)viewContextMenuStrip.Items[0].Tag; } UpdateView(); } } private void UpdateView() { if (viewPanel.Controls.Count > 0) viewPanel.Controls[0].Dispose(); viewPanel.Controls.Clear(); if (viewType == null || content == null) return; if (!ViewCanShowContent(viewType, content)) throw new InvalidOperationException(string.Format("View \"{0}\" cannot display content \"{1}\".", viewType.GetPrettyName(), Content.GetType().GetPrettyName())); UpdateActiveMenuItem(); Control view = (Control)MainFormManager.CreateView(viewType, Content); viewPanel.Tag = view; view.Dock = DockStyle.Fill; viewPanel.Controls.Add(view); viewPanel.Visible = true; } private void UpdateActiveMenuItem() { foreach (KeyValuePair item in viewContextMenuStrip.MenuItems) { if (item.Key == viewType) { item.Value.Checked = true; item.Value.Enabled = false; } else { item.Value.Checked = false; item.Value.Enabled = true; } } } private bool ViewCanShowContent(Type viewType, object content) { if (content == null) // every view can display null return true; if (viewType == null) return false; return ContentAttribute.CanViewType(viewType, Content.GetType()) && viewContextMenuStrip.MenuItems.Any(item => item.Key == viewType); } private void viewsLabel_DoubleClick(object sender, EventArgs e) { MainFormManager.CreateView(viewType, Content).Show(); } private void viewContextMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { Type viewType = (Type)e.ClickedItem.Tag; ViewType = viewType; } } }