Ignore:
Timestamp:
2013-02-26T16:39:06+13:00 (11 years ago)
Author:
sjm84
Message:

Implemented undo functionality

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone3/web/interfaces/default/js/visual-xml-editor.js

    r26927 r26966  
    2828    _overList.freeSpaces = new Array();
    2929   
     30    var _transactions = new Array();
     31   
    3032    this.getXML = function()
    3133    {
    3234        return _xml;
     35    }
     36   
     37    this.undo = function()
     38    {
     39        if(_transactions.length > 0)
     40        {
     41            var t = _transactions.pop();
     42            //Undo an added element
     43            if(t.type == "addElem")
     44            {
     45                $(t.vElem.data("parentVEElement").getXMLNode()).remove();
     46                t.vElem.remove();
     47                resizeAll();
     48            }
     49            //Undo a removed or moved element
     50            else if(t.type == "remMvElem")
     51            {
     52                var parent = t.vElemParent;
     53                var pos = t.vElemPos;
     54                var elem = t.vElem;
     55                if(pos == 0)
     56                {
     57                    parent.prepend(elem);
     58                    $(parent.parent().data("parentVEElement").getXMLNode()).prepend(elem.data("parentVEElement").getXMLNode());
     59                }
     60                else if(pos == parent.children(".veElement").length - 1)
     61                {
     62                    parent.children(".veElement").eq(pos - 1).after(elem);
     63                    $(parent.children(".veElement").eq(pos - 1).data("parentVEElement").getXMLNode()).after(elem.data("parentVEElement").getXMLNode());
     64                }
     65                else
     66                {
     67                    parent.children(".veElement").eq(pos).before(elem);
     68                    $(parent.children(".veElement").eq(pos).data("parentVEElement").getXMLNode()).before(elem.data("parentVEElement").getXMLNode());
     69                }
     70                resizeAll();
     71            }
     72            //Undo an added attribute
     73            else if(t.type == "addAttr")
     74            {
     75                if(t.row)
     76                {
     77                    t.row.remove();
     78                }
     79            }
     80            //Undo a removed or edited attribute
     81            else if(t.type == "editAttr")
     82            {
     83                t.elem.removeAttribute(t.newName);
     84                t.elem.setAttribute(t.name, t.value);
     85                if(t.row)
     86                {
     87                    t.row.children("td").eq(0).text(t.name);
     88                    t.row.children("td").eq(1).text(t.value);
     89                }
     90            }
     91            //Undo a removed or edited attribute
     92            else if(t.type == "remAttr")
     93            {
     94                t.elem.setAttribute(t.name, t.value);
     95                if(t.rowParent)
     96                {
     97                    t.rowParent.append(t.row);
     98                }
     99            }
     100            //Undo edited text
     101            else if(t.type == "editText")
     102            {
     103                t.elem.nodeValue = t.value;
     104                if(t.vElem)
     105                {
     106                    t.vElem.text(t.value);
     107                }
     108            }
     109        }
    33110    }
    34111   
     
    391468            link.click(function()
    392469            {
    393                 var nameCell = cell.parent().children("td").eq(0);
    394                 var valueCell = cell.parent().children("td").eq(1);
     470                var nameCell = _row.children("td").eq(0);
     471                var valueCell = _row.children("td").eq(1);
    395472                if(link.text() == "edit")
    396473                {
     
    433510                    _xmlElem.setAttribute(name, value);
    434511                   
     512                    _transactions.push({type:"editAttr", elem:_xmlElem, row:_row, newName:name, name:_name, value:_value});
     513                   
    435514                    _name = name;
    436515                    _value = value;
     
    447526            link.click(function()
    448527            {
     528                _transactions.push({type:"remAttr", elem:_xmlElem, row:_row, rowParent:_row.parent(), name:_name, value:_value});
    449529                _xmlElem.removeAttribute(_name);
    450                 _row.remove();
     530                _row.detach(); 
    451531            });
    452532            cell.append(link);
     
    609689                "stop":function(event, ui)
    610690                {
     691                    var transactionType = (_div.data("toolbar")) ? "addElem" : "remMvElem";
    611692                    _div.data("dragging", false);
    612693                    _div.data("toolbar", false);
     
    649730                            $(xmlNode).append(_xmlNode);
    650731                        }
     732                        _transactions.push({type:transactionType, vElemParent:_origDDParent, vElemPos:_origDDPosition, vElem:_div});
    651733                    }
    652734                }
     
    726808                {
    727809                    var newAtt = new VEAttribute(null, _xmlNode, "", "");
    728                     attributeTable.append(newAtt.getAsTableRow());
     810                    var row = newAtt.getAsTableRow();
     811                    attributeTable.append(row);
     812                    _transactions.push({type:"addAttr", row:row})
    729813                });
    730814                _infoDiv.append(addButton);
     
    748832                    if(editButton.text() == "edit text")
    749833                    {
     834                        nodeText.data("prevTextValue", nodeText.text());
    750835                        var textArea = $("<textarea>");
    751836                        textArea.val(nodeText.text());
     
    756841                    else
    757842                    {
     843                        _transactions.push({type:"editText", elem:_xmlNode, vElem: nodeText, value:nodeText.data("prevTextValue")});
    758844                        var textArea = nodeText.find("textarea");
    759845                        var newValue = textArea.val();
Note: See TracChangeset for help on using the changeset viewer.