core moved to android-app

This commit is contained in:
serso 2016-01-05 09:42:17 +01:00
parent c2146dc0f6
commit d834ccc305
161 changed files with 2711 additions and 3015 deletions

View File

@ -62,7 +62,6 @@ repositories {
dependencies { dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':core')
compile 'org.solovyev:common-core:1.0.7' compile 'org.solovyev:common-core:1.0.7'
compile 'org.solovyev:common-text:1.0.7' compile 'org.solovyev:common-text:1.0.7'
compile 'org.solovyev:common-security:1.0.7' compile 'org.solovyev:common-security:1.0.7'
@ -91,6 +90,22 @@ dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
compile group: 'org.solovyev', name: 'common-text', version: '1.0.7'
compile group: 'org.solovyev', name: 'common-listeners', version: '1.0.7'
compile(group: 'com.google.guava', name: 'guava', version: '11.0.2') {
exclude(module: 'jsr305')
}
compile(group: 'org.solovyev', name: 'jscl', version: '1.0.11') {
exclude(module: 'xercesImpl')
}
compile(group: 'org.simpleframework', name: 'simple-xml', version: '2.6.1') {
exclude(module: 'stax-api')
exclude(module: 'xpp3')
}
compile group: 'commons-cli', name: 'commons-cli', version: '1.2'
testCompile group: 'junit', name: 'junit', version: '4.11'
testCompile group: 'net.sf.opencsv', name: 'opencsv', version: '2.0'
testCompile group: 'org.mockito', name: 'mockito-core', version: '1.9.0'
} }
task androidJavadocs(type: Javadoc) { task androidJavadocs(type: Javadoc) {

View File

@ -1,44 +1,44 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public abstract class AbstractFixableError implements FixableError { public abstract class AbstractFixableError implements FixableError {
@Nullable @Nullable
private String fixCaption; private String fixCaption;
protected AbstractFixableError() { protected AbstractFixableError() {
} }
protected AbstractFixableError(@Nullable String fixCaption) { protected AbstractFixableError(@Nullable String fixCaption) {
this.fixCaption = fixCaption; this.fixCaption = fixCaption;
} }
@Nullable @Nullable
@Override @Override
public CharSequence getFixCaption() { public CharSequence getFixCaption() {
return fixCaption; return fixCaption;
} }
} }

View File

@ -1,49 +1,49 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import jscl.NumeralBase; import jscl.NumeralBase;
import jscl.math.Generic; import jscl.math.Generic;
/** /**
* User: Solovyev_S * User: Solovyev_S
* Date: 24.09.12 * Date: 24.09.12
* Time: 16:45 * Time: 16:45
*/ */
public interface CalculatorConversionEventData extends CalculatorEventData { public interface CalculatorConversionEventData extends CalculatorEventData {
// display state on the moment of conversion // display state on the moment of conversion
@Nonnull @Nonnull
CalculatorDisplayViewState getDisplayState(); CalculatorDisplayViewState getDisplayState();
@Nonnull @Nonnull
NumeralBase getFromNumeralBase(); NumeralBase getFromNumeralBase();
@Nonnull @Nonnull
NumeralBase getToNumeralBase(); NumeralBase getToNumeralBase();
@Nonnull @Nonnull
Generic getValue(); Generic getValue();
} }

View File

@ -1,35 +1,35 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
/** /**
* User: Solovyev_S * User: Solovyev_S
* Date: 21.09.12 * Date: 21.09.12
* Time: 11:48 * Time: 11:48
*/ */
public interface CalculatorEditorView { public interface CalculatorEditorView {
void setState(@Nonnull CalculatorEditorViewState viewState); void setState(@Nonnull CalculatorEditorViewState viewState);
} }

View File

@ -1,85 +1,85 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
/** /**
* User: Solovyev_S * User: Solovyev_S
* Date: 21.09.12 * Date: 21.09.12
* Time: 12:02 * Time: 12:02
*/ */
public class CalculatorEditorViewStateImpl implements CalculatorEditorViewState { public class CalculatorEditorViewStateImpl implements CalculatorEditorViewState {
@Nonnull @Nonnull
private CharSequence text = ""; private CharSequence text = "";
private int selection = 0; private int selection = 0;
private CalculatorEditorViewStateImpl() { private CalculatorEditorViewStateImpl() {
} }
public CalculatorEditorViewStateImpl(@Nonnull CalculatorEditorViewState viewState) { public CalculatorEditorViewStateImpl(@Nonnull CalculatorEditorViewState viewState) {
this.text = viewState.getText(); this.text = viewState.getText();
this.selection = viewState.getSelection(); this.selection = viewState.getSelection();
} }
@Nonnull @Nonnull
public static CalculatorEditorViewState newDefaultInstance() { public static CalculatorEditorViewState newDefaultInstance() {
return new CalculatorEditorViewStateImpl(); return new CalculatorEditorViewStateImpl();
} }
@Nonnull @Nonnull
public static CalculatorEditorViewState newSelection(@Nonnull CalculatorEditorViewState viewState, int newSelection) { public static CalculatorEditorViewState newSelection(@Nonnull CalculatorEditorViewState viewState, int newSelection) {
final CalculatorEditorViewStateImpl result = new CalculatorEditorViewStateImpl(viewState); final CalculatorEditorViewStateImpl result = new CalculatorEditorViewStateImpl(viewState);
result.selection = newSelection; result.selection = newSelection;
return result; return result;
} }
@Nonnull @Nonnull
public static CalculatorEditorViewState newInstance(@Nonnull CharSequence text, int selection) { public static CalculatorEditorViewState newInstance(@Nonnull CharSequence text, int selection) {
final CalculatorEditorViewStateImpl result = new CalculatorEditorViewStateImpl(); final CalculatorEditorViewStateImpl result = new CalculatorEditorViewStateImpl();
result.text = text; result.text = text;
result.selection = selection; result.selection = selection;
return result; return result;
} }
@Nonnull @Nonnull
@Override @Override
public String getText() { public String getText() {
return this.text.toString(); return this.text.toString();
} }
@Nonnull @Nonnull
@Override @Override
public CharSequence getTextAsCharSequence() { public CharSequence getTextAsCharSequence() {
return this.text; return this.text;
} }
@Override @Override
public int getSelection() { public int getSelection() {
return this.selection; return this.selection;
} }
} }

View File

@ -1,35 +1,35 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
/** /**
* User: serso * User: serso
* Date: 10/24/11 * Date: 10/24/11
* Time: 9:55 PM * Time: 9:55 PM
*/ */
public interface CalculatorEngineControl { public interface CalculatorEngineControl {
void evaluate(); void evaluate();
void simplify(); void simplify();
} }

View File

@ -1,88 +1,88 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import org.solovyev.common.msg.Message; import org.solovyev.common.msg.Message;
import org.solovyev.common.msg.MessageLevel; import org.solovyev.common.msg.MessageLevel;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
/** /**
* User: serso * User: serso
* Date: 12/8/11 * Date: 12/8/11
* Time: 1:27 AM * Time: 1:27 AM
*/ */
public class CalculatorEvalException extends Exception implements Message { public class CalculatorEvalException extends Exception implements Message {
@Nonnull @Nonnull
private final Message message; private final Message message;
@Nonnull @Nonnull
private final String expression; private final String expression;
public CalculatorEvalException(@Nonnull Message message, @Nonnull Throwable cause, String expression) { public CalculatorEvalException(@Nonnull Message message, @Nonnull Throwable cause, String expression) {
super(cause); super(cause);
this.message = message; this.message = message;
this.expression = expression; this.expression = expression;
} }
@Nonnull @Nonnull
public String getExpression() { public String getExpression() {
return expression; return expression;
} }
@Nonnull @Nonnull
@Override @Override
public String getMessageCode() { public String getMessageCode() {
return this.message.getMessageCode(); return this.message.getMessageCode();
} }
@Nonnull @Nonnull
@Override @Override
public List<Object> getParameters() { public List<Object> getParameters() {
return this.message.getParameters(); return this.message.getParameters();
} }
@Nonnull @Nonnull
@Override @Override
public MessageLevel getMessageLevel() { public MessageLevel getMessageLevel() {
return this.message.getMessageLevel(); return this.message.getMessageLevel();
} }
@Override @Override
@Nonnull @Nonnull
public String getLocalizedMessage() { public String getLocalizedMessage() {
return this.message.getLocalizedMessage(Locale.getDefault()); return this.message.getLocalizedMessage(Locale.getDefault());
} }
@Nonnull @Nonnull
@Override @Override
public String getLocalizedMessage(@Nonnull Locale locale) { public String getLocalizedMessage(@Nonnull Locale locale) {
return this.message.getLocalizedMessage(locale); return this.message.getLocalizedMessage(locale);
} }
} }

View File

@ -1,41 +1,41 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import org.solovyev.android.calculator.jscl.JsclOperation; import org.solovyev.android.calculator.jscl.JsclOperation;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
/** /**
* User: serso * User: serso
* Date: 9/20/12 * Date: 9/20/12
* Time: 10:00 PM * Time: 10:00 PM
*/ */
public interface CalculatorEvaluationEventData extends CalculatorEventData { public interface CalculatorEvaluationEventData extends CalculatorEventData {
@Nonnull @Nonnull
JsclOperation getOperation(); JsclOperation getOperation();
@Nonnull @Nonnull
String getExpression(); String getExpression();
} }

View File

@ -1,79 +1,79 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import java.util.List; import java.util.List;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* User: Solovyev_S * User: Solovyev_S
* Date: 20.09.12 * Date: 20.09.12
* Time: 16:39 * Time: 16:39
*/ */
public interface CalculatorEventContainer { public interface CalculatorEventContainer {
void addCalculatorEventListener(@Nonnull CalculatorEventListener calculatorEventListener); void addCalculatorEventListener(@Nonnull CalculatorEventListener calculatorEventListener);
void removeCalculatorEventListener(@Nonnull CalculatorEventListener calculatorEventListener); void removeCalculatorEventListener(@Nonnull CalculatorEventListener calculatorEventListener);
void fireCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data); void fireCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data);
void fireCalculatorEvents(@Nonnull List<CalculatorEvent> calculatorEvents); void fireCalculatorEvents(@Nonnull List<CalculatorEvent> calculatorEvents);
public static class CalculatorEvent { public static class CalculatorEvent {
@Nonnull @Nonnull
private CalculatorEventData calculatorEventData; private CalculatorEventData calculatorEventData;
@Nonnull @Nonnull
private CalculatorEventType calculatorEventType; private CalculatorEventType calculatorEventType;
@Nullable @Nullable
private Object data; private Object data;
public CalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, public CalculatorEvent(@Nonnull CalculatorEventData calculatorEventData,
@Nonnull CalculatorEventType calculatorEventType, @Nonnull CalculatorEventType calculatorEventType,
@Nullable Object data) { @Nullable Object data) {
this.calculatorEventData = calculatorEventData; this.calculatorEventData = calculatorEventData;
this.calculatorEventType = calculatorEventType; this.calculatorEventType = calculatorEventType;
this.data = data; this.data = data;
} }
@Nonnull @Nonnull
public CalculatorEventData getCalculatorEventData() { public CalculatorEventData getCalculatorEventData() {
return calculatorEventData; return calculatorEventData;
} }
@Nonnull @Nonnull
public CalculatorEventType getCalculatorEventType() { public CalculatorEventType getCalculatorEventType() {
return calculatorEventType; return calculatorEventType;
} }
@Nullable @Nullable
public Object getData() { public Object getData() {
return data; return data;
} }
} }
} }

