private void OnSubExpressionButtonClick(object sender, EventArgs e) { Button button = (Button)sender; ButtonInfo buttonInfo = (ButtonInfo)button.Tag; if (!highlightedAreas.ContainsKey(buttonInfo.toHighlight)) { this.highlightedAreas.Add(buttonInfo.toHighlight, Brushes.Yellow); } Rectangle toInvalidate = Rectangle.Truncate(buttonInfo.toHighlight); toInvalidate.Height += 1; toInvalidate.Width += 1; this.Invalidate(toInvalidate); foreach (ToolStripItem item in sharedContextMenu.Items) { if (item is ToolStripTextBox) { ((ToolStripTextBox)item).Control.Parent.Controls.Remove(((ToolStripTextBox)item).Control); } } this.sharedContextMenu.Items.Clear(); this.sharedContextMenu.Items.AddRange(ButtonAndMenuData.GetMenuItems(buttonInfo.associatedExpression).ToArray()); this.sharedContextMenu.Show(this.PointToScreen(new Point(button.Right, button.Bottom)), ToolStripDropDownDirection.AboveRight); }
private void OnSetValueClick(object sender, EventArgs e) { ToolStripMenuItem item = (ToolStripMenuItem)sender; ToExchange exchange = (ToExchange)item.Tag; ToolStripTextBox textBox = exchange.valueBox; object primitiveObject = null; try { primitiveObject = Convert.ChangeType(textBox.Text, EvaluatorGenerator.GetType(exchange.original, true)); } catch (FormatException) { MessageBox.Show(string.Format("Could not convert '{0}' to object of type '{1}'. Please enter a value into the textbox in the context menu.", textBox.Text, EvaluatorGenerator.GetType(exchange.original, false))); return; } CodePrimitiveExpression replacement = new CodePrimitiveExpression(primitiveObject); replacement.UserData.Add(typeof(ButtonAndMenuData), exchange.original.UserData[typeof(ButtonAndMenuData)]); EvaluatorGenerator.SetType(replacement, EvaluatorGenerator.GetType(exchange.original, true)); EvaluatorGenerator.SetParameterIndex(replacement, EvaluatorGenerator.GetParameterIndex(exchange.original, true)); CodeBinaryOperatorExpression expression = ParentLink.GetParent(exchange.original); if (ParentLink.GetSide(exchange.original) == ParentSide.Left) { expression.Left = replacement; } else { expression.Right = replacement; } ToolStripMenuItem menuItem = new ToolStripMenuItem(textBox.Text); menuItem.Tag = new ToExchange(exchange.original, replacement); menuItem.Click += OnContextMenuItemClick; List <ToolStripItem> menuItems = ButtonAndMenuData.GetMenuItems(exchange.original); menuItems.Insert(1, menuItem); if (menuItems.Count > 3 + 1 + 5) { menuItems.RemoveAt(6); } textBox.Clear(); this.highlightedAreas.Clear(); this.Refresh(); this.CheckEvaluateButtonEnable(); }
private void DisableButtons(CodeExpression expression) { if (expression is CodeBinaryOperatorExpression) { this.DisableButtons(((CodeBinaryOperatorExpression)expression).Left); this.DisableButtons(((CodeBinaryOperatorExpression)expression).Right); } Button button = null; if (ButtonAndMenuData.TryGetValue(expression, out button)) { button.Visible = false; } }
private void DrawOrFlush(CodeExpression expression, ref StringBuilder stringBuffer, Graphics graphics, PointF startPoint, ref PointF point) { Button button = null; if (ButtonAndMenuData.TryGetValue(expression, out button)) { SizeF size = graphics.MeasureString(stringBuffer.ToString(), this.Font); graphics.DrawString(stringBuffer.ToString(), this.Font, Brushes.Black, point); stringBuffer = new StringBuilder(); point = new PointF(point.X + size.Width + 5, point.Y); button.Location = new Point((int)point.X - 5, (int)point.Y - 5); button.Tag = new ButtonInfo(expression, new RectangleF(startPoint, new SizeF(point.X - startPoint.X - 5, size.Height))); button.Visible = true; } else { this.Flush(ref stringBuffer, ref point, graphics); } }
private void CreateButtonAndMenu(CodeExpression root) { Button menuButton = new Button(); menuButton.Size = new Size(5, 5); menuButton.FlatStyle = FlatStyle.Popup; menuButton.Click += OnSubExpressionButtonClick; menuButton.Leave += OnSubExpressionButtonLeave; menuButton.Visible = false; this.Controls.Add(menuButton); List<ToolStripItem> menuItems = new List<ToolStripItem>(); ButtonAndMenuData data = new ButtonAndMenuData(menuButton, menuItems); root.UserData.Add(typeof(ButtonAndMenuData), data); ToolStripMenuItem menuItem = new ToolStripMenuItem(Serialize(root)); menuItem.Click += OnContextMenuItemClick; menuItem.Tag = new ToExchange(root, root); menuItems.Add(menuItem); Type rootType = EvaluatorGenerator.GetType(root, false); if (rootType != null) { if (typeof(bool) == rootType) { ToolStripMenuItem trueItem = new ToolStripMenuItem("True"); CodePrimitiveExpression trueExpression = new CodePrimitiveExpression(true); trueExpression.UserData.Add(typeof(ButtonAndMenuData), data); EvaluatorGenerator.SetType(trueExpression, typeof(bool)); EvaluatorGenerator.SetParameterIndex(trueExpression, EvaluatorGenerator.GetParameterIndex(root, true)); trueItem.Tag = new ToExchange(root, trueExpression); trueItem.Click += OnContextMenuItemClick; menuItems.Add(trueItem); ToolStripMenuItem falseItem = new ToolStripMenuItem("False"); CodePrimitiveExpression falseExpression = new CodePrimitiveExpression(false); falseExpression.UserData.Add(typeof(ButtonAndMenuData), data); EvaluatorGenerator.SetType(falseExpression, typeof(bool)); EvaluatorGenerator.SetParameterIndex(falseExpression, EvaluatorGenerator.GetParameterIndex(root, true)); falseItem.Tag = new ToExchange(root, falseExpression); falseItem.Click += OnContextMenuItemClick; menuItems.Add(falseItem); } else if (typeof(IConvertible).IsAssignableFrom(rootType)) { ToolStripSeparator separator = new ToolStripSeparator(); menuItems.Add(separator); ToolStripTextBox textBox = new ToolStripTextBox(); textBox.AcceptsReturn = false; menuItems.Add(textBox); ToolStripMenuItem setValue = new ToolStripMenuItem(string.Format("Enter {0}", EvaluatorGenerator.GetType(root, true).FullName)); setValue.Tag = new ToExchange(root, textBox); setValue.Click += OnSetValueClick; menuItems.Add(setValue); } } }
private void CreateButtonAndMenu(CodeExpression root) { Button menuButton = new Button(); menuButton.Size = new Size(5, 5); menuButton.FlatStyle = FlatStyle.Popup; menuButton.Click += OnSubExpressionButtonClick; menuButton.Leave += OnSubExpressionButtonLeave; menuButton.Visible = false; this.Controls.Add(menuButton); List <ToolStripItem> menuItems = new List <ToolStripItem>(); ButtonAndMenuData data = new ButtonAndMenuData(menuButton, menuItems); root.UserData.Add(typeof(ButtonAndMenuData), data); ToolStripMenuItem menuItem = new ToolStripMenuItem(Serialize(root)); menuItem.Click += OnContextMenuItemClick; menuItem.Tag = new ToExchange(root, root); menuItems.Add(menuItem); Type rootType = EvaluatorGenerator.GetType(root, false); if (rootType != null) { if (typeof(bool) == rootType) { ToolStripMenuItem trueItem = new ToolStripMenuItem("True"); CodePrimitiveExpression trueExpression = new CodePrimitiveExpression(true); trueExpression.UserData.Add(typeof(ButtonAndMenuData), data); EvaluatorGenerator.SetType(trueExpression, typeof(bool)); EvaluatorGenerator.SetParameterIndex(trueExpression, EvaluatorGenerator.GetParameterIndex(root, true)); trueItem.Tag = new ToExchange(root, trueExpression); trueItem.Click += OnContextMenuItemClick; menuItems.Add(trueItem); ToolStripMenuItem falseItem = new ToolStripMenuItem("False"); CodePrimitiveExpression falseExpression = new CodePrimitiveExpression(false); falseExpression.UserData.Add(typeof(ButtonAndMenuData), data); EvaluatorGenerator.SetType(falseExpression, typeof(bool)); EvaluatorGenerator.SetParameterIndex(falseExpression, EvaluatorGenerator.GetParameterIndex(root, true)); falseItem.Tag = new ToExchange(root, falseExpression); falseItem.Click += OnContextMenuItemClick; menuItems.Add(falseItem); } else if (typeof(IConvertible).IsAssignableFrom(rootType)) { ToolStripSeparator separator = new ToolStripSeparator(); menuItems.Add(separator); ToolStripTextBox textBox = new ToolStripTextBox(); textBox.AcceptsReturn = false; menuItems.Add(textBox); ToolStripMenuItem setValue = new ToolStripMenuItem(string.Format("Enter {0}", EvaluatorGenerator.GetType(root, true).FullName)); setValue.Tag = new ToExchange(root, textBox); setValue.Click += OnSetValueClick; menuItems.Add(setValue); } } }