Kaydet (Commit) cbcc8c80 authored tarafından Caolán McNamara's avatar Caolán McNamara

support setting textbuffers on textviews

Change-Id: Iaab4f17539c65c11870ce9b0635dc5ab47f1fa88
üst 4546ef56
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
class ListBox; class ListBox;
class NumericFormatter; class NumericFormatter;
class ScrollBar; class ScrollBar;
class VclMultiLineEdit;
class VCL_DLLPUBLIC VclBuilder class VCL_DLLPUBLIC VclBuilder
{ {
...@@ -56,23 +57,6 @@ private: ...@@ -56,23 +57,6 @@ private:
}; };
std::vector<WinAndId> m_aChildren; std::vector<WinAndId> m_aChildren;
struct ListStore
{
typedef std::vector<OString> row;
std::vector<row> m_aEntries;
};
struct ModelAndId
{
OString m_sID;
ListStore *m_pModel;
ModelAndId(const OString &rId, ListStore *pListStore)
: m_sID(rId)
, m_pModel(pListStore)
{
}
};
struct StringPair struct StringPair
{ {
OString m_sID; OString m_sID;
...@@ -87,44 +71,50 @@ private: ...@@ -87,44 +71,50 @@ private:
typedef StringPair RadioButtonGroupMap; typedef StringPair RadioButtonGroupMap;
typedef StringPair ComboBoxModelMap; typedef StringPair ComboBoxModelMap;
typedef StringPair ButtonImageWidgetMap; typedef StringPair ButtonImageWidgetMap;
typedef StringPair TextBufferMap;
typedef StringPair WidgetAdjustmentMap;
ListStore *get_model_by_name(OString sID); struct ListStore
static void mungemodel(ListBox &rTarget, ListStore &rStore);
typedef stringmap Adjustment;
struct AdjustmentAndId
{ {
OString m_sID; typedef std::vector<OString> row;
Adjustment m_aAdjustment; std::vector<row> m_aEntries;
AdjustmentAndId(const OString &rId, Adjustment &rAdjustment)
: m_sID(rId)
{
m_aAdjustment.swap(rAdjustment);
}
}; };
const ListStore* get_model_by_name(OString sID) const;
static void mungeModel(ListBox &rTarget, const ListStore &rStore);
typedef StringPair WidgetAdjustmentMap; typedef stringmap TextBuffer;
const TextBuffer* get_buffer_by_name(OString sID) const;
static void mungeTextBuffer(VclMultiLineEdit &rTarget, const TextBuffer &rTextBuffer);
Adjustment *get_adjustment_by_name(OString sID); typedef stringmap Adjustment;
static void mungeSpinAdjustment(NumericFormatter &rTarget, Adjustment &rAdjustment); const Adjustment *get_adjustment_by_name(OString sID) const;
static void mungeScrollAdjustment(ScrollBar &rTarget, Adjustment &rAdjustment); static void mungeSpinAdjustment(NumericFormatter &rTarget, const Adjustment &rAdjustment);
static void mungeScrollAdjustment(ScrollBar &rTarget, const Adjustment &rAdjustment);
typedef std::map<OString, OString> WidgetTranslations; typedef std::map<OString, OString> WidgetTranslations;
typedef std::map<OString, WidgetTranslations> Translations; typedef std::map<OString, WidgetTranslations> Translations;
typedef std::map<OString, OString> StockMap; typedef std::map<OString, OString> StockMap;
struct ParserState struct ParserState
{ {
std::vector<RadioButtonGroupMap> m_aGroupMaps; std::vector<RadioButtonGroupMap> m_aGroupMaps;
std::vector<ComboBoxModelMap> m_aModelMaps; std::vector<ComboBoxModelMap> m_aModelMaps;
std::vector<ModelAndId> m_aModels; std::map<OString, ListStore> m_aModels;
std::vector<AdjustmentAndId> m_aAdjustments;
std::vector<TextBufferMap> m_aTextBufferMaps;
std::map<OString, TextBuffer> m_aTextBuffers;
std::vector<WidgetAdjustmentMap> m_aSpinAdjustmentMaps; std::vector<WidgetAdjustmentMap> m_aSpinAdjustmentMaps;
std::vector<WidgetAdjustmentMap> m_aScrollAdjustmentMaps; std::vector<WidgetAdjustmentMap> m_aScrollAdjustmentMaps;
std::map<OString, Adjustment> m_aAdjustments;
std::vector<ButtonImageWidgetMap> m_aButtonImageWidgetMaps; std::vector<ButtonImageWidgetMap> m_aButtonImageWidgetMaps;
StockMap m_aStockMap; StockMap m_aStockMap;
Translations m_aTranslations; Translations m_aTranslations;
std::map<Window*, Window*> m_aRedundantParentWidgets; std::map<Window*, Window*> m_aRedundantParentWidgets;
}; };
...@@ -185,6 +175,7 @@ private: ...@@ -185,6 +175,7 @@ private:
Window *makeObject(Window *pParent, const OString &rClass, const OString &rID, stringmap &rVec); Window *makeObject(Window *pParent, const OString &rClass, const OString &rID, stringmap &rVec);
bool extractGroup(const OString &id, stringmap &rVec); bool extractGroup(const OString &id, stringmap &rVec);
bool extractModel(const OString &id, stringmap &rVec); bool extractModel(const OString &id, stringmap &rVec);
bool extractBuffer(const OString &id, stringmap &rVec);
bool extractSpinAdjustment(const OString &id, stringmap &rVec); bool extractSpinAdjustment(const OString &id, stringmap &rVec);
bool extractScrollAdjustment(const OString &id, stringmap &rVec); bool extractScrollAdjustment(const OString &id, stringmap &rVec);
bool extractImage(const OString &id, stringmap &rMap); bool extractImage(const OString &id, stringmap &rMap);
...@@ -202,6 +193,7 @@ private: ...@@ -202,6 +193,7 @@ private:
void handleListStore(xmlreader::XmlReader &reader, const OString &rID); void handleListStore(xmlreader::XmlReader &reader, const OString &rID);
void handleRow(xmlreader::XmlReader &reader, const OString &rID, sal_Int32 nRowIndex); void handleRow(xmlreader::XmlReader &reader, const OString &rID, sal_Int32 nRowIndex);
void handleAdjustment(const OString &rID, stringmap &rProperties); void handleAdjustment(const OString &rID, stringmap &rProperties);
void handleTextBuffer(const OString &rID, stringmap &rProperties);
void handleTabChild(Window *pParent, xmlreader::XmlReader &reader); void handleTabChild(Window *pParent, xmlreader::XmlReader &reader);
PackingData get_window_packing_data(const Window *pWindow) const; PackingData get_window_packing_data(const Window *pWindow) const;
......
...@@ -157,15 +157,21 @@ VclBuilder::VclBuilder(Window *pParent, OUString sUIDir, OUString sUIFile, OStri ...@@ -157,15 +157,21 @@ VclBuilder::VclBuilder(Window *pParent, OUString sUIDir, OUString sUIFile, OStri
aEnd = m_pParserState->m_aModelMaps.end(); aI != aEnd; ++aI) aEnd = m_pParserState->m_aModelMaps.end(); aI != aEnd; ++aI)
{ {
ListBox *pTarget = get<ListBox>(aI->m_sID); ListBox *pTarget = get<ListBox>(aI->m_sID);
ListStore *pStore = get_model_by_name(aI->m_sValue); const ListStore *pStore = get_model_by_name(aI->m_sValue);
SAL_WARN_IF(!pTarget || !pStore, "vcl", "missing elements of combobox/liststore"); SAL_WARN_IF(!pTarget || !pStore, "vcl", "missing elements of combobox/liststore");
if (pTarget && pStore) if (pTarget && pStore)
mungemodel(*pTarget, *pStore); mungeModel(*pTarget, *pStore);
} }
for (std::vector<ModelAndId>::iterator aI = m_pParserState->m_aModels.begin(),
aEnd = m_pParserState->m_aModels.end(); aI != aEnd; ++aI) //Set TextView buffers when everything has been imported
for (std::vector<TextBufferMap>::iterator aI = m_pParserState->m_aTextBufferMaps.begin(),
aEnd = m_pParserState->m_aTextBufferMaps.end(); aI != aEnd; ++aI)
{ {
delete aI->m_pModel; VclMultiLineEdit *pTarget = get<VclMultiLineEdit>(aI->m_sID);
const TextBuffer *pBuffer = get_buffer_by_name(aI->m_sValue);
SAL_WARN_IF(!pTarget || !pBuffer, "vcl", "missing elements of textview/textbuffer");
if (pTarget && pBuffer)
mungeTextBuffer(*pTarget, *pBuffer);
} }
//Set SpinButton adjustments when everything has been imported //Set SpinButton adjustments when everything has been imported
...@@ -173,7 +179,7 @@ VclBuilder::VclBuilder(Window *pParent, OUString sUIDir, OUString sUIFile, OStri ...@@ -173,7 +179,7 @@ VclBuilder::VclBuilder(Window *pParent, OUString sUIDir, OUString sUIFile, OStri
aEnd = m_pParserState->m_aSpinAdjustmentMaps.end(); aI != aEnd; ++aI) aEnd = m_pParserState->m_aSpinAdjustmentMaps.end(); aI != aEnd; ++aI)
{ {
NumericFormatter *pTarget = dynamic_cast<NumericFormatter*>(get<Window>(aI->m_sID)); NumericFormatter *pTarget = dynamic_cast<NumericFormatter*>(get<Window>(aI->m_sID));
Adjustment *pAdjustment = get_adjustment_by_name(aI->m_sValue); const Adjustment *pAdjustment = get_adjustment_by_name(aI->m_sValue);
SAL_WARN_IF(!pTarget || !pAdjustment, "vcl", "missing elements of spinbutton/adjustment"); SAL_WARN_IF(!pTarget || !pAdjustment, "vcl", "missing elements of spinbutton/adjustment");
if (pTarget && pAdjustment) if (pTarget && pAdjustment)
mungeSpinAdjustment(*pTarget, *pAdjustment); mungeSpinAdjustment(*pTarget, *pAdjustment);
...@@ -184,7 +190,7 @@ VclBuilder::VclBuilder(Window *pParent, OUString sUIDir, OUString sUIFile, OStri ...@@ -184,7 +190,7 @@ VclBuilder::VclBuilder(Window *pParent, OUString sUIDir, OUString sUIFile, OStri
aEnd = m_pParserState->m_aScrollAdjustmentMaps.end(); aI != aEnd; ++aI) aEnd = m_pParserState->m_aScrollAdjustmentMaps.end(); aI != aEnd; ++aI)
{ {
ScrollBar *pTarget = get<ScrollBar>(aI->m_sID); ScrollBar *pTarget = get<ScrollBar>(aI->m_sID);
Adjustment *pAdjustment = get_adjustment_by_name(aI->m_sValue); const Adjustment *pAdjustment = get_adjustment_by_name(aI->m_sValue);
SAL_WARN_IF(!pTarget || !pAdjustment, "vcl", "missing elements of scrollbar/adjustment"); SAL_WARN_IF(!pTarget || !pAdjustment, "vcl", "missing elements of scrollbar/adjustment");
if (pTarget && pAdjustment) if (pTarget && pAdjustment)
mungeScrollAdjustment(*pTarget, *pAdjustment); mungeScrollAdjustment(*pTarget, *pAdjustment);
...@@ -515,7 +521,6 @@ bool VclBuilder::extractScrollAdjustment(const OString &id, stringmap &rMap) ...@@ -515,7 +521,6 @@ bool VclBuilder::extractScrollAdjustment(const OString &id, stringmap &rMap)
return false; return false;
} }
bool VclBuilder::extractModel(const OString &id, stringmap &rMap) bool VclBuilder::extractModel(const OString &id, stringmap &rMap)
{ {
VclBuilder::stringmap::iterator aFind = rMap.find(OString("model")); VclBuilder::stringmap::iterator aFind = rMap.find(OString("model"));
...@@ -528,6 +533,18 @@ bool VclBuilder::extractModel(const OString &id, stringmap &rMap) ...@@ -528,6 +533,18 @@ bool VclBuilder::extractModel(const OString &id, stringmap &rMap)
return false; return false;
} }
bool VclBuilder::extractBuffer(const OString &id, stringmap &rMap)
{
VclBuilder::stringmap::iterator aFind = rMap.find(OString("buffer"));
if (aFind != rMap.end())
{
m_pParserState->m_aTextBufferMaps.push_back(TextBufferMap(id, aFind->second));
rMap.erase(aFind);
return true;
}
return false;
}
bool VclBuilder::extractStock(const OString &id, stringmap &rMap) bool VclBuilder::extractStock(const OString &id, stringmap &rMap)
{ {
VclBuilder::stringmap::iterator aFind = rMap.find(OString("stock")); VclBuilder::stringmap::iterator aFind = rMap.find(OString("stock"));
...@@ -790,6 +807,8 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri ...@@ -790,6 +807,8 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri
pWindow = new Window(pParent); pWindow = new Window(pParent);
else if (name == "GtkTextView") else if (name == "GtkTextView")
{ {
extractBuffer(id, rMap);
WinBits nWinStyle = WB_LEFT | WB_BORDER; WinBits nWinStyle = WB_LEFT | WB_BORDER;
//VclMultiLineEdit manage their own scrolling, //VclMultiLineEdit manage their own scrolling,
//so if it appears as a child of a scrolling window //so if it appears as a child of a scrolling window
...@@ -1213,7 +1232,12 @@ void VclBuilder::collectPangoAttribute(xmlreader::XmlReader &reader, stringmap & ...@@ -1213,7 +1232,12 @@ void VclBuilder::collectPangoAttribute(xmlreader::XmlReader &reader, stringmap &
void VclBuilder::handleAdjustment(const OString &rID, stringmap &rProperties) void VclBuilder::handleAdjustment(const OString &rID, stringmap &rProperties)
{ {
m_pParserState->m_aAdjustments.push_back(AdjustmentAndId(rID, rProperties)); m_pParserState->m_aAdjustments[rID] = rProperties;
}
void VclBuilder::handleTextBuffer(const OString &rID, stringmap &rProperties)
{
m_pParserState->m_aTextBuffers[rID] = rProperties;
} }
void VclBuilder::handleRow(xmlreader::XmlReader &reader, const OString &rID, sal_Int32 nRowIndex) void VclBuilder::handleRow(xmlreader::XmlReader &reader, const OString &rID, sal_Int32 nRowIndex)
...@@ -1277,14 +1301,11 @@ void VclBuilder::handleRow(xmlreader::XmlReader &reader, const OString &rID, sal ...@@ -1277,14 +1301,11 @@ void VclBuilder::handleRow(xmlreader::XmlReader &reader, const OString &rID, sal
break; break;
} }
if (!aRow.empty()) m_pParserState->m_aModels[rID].m_aEntries.push_back(aRow);
m_pParserState->m_aModels.back().m_pModel->m_aEntries.push_back(aRow);
} }
void VclBuilder::handleListStore(xmlreader::XmlReader &reader, const OString &rID) void VclBuilder::handleListStore(xmlreader::XmlReader &reader, const OString &rID)
{ {
m_pParserState->m_aModels.push_back(ModelAndId(rID, new ListStore));
int nLevel = 1; int nLevel = 1;
sal_Int32 nRowIndex = 0; sal_Int32 nRowIndex = 0;
...@@ -1403,6 +1424,11 @@ Window* VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader) ...@@ -1403,6 +1424,11 @@ Window* VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader)
handleAdjustment(sID, aProperties); handleAdjustment(sID, aProperties);
return NULL; return NULL;
} }
else if (sClass == "GtkTextBuffer")
{
handleTextBuffer(sID, aProperties);
return NULL;
}
if (!pCurrentChild) if (!pCurrentChild)
pCurrentChild = insertObject(pParent, sClass, sID, aProperties, aPangoAttributes); pCurrentChild = insertObject(pParent, sClass, sID, aProperties, aPangoAttributes);
...@@ -1654,27 +1680,27 @@ void VclBuilder::set_window_packing_position(const Window *pWindow, sal_Int32 nP ...@@ -1654,27 +1680,27 @@ void VclBuilder::set_window_packing_position(const Window *pWindow, sal_Int32 nP
} }
} }
VclBuilder::ListStore *VclBuilder::get_model_by_name(OString sID) const VclBuilder::ListStore *VclBuilder::get_model_by_name(OString sID) const
{ {
for (std::vector<ModelAndId>::iterator aI = m_pParserState->m_aModels.begin(), std::map<OString, ListStore>::const_iterator aI = m_pParserState->m_aModels.find(sID);
aEnd = m_pParserState->m_aModels.end(); aI != aEnd; ++aI) if (aI != m_pParserState->m_aModels.end())
{ return &(aI->second);
if (aI->m_sID.equals(sID))
return aI->m_pModel;
}
return NULL; return NULL;
} }
VclBuilder::Adjustment *VclBuilder::get_adjustment_by_name(OString sID) const VclBuilder::TextBuffer *VclBuilder::get_buffer_by_name(OString sID) const
{ {
for (std::vector<AdjustmentAndId>::iterator aI = m_pParserState->m_aAdjustments.begin(), std::map<OString, TextBuffer>::const_iterator aI = m_pParserState->m_aTextBuffers.find(sID);
aEnd = m_pParserState->m_aAdjustments.end(); aI != aEnd; ++aI) if (aI != m_pParserState->m_aTextBuffers.end())
{ return &(aI->second);
if (aI->m_sID.equals(sID)) return NULL;
return &(aI->m_aAdjustment); }
}
const VclBuilder::Adjustment *VclBuilder::get_adjustment_by_name(OString sID) const
{
std::map<OString, Adjustment>::const_iterator aI = m_pParserState->m_aAdjustments.find(sID);
if (aI != m_pParserState->m_aAdjustments.end())
return &(aI->second);
return NULL; return NULL;
} }
...@@ -1709,9 +1735,9 @@ bool VclBuilder::replace(OString sID, Window &rReplacement) ...@@ -1709,9 +1735,9 @@ bool VclBuilder::replace(OString sID, Window &rReplacement)
return false; return false;
} }
void VclBuilder::mungemodel(ListBox &rTarget, ListStore &rStore) void VclBuilder::mungeModel(ListBox &rTarget, const ListStore &rStore)
{ {
for (std::vector<ListStore::row>::iterator aI = rStore.m_aEntries.begin(), aEnd = rStore.m_aEntries.end(); for (std::vector<ListStore::row>::const_iterator aI = rStore.m_aEntries.begin(), aEnd = rStore.m_aEntries.end();
aI != aEnd; ++aI) aI != aEnd; ++aI)
{ {
const ListStore::row &rRow = *aI; const ListStore::row &rRow = *aI;
...@@ -1726,11 +1752,11 @@ void VclBuilder::mungemodel(ListBox &rTarget, ListStore &rStore) ...@@ -1726,11 +1752,11 @@ void VclBuilder::mungemodel(ListBox &rTarget, ListStore &rStore)
rTarget.SelectEntryPos(0); rTarget.SelectEntryPos(0);
} }
void VclBuilder::mungeSpinAdjustment(NumericFormatter &rTarget, Adjustment &rAdjustment) void VclBuilder::mungeSpinAdjustment(NumericFormatter &rTarget, const Adjustment &rAdjustment)
{ {
int nMul = rtl_math_pow10Exp(1, rTarget.GetDecimalDigits()); int nMul = rtl_math_pow10Exp(1, rTarget.GetDecimalDigits());
for (stringmap::iterator aI = rAdjustment.begin(), aEnd = rAdjustment.end(); aI != aEnd; ++aI) for (stringmap::const_iterator aI = rAdjustment.begin(), aEnd = rAdjustment.end(); aI != aEnd; ++aI)
{ {
const OString &rKey = aI->first; const OString &rKey = aI->first;
const OString &rValue = aI->second; const OString &rValue = aI->second;
...@@ -1764,9 +1790,9 @@ void VclBuilder::mungeSpinAdjustment(NumericFormatter &rTarget, Adjustment &rAdj ...@@ -1764,9 +1790,9 @@ void VclBuilder::mungeSpinAdjustment(NumericFormatter &rTarget, Adjustment &rAdj
} }
} }
void VclBuilder::mungeScrollAdjustment(ScrollBar &rTarget, Adjustment &rAdjustment) void VclBuilder::mungeScrollAdjustment(ScrollBar &rTarget, const Adjustment &rAdjustment)
{ {
for (stringmap::iterator aI = rAdjustment.begin(), aEnd = rAdjustment.end(); aI != aEnd; ++aI) for (stringmap::const_iterator aI = rAdjustment.begin(), aEnd = rAdjustment.end(); aI != aEnd; ++aI)
{ {
const OString &rKey = aI->first; const OString &rKey = aI->first;
const OString &rValue = aI->second; const OString &rValue = aI->second;
...@@ -1788,5 +1814,20 @@ void VclBuilder::mungeScrollAdjustment(ScrollBar &rTarget, Adjustment &rAdjustme ...@@ -1788,5 +1814,20 @@ void VclBuilder::mungeScrollAdjustment(ScrollBar &rTarget, Adjustment &rAdjustme
} }
} }
void VclBuilder::mungeTextBuffer(VclMultiLineEdit &rTarget, const TextBuffer &rTextBuffer)
{
for (stringmap::const_iterator aI = rTextBuffer.begin(), aEnd = rTextBuffer.end(); aI != aEnd; ++aI)
{
const OString &rKey = aI->first;
const OString &rValue = aI->second;
if (rKey == "text")
rTarget.SetText(OStringToOUString(rValue, RTL_TEXTENCODING_UTF8));
else
{
SAL_INFO("vcl.layout", "unhandled property :" << rKey.getStr());
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment