summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2013-07-25 14:47:01 +0100
committerFridrich Strba <fridrich@documentfoundation.org>2013-07-25 17:34:59 +0000
commitcf908fbf1119446000fe75c57f15d08046b8091d (patch)
tree2021474c239b0c238065db6474761356827af8f2
parentab79f3def7ce98d27e096e6b40203787dde2f3fb (diff)
Resolves: fdo#67113 split insert autotext and field controls
autotext is a modal dialog and insert field is a modeless dialog so I don't want autotext to show a toggle in insert->autotext At the same time we want the autotext entry in the insert toolbar to have a dropdown and we appear to want to be able to close the insert field dialog from the toolbar. So split the combined handler class into two and remove the other if/else branch in each with the insert field a SfxBoolItem and the insert autotext an SfxVoidItem. Change-Id: I3d59052ee70a00d63f7706166290b00ad9ae22c0 (cherry picked from commit bb98778dbf761a0c88c96117add00a66e5cc6c95) Reviewed-on: https://gerrit.libreoffice.org/5112 Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org> Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
-rw-r--r--sw/source/ui/app/swmodule.cxx2
-rw-r--r--sw/source/ui/inc/workctrl.hxx25
-rw-r--r--sw/source/ui/ribbar/workctrl.cxx256
3 files changed, 186 insertions, 97 deletions
diff --git a/sw/source/ui/app/swmodule.cxx b/sw/source/ui/app/swmodule.cxx
index fb53d186b249..b0465ca7672b 100644
--- a/sw/source/ui/app/swmodule.cxx
+++ b/sw/source/ui/app/swmodule.cxx
@@ -300,7 +300,7 @@ void SwDLL::RegisterControls()
SwTbxAnchor::RegisterControl(FN_TOOL_ANCHOR, pMod );
SwTbxInsertCtrl::RegisterControl(FN_INSERT_CTRL, pMod );
SwTbxInsertCtrl::RegisterControl(FN_INSERT_OBJ_CTRL, pMod );
- SwTbxAutoTextCtrl::RegisterControl(FN_INSERT_FIELD_CTRL, pMod );
+ SwTbxFieldCtrl::RegisterControl(FN_INSERT_FIELD_CTRL, pMod );
SwTbxAutoTextCtrl::RegisterControl(FN_GLOSSARY_DLG, pMod );
SvxTbxCtlCustomShapes::RegisterControl( SID_DRAWTBX_CS_BASIC, pMod );
diff --git a/sw/source/ui/inc/workctrl.hxx b/sw/source/ui/inc/workctrl.hxx
index 8dcd3188233f..1c7b231717fa 100644
--- a/sw/source/ui/inc/workctrl.hxx
+++ b/sw/source/ui/inc/workctrl.hxx
@@ -95,7 +95,7 @@ public:
SFX_DECL_TOOLBOX_CONTROL();
SwTbxAutoTextCtrl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx );
- ~SwTbxAutoTextCtrl();
+ virtual ~SwTbxAutoTextCtrl();
virtual SfxPopupWindowType GetPopupWindowType() const;
virtual SfxPopupWindow* CreatePopupWindow();
@@ -106,6 +106,29 @@ public:
DECL_LINK(PopupHdl, PopupMenu*);
};
+class SwTbxFieldCtrl : public SfxToolBoxControl
+{
+ PopupMenu* pPopup;
+ SwView* pView;
+
+
+ void DelPopup();
+public:
+ SFX_DECL_TOOLBOX_CONTROL();
+
+ SwTbxFieldCtrl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx );
+ virtual ~SwTbxFieldCtrl();
+
+ virtual SfxPopupWindowType GetPopupWindowType() const;
+ virtual SfxPopupWindow* CreatePopupWindow();
+ virtual void StateChanged( sal_uInt16 nSID,
+ SfxItemState eState,
+ const SfxPoolItem* pState );
+
+ DECL_LINK(PopupHdl, PopupMenu*);
+};
+
+
//----------------------------------------------------------------------------
//
diff --git a/sw/source/ui/ribbar/workctrl.cxx b/sw/source/ui/ribbar/workctrl.cxx
index 384db9907ec5..ccbc2bf11d84 100644
--- a/sw/source/ui/ribbar/workctrl.cxx
+++ b/sw/source/ui/ribbar/workctrl.cxx
@@ -57,7 +57,8 @@ using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::frame;
SFX_IMPL_TOOLBOX_CONTROL( SwTbxInsertCtrl, SfxImageItem);
-SFX_IMPL_TOOLBOX_CONTROL( SwTbxAutoTextCtrl, SfxBoolItem );
+SFX_IMPL_TOOLBOX_CONTROL( SwTbxAutoTextCtrl, SfxVoidItem );
+SFX_IMPL_TOOLBOX_CONTROL( SwTbxFieldCtrl, SfxBoolItem );
SwTbxInsertCtrl::SwTbxInsertCtrl(
sal_uInt16 nSlotId,
@@ -187,44 +188,30 @@ SfxPopupWindow* SwTbxAutoTextCtrl::CreatePopupWindow()
{
Link aLnk = LINK(this, SwTbxAutoTextCtrl, PopupHdl);
- if (GetSlotId() == FN_INSERT_FIELD_CTRL)
+ pPopup = new PopupMenu;
+ SwGlossaryList* pGlossaryList = ::GetGlossaryList();
+ sal_uInt16 nGroupCount = pGlossaryList->GetGroupCount();
+ for(sal_uInt16 i = 1; i <= nGroupCount; i++)
{
- pPopup = new PopupMenu(SW_RES(RID_INSERT_FIELD_CTRL));
- pPopup->SetSelectHdl(aLnk);
-
- if (::GetHtmlMode(pView->GetDocShell()) & HTMLMODE_ON)
- {
- pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_PGCOUNT));
- pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_TOPIC));
- }
- }
- else
- {
- pPopup = new PopupMenu;
- SwGlossaryList* pGlossaryList = ::GetGlossaryList();
- sal_uInt16 nGroupCount = pGlossaryList->GetGroupCount();
- for(sal_uInt16 i = 1; i <= nGroupCount; i++)
+ // Acquire group name with path extension
+ String sTitle;
+ pGlossaryList->GetGroupName(i - 1, sal_False, &sTitle);
+ sal_uInt16 nBlockCount = pGlossaryList->GetBlockCount(i -1);
+ if(nBlockCount)
{
- // Acquire group name with path extension
- String sTitle;
- pGlossaryList->GetGroupName(i - 1, sal_False, &sTitle);
- sal_uInt16 nBlockCount = pGlossaryList->GetBlockCount(i -1);
- if(nBlockCount)
+ sal_uInt16 nIndex = 100 * (i);
+ // but insert without extension
+ pPopup->InsertItem( i, sTitle);
+ PopupMenu* pSub = new PopupMenu;
+ pSub->SetSelectHdl(aLnk);
+ pPopup->SetPopupMenu(i, pSub);
+ for(sal_uInt16 j = 0; j < nBlockCount; j++)
{
- sal_uInt16 nIndex = 100 * (i);
- // but insert without extension
- pPopup->InsertItem( i, sTitle);
- PopupMenu* pSub = new PopupMenu;
- pSub->SetSelectHdl(aLnk);
- pPopup->SetPopupMenu(i, pSub);
- for(sal_uInt16 j = 0; j < nBlockCount; j++)
- {
- String sEntry;
- String sLongName(pGlossaryList->GetBlockName(i - 1, j, sEntry));
- sEntry.AppendAscii(" - ");
- sEntry += sLongName;
- pSub->InsertItem(++nIndex, sEntry);
- }
+ String sEntry;
+ String sLongName(pGlossaryList->GetBlockName(i - 1, j, sEntry));
+ sEntry.AppendAscii(" - ");
+ sEntry += sLongName;
+ pSub->InsertItem(++nIndex, sEntry);
}
}
}
@@ -250,91 +237,170 @@ SfxPopupWindowType SwTbxAutoTextCtrl::GetPopupWindowType() const
return SFX_POPUPWINDOW_ONTIMEOUT;
}
-void SwTbxAutoTextCtrl::StateChanged( sal_uInt16 nSID,
- SfxItemState eState,
+void SwTbxAutoTextCtrl::StateChanged( sal_uInt16,
+ SfxItemState,
const SfxPoolItem* pState )
{
GetToolBox().EnableItem( GetId(), (GetItemState(pState) != SFX_ITEM_DISABLED) );
- if(FN_INSERT_FIELD_CTRL == nSID && eState >= SFX_ITEM_DEFAULT)
- {
- GetToolBox().CheckItem( GetId(), ((SfxBoolItem*)pState)->GetValue() );
- }
}
IMPL_LINK(SwTbxAutoTextCtrl, PopupHdl, PopupMenu*, pMenu)
{
sal_uInt16 nId = pMenu->GetCurItemId();
- if ( GetSlotId() == FN_INSERT_FIELD_CTRL)
+ sal_uInt16 nBlock = nId / 100;
+
+ SwGlossaryList* pGlossaryList = ::GetGlossaryList();
+ String sShortName;
+ String sGroup = pGlossaryList->GetGroupName(nBlock - 1, false);
+ pGlossaryList->GetBlockName(nBlock - 1, nId - (100 * nBlock) - 1, sShortName);
+
+ SwGlossaryHdl* pGlosHdl = pView->GetGlosHdl();
+ SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
+ OSL_ENSURE(pFact, "Dialogdiet fail!");
+ ::GlossarySetActGroup fnSetActGroup = pFact->SetGlossaryActGroupFunc();
+ if ( fnSetActGroup )
+ (*fnSetActGroup)( sGroup );
+ pGlosHdl->SetCurGroup(sGroup, sal_True);
+ pGlosHdl->InsertGlossary(sShortName);
+
+ return 0;
+}
+
+void SwTbxAutoTextCtrl::DelPopup()
+{
+ if(pPopup)
{
- Sequence< PropertyValue > aArgs;
- const char* pChar = 0;
- switch(nId)
+ for( sal_uInt16 i = 0; i < pPopup->GetItemCount(); i ++ )
{
- case FN_INSERT_FLD_DATE:
- pChar = ".uno:InsertDateField";
- break;
- case FN_INSERT_FLD_TIME:
- pChar = ".uno:InsertTimeField";
- break;
- case FN_INSERT_FLD_PGNUMBER:
- pChar = ".uno:InsertPageNumberField";
- break;
- case FN_INSERT_FLD_PGCOUNT:
- pChar = ".uno:InsertPageCountField";
- break;
- case FN_INSERT_FLD_TOPIC:
- pChar = ".uno:InsertTopicField";
- break;
- case FN_INSERT_FLD_TITLE:
- pChar = ".uno:InsertTitleField";
- break;
- case FN_INSERT_FLD_AUTHOR:
- pChar = ".uno:InsertAuthorField";
- break;
- default:
- pChar = ".uno:InsertFieldCtrl";
+ PopupMenu* pSubPopup = pPopup->GetPopupMenu(pPopup->GetItemId(i));
+ delete pSubPopup;
}
- Dispatch( OUString::createFromAscii( pChar ),aArgs );
- }
- else
- {
- sal_uInt16 nBlock = nId / 100;
-
- SwGlossaryList* pGlossaryList = ::GetGlossaryList();
- String sShortName;
- String sGroup = pGlossaryList->GetGroupName(nBlock - 1, false);
- pGlossaryList->GetBlockName(nBlock - 1, nId - (100 * nBlock) - 1, sShortName);
-
- SwGlossaryHdl* pGlosHdl = pView->GetGlosHdl();
- SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
- OSL_ENSURE(pFact, "Dialogdiet fail!");
- ::GlossarySetActGroup fnSetActGroup = pFact->SetGlossaryActGroupFunc();
- if ( fnSetActGroup )
- (*fnSetActGroup)( sGroup );
- pGlosHdl->SetCurGroup(sGroup, sal_True);
- pGlosHdl->InsertGlossary(sShortName);
+ delete pPopup;
+ pPopup = 0;
}
- return 0;
}
-void SwTbxAutoTextCtrl::DelPopup()
+SwTbxFieldCtrl::SwTbxFieldCtrl(
+ sal_uInt16 nSlotId,
+ sal_uInt16 nId,
+ ToolBox& rTbx ) :
+ SfxToolBoxControl( nSlotId, nId, rTbx ),
+ pPopup(0),
+ pView(0)
{
- if(pPopup)
+ rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) );
+}
+
+SwTbxFieldCtrl::~SwTbxFieldCtrl()
+{
+ DelPopup();
+}
+
+SfxPopupWindow* SwTbxFieldCtrl::CreatePopupWindow()
+{
+ pView = ::GetActiveView();
+ if(pView && !pView->GetDocShell()->IsReadOnly() &&
+ !pView->GetWrtShell().HasReadonlySel() )
{
- if (GetSlotId() != FN_INSERT_FIELD_CTRL)
+ ToolBox& rBox = GetToolBox();
+
+ Rectangle aItemRect( rBox.GetItemRect( GetId() ) );
+ Point aPt(rBox.OutputToScreenPixel(aItemRect.TopLeft()));
+ aPt.X() += aItemRect.GetWidth()/2;
+ aPt.Y() += aItemRect.GetHeight()/2;
+ if(pView)
{
- for( sal_uInt16 i = 0; i < pPopup->GetItemCount(); i ++ )
+ Link aLnk = LINK(this, SwTbxFieldCtrl, PopupHdl);
+
+ pPopup = new PopupMenu(SW_RES(RID_INSERT_FIELD_CTRL));
+ pPopup->SetSelectHdl(aLnk);
+
+ if (::GetHtmlMode(pView->GetDocShell()) & HTMLMODE_ON)
{
- PopupMenu* pSubPopup = pPopup->GetPopupMenu(pPopup->GetItemId(i));
- delete pSubPopup;
+ pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_PGCOUNT));
+ pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_TOPIC));
}
}
+ ToolBox* pToolBox = &GetToolBox();
+ sal_uInt16 nId = GetId();
+ pToolBox->SetItemDown( nId, sal_True );
+
+ pPopup->Execute( pToolBox, pToolBox->GetItemRect( nId ),
+ (pToolBox->GetAlign() == WINDOWALIGN_TOP || pToolBox->GetAlign() == WINDOWALIGN_BOTTOM) ?
+ POPUPMENU_EXECUTE_DOWN : POPUPMENU_EXECUTE_RIGHT );
+
+ pToolBox->SetItemDown( nId, sal_False );
+ }
+ GetToolBox().EndSelection();
+ DelPopup();
+ return 0;
+
+}
+
+SfxPopupWindowType SwTbxFieldCtrl::GetPopupWindowType() const
+{
+ return SFX_POPUPWINDOW_ONTIMEOUT;
+}
+
+void SwTbxFieldCtrl::StateChanged( sal_uInt16,
+ SfxItemState eState,
+ const SfxPoolItem* pState )
+{
+ GetToolBox().EnableItem( GetId(), (GetItemState(pState) != SFX_ITEM_DISABLED) );
+ if (eState >= SFX_ITEM_DEFAULT)
+ {
+ GetToolBox().CheckItem( GetId(), ((SfxBoolItem*)pState)->GetValue() );
+ }
+}
+
+IMPL_LINK(SwTbxFieldCtrl, PopupHdl, PopupMenu*, pMenu)
+{
+ sal_uInt16 nId = pMenu->GetCurItemId();
+
+ Sequence< PropertyValue > aArgs;
+ const char* pChar = 0;
+ switch(nId)
+ {
+ case FN_INSERT_FLD_DATE:
+ pChar = ".uno:InsertDateField";
+ break;
+ case FN_INSERT_FLD_TIME:
+ pChar = ".uno:InsertTimeField";
+ break;
+ case FN_INSERT_FLD_PGNUMBER:
+ pChar = ".uno:InsertPageNumberField";
+ break;
+ case FN_INSERT_FLD_PGCOUNT:
+ pChar = ".uno:InsertPageCountField";
+ break;
+ case FN_INSERT_FLD_TOPIC:
+ pChar = ".uno:InsertTopicField";
+ break;
+ case FN_INSERT_FLD_TITLE:
+ pChar = ".uno:InsertTitleField";
+ break;
+ case FN_INSERT_FLD_AUTHOR:
+ pChar = ".uno:InsertAuthorField";
+ break;
+ default:
+ pChar = ".uno:InsertFieldCtrl";
+ }
+ Dispatch( OUString::createFromAscii( pChar ),aArgs );
+
+ return 0;
+}
+
+void SwTbxFieldCtrl::DelPopup()
+{
+ if(pPopup)
+ {
delete pPopup;
pPopup = 0;
}
}
+
// Navigation-Popup
// determine the order of the toolbox items
static sal_uInt16 aNavigationInsertIds[ NAVI_ENTRIES ] =