프로젝트

일반

사용자정보

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

markus / MarkupToPDF / Controls / Text / ArrowTextControl.cs @ fa48eb85

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

1
using MarkupToPDF.Controls.Common;
2
using System;
3
using System.Collections.Generic;
4
using System.ComponentModel;
5
using System.Linq;
6
using System.Text;
7
using System.Threading.Tasks;
8
using System.Windows;
9
using System.Windows.Controls;
10
using System.Windows.Media;
11
using System.Windows.Shapes;
12
using MarkupToPDF.Controls.Custom;
13
using MarkupToPDF.Common;
14
using MarkupToPDF.Serialize.Core;
15
using MarkupToPDF.Serialize.S_Control;
16

    
17
namespace MarkupToPDF.Controls.Text
18
{
19
    public class ArrowTextControl : CommentUserInfo, IDisposable, INotifyPropertyChanged, IPath, ITextControl, IMarkupControlData
20
    {
21
        private const string PART_ArrowPath = "PART_ArrowPath";
22
        private const string PART_TextBox = "PART_ArrowTextBox";
23
        //private const string PART_TextBlock = "PART_ArrowTextBlock";
24
        private const string PART_ArrowSubPath = "PART_ArrowSubPath";
25
        private const string PART_Border = "PART_Border";
26
        private const string PART_BaseTextbox_Caret = "Caret";
27

    
28
        public Path Base_ArrowPath = null;
29
        public Path Base_ArrowSubPath = null;
30
        public TextBox Base_TextBox = null;
31
        public TextBlock Base_TextBlock = null;
32
        public Border BaseTextbox_Caret = null;
33

    
34
        private const double _CloudArcDepth = 0.8;  /// 2018.05.14 added by humkyung
35

    
36
        #region Object & Variable
37
        GeometryGroup instanceGroup = new GeometryGroup();
38
        
39
        Path Cemy = new Path();
40
        LineGeometry connectorSMGeometry = new LineGeometry();
41
        LineGeometry connectorMEGeometry = new LineGeometry();
42

    
43
        public enum ArrowTextStyleSet { Normal, Cloud, Rect };
44

    
45
        #endregion
46

    
47
        static ArrowTextControl()
48
        {
49
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ArrowTextControl), new FrameworkPropertyMetadata(typeof(ArrowTextControl)));
50
            //ResourceDictionary dictionary = new ResourceDictionary();
51
            //dictionary.Source = new Uri("/MarkupToPDF;component/themes/generic.xaml", UriKind.RelativeOrAbsolute);
52
            //if(!Application.Current.Resources.MergedDictionaries.Any(x=>x.Source == dictionary.Source))
53
            //    Application.Current.Resources.MergedDictionaries.Add(dictionary);
54
        }
55

    
56
        public ArrowTextControl()
57
        {
58
            //this.DefaultStyleKey = typeof(ArrowTextControl);
59
        }
60

    
61
        public override void OnApplyTemplate()
62
        {
63
            base.OnApplyTemplate();
64
            Base_ArrowPath = GetTemplateChild(PART_ArrowPath) as Path;
65
            Base_ArrowSubPath = GetTemplateChild(PART_ArrowSubPath) as Path;
66
            Base_TextBox = GetTemplateChild(PART_TextBox) as TextBox;
67
            BaseTextbox_Caret = GetTemplateChild(PART_BaseTextbox_Caret) as Border;
68
            Base_TextBox.Text = this.ArrowText;
69
           
70
            this.Base_TextBox.CaretIndex = this.Base_TextBox.Text.Length;
71
            this.Base_TextBox.CaretBrush = new SolidColorBrush(Colors.Transparent);
72
            this.Base_TextBox.ApplyTemplate();
73
            MoveCustomCaret();
74

    
75
            Base_TextBox.SizeChanged += new SizeChangedEventHandler(Base_TextBox_SizeChanged);
76
            Base_TextBox.GotFocus += new RoutedEventHandler(Base_TextBox_GotFocus);
77
            Base_TextBox.LostFocus += new RoutedEventHandler(Base_TextBox_LostFocus);
78
            Base_TextBox.SelectionChanged += (sender, e) => MoveCustomCaret();
79
            this.KeyDown += ArrowTextControl_KeyDown;
80
            SetArrowTextPath();
81
            Base_TextBox.IsTabStop = true;
82
        }
83

    
84
        private void ArrowTextControl_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
85
        {
86
           if(e.Key == System.Windows.Input.Key.Escape)
87
            {
88
                if(string.IsNullOrEmpty(Base_TextBox.Text))
89
                {
90
                    this.Visibility = Visibility.Collapsed;
91
                }
92

    
93
                EditEnd();
94
            }
95
        }
96

    
97
        public void SetFontFamily(FontFamily fontFamily)
98
        {
99
            this.FontFamily = fontFamily;
100
            this.TextFamily = fontFamily;
101
        }
102

    
103
        /// <summary>
104
        /// Moves the custom caret on the canvas.
105
        /// </summary>
106
        public void MoveCustomCaret()
107
        {
108
            var caretLocation = this.Base_TextBox.GetRectFromCharacterIndex(this.Base_TextBox.CaretIndex).Location;
109

    
110
            var angle = Math.Abs(this.PageAngle);
111
            //angle = 0;
112
            System.Diagnostics.Debug.WriteLine("Page Angle : " +  this.PageAngle);
113

    
114
            if (!double.IsInfinity(caretLocation.X))
115
            {
116
                if (angle == 90)
117
                {
118
                    Canvas.SetLeft(this.BaseTextbox_Caret, this.EndPoint.X + caretLocation.Y);
119
                }
120
                else if (angle == 180)
121
                {
122
                    
123
                    Canvas.SetLeft(this.BaseTextbox_Caret, (this.EndPoint.X+ this.Base_TextBox.ActualWidth) - caretLocation.X) ;
124
                    System.Diagnostics.Debug.WriteLine("Caret X : " + ((this.EndPoint.X + this.Base_TextBox.ActualWidth) - caretLocation.X));
125
                } 
126
                else if (angle == 270)
127
                {
128
                    Canvas.SetLeft(this.BaseTextbox_Caret, (this.EndPoint.X) - caretLocation.Y);
129
                }
130
                else
131
                {
132
                    System.Diagnostics.Debug.WriteLine("Caret X : " + (this.EndPoint.X - caretLocation.X));
133
                    Canvas.SetLeft(this.BaseTextbox_Caret, this.EndPoint.X + caretLocation.X);
134
                } 
135
            }
136

    
137
            if (!double.IsInfinity(caretLocation.Y))
138
            {
139
                if (angle == 90)
140
                {
141
                    Canvas.SetTop(this.BaseTextbox_Caret, this.EndPoint.Y - caretLocation.X);
142
                }
143
                else if (angle == 180)
144
                {//보정치40
145
                    Canvas.SetTop(this.BaseTextbox_Caret, ((this.EndPoint.Y -40) + this.Base_TextBox.ActualHeight)- caretLocation.Y );
146
                    System.Diagnostics.Debug.WriteLine("Caret Y : " + (((this.EndPoint.Y - 40) + this.Base_TextBox.ActualHeight) - caretLocation.Y));
147
                }
148
                else if (angle == 270)
149
                {
150
                    Canvas.SetTop(this.BaseTextbox_Caret, (this.EndPoint.Y) + caretLocation.X);
151
                }
152
                else
153
                {
154
                    Canvas.SetTop(this.BaseTextbox_Caret, this.EndPoint.Y  + caretLocation.Y);
155
                    System.Diagnostics.Debug.WriteLine("Caret Y : " + (this.EndPoint.Y + caretLocation.Y - BaseTextbox_Caret.ActualHeight));
156
                }
157
            }
158
        }
159

    
160
        public void MoveCustomCaret(Point point)
161
        {
162

    
163
            var caretLocation = this.Base_TextBox.GetRectFromCharacterIndex(this.Base_TextBox.CaretIndex).Location;
164

    
165
            if (!double.IsInfinity(caretLocation.X))
166
            {
167
                if (Math.Abs(this.PageAngle) == 90)
168
                {
169
                    Canvas.SetLeft(this.BaseTextbox_Caret, point.X + caretLocation.Y);
170
                }
171
                else if (Math.Abs(this.PageAngle) == 180)
172
                {
173

    
174
                    Canvas.SetLeft(this.BaseTextbox_Caret, (point.X + this.Base_TextBox.ActualWidth) - caretLocation.X);
175
                }
176
                else if (Math.Abs(this.PageAngle) == 270)
177
                {
178
                    Canvas.SetLeft(this.BaseTextbox_Caret, (point.X) - caretLocation.Y);
179
                }
180
                else
181
                {
182
                    Canvas.SetLeft(this.BaseTextbox_Caret, point.X + caretLocation.X);
183
                }
184
            }
185

    
186
            if (!double.IsInfinity(caretLocation.Y))
187
            {
188
                if (Math.Abs(this.PageAngle) == 90)
189
                {
190
                    Canvas.SetTop(this.BaseTextbox_Caret, point.Y - caretLocation.X);
191
                }
192
                else if (Math.Abs(this.PageAngle) == 180)
193
                {
194
                    Canvas.SetTop(this.BaseTextbox_Caret, (point.Y + this.Base_TextBox.ActualHeight) - caretLocation.Y);
195
                }
196
                else if (Math.Abs(this.CommentAngle) == 270)
197
                {
198
                    Canvas.SetTop(this.BaseTextbox_Caret, (point.Y) + caretLocation.X);
199
                }
200
                else
201
                {
202
                    Canvas.SetTop(this.BaseTextbox_Caret, point.Y + caretLocation.Y);
203
                }
204
            }
205
        }
206

    
207

    
208
        void Base_TextBox_LostFocus(object sender, RoutedEventArgs e)
209
        {
210
            EditEnd();
211
        }
212

    
213
        private void EditEnd()
214
        { 
215
            this.ArrowText = Base_TextBox.Text;
216
            Base_TextBox.Focusable = false;
217
            this.BaseTextbox_Caret.Visibility = Visibility.Collapsed;
218
            this.IsEditingMode = false;
219
            ApplyOverViewData();
220
        }
221

    
222
        void Base_TextBox_GotFocus(object sender, RoutedEventArgs e)
223
        {
224
            this.BaseTextbox_Caret.Visibility = Visibility.Visible;
225
            MoveCustomCaret();
226
            this.IsEditingMode = true;
227
        }
228

    
229
        void Base_TextBox_SizeChanged(object sender, SizeChangedEventArgs e)
230
        {
231
            if(this.IsEditingMode)
232
            {
233
                if (Base_TextBox.Text.Contains("|OR||DZ|"))
234
                {
235
                    Base_TextBox.Text = this.ArrowText;
236
                }
237

    
238
                this.ArrowText = Base_TextBox.Text;
239
                
240
            }
241
            BoxWidth = e.NewSize.Width;
242
            BoxHeight = e.NewSize.Height;
243
            SetArrowTextPath();
244
        }
245

    
246
        #region Properties
247
        private bool _IsEditingMode;
248
        public bool IsEditingMode
249
        {
250
            get
251
            {
252
                return _IsEditingMode;
253
            }
254
            set
255
            {
256
                _IsEditingMode = value;
257
                OnPropertyChanged("IsEditingMode");
258
            }
259
        }
260

    
261

    
262
        #endregion
263

    
264
        #region dp Properties
265
        //강인구 주석 풀기
266
        public Visibility TextBoxVisibility
267
        {
268
            get { return (Visibility)GetValue(TextBoxVisibilityProperty); }
269
            set
270
            {
271
                if (this.TextBoxVisibility != value)
272
                {
273
                    SetValue(TextBoxVisibilityProperty, value);
274
                    OnPropertyChanged("TextBoxVisibility");
275
                }
276
            }
277
        }
278

    
279
        //강인구 주석 풀기
280
        public Visibility TextBlockVisibility
281
        {
282
            get { return (Visibility)GetValue(TextBlockVisibilityProperty); }
283
            set
284
            {
285
                if (this.TextBlockVisibility != value)
286
                {
287
                    SetValue(TextBlockVisibilityProperty, value);
288
                    OnPropertyChanged("TextBlockVisibility");
289
                }
290
            }
291
        }
292

    
293

    
294
        public override SolidColorBrush StrokeColor
295
        {
296
            get { return (SolidColorBrush)GetValue(StrokeColorProperty); }
297
            set
298
            {
299
                if (this.StrokeColor != value)
300
                {
301
                    SetValue(StrokeColorProperty, value);
302
                }
303
            }
304
        }
305

    
306
        public PathGeometry SubPathData
307
        {
308
            get { return (PathGeometry)GetValue(SubPathDataProperty); }
309
            set
310
            {
311
                if (this.SubPathData != value)
312
                {
313
                    SetValue(SubPathDataProperty, value);
314
                }
315
            }
316
        }
317

    
318
        public string UserID
319
        {
320
            get { return (string)GetValue(UserIDProperty); }
321
            set
322
            {
323
                if (this.UserID != value)
324
                {
325
                    SetValue(UserIDProperty, value);
326
                    OnPropertyChanged("UserID");
327
                }
328
            }
329
        }
330

    
331
        public List<Point> PointSet
332
        {
333
            get { return (List<Point>)GetValue(PointSetProperty); }
334
            set { SetValue(PointSetProperty, value); }
335
        }
336

    
337
        public override bool IsSelected
338
        {
339
            get
340
            {
341
                return (bool)GetValue(IsSelectedProperty);
342
            }
343
            set
344
            {
345
                SetValue(IsSelectedProperty, value);
346
                OnPropertyChanged("IsSelected");
347
            }
348
        }
349

    
350
        public override ControlType ControlType
351
        {
352
            set
353
            {
354
                SetValue(ControlTypeProperty, value);
355
                OnPropertyChanged("ControlType");
356
            }
357
            get
358
            {
359
                return (ControlType)GetValue(ControlTypeProperty);
360
            }
361
        }
362

    
363
        public Point StartPoint
364
        {
365
            get { return (Point)GetValue(StartPointProperty); }
366
            set { SetValue(StartPointProperty, value); }
367
        }
368

    
369
        public Point EndPoint
370
        {
371
            get { return (Point)GetValue(EndPointProperty); }
372
            set { SetValue(EndPointProperty, value); }
373
        }
374

    
375
        public Point OverViewStartPoint
376
        {
377
            get { return (Point)GetValue(OverViewStartPointProperty); }
378
            set { SetValue(OverViewStartPointProperty, value); }
379
        }
380

    
381
        public Point OverViewEndPoint
382
        {
383
            get { return (Point)GetValue(OverViewEndPointProperty); }
384
            set { SetValue(OverViewEndPointProperty, value); }
385
        }
386

    
387

    
388
        //public double Angle
389
        //{
390
        //    get { return (double)GetValue(AngleProperty); }
391
        //    set { SetValue(AngleProperty, value); }
392
        //}
393

    
394
        public Thickness BorderSize
395
        {
396
            get { return (Thickness)GetValue(BorderSizeProperty); }
397
            set
398
            {
399
                if (this.BorderSize != value)
400
                {
401
                    SetValue(BorderSizeProperty, value);
402
                }
403
            }
404
        }
405

    
406

    
407
        public Point MidPoint
408
        {
409
            get { return (Point)GetValue(MidPointProperty); }
410
            set { SetValue(MidPointProperty, value); }
411
        }
412

    
413
        public bool isFixed
414
        {
415
            get { return (bool)GetValue(IsFixedProperty); }
416
            set { SetValue(IsFixedProperty, value); }
417
        }
418

    
419
        public bool isTrans
420
        {
421
            get { return (bool)GetValue(TransformerProperty); }
422
            set { SetValue(TransformerProperty, value); }
423
        }
424

    
425
        public bool isHighLight
426
        {
427
            get { return (bool)GetValue(isHighlightProperty); }
428
            set
429
            {
430
                if (this.isHighLight != value)
431
                {
432
                    SetValue(isHighlightProperty, value);
433
                    OnPropertyChanged("isHighLight");
434
                }
435
            }
436
        }
437

    
438
        public FontWeight TextWeight
439
        {
440
            get { return (FontWeight)GetValue(TextWeightProperty); }
441
            set
442
            {
443
                if (this.TextWeight != value)
444
                {
445
                    SetValue(TextWeightProperty, value);
446
                    OnPropertyChanged("TextWeight");
447
                }
448
            }
449
        }
450

    
451
        public Double LineSize
452
        {
453
            get { return (Double)GetValue(LineSizeProperty); }
454
            set
455
            {
456
                if (this.LineSize != value)
457
                {
458
                    SetValue(LineSizeProperty, value);
459
                }
460
            }
461
        }
462

    
463
        public Double BoxWidth
464
        {
465
            get { return (Double)GetValue(BoxWidthProperty); }
466
            set
467
            {
468
                if (this.BoxWidth != value)
469
                {
470
                    SetValue(BoxWidthProperty, value);
471
                }
472
            }
473
        }
474

    
475
        public Double BoxHeight
476
        {
477
            get { return (Double)GetValue(BoxHeightProperty); }
478
            set
479
            {
480
                if (this.BoxHeight != value)
481
                {
482
                    SetValue(BoxHeightProperty, value);
483
                }
484
            }
485
        }
486

    
487
        public ArrowTextStyleSet ArrowTextStyle
488
        {
489
            get { return (ArrowTextStyleSet)GetValue(ArrowTextStyleProperty); }
490
            set
491
            {
492
                if (this.ArrowTextStyle != value)
493
                {
494
                    SetValue(ArrowTextStyleProperty, value);
495
                }
496
            }
497
        }
498

    
499
        public Geometry PathData
500
        {
501
            get { return (Geometry)GetValue(PathDataProperty); }
502
            set { SetValue(PathDataProperty, value);
503

    
504
                OnPropertyChanged("PathData");
505
            }
506
        }
507

    
508
        public SolidColorBrush BackInnerColor
509
        {
510
            get { return (SolidColorBrush)GetValue(BackInnerColorProperty); }
511
            set
512
            {
513
                if (this.BackInnerColor != value)
514
                {
515
                    SetValue(BackInnerColorProperty, value);
516
                    OnPropertyChanged("BackInnerColor");
517
                }
518
            }
519
        }
520

    
521
        public Geometry PathDataInner
522
        {
523
            get { return (Geometry)GetValue(PathDataInnerProperty); }
524
            set
525
            {
526
                SetValue(PathDataInnerProperty, value);
527
                OnPropertyChanged("PathDataInner");
528
            }
529
        }
530

    
531
        public Geometry OverViewPathData
532
        {
533
            get { return (Geometry)GetValue(OverViewPathDataProperty); }
534
            set { SetValue(OverViewPathDataProperty, value);
535

    
536
                OnPropertyChanged("OverViewPathData");
537

    
538
            }
539
        }
540

    
541
        public FontFamily TextFamily
542
        {
543
            get { return (FontFamily)GetValue(TextFamilyProperty); }
544
            set
545
            {
546
                if (this.TextFamily != value)
547
                {
548
                    SetValue(TextFamilyProperty, value);
549
                    OnPropertyChanged("TextFamily");
550
                }
551
            }
552
        }
553

    
554
        public string ArrowText
555
        {
556
            get { return (string)GetValue(ArrowTextProperty); }
557
            set
558
            {
559
                if (this.ArrowText != value)
560
                {
561
                    SetValue(ArrowTextProperty, value);
562
                    OnPropertyChanged("ArrowText");
563
                }
564
            }
565
        }
566

    
567
        public string OverViewArrowText
568
        {
569

    
570
            get { return (string)GetValue(OverViewArrowTextProperty);
571
            }
572
            set
573
            {
574
                if (this.OverViewArrowText != value)
575
                {
576
                    SetValue(OverViewArrowTextProperty, value);
577
                    OnPropertyChanged("OverViewArrowText");
578
                }
579
            }
580
        }
581

    
582
        public Double TextSize
583
        {
584
            get { return (Double)GetValue(TextSizeProperty); }
585
            set
586
            {
587
                if (this.TextSize != value)
588
                {
589
                    SetValue(TextSizeProperty, value);
590
                    OnPropertyChanged("TextSize");
591
                }
592
            }
593
        }
594

    
595
        public FontStyle TextStyle
596
        {
597
            get { return (FontStyle)GetValue(TextStyleProperty); }
598
            set
599
            {
600
                if (this.TextStyle != value)
601
                {
602
                    SetValue(TextStyleProperty, value);
603
                    OnPropertyChanged("TextStyle");
604
                }
605
            }
606
        }
607

    
608
        //강인구 추가
609
        public TextDecorationCollection UnderLine
610
        {
611
            get
612
            {
613
                return (TextDecorationCollection)GetValue(UnderLineProperty);
614
            }
615
            set
616
            {
617
                if (this.UnderLine != value)
618
                {
619
                    SetValue(UnderLineProperty, value);
620
                    OnPropertyChanged("UnderLine");
621
                }
622
            }
623
        }
624

    
625
        public double CanvasX
626
        {
627
            get { return (double)GetValue(CanvasXProperty); }
628
            set
629
            {
630
                if (this.CanvasX != value)
631
                {
632
                    SetValue(CanvasXProperty, value);
633
                    OnPropertyChanged("CanvasX");
634
                }
635
            }
636
        }
637

    
638
        public double CanvasY
639
        {
640
            get { return (double)GetValue(CanvasYProperty); }
641
            set
642
            {
643
                if (this.CanvasY != value)
644
                {
645
                    SetValue(CanvasYProperty, value);
646
                    OnPropertyChanged("CanvasY");
647
                }
648
            }
649
        } 
650

    
651
        public double CenterX
652
        {
653
            get { return (double)GetValue(CenterXProperty); }
654
            set { SetValue(CenterXProperty, value);
655
            OnPropertyChanged("CenterX");
656
            
657
            }
658
        }
659

    
660
        public double CenterY
661
        {
662
            get { return (double)GetValue(CenterYProperty); }
663
            set { SetValue(CenterYProperty, value);
664
            OnPropertyChanged("CenterY");
665
            }
666
        }
667

    
668
        public Brush SubPathFill
669
        {
670
            get { return (Brush)GetValue(SubPathFillProperty); }
671
            set
672
            {
673
                SetValue(SubPathFillProperty, value);
674
                OnPropertyChanged("SubPathFill");
675
            }
676
        }
677

    
678
        public Brush TextBoxBackground
679
        {
680
            get { return (Brush)GetValue(TextBoxBackgroundProperty); }
681
            set
682
            {
683
                SetValue(TextBoxBackgroundProperty, value);
684
                OnPropertyChanged("TextBoxBackground");
685
            }
686
        }
687

    
688

    
689
        //강인구 추가 주석풀기
690
       
691

    
692
        public bool EnableEditing
693
        {
694
            get { return (bool)GetValue(EnableEditingProperty); }
695
            set
696
            {
697
                if (this.EnableEditing != value)
698
                {
699
                    SetValue(EnableEditingProperty, value);
700
                    OnPropertyChanged("EnableEditing");
701
                }
702
            }
703
        }
704

    
705
        #endregion
706

    
707
        #region Dependency Properties
708

    
709
        public static readonly DependencyProperty BoxWidthProperty = DependencyProperty.Register(
710
                "BoxWidth", typeof(double), typeof(ArrowTextControl), new PropertyMetadata((Double)20));
711

    
712
        public static readonly DependencyProperty BoxHeightProperty = DependencyProperty.Register(
713
                "BoxHeight", typeof(double), typeof(ArrowTextControl), new PropertyMetadata((Double)20));
714

    
715
        public static readonly DependencyProperty UserIDProperty = DependencyProperty.Register(
716
                "UserID", typeof(string), typeof(ArrowTextControl), new PropertyMetadata(null));
717

    
718
        public static readonly DependencyProperty ArrowTextStyleProperty = DependencyProperty.Register(
719
               "ArrowTextStyle", typeof(ArrowTextStyleSet), typeof(ArrowTextControl), new PropertyMetadata(ArrowTextStyleSet.Normal));
720

    
721
        public static readonly DependencyProperty CenterXProperty = DependencyProperty.Register(
722
                "CenterX", typeof(double), typeof(ArrowTextControl), new PropertyMetadata((double)0, OnCenterXYChanged));
723

    
724
        public static readonly DependencyProperty CenterYProperty = DependencyProperty.Register(
725
                "CenterY", typeof(double), typeof(ArrowTextControl), new PropertyMetadata((double)0, OnCenterXYChanged));
726

    
727
        public static readonly DependencyProperty AngleProperty = DependencyProperty.Register(
728
                "Angle", typeof(double), typeof(ArrowTextControl), new PropertyMetadata((double)0.0, new PropertyChangedCallback(PointValueChanged)));
729
        
730
        public static readonly DependencyProperty CanvasXProperty = DependencyProperty.Register(
731
                "CanvasX", typeof(double), typeof(ArrowTextControl), new PropertyMetadata((double)0, OnSetCansvasChanged));
732

    
733
        public static readonly DependencyProperty CanvasYProperty = DependencyProperty.Register(
734
                "CanvasY", typeof(double), typeof(ArrowTextControl), new PropertyMetadata((double)0, OnSetCansvasChanged));
735

    
736
        public static readonly DependencyProperty PointSetProperty = DependencyProperty.Register(
737
                "PointSet", typeof(List<Point>), typeof(ArrowTextControl), new PropertyMetadata(new List<Point>(), PointValueChanged));
738

    
739
        public static readonly DependencyProperty TextFamilyProperty = DependencyProperty.Register(
740
                "TextFamily", typeof(FontFamily), typeof(ArrowTextControl), new PropertyMetadata(new FontFamily("Arial"), TextChanged));
741

    
742
        public static readonly DependencyProperty PathDataProperty = DependencyProperty.Register(
743
                "PathData", typeof(Geometry), typeof(ArrowTextControl), null);
744

    
745
        //강인구 추가
746
        public static readonly DependencyProperty UnderLineProperty = DependencyProperty.Register(
747
    "UnderLine", typeof(TextDecorationCollection), typeof(ArrowTextControl), new PropertyMetadata(null, PointValueChanged));
748

    
749
        public static readonly DependencyProperty LineSizeProperty = DependencyProperty.Register(
750
               "LineSize", typeof(double), typeof(ArrowTextControl), new PropertyMetadata((Double)3, PointValueChanged));
751

    
752
        public static readonly DependencyProperty TextStyleProperty = DependencyProperty.Register(
753
                "TextStyle", typeof(FontStyle), typeof(ArrowTextControl), new PropertyMetadata(FontStyles.Normal));
754

    
755
        public static readonly DependencyProperty TextSizeProperty = DependencyProperty.Register(
756
                "TextSize", typeof(Double), typeof(ArrowTextControl), new PropertyMetadata((Double)30, PointValueChanged));
757

    
758
        public static readonly DependencyProperty TextWeightProperty = DependencyProperty.Register(
759
                "TextWeight", typeof(FontWeight), typeof(ArrowTextControl), new PropertyMetadata(FontWeights.Normal));
760

    
761
        public static readonly DependencyProperty IsFixedProperty = DependencyProperty.Register(
762
                "isFixed", typeof(bool), typeof(ArrowTextControl), new PropertyMetadata(false, PointValueChanged));
763

    
764
        public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register(
765
                "IsSelected", typeof(bool), typeof(ArrowTextControl), new FrameworkPropertyMetadata(false, IsSelectedChanged));
766

    
767
        public static readonly DependencyProperty StrokeColorProperty = DependencyProperty.Register(
768
                "StrokeColor", typeof(SolidColorBrush), typeof(ArrowTextControl), new PropertyMetadata(new SolidColorBrush(Colors.Red)));
769

    
770
        public static readonly DependencyProperty ControlTypeProperty = DependencyProperty.Register(
771
                "ControlType", typeof(ControlType), typeof(ArrowTextControl), new FrameworkPropertyMetadata(ControlType.ArrowTextControl));
772

    
773
        public static readonly DependencyProperty StartPointProperty = DependencyProperty.Register(
774
                "StartPoint", typeof(Point), typeof(ArrowTextControl), new PropertyMetadata(new Point(0, 0), PointValueChanged));
775

    
776
        public static readonly DependencyProperty EndPointProperty = DependencyProperty.Register(
777
                "EndPoint", typeof(Point), typeof(ArrowTextControl), new PropertyMetadata(new Point(0, 0), PointValueChanged));
778

    
779
        public static readonly DependencyProperty BackInnerColorProperty = DependencyProperty.Register(
780
            "BackInnerColor", typeof(SolidColorBrush), typeof(ArrowTextControl), new PropertyMetadata(new SolidColorBrush(Colors.White)));
781

    
782
        public static readonly DependencyProperty PathDataInnerProperty = DependencyProperty.Register(
783
    "PathDataInner", typeof(Geometry), typeof(ArrowTextControl), null);
784

    
785
        public static readonly DependencyProperty isHighlightProperty = DependencyProperty.Register(
786
                "isHighlight", typeof(bool), typeof(ArrowTextControl), new PropertyMetadata(false, PointValueChanged));
787

    
788
        public static readonly DependencyProperty MidPointProperty = DependencyProperty.Register(
789
                "MidPoint", typeof(Point), typeof(ArrowTextControl), new PropertyMetadata(new Point(0, 0), PointValueChanged));
790

    
791
        public static readonly DependencyProperty TransformerProperty = DependencyProperty.Register(
792
                "isTrans", typeof(bool), typeof(ArrowTextControl), new PropertyMetadata(false, PointValueChanged));
793

    
794
        public static readonly DependencyProperty BorderSizeProperty = DependencyProperty.Register(
795
                "BorderSize", typeof(Thickness), typeof(ArrowTextControl), new PropertyMetadata(new Thickness(0), PointValueChanged));
796
    
797
        public static readonly DependencyProperty ArrowTextProperty = DependencyProperty.Register(
798
              "ArrowText", typeof(string), typeof(ArrowTextControl), new PropertyMetadata(null));
799

    
800

    
801

    
802
        //, new PropertyChangedCallback(TextChanged)
803

    
804

    
805
        #region 추가 사항
806
        public static readonly DependencyProperty SubPathDataProperty = DependencyProperty.Register(
807
                "SubPathData", typeof(Geometry), typeof(ArrowTextControl), null);
808

    
809

    
810
        public static readonly DependencyProperty SubPathFillProperty = DependencyProperty.Register(
811
                "SubPathFill", typeof(Brush), typeof(ArrowTextControl), new PropertyMetadata(null));
812

    
813
        public static readonly DependencyProperty TextBoxBackgroundProperty = DependencyProperty.Register(
814
                "TextBoxBackground", typeof(Brush), typeof(ArrowTextControl), new PropertyMetadata(Brushes.White));
815

    
816
        public static readonly DependencyProperty OverViewArrowTextProperty = DependencyProperty.Register(
817
                "OverViewArrowText", typeof(string), typeof(ArrowTextControl), new PropertyMetadata(null, new PropertyChangedCallback(TextChanged)));
818

    
819
        public static readonly DependencyProperty OverViewPathDataProperty = DependencyProperty.Register(
820
                "OverViewPathData", typeof(Geometry), typeof(ArrowTextControl), null);
821

    
822
        public static readonly DependencyProperty OverViewStartPointProperty = DependencyProperty.Register(
823
                "OverViewStartPoint", typeof(Point), typeof(ArrowTextControl), new PropertyMetadata(null));
824

    
825
        public static readonly DependencyProperty OverViewEndPointProperty = DependencyProperty.Register(
826
                "OverViewEndPoint", typeof(Point), typeof(ArrowTextControl), new PropertyMetadata(null));
827

    
828
        public static readonly DependencyProperty TextBoxVisibilityProperty = DependencyProperty.Register(
829
            "TextBoxVisibility", typeof(Visibility), typeof(ArrowTextControl), new PropertyMetadata((Visibility.Visible), OnTextBoxVisibilityChanged));
830

    
831
        //강인구 추가(주석풀기)
832
        public static readonly DependencyProperty TextBlockVisibilityProperty = DependencyProperty.Register(
833
            "TextBlockVisibility", typeof(Visibility), typeof(ArrowTextControl), new PropertyMetadata((Visibility.Collapsed), OnTextBlockVisibilityChanged));
834

    
835
        public static readonly DependencyProperty EnableEditingProperty = DependencyProperty.Register(
836
           "EnableEditing", typeof(bool), typeof(ArrowTextControl), new PropertyMetadata((true), new PropertyChangedCallback(OnIsEditingChanged)));
837

    
838
        #endregion
839

    
840
        #endregion
841

    
842
        #region CallBack Method
843

    
844
        //강인구 추가(주석풀기)
845
        public static void OnIsEditingChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
846
        {
847
            var instance = (ArrowTextControl)sender;
848

    
849
            if (e.OldValue != e.NewValue && instance.Base_TextBlock != null)
850
            {
851
                instance.SetValue(e.Property, e.NewValue);
852

    
853
                if (instance.EnableEditing)
854
                {
855
                    instance.EditingMode();
856
                }
857
                else
858
                {
859
                    instance.UnEditingMode();
860
                }
861
            }
862
        }
863

    
864
        public static void OnTextBoxVisibilityChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
865
        {
866
            var instance = (ArrowTextControl)sender;
867

    
868
            if (e.OldValue != e.NewValue && instance.Base_ArrowPath != null)
869
            {
870
                instance.SetValue(e.Property, e.NewValue);
871
            }
872
        }
873

    
874
        public static void OnTextBlockVisibilityChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
875
        {
876
            var instance = (ArrowTextControl)sender;
877

    
878
            if (e.OldValue != e.NewValue && instance.Base_ArrowPath != null)
879
            {
880
                instance.SetValue(e.Property, e.NewValue);
881
            }
882
        }
883

    
884
        public static void PointValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
885
        {
886
            var instance = (ArrowTextControl)sender;
887

    
888
            if (e.OldValue != e.NewValue && instance.Base_ArrowPath != null)
889
            {
890
                instance.SetArrowTextPath();
891
            }
892
        }
893

    
894

    
895

    
896
        public static void TextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
897
        {
898
            var instance = (ArrowTextControl)sender;
899
            
900
            if (e.OldValue != e.NewValue)
901
            {
902
                instance.SetValue(e.Property, e.NewValue);
903
                //instance.BoxWidth = instance.Base_TextBox.ActualWidth;
904
                //instance.BoxHeight = instance.Base_TextBox.ActualHeight;
905
            }
906
        }
907

    
908
        public static void OnCenterXYChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
909
        {
910
            var instance = (ArrowTextControl)sender;
911
            if (e.OldValue != e.NewValue && instance.Base_ArrowPath != null)
912
            {
913
                instance.SetValue(e.Property, e.NewValue);
914
                instance.SetArrowTextPath();
915
            }
916
        }
917

    
918
        public static void OnSetCansvasChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
919
        {
920
            var instance = (ArrowTextControl)sender;
921

    
922
            if (e.OldValue != e.NewValue && instance != null)
923
            {
924
                instance.SetValue(e.Property, e.NewValue);
925
                //Canvas.SetLeft(instance, instance.CanvasX);
926
                //Canvas.SetTop(instance, instance.CanvasY);
927
            }
928
        }
929

    
930
        public static void IsSelectedChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
931
        {
932
            //var instance = (ArrowTextControl)sender;
933

    
934
            //if (e.OldValue != e.NewValue)
935
            //{
936
            //    instance.SetValue(e.Property, e.NewValue);
937

    
938
            //    if (instance.IsSelected && instance.Base_TextBox != null)
939
            //    {
940
            //        instance.BorderSize = new Thickness(1);
941
            //        //instance.Base_TextBox.BorderBrush = new SolidColorBrush(Colors.Blue);
942
            //        //instance.Base_ArrowPath.Stroke = new SolidColorBrush(Colors.Blue);
943
            //    }
944
            //    else
945
            //    {
946
            //        instance.BorderSize = new Thickness(0);
947
            //        //instance.Base_TextBox.BorderBrush = new SolidColorBrush(Colors.Transparent);
948
            //        //instance.Base_ArrowPath.Stroke = new SolidColorBrush(Colors.Transparent);
949
            //    }
950
            //}
951
        }
952
        #endregion
953

    
954
        #region Internal Method
955

    
956
        //강인구 주석 풀기
957
        public void EditingMode()
958
        {
959
            TextBoxVisibility = Visibility.Visible;
960
            TextBlockVisibility = Visibility.Collapsed;
961

    
962

    
963
            //강인구 언더라인 추가
964
            if (UnderLine != null)
965
                Base_TextBlock.TextDecorations = UnderLine;
966
        }
967
        //강인구 주석 풀기
968
        public void UnEditingMode()
969
        {
970

    
971
            TextBoxVisibility = Visibility.Collapsed;
972
            TextBlockVisibility = Visibility.Visible;
973

    
974
            if (UnderLine != null)
975
                Base_TextBlock.TextDecorations = UnderLine;
976

    
977
            Base_TextBlock.Margin =
978
                 new Thickness(Base_TextBox.Margin.Left + 4, Base_TextBox.Margin.Top + 4,
979
                     Base_TextBox.Margin.Right + 4, Base_TextBox.Margin.Bottom + 4);
980
        }
981

    
982
        private void SetArrowTextPath()
983
        {
984
            instanceGroup.Children.Clear();
985

    
986
            //VisualPageAngle = 0;
987

    
988
            if (Math.Abs(PageAngle).ToString() == "90")
989
            {
990
                VisualPageAngle = 270;
991
            }
992
            else if (Math.Abs(PageAngle).ToString() == "270")
993
            {
994
                VisualPageAngle = 90;
995
            }
996
            else
997
            {
998
                VisualPageAngle = PageAngle;
999
            }
1000

    
1001
            connectorSMGeometry.StartPoint = this.StartPoint;
1002
            connectorSMGeometry.EndPoint = this.MidPoint;
1003
            connectorMEGeometry.StartPoint = this.MidPoint; //핵심
1004

    
1005
            /// 텍스트박스의 좌표 설정
1006
            Canvas.SetLeft(Base_TextBox, this.EndPoint.X);
1007
            Canvas.SetTop(Base_TextBox, this.EndPoint.Y);
1008
            System.Diagnostics.Debug.WriteLine($"TextBox Set {this.EndPoint.X},{this.EndPoint.Y}");
1009
            
1010

    
1011
            List<Point> ps = new List<Point>();
1012
            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxWidth / 2, Canvas.GetTop(Base_TextBox))); //상단
1013
            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxWidth / 2, Canvas.GetTop(Base_TextBox) + this.BoxHeight)); // 하단
1014
            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) + this.BoxHeight / 2)); //좌단
1015
            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxWidth, Canvas.GetTop(Base_TextBox) + this.BoxHeight / 2));  //우단
1016

    
1017
            if (isTrans)
1018
            {
1019
                switch (Math.Abs(this.PageAngle).ToString())
1020
                {
1021
                    case "90":
1022
                        {
1023
                            ps.Clear();
1024
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox))); //위 왼쪽
1025
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) - this.BoxWidth / 2)); // 위 중간
1026
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) - this.BoxWidth)); // 위 오른쪽
1027

    
1028
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight / 2, Canvas.GetTop(Base_TextBox))); //왼쪽 중간
1029
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight, Canvas.GetTop(Base_TextBox))); //왼쪽 하단
1030

    
1031
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight, Canvas.GetTop(Base_TextBox) - this.BoxWidth / 2)); //중간 하단
1032
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight, Canvas.GetTop(Base_TextBox) - this.BoxWidth)); //오른쪽 하단
1033

    
1034
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight / 2, Canvas.GetTop(Base_TextBox) - this.BoxWidth)); //오른쪽 중간
1035
                        }
1036
                        break;
1037
                    case "270":
