summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2014-11-05 23:15:20 +0200
committerTor Lillqvist <tml@collabora.com>2014-11-06 11:49:25 +0200
commit97a74ee6b86532ac9c1f5c4b2d0d0a557e5ddb59 (patch)
treec9d2003dc7b16e1ebd44292360c36c85278fe687
parentef809ce9480182ea5c4f77843f72d1d45bd48c35 (diff)
Intermediate commit: start on whitelist/blacklist of OpenCL implementations
Change-Id: I5a6ef8f5e428ec4e62b3fdac8fe3e63f0ae58f1b
-rw-r--r--officecfg/registry/schema/org/openoffice/Office/Calc.xcs14
-rw-r--r--sc/inc/calcconfig.hxx3
-rw-r--r--sc/source/core/tool/calcconfig.cxx30
-rw-r--r--sc/source/core/tool/formulaopt.cxx67
-rw-r--r--sc/source/ui/optdlg/calcoptionsdlg.cxx99
-rw-r--r--sc/source/ui/optdlg/calcoptionsdlg.hxx28
-rw-r--r--sc/uiconfig/scalc/ui/formulacalculationoptions.ui346
7 files changed, 571 insertions, 16 deletions
diff --git a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
index d0eb9d12e026..ba44e306e7e6 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
@@ -1389,6 +1389,20 @@
</info>
<value/>
</prop>
+ <prop oor:name="OpenCLWhiteList" oor:type="oor:string-list" oor:nillable="false">
+ <!-- UIHints: Tools - Options Spreadsheet Formula -->
+ <info>
+ <desc>Combinations of (OS, OS version, OpenCL platform vendor, OpenCL device name, OpenCL driver version) that are known to be good. Has higher priority than OpenCLBlackList. Each entry is a string consisting of five parts separated by slashes. In case a slash occurs inside a part, it is prefixed by a backslash. And in case a backslash occurs inside a part, it is also prefixed by another backslash. Any part might contain a single asterisk as a wildcard, matching any value, but there is no more generic regexp support.</desc>
+ </info>
+ <value/>
+ </prop>
+ <prop oor:name="OpenCLBlackList" oor:type="oor:string-list" oor:nillable="false">
+ <!-- UIHints: Tools - Options Spreadsheet Formula -->
+ <info>
+ <desc>Like OpenCLWhiteList, but for combinations known to be bad.</desc>
+ </info>
+ <value separator=";">Windows/*/Intel(R) Corporation/9.17.10.2884;SuperOS/1.0/Big Corp, Inc./2.3\/beta</value>
+ </prop>
</group>
<group oor:name="Syntax">
<info>
diff --git a/sc/inc/calcconfig.hxx b/sc/inc/calcconfig.hxx
index 3a54efd56a1d..aa286a05196c 100644
--- a/sc/inc/calcconfig.hxx
+++ b/sc/inc/calcconfig.hxx
@@ -52,6 +52,9 @@ struct SC_DLLPUBLIC ScCalcConfig
sal_Int32 mnOpenCLMinimumFormulaGroupSize;
std::set<OpCodeEnum> maOpenCLSubsetOpCodes;
+ std::set<OUString> maOpenCLWhiteList;
+ std::set<OUString> maOpenCLBlackList;
+
ScCalcConfig();
void setOpenCLConfigToDefault();
diff --git a/sc/source/core/tool/calcconfig.cxx b/sc/source/core/tool/calcconfig.cxx
index 7d50d784a954..529f86d741f1 100644
--- a/sc/source/core/tool/calcconfig.cxx
+++ b/sc/source/core/tool/calcconfig.cxx
@@ -38,6 +38,10 @@ void ScCalcConfig::setOpenCLConfigToDefault()
mbOpenCLAutoSelect = true;
mnOpenCLMinimumFormulaGroupSize = 20;
maOpenCLSubsetOpCodes = {ocMin, ocMax, ocSum, ocAverage, ocSumIfs};
+ maOpenCLBlackList = {
+ "Windows/*/Intel(R) Corporation/9.17.10.2884",
+ "SuperOS/1.0/Big Corp, Inc./2.3\\/beta"
+ };
}
void ScCalcConfig::reset()
@@ -64,7 +68,9 @@ bool ScCalcConfig::operator== (const ScCalcConfig& r) const
mbOpenCLAutoSelect == r.mbOpenCLAutoSelect &&
maOpenCLDevice == r.maOpenCLDevice &&
mnOpenCLMinimumFormulaGroupSize == r.mnOpenCLMinimumFormulaGroupSize &&
- maOpenCLSubsetOpCodes == r.maOpenCLSubsetOpCodes;
+ maOpenCLSubsetOpCodes == r.maOpenCLSubsetOpCodes &&
+ maOpenCLWhiteList == r.maOpenCLWhiteList &&
+ maOpenCLBlackList == r.maOpenCLBlackList;
}
bool ScCalcConfig::operator!= (const ScCalcConfig& r) const
@@ -72,6 +78,20 @@ bool ScCalcConfig::operator!= (const ScCalcConfig& r) const
return !operator==(r);
}
+namespace {
+
+void writeStringSet(std::ostream& rStream, const std::set<OUString>& rSet)
+{
+ for (auto i = rSet.cbegin(); i != rSet.cend(); ++i)
+ {
+ if (i != rSet.cbegin())
+ rStream << ",";
+ rStream << (*i).replaceAll(",", "\\,");
+ }
+}
+
+} // anonymous namespace
+
std::ostream& SC_DLLPUBLIC operator<<(std::ostream& rStream, const ScCalcConfig& rConfig)
{
rStream << "{"
@@ -83,7 +103,13 @@ std::ostream& SC_DLLPUBLIC operator<<(std::ostream& rStream, const ScCalcConfig&
"OpenCLAutoSelect=" << (rConfig.mbOpenCLAutoSelect?"Y":"N") << ","
"OpenCLDevice='" << rConfig.maOpenCLDevice << "',"
"OpenCLMinimumFormulaGroupSize=" << rConfig.mnOpenCLMinimumFormulaGroupSize << ","
- "OpenCLSubsetOpCodes={" << ScOpCodeSetToSymbolicString(rConfig.maOpenCLSubsetOpCodes) << "}"
+ "OpenCLSubsetOpCodes={" << ScOpCodeSetToSymbolicString(rConfig.maOpenCLSubsetOpCodes) << "},"
+ "OpenCLWhiteList={";
+ writeStringSet(rStream, rConfig.maOpenCLWhiteList);
+ rStream << "},"
+ "OpenCLBlackList={";
+ writeStringSet(rStream, rConfig.maOpenCLBlackList);
+ rStream << "}"
"}";
return rStream;
}
diff --git a/sc/source/core/tool/formulaopt.cxx b/sc/source/core/tool/formulaopt.cxx
index 22bf4520f484..aa2b7a181d37 100644
--- a/sc/source/core/tool/formulaopt.cxx
+++ b/sc/source/core/tool/formulaopt.cxx
@@ -203,7 +203,9 @@ SfxPoolItem* ScTpFormulaItem::Clone( SfxItemPool * ) const
#define SCFORMULAOPT_OPENCL_SUBSET_ONLY 13
#define SCFORMULAOPT_OPENCL_MIN_SIZE 14
#define SCFORMULAOPT_OPENCL_SUBSET_OPS 15
-#define SCFORMULAOPT_COUNT 16
+#define SCFORMULAOPT_OPENCL_WHITELIST 16
+#define SCFORMULAOPT_OPENCL_BLACKLIST 17
+#define SCFORMULAOPT_COUNT 18
Sequence<OUString> ScFormulaCfg::GetPropertyNames()
{
@@ -225,6 +227,8 @@ Sequence<OUString> ScFormulaCfg::GetPropertyNames()
"Calculation/OpenCLSubsetOnly", // SCFORMULAOPT_OPENCL_SUBSET_ONLY
"Calculation/OpenCLMinimumDataSize", // SCFORMULAOPT_OPENCL_MIN_SIZE
"Calculation/OpenCLSubsetOpCodes", // SCFORMULAOPT_OPENCL_SUBSET_OPS
+ "Calculation/OpenCLWhiteList", // SCFORMULAOPT_OPENCL_WHITELIST
+ "Calculation/OpenCLBlackList", // SCFORMULAOPT_OPENCL_BLACKLIST
};
Sequence<OUString> aNames(SCFORMULAOPT_COUNT);
OUString* pNames = aNames.getArray();
@@ -254,6 +258,8 @@ ScFormulaCfg::PropsToIds ScFormulaCfg::GetPropNamesToId()
SCFORMULAOPT_OPENCL_SUBSET_ONLY,
SCFORMULAOPT_OPENCL_MIN_SIZE,
SCFORMULAOPT_OPENCL_SUBSET_OPS,
+ SCFORMULAOPT_OPENCL_WHITELIST,
+ SCFORMULAOPT_OPENCL_BLACKLIST,
};
OSL_ENSURE( SAL_N_ELEMENTS(aVals) == aPropNames.getLength(), "Properties and ids are out of Sync");
PropsToIds aPropIdMap;
@@ -270,6 +276,35 @@ ScFormulaCfg::ScFormulaCfg() :
EnableNotification( aNames );
}
+namespace {
+
+css::uno::Sequence<OUString> StringSetToStringSequence(std::set<OUString>& rSet)
+{
+ css::uno::Sequence<OUString> result(rSet.size());
+
+ size_t n(0);
+ for (auto i = rSet.cbegin(); i != rSet.cend(); ++i)
+ {
+ result[n++] = *i;
+ }
+
+ return result;
+}
+
+std::set<OUString> StringSequenceToStringSet(css::uno::Sequence<OUString>& rSequence)
+{
+ std::set<OUString> result;
+
+ for (auto i = rSequence.begin(); i != rSequence.end(); ++i)
+ {
+ result.insert(*i);
+ }
+
+ return result;
+}
+
+} // anonymous namespace
+
void ScFormulaCfg::UpdateFromProperties( const Sequence<OUString>& aNames )
{
Sequence<Any> aValues = GetProperties(aNames);
@@ -512,8 +547,20 @@ void ScFormulaCfg::UpdateFromProperties( const Sequence<OUString>& aNames )
GetCalcConfig().maOpenCLSubsetOpCodes = ScStringToOpCodeSet(sVal);
}
break;
- default:
- ;
+ case SCFORMULAOPT_OPENCL_WHITELIST:
+ {
+ css::uno::Sequence<OUString> sVal = StringSetToStringSequence(GetCalcConfig().maOpenCLWhiteList);
+ pValues[nProp] >>= sVal;
+ GetCalcConfig().maOpenCLWhiteList = StringSequenceToStringSet(sVal);
+ }
+ break;
+ case SCFORMULAOPT_OPENCL_BLACKLIST:
+ {
+ css::uno::Sequence<OUString> sVal = StringSetToStringSequence(GetCalcConfig().maOpenCLBlackList);
+ pValues[nProp] >>= sVal;
+ GetCalcConfig().maOpenCLBlackList = StringSequenceToStringSet(sVal);
+ }
+ break;
}
}
}
@@ -667,8 +714,18 @@ void ScFormulaCfg::Commit()
pValues[nProp] <<= sVal;
}
break;
- default:
- ;
+ case SCFORMULAOPT_OPENCL_WHITELIST:
+ {
+ css::uno::Sequence<OUString> sVal = StringSetToStringSequence(GetCalcConfig().maOpenCLWhiteList);
+ pValues[nProp] <<= sVal;
+ }
+ break;
+ case SCFORMULAOPT_OPENCL_BLACKLIST:
+ {
+ css::uno::Sequence<OUString> sVal = StringSetToStringSequence(GetCalcConfig().maOpenCLBlackList);
+ pValues[nProp] <<= sVal;
+ }
+ break;
}
}
if(bSetOpenCL)
diff --git a/sc/source/ui/optdlg/calcoptionsdlg.cxx b/sc/source/ui/optdlg/calcoptionsdlg.cxx
index b479aa3a0b6e..e1de4369c56e 100644
--- a/sc/source/ui/optdlg/calcoptionsdlg.cxx
+++ b/sc/source/ui/optdlg/calcoptionsdlg.cxx
@@ -29,7 +29,9 @@ typedef enum {
CALC_OPTION_ENABLE_OPENCL,
CALC_OPTION_ENABLE_OPENCL_SUBSET,
CALC_OPTION_OPENCL_MIN_SIZE,
- CALC_OPTION_OPENCL_SUBSET_OPS
+ CALC_OPTION_OPENCL_SUBSET_OPS,
+ CALC_OPTION_OPENCL_WHITELIST,
+ CALC_OPTION_OPENCL_BLACKLIST,
} CalcOptionOrder;
class OptionString : public SvLBoxString
@@ -141,6 +143,11 @@ ScCalcOptionsDialog::ScCalcOptionsDialog(vcl::Window* pParent, const ScCalcConfi
get(mpBtnFalse, "false");
get(mpSpinButton, "spinbutton");
get(mpEditField, "entry");
+ get(mpListGrid, "listgrid");
+ get(mpListBox, "listbox");
+ get(mpListEditButton, "listbox-edit");
+ get(mpListNewButton, "listbox-new");
+ get(mpListDeleteButton, "listbox-delete");
get(mpOpenclInfoList, "opencl_list");
get(mpBtnAutomaticSelectionTrue, "automatic_select_true");
get(mpBtnAutomaticSelectionFalse, "automatic_select_false");
@@ -151,6 +158,9 @@ ScCalcOptionsDialog::ScCalcOptionsDialog(vcl::Window* pParent, const ScCalcConfi
mpSpinButton->SetModifyHdl(LINK(this, ScCalcOptionsDialog, NumModifiedHdl));
mpEditField->SetModifyHdl(LINK(this, ScCalcOptionsDialog, EditModifiedHdl));
+ mpListBox->set_height_request(4* mpListBox->GetTextHeight());
+ mpListBox->SetStyle(mpListBox->GetStyle() | WB_CLIPCHILDREN | WB_FORCE_MAKEVISIBLE);
+
mpOpenclInfoList->set_height_request(4* mpOpenclInfoList->GetTextHeight());
mpOpenclInfoList->SetStyle(mpOpenclInfoList->GetStyle() | WB_CLIPCHILDREN | WB_FORCE_MAKEVISIBLE);
mpOpenclInfoList->SetHighlightRange();
@@ -185,6 +195,27 @@ ScCalcOptionsDialog::ScCalcOptionsDialog(vcl::Window* pParent, const ScCalcConfi
maCaptionOpenCLSubsetOpCodes = get<vcl::Window>("opencl_subset_opcodes")->GetText();
maDescOpenCLSubsetOpCodes = get<vcl::Window>("opencl_subset_opcodes_desc")->GetText();
+ maCaptionOpenCLWhiteList = get<vcl::Window>("opencl_whitelist")->GetText();
+ maDescOpenCLWhiteList = get<vcl::Window>("opencl_whitelist_desc")->GetText();
+
+ maCaptionOpenCLBlackList = get<vcl::Window>("opencl_blacklist")->GetText();
+ maDescOpenCLBlackList = get<vcl::Window>("opencl_blacklist_desc")->GetText();
+
+ maCaptionOS = get<vcl::Window>("oslabel")->GetText();
+ maDescOS = get<vcl::Window>("os_desc")->GetText();
+
+ maCaptionOSVersion = get<vcl::Window>("osversionlabel")->GetText();
+ maDescOSVersion = get<vcl::Window>("osversion_desc")->GetText();
+
+ maCaptionOpenCLVendor = get<vcl::Window>("openclvendorlabel")->GetText();
+ maDescOpenCLVendor = get<vcl::Window>("openclvendor_desc")->GetText();
+
+ maCaptionOpenCLDevice = get<vcl::Window>("opencldevicelabel")->GetText();
+ maDescOpenCLDevice = get<vcl::Window>("opencldevice_desc")->GetText();
+
+ maCaptionOpenCLDriverVersion = get<vcl::Window>("opencldriverversionlabel")->GetText();
+ maDescOpenCLDriverVersion = get<vcl::Window>("opencldriverversion_desc")->GetText();
+
maSoftware = get<vcl::Window>("software")->GetText();
mpLbSettings->set_height_request(8 * mpLbSettings->GetTextHeight());
@@ -237,6 +268,16 @@ SvTreeListEntry *ScCalcOptionsDialog::createStringItem(const OUString &rCaption,
return pEntry;
}
+SvTreeListEntry *ScCalcOptionsDialog::createStringListItem(const OUString &rCaption) const
+{
+ SvTreeListEntry* pEntry = new SvTreeListEntry;
+ pEntry->AddItem(new SvLBoxString(pEntry, 0, OUString()));
+ pEntry->AddItem(new SvLBoxContextBmp(pEntry, 0, Image(), Image(), false));
+ OptionString* pItem = new OptionString(rCaption, "");
+ pEntry->AddItem(pItem);
+ return pEntry;
+}
+
void ScCalcOptionsDialog::setValueAt(size_t nPos, const OUString &rValue)
{
SvTreeList *pModel = mpLbSettings->GetModel();
@@ -276,7 +317,7 @@ void ScCalcOptionsDialog::fillOpenCLList()
for(std::vector<sc::OpenCLDeviceInfo>::iterator
itr = it->maDevices.begin(), itrEnd = it->maDevices.end(); itr != itrEnd; ++itr)
{
- OUString aDeviceId = it->maVendor + " " + itr->maName;
+ OUString aDeviceId = it->maVendor + " " + itr->maName + " " + itr->maDriver;
SvTreeListEntry* pEntry = mpOpenclInfoList->InsertEntry(aDeviceId);
if(aDeviceId == aStoredDevice)
{
@@ -297,6 +338,23 @@ void ScCalcOptionsDialog::fillOpenCLList()
SelectedDeviceChanged();
}
+namespace {
+
+void fillListBox(ListBox* pListBox, const std::set<OUString>& rSet)
+{
+ pListBox->SetUpdateMode(false);
+ pListBox->Clear();
+
+ for (auto i = rSet.cbegin(); i != rSet.cend(); ++i)
+ {
+ pListBox->InsertEntry(*i, LISTBOX_APPEND);
+ }
+
+ pListBox->SetUpdateMode(true);
+}
+
+} // anonymous namespace
+
#endif
namespace {
@@ -338,6 +396,8 @@ void ScCalcOptionsDialog::FillOptionsList()
pModel->Insert(createBoolItem(maCaptionOpenCLSubsetEnabled,maConfig.mbOpenCLSubsetOnly));
pModel->Insert(createIntegerItem(maCaptionOpenCLMinimumFormulaSize,maConfig.mnOpenCLMinimumFormulaGroupSize));
pModel->Insert(createStringItem(maCaptionOpenCLSubsetOpCodes,ScOpCodeSetToSymbolicString(maConfig.maOpenCLSubsetOpCodes)));
+ pModel->Insert(createStringListItem(maCaptionOpenCLWhiteList));
+ pModel->Insert(createStringListItem(maCaptionOpenCLBlackList));
fillOpenCLList();
@@ -360,6 +420,7 @@ void ScCalcOptionsDialog::SelectionChanged()
mpBtnFalse->Hide();
mpSpinButton->Hide();
mpEditField->Hide();
+ mpListGrid->Hide();
mpLbOptionEdit->Show();
mpOpenclInfoList->GetParent()->Hide();
@@ -394,6 +455,7 @@ void ScCalcOptionsDialog::SelectionChanged()
mpBtnFalse->Hide();
mpSpinButton->Hide();
mpEditField->Hide();
+ mpListGrid->Hide();
mpLbOptionEdit->Show();
mpOpenclInfoList->GetParent()->Hide();
@@ -426,12 +488,12 @@ void ScCalcOptionsDialog::SelectionChanged()
case CALC_OPTION_ENABLE_OPENCL:
case CALC_OPTION_ENABLE_OPENCL_SUBSET:
{
- // Treat empty string as zero.
mpLbOptionEdit->Hide();
mpBtnTrue->Show();
mpBtnFalse->Show();
mpSpinButton->Hide();
mpEditField->Hide();
+ mpListGrid->Hide();
bool bValue = false;
bool bEnable = true;
@@ -508,6 +570,7 @@ void ScCalcOptionsDialog::SelectionChanged()
mpBtnFalse->Hide();
mpSpinButton->Show();
mpEditField->Hide();
+ mpListGrid->Hide();
mpOpenclInfoList->GetParent()->Hide();
mpFtAnnotation->SetText(maDescOpenCLMinimumFormulaSize);
mpSpinButton->SetValue(nValue);
@@ -524,11 +587,37 @@ void ScCalcOptionsDialog::SelectionChanged()
mpBtnFalse->Hide();
mpSpinButton->Hide();
mpEditField->Show();
+ mpListGrid->Hide();
mpOpenclInfoList->GetParent()->Hide();
mpFtAnnotation->SetText(maDescOpenCLSubsetOpCodes);
mpEditField->SetText(sValue);
}
break;
+
+ // string lists
+ case CALC_OPTION_OPENCL_WHITELIST:
+ case CALC_OPTION_OPENCL_BLACKLIST:
+ {
+ // SAL _DEBUG(__FILE__ ":" << __LINE__ << ": " << maConfig);
+ mpLbOptionEdit->Hide();
+ mpBtnTrue->Hide();
+ mpBtnFalse->Hide();
+ mpSpinButton->Hide();
+ mpEditField->Hide();
+ mpListGrid->Show();
+ mpOpenclInfoList->GetParent()->Hide();
+ if ( nSelectedPos == CALC_OPTION_OPENCL_WHITELIST )
+ {
+ mpFtAnnotation->SetText(maDescOpenCLWhiteList);
+ fillListBox(mpListBox, maConfig.maOpenCLWhiteList);
+ }
+ else
+ {
+ mpFtAnnotation->SetText(maDescOpenCLBlackList);
+ fillListBox(mpListBox, maConfig.maOpenCLBlackList);
+ }
+ }
+ break;
}
}
@@ -582,7 +671,9 @@ void ScCalcOptionsDialog::ListOptionValueChanged()
case CALC_OPTION_ENABLE_OPENCL_SUBSET:
case CALC_OPTION_OPENCL_MIN_SIZE:
case CALC_OPTION_OPENCL_SUBSET_OPS:
- break;
+ case CALC_OPTION_OPENCL_WHITELIST:
+ case CALC_OPTION_OPENCL_BLACKLIST:
+ break;
}
}
diff --git a/sc/source/ui/optdlg/calcoptionsdlg.hxx b/sc/source/ui/optdlg/calcoptionsdlg.hxx
index 5676cfc175b2..a4aa68441502 100644
--- a/sc/source/ui/optdlg/calcoptionsdlg.hxx
+++ b/sc/source/ui/optdlg/calcoptionsdlg.hxx
@@ -17,6 +17,7 @@
#include <vcl/edit.hxx>
#include <vcl/field.hxx>
#include <vcl/fixed.hxx>
+#include <vcl/layout.hxx>
#include <vcl/lstbox.hxx>
#include <svx/checklbx.hxx>
#include <svtools/treelistbox.hxx>
@@ -62,6 +63,7 @@ private:
SvTreeListEntry *createBoolItem(const OUString &rCaption, bool bValue) const;
SvTreeListEntry *createIntegerItem(const OUString &rCaption, sal_Int32 nValue) const;
SvTreeListEntry *createStringItem(const OUString &rCaption, const OUString& sValue) const;
+ SvTreeListEntry *createStringListItem(const OUString &rCaption) const;
void setValueAt(size_t nPos, const OUString &rString);
private:
@@ -72,6 +74,11 @@ private:
RadioButton* mpBtnFalse;
NumericField* mpSpinButton;
Edit* mpEditField;
+ VclGrid* mpListGrid;
+ ListBox* mpListBox;
+ PushButton* mpListEditButton;
+ PushButton* mpListNewButton;
+ PushButton* mpListDeleteButton;
FixedText* mpFtAnnotation;
FixedText* mpFtFrequency;
@@ -116,6 +123,27 @@ private:
OUString maCaptionOpenCLSubsetOpCodes;
OUString maDescOpenCLSubsetOpCodes;
+ OUString maCaptionOpenCLWhiteList;
+ OUString maDescOpenCLWhiteList;
+
+ OUString maCaptionOpenCLBlackList;
+ OUString maDescOpenCLBlackList;
+
+ OUString maCaptionOS;
+ OUString maDescOS;
+
+ OUString maCaptionOSVersion;
+ OUString maDescOSVersion;
+
+ OUString maCaptionOpenCLVendor;
+ OUString maDescOpenCLVendor;
+
+ OUString maCaptionOpenCLDevice;
+ OUString maDescOpenCLDevice;
+
+ OUString maCaptionOpenCLDriverVersion;
+ OUString maDescOpenCLDriverVersion;
+
OUString maSoftware;
ScCalcConfig maConfig;
diff --git a/sc/uiconfig/scalc/ui/formulacalculationoptions.ui b/sc/uiconfig/scalc/ui/formulacalculationoptions.ui
index 0aaef4320061..9a078592e23a 100644
--- a/sc/uiconfig/scalc/ui/formulacalculationoptions.ui
+++ b/sc/uiconfig/scalc/ui/formulacalculationoptions.ui
@@ -184,6 +184,290 @@
<property name="top_attach">0</property>
</packing>
</child>
+ <child>
+ <object class="GtkGrid" id="listgrid">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkTreeView" id="listbox:border">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="orientation">vertical</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="oslabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_OS</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">os:border</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="os_desc">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label" translatable="yes">Operating System, one of: Windows, Linux, OS X</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">10</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTextView" id="os:border">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="osversionlabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">OS _Version</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">osversion:border</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="osversion_desc">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label" translatable="yes">Operating System Version, free form</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">10</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTextView" id="osversion:border">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="openclvendorlabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">OpenCL Platform Vendor</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">openclvendor:border</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="openclvendor_desc">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label" translatable="yes">OpenCL Platform Vendor</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">56</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTextView" id="openclvendor:border">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="opencldevicelabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">OpenCL Device</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">opencldevice:border</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="opencldevice_desc">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label" translatable="yes">OpenCL Device</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">56</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTextView" id="opencldevice:border">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="opencldriverversionlabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">OpenCL Driver Version</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">opencldriverversion:border</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="opencldriverversion_desc">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label" translatable="yes">OpenCL Driver Version</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">56</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTextView" id="opencldriverversion:border">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">14</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="listbox-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="listbox-edit">
+ <property name="label" translatable="yes">Edi_t...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="listbox-new">
+ <property name="label" translatable="yes">_New...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="listbox-delete">
+ <property name="label" translatable="yes">_Delete</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="left_attach">1</property>
@@ -393,7 +677,6 @@
<property name="height">1</property>
</packing>
</child>
-
<child>
<object class="GtkLabel" id="opencl_subset_enabled">
<property name="can_focus">False</property>
@@ -422,7 +705,6 @@
<property name="height">1</property>
</packing>
</child>
-
<child>
<object class="GtkLabel" id="opencl_minimum_size">
<property name="can_focus">False</property>
@@ -451,7 +733,6 @@
<property name="height">1</property>
</packing>
</child>
-
<child>
<object class="GtkLabel" id="opencl_subset_opcodes">
<property name="can_focus">False</property>
@@ -480,7 +761,62 @@
<property name="height">1</property>
</packing>
</child>
-
+ <child>
+ <object class="GtkLabel" id="opencl_whitelist">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label" translatable="yes">List known-good OpenCL implementations</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">23</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="opencl_whitelist_desc">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label" translatable="yes">List of known-good OpenCL implementations.</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">56</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">24</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="opencl_blacklist">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label" translatable="yes">List of known-bad OpenCL implementations</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">25</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="opencl_blacklist_desc">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label" translatable="yes">List of known-bad OpenCL implementations.</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">56</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">26</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
<child>
<object class="GtkGrid" id="grid6">
<property name="can_focus">False</property>
@@ -673,7 +1009,7 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">17</property>
+ <property name="top_attach">27</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>