private static void child_click(object sender, RoutedEventArgs e) { TreeMap3D treeMap3D = (TreeMap3D)sender; TreeMap3DElement element = e.Source as TreeMap3DElement; treeMap3D.childClick(element); }
private void refresh(IList newValues) { VerifyAccess(); if (newValues == null) { newValues = new object[0]; } // update/add weights double totalWeight = 0; TreeMap3DElement element; for (int i = 0; i < newValues.Count; i++) { if (i >= m_elements.Count) { element = new TreeMap3DElement(i, newValues.Count); element.Data = newValues[i]; element.WeightBindingPath = m_weightBindingPath; AddVisual3DChild(element); m_elements.Add(element); } else { m_elements[i].Data = newValues[i]; element = m_elements[i]; } totalWeight += element.Weight; } // remove any no-longer needed 3D objects for (int i = newValues.Count - 1; i >= m_elements.Count; i--) { element = m_elements[i]; RemoveVisual3DChild(element); m_elements.RemoveAt(i); } updateMap(totalWeight); }
private void childClick(TreeMap3DElement element) { if (m_lastClickedElement != null && m_lastClickedElement != element) { m_lastClickedElement.IsSelected = false; } m_lastClickedElement = element; if (element != null) { if (m_elements.Contains(element)) { if (element != m_selectedElement) { if (m_selectedElement == null) { foreach (TreeMap3DElement childElement in m_elements) { childElement.IsSelected = false; } } element.IsSelected = true; onSelectionChanged( (m_selectedElement == null) ? null : m_selectedElement.Data, element.Data); m_selectedElement = element; } else { foreach (TreeMap3DElement childElement in m_elements) { childElement.IsSelected = true; } onSelectionChanged(m_selectedElement.Data, null); m_selectedElement = null; } } } }
private void updateMap(double totalWeight) { ComputeWeightMap(); double maxArea = -1; Rect strip = new Rect(new Size(1, 1)); int arranged = 0; while (arranged < m_elements.Count) { double bestStripWeight = 0; double bestRatio = double.PositiveInfinity; int i; if (strip.Width > strip.Height) { double bestWidth = strip.Width; // Arrange Vertically for (i = arranged; i < m_elements.Count; i++) { double stripWeight = bestStripWeight + GetWeight(i); double ratio = double.PositiveInfinity; double width = strip.Width * stripWeight / totalWeight; for (int j = arranged; j <= i; j++) { double height = strip.Height * GetWeight(j) / stripWeight; ratio = Math.Min(ratio, height > width ? height / width : width / height); if (ratio > bestRatio) { goto ArrangeVertical; } } bestRatio = ratio; bestWidth = width; bestStripWeight = stripWeight; } ArrangeVertical: double y = strip.Y; for (; arranged < i; arranged++) { TreeMap3DElement child = getChild(arranged); double height = strip.Height * GetWeight(arranged) / bestStripWeight; child.SetScale(bestWidth, height, bestWidth * height); child.SetLocation(strip.X, y, 0); if (maxArea < bestWidth * height) { maxArea = bestWidth * height; } y += height; } strip.X = strip.X + bestWidth; strip.Width = Math.Max(0.0, strip.Width - bestWidth); } else { double bestHeight = strip.Height; // Arrange Horizontally for (i = arranged; i < m_elements.Count; i++) { double stripWeight = bestStripWeight + GetWeight(i); double ratio = double.PositiveInfinity; double height = strip.Height * stripWeight / totalWeight; for (int j = arranged; j <= i; j++) { double width = strip.Width * GetWeight(j) / stripWeight; ratio = Math.Min(ratio, height > width ? height / width : width / height); if (ratio > bestRatio) { goto ArrangeHorizontal; } } bestRatio = ratio; bestHeight = height; bestStripWeight = stripWeight; } ArrangeHorizontal: double x = strip.X; for (; arranged < i; arranged++) { TreeMap3DElement child = getChild(arranged); double width = strip.Width * GetWeight(arranged) / bestStripWeight; child.SetScale(width, bestHeight, width * bestHeight); child.SetLocation(x, strip.Y, 0); if (maxArea < width * bestHeight) { maxArea = width * bestHeight; } x += width; } strip.Y = strip.Y + bestHeight; strip.Height = Math.Max(0.0, strip.Height - bestHeight); } totalWeight -= bestStripWeight; } foreach (TreeMap3DElement elem in m_elements) { elem.ScaleZ(2 * maxArea); } m_weightMap = null; }