1   /****************************************************************************
2    **
3    ** This file is part of yFiles-2.6. 
4    ** 
5    ** yWorks proprietary/confidential. Use is subject to license terms.
6    **
7    ** Redistribution of this file or of an unauthorized byte-code version
8    ** of this file is strictly forbidden.
9    **
10   ** Copyright (c) 2000-2008 by yWorks GmbH, Vor dem Kreuzberg 28, 
11   ** 72070 Tuebingen, Germany. All rights reserved.
12   **
13   ***************************************************************************/
14  package demo.view.viewmode;
15  
16  import demo.view.DemoBase;
17  import y.base.Edge;
18  import y.base.Node;
19  import y.view.CreateEdgeMode;
20  import y.view.EditMode;
21  import y.view.HitInfo;
22  
23  import javax.swing.JOptionPane;
24  import java.awt.Color;
25  
26  /**
27   * Demonstrates how to customize CreateEdgeMode in order to control
28   * the creation of edges.
29   * <br>
30   * This demo only allows the creation of edges that start with nodes
31   * that have an evenly numbered label and 
32   * end with nodes that have unevenly numbered labels.
33   */
34  public class CreateEdgeModeDemo extends DemoBase {
35    // whether or not to display a message box when edge creation 
36    // is not allowed.
37    boolean showMessage = true;
38  
39    protected void registerViewModes() {
40      EditMode editMode = new EditMode();
41      view.addViewMode( editMode );
42      //set a custom CreateEdgeMode for the edge mode
43      editMode.setCreateEdgeMode( new DemoCreateEdgeMode() );
44    }
45  
46  
47    class DemoCreateEdgeMode extends CreateEdgeMode {
48  
49      public void edgeMoved( double x, double y ) {
50        super.edgeMoved( x, y );
51        updateDummy( x, y );
52      }
53  
54      public void edgeCreated( Edge e ) {
55        getGraph2D().getRealizer( e ).setLineColor( getGraph2D().getDefaultEdgeRealizer().getLineColor() );
56      }
57  
58      private void updateDummy( double x, double y ) {
59        Node hitNode = (new HitInfo(view, x, y, true, HitInfo.NODE)).getHitNode();
60        if ( hitNode != null ) {
61          if ( acceptTargetNode( hitNode, x, y ) ) {
62            getDummyEdgeRealizer().setLineColor( Color.green );
63          } else {
64            getDummyEdgeRealizer().setLineColor( Color.red );
65          }
66        } else {
67          getDummyEdgeRealizer().setLineColor( getGraph2D().getDefaultEdgeRealizer().getLineColor() );
68        }
69      }
70  
71      protected boolean acceptSourceNode( Node source, double x, double y ) {
72        try {
73          return Integer.parseInt( getGraph2D().getLabelText( source ) ) % 2 == 0;
74        } catch ( Exception ex ) {
75          return true;
76        }
77      }
78  
79      protected void sourceNodeDeclined( Node source, double x, double y ) {
80        if ( showMessage ) {
81          cancelEdgeCreation();
82          JOptionPane.showMessageDialog( this.view,
83                                         "Only start nodes with even numbers allowed!",
84                                         "Forbidden!",
85                                         JOptionPane.ERROR_MESSAGE );
86        }
87      }
88  
89      protected boolean acceptTargetNode( Node target, double x, double y ) {
90        try {
91          return Integer.parseInt( getGraph2D().getLabelText( target ) ) % 2 != 0;
92        } catch ( Exception ex ) {
93          return true;
94        }
95      }
96  
97      protected void targetNodeDeclined( Node target, double x, double y ) {
98        if ( showMessage ) {
99          cancelEdgeCreation();
100         JOptionPane.showMessageDialog( this.view,
101                                        "Only end nodes with uneven numbers allowed!",
102                                        "Forbidden!",
103                                        JOptionPane.ERROR_MESSAGE );
104 
105       }
106     }
107   }
108 
109   public static void main( String args[] ) {
110     CreateEdgeModeDemo demo = new CreateEdgeModeDemo();
111     demo.start( "Create Edge Mode Demo" );
112   }
113 }
114 
115 
116       
117