mirror of
https://github.com/Microsoft/calculator.git
synced 2025-08-22 06:13:14 -07:00
Ignore None characters while parsing the clipboard
This commit is contained in:
parent
21e15c426e
commit
51bf7e5839
1 changed files with 87 additions and 84 deletions
|
@ -796,6 +796,12 @@ void StandardCalculatorViewModel::OnPaste(String^ pastedString, ViewMode mode)
|
||||||
|
|
||||||
NumbersAndOperatorsEnum mappedNumOp = MapCharacterToButtonId(*it, canSendNegate);
|
NumbersAndOperatorsEnum mappedNumOp = MapCharacterToButtonId(*it, canSendNegate);
|
||||||
|
|
||||||
|
if (mappedNumOp == NumbersAndOperatorsEnum::None)
|
||||||
|
{
|
||||||
|
++it;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (isFirstLegalChar || isPreviousOperator)
|
if (isFirstLegalChar || isPreviousOperator)
|
||||||
{
|
{
|
||||||
isFirstLegalChar = false;
|
isFirstLegalChar = false;
|
||||||
|
@ -817,74 +823,71 @@ void StandardCalculatorViewModel::OnPaste(String^ pastedString, ViewMode mode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mappedNumOp != NumbersAndOperatorsEnum::None)
|
switch (mappedNumOp)
|
||||||
{
|
{
|
||||||
switch (mappedNumOp)
|
// Opening parenthesis starts a new expression and pushes negation state onto the stack
|
||||||
|
case NumbersAndOperatorsEnum::OpenParenthesis:
|
||||||
|
negateStack.push_back(sendNegate);
|
||||||
|
sendNegate = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Closing parenthesis pops the negation state off the stack and sends it down to the calc engine
|
||||||
|
case NumbersAndOperatorsEnum::CloseParenthesis:
|
||||||
|
if (!negateStack.empty())
|
||||||
{
|
{
|
||||||
// Opening parenthesis starts a new expression and pushes negation state onto the stack
|
sendNegate = negateStack.back();
|
||||||
case NumbersAndOperatorsEnum::OpenParenthesis:
|
negateStack.pop_back();
|
||||||
negateStack.push_back(sendNegate);
|
canSendNegate = true;
|
||||||
sendNegate = false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Closing parenthesis pops the negation state off the stack and sends it down to the calc engine
|
|
||||||
case NumbersAndOperatorsEnum::CloseParenthesis:
|
|
||||||
if (!negateStack.empty())
|
|
||||||
{
|
|
||||||
sendNegate = negateStack.back();
|
|
||||||
negateStack.pop_back();
|
|
||||||
canSendNegate = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Don't send a closing parenthesis if a matching opening parenthesis hasn't been sent already
|
|
||||||
sendCommand = false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NumbersAndOperatorsEnum::Zero:
|
|
||||||
case NumbersAndOperatorsEnum::One:
|
|
||||||
case NumbersAndOperatorsEnum::Two:
|
|
||||||
case NumbersAndOperatorsEnum::Three:
|
|
||||||
case NumbersAndOperatorsEnum::Four:
|
|
||||||
case NumbersAndOperatorsEnum::Five:
|
|
||||||
case NumbersAndOperatorsEnum::Six:
|
|
||||||
case NumbersAndOperatorsEnum::Seven:
|
|
||||||
case NumbersAndOperatorsEnum::Eight:
|
|
||||||
case NumbersAndOperatorsEnum::Nine:
|
|
||||||
processedDigit = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NumbersAndOperatorsEnum::Add:
|
|
||||||
case NumbersAndOperatorsEnum::Subtract:
|
|
||||||
case NumbersAndOperatorsEnum::Multiply:
|
|
||||||
case NumbersAndOperatorsEnum::Divide:
|
|
||||||
isPreviousOperator = true;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (sendCommand)
|
|
||||||
{
|
{
|
||||||
sentEquals = (mappedNumOp == NumbersAndOperatorsEnum::Equals);
|
// Don't send a closing parenthesis if a matching opening parenthesis hasn't been sent already
|
||||||
Command cmdenum = ConvertToOperatorsEnum(mappedNumOp);
|
sendCommand = false;
|
||||||
m_standardCalculatorManager.SendCommand(cmdenum);
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
// The CalcEngine state machine won't allow the negate command to be sent before any
|
case NumbersAndOperatorsEnum::Zero:
|
||||||
// other digits, so instead a flag is set and the command is sent after the first appropriate
|
case NumbersAndOperatorsEnum::One:
|
||||||
// command.
|
case NumbersAndOperatorsEnum::Two:
|
||||||
if (sendNegate)
|
case NumbersAndOperatorsEnum::Three:
|
||||||
|
case NumbersAndOperatorsEnum::Four:
|
||||||
|
case NumbersAndOperatorsEnum::Five:
|
||||||
|
case NumbersAndOperatorsEnum::Six:
|
||||||
|
case NumbersAndOperatorsEnum::Seven:
|
||||||
|
case NumbersAndOperatorsEnum::Eight:
|
||||||
|
case NumbersAndOperatorsEnum::Nine:
|
||||||
|
processedDigit = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NumbersAndOperatorsEnum::Add:
|
||||||
|
case NumbersAndOperatorsEnum::Subtract:
|
||||||
|
case NumbersAndOperatorsEnum::Multiply:
|
||||||
|
case NumbersAndOperatorsEnum::Divide:
|
||||||
|
isPreviousOperator = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sendCommand)
|
||||||
|
{
|
||||||
|
sentEquals = (mappedNumOp == NumbersAndOperatorsEnum::Equals);
|
||||||
|
Command cmdenum = ConvertToOperatorsEnum(mappedNumOp);
|
||||||
|
m_standardCalculatorManager.SendCommand(cmdenum);
|
||||||
|
|
||||||
|
// The CalcEngine state machine won't allow the negate command to be sent before any
|
||||||
|
// other digits, so instead a flag is set and the command is sent after the first appropriate
|
||||||
|
// command.
|
||||||
|
if (sendNegate)
|
||||||
|
{
|
||||||
|
if (canSendNegate)
|
||||||
{
|
{
|
||||||
if (canSendNegate)
|
Command cmdNegate = ConvertToOperatorsEnum(NumbersAndOperatorsEnum::Negate);
|
||||||
{
|
m_standardCalculatorManager.SendCommand(cmdNegate);
|
||||||
Command cmdNegate = ConvertToOperatorsEnum(NumbersAndOperatorsEnum::Negate);
|
}
|
||||||
m_standardCalculatorManager.SendCommand(cmdNegate);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can't send negate on a leading zero, so wait until the appropriate time to send it.
|
// Can't send negate on a leading zero, so wait until the appropriate time to send it.
|
||||||
if (NumbersAndOperatorsEnum::Zero != mappedNumOp && NumbersAndOperatorsEnum::Decimal != mappedNumOp)
|
if (NumbersAndOperatorsEnum::Zero != mappedNumOp && NumbersAndOperatorsEnum::Decimal != mappedNumOp)
|
||||||
{
|
{
|
||||||
sendNegate = false;
|
sendNegate = false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1430,29 +1433,29 @@ void StandardCalculatorViewModel::SaveEditedCommand(_In_ unsigned int tokenPosit
|
||||||
|
|
||||||
switch (nOpCode)
|
switch (nOpCode)
|
||||||
{
|
{
|
||||||
case static_cast<int>(Command::CommandASIN) :
|
case static_cast<int>(Command::CommandASIN) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSIN), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSIN), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandACOS) :
|
case static_cast<int>(Command::CommandACOS) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOS), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOS), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandATAN) :
|
case static_cast<int>(Command::CommandATAN) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTAN), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTAN), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandASINH) :
|
case static_cast<int>(Command::CommandASINH) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSINH), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSINH), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandACOSH) :
|
case static_cast<int>(Command::CommandACOSH) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOSH), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOSH), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandATANH) :
|
case static_cast<int>(Command::CommandATANH) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTANH), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTANH), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandPOWE) :
|
case static_cast<int>(Command::CommandPOWE) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandLN), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandLN), true, angleType);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType);
|
||||||
}
|
}
|
||||||
if ((token.first.length() > 0) && (token.first[token.first.length() - 1] == L'('))
|
if ((token.first.length() > 0) && (token.first[token.first.length() - 1] == L'('))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue