summaryrefslogtreecommitdiff
path: root/cui/source/dialogs/hyphen.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cui/source/dialogs/hyphen.cxx')
-rwxr-xr-x[-rw-r--r--]cui/source/dialogs/hyphen.cxx568
1 files changed, 356 insertions, 212 deletions
diff --git a/cui/source/dialogs/hyphen.cxx b/cui/source/dialogs/hyphen.cxx
index 91136b607a22..16026aaff6d1 100644..100755
--- a/cui/source/dialogs/hyphen.cxx
+++ b/cui/source/dialogs/hyphen.cxx
@@ -28,52 +28,51 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_cui.hxx"
-// include ---------------------------------------------------------------
-#include <tools/shl.hxx>
-#include <tools/list.hxx>
-#include <com/sun/star/linguistic2/XPossibleHyphens.hpp>
-#include <vcl/msgbox.hxx>
-#include "cuires.hrc"
-#include "hyphen.hrc"
-#include <editeng/svxenum.hxx>
#include "hyphen.hxx"
+#include "hyphen.hrc"
+#include "cuires.hrc"
+#include "dialmgr.hxx"
+
#include <editeng/splwrap.hxx>
-#include <svx/dlgutil.hxx>
-#include <svx/dialmgr.hxx>
+#include <editeng/svxenum.hxx>
#include <editeng/unolingu.hxx>
#include <svtools/langtab.hxx>
-#include "dialmgr.hxx"
+#include <svx/dialmgr.hxx>
+#include <svx/dlgutil.hxx>
+#include <tools/list.hxx>
+#include <tools/shl.hxx>
+#include <vcl/msgbox.hxx>
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::beans;
-using namespace ::com::sun::star::linguistic2;
+#include <com/sun/star/linguistic2/XPossibleHyphens.hpp>
-#undef S2U
-#undef U2S
-//#define S2U(s) StringToOUString(s, CHARSET_SYSTEM)
-//#define U2S(s) OUStringToString(s, CHARSET_SYSTEM)
+using namespace ::com::sun::star;
-// define ----------------------------------------------------------------
-#define HYPHHERE '-'
+#define HYPH_POS_CHAR '='
#define CONTINUE_HYPH USHRT_MAX
-// Dies ist nur ein Hack, weil an dieser Stelle das extern char aus hmwrap
-// nicht bekannt ist, wird demnaechst in hmwrap durch ein define ersetzt.
-#define SW_SOFT_HYPHEN '='
+#define CUR_HYPH_POS_CHAR '-'
+
+
+// class HyphenEdit_Impl -------------------------------------------------------
-// class SvxHyphenEdit ---------------------------------------------------
+class HyphenEdit_Impl : public Edit
+{
+public:
+ HyphenEdit_Impl( Window* pParent, const ResId& rResId );
+
+protected:
+ virtual void KeyInput( const KeyEvent &rKEvt );
+};
-SvxHyphenEdit::SvxHyphenEdit( Window* pParent, const ResId& rResId ) :
+HyphenEdit_Impl::HyphenEdit_Impl( Window* pParent, const ResId& rResId ) :
Edit( pParent, rResId )
{
}
-// -----------------------------------------------------------------------
-void SvxHyphenEdit::KeyInput( const KeyEvent& rKEvt )
+void HyphenEdit_Impl::KeyInput( const KeyEvent& rKEvt )
{
// sal_uInt16 nMod = rKEvt.GetKeyCode().GetModifier();
sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
@@ -99,123 +98,143 @@ void SvxHyphenEdit::KeyInput( const KeyEvent& rKEvt )
}
}
-// class SvxHyphenWordDialog ---------------------------------------------
-SvxHyphenWordDialog::SvxHyphenWordDialog( const String &rWord, LanguageType nLang,
- Window* pParent,
- Reference< XHyphenator > &xHyphen,
- SvxSpellWrapper* pWrapper ) :
- SfxModalDialog( pParent, CUI_RES( RID_SVXDLG_HYPHENATE ) ),
-
- aWordFT ( this, CUI_RES( FT_WORD ) ),
- aWordEdit ( this, CUI_RES( ED_WORD ) ),
- aLeftBtn ( this, CUI_RES( BTN_LEFT ) ),
- aRightBtn ( this, CUI_RES( BTN_RIGHT ) ),
- aOkBtn ( this, CUI_RES( BTN_HYPH_CUT ) ),
- aCancelBtn ( this, CUI_RES( BTN_HYPH_CANCEL ) ),
- aContBtn ( this, CUI_RES( BTN_HYPH_CONTINUE ) ),
- aDelBtn ( this, CUI_RES( BTN_HYPH_DELETE ) ),
- aHelpBtn ( this, CUI_RES( BTN_HYPH_HELP ) ),
- aLabel ( GetText() ),
- pHyphWrapper ( pWrapper ),
- xHyphenator ( xHyphen ),
- aActWord ( rWord ),
- nActLanguage ( nLang ),
+// struct SvxHyphenWordDialog_Impl ---------------------------------------------
+
+struct SvxHyphenWordDialog_Impl
+{
+ SvxHyphenWordDialog * m_pDialog;
+// Window * m_pParent;
+
+ FixedText aWordFT;
+ HyphenEdit_Impl aWordEdit;
+ ImageButton aLeftBtn;
+ ImageButton aRightBtn;
+ OKButton aOkBtn;
+ PushButton aContBtn;
+ PushButton aDelBtn;
+ FixedLine aFLBottom;
+ HelpButton aHelpBtn;
+ PushButton aHyphAll;
+ CancelButton aCancelBtn;
+ String aLabel;
+ SvxSpellWrapper* pHyphWrapper;
+ uno::Reference< linguistic2::XHyphenator > xHyphenator;
+ uno::Reference< linguistic2::XPossibleHyphens > xPossHyph;
+ String aEditWord; // aEditWord and aWordEdit.GetText() differ only by the character for the current selected hyphenation position
+ String aActWord; // actual word to be hyphenated
+ LanguageType nActLanguage; // and its language
+ sal_uInt16 nMaxHyphenationPos; // right most valid hyphenation pos
+ sal_uInt16 nHyphPos;
+ sal_uInt16 nOldPos;
+ sal_Int32 nHyphenationPositionsOffset;
+ sal_Bool bBusy;
+
+
+ void EnableLRBtn_Impl();
+ String EraseUnusableHyphens_Impl( ::com::sun::star::uno::Reference< ::com::sun::star::linguistic2::XPossibleHyphens > &rxPossHyph, sal_uInt16 nMaxHyphenationPos );
+
+ void InitControls_Impl();
+ void ContinueHyph_Impl( sal_uInt16 nInsPos = 0 );
+ sal_uInt16 GetHyphIndex_Impl();
+ void SelLeft_Impl();
+ void SelRight_Impl();
+
+ DECL_LINK( Left_Impl, Button* );
+ DECL_LINK( Right_Impl, Button* );
+ DECL_LINK( CutHdl_Impl, Button* );
+ DECL_LINK( ContinueHdl_Impl, Button* );
+ DECL_LINK( DeleteHdl_Impl, Button* );
+ DECL_LINK( HyphenateAllHdl_Impl, Button* );
+ DECL_LINK( CancelHdl_Impl, Button* );
+ DECL_LINK( GetFocusHdl_Impl, Edit* );
+
+
+ SvxHyphenWordDialog_Impl(
+ SvxHyphenWordDialog * pDialog,
+ const String &rWord,
+ LanguageType nLang,
+ uno::Reference< linguistic2::XHyphenator > &xHyphen,
+ SvxSpellWrapper* pWrapper );
+ ~SvxHyphenWordDialog_Impl();
+};
+
+
+SvxHyphenWordDialog_Impl::SvxHyphenWordDialog_Impl(
+ SvxHyphenWordDialog * pDialog,
+ const String &rWord,
+ LanguageType nLang,
+ uno::Reference< linguistic2::XHyphenator > &xHyphen,
+ SvxSpellWrapper* pWrapper ) :
+
+ m_pDialog ( pDialog ),
+ aWordFT ( pDialog, CUI_RES( FT_WORD ) ),
+ aWordEdit ( pDialog, CUI_RES( ED_WORD ) ),
+ aLeftBtn ( pDialog, CUI_RES( BTN_LEFT ) ),
+ aRightBtn ( pDialog, CUI_RES( BTN_RIGHT ) ),
+ aOkBtn ( pDialog, CUI_RES( BTN_HYPH_CUT ) ),
+ aContBtn ( pDialog, CUI_RES( BTN_HYPH_CONTINUE ) ),
+ aDelBtn ( pDialog, CUI_RES( BTN_HYPH_DELETE ) ),
+ aFLBottom ( pDialog, CUI_RES( FL_BOTTOM ) ),
+ aHelpBtn ( pDialog, CUI_RES( BTN_HYPH_HELP ) ),
+ aHyphAll ( pDialog, CUI_RES( BTN_HYPH_ALL ) ),
+ aCancelBtn ( pDialog, CUI_RES( BTN_HYPH_CANCEL ) ),
+ aLabel ( pDialog->GetText() ),
+ pHyphWrapper ( NULL ),
+ xHyphenator ( NULL ),
+ xPossHyph ( NULL ),
+ aActWord ( ),
+ nActLanguage ( LANGUAGE_NONE ),
+ nMaxHyphenationPos ( 0 ),
nHyphPos ( 0 ),
nOldPos ( 0 ),
+ nHyphenationPositionsOffset( 0 ),
bBusy ( sal_False )
{
- aContBtn.SetClickHdl(
- LINK( this, SvxHyphenWordDialog, ContinueHdl_Impl ) );
- aOkBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog, CutHdl_Impl ) );
- aDelBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog, DeleteHdl_Impl ) );
- aCancelBtn.SetClickHdl(
- LINK( this, SvxHyphenWordDialog, CancelHdl_Impl ) );
- aLeftBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog, Left_Impl ) );
- aRightBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog, Right_Impl ) );
-
- aWordEdit.SetGetFocusHdl(
- LINK( this, SvxHyphenWordDialog, GetFocusHdl_Impl ) );
-
- Reference< XHyphenatedWord > xHyphWord( pWrapper ?
- pWrapper->GetLast() : Reference< XInterface > () , UNO_QUERY );
- DBG_ASSERT(xHyphWord.is(), "missing hyphenated word");
- nMaxHyphenationPos = xHyphWord.is() ? xHyphWord->getHyphenationPos() : 0;
- SetLabel_Impl( nLang );
+ aActWord = rWord;
+ nActLanguage = nLang;
+ xHyphenator = xHyphen;
+ pHyphWrapper = pWrapper;
+
+ uno::Reference< linguistic2::XHyphenatedWord > xHyphWord( pHyphWrapper ?
+ pHyphWrapper->GetLast() : NULL, uno::UNO_QUERY );
+ DBG_ASSERT( xHyphWord.is(), "hyphenation result missing" );
+ if (xHyphWord.is())
+ {
+ DBG_ASSERT( aActWord == String( xHyphWord->getWord() ), "word mismatch" );
+ DBG_ASSERT( nActLanguage == SvxLocaleToLanguage( xHyphWord->getLocale() ), "language mismatch" );
+ nMaxHyphenationPos = xHyphWord->getHyphenationPos();
+ }
InitControls_Impl();
aWordEdit.GrabFocus();
- FreeResource();
-
- // disable controls if service is not available
- if (!xHyphenator.is())
- Enable( sal_False );
+ aLeftBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, Left_Impl ) );
+ aRightBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, Right_Impl ) );
+ aOkBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, CutHdl_Impl ) );
+ aContBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, ContinueHdl_Impl ) );
+ aDelBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, DeleteHdl_Impl ) );
+ aHyphAll.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, HyphenateAllHdl_Impl ) );
+ aCancelBtn.SetClickHdl( LINK( this, SvxHyphenWordDialog_Impl, CancelHdl_Impl ) );
+ aWordEdit.SetGetFocusHdl( LINK( this, SvxHyphenWordDialog_Impl, GetFocusHdl_Impl ) );
}
-// -----------------------------------------------------------------------
-void SvxHyphenWordDialog::SelLeft()
+SvxHyphenWordDialog_Impl::~SvxHyphenWordDialog_Impl()
{
- String aTxt( aWordEdit.GetText() );
-
- for ( xub_StrLen i = nOldPos + 1; i-- > 0 ; )
- {
- DBG_ASSERT(i <= aTxt.Len(), "index out of range");
- if( aTxt.GetChar( i ) == sal_Unicode( SW_SOFT_HYPHEN ) )
- {
- aTxt.SetChar( i, sal_Unicode( HYPHHERE ) );
-
- if ( nOldPos != 0 && nOldPos != aTxt.Len() )
- aTxt.SetChar( nOldPos, sal_Unicode( SW_SOFT_HYPHEN ) );
- nOldPos = i;
- aWordEdit.SetText( aTxt );
- aWordEdit.GrabFocus();
- aWordEdit.SetSelection( Selection( i, i + 1 ) );
- break;
- }
- }
- nHyphPos = GetHyphIndex_Impl();
- EnableLRBtn_Impl();
-}
-
-// -----------------------------------------------------------------------
-
-void SvxHyphenWordDialog::SelRight()
-{
- String aTxt( aWordEdit.GetText() );
-
- for ( xub_StrLen i = nOldPos + 1; i < aTxt.Len(); ++i )
- {
- if( aTxt.GetChar( i ) == sal_Unicode( SW_SOFT_HYPHEN ) )
- {
- aTxt.SetChar( i, sal_Unicode( HYPHHERE ) );
-
- if ( nOldPos != 0 && nOldPos != aTxt.Len() )
- aTxt.SetChar( nOldPos, sal_Unicode( SW_SOFT_HYPHEN ) );
- nOldPos = i;
- aWordEdit.SetText( aTxt );
- aWordEdit.GrabFocus();
- aWordEdit.SetSelection( Selection( i, i + 1 ) );
- break;
- }
- }
- nHyphPos = GetHyphIndex_Impl();
- EnableLRBtn_Impl();
}
-// -----------------------------------------------------------------------
-void SvxHyphenWordDialog::EnableLRBtn_Impl()
+void SvxHyphenWordDialog_Impl::EnableLRBtn_Impl()
{
- String aTxt( aWordEdit.GetText() );
+ String aTxt( aEditWord );
xub_StrLen nLen = aTxt.Len();
xub_StrLen i;
aRightBtn.Disable();
for ( i = nOldPos + 2; i < nLen; ++i )
{
- if ( aTxt.GetChar( i ) == sal_Unicode( SW_SOFT_HYPHEN ) )
+ if ( aTxt.GetChar( i ) == sal_Unicode( HYPH_POS_CHAR ) )
{
aRightBtn.Enable();
break;
@@ -228,7 +247,7 @@ void SvxHyphenWordDialog::EnableLRBtn_Impl()
aLeftBtn.Disable();
for ( i = nOldPos; i-- > 0; )
{
- if ( aTxt.GetChar( i ) == sal_Unicode( SW_SOFT_HYPHEN ) )
+ if ( aTxt.GetChar( i ) == sal_Unicode( HYPH_POS_CHAR ) )
{
aLeftBtn.Enable();
break;
@@ -236,42 +255,55 @@ void SvxHyphenWordDialog::EnableLRBtn_Impl()
}
}
-// -----------------------------------------------------------------------
-
-void SvxHyphenWordDialog::SetLabel_Impl( LanguageType nLang )
-{
- String aLangStr( SvtLanguageTable::GetLanguageString( nLang ) );
- String aTmp( aLabel );
- aTmp.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " (" ) );
- aTmp.Append( aLangStr );
- aTmp.Append( sal_Unicode( ')' ) );
- SetText( aTmp );
-}
-
-// -----------------------------------------------------------------------
-
-String SvxHyphenWordDialog::EraseUnusableHyphens_Impl(
- Reference< XPossibleHyphens > &rxPossHyph,
+String SvxHyphenWordDialog_Impl::EraseUnusableHyphens_Impl(
+ uno::Reference< linguistic2::XPossibleHyphens > &rxPossHyph,
sal_uInt16 _nMaxHyphenationPos )
{
// returns a String showing only those hyphen positions which will result
// in a line break if hyphenation is done there
+ // 1) we will need to discard all hyphenation positions at th end that
+ // will not result in a line break where the text to the left still fits
+ // on the line.
+ // 2) since as from OOo 3.2 '-' are part of a word an thus text like
+ // 'multi-line-editor' is regarded as single word we also need to discard those
+ // hyphenation positions to the left of the rightmost '-' that is still left of
+ // the rightmost valid hyphenation position according to 1)
+ //
+ // Example:
+ // If the possible hyphenation position in 'multi-line-editor' are to eb marked
+ // by '=' then the text will look like this 'mul=ti-line-ed=it=or'.
+ // If now the first line is only large enough for 'multi-line-edi' we need to discard
+ // the last possible hyphnation point because of 1). The the right most valid
+ // hyphenation position is "ed=itor". The first '-' left of this position is
+ // "line-ed", thus because of 2) we now need to discard all possible hyphneation
+ // positions to the left of that as well. Thus in the end leaving us with just
+ // 'multi-line-ed=itor' as return value for this function. (Just one valid hyphenation
+ // position for the user too choose from. However ALL the '-' characters in the word
+ // will ALWAYS be valid implicit hyphenation positions for the core to choose from!
+ // And thus even if this word is skipped in the hyphenation dialog it will still be broken
+ // right after 'multi-line-' (actually it might already be broken up that way before
+ // the hyphenation dialog is called!).
+ // Thus rule 2) just eliminates those positions which will not be used by the core at all
+ // even if the user were to select one of them.
String aTxt;
DBG_ASSERT(rxPossHyph.is(), "missing possible hyphens");
if (rxPossHyph.is())
{
+ DBG_ASSERT( aActWord == String( rxPossHyph->getWord() ), "word mismatch" );
+
aTxt = String( rxPossHyph->getPossibleHyphens() );
- Sequence< sal_Int16 > aHyphenationPositions(
+ nHyphenationPositionsOffset = 0;
+ uno::Sequence< sal_Int16 > aHyphenationPositions(
rxPossHyph->getHyphenationPositions() );
sal_Int32 nLen = aHyphenationPositions.getLength();
const sal_Int16 *pHyphenationPos = aHyphenationPositions.getConstArray();
// find position nIdx after which all hyphen positions are unusable
- xub_StrLen nIdx = STRING_NOTFOUND,
- nPos;
+ xub_StrLen nIdx = STRING_NOTFOUND;
+ xub_StrLen nPos = 0, nPos1 = 0, nPos2 = 0;
if (nLen)
{
xub_StrLen nStart = 0;
@@ -282,7 +314,7 @@ String SvxHyphenWordDialog::EraseUnusableHyphens_Impl(
else
{
// find corresponding hyphen pos in string
- nPos = aTxt.Search( sal_Unicode( SW_SOFT_HYPHEN ), nStart );
+ nPos = aTxt.Search( sal_Unicode( HYPH_POS_CHAR ), nStart );
if (nStart == STRING_NOTFOUND)
break;
@@ -296,66 +328,77 @@ String SvxHyphenWordDialog::EraseUnusableHyphens_Impl(
}
DBG_ASSERT(nIdx != STRING_NOTFOUND, "no usable hyphenation position");
- // remove not usable hyphens from string
+ // 1) remove all not usable hyphenation positions from the end of the string
nPos = nIdx == STRING_NOTFOUND ? 0 : nIdx + 1;
- String aTmp( sal_Unicode( SW_SOFT_HYPHEN ) ),
- aEmpty;
+ nPos1 = nPos; //save for later use in 2) below
+ const String aTmp( sal_Unicode( HYPH_POS_CHAR ) );
+ const String aEmpty;
while (nPos != STRING_NOTFOUND)
nPos = aTxt.SearchAndReplace( aTmp, aEmpty, nPos + 1 );
+
+ // 2) remove all hyphenation positions from the start that are not considered by the core
+ const String aSearchRange( aTxt.Copy( 0, nPos1 ) );
+ nPos2 = aSearchRange.SearchBackward( '-' ); // the '-' position the core will use by default
+ if (nPos2 != STRING_NOTFOUND)
+ {
+ String aLeft( aSearchRange.Copy( 0, nPos2 ) );
+ nPos = 0;
+ while (nPos != STRING_NOTFOUND)
+ {
+ nPos = aLeft.SearchAndReplace( aTmp, aEmpty, nPos + 1 );
+ if (nPos != STRING_NOTFOUND)
+ ++nHyphenationPositionsOffset;
+ }
+ aTxt.Replace( 0, nPos2, aLeft );
+ }
}
return aTxt;
}
-// -----------------------------------------------------------------------
-void SvxHyphenWordDialog::InitControls_Impl()
+void SvxHyphenWordDialog_Impl::InitControls_Impl()
{
- String aTxt;
xPossHyph = NULL;
if (xHyphenator.is())
{
lang::Locale aLocale( SvxCreateLocale(nActLanguage) );
xPossHyph = xHyphenator->createPossibleHyphens( aActWord, aLocale,
- Sequence< PropertyValue >() );
+ uno::Sequence< beans::PropertyValue >() );
if (xPossHyph.is())
- {
- aTxt = EraseUnusableHyphens_Impl( xPossHyph, nMaxHyphenationPos );
- }
- SetLabel_Impl( nActLanguage );
+ aEditWord = EraseUnusableHyphens_Impl( xPossHyph, nMaxHyphenationPos );
}
- aWordEdit.SetText( aTxt );
+ aWordEdit.SetText( aEditWord );
- nOldPos = aTxt.Len();
- SelLeft();
+ nOldPos = aEditWord.Len();
+ SelLeft_Impl();
EnableLRBtn_Impl();
}
-// -----------------------------------------------------------------------
-void SvxHyphenWordDialog::ContinueHyph_Impl( sal_uInt16 nInsPos )
+void SvxHyphenWordDialog_Impl::ContinueHyph_Impl( sal_uInt16 nInsPos )
{
if ( nInsPos != CONTINUE_HYPH && xPossHyph.is())
{
if (nInsPos)
{
- //String aTmp( U2S( xPossHyph->getPossibleHyphens() ) );
- String aTmp( aWordEdit.GetText() );
+ String aTmp( aEditWord );
DBG_ASSERT(nInsPos <= aTmp.Len() - 2, "wrong hyphen position");
- sal_uInt16 nIdxPos = 0;
- sal_uInt16 i = 0;
- sal_Unicode c;
- while (i < aTmp.Len() && HYPHHERE != (c = aTmp.GetChar(i++)) )
+ sal_Int16 nIdxPos = -1;
+ for (sal_uInt16 i = 0; i <= nInsPos; ++i)
{
- if (SW_SOFT_HYPHEN == c)
+ if (HYPH_POS_CHAR == aTmp.GetChar( i ))
nIdxPos++;
}
+ // take the possible hyphenation positions that got removed from the
+ // start of the wor dinot account:
+ nIdxPos += nHyphenationPositionsOffset;
- Sequence< sal_Int16 > aSeq = xPossHyph->getHyphenationPositions();
+ uno::Sequence< sal_Int16 > aSeq = xPossHyph->getHyphenationPositions();
sal_Int32 nLen = aSeq.getLength();
DBG_ASSERT(nLen, "empty sequence");
- DBG_ASSERT(nIdxPos < nLen, "index out of range");
- if (nLen && nIdxPos < nLen)
+ DBG_ASSERT(0 <= nIdxPos && nIdxPos < nLen, "index out of range");
+ if (nLen && 0 <= nIdxPos && nIdxPos < nLen)
{
nInsPos = aSeq.getConstArray()[ nIdxPos ];
pHyphWrapper->InsertHyphen( nInsPos );
@@ -370,58 +413,130 @@ void SvxHyphenWordDialog::ContinueHyph_Impl( sal_uInt16 nInsPos )
if ( pHyphWrapper->FindSpellError() )
{
- Reference< XHyphenatedWord > xHyphWord( pHyphWrapper->GetLast(), UNO_QUERY );
+ uno::Reference< linguistic2::XHyphenatedWord > xHyphWord( pHyphWrapper->GetLast(), uno::UNO_QUERY );
// adapt actual word and language to new found hyphenation result
if(xHyphWord.is())
{
- aActWord = String( xHyphWord->getWord() );
+ aActWord = String( xHyphWord->getWord() );
nActLanguage = SvxLocaleToLanguage( xHyphWord->getLocale() );
nMaxHyphenationPos = xHyphWord->getHyphenationPos();
InitControls_Impl();
+ m_pDialog->SetWindowTitle( nActLanguage );
}
}
else
- EndDialog( RET_OK );
+ m_pDialog->EndDialog( RET_OK );
}
-// -----------------------------------------------------------------------
-sal_uInt16 SvxHyphenWordDialog::GetHyphIndex_Impl()
+sal_uInt16 SvxHyphenWordDialog_Impl::GetHyphIndex_Impl()
{
sal_uInt16 nPos = 0;
- String aTxt(aWordEdit.GetText());
+ String aTxt( aWordEdit.GetText() );
for ( sal_uInt16 i=0 ; i < aTxt.Len(); ++i )
{
- sal_Unicode nChar = aTxt.GetChar( i );
-
- if ( nChar == HYPHHERE )
+ sal_Unicode cChar = aTxt.GetChar( i );
+ if ( cChar == CUR_HYPH_POS_CHAR )
break;
-
- if ( nChar != SW_SOFT_HYPHEN )
+ if ( cChar != HYPH_POS_CHAR )
nPos++;
}
return nPos;
}
-// -----------------------------------------------------------------------
-IMPL_LINK_INLINE_START( SvxHyphenWordDialog, CutHdl_Impl, Button *, EMPTYARG )
+void SvxHyphenWordDialog_Impl::SelLeft_Impl()
+{
+ DBG_ASSERT( nOldPos > 0, "invalid hyphenation position" );
+ if (nOldPos > 0)
+ {
+ String aTxt( aEditWord );
+ for ( xub_StrLen i = nOldPos - 1; i > 0; --i)
+ {
+ DBG_ASSERT(i <= aTxt.Len(), "index out of range");
+ if (aTxt.GetChar( i ) == sal_Unicode( HYPH_POS_CHAR ))
+ {
+ aTxt.SetChar( i, sal_Unicode( CUR_HYPH_POS_CHAR ) );
+
+ nOldPos = i;
+ aWordEdit.SetText( aTxt );
+ aWordEdit.GrabFocus();
+ aWordEdit.SetSelection( Selection( i, i + 1 ) );
+ break;
+ }
+ }
+ nHyphPos = GetHyphIndex_Impl();
+ EnableLRBtn_Impl();
+ }
+}
+
+
+void SvxHyphenWordDialog_Impl::SelRight_Impl()
+{
+ String aTxt( aEditWord );
+ for ( xub_StrLen i = nOldPos + 1; i < aTxt.Len(); ++i )
+ {
+ if (aTxt.GetChar( i ) == sal_Unicode( HYPH_POS_CHAR ))
+ {
+ aTxt.SetChar( i, sal_Unicode( CUR_HYPH_POS_CHAR ) );
+
+ nOldPos = i;
+ aWordEdit.SetText( aTxt );
+ aWordEdit.GrabFocus();
+ aWordEdit.SetSelection( Selection( i, i + 1 ) );
+ break;
+ }
+ }
+ nHyphPos = GetHyphIndex_Impl();
+ EnableLRBtn_Impl();
+}
+
+
+IMPL_LINK( SvxHyphenWordDialog_Impl, CutHdl_Impl, Button *, EMPTYARG )
{
if( !bBusy )
{
bBusy = sal_True;
- ContinueHyph_Impl( nHyphPos );
+ ContinueHyph_Impl( /*nHyphPos*/nOldPos );
bBusy = sal_False;
}
return 0;
}
-IMPL_LINK_INLINE_END( SvxHyphenWordDialog, CutHdl_Impl, Button *, EMPTYARG )
-// -----------------------------------------------------------------------
-IMPL_LINK_INLINE_START( SvxHyphenWordDialog, DeleteHdl_Impl, Button *, EMPTYARG )
+IMPL_LINK( SvxHyphenWordDialog_Impl, HyphenateAllHdl_Impl, Button *, EMPTYARG /*pButton*/ )
+{
+ if( !bBusy )
+ {
+ try
+ {
+ uno::Reference< beans::XPropertySet > xProp( SvxGetLinguPropertySet() );
+ const rtl::OUString aName( rtl::OUString::createFromAscii( "IsHyphAuto" ) );
+ uno::Any aAny;
+
+ aAny <<= sal_True;
+ xProp->setPropertyValue( aName, aAny );
+
+ bBusy = sal_True;
+ ContinueHyph_Impl( /*nHyphPos*/nOldPos );
+ bBusy = sal_False;
+
+ aAny <<= sal_False;
+ xProp->setPropertyValue( aName, aAny );
+ }
+ catch (uno::Exception &e)
+ {
+ (void) e;
+ DBG_ASSERT( 0, "Hyphenate All failed" );
+ }
+ }
+ return 0;
+}
+
+
+IMPL_LINK( SvxHyphenWordDialog_Impl, DeleteHdl_Impl, Button *, EMPTYARG )
{
if( !bBusy )
{
@@ -431,11 +546,9 @@ IMPL_LINK_INLINE_START( SvxHyphenWordDialog, DeleteHdl_Impl, Button *, EMPTYARG
}
return 0;
}
-IMPL_LINK_INLINE_END( SvxHyphenWordDialog, DeleteHdl_Impl, Button *, EMPTYARG )
-// -----------------------------------------------------------------------
-IMPL_LINK_INLINE_START( SvxHyphenWordDialog, ContinueHdl_Impl, Button *, EMPTYARG )
+IMPL_LINK( SvxHyphenWordDialog_Impl, ContinueHdl_Impl, Button *, EMPTYARG )
{
if( !bBusy )
{
@@ -445,69 +558,100 @@ IMPL_LINK_INLINE_START( SvxHyphenWordDialog, ContinueHdl_Impl, Button *, EMPTYAR
}
return 0;
}
-IMPL_LINK_INLINE_END( SvxHyphenWordDialog, ContinueHdl_Impl, Button *, EMPTYARG )
-// -----------------------------------------------------------------------
-IMPL_LINK_INLINE_START( SvxHyphenWordDialog, CancelHdl_Impl, Button *, EMPTYARG )
+IMPL_LINK( SvxHyphenWordDialog_Impl, CancelHdl_Impl, Button *, EMPTYARG )
{
if( !bBusy )
{
bBusy = sal_True;
pHyphWrapper->SpellEnd();
- EndDialog( RET_CANCEL );
+ m_pDialog->EndDialog( RET_CANCEL );
bBusy = sal_False;
}
return 0;
}
-IMPL_LINK_INLINE_END( SvxHyphenWordDialog, CancelHdl_Impl, Button *, EMPTYARG )
-// -----------------------------------------------------------------------
-IMPL_LINK_INLINE_START( SvxHyphenWordDialog, Left_Impl, Button *, EMPTYARG )
+IMPL_LINK( SvxHyphenWordDialog_Impl, Left_Impl, Button *, EMPTYARG )
{
if( !bBusy )
{
bBusy = sal_True;
- SelLeft();
+ SelLeft_Impl();
bBusy = sal_False;
}
return 0;
}
-IMPL_LINK_INLINE_END( SvxHyphenWordDialog, Left_Impl, Button *, EMPTYARG )
-// -----------------------------------------------------------------------
-IMPL_LINK_INLINE_START( SvxHyphenWordDialog, Right_Impl, Button *, EMPTYARG )
+IMPL_LINK( SvxHyphenWordDialog_Impl, Right_Impl, Button *, EMPTYARG )
{
if( !bBusy )
{
bBusy = sal_True;
- SelRight();
+ SelRight_Impl();
bBusy = sal_False;
}
return 0;
}
-IMPL_LINK_INLINE_END( SvxHyphenWordDialog, Right_Impl, Button *, EMPTYARG )
-// -----------------------------------------------------------------------
-IMPL_LINK_INLINE_START( SvxHyphenWordDialog, GetFocusHdl_Impl, Edit *, EMPTYARG )
+IMPL_LINK( SvxHyphenWordDialog_Impl, GetFocusHdl_Impl, Edit *, EMPTYARG )
{
aWordEdit.SetSelection( Selection( nOldPos, nOldPos + 1 ) );
return 0;
}
-IMPL_LINK_INLINE_END( SvxHyphenWordDialog, GetFocusHdl_Impl, Edit *, EMPTYARG )
-// -----------------------------------------------------------------------
-IMPL_LINK( SvxHyphenWordDialog, LangError_Impl, void *, nLang )
+// class SvxHyphenWordDialog ---------------------------------------------
+
+SvxHyphenWordDialog::SvxHyphenWordDialog(
+ const String &rWord, LanguageType nLang,
+ Window* pParent,
+ uno::Reference< linguistic2::XHyphenator > &xHyphen,
+ SvxSpellWrapper* pWrapper ) :
+
+ SfxModalDialog( pParent, CUI_RES( RID_SVXDLG_HYPHENATE ) )
{
- // Status anzeigen
- String aErr( SvtLanguageTable::GetLanguageString( (LanguageType)(sal_IntPtr)nLang ) );
- aErr += CUI_RESSTR( RID_SVXSTR_HMERR_CHECKINSTALL );
- InfoBox( this, aErr ).Execute();
- return 0;
+ m_pImpl = std::auto_ptr< SvxHyphenWordDialog_Impl >(
+ new SvxHyphenWordDialog_Impl( this, rWord, nLang, xHyphen, pWrapper ) );
+
+ FreeResource();
+
+ SetWindowTitle( nLang );
+
+ // disable controls if service is not available
+ if (!m_pImpl->xHyphenator.is())
+ Enable( sal_False );
+}
+
+
+SvxHyphenWordDialog::~SvxHyphenWordDialog()
+{
+}
+
+
+void SvxHyphenWordDialog::SetWindowTitle( LanguageType nLang )
+{
+ String aLangStr( SvtLanguageTable::GetLanguageString( nLang ) );
+ String aTmp( m_pImpl->aLabel );
+ aTmp.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " (" ) );
+ aTmp.Append( aLangStr );
+ aTmp.Append( sal_Unicode( ')' ) );
+ SetText( aTmp );
+}
+
+
+void SvxHyphenWordDialog::SelLeft()
+{
+ m_pImpl->SelRight_Impl();
+}
+
+
+void SvxHyphenWordDialog::SelRight()
+{
+ m_pImpl->SelLeft_Impl();
}