summaryrefslogtreecommitdiffstats
path: root/cui/source/options/optaboutconfig.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cui/source/options/optaboutconfig.cxx')
-rw-r--r--cui/source/options/optaboutconfig.cxx1111
1 files changed, 648 insertions, 463 deletions
diff --git a/cui/source/options/optaboutconfig.cxx b/cui/source/options/optaboutconfig.cxx
index 55941f765dd9..de64f45b4260 100644
--- a/cui/source/options/optaboutconfig.cxx
+++ b/cui/source/options/optaboutconfig.cxx
@@ -7,25 +7,40 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
-#include <o3tl/safeint.hxx>
#include "optaboutconfig.hxx"
+#include <o3tl/safeint.hxx>
+#include <o3tl/string_view.hxx>
-#include <comphelper/processfactory.hxx>
-#include <comphelper/sequence.hxx>
-#include <com/sun/star/configuration/theDefaultProvider.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/UnknownPropertyException.hpp>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <com/sun/star/configuration/ReadWriteAccess.hpp>
+#include <com/sun/star/configuration/XDocumentation.hpp>
+#include <com/sun/star/configuration/theDefaultProvider.hpp>
+#include <com/sun/star/container/XHierarchicalName.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/container/XNameReplace.hpp>
-#include <com/sun/star/container/XHierarchicalName.hpp>
-#include <com/sun/star/util/XChangesBatch.hpp>
-#include <com/sun/star/util/SearchFlags.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hpp>
+#include <com/sun/star/util/InvalidStateException.hpp>
#include <com/sun/star/util/SearchAlgorithms2.hpp>
+#include <com/sun/star/util/SearchFlags.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <comphelper/diagnose_ex.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/sequence.hxx>
+#include <cppu/unotype.hxx>
#include <rtl/ustrbuf.hxx>
+#include <sal/log.hxx>
#include <unotools/textsearch.hxx>
+#include <utility>
#include <vcl/event.hxx>
-#include <sal/log.hxx>
-#include <tools/diagnose_ex.h>
+
+#include <dialmgr.hxx>
+#include <strings.hrc>
#include <algorithm>
#include <memory>
@@ -35,106 +50,59 @@ using namespace ::com::sun::star;
using namespace com::sun::star::uno;
using namespace com::sun::star::container;
-#define SHORT_LEN_LIMIT 7
-#define LONG_LEN_LIMIT 11
-#define HYPER_LEN_LIMIT 20
-
struct Prop_Impl
{
- OUString Name;
- OUString Property;
- Any Value;
-
- Prop_Impl( const OUString& sName, const OUString& sProperty, const Any& aValue )
- : Name( sName )
- , Property( sProperty )
- , Value( aValue )
- {}
+ OUString Name;
+ OUString Property;
+ Any Value;
+
+ Prop_Impl(OUString sName, OUString sProperty, Any aValue)
+ : Name(std::move(sName))
+ , Property(std::move(sProperty))
+ , Value(std::move(aValue))
+ {
+ }
};
struct UserData
{
bool bIsPropertyPath;
+ bool bIsReadOnly;
+ bool bWasModified;
OUString sPropertyPath;
+ Any aPropertyValue;
+ OUString sTooltip;
int aLineage;
Reference<XNameAccess> aXNameAccess;
- explicit UserData( OUString const & rPropertyPath )
- : bIsPropertyPath( true )
- , sPropertyPath(rPropertyPath)
+ explicit UserData(OUString aPropertyPath, Any aPropValue, OUString aTooltip, bool isReadOnly,
+ bool wasModified)
+ : bIsPropertyPath(true)
+ , bIsReadOnly(isReadOnly)
+ , bWasModified(wasModified)
+ , sPropertyPath(std::move(aPropertyPath))
+ , aPropertyValue(aPropValue)
+ , sTooltip(std::move(aTooltip))
, aLineage(0)
- {}
+ {
+ }
- explicit UserData( Reference<XNameAccess> const & rXNameAccess, int rIndex )
- : bIsPropertyPath( false )
+ explicit UserData(Reference<XNameAccess> const& rXNameAccess, int rIndex)
+ : bIsPropertyPath(false)
+ , bIsReadOnly(false)
+ , bWasModified(false)
, aLineage(rIndex)
- , aXNameAccess( rXNameAccess )
- {}
-};
-
-IMPL_LINK(CuiAboutConfigValueDialog, KeyInputHdl, const KeyEvent&, rKeyEvent, bool)
-{
- bool bValid = false;
- bool bNonSpace = rKeyEvent.GetKeyCode().GetCode() != KEY_SPACE;
- if (m_bNumericOnly && bNonSpace )
+ , aXNameAccess(rXNameAccess)
{
- const vcl::KeyCode& rKeyCode = rKeyEvent.GetKeyCode();
- sal_uInt16 nGroup = rKeyCode.GetGroup();
- sal_uInt16 nKey = rKeyCode.GetCode();
-
- switch ( nGroup ) {
- case KEYGROUP_NUM :
- case KEYGROUP_CURSOR :
- {
- bValid = true;
- break;
- }
-
- case KEYGROUP_MISC :
- {
- switch ( nKey ) {
- case KEY_SUBTRACT :
- case KEY_COMMA :
- case KEY_POINT :
- {
- bValid = true;
- break;
- }
-
- default :
- {
- if( nKey < KEY_ADD || nKey > KEY_EQUAL )
- bValid = true;
- break;
- }
- }
- break;
- }
-
- default :
- {
- bValid = false;
- break;
- }
- }
-
- //Select all, Copy, Paste, Cut, Undo Keys
- if ( !bValid && ( rKeyCode.IsMod1() && (
- KEY_A == nKey || KEY_C == nKey || KEY_V == nKey || KEY_X == nKey || KEY_Z == nKey ) ) )
- bValid = true;
}
- else
- bValid = true;
-
- //if value return true to claim that it has been handled
- return !bValid;
-}
+};
CuiAboutConfigTabPage::CuiAboutConfigTabPage(weld::Window* pParent)
: GenericDialogController(pParent, "cui/ui/aboutconfigdialog.ui", "AboutConfig")
, m_xResetBtn(m_xBuilder->weld_button("reset"))
, m_xEditBtn(m_xBuilder->weld_button("edit"))
, m_xSearchBtn(m_xBuilder->weld_button("searchButton"))
+ , m_xModifiedCheckBtn(m_xBuilder->weld_check_button("modifiedButton"))
, m_xSearchEdit(m_xBuilder->weld_entry("searchEntry"))
, m_xPrefBox(m_xBuilder->weld_tree_view("preferences"))
, m_xScratchIter(m_xPrefBox->make_iterator())
@@ -144,25 +112,42 @@ CuiAboutConfigTabPage::CuiAboutConfigTabPage(weld::Window* pParent)
m_xPrefBox->get_height_rows(23));
m_xPrefBox->connect_column_clicked(LINK(this, CuiAboutConfigTabPage, HeaderBarClick));
- m_xEditBtn->connect_clicked(LINK( this, CuiAboutConfigTabPage, StandardHdl_Impl));
- m_xResetBtn->connect_clicked(LINK( this, CuiAboutConfigTabPage, ResetBtnHdl_Impl));
+ m_xEditBtn->connect_clicked(LINK(this, CuiAboutConfigTabPage, StandardHdl_Impl));
+ m_xResetBtn->connect_clicked(LINK(this, CuiAboutConfigTabPage, ResetBtnHdl_Impl));
m_xPrefBox->connect_row_activated(LINK(this, CuiAboutConfigTabPage, DoubleClickHdl_Impl));
m_xPrefBox->connect_expanding(LINK(this, CuiAboutConfigTabPage, ExpandingHdl_Impl));
m_xSearchBtn->connect_clicked(LINK(this, CuiAboutConfigTabPage, SearchHdl_Impl));
+ m_xModifiedCheckBtn->connect_toggled(LINK(this, CuiAboutConfigTabPage, ModifiedHdl_Impl));
m_options.AlgorithmType2 = util::SearchAlgorithms2::ABSOLUTE;
m_options.transliterateFlags |= TransliterationFlags::IGNORE_CASE;
- m_options.searchFlag |= (util::SearchFlags::REG_NOT_BEGINOFLINE |
- util::SearchFlags::REG_NOT_ENDOFLINE);
+ m_options.searchFlag
+ |= (util::SearchFlags::REG_NOT_BEGINOFLINE | util::SearchFlags::REG_NOT_ENDOFLINE);
float fWidth = m_xPrefBox->get_approximate_digit_width();
- std::vector<int> aWidths
- {
- o3tl::narrowing<int>(fWidth * 65),
- o3tl::narrowing<int>(fWidth * 20),
- o3tl::narrowing<int>(fWidth * 8)
- };
+ std::vector<int> aWidths{ o3tl::narrowing<int>(fWidth * 65), o3tl::narrowing<int>(fWidth * 20),
+ o3tl::narrowing<int>(fWidth * 8) };
m_xPrefBox->set_column_fixed_widths(aWidths);
+
+ m_xPrefBox->connect_query_tooltip(LINK(this, CuiAboutConfigTabPage, QueryTooltip));
+}
+
+IMPL_LINK(CuiAboutConfigTabPage, QueryTooltip, const weld::TreeIter&, rIter, OUString)
+{
+ UserData* pUserData = weld::fromId<UserData*>(m_xPrefBox->get_id(rIter));
+ OUStringBuffer ret;
+ if (pUserData && pUserData->bIsReadOnly)
+ {
+ ret.append(CuiResId(RID_CUISTR_OPT_READONLY));
+ }
+ if (pUserData && !pUserData->sTooltip.isEmpty())
+ {
+ if (pUserData->bIsReadOnly)
+ ret.append("\n\n");
+ ret.append(pUserData->sTooltip);
+ }
+
+ return ret.makeStringAndClear();
}
IMPL_LINK(CuiAboutConfigTabPage, HeaderBarClick, int, nColumn, void)
@@ -196,29 +181,106 @@ IMPL_LINK(CuiAboutConfigTabPage, HeaderBarClick, int, nColumn, void)
}
}
-CuiAboutConfigTabPage::~CuiAboutConfigTabPage()
+IMPL_STATIC_LINK_NOARG(CuiAboutConfigTabPage, ValidNameHdl, SvxNameDialog&, bool)
{
+ // Allow empty value
+ return true;
}
-void CuiAboutConfigTabPage::InsertEntry(const OUString& rPropertyPath, const OUString& rProp, const OUString& rStatus,
- const OUString& rType, const OUString& rValue, const weld::TreeIter* pParentEntry,
- bool bInsertToPrefBox)
+CuiAboutConfigTabPage::~CuiAboutConfigTabPage() {}
+
+void CuiAboutConfigTabPage::InsertEntry(const OUString& rPropertyPath, Any aPropertyValue,
+ const OUString& rProp, const OUString& rStatus,
+ const OUString& rType, const OUString& rValue,
+ const OUString& rTooltip,
+ const weld::TreeIter* pParentEntry, bool bInsertToPrefBox,
+ bool bIsReadOnly, bool bWasModified)
{
- m_vectorUserData.push_back(std::make_unique<UserData>(rPropertyPath));
+ bool bOnlyModified = m_xModifiedCheckBtn->get_active();
+ if (bOnlyModified && !bWasModified)
+ return;
+
+ m_vectorUserData.push_back(std::make_unique<UserData>(rPropertyPath, aPropertyValue, rTooltip,
+ bIsReadOnly, bWasModified));
if (bInsertToPrefBox)
{
- OUString sId(OUString::number(reinterpret_cast<sal_Int64>(m_vectorUserData.back().get())));
- m_xPrefBox->insert(pParentEntry, -1, &rProp, &sId, nullptr, nullptr, false, m_xScratchIter.get());
+ OUString sId(weld::toId(m_vectorUserData.back().get()));
+ m_xPrefBox->insert(pParentEntry, -1, &rProp, &sId, nullptr, nullptr, false,
+ m_xScratchIter.get());
m_xPrefBox->set_text(*m_xScratchIter, rStatus, 1);
m_xPrefBox->set_text(*m_xScratchIter, rType, 2);
m_xPrefBox->set_text(*m_xScratchIter, rValue, 3);
+ m_xPrefBox->set_text_emphasis(*m_xScratchIter, bWasModified, -1);
+ m_xPrefBox->set_sensitive(*m_xScratchIter, !bIsReadOnly, -1);
}
else
{
- m_prefBoxEntries.push_back({rProp, rStatus, rType, rValue, m_vectorUserData.back().get()});
+ m_prefBoxEntries.push_back(
+ { rProp, rStatus, rType, rValue, m_vectorUserData.back().get() });
}
}
+void CuiAboutConfigTabPage::InputChanged()
+{
+ weld::WaitObject aWait(m_xDialog.get());
+
+ m_xPrefBox->hide();
+ m_xPrefBox->clear();
+ m_xPrefBox->freeze();
+
+ if (m_bSorted)
+ m_xPrefBox->make_unsorted();
+
+ if (m_xSearchEdit->get_text().isEmpty())
+ {
+ m_xPrefBox->clear();
+ Reference<XNameAccess> xConfigAccess = getConfigAccess("/", false);
+ FillItems(xConfigAccess);
+ }
+ else
+ {
+ m_options.searchString = m_xSearchEdit->get_text();
+ utl::TextSearch textSearch(m_options);
+ for (auto const& it : m_prefBoxEntries)
+ {
+ sal_Int32 endPos, startPos = 0;
+
+ for (size_t i = 0; i < 5; ++i)
+ {
+ OUString scrTxt;
+
+ if (i == 0)
+ scrTxt = it.pUserData->sPropertyPath;
+ else if (i == 1)
+ scrTxt = it.sProp;
+ else if (i == 2)
+ scrTxt = it.sStatus;
+ else if (i == 3)
+ scrTxt = it.sType;
+ else if (i == 4)
+ scrTxt = it.sValue;
+
+ endPos = scrTxt.getLength();
+ if (textSearch.SearchForward(scrTxt, &startPos, &endPos))
+ {
+ InsertEntry(it);
+ break;
+ }
+ }
+ }
+ }
+
+ m_xPrefBox->thaw();
+ if (m_bSorted)
+ m_xPrefBox->make_sorted();
+
+ m_xPrefBox->all_foreach([this](weld::TreeIter& rEntry) {
+ m_xPrefBox->expand_row(rEntry);
+ return false;
+ });
+ m_xPrefBox->show();
+}
+
void CuiAboutConfigTabPage::Reset()
{
weld::WaitObject aWait(m_xDialog.get());
@@ -235,42 +297,106 @@ void CuiAboutConfigTabPage::Reset()
m_modifiedPrefBoxEntries.clear();
m_xPrefBox->freeze();
- Reference< XNameAccess > xConfigAccess = getConfigAccess( "/", false );
+ Reference<XNameAccess> xConfigAccess = getConfigAccess("/", false);
//Load all XNameAccess to m_prefBoxEntries
- FillItems( xConfigAccess, nullptr, 0, true );
+ FillItems(xConfigAccess, nullptr, 0, true);
//Load xConfigAccess' children to m_prefBox
- FillItems( xConfigAccess );
+ FillItems(xConfigAccess);
m_xPrefBox->thaw();
}
void CuiAboutConfigTabPage::FillItemSet()
{
- std::vector< std::shared_ptr< Prop_Impl > >::iterator pIter;
- for( pIter = m_vectorOfModified.begin() ; pIter != m_vectorOfModified.end(); ++pIter )
+ std::vector<std::shared_ptr<Prop_Impl>>::iterator pIter;
+ for (pIter = m_vectorOfModified.begin(); pIter != m_vectorOfModified.end(); ++pIter)
{
- Reference< XNameAccess > xUpdateAccess = getConfigAccess( (*pIter)->Name , true );
- Reference< XNameReplace > xNameReplace( xUpdateAccess, UNO_QUERY_THROW );
+ Reference<XNameAccess> xUpdateAccess = getConfigAccess((*pIter)->Name, true);
+ Reference<XNameReplace> xNameReplace(xUpdateAccess, UNO_QUERY_THROW);
- xNameReplace->replaceByName( (*pIter)->Property, (*pIter)->Value );
+ xNameReplace->replaceByName((*pIter)->Property, (*pIter)->Value);
- Reference< util::XChangesBatch > xChangesBatch( xUpdateAccess, UNO_QUERY_THROW );
+ Reference<util::XChangesBatch> xChangesBatch(xUpdateAccess, UNO_QUERY_THROW);
xChangesBatch->commitChanges();
}
}
-void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAccess, const weld::TreeIter* pParentEntry,
- int lineage, bool bLoadAll)
+namespace
{
- OUString sPath = Reference< XHierarchicalName >(
- xNameAccess, uno::UNO_QUERY_THROW )->getHierarchicalName();
- const uno::Sequence< OUString > seqItems = xNameAccess->getElementNames();
- for( const OUString& item : seqItems )
+OUString lcl_StringListToString(const uno::Sequence<OUString>& seq)
+{
+ OUStringBuffer sBuffer;
+ for (sal_Int32 i = 0; i != seq.getLength(); ++i)
{
- Any aNode = xNameAccess->getByName( item );
+ if (i != 0)
+ sBuffer.append(",");
+ sBuffer.append(seq[i]);
+ }
+ return sBuffer.makeStringAndClear();
+}
+
+OUString lcl_IntListToString(const uno::Sequence<sal_Int16>& seq)
+{
+ OUStringBuffer sBuffer;
+ for (sal_Int32 i = 0; i != seq.getLength(); ++i)
+ {
+ if (i != 0)
+ sBuffer.append(",");
+ sBuffer.append(OUString::number(seq[i]));
+ }
+ return sBuffer.makeStringAndClear();
+}
+
+OUString lcl_IntListToString(const uno::Sequence<sal_Int32>& seq)
+{
+ OUStringBuffer sBuffer;
+ for (sal_Int32 i = 0; i != seq.getLength(); ++i)
+ {
+ if (i != 0)
+ sBuffer.append(",");
+ sBuffer.append(OUString::number(seq[i]));
+ }
+ return sBuffer.makeStringAndClear();
+}
+
+OUString lcl_IntListToString(const uno::Sequence<sal_Int64>& seq)
+{
+ OUStringBuffer sBuffer;
+ for (sal_Int32 i = 0; i != seq.getLength(); ++i)
+ {
+ if (i != 0)
+ sBuffer.append(",");
+ sBuffer.append(OUString::number(seq[i]));
+ }
+ return sBuffer.makeStringAndClear();
+}
+
+OUString lcl_DoubleListToString(const uno::Sequence<double>& seq)
+{
+ OUStringBuffer sBuffer;
+ for (sal_Int32 i = 0; i != seq.getLength(); ++i)
+ {
+ if (i != 0)
+ sBuffer.append(",");
+ sBuffer.append(OUString::number(seq[i]));
+ }
+ return sBuffer.makeStringAndClear();
+}
+}
+
+void CuiAboutConfigTabPage::FillItems(const Reference<XNameAccess>& xNameAccess,
+ const weld::TreeIter* pParentEntry, int lineage,
+ bool bLoadAll)
+{
+ OUString sPath
+ = Reference<XHierarchicalName>(xNameAccess, uno::UNO_QUERY_THROW)->getHierarchicalName();
+ const uno::Sequence<OUString> seqItems = xNameAccess->getElementNames();
+ for (const OUString& item : seqItems)
+ {
+ Any aNode = xNameAccess->getByName(item);
bool bNotLeaf = false;
- Reference< XNameAccess > xNextNameAccess;
+ Reference<XNameAccess> xNextNameAccess;
try
{
xNextNameAccess.set(aNode, uno::UNO_QUERY);
@@ -278,24 +404,27 @@ void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAcces
}
catch (const RuntimeException&)
{
- TOOLS_WARN_EXCEPTION( "cui.options", "CuiAboutConfigTabPage");
+ TOOLS_WARN_EXCEPTION("cui.options", "CuiAboutConfigTabPage");
}
if (bNotLeaf)
{
- if(bLoadAll)
+ if (bLoadAll)
FillItems(xNextNameAccess, nullptr, lineage + 1, true);
else
{
// not leaf node
- m_vectorUserData.push_back(std::make_unique<UserData>(xNextNameAccess, lineage + 1));
- OUString sId(OUString::number(reinterpret_cast<sal_Int64>(m_vectorUserData.back().get())));
+ m_vectorUserData.push_back(
+ std::make_unique<UserData>(xNextNameAccess, lineage + 1));
+ OUString sId(weld::toId(m_vectorUserData.back().get()));
- m_xPrefBox->insert(pParentEntry, -1, &item, &sId, nullptr, nullptr, true, m_xScratchIter.get());
+ m_xPrefBox->insert(pParentEntry, -1, &item, &sId, nullptr, nullptr, true,
+ m_xScratchIter.get());
// Necessary, without this the selection line will be truncated.
m_xPrefBox->set_text(*m_xScratchIter, "", 1);
m_xPrefBox->set_text(*m_xScratchIter, "", 2);
m_xPrefBox->set_text(*m_xScratchIter, "", 3);
+ m_xPrefBox->set_sensitive(*m_xScratchIter, true);
}
}
else
@@ -303,214 +432,308 @@ void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAcces
// leaf node
OUString sPropertyName = item;
auto it = std::find_if(m_modifiedPrefBoxEntries.begin(), m_modifiedPrefBoxEntries.end(),
- [&sPath, &sPropertyName](const prefBoxEntry& rEntry) -> bool
- {
- return rEntry.pUserData->sPropertyPath == sPath
- && rEntry.sStatus == sPropertyName;
- }
- );
-
- OUString sType = aNode.getValueTypeName();
+ [&sPath, &sPropertyName](const prefBoxEntry& rEntry) -> bool {
+ return rEntry.pUserData->sPropertyPath == sPath
+ && rEntry.sStatus == sPropertyName;
+ });
+
+ css::uno::Reference<css::configuration::XReadWriteAccess> m_xReadWriteAccess;
+ m_xReadWriteAccess = css::configuration::ReadWriteAccess::create(
+ ::comphelper::getProcessComponentContext(), "*");
+ beans::Property aProperty;
+ bool bReadOnly = false;
+ OUString sFullPath(sPath + "/" + sPropertyName);
+ try
+ {
+ aProperty = m_xReadWriteAccess->getPropertyByHierarchicalName(sFullPath);
+ bReadOnly = (aProperty.Attributes & beans::PropertyAttribute::READONLY) != 0;
+ }
+ catch (css::beans::UnknownPropertyException)
+ {
+ SAL_WARN("cui.options", "unknown property: " << sFullPath);
+ }
+
+ OUString sTooltip;
+ OUString sType;
+ bool bWasModified = false;
+ css::uno::Type aType = cppu::UnoType<void>::get();
+ OUString sDynamicType = aNode.getValueTypeName();
+ try
+ {
+ Reference<configuration::XDocumentation> xDocumentation(xNameAccess,
+ UNO_QUERY_THROW);
+ sTooltip
+ = xDocumentation->getDescriptionByHierarchicalName(sPath + "/" + sPropertyName);
+ aType = xDocumentation->getTypeByHierarchicalName(sFullPath);
+ bWasModified = xDocumentation->getModifiedByHierarchicalName(sFullPath);
+ }
+ catch (css::container::NoSuchElementException)
+ {
+ }
+ catch (css::util::InvalidStateException)
+ {
+ }
+
OUStringBuffer sValue;
+ // Fall back to dynamic type when this is empty
+ if (aType == cppu::UnoType<void>::get() && sDynamicType != "void")
+ {
+ if (sDynamicType == "boolean")
+ aType = cppu::UnoType<sal_Bool>::get();
+ else if (sDynamicType == "short")
+ aType = cppu::UnoType<sal_Int16>::get();
+ else if (sDynamicType == "long")
+ aType = cppu::UnoType<sal_Int32>::get();
+ else if (sDynamicType == "hyper")
+ aType = cppu::UnoType<sal_Int64>::get();
+ else if (sDynamicType == "double")
+ aType = cppu::UnoType<double>::get();
+ else if (sDynamicType == "string")
+ aType = cppu::UnoType<OUString>::get();
+ else if (sDynamicType == "[]byte")
+ aType = cppu::UnoType<css::uno::Sequence<sal_Int8>>::get();
+ else if (sDynamicType == "[]boolean")
+ aType = cppu::UnoType<css::uno::Sequence<sal_Bool>>::get();
+ else if (sDynamicType == "[]short")
+ aType = cppu::UnoType<css::uno::Sequence<sal_Int16>>::get();
+ else if (sDynamicType == "[]long")
+ aType = cppu::UnoType<css::uno::Sequence<sal_Int32>>::get();
+ else if (sDynamicType == "[]hyper")
+ aType = cppu::UnoType<css::uno::Sequence<sal_Int64>>::get();
+ else if (sDynamicType == "[]double")
+ aType = cppu::UnoType<css::uno::Sequence<double>>::get();
+ else if (sDynamicType == "[]string")
+ aType = cppu::UnoType<css::uno::Sequence<OUString>>::get();
+ else if (sDynamicType == "[][]byte")
+ aType = cppu::UnoType<css::uno::Sequence<css::uno::Sequence<sal_Int8>>>::get();
+ }
+
if (it != m_modifiedPrefBoxEntries.end())
sValue = it->sValue;
else
{
- switch( aNode.getValueType().getTypeClass() )
+ bool bHasValue = sDynamicType != "void";
+ if (aType == cppu::UnoType<sal_Bool>::get())
{
- case css::uno::TypeClass_VOID:
- break;
-
- case css::uno::TypeClass_BOOLEAN:
- sValue = OUString::boolean( aNode.get<bool>() );
- break;
-
- case css::uno::TypeClass_SHORT:
- case css::uno::TypeClass_LONG:
- case css::uno::TypeClass_HYPER:
- sValue = OUString::number( aNode.get<sal_Int64>() );
- break;
-
- case css::uno::TypeClass_DOUBLE:
- sValue = OUString::number( aNode.get<double>() );
- break;
-
- case css::uno::TypeClass_STRING:
- sValue = aNode.get<OUString>();
- break;
-
- case css::uno::TypeClass_SEQUENCE:
- if( sType == "[]boolean" )
- {
- uno::Sequence<sal_Bool> seq = aNode.get< uno::Sequence<sal_Bool> >();
- for( sal_Int32 j = 0; j != seq.getLength(); ++j )
- {
- if( j != 0 )
- {
- sValue.append(",");
- }
- sValue.append(OUString::boolean( seq[j] ));
- }
- }
- else if( sType == "[]byte" )
+ if (bHasValue)
+ sValue = OUString::boolean(aNode.get<bool>());
+ sType = "boolean";
+ }
+ else if (aType == cppu::UnoType<sal_Int16>::get())
+ {
+ if (bHasValue)
+ sValue = OUString::number(aNode.get<sal_Int16>());
+ sType = "short";
+ }
+ else if (aType == cppu::UnoType<sal_Int32>::get())
+ {
+ if (bHasValue)
+ sValue = OUString::number(aNode.get<sal_Int32>());
+ sType = "int";
+ }
+ else if (aType == cppu::UnoType<sal_Int64>::get())
+ {
+ if (bHasValue)
+ sValue = OUString::number(aNode.get<sal_Int64>());
+ sType = "long";
+ }
+ else if (aType == cppu::UnoType<double>::get())
+ {
+ if (bHasValue)
+ sValue = OUString::number(aNode.get<double>());
+ sType = "double";
+ }
+ else if (aType == cppu::UnoType<OUString>::get())
+ {
+ if (bHasValue)
+ sValue = aNode.get<OUString>();
+ sType = "string";
+ }
+ else if (aType == cppu::UnoType<css::uno::Sequence<sal_Int8>>::get())
+ {
+ if (bHasValue)
{
- const uno::Sequence<sal_Int8> seq = aNode.get< uno::Sequence<sal_Int8> >();
- for( sal_Int8 j : seq )
+ const uno::Sequence<sal_Int8> seq = aNode.get<uno::Sequence<sal_Int8>>();
+ for (sal_Int8 j : seq)
{
- OUString s = OUString::number(
- static_cast<sal_uInt8>(j), 16 );
- if( s.getLength() == 1 )
+ OUString s = OUString::number(static_cast<sal_uInt8>(j), 16);
+ if (s.getLength() == 1)
{
sValue.append("0");
}
sValue.append(s.toAsciiUpperCase());
}
}
- else if( sType == "[][]byte" )
+ sType = "hexBinary";
+ }
+ else if (aType == cppu::UnoType<css::uno::Sequence<sal_Bool>>::get())
+ {
+ if (bHasValue)
{
- const uno::Sequence< uno::Sequence<sal_Int8> > seq = aNode.get< uno::Sequence< uno::Sequence<sal_Int8> > >();
- for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+ uno::Sequence<sal_Bool> seq = aNode.get<uno::Sequence<sal_Bool>>();
+ for (sal_Int32 j = 0; j != seq.getLength(); ++j)
{
- if( j != 0 )
+ if (j != 0)
{
sValue.append(",");
}
- for( sal_Int8 k : seq[j] )
- {
- OUString s = OUString::number(
- static_cast<sal_uInt8>(k), 16 );
- if( s.getLength() == 1 )
- {
- sValue.append("0");
- }
- sValue.append(s.toAsciiUpperCase());
- }
+ sValue.append(OUString::boolean(seq[j]));
}
}
- else if( sType == "[]short" )
+ sType = "boolean-list";
+ }
+ else if (aType == cppu::UnoType<css::uno::Sequence<sal_Int16>>::get())
+ {
+ if (bHasValue)
{
- uno::Sequence<sal_Int16> seq = aNode.get< uno::Sequence<sal_Int16> >();
- for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+ uno::Sequence<sal_Int16> seq = aNode.get<uno::Sequence<sal_Int16>>();
+ for (sal_Int32 j = 0; j != seq.getLength(); ++j)
{
- if( j != 0 )
+ if (j != 0)
{
sValue.append(",");
}
- sValue.append( static_cast<sal_Int32>(seq[j]) );
+ sValue.append(static_cast<sal_Int32>(seq[j]));
}
}
- else if( sType == "[]long" )
+ sType = "short-list";
+ }
+ else if (aType == cppu::UnoType<css::uno::Sequence<sal_Int32>>::get())
+ {
+ if (bHasValue)
{
- uno::Sequence<sal_Int32> seq = aNode.get< uno::Sequence<sal_Int32> >();
- for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+ uno::Sequence<sal_Int32> seq = aNode.get<uno::Sequence<sal_Int32>>();
+ for (sal_Int32 j = 0; j != seq.getLength(); ++j)
{
- if( j != 0 )
+ if (j != 0)
{
sValue.append(",");
}
- sValue.append( seq[j] );
+ sValue.append(seq[j]);
}
}
- else if( sType == "[]hyper" )
+ sType = "int-list";
+ }
+ else if (aType == cppu::UnoType<css::uno::Sequence<sal_Int64>>::get())
+ {
+ if (bHasValue)
{
- uno::Sequence<sal_Int64> seq = aNode.get< uno::Sequence<sal_Int64> >();
- for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+ uno::Sequence<sal_Int64> seq = aNode.get<uno::Sequence<sal_Int64>>();
+ for (sal_Int32 j = 0; j != seq.getLength(); ++j)
{
- if( j != 0 )
+ if (j != 0)
{
sValue.append(",");
}
- sValue.append( seq[j] );
+ sValue.append(seq[j]);
}
}
- else if( sType == "[]double" )
+ sType = "long-list";
+ }
+ else if (aType == cppu::UnoType<css::uno::Sequence<double>>::get())
+ {
+ if (bHasValue)
{
- uno::Sequence<double> seq = aNode.get< uno::Sequence<double> >();
- for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+ uno::Sequence<double> seq = aNode.get<uno::Sequence<double>>();
+ for (sal_Int32 j = 0; j != seq.getLength(); ++j)
{
- if( j != 0 )
+ if (j != 0)
{
sValue.append(",");
}
- sValue.append( seq[j] );
+ sValue.append(seq[j]);
}
}
- else if( sType == "[]string" )
+ sType = "double-list";
+ }
+ else if (aType == cppu::UnoType<css::uno::Sequence<OUString>>::get())
+ {
+ if (bHasValue)
+ sValue = lcl_StringListToString(aNode.get<uno::Sequence<OUString>>());
+ sType = "string-list";
+ }
+ else if (aType
+ == cppu::UnoType<css::uno::Sequence<css::uno::Sequence<sal_Int8>>>::get())
+ {
+ if (bHasValue)
{
- uno::Sequence<OUString> seq = aNode.get< uno::Sequence<OUString> >();
- for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+ const uno::Sequence<uno::Sequence<sal_Int8>> seq
+ = aNode.get<uno::Sequence<uno::Sequence<sal_Int8>>>();
+ for (sal_Int32 j = 0; j != seq.getLength(); ++j)
{
- if( j != 0 )
+ if (j != 0)
{
sValue.append(",");
}
- sValue.append(seq[j]);
+ for (sal_Int8 k : seq[j])
+ {
+ OUString s = OUString::number(static_cast<sal_uInt8>(k), 16);
+ if (s.getLength() == 1)
+ {
+ sValue.append("0");
+ }
+ sValue.append(s.toAsciiUpperCase());
+ }
}
}
- else
- {
- SAL_WARN(
- "cui.options",
- "path \"" << sPath << "\" member " << item
- << " of unsupported type " << sType);
- }
- break;
-
- default:
- SAL_WARN(
- "cui.options",
- "path \"" << sPath << "\" member " << item
- << " of unsupported type " << sType);
- break;
+ sType = "hexBinary-list";
+ }
+ else
+ {
+ SAL_INFO("cui.options", "path \"" << sPath << "\" member " << item
+ << " of unsupported type " << sType);
+ continue;
}
}
//Short name
int index = 0;
- for(int j = 1; j < lineage; ++j)
+ for (int j = 1; j < lineage; ++j)
index = sPath.indexOf("/", index + 1);
- InsertEntry(sPath, sPath.copy(index+1), item, sType, sValue.makeStringAndClear(), pParentEntry, !bLoadAll);
+ InsertEntry(sPath, aNode, sPath.copy(index + 1), item, sType,
+ sValue.makeStringAndClear(), sTooltip, pParentEntry, !bLoadAll, bReadOnly,
+ bWasModified);
}
}
}
-Reference< XNameAccess > CuiAboutConfigTabPage::getConfigAccess( const OUString& sNodePath, bool bUpdate )
+Reference<XNameAccess> CuiAboutConfigTabPage::getConfigAccess(const OUString& sNodePath,
+ bool bUpdate)
{
- uno::Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
+ uno::Reference<uno::XComponentContext> xContext(::comphelper::getProcessComponentContext());
- uno::Reference< lang::XMultiServiceFactory > xConfigProvider(
- css::configuration::theDefaultProvider::get( xContext ) );
+ uno::Reference<lang::XMultiServiceFactory> xConfigProvider(
+ css::configuration::theDefaultProvider::get(xContext));
beans::NamedValue aProperty;
aProperty.Name = "nodepath";
aProperty.Value <<= sNodePath;
- uno::Sequence< uno::Any > aArgumentList{ uno::Any(aProperty) };
+ uno::Sequence<uno::Any> aArgumentList{ uno::Any(aProperty) };
OUString sAccessString;
- if( bUpdate )
+ if (bUpdate)
sAccessString = "com.sun.star.configuration.ConfigurationUpdateAccess";
else
sAccessString = "com.sun.star.configuration.ConfigurationAccess";
- uno::Reference< container::XNameAccess > xNameAccess(
- xConfigProvider->createInstanceWithArguments(
- sAccessString, aArgumentList ),
- uno::UNO_QUERY_THROW );
+ uno::Reference<container::XNameAccess> xNameAccess(
+ xConfigProvider->createInstanceWithArguments(sAccessString, aArgumentList),
+ uno::UNO_QUERY_THROW);
return xNameAccess;
}
-void CuiAboutConfigTabPage::AddToModifiedVector( const std::shared_ptr< Prop_Impl >& rProp )
+void CuiAboutConfigTabPage::AddToModifiedVector(const std::shared_ptr<Prop_Impl>& rProp)
{
bool isModifiedBefore = false;
//Check if value modified before
- for(std::shared_ptr<Prop_Impl> & nInd : m_vectorOfModified)
+ for (std::shared_ptr<Prop_Impl>& nInd : m_vectorOfModified)
{
- if( rProp->Name == nInd->Name && rProp->Property == nInd->Property )
+ if (rProp->Name == nInd->Name && rProp->Property == nInd->Property)
{
//property modified before. Assign reference to the modified value
//do your changes on this object. They will be saved later.
@@ -520,47 +743,28 @@ void CuiAboutConfigTabPage::AddToModifiedVector( const std::shared_ptr< Prop_Imp
}
}
- if( !isModifiedBefore )
- m_vectorOfModified.push_back( rProp );
+ if (!isModifiedBefore)
+ m_vectorOfModified.push_back(rProp);
//property is not modified before
}
-std::vector< OUString > CuiAboutConfigTabPage::commaStringToSequence( const OUString& rCommaSepString )
+std::vector<OUString>
+CuiAboutConfigTabPage::commaStringToSequence(std::u16string_view rCommaSepString)
{
std::vector<OUString> tempVector;
sal_Int32 index = 0;
do
{
- OUString word = rCommaSepString.getToken(0, u',', index);
+ OUString word(o3tl::getToken(rCommaSepString, 0, u',', index));
word = word.trim();
- if( !word.isEmpty())
+ if (!word.isEmpty())
tempVector.push_back(word);
- }while( index >= 0 );
+ } while (index >= 0);
return tempVector;
}
-CuiAboutConfigValueDialog::CuiAboutConfigValueDialog(weld::Window* pWindow,
- const OUString& rValue,
- int limit)
- : GenericDialogController(pWindow, "cui/ui/aboutconfigvaluedialog.ui", "AboutConfigValueDialog")
- , m_bNumericOnly(limit != 0)
- , m_xEDValue(m_xBuilder->weld_entry("valuebox"))
-{
- if (limit)
- m_xEDValue->set_max_length(limit);
- m_xEDValue->set_text(rValue);
- m_xEDValue->connect_key_press(LINK(this, CuiAboutConfigValueDialog, KeyInputHdl));
-}
-
-CuiAboutConfigValueDialog::~CuiAboutConfigValueDialog()
-{
-}
-
-IMPL_LINK_NOARG( CuiAboutConfigTabPage, ResetBtnHdl_Impl, weld::Button&, void )
-{
- Reset();
-}
+IMPL_LINK_NOARG(CuiAboutConfigTabPage, ResetBtnHdl_Impl, weld::Button&, void) { Reset(); }
IMPL_LINK_NOARG(CuiAboutConfigTabPage, DoubleClickHdl_Impl, weld::TreeView&, bool)
{
@@ -568,13 +772,13 @@ IMPL_LINK_NOARG(CuiAboutConfigTabPage, DoubleClickHdl_Impl, weld::TreeView&, boo
return true;
}
-IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, weld::Button&, void )
+IMPL_LINK_NOARG(CuiAboutConfigTabPage, StandardHdl_Impl, weld::Button&, void)
{
if (!m_xPrefBox->get_selected(m_xScratchIter.get()))
return;
- UserData *pUserData = reinterpret_cast<UserData*>(m_xPrefBox->get_id(*m_xScratchIter).toInt64());
- if (!(pUserData && pUserData->bIsPropertyPath))
+ UserData* pUserData = weld::fromId<UserData*>(m_xPrefBox->get_id(*m_xScratchIter));
+ if (!pUserData || !pUserData->bIsPropertyPath || pUserData->bIsReadOnly)
return;
//if selection is a node
@@ -582,16 +786,17 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, weld::Button&, void )
OUString sPropertyType = m_xPrefBox->get_text(*m_xScratchIter, 2);
OUString sPropertyValue = m_xPrefBox->get_text(*m_xScratchIter, 3);
- auto pProperty = std::make_shared<Prop_Impl>( pUserData->sPropertyPath, sPropertyName, Any( sPropertyValue ) );
+ auto pProperty
+ = std::make_shared<Prop_Impl>(pUserData->sPropertyPath, sPropertyName, Any(sPropertyValue));
bool bSaveChanges = false;
bool bOpenDialog = true;
OUString sDialogValue;
- if( sPropertyType == "boolean" )
+ if (sPropertyType == "boolean")
{
bool bValue;
- if( sPropertyValue == "true" )
+ if (sPropertyValue == "true")
{
sDialogValue = "false";
bValue = false;
@@ -606,10 +811,6 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, weld::Button&, void )
bOpenDialog = false;
bSaveChanges = true;
}
- else if ( sPropertyType == "void" )
- {
- bOpenDialog = false;
- }
else
{
sDialogValue = sPropertyValue;
@@ -618,154 +819,180 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, weld::Button&, void )
try
{
- if( bOpenDialog )
+ if (bOpenDialog)
{
- //Cosmetic length limit for integer values.
- int limit=0;
- if( sPropertyType == "short" )
- limit = SHORT_LEN_LIMIT;
- else if( sPropertyType == "long" )
- limit = LONG_LEN_LIMIT;
- else if( sPropertyType == "hyper" )
- limit = HYPER_LEN_LIMIT;
-
- CuiAboutConfigValueDialog aValueDialog(m_xDialog.get(), sDialogValue, limit);
-
- if (aValueDialog.run() == RET_OK )
+ if (sPropertyType == "short" || sPropertyType == "int" || sPropertyType == "long")
{
- OUString sNewValue = aValueDialog.getValue();
- bSaveChanges = true;
- if ( sPropertyType == "short")
- {
- sal_Int16 nShort;
- sal_Int32 nNumb = sNewValue.toInt32();
-
- //if the value is 0 and length is not 1, there is something wrong
- if( ( nNumb==0 && sNewValue.getLength()!=1 ) || nNumb > SAL_MAX_INT16 || nNumb < SAL_MIN_INT16)
- throw uno::Exception("out of range short", nullptr);
- nShort = static_cast<sal_Int16>(nNumb);
- pProperty->Value <<= nShort;
- }
- else if( sPropertyType == "long" )
+ sal_Int64 nMin = sPropertyType == "short"
+ ? SAL_MIN_INT16
+ : sPropertyType == "int" ? SAL_MIN_INT32 : SAL_MIN_INT64;
+ sal_Int64 nMax = sPropertyType == "short"
+ ? SAL_MAX_INT16
+ : sPropertyType == "int" ? SAL_MAX_INT32 : SAL_MAX_INT64;
+ SvxNumberDialog aNumberDialog(m_xDialog.get(), sPropertyName,
+ sDialogValue.toInt64(), nMin, nMax);
+ if (aNumberDialog.run() == RET_OK)
{
- sal_Int32 nLong = sNewValue.toInt32();
- if( nLong==0 && sNewValue.getLength()!=1)
- throw uno::Exception("out of range long", nullptr);
- pProperty->Value <<= nLong;
- }
- else if( sPropertyType == "hyper")
- {
- sal_Int64 nHyper = sNewValue.toInt64();
- if( nHyper==0 && sNewValue.getLength()!=1)
- throw uno::Exception("out of range hyper", nullptr);
- pProperty->Value <<= nHyper;
- }
- else if( sPropertyType == "double")
- {
- double nDoub = sNewValue.toDouble();
- if( nDoub ==0 && sNewValue.getLength()!=1)
- throw uno::Exception("out of range double", nullptr);
- pProperty->Value <<= nDoub;
+ sal_Int64 nNewValue = aNumberDialog.GetNumber();
+ if (sPropertyType == "short")
+ {
+ pProperty->Value <<= static_cast<sal_Int16>(nNewValue);
+ }
+ else if (sPropertyType == "int")
+ {
+ pProperty->Value <<= static_cast<sal_Int32>(nNewValue);
+ }
+ else if (sPropertyType == "long")
+ {
+ pProperty->Value <<= nNewValue;
+ }
+ bSaveChanges = true;
+ sDialogValue = OUString::number(nNewValue);
}
- else if( sPropertyType == "float")
+ }
+ else if (sPropertyType == "double")
+ {
+ SvxDecimalNumberDialog aNumberDialog(m_xDialog.get(), sPropertyName,
+ sDialogValue.toDouble());
+ if (aNumberDialog.run() == RET_OK)
{
- float nFloat = sNewValue.toFloat();
- if( nFloat ==0 && sNewValue.getLength()!=1)
- throw uno::Exception("out of range float", nullptr);
- pProperty->Value <<= nFloat;
+ double fNewValue = aNumberDialog.GetNumber();
+ pProperty->Value <<= fNewValue;
+ bSaveChanges = true;
+ sDialogValue = OUString::number(fNewValue);
}
- else if( sPropertyType == "string" )
+ }
+ else if (sPropertyType == "string")
+ {
+ SvxNameDialog aNameDialog(m_xDialog.get(), sDialogValue, sPropertyName);
+ aNameDialog.SetCheckNameHdl(LINK(this, CuiAboutConfigTabPage, ValidNameHdl));
+ if (aNameDialog.run() == RET_OK)
{
- pProperty->Value <<= sNewValue;
+ sDialogValue = aNameDialog.GetName();
+ pProperty->Value <<= sDialogValue;
+ bSaveChanges = true;
}
- else if( sPropertyType == "[]short" )
+ }
+ else if (sPropertyType == "short-list")
+ {
+ SvxListDialog aListDialog(m_xDialog.get());
+ aListDialog.SetEntries(commaStringToSequence(sDialogValue));
+ aListDialog.SetMode(ListMode::Int16);
+ if (aListDialog.run() == RET_OK)
{
- //create string sequence from comma separated string
- //uno::Sequence< OUString > seqStr;
- std::vector< OUString > seqStr = commaStringToSequence( sNewValue );
-
- //create appropriate sequence with same size as string sequence
- uno::Sequence< sal_Int16 > seqShort( seqStr.size() );
- //convert all strings to appropriate type
- std::transform(seqStr.begin(), seqStr.end(), seqShort.getArray(),
- [](const auto& str)
- { return static_cast<sal_Int16>(str.toInt32()); });
+ std::vector<OUString> seqStr = aListDialog.GetEntries();
+ uno::Sequence<sal_Int16> seqShort(seqStr.size());
+ std::transform(
+ seqStr.begin(), seqStr.end(), seqShort.getArray(),
+ [](const auto& str) { return static_cast<sal_Int16>(str.toInt32()); });
pProperty->Value <<= seqShort;
+ sDialogValue = lcl_IntListToString(seqShort);
+ bSaveChanges = true;
}
- else if( sPropertyType == "[]long" )
- {
- std::vector< OUString > seqStrLong = commaStringToSequence( sNewValue );
-
- uno::Sequence< sal_Int32 > seqLong( seqStrLong.size() );
- std::transform(seqStrLong.begin(), seqStrLong.end(), seqLong.getArray(),
- [](const auto& str) { return str.toInt32(); });
- pProperty->Value <<= seqLong;
- }
- else if( sPropertyType == "[]hyper" )
+ }
+ else if (sPropertyType == "int-list")
+ {
+ SvxListDialog aListDialog(m_xDialog.get());
+ aListDialog.SetEntries(commaStringToSequence(sDialogValue));
+ aListDialog.SetMode(ListMode::Int32);
+ if (aListDialog.run() == RET_OK)
{
- std::vector< OUString > seqStrHyper = commaStringToSequence( sNewValue );
- uno::Sequence< sal_Int64 > seqHyper( seqStrHyper.size() );
- std::transform(seqStrHyper.begin(), seqStrHyper.end(), seqHyper.getArray(),
- [](const auto& str) { return str.toInt64(); });
- pProperty->Value <<= seqHyper;
+ std::vector<OUString> seqStr = aListDialog.GetEntries();
+ uno::Sequence<sal_Int32> seq(seqStr.size());
+ std::transform(
+ seqStr.begin(), seqStr.end(), seq.getArray(),
+ [](const auto& str) { return static_cast<sal_Int32>(str.toInt32()); });
+ pProperty->Value <<= seq;
+ sDialogValue = lcl_IntListToString(seq);
+ bSaveChanges = true;
}
- else if( sPropertyType == "[]double" )
+ }
+ else if (sPropertyType == "long-list")
+ {
+ SvxListDialog aListDialog(m_xDialog.get());
+ aListDialog.SetEntries(commaStringToSequence(sDialogValue));
+ aListDialog.SetMode(ListMode::Int64);
+ if (aListDialog.run() == RET_OK)
{
- std::vector< OUString > seqStrDoub = commaStringToSequence( sNewValue );
- uno::Sequence< double > seqDoub( seqStrDoub.size() );
- std::transform(seqStrDoub.begin(), seqStrDoub.end(), seqDoub.getArray(),
- [](const auto& str) { return str.toDouble(); });
- pProperty->Value <<= seqDoub;
+ std::vector<OUString> seqStr = aListDialog.GetEntries();
+ uno::Sequence<sal_Int64> seq(seqStr.size());
+ std::transform(
+ seqStr.begin(), seqStr.end(), seq.getArray(),
+ [](const auto& str) { return static_cast<sal_Int64>(str.toInt32()); });
+ pProperty->Value <<= seq;
+ sDialogValue = lcl_IntListToString(seq);
+ bSaveChanges = true;
}
- else if( sPropertyType == "[]float" )
+ }
+ else if (sPropertyType == "double-list")
+ {
+ SvxListDialog aListDialog(m_xDialog.get());
+ aListDialog.SetEntries(commaStringToSequence(sDialogValue));
+ aListDialog.SetMode(ListMode::Double);
+ if (aListDialog.run() == RET_OK)
{
- std::vector< OUString > seqStrFloat = commaStringToSequence( sNewValue );
- uno::Sequence< sal_Int16 > seqFloat( seqStrFloat.size() );
- std::transform(seqStrFloat.begin(), seqStrFloat.end(), seqFloat.getArray(),
- [](const auto& str) { return str.toFloat(); });
- pProperty->Value <<= seqFloat;
+ std::vector<OUString> seqStr = aListDialog.GetEntries();
+ uno::Sequence<double> seq(seqStr.size());
+ std::transform(
+ seqStr.begin(), seqStr.end(), seq.getArray(),
+ [](const auto& str) { return static_cast<double>(str.toDouble()); });
+ pProperty->Value <<= seq;
+ sDialogValue = lcl_DoubleListToString(seq);
+ bSaveChanges = true;
}
- else if( sPropertyType == "[]string" )
+ }
+ else if (sPropertyType == "string-list")
+ {
+ SvxListDialog aListDialog(m_xDialog.get());
+ uno::Sequence<OUString> aList
+ = pUserData->aPropertyValue.get<uno::Sequence<OUString>>();
+ aListDialog.SetEntries(
+ comphelper::sequenceToContainer<std::vector<OUString>>(aList));
+ aListDialog.SetMode(ListMode::String);
+ if (aListDialog.run() == RET_OK)
{
- pProperty->Value <<= comphelper::containerToSequence( commaStringToSequence( sNewValue ));
+ auto seq = comphelper::containerToSequence(aListDialog.GetEntries());
+ sDialogValue = lcl_StringListToString(seq);
+ pProperty->Value <<= seq;
+ bSaveChanges = true;
}
- else //unknown
- throw uno::Exception("unknown property type " + sPropertyType, nullptr);
-
- sDialogValue = sNewValue;
}
+ else //unknown
+ throw uno::Exception("unknown property type " + sPropertyType, nullptr);
}
- if(bSaveChanges)
+ if (bSaveChanges)
{
- AddToModifiedVector( pProperty );
+ AddToModifiedVector(pProperty);
+ pUserData->aPropertyValue = pProperty->Value;
//update listbox value.
+ m_xPrefBox->set_text(*m_xScratchIter, sPropertyType, 2);
m_xPrefBox->set_text(*m_xScratchIter, sDialogValue, 3);
+ m_xPrefBox->set_text_emphasis(*m_xScratchIter, true, -1);
//update m_prefBoxEntries
- auto it = std::find_if(m_prefBoxEntries.begin(), m_prefBoxEntries.end(),
- [&pUserData, &sPropertyName](const prefBoxEntry& rEntry) -> bool
- {
- return rEntry.pUserData->sPropertyPath == pUserData->sPropertyPath
- && rEntry.sStatus == sPropertyName;
- }
- );
+ auto it = std::find_if(
+ m_prefBoxEntries.begin(), m_prefBoxEntries.end(),
+ [&pUserData, &sPropertyName](const prefBoxEntry& rEntry) -> bool {
+ return rEntry.pUserData->sPropertyPath == pUserData->sPropertyPath
+ && rEntry.sStatus == sPropertyName;
+ });
if (it != m_prefBoxEntries.end())
{
it->sValue = sDialogValue;
+ it->pUserData->bWasModified = true;
auto modifiedIt = std::find_if(
- m_modifiedPrefBoxEntries.begin(), m_modifiedPrefBoxEntries.end(),
- [&pUserData, &sPropertyName](const prefBoxEntry& rEntry) -> bool
- {
- return rEntry.pUserData->sPropertyPath == pUserData->sPropertyPath
- && rEntry.sStatus == sPropertyName;
- }
- );
+ m_modifiedPrefBoxEntries.begin(), m_modifiedPrefBoxEntries.end(),
+ [&pUserData, &sPropertyName](const prefBoxEntry& rEntry) -> bool {
+ return rEntry.pUserData->sPropertyPath == pUserData->sPropertyPath
+ && rEntry.sStatus == sPropertyName;
+ });
if (modifiedIt != m_modifiedPrefBoxEntries.end())
{
modifiedIt->sValue = sDialogValue;
+ modifiedIt->pUserData->bWasModified = true;
}
else
{
@@ -774,74 +1001,24 @@ IMPL_LINK_NOARG( CuiAboutConfigTabPage, StandardHdl_Impl, weld::Button&, void )
}
}
}
- catch( uno::Exception& )
+ catch (uno::Exception&)
{
}
}
-IMPL_LINK_NOARG( CuiAboutConfigTabPage, SearchHdl_Impl, weld::Button&, void)
-{
- weld::WaitObject aWait(m_xDialog.get());
-
- m_xPrefBox->hide();
- m_xPrefBox->clear();
- m_xPrefBox->freeze();
-
- if (m_bSorted)
- m_xPrefBox->make_unsorted();
+IMPL_LINK_NOARG(CuiAboutConfigTabPage, SearchHdl_Impl, weld::Button&, void) { InputChanged(); }
- if (m_xSearchEdit->get_text().isEmpty())
- {
- m_xPrefBox->clear();
- Reference< XNameAccess > xConfigAccess = getConfigAccess( "/", false );
- FillItems( xConfigAccess );
- }
- else
- {
- m_options.searchString = m_xSearchEdit->get_text();
- utl::TextSearch textSearch( m_options );
- for (auto const& it : m_prefBoxEntries)
- {
- sal_Int32 endPos, startPos = 0;
-
- for(size_t i = 0; i < 5; ++i)
- {
- OUString scrTxt;
-
- if (i == 0)
- scrTxt = it.pUserData->sPropertyPath;
- else if (i == 1)
- scrTxt = it.sProp;
- else if (i == 2)
- scrTxt = it.sStatus;
- else if (i == 3)
- scrTxt = it.sType;
- else if (i == 4)
- scrTxt = it.sValue;
-
- endPos = scrTxt.getLength();
- if (textSearch.SearchForward(scrTxt, &startPos, &endPos))
- {
- InsertEntry(it);
- break;
- }
- }
- }
- }
-
- m_xPrefBox->thaw();
- if (m_bSorted)
- m_xPrefBox->make_sorted();
-
- m_xPrefBox->all_foreach([this](weld::TreeIter& rEntry) {
- m_xPrefBox->expand_row(rEntry);
- return false;
- });
- m_xPrefBox->show();
+IMPL_LINK_NOARG(CuiAboutConfigTabPage, ModifiedHdl_Impl, weld::Toggleable&, void)
+{
+ InputChanged();
}
void CuiAboutConfigTabPage::InsertEntry(const prefBoxEntry& rEntry)
{
+ bool bOnlyModified = m_xModifiedCheckBtn->get_active();
+ if (bOnlyModified && !rEntry.pUserData->bWasModified)
+ return;
+
OUString sPathWithProperty = rEntry.pUserData->sPropertyPath;
sal_Int32 index = sPathWithProperty.lastIndexOf(rEntry.sProp);
OUString sPath = sPathWithProperty.copy(0, index);
@@ -852,18 +1029,21 @@ void CuiAboutConfigTabPage::InsertEntry(const prefBoxEntry& rEntry)
do
{
int prevIndex = index;
- index = sPath.indexOf("/", index+1);
+ index = sPath.indexOf("/", index + 1);
// deal with no parent case (tdf#107811)
if (index < 0)
{
- OUString sId(OUString::number(reinterpret_cast<sal_Int64>(rEntry.pUserData)));
- m_xPrefBox->insert(nullptr, -1, &rEntry.sProp, &sId, nullptr, nullptr, false, m_xScratchIter.get());
+ OUString sId(weld::toId(rEntry.pUserData));
+ m_xPrefBox->insert(nullptr, -1, &rEntry.sProp, &sId, nullptr, nullptr, false,
+ m_xScratchIter.get());
m_xPrefBox->set_text(*m_xScratchIter, rEntry.sStatus, 1);
m_xPrefBox->set_text(*m_xScratchIter, rEntry.sType, 2);
m_xPrefBox->set_text(*m_xScratchIter, rEntry.sValue, 3);
+ m_xPrefBox->set_text_emphasis(*m_xScratchIter, rEntry.pUserData->bWasModified, -1);
+ m_xPrefBox->set_sensitive(*m_xScratchIter, !rEntry.pUserData->bIsReadOnly);
return;
}
- OUString sParentName = sPath.copy(prevIndex+1, index - prevIndex - 1);
+ OUString sParentName = sPath.copy(prevIndex + 1, index - prevIndex - 1);
bool hasEntry = false;
bool bStartOk;
@@ -890,28 +1070,33 @@ void CuiAboutConfigTabPage::InsertEntry(const prefBoxEntry& rEntry)
if (!hasEntry)
{
- m_xPrefBox->insert(xGrandParentEntry.get(), -1, &sParentName, nullptr, nullptr, nullptr, false, xParentEntry.get());
+ m_xPrefBox->insert(xGrandParentEntry.get(), -1, &sParentName, nullptr, nullptr, nullptr,
+ false, xParentEntry.get());
//It is needed, without this the selection line will be truncated.
m_xPrefBox->set_text(*xParentEntry, "", 1);
m_xPrefBox->set_text(*xParentEntry, "", 2);
m_xPrefBox->set_text(*xParentEntry, "", 3);
+ m_xPrefBox->set_sensitive(*xParentEntry, true);
}
xGrandParentEntry = m_xPrefBox->make_iterator(xParentEntry.get());
- } while(index < sPath.getLength() - 1);
+ } while (index < sPath.getLength() - 1);
- OUString sId(OUString::number(reinterpret_cast<sal_Int64>(rEntry.pUserData)));
- m_xPrefBox->insert(xParentEntry.get(), -1, &rEntry.sProp, &sId, nullptr, nullptr, false, m_xScratchIter.get());
+ OUString sId(weld::toId(rEntry.pUserData));
+ m_xPrefBox->insert(xParentEntry.get(), -1, &rEntry.sProp, &sId, nullptr, nullptr, false,
+ m_xScratchIter.get());
m_xPrefBox->set_text(*m_xScratchIter, rEntry.sStatus, 1);
m_xPrefBox->set_text(*m_xScratchIter, rEntry.sType, 2);
m_xPrefBox->set_text(*m_xScratchIter, rEntry.sValue, 3);
+ m_xPrefBox->set_text_emphasis(*m_xScratchIter, rEntry.pUserData->bWasModified, -1);
+ m_xPrefBox->set_sensitive(*m_xScratchIter, !rEntry.pUserData->bIsReadOnly);
}
IMPL_LINK(CuiAboutConfigTabPage, ExpandingHdl_Impl, const weld::TreeIter&, rEntry, bool)
{
if (m_xPrefBox->iter_has_child(rEntry))
return true;
- UserData *pUserData = reinterpret_cast<UserData*>(m_xPrefBox->get_id(rEntry).toInt64());
+ UserData* pUserData = weld::fromId<UserData*>(m_xPrefBox->get_id(rEntry));
if (pUserData && !pUserData->bIsPropertyPath)
{
assert(pUserData->aXNameAccess.is());