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 #include <unotools/localedatawrapper.hxx>
21 
22 #include <chgtrack.hxx>
23 #include <redcom.hxx>
24 #include <docsh.hxx>
25 #include <dbfunc.hxx>
26 #include <tabview.hxx>
27 #include <viewutil.hxx>
28 #include <svx/svxdlg.hxx>
29 
ScRedComDialog(weld::Window * pParent,const SfxItemSet & rCoreSet,ScDocShell * pShell,ScChangeAction * pAction,bool bPrevNext)30 ScRedComDialog::ScRedComDialog( weld::Window* pParent, const SfxItemSet& rCoreSet,
31                     ScDocShell *pShell, ScChangeAction *pAction, bool bPrevNext)
32     : pChangeAction(nullptr)
33     , pDocShell(nullptr)
34     , pDlg(nullptr)
35 {
36     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
37     pDlg = pFact->CreateSvxPostItDialog( pParent, rCoreSet, bPrevNext );
38     pDocShell=pShell;
39     pDlg->DontChangeAuthor();
40     pDlg->HideAuthor();
41 
42     pDlg->SetPrevHdl(LINK( this, ScRedComDialog, PrevHdl));
43     pDlg->SetNextHdl(LINK( this, ScRedComDialog, NextHdl));
44 
45     ReInit(pAction);
46 }
47 
~ScRedComDialog()48 ScRedComDialog::~ScRedComDialog()
49 {
50     pDlg.disposeAndClear();
51 }
52 
FindPrev(ScChangeAction * pAction)53 ScChangeAction *ScRedComDialog::FindPrev(ScChangeAction *pAction)
54 {
55     if(pAction!=nullptr && pDocShell !=nullptr)
56     {
57         ScDocument& rDoc = pDocShell->GetDocument();
58         ScChangeViewSettings* pSettings = rDoc.GetChangeViewSettings();
59 
60         pAction=pAction->GetPrev();
61 
62         while(pAction!=nullptr)
63         {
64             if( pAction->GetState()==SC_CAS_VIRGIN &&
65                 pAction->IsDialogRoot() &&
66                 ScViewUtil::IsActionShown(*pAction,*pSettings,rDoc)) break;
67 
68             pAction=pAction->GetPrev();
69         }
70     }
71     return pAction;
72 }
73 
FindNext(ScChangeAction * pAction)74 ScChangeAction *ScRedComDialog::FindNext(ScChangeAction *pAction)
75 {
76     if(pAction!=nullptr && pDocShell !=nullptr)
77     {
78         ScDocument& rDoc = pDocShell->GetDocument();
79         ScChangeViewSettings* pSettings = rDoc.GetChangeViewSettings();
80 
81         pAction=pAction->GetNext();
82 
83         while(pAction!=nullptr)
84         {
85             if( pAction->GetState()==SC_CAS_VIRGIN &&
86                 pAction->IsDialogRoot() &&
87                 ScViewUtil::IsActionShown(*pAction,*pSettings,rDoc)) break;
88 
89             pAction=pAction->GetNext();
90         }
91     }
92     return pAction;
93 }
94 
ReInit(ScChangeAction * pAction)95 void ScRedComDialog::ReInit(ScChangeAction *pAction)
96 {
97     pChangeAction=pAction;
98     if(pChangeAction!=nullptr && pDocShell !=nullptr)
99     {
100         OUString aTitle;
101         pChangeAction->GetDescription( aTitle, &pDocShell->GetDocument());
102         pDlg->SetText(aTitle);
103         aComment=pChangeAction->GetComment();
104 
105         bool bNext=FindNext(pChangeAction)!=nullptr;
106         bool bPrev=FindPrev(pChangeAction)!=nullptr;
107         pDlg->EnableTravel(bNext,bPrev);
108 
109         OUString aAuthor = pChangeAction->GetUser();
110 
111         DateTime aDT = pChangeAction->GetDateTime();
112         OUString aDate = ScGlobal::pLocaleData->getDate( aDT ) + " " +
113             ScGlobal::pLocaleData->getTime( aDT, false );
114 
115         pDlg->ShowLastAuthor(aAuthor, aDate);
116         pDlg->SetNote(aComment);
117     }
118 }
119 
Execute()120 void ScRedComDialog::Execute()
121 {
122     short nRet=pDlg->Execute();
123 
124     if(nRet== RET_OK )
125     {
126         if ( pDocShell!=nullptr && pDlg->GetNote() != aComment )
127             pDocShell->SetChangeComment( pChangeAction, pDlg->GetNote());
128     }
129 }
130 
SelectCell()131 void ScRedComDialog::SelectCell()
132 {
133     if(pChangeAction!=nullptr)
134     {
135         const ScChangeAction* pAction=pChangeAction;
136         const ScBigRange& rRange = pAction->GetBigRange();
137 
138         if(rRange.IsValid(&pDocShell->GetDocument()))
139         {
140             ScViewData* pViewData=ScDocShell::GetViewData();
141             ScRange aRef=rRange.MakeRange();
142             ScTabView* pTabView=pViewData->GetView();
143             pTabView->MarkRange(aRef);
144         }
145     }
146 }
147 
IMPL_LINK(ScRedComDialog,PrevHdl,AbstractSvxPostItDialog &,rDlgP,void)148 IMPL_LINK(ScRedComDialog, PrevHdl, AbstractSvxPostItDialog&, rDlgP, void )
149 {
150     if (pDocShell!=nullptr && rDlgP.GetNote() != aComment )
151         pDocShell->SetChangeComment( pChangeAction, rDlgP.GetNote());
152 
153     ReInit(FindPrev(pChangeAction));
154     SelectCell();
155 }
156 
IMPL_LINK(ScRedComDialog,NextHdl,AbstractSvxPostItDialog &,rDlgP,void)157 IMPL_LINK(ScRedComDialog, NextHdl, AbstractSvxPostItDialog&, rDlgP, void )
158 {
159     if ( pDocShell!=nullptr && rDlgP.GetNote() != aComment )
160         pDocShell->SetChangeComment( pChangeAction, rDlgP.GetNote());
161 
162     ReInit(FindNext(pChangeAction));
163     SelectCell();
164 }
165 
166 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
167