35 #define STRING_DELIM char(0x0A)
36 #define GLOS_TIMEOUT 30000 // update every 30 seconds
37 #define FIND_MAX_GLOS 20
50 std::unique_ptr<weld::Button> m_xOk;
51 std::unique_ptr<weld::TreeView> m_xListLB;
64 SwGlossDecideDlg::SwGlossDecideDlg(
weld::Window* pParent)
65 : GenericDialogController(pParent,
"modules/swriter/ui/selectautotextdialog.ui",
"SelectAutoTextDialog")
66 , m_xOk(m_xBuilder->weld_button(
"ok"))
67 , m_xListLB(m_xBuilder->weld_tree_view(
"treeview"))
69 m_xListLB->set_size_request(m_xListLB->get_approximate_digit_width() * 32,
70 m_xListLB->get_height_rows(8));
71 m_xListLB->connect_row_activated(
LINK(
this, SwGlossDecideDlg, DoubleClickHdl));
72 m_xListLB->connect_changed(
LINK(
this, SwGlossDecideDlg, SelectHdl));
83 m_xOk->set_sensitive(m_xListLB->get_selected_index() != -1);
104 OUString& rShortName, OUString& rGroupName )
109 std::vector<TripleString> aTripleStrings;
112 for(
size_t i = 0;
i < nCount;
i++ )
115 if(!rGroupName.isEmpty() && rGroupName != pGroup->
sName)
118 sal_Int32 nPosLong = 0;
119 for(sal_uInt16 j = 0; j < pGroup->
nCount; j++)
122 if(rLongName != sLong)
125 TripleString aTriple;
126 aTriple.sGroup = pGroup->
sName;
127 aTriple.sBlock = sLong;
129 aTripleStrings.push_back(aTriple);
134 nCount = aTripleStrings.size();
137 const TripleString& rTriple(aTripleStrings.front());
138 rShortName = rTriple.sShort;
139 rGroupName = rTriple.sGroup;
145 SwGlossDecideDlg aDlg(pView ? pView->
GetFrameWeld() :
nullptr);
146 OUString sTitle = aDlg.get_title() +
" " + aTripleStrings.front().sBlock;
147 aDlg.set_title(sTitle);
150 for (
const auto& rTriple : aTripleStrings)
157 rShortName = rTriple.sShort;
158 rGroupName = rTriple.sGroup;
176 OSL_ENSURE(
aGroupArr.size() > nPos,
"group not available");
180 OUString sRet = pGroup->
sName;
188 OSL_ENSURE(
aGroupArr.size() > nPos,
"group not available");
199 OSL_ENSURE(
aGroupArr.size() > nGroup,
"group not available");
210 OSL_ENSURE(
aGroupArr.size() > nGroup,
"group not available");
221 OSL_ENSURE(
aGroupArr.size() > nGroup,
"group not available");
244 const std::vector<OUString> & rPathArr = pGlossaries->
GetPathArray();
248 const size_t nGroupCount = pGlossaries->
GetGroupCnt();
249 for(
size_t i = 0;
i < nGroupCount; ++
i)
252 const size_t nPath =
static_cast<size_t>(
254 if( nPath < rPathArr.size() )
257 pGroup->sName = sGrpName;
260 OUString
sName = rPathArr[nPath] +
"/" +
263 &pGroup->aDateModified,
264 &pGroup->aDateModified );
273 for(
size_t nPath = 0; nPath < rPathArr.size(); nPath++ )
275 std::vector<OUString> aFoundGroupNames;
276 std::vector<OUString> aFiles;
277 std::vector<DateTime> aDateTimeArr;
280 &sExt, &aDateTimeArr );
281 for(
size_t nFiles = 0; nFiles < aFiles.size(); ++nFiles )
283 const OUString aTitle = aFiles[ nFiles ];
286 OUString
sName( aTitle.copy( 0, aTitle.getLength() - sExt.getLength() ));
288 aFoundGroupNames.push_back(sName);
289 sName += OUStringChar(
GLOS_DELIM) + OUString::number( static_cast<sal_uInt16>(nPath) );
294 pFound->
sName = sName;
298 aGroupArr.push_back(std::unique_ptr<AutoTextGroup>(pFound));
312 const size_t nGroupPath =
static_cast<size_t>(
316 if( nGroupPath == nPath )
319 bool bFound = std::any_of(aFoundGroupNames.begin(), aFoundGroupNames.end(),
320 [&sCompareGroup](
const OUString& rGroupName) {
return sCompareGroup == rGroupName; });
343 if(pRet->sName == rGroupName)
351 std::unique_ptr<SwTextBlocks> pBlock = pGlossaries->
GetGroupDoc(pGroup->
sName);
352 pGroup->
nCount = pBlock ? pBlock->GetCount() : 0;
356 pGroup->
sTitle = pBlock->GetName();
358 for(sal_uInt16 j = 0; j < pGroup->
nCount; j++)
371 std::vector<std::pair<OUString, sal_uInt16>>& rLongNames)
378 std::vector<std::vector<OUString>> aResults(rBeginCandidates.size());
385 for(sal_uInt16 j = 0; j < pGroup->nCount; j++)
387 OUString sBlock = pGroup->sLongNames.getToken(0,
STRING_DELIM, nIdx);
388 for (
size_t i = 0;
i < rBeginCandidates.size(); ++
i)
390 const OUString& s = rBeginCandidates[
i];
391 if (s.getLength() + 1 < sBlock.getLength()
392 && rSCmp.isEqual(sBlock.copy(0, s.getLength()), s))
394 aResults[
i].push_back(sBlock);
400 std::vector<std::pair<OUString, sal_uInt16>> aAllResults;
402 for (
size_t i = 0;
i < rBeginCandidates.size(); ++
i)
404 std::sort(aResults[
i].
begin(), aResults[
i].
end(),
405 [origWord = rBeginCandidates[
i]](
const OUString& s1,
const OUString& s2) {
406 int nRet = s1.compareToIgnoreAsciiCase(s2);
411 int n1StartsWithOrig = s1.startsWith(origWord) ? 0 : 1;
412 int n2StartsWithOrig = s2.startsWith(origWord) ? 0 : 1;
413 return n1StartsWithOrig < n2StartsWithOrig;
418 std::transform(aResults[
i].
begin(), aResults[
i].
end(), std::back_inserter(aAllResults),
419 [nLen = sal_uInt16(rBeginCandidates[
i].
getLength())](
const OUString& s) {
420 return std::make_pair(s, nLen);
424 const auto& it = std::unique(
425 aAllResults.begin(), aAllResults.end(),
426 [](
const std::pair<OUString, sal_uInt16>& s1,
const std::pair<OUString, sal_uInt16>& s2) {
427 return s1.first.equalsIgnoreAsciiCase(s2.first);
429 if (
const auto nCount = std::min<size_t>(std::distance(aAllResults.begin(), it),
FIND_MAX_GLOS))
431 rLongNames.insert(rLongNames.end(), aAllResults.begin(), aAllResults.begin() +
nCount);
#define LINK(Instance, Class, Member)
const ::utl::TransliterationWrapper & GetAppCmpStrIgnore()
sal_uInt16 GetBlockCount(size_t nGroup)
#define DECL_LINK(Member, ArgType, RetType)
std::unique_ptr< SwTextBlocks > GetGroupDoc(const OUString &rName, bool bCreate=false)
static OUString GetExtension()
void append_text(const OUString &rStr)
enumrange< T >::Iterator begin(enumrange< T >)
OUString GetBlockLongName(size_t nGroup, sal_uInt16 nBlock)
OUString GetGroupName(size_t nPos)
SW_DLLPUBLIC SwGlossaries * GetGlossaries()
OUString GetBlockShortName(size_t nGroup, sal_uInt16 nBlock)
AutoTextGroup * FindGroup(std::u16string_view rGroupName)
OUString GetGroupTitle(size_t nPos)
virtual int get_selected_index() const =0
static std::unique_ptr< SwGlossaries > pGlossaries
virtual void Start() override
std::vector< std::unique_ptr< AutoTextGroup > > aGroupArr
virtual void Invoke() override
void SetTimeout(sal_uInt64 nTimeoutMs)
enumrange< T >::Iterator end(enumrange< T >)
static void FillGroup(AutoTextGroup *pGroup, SwGlossaries *pGloss)
void HasLongName(const std::vector< OUString > &rBeginCandidates, std::vector< std::pair< OUString, sal_uInt16 >> &rLongNames)
virtual void select(int pos)=0
OUString const & GetGroupName(size_t)
weld::Window * GetFrameWeld() const
std::vector< OUString > const & GetPathArray() const
bool GetShortName(std::u16string_view rLongName, OUString &rShortName, OUString &rGroupName)
IMPL_LINK_NOARG(SwGlossDecideDlg, DoubleClickHdl, weld::TreeView &, bool)
bool UCB_GetFileListOfFolder(const OUString &rURL, std::vector< OUString > &rList, const OUString *pExtension, std::vector< ::DateTime > *pDateTimeList)
Reference< XExecutableDialog > m_xDialog
SVL_DLLPUBLIC bool GetModifiedDateTimeOfFile(const OUString &rURL, Date *pDate, tools::Time *pTime)
const OUString & GetAutoTextPath() const
double getLength(const B2DPolygon &rCandidate)
virtual ~SwGlossaryList() override