From d8c36aa481da0e20f59ae4f5022627c96ca6e8b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= Date: Thu, 10 Feb 2011 11:57:18 +0100 Subject: [PATCH] fdo#34064: Fixed the dropdown list box form fields --- sw/source/core/text/portxt.cxx | 3 +- sw/source/filter/ww8/wrtww8.cxx | 14 ++- sw/source/ui/inc/view.hxx | 6 +- sw/source/ui/uiview/viewling.cxx | 157 ++++++++++++++----------------------- 4 files changed, 76 insertions(+), 104 deletions(-) diff --git a/sw/source/core/text/portxt.cxx b/sw/source/core/text/portxt.cxx index cd80a70..69389f3 100644 --- a/sw/source/core/text/portxt.cxx +++ b/sw/source/core/text/portxt.cxx @@ -833,8 +833,9 @@ void SwFieldFormPortion::Paint( const SwTxtPaintInfo& rInf ) const else if ( pBM->GetFieldname( ).equalsAscii( ODF_FORMDROPDOWN ) ) { // a list... rtl::OUString aTxt; + getCurrentListIndex( pBM, &aTxt ); rInf.DrawViewOpt( *this, POR_FLD ); - rInf.DrawText( aTxt, *this, 0, 0/*aTxt.getLength()*/, false ); + rInf.DrawText( aTxt, *this, 0, aTxt.getLength(), false ); } else { diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index f8b34bb..e29768b 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -3520,7 +3520,9 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) const ::sw::mark::ICheckboxFieldmark* pAsCheckbox = dynamic_cast< const ::sw::mark::ICheckboxFieldmark* >( pFieldmark ); - OSL_ENSURE(rFieldmark.GetFieldname().equalsAscii( ODF_FORMTEXT ) || rFieldmark.GetFieldname().equalsAscii( ODF_FORMDROPDOWN ) || rFieldmark.GetFieldname().equalsAscii( ODF_FORMCHECKBOX ), "Unknown field type!!!"); + OSL_ENSURE( rFieldmark.GetFieldname().equalsAscii( ODF_FORMTEXT ) || + rFieldmark.GetFieldname().equalsAscii( ODF_FORMDROPDOWN ) || + rFieldmark.GetFieldname().equalsAscii( ODF_FORMCHECKBOX ), "Unknown field type!!!"); if ( ! ( rFieldmark.GetFieldname().equalsAscii( ODF_FORMTEXT ) || rFieldmark.GetFieldname().equalsAscii( ODF_FORMDROPDOWN ) || rFieldmark.GetFieldname().equalsAscii( ODF_FORMCHECKBOX ) ) ) @@ -3572,7 +3574,7 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) ffres = 1; else if ( type == 2 ) { - ::sw::mark::IFieldmark::parameter_map_t::const_iterator pResParameter = rFieldmark.GetParameters()->find(::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN)); + ::sw::mark::IFieldmark::parameter_map_t::const_iterator pResParameter = rFieldmark.GetParameters()->find(::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN_RESULT)); if(pResParameter != rFieldmark.GetParameters()->end()) pResParameter->second >>= ffres; else @@ -3615,14 +3617,15 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) + sizeof(aFldData) + sizeof( aFldHeader.version ) + sizeof( aFldHeader.bits ) + sizeof( aFldHeader.cch ) + sizeof( aFldHeader.hps ) + 2*ffname.getLength() + 4 - + 2*ffdeftext.getLength() + 4 + 2*ffformat.getLength() + 4 + 2*ffhelptext.getLength() + 4 + 2*ffstattext.getLength() + 4 + 2*ffentrymcr.getLength() + 4 + 2*ffexitmcr.getLength() + 4; - if ( type ) + if ( type ) { slen += 2; // wDef + slen += 2*ffdeftext.getLength() + 4; //xstzTextDef + } if ( type==2 ) { slen += 2; // sttb ( fExtend ) slen += 4; // for num of list items @@ -3643,7 +3646,8 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) SwWW8Writer::WriteString_xstz( *pDataStrm, ffname, true ); // Form field name - SwWW8Writer::WriteString_xstz( *pDataStrm, ffdeftext, true ); + if ( !type ) + SwWW8Writer::WriteString_xstz( *pDataStrm, ffdeftext, true ); if ( type ) *pDataStrm << sal_uInt16(0); diff --git a/sw/source/ui/inc/view.hxx b/sw/source/ui/inc/view.hxx index eb788c5..e76f3d1 100644 --- a/sw/source/ui/inc/view.hxx +++ b/sw/source/ui/inc/view.hxx @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -246,6 +247,7 @@ class SW_DLLPUBLIC SwView: public SfxViewShell SwPostItMgr *mpPostItMgr; int nSelectionType; + FloatingWindow *mpFieldPopup; static const int MASTERENUMCOMMANDS = 6; @@ -307,6 +309,8 @@ class SW_DLLPUBLIC SwView: public SfxViewShell SW_DLLPRIVATE DECL_LINK( HtmlOptionsHdl, void * ); + SW_DLLPRIVATE DECL_LINK( FieldPopupModeEndHdl, FloatingWindow * ); + inline long GetXScroll() const; inline long GetYScroll() const; SW_DLLPRIVATE Point AlignToPixel(const Point& rPt) const; @@ -470,7 +474,7 @@ public: DECL_LINK( SpellError, LanguageType * ); BOOL ExecSpellPopup( const Point& rPt ); - BOOL ExecFieldPopup( const Point& rPt, sw::mark::IFieldmark *fieldBM ); + void ExecFieldPopup( const Point& rPt, sw::mark::IFieldmark *fieldBM ); // SMARTTAGS BOOL ExecSmartTagPopup( const Point& rPt ); diff --git a/sw/source/ui/uiview/viewling.cxx b/sw/source/ui/uiview/viewling.cxx index bcbcfa1..f688660 100644 --- a/sw/source/ui/uiview/viewling.cxx +++ b/sw/source/ui/uiview/viewling.cxx @@ -844,56 +844,32 @@ sal_Bool SwView::ExecSmartTagPopup( const Point& rPt ) return bRet; } -class SwFieldPopup : public PopupMenu -{ -public: - SwFieldPopup() { - InsertItem(1, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Hello"))); - } -}; - -class SwFieldListBox : public ListBox -{ -public: - SwFieldListBox(Window* pParent) : ListBox(pParent /*, WB_DROPDOWN*/) { - } - - void *GetImplWin() { - return NULL; //FIXME!!! -// return mpImplWin; - } - -protected: - virtual void LoseFocus() { -// printf("ListBox: lose focus!!\n"); - ListBox::LoseFocus(); - } - - virtual void Select() { -// printf("SELECT!!! IsTravelSelect=%i\n", IsTravelSelect()); - ListBox::Select(); - } -}; - -class SwFieldDialog : public Dialog +class SwFieldDialog : public FloatingWindow { private: - SwFieldListBox aListBox; - Edit aText; - int selection; + ListBox aListBox; + IFieldmark *pFieldmark; DECL_LINK( MyListBoxHandler, ListBox * ); public: - SwFieldDialog(Window* parent, IFieldmark *fieldBM) : Dialog(parent, WB_BORDER | WB_SYSTEMWINDOW | WB_NOSHADOW ), aListBox(this), aText(this, WB_RIGHT | WB_READONLY), selection(-1) { + SwFieldDialog( SwEditWin* parent, IFieldmark *fieldBM ); +}; - assert(fieldBM!=NULL); - if (fieldBM!=NULL) { +SwFieldDialog::SwFieldDialog( SwEditWin* parent, IFieldmark *fieldBM ) : + FloatingWindow( parent, WB_BORDER | WB_SYSTEMWINDOW ), + aListBox(this), + pFieldmark( fieldBM ) +{ + if ( fieldBM != NULL ) + { const IFieldmark::parameter_map_t* const pParameters = fieldBM->GetParameters(); - IFieldmark::parameter_map_t::const_iterator pListEntries = pParameters->find(::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN_LISTENTRY)); + + rtl::OUString sListKey = rtl::OUString::createFromAscii( ODF_FORMDROPDOWN_LISTENTRY ); + IFieldmark::parameter_map_t::const_iterator pListEntries = pParameters->find( sListKey ); if(pListEntries != pParameters->end()) { - Sequence< ::rtl::OUString> vListEntries; + Sequence< ::rtl::OUString > vListEntries; pListEntries->second >>= vListEntries; for( ::rtl::OUString* pCurrent = vListEntries.getArray(); pCurrent != vListEntries.getArray() + vListEntries.getLength(); @@ -902,82 +878,69 @@ public: aListBox.InsertEntry(*pCurrent); } } + + // Select the current one + rtl::OUString sResultKey = rtl::OUString::createFromAscii( ODF_FORMDROPDOWN_RESULT ); + IFieldmark::parameter_map_t::const_iterator pResult = pParameters->find( sResultKey ); + if ( pResult != pParameters->end() ) + { + sal_Int32 nSelection = -1; + pResult->second >>= nSelection; + aListBox.SelectEntryPos( nSelection ); + } + } + Size lbSize=aListBox.GetOptimalSize(WINDOWSIZE_PREFERRED); lbSize.Width()+=50; lbSize.Height()+=20; aListBox.SetSizePixel(lbSize); aListBox.SetSelectHdl( LINK( this, SwFieldDialog, MyListBoxHandler ) ); aListBox.Show(); - aText.SetText(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Cancel"))); - Size tSize=aText.GetOptimalSize(WINDOWSIZE_PREFERRED); - aText.SetSizePixel(Size(lbSize.Width(), tSize.Height())); - aText.SetPosPixel(Point(0, lbSize.Height())); - aText.Show(); - SetSizePixel(Size(lbSize.Width(), lbSize.Height()+tSize.Height())); -// SetSizePixel(Size(200, 200)); - } - int getSelection() { - return selection; - } -protected: - /* - virtual void LoseFocus() { - printf("lose focus!!\n"); - Dialog::LoseFocus(); - printf("close:\n"); - EndDialog(8); - } - */ - - virtual long PreNotify( NotifyEvent& rNEvt ) { - if (rNEvt.GetType() == EVENT_LOSEFOCUS && aListBox.GetImplWin()==rNEvt.GetWindow()) { - EndDialog(8); - return 1; - } - if (rNEvt.GetType() == EVENT_KEYINPUT) { -// printf("PreNotify::KEYINPUT\n"); - } - return Dialog::PreNotify(rNEvt); - } -}; + SetSizePixel( lbSize ); +} IMPL_LINK( SwFieldDialog, MyListBoxHandler, ListBox *, pBox ) { -// printf("### DROP DOWN SELECT... IsTravelSelect=%i\n", pBox->IsTravelSelect()); - if (pBox->IsTravelSelect()) { - return 0; - } else { - this->selection=pBox->GetSelectEntryPos(); - EndDialog(9); //@TODO have meaningfull returns... - return 1; + short res = 0; + if ( !pBox->IsTravelSelect() ) + { + sal_Int32 selection = pBox->GetSelectEntryPos(); + if ( selection >= 0 ) + { + rtl::OUString sKey = rtl::OUString::createFromAscii( ODF_FORMDROPDOWN_RESULT ); + (*pFieldmark->GetParameters())[ sKey ] = makeAny(selection); + pFieldmark->Invalidate(); + SwView& rView = ( ( SwEditWin* )GetParent() )->GetView(); + rView.GetDocShell()->SetModified( TRUE ); + } + + EndPopupMode(); + res = 1; } + return res; } -BOOL SwView::ExecFieldPopup( const Point& rPt, IFieldmark *fieldBM ) +IMPL_LINK( SwView, FieldPopupModeEndHdl, FloatingWindow*, EMPTYARG ) { - sal_Bool bRet = sal_False; - const sal_Bool bOldViewLock = pWrtShell->IsViewLocked(); - pWrtShell->LockView( sal_True ); - pWrtShell->Push(); + if ( mpFieldPopup ) + { + delete mpFieldPopup; + mpFieldPopup = NULL; + } + return 0; +} - bRet=sal_True; +void SwView::ExecFieldPopup( const Point& rPt, IFieldmark *fieldBM ) +{ const Point aPixPos = GetEditWin().LogicToPixel( rPt ); - SwFieldDialog aFldDlg(pEditWin, fieldBM); - aFldDlg.SetPosPixel(pEditWin->OutputToScreenPixel(aPixPos)); + mpFieldPopup = new SwFieldDialog( pEditWin, fieldBM ); + mpFieldPopup->SetPopupModeEndHdl( LINK( this, SwView, FieldPopupModeEndHdl ) ); - /*short ret=*/aFldDlg.Execute(); - sal_Int32 selection=aFldDlg.getSelection(); - if (selection>=0) { - (*fieldBM->GetParameters())[::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN_RESULT)] = makeAny(selection); - } - - pWrtShell->Pop( sal_False ); - pWrtShell->LockView( bOldViewLock ); - - return bRet; + Rectangle aRect( pEditWin->OutputToScreenPixel( aPixPos ), Size( 0, 0 ) ); + mpFieldPopup->StartPopupMode( aRect, FLOATWIN_POPUPMODE_DOWN|FLOATWIN_POPUPMODE_GRABFOCUS ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- 1.7.2.2