Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : //ScRangeManagerTable
11 : #include "global.hxx"
12 : #include "reffact.hxx"
13 : #include "document.hxx"
14 : #include "docfunc.hxx"
15 : #include "scresid.hxx"
16 : #include "globstr.hrc"
17 : #include "namedlg.hxx"
18 : #include "viewdata.hxx"
19 : #include "globalnames.hxx"
20 :
21 : #include <sfx2/app.hxx>
22 :
23 : #define ITEMID_NAME 1
24 : #define ITEMID_RANGE 2
25 : #define ITEMID_SCOPE 3
26 :
27 : #define MINSIZE 80
28 :
29 0 : static OUString createEntryString(const ScRangeNameLine& rLine)
30 : {
31 0 : OUString aRet = rLine.aName + "\t" + rLine.aExpression + "\t" + rLine.aScope;
32 0 : return aRet;
33 : }
34 :
35 0 : ScRangeManagerTable::InitListener::~InitListener() {}
36 :
37 0 : ScRangeManagerTable::ScRangeManagerTable( SvSimpleTableContainer& rParent, boost::ptr_map<OUString, ScRangeName>& rRangeMap, const ScAddress& rPos ):
38 : SvSimpleTable( rParent, WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP ),
39 0 : maGlobalString( ScGlobal::GetRscString(STR_GLOBAL_SCOPE)),
40 : mrRangeMap( rRangeMap ),
41 : maPos( rPos ),
42 0 : mpInitListener(NULL)
43 : {
44 : static long aStaticTabs[] = {3, 0, 0, 0 };
45 0 : SetTabs( &aStaticTabs[0], MAP_PIXEL );
46 :
47 0 : OUString aNameStr(ScGlobal::GetRscString(STR_HEADER_NAME));
48 0 : OUString aRangeStr(ScGlobal::GetRscString(STR_HEADER_RANGE));
49 0 : OUString aScopeStr(ScGlobal::GetRscString(STR_HEADER_SCOPE));
50 :
51 0 : HeaderBar& rHeaderBar = GetTheHeaderBar();
52 0 : InsertHeaderEntry( aNameStr );
53 0 : InsertHeaderEntry( aRangeStr );
54 0 : InsertHeaderEntry( aScopeStr );
55 0 : rHeaderBar.SetEndDragHdl( LINK( this, ScRangeManagerTable, HeaderEndDragHdl ) );
56 :
57 0 : setColWidths();
58 0 : UpdateViewSize();
59 0 : Init();
60 0 : ShowTable();
61 0 : SetSelectionMode(MULTIPLE_SELECTION);
62 0 : SetScrolledHdl( LINK( this, ScRangeManagerTable, ScrollHdl ) );
63 0 : void* pNull = NULL;
64 0 : HeaderEndDragHdl(pNull);
65 0 : }
66 :
67 0 : void ScRangeManagerTable::Resize()
68 : {
69 0 : SvSimpleTable::Resize();
70 0 : if (isInitialLayout(this))
71 0 : setColWidths();
72 0 : }
73 :
74 0 : void ScRangeManagerTable::StateChanged( StateChangedType nStateChange )
75 : {
76 0 : SvSimpleTable::StateChanged(nStateChange);
77 :
78 0 : if (nStateChange == StateChangedType::InitShow)
79 : {
80 0 : if (GetEntryCount())
81 : {
82 0 : SetCurEntry(GetEntryOnPos(0));
83 0 : CheckForFormulaString();
84 : }
85 :
86 0 : if (mpInitListener)
87 0 : mpInitListener->tableInitialized();
88 : }
89 0 : }
90 :
91 0 : void ScRangeManagerTable::setColWidths()
92 : {
93 0 : HeaderBar &rHeaderBar = GetTheHeaderBar();
94 0 : if (rHeaderBar.GetItemCount() < 3)
95 0 : return;
96 0 : long nTabSize = GetSizePixel().Width() / 3;
97 0 : rHeaderBar.SetItemSize( ITEMID_NAME, nTabSize);
98 0 : rHeaderBar.SetItemSize( ITEMID_RANGE, nTabSize);
99 0 : rHeaderBar.SetItemSize( ITEMID_SCOPE, nTabSize);
100 0 : static long aStaticTabs[] = {3, 0, nTabSize, 2*nTabSize };
101 0 : SetTabs( &aStaticTabs[0], MAP_PIXEL );
102 0 : void* pNull = NULL;
103 0 : HeaderEndDragHdl(pNull);
104 : }
105 :
106 0 : ScRangeManagerTable::~ScRangeManagerTable()
107 : {
108 0 : disposeOnce();
109 0 : }
110 :
111 0 : void ScRangeManagerTable::dispose()
112 : {
113 0 : Clear();
114 0 : SvSimpleTable::dispose();
115 0 : }
116 :
117 0 : void ScRangeManagerTable::setInitListener( InitListener* pListener )
118 : {
119 0 : mpInitListener = pListener;
120 0 : }
121 :
122 0 : void ScRangeManagerTable::addEntry(const ScRangeNameLine& rLine, bool bSetCurEntry)
123 : {
124 0 : SvTreeListEntry* pEntry = InsertEntryToColumn( createEntryString(rLine), TREELIST_APPEND, 0xffff);
125 0 : if (bSetCurEntry)
126 0 : SetCurEntry(pEntry);
127 0 : }
128 :
129 0 : void ScRangeManagerTable::GetCurrentLine(ScRangeNameLine& rLine)
130 : {
131 0 : SvTreeListEntry* pCurrentEntry = GetCurEntry();
132 0 : GetLine(rLine, pCurrentEntry);
133 0 : }
134 :
135 0 : void ScRangeManagerTable::GetLine(ScRangeNameLine& rLine, SvTreeListEntry* pEntry)
136 : {
137 0 : rLine.aName = GetEntryText( pEntry, 0);
138 0 : rLine.aExpression = GetEntryText(pEntry, 1);
139 0 : rLine.aScope = GetEntryText(pEntry, 2);
140 0 : }
141 :
142 0 : void ScRangeManagerTable::Init()
143 : {
144 0 : SetUpdateMode(false);
145 0 : Clear();
146 0 : for (boost::ptr_map<OUString, ScRangeName>::const_iterator itr = mrRangeMap.begin();
147 0 : itr != mrRangeMap.end(); ++itr)
148 : {
149 0 : const ScRangeName* pLocalRangeName = itr->second;
150 0 : ScRangeNameLine aLine;
151 0 : if ( itr->first == STR_GLOBAL_RANGE_NAME )
152 0 : aLine.aScope = maGlobalString;
153 : else
154 0 : aLine.aScope = itr->first;
155 0 : for (ScRangeName::const_iterator it = pLocalRangeName->begin();
156 0 : it != pLocalRangeName->end(); ++it)
157 : {
158 0 : if (!it->second->HasType(RT_DATABASE))
159 : {
160 0 : aLine.aName = it->second->GetName();
161 0 : addEntry(aLine, false);
162 : }
163 : }
164 0 : }
165 0 : SetUpdateMode(true);
166 0 : }
167 :
168 0 : const ScRangeData* ScRangeManagerTable::findRangeData(const ScRangeNameLine& rLine)
169 : {
170 : const ScRangeName* pRangeName;
171 0 : if (rLine.aScope == maGlobalString)
172 0 : pRangeName = mrRangeMap.find(OUString(STR_GLOBAL_RANGE_NAME))->second;
173 : else
174 0 : pRangeName = mrRangeMap.find(rLine.aScope)->second;
175 :
176 0 : return pRangeName->findByUpperName(ScGlobal::pCharClass->uppercase(rLine.aName));
177 : }
178 :
179 0 : void ScRangeManagerTable::CheckForFormulaString()
180 : {
181 0 : for (SvTreeListEntry* pEntry = GetFirstEntryInView(); pEntry ; pEntry = GetNextEntryInView(pEntry))
182 : {
183 0 : std::map<SvTreeListEntry*, bool>::const_iterator itr = maCalculatedFormulaEntries.find(pEntry);
184 0 : if (itr == maCalculatedFormulaEntries.end() || !itr->second)
185 : {
186 0 : ScRangeNameLine aLine;
187 0 : GetLine( aLine, pEntry);
188 0 : const ScRangeData* pData = findRangeData( aLine );
189 0 : OUString aFormulaString;
190 0 : pData->GetSymbol(aFormulaString, maPos);
191 0 : SetEntryText(aFormulaString, pEntry, 1);
192 0 : maCalculatedFormulaEntries.insert( std::pair<SvTreeListEntry*, bool>(pEntry, true) );
193 : }
194 : }
195 0 : }
196 :
197 0 : void ScRangeManagerTable::DeleteSelectedEntries()
198 : {
199 0 : if (GetSelectionCount())
200 0 : RemoveSelection();
201 0 : }
202 :
203 0 : bool ScRangeManagerTable::IsMultiSelection()
204 : {
205 0 : return GetSelectionCount() > 1;
206 : }
207 :
208 0 : std::vector<ScRangeNameLine> ScRangeManagerTable::GetSelectedEntries()
209 : {
210 0 : std::vector<ScRangeNameLine> aSelectedEntries;
211 0 : if (GetSelectionCount())
212 : {
213 0 : for (SvTreeListEntry* pEntry = FirstSelected(); pEntry != LastSelected(); pEntry = NextSelected(pEntry))
214 : {
215 0 : ScRangeNameLine aLine;
216 0 : GetLine( aLine, pEntry );
217 0 : aSelectedEntries.push_back(aLine);
218 0 : }
219 0 : SvTreeListEntry* pEntry = LastSelected();
220 0 : ScRangeNameLine aLine;
221 0 : GetLine( aLine, pEntry );
222 0 : aSelectedEntries.push_back(aLine);
223 : }
224 0 : return aSelectedEntries;
225 : }
226 :
227 0 : void ScRangeManagerTable::SetEntry(const ScRangeNameLine& rLine)
228 : {
229 0 : for (SvTreeListEntry* pEntry = First(); pEntry; pEntry = Next(pEntry))
230 : {
231 0 : if (rLine.aName == GetEntryText(pEntry, 0)
232 0 : && rLine.aScope == GetEntryText(pEntry, 2))
233 : {
234 0 : SetCurEntry(pEntry);
235 : }
236 : }
237 0 : }
238 :
239 : namespace {
240 :
241 : //ensure that the minimum column size is respected
242 0 : void CalculateItemSize(const long& rTableSize, long& rItemNameSize, long& rItemRangeSize)
243 : {
244 0 : long aItemScopeSize = rTableSize - rItemNameSize - rItemRangeSize;
245 :
246 0 : if (rItemNameSize >= MINSIZE && rItemRangeSize >= MINSIZE && aItemScopeSize >= MINSIZE)
247 0 : return;
248 :
249 0 : if (rItemNameSize < MINSIZE)
250 : {
251 0 : long aDiffSize = MINSIZE - rItemNameSize;
252 0 : if (rItemRangeSize > aItemScopeSize)
253 0 : rItemRangeSize -= aDiffSize;
254 : else
255 0 : aItemScopeSize -= aDiffSize;
256 0 : rItemNameSize = MINSIZE;
257 : }
258 :
259 0 : if (rItemRangeSize < MINSIZE)
260 : {
261 0 : long aDiffSize = MINSIZE - rItemRangeSize;
262 0 : if (rItemNameSize > aItemScopeSize)
263 0 : rItemNameSize -= aDiffSize;
264 : else
265 0 : aItemScopeSize -= aDiffSize;
266 0 : rItemRangeSize = MINSIZE;
267 : }
268 :
269 0 : if (aItemScopeSize < MINSIZE)
270 : {
271 0 : long aDiffSize = MINSIZE - aItemScopeSize;
272 0 : if (rItemNameSize > rItemRangeSize)
273 0 : rItemNameSize -= aDiffSize;
274 : else
275 0 : rItemRangeSize -= aDiffSize;
276 : }
277 : }
278 :
279 : }
280 :
281 0 : IMPL_LINK_NOARG(ScRangeManagerTable, HeaderEndDragHdl)
282 : {
283 0 : HeaderBar& rHeaderBar = GetTheHeaderBar();
284 :
285 0 : long nTableSize = rHeaderBar.GetSizePixel().Width();
286 0 : long nItemNameSize = rHeaderBar.GetItemSize(ITEMID_NAME);
287 0 : long nItemRangeSize = rHeaderBar.GetItemSize(ITEMID_RANGE);
288 :
289 : //calculate column size based on user input and minimum size
290 0 : CalculateItemSize(nTableSize, nItemNameSize, nItemRangeSize);
291 0 : long nItemScopeSize = nTableSize - nItemNameSize - nItemRangeSize;
292 :
293 0 : Size aSz(nItemNameSize, 0);
294 0 : rHeaderBar.SetItemSize(ITEMID_NAME, nItemNameSize);
295 0 : rHeaderBar.SetItemSize(ITEMID_RANGE, nItemRangeSize);
296 0 : rHeaderBar.SetItemSize(ITEMID_SCOPE, nItemScopeSize);
297 :
298 0 : SetTab(0, 0, MAP_APPFONT );
299 0 : SetTab(1, PixelToLogic( aSz, MapMode(MAP_APPFONT) ).Width(), MAP_APPFONT );
300 0 : aSz.Width() += nItemRangeSize;
301 0 : SetTab(2, PixelToLogic( aSz, MapMode(MAP_APPFONT) ).Width(), MAP_APPFONT );
302 :
303 0 : return 0;
304 : }
305 :
306 0 : IMPL_LINK_NOARG(ScRangeManagerTable, ScrollHdl)
307 : {
308 0 : CheckForFormulaString();
309 0 : return 0;
310 156 : }
311 :
312 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|