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