From 0badc913c043b5a9a746f2009154af6f878d07fb Mon Sep 17 00:00:00 2001 From: serso Date: Sun, 10 Jan 2016 13:24:06 +0100 Subject: [PATCH] 1. useHistoryState event type has been removed 2. ContextMenu is now used for context menu in HistoryFragment --- .../org/solovyev/android/calculator/App.java | 5 + .../calculator/CalculatorEventType.java | 3 - .../solovyev/android/calculator/Editor.java | 27 +-- .../solovyev/android/calculator/Locator.java | 2 +- .../history/BaseHistoryFragment.java | 200 ++++++++++++------ .../history/CalculatorHistoryActivity.java | 14 +- .../history/HistoryItemMenuItem.java | 168 --------------- .../android/calculator/EditorTest.java | 2 +- 8 files changed, 148 insertions(+), 273 deletions(-) delete mode 100644 app/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java diff --git a/app/src/main/java/org/solovyev/android/calculator/App.java b/app/src/main/java/org/solovyev/android/calculator/App.java index a9aa629e..af8f82a3 100644 --- a/app/src/main/java/org/solovyev/android/calculator/App.java +++ b/app/src/main/java/org/solovyev/android/calculator/App.java @@ -330,6 +330,11 @@ public final class App { return spannable.toString(); } + @Nonnull + public static Editor getEditor() { + return Locator.getInstance().getEditor(); + } + private static class MyBus extends Bus { @Override public void post(final Object event) { diff --git a/app/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java b/app/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java index 90b03568..0aac8968 100644 --- a/app/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java +++ b/app/src/main/java/org/solovyev/android/calculator/CalculatorEventType.java @@ -91,9 +91,6 @@ public enum CalculatorEventType { // @Nonnull CalculatorHistoryState history_state_added, - // @Nonnull CalculatorHistoryState - use_history_state, - clear_history_requested, /* diff --git a/app/src/main/java/org/solovyev/android/calculator/Editor.java b/app/src/main/java/org/solovyev/android/calculator/Editor.java index 042bc6f2..343e749a 100644 --- a/app/src/main/java/org/solovyev/android/calculator/Editor.java +++ b/app/src/main/java/org/solovyev/android/calculator/Editor.java @@ -24,7 +24,6 @@ package org.solovyev.android.calculator; import org.solovyev.android.Check; import org.solovyev.android.calculator.history.EditorHistoryState; -import org.solovyev.android.calculator.history.HistoryState; import org.solovyev.android.calculator.text.TextProcessor; import org.solovyev.android.calculator.text.TextProcessorEditorResult; import org.solovyev.common.text.Strings; @@ -34,21 +33,17 @@ import javax.annotation.Nullable; import static java.lang.Math.min; -public class Editor implements CalculatorEventListener { +public class Editor { private static final String TAG = App.subTag("Editor"); - @Nonnull - private final CalculatorEventHolder lastEventHolder; @Nullable private final TextProcessor textProcessor; @Nullable private EditorView view; @Nonnull private EditorState state = EditorState.empty(); - public Editor(@Nonnull Calculator calculator, @Nullable TextProcessor textProcessor) { + public Editor(@Nullable TextProcessor textProcessor) { this.textProcessor = textProcessor; - calculator.addCalculatorEventListener(this); - this.lastEventHolder = new CalculatorEventHolder(CalculatorUtils.createFirstEventDataId()); } public static int clamp(int selection, @Nonnull CharSequence text) { @@ -108,22 +103,10 @@ public class Editor implements CalculatorEventListener { return state; } - @Override - public void onCalculatorEvent(@Nonnull CalculatorEventData evenData, - @Nonnull CalculatorEventType eventType, - @Nullable Object data) { + @Nonnull + public EditorState setState(@Nonnull EditorHistoryState state) { Check.isMainThread(); - final CalculatorEventHolder.Result result = lastEventHolder.apply(evenData); - - if (result.isNewAfter()) { - switch (eventType) { - case use_history_state: - final HistoryState historyState = (HistoryState) data; - final EditorHistoryState editorState = historyState.getEditorState(); - this.setText(Strings.getNotEmpty(editorState.getText(), ""), editorState.getCursorPosition()); - break; - } - } + return setText(Strings.getNotEmpty(state.getText(), ""), state.getCursorPosition()); } @Nonnull diff --git a/app/src/main/java/org/solovyev/android/calculator/Locator.java b/app/src/main/java/org/solovyev/android/calculator/Locator.java index 0a7d50a6..2c0d475c 100644 --- a/app/src/main/java/org/solovyev/android/calculator/Locator.java +++ b/app/src/main/java/org/solovyev/android/calculator/Locator.java @@ -92,7 +92,7 @@ public class Locator implements CalculatorLocator { this.calculatorPreferenceService = preferenceService; this.calculatorPlotter = plotter; - editor = new Editor(this.calculator, editorTextProcessor); + editor = new Editor(editorTextProcessor); display = new Display(this.calculator); calculatorKeyboard = keyboard; } diff --git a/app/src/main/java/org/solovyev/android/calculator/history/BaseHistoryFragment.java b/app/src/main/java/org/solovyev/android/calculator/history/BaseHistoryFragment.java index b98aa3ff..d9b890b1 100644 --- a/app/src/main/java/org/solovyev/android/calculator/history/BaseHistoryFragment.java +++ b/app/src/main/java/org/solovyev/android/calculator/history/BaseHistoryFragment.java @@ -22,6 +22,7 @@ package org.solovyev.android.calculator.history; +import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; @@ -31,16 +32,17 @@ import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.FragmentActivity; import android.support.v4.app.ListFragment; +import android.text.ClipboardManager; import android.util.Log; +import android.view.ContextMenu; import android.view.*; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.ListView; +import android.widget.*; import com.melnykov.fab.FloatingActionButton; import org.solovyev.android.calculator.*; import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.jscl.JsclOperation; import org.solovyev.android.menu.*; +import org.solovyev.android.plotter.Check; import org.solovyev.common.JPredicate; import org.solovyev.common.collections.Collections; import org.solovyev.common.equals.Equalizer; @@ -54,18 +56,11 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import static android.view.Menu.NONE; import static org.solovyev.android.calculator.CalculatorEventType.clear_history_requested; public abstract class BaseHistoryFragment extends ListFragment implements CalculatorEventListener { - /* - ********************************************************************** - * - * CONSTANTS - * - ********************************************************************** - */ - public static final Comparator COMPARATOR = new Comparator() { @Override public int compare(HistoryState state1, HistoryState state2) { @@ -109,7 +104,7 @@ public abstract class BaseHistoryFragment extends ListFragment implements Calcul } public static boolean isAlreadySaved(@Nonnull HistoryState historyState) { - if (historyState.isSaved()) throw new AssertionError(); + Check.isTrue(!historyState.isSaved()); boolean result = false; try { @@ -131,10 +126,6 @@ public abstract class BaseHistoryFragment extends ListFragment implements Calcul return result; } - public static void useHistoryItem(@Nonnull final HistoryState state) { - Locator.getInstance().getCalculator().fireCalculatorEvent(CalculatorEventType.use_history_state, state); - } - @Nonnull public static String getHistoryText(@Nonnull HistoryState state) { final StringBuilder result = new StringBuilder(); @@ -152,6 +143,14 @@ public abstract class BaseHistoryFragment extends ListFragment implements Calcul return jsclOperation == JsclOperation.simplify ? "≡" : "="; } + public void useState(@Nonnull final HistoryState state) { + App.getEditor().setState(state.getEditorState()); + final FragmentActivity activity = getActivity(); + if (!(activity instanceof CalculatorActivity)) { + activity.finish(); + } + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -201,42 +200,11 @@ public abstract class BaseHistoryFragment extends ListFragment implements Calcul final View view, final int position, final long id) { - - useHistoryItem((HistoryState) parent.getItemAtPosition(position)); + useState((HistoryState) parent.getItemAtPosition(position)); } }); - lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, final int position, long id) { - final HistoryState historyState = (HistoryState) parent.getItemAtPosition(position); - - final FragmentActivity activity = getActivity(); - - final HistoryItemMenuData data = new HistoryItemMenuData(historyState, adapter); - - final List menuItems = Collections.asList(HistoryItemMenuItem.values()); - - if (historyState.isSaved()) { - menuItems.remove(HistoryItemMenuItem.save); - } else { - if (isAlreadySaved(historyState)) { - menuItems.remove(HistoryItemMenuItem.save); - } - menuItems.remove(HistoryItemMenuItem.remove); - menuItems.remove(HistoryItemMenuItem.edit); - } - - if (historyState.getDisplayState().isValid() && Strings.isEmpty(historyState.getDisplayState().getEditorState().getText())) { - menuItems.remove(HistoryItemMenuItem.copy_result); - } - - final ContextMenuBuilder menuBuilder = ContextMenuBuilder.newInstance(activity, "history-menu", ListContextMenu.newInstance(menuItems)); - menuBuilder.build(data).show(); - - return true; - } - }); + registerForContextMenu(lv); } @Override @@ -249,6 +217,124 @@ public abstract class BaseHistoryFragment extends ListFragment implements Calcul PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(preferencesListener); } + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; + final HistoryState state = (HistoryState) getListView().getItemAtPosition(info.position); + + if (state.isSaved()) { + menu.add(NONE, R.string.c_use, NONE, R.string.c_use); + menu.add(NONE, R.string.c_copy_expression, NONE, R.string.c_copy_expression); + if (shouldHaveCopyResult(state)) { + menu.add(NONE, R.string.c_copy_result, NONE, R.string.c_copy_result); + } + menu.add(NONE, R.string.c_edit, NONE, R.string.c_edit); + menu.add(NONE, R.string.c_remove, NONE, R.string.c_remove); + } else { + menu.add(NONE, R.string.c_use, NONE, R.string.c_use); + menu.add(NONE, R.string.c_copy_expression, NONE, R.string.c_copy_expression); + if (shouldHaveCopyResult(state)) { + menu.add(NONE, R.string.c_copy_result, NONE, R.string.c_copy_result); + } + if (!isAlreadySaved(state)) { + menu.add(NONE, R.string.c_save, NONE, R.string.c_save); + } + } + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + final Context context = getActivity(); + final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); + final HistoryState state = (HistoryState) getListView().getItemAtPosition(info.position); + + switch (item.getItemId()) { + case R.string.c_use: + useState(state); + return true; + case R.string.c_copy_expression: + final String editorText = state.getEditorState().getText(); + if (!Strings.isEmpty(editorText)) { + final ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Activity.CLIPBOARD_SERVICE); + clipboard.setText(editorText); + Toast.makeText(context, context.getText(R.string.c_expression_copied), Toast.LENGTH_SHORT).show(); + } + return true; + case R.string.c_copy_result: + final String displayText = state.getDisplayState().getEditorState().getText(); + if (!Strings.isEmpty(displayText)) { + final ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Activity.CLIPBOARD_SERVICE); + clipboard.setText(displayText); + Toast.makeText(context, context.getText(R.string.c_result_copied), Toast.LENGTH_SHORT).show(); + } + return true; + case R.string.c_save: + if (!state.isSaved()) { + createEditHistoryDialog(state, context, true); + } else { + Toast.makeText(context, context.getText(R.string.c_history_already_saved), Toast.LENGTH_LONG).show(); + } + return true; + case R.string.c_edit: + if (state.isSaved()) { + createEditHistoryDialog(state, context, false); + } else { + Toast.makeText(context, context.getText(R.string.c_history_must_be_saved), Toast.LENGTH_LONG).show(); + } + return true; + case R.string.c_remove: + if (state.isSaved()) { + getAdapter().remove(state); + Locator.getInstance().getHistory().removeSavedHistory(state); + Toast.makeText(context, context.getText(R.string.c_history_was_removed), Toast.LENGTH_LONG).show(); + getAdapter().notifyDataSetChanged(); + } + return true; + + } + return super.onContextItemSelected(item); + } + + private void createEditHistoryDialog(@Nonnull final HistoryState state, @Nonnull final Context context, final boolean save) { + final LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + final View editView = layoutInflater.inflate(R.layout.history_edit, null); + final TextView historyExpression = (TextView) editView.findViewById(R.id.history_edit_expression); + historyExpression.setText(BaseHistoryFragment.getHistoryText(state)); + + final EditText comment = (EditText) editView.findViewById(R.id.history_edit_comment); + comment.setText(state.getComment()); + + final AlertDialog.Builder builder = new AlertDialog.Builder(context) + .setTitle(save ? R.string.c_save_history : R.string.c_edit_history) + .setCancelable(true) + .setNegativeButton(R.string.c_cancel, null) + .setPositiveButton(R.string.c_save, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (save) { + final HistoryState savedHistoryItem = Locator.getInstance().getHistory().addSavedState(state); + savedHistoryItem.setComment(comment.getText().toString()); + Locator.getInstance().getHistory().save(); + // we don't need to add element to the adapter as adapter of another activity must be updated and not this + //data.getAdapter().add(savedHistoryItem); + } else { + state.setComment(comment.getText().toString()); + Locator.getInstance().getHistory().save(); + } + getAdapter().notifyDataSetChanged(); + Toast.makeText(context, context.getText(R.string.c_history_saved), Toast.LENGTH_LONG).show(); + } + }) + .setView(editView); + + builder.create().show(); + } + + private boolean shouldHaveCopyResult(@Nonnull HistoryState state) { + return !state.getDisplayState().isValid() || !Strings.isEmpty(state.getDisplayState().getEditorState().getText()); + } + @Override public void onPause() { PreferenceManager.getDefaultSharedPreferences(getActivity()).unregisterOnSharedPreferenceChangeListener(preferencesListener); @@ -353,14 +439,6 @@ public abstract class BaseHistoryFragment extends ListFragment implements Calcul } - /* - ********************************************************************** - * - * MENU - * - ********************************************************************** - */ - @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { this.menu.onCreateOptionsMenu(this.getActivity(), menu); @@ -425,14 +503,6 @@ public abstract class BaseHistoryFragment extends ListFragment implements Calcul } } - /* - ********************************************************************** - * - * STATIC/INNER - * - ********************************************************************** - */ - private final class HistoryOnPreferenceChangeListener implements SharedPreferences.OnSharedPreferenceChangeListener { @Override diff --git a/app/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java b/app/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java index 7e3e8c7e..da47244f 100644 --- a/app/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java +++ b/app/src/main/java/org/solovyev/android/calculator/history/CalculatorHistoryActivity.java @@ -23,20 +23,15 @@ package org.solovyev.android.calculator.history; import android.os.Bundle; - import org.solovyev.android.calculator.BaseActivity; -import org.solovyev.android.calculator.CalculatorEventData; -import org.solovyev.android.calculator.CalculatorEventListener; -import org.solovyev.android.calculator.CalculatorEventType; import org.solovyev.android.calculator.R; -import javax.annotation.Nonnull; import javax.annotation.Nullable; import static org.solovyev.android.calculator.CalculatorFragmentType.history; import static org.solovyev.android.calculator.CalculatorFragmentType.saved_history; -public class CalculatorHistoryActivity extends BaseActivity implements CalculatorEventListener { +public class CalculatorHistoryActivity extends BaseActivity { public CalculatorHistoryActivity() { super(R.layout.main_empty, CalculatorHistoryActivity.class.getSimpleName()); @@ -49,11 +44,4 @@ public class CalculatorHistoryActivity extends BaseActivity implements Calculato ui.addTab(this, history, null, R.id.main_layout); ui.addTab(this, saved_history, null, R.id.main_layout); } - - @Override - public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) { - if (calculatorEventType == CalculatorEventType.use_history_state) { - this.finish(); - } - } } diff --git a/app/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java b/app/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java deleted file mode 100644 index c4368da2..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/history/HistoryItemMenuItem.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2013 serso aka se.solovyev - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Contact details - * - * Email: se.solovyev@gmail.com - * Site: http://se.solovyev.org - */ - -package org.solovyev.android.calculator.history; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.text.ClipboardManager; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.Toast; - -import org.solovyev.android.calculator.Locator; -import org.solovyev.android.calculator.R; -import org.solovyev.android.menu.LabeledMenuItem; -import org.solovyev.common.text.Strings; - -import javax.annotation.Nonnull; - -/** - * User: serso - * Date: 12/18/11 - * Time: 3:09 PM - */ -public enum HistoryItemMenuItem implements LabeledMenuItem { - - use(R.string.c_use) { - @Override - public void onClick(@Nonnull HistoryItemMenuData data, @Nonnull Context context) { - BaseHistoryFragment.useHistoryItem(data.getHistoryState()); - } - }, - - copy_expression(R.string.c_copy_expression) { - @Override - public void onClick(@Nonnull HistoryItemMenuData data, @Nonnull Context context) { - final HistoryState historyState = data.getHistoryState(); - final String text = historyState.getEditorState().getText(); - if (!Strings.isEmpty(text)) { - final ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Activity.CLIPBOARD_SERVICE); - clipboard.setText(text); - Toast.makeText(context, context.getText(R.string.c_expression_copied), Toast.LENGTH_SHORT).show(); - } - } - }, - - copy_result(R.string.c_copy_result) { - @Override - public void onClick(@Nonnull HistoryItemMenuData data, @Nonnull Context context) { - final HistoryState historyState = data.getHistoryState(); - final String text = historyState.getDisplayState().getEditorState().getText(); - if (!Strings.isEmpty(text)) { - final ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Activity.CLIPBOARD_SERVICE); - clipboard.setText(text); - Toast.makeText(context, context.getText(R.string.c_result_copied), Toast.LENGTH_SHORT).show(); - } - } - }, - - save(R.string.c_save) { - @Override - public void onClick(@Nonnull final HistoryItemMenuData data, @Nonnull final Context context) { - final HistoryState historyState = data.getHistoryState(); - if (!historyState.isSaved()) { - createEditHistoryDialog(data, context, true); - } else { - Toast.makeText(context, context.getText(R.string.c_history_already_saved), Toast.LENGTH_LONG).show(); - } - } - }, - - edit(R.string.c_edit) { - @Override - public void onClick(@Nonnull final HistoryItemMenuData data, @Nonnull final Context context) { - final HistoryState historyState = data.getHistoryState(); - if (historyState.isSaved()) { - createEditHistoryDialog(data, context, false); - } else { - Toast.makeText(context, context.getText(R.string.c_history_must_be_saved), Toast.LENGTH_LONG).show(); - } - } - }, - - remove(R.string.c_remove) { - @Override - public void onClick(@Nonnull HistoryItemMenuData data, @Nonnull Context context) { - final HistoryState historyState = data.getHistoryState(); - if (historyState.isSaved()) { - data.getAdapter().remove(historyState); - Locator.getInstance().getHistory().removeSavedHistory(historyState); - Toast.makeText(context, context.getText(R.string.c_history_was_removed), Toast.LENGTH_LONG).show(); - data.getAdapter().notifyDataSetChanged(); - } - } - }; - - private final int captionId; - - private HistoryItemMenuItem(int captionId) { - this.captionId = captionId; - } - - private static void createEditHistoryDialog(@Nonnull final HistoryItemMenuData data, @Nonnull final Context context, final boolean save) { - final HistoryState historyState = data.getHistoryState(); - - final LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - final View editView = layoutInflater.inflate(R.layout.history_edit, null); - final TextView historyExpression = (TextView) editView.findViewById(R.id.history_edit_expression); - historyExpression.setText(BaseHistoryFragment.getHistoryText(historyState)); - - final EditText comment = (EditText) editView.findViewById(R.id.history_edit_comment); - comment.setText(historyState.getComment()); - - final AlertDialog.Builder builder = new AlertDialog.Builder(context) - .setTitle(save ? R.string.c_save_history : R.string.c_edit_history) - .setCancelable(true) - .setNegativeButton(R.string.c_cancel, null) - .setPositiveButton(R.string.c_save, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (save) { - final HistoryState savedHistoryItem = Locator.getInstance().getHistory().addSavedState(historyState); - savedHistoryItem.setComment(comment.getText().toString()); - Locator.getInstance().getHistory().save(); - // we don't need to add element to the adapter as adapter of another activity must be updated and not this - //data.getAdapter().add(savedHistoryItem); - } else { - historyState.setComment(comment.getText().toString()); - Locator.getInstance().getHistory().save(); - } - data.getAdapter().notifyDataSetChanged(); - Toast.makeText(context, context.getText(R.string.c_history_saved), Toast.LENGTH_LONG).show(); - } - }) - .setView(editView); - - builder.create().show(); - } - - @Nonnull - @Override - public String getCaption(@Nonnull Context context) { - return context.getString(captionId); - } -} diff --git a/app/src/test/java/org/solovyev/android/calculator/EditorTest.java b/app/src/test/java/org/solovyev/android/calculator/EditorTest.java index 4310ec58..a2c9c877 100644 --- a/app/src/test/java/org/solovyev/android/calculator/EditorTest.java +++ b/app/src/test/java/org/solovyev/android/calculator/EditorTest.java @@ -41,7 +41,7 @@ public class EditorTest extends AbstractCalculatorTest { @Before public void setUp() throws Exception { super.setUp(); - this.editor = new Editor(Locator.getInstance().getCalculator(), null); + this.editor = new Editor(null); } @Test