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);
|
||||
|
||||
if (mappedNumOp == NumbersAndOperatorsEnum::None)
|
||||
{
|
||||
++it;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isFirstLegalChar || isPreviousOperator)
|
||||
{
|
||||
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
|
||||
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())
|
||||
{
|
||||
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;
|
||||
sendNegate = negateStack.back();
|
||||
negateStack.pop_back();
|
||||
canSendNegate = true;
|
||||
}
|
||||
|
||||
if (sendCommand)
|
||||
else
|
||||
{
|
||||
sentEquals = (mappedNumOp == NumbersAndOperatorsEnum::Equals);
|
||||
Command cmdenum = ConvertToOperatorsEnum(mappedNumOp);
|
||||
m_standardCalculatorManager.SendCommand(cmdenum);
|
||||
// Don't send a closing parenthesis if a matching opening parenthesis hasn't been sent already
|
||||
sendCommand = false;
|
||||
}
|
||||
break;
|
||||
|
||||
// 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)
|
||||
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;
|
||||
}
|
||||
|
||||
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.
|
||||
if (NumbersAndOperatorsEnum::Zero != mappedNumOp && NumbersAndOperatorsEnum::Decimal != mappedNumOp)
|
||||
{
|
||||
sendNegate = false;
|
||||
}
|
||||
// Can't send negate on a leading zero, so wait until the appropriate time to send it.
|
||||
if (NumbersAndOperatorsEnum::Zero != mappedNumOp && NumbersAndOperatorsEnum::Decimal != mappedNumOp)
|
||||
{
|
||||
sendNegate = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1430,29 +1433,29 @@ void StandardCalculatorViewModel::SaveEditedCommand(_In_ unsigned int tokenPosit
|
|||
|
||||
switch (nOpCode)
|
||||
{
|
||||
case static_cast<int>(Command::CommandASIN) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSIN), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandACOS) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOS), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandATAN) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTAN), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandASINH) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSINH), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandACOSH) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOSH), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandATANH) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTANH), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandPOWE) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandLN), true, angleType);
|
||||
break;
|
||||
default:
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType);
|
||||
case static_cast<int>(Command::CommandASIN) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSIN), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandACOS) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOS), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandATAN) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTAN), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandASINH) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSINH), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandACOSH) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOSH), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandATANH) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTANH), true, angleType);
|
||||
break;
|
||||
case static_cast<int>(Command::CommandPOWE) :
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandLN), true, angleType);
|
||||
break;
|
||||
default:
|
||||
updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType);
|
||||
}
|
||||
if ((token.first.length() > 0) && (token.first[token.first.length() - 1] == L'('))
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue