public static bool IsInside(IHmiControl controlInner, IHmiControl controlOuter) { if (controlInner == controlOuter || Panel.GetZIndex(controlInner.fe) < Panel.GetZIndex(controlOuter.fe)) { return(false); } Size size = controlInner.fe.RenderSize; Point leftTopInner = GetLeftTop(controlInner); Point leftTopOuter = GetLeftTop(controlOuter); if (leftTopInner.X < leftTopOuter.X || leftTopInner.Y < leftTopOuter.Y) { return(false); } if ((leftTopInner.X + size.Width) > (leftTopOuter.X + controlOuter.fe.ActualWidth)) { return(false); } if ((leftTopInner.Y + size.Height) > (leftTopOuter.Y + controlOuter.fe.ActualHeight)) { return(false); } return(true); }
private double width1, width2, height1, height2; // initial alignment-dependent control location public Location0(IHmiControl control = null) { if (control != null) { Initialize(control); } }
private void StartDragging(MouseEventArgs e) { e.Handled = true; // prevent button clicks, etc // Travel down the visual tree. Select the top IHmiControl but drag the control whose parent is the canvas-style Grid. draggingControl = null; IHmiControl selectedCtrl = null; FrameworkElement fe = null; if (e.OriginalSource is FrameworkElement fe2) { fe = fe2; } while (fe != null && fe != this) { FrameworkElement parent = VisualTreeHelper.GetParent(fe) as FrameworkElement; if (fe is IHmiControl control) { if (selectedCtrl == null) { selectedCtrl = control; } if (parent == gridCanvas) { draggingControl = control; break; } } fe = parent; } SelectedControl = selectedCtrl; if (draggingControl != null) { if (e.RightButton == MouseButtonState.Pressed && (draggingControl.Flags & ECtrlFlags.Resize) == 0) { draggingControl = null; SystemSounds.Beep.Play(); return; } leftButtonPressed = (e.LeftButton == MouseButtonState.Pressed); location0.Initialize(draggingControl, e.GetPosition(this)); CaptureMouse(); if (leftButtonPressed && (draggingControl.Flags & ECtrlFlags.IsGroup) > 0 && (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift))) { moveList.Clear(); foreach (object child in gridCanvas.Children) { if ((child is IHmiControl control) && IsInside(control, draggingControl)) { moveList.Add(new Location0(control)); } } } } }
private void PasteFromXaml(string xaml) { // Create objects from xaml and add them to gridCanvas for Paste(). if (!xaml.StartsWith("<")) { SystemSounds.Beep.Play(); return; } xaml = InsertNamespaces(xaml); FrameworkElement fe; try { fe = XamlReader.Parse(xaml) as FrameworkElement; } catch { SystemSounds.Beep.Play(); return; } if (fe is IHmiControl control) // single control { SelectedControl = null; control.fe.SizeChanged += OnPasteSizeChanged; AddToCanvas(control, pixelOffset, pixelOffset); } else if (fe is Grid grid) // collection of controls in a grid { int count = grid.Children.Count, added = 0; for (int i = 0; i < count; i++) { if (grid.Children[0] is IHmiControl control2) { grid.Children.RemoveAt(0); // remove before add! ++added; if (added == 1) { SelectedControl = null; control2.fe.SizeChanged += OnPasteSizeChanged; } AddToCanvas(control2, pixelOffset, pixelOffset); } else { grid.Children.RemoveAt(0); } } if (added == 0) { SystemSounds.Beep.Play(); } } else { SystemSounds.Beep.Play(); } }
public void AppendLocationXaml(IHmiControl control, StringBuilder sb) { if (control.fe.HorizontalAlignment != HorizontalAlignment.Stretch) { sb.AppendFormat(" HorizontalAlignment=\"{0}\"", control.fe.HorizontalAlignment); } if (control.fe.VerticalAlignment != VerticalAlignment.Stretch) { sb.AppendFormat(" VerticalAlignment=\"{0}\"", control.fe.VerticalAlignment); } string margin = control.fe.Margin.ToString2(); if (margin != "0") { sb.AppendFormat(" Margin=\"{0}\"", margin); } if ((control.Flags & ECtrlFlags.ResizeWidth) > 0 && control.fe.HorizontalAlignment != HorizontalAlignment.Stretch) { sb.AppendFormat(" Width=\"{0}\"", (int)control.fe.Width); } if ((control.Flags & ECtrlFlags.ResizeHeight) > 0 && control.fe.VerticalAlignment != VerticalAlignment.Stretch) { sb.AppendFormat(" Height=\"{0}\"", (int)control.fe.Height); } }
private int zindexBottom = BASE_ZINDEX; // Bottom is decremented when a control is moved to back. private void AddToCanvas(IHmiControl control, double leftShift = 0, double topShift = 0) { control.OwnerPage = this; SetName(control, control.Name); Panel.SetZIndex(control.fe, zindexTop++); Location0.Shift(control.fe, leftShift, topShift); gridCanvas.Children.Add(control.fe); }
private void OnAddNewSizeChanged(object sender, SizeChangedEventArgs e) { IHmiControl control = (IHmiControl)sender; if (control.fe.ActualWidth > 0 && control.fe.ActualHeight > 0) { control.fe.SizeChanged -= OnAddNewSizeChanged; // one-shot SelectedControl = control; } }
private void OnPasteSizeChanged(object sender, SizeChangedEventArgs e) { IHmiControl control = (IHmiControl)sender; if (control.fe.ActualWidth > 0 && control.fe.ActualHeight > 0) { control.fe.SizeChanged -= OnPasteSizeChanged; // one-shot SelectedControl = control; CopySelectedControl(); // copy the pixel offset } }
private void StopDragging() { if (draggingControl != null) { marker.Dragging = Marker.EDragging.None; draggingControl = null; location0.Clear(); moveList.Clear(); ReleaseMouseCapture(); } }
public static bool InMoveList(IHmiControl control) { foreach (var item in control.OwnerPage.moveList) { if (item.control == control) { return(true); } } return(false); }
public void AddNew <T>() where T : IHmiControl, new() { IHmiControl control = new T(); SelectedControl = null; control.fe.HorizontalAlignment = HorizontalAlignment.Left; control.fe.VerticalAlignment = VerticalAlignment.Top; control.fe.Width = control.InitialSize.Width; control.fe.Height = control.InitialSize.Height; AddToCanvas(control, pixelOffset, pixelOffset); control.fe.SizeChanged += OnAddNewSizeChanged; }
public static double GetBottom(IHmiControl control) { if (control.fe.VerticalAlignment == VerticalAlignment.Top) { return(control.OwnerPage.gridCanvas.ActualHeight - control.fe.ActualHeight - control.fe.Margin.Top); } else if (control.fe.VerticalAlignment == VerticalAlignment.Center) { return((control.OwnerPage.gridCanvas.ActualHeight - control.fe.ActualHeight - control.fe.Margin.Top) / 2); } return(control.fe.Margin.Bottom); }
public static double GetRight(IHmiControl control) { if (control.fe.HorizontalAlignment == HorizontalAlignment.Left) { return(control.OwnerPage.gridCanvas.ActualWidth - control.fe.ActualWidth - control.fe.Margin.Left); } else if (control.fe.HorizontalAlignment == HorizontalAlignment.Center) { return((control.OwnerPage.gridCanvas.ActualWidth - control.fe.ActualWidth - control.fe.Margin.Left) / 2); } return(control.fe.Margin.Right); }
private void ArrowKeyNudge(Key key, bool ctrl) { IHmiControl control = SelectedControl; double delta = ctrl ? 10 * GridSize : GridSize; // Ctrl+arrows for 10x nudge double left, left0 = GetLeft(control); double top, top0 = GetTop(control); switch (key) { case Key.Left: left = Math.Max(left0 - delta, 0); top = top0; break; case Key.Right: left = left0 + delta; top = top0; break; case Key.Up: left = left0; top = Math.Max(top0 - delta, 0); break; case Key.Down: left = left0; top = top0 + delta; break; default: return; } double dx = left - left0, dy = top - top0; if (dx == 0 && dy == 0) // at the edge { SystemSounds.Beep.Play(); return; } if ((control.Flags & ECtrlFlags.IsGroup) > 0 && !Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift)) { foreach (object child in gridCanvas.Children) { if ((child is IHmiControl control2) && IsInside(control2, control)) { Location0.Shift(control2.fe, dx, dy); } } } Location0.Shift(control.fe, dx, dy); if (SelectedControl == control) { marker.Margin = control.fe.Margin; designer.UpdateLocation(); } }
public void Initialize(IHmiControl control) { this.control = control; switch (control.fe.HorizontalAlignment) { case HorizontalAlignment.Left: case HorizontalAlignment.Center: width1 = control.fe.Margin.Left; width2 = control.fe.Width; break; case HorizontalAlignment.Right: width1 = control.fe.Width; width2 = control.fe.Margin.Right; break; case HorizontalAlignment.Stretch: width1 = control.fe.Margin.Left; width2 = control.fe.Margin.Right; break; } switch (control.fe.VerticalAlignment) { case VerticalAlignment.Top: case VerticalAlignment.Center: height1 = control.fe.Margin.Top; height2 = control.fe.Height; break; case VerticalAlignment.Bottom: height1 = control.fe.Height; height2 = control.fe.Margin.Bottom; break; case VerticalAlignment.Stretch: height1 = control.fe.Margin.Top; height2 = control.fe.Margin.Bottom; break; } }
public string ControlToXaml(IHmiControl control) { if ((control.Flags & ECtrlFlags.IsGroup) > 0) { bool nested = false; var sb = new StringBuilder(); sb.AppendLine("<Grid>"); sb.AppendLine(control.ToXaml(1)); foreach (object child in gridCanvas.Children) { if ((child is IHmiControl control2) && IsInside(control2, control)) { sb.AppendLine(control2.ToXaml(1)); nested = true; } } sb.Append("</Grid>"); return(nested ? sb.ToString() : control.ToXaml(0)); } else { return(control.ToXaml(0)); } }
public void DeleteSelectedControl() { if (SelectedControl == null) { SystemSounds.Beep.Play(); return; } IHmiControl control = SelectedControl; SelectedControl = null; if ((control.Flags & ECtrlFlags.IsGroup) > 0) { var sortedChildren = new SortedList <int, IHmiControl>(gridCanvas.Children.Count + 1); sortedChildren[-Panel.GetZIndex(control.fe)] = control; foreach (object child in gridCanvas.Children) { if (child is IHmiControl control2 && IsInside(control2, control)) { sortedChildren[-Panel.GetZIndex(control2.fe)] = control2; } } foreach (IHmiControl control2 in sortedChildren.Values) { childrenByName.Remove(control2.Name); gridCanvas.Children.Remove(control2.fe); } } else { childrenByName.Remove(control.Name); gridCanvas.Children.Remove(control.fe); } }
public void SetAlignment(IHmiControl control, HorizontalAlignment alignH, VerticalAlignment alignV) { Thickness margin = control.fe.Margin; Size size = control.fe.RenderSize; Size sizeGrid = gridCanvas.RenderSize; if (alignH == HorizontalAlignment.Left && control.fe.HorizontalAlignment != HorizontalAlignment.Left) { if (control.fe.HorizontalAlignment == HorizontalAlignment.Center) { double x2 = (sizeGrid.Width - size.Width - margin.Left) / 2; double left = margin.Left + x2 + 0.5; control.fe.Margin = new Thickness((int)left, margin.Top, 0, margin.Bottom); } else if (control.fe.HorizontalAlignment == HorizontalAlignment.Right) { double left = sizeGrid.Width - size.Width - margin.Right + 0.5; control.fe.Margin = new Thickness((int)left, margin.Top, 0, margin.Bottom); } else if (control.fe.HorizontalAlignment == HorizontalAlignment.Stretch) { control.fe.Margin = new Thickness(margin.Left, margin.Top, 0, margin.Bottom); control.fe.Width = (int)(sizeGrid.Width - margin.Left - margin.Right + 0.5); } control.fe.HorizontalAlignment = HorizontalAlignment.Left; } else if (alignH == HorizontalAlignment.Center && control.fe.HorizontalAlignment != HorizontalAlignment.Center) { if (control.fe.HorizontalAlignment == HorizontalAlignment.Left) { double x1 = margin.Left; double x2 = sizeGrid.Width - size.Width - margin.Left; double left = x1 - x2 + 0.5; control.fe.Margin = new Thickness((int)left, margin.Top, 0, margin.Bottom); } else if (control.fe.HorizontalAlignment == HorizontalAlignment.Right) { double x1 = sizeGrid.Width - size.Width - margin.Right; double x2 = margin.Right; double left = x1 - x2 + 0.5; control.fe.Margin = new Thickness((int)left, margin.Top, 0, margin.Bottom); } else if (control.fe.HorizontalAlignment == HorizontalAlignment.Stretch) { double x1 = margin.Left; double x2 = margin.Right; double left = x1 - x2 + 0.5; control.fe.Margin = new Thickness((int)left, margin.Top, 0, margin.Bottom); control.fe.Width = (int)(sizeGrid.Width - margin.Left - margin.Right + 0.5); } control.fe.HorizontalAlignment = HorizontalAlignment.Center; } else if (alignH == HorizontalAlignment.Right && control.fe.HorizontalAlignment != HorizontalAlignment.Right) { if (control.fe.HorizontalAlignment == HorizontalAlignment.Left) { double right = sizeGrid.Width - size.Width - margin.Left + 0.5; control.fe.Margin = new Thickness(0, margin.Top, (int)right, margin.Bottom); } else if (control.fe.HorizontalAlignment == HorizontalAlignment.Center) { double x2 = (sizeGrid.Width - size.Width - margin.Left) / 2; double right = x2 + 0.5; control.fe.Margin = new Thickness(0, margin.Top, (int)right, margin.Bottom); } else if (control.fe.HorizontalAlignment == HorizontalAlignment.Stretch) { control.fe.Margin = new Thickness(0, margin.Top, margin.Right, margin.Bottom); control.fe.Width = (int)(sizeGrid.Width - margin.Left - margin.Right + 0.5); } control.fe.HorizontalAlignment = HorizontalAlignment.Right; } else if (alignH == HorizontalAlignment.Stretch && control.fe.HorizontalAlignment != HorizontalAlignment.Stretch) { if (control.fe.HorizontalAlignment == HorizontalAlignment.Left) { double right = sizeGrid.Width - size.Width - margin.Left + 0.5; control.fe.Margin = new Thickness(margin.Left, margin.Top, (int)right, margin.Bottom); } else if (control.fe.HorizontalAlignment == HorizontalAlignment.Center) { double x2 = (sizeGrid.Width - size.Width - margin.Left) / 2; double left = margin.Left + x2 + 0.5; double right = x2 + 0.5; control.fe.Margin = new Thickness((int)left, margin.Top, (int)right, margin.Bottom); } else if (control.fe.HorizontalAlignment == HorizontalAlignment.Right) { double left = sizeGrid.Width - size.Width - margin.Right + 0.5; control.fe.Margin = new Thickness((int)left, margin.Top, margin.Right, margin.Bottom); } control.fe.Width = double.NaN; control.fe.HorizontalAlignment = HorizontalAlignment.Stretch; } if (alignV == VerticalAlignment.Top && control.fe.VerticalAlignment != VerticalAlignment.Top) { if (control.fe.VerticalAlignment == VerticalAlignment.Center) { double y2 = (sizeGrid.Height - size.Height - margin.Top) / 2; double top = margin.Top + y2 + 0.5; control.fe.Margin = new Thickness(margin.Left, (int)top, margin.Right, 0); } else if (control.fe.VerticalAlignment == VerticalAlignment.Bottom) { double top = sizeGrid.Height - size.Height - margin.Bottom + 0.5; control.fe.Margin = new Thickness(margin.Left, (int)top, margin.Right, 0); } else if (control.fe.VerticalAlignment == VerticalAlignment.Stretch) { control.fe.Margin = new Thickness(margin.Left, margin.Top, margin.Right, 0); control.fe.Height = (int)(sizeGrid.Height - margin.Top - margin.Bottom + 0.5); } control.fe.VerticalAlignment = VerticalAlignment.Top; } else if (alignV == VerticalAlignment.Center && control.fe.VerticalAlignment != VerticalAlignment.Center) { if (control.fe.VerticalAlignment == VerticalAlignment.Top) { double y1 = margin.Top; double y2 = sizeGrid.Height - size.Height - margin.Top; double top = y1 - y2 + 0.5; control.fe.Margin = new Thickness(margin.Left, (int)top, margin.Right, 0); } else if (control.fe.VerticalAlignment == VerticalAlignment.Bottom) { double y1 = sizeGrid.Height - size.Height - margin.Bottom; double y2 = margin.Bottom; double top = y1 - y2 + 0.5; control.fe.Margin = new Thickness(margin.Left, (int)top, margin.Right, 0); } else if (control.fe.VerticalAlignment == VerticalAlignment.Stretch) { double y1 = margin.Top; double y2 = margin.Bottom; double top = y1 - y2 + 0.5; control.fe.Margin = new Thickness(margin.Left, (int)top, margin.Right, 0); control.fe.Height = (int)(sizeGrid.Height - margin.Top - margin.Bottom + 0.5); } control.fe.VerticalAlignment = VerticalAlignment.Center; } else if (alignV == VerticalAlignment.Bottom && control.fe.VerticalAlignment != VerticalAlignment.Bottom) { if (control.fe.VerticalAlignment == VerticalAlignment.Top) { double bottom = sizeGrid.Height - size.Height - margin.Top + 0.5; control.fe.Margin = new Thickness(margin.Left, 0, margin.Right, (int)bottom); } else if (control.fe.VerticalAlignment == VerticalAlignment.Center) { double y2 = (sizeGrid.Height - size.Height - margin.Top) / 2; double bottom = y2 + 0.5; control.fe.Margin = new Thickness(margin.Left, 0, margin.Right, (int)bottom); } else if (control.fe.VerticalAlignment == VerticalAlignment.Stretch) { control.fe.Margin = new Thickness(margin.Left, 0, margin.Right, margin.Bottom); control.fe.Height = (int)(sizeGrid.Height - margin.Top - margin.Bottom + 0.5); } control.fe.VerticalAlignment = VerticalAlignment.Bottom; } else if (alignV == VerticalAlignment.Stretch && control.fe.VerticalAlignment != VerticalAlignment.Stretch) { if (control.fe.VerticalAlignment == VerticalAlignment.Top) { double bottom = sizeGrid.Height - size.Height - margin.Top + 0.5; control.fe.Margin = new Thickness(margin.Left, margin.Top, margin.Right, (int)bottom); } else if (control.fe.VerticalAlignment == VerticalAlignment.Center) { double y2 = (sizeGrid.Height - size.Height - margin.Top) / 2; double top = margin.Top + y2 + 0.5; double bottom = y2 + 0.5; control.fe.Margin = new Thickness(margin.Left, (int)top, margin.Right, (int)bottom); } else if (control.fe.VerticalAlignment == VerticalAlignment.Bottom) { double top = sizeGrid.Height - size.Height - margin.Bottom + 0.5; control.fe.Margin = new Thickness(margin.Left, (int)top, margin.Right, margin.Bottom); } control.fe.Height = double.NaN; control.fe.VerticalAlignment = VerticalAlignment.Stretch; } if (SelectedControl == control) { marker.SetAlignment(); designer.UpdateLocation(); } }
private static Point GetLeftTop(IHmiControl control) { return(new Point(GetLeft(control), GetTop(control))); }
public void Initialize(IHmiControl control, Point mouse) { Initialize(control); this.mouse = mouse; }
public void SetName(IHmiControl control, string name) { while (childrenByName.ContainsValue(control)) { var item = childrenByName.First(pair => pair.Value == control); childrenByName.Remove(item.Key); } // Is the candidate name empty or invalid? name = name.Replace(' ', '_'); bool invalid = (name.Length == 0 || !(char.IsLetter(name[0]) || name[0] == '_')); foreach (char ch in name) { if (!char.IsLetterOrDigit(ch) && ch != '_') { invalid = true; break; } } if (invalid) { // Generate a default name if invalid. int index = 1; do { name = string.Format("{0}{1}", control.NamePrefix, index++); }while (childrenByName.ContainsKey(name)); } else if (childrenByName.ContainsKey(name)) { // Strip off appended "name_123" if present. string nameCore = name; int index = nameCore.LastIndexOf('_'); if (index > 0) { bool digitsOnly = true; for (int i = index + 1; i < nameCore.Length; i++) { if (!char.IsDigit(nameCore[i])) { digitsOnly = false; break; } } if (digitsOnly) { nameCore = nameCore.Substring(0, index); } } // Increment and append "name_123" until unique. index = 1; do { name = string.Format("{0}_{1}", nameCore, index++); }while (childrenByName.ContainsKey(name)); } control.Name = name; childrenByName[control.Name] = control; }