diff options
author | Henry Castro <hcastro@collabora.com> | 2015-01-29 23:47:00 -0400 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-05-12 09:55:27 +0000 |
commit | 2b5915da481990fd6ea272104215d82b6fbf5dbb (patch) | |
tree | c42170e613b056cf0a157230b6ed2d4febf3d91c /sc/source | |
parent | 4f2c8194f485b1527fb4f4dfe23ce804937f1f9c (diff) |
tdf#60573 Conditional formatting does not allow scrolling
If you need to apply conditional formatting to a cell not shown presently
on your screen you cannot scroll to the position you would like to use.
Change-Id: I18549316d2c725ce032a65cffb969bed21b771c3
Reviewed-on: https://gerrit.libreoffice.org/14258
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sc/source')
-rw-r--r-- | sc/source/ui/app/scdll.cxx | 1 | ||||
-rw-r--r-- | sc/source/ui/attrdlg/scdlgfact.cxx | 5 | ||||
-rw-r--r-- | sc/source/ui/attrdlg/scdlgfact.hxx | 2 | ||||
-rw-r--r-- | sc/source/ui/condformat/condformatdlg.cxx | 245 | ||||
-rw-r--r-- | sc/source/ui/condformat/condformatmgr.cxx | 70 | ||||
-rw-r--r-- | sc/source/ui/inc/condformatdlg.hxx | 25 | ||||
-rw-r--r-- | sc/source/ui/inc/condformatmgr.hxx | 2 | ||||
-rw-r--r-- | sc/source/ui/inc/reffact.hxx | 1 | ||||
-rw-r--r-- | sc/source/ui/view/cellsh1.cxx | 161 | ||||
-rw-r--r-- | sc/source/ui/view/reffact.cxx | 3 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwsh.cxx | 1 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwshc.cxx | 56 |
12 files changed, 433 insertions, 139 deletions
diff --git a/sc/source/ui/app/scdll.cxx b/sc/source/ui/app/scdll.cxx index 40765e0d25bd..384ae4c40bcb 100644 --- a/sc/source/ui/app/scdll.cxx +++ b/sc/source/ui/app/scdll.cxx @@ -278,6 +278,7 @@ void ScDLL::Init() ScValidityRefChildWin::RegisterChildWindow(false, pMod); sc::SearchResultsDlgWrapper::RegisterChildWindow(false, pMod); + ScCondFormatDlgWrapper::RegisterChildWindow(false, pMod); // EditEngine Field; insofar not already defined in OfficeApplication::Init SvClassManager& rClassManager = SvxFieldItem::GetClassManager(); diff --git a/sc/source/ui/attrdlg/scdlgfact.cxx b/sc/source/ui/attrdlg/scdlgfact.cxx index 0e142fdfdb31..5b9fb73097f9 100644 --- a/sc/source/ui/attrdlg/scdlgfact.cxx +++ b/sc/source/ui/attrdlg/scdlgfact.cxx @@ -429,6 +429,11 @@ bool AbstractScCondFormatManagerDlg_Impl::CondFormatsChanged() return pDlg->CondFormatsChanged(); } +ScConditionalFormat* AbstractScCondFormatManagerDlg_Impl::GetCondFormatSelected() +{ + return pDlg->GetCondFormatSelected(); +} + long AbstractScMetricInputDlg_Impl::GetInputValue( FieldUnit eUnit ) const { diff --git a/sc/source/ui/attrdlg/scdlgfact.hxx b/sc/source/ui/attrdlg/scdlgfact.hxx index 9f90132c0e34..99b9d8347268 100644 --- a/sc/source/ui/attrdlg/scdlgfact.hxx +++ b/sc/source/ui/attrdlg/scdlgfact.hxx @@ -131,6 +131,8 @@ class AbstractScCondFormatManagerDlg_Impl : public AbstractScCondFormatManagerDl virtual ScConditionalFormatList* GetConditionalFormatList() SAL_OVERRIDE; virtual bool CondFormatsChanged() SAL_OVERRIDE; + + virtual ScConditionalFormat* GetCondFormatSelected() SAL_OVERRIDE; }; class AbstractScDataPilotDatabaseDlg_Impl :public AbstractScDataPilotDatabaseDlg diff --git a/sc/source/ui/condformat/condformatdlg.cxx b/sc/source/ui/condformat/condformatdlg.cxx index 2fa4e20eae72..5154830acb9b 100644 --- a/sc/source/ui/condformat/condformatdlg.cxx +++ b/sc/source/ui/condformat/condformatdlg.cxx @@ -20,6 +20,7 @@ #include <vcl/msgbox.hxx> #include <vcl/settings.hxx> #include <vcl/builderfactory.hxx> +#include <libxml/tree.h> #include "anyrefdg.hxx" #include "document.hxx" @@ -413,19 +414,25 @@ IMPL_LINK_NOARG( ScCondFormatList, ScrollHdl ) return 0; } -//ScCondFormatDlg - -ScCondFormatDlg::ScCondFormatDlg(vcl::Window* pParent, ScDocument* pDoc, +// ------------------------------------------------------------------- +// Conditional Format Dialog +// +ScCondFormatDlg::ScCondFormatDlg(SfxBindings* pB, SfxChildWindow* pCW, + vcl::Window* pParent, ScViewData* pViewData, const ScConditionalFormat* pFormat, const ScRangeList& rRange, - const ScAddress& rPos, condformat::dialog::ScCondFormatDialogType eType) - : ScAnyRefModalDlg(pParent, "ConditionalFormatDialog", - "modules/scalc/ui/conditionalformatdialog.ui") + const ScAddress& rPos, condformat::dialog::ScCondFormatDialogType eType, + sal_Bool bManaged) + : ScAnyRefDlg(pB, pCW, pParent, "ConditionalFormatDialog", + "modules/scalc/ui/conditionalformatdialog.ui") + , mbManaged(bManaged) , maPos(rPos) - , mpDoc(pDoc) + , mpViewData(pViewData) , mpLastEdit(NULL) { + get(mpBtnOk, "ok"); get(mpBtnAdd, "add"); get(mpBtnRemove, "delete"); + get(mpBtnCancel, "cancel"); get(mpFtRange, "ftassign"); get(mpEdRange, "edassign"); @@ -434,24 +441,27 @@ ScCondFormatDlg::ScCondFormatDlg(vcl::Window* pParent, ScDocument* pDoc, get(mpRbRange, "rbassign"); mpRbRange->SetReferences(this, mpEdRange); + maKey = pFormat ? pFormat->GetKey() : 0; + get(mpCondFormList, "list"); - mpCondFormList->init(pDoc, this, pFormat, rRange, rPos, eType); + mpCondFormList->init(mpViewData->GetDocument(), this, pFormat, rRange, rPos, eType); OUStringBuffer aTitle( GetText() ); aTitle.append(" "); OUString aRangeString; - rRange.Format(aRangeString, SCA_VALID, pDoc, pDoc->GetAddressConvention()); + rRange.Format(aRangeString, SCA_VALID, pViewData->GetDocument(), + pViewData->GetDocument()->GetAddressConvention()); aTitle.append(aRangeString); SetText(aTitle.makeStringAndClear()); + mpBtnOk->SetClickHdl(LINK(this, ScCondFormatDlg, BtnPressedHdl ) ); mpBtnAdd->SetClickHdl( LINK( mpCondFormList, ScCondFormatList, AddBtnHdl ) ); mpBtnRemove->SetClickHdl( LINK( mpCondFormList, ScCondFormatList, RemoveBtnHdl ) ); + mpBtnCancel->SetClickHdl( LINK(this, ScCondFormatDlg, BtnPressedHdl ) ); mpEdRange->SetModifyHdl( LINK( this, ScCondFormatDlg, EdRangeModifyHdl ) ); mpEdRange->SetGetFocusHdl( LINK( this, ScCondFormatDlg, RangeGetFocusHdl ) ); mpEdRange->SetLoseFocusHdl( LINK( this, ScCondFormatDlg, RangeLoseFocusHdl ) ); mpEdRange->SetText(aRangeString); - - SC_MOD()->PushNewAnyRefDlg(this); } ScCondFormatDlg::~ScCondFormatDlg() @@ -461,16 +471,17 @@ ScCondFormatDlg::~ScCondFormatDlg() void ScCondFormatDlg::dispose() { - SC_MOD()->PopAnyRefDlg(); + mpBtnOk.clear(); mpBtnAdd.clear(); mpBtnRemove.clear(); + mpBtnCancel.clear(); mpFtRange.clear(); mpEdRange.clear(); mpRbRange.clear(); mpCondFormList.clear(); mpLastEdit.clear(); - ScAnyRefModalDlg::dispose(); + ScAnyRefDlg::dispose(); } void ScCondFormatDlg::SetActive() @@ -485,7 +496,7 @@ void ScCondFormatDlg::SetActive() void ScCondFormatDlg::RefInputDone( bool bForced ) { - ScAnyRefModalDlg::RefInputDone(bForced); + ScAnyRefDlg::RefInputDone(bForced); } bool ScCondFormatDlg::IsTableLocked() const @@ -524,7 +535,8 @@ void ScCondFormatDlg::SetReference(const ScRange& rRef, ScDocument*) else n = ABS_DREF; - OUString aRefStr(rRef.Format(n, mpDoc, ScAddress::Details(mpDoc->GetAddressConvention(), 0, 0))); + OUString aRefStr(rRef.Format(n, mpViewData->GetDocument(), + ScAddress::Details(mpViewData->GetDocument()->GetAddressConvention(), 0, 0))); pEdit->SetRefString( aRefStr ); } } @@ -536,7 +548,8 @@ ScConditionalFormat* ScCondFormatDlg::GetConditionalFormat() const return NULL; ScRangeList aRange; - sal_uInt16 nFlags = aRange.Parse(aRangeStr, mpDoc, SCA_VALID, mpDoc->GetAddressConvention(), maPos.Tab()); + sal_uInt16 nFlags = aRange.Parse(aRangeStr, mpViewData->GetDocument(), + SCA_VALID, mpViewData->GetDocument()->GetAddressConvention(), maPos.Tab()); ScConditionalFormat* pFormat = mpCondFormList->GetConditionalFormat(); if(nFlags & SCA_VALID && !aRange.empty() && pFormat) @@ -555,11 +568,197 @@ void ScCondFormatDlg::InvalidateRefData() mpLastEdit = NULL; } +// ------------------------------------------------------------- +// Close the Conditional Format Dialog +// +bool ScCondFormatDlg::Close() +{ + return DoClose( ScCondFormatDlgWrapper::GetChildWindowId() ); +} + +// ------------------------------------------------------------------------ +// Occurs when the Conditional Format Dialog the OK button is pressed. +// +void ScCondFormatDlg::OkPressed() +{ + ScConditionalFormat* pFormat = GetConditionalFormat(); + + if(pFormat) + mpViewData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat(maKey, + pFormat, maPos.Tab(), pFormat->GetRange()); + else + mpViewData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat(maKey, + NULL, maPos.Tab(), ScRangeList()); + + if ( mbManaged ) + { + SetDispatcherLock( false ); + // Queue message to open Conditional Format Manager Dialog + GetBindings().GetDispatcher()->Execute( SID_OPENDLG_CONDFRMT_MANAGER, + SfxCallMode::ASYNCHRON ); + } + Close(); +} + +// ------------------------------------------------------------------------ +// Occurs when the Conditional Format Dialog is cancelled. +// +void ScCondFormatDlg::CancelPressed() +{ + if ( mbManaged ) + { + SetDispatcherLock( false ); + // Queue message to open Conditional Format Manager Dialog + GetBindings().GetDispatcher()->Execute( SID_OPENDLG_CONDFRMT_MANAGER, + SfxCallMode::ASYNCHRON ); + } + Close(); +} + +// ------------------------------------------------------------------------------ +// Parse xml string parameters used to initialize the Conditional Format Dialog +// when it is created. +// +bool ScCondFormatDlg::ParseXmlString(const OUString& sXMLString, + sal_uInt32& nIndex, + sal_uInt8& nType, + bool& bManaged) +{ + bool bRetVal = false; + OString sTagName; + OUString sTagValue; + + xmlNodePtr pXmlRoot = NULL; + xmlNodePtr pXmlNode = NULL; + + OString sOString = OUStringToOString( sXMLString, RTL_TEXTENCODING_UTF8 ); + xmlDocPtr pXmlDoc = xmlParseMemory(sOString.getStr(), sOString.getLength()); + + if( pXmlDoc ) + { + bRetVal = true; + pXmlRoot = xmlDocGetRootElement( pXmlDoc ); + pXmlNode = pXmlRoot->children; + + while (pXmlNode != NULL && bRetVal) + { + sTagName = OUStringToOString(OUString("Index"), RTL_TEXTENCODING_UTF8); + if (xmlStrcmp(pXmlNode->name, reinterpret_cast<xmlChar const *>(sTagName.getStr())) == 0) + { + if (pXmlNode->children != NULL && pXmlNode->children->type == XML_TEXT_NODE) + { + sTagValue = OUString(reinterpret_cast<char*>(pXmlNode->children->content), + strlen(reinterpret_cast<char*>(pXmlNode->children->content)), + RTL_TEXTENCODING_UTF8); + nIndex = sTagValue.toUInt32(); + pXmlNode = pXmlNode->next; + continue; + } + } + + sTagName = OUStringToOString(OUString("Type"), RTL_TEXTENCODING_UTF8); + if (xmlStrcmp(pXmlNode->name, reinterpret_cast<xmlChar const *>(sTagName.getStr())) == 0) + { + if (pXmlNode->children != NULL && pXmlNode->children->type == XML_TEXT_NODE) + { + sTagValue = OUString(reinterpret_cast<char*>(pXmlNode->children->content), + strlen(reinterpret_cast<char*>(pXmlNode->children->content)), + RTL_TEXTENCODING_UTF8); + nType = sTagValue.toUInt32(); + pXmlNode = pXmlNode->next; + continue; + } + } + + sTagName = OUStringToOString(OUString("Managed"), RTL_TEXTENCODING_UTF8); + if (xmlStrcmp(pXmlNode->name, reinterpret_cast<xmlChar const *>(sTagName.getStr())) == 0) + { + if (pXmlNode->children != NULL && pXmlNode->children->type == XML_TEXT_NODE) + { + sTagValue = OUString(reinterpret_cast<char*>(pXmlNode->children->content), + strlen(reinterpret_cast<char*>(pXmlNode->children->content)), + RTL_TEXTENCODING_UTF8); + bManaged = sTagValue.toBoolean(); + pXmlNode = pXmlNode->next; + continue; + } + } + bRetVal = false; + } + } + + xmlFreeDoc(pXmlDoc); + return bRetVal; +} + +// --------------------------------------------------------------------------------------- +// Generate xml string parameters used to initialize the Conditional Format Dialog +// when it is created. +// +OUString ScCondFormatDlg::GenerateXmlString(sal_uInt32 nIndex, sal_uInt8 nType, bool bManaged) +{ + OUString sReturn; + sal_Int32 nSize = 0; + + OString sTagName; + OString sTagValue; + + xmlNodePtr pXmlRoot = NULL; + xmlNodePtr pXmlNode = NULL; + + xmlChar* pBuffer = NULL; + const xmlChar* pTagName = NULL; + const xmlChar* pTagValue = NULL; + + xmlDocPtr pXmlDoc = xmlNewDoc(reinterpret_cast<const xmlChar*>("1.0")); + + sTagName = OUStringToOString(OUString("ScCondFormatDlg"), RTL_TEXTENCODING_UTF8); + pTagName = reinterpret_cast<const xmlChar*>(sTagName.getStr()); + pXmlRoot = xmlNewDocNode(pXmlDoc, NULL, pTagName, NULL); + + xmlDocSetRootElement(pXmlDoc, pXmlRoot); + + sTagName = OUStringToOString(OUString("Index"), RTL_TEXTENCODING_UTF8); + sTagValue = OUStringToOString(OUString::number(nIndex), RTL_TEXTENCODING_UTF8); + pTagName = reinterpret_cast<const xmlChar*>(sTagName.getStr()); + pTagValue = reinterpret_cast<const xmlChar*>(sTagValue.getStr()); + pXmlNode = xmlNewDocNode(pXmlDoc, NULL, pTagName, pTagValue); + + xmlAddChild(pXmlRoot, pXmlNode); + + sTagName = OUStringToOString(OUString("Type"), RTL_TEXTENCODING_UTF8); + sTagValue = OUStringToOString(OUString::number(nType), RTL_TEXTENCODING_UTF8); + pTagName = reinterpret_cast<const xmlChar*>(sTagName.getStr()); + pTagValue = reinterpret_cast<const xmlChar*>(sTagValue.getStr()); + pXmlNode = xmlNewDocNode(pXmlDoc, NULL, pTagName, pTagValue); + + xmlAddChild(pXmlRoot, pXmlNode); + + sTagName = OUStringToOString(OUString("Managed"), RTL_TEXTENCODING_UTF8); + sTagValue = OUStringToOString(OUString::boolean(bManaged), RTL_TEXTENCODING_UTF8); + pTagName = reinterpret_cast<const xmlChar*>(sTagName.getStr()); + pTagValue = reinterpret_cast<const xmlChar*>(sTagValue.getStr()); + pXmlNode = xmlNewDocNode(pXmlDoc, NULL, pTagName, pTagValue); + + xmlAddChild(pXmlRoot, pXmlNode); + + xmlDocDumpMemory(pXmlDoc, &pBuffer, (int*)&nSize); + + sReturn = OUString(reinterpret_cast<char const *>(pBuffer), nSize, RTL_TEXTENCODING_UTF8); + + xmlFree(pBuffer); + xmlFreeDoc(pXmlDoc); + + return sReturn; +} + + IMPL_LINK( ScCondFormatDlg, EdRangeModifyHdl, Edit*, pEdit ) { OUString aRangeStr = pEdit->GetText(); ScRangeList aRange; - sal_uInt16 nFlags = aRange.Parse(aRangeStr, mpDoc, SCA_VALID, mpDoc->GetAddressConvention()); + sal_uInt16 nFlags = aRange.Parse(aRangeStr, mpViewData->GetDocument(), + SCA_VALID, mpViewData->GetDocument()->GetAddressConvention()); if(nFlags & SCA_VALID) pEdit->SetControlBackground(GetSettings().GetStyleSettings().GetWindowColor()); else @@ -579,4 +778,16 @@ IMPL_STATIC_LINK_NOARG( ScCondFormatDlg, RangeLoseFocusHdl ) return 0; } +// ------------------------------------------------------ +// Conditional Format Dialog button click event handler. +// +IMPL_LINK( ScCondFormatDlg, BtnPressedHdl, Button*, pBtn) +{ + if (pBtn == mpBtnOk) + OkPressed(); + else if (pBtn == mpBtnCancel) + CancelPressed(); + return 0; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/condformat/condformatmgr.cxx b/sc/source/ui/condformat/condformatmgr.cxx index f018fce02b07..b7f3dce512a2 100644 --- a/sc/source/ui/condformat/condformatmgr.cxx +++ b/sc/source/ui/condformat/condformatmgr.cxx @@ -154,6 +154,14 @@ ScConditionalFormatList* ScCondFormatManagerDlg::GetConditionalFormatList() return pList; } +// --------------------------------------------------------------- +// Get the current conditional format selected. +// +ScConditionalFormat* ScCondFormatManagerDlg::GetCondFormatSelected() +{ + return m_pCtrlManager->GetSelection(); +} + IMPL_LINK_NOARG(ScCondFormatManagerDlg, RemoveBtnHdl) { m_pCtrlManager->DeleteSelection(); @@ -168,72 +176,14 @@ IMPL_LINK_NOARG(ScCondFormatManagerDlg, EditBtnHdl) if(!pFormat) return 0; - sal_uInt16 nId = 1; - ScModule* pScMod = SC_MOD(); - pScMod->SetRefDialog( nId, true ); - VclPtrInstance<ScCondFormatDlg> pDlg(this, mpDoc, pFormat, pFormat->GetRange(), - pFormat->GetRange().GetTopLeftCorner(), condformat::dialog::NONE); - Show(false, 0); - if(pDlg->Execute() == RET_OK) - { - sal_Int32 nKey = pFormat->GetKey(); - mpFormatList->erase(nKey); - ScConditionalFormat* pNewFormat = pDlg->GetConditionalFormat(); - if(pNewFormat) - { - pNewFormat->SetKey(nKey); - mpFormatList->InsertNew(pNewFormat); - } - - m_pCtrlManager->Update(); - mbModified = true; - } - Show(true, 0); - - pScMod->SetRefDialog( nId, false ); + EndDialog( DLG_RET_EDIT ); return 0; } -namespace { - -sal_uInt32 FindKey(ScConditionalFormatList* pFormatList) -{ - sal_uInt32 nKey = 0; - for(ScConditionalFormatList::const_iterator itr = pFormatList->begin(), itrEnd = pFormatList->end(); - itr != itrEnd; ++itr) - { - if(itr->GetKey() > nKey) - nKey = itr->GetKey(); - } - - return nKey + 1; -} - -} - IMPL_LINK_NOARG(ScCondFormatManagerDlg, AddBtnHdl) { - sal_uInt16 nId = 1; - ScModule* pScMod = SC_MOD(); - pScMod->SetRefDialog( nId, true ); - VclPtrInstance<ScCondFormatDlg> pDlg(this, mpDoc, nullptr, ScRangeList(), - maPos, condformat::dialog::CONDITION); - Show(false, 0); - if(pDlg->Execute() == RET_OK) - { - ScConditionalFormat* pNewFormat = pDlg->GetConditionalFormat(); - if(pNewFormat) - { - mpFormatList->InsertNew(pNewFormat); - pNewFormat->SetKey(FindKey(mpFormatList)); - m_pCtrlManager->Update(); - - mbModified = true; - } - } - Show(true, 0); - pScMod->SetRefDialog( nId, false ); + EndDialog( DLG_RET_ADD ); return 0; } diff --git a/sc/source/ui/inc/condformatdlg.hxx b/sc/source/ui/inc/condformatdlg.hxx index 603686122756..676dc4e975d5 100644 --- a/sc/source/ui/inc/condformatdlg.hxx +++ b/sc/source/ui/inc/condformatdlg.hxx @@ -21,9 +21,13 @@ #include "rangelst.hxx" #include "condformathelper.hxx" +#include "viewdata.hxx" #include "anyrefdg.hxx" +#define DLG_RET_ADD 8 +#define DLG_RET_EDIT 16 + class ScDocument; class ScConditionalFormat; class ScFormatEntry; @@ -92,19 +96,23 @@ public: DECL_LINK( ColFormatTypeHdl, ListBox*); }; -class ScCondFormatDlg : public ScAnyRefModalDlg +class ScCondFormatDlg : public ScAnyRefDlg { private: + VclPtr<PushButton> mpBtnOk; VclPtr<PushButton> mpBtnAdd; VclPtr<PushButton> mpBtnRemove; + VclPtr<PushButton> mpBtnCancel; VclPtr<FixedText> mpFtRange; VclPtr<formula::RefEdit> mpEdRange; VclPtr<formula::RefButton> mpRbRange; VclPtr<ScCondFormatList> mpCondFormList; + sal_Int32 maKey; + sal_Bool mbManaged; ScAddress maPos; - ScDocument* mpDoc; + ScViewData* mpViewData; VclPtr<formula::RefEdit> mpLastEdit; @@ -112,22 +120,31 @@ private: protected: virtual void RefInputDone( bool bForced = false ) SAL_OVERRIDE; + void OkPressed(); + void CancelPressed(); public: - SC_DLLPUBLIC ScCondFormatDlg(vcl::Window* pWindow, ScDocument* pDoc, const ScConditionalFormat* pFormat, - const ScRangeList& rRange, const ScAddress& rPos, condformat::dialog::ScCondFormatDialogType eType); + SC_DLLPUBLIC ScCondFormatDlg(SfxBindings* pB, SfxChildWindow* pCW, vcl::Window* pWindow, + ScViewData* pViewData, const ScConditionalFormat* pFormat, + const ScRangeList& rRange, const ScAddress& rPos, + condformat::dialog::ScCondFormatDialogType eType, sal_Bool bManaged); virtual ~ScCondFormatDlg(); virtual void dispose() SAL_OVERRIDE; SC_DLLPUBLIC ScConditionalFormat* GetConditionalFormat() const; + static OUString GenerateXmlString(sal_uInt32 nIndex, sal_uInt8 nType, bool bManaged); + static bool ParseXmlString(const OUString& sXMLString, sal_uInt32& nIndex, + sal_uInt8& nType, bool& bManaged); virtual void SetReference(const ScRange&, ScDocument*) SAL_OVERRIDE; virtual bool IsRefInputMode() const SAL_OVERRIDE; virtual void SetActive() SAL_OVERRIDE; virtual bool IsTableLocked() const SAL_OVERRIDE; + virtual bool Close() SAL_OVERRIDE; void InvalidateRefData(); + DECL_LINK( BtnPressedHdl, Button* ); DECL_LINK( RangeGetFocusHdl, formula::RefEdit* ); DECL_STATIC_LINK( ScCondFormatDlg, RangeLoseFocusHdl, void* ); }; diff --git a/sc/source/ui/inc/condformatmgr.hxx b/sc/source/ui/inc/condformatmgr.hxx index 1d339884e19a..76e26fd34202 100644 --- a/sc/source/ui/inc/condformatmgr.hxx +++ b/sc/source/ui/inc/condformatmgr.hxx @@ -56,6 +56,8 @@ public: bool CondFormatsChanged() { return mbModified;} + ScConditionalFormat* GetCondFormatSelected(); + private: VclPtr<PushButton> m_pBtnAdd; VclPtr<PushButton> m_pBtnRemove; diff --git a/sc/source/ui/inc/reffact.hxx b/sc/source/ui/inc/reffact.hxx index 6d12f0ed4246..4dee934aa8fc 100644 --- a/sc/source/ui/inc/reffact.hxx +++ b/sc/source/ui/inc/reffact.hxx @@ -50,6 +50,7 @@ DECL_WRAPPER_WITHID(ScPrintAreasDlgWrapper) DECL_WRAPPER_WITHID(ScColRowNameRangesDlgWrapper) DECL_WRAPPER_WITHID(ScFormulaDlgWrapper) DECL_WRAPPER_WITHID(ScHighlightChgDlgWrapper) +DECL_WRAPPER_WITHID(ScCondFormatDlgWrapper) class ScDescriptiveStatisticsDialogWrapper : public ChildWindowWrapper<SID_DESCRIPTIVE_STATISTICS_DIALOG> diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx index 518410b7dd41..7bb562b33b29 100644 --- a/sc/source/ui/view/cellsh1.cxx +++ b/sc/source/ui/view/cellsh1.cxx @@ -1909,6 +1909,35 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) case SID_OPENDLG_ICONSET: case SID_OPENDLG_CONDDATE: { + sal_uInt32 nIndex = sal_uInt32(-1); + sal_uInt8 nType = 0; + bool bManaged = false; + + // Get the pool item stored it by Conditional Format Manager Dialog. + const SfxPoolItem* pItem = NULL; + sal_uInt32 nItems(pTabViewShell->GetPool().GetItemCount2( SCITEM_STRING )); + for( sal_uInt32 nIter = 0; nIter < nItems; ++nIter ) + { + if( NULL != (pItem = pTabViewShell->GetPool().GetItem2( SCITEM_STRING, nIter ) ) ) + { + if ( ScCondFormatDlg::ParseXmlString( + static_cast<const SfxStringItem*>(pItem)->GetValue(), + nIndex, nType, bManaged)) + break; + } + } + + // Check if the Conditional Manager Dialog is editing or adding + // conditional format item. + if ( bManaged ) + { + sal_uInt16 nId = ScCondFormatDlgWrapper::GetChildWindowId(); + SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); + SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); + + pScMod->SetRefDialog( nId, pWnd ? false : sal_True ); + break; + } ScRangeList aRangeList; ScViewData* pData = GetViewData(); @@ -1928,11 +1957,11 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) aRangeList.push_back(pRange); } - sal_Int32 nKey = 0; + const ScConditionalFormat* pCondFormat = NULL; const ScPatternAttr* pPattern = pDoc->GetPattern(aPos.Col(), aPos.Row(), aPos.Tab()); const std::vector<sal_uInt32>& rCondFormats = static_cast<const ScCondFormatItem&>(pPattern->GetItem(ATTR_CONDITIONAL)).GetCondFormatData(); bool bContainsCondFormat = !rCondFormats.empty(); - ScopedVclPtr<ScCondFormatDlg> pCondFormatDlg; + bool bCondFormatDlg = false; if(bContainsCondFormat) { bool bContainsExistingCondFormat = false; @@ -1941,7 +1970,7 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) itr != itrEnd; ++itr) { // check if at least one existing conditional format has the same range - const ScConditionalFormat* pCondFormat = pList->GetFormat(*itr); + pCondFormat = pList->GetFormat(*itr); if(!pCondFormat) continue; @@ -1950,16 +1979,14 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) if(rCondFormatRange == aRangeList) { // found a matching range, edit this conditional format - nKey = pCondFormat->GetKey(); - pCondFormatDlg.reset( VclPtr<ScCondFormatDlg>::Create( pTabViewShell->GetDialogParent(), pDoc, pCondFormat, rCondFormatRange, aPos, condformat::dialog::NONE ) ); + bCondFormatDlg = true; break; } } // if not found a conditional format ask whether we should edit one of the existing // or should create a new overlapping conditional format - - if(!pCondFormatDlg && bContainsExistingCondFormat) + if(!bCondFormatDlg && bContainsExistingCondFormat) { ScopedVclPtrInstance<QueryBox> aBox( pTabViewShell->GetDialogParent(), WinBits( WB_YES_NO | WB_DEF_YES ), ScGlobal::GetRscString(STR_EDIT_EXISTING_COND_FORMATS) ); @@ -1972,22 +1999,14 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) // otherwise open the manage cond format dlg if(rCondFormats.size() == 1) { - const ScConditionalFormat* pCondFormat = pList->GetFormat(rCondFormats[0]); + pCondFormat = pList->GetFormat(rCondFormats[0]); assert(pCondFormat); - const ScRangeList& rCondFormatRange = pCondFormat->GetRange(); - nKey = pCondFormat->GetKey(); - pCondFormatDlg.reset( VclPtr<ScCondFormatDlg>::Create( pTabViewShell->GetDialogParent(), pDoc, pCondFormat, rCondFormatRange, aPos, condformat::dialog::NONE ) ); + bCondFormatDlg = true; } else { - ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); - boost::scoped_ptr<AbstractScCondFormatManagerDlg> pDlg(pFact->CreateScCondFormatMgrDlg( pTabViewShell->GetDialogParent(), pDoc, pList, aPos, RID_SCDLG_COND_FORMAT_MANAGER)); - if(pDlg->Execute() == RET_OK && pDlg->CondFormatsChanged()) - { - ScConditionalFormatList* pCondFormatList = pDlg->GetConditionalFormatList(); - pData->GetDocShell()->GetDocFunc().SetConditionalFormatList(pCondFormatList, aPos.Tab()); - } - // we need step out here because we don't want to open the normal dialog + // Queue message to open Conditional Format Manager Dialog. + GetViewData()->GetDispatcher().Execute( SID_OPENDLG_CONDFRMT_MANAGER, SfxCallMode::ASYNCHRON ); break; } } @@ -1996,51 +2015,50 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) // define an overlapping conditional format // does not need to be handled here } - } } - if(!pCondFormatDlg) + condformat::dialog::ScCondFormatDialogType eType = condformat::dialog::NONE; + switch(nSlot) { - condformat::dialog::ScCondFormatDialogType eType = condformat::dialog::NONE; - switch(nSlot) - { - case SID_OPENDLG_CONDFRMT: - eType = condformat::dialog::CONDITION; - break; - case SID_OPENDLG_COLORSCALE: - eType = condformat::dialog::COLORSCALE; - break; - case SID_OPENDLG_DATABAR: - eType = condformat::dialog::DATABAR; - break; - case SID_OPENDLG_ICONSET: - eType = condformat::dialog::ICONSET; - break; - case SID_OPENDLG_CONDDATE: - eType = condformat::dialog::DATE; - break; - default: - assert(false); - break; - } - pCondFormatDlg.reset( VclPtr<ScCondFormatDlg>::Create( pTabViewShell->GetDialogParent(), pDoc, nullptr, aRangeList, aRangeList.GetTopLeftCorner(), eType ) ); + case SID_OPENDLG_CONDFRMT: + eType = condformat::dialog::CONDITION; + break; + case SID_OPENDLG_COLORSCALE: + eType = condformat::dialog::COLORSCALE; + break; + case SID_OPENDLG_DATABAR: + eType = condformat::dialog::DATABAR; + break; + case SID_OPENDLG_ICONSET: + eType = condformat::dialog::ICONSET; + break; + case SID_OPENDLG_CONDDATE: + eType = condformat::dialog::DATE; + break; + default: + assert(false); + break; } - sal_uInt16 nId = 1; - pScMod->SetRefDialog( nId, true ); - if( pCondFormatDlg->Execute() == RET_OK ) + if(bCondFormatDlg || !bContainsCondFormat) { - ScConditionalFormat* pFormat = pCondFormatDlg->GetConditionalFormat(); - if(pFormat) - pData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat(nKey, pFormat, aPos.Tab(), pFormat->GetRange()); - else - pData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat(nKey, NULL, aPos.Tab(), ScRangeList()); - } + // Put the xml string parameter to initialize the + // Conditional Format Dialog. + pTabViewShell->GetPool().Put( SfxStringItem( SCITEM_STRING, + ScCondFormatDlg::GenerateXmlString( + pCondFormat ? pCondFormat->GetKey() : sal_uInt32(-1), + sal_uInt8(eType), + false + ) ) ); - pScMod->SetRefDialog( nId, false ); + sal_uInt16 nId = ScCondFormatDlgWrapper::GetChildWindowId(); + SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); + SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); + pScMod->SetRefDialog( nId, pWnd ? false : sal_True ); + } } break; @@ -2396,12 +2414,43 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) ScAddress aPos(pData->GetCurX(), pData->GetCurY(), pData->GetTabNo()); ScConditionalFormatList* pList = pDoc->GetCondFormList( aPos.Tab() ); - boost::scoped_ptr<AbstractScCondFormatManagerDlg> pDlg(pFact->CreateScCondFormatMgrDlg( pTabViewShell->GetDialogParent(), pDoc, pList, aPos, RID_SCDLG_COND_FORMAT_MANAGER)); - if(pDlg->Execute() == RET_OK && pDlg->CondFormatsChanged()) + boost::scoped_ptr<AbstractScCondFormatManagerDlg> pDlg(pFact->CreateScCondFormatMgrDlg( + pTabViewShell->GetDialogParent(), pDoc, pList, aPos, RID_SCDLG_COND_FORMAT_MANAGER)); + short nRet = pDlg->Execute(); + if(nRet == RET_OK && pDlg->CondFormatsChanged()) { ScConditionalFormatList* pCondFormatList = pDlg->GetConditionalFormatList(); pData->GetDocShell()->GetDocFunc().SetConditionalFormatList(pCondFormatList, aPos.Tab()); } + else if(nRet == DLG_RET_ADD) + { + // Put the xml string parameter to initialize the + // Conditional Format Dialog. ( add new ) + pTabViewShell->GetPool().Put( SfxStringItem( SCITEM_STRING, + ScCondFormatDlg::GenerateXmlString( + sal_uInt32(-1), + sal_uInt8(condformat::dialog::ScCondFormatDialogType::CONDITION), + true + ) ) ); + + // Queue message to open Conditional Format Dialog + GetViewData()->GetDispatcher().Execute( SID_OPENDLG_CONDFRMT, SfxCallMode::ASYNCHRON ); + } + else if (nRet == DLG_RET_EDIT) + { + ScConditionalFormat* pFormat = pDlg->GetCondFormatSelected(); + // Put the xml string parameter to initialize the + // Conditional Format Dialog. ( edit selected conditional format ) + pTabViewShell->GetPool().Put( SfxStringItem( SCITEM_STRING, + ScCondFormatDlg::GenerateXmlString( + pFormat ? pFormat->GetKey() : sal_uInt32(-1), + sal_uInt8(condformat::dialog::ScCondFormatDialogType::CONDITION), + true + ) ) ); + + // Queue message to open Conditional Format Dialog + GetViewData()->GetDispatcher().Execute( SID_OPENDLG_CONDFRMT, SfxCallMode::ASYNCHRON ); + } } break; diff --git a/sc/source/ui/view/reffact.cxx b/sc/source/ui/view/reffact.cxx index b05db95f2c0d..75c69b1aea16 100644 --- a/sc/source/ui/view/reffact.cxx +++ b/sc/source/ui/view/reffact.cxx @@ -48,6 +48,7 @@ SFX_IMPL_MODELESSDIALOG_WITHID(ScFormulaDlgWrapper, SID_OPENDLG_FUNCTION ) SFX_IMPL_MODELESSDIALOG_WITHID(ScAcceptChgDlgWrapper, FID_CHG_ACCEPT ) SFX_IMPL_MODELESSDIALOG_WITHID(ScHighlightChgDlgWrapper, FID_CHG_SHOW ) SFX_IMPL_MODELESSDIALOG_WITHID(ScSimpleRefDlgWrapper, WID_SIMPLE_REF ) +SFX_IMPL_MODELESSDIALOG_WITHID(ScCondFormatDlgWrapper, WID_CONDFRMT_REF ) SFX_IMPL_CHILDWINDOW_WITHID(ScValidityRefChildWin, SID_VALIDITY_REFERENCE) @@ -309,4 +310,6 @@ ScValidityRefChildWin::~ScValidityRefChildWin() pWindow = NULL; } +IMPL_CHILD_CTOR( ScCondFormatDlgWrapper, WID_CONDFRMT_REF ) + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/view/tabvwsh.cxx b/sc/source/ui/view/tabvwsh.cxx index 95b3903cf257..632757d04845 100644 --- a/sc/source/ui/view/tabvwsh.cxx +++ b/sc/source/ui/view/tabvwsh.cxx @@ -100,6 +100,7 @@ void ScTabViewShell::InitInterface_Impl() GetStaticInterface()->RegisterChildWindow(ScFTestDialogWrapper::GetChildWindowId()); GetStaticInterface()->RegisterChildWindow(ScZTestDialogWrapper::GetChildWindowId()); GetStaticInterface()->RegisterChildWindow(ScChiSquareTestDialogWrapper::GetChildWindowId()); + GetStaticInterface()->RegisterChildWindow(ScCondFormatDlgWrapper::GetChildWindowId()); } SFX_IMPL_NAMED_VIEWFACTORY( ScTabViewShell, "Default" ) diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx index 4d5d2d4a66d8..38502d2856a7 100644 --- a/sc/source/ui/view/tabvwshc.cxx +++ b/sc/source/ui/view/tabvwshc.cxx @@ -459,8 +459,60 @@ VclPtr<SfxModelessDialog> ScTabViewShell::CreateRefDialog( } break; - default: - OSL_FAIL( "ScTabViewShell::CreateRefDialog: unbekannte ID" ); + case WID_CONDFRMT_REF: + { + sal_uInt32 nIndex = sal_uInt32(-1); + sal_uInt8 nType = 0; + bool bManaged = false; + bool bFound = false; + + ScRangeList aRangeList; + ScConditionalFormat* pCondFormat; + condformat::dialog::ScCondFormatDialogType aDialogType; + + // Get the pool item stored it by Conditional Format Manager Dialog. + const SfxPoolItem* pItem = NULL; + sal_uInt32 nItems(GetPool().GetItemCount2( SCITEM_STRING )); + for( sal_uInt32 nIter = 0; nIter < nItems; ++nIter ) + { + if( NULL != (pItem = GetPool().GetItem2( SCITEM_STRING, nIter ) ) ) + { + if ( ScCondFormatDlg::ParseXmlString( + static_cast<const SfxStringItem*>(pItem)->GetValue(), + nIndex, nType, bManaged)) + { + bFound = true; + break; + } + } + } + + ScViewData& rViewData = GetViewData(); + rViewData.SetRefTabNo( rViewData.GetTabNo() ); + + aDialogType = static_cast< condformat::dialog::ScCondFormatDialogType > ( nType ); + pCondFormat = pDoc->GetCondFormList(rViewData.GetTabNo())->GetFormat ( nIndex ); + + if ( pCondFormat ) + aRangeList = pCondFormat->GetRange(); + else + { + rViewData.GetMarkData().FillRangeListWithMarks(&aRangeList, false); + ScAddress aPos(rViewData.GetCurX(), rViewData.GetCurY(), rViewData.GetTabNo()); + if(aRangeList.empty()) + { + ScRange* pRange = new ScRange(aPos); + aRangeList.push_back(pRange); + } + } + + pResult = VclPtr<ScCondFormatDlg>::Create( pB, pCW, pParent, &rViewData, pCondFormat, aRangeList, + aRangeList.GetTopLeftCorner(), aDialogType, bManaged ); + + // Remove the pool item stored it by Conditional Format Manager Dialog. + if ( bFound && pItem ) + GetPool().Remove( *pItem ); + } break; } |