OSDN Git Service

Update TranslationsStatus.*
[winmerge-jp/winmerge-jp.git] / Src / MergeDocEncoding.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 //    WinMerge:  an interactive diff/merge utility
3 //    Copyright (C) 1997-2000  Thingamahoochie Software
4 //    Author: Dean Grimm
5 //    SPDX-License-Identifier: GPL-2.0-or-later
6 /////////////////////////////////////////////////////////////////////////////
7 /** 
8  * @file  MergeDocEncoding.cpp
9  *
10  * @brief Implementation file for CMergeDoc
11  *
12  */
13
14 #include "stdafx.h"
15 #include "MergeDoc.h"
16 #include "MergeEditView.h"
17 #include "LoadSaveCodepageDlg.h"
18 #include "unicoder.h"
19
20
21 #ifdef _DEBUG
22 #define new DEBUG_NEW
23 #endif
24
25 /**
26  * @brief Display file encoding dialog to user & handle user's choices
27  */
28 bool CMergeDoc::DoFileEncodingDialog()
29 {
30         if (!PromptAndSaveIfNeeded(true))
31                 return false;
32         
33         CLoadSaveCodepageDlg dlg(m_nBuffers);
34         dlg.EnableSaveCodepage(true);
35         dlg.SetCodepages(m_ptBuf[0]->getCodepage());
36         dlg.SetCodepageBOM(m_ptBuf[0]->getHasBom());
37         if (IDOK != dlg.DoModal())
38                 return false;
39
40         bool doLeft = dlg.DoesAffectLeft();
41         bool doMiddle = dlg.DoesAffectMiddle();
42         bool doRight = dlg.DoesAffectRight();
43         FileLocation fileloc[3];
44         bool bRO[3];
45         for (int pane = 0; pane < m_nBuffers; pane++)
46         {
47                 bRO[pane] = m_ptBuf[pane]->GetReadOnly();
48                 if ((pane == 0 && doLeft) ||
49                     (pane == 1 && doRight  && m_nBuffers <  3) ||
50                     (pane == 1 && doMiddle && m_nBuffers == 3) ||
51                     (pane == 2 && doRight  && m_nBuffers == 3))
52                 {
53                         fileloc[pane].encoding.SetCodepage(dlg.GetLoadCodepage());
54                         switch (fileloc[pane].encoding.m_unicoding)
55                         {
56                         case ucr::UTF8:
57                         case ucr::UCS2LE:
58                         case ucr::UCS2BE:
59                                 m_ptBuf[pane]->setHasBom(dlg.GetSaveCodepageBOM());
60                                 break;
61                         default:
62                                 break;
63                         }
64                 }
65                 else
66                 {
67                         fileloc[pane].encoding.m_unicoding = m_ptBuf[pane]->getUnicoding();
68                         fileloc[pane].encoding.m_codepage = m_ptBuf[pane]->getCodepage();
69                 }
70                 fileloc[pane].setPath(m_filePaths[pane]);
71         }
72         OpenDocs(m_nBuffers, fileloc, bRO, m_strDesc);
73         
74         if (dlg.GetSaveCodepage() != dlg.GetLoadCodepage() || m_ptBuf[0]->getHasBom() != dlg.GetSaveCodepageBOM())
75         {
76                 int nSaveCodepage = dlg.GetSaveCodepage();
77                 for (int pane = 0; pane < m_nBuffers; pane++)
78                 {
79                         bRO[pane] = m_ptBuf[pane]->GetReadOnly();
80                         if (!bRO[pane] && (
81                                 (pane == 0 && doLeft) ||
82                                 (pane == 1 && doRight  && m_nBuffers <  3) ||
83                                 (pane == 1 && doMiddle && m_nBuffers == 3) ||
84                                 (pane == 2 && doRight  && m_nBuffers == 3)
85                                 ))
86                         {
87                                 switch (nSaveCodepage)
88                                 {
89                                 case ucr::CP_UTF_8:
90                                 case ucr::CP_UCS2LE:
91                                 case ucr::CP_UCS2BE:
92                                         m_ptBuf[pane]->setHasBom(dlg.GetSaveCodepageBOM());
93                                         break;
94                                 default:
95                                         break;
96                                 }
97                                 m_ptBuf[pane]->setCodepage(nSaveCodepage);
98                                 m_ptBuf[pane]->SetModified();
99                                 UpdateHeaderPath(pane);
100                                 ForEachView([](auto& pView) { pView->UpdateStatusbar(); });
101                         }
102                 }
103         }
104         return true;
105 }
106