Exemple #1
0
        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);
            }
        }
Exemple #3
0
        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));
                        }
                    }
                }
            }
        }
Exemple #4
0
        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();
            }
        }
Exemple #5
0
        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);
            }
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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;
            }
        }
Exemple #8
0
        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
            }
        }
Exemple #9
0
 private void StopDragging()
 {
     if (draggingControl != null)
     {
         marker.Dragging = Marker.EDragging.None;
         draggingControl = null;
         location0.Clear();
         moveList.Clear();
         ReleaseMouseCapture();
     }
 }
Exemple #10
0
 public static bool InMoveList(IHmiControl control)
 {
     foreach (var item in control.OwnerPage.moveList)
     {
         if (item.control == control)
         {
             return(true);
         }
     }
     return(false);
 }
Exemple #11
0
        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;
        }
Exemple #12
0
 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);
 }
Exemple #13
0
 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);
 }
Exemple #14
0
        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;
            }
        }
Exemple #16
0
 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));
     }
 }
Exemple #17
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);
            }
        }
Exemple #18
0
        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();
            }
        }
Exemple #19
0
 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;
 }
Exemple #21
0
        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;
        }