summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2012-11-22 12:27:36 +0000
committerCaolán McNamara <caolanm@redhat.com>2012-11-22 13:45:23 +0000
commitcbcc8c80d9972c7a908e144e34bb4e347d4ec641 (patch)
tree4a935e3db17c7c4262a9fadc6f5e61b7898adf96 /vcl
parent4546ef5664e7098228d890d112935737d273701b (diff)
support setting textbuffers on textviews
Change-Id: Iaab4f17539c65c11870ce9b0635dc5ab47f1fa88
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/vcl/builder.hxx64
-rw-r--r--vcl/source/window/builder.cxx109
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: */