프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

markus / KCOM / Controls / AdornerFinal.xaml.cs @ 2e35dd78

이력 | 보기 | 이력해설 | 다운로드 (69.4 KB)

1
using KCOM.Common;
2
using KCOM.Events;
3
using MarkupToPDF.Common;
4
using MarkupToPDF.Controls.Cad;
5
using MarkupToPDF.Controls.Common;
6
using MarkupToPDF.Controls.Etc;
7
using MarkupToPDF.Controls.Line;
8
using MarkupToPDF.Controls.Parsing;
9
using MarkupToPDF.Controls.Polygon;
10
using MarkupToPDF.Controls.Shape;
11
using MarkupToPDF.Controls.Text;
12
using System;
13
using System.Collections.Generic;
14
using System.Diagnostics;
15
using System.Linq;
16
using System.Reactive.Linq;
17
using System.Text;
18
using System.Windows;
19
using System.Windows.Controls;
20
using System.Windows.Controls.Primitives;
21
using System.Windows.Input;
22
using System.Windows.Media;
23
using Telerik.Windows.Controls;
24

    
25
namespace KCOM.Controls
26
{
27
    public class MyThumb : Thumb
28
    {
29
        public MyThumb()
30
        {
31
            this.Opacity = 0.6;
32
            this.MouseEnter += MyThumb_MouseEnter;
33
            this.MouseLeave += MyThumb_MouseLeave;
34
        }
35

    
36
        /// <summary>
37
        /// translate thumb with given delta and angle
38
        /// </summary>
39
        /// <param name="e"></param>
40
        /// <param name="angle"></param>
41
        public void Translate(double dx, double dy, double angle)
42
        {
43
            double radian = angle * Math.PI / 180;
44
            double cos = Math.Cos(radian);
45
            double sin = Math.Sin(radian);
46

    
47
            double _dx = dx * cos - dy * sin;
48
            double _dy = dx * sin + dy * cos;
49
            Canvas.SetLeft(this, Canvas.GetLeft(this) + _dx);
50
            Canvas.SetTop(this, Canvas.GetTop(this) + _dy);
51
        }
52

    
53
        /// <summary>
54
        /// </summary>
55
        /// <param name="sender"></param>
56
        /// <param name="e"></param>
57
        private void MyThumb_MouseLeave(object sender, MouseEventArgs e)
58
        {
59
            this.Opacity = 0.6;
60
        }
61

    
62
        /// <summary>
63
        /// 
64
        /// </summary>
65
        /// <param name="sender"></param>
66
        /// <param name="e"></param>
67
        private void MyThumb_MouseEnter(object sender, MouseEventArgs e)
68
        {
69
            this.Opacity = 1.0;
70
        }
71
    }
72

    
73
    /// <summary>
74
    /// Interaction logic for AdornerFinal.xaml
75
    /// </summary>
76
    public class AdornerMember
77
    {
78
        public UIElement DrawingData { get; set; }
79
        public ControlType Drawingtype { get; set; }
80
        public double DrawingAngle { get; set; }
81
        public List<MyThumb> ThumbList { get; set; }
82
        public string Symbol_ID { get; set; }
83
        public long Group_ID { get; set; }
84

    
85
        /// <summary>
86
        /// update thumb
87
        /// </summary>
88
        public void UpdateThumb()
89
        {
90
            var path = this.DrawingData as IPath;
91
            for (int i = 0; i < path.PointSet.Count; ++i)
92
            {
93
                Canvas.SetLeft(this.ThumbList[i], path.PointSet[i].X);
94
                Canvas.SetTop(this.ThumbList[i], path.PointSet[i].Y);
95
            }
96

    
97
            if (this.DrawingData as ArrowTextControl != null)
98
            {
99
                if (!(this.DrawingData as ArrowTextControl).isTrans) //trans가 True인경우
100
                {
101
                    List<Point> ps = new List<Point>();
102

    
103
                    var temp = this.DrawingData as ArrowTextControl;
104
                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxWidth / 2, Canvas.GetTop(temp.Base_TextBox))); //상단
105
                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxWidth / 2, Canvas.GetTop(temp.Base_TextBox) + temp.BoxHeight)); // 하단
106
                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox), Canvas.GetTop(temp.Base_TextBox) + temp.BoxHeight / 2)); //좌단
107
                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxWidth, Canvas.GetTop(temp.Base_TextBox) + temp.BoxHeight / 2));  //우단
108

    
109
                    if (temp.isFixed)
110
                    {
111
                        var endP = MathSet.getNearPoint(ps, temp.MidPoint);
112
                        var testP = endP;
113
                        if (ps[0] == endP) //상단
114
                        {
115
                            testP = new Point(endP.X, endP.Y - 50);
116
                        }
117
                        else if (ps[1] == endP) //하단
118
                        {
119
                            testP = new Point(endP.X, endP.Y + 50);
120
                        }
121
                        else if (ps[2] == endP) //좌단
122
                        {
123
                            testP = new Point(endP.X - 50, endP.Y);
124
                        }
125
                        else if (ps[3] == endP) //우단
126
                        {
127
                            testP = new Point(endP.X + 50, endP.Y);
128
                        }
129
                        Canvas.SetLeft(this.ThumbList[1], testP.X);
130
                        Canvas.SetTop(this.ThumbList[1], testP.Y);
131
                    }
132
                    else
133
                    {
134
                        var endP = MathSet.getNearPoint(ps, temp.MidPoint);
135
                        var tempP = MathSet.getMiddlePoint(temp.StartPoint, endP);
136
                        Canvas.SetLeft(this.ThumbList[1], tempP.X);
137
                        Canvas.SetTop(this.ThumbList[1], tempP.Y);
138
                    }
139
                }
140
            }
141
        }
142

    
143
        /// <summary>
144
        /// rotate members about given position and angle
145
        /// </summary>
146
        /// <param name="at"></param>
147
        /// <param name="angle">in degree</param>
148
        public void RotateAbout(Point at, double angle)
149
        {
150
            for (int i = 0; i < (this.DrawingData as IPath).PointSet.Count; i++)
151
            {
152
                (this.DrawingData as IPath).PointSet[i] = MathSet.RotateAbout(at, (this.DrawingData as IPath).PointSet[i], angle);
153
            }
154
            (this.DrawingData as CommentUserInfo).UpdateControl();
155

    
156
            this.UpdateThumb();
157
        }
158
    }
159

    
160
    public partial class AdornerFinal : UserControl
161
    {
162
        public TextBox editTextBox { get; set; }
163
        #region 공용 인스턴스
164
        public List<AdornerMember> Members { get; } = new List<AdornerMember>();
165
        public Dictionary<Thumb, DragData> _dragData = new Dictionary<Thumb, DragData>();
166
        public double AngleValue = 0;
167
        public bool IsTextAngle = false;
168
        public Rect BorderSize { get; set; }
169
        public bool TextCompensation = false;
170
        public bool isDragging { get; set; }
171
        public Thumb DraggerThumb { get; set; }
172
        public RadDropDownButton dropData;
173
        public RadCalendar dropCalendar;
174
        public Thumb mainDragThumb { get; set; }
175

    
176
        private bool disposed;
177

    
178
        public Point reSizePoint { get; set; }
179
        private Point rotatePoint { get; set; } /// 2018.05.09 added by humkyung
180
        private Point MouseDownPoint = new Point();
181
        private Point CurrentMousePoint = new Point();
182
        #endregion
183
        #region 생성자
184
        private void RadDropDownButton_Loaded(object sender, RoutedEventArgs e)
185
        {
186
            dropData = sender as RadDropDownButton;
187
        }
188

    
189
        private void Date_Calendar_Loaded(object sender, RoutedEventArgs e)
190
        {
191
            dropCalendar = sender as RadCalendar;
192
            dropCalendar.SelectionChanged += (sen, ea) =>
193
            {
194
                dropData.IsOpen = false;
195
                if ((this.Members.First() as AdornerMember).DrawingData.GetType().Name == "DateControl")
196
                {
197
                    DateControl data = (this.Members.First() as AdornerMember).DrawingData as DateControl;
198
                    data.Text = dropCalendar.SelectedDate.Value.ToShortDateString();
199
                }
200
            };
201
        }
202

    
203
        public AdornerFinal()
204
        {
205
            InitializeComponent();
206

    
207
            BorderSize = new Rect();
208
            _dragData.Add(rotateTop, new DragData() { CursorAngle = 0, DragType = DragType.Rotate, RotateIsLeft = true, RotateIsTop = true });
209
        }
210

    
211
        ~AdornerFinal()
212
        {
213
            this.Dispose(false);
214
        }
215

    
216
        public void Dispose()
217
        {
218
            this.Dispose(true);
219
            GC.SuppressFinalize(this);
220
        }
221

    
222
        protected virtual void Dispose(bool disposing)
223
        {
224
            if (this.disposed) return;
225
            if (disposing)
226
            {
227
                foreach (var member in this.Members)
228
                {
229
                    if(!Common.ViewerDataModel.Instance.MarkupControls_USER.Contains(member.DrawingData))
230
                        Common.ViewerDataModel.Instance.MarkupControls_USER.Add(member.DrawingData as CommentUserInfo);
231
                }
232
                // IDisposable 인터페이스를 구현하는 멤버들을 여기서 정리합니다.
233
            }
234
            // .NET Framework에 의하여 관리되지 않는 외부 리소스들을 여기서 정리합니다.
235
            this.disposed = true;
236
        }
237

    
238
        void DragThumb_Loaded(object sender, RoutedEventArgs e)
239
        {
240
            mainDragThumb = DragThumb;
241
        }
242

    
243
        public AdornerFinal(CommentUserInfo objectData) : this()
244
        {
245
            InitializeComponent();
246
            objectData.IsHitTestVisible = false;
247
            if ((objectData as ArrowTextControl) != null)
248
            {
249
                (objectData as ArrowTextControl).Base_TextBox.Focusable = true;
250
            }
251
            Canvas.SetZIndex(objectData, 84);
252
            try
253
            {
254
                ViewerDataModel.Instance.MarkupControls_USER.Remove(objectData);
255
                this.ContainerContent.Children.Add(objectData);
256
            }
257
            catch (Exception ex)
258
            {
259

    
260
            }
261
           
262
            SetAdornerMember(objectData as CommentUserInfo);
263
            this.Focus();
264
        }
265

    
266
        public AdornerFinal(List<CommentUserInfo> objectData) : this()
267
        {
268
            InitializeComponent();
269
            foreach (var item in objectData)
270
            {
271
                //item.IsHitTestVisible = false;
272
                if ((item as ArrowTextControl) != null)
273
                {
274
                    (item as ArrowTextControl).Base_TextBox.Focusable = true;
275
                }
276
                try
277
                {
278
                    Canvas.SetZIndex(item, 80);
279
                    ViewerDataModel.Instance.MarkupControls_USER.Remove(item);
280
                    this.ContainerContent.Children.Add(item);
281
                }
282
                catch //(Exception ex)
283
                {
284
                }
285
                finally
286
                {
287
                    
288
                }
289
            }
290
            this.SetAdornerMember(objectData);
291
            this.Focus();
292
        }
293

    
294
        public Point Centeroid
295
        {
296
            get
297
            {
298
                List<Point> pts = new List<Point>();
299

    
300
                #region 센터 포인트 구하기 (그룹핑)
301
                foreach (var item in this.Members)
302
                {
303
                    if (item.DrawingData.GetType().Name == "TextControl")
304
                    {
305
                        if (AngleValue == 0)
306
                        {
307
                            AngleValue = (item.DrawingData as TextControl).CommentAngle;
308
                        }
309
                        double X = Canvas.GetLeft((item.DrawingData as TextControl));
310
                        double Y = Canvas.GetTop((item.DrawingData as TextControl));
311
                        pts.Add(new Point(X, Y));
312
                    }
313
                    else
314
                    {
315
                        pts.AddRange((item.DrawingData as IPath).PointSet);
316
                    }
317
                }
318
                #endregion
319

    
320
                return MathSet.FindCentroid(pts);
321
            }
322
        }
323

    
324
#endregion
325
#region 메서드
326
public Rect getAdornerSize()
327
        {
328
            return BorderSize;
329
        }
330
        public void addMemberControl(UIElement objectData)
331
        {
332
            this.ContainerContent.Children.Add(objectData);
333
            SetAdornerMember(objectData as CommentUserInfo);
334
            this.Focus();
335
        }
336
        /// <summary>
337
        /// UIElement를 종류에 맞게 등록시킴
338
        /// </summary>
339
        /// <param name="member">UIElement 타입으로 BaseLayer에 있는 것들이 들어옵니다.</param>
340
        public void SetAdornerMember(MarkupToPDF.Common.CommentUserInfo member)
341
        {
342
            switch (member.GetType().Name)
343
            {
344
                #region 컨트롤 조건
345
                case "LineControl":
346
                case "PolygonControl":
347
                case "ArrowControl":
348
                case "ArcControl":
349
                case "ArrowArcControl":
350
                case "ArrowControl_Multi":
351
                case "RectangleControl":
352
                case "TriControl":
353
                case "CircleControl":
354
                case "CloudControl":
355
                case "RectCloudControl":
356
                case "InkControl":
357
                case "InsideWhiteControl":
358
                case "OverlapWhiteControl":
359
                case "ClipWhiteControl":
360
                case "CoordinateControl":
361
                    this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = member.ControlType, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
362
                    break;
363
                case "ArrowTextControl":
364
                    this.Members.Add(new AdornerMember
365
                    {
366
                        DrawingData = member,
367
                        Drawingtype = ControlType.ArrowTextControl,
368
                        ThumbList = new List<MyThumb>(),
369
                        Symbol_ID = member.SymbolID,
370
                        Group_ID = member.GroupID,
371
                    });
372
                    (member as ArrowTextControl).Base_TextBox.IsHitTestVisible = false;
373
                    AngleValue = (member as ArrowTextControl).CommentAngle;
374
                    Observable.FromEventPattern(((ArrowTextControl)member).Base_TextBox, "LostFocus").Subscribe(a =>
375
                    {
376
                        TextCompensation = false;
377
                        BorderUpdate();
378
                        if ((a.Sender as TextBox).Text == "") //보류
379
                        {
380
                            this.ContainerContent.Children.Remove(member);
381
                            this.Visibility = Visibility.Collapsed;
382
                        }
383
                    });
384
                    break;
385
                case "ImgControl":
386
                    this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = member.ControlType, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
387
                    AngleValue = (member as ImgControl).CommentAngle;
388
                    break;
389
                case "DateControl":
390
                    this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = member.ControlType, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
391
                    AngleValue = (member as DateControl).CommentAngle;
392
                    break;
393
                case "SignControl":
394
                    this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = member.ControlType, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
395
                    AngleValue = (member as SignControl).CommentAngle;
396
                    break;
397
                case "SymControl":
398
                    this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = member.ControlType, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
399
                    AngleValue = (member as SymControl).CommentAngle;
400
                    break;
401
                case "SymControlN":
402
                    this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = member.ControlType, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
403
                    AngleValue = (member as SymControlN).CommentAngle;
404
                    break;
405
                case "TextControl":
406
                    this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.TextControl, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
407
                    RectangleGeometry Data = new RectangleGeometry
408
                    {
409
                        Rect = new Rect()
410
                        {
411
                            X = Canvas.GetLeft((member as TextControl)),
412
                            Y = Canvas.GetTop((member as TextControl)),
413
                            Width = (member as TextControl).Base_TextBlock.ActualWidth / 2,
414
                            Height = (member as TextControl).Base_TextBlock.ActualHeight / 2,
415
                            //Width = (member as TextControl).BoxWidth / 2,
416
                            //Height = (member as TextControl).BoxHeight / 2,
417
                        }
418
                    };
419
                    Point endPointV = new Point(Data.Bounds.Right, Data.Bounds.Bottom);
420
                    Point middle = MathSet.getMiddlePoint((member as TextControl).StartPoint, endPointV);
421

    
422

    
423
                    DragThumb.RenderTransformOrigin = new Point(0.0, 0.0);
424
                    DragThumb.RenderTransform = new RotateTransform()
425
                    {
426
                        Angle = (member as TextControl).CommentAngle,
427
                        //CenterX = middle.X,
428
                        //CenterY = middle.Y,
429
                    };
430

    
431
                    AdornerBorder.RenderTransformOrigin = new Point(0.0, 0.0);
432
                    AdornerBorder.RenderTransform = new RotateTransform()
433
                    {
434
                        Angle = (member as TextControl).CommentAngle,
435
                        //CenterX = middle.X,
436
                        //CenterY = middle.Y,
437
                    };
438
                    Observable.FromEventPattern(((TextControl)member), "PropertyChanged").Subscribe(a =>
439
                    {
440
                        TextCompensation = true;
441
                        BorderUpdate();
442
                        ((TextControl)member).Base_TextBlock.TextDecorations = ((TextControl)member).UnderLine;
443
                    });
444
                    Observable.FromEventPattern(((TextControl)member).Base_TextBox, "LostFocus").Subscribe(a =>
445
                    {
446
                        TextCompensation = false;
447
                        BorderUpdate();
448
                        if ((a.Sender as TextBox).Text == "") //보류
449
                        {
450
                            this.ContainerContent.Children.Remove(member);
451
                            this.Visibility = Visibility.Collapsed;
452
                        }
453

    
454
                        //((TextControl)member).UnEditingMode();
455
                        //((TextControl)member).Base_TextBlock.Visibility = Visibility.Collapsed;
456
                        //((TextControl)member).Base_Border.Visibility = Visibility.Collapsed;
457
                        //((TextControl)member).Base_TextPath.Visibility = Visibility.Collapsed;
458
                    });
459
                    break;
460
                default:
461
                    break;
462
                    #endregion
463
            }
464

    
465
            if (member.GetType().Name == "TextControl")
466
            {
467
                TextControl content = ((TextControl)member);
468
                content.StartPoint = new Point(Canvas.GetLeft(content), Canvas.GetTop(content));
469
                content.EndPoint = content.StartPoint;
470
            }
471
            else
472
            {
473
                RegistryPoint(member);
474
            }
475
            BorderUpdate();
476

    
477
            if (Common.ViewerDataModel.Instance.MarkupControls_USER.Contains(member)) Common.ViewerDataModel.Instance.MarkupControls_USER.Remove(member);
478
        }
479

    
480
        private void ViewBoxRotate(UIElement member)
481
        {
482
            AdornerBorder.RenderTransformOrigin = new Point(0.5, 0.5);
483
            DragThumb.RenderTransformOrigin = new Point(0.5, 0.5);
484
            AdornerBorder.RenderTransform = new RotateTransform() { Angle = (member as IViewBox).CommentAngle };
485
            DragThumb.RenderTransform = new RotateTransform() { Angle = (member as IViewBox).CommentAngle };
486
        }
487

    
488
        public void SetAdornerMember(List<CommentUserInfo> members)
489
        {
490
            foreach (var member in members)
491
            {
492
                switch (member.GetType().Name)
493
                {
494
                    #region 컨트롤 조건
495
                    case "LineControl":
496
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.SingleLine, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
497
                        break;
498
                    case "ImgControl":
499
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.ImgControl, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
500
                        break;
501
                    case "ArrowControl":
502
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.ArrowLine, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
503
                        break;
504
                    case "PolygonControl":
505
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.PolygonControl, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
506
                        break;
507
                    case "ArrowTextControl":
508
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.ArrowTextControl, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
509
                        (member as ArrowTextControl).Base_TextBox.IsHitTestVisible = false;
510
                        break;
511
                    case "ArcControl":
512
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.ArcLine, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
513
                        break;
514
                    case "ArrowArcControl":
515
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.ArcArrow, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
516
                        break;
517
                    case "DateControl":
518
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.Date, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
519
                        break;
520
                    case "ArrowControl_Multi":
521
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.ArrowMultiLine, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
522
                        break;
523
                    case "RectangleControl":
524
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.Rectangle, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
525
                        break;
526
                    case "TriControl":
527
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.Triangle, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
528
                        break;
529
                    case "CircleControl":
530
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.Circle, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
531
                        break;
532
                    case "CloudControl":
533
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.PolygonCloud, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
534
                        break;
535
                    case "RectCloudControl":
536
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.RectCloud, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
537
                        break;
538
                    case "SignControl":
539
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.Sign, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
540
                        break;
541
                    case "SymControl":
542
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.Symbol, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
543
                        break;
544
                    case "SymControlN":
545
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.Stamp, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
546
                        break;
547
                    case "InkControl":
548
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.Ink, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
549
                        break;
550
                    case "TextControl":
551
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.TextControl, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
552
                        Observable.FromEventPattern(((TextControl)member), "PropertyChanged").Subscribe(a =>
553
                        {
554
                            BorderUpdate();
555
                            try
556
                            {
557
                                ((TextControl)member).Base_TextBlock.TextDecorations = ((TextControl)member).UnderLine; 
558
                            }
559
                            catch (Exception)
560
                            {
561

    
562
                            }
563

    
564
                        });
565
                        Observable.FromEventPattern(((TextControl)member).Base_TextBox, "SelectionChanged").Subscribe(a =>
566
                        {
567
                            BorderUpdate();
568
                        });
569
                        break;
570
                    case "InsideWhiteControl":
571
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.InsideWhite, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
572
                        break;
573
                    case "OverlapWhiteControl":
574
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.OverlapWhite, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
575
                        break;
576
                    case "ClipWhiteControl":
577
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.ClipWhite, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
578
                        break;
579
                    case "CoordinateControl":
580
                        this.Members.Add(new AdornerMember { DrawingData = member, Drawingtype = ControlType.Coordinate, ThumbList = new List<MyThumb>(), Symbol_ID = member.SymbolID, Group_ID = member.GroupID });
581
                        break;
582
                    default:
583
                        break;
584
                        #endregion
585
                }
586
                if (member.GetType().Name == "TextControl")
587
                {
588
                    TextControl content = ((TextControl)member);
589
                    content.StartPoint = new Point(Canvas.GetLeft(content), Canvas.GetTop(content));
590
                    content.EndPoint = content.StartPoint;
591
                }
592
                else
593
                {
594
                    RegistryPoint(member, members.Count);
595
                }
596

    
597
                if (Common.ViewerDataModel.Instance.MarkupControls_USER.Contains(member))  Common.ViewerDataModel.Instance.MarkupControls_USER.Remove(member); /// remove commment from mycontrols
598
            }
599

    
600
            BorderUpdate();
601
        }
602

    
603
        /// <summary>
604
        /// Border 를 갱신
605
        /// </summary>
606
        public void BorderUpdate()
607
        {
608
            AdornerBorder.MinWidth = 10;
609
            AdornerBorder.MinHeight = 10;
610

    
611
            double minX = double.MaxValue;
612
            double minY = double.MaxValue;
613
            double maxX = double.MinValue;
614
            double maxY = double.MinValue;
615

    
616
            if (this.Members.Count == 1)
617
            {
618
                if (this.Members.First().DrawingData.GetType().Name == "TextControl")
619
                {
620
                    if ((this.Members.First().DrawingData as TextControl).CommentAngle != 0)
621
                    {
622
                        trRotate.Angle = (this.Members.First().DrawingData as TextControl).CommentAngle;
623
                        trRotateThumb.Angle = (this.Members.First().DrawingData as TextControl).CommentAngle;
624
                    }
625
                    else
626
                    {
627
                        trRotate.Angle = 0;
628
                        trRotateThumb.Angle = 0;
629
                    }
630
                }
631
            }
632
            foreach (var item in this.Members)
633
            {
634
                UIElement currentControl = (item as AdornerMember).DrawingData;
635
                if (item.DrawingData.GetType().Name == "TextControl")
636
                {
637
                    double textControlWidth;
638
                    double textControlHeight;
639

    
640
                    if (((currentControl as TextControl).Base_TextBox.ActualWidth) == 0)
641
                    {
642
                        textControlWidth = ((currentControl as TextControl).Base_TextBlock.ActualWidth);
643
                        textControlHeight = ((currentControl as TextControl).Base_TextBlock.ActualHeight);
644
                    }
645
                    else
646
                    {
647
                        textControlWidth = ((currentControl as TextControl).Base_TextBox.ActualWidth);
648
                        textControlHeight = ((currentControl as TextControl).Base_TextBox.ActualHeight);
649
                    }
650
                    
651
                    if ((currentControl as TextControl).EndPoint.X < minX)
652
                    {
653
                        minX = (currentControl as TextControl).EndPoint.X;
654
                    }
655

    
656
                    if ((currentControl as TextControl).EndPoint.Y < minY)
657
                    {
658
                        minY = (currentControl as TextControl).EndPoint.Y;
659
                    }
660

    
661
                    if (textControlWidth + (currentControl as TextControl).EndPoint.X > maxX)
662
                    {
663
                        maxX = textControlWidth + (currentControl as TextControl).EndPoint.X;
664
                    }
665

    
666
                    if (textControlHeight + (currentControl as TextControl).EndPoint.Y > maxY)
667
                    {
668
                        maxY = textControlHeight + (currentControl as TextControl).EndPoint.Y;
669
                    }
670
                }
671
                else if ((currentControl as IViewBox) != null)
672
                {
673
                    IViewBox instance = currentControl as IViewBox;
674
                    List<Point> am = (currentControl as IPath).PointSet;
675
                    List<double> xSet = am.Select(p => p.X).ToList();
676
                    List<double> ySet = am.Select(p => p.Y).ToList();
677
                    if (xSet.Min() < minX) minX = xSet.Min();
678
                    if (ySet.Min() < minY) minY = ySet.Min();
679
                    if (xSet.Max() > maxX) maxX = xSet.Max();
680
                    if (ySet.Max() > maxY) maxY = ySet.Max();
681
                }
682
                else if ((currentControl as IPath).PathData == null)
683
                {
684
                    Rect rt = new Rect
685
                    {
686
                        X = (currentControl as IPath).StartPoint.X,
687
                        Y = (currentControl as IPath).StartPoint.Y,
688
                        Width = Math.Max((currentControl as IPath).EndPoint.X, (currentControl as IPath).StartPoint.X) - Math.Min((currentControl as IPath).EndPoint.X, (currentControl as IPath).StartPoint.X),
689
                        Height = Math.Max((currentControl as IPath).EndPoint.Y, (currentControl as IPath).StartPoint.Y) - Math.Min((currentControl as IPath).EndPoint.Y, (currentControl as IPath).StartPoint.Y),
690
                    };
691
                    if (rt.Left < minX) minX = rt.Left;
692
                    if (rt.Top < minY) minY = rt.Top;
693
                    if (rt.Right > maxX) maxX = rt.Right;
694
                    if (rt.Bottom > maxY) maxY = rt.Bottom;
695
                }
696
                else if ((currentControl as IPath) == null)
697
                {
698
                    Rect rt = new Rect
699
                    {
700
                        X = (currentControl as IPath).StartPoint.X,
701
                        Y = (currentControl as IPath).StartPoint.Y,
702
                        Width = (currentControl as IPath).EndPoint.X - (currentControl as IPath).StartPoint.X,
703
                        Height = (currentControl as IPath).EndPoint.Y - (currentControl as IPath).StartPoint.Y
704
                    };
705
                    if (rt.Left < minX) minX = rt.Left;
706
                    if (rt.Top < minY) minY = rt.Top;
707
                    if (rt.Right > maxX) maxX = rt.Right;
708
                    if (rt.Bottom > maxY) maxY = rt.Bottom;
709
                }
710
                else if ((currentControl as CircleControl) != null)
711
                {                    
712
                    List<Point> am = (currentControl as IPath).PointSet;
713
                    List<double> xSet = am.Select(p => p.X).ToList();
714
                    List<double> ySet = am.Select(p => p.Y).ToList();
715
                    if (xSet.Min() < minX) minX = xSet.Min();
716
                    if (ySet.Min() < minY) minY = ySet.Min();
717
                    if (xSet.Max() > maxX) maxX = xSet.Max();
718
                    if (ySet.Max() > maxY) maxY = ySet.Max();
719
                }
720
                else
721
                {
722
                    if ((currentControl as IPath).PathData.Bounds.Left < minX) minX = (currentControl as IPath).PathData.Bounds.Left;
723
                    if ((currentControl as IPath).PathData.Bounds.Top < minY) minY = (currentControl as IPath).PathData.Bounds.Top;
724
                    if ((currentControl as IPath).PathData.Bounds.Right > maxX) maxX = (currentControl as IPath).PathData.Bounds.Right;
725
                    if ((currentControl as IPath).PathData.Bounds.Bottom > maxY) maxY = (currentControl as IPath).PathData.Bounds.Bottom;
726
                }
727
            }
728

    
729
            Rect ac = new Rect(minX, minY, maxX - minX, maxY - minY);
730
            bool addWidthSize = false;
731
            bool addHeightSize = false;
732
            if (ac.Width <= 10)
733
            {
734
                ac.Width += 10;
735
                addWidthSize = true;
736
            }
737
            if (ac.Height <= 10)
738
            {
739
                ac.Height += 10;
740
                addHeightSize = true;
741
            }
742
            BorderSize = ac;
743
            AdornerBorder.MinWidth = 10;
744
            AdornerBorder.MinHeight = 10;
745
            AdornerBorder.Width = ac.Width;
746
            AdornerBorder.Height = ac.Height;
747
            Canvas.SetLeft(AdornerBorder, minX);
748
            Canvas.SetTop(AdornerBorder, minY);
749

    
750
            DragThumb.Width = ac.Width;
751
            DragThumb.Height = ac.Height;
752

    
753
            DragThumb.MinWidth = 10;
754
            DragThumb.MinHeight = 10;
755
            if (addWidthSize)
756
            {
757
                Canvas.SetLeft(DragThumb, minX - 5);
758
            }
759
            else
760
            {
761
                Canvas.SetLeft(DragThumb, minX);
762
            }
763

    
764
            if (addHeightSize)
765
            {
766
                Canvas.SetTop(DragThumb, minY - 5);
767
            }
768
            else
769
            {
770
                Canvas.SetTop(DragThumb, minY);
771
            }
772
        }
773
        /// <summary>
774
        /// UIElement 해제
775
        /// </summary>
776
        public void unRegister()
777
        {
778
            foreach (var item in this.ContainerContent.Children)
779
            {
780
                if (item is MarkupToPDF.Common.CommentUserInfo)
781
                {
782
                    (item as MarkupToPDF.Common.CommentUserInfo).IsHitTestVisible = true;
783
                }
784
            }
785
            this.ContainerContent.Children.Clear();
786
        }
787

    
788
        /// <summary>
789
        /// 각 포인트들을 등록합니다.
790
        /// </summary>
791
        /// <param name="pointset">Drawing Point</param>
792
        public void RegistryPoint(CommentUserInfo member, int cnt = 1)
793
        {
794
            int count = 0;
795
            double Minx = 100000000;
796
            double Miny = 100000000;
797
            List<Point> list = (member as IPath).PointSet;
798
            if (member.GetType().Name == "InkControl")
799
            {
800
                list.Clear();
801
                list.Add(new Point((member as IPath).PathData.Bounds.X, (member as IPath).PathData.Bounds.Y));
802
                list.Add(new Point((member as IPath).PathData.Bounds.Left, (member as IPath).PathData.Bounds.Bottom));
803
                list.Add(new Point((member as IPath).PathData.Bounds.Right, (member as IPath).PathData.Bounds.Bottom));
804
                list.Add(new Point((member as IPath).PathData.Bounds.Right, (member as IPath).PathData.Bounds.Top));
805
            }
806
            ControlType markT = this.Members.Where(p => p.DrawingData == member).First().Drawingtype;
807
            foreach (var ax in list)
808
            {
809
                Minx = (ax.X < Minx) ? ax.X : Minx;
810
                Miny = (ax.Y < Miny) ? ax.Y : Miny;
811
            }
812
            for (int i = 0; i < list.Count(); i++)
813
            {
814
                MyThumb tm = new MyThumb
815
                {
816
                    Style = (Style)this.LayoutRoot.Resources["ThumbResizeStyle"],
817
                };
818

    
819
                this.Members.Last().ThumbList.Add(tm);
820

    
821
                if ((markT == ControlType.ArcLine && list[i] == (member as ArcControl).MidPoint) || (markT == ControlType.ArcArrow && list[i] == (member as ArrowArcControl).MidPoint))
822
                {
823
                    tm.Style = (Style)this.LayoutRoot.Resources["ThumbArcControlStyle"];
824
                }
825
                if (member.GetType().Name == "ArrowTextControl" && i == 1)
826
                {
827
                    //if (this.Members.Count()<=1)
828
                    //{
829
                    tm.Style = (Style)this.LayoutRoot.Resources["ThumbArcControlStyle"];
830
                    List<Point> ps = new List<Point>();
831

    
832
                    if ((this.Members.First() as AdornerMember).DrawingData as ArrowTextControl != null)
833
                    {
834
                        var temp = (this.Members.First() as AdornerMember).DrawingData as ArrowTextControl;
835

    
836

    
837
                        switch (Math.Abs(temp.CommentAngle).ToString())
838
                        {
839
                            case "90":
840
                                {
841
                                    ps.Clear();
842
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox), Canvas.GetTop(temp.Base_TextBox))); //위 왼쪽
843
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox), Canvas.GetTop(temp.Base_TextBox) - temp.BoxWidth / 2)); // 위 중간
844
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox), Canvas.GetTop(temp.Base_TextBox) - temp.BoxWidth)); // 위 오른쪽
845

    
846
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxHeight / 2, Canvas.GetTop(temp.Base_TextBox))); //왼쪽 중간
847
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxHeight, Canvas.GetTop(temp.Base_TextBox))); //왼쪽 하단
848

    
849
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxHeight, Canvas.GetTop(temp.Base_TextBox) - temp.BoxWidth / 2)); //중간 하단
850
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxHeight, Canvas.GetTop(temp.Base_TextBox) - temp.BoxWidth)); //오른쪽 하단
851

    
852
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxHeight / 2, Canvas.GetTop(temp.Base_TextBox) - temp.BoxWidth)); //오른쪽 중간
853
                                }
