aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RolesViewVM.cs
blob: e87aa767daabe22afd821cab7a12c13bfd545482 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL.Entities;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.DB.ViewModels;

namespace Tango.MachineStudio.DB.ViewModels
{
    public class RolesViewVM : DbTableViewModel<Role>
    {
        public RolesViewVM(INotificationProvider notification) : base(notification)
        {
            SelectedPermissions = new ObservableCollection<MultiComboVM<Permission>>();
        }

        private ObservableCollection<MultiComboVM<Permission>> _selectedPermissions;
        public ObservableCollection<MultiComboVM<Permission>> SelectedPermissions
        {
            get { return _selectedPermissions; }
            set { _selectedPermissions = value; RaisePropertyChangedAuto(); }
        }

        protected override void OnEdit()
        {
            SelectedPermissions = Adapter.Permissions.Select(x => new MultiComboVM<Permission>(x, () => RaisePropertyChanged(nameof(SelectedPermissions)))).ToObservableCollection();

            foreach (var permission in SelectedPermissions)
            {
                if (SelectedEntity.RolesPermissions.ToList().Exists(x => x.Permission == permission.Entity))
                {
                    permission.IsSelected = true;
                }
            }

            base.OnEdit();
        }

        protected override void OnAdd()
        {
            SelectedPermissions = Adapter.Permissions.Select(x => new MultiComboVM<Permission>(x, () => RaisePropertyChanged(nameof(SelectedPermissions)))).ToObservableCollection();

            base.OnAdd();
        }

        protected override void OnBeforeEntitySave(DialogOpenMode mode, Role role)
        {
            base.OnBeforeEntitySave(mode, role);

            Adapter.Context.RolesPermissions.RemoveRange(role.RolesPermissions);

            foreach (var permission in SelectedPermissions)
            {
                if (permission.IsSelected)
                {
                    role.RolesPermissions.Add(new RolesPermission()
                    {
                        Permission = permission.Entity,
                        Role = role,
                        PermissionGuid = permission.Entity.Guid,
                        RoleGuid = role.Guid
                    });
                }
            }
        }
    }
}
rator.FetchOptions(TextEditorOptions options) { this.ShowSpaces = options.ShowSpaces; this.ShowTabs = options.ShowTabs; this.ShowBoxForControlCharacters = options.ShowBoxForControlCharacters; } public override int GetFirstInterestedOffset(int startOffset) { DocumentLine endLine = CurrentContext.VisualLine.LastDocumentLine; StringSegment relevantText = CurrentContext.GetText(startOffset, endLine.EndOffset - startOffset); for (int i = 0; i < relevantText.Count; i++) { char c = relevantText.Text[relevantText.Offset + i]; switch (c) { case ' ': if (ShowSpaces) return startOffset + i; break; case '\t': if (ShowTabs) return startOffset + i; break; default: if (ShowBoxForControlCharacters && char.IsControl(c)) { return startOffset + i; } break; } } return -1; } public override VisualLineElement ConstructElement(int offset) { char c = CurrentContext.Document.GetCharAt(offset); if (ShowSpaces && c == ' ') { return new SpaceTextElement(CurrentContext.TextView.cachedElements.GetTextForNonPrintableCharacter("\u00B7", CurrentContext)); } else if (ShowTabs && c == '\t') { return new TabTextElement(CurrentContext.TextView.cachedElements.GetTextForNonPrintableCharacter("\u00BB", CurrentContext)); } else if (ShowBoxForControlCharacters && char.IsControl(c)) { var p = new VisualLineElementTextRunProperties(CurrentContext.GlobalTextRunProperties); p.SetForegroundBrush(Brushes.White); var textFormatter = TextFormatterFactory.Create(CurrentContext.TextView); var text = FormattedTextElement.PrepareText(textFormatter, TextUtilities.GetControlCharacterName(c), p); return new SpecialCharacterBoxElement(text); } else { return null; } } sealed class SpaceTextElement : FormattedTextElement { public SpaceTextElement(TextLine textLine) : base(textLine, 1) { BreakBefore = LineBreakCondition.BreakPossible; BreakAfter = LineBreakCondition.BreakDesired; } public override int GetNextCaretPosition(int visualColumn, LogicalDirection direction, CaretPositioningMode mode) { if (mode == CaretPositioningMode.Normal) return base.GetNextCaretPosition(visualColumn, direction, mode); else return -1; } public override bool IsWhitespace(int visualColumn) { return true; } } sealed class TabTextElement : VisualLineElement { internal readonly TextLine text; public TabTextElement(TextLine text) : base(2, 1) { this.text = text; } public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context) { // the TabTextElement consists of two TextRuns: // first a TabGlyphRun, then TextCharacters '\t' to let WPF handle the tab indentation if (startVisualColumn == this.VisualColumn) return new TabGlyphRun(this, this.TextRunProperties); else if (startVisualColumn == this.VisualColumn + 1) return new TextCharacters("\t", 0, 1, this.TextRunProperties); else throw new ArgumentOutOfRangeException("startVisualColumn"); } public override int GetNextCaretPosition(int visualColumn, LogicalDirection direction, CaretPositioningMode mode) { if (mode == CaretPositioningMode.Normal) return base.GetNextCaretPosition(visualColumn, direction, mode); else return -1; } public override bool IsWhitespace(int visualColumn) { return true; } } sealed class TabGlyphRun : TextEmbeddedObject { readonly TabTextElement element; TextRunProperties properties; public TabGlyphRun(TabTextElement element, TextRunProperties properties) { if (properties == null) throw new ArgumentNullException("properties"); this.properties = properties; this.element = element; } public override LineBreakCondition BreakBefore { get { return LineBreakCondition.BreakPossible; } } public override LineBreakCondition BreakAfter { get { return LineBreakCondition.BreakRestrained; } } public override bool HasFixedSize { get { return true; } } public override CharacterBufferReference CharacterBufferReference { get { return new CharacterBufferReference(); } } public override int Length { get { return 1; } } public override TextRunProperties Properties { get { return properties; } } public override TextEmbeddedObjectMetrics Format(double remainingParagraphWidth) { double width = Math.Min(0, element.text.WidthIncludingTrailingWhitespace - 1); return new TextEmbeddedObjectMetrics(width, element.text.Height, element.text.Baseline); } public override Rect ComputeBoundingBox(bool rightToLeft, bool sideways) { double width = Math.Min(0, element.text.WidthIncludingTrailingWhitespace - 1); return new Rect(0, 0, width, element.text.Height); } public override void Draw(DrawingContext drawingContext, Point origin, bool rightToLeft, bool sideways) { origin.Y -= element.text.Baseline; element.text.Draw(drawingContext, origin, InvertAxes.None); } } sealed class SpecialCharacterBoxElement : FormattedTextElement { public SpecialCharacterBoxElement(TextLine text) : base(text, 1) { } public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context) { return new SpecialCharacterTextRun(this, this.TextRunProperties); } } sealed class SpecialCharacterTextRun : FormattedTextRun { static readonly SolidColorBrush darkGrayBrush; static SpecialCharacterTextRun() { darkGrayBrush = new SolidColorBrush(Color.FromArgb(200, 128, 128, 128)); darkGrayBrush.Freeze(); } public SpecialCharacterTextRun(FormattedTextElement element, TextRunProperties properties) : base(element, properties) { } public override void Draw(DrawingContext drawingContext, Point origin, bool rightToLeft, bool sideways) { Point newOrigin = new Point(origin.X + 1.5, origin.Y); var metrics = base.Format(double.PositiveInfinity); Rect r = new Rect(newOrigin.X - 0.5, newOrigin.Y - metrics.Baseline, metrics.Width + 2, metrics.Height); drawingContext.DrawRoundedRectangle(darkGrayBrush, null, r, 2.5, 2.5); base.Draw(drawingContext, newOrigin, rightToLeft, sideways); } public override TextEmbeddedObjectMetrics Format(double remainingParagraphWidth) { TextEmbeddedObjectMetrics metrics = base.Format(remainingParagraphWidth); return new TextEmbeddedObjectMetrics(metrics.Width + 3, metrics.Height, metrics.Baseline); } public override Rect ComputeBoundingBox(bool rightToLeft, bool sideways) { Rect r = base.ComputeBoundingBox(rightToLeft, sideways); r.Width += 3; return r; } } } }