[prev in list] [next in list] [prev in thread] [next in thread] 

List:       koffice-devel
Subject:    Re: kword frameUnderMouse bug ?
From:       Frank Dekervel <Frank.dekervel () student ! kuleuven ! ac ! Be>
Date:       2002-02-28 14:39:39
[Download RAW message or body]

Op woensdag 27 februari 2002 16:17, schreef Thomas Zander:
> Please give it a try.

hi,

This should be better then.

* kwdoc contains logic for going deeper than the currently selected frame if 
wanted.

* kwcanvas uses this to do:
- control = select multiple frames & go deeper if needed
- control+shift = select only one frame.
the behaviour is fine for me, but i guess there might be some subtle errors. 

please have a look at it.

greetings,
Frank

["kwcanvas.diff" (text/x-diff)]

Index: kwcanvas.cc
===================================================================
RCS file: /home/kde/koffice/kword/kwcanvas.cc,v
retrieving revision 1.322
diff -u -2 -d -p -b -r1.322 kwcanvas.cc
--- kwcanvas.cc	2002/02/23 15:52:42	1.322
+++ kwcanvas.cc	2002/02/28 14:06:22
@@ -323,7 +323,15 @@ void KWCanvas::mpEditFrame( QMouseEvent 
         {
             if ( ! ( e->state() & ShiftButton || e->state() & ControlButton ) )
-                selectAllFrames( FALSE );
-            selectFrame( frame, TRUE );
+                selectAllFrames( FALSE ); // if we don't hold shift or control, \
destroy old frame selection +            KWFrame *f = m_doc->frameUnderMouse(nPoint, \
0L, true); +	    if (f == frame) {
+	    	if (e->state() & ShiftButton)
+			selectAllFrames( FALSE ); // shift deselects everything.
+            	selectFrame( frame, TRUE ); // select the frame.
         }
+	    else
+	    	m_ctrlClickOnSelectedFrame = true;
+
+        }
         else if(frame)  // clicked on a frame that was already selected
         {
@@ -1105,11 +1113,14 @@ void KWCanvas::mrEditFrame( QMouseEvent 
     {
         // No frame was moved or resized.
-        // If CTRL+click on selected frame, unselect it
         if ( e->state() & ControlButton )
         {
             KWFrame * frame = m_doc->frameUnderMouse( nPoint );
-            if ( m_ctrlClickOnSelectedFrame && frame->isSelected() )
+            if ( m_ctrlClickOnSelectedFrame /* && frame->isSelected() */ ) // \
kervel: why the && ?  {
-                selectFrame( frame, false );
+	    	KWFrame *f = m_doc->frameUnderMouse( nPoint,0L,true );
+		if (e->state() & ShiftButton)
+                	selectAllFrames( false );
+		if (f)
+			selectFrame(f,true);
                 emit frameSelectedChanged();
             }


["kwdoc.diff" (text/x-diff)]

Index: kwdoc.cc
===================================================================
RCS file: /home/kde/koffice/kword/kwdoc.cc,v
retrieving revision 1.330
diff -u -2 -d -p -b -r1.330 kwdoc.cc
--- kwdoc.cc	2002/02/22 23:30:31	1.330
+++ kwdoc.cc	2002/02/28 04:15:43
@@ -2366,13 +2366,109 @@ KWFrameSet * KWDocument::frameSetByName(
 }
 
-KWFrame * KWDocument::frameUnderMouse( const QPoint& nPoint, bool* border )
+KWFrame * KWDocument::deepestInlineFrame(KWFrame *parent, const QPoint& nPoint, bool \
*border) { +	KWFrameSet *fs=parent->frameSet();
+	KoPoint docPoint( unzoomPoint( nPoint ) );
+	QPtrListIterator<KWFrameSet> fit = framesetsIterator();
+
+	for (fit.toLast(); fit.current(); --fit) // z-order
+	{
+		KWFrameSet *frameSet = fit.current();
+		if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
+		            continue;
+		if (!frameSet->isFloating())
+			continue;
+		if (fs != frameSet->anchorFrameset())
+			continue;
+		// frameset is a child of parent. now find out if its under the mouse.
+		KWFrame *frsFrame = frameSet->frameByBorder(nPoint);
+		// yup it is. its even the border. stop looking for childs.
+		if (frsFrame) {
+			if (border) *border=true;
+			return frsFrame;
+		}
+		frsFrame = frameSet->frameAtPos(docPoint.x(),docPoint.y());
+		// yup it is. look for childs
+		if (frsFrame) {
+			 return deepestInlineFrame(frsFrame,nPoint,border);
+		}
+	}
+	if (*border) border=false;
+	return parent;
+}
+
+KWFrame * KWDocument::frameBelowFrame(const QPoint& nPoint, KWFrame *frame, bool \
*border) { +
+	KWFrameSet *fs = frame->frameSet();
+	KoPoint docPoint( unzoomPoint( nPoint ) );
+	bool reallyStartLooking=false;
+	if (fs->isFloating()) {
+		// inline frame: the frame below is the parent frame.
+		// since we know nPoint is already in frame, we don't have to check it for \
anchorFrame here. +		KWFrameSet *frameSet = fs->anchorFrameset();
+		KWFrame *f = frameSet->frameByBorder(nPoint);
+		// for comments see below.
+		if (f) {
+			if (border) *border=true;
+			return f;
+		}
+		f = frameSet->frameAtPos(docPoint.x(),docPoint.y());
+		if (f) {
+			if (border) *border=false;
+			return f;
+		}
+
+
+	} else {
+		QPtrListIterator<KWFrameSet> fit = framesetsIterator();
+		for (fit.toLast(); fit.current(); --fit) // z-order
+			{
+			KWFrameSet *frameSet = fit.current();
+			if ( !(frameSet->isVisible()) || frameSet->isRemoveableHeader() )
+			            continue;
+			// we're not interested in floating frames here.
+			if (frameSet->isFloating())
+				continue;
+			// if we are really looking (we already found the given frameset in the z-ordered
+			// tree)
+			if (reallyStartLooking) {
+				KWFrame *f = frameSet->frameByBorder(nPoint);
+				// We found a frame below the given frame that is okay for a border.
+				if (f) {
+					if (border) *border=true;
+					return f;
+				}
+				// We found a frame below the given frame that is okay.
+				f = frameSet->frameAtPos(docPoint.x(),docPoint.y());
+				// return the deepest inline frame. Remember less deep inline frames
+				// are 'below' deeper inline frames.
+				if (f) {
+					return deepestInlineFrame(f,nPoint,border);
+				}
+			}
+
+			if (frameSet == fs)
+				reallyStartLooking=true;
+
+		}
+		return 0L;
+	}
+	return 0L;
+}
+
+
+KWFrame * KWDocument::topFrameUnderMouse( const QPoint& nPoint, bool* border)
 {
     KoPoint docPoint( unzoomPoint( nPoint ) );
     QPtrListIterator<KWFrameSet> fit = framesetsIterator();
+
     for ( fit.toLast(); fit.current() ; --fit ) // z-order
     {
         KWFrameSet *frameSet = fit.current();
+	// only consider non-inline frames.
+	if (frameSet->isFloating())
+		continue;
         if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
             continue;
+
         KWFrame * frame = frameSet->frameByBorder( nPoint );
         if ( frame )
@@ -2382,14 +2478,36 @@ KWFrame * KWDocument::frameUnderMouse( c
         }
         frame = frameSet->frameAtPos( docPoint.x(), docPoint.y() );
-        //kdDebug() << "KWDocument::frameAtPos found frameset " << frameSet
-        // << " at position " << docPoint.x() << "," << docPoint.y() << endl;
         if ( frame )
         {
-            if ( border ) *border = false;
-            return frame;
+		return deepestInlineFrame(frame,nPoint,border);
         }
     }
     return 0L;
+}
+
 
+KWFrame * KWDocument::frameUnderMouse( const QPoint& nPoint, bool* border, bool \
firstNonSelected ) +{
+	KWFrame *candidate=topFrameUnderMouse(nPoint,border);
+	if (!firstNonSelected)
+		return candidate;
+	KWFrame *goDeeper=candidate;
+	bool foundselected=false;
+	while (goDeeper) {
+		while (goDeeper && goDeeper->isSelected())
+		{
+			goDeeper=frameBelowFrame(nPoint, goDeeper, border);
+			foundselected=true;
+		}
+		if (foundselected)
+			if (goDeeper)
+				return goDeeper;
+			else
+				return candidate;
+		else
+			goDeeper=frameBelowFrame(nPoint, goDeeper, border);
+
+	}
+	return candidate;
 }
 
@@ -2409,16 +2527,12 @@ QString KWDocument::generateFramesetName
 QCursor KWDocument::getMouseCursor( const QPoint &nPoint, bool controlPressed )
 {
-    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
-    for ( fit.toLast(); fit.current() ; --fit )
-    {
-        KWFrameSet *frameSet = fit.current();
-        if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
-            continue;
-
+    bool border=true;
+    KWFrame *frame = frameUnderMouse(nPoint, &border );
+    if (frame) {
         QCursor cursor;
-        if ( frameSet->getMouseCursor( nPoint, controlPressed, cursor ) )
+        KWFrameSet *frameSet = frame->frameSet();
+	if ( frameSet->getMouseCursor(nPoint, controlPressed, cursor))
             return cursor;
     }
-
     return ibeamCursor;
 }
Index: kwdoc.h
===================================================================
RCS file: /home/kde/koffice/kword/kwdoc.h,v
retrieving revision 1.145
diff -u -2 -d -p -b -r1.145 kwdoc.h
--- kwdoc.h	2002/02/22 23:30:31	1.145
+++ kwdoc.h	2002/02/28 04:15:44
@@ -175,5 +175,6 @@ public:
     // Returns the frame under the mouse (or 0)
     // The bool border is true if the mouse is on a border, false if it's inside the \
                frame
-    KWFrame * frameUnderMouse( const QPoint& nPoint, bool* border = 0L );
+    // if firstNonSelected is set to true, frameUnderMouse searches for the upper \
frame that is not selected. +    KWFrame * frameUnderMouse( const QPoint& nPoint, \
bool* border = 0L, bool firstNonSelected = false );  
     // Return the total number of framesets
@@ -546,4 +547,9 @@ protected:
 
 private:
+    //private helper functions for frameUnderMouse
+    KWFrame *topFrameUnderMouse( const QPoint& nPoint, bool* border=0L);
+    KWFrame *frameBelowFrame(const QPoint& nPoint, KWFrame *frame, bool *border=0L);
+    KWFrame *deepestInlineFrame(KWFrame *parent, const QPoint& nPoint, bool \
*border); +
     QPtrList<KWView> m_lstViews;
     QPtrList<KWChild> m_lstChildren;


_______________________________________________
koffice-devel mailing list
koffice-devel@mail.kde.org
http://mail.kde.org/mailman/listinfo/koffice-devel

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic