Changeset 5288
- Timestamp:
- 11/27/07 08:35:06 (1 year ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
sandbox/elemoine/regular-polygon/examples/modify-feature.html
r5286 r5288 54 54 polygon: new OpenLayers.Control.DrawFeature(vectors, 55 55 OpenLayers.Handler.Polygon), 56 regular: new OpenLayers.Control.DrawFeature(vectors, 57 OpenLayers.Handler.RegularPolygon, 58 {handlerOptions: {sides: 5}}), 56 59 modify: new OpenLayers.Control.ModifyFeature(vectors, 57 60 modifyOptions) … … 66 69 } 67 70 71 function update() { 72 var rotate = document.getElementById("rotate").checked; 73 controls.modify.rotate = rotate; 74 var resize = document.getElementById("resize").checked; 75 controls.modify.resize = resize; 76 var drag = document.getElementById("drag").checked; 77 controls.modify.drag = drag; 78 var sides = parseInt(document.getElementById("sides").value); 79 sides = Math.max(3, isNaN(sides) ? 0 : sides); 80 controls.regular.handler.sides = sides; 81 var irregular = document.getElementById("irregular").checked; 82 controls.regular.handler.irregular = irregular; 83 } 68 84 69 85 function toggleControl(element) { … … 103 119 </li> 104 120 <li> 121 <input type="radio" name="type" value="regular" id="regularToggle" onclick="toggleControl(this);" /> 122 <label for="regularToggle">draw regular polygon</label> 123 <label for="sides"> - sides</label> 124 <input id="sides" type="text" size="2" maxlength="2" 125 name="sides" value="5" onchange="update()" /> 126 <ul> 127 <li> 128 <input id="irregular" type="checkbox" 129 name="irregular" onchange="update()" /> 130 <label for="irregular">irregular</label> 131 </li> 132 </ul> 133 </li> 134 <li> 105 135 <input type="radio" name="type" value="modify" id="modifyToggle" 106 136 onclick="toggleControl(this);" /> 107 137 <label for="modifyToggle">modify feature</label> 138 <ul> 139 <li> 140 <input id="rotate" type="checkbox" 141 name="rotate" onchange="update()" /> 142 <label for="rotate">allow rotation</label> 143 </li> 144 <li> 145 <input id="resize" type="checkbox" 146 name="resize" onchange="update()" /> 147 <label for="resize">allow resizing</label> 148 </li> 149 <li> 150 <input id="drag" type="checkbox" 151 name="drag" onchange="update()" /> 152 <label for="drag">allow dragging</label> 153 </li> 154 </ul> 108 155 </li> 109 156 </ul> sandbox/elemoine/regular-polygon/lib/OpenLayers/Control/ModifyFeature.js
r5286 r5288 87 87 */ 88 88 virtualStyle: null, 89 89 90 /** 91 * APIProperty: rotate 92 * {Boolean} Allow rotation of feature instead of vertex modification. 93 */ 94 rotate: false, 95 96 /** 97 * APIProperty: resize 98 * {Boolean} Allow resizing of feature instead of vertex modification. 99 */ 100 resize: false, 101 102 /** 103 * Property: radiusHandle 104 * {<OpenLayers.Feature.Vector>} A handle for rotating/resizing a feature. 105 */ 106 radiusHandle: null, 107 108 /** 109 * APIProperty: drag 110 * {Boolean} Allow dragging of feature with a drag handle. 111 */ 112 drag: false, 113 114 /** 115 * Property: dragHandle 116 * {<OpenLayers.Feature.Vector>} A handle for dragging a feature. 117 */ 118 dragHandle: null, 119 90 120 /** 91 121 * APIProperty: onModificationStart … … 251 281 unselectFeature: function(feature) { 252 282 this.layer.removeFeatures(this.vertices); 253 this.layer.removeFeatures(this.virtualVertices);254 283 this.vertices = []; 284 this.layer.destroyFeatures(this.virtualVertices); 255 285 this.virtualVertices = []; 286 if(this.dragHandle) { 287 this.layer.destroyFeatures([this.dragHandle]); 288 delete this.dragHandle; 289 } 290 if(this.radiusHandle) { 291 this.layer.destroyFeatures([this.radiusHandle]); 292 delete this.radiusHandle; 293 } 256 294 this.feature = null; 257 295 this.dragControl.deactivate(); … … 275 313 dragStart: function(feature, pixel) { 276 314 // only change behavior if the feature is not in the vertices array 277 if(feature != this.feature && 278 OpenLayers.Util.indexOf(this.vertices, feature) == -1 && 279 OpenLayers.Util.indexOf(this.virtualVertices, feature) == -1) { 315 if(feature != this.feature && !feature.geometry.parent && 316 feature != this.dragHandle && feature != this.radiusHandle) { 280 317 if(this.feature) { 281 318 // unselect the currently selected feature … … 316 353 */ 317 354 dragVertex: function(vertex) { 355 /** 356 * Five cases: 357 * 1) dragging a simple point 358 * 2) dragging a virtual vertex 359 * 3) dragging a drag handle 360 * 4) dragging a radius handle 361 * 5) dragging a real vertex 362 */ 318 363 if(this.feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { 364 // dragging a simple point 319 365 if(this.feature != vertex) { 320 366 this.feature = vertex; 321 367 } 322 368 } else { 323 if(OpenLayers.Util.indexOf(this.virtualVertices, vertex) != -1) { 369 if(vertex._index) { 370 // dragging a virtual vertex 324 371 vertex.geometry.parent.addComponent(vertex.geometry, 325 372 vertex._index); 326 373 delete vertex._index; 327 374 OpenLayers.Util.removeItem(this.virtualVertices, vertex); 328 this.layer.removeFeatures(vertex); 329 } 330 } 331 this.layer.drawFeature(this.feature, this.selectControl.selectStyle); 332 this.layer.removeFeatures(this.virtualVertices); 375 } else if(vertex == this.dragHandle) { 376 // dragging a drag handle 377 this.layer.removeFeatures(this.vertices); 378 this.vertices = []; 379 if(this.radiusHandle) { 380 this.layer.destroyFeatures([this.radiusHandle]); 381 this.radiusHandle = null; 382 } 383 } 384 // dragging a radius handle - no special treatment 385 // dragging a real vertex - no special treatment 386 this.layer.destroyFeatures(this.virtualVertices); 387 this.virtualVertices = []; 388 this.layer.drawFeature(this.feature, this.selectControl.selectStyle); 389 } 333 390 // keep the vertex on top so it gets the mouseout after dragging 334 391 // this should be removed in favor of an option to draw under or … … 361 418 this.virtualVertices = []; 362 419 } 420 if(this.dragHandle) { 421 this.layer.destroyFeatures([this.dragHandle]); 422 this.dragHandle = null; 423 } 424 if(this.radiusHandle) { 425 this.layer.destroyFeatures([this.radiusHandle]); 426 this.radiusHandle = null; 427 } 363 428 if(this.feature && 364 429 this.feature.geometry.CLASS_NAME != "OpenLayers.Geometry.Point") { 365 this.collectVertices(this.feature.geometry); 366 this.layer.addFeatures(this.vertices); 367 this.layer.addFeatures(this.virtualVertices); 430 if(this.drag) { 431 this.collectDragHandle(); 432 } 433 if(this.rotate || this.resize) { 434 this.collectRadiusHandle(); 435 } else { 436 this.collectVertices(); 437 } 368 438 } 369 439 }, … … 386 456 if(vertex && 387 457 OpenLayers.Util.indexOf(this.vertices, vertex) != -1 && 388 !this.dragControl.dragHandler.dragging) { 458 !this.dragControl.dragHandler.dragging && 459 vertex.geometry.parent) { 389 460 // remove the vertex 390 461 vertex.geometry.parent.removeComponent(vertex.geometry); … … 443 514 } 444 515 } 445 } 446 collectComponentVertices(this.feature.geometry); 516 } 517 collectComponentVertices.call(this, this.feature.geometry); 518 this.layer.addFeatures(this.vertices); 519 this.layer.addFeatures(this.virtualVertices); 520 }, 521 522 /** 523 * Method: collectDragHandle 524 * Collect the drag handle for the selected geometry. 525 */ 526 collectDragHandle: function() { 527 var geometry = this.feature.geometry; 528 var center = geometry.getBounds().getCenterLonLat(); 529 var originGeometry = new OpenLayers.Geometry.Point( 530 center.lon, center.lat 531 ); 532 var origin = new OpenLayers.Feature.Vector(originGeometry); 533 originGeometry.move = function(x, y) { 534 OpenLayers.Geometry.Point.prototype.move.call(this, x, y); 535 geometry.move(x, y); 536 } 537 this.dragHandle = origin; 538 this.layer.addFeatures([this.dragHandle]); 539 }, 540 541 /** 542 * Method: collectRadiusHandle 543 * Collect the radius handle for the selected geometry. 544 */ 545 collectRadiusHandle: function() { 546 var geometry = this.feature.geometry; 547 var bounds = geometry.getBounds(); 548 var center = bounds.getCenterLonLat(); 549 var originGeometry = new OpenLayers.Geometry.Point( 550 center.lon, center.lat 551 ); 552 var radiusGeometry = new OpenLayers.Geometry.Point( 553 bounds.right, bounds.bottom 554 ); 555 var radius = new OpenLayers.Feature.Vector(radiusGeometry); 556 var resize = this.resize; 557 var rotate = this.rotate; 558 radiusGeometry.move = function(x, y) { 559 OpenLayers.Geometry.Point.prototype.move.call(this, x, y); 560 var dx1 = this.x - originGeometry.x; 561 var dy1 = this.y - originGeometry.y; 562 var dx0 = dx1 - x; 563 var dy0 = dy1 - y; 564 if(rotate) { 565 var a0 = Math.atan2(dy0, dx0); 566 var a1 = Math.atan2(dy1, dx1); 567 var angle = a1 - a0; 568 angle *= 180 / Math.PI; 569 geometry.rotate(angle, originGeometry); 570 } 571 if(resize) { 572 var l0 = Math.sqrt((dx0 * dx0) + (dy0 * dy0)); 573 var l1 = Math.sqrt((dx1 * dx1) + (dy1 * dy1)); 574 geometry.resize(l1 / l0, originGeometry); 575 } 576 } 577 this.radiusHandle = radius; 578 this.layer.addFeatures([this.radiusHandle]); 447 579 }, 448 580 sandbox/elemoine/regular-polygon/lib/OpenLayers/Layer/Vector.js
r5286 r5288 308 308 /** 309 309 * APIMethod: destroyFeatures 310 * Destroy all features on the layer and empty the selected features array. 311 */ 312 destroyFeatures: function () { 313 this.selectedFeatures = []; 314 for (var i = this.features.length - 1; i >= 0; i--) { 315 this.features[i].destroy(); 310 * Erase and estroy features on the layer. 311 * 312 * Parameters: 313 * features - {Array(<OpenLayers.Feature.Vector>)} An optional array of 314 * features to destroy. If not supplied, all features on the layer 315 * will be destroyed. 316 */ 317 destroyFeatures: function(features) { 318 var all = (features == undefined); 319 if(all) { 320 features = this.features; 321 this.selectedFeatures = []; 322 } 323 this.eraseFeatures(features); 324 var feature; 325 for(var i=features.length-1; i>=0; i--) { 326 feature = features[i]; 327 if(!all) { 328 OpenLayers.Util.removeItem(this.selectedFeatures, feature); 329 } 330 feature.destroy(); 316 331 } 317 332 },
