comparison webapp/src/main/webapp/jquery/jquery.digilib.regions.js @ 1107:365f95a14057

factor out defineArea, using overlay div
author hertzhaft
date Sat, 27 Oct 2012 00:06:29 +0200
parents 415da4e4b76b
children ae796bcac7f4
comparison
equal deleted inserted replaced
1106:68756216e018 1107:365f95a14057
94 icon : "regioninfo.png" 94 icon : "regioninfo.png"
95 } 95 }
96 }; 96 };
97 97
98 var defaults = { 98 var defaults = {
99 // are regions being edited?
100 'editRegions' : false,
101 // are regions shown? 99 // are regions shown?
102 'isRegionVisible' : true, 100 'isRegionVisible' : true,
103 // are region numbers shown? 101 // are region numbers shown?
104 'showRegionNumbers' : true, 102 'showRegionNumbers' : true,
105 // default width for region when only point is given 103 // default width for region when only point is given
142 defineUserRegion : function(data) { 140 defineUserRegion : function(data) {
143 if (!data.settings.isRegionVisible) { 141 if (!data.settings.isRegionVisible) {
144 alert("Please turn on regions visibility!"); 142 alert("Please turn on regions visibility!");
145 return; 143 return;
146 } 144 }
147 var $elem = data.$elem; 145 var onComplete = function(data, rect) {
148 var $body = $('body'); 146 if (rect == null) return;
149 var bodyRect = geom.rectangle($body);
150 var $scaler = data.$scaler;
151 var scalerRect = geom.rectangle($scaler);
152 var pt1, pt2;
153 // overlay prevents other elements from reacting to mouse events
154 var $overlay = $('<div class="'+CSS+'overlay" style="position:absolute"/>');
155 $body.append($overlay);
156 bodyRect.adjustDiv($overlay);
157 var attr = {'class' : CSS+"regionURL"};
158 var $regionDiv = newRegionDiv(data, attr);
159
160 // mousedown handler: start sizing
161 var regionStart = function (evt) {
162 pt1 = geom.position(evt);
163 // setup and show zoom div
164 pt1.adjustDiv($regionDiv);
165 $regionDiv.width(0).height(0);
166 $regionDiv.show();
167 // register mouse events
168 $overlay.on("mousemove.dlRegion", regionMove);
169 $overlay.on("mouseup.dlRegion", regionEnd);
170 return false;
171 };
172
173 // mousemove handler: size region
174 var regionMove = function (evt) {
175 pt2 = geom.position(evt);
176 var rect = geom.rectangle(pt1, pt2);
177 rect.clipTo(scalerRect);
178 // update region
179 rect.adjustDiv($regionDiv);
180 return false;
181 };
182
183 // mouseup handler: end sizing
184 var regionEnd = function (evt) {
185 pt2 = geom.position(evt);
186 // assume a click and continue if the area is too small
187 var clickRect = geom.rectangle(pt1, pt2);
188 if (clickRect.getArea() <= 5) return false;
189 // unregister mouse events and get rid of overlay
190 $overlay.off("mousemove.dlRegion", regionMove);
191 $overlay.off("mouseup.dlRegion", regionEnd);
192 $overlay.remove();
193 // clip region
194 clickRect.clipTo(scalerRect);
195 clickRect.adjustDiv($regionDiv);
196 regionTrafo(data, $regionDiv);
197 var count = getRegions(data, 'regionURL').length; 147 var count = getRegions(data, 'regionURL').length;
198 addRegionNumber(data, $regionDiv, count); 148 var attr = {'class' : CSS+'regionURL '+CSS+'overlay'};
149 var item = {'rect' : rect, 'index' : count, 'attributes' : attr};
150 var $regionDiv = addRegionDiv(data, item);
199 fn.highlightButtons(data, 'defineregion', 0); 151 fn.highlightButtons(data, 'defineregion', 0);
200 redisplay(data); 152 redisplay(data);
201 $(data).trigger('newRegion', [$regionDiv]); 153 $(data).trigger('newRegion', [$regionDiv]);
202 return false; 154 };
203 };
204
205 // bind start zoom handler
206 $overlay.one('mousedown.dlRegion', regionStart);
207 fn.highlightButtons(data, 'defineregion', 1); 155 fn.highlightButtons(data, 'defineregion', 1);
156 fn.defineArea(data, onComplete, CSS+'regionArea');
208 }, 157 },
209 158
210 // remove the last added URL region 159 // remove the last added URL region
211 removeUserRegion : function (data) { 160 removeUserRegion : function (data) {
212 if (!data.settings.isRegionVisible) { 161 if (!data.settings.isRegionVisible) {
213 alert("Please turn on regions visibility!"); 162 alert("Please turn on regions visibility!");
214 return; 163 return;
215 } 164 }
216 var selector = 'div.'+CSS+'regionURL'; 165 var selector = 'div.'+CSS+'regionURL';
217 var $regionDiv = data.$elem.find(selector).last(); 166 var $regionDiv = data.$elem.find(selector).last();
167 if ($regionDiv.length == 0) return;
218 $regionDiv.remove(); 168 $regionDiv.remove();
219 redisplay(data); 169 redisplay(data);
220 }, 170 },
221 171
222 // remove all manually added regions (defined through URL "rg" parameter) 172 // remove all manually added regions (defined through URL "rg" parameter)
225 alert("Please turn on regions visibility!"); 175 alert("Please turn on regions visibility!");
226 return; 176 return;
227 } 177 }
228 var selector = 'div.'+CSS+'regionURL'; 178 var selector = 'div.'+CSS+'regionURL';
229 var $regionDivs = data.$elem.find(selector); 179 var $regionDivs = data.$elem.find(selector);
180 if ($regionDivs.length == 0) return;
230 $regionDivs.remove(); 181 $regionDivs.remove();
231 redisplay(data); 182 redisplay(data);
232 }, 183 },
233 184
234 // show/hide regions 185 // show/hide regions
266 var bind = function(name) { 217 var bind = function(name) {
267 $info.find('.'+name).on('click.regioninfo', function () { 218 $info.find('.'+name).on('click.regioninfo', function () {
268 $info.find('div.'+CSS+'info').hide(); 219 $info.find('div.'+CSS+'info').hide();
269 $info.find('div.'+CSS+name).show(); 220 $info.find('div.'+CSS+name).show();
270 fn.centerOnScreen(data, $info); 221 fn.centerOnScreen(data, $info);
222 return false;
271 }); 223 });
272 }; 224 };
273 bind('html'); 225 bind('html');
274 bind('svgattr'); 226 bind('svgattr');
275 bind('csv'); 227 bind('csv');
276 bind('digilib'); 228 bind('digilib');
229 $info.on('click.regioninfo', function () {
230 fn.withdraw($info);
231 });
277 $info.find('.x').on('click.regioninfo', function () { 232 $info.find('.x').on('click.regioninfo', function () {
278 fn.withdraw($info); 233 fn.withdraw($info);
279 }); 234 });
280 $info.fadeIn(); 235 $info.fadeIn();
281 fn.centerOnScreen(data, $info); 236 fn.centerOnScreen(data, $info);
319 var rect = parseCoords(data, coords); 274 var rect = parseCoords(data, coords);
320 if (rect == null) { 275 if (rect == null) {
321 alert('invalid coordinates: ' + coords); 276 alert('invalid coordinates: ' + coords);
322 return; 277 return;
323 } 278 }
324 var attr = { 'class' : CSS+'regionURL '+CSS+'findregion' }; 279 var attr = { 'class' : CSS+'findregion' };
325 var item = { 'rect' : rect, 'attributes' : attr }; 280 var item = { 'rect' : rect, 'attributes' : attr };
326 var $regionDiv = addRegionDiv(data, item); 281 var $regionDiv = addRegionDiv(data, item);
327 var za = data.zoomArea; 282 var za = data.zoomArea;
328 if (!fn.isFullArea(za)) { 283 if (!fn.isFullArea(za)) {
329 za.setCenter(rect.getCenter()).stayInside(FULL_AREA); 284 za.setCenter(rect.getCenter()).stayInside(FULL_AREA);
360 $form.on('submit', function () { 315 $form.on('submit', function () {
361 var coords = $input.val(); 316 var coords = $input.val();
362 actions.regionFromCoords(data, coords); 317 actions.regionFromCoords(data, coords);
363 fn.withdraw($info); 318 fn.withdraw($info);
364 return false; 319 return false;
320 });
321 // handle blur
322 $input.on('blur', function () {
323 fn.withdraw($info);
365 }); 324 });
366 // handle cancel 325 // handle cancel
367 $form.find('.'+CSS+'cancel').on('click', function () { 326 $form.find('.'+CSS+'cancel').on('click', function () {
368 fn.withdraw($info); 327 fn.withdraw($info);
369 }); 328 });
447 }; 406 };
448 407
449 // create a new regionDiv and add it to data.$elem 408 // create a new regionDiv and add it to data.$elem
450 var newRegionDiv = function (data, attr) { 409 var newRegionDiv = function (data, attr) {
451 var cls = CSS+'region'; 410 var cls = CSS+'region';
452 var $regionDiv = $('<div class="'+cls+'" style="display:none"/>'); 411 var $regionDiv = $('<div class="'+cls+'"/>');
453 addRegionAttributes(data, $regionDiv, attr); 412 addRegionAttributes(data, $regionDiv, attr);
454 data.$elem.append($regionDiv); 413 data.$elem.append($regionDiv);
455 return $regionDiv; 414 return $regionDiv;
456 };
457
458 // calculate the digilib coordinates of a completed user-defined region
459 var regionTrafo = function (data, $regionDiv) {
460 var screenRect = geom.rectangle($regionDiv);
461 var rect = data.imgTrafo.invtransform(screenRect);
462 $regionDiv.data('rect', rect);
463 console.debug("regionTrafo", $regionDiv, rect);
464 return rect;
465 }; 415 };
466 416
467 // copy attributes to a region div 417 // copy attributes to a region div
468 var addRegionAttributes = function (data, $regionDiv, attributes) { 418 var addRegionAttributes = function (data, $regionDiv, attributes) {
469 if (attributes == null) return; 419 if (attributes == null) return;
539 if (rect == null) { 489 if (rect == null) {
540 return console.error('bad coords in HTML:', title, coords); 490 return console.error('bad coords in HTML:', title, coords);
541 } 491 }
542 // mark div class as regionHTML 492 // mark div class as regionHTML
543 var cls = $area.attr('class') || ''; 493 var cls = $area.attr('class') || '';
544 cls += ' '+CSS+'regionHTML'; 494 cls += ' '+CSS+'regionHTML '+CSS+'overlay';
545 var attr = {'class' : cls}; 495 var attr = {'class' : cls};
546 // copy attributes 496 // copy attributes
547 for (var n in data.settings.regionAttributes) { 497 for (var n in data.settings.regionAttributes) {
548 attr[n] = $area.attr(n); 498 attr[n] = $area.attr(n);
549 } 499 }
677 if (rg == null) return []; 627 if (rg == null) return [];
678 var coords = rg.split(","); 628 var coords = rg.split(",");
679 var regions = $.map(coords, function(coord, index) { 629 var regions = $.map(coords, function(coord, index) {
680 var pos = coord.split("/", 4); 630 var pos = coord.split("/", 4);
681 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); 631 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]);
682 var attr = {'class' : CSS+"regionURL"}; 632 var attr = {'class' : CSS+"regionURL "+CSS+"overlay"};
683 var item = {'rect' : rect, 'index' : index+1, 'attributes' : attr}; 633 var item = {'rect' : rect, 'index' : index+1, 'attributes' : attr};
684 return item; 634 return item;
685 }); 635 });
686 return regions; 636 return regions;
687 }; 637 };