1038
                        {
1039
                            ps.Clear();
1040
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox))); //위 왼쪽
1041
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) + this.BoxWidth / 2)); // 위 중간
1042
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) + this.BoxWidth)); // 위 오른쪽
1043

    
1044
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) - this.BoxHeight / 2, Canvas.GetTop(Base_TextBox))); //왼쪽 중간
1045
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) - this.BoxHeight, Canvas.GetTop(Base_TextBox))); //왼쪽 하단
1046

    
1047
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) - this.BoxHeight, Canvas.GetTop(Base_TextBox) + this.BoxWidth / 2)); //중간 하단
1048
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) - this.BoxHeight, Canvas.GetTop(Base_TextBox) + this.BoxWidth)); //오른쪽 하단
1049

    
1050
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) - this.BoxHeight / 2, Canvas.GetTop(Base_TextBox) + this.BoxWidth)); //오른쪽 중간
1051
                        }
1052
                        break;
1053
                    default:
1054
                        break;
1055
                }
1056
                
1057
                var endP = MathSet.getNearPoint(ps, this.MidPoint);
1058

    
1059
                //20180911 LJY 꺾이는 부분 수정
1060
                Point testP = endP;                
1061
                switch (Math.Abs(this.PageAngle).ToString())
1062
                {
1063
                    case "90":
1064
                        testP = new Point(endP.X + 50, endP.Y);
1065
                        break;
1066
                    case "270":
1067
                        testP = new Point(endP.X - 50, endP.Y);
1068
                        break;
1069
                }                
1070

    
1071
                //20180910 LJY 각도에 따라.
1072
                switch (Math.Abs(this.PageAngle).ToString())
1073
                {
1074
                    case "90":
1075
                        if (isFixed)
1076
                        {
1077
                            if (ps[0] == endP) //상단
1078
                            {
1079
                                testP = new Point(endP.X , endP.Y + 50);
1080
                                //System.Diagnostics.Debug.WriteLine("상단"+ testP);
1081
                            }
1082
                            else if (ps[1] == endP) //하단
1083
                            {
1084
                                testP = new Point(endP.X , endP.Y - 50);
1085
                                //System.Diagnostics.Debug.WriteLine("하단"+ testP);
1086
                            }
1087
                            else if (ps[2] == endP) //좌단
1088
                            {
1089
                                testP = new Point(endP.X - 50, endP.Y);
1090
                                //System.Diagnostics.Debug.WriteLine("좌단"+ testP);
1091
                            }
1092
                            else if (ps[3] == endP) //우단
1093
                            {
1094
                                testP = new Point(endP.X + 50, endP.Y);
1095
                                //System.Diagnostics.Debug.WriteLine("우단"+ testP);
1096
                            }
1097
                        }
1098
                        break;
1099
                    case "270":
1100
                        if (isFixed)
1101
                        {
1102
                            if (ps[0] == endP) //상단
1103
                            {
1104
                                testP = new Point(endP.X , endP.Y - 50);
1105
                                //System.Diagnostics.Debug.WriteLine("상단" + testP);
1106
                            }
1107
                            else if (ps[1] == endP) //하단
1108
                            {
1109
                                testP = new Point(endP.X, endP.Y + 50);
1110
                                //System.Diagnostics.Debug.WriteLine("하단" + testP);
1111
                            }
1112
                            else if (ps[2] == endP) //좌단
1113
                            {
1114
                                testP = new Point(endP.X + 50, endP.Y);
1115
                                //System.Diagnostics.Debug.WriteLine("좌단" + testP);
1116
                            }
1117
                            else if (ps[3] == endP) //우단
1118
                            {
1119
                                testP = new Point(endP.X - 50, endP.Y);
1120
                                //System.Diagnostics.Debug.WriteLine("우단" + testP);
1121
                            }
1122
                        }
1123
                        break;
1124
                    default:
1125
                        if (isFixed)
1126
                        {
1127
                            if (ps[0] == endP) //상단
1128
                            {
1129
                                testP = new Point(endP.X, endP.Y - 50);
1130
                                //System.Diagnostics.Debug.WriteLine("상단");
1131
                            }
1132
                            else if (ps[1] == endP) //하단
1133
                            {
1134
                                testP = new Point(endP.X, endP.Y + 50);
1135
                                //System.Diagnostics.Debug.WriteLine("하단");
1136
                            }
1137
                            else if (ps[2] == endP) //좌단
1138
                            {
1139
                                testP = new Point(endP.X - 50, endP.Y);
1140
                                //System.Diagnostics.Debug.WriteLine("좌단");
1141
                            }
1142
                            else if (ps[3] == endP) //우단
1143
                            {
1144
                                testP = new Point(endP.X + 50, endP.Y);
1145
                                //System.Diagnostics.Debug.WriteLine("우단");
1146
                            }
1147
                        }
1148
                        break;
1149
                }
1150
                connectorMEGeometry.EndPoint = endP;
1151
                connectorSMGeometry.EndPoint = testP;
1152
                connectorMEGeometry.StartPoint = testP;
1153
                
1154
                //20180910 LJY 각도에 따라.
1155
                this.MidPoint = testP;
1156
                instanceGroup.Children.Add(DrawSet.DrawArrow(testP, this.StartPoint, this.LineSize));
1157
                instanceGroup.FillRule = FillRule.Nonzero;
1158
                this.Base_ArrowPath.Fill = this.StrokeColor;
1159
                this.Base_ArrowSubPath.Fill = this.StrokeColor;
1160
            }
1161
            else
1162
            {
1163
                switch (Math.Abs(this.PageAngle).ToString())
1164
                {
1165
                    case "90":
1166
                        {
1167
                            ps.Clear();
1168

    
1169
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox))); //위 왼쪽
1170
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) - this.BoxWidth / 2)); // 위 중간
1171
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) - this.BoxWidth)); // 위 오른쪽
1172

    
1173
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight / 2, Canvas.GetTop(Base_TextBox))); //왼쪽 중간
1174
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight, Canvas.GetTop(Base_TextBox))); //왼쪽 하단
1175

    
1176
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight, Canvas.GetTop(Base_TextBox) - this.BoxWidth / 2)); //중간 하단
1177
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight, Canvas.GetTop(Base_TextBox) - this.BoxWidth)); //오른쪽 하단
1178
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight / 2, Canvas.GetTop(Base_TextBox) - this.BoxWidth)); //오른쪽 중간 
1179
                        }
1180
                        break;
1181
                    case "270":
1182
                        {
1183
                            ps.Clear();
1184
                            
1185
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox))); //위 왼쪽
1186
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) + this.BoxWidth / 2)); // 위 중간
1187
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) + this.BoxWidth)); // 위 오른쪽
1188

    
1189
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) - this.BoxHeight / 2, Canvas.GetTop(Base_TextBox))); //왼쪽 중간
1190
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) - this.BoxHeight, Canvas.GetTop(Base_TextBox))); //왼쪽 하단
1191

    
1192
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) - this.BoxHeight, Canvas.GetTop(Base_TextBox) + this.BoxWidth / 2)); //중간 하단
1193
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) - this.BoxHeight, Canvas.GetTop(Base_TextBox) + this.BoxWidth)); //오른쪽 하단
1194

    
1195
                            ps.Add(new Point(Canvas.GetLeft(Base_TextBox) - this.BoxHeight / 2, Canvas.GetTop(Base_TextBox) + this.BoxWidth)); //오른쪽 중간 
1196
                        }
1197
                        break;
1198
                    //case "180":
1199
                    //    {
1200
                    //        ps.Clear();
1201

    
1202
                    //        ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox))); //위 왼쪽
1203
                    //        ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) + this.BoxWidth / 2)); // 위 중간
1204
                    //        ps.Add(new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) + this.BoxWidth)); // 위 오른쪽
1205

    
1206
                    //        ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight / 2, Canvas.GetTop(Base_TextBox))); //왼쪽 중간
1207
                    //        ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight, Canvas.GetTop(Base_TextBox))); //왼쪽 하단
1208

    
1209
                    //        ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight, Canvas.GetTop(Base_TextBox) + this.BoxWidth / 2)); //중간 하단
1210
                    //        ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight, Canvas.GetTop(Base_TextBox) + this.BoxWidth)); //오른쪽 하단
1211

    
1212
                    //        ps.Add(new Point(Canvas.GetLeft(Base_TextBox) + this.BoxHeight / 2, Canvas.GetTop(Base_TextBox) + this.BoxWidth)); //오른쪽 중간 
1213
                    //    }
1214
                    //    break;
1215
                    default:
1216
                        break;
1217
                }
1218

    
1219

    
1220
                var endP = MathSet.getNearPoint(ps, this.MidPoint);
1221
                connectorMEGeometry.EndPoint = endP; //최상단
1222
                                                     //connectorMEGeometry.EndPoint = this.EndPoint; //핵심
1223
                                                     //this.MidPoint= MathSet.getMiddlePoint(this.StartPoint, endP);
1224
                #region 보정치
1225
                Point testP = endP;
1226

    
1227
                //20180910 LJY 각도에 따라.
1228
                switch (Math.Abs(this.PageAngle).ToString())
1229
                {
1230
                    case "90":
1231
                        if (isFixed)
1232
                        {
1233
                            if (ps[0] == endP) //상단
1234
                            {
1235
                                testP = new Point(endP.X - 50, endP.Y);
1236
                                //System.Diagnostics.Debug.WriteLine("상단"+ testP);
1237
                            }
1238
                            else if (ps[1] == endP) //하단
1239
                            {
1240
                                testP = new Point(endP.X + 50, endP.Y);
1241
                                //System.Diagnostics.Debug.WriteLine("하단"+ testP);
1242
                            }
1243
                            else if (ps[2] == endP) //좌단
1244
                            {
1245
                                testP = new Point(endP.X - 50, endP.Y);
1246
                                //System.Diagnostics.Debug.WriteLine("좌단"+ testP);
1247
                            }
1248
                            else if (ps[3] == endP) //우단
1249
                            {
1250
                                testP = new Point(endP.X + 50 , endP.Y);
1251
                                //System.Diagnostics.Debug.WriteLine("우단"+ testP);
1252
                            }
1253
                        }
1254
                        break;
1255
                    case "270":
1256
                        if (isFixed)
1257
                        {
1258
                            if (ps[0] == endP) //상단
1259
                            {
1260
                                testP = new Point(endP.X + 50, endP.Y);
1261
                                //System.Diagnostics.Debug.WriteLine("상단" + testP);
1262
                            }
1263
                            else if (ps[1] == endP) //하단
1264
                            {
1265
                                testP = new Point(endP.X - 50, endP.Y);
1266
                                //System.Diagnostics.Debug.WriteLine("하단" + testP);
1267
                            }
1268
                            else if (ps[2] == endP) //좌단
1269
                            {
1270
                                testP = new Point(endP.X + 50, endP.Y);
1271
                                //System.Diagnostics.Debug.WriteLine("좌단" + testP);
1272
                            }
1273
                            else if (ps[3] == endP) //우단
1274
                            {
1275
                                testP = new Point(endP.X + 50, endP.Y );
1276
                                //System.Diagnostics.Debug.WriteLine("우단" + testP);
1277
                            }
1278
                        }
1279
                        break;
1280
                    default:
1281
                        if (isFixed)
1282
                        {
1283
                            if (ps[0] == endP) //상단
1284
                            {
1285
                                testP = new Point(endP.X, endP.Y - 50);
1286
                                //System.Diagnostics.Debug.WriteLine("상단");
1287
                            }
1288
                            else if (ps[1] == endP) //하단
1289
                            {
1290
                                testP = new Point(endP.X, endP.Y + 50);
1291
                                //System.Diagnostics.Debug.WriteLine("하단");
1292
                            }
1293
                            else if (ps[2] == endP) //좌단
1294
                            {
1295
                                testP = new Point(endP.X - 50, endP.Y);
1296
                                //System.Diagnostics.Debug.WriteLine("좌단");
1297
                            }
1298
                            else if (ps[3] == endP) //우단
1299
                            {
1300
                                testP = new Point(endP.X + 50, endP.Y);
1301
                                //System.Diagnostics.Debug.WriteLine("우단");
1302
                            }
1303
                        }
1304
                        break;
1305
                }
1306
                  
1307

    
1308
                connectorSMGeometry.EndPoint = testP;
1309
                connectorMEGeometry.StartPoint = testP;
1310
                instanceGroup.Children.Add(DrawSet.DrawArrow(testP, this.StartPoint, this.LineSize));
1311
                instanceGroup.FillRule = FillRule.Nonzero;
1312
                this.Base_ArrowPath.Fill = this.StrokeColor;
1313
                this.Base_ArrowSubPath.Fill = this.StrokeColor;
1314
                #endregion
1315
            }
1316

    
1317
            switch (this.ArrowTextStyle)
1318
            {
1319
                case ArrowTextStyleSet.Normal:
1320
                    this.BorderSize = new Thickness(0);
1321
                    DrawingRect();
1322
                    break;
1323
                case ArrowTextStyleSet.Cloud:
1324
                    this.BorderSize = new Thickness(0);
1325
                    DrawingCloud();
1326
                    break;
1327
                default:
1328
                    {
1329
                        this.BorderSize = new Thickness(LineSize); //올라
1330
                        DrawingRect();
1331
                    }
1332

    
1333
                    break;
1334
            }
1335

    
1336
            if (isHighLight)
1337
            {
1338
                SubPathFill = new SolidColorBrush(Color.FromArgb(Convert.ToByte(255 * 0.6), Colors.Yellow.R, Colors.Yellow.G, Colors.Yellow.B));
1339
                BackInnerColor = new SolidColorBrush(Color.FromArgb(Convert.ToByte(255 * 0.6), Colors.Yellow.R, Colors.Yellow.G, Colors.Yellow.B));
1340

    
1341
                TextBoxBackground = new SolidColorBrush(Color.FromArgb(Convert.ToByte(255 * 0.6), Colors.Yellow.R, Colors.Yellow.G, Colors.Yellow.B));
1342
            }
1343
            else
1344
            {
1345
                BackInnerColor = new SolidColorBrush(Color.FromArgb(Convert.ToByte(255 * 0.6), Colors.White.R, Colors.White.G, Colors.White.B));
1346
                SubPathFill = new SolidColorBrush(Color.FromArgb(Convert.ToByte(255 * 0.6), Colors.White.R, Colors.White.G, Colors.White.B));
1347
                TextBoxBackground = new SolidColorBrush(Color.FromArgb(Convert.ToByte(255 * 0.1), Colors.White.R, Colors.White.G, Colors.White.B));
1348
            }
1349

    
1350
            instanceGroup.Children.Add(connectorSMGeometry);
1351
            instanceGroup.Children.Add(connectorMEGeometry);
1352

    
1353
            this.PathData = instanceGroup;
1354
            OverViewPathData = PathData;
1355
            OverViewArrowText = ArrowText;
1356
            OverViewEndPoint = connectorMEGeometry.EndPoint;
1357
            OverViewStartPoint = connectorSMGeometry.StartPoint;
1358

    
1359
            var tempAngle = Math.Abs(this.PageAngle);
1360

    
1361
            if (tempAngle == Convert.ToDouble(90) || tempAngle == Convert.ToDouble(270))
1362
            {
1363
                this.RenderTransformOrigin = new Point(0.5, 0.5);
1364
                this.Base_ArrowPath.RenderTransformOrigin = new Point(0, 0);
1365
                this.Base_ArrowSubPath.RenderTransformOrigin = new Point(0, 0);
1366

    
1367
                Base_TextBox.RenderTransformOrigin = new Point(0, 0);
1368
                BaseTextbox_Caret.RenderTransformOrigin = new Point(0, 0);
1369
            }
1370

    
1371
            Base_TextBox.RenderTransform = new RotateTransform
1372
            {
1373
                Angle = this.VisualPageAngle,
1374
                CenterX = this.CenterX,
1375
                CenterY = this.CenterY,
1376
            };
1377

    
1378
            System.Diagnostics.Debug.WriteLine($"base TextBox center X : {this.CenterX} Y : {this.CenterY} ");
1379

    
1380
            
1381

    
1382
            Base_ArrowSubPath.RenderTransform = new RotateTransform
1383
            {
1384
                Angle = this.VisualPageAngle,
1385
                CenterX = this.EndPoint.X,
1386
                CenterY = this.EndPoint.Y,
1387
            };
1388

    
1389
            if (BaseTextbox_Caret.Visibility == Visibility.Visible)
1390
            {
1391
                BaseTextbox_Caret.RenderTransform = new RotateTransform
1392
                {
1393
                    Angle = this.VisualPageAngle,
1394
                    CenterX = this.CenterX,
1395
                    CenterY = this.CenterY,
1396
                };
1397

    
1398
                MoveCustomCaret();
1399
            }
1400
        }
1401

    
1402
        private void DrawingCloud()
1403
        {
1404
            //20180906 LJY Textbox guide
1405
            string angle = Math.Abs(this.PageAngle).ToString();
1406
            if (angle == "180")
1407
            {
1408
                List<Point> pCloud = new List<Point>()
1409
                {
1410
                     new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1411
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) - BoxHeight), //왼쪽 아래
1412
                    new Point(Canvas.GetLeft(Base_TextBox) - BoxWidth, Canvas.GetTop(Base_TextBox) - BoxHeight),
1413
                    new Point(Canvas.GetLeft(Base_TextBox) - BoxWidth, Canvas.GetTop(Base_TextBox)),
1414
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위  
1415
                };
1416
                SubPathData = (Generate(pCloud));
1417
                PathDataInner = (GenerateInnerCloud(pCloud, angle));
1418
            
1419
            }//20180906 LJY Textbox guide
1420
            else
1421
            {            
1422
                List<Point> pCloud = new List<Point>()
1423
                {
1424
    #if SILVERLIGHT
1425
		            new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1426
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)+ BoxHeight), //왼쪽 아래
1427
                    new Point(Canvas.GetLeft(Base_TextBox)+ BoxWidth, Canvas.GetTop(Base_TextBox) + BoxHeight),
1428
                    new Point(Canvas.GetLeft(Base_TextBox) + BoxWidth, Canvas.GetTop(Base_TextBox)),
1429
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위  
1430

    
1431
    #else
1432
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1433
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)+ BoxHeight), //왼쪽 아래
1434
                    new Point(Canvas.GetLeft(Base_TextBox)+ BoxWidth, Canvas.GetTop(Base_TextBox) + BoxHeight),
1435
                    new Point(Canvas.GetLeft(Base_TextBox) + BoxWidth, Canvas.GetTop(Base_TextBox)),
1436
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위  
1437

    
1438
                    //new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1439
                    //new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)+ BoxHeight-4), //왼쪽 아래
1440
                    //new Point(Canvas.GetLeft(Base_TextBox)+ BoxWidth-1, Canvas.GetTop(Base_TextBox) + BoxHeight-4),
1441
                    //new Point(Canvas.GetLeft(Base_TextBox) + BoxWidth-1, Canvas.GetTop(Base_TextBox)),
1442
                    //new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1443
    #endif
1444
                };
1445
                //instanceGroup.Children.Add(Generate(pCloud));
1446
                SubPathData = (Generate(pCloud));
1447
                PathDataInner = (GenerateInnerCloud(pCloud, angle));
1448
                //   }
1449
            }
1450

    
1451
        }
1452

    
1453
        private void DrawingRect()
1454
        {
1455
            //20180906 LJY Textbox guide
1456
            if(this.ArrowTextStyle == ArrowTextStyleSet.Normal)
1457
            {
1458
                this.Base_TextBox.BorderBrush = Brushes.Transparent;
1459
            }
1460

    
1461
            if (Math.Abs(this.PageAngle).ToString() == "90")
1462
            {
1463
                List<Point> pCloud = new List<Point>()
1464
                {
1465
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1466
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) - BoxWidth), //왼쪽 아래
1467
                    new Point(Canvas.GetLeft(Base_TextBox) + BoxHeight, Canvas.GetTop(Base_TextBox) - BoxWidth),
1468
                    new Point(Canvas.GetLeft(Base_TextBox) + BoxHeight, Canvas.GetTop(Base_TextBox)),
1469
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위  
1470
                };
