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 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #undef SC_DLLIMPLEMENTATION
21 :
22 : #include "scitems.hxx"
23 : #include <svx/algitem.hxx>
24 : #include <editeng/boxitem.hxx>
25 : #include <editeng/brushitem.hxx>
26 : #include <editeng/contouritem.hxx>
27 : #include <editeng/colritem.hxx>
28 : #include <editeng/crossedoutitem.hxx>
29 : #include <editeng/fontitem.hxx>
30 : #include <editeng/postitem.hxx>
31 : #include <editeng/shdditem.hxx>
32 : #include <editeng/udlnitem.hxx>
33 : #include <editeng/wghtitem.hxx>
34 : #include <svl/zforlist.hxx>
35 : #include <vcl/msgbox.hxx>
36 : #include <comphelper/processfactory.hxx>
37 : #include <sfx2/sfxresid.hxx>
38 : #include "sc.hrc"
39 : #include "scmod.hxx"
40 : #include "attrib.hxx"
41 : #include "zforauto.hxx"
42 : #include "global.hxx"
43 : #include "globstr.hrc"
44 : #include "autoform.hxx"
45 : #include "strindlg.hxx"
46 : #include "miscdlgs.hrc"
47 : #include "scuiautofmt.hxx"
48 : #include "scresid.hxx"
49 : #include "document.hxx"
50 : #include <boost/scoped_ptr.hpp>
51 :
52 : // AutoFormat-Dialog:
53 :
54 0 : ScAutoFormatDlg::ScAutoFormatDlg(vcl::Window* pParent,
55 : ScAutoFormat* pAutoFormat,
56 : const ScAutoFormatData* pSelFormatData,
57 : ScViewData *pViewData)
58 : : ModalDialog(pParent, "AutoFormatTableDialog",
59 : "modules/scalc/ui/autoformattable.ui")
60 : , aStrTitle(ScResId(STR_ADD_AUTOFORMAT_TITLE))
61 : , aStrLabel(ScResId(STR_ADD_AUTOFORMAT_LABEL))
62 : , aStrClose(ScResId(STR_BTN_AUTOFORMAT_CLOSE))
63 : , aStrDelMsg(ScResId(STR_DEL_AUTOFORMAT_MSG))
64 : , aStrRename(ScResId(STR_RENAME_AUTOFORMAT_TITLE))
65 : , pFormat(pAutoFormat)
66 : , pSelFmtData(pSelFormatData)
67 : , nIndex(0)
68 : , bCoreDataChanged(false)
69 0 : , bFmtInserted(false)
70 : {
71 0 : get(m_pLbFormat, "formatlb");
72 0 : get(m_pWndPreview, "preview");
73 0 : m_pWndPreview->DetectRTL(pViewData);
74 0 : get(m_pBtnOk, "ok");
75 0 : get(m_pBtnCancel, "cancel");
76 0 : get(m_pBtnAdd, "add");
77 0 : get(m_pBtnRemove, "remove");
78 0 : get(m_pBtnRename, "rename");
79 0 : get(m_pBtnNumFormat, "numformatcb");
80 0 : get(m_pBtnBorder, "bordercb");
81 0 : get(m_pBtnFont, "fontcb");
82 0 : get(m_pBtnPattern, "patterncb");
83 0 : get(m_pBtnAlignment, "alignmentcb");
84 0 : get(m_pBtnAdjust, "autofitcb");
85 :
86 0 : Init();
87 0 : ScAutoFormat::iterator it = pFormat->begin();
88 0 : m_pWndPreview->NotifyChange(it->second);
89 0 : }
90 :
91 0 : ScAutoFormatDlg::~ScAutoFormatDlg()
92 : {
93 0 : disposeOnce();
94 0 : }
95 :
96 0 : void ScAutoFormatDlg::dispose()
97 : {
98 0 : m_pLbFormat.clear();
99 0 : m_pWndPreview.clear();
100 0 : m_pBtnOk.clear();
101 0 : m_pBtnCancel.clear();
102 0 : m_pBtnAdd.clear();
103 0 : m_pBtnRemove.clear();
104 0 : m_pBtnRename.clear();
105 0 : m_pBtnNumFormat.clear();
106 0 : m_pBtnBorder.clear();
107 0 : m_pBtnFont.clear();
108 0 : m_pBtnPattern.clear();
109 0 : m_pBtnAlignment.clear();
110 0 : m_pBtnAdjust.clear();
111 0 : ModalDialog::dispose();
112 0 : }
113 :
114 0 : void ScAutoFormatDlg::Init()
115 : {
116 0 : m_pLbFormat->SetSelectHdl( LINK( this, ScAutoFormatDlg, SelFmtHdl ) );
117 0 : m_pBtnNumFormat->SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
118 0 : m_pBtnBorder->SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
119 0 : m_pBtnFont->SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
120 0 : m_pBtnPattern->SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
121 0 : m_pBtnAlignment->SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
122 0 : m_pBtnAdjust->SetClickHdl ( LINK( this, ScAutoFormatDlg, CheckHdl ) );
123 0 : m_pBtnAdd->SetClickHdl ( LINK( this, ScAutoFormatDlg, AddHdl ) );
124 0 : m_pBtnRemove->SetClickHdl ( LINK( this, ScAutoFormatDlg, RemoveHdl ) );
125 0 : m_pBtnOk->SetClickHdl ( LINK( this, ScAutoFormatDlg, CloseHdl ) );
126 0 : m_pBtnCancel->SetClickHdl ( LINK( this, ScAutoFormatDlg, CloseHdl ) );
127 0 : m_pBtnRename->SetClickHdl ( LINK( this, ScAutoFormatDlg, RenameHdl ) );
128 0 : m_pLbFormat->SetDoubleClickHdl( LINK( this, ScAutoFormatDlg, DblClkHdl ) );
129 :
130 0 : ScAutoFormat::const_iterator it = pFormat->begin(), itEnd = pFormat->end();
131 0 : for (; it != itEnd; ++it)
132 0 : m_pLbFormat->InsertEntry(it->second->GetName());
133 :
134 0 : if (pFormat->size() == 1)
135 0 : m_pBtnRemove->Disable();
136 :
137 0 : m_pLbFormat->SelectEntryPos( 0 );
138 0 : m_pBtnRename->Disable();
139 0 : m_pBtnRemove->Disable();
140 :
141 0 : nIndex = 0;
142 0 : UpdateChecks();
143 :
144 0 : if ( !pSelFmtData )
145 : {
146 0 : m_pBtnAdd->Disable();
147 0 : m_pBtnRemove->Disable();
148 0 : bFmtInserted = true;
149 : }
150 0 : }
151 :
152 0 : void ScAutoFormatDlg::UpdateChecks()
153 : {
154 0 : const ScAutoFormatData* pData = pFormat->findByIndex(nIndex);
155 :
156 0 : m_pBtnNumFormat->Check( pData->GetIncludeValueFormat() );
157 0 : m_pBtnBorder->Check( pData->GetIncludeFrame() );
158 0 : m_pBtnFont->Check( pData->GetIncludeFont() );
159 0 : m_pBtnPattern->Check( pData->GetIncludeBackground() );
160 0 : m_pBtnAlignment->Check( pData->GetIncludeJustify() );
161 0 : m_pBtnAdjust->Check( pData->GetIncludeWidthHeight() );
162 0 : }
163 :
164 : // Handler:
165 :
166 0 : IMPL_LINK( ScAutoFormatDlg, CloseHdl, PushButton *, pBtn )
167 : {
168 0 : if (pBtn == m_pBtnOk || pBtn == m_pBtnCancel)
169 : {
170 0 : if ( bCoreDataChanged )
171 0 : ScGlobal::GetOrCreateAutoFormat()->Save();
172 :
173 0 : EndDialog( (pBtn == m_pBtnOk) ? RET_OK : RET_CANCEL );
174 : }
175 0 : return 0;
176 : }
177 :
178 0 : IMPL_LINK_NOARG(ScAutoFormatDlg, DblClkHdl)
179 : {
180 0 : if ( bCoreDataChanged )
181 0 : ScGlobal::GetOrCreateAutoFormat()->Save();
182 :
183 0 : EndDialog( RET_OK );
184 0 : return 0;
185 : }
186 :
187 0 : IMPL_LINK( ScAutoFormatDlg, CheckHdl, Button *, pBtn )
188 : {
189 0 : ScAutoFormatData* pData = pFormat->findByIndex(nIndex);
190 0 : bool bCheck = static_cast<CheckBox*>(pBtn)->IsChecked();
191 :
192 0 : if ( pBtn == m_pBtnNumFormat )
193 0 : pData->SetIncludeValueFormat( bCheck );
194 0 : else if ( pBtn == m_pBtnBorder )
195 0 : pData->SetIncludeFrame( bCheck );
196 0 : else if ( pBtn == m_pBtnFont )
197 0 : pData->SetIncludeFont( bCheck );
198 0 : else if ( pBtn == m_pBtnPattern )
199 0 : pData->SetIncludeBackground( bCheck );
200 0 : else if ( pBtn == m_pBtnAlignment )
201 0 : pData->SetIncludeJustify( bCheck );
202 0 : else if ( pBtn == m_pBtnAdjust )
203 0 : pData->SetIncludeWidthHeight( bCheck );
204 :
205 0 : if ( !bCoreDataChanged )
206 : {
207 0 : m_pBtnCancel->SetText( aStrClose );
208 0 : bCoreDataChanged = true;
209 : }
210 :
211 0 : m_pWndPreview->NotifyChange( pData );
212 :
213 0 : return 0;
214 : }
215 :
216 0 : IMPL_LINK_NOARG(ScAutoFormatDlg, AddHdl)
217 : {
218 0 : if ( !bFmtInserted && pSelFmtData )
219 : {
220 0 : OUString aStrStandard( SfxResId(STR_STANDARD) );
221 0 : OUString aFormatName;
222 0 : bool bOk = false;
223 :
224 0 : while ( !bOk )
225 : {
226 : VclPtrInstance<ScStringInputDlg> pDlg( this,
227 : aStrTitle,
228 : aStrLabel,
229 : aFormatName,
230 0 : HID_SC_ADD_AUTOFMT, HID_SC_AUTOFMT_NAME );
231 :
232 0 : if ( pDlg->Execute() == RET_OK )
233 : {
234 0 : aFormatName = pDlg->GetInputString();
235 :
236 0 : if ( !aFormatName.isEmpty() && !aFormatName.equals(aStrStandard) && pFormat->find(aFormatName) == pFormat->end() )
237 : {
238 : ScAutoFormatData* pNewData
239 0 : = new ScAutoFormatData( *pSelFmtData );
240 :
241 0 : pNewData->SetName( aFormatName );
242 0 : bFmtInserted = pFormat->insert(pNewData);
243 :
244 0 : if ( bFmtInserted )
245 : {
246 0 : ScAutoFormat::const_iterator it = pFormat->find(pNewData);
247 0 : ScAutoFormat::const_iterator itBeg = pFormat->begin();
248 0 : size_t nPos = std::distance(itBeg, it);
249 0 : m_pLbFormat->InsertEntry(aFormatName, nPos);
250 0 : m_pLbFormat->SelectEntry( aFormatName );
251 0 : m_pBtnAdd->Disable();
252 :
253 0 : if ( !bCoreDataChanged )
254 : {
255 0 : m_pBtnCancel->SetText( aStrClose );
256 0 : bCoreDataChanged = true;
257 : }
258 :
259 0 : SelFmtHdl( 0 );
260 0 : bOk = true;
261 : }
262 : else
263 0 : delete pNewData;
264 :
265 : }
266 :
267 0 : if ( !bFmtInserted )
268 : {
269 : sal_uInt16 nRet = ScopedVclPtr<MessageDialog>::Create(this,
270 0 : ScGlobal::GetRscString(STR_INVALID_AFNAME),
271 : VCL_MESSAGE_ERROR,
272 : VCL_BUTTONS_OK_CANCEL
273 0 : )->Execute();
274 :
275 0 : bOk = ( nRet == RET_CANCEL );
276 : }
277 : }
278 : else
279 0 : bOk = true;
280 0 : }
281 : }
282 :
283 0 : return 0;
284 : }
285 :
286 0 : IMPL_LINK_NOARG(ScAutoFormatDlg, RemoveHdl)
287 : {
288 0 : if ( (nIndex > 0) && (m_pLbFormat->GetEntryCount() > 0) )
289 : {
290 0 : OUString aMsg( aStrDelMsg.getToken( 0, '#' ) );
291 :
292 0 : aMsg += m_pLbFormat->GetSelectEntry();
293 0 : aMsg += aStrDelMsg.getToken( 1, '#' );
294 :
295 0 : if ( RET_YES ==
296 0 : ScopedVclPtr<QueryBox>::Create( this, WinBits( WB_YES_NO | WB_DEF_YES ), aMsg )->Execute() )
297 : {
298 0 : m_pLbFormat->RemoveEntry( nIndex );
299 0 : m_pLbFormat->SelectEntryPos( nIndex-1 );
300 :
301 0 : if ( nIndex-1 == 0 )
302 0 : m_pBtnRemove->Disable();
303 :
304 0 : if ( !bCoreDataChanged )
305 : {
306 0 : m_pBtnCancel->SetText( aStrClose );
307 0 : bCoreDataChanged = true;
308 : }
309 :
310 0 : ScAutoFormat::iterator it = pFormat->begin();
311 0 : std::advance(it, nIndex);
312 0 : pFormat->erase(it);
313 0 : nIndex--;
314 :
315 0 : SelFmtHdl( 0 );
316 0 : }
317 : }
318 :
319 0 : SelFmtHdl( 0 );
320 :
321 0 : return 0;
322 : }
323 :
324 0 : IMPL_LINK_NOARG(ScAutoFormatDlg, RenameHdl)
325 : {
326 0 : bool bOk = false;
327 0 : while( !bOk )
328 : {
329 :
330 0 : OUString aFormatName = m_pLbFormat->GetSelectEntry();
331 0 : OUString aEntry;
332 :
333 : VclPtrInstance<ScStringInputDlg> pDlg( this,
334 : aStrRename,
335 : aStrLabel,
336 : aFormatName,
337 0 : HID_SC_REN_AFMT_DLG, HID_SC_REN_AFMT_NAME );
338 0 : if( pDlg->Execute() == RET_OK )
339 : {
340 0 : bool bFmtRenamed = false;
341 0 : aFormatName = pDlg->GetInputString();
342 :
343 0 : if (!aFormatName.isEmpty())
344 : {
345 0 : ScAutoFormat::iterator it = pFormat->begin(), itEnd = pFormat->end();
346 0 : for (; it != itEnd; ++it)
347 : {
348 0 : aEntry = it->second->GetName();
349 0 : if (aFormatName.equals(aEntry))
350 0 : break;
351 : }
352 0 : if (it == itEnd)
353 : {
354 : // no format with this name yet, so we can rename
355 :
356 0 : m_pLbFormat->RemoveEntry(nIndex );
357 0 : const ScAutoFormatData* p = pFormat->findByIndex(nIndex);
358 : ScAutoFormatData* pNewData
359 0 : = new ScAutoFormatData(*p);
360 :
361 0 : it = pFormat->begin();
362 0 : std::advance(it, nIndex);
363 0 : pFormat->erase(it);
364 :
365 0 : pNewData->SetName( aFormatName );
366 :
367 0 : pFormat->insert(pNewData);
368 :
369 0 : m_pLbFormat->SetUpdateMode(false);
370 0 : m_pLbFormat->Clear();
371 0 : for (it = pFormat->begin(); it != itEnd; ++it)
372 : {
373 0 : aEntry = it->second->GetName();
374 0 : m_pLbFormat->InsertEntry( aEntry );
375 : }
376 :
377 0 : m_pLbFormat->SetUpdateMode(true);
378 0 : m_pLbFormat->SelectEntry( aFormatName);
379 :
380 0 : if ( !bCoreDataChanged )
381 : {
382 0 : m_pBtnCancel->SetText( aStrClose );
383 0 : bCoreDataChanged = true;
384 : }
385 :
386 0 : SelFmtHdl( 0 );
387 0 : bOk = true;
388 0 : bFmtRenamed = true;
389 : }
390 : }
391 0 : if( !bFmtRenamed )
392 : {
393 : bOk = RET_CANCEL == ScopedVclPtr<MessageDialog>::Create( this,
394 0 : ScGlobal::GetRscString(STR_INVALID_AFNAME),
395 : VCL_MESSAGE_ERROR,
396 : VCL_BUTTONS_OK_CANCEL
397 0 : )->Execute();
398 : }
399 : }
400 : else
401 0 : bOk = true;
402 0 : }
403 :
404 0 : return 0;
405 : }
406 :
407 0 : IMPL_LINK_NOARG(ScAutoFormatDlg, SelFmtHdl)
408 : {
409 0 : nIndex = m_pLbFormat->GetSelectEntryPos();
410 0 : UpdateChecks();
411 :
412 0 : if ( nIndex == 0 )
413 : {
414 0 : m_pBtnRename->Disable();
415 0 : m_pBtnRemove->Disable();
416 : }
417 : else
418 : {
419 0 : m_pBtnRename->Enable();
420 0 : m_pBtnRemove->Enable();
421 : }
422 :
423 0 : ScAutoFormatData* p = pFormat->findByIndex(nIndex);
424 0 : m_pWndPreview->NotifyChange(p);
425 :
426 0 : return 0;
427 : }
428 :
429 0 : OUString ScAutoFormatDlg::GetCurrFormatName()
430 : {
431 0 : const ScAutoFormatData* p = pFormat->findByIndex(nIndex);
432 0 : return p ? p->GetName() : OUString();
433 0 : }
434 :
435 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|