20#undef SC_DLLIMPLEMENTATION
26#include <osl/diagnose.h>
29#include <document.hxx>
51 :
SfxTabPage(pPage, pController,
"modules/scalc/ui/optsortlists.ui",
"OptSortLists",
53 , mxFtLists(m_xBuilder->weld_label(
"listslabel"))
54 , mxLbLists(m_xBuilder->weld_tree_view(
"lists"))
55 , mxFtEntries(m_xBuilder->weld_label(
"entrieslabel"))
56 , mxEdEntries(m_xBuilder->weld_text_view(
"entries"))
57 , mxFtCopyFrom(m_xBuilder->weld_label(
"copyfromlabel"))
58 , mxEdCopyFrom(m_xBuilder->weld_entry(
"copyfrom"))
59 , mxBtnNew(m_xBuilder->weld_button(
"new"))
60 , mxBtnDiscard(m_xBuilder->weld_button(
"discard"))
61 , mxBtnAdd(m_xBuilder->weld_button(
"add"))
62 , mxBtnModify(m_xBuilder->weld_button(
"modify"))
63 , mxBtnRemove(m_xBuilder->weld_button(
"delete"))
64 , mxBtnCopy(m_xBuilder->weld_button(
"copy"))
65 , aStrQueryRemove (
ScResId( STR_QUERYREMOVE ) )
66 , aStrCopyList (
ScResId( STR_COPYLIST ) )
67 , aStrCopyFrom (
ScResId( STR_COPYFROM ) )
68 , aStrCopyErr (
ScResId( STR_COPYERR ) )
69 , nWhichUserLists (
GetWhich( SID_SCUSERLISTS ) )
71 , pViewData ( nullptr )
72 , bModifyMode ( false )
73 , bCancelMode ( false )
112 nEndCol, nEndRow, nEndTab );
135 return std::make_unique<ScTpUserLists>(pPage, pController, *rAttrSet);
144 OSL_ENSURE( pCoreList,
"UserList not found :-/" );
200 bool bDataModified =
false;
202 if ( (
pUserLists ==
nullptr) && (pCoreList ==
nullptr) )
204 bDataModified =
false;
208 if ( pCoreList !=
nullptr )
211 bDataModified =
true;
221 rCoreAttrs->
Put( aULItem );
224 return bDataModified;
232 return DeactivateRC::LeavePage;
246 aEntry = (*pUserLists)[
i].GetString();
247 OSL_ENSURE( !aEntry.isEmpty(),
"Empty UserList-entry :-/" );
258 if ( nList < pUserLists->
size() )
262 OUStringBuffer aEntryListStr;
264 for (
size_t i=0;
i<nSubCount;
i++ )
267 aEntryListStr.append(
CR);
275 OSL_FAIL(
"Invalid ListIndex :-/" );
281 if (rListStr.isEmpty())
286 for(sal_Int32 nIdx=0; nIdx>=0;)
293 sal_Int32 nLen =
aStr.getLength();
301 rListStr += OUStringChar(
aStr[c]);
306 rListStr += OUStringChar(
aStr[c]);
317 OUString theEntriesStr( rEntriesStr );
339 if ( (nStartCol != nEndCol) && (nStartRow != nEndRow) )
342 nCellDir = aDialog.
run();
344 else if ( nStartCol != nEndCol )
351 bool bValueIgnored =
false;
357 OUStringBuffer aStrList;
358 for (
SCROW row=nStartRow; row<=nEndRow; row++ )
364 if ( !aStrField.isEmpty() )
366 aStrList.append(aStrField +
"\n");
370 bValueIgnored =
true;
372 if ( !aStrList.isEmpty() )
378 for (
SCROW row=nStartRow; row<=nEndRow; row++ )
380 OUStringBuffer aStrList;
387 if ( !aStrField.isEmpty() )
389 aStrList.append(aStrField +
"\n");
393 bValueIgnored =
true;
395 if ( !aStrList.isEmpty() )
403 VclMessageType::Info, VclButtonsType::Ok,
414 const OUString& rEntriesStr )
418 OUString theEntriesStr( rEntriesStr );
422 (*pUserLists)[nSelList].SetString( theEntriesStr );
430 ::std::advance(itr, nList);
439 if ( &rLb != mxLbLists.get() )
442 sal_Int32 nSelPos = mxLbLists->get_selected_index();
446 if ( !mxFtEntries->get_sensitive() ) mxFtEntries->set_sensitive(
true);
447 if ( !mxEdEntries->get_sensitive() ) mxEdEntries->set_sensitive(
true);
448 if ( !mxBtnRemove->get_sensitive() ) mxBtnRemove->set_sensitive(
true);
449 if ( mxBtnAdd->get_sensitive() )
451 mxBtnAdd->set_sensitive(
false);
452 mxBtnModify->set_sensitive(
false);
455 UpdateEntries( nSelPos );
460 if (&rBtn == mxBtnNew.get() || &rBtn == mxBtnDiscard.get())
464 nCancelPos = ( mxLbLists->n_children() > 0 )
465 ? mxLbLists->get_selected_index()
467 mxLbLists->unselect_all();
468 mxFtLists->set_sensitive(
false);
469 mxLbLists->set_sensitive(
false);
470 mxFtEntries->set_sensitive(
true);
471 mxEdEntries->set_sensitive(
true);
472 mxEdEntries->set_text( OUString() );
473 mxEdEntries->grab_focus();
474 mxBtnAdd->set_sensitive(
false);
475 mxBtnModify->set_sensitive(
false);
476 mxBtnRemove->set_sensitive(
false);
478 if ( mxBtnCopy->get_sensitive() )
480 mxBtnCopy->set_sensitive(
false);
481 mxFtCopyFrom->set_sensitive(
false);
482 mxEdCopyFrom->set_sensitive(
false);
485 mxBtnDiscard->show();
490 if ( mxLbLists->n_children() > 0 )
492 mxLbLists->select( nCancelPos );
493 LbSelectHdl( *mxLbLists );
494 mxFtLists->set_sensitive(
true);
495 mxLbLists->set_sensitive(
true);
499 mxFtEntries->set_sensitive(
false);
500 mxEdEntries->set_sensitive(
false);
501 mxEdEntries->set_text( OUString() );
502 mxBtnRemove->set_sensitive(
false);
504 mxBtnAdd->set_sensitive(
false);
505 mxBtnModify->set_sensitive(
false);
507 if ( pViewData && !bCopyDone )
509 mxBtnCopy->set_sensitive(
true);
510 mxFtCopyFrom->set_sensitive(
true);
511 mxEdCopyFrom->set_sensitive(
true);
514 mxBtnDiscard->hide();
519 else if (&rBtn == mxBtnAdd.get() || &rBtn == mxBtnModify.get())
521 OUString theEntriesStr( mxEdEntries->get_text() );
525 if ( !theEntriesStr.isEmpty() )
527 AddNewList( theEntriesStr );
529 mxLbLists->select( mxLbLists->n_children()-1 );
530 LbSelectHdl( *mxLbLists );
531 mxFtLists->set_sensitive(
true);
532 mxLbLists->set_sensitive(
true);
536 if ( mxLbLists->n_children() > 0 )
538 mxLbLists->select( nCancelPos );
539 LbSelectHdl( *mxLbLists );
540 mxLbLists->set_sensitive(
true);
541 mxLbLists->set_sensitive(
true);
545 mxBtnAdd->set_sensitive(
false);
546 mxBtnModify->set_sensitive(
false);
547 mxBtnRemove->set_sensitive(
true);
549 mxBtnDiscard->hide();
554 sal_Int32 nSelList = mxLbLists->get_selected_index();
556 OSL_ENSURE( nSelList != -1 ,
"Modify without List :-/" );
558 if ( !theEntriesStr.isEmpty() )
560 ModifyList( nSelList, theEntriesStr );
562 mxLbLists->select( nSelList );
566 mxLbLists->select( 0 );
567 LbSelectHdl( *mxLbLists );
571 mxBtnDiscard->hide();
575 mxBtnAdd->set_sensitive(
false);
576 mxBtnModify->set_sensitive(
false);
578 mxBtnRemove->set_sensitive(
true);
579 mxFtLists->set_sensitive(
true);
580 mxLbLists->set_sensitive(
true);
583 if ( pViewData && !bCopyDone )
585 mxBtnCopy->set_sensitive(
true);
586 mxFtCopyFrom->set_sensitive(
true);
587 mxEdCopyFrom->set_sensitive(
true);
590 else if ( &rBtn == mxBtnRemove.get() )
592 if ( mxLbLists->n_children() > 0 )
594 sal_Int32 nRemovePos = mxLbLists->get_selected_index();
596 + mxLbLists->get_text( nRemovePos )
600 VclMessageType::Question, VclButtonsType::YesNo,
602 xQueryBox->set_default_response(
RET_YES);
604 if (
RET_YES == xQueryBox->run())
606 RemoveList( nRemovePos );
609 if ( mxLbLists->n_children() > 0 )
612 ( nRemovePos >= mxLbLists->n_children() )
613 ? mxLbLists->n_children()-1
615 LbSelectHdl( *mxLbLists );
619 mxFtLists->set_sensitive(
false);
620 mxLbLists->set_sensitive(
false);
621 mxFtEntries->set_sensitive(
false);
622 mxEdEntries->set_sensitive(
false);
623 mxEdEntries->set_text( OUString() );
624 mxBtnRemove->set_sensitive(
false);
628 if ( pViewData && !bCopyDone && !mxBtnCopy->get_sensitive() )
630 mxBtnCopy->set_sensitive(
true);
631 mxFtCopyFrom->set_sensitive(
true);
632 mxEdCopyFrom->set_sensitive(
true);
636 else if ( pViewData && (&rBtn == mxBtnCopy.get()) )
643 OUString theAreaStr( mxEdCopyFrom->get_text() );
644 bool bAreaOk =
false;
646 if ( !theAreaStr.isEmpty() )
650 pViewData->GetTabNo(),
654 pDoc->GetAddressConvention() );
659 pViewData->GetTabNo(),
662 pDoc->GetAddressConvention() );
663 theEndPos = theStartPos;
669 CopyListFromArea( theStartPos, theEndPos );
671 mxLbLists->select( mxLbLists->n_children()-1 );
672 LbSelectHdl( *mxLbLists );
673 mxEdCopyFrom->set_text( theAreaStr );
674 mxEdCopyFrom->set_sensitive(
false);
675 mxBtnCopy->set_sensitive(
false);
676 mxFtCopyFrom->set_sensitive(
false);
681 VclMessageType::Warning, VclButtonsType::Ok,
685 mxEdCopyFrom->grab_focus();
686 mxEdCopyFrom->select_region(0, -1);
693 if ( &rEd != mxEdEntries.get() )
696 if ( mxBtnCopy->get_sensitive() )
698 mxBtnCopy->set_sensitive(
false);
699 mxFtCopyFrom->set_sensitive(
false);
700 mxEdCopyFrom->set_sensitive(
false);
703 if ( !mxEdEntries->get_text().isEmpty() )
705 if ( !bCancelMode && !bModifyMode )
708 mxBtnDiscard->show();
711 mxBtnAdd->set_sensitive(
true);
713 mxBtnModify->set_sensitive(
true);
715 mxBtnRemove->set_sensitive(
false);
716 mxFtLists->set_sensitive(
false);
717 mxLbLists->set_sensitive(
false);
721 if ( !mxBtnAdd->get_sensitive() )
723 mxBtnAdd->set_sensitive(
true);
724 mxBtnModify->set_sensitive(
true);
730 if ( mxBtnAdd->get_sensitive() )
732 mxBtnAdd->set_sensitive(
false);
733 mxBtnModify->set_sensitive(
false);
void PutInOrder(T &nStart, T &nEnd)
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage)
SC_DLLPUBLIC bool HasStringData(SCCOL nCol, SCROW nRow, SCTAB nTab) const
SC_DLLPUBLIC OUString GetString(SCCOL nCol, SCROW nRow, SCTAB nTab, const ScInterpreterContext *pContext=nullptr) const
static bool IsAbsArea(const OUString &rAreaStr, const ScDocument &rDoc, SCTAB nTab, OUString *pCompleteStr, ScRefAddress *pStartPos=nullptr, ScRefAddress *pEndPos=nullptr, ScAddress::Details const &rDetails=ScAddress::detailsOOOa1)
static bool IsAbsPos(const OUString &rPosStr, const ScDocument &rDoc, SCTAB nTab, OUString *pCompleteStr, ScRefAddress *pPosTripel=nullptr, ScAddress::Details const &rDetails=ScAddress::detailsOOOa1)
OUString Format(const ScDocument &rDocument, ScRefFlags nFlags=ScRefFlags::ZERO, const ScAddress::Details &rDetails=ScAddress::detailsOOOa1, bool bFullAddressNotation=false) const
Returns string with formatted cell range from aStart to aEnd, according to provided address conventio...
ScViewData & GetViewData()
virtual ~ScTpUserLists() override
ScTpUserLists(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rArgSet)
std::unique_ptr< weld::TextView > mxEdEntries
virtual bool FillItemSet(SfxItemSet *rCoreAttrs) override
const sal_uInt16 nWhichUserLists
std::unique_ptr< weld::Button > mxBtnDiscard
std::unique_ptr< ScUserList > pUserLists
const OUString aStrCopyErr
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rAttrSet)
std::unique_ptr< weld::Label > mxFtCopyFrom
void UpdateEntries(size_t nList)
std::unique_ptr< weld::Label > mxFtLists
const OUString aStrCopyFrom
OUString aStrSelectedArea
std::unique_ptr< weld::Button > mxBtnModify
const OUString aStrCopyList
virtual DeactivateRC DeactivatePage(SfxItemSet *pSet) override
std::unique_ptr< weld::Button > mxBtnNew
std::unique_ptr< weld::Button > mxBtnAdd
virtual void Reset(const SfxItemSet *rCoreAttrs) override
void AddNewList(const OUString &rEntriesStr)
std::unique_ptr< weld::Label > mxFtEntries
void CopyListFromArea(const ScRefAddress &rStartPos, const ScRefAddress &rEndPos)
void RemoveList(size_t nList)
std::unique_ptr< weld::Button > mxBtnCopy
std::unique_ptr< weld::Entry > mxEdCopyFrom
static void MakeListStr(OUString &rListStr)
std::unique_ptr< weld::Button > mxBtnRemove
void ModifyList(size_t nSelList, const OUString &rEntriesStr)
std::unique_ptr< weld::TreeView > mxLbLists
size_t UpdateUserListBox()
Stores individual user-defined sort list.
OUString GetSubStr(sal_uInt16 nIndex) const
size_t GetSubCount() const
ScUserList * GetUserList() const
void SetUserList(const ScUserList &rUserList)
Collection of user-defined sort lists.
DataType::iterator iterator
ScDocument & GetDocument() const
ScMarkType GetSimpleArea(SCCOL &rStartCol, SCROW &rStartRow, SCTAB &rStartTab, SCCOL &rEndCol, SCROW &rEndRow, SCTAB &rEndTab) const
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
const SfxItemSet & GetItemSet() const
void SetExchangeSupport()
weld::Window * GetFrameWeld() const
static SAL_WARN_UNUSED_RESULT SfxViewShell * Current()
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
LineEnd GetSystemLineEnd()
TOOLS_DLLPUBLIC OString convertLineEnd(const OString &rIn, LineEnd eLineEnd)
#define LINK(Instance, Class, Member)
RttiCompleteObjectLocator col
OString strip(const OString &rIn, char c)
std::basic_string_view< charT, traits > getToken(std::basic_string_view< charT, traits > sv, charT delimiter, std::size_t &position)
OUString ScResId(TranslateId aId)
const sal_Unicode cDelimiter
IMPL_LINK(ScTpUserLists, LbSelectHdl, weld::TreeView &, rLb, void)