fenfire-commits
[Top][All Lists]
Advanced

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

[ff-cvs] fenfire/org/fenfire fenpdf/fenpdf.py fenpdf/fen...


From: Tuomas J. Lukka
Subject: [ff-cvs] fenfire/org/fenfire fenpdf/fenpdf.py fenpdf/fen...
Date: Thu, 23 Oct 2003 15:09:58 -0400

CVSROOT:        /cvsroot/fenfire
Module name:    fenfire
Branch:         
Changes by:     Tuomas J. Lukka <address@hidden>        03/10/23 15:09:58

Modified files:
        org/fenfire/fenpdf: fenpdf.py fenpdfcontext.py 
        org/fenfire/fenpdf/actions: menu.py mouse.py 
        org/fenfire/fenpdf/events: mousemenu.py 
        org/fenfire/structure: Ff.java ff.test 
        org/fenfire/util: AlphContent.java 
        org/fenfire/view: AreaSelectingView2D.java CanvasView2D.java 
        org/fenfire/view/buoy: AbstractMainNode2D.java 
Added files:
        org/fenfire/fenpdf/actions: eventgrabs.py 
        org/fenfire/functional: SuperLazyBase.java 
Removed files:
        org/fenfire/util: SuperLazyBase.java 

Log message:
        Arch sync

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenpdf/fenpdf.py.diff?tr1=1.16&tr2=1.17&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenpdf/fenpdfcontext.py.diff?tr1=1.35&tr2=1.36&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenpdf/actions/eventgrabs.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenpdf/actions/menu.py.diff?tr1=1.5&tr2=1.6&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenpdf/actions/mouse.py.diff?tr1=1.10&tr2=1.11&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/fenpdf/events/mousemenu.py.diff?tr1=1.12&tr2=1.13&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/functional/SuperLazyBase.java?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/structure/Ff.java.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/structure/ff.test.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/util/AlphContent.java.diff?tr1=1.16&tr2=1.17&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/view/AreaSelectingView2D.java.diff?tr1=1.14&tr2=1.15&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/view/CanvasView2D.java.diff?tr1=1.32&tr2=1.33&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/view/buoy/AbstractMainNode2D.java.diff?tr1=1.50&tr2=1.51&r1=text&r2=text

Patches:
Index: fenfire/org/fenfire/fenpdf/actions/menu.py
diff -u fenfire/org/fenfire/fenpdf/actions/menu.py:1.5 
fenfire/org/fenfire/fenpdf/actions/menu.py:1.6
--- fenfire/org/fenfire/fenpdf/actions/menu.py:1.5      Sat Oct 18 02:06:30 2003
+++ fenfire/org/fenfire/fenpdf/actions/menu.py  Thu Oct 23 15:09:56 2003
@@ -134,21 +134,3 @@
        self.fenPDF.structure.ff.setContent(node, obj)
                
 
-    def beginTextScissor(self):
-       """Begin to use scissor for text.
-       """
-       node = self.fenPDF.uistate.menu.originatingNode
-       if node == None: return
-       self.fenPDF.uistate.textScissor.setBegin(node, 
self.fenPDF.uistate.menu.originatingTextOffset)
-        if self.fenPDF.uistate.textScissor.end.node != node:
-            self.fenPDF.uistate.textScissor.setEnd(None, None)
-        p(self.fenPDF.uistate.textScissor.begin.node, 
self.fenPDF.uistate.textScissor.begin.offset)
-
-    def endTextScissor(self):
-       """End to use scissor for text.
-       """
-       node = self.fenPDF.uistate.menu.originatingNode
-       if node == None: return
-       self.fenPDF.uistate.textScissor.setEnd(node, 
self.fenPDF.uistate.menu.originatingTextOffset)
-        if self.fenPDF.uistate.textScissor.begin.node != node:
-            self.fenPDF.uistate.textScissor.setBegin(None, None)
Index: fenfire/org/fenfire/fenpdf/actions/mouse.py
diff -u fenfire/org/fenfire/fenpdf/actions/mouse.py:1.10 
fenfire/org/fenfire/fenpdf/actions/mouse.py:1.11
--- fenfire/org/fenfire/fenpdf/actions/mouse.py:1.10    Tue Oct 14 10:21:40 2003
+++ fenfire/org/fenfire/fenpdf/actions/mouse.py Thu Oct 23 15:09:56 2003
@@ -44,6 +44,65 @@
     def getOldVS():
        return fenPDF.animation.lastVs
 
+    def getOffset(node, x,y):
+        """ Get the text offset in screen coordinates if placeable
+        is textplaceable.
+        """
+        viewFunction = fenPDF.views.getMultiplexerNodeContentFunction()
+        placeable = viewFunction.f(fenPDF.fen.graph, node)
+        if isinstance(placeable, vob.lava.placeable.TextPlaceable):
+            cs = getMainNode().getNodeCS(getOldVS(), node)
+            ptsIn = jarray.array([x,y,0], 'f')
+            ptsOut = jarray.zeros(3, 'f')
+            getOldVS().coords.inverseTransformPoints3(cs, ptsIn, ptsOut)
+            offs = placeable.getCursorPos(ptsOut[0], ptsOut[1])
+            return offs
+
+    def getOffsetXYY(node, canvasCS, offset):
+        """ Get the x, y top and t bottom of textplaceable offset
+        in canvas coordinates.
+        """
+        viewFunction = fenPDF.views.getMultiplexerNodeContentFunction()
+        placeable = viewFunction.f(fenPDF.fen.graph, node)
+        retArray = []
+        if isinstance(placeable, vob.lava.placeable.TextPlaceable):
+            cs = getMainNode().getNodeCS(getOldVS(), node)
+            xyy = jarray.zeros(3, 'f')
+            placeable.getCursorXYY(offset, xyy)
+            ptsIn = jarray.array([xyy[0],xyy[1],0], 'f')
+            ptsOut = jarray.zeros(3, 'f')
+            getOldVS().coords.transformPoints3(cs, ptsIn, ptsOut)
+            getOldVS().coords.inverseTransformPoints3(canvasCS, ptsOut, ptsOut)
+            retArray.append(ptsOut[0])
+            retArray.append(ptsOut[1])
+
+            ptsIn = jarray.array([xyy[0],xyy[2],0], 'f')
+            getOldVS().coords.transformPoints3(cs, ptsIn, ptsOut)
+            getOldVS().coords.inverseTransformPoints3(canvasCS, ptsOut, ptsOut)
+            #retArray.append(ptsOut[0])
+            retArray.append(ptsOut[1])
+        return retArray
+        
+    def getTextWidthEdges(node, canvasCS):
+        """ Get left and rigth edges' coordinates of text placeable in
+        canvas coordinates.
+        """
+        viewFunction = fenPDF.views.getMultiplexerNodeContentFunction()
+        placeable = viewFunction.f(fenPDF.fen.graph, node)
+        retArray = []
+        if isinstance(placeable, vob.lava.placeable.TextPlaceable):
+            cs = getMainNode().getNodeCS(getOldVS(), node)
+            ptsOut = jarray.zeros(3, 'f')
+            ptsIn = jarray.array([0,0,0], 'f')
+            getOldVS().coords.transformPoints3(cs, ptsIn, ptsOut)
+            getOldVS().coords.inverseTransformPoints3(canvasCS, ptsOut, ptsOut)
+            retArray.append(ptsOut[0])
+
+            ptsIn = jarray.array([placeable.getWidth(),0,0], 'f')
+            getOldVS().coords.transformPoints3(cs, ptsIn, ptsOut)
+            getOldVS().coords.inverseTransformPoints3(canvasCS, ptsOut, ptsOut)
+            retArray.append(ptsOut[0])
+        return retArray
 
 # Inside the action, we have the following symbols usable:
 #  fenPDF - the main FenPDF object
@@ -176,39 +235,50 @@
            return self
        def set(self, node, x,y):
             self.evX, self.evY = x, y
-           s = context.states
-           self.node, self.pp, self.graph = node, s.ppActions, s.fen.graph
+           self.node = node
        def changedRelative(self, x,y):
            f = getMainNode().getFocus()
            fX, fY = f.getPanX(), f.getPanY()
 
             if self.node == None: raise 'No node!!!'
 
-           g = self.graph
+           g = fenPDF.fen.graph
            self.startPointX = ff.util.RDFUtil.getFloat(g, self.node, 
CANVAS2D.x)
            self.startPointY = ff.util.RDFUtil.getFloat(g, self.node, 
CANVAS2D.y)
             self.canvas =  fenPDF.structure.canvas2d.getCanvas(self.node)
 
-            fenPDF.events.eventHandler.eventGrabber = 
self.theUltimateEventGrabberUtilToMoveNodesWhereEver
+            grabber = ff.fenpdf.actions.eventgrabs.Grabber()
 
             # find out offset
             viewFunction = fenPDF.views.getMultiplexerNodeContentFunction()
             placeable = viewFunction.f(fenPDF.fen.graph, self.node)
             if isinstance(placeable, vob.lava.placeable.TextPlaceable):
-                p('text!')
                 cs = getMainNode().getNodeCS(getOldVS(), self.evX,self.evY)
-                p('cs', cs)
                 ptsIn = jarray.array([self.evX,self.evY,0], 'f')
                 ptsOut = jarray.zeros(3, 'f')
                 getOldVS().coords.inverseTransformPoints3(cs, ptsIn, ptsOut)
                 offs = placeable.getCursorPos(ptsOut[0], ptsOut[1])
-                p('offs', offs, ptsOut)
-                if fenPDF.uistate.textScissor.isScissored(self.node, offs):
-                    p('shoul scissor now...')
-                    p('implement the scissoring here ;)')
+                if fenPDF.uistate.textScissors.isScissored(self.node, offs):
+                    fenPDF.uistate.textScissors.fixOffset()
+                    node = ff.swamp.Nodes.N()
+                    enf = fenPDF.structure.ff \
+                          .deleteRegion(self.node,
+                                        
fenPDF.uistate.textScissors.begin.offset,
+                                        fenPDF.uistate.textScissors.end.offset)
+                    fenPDF.structure.ff.setContent(node, enf)
+                    grabber = ff.fenpdf.actions.eventgrabs.TextCloud(
+                        fenPDF, self.canvas, self.node,
+                        fenPDF.uistate.textScissors.begin.offset,
+                        node)
+                    fenPDF.uistate.textScissors.clear()
+                else:
+                    grabber = 
ff.fenpdf.actions.eventgrabs.NodeMoverActionGrabber(
+                        fenPDF, self.startPointX, self.startPointY, self.node, 
self.canvas)
+            else:
+                grabber = ff.fenpdf.actions.eventgrabs.NodeMoverActionGrabber(
+                    fenPDF, self.startPointX, self.startPointY, self.node, 
self.canvas)
+            fenPDF.events.eventHandler.eventGrabber = grabber.getEventGrabber()
                     
-            fenPDF.structure.canvas2d.removeNode(self.node)
-            self.nodeCS = None
            fenPDF.animation.noAnimation()
             fenPDF.animation.regenerateVS()
 
@@ -230,32 +300,7 @@
                 vob.AbstractUpdateManager.chg()
                 return
 
-            if ev.getType() == ev.MOUSE_DRAGGED:
-                if dbg: p('drag')
-                oldVS.coords.setTranslateParams(self.transCS, ev.getX(), 
ev.getY())
-            else:
-                buoymanager = fenPDF.views.getBuoyManager()
-                mainNode = buoymanager.findTopmostMainNode(oldVS, ev.getX(), 
ev.getY())
-                if mainNode == None or not 
fenPDF.structure.canvas2d.isCanvas(mainNode.getPlane()):
-                    fenPDF.structure.canvas2d.placeOnCanvas(self.canvas, 
self.node, self.startPointX, self.startPointY)
-                else:
-                    xy = mainNode.getXYHit(getOldVS(), ev.getX(), ev.getY())
-                    
fenPDF.structure.canvas2d.placeOnCanvas(mainNode.getPlane(), self.node, xy[0], 
xy[1])
-                # temporarily solution, flush drags away...
-                fenPDF.events.mouse.mainMouse.flush()
-                fenPDF.events.eventHandler.eventGrabber = None
-                fenPDF.animation.regenerateVS()
-            vob.AbstractUpdateManager.chg()
-
-        def createFlyingNode(self,oldVS):
-            self.transCS = oldVS.translateCS(0,'NODE_CS', self.evX,self.evY)
-            viewFunction = fenPDF.views.getMultiplexerNodeContentFunction()
-            placeable = viewFunction.f(fenPDF.fen.graph, self.node)
-            self.nodeCS = oldVS.orthoBoxCS(self.transCS,
-                                           self.node, -1000,0,0, 1,1,
-                                           placeable.getWidth(),
-                                           placeable.getHeight())
-            placeable.place(oldVS, self.nodeCS)
+ 
 
 
 
@@ -264,17 +309,40 @@
     class SelectArea(vob.mouse.MouseDragListener,
                     vob.mouse.MousePressListener):
        def pressed(self, x,y):
-           """ dumb bersion of listener """
+           """ dumb version of listener """
            return self
        def startDrag(self, x,y):
            self.oldxy = getMainNode().getXYHit(getOldVS(), x, y)
-           p('old', self.oldxy)
+           self.node = getMainNode().getNodeOnPlane(getOldVS(), x,y)
+            offs = getOffset(self.node, x,y)
+            if dbg: p('old', self.oldxy, self.node, offs)
+            fenPDF.uistate.textScissors.setBegin(self.node, offs)
        def drag(self, x, y):
+            if self.node != None:
+                offs = getOffset(self.node, x,y)
+                fenPDF.uistate.textScissors.setEnd(self.node, offs)
+                canvasCS = ff.view.CanvasView2D.getContainerCS(getOldVS(),
+                                                               
getMainNode().getBox2Screen())
+                canvasCS = 
getOldVS().matcher.getCS(getMainNode().getBox2Screen(), 
'AreaSelectingView_concat')
+                if dbg: p(getOffsetXYY(self.node, canvasCS, offs))
+
            v = ff.util.lava.view.getView(getMainNode(), 
ff.view.AreaSelectingView2D)
            v.setCurrentPlane(getMainNode().getPlane())
            xy = getMainNode().getXYHit(getOldVS(), x,y)
-           v.setArea(self.oldxy[0], self.oldxy[1], xy[0], xy[1])
-
+            if not fenPDF.uistate.textScissors.isScissored(self.node):
+                v.setArea(self.oldxy[0], self.oldxy[1], xy[0], xy[1])
+            else:
+                if dbg: p('begin',fenPDF.uistate.textScissors.begin.offset,
+                          'end', fenPDF.uistate.textScissors.end.offset)
+                begin = getOffsetXYY(self.node, canvasCS,
+                                     fenPDF.uistate.textScissors.begin.offset)
+                end = getOffsetXYY(self.node, canvasCS,
+                                   fenPDF.uistate.textScissors.end.offset)
+                edge = getTextWidthEdges(self.node, canvasCS)
+                v.setTextArea(begin[0], begin[1], begin[2],
+                              end[0], end[1], end[2],
+                              edge[0], edge[1])
+            
            context.states.selection.setArea(
                    (self.oldxy[0], self.oldxy[1], xy[0], xy[1]),
                    getMainNode())
Index: fenfire/org/fenfire/fenpdf/events/mousemenu.py
diff -u fenfire/org/fenfire/fenpdf/events/mousemenu.py:1.12 
fenfire/org/fenfire/fenpdf/events/mousemenu.py:1.13
--- fenfire/org/fenfire/fenpdf/events/mousemenu.py:1.12 Sat Oct 18 02:06:30 2003
+++ fenfire/org/fenfire/fenpdf/events/mousemenu.py      Thu Oct 23 15:09:57 2003
@@ -45,11 +45,6 @@
        if self.states.selection.hasSelection():
            list.append(Item('Transclude selection (PDF to canvas only)',
                    lambda: self.fenPDF.actions.menu.transclude()))
-        if self.fenPDF.uistate.menu.hasTextOffset():
-            list.append(Item('Begin text scissor', 
-                   lambda: self.fenPDF.actions.menu.beginTextScissor()))
-            list.append(Item('End text scissor', 
-                   lambda: self.fenPDF.actions.menu.endTextScissor()))
         if self.fenPDF.uistate.menu.originatingNode:
             list.append(Item('<-----  Link node to left', 
                    lambda: self.fenPDF.actions.menu.structLinkNodes(-1)))
Index: fenfire/org/fenfire/fenpdf/fenpdf.py
diff -u fenfire/org/fenfire/fenpdf/fenpdf.py:1.16 
fenfire/org/fenfire/fenpdf/fenpdf.py:1.17
--- fenfire/org/fenfire/fenpdf/fenpdf.py:1.16   Sat Oct 18 02:06:29 2003
+++ fenfire/org/fenfire/fenpdf/fenpdf.py        Thu Oct 23 15:09:56 2003
@@ -25,6 +25,9 @@
 from org import fenfire as ff
 import vob
 
+def p(*s):
+    print 'fenpdf.py::',s
+
 class _Empty:
     pass
 
@@ -120,9 +123,9 @@
        self.__init__()
 
 
-class UIState_Scissor:
+class UIState_Scissors:
     """ XXX
-    States for text scissor
+    States for text scissors
         begin
             node
             offset
@@ -134,28 +137,39 @@
     Write only trough methods setBegin and setEnd.
     """
 
-    class ScissorPoint:
+    class ScissorsPoint:
         def __init__(self):
             self.node = None
             self.offset = None
 
     def __init__(self):
-        self.begin = self.ScissorPoint()
-        self.end = self.ScissorPoint()
+        self.begin = self.ScissorsPoint()
+        self.end = self.ScissorsPoint()
+    def clear(self): self.__init__()
     def setBegin(self, node, offset):
         self.begin.node = node
         self.begin.offset = offset
     def setEnd(self, node, offset):
         self.end.node = node
         self.end.offset = offset
-    def isScissored(self, node, offset):
+    def isScissored(self, node, offset=None):
         if node == None: return 0
         if self.begin.node == node and \
-           self.end.node == node and \
-           self.begin.offset <= offset and \
-           self.end.offset >= offset:
-            return 1
+           self.end.node == node:
+            if offset != None:
+                if self.begin.offset <= offset and \
+                       self.end.offset >= offset or \
+                       self.begin.offset >= offset and \
+                       self.end.offset <= offset:
+                    return 1
+            elif offset == None: return 1
         return 0
+    def fixOffset(self):
+        if self.begin.node != None and self.begin.node == self.end.node:
+            if self.begin.offset > self.end.offset:
+                tmp = self.begin.offset
+                self.begin.offset = self.end.offset
+                self.end.offset = tmp
 
 class FenPDF:
     """This class represents a complete fenpdf "application".
@@ -223,7 +237,7 @@
        self.animation = AnimationState()
        self.uistate = _Empty()
        self.uistate.menu = UIState_Menu()
-       self.uistate.textScissor = UIState_Scissor()
+       self.uistate.textScissors = UIState_Scissors()
 
 
        self.structure.ff = structure_ff
Index: fenfire/org/fenfire/fenpdf/fenpdfcontext.py
diff -u fenfire/org/fenfire/fenpdf/fenpdfcontext.py:1.35 
fenfire/org/fenfire/fenpdf/fenpdfcontext.py:1.36
--- fenfire/org/fenfire/fenpdf/fenpdfcontext.py:1.35    Sat Oct 18 02:06:29 2003
+++ fenfire/org/fenfire/fenpdf/fenpdfcontext.py Thu Oct 23 15:09:56 2003
@@ -132,8 +132,8 @@
         height = 23
 
 
-        # draw scissor points
-        node = self.states.fenPDF.uistate.textScissor.begin.node
+        # draw scissors points
+        node = self.states.fenPDF.uistate.textScissors.begin.node
         if node != None:
             containerCS = canvas.getContainerCS(vs, into)
             cs = vs.matcher.getCS(containerCS, node)
@@ -141,14 +141,14 @@
 
             viewFunction = 
self.states.fenPDF.views.getMultiplexerNodeContentFunction()
             placeable = viewFunction.f(self.states.fen.graph, node)
-            p('offset:',self.states.fenPDF.uistate.textScissor.begin.offset)
+            p('offset:',self.states.fenPDF.uistate.textScissors.begin.offset)
             if isinstance(placeable, vob.lava.placeable.TextPlaceable):
-                
placeable.getCursorXYY(self.states.fenPDF.uistate.textScissor.begin.offset, xy)
+                
placeable.getCursorXYY(self.states.fenPDF.uistate.textScissors.begin.offset, xy)
 
-                cs = vs.coords.ortho(cs, 0,xy[0],xy[2], height, -height)
+                cs = vs.coords.ortho(cs, 0,xy[0],xy[1], height, xy[1]-xy[2])
                 vs.put(vob.vobs.ContinuousLineVob(5, [.3,-.3,0 , 0,0,0 , 0,1,0 
, .3,1.3,0], 0, 100, java.awt.Color.blue), cs)
 
-        node = self.states.fenPDF.uistate.textScissor.end.node
+        node = self.states.fenPDF.uistate.textScissors.end.node
         if node != None:
             containerCS = canvas.getContainerCS(vs, into)
             cs = vs.matcher.getCS(containerCS, node)
@@ -157,9 +157,9 @@
             viewFunction = 
self.states.fenPDF.views.getMultiplexerNodeContentFunction()
             placeable = viewFunction.f(self.states.fen.graph, node)
             if isinstance(placeable, vob.lava.placeable.TextPlaceable):
-                
placeable.getCursorXYY(self.states.fenPDF.uistate.textScissor.end.offset, xy)
+                
placeable.getCursorXYY(self.states.fenPDF.uistate.textScissors.end.offset, xy)
 
-                cs = vs.coords.ortho(cs, 0,xy[0],xy[2], height, -height)
+                cs = vs.coords.ortho(cs, 0,xy[0],xy[1], height, xy[1]-xy[2])
                 vs.put(vob.vobs.ContinuousLineVob(5, [-.3,-.3,0 , 0,0,0 , 
0,1,0 , -.3,1.3,0], 0, 100, java.awt.Color.blue), cs)
 
 
Index: fenfire/org/fenfire/structure/Ff.java
diff -u fenfire/org/fenfire/structure/Ff.java:1.2 
fenfire/org/fenfire/structure/Ff.java:1.3
--- fenfire/org/fenfire/structure/Ff.java:1.2   Sat Oct 18 02:06:31 2003
+++ fenfire/org/fenfire/structure/Ff.java       Thu Oct 23 15:09:57 2003
@@ -104,6 +104,42 @@
        return trIndex;
     }
 
+
+    /** Insert an enfilade at the given index of node's current enfilade.
+     * @param node The node into whose enfilade to insert the given enfilade
+     * @param index index in node's enfilade.
+     * @param insertEnf The enfilade to insert.
+     */
+    public void insert(Object node, int index, Enfilade1D insertEnf) {
+       Enfilade1D old = getContent(node);
+       Enfilade1D enf = old.sub(0, index);
+       enf = enf.plus(insertEnf);
+       enf = enf.plus(old.sub(index));
+       setContent(node, enf);
+    }
+
+    /** Delete a region of a node's content enfilade and return 
+     * the deleted region. Throws an error if begin index is 
+     * bigger than end index.
+     * @param begin The beginning index of the region to be deleted.
+     * @param end The index after the region to be deleted.
+     * @return The deleted region of enfilade.
+     */
+    public Enfilade1D deleteRegion(Object node, int begin, int end) {
+       if (begin > end) throw new 
+           Error("begin index '"+begin+"' bigger than end index '"+end+"'.");
+       Enfilade1D old = (Enfilade1D)getContent(node);
+       Enfilade1D enf = old.sub(0, begin);
+       enf = enf.plus(old.sub(end));
+
+       setContent(node, enf);
+       
+       // return the "deleted" enfilade.
+       return old.sub(begin,end);
+    }
+
+
+
     public void setContent(Object node, Enfilade1D enf) {
        Literal lit = literalFromEnfilade(enf);
        graph.set1_11X(node, FF.content, lit);
Index: fenfire/org/fenfire/structure/ff.test
diff -u fenfire/org/fenfire/structure/ff.test:1.2 
fenfire/org/fenfire/structure/ff.test:1.3
--- fenfire/org/fenfire/structure/ff.test:1.2   Fri Sep 12 04:38:20 2003
+++ fenfire/org/fenfire/structure/ff.test       Thu Oct 23 15:09:57 2003
@@ -1,3 +1,4 @@
+# -*-python-*-
 # 
 # Copyright (c) 2003, Tuomas J. Lukka
 # This file is part of Fenfire.
@@ -26,7 +27,8 @@
 import java
 
 def setUp():
-    global graph, ffinstance, spanMaker, enfiladeMaker, enf1, enf2, node1, 
node2
+    global graph, ffinstance, spanMaker, \
+       enfiladeMaker, enf1, enf2, node1, node2, sp1, sp3
 
     graph = ff.swamp.impl.HashGraph()
 
@@ -63,3 +65,70 @@
 #    snc.set(node1, enf1)
 #    fen.model.getWriter("RDF/XML-ABBREV").write(fen.model,
 #      java.io.OutputStreamWriter(java.lang.System.out), None)
+
+def testInsert():
+    """ Test all enfilade insert cases.
+    """
+    # insert at index 0
+    ffinstance.setContent(node1, enf1)
+    ffinstance.insert(node1, 0, enf2)
+    assert ffinstance.getContent(node1) == \
+           enf2.plus(enf1)
+
+    # insert at index length
+    ffinstance.setContent(node1, enf1)
+    len = enf1.length()
+    ffinstance.insert(node1, len, enf2)
+    assert ffinstance.getContent(node1) == \
+           enf1.plus(enf2)
+
+    # insert at index length +1
+    ffinstance.setContent(node1, enf1)
+    len = enf1.length() + 1
+    test = 0
+    try:
+        ffinstance.insert(node1, len, enf2)
+    except:
+        test = 1
+    assert test == 1
+    assert ffinstance.getContent(node1) == enf1
+
+    # insert at index -1
+    ffinstance.setContent(node1, enf1)
+    test = 0
+    try:
+        ffinstance.insert(node1, -1, enf2)
+    except:
+        test = 1
+    assert test == 1
+    assert ffinstance.getContent(node1) == enf1
+
+
+def testDeleteRegion():
+    """ Test region deleting of enfilade
+    """
+    ffinstance.setContent(node1, enf1)
+
+    # begin > end
+    test = 0
+    try:
+        ffinstance.deleteRegion(node1, 2,1)
+    except:
+        test = 1
+    assert test == 1
+
+    # delete from beginning
+    ffinstance.setContent(node1, enf1)
+    len = enf1.length()
+    enf = ffinstance.deleteRegion(node1, 0, len)
+    assert enf == enf1
+    enf = ffinstance.getContent(node1)
+    assert enf.length() == 0
+    
+    # delete "Foo"
+    ffinstance.setContent(node1, enf1)
+    enf = ffinstance.deleteRegion(node1, 0, 3)
+    assert enf == enfiladeMaker.makeEnfilade(sp1)
+    assert ffinstance.getContent(node1) == \
+           enfiladeMaker.makeEnfilade(sp3)
+    
Index: fenfire/org/fenfire/util/AlphContent.java
diff -u fenfire/org/fenfire/util/AlphContent.java:1.16 
fenfire/org/fenfire/util/AlphContent.java:1.17
--- fenfire/org/fenfire/util/AlphContent.java:1.16      Wed Sep 10 09:28:24 2003
+++ fenfire/org/fenfire/util/AlphContent.java   Thu Oct 23 15:09:57 2003
@@ -37,7 +37,7 @@
  */
 public class AlphContent {
     public static boolean dbg = false;
-    private static void pa(String s) { System.out.println("AlphContent:: "+s); 
}
+    private static void p(String s) { System.out.println("AlphContent:: "+s); }
 
 
     private Fen fen;
@@ -71,6 +71,7 @@
     }
 
     public void deleteText(Object node, int begin, int end) {
+       if (dbg) p("begin: "+begin+", end: "+end);
        Enfilade1D old = (Enfilade1D)ff.getContent(node);
        Enfilade1D enf = old.sub(0, begin);
        enf = enf.plus(old.sub(end));
Index: fenfire/org/fenfire/view/AreaSelectingView2D.java
diff -u fenfire/org/fenfire/view/AreaSelectingView2D.java:1.14 
fenfire/org/fenfire/view/AreaSelectingView2D.java:1.15
--- fenfire/org/fenfire/view/AreaSelectingView2D.java:1.14      Sun Aug 17 
15:55:02 2003
+++ fenfire/org/fenfire/view/AreaSelectingView2D.java   Thu Oct 23 15:09:57 2003
@@ -37,15 +37,148 @@
     public static boolean dbg = false;
     private static void p(String s) { 
System.out.println("AreaSelectingView2D:: "+s); }
 
-    public View2D getChildView2D() { return child; }
-    protected View2D child;
+    
+    private RectSelectionPainter rect = new RectSelectionPainter();
+    private TextSelectionPainter text = new TextSelectionPainter();
+    private SelectionPainter currentPainter = rect;
+
+    private interface SelectionPainter extends org.fenfire.view.lava.FastView {
+       void render(VobScene vs, int into);
+       void clear();
+    }
+
+    private class TextSelectionPainter implements SelectionPainter {
+       /* asfadasdfsadXXXXXXXXXX   <-begin
+        * XXXXXXXXXXXXXXXXXXXXXX   <-other
+        * XXXXasdfadsfasdfasdfsd   <-end
+        *                         where X is selection
+        */
+
+       static private final String SELECT_BEGIN = 
"AreaSelectingView_selection_end";
+       static private final String SELECT_OTHER = 
"AreaSelectingView_selection";
+       static private final String SELECT_END = 
"AreaSelectingView_selection_begin";
+
+       public void render(VobScene vs, int into) {
+           for (int i=0; i<pts.length; i++)
+               renderImpl(vs, into, i);
+       }
+       private int renderImpl(VobScene vs, int into, int index) {
+           int cs = -1;
+           switch(index) {
+           case 0: cs = vs.orthoCS(into, SELECT_BEGIN, 0, 1,2,3,4); break;
+           case 1: cs = vs.orthoCS(into, SELECT_OTHER, 0, 1,2,3,4); break; 
+           case 2: cs = vs.orthoCS(into, SELECT_END, 0, 1,2,3,4); break;
+           default:
+               throw new Error("Impossible index!");
+           }
+           vs.put(pq, cs);
+           return cs;
+       }
+
+       public void chgFast(VobScene oldVS, int concatCs) {
+           int [] cs = new int[3];
+           cs[0] = oldVS.matcher.getCS(concatCs, SELECT_BEGIN);
+           cs[1] = oldVS.matcher.getCS(concatCs, SELECT_OTHER);
+           cs[2] = oldVS.matcher.getCS(concatCs, SELECT_END);
+           
+           for (int i=0; i<cs.length; i++)
+               if (cs[i] < 1) {
+                   if (dbg) p("index: "+i+", "+cs[i]+" is not possible!");
+                   cs[i] = renderImpl(oldVS, concatCs, i);
+               }
+           
+           for(int i=0; i<pts.length; i++)
+               oldVS.coords.setOrthoParams(cs[i], 0,  pts[i][0], pts[i][1], 
pts[i][2]-pts[i][0], pts[i][3]-pts[i][1]);
+       }
+       
+       public void clear() {
+           for(int i=0; i<pts.length; i++)
+               for (int j=0; j<pts[i].length; j++) pts[i][j] = 0;
+       }
+
+       void set(float bx, float byTop, float byBot,
+                float ex, float eyTop, float eyBot,
+                float edgeL, float edgeR) 
+       {
+           clear();
+           if (dbg) {
+               p("begin: "+bx+", "+byTop+", "+byBot);
+               p("end:   "+ex+", "+eyTop+", "+eyBot);
+               p("edges: "+edgeL+", "+edgeR);
+           }
+           // keep up the good work
+           // we have at least two lines here..
+           if (byBot <= eyTop) {
+               if (dbg) p("at least two lines");
+               setArea(0,bx, byTop, edgeR, byBot);
+               setArea(1,edgeL,byBot,edgeR,eyTop);
+               setArea(2,edgeL, eyTop, ex, eyBot);
+           }
+           else if (eyBot <= byTop) {
+               setArea(0,ex, eyTop, edgeR, eyBot);
+               setArea(1,edgeL,eyBot,edgeR,byTop);
+               setArea(2,edgeL, byTop, bx, byBot);
+           }
+           // one line only
+           else {
+               if (dbg) p("one line");
+               setArea(0, bx,byTop, ex,eyBot);
+           }
+       }
+
+       private float[][] pts = new float[3][4];
+       private void setArea(int index, float x0, float y0, float x1, float y1) 
{
+           pts[index][0] = x0; pts[index][1] = y0;
+           pts[index][2] = x1; pts[index][3] = y1;
+       }
+    }
+
+    private class RectSelectionPainter implements SelectionPainter {
+       static private final String SELECT = "AreaSelectingView_selection";
+
+       public void render(VobScene vs, int into) {
+           int cs = vs.orthoCS(into, SELECT, 0, 1,2,3,4);
+           vs.put(pq, cs);
+       }
+
+       public void clear() {
+           setArea(0,0,0,0);
+       }
+
+       public void chgFast(VobScene oldVS, int concatCs) {
+           int cs = oldVS.matcher.getCS(concatCs, SELECT);
+           if (cs < 1) throw new Error(cs+" is not possible!");
+           oldVS.coords.setOrthoParams(cs, 0,  x0, y0, x1-x0, y1-y0);
+       }
+
+       private float x0,y0,x1,y1;
+       void setArea(float x0, float y0, float x1, float y1) {
+           this.x0 = x0; this.y0 = y0;
+           this.x1 = x1; this.y1 = y1;
+       }
+    }
+
+
+
 
-    private float x0,y0,x1,y1;
+
+
+
+    /** Set text area.
+     * b prefix is begin, e prefix is end.
+     */
+    public void setTextArea(float bx, float byTop, float byBot,
+                           float ex, float eyTop, float eyBot,
+                           float edgeL, float edgeR) {
+       currentPainter = text;
+       text.set(bx,byTop, byBot, ex,eyTop,eyBot,edgeL, edgeR);
+    }
     public void setArea(float x0, float y0, float x1, float y1) {
-        this.x0 = x0; this.y0 = y0;
-        this.x1 = x1; this.y1 = y1;
+       currentPainter = rect;
+       rect.setArea(x0,y0,x1,y1);
     }
 
+
     private Object current = null;
     public void setCurrentPlane(Object obj) { current = obj; }
 
@@ -57,18 +190,12 @@
     }
     public AreaSelectingView2D(View2D child, java.awt.Color color) {
         this.child = child;
-        setArea(0,0,0,0);
-
         paper = SpecialPapers.selectionPaper(color);
         pq = GLRen.createFixedPaperQuad(paper, 0, 0, 1, 1, 0, 10, 10, 10);
     }
 
-    private final String CONCAT = "AreaSelectingView_concat";
-    private final String SELECT = "AreaSelectingView_selection";
 
-    public Object getSelectedObject(Object plane, float x, float y, float w, 
float h) {
-       return child.getSelectedObject(plane, x, y, w, h);
-    }
+    static private final String CONCAT = "AreaSelectingView_concat";
 
     public void render(VobScene vs, Object plane,
                        int matchingParent,
@@ -82,11 +209,10 @@
        int paper2box = vs.invertCS(box2paper, "areaselectview_INv");
        int paper2screen = vs.concatCS(box2screen, CONCAT,
                                    paper2box);
-       int cs = vs.orthoCS(paper2screen, SELECT, 0, 1,2,3,4);
 
-       if (current != plane) setArea(0,0,0,0);
+       currentPainter.render(vs, paper2screen);
+       if (current != plane) currentPainter.clear();
        chgFast(vs, box2screen);
-        vs.put(pq, cs);
     }
 
     public void chgFast(VobScene oldVS, int parent) {
@@ -95,13 +221,16 @@
 
         if (dbg) p("parent cs: "+parent);
        int concatCs = oldVS.matcher.getCS(parent, CONCAT);
-       int cs = oldVS.matcher.getCS(concatCs, SELECT);
-       if (dbg) p("cs: "+cs);
-
-       if (cs < 1) throw new Error(cs+" is not possible!");
+       if (dbg) p("conc: "+concatCs);
+       currentPainter.chgFast(oldVS, concatCs);
+    }
 
-        oldVS.coords.setOrthoParams(cs, 0,  x0,y0,x1-x0,y1-y0);
+    public Object getSelectedObject(Object plane, float x, float y, float w, 
float h) {
+       return child.getSelectedObject(plane, x, y, w, h);
     }
+
+    public View2D getChildView2D() { return child; }
+    protected View2D child;
 
     public void getSize(Object plane, float[] wh) {
        if(child != null)
Index: fenfire/org/fenfire/view/CanvasView2D.java
diff -u fenfire/org/fenfire/view/CanvasView2D.java:1.32 
fenfire/org/fenfire/view/CanvasView2D.java:1.33
--- fenfire/org/fenfire/view/CanvasView2D.java:1.32     Tue Oct 14 10:21:41 2003
+++ fenfire/org/fenfire/view/CanvasView2D.java  Thu Oct 23 15:09:57 2003
@@ -204,6 +204,19 @@
        return oldvs.getCSAt(box2screen, x, y, xyout);
     }
 
+    public int getNodeCS(VobScene oldVS, 
+                        Object node, 
+                        Object plane, int matchingParent, 
+                        int box2screen, int box2plane,
+                        float[] xyout) {
+       int containerCS = getContainerCS(oldVS, box2screen);
+       int cs = oldVS.matcher.getCS(containerCS, node);
+       if (cs < 1) throw new Error(cs+" is not possible!");
+       return cs;
+    }
+
+
+
     static public boolean hasCanvas(ConstGraph g, Object node) {
        return g.find1_X11(CANVAS2D.contains, node) != null;
     }
Index: fenfire/org/fenfire/view/buoy/AbstractMainNode2D.java
diff -u fenfire/org/fenfire/view/buoy/AbstractMainNode2D.java:1.50 
fenfire/org/fenfire/view/buoy/AbstractMainNode2D.java:1.51
--- fenfire/org/fenfire/view/buoy/AbstractMainNode2D.java:1.50  Tue Oct 14 
10:21:41 2003
+++ fenfire/org/fenfire/view/buoy/AbstractMainNode2D.java       Thu Oct 23 
15:09:58 2003
@@ -53,7 +53,8 @@
     }
        
 
-    /** The mouse controller associated with this main node. */
+    /** The mouse controller associated with this main node. 
+     */
     protected MouseMultiplexer mouseController;
 
     /** An object representing a focus on a 2D plane.
@@ -103,6 +104,7 @@
     }
 
 
+    public int getBox2Screen() { return box2screen; }
     /** The box2screen coordinate system we set last.
      */
     protected int box2screen = -1;
@@ -252,7 +254,32 @@
        }
     }
 
+    public int getNodeCS(VobScene oldVobScene, Object node) {
+
+       // XXX refactor me!
+
+       View2D view = getView2D();
+       while (view.getChildView2D() != null) 
+           view = view.getChildView2D();
+           
+       // XXX should this be in View2D?
+       if (view instanceof CanvasView2D) {
+               
+           int cs = ((CanvasView2D)view)
+               .getNodeCS(oldVobScene, node,
+                        plane, box2screen, box2screen,
+                        box2paper, null);
+
+           if(dbg) p("CS is: "+cs);
+           return cs;
+       } 
+       return -1;
+    }
+
     public int getNodeCS(VobScene oldVobScene, float x, float y) {
+
+       // XXX refactor me!
+
        View2D view = getView2D();
        while (view.getChildView2D() != null) 
            view = view.getChildView2D();
@@ -272,6 +299,9 @@
     }
 
     public Object getNodeOnPlane(VobScene oldVobScene, float x, float y) {
+
+       // XXX refactor me!
+
        int cs = getNodeCS(oldVobScene, x, y);
        if(cs <= 1) return null;
        Object obj = oldVobScene.matcher.getKey(cs);




reply via email to

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