1471
                PathDataInner = (GenerateInner(pCloud));
1472
            }
1473
            else if(Math.Abs(this.PageAngle).ToString() == "270")
1474
            {
1475
                List<Point> pCloud = new List<Point>()
1476
                {
1477
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1478
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox) + BoxWidth), //왼쪽 아래
1479
                    new Point(Canvas.GetLeft(Base_TextBox) - BoxHeight, Canvas.GetTop(Base_TextBox) + BoxWidth),
1480
                    new Point(Canvas.GetLeft(Base_TextBox) - BoxHeight, Canvas.GetTop(Base_TextBox)),
1481
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위  
1482
                };
1483
                PathDataInner = (GenerateInner(pCloud));
1484
            }//20180906 LJY Textbox guide
1485
            else
1486
            { 
1487
                List<Point> pCloud = new List<Point>()
1488
                {
1489
    #if SILVERLIGHT
1490
		            new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1491
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)+ BoxHeight), //왼쪽 아래
1492
                    new Point(Canvas.GetLeft(Base_TextBox)+ BoxWidth, Canvas.GetTop(Base_TextBox) + BoxHeight),
1493
                    new Point(Canvas.GetLeft(Base_TextBox) + BoxWidth, Canvas.GetTop(Base_TextBox)),
1494
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위  
1495

    
1496
    #else
1497
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1498
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)+ BoxHeight), //왼쪽 아래
1499
                    new Point(Canvas.GetLeft(Base_TextBox)+ BoxWidth, Canvas.GetTop(Base_TextBox) + BoxHeight),
1500
                    new Point(Canvas.GetLeft(Base_TextBox) + BoxWidth, Canvas.GetTop(Base_TextBox)),
1501
                    new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위  
1502

    
1503
                    //new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1504
                    //new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)+ BoxHeight-4), //왼쪽 아래
1505
                    //new Point(Canvas.GetLeft(Base_TextBox)+ BoxWidth-1, Canvas.GetTop(Base_TextBox) + BoxHeight-4),
1506
                    //new Point(Canvas.GetLeft(Base_TextBox) + BoxWidth-1, Canvas.GetTop(Base_TextBox)),
1507
                    //new Point(Canvas.GetLeft(Base_TextBox), Canvas.GetTop(Base_TextBox)), //위
1508
    #endif
1509
                };
1510
                //instanceGroup.Children.Add(Generate(pCloud));
1511
                PathDataInner = (GenerateInner(pCloud));
1512
            }
1513
        }
1514

    
1515
        public override void UpdateControl()
1516
        {
1517
            this.StartPoint = new Point(this.PointSet[0].X, this.PointSet[0].Y);
1518
            this.MidPoint = new Point(this.PointSet[1].X, this.PointSet[1].Y);
1519
            this.EndPoint = new Point(this.PointSet[2].X, this.PointSet[2].Y);
1520
        }
1521

    
1522
        public override void ApplyOverViewData()
1523
        {
1524
            this.OverViewPathData = this.PathData;
1525
            if (ArrowText == "")
1526
                this.ArrowText = this.OverViewArrowText;
1527
            else
1528
                this.OverViewArrowText = this.ArrowText;
1529
            this.OverViewStartPoint = this.StartPoint;
1530
            this.OverViewEndPoint = this.EndPoint;
1531
        }
1532

    
1533
        #endregion
1534

    
1535
        public static PathFigure GenerateLineWithCloud(Point p1, Point p2, double arcLength_, bool reverse)
1536
        {
1537
            PathFigure pathFigure = new PathFigure();
1538
            pathFigure.StartPoint = p1;
1539

    
1540
            double arcLength = arcLength_;
1541
            /// draw arcs which has arcLength between p1 and p2 - 2012.06.21 added by humkyung 
1542
            double dx = p2.X - p1.X;
1543
            double dy = p2.Y - p1.Y;
1544
            double l = MathSet.DistanceTo(p1, p2); /// distance between p1 and p2
1545
            double theta = Math.Atan2(Math.Abs(dy), Math.Abs(dx)) * 180 / Math.PI;
1546
            Point lastPt = new Point(p1.X, p1.Y);
1547
            double count = l / arcLength;
1548
            /// normalize
1549
            dx /= l;
1550
            dy /= l;
1551
            Double j = 1;
1552
            for (j = 1; j < (count - 1); j++) 
1553
            {
1554
                ArcSegment arcSeg = new ArcSegment();
1555
                arcSeg.Size = new Size(arcLength * _CloudArcDepth, arcLength * _CloudArcDepth);						/// x size and y size of arc
1556
                arcSeg.Point = new Point(p1.X + j * dx * arcLength, p1.Y + j * dy * arcLength);	/// end point of arc
1557
                lastPt = arcSeg.Point;  /// save last point
1558
                arcSeg.RotationAngle = theta + 90;
1559
                if (true == reverse) arcSeg.SweepDirection = SweepDirection.Clockwise;
1560
                pathFigure.Segments.Add(arcSeg);
1561
            }
1562

    
1563
            /// draw arc between last point and end point
1564
            if ((count > j) || (count > 0))
1565
            {
1566
                arcLength = MathSet.DistanceTo(lastPt, p2);
1567
                ArcSegment arcSeg = new ArcSegment();
1568
                arcSeg.Size = new Size(arcLength * _CloudArcDepth, arcLength * _CloudArcDepth);	/// x size and y size of arc
1569
                arcSeg.Point = new Point(p2.X, p2.Y);						/// end point of arc
1570
                arcSeg.RotationAngle = theta;
1571
                if (true == reverse) arcSeg.SweepDirection = SweepDirection.Clockwise;
1572
                pathFigure.Segments.Add(arcSeg);
1573
            }
1574
            /// up to here
1575

    
1576
            return pathFigure;
1577
        }
1578

    
1579
        public static PathGeometry Generate(List<Point> pData)
1580
        {
1581
            var _pathGeometry = new PathGeometry();
1582
            
1583
            double area = MathSet.AreaOf(pData);
1584
            bool reverse = (area > 0);
1585
            int count = pData.Count;
1586
            for (int i = 0; i < (count - 1); i++)
1587
            {
1588
                PathFigure pathFigure = GenerateLineWithCloud(pData[i], pData[i + 1], 20, reverse);
1589
                pathFigure.IsClosed = false;
1590
                pathFigure.IsFilled = true;
1591
                _pathGeometry.Figures.Add(pathFigure);
1592
            }
1593
            
1594
            return _pathGeometry;
1595
        }
1596

    
1597
        
1598
        public static PathGeometry GenerateInner(List<Point> pData)
1599
        {
1600
            var _pathGeometry = new PathGeometry();
1601
            double area = MathSet.AreaOf(pData);
1602
            bool reverse = (area > 0);
1603
            int count = pData.Count;
1604

    
1605
            PathFigure pathFigur2 = new PathFigure();
1606
            pathFigur2.StartPoint = pData[0];
1607

    
1608
            LineSegment lineSegment0 = new LineSegment();
1609
            lineSegment0.Point = pData[0];
1610
            pathFigur2.Segments.Add(lineSegment0);
1611

    
1612
            LineSegment lineSegment1 = new LineSegment();
1613
            lineSegment1.Point = pData[1];
1614
            pathFigur2.Segments.Add(lineSegment1);
1615

    
1616
            LineSegment lineSegment2 = new LineSegment();
1617
            lineSegment2.Point = pData[2];
1618
            pathFigur2.Segments.Add(lineSegment2);
1619

    
1620
            LineSegment lineSegment3 = new LineSegment();
1621
            lineSegment3.Point = pData[3];
1622
            pathFigur2.Segments.Add(lineSegment3);
1623

    
1624

    
1625
            pathFigur2.IsClosed = true;
1626
            pathFigur2.IsFilled = true;
1627
            _pathGeometry.Figures.Add(pathFigur2);           
1628

    
1629
            return _pathGeometry;
1630
        }
1631

    
1632
        //20180910 LJY Cloud rotation 추가
1633
        public static PathGeometry GenerateInnerCloud(List<Point> pData, string angle)
1634
        {
1635
            var _pathGeometry = new PathGeometry();
1636
            double area = MathSet.AreaOf(pData);
1637
            bool reverse = (area > 0);
1638
            int count = pData.Count;
1639

    
1640
            PathFigure pathFigur2 = new PathFigure();
1641
            pathFigur2.StartPoint = pData[0];
1642

    
1643
            LineSegment lineSegment0 = new LineSegment();
1644
            lineSegment0.Point = pData[0];
1645
            pathFigur2.Segments.Add(lineSegment0);
1646

    
1647
            LineSegment lineSegment1 = new LineSegment();
1648
            lineSegment1.Point = pData[1];
1649
            pathFigur2.Segments.Add(lineSegment1);
1650

    
1651
            LineSegment lineSegment2 = new LineSegment();
1652
            lineSegment2.Point = pData[2];
1653
            pathFigur2.Segments.Add(lineSegment2);
1654

    
1655
            LineSegment lineSegment3 = new LineSegment();
1656
            lineSegment3.Point = pData[3];
1657
            pathFigur2.Segments.Add(lineSegment3);
1658
            
1659
            RotateTransform transform = new RotateTransform();
1660
            switch (angle)
1661
            {
1662
                case "90":
1663
                    transform.Angle = -90;
1664
                    break;
1665
                case "180":
1666
                    transform.Angle = -180;
1667
                    break;
1668
                case "270":
1669
                    transform.Angle = -270;
1670
                    break;
1671
            }
1672
            transform.CenterX = pData[0].X;
1673
            transform.CenterY = pData[0].Y;
1674
            _pathGeometry.Transform = transform;
1675

    
1676
            pathFigur2.IsClosed = true;
1677
            pathFigur2.IsFilled = true;
1678
            _pathGeometry.Figures.Add(pathFigur2);
1679

    
1680
            return _pathGeometry;
1681
        }
1682

    
1683
        /// <summary>
1684
        /// call when mouse is moving while drawing control
1685
        /// </summary>
1686
        /// <author>humkyung</author>
1687
        /// <param name="pt"></param>
1688
        /// <param name="bAxisLocked"></param>
1689
        public override void OnCreatingMouseMove(Point pt, bool bAxisLocked, bool bShiftKeyPressed)
1690
        {
1691
            this.EndPoint = pt;
1692

    
1693
            Point tempPoint = this.EndPoint;
1694
            CommentAngle = MathSet.returnAngle(this.StartPoint, ref tempPoint, bShiftKeyPressed);
1695

    
1696
            if (bAxisLocked || bShiftKeyPressed)
1697
            {
1698
                this.EndPoint = tempPoint;
1699
            }
1700

    
1701
            this.MidPoint = MathSet.getMiddlePoint(this.StartPoint, this.EndPoint);
1702
            this.isFixed = (this.ControlType == ControlType.ArrowTransTextControl) || 
1703
                (this.ControlType == ControlType.ArrowTransTextBorderControl) || (this.ControlType == ControlType.ArrowTransTextCloudControl);
1704

    
1705
            this.PointSet = new List<Point>
1706
            {
1707
                this.StartPoint,
1708
                this.MidPoint,
1709
                this.EndPoint,
1710
            };
1711
        }
1712

    
1713
        /// <summary>
1714
        /// move control point has same location of given pt along given delta
1715
        /// </summary>
1716
        /// <author>humkyung</author>
1717
        /// <date>2019.06.20</date>
1718
        /// <param name="pt"></param>
1719
        /// <param name="dx"></param>
1720
        /// <param name="dy"></param>
1721
        public override void OnMoveCtrlPoint(Point pt, double dx, double dy)
1722
        {
1723
            IPath path = (this as IPath);
1724

    
1725
            Point selected = MathSet.getNearPoint(path.PointSet, pt);
1726

    
1727
            //StartPoint에 표시된 Thumb는 dx,dy가 +로 더해줘야한다.
1728
            if (path.PointSet.IndexOf(selected) != 0)
1729
            {
1730
                double radian = this.CommentAngle * Math.PI / 180;
1731
                double cos = Math.Cos(radian);
1732
                double sin = Math.Sin(radian);
1733

    
1734
                double _dx = dx * cos - dy * sin;
1735
                double _dy = dx * sin + dy * cos;
1736

    
1737
                selected.X += _dx;
1738
                selected.Y += _dy;
1739
            }
1740
            else
1741
            {
1742
                selected.X += dx;
1743
                selected.Y += dy;
1744
            }
1745

    
1746
            int i = 0;
1747
            for (i = 0; i < (this as IPath).PointSet.Count; i++)
1748
            {
1749
                if (pt.Equals((this as IPath).PointSet[i])) break;
1750
            }
1751

    
1752
            List<Point> pts = path.PointSet;
1753
            if ((pts[0].X > pts[1].X && dx > 0) || (pts[0].X < pts[1].X && dx < 0))
1754
            {
1755
                pts[1] = new Point(pts[1].X + dx, pts[1].Y);
1756
            }
1757
            if ((pts[0].Y > pts[1].Y && dy > 0) || (pts[0].Y < pts[1].Y && dy < 0))
1758
            {
1759
                pts[1] = new Point(pts[1].X, pts[1].Y + dy);
1760
            }
1761

    
1762
            path.PointSet[1] = pts[1];
1763

    
1764
            if (path.PointSet.Count > i) {
1765
                path.PointSet[i] = selected;
1766
            }
1767

    
1768
            this.UpdateControl();
1769
        }
1770

    
1771
        /// <summary>
1772
        /// return ArrowTextControl's area
1773
        /// </summary>
1774
        /// <author>humkyung</author>
1775
        /// <date>2019.06.13</date>
1776
        public override Rect ItemRect
1777
        {
1778
            get
1779
            {
1780
                double dMinX = Math.Min(this.StartPoint.X, this.EndPoint.X);
1781
                double dMinY = Math.Min(this.StartPoint.Y, this.EndPoint.Y);
1782
                double dMaxX = Math.Max(this.StartPoint.X, this.EndPoint.X);
1783
                double dMaxY = Math.Max(this.StartPoint.Y, this.EndPoint.Y);
1784

    
1785
                return new Rect(new Point(dMinX, dMinY), new Point(dMaxX, dMaxY));
1786
            }
1787
        }
1788

    
1789
        /// <summary>
1790
        /// Serialize this
1791
        /// </summary>
1792
        /// <param name="sUserId"></param>
1793
        /// <returns></returns>
1794
        public override string Serialize()
1795
        {
1796
            using (S_ArrowTextControl STemp = new S_ArrowTextControl())
1797
            {
1798
                STemp.TransformPoint = "0|0";
1799
                STemp.PointSet = this.PointSet;
1800
                STemp.SizeSet = String.Format("{0}", this.LineSize);
1801
                STemp.StrokeColor = this.StrokeColor.Color.ToString();
1802
                STemp.StartPoint = this.StartPoint;
1803
                STemp.ArrowStyle = this.ArrowTextStyle;
1804
                //STemp.StrokeColor = "#FF00FF00";
1805
                STemp.UserID = this.UserID;
1806
                STemp.ArrowText = this.Base_TextBox.Text;
1807
                STemp.BorderSize = this.BorderSize;
1808
                STemp.isHighLight = this.isHighLight;
1809
                STemp.BoxHeight = this.BoxHeight;
1810
                STemp.BoxWidth = this.BoxWidth;
1811
                STemp.Opac = this.Opacity;
1812
                STemp.EndPoint = this.EndPoint;
1813
                STemp.isFixed = this.isFixed;
1814
                //STemp.DashSize = this.DashSize;
1815
                STemp.Name = this.GetType().Name.ToString();
1816
                STemp.isTrans = this.isTrans;
1817
                STemp.MidPoint = this.MidPoint;
1818
                STemp.Angle = this.CommentAngle;
1819
                STemp.fontConfig = new List<string>()
1820
                            {
1821
                                this.TextFamily.ToString(),
1822
                                this.TextStyle.ToString(),
1823
                                this.TextWeight.ToString(),
1824
                                this.TextSize.ToString(),
1825
                            };
1826

    
1827
                if (this.UnderLine != null)
1828
                {
1829
                    STemp.fontConfig.Add("true");
1830
                }
1831

    
1832
                ///강인구 추가(2017.11.02)
1833
                ///Memo 추가
1834
                STemp.Memo = this.Memo;
1835
                STemp.BorderSize = this.BorderSize;
1836
                return "|DZ|" + JsonSerializerHelper.CompressString((STemp.JsonSerialize()));
1837
            };
1838
        }
1839

    
1840
        /// <summary>
1841
        /// create a arrowtextcontrol from given string
1842
        /// </summary>
1843
        /// <param name="str"></param>
1844
        /// <returns></returns>
1845
        public static ArrowTextControl FromString(string str, SolidColorBrush brush, string sProjectNo)
1846
        {
1847
            ArrowTextControl instance = null;
1848
            using (S_ArrowTextControl s = JsonSerializerHelper.JsonDeserialize<S_ArrowTextControl>(str))
1849
            {
1850
                string[] data2 = s.SizeSet.Split(delimiterChars2, StringSplitOptions.RemoveEmptyEntries);
1851
                instance = new ArrowTextControl();
1852
                instance.LineSize = Convert.ToDouble(data2.First());
1853
                instance.PointSet = s.PointSet;
1854
                instance.StartPoint = s.StartPoint;
1855
                instance.EndPoint = s.EndPoint;
1856
                instance.StrokeColor = brush;
1857
                //instance.DashSize = s.DashSize;
1858
                instance.ArrowTextStyle = s.ArrowStyle;
1859
                instance.isHighLight = s.isHighLight;
1860
                instance.ArrowText = s.ArrowText;
1861
                instance.Opacity = s.Opac;
1862
                instance.BorderSize = s.BorderSize;
1863
                instance.BoxWidth = s.BoxWidth;
1864
                instance.BoxHeight = s.BoxHeight;
1865
                instance.isFixed = s.isFixed;
1866
                instance.CommentAngle = s.Angle;
1867
                instance.UserID = s.UserID;
1868
                instance.isTrans = s.isTrans;
1869
                instance.MidPoint = s.MidPoint;
1870
                instance.Memo = s.Memo;
1871
                if (s.fontConfig == null || s.fontConfig.ToList().Count == 0)
1872
                {
1873
                    s.fontConfig = new List<string>();
1874

    
1875
                    s.fontConfig.Add("Arial");
1876
                    s.fontConfig.Add("Normal");
1877
                    s.fontConfig.Add("Normal");
1878
                    s.fontConfig.Add("30");
1879
                }
1880
                instance.TextFamily = new FontFamily(s.fontConfig[0]);
1881
                //인구 추가(2018.04.17)
1882
                instance.TextStyle = StringToFont.ConFontStyle(s.fontConfig[1]);
1883
                instance.TextWeight = StringToFont.ConFontWeight(s.fontConfig[2]);
1884
                instance.TextSize = Convert.ToDouble(s.fontConfig[3]);
1885

    
1886
                if (s.fontConfig.Count() == 5)
1887
                {
1888
                    instance.UnderLine = TextDecorations.Underline;
1889
                }
1890
            }
1891

    
1892
            return instance;
1893
        }
1894

    
1895
        #region Dispose
1896
        public void Dispose()
1897
        {
1898
            //GC.Collect();
1899
            //GC.SuppressFinalize(this);
1900
            this.BaseTextbox_Caret = null;
1901
            this.Base_ArrowPath = null;
1902
            this.Base_ArrowSubPath = null;
1903
            this.Base_TextBlock = null;
1904
            this.Base_TextBox = null;
1905
        } 
1906
        #endregion
1907

    
1908
        #region INotifyPropertyChanged
1909
        private void OnPropertyChanged(string name)
1910
        {
1911
            if (PropertyChanged != null)
1912
            {
1913
                PropertyChanged(this, new PropertyChangedEventArgs(name));
1914
            }
1915
        }
1916

    
1917
        public event PropertyChangedEventHandler PropertyChanged; 
1918
        #endregion
1919
    }
1920
}
클립보드 이미지 추가 (최대 크기: 500 MB)