Smart quotes generating selection events

From: Daniel Drake <dsd_at_laptop.org>
Date: Tue Dec 08 2009 - 16:58:26 CET

Hi,

When using pyabiword, the text-selected signal is raised every time " is
pressed. This is causing a strange user experience in Sugar's Write activity,
which switches to the "Edit" toolbar tab every time a selection is made.

This signal generation originates from smart quotes: when smart quotes tries
to change a boring quote mark into a curly one, it does so by selecting the
old/boring character and then inserting a curly one. This also creates an undo
point, but does raise the selection event.

Here is a quick patch that I briefly discussed with Marco to solve this, which
says that the smart quotes selection should not generate an event. We'd like
to start a discussion on whether this is OK, or if there is a better way we
can solve this.

Thoughts?

cheers
Daniel

Index: abiword-2.8.1/src/text/fmt/xp/fv_View_cmd.cpp
===================================================================
--- abiword-2.8.1.orig/src/text/fmt/xp/fv_View_cmd.cpp
+++ abiword-2.8.1/src/text/fmt/xp/fv_View_cmd.cpp
@@ -4023,7 +4023,7 @@ void FV_View::cmdScroll(AV_ScrollCmd cmd
 }
 
 
-void FV_View::cmdSelect(PT_DocPosition dpBeg, PT_DocPosition dpEnd)
+void FV_View::cmdSelect(PT_DocPosition dpBeg, PT_DocPosition dpEnd, bool notify)
 {
 
         if (!isSelectionEmpty())
@@ -4053,7 +4053,8 @@ void FV_View::cmdSelect(PT_DocPosition d
                 return;
         }
         _drawSelection();
- notifyListeners(AV_CHG_EMPTYSEL);
+ if (notify)
+ notifyListeners(AV_CHG_EMPTYSEL);
 }
 
 #define IS_SELECTALL(a, b) ((a) == FV_DOCPOS_BOD && (b) == FV_DOCPOS_EOD)
Index: abiword-2.8.1/src/text/fmt/xp/fl_DocLayout.cpp
===================================================================
--- abiword-2.8.1.orig/src/text/fmt/xp/fl_DocLayout.cpp
+++ abiword-2.8.1/src/text/fmt/xp/fl_DocLayout.cpp
@@ -4622,7 +4622,8 @@ void FL_DocLayout::considerSmartQuoteCan
 
                         m_pView->moveInsPtTo(quotable_at);
                         // delete/insert create change records for UNDO
- m_pView->cmdSelect(quotable_at, quotable_at + 1);
+ // be careful not to cause selection event to be notified
+ m_pView->cmdSelect(quotable_at, quotable_at + 1, false);
                         m_pView->cmdCharInsert(&replacement, 1);
                         m_pView->moveInsPtTo(saved_pos);
                 }
Index: abiword-2.8.1/src/text/fmt/xp/fv_View.h
===================================================================
--- abiword-2.8.1.orig/src/text/fmt/xp/fv_View.h
+++ abiword-2.8.1/src/text/fmt/xp/fv_View.h
@@ -414,7 +414,7 @@ public:
         bool isTOCSelected(void) const;
         bool setTOCProps(PT_DocPosition pos, const char * szProps);
 
- void cmdSelect(PT_DocPosition dpBeg, PT_DocPosition dpEnd);
+ void cmdSelect(PT_DocPosition dpBeg, PT_DocPosition dpEnd, bool notify = true);
         void cmdCharMotion(bool bForward, UT_uint32 count);
         bool cmdCharInsert(const UT_UCSChar * text, UT_uint32 count, bool bForce = false);
         void cmdCharDelete(bool bForward, UT_uint32 count);
Received on Tue Dec 8 17:14:58 2009

This archive was generated by hypermail 2.1.8 : Tue Dec 08 2009 - 17:14:58 CET