View File

@ -1,100 +1,100 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* User: serso * User: serso
* Date: 10/9/12 * Date: 10/9/12
* Time: 9:59 PM * Time: 9:59 PM
*/ */
public class CalculatorEventHolder { public class CalculatorEventHolder {
@Nonnull @Nonnull
private volatile CalculatorEventData lastEventData; private volatile CalculatorEventData lastEventData;
public CalculatorEventHolder(@Nonnull CalculatorEventData lastEventData) { public CalculatorEventHolder(@Nonnull CalculatorEventData lastEventData) {
this.lastEventData = lastEventData; this.lastEventData = lastEventData;
} }
@Nonnull @Nonnull
public synchronized CalculatorEventData getLastEventData() { public synchronized CalculatorEventData getLastEventData() {
return lastEventData; return lastEventData;
} }
@Nonnull @Nonnull
public synchronized Result apply(@Nonnull CalculatorEventData newEventData) { public synchronized Result apply(@Nonnull CalculatorEventData newEventData) {
final Result result = new Result(lastEventData, newEventData); final Result result = new Result(lastEventData, newEventData);
if (result.isNewAfter()) { if (result.isNewAfter()) {
this.lastEventData = newEventData; this.lastEventData = newEventData;
} }
return result; return result;
} }
public static class Result { public static class Result {
@Nonnull @Nonnull
private final CalculatorEventData lastEventData; private final CalculatorEventData lastEventData;
@Nonnull @Nonnull
private final CalculatorEventData newEventData; private final CalculatorEventData newEventData;
@Nullable @Nullable
private Boolean after = null; private Boolean after = null;
@Nullable @Nullable
private Boolean sameSequence = null; private Boolean sameSequence = null;
public Result(@Nonnull CalculatorEventData lastEventData, public Result(@Nonnull CalculatorEventData lastEventData,
@Nonnull CalculatorEventData newEventData) { @Nonnull CalculatorEventData newEventData) {
this.lastEventData = lastEventData; this.lastEventData = lastEventData;
this.newEventData = newEventData; this.newEventData = newEventData;
} }
public boolean isNewAfter() { public boolean isNewAfter() {
if (after == null) { if (after == null) {
after = newEventData.isAfter(lastEventData); after = newEventData.isAfter(lastEventData);
} }
return after; return after;
} }
public boolean isSameSequence() { public boolean isSameSequence() {
if (sameSequence == null) { if (sameSequence == null) {
sameSequence = newEventData.isSameSequence(lastEventData); sameSequence = newEventData.isSameSequence(lastEventData);
} }
return sameSequence; return sameSequence;
} }
public boolean isNewAfterSequence() { public boolean isNewAfterSequence() {
return newEventData.isAfterSequence(lastEventData); return newEventData.isAfterSequence(lastEventData);
} }
public boolean isNewSameOrAfterSequence() { public boolean isNewSameOrAfterSequence() {
return isSameSequence() || isNewAfterSequence(); return isSameSequence() || isNewAfterSequence();
} }
} }
} }

