comparison webapp/src/main/webapp/jquery/jquery.digilib.regions.js @ 1137:3b5968aeefac

new region icons; autozoom on click
author hertzhaft
date Fri, 16 Nov 2012 18:26:55 +0100
parents 0a01d5cc66fe
children bbb09797d7fc
comparison
equal deleted inserted replaced
1136:95ca45086d00 1137:3b5968aeefac
71 icon : "delregion.png" 71 icon : "delregion.png"
72 }, 72 },
73 removeallregions : { 73 removeallregions : {
74 onclick : "removeAllUserRegions", 74 onclick : "removeAllUserRegions",
75 tooltip : "delete all user defined regions", 75 tooltip : "delete all user defined regions",
76 icon : "delallregions.png" 76 icon : "delregions.png"
77 }, 77 },
78 regions : { 78 regions : {
79 onclick : "toggleRegions", 79 onclick : "toggleRegions",
80 tooltip : "show or hide regions", 80 tooltip : "show or hide regions",
81 icon : "regions.png" 81 icon : "showregions.png"
82 }, 82 },
83 findcoords : { 83 findcoords : {
84 onclick : "findCoords", 84 onclick : "findCoords",
85 tooltip : "find a region by entering its relative coordinates", 85 tooltip : "find a region by entering its relative coordinates",
86 icon : "regions.png" 86 icon : "findcoords.png"
87 }, 87 },
88 finddata : { 88 finddata : {
89 onclick : "findData", 89 onclick : "findData",
90 tooltip : "find a region by entering text", 90 tooltip : "find a region by entering text",
91 icon : "regions.png" 91 icon : "findregion.png"
92 },
93 regioninfo : {
94 onclick : "showRegionInfo",
95 tooltip : "show information about user defined regions",
96 icon : "regioninfo.png"
97 } 92 }
98 }; 93 };
99 94
100 var defaults = { 95 var defaults = {
101 // are regions shown? 96 // are regions shown?
102 'isRegionVisible' : true, 97 'isRegionVisible' : true,
103 // are region numbers shown? 98 // are region numbers shown?
104 'showRegionNumbers' : true, 99 'showRegionNumbers' : true,
105 // default width for region when only point is given 100 // default width for region when only point is given
106 'regionWidth' : 0.005, 101 'regionWidth' : 0.005,
102 // zoomfactor for displaying larger area around region (for autoZoomOnClick)
103 'regionAutoZoomFactor' : 3,
107 // is there region content in the page? 104 // is there region content in the page?
108 'processHtmlRegions' : false, 105 'processHtmlRegions' : false,
109 // region defined by users and in the URL 106 // region defined by users and in the URL
110 'processUserRegions' : true, 107 'processUserRegions' : true,
111 // callback for click on region 108 // callback for click on region
112 'onClickRegion' : null, 109 'onClickRegion' : null,
113 // callback when new user region is defined 110 // callback when new user region is defined
114 'onNewRegion' : null, 111 'onNewRegion' : null,
115 // turn any region into a clickable link to its detail view (DEPRECATED) 112 // turn any region into a clickable link to its detail view
116 'autoZoomOnClick' : false, 113 'autoZoomOnClick' : true,
117 // zoom in when displaying the found region 114 // zoom in when displaying the found region
118 'autoZoomOnFind' : false, 115 'autoZoomOnFind' : false,
119 // css selector for area/a elements (must also be marked with class "dl-keep") 116 // css selector for area/a elements (must also be marked with class "dl-keep")
120 'areaSelector' : 'map.dl-regioncontent area, map.dl-regioncontent a', 117 'areaSelector' : 'map.dl-regioncontent area, map.dl-regioncontent a',
121 // general buttonset of this plugin 118 // general buttonset of this plugin
122 'regionSet' : ['regions', 'findcoords', 'finddata', 'lessoptions'], 119 'regionSet' : ['regions', 'finddata', 'findcoords', 'lessoptions'],
123 // buttonset for region editing by user 120 // buttonset for region editing by user
124 'userRegionSet' : ['defineregion', 'removeregion', 'removeallregions', 'regioninfo'], 121 'userRegionSet' : ['defineregion', 'removeregion', 'removeallregions'],
125 // url param for regions 122 // url param for regions
126 'rg' : null, 123 'rg' : null,
127 // array with region data 124 // array with region data
128 'regions' : null, 125 'regions' : null,
129 // function for extracting the sort string (for the region search window) 126 // function for extracting the sort string (for the region search window)
185 } 182 }
186 // remove most recently added user region 183 // remove most recently added user region
187 selector = 'div.'+CSS+'regionURL'; 184 selector = 'div.'+CSS+'regionURL';
188 var $region = data.$elem.find(selector).last(); 185 var $region = data.$elem.find(selector).last();
189 if ($region.length > 0) { 186 if ($region.length > 0) {
190 $regionDiv.remove(); 187 $region.remove();
191 redisplay(data); 188 redisplay(data);
192 return; 189 return;
193 } 190 }
194 }, 191 },
195 192
210 toggleRegions : function (data) { 207 toggleRegions : function (data) {
211 var show = !data.settings.isRegionVisible; 208 var show = !data.settings.isRegionVisible;
212 data.settings.isRegionVisible = show; 209 data.settings.isRegionVisible = show;
213 fn.highlightButtons(data, 'regions', show); 210 fn.highlightButtons(data, 'regions', show);
214 renderRegions(data, 1); 211 renderRegions(data, 1);
215 },
216
217 // show region info in a window
218 showRegionInfo : function (data) {
219 var $elem = data.$elem;
220 var infoSelector = '#'+CSS+'regionInfo';
221 if (fn.isOnScreen(data, infoSelector)) return; // already onscreen
222 var $regions = getRegions(data, 'regionURL');
223 if ($regions.length == 0) return; // no user regions available
224 var html = '\
225 <div id="'+CSS+'regionInfo" class="'+CSS+'keep '+CSS+'regionInfo">\
226 <table class="'+CSS+'infoheader">\
227 <tr>\
228 <td class="'+CSS+'infobutton html">HTML</td>\
229 <td class="'+CSS+'infobutton svgattr">SVG</td>\
230 <td class="'+CSS+'infobutton csv">CSV</td>\
231 <td class="'+CSS+'infobutton digilib">Digilib</td>\
232 <td class="'+CSS+'infobutton x">X</td>\
233 </tr>\
234 </table>\
235 </div>';
236 $info = $(html);
237 $info.appendTo($elem);
238 $info.append(regionInfoHTML(data, $regions));
239 $info.append(regionInfoSVG(data, $regions));
240 $info.append(regionInfoCSV(data, $regions));
241 $info.append(regionInfoDigilib(data, $regions));
242 var bind = function (name) {
243 $info.find('.'+name).on('click.regioninfo', function () {
244 $info.find('div.'+CSS+'info').hide();
245 $info.find('div.'+CSS+name).show();
246 fn.centerOnScreen(data, $info);
247 return false;
248 });
249 };
250 bind('html');
251 bind('svgattr');
252 bind('csv');
253 bind('digilib');
254 $info.on('click.regioninfo', function () {
255 fn.withdraw($info);
256 });
257 $info.find('.x').on('click.regioninfo', function () {
258 fn.withdraw($info);
259 });
260 $info.fadeIn();
261 fn.centerOnScreen(data, $info);
262 }, 212 },
263 213
264 // display region coordinates in a selected edit line (for copying) 214 // display region coordinates in a selected edit line (for copying)
265 showRegionCoords : function (data, $regionDiv) { 215 showRegionCoords : function (data, $regionDiv) {
266 var $elem = data.$elem; 216 var $elem = data.$elem;
398 }; 348 };
399 // adapt dropdown, show only matching entries 349 // adapt dropdown, show only matching entries
400 var filterOptions = function (text) { 350 var filterOptions = function (text) {
401 if (!text) { 351 if (!text) {
402 // not text, display all options, select first (empty) 352 // not text, display all options, select first (empty)
403 $options.show(); 353 // $options.show();
404 $select.prop("selectedIndex", 0); 354 $select.prop("selectedIndex", 0);
405 return; 355 return;
406 } 356 }
407 var first = true; 357 var first = true;
408 $options.each(function (index) { 358 $options.each(function (index) {
631 }); 581 });
632 // prepend an empty option 582 // prepend an empty option
633 return sorted.join(''); 583 return sorted.join('');
634 }; 584 };
635 585
636 // html for later insertion
637 var regionInfoHTML = function (data, $regions) {
638 var $infoDiv = $('<div class="'+CSS+'info '+CSS+'html"/>');
639 $infoDiv.append($('<div/>').text('<map class="'+CSS+'keep '+CSS+'regioncontent">'));
640 $regions.each(function (index, region) {
641 var rect = $(region).data('rect');
642 var coords = packCoords(rect, ',');
643 $infoDiv.append($('<div/>').text('<area coords="' + coords + '"/>'));
644 });
645 $infoDiv.append($('<div/>').text('</map>'));
646 return $infoDiv;
647 };
648
649 // SVG-style
650 var regionInfoSVG = function (data, $regions) {
651 var $infoDiv = $('<div class="'+CSS+'info '+CSS+'svgattr"/>');
652 $regions.each(function (index, region) {
653 var rect = $(region).data('rect');
654 var coords = packCoords(rect, ',');
655 $infoDiv.append($('<div/>').text('"' + coords + '"'));
656 });
657 return $infoDiv;
658 };
659
660 // CSV-style
661 var regionInfoCSV = function (data, $regions) {
662 var $infoDiv = $('<div class="'+CSS+'info '+CSS+'csv"/>');
663 $regions.each(function (index, region) {
664 var rect = $(region).data('rect');
665 var coords = packCoords(rect, ',');
666 $infoDiv.append($('<div/>').text(index+1 + ": " + coords));
667 });
668 return $infoDiv;
669 };
670
671 // digilib-style (h,w@x,y)
672 var regionInfoDigilib = function (data, $regions) {
673 var $infoDiv = $('<div class="'+CSS+'info '+CSS+'digilib"/>');
674 $regions.each(function (index, region) {
675 var rect = $(region).data('rect');
676 var coords = packCoords(rect, ',');
677 $infoDiv.append($('<div/>').text(coords));
678 });
679 return $infoDiv;
680 };
681
682 // show a region on top of the scaler image 586 // show a region on top of the scaler image
683 var renderRegion = function (data, $regionDiv, anim) { 587 var renderRegion = function (data, $regionDiv, anim) {
684 if (!data.imgTrafo) return; 588 if (!data.imgTrafo) return;
685 var zoomArea = data.zoomArea; 589 var zoomArea = data.zoomArea;
686 var rect = $regionDiv.data('rect').copy(); 590 var rect = $regionDiv.data('rect').copy();
746 var rg = coords.join(','); 650 var rg = coords.join(',');
747 data.settings.rg = rg; 651 data.settings.rg = rg;
748 console.debug('pack regions:', rg); 652 console.debug('pack regions:', rg);
749 }; 653 };
750 654
751 // zoom to the region coordinates 655 // zoom in, displaying the region in the middle of the screen
752 var zoomToRegion = function (data, rect) { 656 var zoomToRegion = function (data, $regionDiv) {
753 digilib.actions.zoomArea(data, rect); 657 var settings = data.settings;
658 var rect = $regionDiv.data('rect');
659 var za = rect.copy();
660 var factor = settings.regionAutoZoomFactor;
661 za.width *= factor;
662 za.height *= factor;
663 // var screen = fn.getFullscreenRect(data);
664 za.setProportion(1, true); // avoid extreme zoomArea proportions
665 za.setCenter(rect.getCenter()).stayInside(FULL_AREA);
666 fn.setZoomArea(data, za);
667 fn.redisplay(data);
754 }; 668 };
755 669
756 // reload display after a region has been added or removed 670 // reload display after a region has been added or removed
757 var redisplay = function (data) { 671 var redisplay = function (data) {
758 packRegions(data); 672 packRegions(data);
866 var $data = $(data); 780 var $data = $(data);
867 $data.on('setup', handleSetup); 781 $data.on('setup', handleSetup);
868 $data.on('update', handleUpdate); 782 $data.on('update', handleUpdate);
869 $data.on('newRegion', handleNewRegion); 783 $data.on('newRegion', handleNewRegion);
870 $data.on('regionClick', handleRegionClick); 784 $data.on('regionClick', handleRegionClick);
871 // default: autoZoom to region, when clicked - DEPRECATED 785 // default: autoZoom to region, when clicked
872 if (settings.autoZoomOnClick && settings.onClickRegion == null) { 786 if (settings.autoZoomOnClick && settings.onClickRegion == null) {
873 settings.onClickRegion = zoomToRegion; 787 settings.onClickRegion = zoomToRegion;
874 } 788 }
875 // install region buttons if user defined regions are allowed 789 // install region buttons if user defined regions are allowed
876 if (digilib.plugins.buttons != null) { 790 if (digilib.plugins.buttons != null) {