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 <inscodlg.hxx>
23
24 bool ScInsertContentsDlg::bPreviousAllCheck = false;
25 InsertDeleteFlags ScInsertContentsDlg::nPreviousChecks = InsertDeleteFlags::VALUE | InsertDeleteFlags::DATETIME | InsertDeleteFlags::STRING;
26 ScPasteFunc ScInsertContentsDlg::nPreviousFormulaChecks = ScPasteFunc::NONE;
27 InsertContentsFlags ScInsertContentsDlg::nPreviousChecks2 = InsertContentsFlags::NONE;
28 sal_uInt16 ScInsertContentsDlg::nPreviousMoveMode = INS_NONE; // enum InsCellCmd
29
ScInsertContentsDlg(weld::Window * pParent,const OUString * pStrTitle)30 ScInsertContentsDlg::ScInsertContentsDlg(weld::Window* pParent,
31 const OUString* pStrTitle )
32 : GenericDialogController(pParent, "modules/scalc/ui/pastespecial.ui", "PasteSpecial")
33 , bOtherDoc(false)
34 , bFillMode(false)
35 , bChangeTrack(false)
36 , bMoveDownDisabled(false)
37 , bMoveRightDisabled(false)
38 , bUsedShortCut(false)
39 , nShortCutInsContentsCmdBits(InsertDeleteFlags::NONE )
40 , bShortCutTranspose(false)
41 , mxBtnInsAll(m_xBuilder->weld_check_button("paste_all"))
42 , mxBtnInsStrings(m_xBuilder->weld_check_button("text"))
43 , mxBtnInsNumbers(m_xBuilder->weld_check_button("numbers"))
44 , mxBtnInsDateTime(m_xBuilder->weld_check_button("datetime"))
45 , mxBtnInsFormulas(m_xBuilder->weld_check_button("formulas"))
46 , mxBtnInsNotes(m_xBuilder->weld_check_button("comments"))
47 , mxBtnInsAttrs(m_xBuilder->weld_check_button("formats"))
48 , mxBtnInsObjects(m_xBuilder->weld_check_button("objects"))
49 , mxBtnSkipEmptyCells(m_xBuilder->weld_check_button("skip_empty"))
50 , mxBtnTranspose(m_xBuilder->weld_check_button("transpose"))
51 , mxBtnLink(m_xBuilder->weld_check_button("link"))
52 , mxRbNoOp(m_xBuilder->weld_radio_button("none"))
53 , mxRbAdd(m_xBuilder->weld_radio_button("add"))
54 , mxRbSub(m_xBuilder->weld_radio_button("subtract"))
55 , mxRbMul(m_xBuilder->weld_radio_button("multiply"))
56 , mxRbDiv(m_xBuilder->weld_radio_button("divide"))
57 , mxRbMoveNone(m_xBuilder->weld_radio_button("no_shift"))
58 , mxRbMoveDown(m_xBuilder->weld_radio_button("move_down"))
59 , mxRbMoveRight(m_xBuilder->weld_radio_button("move_right"))
60 , mxBtnShortCutPasteValuesOnly(m_xBuilder->weld_button("paste_values_only"))
61 , mxBtnShortCutPasteValuesFormats(m_xBuilder->weld_button("paste_values_formats"))
62 , mxBtnShortCutPasteTranspose(m_xBuilder->weld_button("paste_transpose"))
63 {
64 if (pStrTitle)
65 m_xDialog->set_title(*pStrTitle);
66
67 mxBtnInsAll->set_active( ScInsertContentsDlg::bPreviousAllCheck );
68 mxBtnInsStrings->set_active( bool(InsertDeleteFlags::STRING & ScInsertContentsDlg::nPreviousChecks) );
69 mxBtnInsNumbers->set_active( bool(InsertDeleteFlags::VALUE & ScInsertContentsDlg::nPreviousChecks) );
70 mxBtnInsDateTime->set_active( bool(InsertDeleteFlags::DATETIME & ScInsertContentsDlg::nPreviousChecks) );
71 mxBtnInsFormulas->set_active( bool(InsertDeleteFlags::FORMULA & ScInsertContentsDlg::nPreviousChecks) );
72 mxBtnInsNotes->set_active( bool(InsertDeleteFlags::NOTE & ScInsertContentsDlg::nPreviousChecks) );
73 mxBtnInsAttrs->set_active( (InsertDeleteFlags::ATTRIB & ScInsertContentsDlg::nPreviousChecks) == InsertDeleteFlags::ATTRIB );
74 mxBtnInsObjects->set_active ( bool(InsertDeleteFlags::OBJECTS & ScInsertContentsDlg::nPreviousChecks) );
75
76 switch( ScInsertContentsDlg::nPreviousFormulaChecks )
77 {
78 case ScPasteFunc::NONE: mxRbNoOp->set_active(true); break;
79 case ScPasteFunc::ADD: mxRbAdd->set_active(true); break;
80 case ScPasteFunc::SUB: mxRbSub->set_active(true); break;
81 case ScPasteFunc::MUL: mxRbMul->set_active(true); break;
82 case ScPasteFunc::DIV: mxRbDiv->set_active(true); break;
83 }
84
85 switch( ScInsertContentsDlg::nPreviousMoveMode )
86 {
87 case INS_NONE: mxRbMoveNone->set_active(true); break;
88 case INS_CELLSDOWN: mxRbMoveDown->set_active(true); break;
89 case INS_CELLSRIGHT: mxRbMoveRight->set_active(true); break;
90 }
91
92 mxBtnSkipEmptyCells->set_active( bool( ScInsertContentsDlg::nPreviousChecks2 & InsertContentsFlags::NoEmpty ));
93 mxBtnTranspose->set_active( bool( ScInsertContentsDlg::nPreviousChecks2 & InsertContentsFlags::Trans ));
94 mxBtnLink->set_active( bool( ScInsertContentsDlg::nPreviousChecks2 & InsertContentsFlags::Link ));
95
96 DisableChecks( mxBtnInsAll->get_active() );
97
98 mxBtnInsAll->connect_toggled( LINK( this, ScInsertContentsDlg, InsAllHdl ) );
99 mxBtnLink->connect_toggled( LINK( this, ScInsertContentsDlg, LinkBtnHdl ) );
100
101 mxBtnShortCutPasteValuesOnly->connect_clicked( LINK( this, ScInsertContentsDlg, ShortCutHdl ) );
102 mxBtnShortCutPasteValuesFormats->connect_clicked( LINK( this, ScInsertContentsDlg, ShortCutHdl ) );
103 mxBtnShortCutPasteTranspose->connect_clicked( LINK( this, ScInsertContentsDlg, ShortCutHdl ) );
104 }
105
GetInsContentsCmdBits() const106 InsertDeleteFlags ScInsertContentsDlg::GetInsContentsCmdBits() const
107 {
108 ScInsertContentsDlg::nPreviousChecks = InsertDeleteFlags::NONE;
109
110 if ( mxBtnInsStrings->get_active() )
111 ScInsertContentsDlg::nPreviousChecks = InsertDeleteFlags::STRING;
112 if ( mxBtnInsNumbers->get_active() )
113 ScInsertContentsDlg::nPreviousChecks |= InsertDeleteFlags::VALUE;
114 if ( mxBtnInsDateTime->get_active())
115 ScInsertContentsDlg::nPreviousChecks |= InsertDeleteFlags::DATETIME;
116 if ( mxBtnInsFormulas->get_active())
117 ScInsertContentsDlg::nPreviousChecks |= InsertDeleteFlags::FORMULA;
118 if ( mxBtnInsNotes->get_active() )
119 ScInsertContentsDlg::nPreviousChecks |= InsertDeleteFlags::NOTE;
120 if ( mxBtnInsAttrs->get_active() )
121 ScInsertContentsDlg::nPreviousChecks |= InsertDeleteFlags::ATTRIB;
122 if ( mxBtnInsObjects->get_active() )
123 ScInsertContentsDlg::nPreviousChecks |= InsertDeleteFlags::OBJECTS;
124
125 ScInsertContentsDlg::bPreviousAllCheck = mxBtnInsAll->get_active();
126
127 if (bUsedShortCut)
128 return nShortCutInsContentsCmdBits;
129
130 return ( ScInsertContentsDlg::bPreviousAllCheck
131 ? InsertDeleteFlags::ALL
132 : ScInsertContentsDlg::nPreviousChecks );
133 }
134
GetMoveMode() const135 InsCellCmd ScInsertContentsDlg::GetMoveMode() const
136 {
137 if (bUsedShortCut)
138 return INS_NONE;
139 if ( mxRbMoveDown->get_active() )
140 return INS_CELLSDOWN;
141 if ( mxRbMoveRight->get_active() )
142 return INS_CELLSRIGHT;
143
144 return INS_NONE;
145 }
146
IsSkipEmptyCells() const147 bool ScInsertContentsDlg::IsSkipEmptyCells() const
148 {
149 if (bUsedShortCut)
150 return false;
151 return mxBtnSkipEmptyCells->get_active();
152 }
153
IsTranspose() const154 bool ScInsertContentsDlg::IsTranspose() const
155 {
156 if (bUsedShortCut)
157 return bShortCutTranspose;
158 return mxBtnTranspose->get_active();
159 }
160
IsLink() const161 bool ScInsertContentsDlg::IsLink() const
162 {
163 if (bUsedShortCut)
164 return false;
165 return mxBtnLink->get_active();
166 }
167
DisableChecks(bool bInsAllChecked)168 void ScInsertContentsDlg::DisableChecks( bool bInsAllChecked )
169 {
170 if ( bInsAllChecked )
171 {
172 mxBtnInsStrings->set_sensitive(false);
173 mxBtnInsNumbers->set_sensitive(false);
174 mxBtnInsDateTime->set_sensitive(false);
175 mxBtnInsFormulas->set_sensitive(false);
176 mxBtnInsNotes->set_sensitive(false);
177 mxBtnInsAttrs->set_sensitive(false);
178 mxBtnInsObjects->set_sensitive(false);
179 }
180 else
181 {
182 mxBtnInsStrings->set_sensitive(true);
183 mxBtnInsNumbers->set_sensitive(true);
184 mxBtnInsDateTime->set_sensitive(true);
185 mxBtnInsFormulas->set_sensitive(true);
186 mxBtnInsNotes->set_sensitive(true);
187 mxBtnInsAttrs->set_sensitive(true);
188
189 // "Objects" is disabled for "Fill Tables"
190 if ( bFillMode )
191 mxBtnInsObjects->set_sensitive(false);
192 else
193 mxBtnInsObjects->set_sensitive(true);
194 }
195 }
196
197 // Link to other document -> everything else is disabled
198
TestModes()199 void ScInsertContentsDlg::TestModes()
200 {
201 if ( bOtherDoc && mxBtnLink->get_active() )
202 {
203 mxBtnSkipEmptyCells->set_sensitive(false);
204 mxBtnTranspose->set_sensitive(false);
205 mxRbNoOp->set_sensitive(false);
206 mxRbAdd->set_sensitive(false);
207 mxRbSub->set_sensitive(false);
208 mxRbMul->set_sensitive(false);
209 mxRbDiv->set_sensitive(false);
210
211 mxRbMoveNone->set_sensitive(false);
212 mxRbMoveDown->set_sensitive(false);
213 mxRbMoveRight->set_sensitive(false);
214
215 mxBtnInsAll->set_sensitive(false);
216 DisableChecks(true);
217 }
218 else
219 {
220 mxBtnSkipEmptyCells->set_sensitive(true);
221 mxBtnTranspose->set_sensitive(!bFillMode);
222 mxRbNoOp->set_sensitive(true);
223 mxRbAdd->set_sensitive(true);
224 mxRbSub->set_sensitive(true);
225 mxRbMul->set_sensitive(true);
226 mxRbDiv->set_sensitive(true);
227
228 mxRbMoveNone->set_sensitive(!bFillMode && !bChangeTrack && !(bMoveDownDisabled && bMoveRightDisabled));
229 mxRbMoveDown->set_sensitive(!bFillMode && !bChangeTrack && !bMoveDownDisabled);
230 mxRbMoveRight->set_sensitive(!bFillMode && !bChangeTrack && !bMoveRightDisabled);
231
232 mxBtnInsAll->set_sensitive(true);
233 DisableChecks( mxBtnInsAll->get_active() );
234 }
235 }
236
SetOtherDoc(bool bSet)237 void ScInsertContentsDlg::SetOtherDoc( bool bSet )
238 {
239 if ( bSet != bOtherDoc )
240 {
241 bOtherDoc = bSet;
242 TestModes();
243 if ( bSet )
244 mxRbMoveNone->set_active(true);
245 }
246 }
247
SetFillMode(bool bSet)248 void ScInsertContentsDlg::SetFillMode( bool bSet )
249 {
250 if ( bSet != bFillMode )
251 {
252 bFillMode = bSet;
253 TestModes();
254 if ( bSet )
255 mxRbMoveNone->set_active(true);
256 }
257 }
258
SetChangeTrack(bool bSet)259 void ScInsertContentsDlg::SetChangeTrack( bool bSet )
260 {
261 if ( bSet != bChangeTrack )
262 {
263 bChangeTrack = bSet;
264 TestModes();
265 if ( bSet )
266 mxRbMoveNone->set_active(true);
267 }
268 }
269
SetCellShiftDisabled(CellShiftDisabledFlags nDisable)270 void ScInsertContentsDlg::SetCellShiftDisabled( CellShiftDisabledFlags nDisable )
271 {
272 bool bDown(nDisable & CellShiftDisabledFlags::Down);
273 bool bRight(nDisable & CellShiftDisabledFlags::Right);
274 if ( bDown != bMoveDownDisabled || bRight != bMoveRightDisabled )
275 {
276 bMoveDownDisabled = bDown;
277 bMoveRightDisabled = bRight;
278 TestModes();
279 if ( bMoveDownDisabled && mxRbMoveDown->get_active() )
280 mxRbMoveNone->set_active(true);
281 if ( bMoveRightDisabled && mxRbMoveRight->get_active() )
282 mxRbMoveNone->set_active(true);
283 }
284 }
285
IMPL_LINK(ScInsertContentsDlg,ShortCutHdl,weld::Button &,rBtn,void)286 IMPL_LINK(ScInsertContentsDlg, ShortCutHdl, weld::Button&, rBtn, void)
287 {
288 if (&rBtn == mxBtnShortCutPasteValuesOnly.get())
289 {
290 bUsedShortCut = true;
291 nShortCutInsContentsCmdBits = InsertDeleteFlags::STRING | InsertDeleteFlags::VALUE | InsertDeleteFlags::DATETIME;
292 bShortCutTranspose = false;
293 m_xDialog->response(RET_OK);
294 }
295 else if (&rBtn == mxBtnShortCutPasteValuesFormats.get())
296 {
297 bUsedShortCut = true;
298 nShortCutInsContentsCmdBits = InsertDeleteFlags::STRING | InsertDeleteFlags::VALUE | InsertDeleteFlags::DATETIME | InsertDeleteFlags::ATTRIB;
299 bShortCutTranspose = false;
300 m_xDialog->response(RET_OK);
301 }
302 else if (&rBtn == mxBtnShortCutPasteTranspose.get())
303 {
304 bUsedShortCut = true;
305 nShortCutInsContentsCmdBits = InsertDeleteFlags::ALL;
306 bShortCutTranspose = true;
307 m_xDialog->response(RET_OK);
308 }
309 }
310
IMPL_LINK_NOARG(ScInsertContentsDlg,InsAllHdl,weld::ToggleButton &,void)311 IMPL_LINK_NOARG(ScInsertContentsDlg, InsAllHdl, weld::ToggleButton&, void)
312 {
313 DisableChecks( mxBtnInsAll->get_active() );
314 }
315
IMPL_LINK_NOARG(ScInsertContentsDlg,LinkBtnHdl,weld::ToggleButton &,void)316 IMPL_LINK_NOARG(ScInsertContentsDlg, LinkBtnHdl, weld::ToggleButton&, void)
317 {
318 TestModes();
319 }
320
~ScInsertContentsDlg()321 ScInsertContentsDlg::~ScInsertContentsDlg()
322 {
323 ScInsertContentsDlg::nPreviousChecks2 = InsertContentsFlags::NONE;
324 if(mxBtnSkipEmptyCells->get_active())
325 ScInsertContentsDlg::nPreviousChecks2 |= InsertContentsFlags::NoEmpty;
326 if( mxBtnTranspose->get_active())
327 ScInsertContentsDlg::nPreviousChecks2 |= InsertContentsFlags::Trans;
328 if( mxBtnLink->get_active() )
329 ScInsertContentsDlg::nPreviousChecks2 |= InsertContentsFlags::Link;
330
331 if (!bFillMode) // in FillMode, None is checked and all three options are disabled
332 {
333 if ( mxRbMoveNone->get_active() )
334 ScInsertContentsDlg::nPreviousMoveMode = INS_NONE;
335 else if ( mxRbMoveDown->get_active() )
336 ScInsertContentsDlg::nPreviousMoveMode = INS_CELLSDOWN;
337 else if ( mxRbMoveRight->get_active() )
338 ScInsertContentsDlg::nPreviousMoveMode = INS_CELLSRIGHT;
339 }
340 }
341
GetFormulaCmdBits() const342 ScPasteFunc ScInsertContentsDlg::GetFormulaCmdBits() const
343 {
344 ScInsertContentsDlg::nPreviousFormulaChecks = ScPasteFunc::NONE;
345 if(mxRbAdd->get_active())
346 ScInsertContentsDlg::nPreviousFormulaChecks = ScPasteFunc::ADD;
347 else if(mxRbSub->get_active())
348 ScInsertContentsDlg::nPreviousFormulaChecks = ScPasteFunc::SUB;
349 else if(mxRbMul->get_active())
350 ScInsertContentsDlg::nPreviousFormulaChecks = ScPasteFunc::MUL;
351 else if(mxRbDiv->get_active())
352 ScInsertContentsDlg::nPreviousFormulaChecks = ScPasteFunc::DIV;
353 if (bUsedShortCut)
354 return ScPasteFunc::NONE;
355 return ScInsertContentsDlg::nPreviousFormulaChecks;
356 }
357
358 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
359