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 : #include "condformatmgr.hxx"
11 : #include "scresid.hxx"
12 : #include "globstr.hrc"
13 : #include "condformatdlg.hxx"
14 : #include <vcl/msgbox.hxx>
15 : #include "document.hxx"
16 :
17 0 : ScCondFormatManagerWindow::ScCondFormatManagerWindow(SvSimpleTableContainer& rParent,
18 : ScDocument* pDoc, ScConditionalFormatList* pFormatList)
19 : : SvSimpleTable(rParent, WB_HSCROLL | WB_SORT | WB_TABSTOP)
20 : , mpDoc(pDoc)
21 0 : , mpFormatList(pFormatList)
22 : {
23 0 : OUString aConditionStr(ScGlobal::GetRscString(STR_HEADER_COND));
24 0 : OUString aRangeStr(ScGlobal::GetRscString(STR_HEADER_RANGE));
25 :
26 0 : OUStringBuffer sHeader;
27 0 : sHeader.append(aRangeStr).append("\t").append(aConditionStr);
28 0 : InsertHeaderEntry(sHeader.makeStringAndClear(), HEADERBAR_APPEND, HIB_LEFT | HIB_VCENTER);
29 0 : setColSizes();
30 :
31 0 : Init();
32 0 : Show();
33 0 : SetSelectionMode(MULTIPLE_SELECTION);
34 0 : }
35 :
36 0 : OUString ScCondFormatManagerWindow::createEntryString(const ScConditionalFormat& rFormat)
37 : {
38 0 : ScRangeList aRange = rFormat.GetRange();
39 0 : OUString aStr;
40 0 : aRange.Format(aStr, SCA_VALID, mpDoc, mpDoc->GetAddressConvention());
41 0 : aStr += "\t";
42 0 : aStr += ScCondFormatHelper::GetExpression(rFormat, aRange.GetTopLeftCorner());
43 0 : return aStr;
44 : }
45 :
46 0 : void ScCondFormatManagerWindow::Init()
47 : {
48 0 : SetUpdateMode(false);
49 :
50 0 : if (mpFormatList)
51 : {
52 0 : for(ScConditionalFormatList::iterator itr = mpFormatList->begin(); itr != mpFormatList->end(); ++itr)
53 : {
54 0 : SvTreeListEntry* pEntry = InsertEntryToColumn( createEntryString(*itr), TREELIST_APPEND, 0xffff );
55 0 : maMapLBoxEntryToCondIndex.insert(std::pair<SvTreeListEntry*,sal_Int32>(pEntry,itr->GetKey()));
56 : }
57 : }
58 :
59 0 : SetUpdateMode(true);
60 :
61 0 : if (mpFormatList && mpFormatList->size())
62 0 : SelectRow(0);
63 0 : }
64 :
65 0 : void ScCondFormatManagerWindow::Resize()
66 : {
67 0 : SvSimpleTable::Resize();
68 0 : if (GetParentDialog()->isCalculatingInitialLayoutSize())
69 0 : setColSizes();
70 0 : }
71 :
72 0 : void ScCondFormatManagerWindow::DeleteSelection()
73 : {
74 0 : if(GetSelectionCount())
75 : {
76 0 : for(SvTreeListEntry* pEntry = FirstSelected(); pEntry != NULL; pEntry = NextSelected(pEntry))
77 : {
78 0 : sal_Int32 nIndex = maMapLBoxEntryToCondIndex.find(pEntry)->second;
79 0 : mpFormatList->erase(nIndex);
80 : }
81 0 : RemoveSelection();
82 : }
83 0 : }
84 :
85 0 : ScConditionalFormat* ScCondFormatManagerWindow::GetSelection()
86 : {
87 0 : SvTreeListEntry* pEntry = FirstSelected();
88 0 : if(!pEntry)
89 0 : return NULL;
90 :
91 0 : sal_Int32 nIndex = maMapLBoxEntryToCondIndex.find(pEntry)->second;
92 0 : return mpFormatList->GetFormat(nIndex);
93 : }
94 :
95 0 : void ScCondFormatManagerWindow::Update()
96 : {
97 0 : Clear();
98 0 : maMapLBoxEntryToCondIndex.clear();
99 0 : Init();
100 0 : }
101 :
102 0 : void ScCondFormatManagerWindow::setColSizes()
103 : {
104 0 : HeaderBar &rBar = GetTheHeaderBar();
105 0 : if (rBar.GetItemCount() < 2)
106 0 : return;
107 0 : long aStaticTabs[]= { 2, 0, 0 };
108 0 : aStaticTabs[2] = rBar.GetSizePixel().Width() / 2;
109 0 : SvSimpleTable::SetTabs(aStaticTabs, MAP_PIXEL);
110 : }
111 :
112 0 : ScCondFormatManagerDlg::ScCondFormatManagerDlg(vcl::Window* pParent, ScDocument* pDoc, const ScConditionalFormatList* pFormatList, const ScAddress& rPos):
113 : ModalDialog(pParent, "CondFormatManager", "modules/scalc/ui/condformatmanager.ui"),
114 0 : mpFormatList( pFormatList ? new ScConditionalFormatList(*pFormatList) : NULL),
115 : mpDoc(pDoc),
116 : maPos(rPos),
117 0 : mbModified(false)
118 : {
119 0 : SvSimpleTableContainer *pContainer = get<SvSimpleTableContainer>("CONTAINER");
120 0 : Size aSize(LogicToPixel(Size(290, 220), MAP_APPFONT));
121 0 : pContainer->set_width_request(aSize.Width());
122 0 : pContainer->set_height_request(aSize.Height());
123 0 : m_pCtrlManager = new ScCondFormatManagerWindow(*pContainer, mpDoc, mpFormatList);
124 0 : get(m_pBtnAdd, "add");
125 0 : get(m_pBtnRemove, "remove");
126 0 : get(m_pBtnEdit, "edit");
127 :
128 0 : m_pBtnRemove->SetClickHdl(LINK(this, ScCondFormatManagerDlg, RemoveBtnHdl));
129 0 : m_pBtnEdit->SetClickHdl(LINK(this, ScCondFormatManagerDlg, EditBtnHdl));
130 0 : m_pBtnAdd->SetClickHdl(LINK(this, ScCondFormatManagerDlg, AddBtnHdl));
131 0 : m_pCtrlManager->SetDoubleClickHdl(LINK(this, ScCondFormatManagerDlg, EditBtnHdl));
132 0 : }
133 :
134 0 : ScCondFormatManagerDlg::~ScCondFormatManagerDlg()
135 : {
136 0 : delete m_pCtrlManager;
137 0 : delete mpFormatList;
138 0 : }
139 :
140 0 : bool ScCondFormatManagerDlg::IsInRefMode() const
141 : {
142 0 : return true;
143 : }
144 :
145 0 : ScConditionalFormatList* ScCondFormatManagerDlg::GetConditionalFormatList()
146 : {
147 0 : ScConditionalFormatList* pList = mpFormatList;
148 0 : mpFormatList = NULL;
149 0 : return pList;
150 : }
151 :
152 0 : IMPL_LINK_NOARG(ScCondFormatManagerDlg, RemoveBtnHdl)
153 : {
154 0 : m_pCtrlManager->DeleteSelection();
155 0 : mbModified = true;
156 0 : return 0;
157 : }
158 :
159 0 : IMPL_LINK_NOARG(ScCondFormatManagerDlg, EditBtnHdl)
160 : {
161 0 : ScConditionalFormat* pFormat = m_pCtrlManager->GetSelection();
162 :
163 0 : if(!pFormat)
164 0 : return 0;
165 :
166 0 : sal_uInt16 nId = 1;
167 0 : ScModule* pScMod = SC_MOD();
168 0 : pScMod->SetRefDialog( nId, true );
169 : boost::scoped_ptr<ScCondFormatDlg> pDlg(new ScCondFormatDlg(this, mpDoc, pFormat, pFormat->GetRange(),
170 0 : pFormat->GetRange().GetTopLeftCorner(), condformat::dialog::NONE));
171 0 : Show(false, 0);
172 0 : if(pDlg->Execute() == RET_OK)
173 : {
174 0 : sal_Int32 nKey = pFormat->GetKey();
175 0 : mpFormatList->erase(nKey);
176 0 : ScConditionalFormat* pNewFormat = pDlg->GetConditionalFormat();
177 0 : if(pNewFormat)
178 : {
179 0 : pNewFormat->SetKey(nKey);
180 0 : mpFormatList->InsertNew(pNewFormat);
181 : }
182 :
183 0 : m_pCtrlManager->Update();
184 0 : mbModified = true;
185 : }
186 0 : Show(true, 0);
187 :
188 0 : pScMod->SetRefDialog( nId, false );
189 :
190 0 : return 0;
191 : }
192 :
193 : namespace {
194 :
195 0 : sal_uInt32 FindKey(ScConditionalFormatList* pFormatList)
196 : {
197 0 : sal_uInt32 nKey = 0;
198 0 : for(ScConditionalFormatList::const_iterator itr = pFormatList->begin(), itrEnd = pFormatList->end();
199 : itr != itrEnd; ++itr)
200 : {
201 0 : if(itr->GetKey() > nKey)
202 0 : nKey = itr->GetKey();
203 : }
204 :
205 0 : return nKey + 1;
206 : }
207 :
208 : }
209 :
210 0 : IMPL_LINK_NOARG(ScCondFormatManagerDlg, AddBtnHdl)
211 : {
212 0 : sal_uInt16 nId = 1;
213 0 : ScModule* pScMod = SC_MOD();
214 0 : pScMod->SetRefDialog( nId, true );
215 : boost::scoped_ptr<ScCondFormatDlg> pDlg(new ScCondFormatDlg(this, mpDoc, NULL, ScRangeList(),
216 0 : maPos, condformat::dialog::CONDITION));
217 0 : Show(false, 0);
218 0 : if(pDlg->Execute() == RET_OK)
219 : {
220 0 : ScConditionalFormat* pNewFormat = pDlg->GetConditionalFormat();
221 0 : if(pNewFormat)
222 : {
223 0 : mpFormatList->InsertNew(pNewFormat);
224 0 : pNewFormat->SetKey(FindKey(mpFormatList));
225 0 : m_pCtrlManager->Update();
226 :
227 0 : mbModified = true;
228 : }
229 : }
230 0 : Show(true, 0);
231 0 : pScMod->SetRefDialog( nId, false );
232 :
233 0 : return 0;
234 0 : }
235 :
236 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|