Kaydet (Commit) 949a4e15 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Selecting a child entry of a recurring element should select all sub-tree.

And use the parent element entry to set the mapped cell position.

Change-Id: I1def045000e707903dcc91ab46da3c66195506da
üst dabd8121
...@@ -57,7 +57,7 @@ class ScXMLSourceDlg : public ScAnyRefDlg ...@@ -57,7 +57,7 @@ class ScXMLSourceDlg : public ScAnyRefDlg
std::set<const SvTreeListEntry*> maCellLinks; std::set<const SvTreeListEntry*> maCellLinks;
std::set<const SvTreeListEntry*> maRangeLinks; std::set<const SvTreeListEntry*> maRangeLinks;
std::vector<SvTreeListEntry*> maHighlightedEntries; std::vector<SvTreeListEntry*> maHighlightedEntries;
SvTreeListEntry* mpCurRefEntry;
boost::scoped_ptr<ScOrcusXMLContext> mpXMLContext; boost::scoped_ptr<ScOrcusXMLContext> mpXMLContext;
ScDocument* mpDoc; ScDocument* mpDoc;
......
...@@ -83,6 +83,7 @@ ScXMLSourceDlg::ScXMLSourceDlg( ...@@ -83,6 +83,7 @@ ScXMLSourceDlg::ScXMLSourceDlg(
maBtnOk(this, ScResId(BTN_OK)), maBtnOk(this, ScResId(BTN_OK)),
maBtnCancel(this, ScResId(BTN_CANCEL)), maBtnCancel(this, ScResId(BTN_CANCEL)),
maImgFileOpen(ScResId(IMG_FILE_OPEN)), maImgFileOpen(ScResId(IMG_FILE_OPEN)),
mpCurRefEntry(NULL),
mpDoc(pDoc), mpDoc(pDoc),
mpActiveEdit(&maRefEdit), mpActiveEdit(&maRefEdit),
mbDlgLostFocus(false) mbDlgLostFocus(false)
...@@ -256,6 +257,37 @@ public: ...@@ -256,6 +257,37 @@ public:
} }
}; };
/**
* When the current entry is a direct or indirect child of a mappable
* repeat element entry, that entry becomes the reference entry.
* Otherwise the reference entry equals the current entry. A reference
* entry is the entry that stores mapped cell position.
*/
SvTreeListEntry* getReferenceEntry(SvTreeListBox& rTree, SvTreeListEntry* pCurEntry)
{
SvTreeListEntry* pParent = rTree.GetParent(pCurEntry);
SvTreeListEntry* pRefEntry = NULL;
while (pParent)
{
ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*pParent);
OSL_ASSERT(pUserData);
if (pUserData->meType == ScOrcusXMLTreeParam::ElementRepeat)
{
// This is a repeat element.
if (pRefEntry)
{
// Second repeat element encountered. Not good.
return pCurEntry;
}
pRefEntry = pParent;
}
pParent = rTree.GetParent(pParent);
}
return pRefEntry ? pRefEntry : pCurEntry;
}
} }
void ScXMLSourceDlg::TreeItemSelected() void ScXMLSourceDlg::TreeItemSelected()
...@@ -271,7 +303,20 @@ void ScXMLSourceDlg::TreeItemSelected() ...@@ -271,7 +303,20 @@ void ScXMLSourceDlg::TreeItemSelected()
maHighlightedEntries.clear(); maHighlightedEntries.clear();
} }
ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*pEntry); mpCurRefEntry = getReferenceEntry(maLbTree, pEntry);
if (mpCurRefEntry != pEntry)
{
// Highlight the reference entry if it differs from the current entry.
SvViewDataEntry* pView = maLbTree.GetViewDataEntry(mpCurRefEntry);
if (pView)
{
pView->SetHighlighted(true);
maLbTree.PaintEntry(mpCurRefEntry);
maHighlightedEntries.push_back(mpCurRefEntry);
}
}
ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mpCurRefEntry);
OSL_ASSERT(pUserData); OSL_ASSERT(pUserData);
const ScAddress& rPos = pUserData->maLinkedPos; const ScAddress& rPos = pUserData->maLinkedPos;
...@@ -287,13 +332,13 @@ void ScXMLSourceDlg::TreeItemSelected() ...@@ -287,13 +332,13 @@ void ScXMLSourceDlg::TreeItemSelected()
switch (pUserData->meType) switch (pUserData->meType)
{ {
case ScOrcusXMLTreeParam::Attribute: case ScOrcusXMLTreeParam::Attribute:
AttributeSelected(*pEntry); AttributeSelected(*mpCurRefEntry);
break; break;
case ScOrcusXMLTreeParam::ElementDefault: case ScOrcusXMLTreeParam::ElementDefault:
DefaultElementSelected(*pEntry); DefaultElementSelected(*mpCurRefEntry);
break; break;
case ScOrcusXMLTreeParam::ElementRepeat: case ScOrcusXMLTreeParam::ElementRepeat:
RepeatElementSelected(*pEntry); RepeatElementSelected(*mpCurRefEntry);
break; break;
default: default:
; ;
...@@ -599,13 +644,12 @@ void ScXMLSourceDlg::RefEditModified() ...@@ -599,13 +644,12 @@ void ScXMLSourceDlg::RefEditModified()
if (!bValid) if (!bValid)
aLinkedPos.SetInvalid(); aLinkedPos.SetInvalid();
// Set this address to currently selected tree item. // Set this address to the current reference entry.
SvTreeListEntry* pEntry = maLbTree.GetCurEntry(); if (!mpCurRefEntry)
if (!pEntry)
// This should never happen. // This should never happen.
return; return;
ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*pEntry); ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mpCurRefEntry);
if (!pUserData) if (!pUserData)
// This should never happen either. // This should never happen either.
return; return;
...@@ -617,16 +661,16 @@ void ScXMLSourceDlg::RefEditModified() ...@@ -617,16 +661,16 @@ void ScXMLSourceDlg::RefEditModified()
if (bRepeatElem) if (bRepeatElem)
{ {
if (bValid) if (bValid)
maRangeLinks.insert(pEntry); maRangeLinks.insert(mpCurRefEntry);
else else
maRangeLinks.erase(pEntry); maRangeLinks.erase(mpCurRefEntry);
} }
else else
{ {
if (bValid) if (bValid)
maCellLinks.insert(pEntry); maCellLinks.insert(mpCurRefEntry);
else else
maCellLinks.erase(pEntry); maCellLinks.erase(mpCurRefEntry);
} }
// Enable the import button only when at least one link exists. // Enable the import button only when at least one link exists.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment