Mercurial > hg > Members > shoshi > TreeCMS > TreeCMSPrototype1
view src/treecms/proto/simple/SimpleEditor.java @ 32:02ef906d0341
2010/11/18
added GUIEditor
Monotonic-tree GUI editor.
modified Editor API
bug fix (not done yet , still buggy)
author | shoshi |
---|---|
date | Thu, 18 Nov 2010 19:05:23 +0900 |
parents | 174bc0d21712 |
children | c0a0fa870e6e |
line wrap: on
line source
package treecms.proto.simple; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import java.util.LinkedList; import treecms.proto.api.Editor; import treecms.proto.api.Node; public class SimpleEditor implements Editor { private AtomicReference<Node> m_repository; private Node m_tip,m_latest; private LinkedList<Node> m_log; public SimpleEditor(AtomicReference<Node> _contents) { m_repository = _contents; m_tip = m_repository.get(); m_latest = m_tip; m_log = new LinkedList<Node>(); } public boolean checkUpdate() { return !m_repository.compareAndSet(m_latest,m_latest); } public boolean commit(boolean _force) { if(_force){ m_repository.set(m_tip); update(); return true; } return m_repository.compareAndSet(m_latest,m_tip); } public void merge() { LinkedList<Node> log = new LinkedList<Node>(m_log); update(); //update first. for(Node node : log){ edit(node); //edit again; } } public void discard() { m_tip = m_latest; m_log.clear(); } @Override public Node useContents() { return m_latest; } @Override public void login(String user, String pass) { } @Override public void logout() { } @Override public Node edit(Node _target) { LinkedList<Node> path = findPath(m_tip,_target); if(path.isEmpty()){ return null; } LinkedList<Node> change = new LinkedList<Node>(); Node root = path.poll().cloneNode(); change.add(root); cloneTree(path,root,change); m_tip = root; m_log.add(change.peekLast()); //add to change log. return change.peekLast(); } private void cloneTree(LinkedList<Node> _path,Node _parent,LinkedList<Node> _change) { List<Node> children = _parent.getChildren(); Node target = _path.poll(); if(target == null){ return; } for(int i = 0;i < children.size();i ++){ Node _child = children.get(i); if(_child.getID().compare(target.getID()) != -2){ //clone node Node clone = _child.cloneNode(); _change.add(clone); //remove old node from clonedTree _parent.replace(_child,clone); cloneTree(_path,clone,_change); break; } } } private LinkedList<Node> findPath(Node _root,Node _child) { LinkedList<Node> list = new LinkedList<Node>(); findPath(_root,_child,list); list.addFirst(_root); return list; } private boolean findPath(Node _root,Node _child,LinkedList<Node> _list) { if(_root == _child){ return true; } for(Node child : _root.getChildren()){ if(findPath(child,_child,_list)){ _list.addFirst(child); return true; } } return false; } @Override public Node getUncommited() { return m_tip; } @Override public boolean update() { discard(); m_latest = m_repository.get(); m_tip = m_latest; return true; } @Override public boolean check() { return checkUpdate(); } }