/[fenfire]/fenfire/org/fenfire/demo/mm.py
ViewVC logotype

Diff of /fenfire/org/fenfire/demo/mm.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.48 by humppake, Wed Aug 27 08:10:59 2003 UTC revision 1.49 by humppake, Wed Aug 27 16:23:27 2003 UTC
# Line 117  style = vob.GraphicsAPI.getInstance().ge Line 117  style = vob.GraphicsAPI.getInstance().ge
117  # nodeview for normal nodes  # nodeview for normal nodes
118  normal_text = ff.view.TextNodeView(fen.txtfunc, style, java.awt.Color(0., 0., 0.), 250.)  normal_text = ff.view.TextNodeView(fen.txtfunc, style, java.awt.Color(0., 0., 0.), 250.)
119  normal_text_bg = ff.fenmm.WhiteNodeView(normal_text, java.awt.Color(.6, .6, .6))  normal_text_bg = ff.fenmm.WhiteNodeView(normal_text, java.awt.Color(.6, .6, .6))
120  normal = ff.swamp.CachedPureNodeFunction(100, fen.graph, normal_text_bg)  normalf = ff.swamp.CachedPureNodeFunction(100, fen.graph, normal_text_bg)
121    
122  # nodeview for accursed nodes  # nodeview for accursed nodes
123  accursed_text = ff.view.TextNodeView(fen.txtfunc, style, java.awt.Color.black, 250.)  accursed_text = ff.view.TextNodeView(fen.txtfunc, style, java.awt.Color.black, 250.)
124  accursed_text_bg = ff.fenmm.WhiteNodeView(accursed_text, java.awt.Color(.9, .9, .9))  accursed_text_bg = ff.fenmm.WhiteNodeView(accursed_text, java.awt.Color(.9, .9, .9))
125  accursed = ff.swamp.CachedPureNodeFunction(100, fen.graph, accursed_text_bg)  accursedf = ff.swamp.CachedPureNodeFunction(100, fen.graph, accursed_text_bg)
126  multiplexer = ff.swamp.MultiplexerNodeFunction(normal, accursed)  multiplexer = ff.swamp.MultiplexerNodeFunction(normalf, accursedf)
127    
128  structLink = ff.structure.StructLink.create(fen.graph)  structLink = ff.structure.StructLink.create(fen.graph)
129    
130    def i2l(iteratorToList):
131        """
132        Iterates the given iterator throughout and returns
133        its components as a new list.
134        """
135        list = []
136        while iteratorToList.hasNext():
137            list.append(iteratorToList.next())
138        return list
139    
140  class Context(ff.view.buoy.AbstractMainNode2D.Context):  class Context(ff.view.buoy.AbstractMainNode2D.Context):
141      def __init__(self, fen, w, components, multiplexer, style):      def __init__(self, fen, w, components, multiplexer, style):
142          self.fen = fen          self.fen = fen
# Line 175  class Context(ff.view.buoy.AbstractMainN Line 185  class Context(ff.view.buoy.AbstractMainN
185          l = len(self.alphContent.getText(self.fen.graph, accursed))          l = len(self.alphContent.getText(self.fen.graph, accursed))
186    
187          offset = self.c.getOffset()          offset = self.c.getOffset()
188          if offset == 0 and l == 0:          if offset == 0 and l == 0: self.rmNode(accursed)
189              try: self.components.remove(accursed)  
190              except ValueError: pass      def rmNode(self, obj):
191              self.fen.graph.rm_111(accursed, RDF.type, MINDSTRUCT.Data)          """
192              self.c.setAccursed(None)          Removes a node form the graph.
193    
194            If the removed node was accursed or centered (set as plane)
195            a new accursion or centerint (plane) will be set.
196            """
197    
198            # store some data from the removed node
199            wasLinked = structLink.isLinked(obj)
200            wasAccursed = (obj == self.c.getAccursed())
201                
202            # remove all connections from the node
203            # do it so that only the target nodes, not the node to be
204            # removed, will be put ont the floating buffer
205            neighbour = i2l(self.fen.graph.findN_X11_Iter(STRUCTLINK.linkedTo, obj))
206            neighbour.extend(i2l(self.fen.graph.findN_11X_Iter(obj, STRUCTLINK.linkedTo)))
207            for node in neighbour: self.rmLinkTo(node, obj)
208    
209            # if the removed node was on the floating buffer, remove it
210            try: self.components.remove(obj)
211            except ValueError: pass
212            
213            # remove node
214            self.fen.graph.rm_111(obj, RDF.type, MINDSTRUCT.Data)
215    
216            # at first, look a proper new accursed node or make none accursed
217            if obj == self.c.getAccursed():
218              for node in self.components:              for node in self.components:
219                  if structLink.isLinked(node): continue                  if structLink.isLinked(node) != wasLinked: continue
220                  else: self.c.setAccursed(node)                  else: self.c.setAccursed(node)
221              if dbg: p('Offset after deleteText:', self.getOffset(), l)          if obj == self.c.getAccursed(): self.c.setAccursed(None)
222            # then, if the removed node was centered (plane) center its biggest neighbour
223            if obj == self.main.getPlane():
224                neighbourSet = java.util.HashSet(java.util.Arrays.asList(neighbour))
225                comps, largest = Traversals.findComponents(neighbourSet.iterator(), STRUCTLINK.linkedTo,
226                                                           self.fen.graph, neighbourSet)
227                if largest:
228                    focus = self.main.getFocus()
229                    self.main.setNewPlane(largest, focus.getPanX(), focus.getPanY(), focus.getZoom())
230                    if wasAccursed: self.c.setAccursed(largest)
231                    try: self.components.remove(largest)
232                    except ValueError: pass
233            # if the removed node had no neighbours, center the biggest floating component
234            if obj == self.main.getPlane():
235                floatingSet = java.util.HashSet(java.util.Arrays.asList(self.components))
236                comps, largest = Traversals.findComponents(floatingSet.iterator(), STRUCTLINK.linkedTo,
237                                                           self.fen.graph, floatingSet)
238                if largest:
239                    focus = self.main.getFocus()
240                    self.main.setNewPlane(largest, focus.getPanX(), focus.getPanY(), focus.getZoom())
241                    if wasAccursed: self.c.setAccursed(largest)
242                    try: self.components.remove(largest)
243                    except ValueError: pass
244            # if the removed node was the last node in the graph, create a new Home and center it
245            if obj == self.main.getPlane():
246                node = ff.util.RDFUtil.N(fen.graph, MINDSTRUCT.Data)
247                focus = self.main.getFocus()
248                self.alphContent.setText(node, 'Home', 1)
249                self.main.setNewPlane(node, focus.getPanX(), focus.getPanY(), focus.getZoom())
250                if wasAccursed: self.c.setAccursed(node)
251    
252      def rmLinkTo(self, obj, with):      def rmLinkTo(self, obj, with):
253          totRemoved = 0          totRemoved = 0
254          iter = self.fen.graph.findN_11X_Iter(obj, STRUCTLINK.linkedTo)          links = i2l(self.fen.graph.findN_11X_Iter(obj, STRUCTLINK.linkedTo))
255          try:          try:
256              while (iter.hasNext()):              for l in links:
257                  if with == iter.next():                  if with == l:
258                      self.fen.graph.rm_111(obj, STRUCTLINK.linkedTo, with)                      self.fen.graph.rm_111(obj, STRUCTLINK.linkedTo, with)
259                      totRemoved += 1                      totRemoved += 1
260              iter = self.fen.graph.findN_11X_Iter(with, STRUCTLINK.linkedTo)              links = i2l(self.fen.graph.findN_11X_Iter(with, STRUCTLINK.linkedTo))
261              while (iter.hasNext()):              for l in links:
262                  if obj == iter.next():                  if obj == l:
263                      self.fen.graph.rm_111(with, STRUCTLINK.linkedTo, obj)                      self.fen.graph.rm_111(with, STRUCTLINK.linkedTo, obj)
264                      totRemoved += 1                      totRemoved += 1
265          except: pass          except: pass
# Line 269  class LMB(Action, vob.mouse.MouseClickLi Line 333  class LMB(Action, vob.mouse.MouseClickLi
333              if node == main.getPlane(): pass              if node == main.getPlane(): pass
334              elif self.context.rmLinkTo(node, main.getPlane()) == 0:              elif self.context.rmLinkTo(node, main.getPlane()) == 0:
335                  self.fen.graph.add(main.getPlane(), STRUCTLINK.linkedTo, node)                  self.fen.graph.add(main.getPlane(), STRUCTLINK.linkedTo, node)
336                  try: self.context.components.remove(node)                  try:
337                        self.context.components.remove(node)
338                        self.context.c.setAccursed(None)
339                  except ValueError: pass                  except ValueError: pass
340    
341  class ZoomPan(vob.input.RelativeAxisListener, Action, vob.mouse.MousePressListener):  class ZoomPan(vob.input.RelativeAxisListener, Action, vob.mouse.MousePressListener):
# Line 295  class PanMover(Action, vob.mouse.Relativ Line 361  class PanMover(Action, vob.mouse.Relativ
361  class MMScene:  class MMScene:
362      def __init__(self):      def __init__(self):
363          self.alphContent = ff.util.AlphContent(fen)          self.alphContent = ff.util.AlphContent(fen)
364          components = []          components, centered = self.compinit()
         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)  
365    
366          self.context = Context(fen, w, components, multiplexer, style)          self.context = Context(fen, w, components, multiplexer, style)
367    
# Line 371  class MMScene: Line 413  class MMScene:
413                  vob.input.BoundedFloatLinearAbsoluteAdapter(self.axes[i]))                  vob.input.BoundedFloatLinearAbsoluteAdapter(self.axes[i]))
414          except: pass # java.io.FileNotFoundException: pass          except: pass # java.io.FileNotFoundException: pass
415    
416        def compinit(self):
417            """Finds mindmap components; if none, creates one.
418            Returns tuple: the first element is a list of other components but
419                           the second element, which is the largest component"""
420            # find all nodes of mindmap node type
421            nodes1 = fen.graph.findN_X11_Iter(RDF.type, MINDSTRUCT.Data)
422            # find subjects of link property (objects are in same components)
423            nodes2 = fen.graph.findN_X1A_Iter(STRUCTLINK.linkedTo)
424            # search nodes of both finds for components
425            nodes = Traversals.concat(nodes1, nodes2)
426            comps, largest = Traversals.findComponents(nodes, STRUCTLINK.linkedTo, fen.graph)
427            components = []
428            if largest == None:
429                # No components, so create one for focus
430                largest = ff.util.RDFUtil.N(fen.graph, MINDSTRUCT.Data)
431                self.alphContent.setText(largest, 'Home', 1)
432            else:
433                # convert from java.util.Set to list
434                for component in comps.toArray():
435                    components.append(component)
436                components.remove(largest)
437            return components, largest
438    
439      def scene(self, vs):      def scene(self, vs):
440          if self.context.replaceVS:          if self.context.replaceVS:
441              VobScene = self.context.replaceVS              VobScene = self.context.replaceVS
# Line 505  class MMScene: Line 570  class MMScene:
570          elif key == "Ctrl-B":          elif key == "Ctrl-B":
571              """Buffer accursed node."""              """Buffer accursed node."""
572              self.context.components.append(self.context.c.getAccursed())              self.context.components.append(self.context.c.getAccursed())
573            elif key == "Ctrl-D":
574                """Delete accursed node."""
575                self.context.rmNode(self.context.c.getAccursed())
576          elif key == "Ctrl-0":          elif key == "Ctrl-0":
577              """Set calibrating state of custom controller on / off."""              """Set calibrating state of custom controller on / off."""
578              if self.calibrating and self.naxes:              if self.calibrating and self.naxes:

Legend:
Removed from v.1.48  
changed lines
  Added in v.1.49

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26