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