View File

@ -1,39 +1,39 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import java.util.EventListener; import java.util.EventListener;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* User: Solovyev_S * User: Solovyev_S
* Date: 20.09.12 * Date: 20.09.12
* Time: 16:39 * Time: 16:39
*/ */
public interface CalculatorEventListener extends EventListener { public interface CalculatorEventListener extends EventListener {
void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data); void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data);
} }

View File

@ -1,47 +1,47 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* User: serso * User: serso
* Date: 9/22/12 * Date: 9/22/12
* Time: 1:08 PM * Time: 1:08 PM
*/ */
public interface CalculatorKeyboard { public interface CalculatorKeyboard {
boolean buttonPressed(@Nullable String text); boolean buttonPressed(@Nullable String text);
void roundBracketsButtonPressed(); void roundBracketsButtonPressed();
void pasteButtonPressed(); void pasteButtonPressed();
void clearButtonPressed(); void clearButtonPressed();
void copyButtonPressed(); void copyButtonPressed();
void moveCursorLeft(); void moveCursorLeft();
void moveCursorRight(); void moveCursorRight();
} }

View File

@ -1,108 +1,108 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import org.solovyev.common.msg.Message; import org.solovyev.common.msg.Message;
import org.solovyev.common.msg.MessageLevel; import org.solovyev.common.msg.MessageLevel;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* User: serso * User: serso
* Date: 10/6/11 * Date: 10/6/11
* Time: 9:25 PM * Time: 9:25 PM
*/ */
public class CalculatorParseException extends Exception implements Message { public class CalculatorParseException extends Exception implements Message {
@Nonnull @Nonnull
private final Message message; private final Message message;
@Nonnull @Nonnull
private final String expression; private final String expression;
@Nullable @Nullable
private final Integer position; private final Integer position;
public CalculatorParseException(@Nonnull jscl.text.ParseException jsclParseException) { public CalculatorParseException(@Nonnull jscl.text.ParseException jsclParseException) {
this.message = jsclParseException; this.message = jsclParseException;
this.expression = jsclParseException.getExpression(); this.expression = jsclParseException.getExpression();
this.position = jsclParseException.getPosition(); this.position = jsclParseException.getPosition();
} }
public CalculatorParseException(@Nullable Integer position, public CalculatorParseException(@Nullable Integer position,
@Nonnull String expression, @Nonnull String expression,
@Nonnull Message message) { @Nonnull Message message) {
this.message = message; this.message = message;
this.expression = expression; this.expression = expression;
this.position = position; this.position = position;
} }
public CalculatorParseException(@Nonnull String expression, public CalculatorParseException(@Nonnull String expression,
@Nonnull Message message) { @Nonnull Message message) {
this(null, expression, message); this(null, expression, message);
} }
@Nonnull @Nonnull
public String getExpression() { public String getExpression() {
return expression; return expression;
} }
@Nullable @Nullable
public Integer getPosition() { public Integer getPosition() {
return position; return position;
} }
@Nonnull @Nonnull
@Override @Override
public String getMessageCode() { public String getMessageCode() {
return this.message.getMessageCode(); return this.message.getMessageCode();
} }
@Nonnull @Nonnull
@Override @Override
public List<Object> getParameters() { public List<Object> getParameters() {
return this.message.getParameters(); return this.message.getParameters();
} }
@Nonnull @Nonnull
@Override @Override
public MessageLevel getMessageLevel() { public MessageLevel getMessageLevel() {
return this.message.getMessageLevel(); return this.message.getMessageLevel();
} }
@Override @Override
@Nonnull @Nonnull
public String getLocalizedMessage() { public String getLocalizedMessage() {
return this.message.getLocalizedMessage(Locale.getDefault()); return this.message.getLocalizedMessage(Locale.getDefault());
} }
@Nonnull @Nonnull
@Override @Override
public String getLocalizedMessage(@Nonnull Locale locale) { public String getLocalizedMessage(@Nonnull Locale locale) {
return this.message.getLocalizedMessage(locale); return this.message.getLocalizedMessage(locale);
} }
} }

View File

@ -1,153 +1,153 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import org.solovyev.android.calculator.model.MathEntityBuilder; import org.solovyev.android.calculator.model.MathEntityBuilder;
import org.solovyev.android.calculator.model.Var; import org.solovyev.android.calculator.model.Var;
import org.solovyev.android.calculator.model.Vars; import org.solovyev.android.calculator.model.Vars;
import org.solovyev.common.JBuilder; import org.solovyev.common.JBuilder;
import org.solovyev.common.math.MathEntity; import org.solovyev.common.math.MathEntity;
import org.solovyev.common.math.MathRegistry; import org.solovyev.common.math.MathRegistry;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import jscl.math.function.IConstant; import jscl.math.function.IConstant;
/** /**
* User: serso * User: serso
* Date: 9/29/11 * Date: 9/29/11
* Time: 4:57 PM * Time: 4:57 PM
*/ */
public class CalculatorVarsRegistry extends AbstractCalculatorMathRegistry<IConstant, Var> { public class CalculatorVarsRegistry extends AbstractCalculatorMathRegistry<IConstant, Var> {
@Nonnull @Nonnull
public static final String ANS = "ans"; public static final String ANS = "ans";
@Nonnull @Nonnull
private static final Map<String, String> substitutes = new HashMap<String, String>(); private static final Map<String, String> substitutes = new HashMap<String, String>();
static { static {
substitutes.put("π", "pi"); substitutes.put("π", "pi");
substitutes.put("Π", "PI"); substitutes.put("Π", "PI");
substitutes.put("", "inf"); substitutes.put("", "inf");
substitutes.put("h", "h_reduced"); substitutes.put("h", "h_reduced");
substitutes.put("NaN", "nan"); substitutes.put("NaN", "nan");
} }
public CalculatorVarsRegistry(@Nonnull MathRegistry<IConstant> mathRegistry, public CalculatorVarsRegistry(@Nonnull MathRegistry<IConstant> mathRegistry,
@Nonnull MathEntityDao<Var> mathEntityDao) { @Nonnull MathEntityDao<Var> mathEntityDao) {
super(mathRegistry, "c_var_description_", mathEntityDao); super(mathRegistry, "c_var_description_", mathEntityDao);
} }
public static <T extends MathEntity> void saveVariable(@Nonnull CalculatorMathRegistry<T> registry, public static <T extends MathEntity> void saveVariable(@Nonnull CalculatorMathRegistry<T> registry,
@Nonnull MathEntityBuilder<? extends T> builder, @Nonnull MathEntityBuilder<? extends T> builder,
@Nullable T editedInstance, @Nullable T editedInstance,
@Nonnull Object source, boolean save) { @Nonnull Object source, boolean save) {
final T addedVar = registry.add(builder); final T addedVar = registry.add(builder);
if (save) { if (save) {
registry.save(); registry.save();
} }
if (editedInstance == null) { if (editedInstance == null) {
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.constant_added, addedVar, source); Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.constant_added, addedVar, source);
} else { } else {
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.constant_changed, ChangeImpl.newInstance(editedInstance, addedVar), source); Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.constant_changed, ChangeImpl.newInstance(editedInstance, addedVar), source);
} }
} }
@Nonnull @Nonnull
@Override @Override
protected Map<String, String> getSubstitutes() { protected Map<String, String> getSubstitutes() {
return substitutes; return substitutes;
} }
public synchronized void load() { public synchronized void load() {
super.load(); super.load();
tryToAddAuxVar("x"); tryToAddAuxVar("x");
tryToAddAuxVar("y"); tryToAddAuxVar("y");
tryToAddAuxVar("t"); tryToAddAuxVar("t");
tryToAddAuxVar("j"); tryToAddAuxVar("j");
/*Log.d(AndroidVarsRegistry.class.getName(), vars.size() + " variables registered!"); /*Log.d(AndroidVarsRegistry.class.getName(), vars.size() + " variables registered!");
for (Var var : vars) { for (Var var : vars) {
Log.d(AndroidVarsRegistry.class.getName(), var.toString()); Log.d(AndroidVarsRegistry.class.getName(), var.toString());
}*/ }*/
} }
@Nonnull @Nonnull
@Override @Override
protected JBuilder<? extends IConstant> createBuilder(@Nonnull Var entity) { protected JBuilder<? extends IConstant> createBuilder(@Nonnull Var entity) {
return new Var.Builder(entity); return new Var.Builder(entity);
} }
@Nonnull @Nonnull
@Override @Override
protected MathEntityPersistenceContainer<Var> createPersistenceContainer() { protected MathEntityPersistenceContainer<Var> createPersistenceContainer() {
return new Vars(); return new Vars();
} }
private void tryToAddAuxVar(@Nonnull String name) { private void tryToAddAuxVar(@Nonnull String name) {
if (!contains(name)) { if (!contains(name)) {
add(new Var.Builder(name, (String) null)); add(new Var.Builder(name, (String) null));
} }
} }
@Nonnull @Nonnull
@Override @Override
protected Var transform(@Nonnull IConstant entity) { protected Var transform(@Nonnull IConstant entity) {
if (entity instanceof Var) { if (entity instanceof Var) {
return (Var) entity; return (Var) entity;
} else { } else {
return new Var.Builder(entity).create(); return new Var.Builder(entity).create();
} }
} }
@Override @Override
public String getDescription(@Nonnull String mathEntityName) { public String getDescription(@Nonnull String mathEntityName) {
final IConstant var = get(mathEntityName); final IConstant var = get(mathEntityName);
if (var != null && !var.isSystem()) { if (var != null && !var.isSystem()) {
return var.getDescription(); return var.getDescription();
} else { } else {
return super.getDescription(mathEntityName); return super.getDescription(mathEntityName);
} }
} }
@Override @Override
public String getCategory(@Nonnull IConstant var) { public String getCategory(@Nonnull IConstant var) {
for (VarCategory category : VarCategory.values()) { for (VarCategory category : VarCategory.values()) {
if (category.isInCategory(var)) { if (category.isInCategory(var)) {
return category.name(); return category.name();
} }
} }
return null; return null;
} }
} }

View File

@ -1,36 +1,36 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
/** /**
* User: Solovyev_S * User: Solovyev_S
* Date: 24.09.12 * Date: 24.09.12
* Time: 16:12 * Time: 16:12
*/ */
public interface ConversionFailure { public interface ConversionFailure {
@Nonnull @Nonnull
Exception getException(); Exception getException();
} }

View File

@ -1,46 +1,46 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
/** /**
* User: Solovyev_S * User: Solovyev_S
* Date: 24.09.12 * Date: 24.09.12
* Time: 16:12 * Time: 16:12
*/ */
public class ConversionFailureImpl implements ConversionFailure { public class ConversionFailureImpl implements ConversionFailure {
@Nonnull @Nonnull
private Exception exception; private Exception exception;
public ConversionFailureImpl(@Nonnull Exception exception) { public ConversionFailureImpl(@Nonnull Exception exception) {
this.exception = exception; this.exception = exception;
} }
@Nonnull @Nonnull
@Override @Override
public Exception getException() { public Exception getException() {
return this.exception; return this.exception;
} }
} }

View File

@ -1,43 +1,43 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* User: serso * User: serso
* Date: 12/17/11 * Date: 12/17/11
* Time: 9:37 PM * Time: 9:37 PM
*/ */
public interface Editor { public interface Editor {
@Nullable @Nullable
CharSequence getText(); CharSequence getText();
void setText(@Nullable CharSequence text); void setText(@Nullable CharSequence text);
int getSelection(); int getSelection();
void setSelection(int selection); void setSelection(int selection);
} }

View File

@ -1,82 +1,82 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import java.util.List; import java.util.List;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import jscl.math.function.IConstant; import jscl.math.function.IConstant;
/** /**
* User: serso * User: serso
* Date: 10/18/11 * Date: 10/18/11
* Time: 10:07 PM * Time: 10:07 PM
*/ */
public class PreparedExpression implements CharSequence { public class PreparedExpression implements CharSequence {
@Nonnull @Nonnull
private String expression; private String expression;
@Nonnull @Nonnull
private List<IConstant> undefinedVars; private List<IConstant> undefinedVars;
public PreparedExpression(@Nonnull String expression, @Nonnull List<IConstant> undefinedVars) { public PreparedExpression(@Nonnull String expression, @Nonnull List<IConstant> undefinedVars) {
this.expression = expression; this.expression = expression;
this.undefinedVars = undefinedVars; this.undefinedVars = undefinedVars;
} }
@Nonnull @Nonnull
public String getExpression() { public String getExpression() {
return expression; return expression;
} }
public boolean isExistsUndefinedVar() { public boolean isExistsUndefinedVar() {
return !this.undefinedVars.isEmpty(); return !this.undefinedVars.isEmpty();
} }
@Nonnull @Nonnull
public List<IConstant> getUndefinedVars() { public List<IConstant> getUndefinedVars() {
return undefinedVars; return undefinedVars;
} }
@Override @Override
public int length() { public int length() {
return expression.length(); return expression.length();
} }
@Override @Override
public char charAt(int i) { public char charAt(int i) {
return expression.charAt(i); return expression.charAt(i);
} }
@Override @Override
public CharSequence subSequence(int i, int i1) { public CharSequence subSequence(int i, int i1) {
return expression.subSequence(i, i1); return expression.subSequence(i, i1);
} }
@Override @Override
public String toString() { public String toString() {
return this.expression; return this.expression;
} }
} }

View File

@ -1,97 +1,97 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator.history; package org.solovyev.android.calculator.history;
import org.simpleframework.xml.Element; import org.simpleframework.xml.Element;
import org.simpleframework.xml.Transient; import org.simpleframework.xml.Transient;
import java.util.Date; import java.util.Date;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* User: serso * User: serso
* Date: 10/15/11 * Date: 10/15/11
* Time: 1:45 PM * Time: 1:45 PM
*/ */
public class AbstractHistoryState implements Cloneable { public class AbstractHistoryState implements Cloneable {
@Element @Element
private long time = new Date().getTime(); private long time = new Date().getTime();
@Element(required = false) @Element(required = false)
@Nullable @Nullable
private String comment; private String comment;
@Transient @Transient
private boolean saved; private boolean saved;
@Transient @Transient
private int id = 0; private int id = 0;
public int getId() { public int getId() {
return id; return id;
} }
public void setId(int id) { public void setId(int id) {
this.id = id; this.id = id;
} }
public long getTime() { public long getTime() {
return time; return time;
} }
public void setTime(long time) { public void setTime(long time) {
this.time = time; this.time = time;
} }
@Nullable @Nullable
public String getComment() { public String getComment() {
return comment; return comment;
} }
public void setComment(@Nullable String comment) { public void setComment(@Nullable String comment) {
this.comment = comment; this.comment = comment;
} }
public boolean isSaved() { public boolean isSaved() {
return saved; return saved;
} }
public void setSaved(boolean saved) { public void setSaved(boolean saved) {
this.saved = saved; this.saved = saved;
} }
@Override @Override
protected AbstractHistoryState clone() { protected AbstractHistoryState clone() {
AbstractHistoryState clone; AbstractHistoryState clone;
try { try {
clone = (AbstractHistoryState) super.clone(); clone = (AbstractHistoryState) super.clone();
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
throw new UnsupportedOperationException(e); throw new UnsupportedOperationException(e);
} }
return clone; return clone;
} }
} }

View File

@ -1,161 +1,161 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator.history; package org.solovyev.android.calculator.history;
import org.simpleframework.xml.Element; import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root; import org.simpleframework.xml.Root;
import org.simpleframework.xml.Transient; import org.simpleframework.xml.Transient;
import org.solovyev.android.calculator.CalculatorDisplay; import org.solovyev.android.calculator.CalculatorDisplay;
import org.solovyev.android.calculator.CalculatorDisplayViewState; import org.solovyev.android.calculator.CalculatorDisplayViewState;
import org.solovyev.android.calculator.CalculatorDisplayViewStateImpl; import org.solovyev.android.calculator.CalculatorDisplayViewStateImpl;
import org.solovyev.android.calculator.jscl.JsclOperation; import org.solovyev.android.calculator.jscl.JsclOperation;
import org.solovyev.common.text.Strings; import org.solovyev.common.text.Strings;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import jscl.math.Generic; import jscl.math.Generic;
/** /**
* User: serso * User: serso
* Date: 9/17/11 * Date: 9/17/11
* Time: 11:05 PM * Time: 11:05 PM
*/ */
@Root @Root
public class CalculatorDisplayHistoryState implements Cloneable { public class CalculatorDisplayHistoryState implements Cloneable {
@Transient @Transient
private boolean valid = true; private boolean valid = true;
@Transient @Transient
@Nullable @Nullable
private String errorMessage = null; private String errorMessage = null;
@Element @Element
@Nonnull @Nonnull
private EditorHistoryState editorState; private EditorHistoryState editorState;
@Element @Element
@Nonnull @Nonnull
private JsclOperation jsclOperation; private JsclOperation jsclOperation;
@Transient @Transient
@Nullable @Nullable
private Generic genericResult; private Generic genericResult;
private CalculatorDisplayHistoryState() { private CalculatorDisplayHistoryState() {
// for xml // for xml
} }
@Nonnull @Nonnull
public static CalculatorDisplayHistoryState newInstance(@Nonnull CalculatorDisplayViewState viewState) { public static CalculatorDisplayHistoryState newInstance(@Nonnull CalculatorDisplayViewState viewState) {
final CalculatorDisplayHistoryState result = new CalculatorDisplayHistoryState(); final CalculatorDisplayHistoryState result = new CalculatorDisplayHistoryState();
result.editorState = EditorHistoryState.newInstance(viewState); result.editorState = EditorHistoryState.newInstance(viewState);
result.valid = viewState.isValid(); result.valid = viewState.isValid();
result.jsclOperation = viewState.getOperation(); result.jsclOperation = viewState.getOperation();
result.genericResult = viewState.getResult(); result.genericResult = viewState.getResult();
result.errorMessage = viewState.getErrorMessage(); result.errorMessage = viewState.getErrorMessage();
return result; return result;
} }
public void setValuesFromHistory(@Nonnull CalculatorDisplay display) { public void setValuesFromHistory(@Nonnull CalculatorDisplay display) {
if (this.isValid()) { if (this.isValid()) {
display.setViewState(CalculatorDisplayViewStateImpl.newValidState(this.getJsclOperation(), this.getGenericResult(), Strings.getNotEmpty(this.getEditorState().getText(), ""), this.getEditorState().getCursorPosition())); display.setViewState(CalculatorDisplayViewStateImpl.newValidState(this.getJsclOperation(), this.getGenericResult(), Strings.getNotEmpty(this.getEditorState().getText(), ""), this.getEditorState().getCursorPosition()));
} else { } else {
display.setViewState(CalculatorDisplayViewStateImpl.newErrorState(this.getJsclOperation(), Strings.getNotEmpty(this.getErrorMessage(), ""))); display.setViewState(CalculatorDisplayViewStateImpl.newErrorState(this.getJsclOperation(), Strings.getNotEmpty(this.getErrorMessage(), "")));
} }
} }
public boolean isValid() { public boolean isValid() {
return valid; return valid;
} }
@Nonnull @Nonnull
public EditorHistoryState getEditorState() { public EditorHistoryState getEditorState() {
return editorState; return editorState;
} }
@Nonnull @Nonnull
public JsclOperation getJsclOperation() { public JsclOperation getJsclOperation() {
return jsclOperation; return jsclOperation;
} }
@Nullable @Nullable
public String getErrorMessage() { public String getErrorMessage() {
return errorMessage; return errorMessage;
} }
@Nullable @Nullable
public Generic getGenericResult() { public Generic getGenericResult() {
return genericResult; return genericResult;
} }
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
CalculatorDisplayHistoryState that = (CalculatorDisplayHistoryState) o; CalculatorDisplayHistoryState that = (CalculatorDisplayHistoryState) o;
if (!editorState.equals(that.editorState)) return false; if (!editorState.equals(that.editorState)) return false;
if (jsclOperation != that.jsclOperation) return false; if (jsclOperation != that.jsclOperation) return false;
return true; return true;
} }
@Override @Override
public int hashCode() { public int hashCode() {
int result = editorState.hashCode(); int result = editorState.hashCode();
result = 31 * result + jsclOperation.hashCode(); result = 31 * result + jsclOperation.hashCode();
return result; return result;
} }
@Override @Override
public String toString() { public String toString() {
return "CalculatorDisplayHistoryState{" + return "CalculatorDisplayHistoryState{" +
"valid=" + valid + "valid=" + valid +
", errorMessage='" + errorMessage + '\'' + ", errorMessage='" + errorMessage + '\'' +
", editorHistoryState=" + editorState + ", editorHistoryState=" + editorState +
", jsclOperation=" + jsclOperation + ", jsclOperation=" + jsclOperation +
'}'; '}';
} }
@Override @Override
protected CalculatorDisplayHistoryState clone() { protected CalculatorDisplayHistoryState clone() {
try { try {
final CalculatorDisplayHistoryState clone = (CalculatorDisplayHistoryState) super.clone(); final CalculatorDisplayHistoryState clone = (CalculatorDisplayHistoryState) super.clone();
clone.editorState = this.editorState.clone(); clone.editorState = this.editorState.clone();
return clone; return clone;
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
} }

View File

@ -1,63 +1,63 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator.history; package org.solovyev.android.calculator.history;
import org.solovyev.android.calculator.CalculatorEventListener; import org.solovyev.android.calculator.CalculatorEventListener;
import org.solovyev.common.history.HistoryHelper; import org.solovyev.common.history.HistoryHelper;
import java.util.List; import java.util.List;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
/** /**
* User: Solovyev_S * User: Solovyev_S
* Date: 20.09.12 * Date: 20.09.12
* Time: 16:11 * Time: 16:11
*/ */
public interface CalculatorHistory extends HistoryHelper<CalculatorHistoryState>, CalculatorEventListener { public interface CalculatorHistory extends HistoryHelper<CalculatorHistoryState>, CalculatorEventListener {
void load(); void load();
void save(); void save();
void fromXml(@Nonnull String xml); void fromXml(@Nonnull String xml);
String toXml(); String toXml();
void clearSavedHistory(); void clearSavedHistory();
void removeSavedHistory(@Nonnull CalculatorHistoryState historyState); void removeSavedHistory(@Nonnull CalculatorHistoryState historyState);
@Nonnull @Nonnull
List<CalculatorHistoryState> getSavedHistory(); List<CalculatorHistoryState> getSavedHistory();
@Nonnull @Nonnull
CalculatorHistoryState addSavedState(@Nonnull CalculatorHistoryState historyState); CalculatorHistoryState addSavedState(@Nonnull CalculatorHistoryState historyState);
@Nonnull @Nonnull
List<CalculatorHistoryState> getStates(); List<CalculatorHistoryState> getStates();
@Nonnull @Nonnull
List<CalculatorHistoryState> getStates(boolean includeIntermediateStates); List<CalculatorHistoryState> getStates(boolean includeIntermediateStates);
} }

View File

@ -1,292 +1,292 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator.history; package org.solovyev.android.calculator.history;
import org.solovyev.android.calculator.Calculator; import org.solovyev.android.calculator.Calculator;
import org.solovyev.android.calculator.CalculatorDisplayChangeEventData; import org.solovyev.android.calculator.CalculatorDisplayChangeEventData;
import org.solovyev.android.calculator.CalculatorDisplayViewState; import org.solovyev.android.calculator.CalculatorDisplayViewState;
import org.solovyev.android.calculator.CalculatorEditorChangeEventData; import org.solovyev.android.calculator.CalculatorEditorChangeEventData;
import org.solovyev.android.calculator.CalculatorEditorViewState; import org.solovyev.android.calculator.CalculatorEditorViewState;
import org.solovyev.android.calculator.CalculatorEventData; import org.solovyev.android.calculator.CalculatorEventData;
import org.solovyev.android.calculator.CalculatorEventHolder; import org.solovyev.android.calculator.CalculatorEventHolder;
import org.solovyev.android.calculator.CalculatorEventType; import org.solovyev.android.calculator.CalculatorEventType;
import org.solovyev.android.calculator.CalculatorUtils; import org.solovyev.android.calculator.CalculatorUtils;
import org.solovyev.android.calculator.Locator; import org.solovyev.android.calculator.Locator;
import org.solovyev.common.history.HistoryAction; import org.solovyev.common.history.HistoryAction;
import org.solovyev.common.history.HistoryHelper; import org.solovyev.common.history.HistoryHelper;
import org.solovyev.common.history.SimpleHistoryHelper; import org.solovyev.common.history.SimpleHistoryHelper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import static org.solovyev.android.calculator.CalculatorEventType.display_state_changed; import static org.solovyev.android.calculator.CalculatorEventType.display_state_changed;
import static org.solovyev.android.calculator.CalculatorEventType.editor_state_changed; import static org.solovyev.android.calculator.CalculatorEventType.editor_state_changed;
import static org.solovyev.android.calculator.CalculatorEventType.manual_calculation_requested; import static org.solovyev.android.calculator.CalculatorEventType.manual_calculation_requested;
/** /**
* User: Solovyev_S * User: Solovyev_S
* Date: 20.09.12 * Date: 20.09.12
* Time: 16:12 * Time: 16:12
*/ */
public class CalculatorHistoryImpl implements CalculatorHistory { public class CalculatorHistoryImpl implements CalculatorHistory {
private final AtomicInteger counter = new AtomicInteger(0); private final AtomicInteger counter = new AtomicInteger(0);
@Nonnull @Nonnull
private final HistoryHelper<CalculatorHistoryState> history = SimpleHistoryHelper.newInstance(); private final HistoryHelper<CalculatorHistoryState> history = SimpleHistoryHelper.newInstance();
@Nonnull @Nonnull
private final List<CalculatorHistoryState> savedHistory = new ArrayList<CalculatorHistoryState>(); private final List<CalculatorHistoryState> savedHistory = new ArrayList<CalculatorHistoryState>();
@Nonnull @Nonnull
private final CalculatorEventHolder lastEventData = new CalculatorEventHolder(CalculatorUtils.createFirstEventDataId()); private final CalculatorEventHolder lastEventData = new CalculatorEventHolder(CalculatorUtils.createFirstEventDataId());
@Nullable @Nullable
private volatile CalculatorEditorViewState lastEditorViewState; private volatile CalculatorEditorViewState lastEditorViewState;
public CalculatorHistoryImpl(@Nonnull Calculator calculator) { public CalculatorHistoryImpl(@Nonnull Calculator calculator) {
calculator.addCalculatorEventListener(this); calculator.addCalculatorEventListener(this);
} }
@Override @Override
public boolean isEmpty() { public boolean isEmpty() {
synchronized (history) { synchronized (history) {
return this.history.isEmpty(); return this.history.isEmpty();
} }
} }
@Override @Override
public CalculatorHistoryState getLastHistoryState() { public CalculatorHistoryState getLastHistoryState() {
synchronized (history) { synchronized (history) {
return this.history.getLastHistoryState(); return this.history.getLastHistoryState();
} }
} }
@Override @Override
public boolean isUndoAvailable() { public boolean isUndoAvailable() {
synchronized (history) { synchronized (history) {
return history.isUndoAvailable(); return history.isUndoAvailable();
} }
} }
@Override @Override
public CalculatorHistoryState undo(@Nullable CalculatorHistoryState currentState) { public CalculatorHistoryState undo(@Nullable CalculatorHistoryState currentState) {
synchronized (history) { synchronized (history) {
return history.undo(currentState); return history.undo(currentState);
} }
} }
@Override @Override
public boolean isRedoAvailable() { public boolean isRedoAvailable() {
return history.isRedoAvailable(); return history.isRedoAvailable();
} }
@Override @Override
public CalculatorHistoryState redo(@Nullable CalculatorHistoryState currentState) { public CalculatorHistoryState redo(@Nullable CalculatorHistoryState currentState) {
synchronized (history) { synchronized (history) {
return history.redo(currentState); return history.redo(currentState);
} }
} }
@Override @Override
public boolean isActionAvailable(@Nonnull HistoryAction historyAction) { public boolean isActionAvailable(@Nonnull HistoryAction historyAction) {
synchronized (history) { synchronized (history) {
return history.isActionAvailable(historyAction); return history.isActionAvailable(historyAction);
} }
} }
@Override @Override
public CalculatorHistoryState doAction(@Nonnull HistoryAction historyAction, @Nullable CalculatorHistoryState currentState) { public CalculatorHistoryState doAction(@Nonnull HistoryAction historyAction, @Nullable CalculatorHistoryState currentState) {
synchronized (history) { synchronized (history) {
return history.doAction(historyAction, currentState); return history.doAction(historyAction, currentState);
} }
} }
@Override @Override
public void addState(@Nullable CalculatorHistoryState currentState) { public void addState(@Nullable CalculatorHistoryState currentState) {
synchronized (history) { synchronized (history) {
history.addState(currentState); history.addState(currentState);
Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.history_state_added, currentState); Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.history_state_added, currentState);
} }
} }
@Nonnull @Nonnull
@Override @Override
public List<CalculatorHistoryState> getStates() { public List<CalculatorHistoryState> getStates() {
synchronized (history) { synchronized (history) {
return history.getStates(); return history.getStates();
} }
} }
@Nonnull @Nonnull
@Override @Override
public List<CalculatorHistoryState> getStates(boolean includeIntermediateStates) { public List<CalculatorHistoryState> getStates(boolean includeIntermediateStates) {
synchronized (history) { synchronized (history) {
if (includeIntermediateStates) { if (includeIntermediateStates) {
return getStates(); return getStates();
} else { } else {
final List<CalculatorHistoryState> states = getStates(); final List<CalculatorHistoryState> states = getStates();
final List<CalculatorHistoryState> result = new LinkedList<CalculatorHistoryState>(); final List<CalculatorHistoryState> result = new LinkedList<CalculatorHistoryState>();
CalculatorHistoryState laterState = null; CalculatorHistoryState laterState = null;
for (CalculatorHistoryState state : org.solovyev.common.collections.Collections.reversed(states)) { for (CalculatorHistoryState state : org.solovyev.common.collections.Collections.reversed(states)) {
if (laterState != null) { if (laterState != null) {
final String laterEditorText = laterState.getEditorState().getText(); final String laterEditorText = laterState.getEditorState().getText();
final String editorText = state.getEditorState().getText(); final String editorText = state.getEditorState().getText();
if (laterEditorText != null && editorText != null && isIntermediate(laterEditorText, editorText)) { if (laterEditorText != null && editorText != null && isIntermediate(laterEditorText, editorText)) {
// intermediate result => skip from add // intermediate result => skip from add
} else { } else {
result.add(0, state); result.add(0, state);
} }
} else { } else {
result.add(0, state); result.add(0, state);
} }
laterState = state; laterState = state;
} }
return result; return result;
} }
} }
} }
private boolean isIntermediate(@Nonnull String laterEditorText, private boolean isIntermediate(@Nonnull String laterEditorText,
@Nonnull String editorText) { @Nonnull String editorText) {
if (Math.abs(laterEditorText.length() - editorText.length()) <= 1) { if (Math.abs(laterEditorText.length() - editorText.length()) <= 1) {
if (laterEditorText.length() > editorText.length()) { if (laterEditorText.length() > editorText.length()) {
return laterEditorText.startsWith(editorText); return laterEditorText.startsWith(editorText);
} else { } else {
return editorText.startsWith(laterEditorText); return editorText.startsWith(laterEditorText);
} }
} }
return false; return false;
} }
@Override @Override
public void clear() { public void clear() {
synchronized (history) { synchronized (history) {
this.history.clear(); this.history.clear();
} }
} }
@Override @Override
@Nonnull @Nonnull
public List<CalculatorHistoryState> getSavedHistory() { public List<CalculatorHistoryState> getSavedHistory() {
return Collections.unmodifiableList(savedHistory); return Collections.unmodifiableList(savedHistory);
} }
@Override @Override
@Nonnull @Nonnull
public CalculatorHistoryState addSavedState(@Nonnull CalculatorHistoryState historyState) { public CalculatorHistoryState addSavedState(@Nonnull CalculatorHistoryState historyState) {
if (historyState.isSaved()) { if (historyState.isSaved()) {
return historyState; return historyState;
} else { } else {
final CalculatorHistoryState savedState = historyState.clone(); final CalculatorHistoryState savedState = historyState.clone();
savedState.setId(counter.incrementAndGet()); savedState.setId(counter.incrementAndGet());
savedState.setSaved(true); savedState.setSaved(true);
savedHistory.add(savedState); savedHistory.add(savedState);
return savedState; return savedState;
} }
} }
@Override @Override
public void load() { public void load() {
// todo serso: create saved/loader class // todo serso: create saved/loader class
} }
@Override @Override
public void save() { public void save() {
// todo serso: create saved/loader class // todo serso: create saved/loader class
} }
@Override @Override
public void fromXml(@Nonnull String xml) { public void fromXml(@Nonnull String xml) {
clearSavedHistory(); clearSavedHistory();
HistoryUtils.fromXml(xml, this.savedHistory); HistoryUtils.fromXml(xml, this.savedHistory);
for (CalculatorHistoryState historyState : savedHistory) { for (CalculatorHistoryState historyState : savedHistory) {
historyState.setSaved(true); historyState.setSaved(true);
historyState.setId(counter.incrementAndGet()); historyState.setId(counter.incrementAndGet());
} }
} }
@Override @Override
public String toXml() { public String toXml() {
return HistoryUtils.toXml(this.savedHistory); return HistoryUtils.toXml(this.savedHistory);
} }
@Override @Override
public void clearSavedHistory() { public void clearSavedHistory() {
this.savedHistory.clear(); this.savedHistory.clear();
} }
@Override @Override
public void removeSavedHistory(@Nonnull CalculatorHistoryState historyState) { public void removeSavedHistory(@Nonnull CalculatorHistoryState historyState) {
this.savedHistory.remove(historyState); this.savedHistory.remove(historyState);
} }
@Override @Override
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData,
@Nonnull CalculatorEventType calculatorEventType, @Nonnull CalculatorEventType calculatorEventType,
@Nullable Object data) { @Nullable Object data) {
if (calculatorEventType.isOfType(editor_state_changed, display_state_changed, manual_calculation_requested)) { if (calculatorEventType.isOfType(editor_state_changed, display_state_changed, manual_calculation_requested)) {
final CalculatorEventHolder.Result result = lastEventData.apply(calculatorEventData); final CalculatorEventHolder.Result result = lastEventData.apply(calculatorEventData);
if (result.isNewAfter() && result.isNewSameOrAfterSequence()) { if (result.isNewAfter() && result.isNewSameOrAfterSequence()) {
switch (calculatorEventType) { switch (calculatorEventType) {
case manual_calculation_requested: case manual_calculation_requested:
lastEditorViewState = (CalculatorEditorViewState) data; lastEditorViewState = (CalculatorEditorViewState) data;
break; break;
case editor_state_changed: case editor_state_changed:
final CalculatorEditorChangeEventData editorChangeData = (CalculatorEditorChangeEventData) data; final CalculatorEditorChangeEventData editorChangeData = (CalculatorEditorChangeEventData) data;
lastEditorViewState = editorChangeData.getNewValue(); lastEditorViewState = editorChangeData.getNewValue();
break; break;
case display_state_changed: case display_state_changed:
if (result.isSameSequence()) { if (result.isSameSequence()) {
if (lastEditorViewState != null) { if (lastEditorViewState != null) {
final CalculatorEditorViewState editorViewState = lastEditorViewState; final CalculatorEditorViewState editorViewState = lastEditorViewState;
final CalculatorDisplayChangeEventData displayChangeData = (CalculatorDisplayChangeEventData) data; final CalculatorDisplayChangeEventData displayChangeData = (CalculatorDisplayChangeEventData) data;
final CalculatorDisplayViewState displayViewState = displayChangeData.getNewValue(); final CalculatorDisplayViewState displayViewState = displayChangeData.getNewValue();
addState(CalculatorHistoryState.newInstance(editorViewState, displayViewState)); addState(CalculatorHistoryState.newInstance(editorViewState, displayViewState));
} }
} else { } else {
lastEditorViewState = null; lastEditorViewState = null;
} }
break; break;
} }
} }
} }
} }
} }

