Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/16/15 16:30:05 (9 years ago)
Author:
pfleck
Message:

#2379 Added level/depth based selection for the datasource.
Updated sample.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/BubbleChartView.cs

    r12389 r12459  
    2222using System;
    2323using System.Collections.Generic;
     24using System.Drawing;
    2425using System.Linq;
    2526using System.Windows.Forms;
     
    3031using HeuristicLab.Data;
    3132using HeuristicLab.MainForm;
     33using HeuristicLab.MainForm.WindowsForms;
    3234
    3335namespace HeuristicLab.Optimization.BubbleChart {
     
    5961
    6062      UpdateTreeView();
     63      UpdateLevelControl();
     64
    6165      UpdateComboBoxes();
    6266      UpdateDataPoints();
    6367      //UpdateCaption();
    6468    }
     69    protected override void SetEnabledStateOfControls() {
     70      base.SetEnabledStateOfControls();
     71      levelNumericUpDown.Enabled = Content != null;
     72      // ToDo
     73    }
    6574
    6675    #region Tree Queries
     76
     77    private IEnumerable<RecursiveDataItem> GetAvailableItems() {
     78      return IterateCheckedNodes()
     79        .Select(n => (RecursiveDataItem)n.Tag);
     80    }
    6781    private IEnumerable<string> GetAvailableKeys() {
    68       var collector = new List<string>();
    69       foreach (TreeNode node in treeView.Nodes)
    70         GetAvailableKeys(node, collector);
    71       return collector.Distinct();
    72     }
    73     private void GetAvailableKeys(TreeNode node, List<string> collector) {
    74       var item = (RecursiveDataItem)node.Tag;
    75       if (node.Checked)
    76         collector.AddRange(item.Data.Keys);
    77       foreach (TreeNode child in node.Nodes)
    78         GetAvailableKeys(child, collector);
    79     }
    80 
    81     private IEnumerable<RecursiveDataItem> GetAvailableItems() {
    82       var collector = new List<RecursiveDataItem>();
    83       foreach (TreeNode child in treeView.Nodes)
    84         GetAvailableItems(child, collector);
    85       return collector;
    86     }
    87 
    88     private void GetAvailableItems(TreeNode node, List<RecursiveDataItem> collector) {
    89       var item = (RecursiveDataItem)node.Tag;
    90       if (node.Checked)
    91         collector.Add(item);
    92       foreach (TreeNode child in node.Nodes)
    93         GetAvailableItems(child, collector);
     82      return GetAvailableItems()
     83        .SelectMany(n => n.Data.Keys)
     84        .Distinct();
    9485    }
    9586    #endregion
    9687
    9788    #region Update Controls
     89    private void UpdateLevelControl() {
     90      if (Content == null) return;
     91      if (treeView.Nodes.Count > 0)
     92        levelNumericUpDown.Maximum = IterateAllNodes().Max(t => t.Level);
     93      else
     94        levelNumericUpDown.Maximum = 0;
     95    }
     96
    9897    private void UpdateTreeView() {
    9998      treeView.Nodes.Clear();
    100 
    101       if (Content != null) {
     99      if (Content != null)
    102100        treeView.Nodes.Add(CreateTreeNode(Content));
    103       }
    104 
    105101      treeView.ExpandAll();
    106102      splitContainer.Panel1Collapsed = treeView.Nodes.Count == 0;
     103      if (treeView.Nodes.Count > 0)
     104        treeView.SelectedNode = treeView.Nodes[0];
    107105    }
    108106    private TreeNode CreateTreeNode(RecursiveDataItem item) {
     
    114112        node.Nodes.Add(CreateTreeNode(child));
    115113      return node;
     114    }
     115
     116    private void UpdateTreeViewCheckBoxes() {
     117      int level = (int)levelNumericUpDown.Value;
     118      bool includeChildren = includeChildrenCheckBox.Checked;
     119      //treeView.BeginUpdate();
     120      foreach (var node in IterateAllNodes())
     121        node.Checked = includeChildren ? node.Level >= level : node.Level == level;
     122      //treeView.EndUpdate();
    116123    }
    117124
     
    240247      switch (sizeDimension) {
    241248        case SizeDimension.Constant:
    242           value = 2;
     249          value = 5;
    243250          break;
    244251        default:
     
    258265      }
    259266    }
     267
     268    private void UpdateAxisLabels() {
     269      return;
     270      Axis xAxis = chart.ChartAreas[0].AxisX;
     271      Axis yAxis = chart.ChartAreas[0].AxisY;
     272      //mkommend: combobox.SelectedIndex could not be used as this changes during hovering over possible values
     273      var xSAxisSelected = xAxisValue == null ? null : (string)xAxisComboBox.SelectedItem;
     274      var ySAxisSelected = yAxisValue == null ? null : (string)yAxisComboBox.SelectedItem;
     275      SetCustomAxisLabels(xAxis, xSAxisSelected);
     276      SetCustomAxisLabels(yAxis, ySAxisSelected);
     277      if (xAxisValue != null)
     278        xAxis.Title = xAxisValue;
     279      if (yAxisValue != null)
     280        yAxis.Title = yAxisValue;
     281    }
     282    private void chart_AxisViewChanged(object sender, System.Windows.Forms.DataVisualization.Charting.ViewEventArgs e) {
     283      this.UpdateAxisLabels();
     284    }
     285    private void SetCustomAxisLabels(Axis axis, string key) {
     286      axis.CustomLabels.Clear();
     287      if (categoricalMapping.ContainsKey(key)) {
     288        foreach (var pair in categoricalMapping[key]) {
     289          string labelText = pair.Key.ToString();
     290          CustomLabel label = new CustomLabel();
     291          label.ToolTip = labelText;
     292          if (labelText.Length > 25)
     293            labelText = labelText.Substring(0, 25) + " ... ";
     294          label.Text = labelText;
     295          label.GridTicks = GridTickTypes.TickMark;
     296          label.FromPosition = pair.Value - 0.5;
     297          label.ToPosition = pair.Value + 0.5;
     298          axis.CustomLabels.Add(label);
     299        }
     300      } else if (key != null && Content.Data[key] is TimeSpanValue) {
     301        chart.ChartAreas[0].RecalculateAxesScale();
     302        for (double i = axis.Minimum; i <= axis.Maximum; i += axis.LabelStyle.Interval) {
     303          TimeSpan time = TimeSpan.FromSeconds(i);
     304          string x = string.Format("{0:00}:{1:00}:{2:00}", time.Hours, time.Minutes, time.Seconds);
     305          axis.CustomLabels.Add(i - axis.LabelStyle.Interval / 2, i + axis.LabelStyle.Interval / 2, x);
     306        }
     307      }
     308    }
     309
     310    private void UpdateNodeColors() {
     311      var selectedDepth = treeView.SelectedNode != null ? treeView.SelectedNode.Level : (int?)null;
     312      var selectedIndex = treeView.SelectedNode != null ? treeView.SelectedNode.Index : (int?)null;
     313      foreach (TreeNode node in treeView.Nodes) {
     314        UpdateNodeColor(node, selectedDepth, selectedIndex);
     315      }
     316    }
     317    private void UpdateNodeColor(TreeNode node, int? depth, int? index) {
     318      if (depth.HasValue && index.HasValue && node.Level == depth /*&& node.Index == index*/)
     319        node.BackColor = Color.Yellow;
     320      else
     321        node.BackColor = Color.White;
     322      foreach (TreeNode child in node.Nodes)
     323        UpdateNodeColor(child, depth, index);
     324    }
    260325    #endregion
    261326
     
    263328    private void treeView_AfterCheck(object sender, TreeViewEventArgs e) {
    264329      UpdateComboBoxes();
    265       UpdateDataPoints();
     330      //UpdateDataPoints();
     331    }
     332    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
     333      //UpdateNodeColors();
     334      //UpdateComboBoxes();
     335      //UpdateDataPoints();
    266336    }
    267337
     
    274344
    275345      UpdateDataPoints();
    276       //UpdateAxisLabels();
     346      UpdateAxisLabels();
     347    }
     348
     349    private void includeChildrenCheckBox_CheckedChanged(object sender, EventArgs e) {
     350      UpdateTreeViewCheckBoxes();
     351      UpdateComboBoxes();
     352    }
     353
     354    private void levelNumericUpDown_ValueChanged(object sender, EventArgs e) {
     355      UpdateTreeViewCheckBoxes();
     356      UpdateComboBoxes();
     357    }
     358    #endregion
     359
     360    #region Helpers
     361
     362    private IEnumerable<TreeNode> IterateAllNodes() {
     363      return Collect(treeView.Nodes);
     364    }
     365    private IEnumerable<TreeNode> IterateCheckedNodes() {
     366      return IterateAllNodes().Where(t => t.Checked);
     367    }
     368    private IEnumerable<TreeNode> Collect(TreeNodeCollection nodes) {
     369      foreach (TreeNode node in nodes) {
     370        yield return node;
     371        foreach (var child in Collect(node.Nodes))
     372          yield return child;
     373      }
    277374    }
    278375    #endregion
Note: See TracChangeset for help on using the changeset viewer.