fenfire-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ff-cvs] fenfire ./README.MMDEMO org/fenfire/demo/mm.py


From: Asko Soukka
Subject: [ff-cvs] fenfire ./README.MMDEMO org/fenfire/demo/mm.py
Date: Wed, 27 Aug 2003 12:23:28 -0400

CVSROOT:        /cvsroot/fenfire
Module name:    fenfire
Branch:         
Changes by:     Asko Soukka <address@hidden>    03/08/27 12:23:27

Modified files:
        .              : README.MMDEMO 
        org/fenfire/demo: mm.py 

Log message:
        deleting nodes

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/README.MMDEMO.diff?tr1=1.11&tr2=1.12&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/demo/mm.py.diff?tr1=1.48&tr2=1.49&r1=text&r2=text

Patches:
Index: fenfire/README.MMDEMO
diff -u fenfire/README.MMDEMO:1.11 fenfire/README.MMDEMO:1.12
--- fenfire/README.MMDEMO:1.11  Tue Aug 26 13:32:31 2003
+++ fenfire/README.MMDEMO       Wed Aug 27 12:23:27 2003
@@ -131,6 +131,10 @@
 Ctrl-V or Ctrl-Y
        Paste the content of the clipbard (just after the cursor).
 
+Ctrl-D
+       Deletes the accursed node. All nodes connected to it will
+        remain on the floating buffer.
+
 Ctrl-B
        Adds current node onto floating buffer. 
 
Index: fenfire/org/fenfire/demo/mm.py
diff -u fenfire/org/fenfire/demo/mm.py:1.48 fenfire/org/fenfire/demo/mm.py:1.49
--- fenfire/org/fenfire/demo/mm.py:1.48 Wed Aug 27 04:10:59 2003
+++ fenfire/org/fenfire/demo/mm.py      Wed Aug 27 12:23:27 2003
@@ -117,16 +117,26 @@
 # nodeview for normal nodes
 normal_text = ff.view.TextNodeView(fen.txtfunc, style, java.awt.Color(0., 0., 
0.), 250.)
 normal_text_bg = ff.fenmm.WhiteNodeView(normal_text, java.awt.Color(.6, .6, 
.6))
-normal = ff.swamp.CachedPureNodeFunction(100, fen.graph, normal_text_bg)
+normalf = ff.swamp.CachedPureNodeFunction(100, fen.graph, normal_text_bg)
 
 # nodeview for accursed nodes
 accursed_text = ff.view.TextNodeView(fen.txtfunc, style, java.awt.Color.black, 
250.)
 accursed_text_bg = ff.fenmm.WhiteNodeView(accursed_text, java.awt.Color(.9, 
.9, .9))
-accursed = ff.swamp.CachedPureNodeFunction(100, fen.graph, accursed_text_bg)
-multiplexer = ff.swamp.MultiplexerNodeFunction(normal, accursed)
+accursedf = ff.swamp.CachedPureNodeFunction(100, fen.graph, accursed_text_bg)
+multiplexer = ff.swamp.MultiplexerNodeFunction(normalf, accursedf)
 
 structLink = ff.structure.StructLink.create(fen.graph)
 
+def i2l(iteratorToList):
+    """
+    Iterates the given iterator throughout and returns
+    its components as a new list.
+    """
+    list = []
+    while iteratorToList.hasNext():
+        list.append(iteratorToList.next())
+    return list
+
 class Context(ff.view.buoy.AbstractMainNode2D.Context):
     def __init__(self, fen, w, components, multiplexer, style):
         self.fen = fen
@@ -175,27 +185,81 @@
         l = len(self.alphContent.getText(self.fen.graph, accursed))
 
         offset = self.c.getOffset()
