Marc's site with my shell account has been down for a
couple of days so I'll have to submit this patch the
old way.

I've Fixed
http://bugzilla.abisource.com/show_bug.cgi?id=3275
"[rfe] display the spell checker language in the
status bar"

Our status fields are in a different order to MSWord's
but I tried to put the new field in a similar relative
spot.  You'll probably notice especially on *nix
builds
that the new field is off the right-side of the
window.
This is not the fault of this patch - so run along and
fix this bug to make it right:
http://bugzilla.abisource.com/show_bug.cgi?id=4135
"Status bar doesn't resize."

There's also a new feature for the RTF importer (sorry
to mix two things in one patch).
MS Word and RTF have two concepts for language and
spelling that we currently cover with a single
concept.
They allow you to set the language for some text and
flag it as not spell-checked with the \noproof
keyword.
We were ignoring this keyword.  We now treat this key-
word the same as setting the language for a selection
to "none".
MS Word and RTF support "none" as a language when you
import a file with it but they don't have a "none" or
"no proofing" in their language selection list so it
wasn't very easy to make a document which proofed the
same way on Word and AbiWord.

Andrew.

=====
http://linguaphile.sourceforge.net/cgi-bin/translator.pl http://www.abisource.com

__________________________________________________
Do You Yahoo!?
Everything you'll ever need on one web page
from News and Sport to Email and Music Charts
http://uk.my.yahoo.com
diff --strip-trailing-cr -ru /cygdrive/c/AbiCVS/HEAD/abi/src/wp/ap/xp/ap_StatusBar.cpp 
/cygdrive/c/Program Files/Microsoft Visual 
Studio/MyProjects/abiword/abi/src/wp/ap/xp/ap_StatusBar.cpp
--- /cygdrive/c/AbiCVS/HEAD/abi/src/wp/ap/xp/ap_StatusBar.cpp   2002-08-13 
08:14:10.000000000 +0800
+++ /cygdrive/c/Program Files/Microsoft Visual 
+Studio/MyProjects/abiword/abi/src/wp/ap/xp/ap_StatusBar.cpp      2002-10-09 
+22:22:56.000000000 +0800
@@ -512,6 +512,9 @@
        }
 }
 
+//////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////
+
 class ap_sb_Field_InsertMode : public ap_sb_Field
 {
 public:
@@ -596,6 +599,109 @@
     }
 }
 
+
+//////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////
+
+class ap_sb_Field_Language : public ap_sb_Field
+{
+public:
+    ap_sb_Field_Language(AP_StatusBar * pSB);
+    virtual ~ap_sb_Field_Language(void);
+
+    virtual UT_uint32   getDesiredWidth(void);
+    virtual void        draw(void);
+    virtual void        notify(AV_View * pView, const AV_ChangeMask mask);
+
+private:
+    UT_UCSChar          m_Language[AP_MAX_MESSAGE_FIELD];
+    UT_uint32           m_iDesiredWidth;
+};
+
+ap_sb_Field_Language::ap_sb_Field_Language(AP_StatusBar * pSB)
+    : ap_sb_Field(pSB)
+{
+       m_Language[0] = 0;
+    m_iDesiredWidth = 0;
+}
+
+ap_sb_Field_Language::~ap_sb_Field_Language(void)
+{
+}
+
+UT_uint32 ap_sb_Field_Language::getDesiredWidth(void)
+{
+    if (!m_iDesiredWidth)
+    {
+        UT_GrowBufElement charWidths[AP_MAX_MESSAGE_FIELD];
+
+               // TODO language tags can be longer, eg "art-lojban"
+               UT_UCSChar language[5+1];
+               // Use m/M to measure string since it's a fat letter
+               UT_UCS4_strcpy_char(language,"mm-MM");
+
+               // TODO language tags can be longer, eg "art-lojban"
+        m_iDesiredWidth = 
+m_pSB->getGraphics()->measureString(language,0,5,charWidths);
+        UT_ASSERT(m_iDesiredWidth);
+        m_iDesiredWidth = MyMin(m_iDesiredWidth,_UL(300)) + _UL(6);
+    }
+    return m_iDesiredWidth;
+}
+
+/*
+        UT_GrowBufElement charWidths[AP_MAX_MESSAGE_FIELD];
+
+               // Use m/M to measure string since it's a fat letter
+               // TODO language tags can be longer, eg "art-lojban"
+        m_iDesiredWidth = m_pSB->getGraphics()->measureString("mm-MM",0,5,charWidths);
+        
+*/
+
+void ap_sb_Field_Language::draw(void)
+{
+    _draw3D();
+    int len;
+
+    UT_UCSChar *bufLanguage = m_Language;
+
+    len = UT_UCS4_strlen(bufLanguage);
+
+    if (len)
+    {
+        GR_Graphics * pG = m_pSB->getGraphics();
+        UT_uint32 iFontHeight = pG->getFontHeight();
+
+        UT_uint32 x = m_rect3d.left + _UL(3);
+        UT_uint32 y = m_rect3d.top + (m_rect3d.height-iFontHeight)/2;
+
+        pG->setColor3D(GR_Graphics::CLR3D_Foreground);
+
+        pG->setClipRect(&m_rect3d);
+        pG->drawChars(bufLanguage,0,len,x,y);
+        pG->setClipRect(NULL);
+    }
+}
+
+void ap_sb_Field_Language::notify(AV_View * pavView, const AV_ChangeMask mask)
+{
+    // TODO do we want our own bit for language change?
+       //if (mask & (AV_CHG_INSERTMODE))
+    {
+               const char * szLang = NULL;
+
+               const XML_Char ** props_in = NULL;
+               if (pavView && static_cast<FV_View 
+*>(pavView)->getCharFormat(&props_in))
+               {
+                       szLang = UT_getAttribute("lang", props_in);
+                       FREEP(props_in);
+
+                       UT_UCS4_strcpy_char(m_Language,szLang ? szLang : "");
+               }
+
+        draw();
+    }
+}
+
 //////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////
 
@@ -673,6 +779,8 @@
                DclField(ap_sb_Field_InsertMode, pf4);
                DclField(ap_sb_Field_InputMode, pf3);
                
+               DclField(ap_sb_Field_Language, pf5);
+
                // TODO add other fields
 
 #undef DclField
@@ -699,6 +807,8 @@
 
 void AP_StatusBar::setWidth(UT_uint32 iWidth)
 {
+       // TODO change status message control width
+       // TODO change x position of all controls to right of status message
        m_iWidth = iWidth;
 }
 
@@ -713,8 +823,8 @@
 
        // We choose to clear any status message we may have,
        // since it's a pain for the code which set the message
-       // to hang around and clear it at somepoint in the future.
-       // This way, message will get cleared anytime the user does
+       // to hang around and clear it at some point in the future.
+       // This way, message will get cleared any time the user does
        // something with the window.
 
        if (*m_bufUCS)
diff --strip-trailing-cr -ru 
/cygdrive/c/AbiCVS/HEAD/abi/src/wp/impexp/xp/ie_imp_RTF.cpp /cygdrive/c/Program 
Files/Microsoft Visual Studio/MyProjects/abiword/abi/src/wp/impexp/xp/ie_imp_RTF.cpp
--- /cygdrive/c/AbiCVS/HEAD/abi/src/wp/impexp/xp/ie_imp_RTF.cpp 2002-09-13 
00:16:38.000000000 +0800
+++ /cygdrive/c/Program Files/Microsoft Visual 
+Studio/MyProjects/abiword/abi/src/wp/impexp/xp/ie_imp_RTF.cpp    2002-10-06 
+18:54:10.000000000 +0800
@@ -3265,6 +3265,18 @@
                        }
                break;
 
+       case 'n':
+               if (strcmp((char*)pKeyword,"noproof") == 0)
+               {
+                       // Set language to none for \noproof
+                       // TODO actually implement proofing flag separate to language 
+setting
+                       UT_DEBUGMSG(("HIPI: RTF import keyword \\noproof\n"));
+                       // mark language for spell checking
+                       m_currentRTFState.m_charProps.m_szLang = "-none-";
+                       return true;
+               }
+               break;
+
        case 'o':
                if (strcmp((char*)pKeyword,"ol") == 0)
                {

Reply via email to