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