-        if offset == 0 and l == 0:
-            try: self.components.remove(accursed)
-            except ValueError: pass
-            self.fen.graph.rm_111(accursed, RDF.type, MINDSTRUCT.Data)
-            self.c.setAccursed(None)
+        if offset == 0 and l == 0: self.rmNode(accursed)
+
+    def rmNode(self, obj):
+        """
+        Removes a node form the graph.
+
+        If the removed node was accursed or centered (set as plane)
+        a new accursion or centerint (plane) will be set.
+        """
+
+        # store some data from the removed node
+        wasLinked = structLink.isLinked(obj)
+        wasAccursed = (obj == self.c.getAccursed())
+            
+        # remove all connections from the node
+        # do it so that only the target nodes, not the node to be
+        # removed, will be put ont the floating buffer
+        neighbour = i2l(self.fen.graph.findN_X11_Iter(STRUCTLINK.linkedTo, 
obj))
+        neighbour.extend(i2l(self.fen.graph.findN_11X_Iter(obj, 
STRUCTLINK.linkedTo)))
+        for node in neighbour: self.rmLinkTo(node, obj)
+
+        # if the removed node was on the floating buffer, remove it
+        try: self.components.remove(obj)
+        except ValueError: pass
+        
+        # remove node
+        self.fen.graph.rm_111(obj, RDF.type, MINDSTRUCT.Data)
+
+        # at first, look a proper new accursed node or make none accursed
+        if obj == self.c.getAccursed():
             for node in self.components:
-                if structLink.isLinked(node): continue
+                if structLink.isLinked(node) != wasLinked: continue
                 else: self.c.setAccursed(node)
-            if dbg: p('Offset after deleteText:', self.getOffset(), l)
+        if obj == self.c.getAccursed(): self.c.setAccursed(None)
+        # then, if the removed node was centered (plane) center its biggest 
neighbour
+        if obj == self.main.getPlane():
+            neighbourSet = 
java.util.HashSet(java.util.Arrays.asList(neighbour))
+            comps, largest = 
Traversals.findComponents(neighbourSet.iterator(), STRUCTLINK.linkedTo,
+                                                       self.fen.graph, 
neighbourSet)
+            if largest:
+                focus = self.main.getFocus()
+                self.main.setNewPlane(largest, focus.getPanX(), 
focus.getPanY(), focus.getZoom())
+                if wasAccursed: self.c.setAccursed(largest)
+                try: self.components.remove(largest)
+                except ValueError: pass
+        # if the removed node had no neighbours, center the biggest floating 
component
+        if obj == self.main.getPlane():
+            floatingSet = 
java.util.HashSet(java.util.Arrays.asList(self.components))
+            comps, largest = Traversals.findComponents(floatingSet.iterator(), 
STRUCTLINK.linkedTo,
+                                                       self.fen.graph, 
floatingSet)
+            if largest:
+                focus = self.main.getFocus()
+                self.main.setNewPlane(largest, focus.getPanX(), 
focus.getPanY(), focus.getZoom())
+                if wasAccursed: self.c.setAccursed(largest)
+                try: self.components.remove(largest)
+                except ValueError: pass
+        # if the removed node was the last node in the graph, create a new 
Home and center it
+        if obj == self.main.getPlane():
+            node = ff.util.RDFUtil.N(fen.graph, MINDSTRUCT.Data)
+            focus = self.main.getFocus()
+            self.alphContent.setText(node, 'Home', 1)
+            self.main.setNewPlane(node, focus.getPanX(), focus.getPanY(), 
focus.getZoom())
+            if wasAccursed: self.c.setAccursed(node)
 
     def rmLinkTo(self, obj, with):
         totRemoved = 0
-        iter = self.fen.graph.findN_11X_Iter(obj, STRUCTLINK.linkedTo)
+        links = i2l(self.fen.graph.findN_11X_Iter(obj, STRUCTLINK.linkedTo))
         try:
-            while (iter.hasNext()):
-                if with == iter.next():
+            for l in links:
+                if with == l:
                     self.fen.graph.rm_111(obj, STRUCTLINK.linkedTo, with)
                     totRemoved += 1
-            iter = self.fen.graph.findN_11X_Iter(with, STRUCTLINK.linkedTo)
-            while (iter.hasNext()):
-                if obj == iter.next():
+            links = i2l(self.fen.graph.findN_11X_Iter(with, 
STRUCTLINK.linkedTo))
+            for l in links:
+                if obj == l:
                     self.fen.graph.rm_111(with, STRUCTLINK.linkedTo, obj)
                     totRemoved += 1
         except: pass
@@ -269,7 +333,9 @@
             if node == main.getPlane(): pass
             elif self.context.rmLinkTo(node, main.getPlane()) == 0:
                 self.fen.graph.add(main.getPlane(), STRUCTLINK.linkedTo, node)
-                try: self.context.components.remove(node)
+                try:
+                    self.context.components.remove(node)
+                    self.context.c.setAccursed(None)
                 except ValueError: pass
 
 class ZoomPan(vob.input.RelativeAxisListener, Action, 
vob.mouse.MousePressListener):
@@ -295,31 +361,7 @@
 class MMScene:
     def __init__(self):
         self.alphContent = ff.util.AlphContent(fen)
-        components = []
-        if do_load_graph:
-            # find separate components
-            nodes = fen.graph.findN_X1A_Iter(STRUCTLINK.linkedTo)
-            comps = Traversals.findComponents(nodes, STRUCTLINK.linkedTo, 
fen.graph)
-            centered = None
-            if comps[1] != None: centered = comps[1]
-
-            for component in comps[0].toArray():
-                components.append(component)
-
-            nodes = fen.graph.findN_X11_Iter(RDF.type, MINDSTRUCT.Data)
-            # find non-linked nodes
-            while (nodes.hasNext()):
-                obj = nodes.next()
-                if structLink.isLinked(obj): continue
-                if obj == centered: continue
-                if centered == None: centered = obj
-                components.append(obj)
-
-            try: components.remove(centered)
-            except: pass
-        else:
-            centered = ff.util.RDFUtil.N(fen.graph, MINDSTRUCT.Data)
-            self.alphContent.insertText(centered, 0, 'Home', 1)
+        components, centered = self.compinit()
 
         self.context = Context(fen, w, components, multiplexer, style)
 
@@ -371,6 +413,29 @@
                 vob.input.BoundedFloatLinearAbsoluteAdapter(self.axes[i]))
         except: pass # java.io.FileNotFoundException: pass
 
+    def compinit(self):
+        """Finds mindmap components; if none, creates one.
+        Returns tuple: the first element is a list of other components but
+                       the second element, which is the largest component"""
+        # find all nodes of mindmap node type
+        nodes1 = fen.graph.findN_X11_Iter(RDF.type, MINDSTRUCT.Data)
+        # find subjects of link property (objects are in same components)
+        nodes2 = fen.graph.findN_X1A_Iter(STRUCTLINK.linkedTo)
+        # search nodes of both finds for components
+        nodes = Traversals.concat(nodes1, nodes2)
+        comps, largest = Traversals.findComponents(nodes, STRUCTLINK.linkedTo, 
fen.graph)
+        components = []
+        if largest == None:
+            # No components, so create one for focus
+            largest = ff.util.RDFUtil.N(fen.graph, MINDSTRUCT.Data)
+            self.alphContent.setText(largest, 'Home', 1)
+        else:
+            # convert from java.util.Set to list
+            for component in comps.toArray():
+                components.append(component)
+            components.remove(largest)
+        return components, largest
+
     def scene(self, vs):
         if self.context.replaceVS:
             VobScene = self.context.replaceVS
@@ -505,6 +570,9 @@
         elif key == "Ctrl-B":
             """Buffer accursed node."""
             self.context.components.append(self.context.c.getAccursed())
+        elif key == "Ctrl-D":
+            """Delete accursed node."""
+            self.context.rmNode(self.context.c.getAccursed())
         elif key == "Ctrl-0":
             """Set calibrating state of custom controller on / off."""
             if self.calibrating and self.naxes: 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]