[Top][All Lists]
[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: