private void RedrawGeometries()
        {
            if (m_debugger.CurrentMode == dbgDebugMode.dbgBreakMode)
            {
                Geometry.Box aabb = Geometry.Box.Inverted();
                int drawnCount = 0;
                for (int index = 0; index < listView.Items.Count; ++index)
                {
                    GeometryItem geometry = (GeometryItem)listView.Items[index];

                    System.Windows.Media.Color color = geometry.Color;
                    ExpressionDrawer.IDrawable drawable = null;
                    string type = null;

                    if (geometry.Name != null && geometry.Name != "")
                    {
                        var expression = m_debugger.GetExpression(geometry.Name);
                        if (expression.IsValidValue)
                        {
                            drawable = ExpressionDrawer.MakeGeometry(m_debugger, geometry.Name);
                            type = expression.Type;

                            if (drawable != null)
                            {
                                if (geometry.Color == Util.ConvertColor(m_colorsPool.Transparent))
                                    color = Util.ConvertColor(m_colorsPool.Pull());

                                aabb.Expand(drawable.Aabb);
                                ++drawnCount;
                            }
                        }
                    }

                    // set new row
                    GeometryItem new_geometry = new GeometryItem(geometry.Name, drawable, type, color);
                    ((System.ComponentModel.INotifyPropertyChanged)new_geometry).PropertyChanged += GeometryItem_NameChanged;
                    listView.Items.RemoveAt(index);
                    listView.Items.Insert(index, new_geometry);
                }

                if (drawnCount > 0)
                {
                    Bitmap bmp = new Bitmap((int)System.Math.Round(image.ActualWidth),
                                            (int)System.Math.Round(image.ActualHeight));

                    Graphics graphics = Graphics.FromImage(bmp);
                    graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                    graphics.Clear(Color.White);

                    ExpressionDrawer.Settings settings = new ExpressionDrawer.Settings(Color.Black, true, true);
                    foreach (GeometryItem g in listView.Items)
                    {
                        if (g.Drawable != null)
                        {
                            settings.color = Util.ConvertColor(g.Color);
                            g.Drawable.Draw(aabb, graphics, settings);
                        }
                    }

                    ExpressionDrawer.DrawAabb(graphics, aabb);

                    image.Source = Util.BitmapToBitmapImage(bmp);
                }
                else
                {
                    image.Source = Util.BitmapToBitmapImage(m_emptyBitmap);
                }
            }
        }
        private void GeometryItem_NameChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            //e.PropertyName == "Name"

            GeometryItem geometry = (GeometryItem)sender;
            int index = listView.Items.IndexOf(geometry);

            if (geometry.Name == null || geometry.Name == "")
            {
                m_colorsPool.Push(Util.ConvertColor(geometry.Color));
                listView.Items.RemoveAt(index);
                if (index >= 0)
                    RedrawGeometries();
                return;
            }

            // insert new empty row
            if (index + 1 == listView.Items.Count)
            {
                GeometryItem empty_variable = new GeometryItem(m_colorsPool.Transparent);
                ((System.ComponentModel.INotifyPropertyChanged)empty_variable).PropertyChanged += GeometryItem_NameChanged;
                listView.Items.Add(empty_variable);
            }

            System.Windows.Media.Color color = geometry.Color;
            ExpressionDrawer.IDrawable drawable = null;
            string type = null;

            // debugging
            if (m_debugger.CurrentMode == dbgDebugMode.dbgBreakMode)
            {
                var expression = m_debugger.GetExpression(geometry.Name);
                if (expression.IsValidValue)
                {
                    drawable = ExpressionDrawer.MakeGeometry(m_debugger, geometry.Name);
                    type = expression.Type;

                    if (drawable != null)
                    {
                        if (color == Util.ConvertColor(m_colorsPool.Transparent))
                            color = Util.ConvertColor(m_colorsPool.Pull());
                    }
                }
            }

            // set new row
            GeometryItem new_variable = new GeometryItem(geometry.Name, drawable, type, color);
            ((System.ComponentModel.INotifyPropertyChanged)new_variable).PropertyChanged += GeometryItem_NameChanged;
            listView.Items.RemoveAt(index);
            listView.Items.Insert(index, new_variable);

            if (drawable != null)
            {
                Geometry.Box aabb = Geometry.Box.Inverted();
                int drawnCount = 0;
                foreach (GeometryItem g in listView.Items)
                {
                    if (g.Drawable != null)
                    {
                        aabb.Expand(g.Drawable.Aabb);
                        ++drawnCount;
                    }
                }

                if (drawnCount > 0)
                {
                    Bitmap bmp = new Bitmap((int)image.ActualWidth, (int)image.ActualHeight);

                    Graphics graphics = Graphics.FromImage(bmp);
                    graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                    graphics.Clear(Color.White);

                    ExpressionDrawer.Settings settings = new ExpressionDrawer.Settings(Color.Black, true, true);
                    foreach (GeometryItem g in listView.Items)
                    {
                        if (g.Drawable != null)
                        {
                            settings.color = Util.ConvertColor(g.Color);
                            g.Drawable.Draw(aabb, graphics, settings);
                        }
                    }

                    ExpressionDrawer.DrawAabb(graphics, aabb);

                    image.Source = Util.BitmapToBitmapImage(bmp);
                }
                else
                {
                    image.Source = Util.BitmapToBitmapImage(m_emptyBitmap);
                }
            }
        }
        private void UpdateItems(int modified_index = -1)
        {
            bool imageEmpty = true;
            if (m_debugger.CurrentMode == dbgDebugMode.dbgBreakMode)
            {
                string[] names = new string[Geometries.Count];
                ExpressionDrawer.Settings[] settings = new ExpressionDrawer.Settings[Geometries.Count];
                bool tryDrawing = false;

                // update the list, gather names and settings
                for (int index = 0; index < Geometries.Count; ++index)
                {
                    GeometryItem geometry = Geometries[index];

                    System.Windows.Media.Color color = geometry.Color;
                    int colorId = geometry.ColorId;
                    string type = null;

                    bool updateRequred = modified_index < 0 || modified_index == index;

                    if (geometry.Name != null && geometry.Name != "")
                    {
                        var expression = updateRequred ? m_debugger.GetExpression(geometry.Name) : null;
                        if (expression == null || expression.IsValidValue)
                        {
                            if (expression != null)
                                type = expression.Type;

                            names[index] = geometry.Name;

                            if (updateRequred && geometry.ColorId < 0)
                            {
                                colorId = m_intsPool.Pull();
                                color = Util.ConvertColor(m_colors[colorId]);
                            }

                            settings[index] = new ExpressionDrawer.Settings(Util.ConvertColor(color), true, true);

                            tryDrawing = true;
                        }
                    }

                    // set new row
                    if (updateRequred)
                        ResetAt(new GeometryItem(geometry.Name, type, colorId, m_colors), index);
                }

                // draw variables
                if (tryDrawing)
                {
                    int width = (int)System.Math.Round(image.ActualWidth);
                    int height = (int)System.Math.Round(image.ActualHeight);
                    if (width > 0 && height > 0)
                    {
                        Bitmap bmp = new Bitmap(width, height);

                        Graphics graphics = Graphics.FromImage(bmp);
                        graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                        graphics.Clear(m_colors.ClearColor);

                        ExpressionDrawer.DrawGeometries(graphics, m_debugger, names, settings, m_colors);

                        image.Source = Util.BitmapToBitmapImage(bmp);
                        imageEmpty = false;
                    }
                }
            }

            if (imageEmpty)
            {
                image.Source = Util.BitmapToBitmapImage(m_emptyBitmap);
            }

            image.ContextMenu = new ContextMenu();
            MenuItem mi = new MenuItem();
            mi.Header = "Copy";
            mi.Click += MenuItem_Copy;
            if (imageEmpty)
                mi.IsEnabled = false;
            image.ContextMenu.Items.Add(mi);
        }