OSDN Git Service

Fix an issue where items with different case are not displayed correctly in the folde...
[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(int pane)
29 {
30         if (!PromptAndSaveIfNeeded(true))
31                 return false;
32         
33         CLoadSaveCodepageDlg dlg(m_nBuffers);
34         dlg.EnableSaveCodepage(true);
35         if (pane == -1)
36         {
37                 dlg.SetCodepages(m_ptBuf[0]->getCodepage());
38                 dlg.SetCodepageBOM(m_ptBuf[0]->getHasBom());
39         }
40         else
41         {
42                 dlg.SetCodepages(m_ptBuf[pane]->getCodepage());
43                 dlg.SetCodepageBOM(m_ptBuf[pane]->getHasBom());
44                 if (pane == 0)
45                 {
46                         dlg.SetAffectMiddle(false);
47                         dlg.SetAffectRight(false);
48                 }
49                 if (m_nBuffers > 2 && pane == 1)
50                 {
51                         dlg.SetAffectLeft(false);
52                         dlg.SetAffectRight(false);
53                 }
54                 if (pane == m_nBuffers - 1)
55                 {
56                         dlg.SetAffectLeft(false);
57                         dlg.SetAffectMiddle(false);
58                 }
59         }
60         if (IDOK != dlg.DoModal())
61                 return false;
62
63         bool doLeft = dlg.DoesAffectLeft();
64         bool doMiddle = dlg.DoesAffectMiddle();
65         bool doRight = dlg.DoesAffectRight();
66         FileLocation fileloc[3];
67         bool bRO[3];
68         for (pane = 0; pane < m_nBuffers; pane++)
69         {
70                 bRO[pane] = m_ptBuf[pane]->GetReadOnly();
71                 if ((pane == 0 && doLeft) ||
72                     (pane == 1 && doRight  && m_nBuffers <  3) ||
73                     (pane == 1 && doMiddle && m_nBuffers == 3) ||
74                     (pane == 2 && doRight  && m_nBuffers == 3))
75                 {
76                         fileloc[pane].encoding.SetCodepage(dlg.GetLoadCodepage());
77                         switch (fileloc[pane].encoding.m_unicoding)
78                         {
79                         case ucr::UTF8:
80                         case ucr::UCS2LE:
81                         case ucr::UCS2BE:
82                                 m_ptBuf[pane]->setHasBom(dlg.GetSaveCodepageBOM());
83                                 break;
84                         default:
85                                 break;
86                         }
87                 }
88                 else
89                 {
90                         fileloc[pane].encoding.m_unicoding = m_ptBuf[pane]->getUnicoding();
91                         fileloc[pane].encoding.m_codepage = m_ptBuf[pane]->getCodepage();
92                 }
93                 fileloc[pane].setPath(m_filePaths[pane]);
94         }
95         OpenDocs(m_nBuffers, fileloc, bRO, m_strDesc);
96         
97         if (dlg.GetSaveCodepage() != dlg.GetLoadCodepage() || m_ptBuf[0]->getHasBom() != dlg.GetSaveCodepageBOM())
98         {
99                 int nSaveCodepage = dlg.GetSaveCodepage();
100                 for (pane = 0; pane < m_nBuffers; pane++)
101                 {
102                         bRO[pane] = m_ptBuf[pane]->GetReadOnly();
103                         if (!bRO[pane] && (
104                                 (pane == 0 && doLeft) ||
105                                 (pane == 1 && doRight  && m_nBuffers <  3) ||
106                                 (pane == 1 && doMiddle && m_nBuffers == 3) ||
107                                 (pane == 2 && doRight  && m_nBuffers == 3)
108                                 ))
109                         {
110                                 switch (nSaveCodepage)
111                                 {
112                                 case ucr::CP_UTF_8:
113                                 case ucr::CP_UCS2LE:
114                                 case ucr::CP_UCS2BE:
115                                         m_ptBuf[pane]->setHasBom(dlg.GetSaveCodepageBOM());
116                                         break;
117                                 default:
118                                         break;
119                                 }
120                                 m_ptBuf[pane]->setCodepage(nSaveCodepage);
121                                 m_ptBuf[pane]->SetModified();
122                                 UpdateHeaderPath(pane);
123                                 ForEachView([](auto& pView) { pView->UpdateStatusbar(); });
124                         }
125                 }
126         }
127         return true;
128 }
129