示例#1
0
void CTable::Get(CLineVector & results)
{
	results.clear();
	results.reserve(m_rows.size() - 2);
	for(CLineVector::iterator itr = m_rows.begin(); itr != m_rows.end();)
	{
		CLineVector::iterator this_itr = itr++;
		if (this_itr != m_rows.begin() && itr != m_rows.end())
			results.push_back(*this_itr);
	}
}
示例#2
0
void SetCharTypes(CLine & line, const CLineVector & lineVector)
{
	int charPos = 0;
	for(CLineVector::const_iterator itr = lineVector.begin(); itr != lineVector.end(); ++itr)
	{
		switch(itr->GetType())
		{
		case CLine::TYPE_DELETED:
		case CLine::TYPE_SIMILAR:
		case CLine::TYPE_MOVED:
			line.SetCharType(charPos, CLine::TYPE_SIMILAR);
			break;
		}
		charPos++;
	}
}
示例#3
0
void AppendTable(CLineVector & lineVector, const CTable & table, CLine::TYPE type)
{
	for (size_t i = 1; i < table.size() - 1; ++i)
	{
		CLine line = table[i];
		line.SetType(type);
		lineVector.push_back(line);
	}
}
示例#4
0
void AppendBlankLines(CLineVector & lineVector, const CTable & otherTable, CLine::TYPE type)
{
	for (size_t i = 1; i < otherTable.size() - 1; ++i)
	{
		CLine line;
		if (!IsDummyLine(line))
		{
			line.SetType(otherTable[i].GetType() == CLine::TYPE_MOVED ? CLine::TYPE_MATCH : type);
			lineVector.push_back(line);
		}
	}
}
示例#5
0
void CAnchors::GetResults(CLineVector & baseResult, CLineVector & compResult)
{
	for(size_t i = 1; i < m_baseTable.size() - 1; ++i)
	{
		CLine line = m_baseTable[i];
		if (AnchorsBaseContains(i))
			line.SetType(CLine::TYPE_MATCH);
		else
			line.SetType(CLine::TYPE_SIMILAR);
		baseResult.push_back(line);
	}

	for(size_t i = 1; i < m_compTable.size() - 1; ++i)
	{
		CLine line = m_compTable[i];
		if (AnchorsCompContains(i))
			line.SetType(CLine::TYPE_MATCH);
		else
			line.SetType(CLine::TYPE_SIMILAR);
		compResult.push_back(line);
	}
}
示例#6
0
void CDiffView::SetText(const std::_tstring &lhs, const std::_tstring &rhs)
{
    CLineVector baseResult;
    CLineVector compResult;
    TextCompare(lhs, rhs, baseResult, compResult);

    m_lhs.SetReadOnly(false);
    m_lhs.ClearAll();
    m_lhs.SetReadOnly(true);
    m_lhs.SetProperty(_T("fold"), _T("0"));
    m_lhs.SetMarginWidthN(2, 0);
    //m_lhs.HideSelection(true);
    m_lhs.IndicSetStyle(1, INDIC_SQUIGGLE);
    m_lhs.IndicSetFore(1, 0x0000ff);
    m_lhs.SetLineState(0, 0);
    m_lhs.MarkerSetFore(MARKER_ADDED, 0x007f00);
    m_lhs.MarkerSetFore(MARKER_MODIFIED, 0x7f0000);
    m_lhs.MarkerSetFore(MARKER_DELETED, 0x00007f);
    m_lhs.MarkerSetAlpha(MARKER_ADDED, 200);
    m_lhs.MarkerSetAlpha(MARKER_MODIFIED, 200);
    m_lhs.MarkerSetAlpha(MARKER_DELETED, 200);

    m_rhs.SetReadOnly(false);
    m_rhs.ClearAll();
    m_rhs.SetReadOnly(true);
    m_rhs.SetProperty(_T("fold"), _T("0"));
    m_rhs.SetMarginWidthN(2, 0);
    //m_rhs.HideSelection(true);
    m_rhs.IndicSetStyle(1, INDIC_SQUIGGLE);
    m_rhs.IndicSetFore(1, 0x0000ff);
    m_rhs.SetLineState(0, 0);
    m_rhs.MarkerSetFore(MARKER_ADDED, 0x007f00);
    m_rhs.MarkerSetFore(MARKER_MODIFIED, 0x7f0000);
    m_rhs.MarkerSetFore(MARKER_DELETED, 0x00007f);
    m_rhs.MarkerSetAlpha(MARKER_ADDED, 200);
    m_rhs.MarkerSetAlpha(MARKER_MODIFIED, 200);
    m_rhs.MarkerSetAlpha(MARKER_DELETED, 200);

    std::_tstring clhs;
    for(CLineVector::iterator itr = baseResult.begin(); itr != baseResult.end(); ++itr)
    {
        //clhs += itr->ststus;
        clhs += itr->GetText();
        //clhs += _T("\n");
    }

    std::_tstring crhs;
    for(CLineVector::iterator itr = compResult.begin(); itr != compResult.end(); ++itr)
    {
        //crhs += itr->ststus;
        crhs += itr->GetText();
        //crhs += _T("\n");
    }

    m_lhs.SetReadOnly(false);
    m_lhs.SetText(clhs.c_str());
    int line = 0;
    ATLASSERT(baseResult.size() == compResult.size());
    for(CLineVector::iterator itr = baseResult.begin(); itr != baseResult.end(); ++itr)
    {
        int startPos = m_lhs.PositionFromLine(line);
        //int lineLen = m_lhs.PositionFromLine(line + 1) - startPos;
        switch(itr->GetType())
        {
        case CLine::TYPE_ADDED:
            m_lhs.SetLineState(line, SCE_ECL_ADDED);
            break;
        case CLine::TYPE_UNKNOWN:
            break;
        case CLine::TYPE_DELETED:
            //m_lhs.SetLineState(line, SCE_ECL_DELETED);
            m_lhs.MarkerAdd(line, MARKER_DELETED);
            break;
        case CLine::TYPE_MOVED:
            //m_lhs.SetLineState(line, SCE_ECL_MOVED);
            //m_rhs.SetLineState(line, 0);
            break;
        case CLine::TYPE_SIMILAR:
            //m_lhs.SetLineState(line, SCE_ECL_CHANGED);
            m_lhs.MarkerAdd(line, MARKER_MODIFIED);
            for(int i = 0; i < itr->GetLength(); ++i)
            {
                if (itr->GetCharType(i) == CLine::TYPE_SIMILAR)
                {
                    m_lhs.SetIndicatorCurrent(INDIC_SQUIGGLE);
                    m_lhs.IndicatorFillRange(startPos + i, 1);
                }
            }
            break;
        }
        ++line;
    }
    m_lhs.SetReadOnly(true);
    m_rhs.SetReadOnly(false);
    m_rhs.SetText(crhs.c_str());
    line = 0;
    for(CLineVector::iterator itr = compResult.begin(); itr != compResult.end(); ++itr)
    {
        int startPos = m_rhs.PositionFromLine(line);
        switch(itr->GetType())
        {
        case CLine::TYPE_ADDED:
            //m_rhs.SetLineState(line, SCE_ECL_ADDED);
            m_rhs.MarkerAdd(line, MARKER_ADDED);
            break;
        case CLine::TYPE_UNKNOWN:
            break;
        case CLine::TYPE_DELETED:
            m_rhs.SetLineState(line, SCE_ECL_DELETED);
            break;
        case CLine::TYPE_MOVED:
            //m_rhs.SetLineState(line, SCE_ECL_MOVED);
            //m_lhs.SetLineState(line, 0);
            break;
        case CLine::TYPE_SIMILAR:
            //m_rhs.SetLineState(line, SCE_ECL_CHANGED);
            m_rhs.MarkerAdd(line, MARKER_MODIFIED);
            for(int i = 0; i < itr->GetLength(); ++i)
            {
                if (itr->GetCharType(i) == CLine::TYPE_SIMILAR)
                {
                    m_rhs.SetIndicatorCurrent(1);
                    m_rhs.IndicatorFillRange(startPos + i, 1);
                }
            }
            break;
        }
        ++line;
    }
    m_rhs.SetReadOnly(true);
}
示例#7
0
void CAnchors::GetPaddedResults(CLineVector & baseResult, CLineVector & compResult) const
{
	unsigned int matchCount = GetMatchCount();
	unsigned int gapCount = GetGapCount();
	unsigned int matchPos = 0;
	unsigned int gapPos = 0;
	while(matchPos < matchCount)
	{
		{
			CTable baseTable, compTable;
			GetMatch(matchPos, baseTable, compTable);
			for (size_t i = 1; i < baseTable.size() - 1; ++i)
			{
				CLine baseLine = baseTable[i];
				CLine compLine = compTable[i];
				CLine::TYPE type = baseLine.Equals(compLine, 0) ? CLine::TYPE_MATCH : CLine::TYPE_SIMILAR;
				if (type == CLine::TYPE_SIMILAR)
				{
					CTable baseLineTable(baseLine.GetText(), true);
					CTable compLineTable(compLine.GetText(), true);
					CAnchors lineAnchors(baseLineTable, compLineTable, 0);
					CLineVector baseLineVector, compLineVector;
					lineAnchors.GetResults(baseLineVector, compLineVector);
					SetCharTypes(baseLine, baseLineVector);
					SetCharTypes(compLine, compLineVector);
				}
				baseLine.SetType(type);
				compLine.SetType(type);
				baseResult.push_back(baseLine);
				compResult.push_back(compLine);
			}
			ATLASSERT(baseResult.size() == compResult.size());
			++matchPos;
		}
		if (gapPos < gapCount)
		{
			CTable baseTable, compTable;
			GetGap(gapPos, baseTable, compTable);
			if (baseTable.size() <= 2)	//Added lines
			{
				ATLASSERT(compTable.size() > 2);
				AppendBlankLines(baseResult, compTable, CLine::TYPE_ADDED);
				AppendTable(compResult, compTable, CLine::TYPE_ADDED);
			}
			else if (compTable.size() <= 2)  //Deleted lines
			{
				ATLASSERT(baseTable.size() > 2);
				AppendTable(baseResult, baseTable, CLine::TYPE_DELETED);
				AppendBlankLines(compResult, baseTable, CLine::TYPE_DELETED);
			}
			else if (m_accuracy > 35)	//  Don't recurse too much.
			{
				AppendTable(baseResult, baseTable, CLine::TYPE_DELETED);
				AppendBlankLines(compResult, baseTable, CLine::TYPE_DELETED);
				AppendBlankLines(baseResult, compTable, CLine::TYPE_ADDED);
				AppendTable(compResult, compTable, CLine::TYPE_ADDED);
			}
			else
			{
				CAnchors gapAnchors(baseTable, compTable, m_accuracy + 5);
				gapAnchors.GetPaddedResults(baseResult, compResult);
			}
			ATLASSERT(baseResult.size() == compResult.size());
			++gapPos;
		}
	}
}