Statistics
| Revision:

root / trunk / extensions / extCAD / src / com / iver / cit / gvsig / gui / cad / tools / smc / PolylineCADToolContext.java @ 17619

History | View | Annotate | Download (25 KB)

1

    
2
//
3
// Vicente Caballero Navarro
4

    
5

    
6
package com.iver.cit.gvsig.gui.cad.tools.smc;
7

    
8
import com.iver.cit.gvsig.gui.cad.tools.PolylineCADTool;
9
import java.awt.event.InputEvent;
10
import com.iver.andami.PluginServices;
11

    
12
public final class PolylineCADToolContext
13
    extends statemap.FSMContext
14
{
15
//---------------------------------------------------------------
16
// Member methods.
17
//
18

    
19
    public PolylineCADToolContext(PolylineCADTool owner)
20
    {
21
        super();
22

    
23
        _owner = owner;
24
        setState(Polyline.FirstPoint);
25
        Polyline.FirstPoint.Entry(this);
26
    }
27

    
28
    public void addOption(String s)
29
    {
30
        _transition = "addOption";
31
        getState().addOption(this, s);
32
        _transition = "";
33
        return;
34
    }
35

    
36
    public void addPoint(double pointX, double pointY, InputEvent event)
37
    {
38
        _transition = "addPoint";
39
        getState().addPoint(this, pointX, pointY, event);
40
        _transition = "";
41
        return;
42
    }
43

    
44
    public void addValue(double d)
45
    {
46
        _transition = "addValue";
47
        getState().addValue(this, d);
48
        _transition = "";
49
        return;
50
    }
51

    
52
    public PolylineCADToolState getState()
53
        throws statemap.StateUndefinedException
54
    {
55
        if (_state == null)
56
        {
57
            throw(
58
                new statemap.StateUndefinedException());
59
        }
60

    
61
        return ((PolylineCADToolState) _state);
62
    }
63

    
64
    protected PolylineCADTool getOwner()
65
    {
66
        return (_owner);
67
    }
68

    
69
//---------------------------------------------------------------
70
// Member data.
71
//
72

    
73
    transient private PolylineCADTool _owner;
74

    
75
//---------------------------------------------------------------
76
// Inner classes.
77
//
78

    
79
    public static abstract class PolylineCADToolState
80
        extends statemap.State
81
    {
82
    //-----------------------------------------------------------
83
    // Member methods.
84
    //
85

    
86
        protected PolylineCADToolState(String name, int id)
87
        {
88
            super (name, id);
89
        }
90

    
91
        protected void Entry(PolylineCADToolContext context) {}
92
        protected void Exit(PolylineCADToolContext context) {}
93

    
94
        protected void addOption(PolylineCADToolContext context, String s)
95
        {
96
            Default(context);
97
        }
98

    
99
        protected void addPoint(PolylineCADToolContext context, double pointX, double pointY, InputEvent event)
100
        {
101
            Default(context);
102
        }
103

    
104
        protected void addValue(PolylineCADToolContext context, double d)
105
        {
106
            Default(context);
107
        }
108

    
109
        protected void Default(PolylineCADToolContext context)
110
        {
111
            throw (
112
                new statemap.TransitionUndefinedException(
113
                    "State: " +
114
                    context.getState().getName() +
115
                    ", Transition: " +
116
                    context.getTransition()));
117
        }
118

    
119
    //-----------------------------------------------------------
120
    // Member data.
121
    //
122
    }
123

    
124
    /* package */ static abstract class Polyline
125
    {
126
    //-----------------------------------------------------------
127
    // Member methods.
128
    //
129

    
130
    //-----------------------------------------------------------
131
    // Member data.
132
    //
133

    
134
        //-------------------------------------------------------
135
        // Statics.
136
        //
137
        /* package */ static Polyline_Default.Polyline_FirstPoint FirstPoint;
138
        /* package */ static Polyline_Default.Polyline_NextPointOrArcOrClose NextPointOrArcOrClose;
139
        /* package */ static Polyline_Default.Polyline_NextPointOrLineOrClose NextPointOrLineOrClose;
140
        private static Polyline_Default Default;
141

    
142
        static
143
        {
144
            FirstPoint = new Polyline_Default.Polyline_FirstPoint("Polyline.FirstPoint", 0);
145
            NextPointOrArcOrClose = new Polyline_Default.Polyline_NextPointOrArcOrClose("Polyline.NextPointOrArcOrClose", 1);
146
            NextPointOrLineOrClose = new Polyline_Default.Polyline_NextPointOrLineOrClose("Polyline.NextPointOrLineOrClose", 2);
147
            Default = new Polyline_Default("Polyline.Default", -1);
148
        }
149

    
150
    }
151

    
152
    protected static class Polyline_Default
153
        extends PolylineCADToolState
154
    {
155
    //-----------------------------------------------------------
156
    // Member methods.
157
    //
158

    
159
        protected Polyline_Default(String name, int id)
160
        {
161
            super (name, id);
162
        }
163

    
164
        protected void addOption(PolylineCADToolContext context, String s)
165
        {
166
            PolylineCADTool ctxt = context.getOwner();
167

    
168
            if (s.equals(PluginServices.getText(this,"cancel")))
169
            {
170
                boolean loopbackFlag =
171
                    context.getState().getName().equals(
172
                        Polyline.FirstPoint.getName());
173

    
174
                if (loopbackFlag == false)
175
                {
176
                    (context.getState()).Exit(context);
177
                }
178

    
179
                context.clearState();
180
                try
181
                {
182
                    ctxt.cancel();
183
                }
184
                finally
185
                {
186
                    context.setState(Polyline.FirstPoint);
187

    
188
                    if (loopbackFlag == false)
189
                    {
190
                        (context.getState()).Entry(context);
191
                    }
192

    
193
                }
194
            }
195
            else if (s.equals(""))
196
            {
197
                boolean loopbackFlag =
198
                    context.getState().getName().equals(
199
                        Polyline.FirstPoint.getName());
200

    
201
                if (loopbackFlag == false)
202
                {
203
                    (context.getState()).Exit(context);
204
                }
205

    
206
                context.clearState();
207
                try
208
                {
209
                    ctxt.endGeometry();
210
                }
211
                finally
212
                {
213
                    context.setState(Polyline.FirstPoint);
214

    
215
                    if (loopbackFlag == false)
216
                    {
217
                        (context.getState()).Entry(context);
218
                    }
219

    
220
                }
221
            }
222
            else
223
            {
224
                boolean loopbackFlag =
225
                    context.getState().getName().equals(
226
                        Polyline.FirstPoint.getName());
227

    
228
                if (loopbackFlag == false)
229
                {
230
                    (context.getState()).Exit(context);
231
                }
232

    
233
                context.clearState();
234
                try
235
                {
236
                    ctxt.throwOptionException(PluginServices.getText(this,"incorrect_option"), s);
237
                }
238
                finally
239
                {
240
                    context.setState(Polyline.FirstPoint);
241

    
242
                    if (loopbackFlag == false)
243
                    {
244
                        (context.getState()).Entry(context);
245
                    }
246

    
247
                }
248
            }
249

    
250
            return;
251
        }
252

    
253
        protected void addValue(PolylineCADToolContext context, double d)
254
        {
255
            PolylineCADTool ctxt = context.getOwner();
256

    
257
            boolean loopbackFlag =
258
                context.getState().getName().equals(
259
                    Polyline.FirstPoint.getName());
260

    
261
            if (loopbackFlag == false)
262
            {
263
                (context.getState()).Exit(context);
264
            }
265

    
266
            context.clearState();
267
            try
268
            {
269
                ctxt.throwValueException(PluginServices.getText(this,"incorrect_value"), d);
270
            }
271
            finally
272
            {
273
                context.setState(Polyline.FirstPoint);
274

    
275
                if (loopbackFlag == false)
276
                {
277
                    (context.getState()).Entry(context);
278
                }
279

    
280
            }
281
            return;
282
        }
283

    
284
        protected void addPoint(PolylineCADToolContext context, double pointX, double pointY, InputEvent event)
285
        {
286
            PolylineCADTool ctxt = context.getOwner();
287

    
288
            boolean loopbackFlag =
289
                context.getState().getName().equals(
290
                    Polyline.FirstPoint.getName());
291

    
292
            if (loopbackFlag == false)
293
            {
294
                (context.getState()).Exit(context);
295
            }
296

    
297
            context.clearState();
298
            try
299
            {
300
                ctxt.throwPointException(PluginServices.getText(this,"incorrect_point"), pointX, pointY);
301
            }
302
            finally
303
            {
304
                context.setState(Polyline.FirstPoint);
305

    
306
                if (loopbackFlag == false)
307
                {
308
                    (context.getState()).Entry(context);
309
                }
310

    
311
            }
312
            return;
313
        }
314

    
315
    //-----------------------------------------------------------
316
    // Inner classse.
317
    //
318

    
319

    
320
        private static final class Polyline_FirstPoint
321
            extends Polyline_Default
322
        {
323
        //-------------------------------------------------------
324
        // Member methods.
325
        //
326

    
327
            private Polyline_FirstPoint(String name, int id)
328
            {
329
                super (name, id);
330
            }
331

    
332
            protected void Entry(PolylineCADToolContext context)
333
            {
334
                PolylineCADTool ctxt = context.getOwner();
335

    
336
                ctxt.setQuestion(PluginServices.getText(this,"insert_first_point"));
337
                ctxt.setDescription(new String[]{"cancel"});
338
                return;
339
            }
340

    
341
            protected void addPoint(PolylineCADToolContext context, double pointX, double pointY, InputEvent event)
342
            {
343
                PolylineCADTool ctxt = context.getOwner();
344

    
345
                if (ctxt.isPolygonLayer())
346
                {
347

    
348
                    (context.getState()).Exit(context);
349
                    context.clearState();
350
                    try
351
                    {
352
                        ctxt.setQuestion(PluginServices.getText(this,"insert_next_point")+", "+
353
                                    PluginServices.getText(this,"arc")+
354
                                    "["+PluginServices.getText(this,"PolylineCADTool.arc")+"], "+
355
                                    PluginServices.getText(this,"cad.or")+" "+
356
                                    PluginServices.getText(this,"end")+
357
                                           "["+PluginServices.getText(this,"PolylineCADTool.end")+"]");
358
                        ctxt.setDescription(new String[]{"inter_arc", "terminate", "cancel"});
359
                        ctxt.addPoint(pointX, pointY, event);
360
                    }
361
                    finally
362
                    {
363
                        context.setState(Polyline.NextPointOrArcOrClose);
364
                        (context.getState()).Entry(context);
365
                    }
366
                }
367
                else
368
                {
369

    
370
                    (context.getState()).Exit(context);
371
                    context.clearState();
372
                    try
373
                    {
374
                        ctxt.setQuestion(PluginServices.getText(this,"insert_next_point")+", "+
375
                                    PluginServices.getText(this,"arc")+
376
                                    "["+PluginServices.getText(this,"PolylineCADTool.arc")+"], "+
377
                                    PluginServices.getText(this,"close_polyline")+
378
                                    "["+PluginServices.getText(this,"PolylineCADTool.close_polyline")+"], "+
379
                                    PluginServices.getText(this,"cad.or")+" "+
380
                                    PluginServices.getText(this,"end")+
381
                                           "["+PluginServices.getText(this,"PolylineCADTool.end")+"]");
382
                        ctxt.setDescription(new String[]{"inter_arc", "close_polyline", "terminate", "cancel"});
383
                        ctxt.addPoint(pointX, pointY, event);
384
                    }
385
                    finally
386
                    {
387
                        context.setState(Polyline.NextPointOrArcOrClose);
388
                        (context.getState()).Entry(context);
389
                    }
390
                }
391

    
392
                return;
393
            }
394

    
395
        //-------------------------------------------------------
396
        // Member data.
397
        //
398
        }
399

    
400
        private static final class Polyline_NextPointOrArcOrClose
401
            extends Polyline_Default
402
        {
403
        //-------------------------------------------------------
404
        // Member methods.
405
        //
406

    
407
            private Polyline_NextPointOrArcOrClose(String name, int id)
408
            {
409
                super (name, id);
410
            }
411

    
412
            protected void addOption(PolylineCADToolContext context, String s)
413
            {
414
                PolylineCADTool ctxt = context.getOwner();
415

    
416
                if (ctxt.isPolygonLayer() && (s.equalsIgnoreCase(PluginServices.getText(this,"PolylineCADTool.arc")) || s.equals(PluginServices.getText(this,"inter_arc"))))
417
                {
418

    
419
                    (context.getState()).Exit(context);
420
                    context.clearState();
421
                    try
422
                    {
423
                        ctxt.setQuestion(PluginServices.getText(this,"insert_next_point")+", "+
424
                                PluginServices.getText(this,"line")+
425
                                "["+PluginServices.getText(this,"PolylineCADTool.line")+"], "+
426
                                PluginServices.getText(this,"cad.or")+" "+
427
                                PluginServices.getText(this,"end")+
428
                                "["+PluginServices.getText(this,"PolylineCADTool.end")+"]");
429
                        ctxt.setDescription(new String[]{"inter_line", "terminate", "cancel"});
430
                        ctxt.addOption(s);
431
                    }
432
                    finally
433
                    {
434
                        context.setState(Polyline.NextPointOrLineOrClose);
435
                        (context.getState()).Entry(context);
436
                    }
437
                }
438
                else if (s.equalsIgnoreCase(PluginServices.getText(this,"PolylineCADTool.arc")) || s.equals(PluginServices.getText(this,"inter_arc")))
439
                {
440

    
441
                    (context.getState()).Exit(context);
442
                    context.clearState();
443
                    try
444
                    {
445
                        ctxt.setQuestion(PluginServices.getText(this,"insert_next_point")+", "+
446
                                PluginServices.getText(this,"line")+
447
                                "["+PluginServices.getText(this,"PolylineCADTool.line")+"], "+
448
                                PluginServices.getText(this,"close_polyline")+
449
                                "["+PluginServices.getText(this,"PolylineCADTool.close_polyline")+"], "+
450
                                PluginServices.getText(this,"cad.or")+" "+
451
                                PluginServices.getText(this,"end")+
452
                                "["+PluginServices.getText(this,"PolylineCADTool.end")+"]");
453
                        ctxt.setDescription(new String[]{"inter_line", "close_polyline", "terminate", "cancel"});
454
                        ctxt.addOption(s);
455
                    }
456
                    finally
457
                    {
458
                        context.setState(Polyline.NextPointOrLineOrClose);
459
                        (context.getState()).Entry(context);
460
                    }
461
                }
462
                else if (s.equalsIgnoreCase(PluginServices.getText(this,"PolylineCADTool.close_polyline")) || s.equals(PluginServices.getText(this,"close_polyline")))
463
                {
464

    
465
                    (context.getState()).Exit(context);
466
                    context.clearState();
467
                    try
468
                    {
469
                        ctxt.addOption(s);
470
                        ctxt.closeGeometry();
471
                        ctxt.endGeometry();
472
                        ctxt.end();
473
                    }
474
                    finally
475
                    {
476
                        context.setState(Polyline.FirstPoint);
477
                        (context.getState()).Entry(context);
478
                    }
479
                }
480
                else if ((s.equalsIgnoreCase(PluginServices.getText(this,"PolylineCADTool.end")) || s.equals(PluginServices.getText(this,"terminate"))) && ctxt.getLinesCount()!=0 )
481
                {
482

    
483
                    (context.getState()).Exit(context);
484
                    context.clearState();
485
                    try
486
                    {
487
                        ctxt.addOption(s);
488
                        ctxt.endGeometry();
489
                        ctxt.end();
490
                    }
491
                    finally
492
                    {
493
                        context.setState(Polyline.FirstPoint);
494
                        (context.getState()).Entry(context);
495
                    }
496
                }
497
                else if (!s.equals(PluginServices.getText(this,"cancel")))
498
                {
499

    
500
                    // No actions.
501
                }                else
502
                {
503
                    super.addOption(context, s);
504
                }
505

    
506
                return;
507
            }
508

    
509
            protected void addPoint(PolylineCADToolContext context, double pointX, double pointY, InputEvent event)
510
            {
511
                PolylineCADTool ctxt = context.getOwner();
512

    
513
                if (ctxt.isPolygonLayer())
514
                {
515
                    PolylineCADToolState endState = context.getState();
516

    
517
                    context.clearState();
518
                    try
519
                    {
520
                        ctxt.setQuestion(PluginServices.getText(this,"insert_next_point")+", "+
521
                                PluginServices.getText(this,"arc")+
522
                                "["+PluginServices.getText(this,"PolylineCADTool.arc")+"], "+
523
                                PluginServices.getText(this,"cad.or")+" "+
524
                                PluginServices.getText(this,"end")+
525
                                "["+PluginServices.getText(this,"PolylineCADTool.end")+"]");
526
                        ctxt.setDescription(new String[]{"inter_arc", "terminate", "cancel"});
527
                        ctxt.addPoint(pointX, pointY, event);
528
                    }
529
                    finally
530
                    {
531
                        context.setState(endState);
532
                    }
533
                }
534
                else
535
                {
536
                    PolylineCADToolState endState = context.getState();
537

    
538
                    context.clearState();
539
                    try
540
                    {
541
                        ctxt.setQuestion(PluginServices.getText(this,"insert_next_point")+", "+
542
                                PluginServices.getText(this,"arc")+
543
                                "["+PluginServices.getText(this,"PolylineCADTool.arc")+"], "+
544
                                PluginServices.getText(this,"close_polyline")+
545
                                "["+PluginServices.getText(this,"PolylineCADTool.close_polyline")+"], "+
546
                                PluginServices.getText(this,"cad.or")+" "+
547
                                PluginServices.getText(this,"end")+
548
                                "["+PluginServices.getText(this,"PolylineCADTool.end")+"]");
549
                        ctxt.setDescription(new String[]{"inter_arc", "close_polyline", "terminate", "cancel"});
550
                        ctxt.addPoint(pointX, pointY, event);
551
                    }
552
                    finally
553
                    {
554
                        context.setState(endState);
555
                    }
556
                }
557

    
558
                return;
559
            }
560

    
561
        //-------------------------------------------------------
562
        // Member data.
563
        //
564
        }
565

    
566
        private static final class Polyline_NextPointOrLineOrClose
567
            extends Polyline_Default
568
        {
569
        //-------------------------------------------------------
570
        // Member methods.
571
        //
572

    
573
            private Polyline_NextPointOrLineOrClose(String name, int id)
574
            {
575
                super (name, id);
576
            }
577

    
578
            protected void addOption(PolylineCADToolContext context, String s)
579
            {
580
                PolylineCADTool ctxt = context.getOwner();
581

    
582
                if (ctxt.isPolygonLayer() && (s.equalsIgnoreCase(PluginServices.getText(this,"PolylineCADTool.line")) || s.equals(PluginServices.getText(this,"inter_line"))))
583
                {
584

    
585
                    (context.getState()).Exit(context);
586
                    context.clearState();
587
                    try
588
                    {
589
                        ctxt.setQuestion(PluginServices.getText(this,"insert_next_point")+", "+
590
                                PluginServices.getText(this,"arc")+
591
                                "["+PluginServices.getText(this,"PolylineCADTool.arc")+"], "+
592
                                PluginServices.getText(this,"cad.or")+" "+
593
                                PluginServices.getText(this,"end")+
594
                                "["+PluginServices.getText(this,"PolylineCADTool.end")+"]");
595
                        ctxt.setDescription(new String[]{"inter_arc", "terminate", "cancel"});
596
                        ctxt.addOption(s);
597
                    }
598
                    finally
599
                    {
600
                        context.setState(Polyline.NextPointOrArcOrClose);
601
                        (context.getState()).Entry(context);
602
                    }
603
                }
604
                else if (s.equalsIgnoreCase(PluginServices.getText(this,"PolylineCADTool.line")) || s.equals(PluginServices.getText(this,"inter_line")))
605
                {
606

    
607
                    (context.getState()).Exit(context);
608
                    context.clearState();
609
                    try
610
                    {
611
                        ctxt.setQuestion(PluginServices.getText(this,"insert_next_point")+", "+
612
                                PluginServices.getText(this,"arc")+
613
                                "["+PluginServices.getText(this,"PolylineCADTool.arc")+"], "+
614
                                PluginServices.getText(this,"close_polyline")+
615
                                "["+PluginServices.getText(this,"PolylineCADTool.close_polyline")+"], "+
616
                                PluginServices.getText(this,"cad.or")+" "+
617
                                PluginServices.getText(this,"end")+
618
                                "["+PluginServices.getText(this,"PolylineCADTool.end")+"]");
619
                        ctxt.setDescription(new String[]{"inter_arc", "close_polyline", "terminate", "cancel"});
620
                        ctxt.addOption(s);
621
                    }
622
                    finally
623
                    {
624
                        context.setState(Polyline.NextPointOrArcOrClose);
625
                        (context.getState()).Entry(context);
626
                    }
627
                }
628
                else if (s.equalsIgnoreCase(PluginServices.getText(this,"PolylineCADTool.close_polyline")) || s.equals(PluginServices.getText(this,"close_polyline")))
629
                {
630

    
631
                    (context.getState()).Exit(context);
632
                    context.clearState();
633
                    try
634
                    {
635
                        ctxt.addOption(s);
636
                        ctxt.closeGeometry();
637
                        ctxt.endGeometry();
638
                        ctxt.end();
639
                    }
640
                    finally
641
                    {
642
                        context.setState(Polyline.FirstPoint);
643
                        (context.getState()).Entry(context);
644
                    }
645
                }
646
                else if ((s.equalsIgnoreCase(PluginServices.getText(this,"PolylineCADTool.end")) || s.equals(PluginServices.getText(this,"terminate"))) && ctxt.getLinesCount()!=0)
647
                {
648

    
649
                    (context.getState()).Exit(context);
650
                    context.clearState();
651
                    try
652
                    {
653
                        ctxt.addOption(s);
654
                        ctxt.endGeometry();
655
                        ctxt.end();
656
                    }
657
                    finally
658
                    {
659
                        context.setState(Polyline.FirstPoint);
660
                        (context.getState()).Entry(context);
661
                    }
662
                }
663
                else if (!s.equals(PluginServices.getText(this,"cancel")))
664
                {
665

    
666
                    // No actions.
667
                }                else
668
                {
669
                    super.addOption(context, s);
670
                }
671

    
672
                return;
673
            }
674

    
675
            protected void addPoint(PolylineCADToolContext context, double pointX, double pointY, InputEvent event)
676
            {
677
                PolylineCADTool ctxt = context.getOwner();
678

    
679
                if (ctxt.isPolygonLayer())
680
                {
681
                    PolylineCADToolState endState = context.getState();
682

    
683
                    context.clearState();
684
                    try
685
                    {
686
                        ctxt.setQuestion(PluginServices.getText(this,"insert_next_point")+", "+
687
                                PluginServices.getText(this,"line")+
688
                                "["+PluginServices.getText(this,"PolylineCADTool.line")+"], "+
689
                                PluginServices.getText(this,"cad.or")+" "+
690
                                PluginServices.getText(this,"end")+
691
                                "["+PluginServices.getText(this,"PolylineCADTool.end")+"]");
692
                        ctxt.setDescription(new String[]{"inter_line", "terminate", "cancel"});
693
                        ctxt.addPoint(pointX, pointY, event);
694
                    }
695
                    finally
696
                    {
697
                        context.setState(endState);
698
                    }
699
                }
700
                else
701
                {
702
                    PolylineCADToolState endState = context.getState();
703

    
704
                    context.clearState();
705
                    try
706
                    {
707
                        ctxt.setQuestion(PluginServices.getText(this,"insert_next_point")+", "+
708
                                PluginServices.getText(this,"line")+
709
                                "["+PluginServices.getText(this,"PolylineCADTool.line")+"], "+
710
                                PluginServices.getText(this,"close_polyline")+
711
                                "["+PluginServices.getText(this,"PolylineCADTool.close_polyline")+"], "+
712
                                PluginServices.getText(this,"cad.or")+" "+
713
                                PluginServices.getText(this,"end")+
714
                                "["+PluginServices.getText(this,"PolylineCADTool.end")+"]");
715
                        ctxt.setDescription(new String[]{"inter_line", "close_polyline", "terminate", "cancel"});
716
                        ctxt.addPoint(pointX, pointY, event);
717
                    }
718
                    finally
719
                    {
720
                        context.setState(endState);
721
                    }
722
                }
723

    
724
                return;
725
            }
726

    
727
        //-------------------------------------------------------
728
        // Member data.
729
        //
730
        }
731

    
732
    //-----------------------------------------------------------
733
    // Member data.
734
    //
735
    }
736
}