diff options
author | Caolán McNamara <caolanm@redhat.com> | 2012-11-22 12:27:36 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2012-11-22 13:45:23 +0000 |
commit | cbcc8c80d9972c7a908e144e34bb4e347d4ec641 (patch) | |
tree | 4a935e3db17c7c4262a9fadc6f5e61b7898adf96 /vcl | |
parent | 4546ef5664e7098228d890d112935737d273701b (diff) |
support setting textbuffers on textviews
Change-Id: Iaab4f17539c65c11870ce9b0635dc5ab47f1fa88
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/vcl/builder.hxx | 64 | ||||
-rw-r--r-- | vcl/source/window/builder.cxx | 109 |
2 files changed, 103 insertions, 70 deletions
diff --git a/vcl/inc/vcl/builder.hxx b/vcl/inc/vcl/builder.hxx index e350a81299d0..cbda844bee2b 100644 --- a/vcl/inc/vcl/builder.hxx +++ b/vcl/inc/vcl/builder.hxx @@ -21,6 +21,7 @@ class ListBox; class NumericFormatter; class ScrollBar; +class VclMultiLineEdit; class VCL_DLLPUBLIC VclBuilder { @@ -56,23 +57,6 @@ private: }; 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 { OString m_sID; @@ -87,44 +71,50 @@ private: typedef StringPair RadioButtonGroupMap; typedef StringPair ComboBoxModelMap; typedef StringPair ButtonImageWidgetMap; + typedef StringPair TextBufferMap; + typedef StringPair WidgetAdjustmentMap; - ListStore *get_model_by_name(OString sID); - static void mungemodel(ListBox &rTarget, ListStore &rStore); - - typedef stringmap Adjustment; - - struct AdjustmentAndId + struct ListStore { - OString m_sID; - Adjustment m_aAdjustment; - AdjustmentAndId(const OString &rId, Adjustment &rAdjustment) - : m_sID(rId) - { - m_aAdjustment.swap(rAdjustment); - } + typedef std::vector<OString> row; + std::vector<row> m_aEntries; }; + 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); - static void mungeSpinAdjustment(NumericFormatter &rTarget, Adjustment &rAdjustment); - static void mungeScrollAdjustment(ScrollBar &rTarget, Adjustment &rAdjustment); + typedef stringmap Adjustment; + const Adjustment *get_adjustment_by_name(OString sID) const; + 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, WidgetTranslations> Translations; typedef std::map<OString, OString> StockMap; + struct ParserState { std::vector<RadioButtonGroupMap> m_aGroupMaps; + std::vector<ComboBoxModelMap> m_aModelMaps; - std::vector<ModelAndId> m_aModels; - std::vector<AdjustmentAndId> m_aAdjustments; + std::map<OString, ListStore> m_aModels; + + std::vector<TextBufferMap> m_aTextBufferMaps; + std::map<OString, TextBuffer> m_aTextBuffers; + std::vector<WidgetAdjustmentMap> m_aSpinAdjustmentMaps; std::vector<WidgetAdjustmentMap> m_aScrollAdjustmentMaps; + std::map<OString, Adjustment> m_aAdjustments; + std::vector<ButtonImageWidgetMap> m_aButtonImageWidgetMaps; StockMap m_aStockMap; + Translations m_aTranslations; + std::map<Window*, Window*> m_aRedundantParentWidgets; }; @@ -185,6 +175,7 @@ private: Window *makeObject(Window *pParent, const OString &rClass, const OString &rID, stringmap &rVec); bool extractGroup(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 extractScrollAdjustment(const OString &id, stringmap &rVec); bool extractImage(const OString &id, stringmap &rMap); @@ -202,6 +193,7 @@ private: void handleListStore(xmlreader::XmlReader &reader, const OString &rID); void handleRow(xmlreader::XmlReader &reader, const OString &rID, sal_Int32 nRowIndex); void handleAdjustment(const OString &rID, stringmap &rProperties); + void handleTextBuffer(const OString &rID, stringmap &rProperties); void handleTabChild(Window *pParent, xmlreader::XmlReader &reader); PackingData get_window_packing_data(const Window *pWindow) const; diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 463dad0187e4..2caef3eb4418 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -157,15 +157,21 @@ VclBuilder::VclBuilder(Window *pParent, OUString sUIDir, OUString sUIFile, OStri aEnd = m_pParserState->m_aModelMaps.end(); aI != aEnd; ++aI) { 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"); 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 @@ -173,7 +179,7 @@ VclBuilder::VclBuilder(Window *pParent, OUString sUIDir, OUString sUIFile, OStri aEnd = m_pParserState->m_aSpinAdjustmentMaps.end(); aI != aEnd; ++aI) { 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"); if (pTarget && pAdjustment) mungeSpinAdjustment(*pTarget, *pAdjustment); @@ -184,7 +190,7 @@ VclBuilder::VclBuilder(Window *pParent, OUString sUIDir, OUString sUIFile, OStri aEnd = m_pParserState->m_aScrollAdjustmentMaps.end(); aI != aEnd; ++aI) { 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"); if (pTarget && pAdjustment) mungeScrollAdjustment(*pTarget, *pAdjustment); @@ -515,7 +521,6 @@ bool VclBuilder::extractScrollAdjustment(const OString &id, stringmap &rMap) return false; } - bool VclBuilder::extractModel(const OString &id, stringmap &rMap) { VclBuilder::stringmap::iterator aFind = rMap.find(OString("model")); @@ -528,6 +533,18 @@ bool VclBuilder::extractModel(const OString &id, stringmap &rMap) 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) { VclBuilder::stringmap::iterator aFind = rMap.find(OString("stock")); @@ -790,6 +807,8 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri pWindow = new Window(pParent); else if (name == "GtkTextView") { + extractBuffer(id, rMap); + WinBits nWinStyle = WB_LEFT | WB_BORDER; //VclMultiLineEdit manage their own scrolling, //so if it appears as a child of a scrolling window @@ -1213,7 +1232,12 @@ void VclBuilder::collectPangoAttribute(xmlreader::XmlReader &reader, stringmap & 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) @@ -1277,14 +1301,11 @@ void VclBuilder::handleRow(xmlreader::XmlReader &reader, const OString &rID, sal break; } - if (!aRow.empty()) - m_pParserState->m_aModels.back().m_pModel->m_aEntries.push_back(aRow); + m_pParserState->m_aModels[rID].m_aEntries.push_back(aRow); } void VclBuilder::handleListStore(xmlreader::XmlReader &reader, const OString &rID) { - m_pParserState->m_aModels.push_back(ModelAndId(rID, new ListStore)); - int nLevel = 1; sal_Int32 nRowIndex = 0; @@ -1403,6 +1424,11 @@ Window* VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader) handleAdjustment(sID, aProperties); return NULL; } + else if (sClass == "GtkTextBuffer") + { + handleTextBuffer(sID, aProperties); + return NULL; + } if (!pCurrentChild) pCurrentChild = insertObject(pParent, sClass, sID, aProperties, aPangoAttributes); @@ -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(), - aEnd = m_pParserState->m_aModels.end(); aI != aEnd; ++aI) - { - if (aI->m_sID.equals(sID)) - return aI->m_pModel; - } - + std::map<OString, ListStore>::const_iterator aI = m_pParserState->m_aModels.find(sID); + if (aI != m_pParserState->m_aModels.end()) + return &(aI->second); 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(), - aEnd = m_pParserState->m_aAdjustments.end(); aI != aEnd; ++aI) - { - if (aI->m_sID.equals(sID)) - return &(aI->m_aAdjustment); - } + std::map<OString, TextBuffer>::const_iterator aI = m_pParserState->m_aTextBuffers.find(sID); + if (aI != m_pParserState->m_aTextBuffers.end()) + return &(aI->second); + return NULL; +} +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; } @@ -1709,9 +1735,9 @@ bool VclBuilder::replace(OString sID, Window &rReplacement) 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) { const ListStore::row &rRow = *aI; @@ -1726,11 +1752,11 @@ void VclBuilder::mungemodel(ListBox &rTarget, ListStore &rStore) 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()); - 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 &rValue = aI->second; @@ -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 &rValue = aI->second; @@ -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: */ |