Mercurial > hg > digilib-old
view webapp/src/main/webapp/jquery/jquery.digilib.dialogs.js @ 1100:c5ed20cd24ae
setting annotation user name works now.
author | robcast |
---|---|
date | Thu, 25 Oct 2012 17:22:36 +0200 |
parents | 95d28c6ad018 |
children |
line wrap: on
line source
/** digilib dialogs plugin */ (function($) { // plugin object with digilib data var digilib = null; // the functions made available by digilib var fn = null; // affine geometry plugin var geom = null; var modes = [ { name : "screen", label : "fit to screen", tooltip : "scales the graphic file so that it fills the screen" }, { name : "pixel", label : "pixel by pixel", tooltip : "all pixels of the current part of the graphic file are shown" }, { name : "size", label : "original size", tooltip : "tries to display the current part of the graphic file in the size of the orginal resource (after screen calibration)" } ]; var defaults = { }; var actions = { // shows Calibration Div dialogCalibration : function (data) { fn.showCalibrationDialog(data); }, // shows ScaleModeSelector dialogScaleMode : function (data) { fn.showScaleModeDialog(data); } }; /** creates and displays HTML structure for screen calibration */ var showCalibrationDialog = function (data) { var $elem = data.$elem; var settings = data.settings; var cssPrefix = settings.cssPrefix; var calibrationSelector = '#'+cssPrefix+'calibration'; if (fn.isOnScreen(data, calibrationSelector)) return; // already onscreen var html = '\ <div id="'+cssPrefix+'calibration" class="'+cssPrefix+'calibration">\ <div id="'+cssPrefix+'ruler">\ <div id="'+cssPrefix+'cm">Please enter the length of this scale on your screen</div>\ <div>\ <input id="'+cssPrefix+'calibrationInput" size="5"/> cm\ <button class="'+cssPrefix+'button" id="'+cssPrefix+'calibrationOk">OK</button>\ <button class="'+cssPrefix+'button" id="'+cssPrefix+'calibrationCancel">Cancel</button>\ </div>\ <div id="'+cssPrefix+'calibrationError" class="'+cssPrefix+'calibration-error">Please enter a numeric value like this: 12.3</div>\ </div>\ </div>'; $calDiv = $(html); $calDiv.appendTo($elem); var $input = $calDiv.find('#'+cssPrefix+'calibrationInput'); var $ok = $calDiv.find('#'+cssPrefix+'calibrationOk'); var $cancel = $calDiv.find('#'+cssPrefix+'calibrationCancel'); var $error = $calDiv.find('#'+cssPrefix+'calibrationError'); var handler = function(event) { // var _data = data; if (event.keyCode == 27 || event.target.id == cssPrefix+'calibrationCancel') { fn.withdraw($calDiv); return false; } if (event.keyCode == 13 || event.target.id == cssPrefix+'calibrationOk') { var w = $calDiv.width(); var cm = $input.val(); var dpi = fn.cropFloat(w / parseFloat(cm) * 2.54); console.debug('width', w, 'cm', cm, 'input dpi:', dpi); if (!fn.isNumber(dpi)) { $input.addClass(cssPrefix+'error'); $error.fadeIn(); return; } digilib.actions.calibrate(data, dpi); fn.withdraw($calDiv); return false; } $error.fadeOut(); $input.removeClass(cssPrefix+'error'); }; $ok.on("click.dialog", handler); $cancel.on("click.dialog", handler); $input.on("keypress.dialog", handler); $input.on("focus.dialog", handler); $calDiv.fadeIn(); fn.centerOnScreen(data, $calDiv); $input.focus(); return $calDiv; }; /** creates and displays HTML structure for scale mode selection */ var showScaleModeDialog = function (data) { var $elem = data.$elem; var settings = data.settings; var cssPrefix = settings.cssPrefix; var scaleModeSelector = '#'+cssPrefix+'scalemode'; if (fn.isOnScreen(data, scaleModeSelector)) return; // already onscreen var html = '\ <div id="'+cssPrefix+'scalemode" style="display:none; z-index:1000; position:absolute">\ <select class="'+cssPrefix+'scalemode" />\ </div>'; $scaleDiv = $(html); $scaleDiv.appendTo($elem); var mode = fn.getScaleMode(data); var $select = $scaleDiv.find('select'); for (var i = 0; i < modes.length; i++) { var m = modes[i]; var selected = (m.name == mode) ? ' selected="selected"' : ''; html = '<option name="'+m.name+'"'+selected+'>'+m.label+'</option>'; $select.append($(html)); } $select.on('change.scalemode', function(event) { var newMode = $select.find("option:selected").attr("name"); console.debug('setting mode to:', newMode); digilib.actions.setScaleMode(data, newMode); fn.withdraw($scaleDiv); }); $select.on('blur.scalemode', function(event) { fn.withdraw($scaleDiv); }); // position the element next to the scale button $scaleDiv.fadeIn(); $select.focus(); if (digilib.plugins.buttons == null) { fn.centerOnScreen($scaleDiv); } else { var $button = fn.findButtonByName(data, 'scale'); var buttonRect = geom.rectangle($button); var divRect = geom.rectangle($scaleDiv); $scaleDiv.offset({ left : Math.abs(buttonRect.x - divRect.width - 4), top : buttonRect.y + 4 }); } }; var setButtonActions = function () { if (fn.setButtonAction == null) { console.debug('dialogs: could not assign button actions. Maybe jquery.digilib.buttons.js was not loaded?'); return; } console.debug('dialogs: assign new button actions. digilib:', digilib); fn.setButtonAction('calibrationx', 'dialogCalibration'); fn.setButtonAction('scale', 'dialogScaleMode'); }; // plugin installation called by digilib on plugin object. var install = function (plugin) { digilib = plugin; console.debug('installing dialogs plugin. digilib:', digilib); fn = digilib.fn; // import geometry classes geom = fn.geometry; // add defaults, actions, buttons $.extend(true, digilib.defaults, defaults); // make deep copy $.extend(digilib.actions, actions); setButtonActions(); // export functions fn.showCalibrationDialog = showCalibrationDialog; fn.showScaleModeDialog = showScaleModeDialog; }; // plugin initialization var init = function (data) { console.debug('initialising dialogs plugin. data:', data); var $data = $(data); $data.bind('setup', handleSetup); // create ScaleMode selector; // setupScaleModeDiv(data); // create Calibration div; // setupCalibrationDiv(data); }; var handleSetup = function (evt) { console.debug("dialogs: handleSetup"); var data = this; var settings = data.settings; }; // plugin object with name and init // shared objects filled by digilib on registration var plugin = { name : 'dialogs', install : install, init : init, buttons : {}, actions : {}, fn : {}, plugins : {} }; if ($.fn.digilib == null) { $.error("jquery.digilib.dialogs must be loaded after jquery.digilib!"); } else { $.fn.digilib('plugin', plugin); } })(jQuery);