854
                                break;
855
                            case "270":
856
                                {
857
                                    ps.Clear();
858
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox), Canvas.GetTop(temp.Base_TextBox))); //위 왼쪽
859
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox), Canvas.GetTop(temp.Base_TextBox) + temp.BoxWidth / 2)); // 위 중간
860
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox), Canvas.GetTop(temp.Base_TextBox) + temp.BoxWidth)); // 위 오른쪽
861

    
862
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) - temp.BoxHeight / 2, Canvas.GetTop(temp.Base_TextBox))); //왼쪽 중간
863
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) - temp.BoxHeight, Canvas.GetTop(temp.Base_TextBox))); //왼쪽 하단
864

    
865
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) - temp.BoxHeight, Canvas.GetTop(temp.Base_TextBox) + temp.BoxWidth / 2)); //중간 하단
866
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) - temp.BoxHeight, Canvas.GetTop(temp.Base_TextBox) + temp.BoxWidth)); //오른쪽 하단
867

    
868
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) - temp.BoxHeight / 2, Canvas.GetTop(temp.Base_TextBox) + temp.BoxWidth)); //오른쪽 중간
869
                                }
870
                                break;
871
                            default:
872
                                {
873
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxWidth / 2, Canvas.GetTop(temp.Base_TextBox))); //상단
874
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxWidth / 2, Canvas.GetTop(temp.Base_TextBox) + temp.BoxHeight)); // 하단
875
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox), Canvas.GetTop(temp.Base_TextBox) + temp.BoxHeight / 2)); //좌단
876
                                    ps.Add(new Point(Canvas.GetLeft(temp.Base_TextBox) + temp.BoxWidth, Canvas.GetTop(temp.Base_TextBox) + temp.BoxHeight / 2));  //우단
877
                                }
878
                                break;
879
                        }
880

    
881
                        ArrowTextControl instance = (member as ArrowTextControl);
882
                        if (instance.isTrans)
883
                        {
884
                            //var endP = MathSet.getNearPoint(ps, temp.MidPoint);
885
                            //var tempP = MathSet.getMiddlePoint(temp.StartPoint, endP);
886
                            //list[count] = tempP;
887
                            list[count] = temp.MidPoint;
888
                        }
889
                        else
890
                        {
891
                            if (temp.isFixed)
892
                            {
893
                                var endP = MathSet.getNearPoint(ps, temp.MidPoint);
894
                                var testP = endP;
895
                                if (ps[0] == endP) //상단
896
                                {
897
                                    testP = new Point(endP.X, endP.Y - 50);
898
                                }
899
                                else if (ps[1] == endP) //하단
900
                                {
901
                                    testP = new Point(endP.X, endP.Y + 50);
902
                                }
903
                                else if (ps[2] == endP) //좌단
904
                                {
905
                                    testP = new Point(endP.X - 50, endP.Y);
906
                                }
907
                                else if (ps[3] == endP) //우단
908
                                {
909
                                    testP = new Point(endP.X + 50, endP.Y);
910
                                }
911
                                list[count] = testP;
912
                            }
913
                            else
914
                            {
915
                                var endP = MathSet.getNearPoint(ps, instance.MidPoint);
916
                                list[count] = MathSet.getMiddlePoint(instance.StartPoint, endP);
917
                            }
918
                        }
919
                    }
920
                }
921
                if (member.GetType().Name == "ArrowTextControl" && list[i] == list.Last())
922
                {
923
                    tm.Style = (Style)this.LayoutRoot.Resources["ThumbTextStyle"];
924
                    tm.Width = (member as ArrowTextControl).BoxWidth;
925
                    tm.Height = (member as ArrowTextControl).BoxHeight;
926
                    var angle = (member as ArrowTextControl).PageAngle;
927
                    if (Math.Abs(angle).ToString() == "90")
928
                    {
929
                        tm.RenderTransformOrigin = new Point(0, 0);
930
                        tm.RenderTransform = new RotateTransform { Angle = 270 };
931
                    }
932
                    else if (Math.Abs(angle).ToString() == "270")
933
                    {
934
                        tm.RenderTransformOrigin = new Point(0, 0);
935
                        tm.RenderTransform = new RotateTransform { Angle = 90 };
936
                    }
937
                    else
938
                    {
939
                        tm.RenderTransformOrigin = new Point(0.5, 0.5);
940
                        tm.RenderTransform = new RotateTransform()
941
                        {
942
                            Angle = angle
943
                        };
944
                    }
945
                }
946
                
947
                if (member.GetType().Name == "CloudControl")
948
                {
949
                    if (i == list.Count() - 1)
950
                    {
951
                        tm.Visibility = System.Windows.Visibility.Collapsed;
952
                    }
953
                }
954
                if (member.GetType().Name == "PolygonControl")
955
                {
956
                    if (i == list.Count() - 1)
957
                    {
958
                        if ((member as PolygonControl).ControlType == ControlType.ChainLine)
959
                        {
960

    
961
                        }
962
                        else
963
                        {
964
                            tm.Visibility = System.Windows.Visibility.Collapsed;
965
                        }
966
                    }
967
                    if ((member as PolygonControl).ControlType == ControlType.Ink)
968
                    {
969
                        tm.Visibility = System.Windows.Visibility.Collapsed;
970
                    }
971
                }
972
                
973
                this.ContainerContent.Children.Add(tm);
974
                Canvas.SetLeft(tm, list[count].X);
975
                Canvas.SetTop(tm, list[count].Y);
976
                if (member.GetType().Name == "ArrowTextControl" && list[i] == (member as ArrowTextControl).MidPoint)
977
                {
978
                    Canvas.SetZIndex(tm, 95);
979
                }
980
                else
981
                {
982
                    Canvas.SetZIndex(tm, 99);
983
                }
984

    
985
                tm.DragStarted += new DragStartedEventHandler(tm_DragStarted);
986
                tm.DragCompleted += new DragCompletedEventHandler(tm_DragCompleted);
987
                tm.DragDelta += ResizeTm_DragDelta;
988
                tm.MouseMove += new MouseEventHandler(resize_MouseMove);
989
                count++;
990
            }
991
        }
992

    
993
        private void ResizeTm_DragDelta(object sender, DragDeltaEventArgs e)
994
        {
995
            if (this.Members.Count > 1) return;
996
            if (reSizePoint != new Point(0, 0))
997
            {
998
                MyThumb thumb = sender as MyThumb;
999
                Point setPoint = new Point(Canvas.GetLeft(thumb), Canvas.GetTop(thumb));
1000
                thumb.Translate(e.HorizontalChange, e.VerticalChange, this.AngleValue);
1001
                
1002
                AdornerMember control = (from userThumb in this.Members
1003
                                         where userThumb.ThumbList.Contains(thumb)
1004
                                         select userThumb).FirstOrDefault();
1005

    
1006
                IPath AllControl = control.DrawingData as IPath;
1007
                ((control.DrawingData) as CommentUserInfo).OnMoveCtrlPoint(setPoint, e.HorizontalChange, e.VerticalChange);
1008
                control.UpdateThumb();
1009
                this.BorderUpdate();
1010
            }
1011
        }
1012

    
1013
        #endregion
1014
        #region 이벤트
1015

    
1016
        void tm_DragCompleted(object sender, DragCompletedEventArgs e)
1017
        {
1018
            this.isDragging = false;
1019
            DraggerThumb = null;
1020

    
1021
            var comments = (from drawing in this.Members
1022
                            select drawing.DrawingData as CommentUserInfo).ToList();
1023
            UndoCommand.Instance.Push(comments, this.AngleValue);
1024
        }
1025

    
1026
        /// <summary>
1027
        /// start drag
1028
        /// </summary>
1029
        /// <param name="sender"></param>
1030
        /// <param name="e"></param>
1031
        void tm_DragStarted(object sender, DragStartedEventArgs e)
1032
        {
1033
            this.DraggerThumb = sender as Thumb;
1034
            this.isDragging = true;
1035

    
1036
            if (ViewerDataModel.Instance.UndoDataList == null)
1037
            {
1038
                return;
1039
            }
1040

    
1041
            if ((null != ViewerDataModel.Instance.UndoDataList.LastOrDefault()) && (ViewerDataModel.Instance.UndoDataList.LastOrDefault().Event == Event_Type.Thumb))
1042
            {
1043
                return;
1044
            }
1045

    
1046
            if ((null != ViewerDataModel.Instance.UndoDataList.LastOrDefault()) && (ViewerDataModel.Instance.UndoDataList.LastOrDefault().Markup_List != null))
1047
            {
1048
                if (ViewerDataModel.Instance.UndoDataList.LastOrDefault().Markup_List.Count > 0)
1049
                {
1050
                    if (ViewerDataModel.Instance.UndoDataList.LastOrDefault().Markup_List.FirstOrDefault().PointSet != null)
1051
                    {
1052
                        return;
1053
                    }
1054
                }
1055
            }
1056

    
1057
            var comments = (from drawing in this.Members
1058
                            select drawing.DrawingData as CommentUserInfo).ToList();
1059
            UndoCommand.Instance.Push(comments, this.AngleValue);
1060
        }
1061

    
1062
        private void rotate_MouseMove(object sender, MouseEventArgs e)
1063
        {
1064
            if ((this.Members.First() as AdornerMember).DrawingData.GetType().Name == "TextControl")
1065
            {
1066
                if (LastRotateVerticalValue < e.GetPosition(this).X)
1067
                    IsTextAngle = true;
1068
                else
1069
                    IsTextAngle = false;
1070
                LastRotateVerticalValue = e.GetPosition(this).X;
1071
            }
1072
            else
1073
            {
1074
                if (e.GetPosition(this).X > LastRotateHorizontalValue)
1075
                {
1076
                    RotateFlag = true;
1077
                }
1078
                else
1079
                {
1080
                    RotateFlag = false;
1081
                }
1082
                LastRotateHorizontalValue = e.GetPosition(this).X;
1083
            }
1084
        }
1085

    
1086
        private void drag_DragStarted(object sender, DragStartedEventArgs e)
1087
        {
1088
            /// save mouse down and current mouse point
1089
            this.MouseDownPoint = Mouse.GetPosition(Window.GetWindow((DependencyObject)sender));
1090
            this.CurrentMousePoint = Mouse.GetPosition(Window.GetWindow((DependencyObject)sender));
1091
            /// up to here
1092

    
1093
            if (ViewerDataModel.Instance.UndoDataList == null)
1094
            {
1095
                return;
1096
            }
1097
            if ((null != ViewerDataModel.Instance.UndoDataList.LastOrDefault()) && (ViewerDataModel.Instance.UndoDataList.LastOrDefault().Event == Event_Type.Thumb))
1098
            {
1099
                return;
1100
            }
1101
            if ((null != ViewerDataModel.Instance.UndoDataList.LastOrDefault()) && (ViewerDataModel.Instance.UndoDataList.LastOrDefault().Markup_List != null))
1102
            {
1103
                if (ViewerDataModel.Instance.UndoDataList.LastOrDefault().Markup_List.Count > 0)
1104
                {
1105
                    if (ViewerDataModel.Instance.UndoDataList.LastOrDefault().Markup_List.FirstOrDefault().PointSet != null)
1106
                    {
1107
                        return;
1108
                    }
1109
                }
1110
            }
1111

    
1112
            var comments = (from drawing in this.Members
1113
                            select drawing.DrawingData as CommentUserInfo).ToList();
1114
            UndoCommand.Instance.Push(comments, this.AngleValue);
1115
        }
1116

    
1117
        private void drag_DragCompleted(object sender, DragCompletedEventArgs e)
1118
        {
1119
            DragThumb.Cursor = new Cursor(MainWindow.CursorChange().StreamSource);
1120

    
1121
            var comments = (from drawing in this.Members
1122
                            select drawing.DrawingData as CommentUserInfo).ToList();
1123
            UndoCommand.Instance.Push(comments, this.AngleValue);
1124
        }
1125

    
1126
        private void DragThumb_DragDelta(object sender, DragDeltaEventArgs e)
1127
        {
1128
            double scale = Common.ViewerDataModel.Instance.SystemMain.dzMainMenu.zoomAndPanControl.ContentScale;
1129
            var tmp = Mouse.GetPosition(Window.GetWindow((DependencyObject)sender));
1130

    
1131
            var horzChange = (tmp.X - this.CurrentMousePoint.X) / scale;/// Math.Round(tmp.X - this.CurrentMousePoint.X) / scale;
1132
            var vertChange = (tmp.Y - this.CurrentMousePoint.Y) / scale;///Math.Round(tmp.Y - this.CurrentMousePoint.Y) / scale;
1133

    
1134
            System.Diagnostics.Debug.WriteLine($"dragThumb : {horzChange},{vertChange}");
1135

    
1136
            try
1137
            {
1138
                DragThumb.Cursor = Cursors.SizeAll;
1139
                this.TranslateItems(horzChange, vertChange);
1140
            }
1141
            finally
1142
            {
1143
                /// update CurrentMousePoint
1144
                this.CurrentMousePoint = tmp;
1145
            }
1146
        }
1147

    
1148
        /// <summary>
1149
        /// translate all members
1150
        /// </summary>
1151
        /// <param name="e"></param>
1152
        public void TranslateItems(double dx, double dy)
1153
        {
1154
            Dispatcher.BeginInvoke((Action)(() =>
1155
            {
1156
                foreach (var item in this.Members)
1157
                {
1158
                    this.TranslateItem(dx, dy, item);
1159
                }
1160
            }));
1161
            this.BorderUpdate();
1162
        }
1163

    
1164
        /// <summary>
1165
        /// translate a item
1166
        /// </summary>
1167
        /// <param name="e"></param>
1168
        /// <param name="item"></param>
1169
        private void TranslateItem(double dx, double dy, AdornerMember item)
1170
        {
1171
            /// rotate point with page rotation
1172
            var rotation = Common.ViewerDataModel.Instance.SystemMain.dzMainMenu.rotate.Angle;
1173
            Point delta = MathSet.RotateAbout(new Point(0, 0), new Point(dx, dy), -rotation);
1174
            /// up to here
1175

    
1176
            (item.DrawingData as CommentUserInfo).OnTranslate(delta.X, delta.Y);
1177

    
1178
            ViewerDataModel.Instance.SystemMain.dzMainMenu.pageNavigator.MarkupListUpdate(
1179
                        MarkupParser.MarkupToString((item.DrawingData as CommentUserInfo), App.ViewInfo.UserID), Event_Type.Thumb, null, null);            
1180

    
1181
            item.UpdateThumb();
1182
        }
1183

    
1184
        private void resize_MouseMove(object sender, MouseEventArgs e)
1185
        {
1186
            reSizePoint = e.GetPosition(this);
1187
        }
1188

    
1189
        /// <summary>
1190
        /// 회전
1191
        /// </summary>
1192
        /// <param name="sender"></param>
1193
        /// <param name="e"></param>
1194
        public void rotate_DragDelta(object sender, DragDeltaEventArgs e)
1195
        {
1196
            MoveRotate(e);
1197
        }
1198

    
1199
        double LastRotateHorizontalValue = 0;
1200
        double LastRotateVerticalValue = 0;
1201
        bool RotateFlag = false;
1202

    
1203
        /// <summary>
1204
        /// <history>humkyung 2018.05.09 upgrade rotate shape peformance</history>
1205
        /// </summary>
1206
        /// <param name="e"></param>
1207
        public void MoveRotate(DragDeltaEventArgs e)
1208
        {
1209
            Point CenterPoint = this.Centeroid;
1210
            Point pt = Mouse.GetPosition(this);
1211

    
1212
            Point vec1 = new Point(this.rotatePoint.X - CenterPoint.X, this.rotatePoint.Y - CenterPoint.Y);
1213
            Point vec2 = new Point(pt.X - CenterPoint.X, pt.Y - CenterPoint.Y);
1214
            double dDeltaAngle = (MathSet.getAngleBetweenVectors(vec1, vec2));
1215

    
1216
            AngleValue += dDeltaAngle;
1217
            if (AngleValue > 360) AngleValue -= 360;
1218
            if (AngleValue < 0) AngleValue += 360;
1219
            this.rotatePoint = pt;  /// save rotatePoint
1220

    
1221
            Dispatcher.BeginInvoke((Action)(() =>
1222
            {
1223
                foreach (var member in this.Members)
1224
                {
1225
                    member.RotateAbout(CenterPoint, dDeltaAngle); 
1226
                    #region 보더 업데이트
1227
                    switch (member.Drawingtype)
1228
                    {
1229
                        case ControlType.TextControl:
1230
                            (member.DrawingData as CommentUserInfo).CommentAngle = AngleValue;
1231

    
1232
                            DragThumb.RenderTransformOrigin = new Point(0, 0);
1233
                            DragThumb.RenderTransform = new RotateTransform()
1234
                            {
1235

    
1236
                                Angle = (member.DrawingData as CommentUserInfo).CommentAngle
1237
                            };
1238

    
1239
                            AdornerBorder.RenderTransformOrigin = new Point(0, 0);
1240
                            AdornerBorder.RenderTransform = new RotateTransform()
1241
                            {
1242
                                Angle = (member.DrawingData as CommentUserInfo).CommentAngle
1243
                            };
1244

    
1245
                            //(member.DrawingData as TextControl).Angle = AngleValue;
1246

    
1247
                            (member.DrawingData as CommentUserInfo).UpdateControl();
1248
                            BorderUpdate();
1249
                            break;
1250

    
1251
                        case ControlType.ArrowMultiLine:
1252
                        case ControlType.ArcLine:
1253
                        case ControlType.ArcArrow:
1254
                        case ControlType.SingleLine:
1255
                        case ControlType.Triangle:
1256
                        case ControlType.ArrowTextControl:
1257
                        case ControlType.PolygonControl:
1258
                        case ControlType.Ink:
1259
                            BorderUpdate();
1260
                            break;
1261
                        case ControlType.Date:
1262
                        case ControlType.RectCloud:
1263
                        case ControlType.Rectangle:
1264
                        case ControlType.ImgControl:
1265
                        case ControlType.Sign:
1266
                        case ControlType.Symbol:
1267
                        case ControlType.Stamp:
1268
                            (member.DrawingData as CommentUserInfo).CommentAngle = AngleValue;
1269
                            BorderUpdate();
1270
                            break;
1271
                        case ControlType.PolygonCloud:
1272
                            ((ICloudControl)member.DrawingData).DrawingCloud();
1273
                            BorderUpdate();
1274
                            break;
1275
                        case ControlType.Circle:
1276
                            (member.DrawingData as CommentUserInfo).CommentAngle = AngleValue;
1277
                            ((CircleControl)member.DrawingData).SetCenterXY();
1278
                            BorderUpdate();
1279
                            break;
1280
                        default:
1281
                            break;
1282
                    }
1283
                }
1284
                #endregion
1285
            }));
1286
        }
1287

    
1288
        private void rotate_DragStarted(object sender, DragStartedEventArgs e)
1289
        {            
1290
            this.rotatePoint = Mouse.GetPosition(this); /// 2018.05.09 added by humkyung
1291
            rotateTop.Cursor = Cursors.SizeAll;
1292

    
1293
            /// get angle from text controls' angle if only text control exists - 2018.05.10 added by humkyung
1294
            if ((1 == this.Members.Count) && (this.Members.First() as AdornerMember).DrawingData.GetType().Name == "TextControl")
1295
            {
1296
                this.AngleValue = ((this.Members.First() as AdornerMember).DrawingData as TextControl).CommentAngle;
1297
            }
1298
            /// up to here
1299

    
1300
            if (ViewerDataModel.Instance.UndoDataList == null)
1301
            {
1302
                return;
1303
            }
1304

    
1305
            if ((ViewerDataModel.Instance.UndoDataList.Count > 0) && ViewerDataModel.Instance.UndoDataList.LastOrDefault().Event == Event_Type.Thumb)
1306
            {
1307
                return;
1308
            }
1309

    
1310
            if ((ViewerDataModel.Instance.UndoDataList.Count > 0) && ViewerDataModel.Instance.UndoDataList.LastOrDefault().Markup_List != null)
1311
            {
1312
                if (ViewerDataModel.Instance.UndoDataList.LastOrDefault().Markup_List.Count > 0)
1313
                {
1314
                    if (ViewerDataModel.Instance.UndoDataList.LastOrDefault().Markup_List.FirstOrDefault().PointSet != null)
1315
                    {
1316
                        return;
1317
                    }
1318
                }
1319
            }
1320

    
1321
            var comments = (from drawing in this.Members
1322
                            select drawing.DrawingData as CommentUserInfo).ToList();
1323
            UndoCommand.Instance.Push(comments, this.AngleValue);
1324
        }
1325
        
1326
        private void rotate_DragCompleted(object sender, DragCompletedEventArgs e)
1327
        {
1328
            rotateTop.Cursor = new Cursor(MainWindow.CursorChange().StreamSource);
1329

    
1330
            var comments = (from drawing in this.Members
1331
                            select drawing.DrawingData as CommentUserInfo).ToList();
1332
            UndoCommand.Instance.Push(comments, this.AngleValue);
1333
        }
1334

    
1335
        public void ControlPointMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
1336
        {
1337
            AdornerMember control = this.Members.FirstOrDefault();
1338

    
1339
            if ((control.DrawingData as ArrowTextControl) != null && DraggerThumb == null)
1340
            {
1341
                if ((control.DrawingData as ArrowTextControl).isTrans == false && (control.DrawingData as ArrowTextControl).isFixed == false)
1342
                {
1343
                    (control.DrawingData as ArrowTextControl).isTrans = true;
1344
                }
1345
            }
1346

    
1347
        }
1348

    
1349
        public void TextControlChanger()
1350
        {
1351
            if ((this.Members.First() as AdornerMember).DrawingData.GetType().Name == "TextControl")
1352
            {
1353
                TextControl AllControl = (this.Members.First() as AdornerMember).DrawingData as TextControl;
1354
                AllControl.Base_TextBox.Focus();
1355
                AllControl.Base_TextBox.Visibility = Visibility.Visible;
1356
                AllControl.Base_TextBlock.Visibility = Visibility.Collapsed;
1357
                AllControl.Base_TextBox.IsHitTestVisible = true;
1358
                AllControl.Base_TextBox.Focus();
1359
                
1360
                Keyboard.Focus(AllControl.Base_TextBox);
1361

    
1362
                AllControl.SizeChanged += (sen, ea) =>
1363
                {
1364
                    if (AllControl.Base_TextBox != null)
1365
                    {
1366
                        RectangleGeometry Data = new RectangleGeometry
1367
                        {
1368
                            Rect = new Rect()
1369
                            {
1370
                                X = AllControl.StartPoint.X,
1371
                                Y = AllControl.StartPoint.Y,
1372
                                Width = AllControl.Base_TextBox.Width,
1373
                                Height = AllControl.Base_TextBox.Height,
1374
                            }
1375
                        };
1376

    
1377
                        Point endPointV = new Point(Data.Bounds.Right, Data.Bounds.Bottom);
1378
                        Point middle = MathSet.getMiddlePoint(AllControl.StartPoint, endPointV);
1379
                        AllControl.Base_Grid.RenderTransform = new RotateTransform()
1380
                        {
1381
                            Angle = AllControl.CommentAngle,
1382
                            CenterX = middle.X,
1383
                            CenterY = middle.Y,
1384
                        };
1385
                    }
1386
                    BorderUpdate();
1387
                };
1388
            }
1389
        }
1390

    
1391
        private void RectThumb_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) //더블클릭
1392
        {
1393
            if (e.ClickCount == 2 && this.Members.Count == 1)
1394
            {
1395

    
1396
                if ((this.Members.First() as AdornerMember).DrawingData.GetType().Name == "TextControl")
1397
                {
1398
                    TextControlChanger();                    
1399
                }
1400

    
1401
                else if ((this.Members.First() as AdornerMember).DrawingData.GetType().Name == "ArrowTextControl")
1402
                {
1403
                    ArrowTextControl AllControl = (this.Members.First() as AdornerMember).DrawingData as ArrowTextControl;
1404
                    Thumb tm = (this.Members.First() as AdornerMember).ThumbList.Last();
1405
                    ((ArrowTextControl)AllControl).Base_TextBox.Focus();
1406

    
1407
                    //ArrowControl TextBox Thumb없애기
1408
                    tm.Visibility = Visibility.Collapsed;
1409

    
1410
                    ((this.Members.First() as AdornerMember).DrawingData as ArrowTextControl).Base_TextBox.IsHitTestVisible = true;
1411
                    
1412
                    ((ArrowTextControl)AllControl).Base_TextBox.SizeChanged += (sen, ea) =>
1413

    
1414
                    {
1415
                        tm.Width = (AllControl as ArrowTextControl).BoxWidth;
1416
                        tm.Height = (AllControl as ArrowTextControl).BoxHeight;
1417

    
1418
                        List<Point> ps = new List<Point>();
1419
                        
1420
                        ps.Add(new Point(Canvas.GetLeft(AllControl.Base_TextBox) + AllControl.BoxWidth / 2, Canvas.GetTop(AllControl.Base_TextBox))); //상단
1421
                        ps.Add(new Point(Canvas.GetLeft(AllControl.Base_TextBox) + AllControl.BoxWidth / 2, Canvas.GetTop(AllControl.Base_TextBox) + AllControl.BoxHeight)); // 하단
1422
                        ps.Add(new Point(Canvas.GetLeft(AllControl.Base_TextBox), Canvas.GetTop(AllControl.Base_TextBox) + AllControl.BoxHeight / 2)); //좌단
1423
                        ps.Add(new Point(Canvas.GetLeft(AllControl.Base_TextBox) + AllControl.BoxWidth, Canvas.GetTop(AllControl.Base_TextBox) + AllControl.BoxHeight / 2));  //우단
1424

    
1425

    
1426

    
1427

    
1428
                        var endP = MathSet.getNearPoint(ps, AllControl.MidPoint);
1429
                        var tempP = MathSet.getMiddlePoint(AllControl.StartPoint, endP);
1430
                        if (AllControl.isTrans)
1431
                        {
1432
                            Canvas.SetLeft((this.Members.First() as AdornerMember).ThumbList[1], AllControl.MidPoint.X);
1433
                            Canvas.SetTop((this.Members.First() as AdornerMember).ThumbList[1], AllControl.MidPoint.Y);
1434
                        }
1435
                        else
1436
                        {
1437
                            Canvas.SetLeft((this.Members.First() as AdornerMember).ThumbList[1], tempP.X);
1438
                            Canvas.SetTop((this.Members.First() as AdornerMember).ThumbList[1], tempP.Y);
1439
                        }
1440

    
1441

    
1442
                        BorderUpdate();
1443

    
1444
                    };
1445
                }
1446
                else if ((this.Members.First() as AdornerMember).DrawingData.GetType().Name == "DateControl")
1447
                {
1448
                    DateControl data = (this.Members.First() as AdornerMember).DrawingData as DateControl;
1449
                    CalendarControl instanceCal = new CalendarControl(data.Text);
1450
                    //dropData.IsOpen = true;
1451
                    RadWindow rc = new RadWindow();
1452
                    rc.Width = 300;
1453
                    rc.Height = 300;
1454
                    rc.Header = "Change Date";
1455
                    rc.Content = instanceCal;
1456
                    rc.BorderThickness = new Thickness(3);
1457
                    rc.ResizeMode = ResizeMode.NoResize;
1458
                    rc.WindowStartupLocation = WindowStartupLocation.CenterScreen;
1459
                    rc.ModalBackground = new SolidColorBrush(Colors.Black);
1460
                    rc.ModalBackground.Opacity = 0.6;
1461
                    Telerik.Windows.Controls.StyleManager.SetTheme(rc, new Telerik.Windows.Controls.Windows8Theme());
1462
                    instanceCal.changeDateCal.SelectionChanged += (sen, ea) =>
1463
                    {
1464
                        data.Text = instanceCal.changeDateCal.SelectedDate.Value.ToShortDateString();
1465
                        rc.Close();
1466
                    };
1467
                    rc.ShowDialog();
1468
                    //CalendarControl.xaml
1469
                }
1470
                else if ((this.Members.First() as AdornerMember).DrawingData.GetType().Name == "ArcControl")
1471
                {
1472
                    ArcControl instance = ((this.Members.First() as AdornerMember).DrawingData as ArcControl);
1473
                    if (instance.isTransOn)
1474
                    {
1475
                        instance.isTransOn = false;
1476
                    }
1477
                    else
1478
                    {
1479
                        instance.isTransOn = true;
1480
                    }
1481
                    ///instance.SetArcPath();
1482
                    BorderUpdate();
1483
                }
1484
                else if ((this.Members.First() as AdornerMember).DrawingData.GetType().Name == "ArrowArcControl")
1485
                {
1486
                    ArrowArcControl instance = ((this.Members.First() as AdornerMember).DrawingData as ArrowArcControl);
1487
                    if (instance.isTransOn)
1488
                    {
1489
                        instance.isTransOn = false;
1490
                    }
1491
                    else
1492
                    {
1493
                        instance.isTransOn = true;
1494
                    }
1495
                    instance.SetArcPath();
1496
                    BorderUpdate();
1497
                }
1498

    
1499
            }
1500
            
1501
        }
1502
        #endregion
1503

    
1504
        private void DragThumb_MouseDoubleClick(object sender, MouseButtonEventArgs e)
1505
        {
1506
            if ((this.Members.First() as AdornerMember).DrawingData.GetType().Name == "TextControl" || (this.Members.First() as AdornerMember).DrawingData.GetType().Name == "ArrowTextControl")
1507
            {
1508
                DragThumb.Visibility = Visibility.Collapsed;
1509
                //((this.Members.First() as AdornerMember).DrawingData as TextControl).BackColor = new SolidColorBrush(Colors.Red);
1510
              
1511
            }
1512
        }
1513
    }
1514
}
클립보드 이미지 추가 (최대 크기: 500 MB)