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 <vcl/msgbox.hxx>
23 :
24 : #include "mvtabdlg.hxx"
25 : #include "document.hxx"
26 : #include "docsh.hxx"
27 : #include "miscdlgs.hrc"
28 : #include "global.hxx"
29 : #include "scresid.hxx"
30 : #include "globstr.hrc"
31 :
32 0 : ScMoveTableDlg::ScMoveTableDlg(vcl::Window* pParent, const OUString& rDefault)
33 :
34 : : ModalDialog ( pParent, "MoveCopySheetDialog", "modules/scalc/ui/movecopysheet.ui" ),
35 : maDefaultName( rDefault ),
36 : mnCurrentDocPos( 0 ),
37 : nDocument ( 0 ),
38 : nTable ( 0 ),
39 : bCopyTable ( false ),
40 : bRenameTable( false ),
41 0 : mbEverEdited( false )
42 : {
43 0 : get(pBtnMove, "move");
44 0 : get(pBtnCopy, "copy");
45 0 : get(pLbDoc, "toDocument");
46 :
47 : assert(pLbDoc->GetEntryCount() == 2);
48 0 : msCurrentDoc = pLbDoc->GetEntry(0);
49 0 : msNewDoc = pLbDoc->GetEntry(1);
50 0 : pLbDoc->Clear();
51 : assert(pLbDoc->GetEntryCount() == 0);
52 :
53 0 : get(pLbTable, "insertBefore");
54 0 : pLbTable->set_height_request(pLbTable->GetTextHeight() * 8);
55 0 : get(pEdTabName, "newName");
56 0 : get(pFtWarn, "newNameWarn");
57 0 : get(pBtnOk, "ok");
58 :
59 0 : msStrTabNameUsed = get<FixedText>("warnunused")->GetText();
60 0 : msStrTabNameEmpty = get<FixedText>("warnempty")->GetText();
61 0 : msStrTabNameInvalid = get<FixedText>("warninvalid")->GetText();
62 :
63 0 : Init();
64 0 : }
65 :
66 0 : ScMoveTableDlg::~ScMoveTableDlg()
67 : {
68 0 : disposeOnce();
69 0 : }
70 :
71 0 : void ScMoveTableDlg::dispose()
72 : {
73 0 : pBtnMove.clear();
74 0 : pBtnCopy.clear();
75 0 : pLbDoc.clear();
76 0 : pLbTable.clear();
77 0 : pEdTabName.clear();
78 0 : pFtWarn.clear();
79 0 : pBtnOk.clear();
80 0 : ModalDialog::dispose();
81 0 : }
82 :
83 0 : void ScMoveTableDlg::GetTabNameString( OUString& rString ) const
84 : {
85 0 : rString = pEdTabName->GetText();
86 0 : }
87 :
88 0 : void ScMoveTableDlg::SetForceCopyTable()
89 : {
90 0 : pBtnCopy->Check(true);
91 0 : pBtnMove->Disable();
92 0 : pBtnCopy->Disable();
93 0 : }
94 :
95 0 : void ScMoveTableDlg::EnableCopyTable(bool bFlag)
96 : {
97 0 : if(bFlag)
98 0 : pBtnCopy->Enable();
99 : else
100 0 : pBtnCopy->Disable();
101 0 : }
102 :
103 0 : void ScMoveTableDlg::EnableRenameTable(bool bFlag)
104 : {
105 0 : bRenameTable = bFlag;
106 0 : pEdTabName->Enable(bFlag);
107 0 : ResetRenameInput();
108 0 : }
109 :
110 0 : void ScMoveTableDlg::ResetRenameInput()
111 : {
112 0 : if (mbEverEdited)
113 : {
114 : // Don't reset the name when the sheet name has ever been edited.
115 : // But check the name, as this is also called for change of copy/move
116 : // buttons and document listbox selection.
117 0 : CheckNewTabName();
118 0 : return;
119 : }
120 :
121 0 : if (!pEdTabName->IsEnabled())
122 : {
123 0 : pEdTabName->SetText(OUString());
124 0 : return;
125 : }
126 :
127 0 : bool bVal = pBtnCopy->IsChecked();
128 0 : if (bVal)
129 : {
130 : // copy
131 0 : ScDocument* pDoc = GetSelectedDoc();
132 0 : if (pDoc)
133 : {
134 0 : OUString aStr = maDefaultName;
135 0 : pDoc->CreateValidTabName(aStr);
136 0 : pEdTabName->SetText(aStr);
137 : }
138 : else
139 0 : pEdTabName->SetText(maDefaultName);
140 : }
141 : else
142 : // move
143 0 : pEdTabName->SetText(maDefaultName);
144 :
145 0 : CheckNewTabName();
146 : }
147 :
148 0 : void ScMoveTableDlg::CheckNewTabName()
149 : {
150 0 : const OUString aNewName = pEdTabName->GetText();
151 0 : if (aNewName.isEmpty())
152 : {
153 : // New sheet name is empty. This is not good.
154 0 : pFtWarn->Show(true);
155 0 : pFtWarn->SetControlBackground(Color(COL_YELLOW));
156 0 : pFtWarn->SetText(msStrTabNameEmpty);
157 0 : pBtnOk->Disable();
158 0 : return;
159 : }
160 :
161 0 : if (!ScDocument::ValidTabName(aNewName))
162 : {
163 : // New sheet name contains invalid characters.
164 0 : pFtWarn->Show(true);
165 0 : pFtWarn->SetControlBackground(Color(COL_YELLOW));
166 0 : pFtWarn->SetText(msStrTabNameInvalid);
167 0 : pBtnOk->Disable();
168 0 : return;
169 : }
170 :
171 0 : bool bMoveInCurrentDoc = (pBtnMove->IsChecked() && IsCurrentDocSelected());
172 0 : bool bFound = false;
173 0 : sal_uInt16 nLast = pLbTable->GetEntryCount() - 1;
174 0 : for ( sal_uInt16 i=0; i<=nLast && !bFound; ++i )
175 : {
176 0 : if ( aNewName.equals(pLbTable->GetEntry(i)) )
177 : {
178 : // Only for move within same document the same name is allowed.
179 0 : if (!bMoveInCurrentDoc || !maDefaultName.equals( pEdTabName->GetText()))
180 0 : bFound = true;
181 : }
182 : }
183 :
184 0 : if ( bFound )
185 : {
186 0 : pFtWarn->Show(true);
187 0 : pFtWarn->SetControlBackground(Color(COL_YELLOW));
188 0 : pFtWarn->SetText(msStrTabNameUsed);
189 0 : pBtnOk->Disable();
190 : }
191 : else
192 : {
193 0 : pFtWarn->Hide();
194 0 : pFtWarn->SetControlBackground();
195 0 : pFtWarn->SetText(OUString());
196 0 : pBtnOk->Enable();
197 0 : }
198 : }
199 :
200 0 : ScDocument* ScMoveTableDlg::GetSelectedDoc()
201 : {
202 0 : sal_Int32 nPos = pLbDoc->GetSelectEntryPos();
203 0 : return static_cast<ScDocument*>(pLbDoc->GetEntryData(nPos));
204 : }
205 :
206 0 : bool ScMoveTableDlg::IsCurrentDocSelected() const
207 : {
208 0 : return pLbDoc->GetSelectEntryPos() == mnCurrentDocPos;
209 : }
210 :
211 0 : void ScMoveTableDlg::Init()
212 : {
213 0 : pBtnOk->SetClickHdl ( LINK( this, ScMoveTableDlg, OkHdl ) );
214 0 : pLbDoc->SetSelectHdl ( LINK( this, ScMoveTableDlg, SelHdl ) );
215 0 : pBtnCopy->SetToggleHdl( LINK( this, ScMoveTableDlg, CheckBtnHdl ) );
216 0 : pEdTabName->SetModifyHdl( LINK( this, ScMoveTableDlg, CheckNameHdl ) );
217 0 : pBtnMove->Check( true );
218 0 : pBtnCopy->Check( false );
219 0 : pEdTabName->Enable(false);
220 0 : pFtWarn->Hide();
221 0 : InitDocListBox();
222 0 : SelHdl( pLbDoc );
223 0 : }
224 :
225 0 : void ScMoveTableDlg::InitDocListBox()
226 : {
227 0 : SfxObjectShell* pSh = SfxObjectShell::GetFirst();
228 0 : ScDocShell* pScSh = NULL;
229 0 : sal_uInt16 nSelPos = 0;
230 0 : sal_uInt16 i = 0;
231 0 : OUString aEntryName;
232 :
233 0 : pLbDoc->Clear();
234 0 : pLbDoc->SetUpdateMode( false );
235 :
236 0 : while ( pSh )
237 : {
238 0 : pScSh = PTR_CAST( ScDocShell, pSh );
239 :
240 0 : if ( pScSh )
241 : {
242 0 : aEntryName = pScSh->GetTitle();
243 :
244 0 : if ( pScSh == SfxObjectShell::Current() )
245 : {
246 0 : mnCurrentDocPos = nSelPos = i;
247 0 : aEntryName += " ";
248 0 : aEntryName += msCurrentDoc;
249 : }
250 :
251 0 : pLbDoc->InsertEntry( aEntryName, i );
252 0 : pLbDoc->SetEntryData( i, static_cast<void*>(&pScSh->GetDocument()) );
253 :
254 0 : i++;
255 : }
256 0 : pSh = SfxObjectShell::GetNext( *pSh );
257 : }
258 :
259 0 : pLbDoc->SetUpdateMode( true );
260 0 : pLbDoc->InsertEntry(msNewDoc);
261 0 : pLbDoc->SelectEntryPos( nSelPos );
262 0 : }
263 :
264 : // Handler:
265 :
266 0 : IMPL_LINK( ScMoveTableDlg, CheckBtnHdl, void *, pBtn )
267 : {
268 0 : if (pBtn == pBtnCopy)
269 0 : ResetRenameInput();
270 :
271 0 : return 0;
272 : }
273 :
274 0 : IMPL_LINK_NOARG(ScMoveTableDlg, OkHdl)
275 : {
276 0 : sal_uInt16 nDocSel = pLbDoc->GetSelectEntryPos();
277 0 : sal_uInt16 nDocLast = pLbDoc->GetEntryCount()-1;
278 0 : sal_uInt16 nTabSel = pLbTable->GetSelectEntryPos();
279 0 : sal_uInt16 nTabLast = pLbTable->GetEntryCount()-1;
280 :
281 0 : nDocument = (nDocSel != nDocLast) ? nDocSel : SC_DOC_NEW;
282 0 : nTable = (nTabSel != nTabLast) ? static_cast<SCTAB>(nTabSel) : SC_TAB_APPEND;
283 0 : bCopyTable = pBtnCopy->IsChecked();
284 :
285 0 : if (bCopyTable)
286 : {
287 : // Return an empty string when the new name is the same as the
288 : // automatic name assigned by the document.
289 0 : OUString aCopyName = maDefaultName;
290 0 : ScDocument* pDoc = GetSelectedDoc();
291 0 : if (pDoc)
292 0 : pDoc->CreateValidTabName(aCopyName);
293 0 : if (aCopyName == pEdTabName->GetText())
294 0 : pEdTabName->SetText( OUString() );
295 : }
296 : else
297 : {
298 : // Return an empty string, when the new name is the same as the
299 : // original name.
300 0 : if (maDefaultName.equals(pEdTabName->GetText()))
301 0 : pEdTabName->SetText(OUString());
302 : }
303 :
304 0 : EndDialog( RET_OK );
305 :
306 0 : return 0;
307 : }
308 :
309 0 : IMPL_LINK( ScMoveTableDlg, SelHdl, ListBox *, pLb )
310 : {
311 0 : if ( pLb == pLbDoc )
312 : {
313 0 : ScDocument* pDoc = GetSelectedDoc();
314 0 : OUString aName;
315 :
316 0 : pLbTable->Clear();
317 0 : pLbTable->SetUpdateMode( false );
318 0 : if ( pDoc )
319 : {
320 0 : SCTAB nLast = pDoc->GetTableCount()-1;
321 0 : for ( SCTAB i=0; i<=nLast; i++ )
322 : {
323 0 : pDoc->GetName( i, aName );
324 0 : pLbTable->InsertEntry( aName, static_cast<sal_uInt16>(i) );
325 : }
326 : }
327 0 : pLbTable->InsertEntry( ScGlobal::GetRscString(STR_MOVE_TO_END) );
328 0 : pLbTable->SetUpdateMode( true );
329 0 : pLbTable->SelectEntryPos( 0 );
330 0 : ResetRenameInput();
331 : }
332 :
333 0 : return 0;
334 : }
335 :
336 0 : IMPL_LINK( ScMoveTableDlg, CheckNameHdl, Edit *, pEdt )
337 : {
338 0 : if ( pEdt == pEdTabName )
339 : {
340 0 : mbEverEdited = true;
341 0 : CheckNewTabName();
342 : }
343 :
344 0 : return 0;
345 0 : }
346 :
347 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|