From a6066129e0433d185b2623ac5d234fc62efff9f2 Mon Sep 17 00:00:00 2001 From: Paul Novak Date: Fri, 7 Jan 2011 16:56:28 -0500 Subject: [PATCH] [#74] replace graphics.Groups to make IE8 happy --- kemia/controller/plugins/move.js | 1630 ++++++++++---------- kemia/controller/reaction_editor_demo.html | 2 +- kemia/graphics/element_array.js | 30 +- kemia/view/aromaticity_renderer.js | 3 - kemia/view/arrow_renderer.js | 20 +- kemia/view/atom_renderer.js | 515 ++++--- kemia/view/atom_renderer_demo.html | 2 +- kemia/view/bond_renderer.js | 16 +- kemia/view/bond_renderer_demo.html | 2 +- kemia/view/bond_renderer_demo.js | 5 +- kemia/view/mol_demo.html | 2 +- kemia/view/mol_demo.js | 6 +- kemia/view/molecule_renderer.js | 209 +-- kemia/view/molecule_renderer_demo.html | 2 +- kemia/view/molecule_renderer_demo.js | 15 +- kemia/view/plus_renderer.js | 11 +- 16 files changed, 1285 insertions(+), 1185 deletions(-) diff --git a/kemia/controller/plugins/move.js b/kemia/controller/plugins/move.js index b511df2..ac3d84b 100644 --- a/kemia/controller/plugins/move.js +++ b/kemia/controller/plugins/move.js @@ -23,10 +23,10 @@ goog.require('kemia.controller.Plugin'); * @extends {kemian.controller.Plugin}s */ kemia.controller.plugins.Move = function() { - kemia.controller.Plugin.call(this); - this.isActive = {}; - this.isActive[kemia.controller.plugins.Move.COMMAND.MOVE] = true; - this.isDragging = false; + kemia.controller.Plugin.call(this); + this.isActive = {}; + this.isActive[kemia.controller.plugins.Move.COMMAND.MOVE] = true; + this.isDragging = false; }; goog.inherits(kemia.controller.plugins.Move, kemia.controller.Plugin); @@ -37,8 +37,8 @@ goog.inherits(kemia.controller.plugins.Move, kemia.controller.Plugin); * @enum {string} */ kemia.controller.plugins.Move.COMMAND = { - MOVE: 'move', - ROTATE: 'rotate' + MOVE: 'move', + ROTATE: 'rotate' }; /** @@ -50,25 +50,25 @@ kemia.controller.plugins.Move.COMMAND = { * @private */ kemia.controller.plugins.Move.SUPPORTED_COMMANDS_ = goog.object - .transpose(kemia.controller.plugins.Move.COMMAND); +.transpose(kemia.controller.plugins.Move.COMMAND); kemia.controller.plugins.Move.ROTATE_CURSOR_STYLE = 'url("../../elements/images/rotate-cursor-32.png") 16 16, pointer'; /** @inheritDoc */ kemia.controller.plugins.Move.prototype.isSupportedCommand = function(command) { - return command in kemia.controller.plugins.Move.SUPPORTED_COMMANDS_; + return command in kemia.controller.plugins.Move.SUPPORTED_COMMANDS_; }; /** @inheritDoc */ kemia.controller.plugins.Move.prototype.getTrogClassId = goog.functions - .constant('move'); +.constant('move'); /** * reset to default state called when another plugin is made active */ kemia.controller.plugins.Move.prototype.resetState = function() { - this.isActive[kemia.controller.plugins.Move.COMMAND.MOVE] = false; - this.isActive[kemia.controller.plugins.Move.COMMAND.ROTATE] = false; + this.isActive[kemia.controller.plugins.Move.COMMAND.MOVE] = false; + this.isActive[kemia.controller.plugins.Move.COMMAND.ROTATE] = false; }; /** @@ -79,252 +79,270 @@ kemia.controller.plugins.Move.prototype.resetState = function() { * @return {Object|undefined} The result of the command. */ kemia.controller.plugins.Move.prototype.execCommandInternal = function(command, - value, active) { - // this.logger.info(command + " " + active); - this.isActive[command] = active; +value, active) { + // this.logger.info(command + " " + active); + this.isActive[command] = active; }; kemia.controller.plugins.Move.prototype.handleMouseMove = function(e) { - if ((this.isActive[kemia.controller.plugins.Move.COMMAND.MOVE] || this.isActive[kemia.controller.plugins.Move.COMMAND.ROTATE]) - && !this.isDragging) { - var target = this.editorObject.findTarget(e); - this.editorObject.clearSelected(); - this.editorObject.getOriginalElement().style.cursor = 'default'; - if (e.currentTarget.highlightGroup) { - e.currentTarget.highlightGroup.clear(); - } - if (this.isActive[kemia.controller.plugins.Move.COMMAND.ROTATE]) { - //rotate - if (target instanceof kemia.model.Molecule) { - this.editorObject.addSelected(target); - this.editorObject.getOriginalElement().style.cursor = kemia.controller.plugins.Move.ROTATE_CURSOR_STYLE; - if (!e.currentTarget.highlightGroup) { - e.currentTarget.highlightGroup = this - .highlightMolecule(target); - } else { - e.currentTarget.highlightGroup = this.highlightMolecule( - target, e.currentTarget.highlightGroup); - } - return true; - } - } else { - //move - if (target instanceof kemia.model.Atom) { - this.editorObject.addSelected(target); - this.editorObject.getOriginalElement().style.cursor = 'move'; - if (!e.currentTarget.highlightGroup) { - e.currentTarget.highlightGroup = this.highlightAtom(target); - } else { - e.currentTarget.highlightGroup = this.highlightAtom(target, - e.currentTarget.highlightGroup); - } - return true; - } else if (target instanceof kemia.model.Bond) { - var bond = target; - if (bond.source.bonds.getValues().length == 1 - || bond.target.bonds.getValues().length == 1) { - this.editorObject.addSelected(target); - this.editorObject.getOriginalElement().style.cursor = 'move'; - if (!e.currentTarget.highlightGroup) { - e.currentTarget.highlightGroup = this - .highlightBond(target); - } else { - e.currentTarget.highlightGroup = this.highlightBond( - target, e.currentTarget.highlightGroup); - } - } - return true; - } else if (target instanceof kemia.model.Molecule) { - this.editorObject.addSelected(target); - this.editorObject.getOriginalElement().style.cursor = 'move'; - if (!e.currentTarget.highlightGroup) { - e.currentTarget.highlightGroup = this - .highlightMolecule(target); - } else { - e.currentTarget.highlightGroup = this.highlightMolecule( - target, e.currentTarget.highlightGroup); - } - return true; - } else if (target instanceof kemia.model.Arrow) { - this.editorObject.addSelected(target); - if (!e.shiftKey) { - this.editorObject.getOriginalElement().style.cursor = 'move'; - if (!e.currentTarget.highlightGroup) { - e.currentTarget.highlightGroup = this - .highlightArrow(target); - } else { - e.currentTarget.highlightGroup = this.highlightArrow( - target, e.currentTarget.highlightGroup); - } - return true; - } - } else if (target instanceof kemia.model.Plus) { - this.editorObject.addSelected(target); - if (!e.shiftKey) { - this.editorObject.getOriginalElement().style.cursor = 'move'; - if (!e.currentTarget.highlightGroup) { - e.currentTarget.highlightGroup = this - .highlightPlus(target); - } else { - e.currentTarget.highlightGroup = this.highlightPlus( - target, e.currentTarget.highlightGroup); - } - return true; - } - } else if (!target) { - this.editorObject.getOriginalElement().style.cursor = 'all-scroll'; - return true; - } - } - return false; - } + if ((this.isActive[kemia.controller.plugins.Move.COMMAND.MOVE] || this.isActive[kemia.controller.plugins.Move.COMMAND.ROTATE]) + && !this.isDragging) { + var target = this.editorObject.findTarget(e); + this.editorObject.clearSelected(); + this.editorObject.getOriginalElement().style.cursor = 'default'; + if (e.currentTarget.highlightGroup) { + e.currentTarget.highlightGroup.clear(); + } + if (this.isActive[kemia.controller.plugins.Move.COMMAND.ROTATE]) { + //rotate + if (target instanceof kemia.model.Molecule) { + this.editorObject.addSelected(target); + this.editorObject.getOriginalElement().style.cursor = kemia.controller.plugins.Move.ROTATE_CURSOR_STYLE; + e.currentTarget.highlightGroup = this.highlightMolecule( + target, e.currentTarget.highlightGroup); + return true; + } + } else { + //move + if (target instanceof kemia.model.Atom) { + this.editorObject.addSelected(target); + this.editorObject.getOriginalElement().style.cursor = 'move'; + e.currentTarget.highlightGroup = this.highlightAtom(target, + e.currentTarget.highlightGroup); + return true; + } else if (target instanceof kemia.model.Bond) { + var bond = target; + if (bond.source.bonds.getValues().length == 1 + || bond.target.bonds.getValues().length == 1) { + this.editorObject.addSelected(target); + this.editorObject.getOriginalElement().style.cursor = 'move'; + e.currentTarget.highlightGroup = this.highlightBond( + target, e.currentTarget.highlightGroup); + } + return true; + } else if (target instanceof kemia.model.Molecule) { + this.editorObject.addSelected(target); + this.editorObject.getOriginalElement().style.cursor = 'move'; + + e.currentTarget.highlightGroup = this.highlightMolecule( + target, e.currentTarget.highlightGroup); + + return true; + } else if (target instanceof kemia.model.Arrow) { + this.editorObject.addSelected(target); + if (!e.shiftKey) { + this.editorObject.getOriginalElement().style.cursor = 'move'; + + e.currentTarget.highlightGroup = this.highlightArrow( + target, e.currentTarget.highlightGroup); + + return true; + } + } else if (target instanceof kemia.model.Plus) { + this.editorObject.addSelected(target); + if (!e.shiftKey) { + this.editorObject.getOriginalElement().style.cursor = 'move'; + + e.currentTarget.highlightGroup = this.highlightPlus( + target, e.currentTarget.highlightGroup); + + return true; + } + } else if (!target) { + this.editorObject.getOriginalElement().style.cursor = 'all-scroll'; + return true; + } + } + return false; + } }; kemia.controller.plugins.Move.prototype.handleMouseDown = function(e) { - if (this.isActive[kemia.controller.plugins.Move.COMMAND.MOVE] - || this.isActive[kemia.controller.plugins.Move.COMMAND.ROTATE]) { - if (e.currentTarget.highlightGroup) { - e.currentTarget.highlightGroup.clear(); - } - e.currentTarget.highlightGroup = undefined; - this.isDragging = true; - var target = this.editorObject.findTarget(e); - - if (this.isActive[kemia.controller.plugins.Move.COMMAND.ROTATE]) { - if (target instanceof kemia.model.Molecule) { - var molecule = target; - this.editorObject.dispatchBeforeChange(); - this.editorObject.getOriginalElement().style.cursor = kemia.controller.plugins.Move.ROTATE_CURSOR_STYLE; - this.rotateMolecule(e, target); - this.editorObject.dispatchChange(); - return true; - } - } - - if (this.isActive[kemia.controller.plugins.Move.COMMAND.MOVE]) { - if (target instanceof kemia.model.Atom) { - var atom = target; - this.editorObject.dispatchBeforeChange(); - this.dragAtom(e, atom); - this.editorObject.dispatchChange(); - return true; - } - - if (target instanceof kemia.model.Bond) { - var bond = target; - this.editorObject.dispatchBeforeChange(); - this.dragBond(e, bond); - this.editorObject.dispatchChange(); - return true; - - } - - if (target instanceof kemia.model.Molecule) { - var molecule = target; - this.editorObject.dispatchBeforeChange(); - if (e.shiftKey) { - this.editorObject.getOriginalElement().style.cursor = kemia.controller.plugins.Move.ROTATE_CURSOR_STYLE; - this.rotateMolecule(e, target); - } else { - this.dragMolecule(e, target); - } - this.editorObject.dispatchChange(); - return true; - } - if (target instanceof kemia.model.Plus) { - var plus = target; - this.editorObject.dispatchBeforeChange(); - this.dragPlus(e, plus); - this.editorObject.dispatchChange(); - return true; - } - if (target instanceof kemia.model.Arrow) { - var arrow = target; - this.editorObject.dispatchBeforeChange(); - this.dragArrow(e, arrow); - this.editorObject.dispatchChange(); - return true; - } - if (!target) { - this.editorObject.dispatchBeforeChange(); - this.dragCanvas(e); - this.editorObject.dispatchChange(); - return true; - } - } - } - return false; + if (this.isActive[kemia.controller.plugins.Move.COMMAND.MOVE] + || this.isActive[kemia.controller.plugins.Move.COMMAND.ROTATE]) { + if (e.currentTarget.highlightGroup) { + e.currentTarget.highlightGroup.clear(); + } + e.currentTarget.highlightGroup = undefined; + this.isDragging = true; + var target = this.editorObject.findTarget(e); + + if (this.isActive[kemia.controller.plugins.Move.COMMAND.ROTATE]) { + if (target instanceof kemia.model.Molecule) { + var molecule = target; + this.editorObject.dispatchBeforeChange(); + this.editorObject.getOriginalElement().style.cursor = kemia.controller.plugins.Move.ROTATE_CURSOR_STYLE; + this.rotateMolecule(e, target); + this.editorObject.dispatchChange(); + return true; + } + } + + if (this.isActive[kemia.controller.plugins.Move.COMMAND.MOVE]) { + if (target instanceof kemia.model.Atom) { + var atom = target; + this.editorObject.dispatchBeforeChange(); + this.dragAtom(e, atom); + this.editorObject.dispatchChange(); + return true; + } + + if (target instanceof kemia.model.Bond) { + var bond = target; + this.editorObject.dispatchBeforeChange(); + this.dragBond(e, bond); + this.editorObject.dispatchChange(); + return true; + + } + + if (target instanceof kemia.model.Molecule) { + var molecule = target; + this.editorObject.dispatchBeforeChange(); + if (e.shiftKey) { + this.editorObject.getOriginalElement().style.cursor = kemia.controller.plugins.Move.ROTATE_CURSOR_STYLE; + this.rotateMolecule(e, target); + } else { + this.dragMolecule(e, target); + } + this.editorObject.dispatchChange(); + return true; + } + if (target instanceof kemia.model.Plus) { + var plus = target; + this.editorObject.dispatchBeforeChange(); + this.dragPlus(e, plus); + this.editorObject.dispatchChange(); + return true; + } + if (target instanceof kemia.model.Arrow) { + var arrow = target; + this.editorObject.dispatchBeforeChange(); + this.dragArrow(e, arrow); + this.editorObject.dispatchChange(); + return true; + } + if (!target) { + this.editorObject.dispatchBeforeChange(); + this.dragCanvas(e); + this.editorObject.dispatchChange(); + return true; + } + } + } + return false; }; kemia.controller.plugins.Move.prototype.handleMouseUp = function(e) { - try { - this.isDragging = false; - var targets = goog.array - .filter( - this.editorObject.findTargetList(e), - function(obj) { - return (obj instanceof kemia.model.Atom && obj !== this.dragSource); - }, this); - var target = targets.length > 0 ? targets[0] : undefined; - if (this.dragSource && target instanceof kemia.model.Atom) { - this.editorObject.dispatchBeforeChange(); - kemia.model.Molecule.mergeMolecules(this.dragSource, target); - this.dragSource = undefined; - this.editorObject.setModelsSilently(this.editorObject.getModels()); - this.editorObject.dispatchChange(); - return true; - } - } catch (e) { - this.logger.severe(e); - } + try { + this.isDragging = false; + var targets = goog.array + .filter( + this.editorObject.findTargetList(e), + function(obj) { + return (obj instanceof kemia.model.Atom && obj !== this.dragSource); + }, + this); + var target = targets.length > 0 ? targets[0] : undefined; + if (this.dragSource && target instanceof kemia.model.Atom) { + this.editorObject.dispatchBeforeChange(); + kemia.model.Molecule.mergeMolecules(this.dragSource, target); + this.dragSource = undefined; + this.editorObject.setModelsSilently(this.editorObject.getModels()); + this.editorObject.dispatchChange(); + return true; + } + } catch(e) { + this.logger.severe(e); + } }; +/** + * @param {kemia.model.Atom} atom to highlight + * @param {kemia.graphics.ElementArray=} opt_element_array + * @return {kemia.graphics.ElementArray} + */ kemia.controller.plugins.Move.prototype.highlightAtom = function(atom, - opt_group) { - - return this.editorObject.reactionRenderer.moleculeRenderer.atomRenderer - .highlightOn(atom, '#3366ff', opt_group); +opt_element_array) { + if (!opt_element_array) { + opt_element_array = new kemia.graphics.ElementArray(); + } + this.editorObject.reactionRenderer.moleculeRenderer.atomRenderer.highlightOn( + atom, '#3366ff', opt_element_array); + return opt_element_array; }; +/** + * @param {kemia.model.Bond} bond to highlight + * @param {kemia.graphics.ElementArray=} opt_element_array + * @return {kemia.graphics.ElementArray} + */ kemia.controller.plugins.Move.prototype.highlightBond = function(bond, - opt_group) { - - return this.editorObject.reactionRenderer.moleculeRenderer.bondRendererFactory - .get(bond).highlightOn(bond, '#3366ff', opt_group); - +opt_element_array) { + if (!opt_element_array) { + opt_element_array = new kemia.graphics.ElementArray(); + } + return this.editorObject.reactionRenderer.moleculeRenderer.bondRendererFactory + .get(bond).highlightOn(bond, '#3366ff', opt_element_array); + return opt_element_array; }; +/** + * @param {kemia.model.Molecule} molecule to highlight + * @param {kemia.graphics.ElementArray=} opt_element_array + * @return {kemia.graphics.ElementArray} + */ kemia.controller.plugins.Move.prototype.highlightMolecule = function(molecule, - opt_group) { - var color = '#3366ff'; - - if (molecule.reaction && molecule.reaction.isProduct(molecule)) { - color = 'purple'; - } - return this.editorObject.reactionRenderer.moleculeRenderer.highlightOn( - molecule, color, opt_group); +opt_element_array) { + if (!opt_element_array) { + opt_element_array = new kemia.graphics.ElementArray(); + } + var color = '#3366ff'; + + if (molecule.reaction && molecule.reaction.isProduct(molecule)) { + color = 'purple'; + } + + this.editorObject.reactionRenderer.moleculeRenderer.highlightOn(molecule, color, opt_element_array); + return opt_element_array; }; +/** + * @param {kemia.model.Arrow} arrow to highlight + * @param {kemia.graphics.ElementArray=} opt_element_array + * @return {kemia.graphics.ElementArray} + */ kemia.controller.plugins.Move.prototype.highlightArrow = function(arrow, - opt_group) { - return this.editorObject.reactionRenderer.arrowRenderer.highlightOn(arrow, - '#3366ff', opt_group); +opt_element_array) { + if (!opt_element_array) { + opt_element_array = new kemia.graphics.ElementArray(); + } + return opt_element_array.add(this.editorObject.reactionRenderer.arrowRenderer.highlightOn(arrow, + '#3366ff')); }; +/** + * @param {kemia.model.Plus} plus to highlight + * @param {kemia.graphics.ElementArray=} opt_element_array + * @return {kemia.graphics.ElementArray} + */ kemia.controller.plugins.Move.prototype.highlightPlus = function(plus, - opt_group) { - return this.editorObject.reactionRenderer.plusRenderer.highlightOn(plus, - '#3366ff', opt_group); +opt_element_array) { + if (!opt_element_array) { + opt_element_array = new kemia.graphics.ElementArray(); + } + return opt_element_array.add(this.editorObject.reactionRenderer.plusRenderer.highlightOn(plus, + '#3366ff')); }; /** @inheritDoc */ kemia.controller.plugins.Move.prototype.queryCommandValue = function(command) { - return this.isActive[command]; + return this.isActive[command]; }; /** @@ -336,49 +354,53 @@ kemia.controller.plugins.Move.prototype.queryCommandValue = function(command) { * @return {kemia.model.Molecule} resulting merged molecule. */ kemia.controller.plugins.Move.mergeMolecules = function(source_atom, - target_atom) { - // replace target atom with source atom - - // clone and connect target atom bonds to source atom - var source_molecule = source_atom.molecule; - var target_molecule = target_atom.molecule; - - goog.array.forEach(target_atom.bonds.getValues(), function(bond) { - var new_bond = bond.clone(); - target_atom == new_bond.source ? new_bond.source = source_atom - : new_bond.target = source_atom; - target_molecule.addBond(new_bond); - target_molecule.removeBond(bond); - }); - target_molecule.removeAtom(target_atom); - if (source_molecule !== target_molecule) { - goog.array.forEach(source_molecule.atoms, function(atom) { - target_molecule.addAtom(atom); - }); - - // replace source atom and bonds parent molecule with target parent - // molecule - goog.array.forEach(source_molecule.bonds, function(bond) { - var new_bond = bond.clone(); - new_bond.molecule = undefined; - target_molecule.addBond(new_bond); - }); - goog.array.forEach(source_molecule.atoms, function(atom) { - source_molecule.removeAtom(atom); - }); - goog.array.forEach(source_molecule.bonds, function(bond) { - source_molecule.removeBond(bond); - }); - - source_molecule.reaction.removeMolecule(source_molecule); - delete source_molecule; - } - var result = target_molecule.clone(); - var reaction = target_molecule.reaction; - reaction.removeMolecule(target_molecule); - reaction.addMolecule(result); - - return result; +target_atom) { + // replace target atom with source atom + // clone and connect target atom bonds to source atom + var source_molecule = source_atom.molecule; + var target_molecule = target_atom.molecule; + + goog.array.forEach(target_atom.bonds.getValues(), + function(bond) { + var new_bond = bond.clone(); + target_atom == new_bond.source ? new_bond.source = source_atom + : new_bond.target = source_atom; + target_molecule.addBond(new_bond); + target_molecule.removeBond(bond); + }); + target_molecule.removeAtom(target_atom); + if (source_molecule !== target_molecule) { + goog.array.forEach(source_molecule.atoms, + function(atom) { + target_molecule.addAtom(atom); + }); + + // replace source atom and bonds parent molecule with target parent + // molecule + goog.array.forEach(source_molecule.bonds, + function(bond) { + var new_bond = bond.clone(); + new_bond.molecule = undefined; + target_molecule.addBond(new_bond); + }); + goog.array.forEach(source_molecule.atoms, + function(atom) { + source_molecule.removeAtom(atom); + }); + goog.array.forEach(source_molecule.bonds, + function(bond) { + source_molecule.removeBond(bond); + }); + + source_molecule.reaction.removeMolecule(source_molecule); + delete source_molecule; + } + var result = target_molecule.clone(); + var reaction = target_molecule.reaction; + reaction.removeMolecule(target_molecule); + reaction.addMolecule(result); + + return result; }; /** @@ -391,557 +413,579 @@ kemia.controller.plugins.Move.mergeMolecules = function(source_atom, */ kemia.controller.plugins.Move.closeRing = function(source_atom, target_atom) { - goog.asserts.assert(source_atom.molecule == target_atom.molecule); - // replace target atom with source atom - - // clone and connect target atom bonds to source atom - var source_molecule = source_atom.molecule; - var target_molecule = target_atom.molecule; - - goog.array.forEach(target_atom.bonds.getValues(), function(bond) { - var new_bond = bond.clone(); - target_atom == new_bond.source ? new_bond.source = source_atom - : new_bond.target = source_atom; - target_molecule.addBond(new_bond); - target_molecule.removeBond(bond); - }); - target_molecule.removeAtom(target_atom); - - var result = target_molecule.clone(); - goog.array.forEach(result.bonds, function(b) { - goog.asserts.assert(b.source); - goog.asserts.assert(b.target); - }); - var reaction = target_molecule.reaction; - reaction.removeMolecule(target_molecule); - reaction.addMolecule(result); - - return result; + goog.asserts.assert(source_atom.molecule == target_atom.molecule); + // replace target atom with source atom + // clone and connect target atom bonds to source atom + var source_molecule = source_atom.molecule; + var target_molecule = target_atom.molecule; + + goog.array.forEach(target_atom.bonds.getValues(), + function(bond) { + var new_bond = bond.clone(); + target_atom == new_bond.source ? new_bond.source = source_atom + : new_bond.target = source_atom; + target_molecule.addBond(new_bond); + target_molecule.removeBond(bond); + }); + target_molecule.removeAtom(target_atom); + + var result = target_molecule.clone(); + goog.array.forEach(result.bonds, + function(b) { + goog.asserts.assert(b.source); + goog.asserts.assert(b.target); + }); + var reaction = target_molecule.reaction; + reaction.removeMolecule(target_molecule); + reaction.addMolecule(result); + + return result; }; kemia.controller.plugins.Move.prototype.dragAtom = function(e, atom) { - var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); - d._prevX = e.clientX; - d._prevY = e.clientY; - - d.atom = atom; - d.editor = this.editorObject; - d - .addEventListener( - goog.fx.Dragger.EventType.DRAG, - function(e) { - if (d._highlightGroups) { - goog.array.forEach(d._highlightGroups, function(g) { - g.clear(); - }); - } - d._highlightGroups = []; - if (d.atom.molecule.group) { - d.atom.molecule.group.clear(); - } - var trans = new goog.graphics.AffineTransform.getTranslateInstance( - e.clientX - d._prevX, e.clientY - d._prevY); - var inverse; - if (d.editor.reactionRenderer.transform) { - inverse = d.editor.reactionRenderer.transform - .createInverse(); - } else { - inverse = d.editor.reactionRenderer.moleculeRenderer.transform - .createInverse(); - } - - var coords = inverse.transformCoords([ - new goog.math.Coordinate(e.clientX, e.clientY), - new goog.math.Coordinate(d._prevX, d._prevY)]); - var diff = goog.math.Coordinate.difference(coords[0], - coords[1]); - - atom.coord = goog.math.Coordinate.sum(atom.coord, diff); - - d._prevX = e.clientX; - d._prevY = e.clientY; - // highlight merge sites - // exclude this atom and atoms less than two bonds away - d._merge_exclusions = goog.array - .concat( - atom, - goog.array - .map( - atom.bonds.getValues(), - function(b) { - var other_atom = b - .otherAtom(atom); - return goog.array - .concat( - other_atom, - goog.array - .map( - other_atom.bonds - .getValues(), - function( - ob) { - return ob - .otherAtom(other_atom); - })); - })); - var merge_pairs = this.editorObject.findAtomMergePairs( - [atom], d._merge_exclusions); - - // only merge one atom - d._merge_pairs = goog.array.slice(merge_pairs, 0, 1); - - goog.array - .forEach( - merge_pairs, - function(pair) { - d._highlightGroups - .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer - .highlightOn(pair[0])); - d._highlightGroups - .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer - .highlightOn(pair[1])); - }); - - d.editor.reactionRenderer.moleculeRenderer - .render( - d.atom.molecule, - d.editor.reactionRenderer.moleculeRenderer.transform); - }, undefined, this); - - d.addEventListener(goog.fx.Dragger.EventType.END, function(e) { - try { - goog.array.forEach(d._merge_pairs, function(pair) { - if (pair[0].molecule == pair[1].molecule) { - kemia.controller.plugins.Move.closeRing(pair[0], pair[1]); - } else { - kemia.controller.plugins.Move.mergeMolecules(pair[0], - pair[1]); - - } - }, this); - d.editor.setModelsSilently(d.editor.getModels()); - d._merge_pairs = []; - d.dispose(); - - } catch (e) { - this.logger.severe(e); - } - }, undefined, this); - d.startDrag(e); + var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); + d._prevX = e.clientX; + d._prevY = e.clientY; + + d.atom = atom; + d.editor = this.editorObject; + d + .addEventListener( + goog.fx.Dragger.EventType.DRAG, + function(e) { + if (d._hightlightElements) { + goog.array.forEach(d._hightlightElements, + function(g) { + g.clear(); + }); + } + d._hightlightElements = []; + if (d.atom.molecule._elements) { + d.atom.molecule._elements.clear(); + } + var trans = new goog.graphics.AffineTransform.getTranslateInstance( + e.clientX - d._prevX, e.clientY - d._prevY); + var inverse; + if (d.editor.reactionRenderer.transform) { + inverse = d.editor.reactionRenderer.transform + .createInverse(); + } else { + inverse = d.editor.reactionRenderer.moleculeRenderer.transform + .createInverse(); + } + + var coords = inverse.transformCoords([ + new goog.math.Coordinate(e.clientX, e.clientY), + new goog.math.Coordinate(d._prevX, d._prevY)]); + var diff = goog.math.Coordinate.difference(coords[0], + coords[1]); + + atom.coord = goog.math.Coordinate.sum(atom.coord, diff); + + d._prevX = e.clientX; + d._prevY = e.clientY; + // highlight merge sites + // exclude this atom and atoms less than two bonds away + d._merge_exclusions = goog.array + .concat( + atom, + goog.array + .map( + atom.bonds.getValues(), + function(b) { + var other_atom = b + .otherAtom(atom); + return goog.array + .concat( + other_atom, + goog.array + .map( + other_atom.bonds + .getValues(), + function( + ob) { + return ob + .otherAtom(other_atom); + })); + })); + var merge_pairs = this.editorObject.findAtomMergePairs( + [atom], d._merge_exclusions); + + // only merge one atom + d._merge_pairs = goog.array.slice(merge_pairs, 0, 1); + + goog.array + .forEach( + merge_pairs, + function(pair) { + d._hightlightElements + .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer + .highlightOn(pair[0])); + d._hightlightElements + .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer + .highlightOn(pair[1])); + }); + + d.editor.reactionRenderer.moleculeRenderer + .render( + d.atom.molecule, + d.editor.reactionRenderer.moleculeRenderer.transform); + }, + undefined, this); + + d.addEventListener(goog.fx.Dragger.EventType.END, + function(e) { + try { + goog.array.forEach(d._merge_pairs, + function(pair) { + if (pair[0].molecule == pair[1].molecule) { + kemia.controller.plugins.Move.closeRing(pair[0], pair[1]); + } else { + kemia.controller.plugins.Move.mergeMolecules(pair[0], + pair[1]); + + } + }, + this); + d.editor.setModelsSilently(d.editor.getModels()); + d._merge_pairs = []; + d.dispose(); + + } catch(e) { + this.logger.severe(e); + } + }, + undefined, this); + d.startDrag(e); }; kemia.controller.plugins.Move.prototype.dragBond = function(e, bond) { - var pivot_atom; - var moving_atom; - if (bond.source.bonds.getValues().length == 1) { - pivot_atom = bond.target; - moving_atom = bond.source; - } else if (bond.target.bonds.getValues().length == 1) { - pivot_atom = bond.source; - moving_atom = bond.target; - } - - if (pivot_atom) { - var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); - var center = pivot_atom.coord; - var trans; - if (this.editorObject.reactionRenderer.transform) { - trans = this.editorObject.reactionRenderer.transform; - } else { - trans = this.editorObject.reactionRenderer.moleculeRenderer.transform; - } - d._transformed_center = trans.transformCoords([center])[0]; - d._start = kemia.controller.ReactionEditor.getMouseCoords(e); -// this.logger.fine('d._start: ' + d._start.toString()); - d._prev_angle = goog.math.angle(d._transformed_center.x, - d._transformed_center.y, d._start.x, d._start.y); - d._merge_pairs = []; - d.bond = bond; - d.editor = this.editorObject; - - d - .addEventListener( - goog.fx.Dragger.EventType.DRAG, - function(e) { - try { - if (d._highlightGroups) { - goog.array.forEach(d._highlightGroups, - function(g) { - g.clear(); - }); - } - d._highlightGroups = []; - d._initDeltaX = d._initDeltaX || d.deltaX; - d._initDeltaY = d._initDeltaY || d.deltaY; - var deltaX = d.deltaX - d._initDeltaX; - var deltaY = d.deltaY - d._initDeltaY; - var new_angle = goog.math.angle( - d._transformed_center.x, - d._transformed_center.y, d._start.x - + deltaX, d._start.y + deltaY); - - var delta_angle = new_angle - d._prev_angle; - delta_angle = delta_angle - delta_angle % 30; - d._prev_angle = d._prev_angle + delta_angle; - var trans = kemia.graphics.AffineTransform - .getRotateInstance(-goog.math - .toRadians(delta_angle), - center.x, center.y); - var coords = trans.transformCoords([ - d.bond.source.coord, - d.bond.target.coord]); - d.bond.source.coord = coords[0]; - d.bond.target.coord = coords[1]; - d.editor - .setModelsSilently(d.editor.getModels()); - - var mouse_coord = new goog.math.Coordinate( - d._start.x + deltaX, d._start.y - + deltaY); - // this.logger.fine('mouse_coord: ' + - // mouse_coord.toString()); - var target = d.editor - .findTarget(e, mouse_coord); - - if (target instanceof kemia.model.Atom - && target.molecule == moving_atom.molecule) { - var exclusions = goog.array.concat( - pivot_atom, - goog.array.map(pivot_atom.bonds - .getValues(), function(b) { - return b.otherAtom(pivot_atom); - })); - if (!goog.array - .contains(exclusions, target)) { - // this.logger.fine('target: ' + - // target.toString()); - d._merge_pairs = [[target, - moving_atom]]; - d._highlightGroups - .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer - .highlightOn(moving_atom)); - d._highlightGroups - .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer - .highlightOn(target)); - } - } - - } catch (e) { - this.logger.severe(e); - } - - }, undefined, this); - - d.addEventListener(goog.fx.Dragger.EventType.END, function(e) { - try { - goog.array.forEach(d._merge_pairs, function(pair) { - if (pair[0].molecule == pair[1].molecule) { - kemia.controller.plugins.Move.closeRing(pair[0], - pair[1]); - } - }, this); - d.editor.setModelsSilently(d.editor.getModels()); - d._merge_pairs = []; - d.dispose(); -// this.logger.fine('END drag'); - } catch (e) { - this.logger.severe(e); - } finally { - this._dragging = false; - } - }, undefined, this); - this._dragging = true; -// this.logger.fine('START drag'); - d.startDrag(e); - } + var pivot_atom; + var moving_atom; + if (bond.source.bonds.getValues().length == 1) { + pivot_atom = bond.target; + moving_atom = bond.source; + } else if (bond.target.bonds.getValues().length == 1) { + pivot_atom = bond.source; + moving_atom = bond.target; + } + + if (pivot_atom) { + var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); + var center = pivot_atom.coord; + var trans; + if (this.editorObject.reactionRenderer.transform) { + trans = this.editorObject.reactionRenderer.transform; + } else { + trans = this.editorObject.reactionRenderer.moleculeRenderer.transform; + } + d._transformed_center = trans.transformCoords([center])[0]; + d._start = kemia.controller.ReactionEditor.getMouseCoords(e); + // this.logger.fine('d._start: ' + d._start.toString()); + d._prev_angle = goog.math.angle(d._transformed_center.x, + d._transformed_center.y, d._start.x, d._start.y); + d._merge_pairs = []; + d.bond = bond; + d.editor = this.editorObject; + + d + .addEventListener( + goog.fx.Dragger.EventType.DRAG, + function(e) { + try { + if (d._hightlightElements) { + goog.array.forEach(d._hightlightElements, + function(g) { + g.clear(); + }); + } + d._hightlightElements = []; + d._initDeltaX = d._initDeltaX || d.deltaX; + d._initDeltaY = d._initDeltaY || d.deltaY; + var deltaX = d.deltaX - d._initDeltaX; + var deltaY = d.deltaY - d._initDeltaY; + var new_angle = goog.math.angle( + d._transformed_center.x, + d._transformed_center.y, d._start.x + + deltaX, d._start.y + deltaY); + + var delta_angle = new_angle - d._prev_angle; + delta_angle = delta_angle - delta_angle % 30; + d._prev_angle = d._prev_angle + delta_angle; + var trans = kemia.graphics.AffineTransform + .getRotateInstance( - goog.math + .toRadians(delta_angle), + center.x, center.y); + var coords = trans.transformCoords([ + d.bond.source.coord, + d.bond.target.coord]); + d.bond.source.coord = coords[0]; + d.bond.target.coord = coords[1]; + d.editor + .setModelsSilently(d.editor.getModels()); + + var mouse_coord = new goog.math.Coordinate( + d._start.x + deltaX, d._start.y + + deltaY); + // this.logger.fine('mouse_coord: ' + + // mouse_coord.toString()); + var target = d.editor + .findTarget(e, mouse_coord); + + if (target instanceof kemia.model.Atom + && target.molecule == moving_atom.molecule) { + var exclusions = goog.array.concat( + pivot_atom, + goog.array.map(pivot_atom.bonds + .getValues(), + function(b) { + return b.otherAtom(pivot_atom); + })); + if (!goog.array + .contains(exclusions, target)) { + // this.logger.fine('target: ' + + // target.toString()); + d._merge_pairs = [[target, + moving_atom]]; + d._hightlightElements + .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer + .highlightOn(moving_atom)); + d._hightlightElements + .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer + .highlightOn(target)); + } + } + + } catch(e) { + this.logger.severe(e); + } + + }, + undefined, this); + + d.addEventListener(goog.fx.Dragger.EventType.END, + function(e) { + try { + goog.array.forEach(d._merge_pairs, + function(pair) { + if (pair[0].molecule == pair[1].molecule) { + kemia.controller.plugins.Move.closeRing(pair[0], + pair[1]); + } + }, + this); + d.editor.setModelsSilently(d.editor.getModels()); + d._merge_pairs = []; + d.dispose(); + // this.logger.fine('END drag'); + } catch(e) { + this.logger.severe(e); + } finally { + this._dragging = false; + } + }, + undefined, this); + this._dragging = true; + // this.logger.fine('START drag'); + d.startDrag(e); + } }; kemia.controller.plugins.Move.prototype.dragPlus = function(e, plus) { - var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); - d._prevX = e.clientX; - d._prevY = e.clientY; - - d.plus = plus; - d.editor = this.editorObject; - d - .addEventListener( - goog.fx.Dragger.EventType.DRAG, - function(e) { - - var trans = new goog.graphics.AffineTransform.getTranslateInstance( - e.clientX - d._prevX, e.clientY - d._prevY); - - var coords = d.editor.reactionRenderer.transform - .createInverse().transformCoords( - [ - new goog.math.Coordinate( - e.clientX, e.clientY), - new goog.math.Coordinate( - d._prevX, d._prevY)]); - var diff = goog.math.Coordinate.difference(coords[0], - coords[1]); - - d.plus.coord = goog.math.Coordinate.sum(plus.coord, - diff); - d.plus.group.clear(); - d.editor.reactionRenderer.plusRenderer.render(d.plus, - d.editor.reactionRenderer.transform); - - d._prevX = e.clientX; - d._prevY = e.clientY; - - }); - d.addEventListener(goog.fx.Dragger.EventType.END, function(e) { - - d.editor.setModelsSilently(d.editor.getModels()); - d.dispose(); - }); - d.startDrag(e); + var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); + d._prevX = e.clientX; + d._prevY = e.clientY; + + d.plus = plus; + d.editor = this.editorObject; + d + .addEventListener( + goog.fx.Dragger.EventType.DRAG, + function(e) { + + var trans = new goog.graphics.AffineTransform.getTranslateInstance( + e.clientX - d._prevX, e.clientY - d._prevY); + + var coords = d.editor.reactionRenderer.transform + .createInverse().transformCoords( + [ + new goog.math.Coordinate( + e.clientX, e.clientY), + new goog.math.Coordinate( + d._prevX, d._prevY)]); + var diff = goog.math.Coordinate.difference(coords[0], + coords[1]); + + d.plus.coord = goog.math.Coordinate.sum(plus.coord, + diff); + d.plus._elements.clear(); + d.editor.reactionRenderer.plusRenderer.render(d.plus, + d.editor.reactionRenderer.transform); + + d._prevX = e.clientX; + d._prevY = e.clientY; + + }); + d.addEventListener(goog.fx.Dragger.EventType.END, + function(e) { + + d.editor.setModelsSilently(d.editor.getModels()); + d.dispose(); + }); + d.startDrag(e); }; kemia.controller.plugins.Move.prototype.dragArrow = function(e, arrow) { - var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); - d._prevX = e.clientX; - d._prevY = e.clientY; - - d.arrow = arrow; - d.editor = this.editorObject; - d - .addEventListener( - goog.fx.Dragger.EventType.DRAG, - function(e) { - - var trans = new goog.graphics.AffineTransform.getTranslateInstance( - e.clientX - d._prevX, e.clientY - d._prevY); - - var coords = d.editor.reactionRenderer.transform - .createInverse().transformCoords( - [ - new goog.math.Coordinate( - e.clientX, e.clientY), - new goog.math.Coordinate( - d._prevX, d._prevY)]); - var diff = goog.math.Coordinate.difference(coords[0], - coords[1]); - - arrow.source = goog.math.Coordinate.sum(arrow.source, - diff); - arrow.target = goog.math.Coordinate.sum(arrow.target, - diff); - arrow.group.clear(); - d.editor.reactionRenderer.arrowRenderer.render(arrow, - d.editor.reactionRenderer.transform); - - d._prevX = e.clientX; - d._prevY = e.clientY; - - }); - d.addEventListener(goog.fx.Dragger.EventType.END, function(e) { - - d.editor.setModelsSilently(d.editor.getModels()); - d.dispose(); - }); - d.startDrag(e); + var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); + d._prevX = e.clientX; + d._prevY = e.clientY; + + d.arrow = arrow; + d.editor = this.editorObject; + d + .addEventListener( + goog.fx.Dragger.EventType.DRAG, + function(e) { + + var trans = new goog.graphics.AffineTransform.getTranslateInstance( + e.clientX - d._prevX, e.clientY - d._prevY); + + var coords = d.editor.reactionRenderer.transform + .createInverse().transformCoords( + [ + new goog.math.Coordinate( + e.clientX, e.clientY), + new goog.math.Coordinate( + d._prevX, d._prevY)]); + var diff = goog.math.Coordinate.difference(coords[0], + coords[1]); + + arrow.source = goog.math.Coordinate.sum(arrow.source, + diff); + arrow.target = goog.math.Coordinate.sum(arrow.target, + diff); + arrow._elements.clear(); + d.editor.reactionRenderer.arrowRenderer.render(arrow, + d.editor.reactionRenderer.transform); + + d._prevX = e.clientX; + d._prevY = e.clientY; + + }); + d.addEventListener(goog.fx.Dragger.EventType.END, + function(e) { + + d.editor.setModelsSilently(d.editor.getModels()); + d.dispose(); + }); + d.startDrag(e); }; kemia.controller.plugins.Move.prototype.dragMolecule = function(e, molecule) { - var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); - d._center = this.editorObject.getGraphicsCoords(molecule.getCenter()); - d._initDeltaX = null; - d._initDeltaY = null; - d._prevDeltaX = 0; - d._prevDeltaY = 0; - d._merge_pairs = []; - d.molecule = molecule; - d.editor = this.editorObject; - d - .addEventListener( - goog.fx.Dragger.EventType.DRAG, - function(e) { - if (d._highlightGroups) { - goog.array.forEach(d._highlightGroups, function(g) { - g.clear(); - }); - } - d._highlightGroups = []; - d._merge_pairs = []; - d._initDeltaX = d._initDeltaX || d.deltaX; - d._initDeltaY = d._initDeltaY || d.deltaY; - var deltaX = d.deltaX - d._initDeltaX; - var deltaY = d.deltaY - d._initDeltaY; - var deltaDeltaX = deltaX - d._prevDeltaX; - var deltaDeltaY = deltaY - d._prevDeltaY; - - // move graphic - d.molecule.group.setTransformation(deltaX, deltaY, 0, - 0, 0); - - var trans; - if (d.editor.reactionRenderer.transform) { - trans = d.editor.reactionRenderer.transform; - } else { - trans = d.editor.reactionRenderer.moleculeRenderer.transform; - } - - // move molecule - var diff = new goog.math.Vec2(deltaDeltaX - / trans.getScaleX(), deltaDeltaY - / trans.getScaleY()); - d.molecule.translate(diff); - - // d._prev = mouse_coord; - d._prevDeltaX = d.deltaX - d._initDeltaX; - d._prevDeltaY = d.deltaY - d._initDeltaY; - - // highlight merge sites - d._merge_exclusions = molecule.atoms; - var merge_pairs = this.editorObject.findAtomMergePairs( - molecule.atoms, d._merge_exclusions); - - // limit numbers of pairs that can be merged to two for now - if (merge_pairs.length > 1) { - d._merge_pairs = goog.array - .slice(merge_pairs, 0, 2); - } - goog.array - .forEach( - d._merge_pairs, - function(pair) { - d._highlightGroups - .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer - .highlightOn(pair[0])); - d._highlightGroups - .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer - .highlightOn(pair[1])); - }); - - }, undefined, this); - d - .addEventListener( - goog.fx.Dragger.EventType.END, - function(e) { - try { - if (d._merge_pairs.length == 2) { - var first_replaced_atom = d._merge_pairs[0][1]; - var second_replaced_atom = d._merge_pairs[1][1]; - var replaced_bond = goog.array - .find( - first_replaced_atom.bonds - .getValues(), - function(bond) { - return bond - .otherAtom(first_replaced_atom) == second_replaced_atom; - }); - var first_replacing_atom = d._merge_pairs[0][0]; - var second_replacing_atom = d._merge_pairs[1][0]; - var replacing_bond = goog.array - .find( - first_replacing_atom.bonds - .getValues(), - function(bond) { - return bond - .otherAtom(first_replacing_atom) == second_replacing_atom; - }); - if (replaced_bond && replacing_bond) { - first_replacing_atom.molecule.merge( - first_replaced_atom.molecule, - replaced_bond, replacing_bond, - first_replaced_atom, - first_replacing_atom); - } else { - // TTD implement merge of non-adjactent - // atoms, i.e. ring-bridging - - } - - } else { - // TTD implement merge of 1 or three pairs of - // atoms - } - d.editor.setModelsSilently(d.editor.getModels()); - d._merge_pairs = []; - d.dispose(); - - } catch (e) { - this.logger.severe(e); - } - }, undefined, this); - - d.startDrag(e); + var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); + d._center = this.editorObject.getGraphicsCoords(molecule.getCenter()); + d._initDeltaX = null; + d._initDeltaY = null; + d._prevDeltaX = 0; + d._prevDeltaY = 0; + d._merge_pairs = []; + d.molecule = molecule; + d.editor = this.editorObject; + d + .addEventListener( + goog.fx.Dragger.EventType.DRAG, + function(e) { + if (d._hightlightElements) { + goog.array.forEach(d._hightlightElements, + function(g) { + g.clear(); + }); + } + d._hightlightElements = []; + d._merge_pairs = []; + d._initDeltaX = d._initDeltaX || d.deltaX; + d._initDeltaY = d._initDeltaY || d.deltaY; + var deltaX = d.deltaX - d._initDeltaX; + var deltaY = d.deltaY - d._initDeltaY; + var deltaDeltaX = deltaX - d._prevDeltaX; + var deltaDeltaY = deltaY - d._prevDeltaY; + + // move graphic + d.molecule._elements.setTransformation(deltaX, deltaY, 0, + 0, 0); + + var trans; + if (d.editor.reactionRenderer.transform) { + trans = d.editor.reactionRenderer.transform; + } else { + trans = d.editor.reactionRenderer.moleculeRenderer.transform; + } + + // move molecule + var diff = new goog.math.Vec2(deltaDeltaX + / trans.getScaleX(), deltaDeltaY + / trans.getScaleY()); + d.molecule.translate(diff); + + // d._prev = mouse_coord; + d._prevDeltaX = d.deltaX - d._initDeltaX; + d._prevDeltaY = d.deltaY - d._initDeltaY; + + // highlight merge sites + d._merge_exclusions = molecule.atoms; + var merge_pairs = this.editorObject.findAtomMergePairs( + molecule.atoms, d._merge_exclusions); + + // limit numbers of pairs that can be merged to two for now + if (merge_pairs.length > 1) { + d._merge_pairs = goog.array + .slice(merge_pairs, 0, 2); + } + goog.array + .forEach( + d._merge_pairs, + function(pair) { + d._hightlightElements + .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer + .highlightOn(pair[0])); + d._hightlightElements + .push(d.editor.reactionRenderer.moleculeRenderer.atomRenderer + .highlightOn(pair[1])); + }); + + }, + undefined, this); + d + .addEventListener( + goog.fx.Dragger.EventType.END, + function(e) { + try { + if (d._merge_pairs.length == 2) { + var first_replaced_atom = d._merge_pairs[0][1]; + var second_replaced_atom = d._merge_pairs[1][1]; + var replaced_bond = goog.array + .find( + first_replaced_atom.bonds + .getValues(), + function(bond) { + return bond + .otherAtom(first_replaced_atom) == second_replaced_atom; + }); + var first_replacing_atom = d._merge_pairs[0][0]; + var second_replacing_atom = d._merge_pairs[1][0]; + var replacing_bond = goog.array + .find( + first_replacing_atom.bonds + .getValues(), + function(bond) { + return bond + .otherAtom(first_replacing_atom) == second_replacing_atom; + }); + if (replaced_bond && replacing_bond) { + first_replacing_atom.molecule.merge( + first_replaced_atom.molecule, + replaced_bond, replacing_bond, + first_replaced_atom, + first_replacing_atom); + } else { + // TTD implement merge of non-adjactent + // atoms, i.e. ring-bridging + } + + } else { + // TTD implement merge of 1 or three pairs of + // atoms + } + d.editor.setModelsSilently(d.editor.getModels()); + d._merge_pairs = []; + d.dispose(); + + } catch(e) { + this.logger.severe(e); + } + }, + undefined, this); + + d.startDrag(e); }; kemia.controller.plugins.Move.prototype.dragCanvas = function(e) { - var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); - d.addEventListener( - goog.fx.Dragger.EventType.DRAG, - function(e) { - var trans = this.editorObject.reactionRenderer.transform; - var x = d.screenX - d.lastX; - var y = d.screenY - d.lastY; - if (x || y) { - var diff = new goog.math.Vec2(x - / trans.getScaleX(), y - / trans.getScaleY()); - goog.array.forEach(this.editorObject.getModels(), function(model) { - if (model instanceof kemia.model.Reaction) { - model.translate(diff); - } - }); - this.editorObject.setModelsSilently(this.editorObject.getModels()); - } - d.lastX = d.screenX; - d.lastY = d.screenY; - }, undefined, this); - d.addEventListener( - goog.fx.Dragger.EventType.END, - function(e) { - this.editorObject.setModelsSilently(this.editorObject.getModels()); - d.dispose(); - }, undefined, this); - d.startDrag(e); + var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); + d.addEventListener( + goog.fx.Dragger.EventType.DRAG, + function(e) { + var trans = this.editorObject.reactionRenderer.transform; + var x = d.screenX - d.lastX; + var y = d.screenY - d.lastY; + if (x || y) { + var diff = new goog.math.Vec2(x + / trans.getScaleX(), y + / trans.getScaleY()); + goog.array.forEach(this.editorObject.getModels(), + function(model) { + if (model instanceof kemia.model.Reaction) { + model.translate(diff); + } + }); + this.editorObject.setModelsSilently(this.editorObject.getModels()); + } + d.lastX = d.screenX; + d.lastY = d.screenY; + }, + undefined, this); + d.addEventListener( + goog.fx.Dragger.EventType.END, + function(e) { + this.editorObject.setModelsSilently(this.editorObject.getModels()); + d.dispose(); + }, + undefined, this); + d.startDrag(e); }; kemia.controller.plugins.Move.prototype.rotateMolecule = function(e, molecule) { - var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); - - var trans; - if (this.editorObject.reactionRenderer.transform) { - trans = this.editorObject.reactionRenderer.transform; - } else { - trans = this.editorObject.reactionRenderer.moleculeRenderer.transform; - } - - d._center = trans.transformCoords([molecule.getCenter()])[0]; - d._start = kemia.controller.ReactionEditor.getMouseCoords(e); - d._start_angle = goog.math.angle(d._center.x, d._center.y, d._start.x, - d._start.y); - d._initDeltaX = null; - d._initDeltaY = null; - d.group = molecule.group; - d.molecule = molecule; - d.editor = this.editorObject; - - d.addEventListener(goog.fx.Dragger.EventType.DRAG, function(e) { - d._initDeltaX = d._initDeltaX || d.deltaX; - d._initDeltaY = d._initDeltaY || d.deltaY; - var deltaX = d.deltaX - d._initDeltaX; - var deltaY = d.deltaY - d._initDeltaY; - var new_angle = goog.math.angle(d._center.x, d._center.y, d._start.x - + deltaX, d._start.y + deltaY); - d._degrees = new_angle - d._start_angle; - d.group.setTransformation(0, 0, d._degrees, d._center.x, d._center.y); - }); - d.addEventListener(goog.fx.Dragger.EventType.END, function(e) { - d.molecule.rotate(-d._degrees, d.molecule.getCenter()); - d.editor.setModelsSilently(d.editor.getModels()); - d.dispose(); - }); - d.startDrag(e); + var d = new goog.fx.Dragger(this.editorObject.getOriginalElement()); + + var trans; + if (this.editorObject.reactionRenderer.transform) { + trans = this.editorObject.reactionRenderer.transform; + } else { + trans = this.editorObject.reactionRenderer.moleculeRenderer.transform; + } + + d._center = trans.transformCoords([molecule.getCenter()])[0]; + d._start = kemia.controller.ReactionEditor.getMouseCoords(e); + d._start_angle = goog.math.angle(d._center.x, d._center.y, d._start.x, + d._start.y); + d._initDeltaX = null; + d._initDeltaY = null; + d._elements = molecule._elements; + d.molecule = molecule; + d.editor = this.editorObject; + + d.addEventListener(goog.fx.Dragger.EventType.DRAG, + function(e) { + d._initDeltaX = d._initDeltaX || d.deltaX; + d._initDeltaY = d._initDeltaY || d.deltaY; + var deltaX = d.deltaX - d._initDeltaX; + var deltaY = d.deltaY - d._initDeltaY; + var new_angle = goog.math.angle(d._center.x, d._center.y, d._start.x + + deltaX, d._start.y + deltaY); + d._degrees = new_angle - d._start_angle; + d._elements.setTransformation(0, 0, d._degrees, d._center.x, d._center.y); + }); + d.addEventListener(goog.fx.Dragger.EventType.END, + function(e) { + d.molecule.rotate( - d._degrees, d.molecule.getCenter()); + d.editor.setModelsSilently(d.editor.getModels()); + d.dispose(); + }); + d.startDrag(e); }; /** @@ -951,4 +995,4 @@ kemia.controller.plugins.Move.prototype.rotateMolecule = function(e, molecule) { * @protected */ kemia.controller.plugins.Move.prototype.logger = goog.debug.Logger - .getLogger('kemia.controller.plugins.Move'); +.getLogger('kemia.controller.plugins.Move'); diff --git a/kemia/controller/reaction_editor_demo.html b/kemia/controller/reaction_editor_demo.html index 6b5fc1e..ddac714 100644 --- a/kemia/controller/reaction_editor_demo.html +++ b/kemia/controller/reaction_editor_demo.html @@ -5,7 +5,7 @@ kemia.controller.ReactionEditor - + + - +
diff --git a/kemia/view/bond_renderer_demo.js b/kemia/view/bond_renderer_demo.js index 38d860f..979a8c8 100644 --- a/kemia/view/bond_renderer_demo.js +++ b/kemia/view/bond_renderer_demo.js @@ -14,6 +14,7 @@ goog.require('kemia.graphics.AffineTransform'); goog.require('goog.debug.Console'); goog.require('kemia.graphics.ElementArray'); + goog.require('goog.Timer'); function initPage(){ @@ -109,6 +110,8 @@ function initPage(){ var bondStroke = new goog.graphics.Stroke( 1, 'black'); var bondFill = new goog.graphics.SolidFill( 'black'); - graphics.drawPath(bondPath, bondStroke, bondFill); + // elements.add(graphics.drawPath(bondPath, bond// Stroke, bondFill)); + // goog.Timer.callOnce(elements.clear(), 10000); }; +goog.events.listen(window, goog.events.EventType.LOAD, initPage); diff --git a/kemia/view/mol_demo.html b/kemia/view/mol_demo.html index 6b14296..4e975d0 100644 --- a/kemia/view/mol_demo.html +++ b/kemia/view/mol_demo.html @@ -3,7 +3,7 @@ kemia.view.MoleculeRenderer - + diff --git a/kemia/view/mol_demo.js b/kemia/view/mol_demo.js index b9e6e86..15508fb 100644 --- a/kemia/view/mol_demo.js +++ b/kemia/view/mol_demo.js @@ -8,8 +8,8 @@ goog.require('kemia.io.Testdata'); function draw() { // uncomment next two lines to debug to console - //var c = new goog.debug.Console(); - //c.setCapturing(true); + var c = new goog.debug.Console(); + c.setCapturing(true); var sdfs = kemia.io.Testdata.sdf.split("$$$$\n"); var mol_renderer = new kemia.controller.ReactionEditor(goog.dom.getElement('container'), { background: { @@ -28,7 +28,7 @@ function draw() { select1.addItem(new goog.ui.MenuItem('8', 8)); select1.addItem(new goog.ui.MenuItem('9', 9)); select1.addItem(new goog.ui.MenuItem('10', 10)); - select1.addItem(new goog.ui.MenuItem('11 (too large right now)', 11)); + select1.addItem(new goog.ui.MenuItem('11 (not too large right now)', 11)); select1.addItem(new goog.ui.MenuItem('12', 12)); select1.addItem(new goog.ui.MenuItem('13', 13)); select1.addItem(new goog.ui.MenuItem('14', 14)); diff --git a/kemia/view/molecule_renderer.js b/kemia/view/molecule_renderer.js index 3150b1d..6bb40ee 100644 --- a/kemia/view/molecule_renderer.js +++ b/kemia/view/molecule_renderer.js @@ -3,8 +3,7 @@ goog.require('kemia.view.BondRenderer'); goog.require('kemia.view.BondRendererFactory'); goog.require('kemia.view.AtomRenderer'); goog.require('kemia.view.AromaticityRenderer'); - - +goog.require('kemia.graphics.ElementArray'); goog.require('goog.asserts'); /** @@ -16,16 +15,17 @@ goog.require('goog.asserts'); * @extends {kemia.view.Renderer} */ kemia.view.MoleculeRenderer = function(graphics, opt_config) { - kemia.view.Renderer.call(this, graphics, - kemia.view.MoleculeRenderer.defaultConfig, opt_config); - this.scale_factor = 1; + kemia.view.Renderer.call(this, graphics, + kemia.view.MoleculeRenderer.defaultConfig, opt_config); + this.scale_factor = 1; - this.bondRendererFactory = new kemia.view.BondRendererFactory(graphics, - this.config); + this.bondRendererFactory = new kemia.view.BondRendererFactory(graphics, + this.config); - this.atomRenderer = new kemia.view.AtomRenderer(graphics, this.config); + this.atomRenderer = new kemia.view.AtomRenderer(graphics, this.config); + + this.aromaticityRenderer = new kemia.view.AromaticityRenderer(graphics, this.config); - this.aromaticityRenderer = new kemia.view.AromaticityRenderer(graphics, this.config); } goog.inherits(kemia.view.MoleculeRenderer, kemia.view.Renderer); @@ -37,65 +37,83 @@ goog.inherits(kemia.view.MoleculeRenderer, kemia.view.Renderer); * @protected */ kemia.view.MoleculeRenderer.prototype.logger = goog.debug.Logger - .getLogger('kemia.view.MoleculeRenderer'); +.getLogger('kemia.view.MoleculeRenderer'); kemia.view.MoleculeRenderer.prototype.setScaleFactor = function(scale) { - this.scale_factor = scale; + this.scale_factor = scale; } kemia.view.MoleculeRenderer.prototype.render = function(molecule, trans) { - molecule.mustRecalcSSSR = true; - molecule.group = this.graphics.createGroup(); - - var atom_coords = goog.array.map(molecule.atoms, function(a) { - return a.coord; - }); - var box = goog.math.Box.boundingBox.apply(null, atom_coords); - - if (!trans) { - // if not part of a reaction, we need to create a transform - var m = this.config.get("margin"); - var ex_box = box.expand(m, m, m, m); - trans = this.buildTransform(ex_box); - } - this.setTransform(trans); - - var center = new goog.math.Coordinate((box.left + box.right) / 2, - (box.top + box.bottom) / 2); - var t_center = this.transform.transformCoords( [ center ])[0]; - var rx = Math.abs(this.transform.getScaleX() * (box.right - box.left) / 2); - var ry = Math.abs(this.transform.getScaleY() * (box.bottom - box.top) / 2); - - var bondStroke = new goog.graphics.Stroke( - this.config.get("bond")['stroke']['width'], - this.config.get("bond")['stroke']['color']); - var bondFill = new goog.graphics.SolidFill( - this.config.get("bond")['fill']['color']); - - if (molecule.bonds.length) { - var bondPath = new goog.graphics.Path(); - goog.array.forEach(molecule.bonds, function(bond) { - this.bondRendererFactory.get(bond).render(bond, trans, bondPath); - }, this); - this.graphics.drawPath(bondPath, bondStroke, bondFill, molecule.group); - - var aromRingRenderer = this.aromaticityRenderer; - goog.array.forEach(molecule.getRings(), function(ring){ - var aromatic_bonds = goog.array.filter(ring.bonds, function(b){ - return b.aromatic; - }); - if (aromatic_bonds.length==ring.bonds.length) { - aromRingRenderer.render(ring,trans); - } - }); - +// TTD this does not belong on molecule, neighborlist should track graphic elements not just model objects + if (!molecule._elements){ + /** @type {kemia.graphics.ElementArray} + * @private + */ + molecule._elements = new kemia.graphics.ElementArray(); + } else { + molecule._elements.clear(); } - // this.logger.info("molecule has " + molecule.atoms.length + " atoms"); - goog.array.forEach(molecule.atoms, function(atom) { - this.atomRenderer.render(atom, trans, molecule.group); - }, this); + molecule.mustRecalcSSSR = true; + + var atom_coords = goog.array.map(molecule.atoms, + function(a) { + return a.coord; + }); + var box = goog.math.Box.boundingBox.apply(null, atom_coords); + + if (!trans) { + // if not part of a reaction, we need to create a transform + var m = this.config.get("margin"); + var ex_box = box.expand(m, m, m, m); + trans = this.buildTransform(ex_box); + } + this.setTransform(trans); + + var center = new goog.math.Coordinate((box.left + box.right) / 2, + (box.top + box.bottom) / 2); + var t_center = this.transform.transformCoords([center])[0]; + var rx = Math.abs(this.transform.getScaleX() * (box.right - box.left) / 2); + var ry = Math.abs(this.transform.getScaleY() * (box.bottom - box.top) / 2); + + var bondStroke = new goog.graphics.Stroke( + this.config.get("bond")['stroke']['width'], + this.config.get("bond")['stroke']['color']); + var bondFill = new goog.graphics.SolidFill( + this.config.get("bond")['fill']['color']); + var bondPath = new goog.graphics.Path(); + + goog.array.forEach(molecule.bonds, + function(bond) { + this.bondRendererFactory.get(bond).render(bond, trans, bondPath); + }, + this); + + var aromRingRenderer = this.aromaticityRenderer; + goog.array.forEach(molecule.getRings(), + function(ring) { + var aromatic_bonds = goog.array.filter(ring.bonds, + function(b) { + return b.aromatic; + }); + if (aromatic_bonds.length == ring.bonds.length) { + this._elements.add( + aromRingRenderer.render(ring, trans, bondPath)); + } + }); + + molecule._elements.add(this.graphics.drawPath(bondPath, bondStroke, bondFill)); + + + // this.logger.info("molecule has " + molecule.atoms.length + " atoms"); + goog.array.forEach(molecule.atoms, + function(atom) { + + + this.atomRenderer.render(atom, trans, molecule._elements); + }, + this); }; /** @@ -103,46 +121,49 @@ kemia.view.MoleculeRenderer.prototype.render = function(molecule, trans) { * molecule * @param {string=} * opt_color - * @param {goog.graphics.Group=} - * opt_group + * @param {kemia.graphics.ElementArray=} opt_element_array + * @return {kemia.graphics.ElementArray} */ kemia.view.MoleculeRenderer.prototype.highlightOn = function(molecule, - opt_color, opt_group) { - - if (!opt_color) { - opt_color = this.config.get("highlight")['color']; - } - if (!opt_group) { - opt_group = this.graphics.createGroup(); - } - - goog.array.forEach(molecule.bonds, function(bond) { - this.bondRendererFactory.get(bond).highlightOn(bond, opt_color, - opt_group); - }, this); - - goog.array.forEach(molecule.atoms, function(atom) { - this.atomRenderer.highlightOn(atom, opt_color, opt_group); - }, this); - - return opt_group; +opt_color, opt_element_array) { + + if (!opt_color) { + opt_color = this.config.get("highlight")['color']; + } + if (!opt_element_array) { + opt_element_array = new kemia.graphics.ElementArray(); + } + + goog.array.forEach(molecule.bonds, + function(bond) { + this.bondRendererFactory.get(bond).highlightOn(bond, opt_color, opt_element_array); + }, + this); + + goog.array.forEach(molecule.atoms, + function(atom) { + this.atomRenderer.highlightOn(atom, opt_color, opt_element_array); + }, + this); + + return opt_element_array; } /** * A default configuration for renderer */ kemia.view.MoleculeRenderer.defaultConfig = { - 'bond' : { - 'stroke' : { - 'width' : 2, - 'color' : 'black' - }, - 'fill' : { - 'color' : 'black' - } - }, - 'highlight' : { - 'radius' : .3, - 'color' : 'blue' - } + 'bond': { + 'stroke': { + 'width': 2, + 'color': 'black' + }, + 'fill': { + 'color': 'black' + } + }, + 'highlight': { + 'radius': .3, + 'color': 'blue' + } }; diff --git a/kemia/view/molecule_renderer_demo.html b/kemia/view/molecule_renderer_demo.html index d7b32a4..db32826 100644 --- a/kemia/view/molecule_renderer_demo.html +++ b/kemia/view/molecule_renderer_demo.html @@ -3,7 +3,7 @@ kemia.view.MoleculeRenderer - + diff --git a/kemia/view/molecule_renderer_demo.js b/kemia/view/molecule_renderer_demo.js index 3e44af7..1e02a71 100644 --- a/kemia/view/molecule_renderer_demo.js +++ b/kemia/view/molecule_renderer_demo.js @@ -25,7 +25,7 @@ function initPage(){ var element = goog.dom.getElement('container') var graphics = goog.graphics.createGraphics(element.clientWidth, element.clientHeight); - var group = graphics.createGroup(); + graphics.render(element); var r = new kemia.view.MoleculeRenderer( graphics); @@ -37,7 +37,7 @@ function initPage(){ // mol1.addAtom(o1); // var b = new kemia.model.Bond(c1, o1); // mol1.addBond(b); - r.render(mol1, trans, group); + r.render(mol1, trans); var mol2 = new kemia.model.Molecule(); var c2 = new kemia.model.Atom("C", 5, -2); @@ -47,7 +47,7 @@ function initPage(){ var b2 = new kemia.model.Bond(c2, o2, 2) mol2.addBond(b2); - r.render(mol2, trans, group); + r.render(mol2, trans); var mol3 = new kemia.model.Molecule(); var c3 = new kemia.model.Atom("C", 8, -2); @@ -66,7 +66,7 @@ function initPage(){ var b4 = new kemia.model.Bond(n,s, 4); mol3.addBond(b4); - r.render(mol3, trans, group); + r.render(mol3, trans); var mol4 = new kemia.model.Molecule(); var p = new kemia.model.Atom("P", 4, -4); @@ -84,7 +84,7 @@ function initPage(){ var b6 = new kemia.model.Bond(f,br); b6.stereo = kemia.model.Bond.STEREO.UP; mol4.addBond(b6); - r.render(mol4, trans, group); + r.render(mol4, trans); var mol5 = new kemia.model.Molecule(); var i = new kemia.model.Atom("I", 8, -4); @@ -94,10 +94,7 @@ function initPage(){ var b7 = new kemia.model.Bond(i,h); b7.stereo = kemia.model.Bond.STEREO.UP_OR_DOWN; mol5.addBond(b7); - r.render(mol5, trans, group); - - - + r.render(mol5, trans); }; diff --git a/kemia/view/plus_renderer.js b/kemia/view/plus_renderer.js index 8c7f109..6ebfaaa 100644 --- a/kemia/view/plus_renderer.js +++ b/kemia/view/plus_renderer.js @@ -21,6 +21,15 @@ goog.inherits(kemia.view.PlusRenderer, kemia.view.Renderer); * @param {kemia.graphics.AffineTransform} transform */ kemia.view.PlusRenderer.prototype.render = function(plus, transform) { + // TTD this does not belong on plus, neighborlist should track graphic elements not just model objects + if (!plus._elements){ + /** @type {kemia.graphics.ElementArray} + * @private + */ + plus._elements = new kemia.graphics.ElementArray(); + } else { + plus._elements.clear(); + } this.setTransform(transform); plus.group = this.graphics.createGroup(); var coord = plus.coord; @@ -43,7 +52,7 @@ kemia.view.PlusRenderer.prototype.render = function(plus, transform) { path.lineTo(coords[3].x, coords[3].y); // the visible plus sign - this.graphics.drawPath(path, stroke, null, plus.group); + plus._elements.add(this.graphics.drawPath(path, stroke)); };