Merging functionality added, rough round the corners.
[scpubgit/stemmaweb.git] / root / js / detach_helpers.js
CommitLineData
8cd2e785 1function edges_of( ellipse ) {
2 var edges = new Array();
3 var node_id = ellipse.parent().attr('id');
4 var edge_in_pattern = new RegExp( node_id + '$' );
5 $.each( $('#svgenlargement .edge'), function(index) {
6 title = $(this).children('title').text();
7 if( title.search( node_id ) > -1 ) {
8 var edge = new Edge( $(this) );
9 edge.node_id = node_id;
10 if( edge_in_pattern.test(title) ) {
11 edge.is_incoming = true;
12 }
13 edges.push( edge );
14 }
15 } );
16 return edges;
17}
18
19function Edge( g_elem ) {
20
21 var self = this;
22
23 this.g_elem = g_elem;
24 this.witnesses = g_elem.children('text').text().split( /,\s*/ );
25 this.is_incoming = false;
9231663d 26 this.start_node_id = g_elem.children('title').text().split('-')[0];
27 this.end_node_id = g_elem.children('title').text().split('>')[1];
8cd2e785 28
29 this.detach_witnesses = function( witnesses_to_detach ) {
30 var detached = [];
31 var left = '';
32 var clone = null;
33 $.each( witnesses_to_detach, function( index, witness_to_detach ) {
34 witness_index = self.witnesses.indexOf( witness_to_detach );
35 if( witness_index > -1 ) {
36 self.witnesses.splice( witness_index, 1 );
37 detached.push( witness_to_detach );
38 }
39 } );
40 if( detached != '' ) {
41 clone = self.clone_for( detached );
42 }
43 var remaining = self.create_label( self.witnesses );
44 if( remaining == '' ) {
45 self.g_elem.remove();
46 } else {
47 self.g_elem.children('text').text( remaining );
48 }
49 return clone;
50 }
51
52 this.get_label = function() {
53 return self.g_elem.children('text').text();
54 }
55
56 this.create_label = function( witnesses ) {
57 var label = '';
58 $.each( witnesses, function( index, witness ) {
59 label = label + witness + ', ';
60 } );
61 label = label.replace( /, $/, '' );
62 return label;
63 }
64
65 this.clone_for = function( witnesses ) {
66 var label = self.create_label( witnesses );
67 var clone = g_elem.clone();
68 clone.children('text').text( label );
6c8d1880 69 var duplicate_data = g_elem.data( 'repositioned' );
70 if( duplicate_data != null ) {
71 clone.data( 'repositioned', duplicate_data );
72 }
73 clone = new Edge( clone );
8cd2e785 74 clone.is_incoming = self.is_incoming;
75 return clone;
76 }
77
9231663d 78 this.attach_witnesses = function( witnesses ) {
79 self.witnesses.concat( witnesses );
80 self.g_elem.children( 'text' ).text( self.create_label( self.witnesses ) );
81 var edge_weight = 0.8 + ( 0.2 * self.witnesses.length );
82 self.g_elem.children( 'path' ).attr( 'stroke-width', edge_weight );
83
84 }
85
86 this.attach_endpoint = function( target_node_id ) {
87 // first let's find out if the startpoint might also be linked to the target already
88 // in that case we need to remove this edge and transfer the witnesses to the
89 // appropriate edge of the target_node
90 $.each( edges_of( get_ellipse( target_node_id ) ), function( index, target_edge ) {
91 if( (self != null) && (self.start_node_id == target_edge.start_node_id) ) {
92 target_edge.attach_witnesses( self.witnesses );
93 self.g_elem.remove();
94 self = null;
95 }
96 } );
97 // if not let's really move the end pointer towards the target node
98 if( self != null ) {
99 var polygon = self.g_elem.children( 'polygon' );
100 if( polygon.size() > 0 ) {
101 var end_point_arrowhead = new svgshape( polygon );
102 var path_segments = self.g_elem.children('path')[0].pathSegList;
103 var edge_path = new svgpath( path_segments.getItem(path_segments.numberOfItems - 1), self.g_elem.children('path') );
104 var target_ellipse = get_ellipse( target_node_id );
105 var target_cx = target_ellipse.attr( 'cx' );
106 var target_cy = target_ellipse.attr( 'cy' );
107 var target_rx = target_ellipse.attr( 'rx' );
108 var source_ellipse = get_ellipse( self.end_node_id );
109 var source_cx = source_ellipse.attr( 'cx' );
110 var source_cy = source_ellipse.attr( 'cy' );
111 var source_rx = source_ellipse.attr( 'rx' );
112 var dx = (target_cx - target_rx) - (source_cx - source_rx);
113 var dy = (target_cy - source_cy);
114 end_point_arrowhead.reposition( dx, dy );
115 edge_path.reposition( dx, dy );
116 }
117 }
118 }
119
120 this.attach_startpoint = function( target_node_id ) {
121 // first let's find out if the endpoint might also be linked to the target already
122 // in that case we need to remove this edge and transfer the witnesses to the
123 // appropriate edge of the target_node
124 $.each( edges_of( get_ellipse( target_node_id ) ), function( index, target_edge ) {
125 if( (self != null) && (self.end_node_id == target_edge.end_node_id) ) {
126 target_edge.attach_witnesses( self.witnesses );
127 self.g_elem.remove();
128 self = null;
129 }
130 } );
131 // if not let's really move the end pointer towards the target node
132 if( self != null ) {
133 var path_segments = self.g_elem.children('path')[0].pathSegList;
134 var edge_path = new svgpath( path_segments.getItem(0), self.g_elem.children('path') );
135 var target_ellipse = get_ellipse( target_node_id );
136 var target_cx = target_ellipse.attr( 'cx' );
137 var target_cy = target_ellipse.attr( 'cy' );
138 var target_rx = target_ellipse.attr( 'rx' );
139 var source_ellipse = get_ellipse( self.start_node_id );
140 var source_cx = source_ellipse.attr( 'cx' );
141 var source_cy = source_ellipse.attr( 'cy' );
142 var source_rx = source_ellipse.attr( 'rx' );
143 var dx = (target_cx + target_rx) - (source_cx + source_rx);
144 var dy = (target_cy - source_cy);
145 edge_path.reposition( dx, dy );
146 }
8cd2e785 147 }
148
149}