KiCad PCB EDA Suite
Loading...
Searching...
No Matches
merge_dispatch.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 3
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/gpl-3.0.html
19 * or you may search the http://www.gnu.org website for the version 3 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
25
26#include <cli/exit_codes.h>
27#include <kiface_base.h>
28#include <kiface_ids.h>
29#include <kiway.h>
30
31#include <wx/translation.h>
32
33
34namespace KICAD_DIFF
35{
36
37namespace
38{
41KIWAY::FACE_T faceForKind( DOC_KIND aKind )
42{
43 switch( aKind )
44 {
45 case DOC_KIND::SCH:
47 return KIWAY::FACE_SCH;
48 default:
49 return KIWAY::FACE_PCB;
50 }
51}
52} // namespace
53
54
55wxString OlderFormatNotice( int aAncestorVersion, int aOursVersion, int aTheirsVersion, int aCurrentVersion )
56{
57 if( aAncestorVersion >= aCurrentVersion && aOursVersion >= aCurrentVersion && aTheirsVersion >= aCurrentVersion )
58 {
59 return wxEmptyString;
60 }
61
62 return _( "One of the files being merged was written by an older version of KiCad.\n\n"
63 "The merged file is written in the current file format, whichever side is kept. "
64 "KiCad cannot write the older format back." );
65}
66
67
68int DispatchMerge( KIWAY& aKiway, DOC_KIND aKind, const wxString& aAncestor, const wxString& aOurs,
69 const wxString& aTheirs, const wxString& aOutput, bool aInteractive,
70 bool aSingleFile, REPORTER* aReporter )
71{
72 typedef int ( *MERGE_FN )( int, const wxString&, const wxString&, const wxString&,
73 const wxString&, bool, bool, REPORTER* );
74
75 KIFACE* kiface = aKiway.KiFACE( faceForKind( aKind ) );
76
77 if( !kiface )
79
80 MERGE_FN fn = reinterpret_cast<MERGE_FN>( kiface->IfaceOrAddress( KIFACE_MERGE_DOCUMENT ) );
81
82 if( !fn )
84
85 return fn( static_cast<int>( aKind ), aAncestor, aOurs, aTheirs, aOutput, aInteractive,
86 aSingleFile, aReporter );
87}
88
89
90int DispatchOpenDiffDialog( KIWAY& aKiway, DOC_KIND aKind, const wxString& aFileA,
91 const wxString& aFileB, const wxString& aLabelA, const wxString& aLabelB,
92 wxWindow* aParent, REPORTER* aReporter )
93{
94 typedef int ( *OPEN_FN )( int, const wxString&, const wxString&, const wxString&,
95 const wxString&, wxWindow*, REPORTER* );
96
97 KIFACE* kiface = aKiway.KiFACE( faceForKind( aKind ) );
98
99 if( !kiface )
101
102 OPEN_FN fn = reinterpret_cast<OPEN_FN>( kiface->IfaceOrAddress( KIFACE_OPEN_DIFF_DIALOG ) );
103
104 if( !fn )
106
107 return fn( static_cast<int>( aKind ), aFileA, aFileB, aLabelA, aLabelB, aParent, aReporter );
108}
109
110
111std::unique_ptr<DIFF_CANVAS_CONTEXT> DispatchAttachDiffCanvases( KIWAY& aKiway, DOC_KIND aKind, const wxString& aFileA,
112 const wxString& aFileB, WIDGET_DIFF_CANVAS& aBefore,
113 WIDGET_DIFF_CANVAS& aAfter, DOCUMENT_DIFF& aDiff,
114 REPORTER* aReporter )
115{
116 typedef DIFF_CANVAS_CONTEXT* ( *ATTACH_FN )( int, const wxString&, const wxString&, WIDGET_DIFF_CANVAS*,
118
119 KIFACE* kiface = aKiway.KiFACE( faceForKind( aKind ) );
120
121 if( !kiface )
122 return nullptr;
123
124 ATTACH_FN fn = reinterpret_cast<ATTACH_FN>( kiface->IfaceOrAddress( KIFACE_ATTACH_DIFF_CANVASES ) );
125
126 if( !fn )
127 return nullptr;
128
129 return std::unique_ptr<DIFF_CANVAS_CONTEXT>(
130 fn( static_cast<int>( aKind ), aFileA, aFileB, &aBefore, &aAfter, &aDiff, aReporter ) );
131}
132
133
134} // namespace KICAD_DIFF
Keeps the documents drawn on a pair of diff canvases alive.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:348
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
Definition kiway.cpp:214
FACE_T
Known KIFACE implementations.
Definition kiway.h:354
@ FACE_SCH
eeschema DSO
Definition kiway.h:355
@ FACE_PCB
pcbnew DSO
Definition kiway.h:356
A pure virtual class used to derive REPORTER objects from.
Definition reporter.h:73
GAL-backed canvas for visualizing a KICAD_DIFF::DIFF_SCENE.
#define _(s)
@ KIFACE_MERGE_DOCUMENT
int (*)( int aKind, const wxString& aAncestor, const wxString& aOurs, const wxString& aTheirs,...
Definition kiface_ids.h:70
@ KIFACE_ATTACH_DIFF_CANVASES
KICAD_DIFF::DIFF_CANVAS_CONTEXT* (*)( int aKind, const wxString& aFileA, const wxString& aFileB,...
Definition kiface_ids.h:85
@ KIFACE_OPEN_DIFF_DIALOG
int (*)( int aKind, const wxString& aFileA, const wxString& aFileB, const wxString& aLabelA,...
Definition kiface_ids.h:77
static const int ERR_UNKNOWN
Definition exit_codes.h:32
wxString OlderFormatNotice(int aAncestorVersion, int aOursVersion, int aTheirsVersion, int aCurrentVersion)
Empty when every side is already in the current file format.
std::unique_ptr< DIFF_CANVAS_CONTEXT > DispatchAttachDiffCanvases(KIWAY &aKiway, DOC_KIND aKind, const wxString &aFileA, const wxString &aFileB, WIDGET_DIFF_CANVAS &aBefore, WIDGET_DIFF_CANVAS &aAfter, DOCUMENT_DIFF &aDiff, REPORTER *aReporter)
Diff two files in the owning kiface through its KIFACE_ATTACH_DIFF_CANVASES export.
int DispatchMerge(KIWAY &aKiway, DOC_KIND aKind, const wxString &aAncestor, const wxString &aOurs, const wxString &aTheirs, const wxString &aOutput, bool aInteractive, bool aSingleFile, REPORTER *aReporter)
Run a 3-way document/library merge by calling the owning kiface's KIFACE_MERGE_DOCUMENT function expo...
DOC_KIND
Document type a diff/merge entry point should route to, derived from a file path's extension.
int DispatchOpenDiffDialog(KIWAY &aKiway, DOC_KIND aKind, const wxString &aFileA, const wxString &aFileB, const wxString &aLabelA, const wxString &aLabelB, wxWindow *aParent, REPORTER *aReporter)
Open DIALOG_KICAD_DIFF on two files by calling the owning kiface's KIFACE_OPEN_DIFF_DIALOG function e...
The full set of changes between two parsed documents of one type.
Implement a participant in the KIWAY alchemy.
Definition kiway.h:153
IFACE KIFACE_BASE kiface("pcb_test_frame", KIWAY::FACE_PCB)