diff --git a/DroidFish/res/values/strings.xml b/DroidFish/res/values/strings.xml
index 9d14728..6461453 100644
--- a/DroidFish/res/values/strings.xml
+++ b/DroidFish/res/values/strings.xml
@@ -107,6 +107,7 @@ you are not actively using the program.\
Edit Game
Edit Headers
Edit Comments
+ Add opening name
Go Back
Go Forward
Goto Start of Game
diff --git a/DroidFish/src/org/petero/droidfish/DroidFish.java b/DroidFish/src/org/petero/droidfish/DroidFish.java
index 09e6216..c82198b 100644
--- a/DroidFish/src/org/petero/droidfish/DroidFish.java
+++ b/DroidFish/src/org/petero/droidfish/DroidFish.java
@@ -112,7 +112,6 @@ import android.os.Handler;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.ShareCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v4.view.MotionEventCompat;
@@ -2752,10 +2751,11 @@ public class DroidFish extends Activity
private final Dialog moveListMenuDialog() {
final int EDIT_HEADERS = 0;
final int EDIT_COMMENTS = 1;
- final int REMOVE_SUBTREE = 2;
- final int MOVE_VAR_UP = 3;
- final int MOVE_VAR_DOWN = 4;
- final int ADD_NULL_MOVE = 5;
+ final int ADD_ECO = 2;
+ final int REMOVE_SUBTREE = 3;
+ final int MOVE_VAR_UP = 4;
+ final int MOVE_VAR_DOWN = 5;
+ final int ADD_NULL_MOVE = 6;
setAutoMode(AutoMode.OFF);
List lst = new ArrayList();
@@ -2764,6 +2764,7 @@ public class DroidFish extends Activity
if (ctrl.humansTurn()) {
lst.add(getString(R.string.edit_comments)); actions.add(EDIT_COMMENTS);
}
+ lst.add(getString(R.string.add_eco)); actions.add(ADD_ECO);
lst.add(getString(R.string.truncate_gametree)); actions.add(REMOVE_SUBTREE);
if (ctrl.canMoveVariationUp()) {
lst.add(getString(R.string.move_var_up)); actions.add(MOVE_VAR_UP);
@@ -2867,6 +2868,9 @@ public class DroidFish extends Activity
builder.show();
break;
}
+ case ADD_ECO:
+ ctrl.addECO();
+ break;
case REMOVE_SUBTREE:
ctrl.removeSubTree();
break;
diff --git a/DroidFish/src/org/petero/droidfish/book/EcoDb.java b/DroidFish/src/org/petero/droidfish/book/EcoDb.java
index 5906686..ee3c078 100644
--- a/DroidFish/src/org/petero/droidfish/book/EcoDb.java
+++ b/DroidFish/src/org/petero/droidfish/book/EcoDb.java
@@ -122,7 +122,7 @@ public class EcoDb {
int currEcoNode = 0;
boolean foundDup = false;
while (!treePath.isEmpty()) {
- gt.goForward(treePath.get(treePath.size() - 1));
+ gt.goForward(treePath.get(treePath.size() - 1), false);
treePath.remove(treePath.size() - 1);
int m = gt.currentNode.move.getCompressedMove();
@@ -154,7 +154,7 @@ public class EcoDb {
}
for (int i = treePath.size() - 1; i >= 0; i--)
- gt.goForward(treePath.get(i));
+ gt.goForward(treePath.get(i), false);
for (int i = toCache.size() - 1; i >= 0; i--) {
Pair p = toCache.get(i);
distToEcoTree++;
diff --git a/DroidFish/src/org/petero/droidfish/gamelogic/DroidChessController.java b/DroidFish/src/org/petero/droidfish/gamelogic/DroidChessController.java
index 79eaa77..f0a11a4 100644
--- a/DroidFish/src/org/petero/droidfish/gamelogic/DroidChessController.java
+++ b/DroidFish/src/org/petero/droidfish/gamelogic/DroidChessController.java
@@ -27,6 +27,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.TreeMap;
import org.petero.droidfish.EngineOptions;
import org.petero.droidfish.GUIInterface;
@@ -630,6 +631,18 @@ public class DroidChessController {
updateGUI();
}
+ /** Add ECO classification headers. */
+ public final synchronized void addECO() {
+ EcoDb.Result r = game.tree.getGameECO();
+ Map headers = new TreeMap();
+ headers.put("ECO", r.eco.isEmpty() ? null : r.eco);
+ headers.put("Opening", r.opn.isEmpty() ? null : r.opn);
+ headers.put("Variation", r.var.isEmpty() ? null : r.var);
+ game.tree.setHeaders(headers);
+ gameTextListener.clear();
+ updateGUI();
+ }
+
/** Comments associated with a move. */
public static final class CommentInfo {
public String move;
diff --git a/DroidFish/src/org/petero/droidfish/gamelogic/GameTree.java b/DroidFish/src/org/petero/droidfish/gamelogic/GameTree.java
index 25527d9..35d8cf7 100644
--- a/DroidFish/src/org/petero/droidfish/gamelogic/GameTree.java
+++ b/DroidFish/src/org/petero/droidfish/gamelogic/GameTree.java
@@ -31,6 +31,7 @@ import java.util.Map;
import java.util.Map.Entry;
import org.petero.droidfish.PGNOptions;
+import org.petero.droidfish.book.EcoDb;
import org.petero.droidfish.gamelogic.Game.GameState;
import org.petero.droidfish.gamelogic.TimeControlData.TimeControlField;
@@ -272,6 +273,21 @@ public class GameTree {
return pgnText.getPgnString();
}
+ /** Get ECO classification corresponding to the end of mainline. */
+ public final EcoDb.Result getGameECO() {
+ ArrayList currPath = currentNode.getPathFromRoot();
+ while (currentNode != rootNode)
+ goBack();
+ while (variations().size() > 0)
+ goForward(0, false);
+ EcoDb.Result ecoData = EcoDb.getInstance().getEco(this);
+ while (currentNode != rootNode)
+ goBack();
+ for (int i : currPath)
+ goForward(i, false);
+ return ecoData;
+ }
+
/** Walks the game tree in PGN export order. */
public final void pgnTreeWalker(PGNOptions options, PgnToken.PgnTokenReceiver out) {
// Go to end of mainline to evaluate PGN result string.
@@ -1480,7 +1496,8 @@ public class GameTree {
}
}
- /** Set PGN header tags and values. */
+ /** Set PGN header tags and values. Setting a non-required
+ * tag to null causes it to be removed. */
void setHeaders(Map headers) {
for (Entry entry : headers.entrySet()) {
String tag = entry.getKey();
@@ -1492,19 +1509,28 @@ public class GameTree {
else if (tag.equals("White")) white = val;
else if (tag.equals("Black")) black = val;
else {
- boolean found = false;
- for (TagPair t : tagPairs) {
- if (t.tagName.equals(tag)) {
- t.tagValue = val;
- found = true;
- break;
+ if (val != null) {
+ boolean found = false;
+ for (TagPair t : tagPairs) {
+ if (t.tagName.equals(tag)) {
+ t.tagValue = val;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ TagPair tp = new TagPair();
+ tp.tagName = tag;
+ tp.tagValue = val;
+ tagPairs.add(tp);
+ }
+ } else {
+ for (int i = 0; i < tagPairs.size(); i++) {
+ if (tagPairs.get(i).tagName.equals(tag)) {
+ tagPairs.remove(i);
+ break;
+ }
}
- }
- if (!found) {
- TagPair tp = new TagPair();
- tp.tagName = tag;
- tp.tagValue = val;
- tagPairs.add(tp);
}
}
}