View File

@ -1,49 +1,49 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator.history; package org.solovyev.android.calculator.history;
import org.simpleframework.xml.ElementList; import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root; import org.simpleframework.xml.Root;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* User: serso * User: serso
* Date: 12/17/11 * Date: 12/17/11
* Time: 9:30 PM * Time: 9:30 PM
*/ */
@Root @Root
public class History { public class History {
@ElementList(type = CalculatorHistoryState.class) @ElementList(type = CalculatorHistoryState.class)
private List<CalculatorHistoryState> historyItems = new ArrayList<CalculatorHistoryState>(); private List<CalculatorHistoryState> historyItems = new ArrayList<CalculatorHistoryState>();
public History() { public History() {
} }
public List<CalculatorHistoryState> getHistoryItems() { public List<CalculatorHistoryState> getHistoryItems() {
return historyItems; return historyItems;
} }
} }

View File

@ -1,78 +1,78 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator.history; package org.solovyev.android.calculator.history;
import org.simpleframework.xml.Serializer; import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister; import org.simpleframework.xml.core.Persister;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.List; import java.util.List;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* User: serso * User: serso
* Date: 12/17/11 * Date: 12/17/11
* Time: 9:59 PM * Time: 9:59 PM
*/ */
class HistoryUtils { class HistoryUtils {
// not intended for instantiation // not intended for instantiation
private HistoryUtils() { private HistoryUtils() {
throw new AssertionError(); throw new AssertionError();
} }
public static void fromXml(@Nullable String xml, @Nonnull List<CalculatorHistoryState> historyItems) { public static void fromXml(@Nullable String xml, @Nonnull List<CalculatorHistoryState> historyItems) {
if (xml != null) { if (xml != null) {
final Serializer serializer = new Persister(); final Serializer serializer = new Persister();
try { try {
final History history = serializer.read(History.class, xml); final History history = serializer.read(History.class, xml);
for (CalculatorHistoryState historyItem : history.getHistoryItems()) { for (CalculatorHistoryState historyItem : history.getHistoryItems()) {
historyItems.add(historyItem); historyItems.add(historyItem);
} }
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
} }
@Nonnull @Nonnull
public static String toXml(@Nonnull List<CalculatorHistoryState> historyItems) { public static String toXml(@Nonnull List<CalculatorHistoryState> historyItems) {
final History history = new History(); final History history = new History();
for (CalculatorHistoryState historyState : historyItems) { for (CalculatorHistoryState historyState : historyItems) {
if (historyState.isSaved()) { if (historyState.isSaved()) {
history.getHistoryItems().add(historyState); history.getHistoryItems().add(historyState);
} }
} }
final StringWriter xml = new StringWriter(); final StringWriter xml = new StringWriter();
final Serializer serializer = new Persister(); final Serializer serializer = new Persister();
try { try {
serializer.write(history, xml); serializer.write(history, xml);
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
return xml.toString(); return xml.toString();
} }
} }

View File

@ -1,46 +1,46 @@
/* /*
* Copyright 2013 serso aka se.solovyev * Copyright 2013 serso aka se.solovyev
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
* *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details * Contact details
* *
* Email: se.solovyev@gmail.com * Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org * Site: http://se.solovyev.org
*/ */
package org.solovyev.android.calculator.jscl; package org.solovyev.android.calculator.jscl;
import org.solovyev.android.calculator.CalculatorParseException; import org.solovyev.android.calculator.CalculatorParseException;
import org.solovyev.android.calculator.text.TextProcessor; import org.solovyev.android.calculator.text.TextProcessor;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import jscl.math.Generic; import jscl.math.Generic;
/** /**
* User: serso * User: serso
* Date: 10/6/11 * Date: 10/6/11
* Time: 9:48 PM * Time: 9:48 PM
*/ */
class FromJsclNumericTextProcessor implements TextProcessor<String, Generic> { class FromJsclNumericTextProcessor implements TextProcessor<String, Generic> {
public static final FromJsclNumericTextProcessor instance = new FromJsclNumericTextProcessor(); public static final FromJsclNumericTextProcessor instance = new FromJsclNumericTextProcessor();
@Nonnull @Nonnull
@Override @Override
public String process(@Nonnull Generic numeric) throws CalculatorParseException { public String process(@Nonnull Generic numeric) throws CalculatorParseException {
return numeric.toString().replace("*", ""); return numeric.toString().replace("*", "");
} }
} }

Some files were not shown because too many files have changed in this diff Show More