Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 102 additions & 20 deletions app/src/main/java/com/totsp/crossword/ClueListActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
import android.inputmethodservice.KeyboardView;
import android.inputmethodservice.KeyboardView.OnKeyboardActionListener;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
Expand All @@ -24,6 +26,8 @@
import android.widget.Toast;

import com.totsp.crossword.io.IO;
import com.totsp.crossword.puz.MovementStrategy;
import com.totsp.crossword.puz.Playboard;
import com.totsp.crossword.puz.Playboard.Position;
import com.totsp.crossword.puz.Playboard.Word;
import com.totsp.crossword.puz.Puzzle;
Expand All @@ -49,6 +53,8 @@ public class ClueListActivity extends ShortyzActivity {
private TabHost tabHost;
private boolean useNativeKeyboard = false;
private PlayboardRenderer renderer;
private static String MENU_JUMP_FORWARD = "Jump Forward";
private static String MENU_JUMP_BACKWARD = "Jump Backward";

@Override
public void onConfigurationChanged(Configuration newConfig) {
Expand All @@ -70,14 +76,35 @@ public void onConfigurationChanged(Configuration newConfig) {
}
}

public boolean onCreateOptionsMenu(Menu menu) {
MenuItem mi;

mi = menu.add(MENU_JUMP_BACKWARD).setIcon(android.R.drawable.arrow_up_float);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
mi.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
mi = menu.add(MENU_JUMP_FORWARD).setIcon(android.R.drawable.arrow_down_float);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
mi.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item == null || item.getItemId() == android.R.id.home) {
finish();
return true;
} else {
return super.onOptionsItemSelected(item);
}
} else if (item.getTitle().toString().equals(MENU_JUMP_FORWARD)) {
jumpToNextUnsolved(true);
render();
return true;
} else if (item.getTitle().toString().equals(MENU_JUMP_BACKWARD)) {
jumpToNextUnsolved(false);
render();
return true;
}
else return super.onOptionsItemSelected(item);
}

@Override
Expand Down Expand Up @@ -255,10 +282,10 @@ public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
arg0.setSelected(true);
ShortyzApplication.BOARD.jumpTo(arg2, true);
imageView.scrollTo(0, 0);
skipFilled();
render();

if (prefs.getBoolean("snapClue", false)) {
across.setSelectionFromTop(arg2, 5);
across.setSelection(arg2);
}
}
Expand All @@ -270,10 +297,10 @@ public void onItemSelected(AdapterView<?> arg0, View arg1,
|| (ShortyzApplication.BOARD.getCurrentClueIndex() != arg2)) {
ShortyzApplication.BOARD.jumpTo(arg2, true);
imageView.scrollTo(0, 0);
skipFilled();
render();

if (prefs.getBoolean("snapClue", false)) {
across.setSelectionFromTop(arg2, 5);
across.setSelection(arg2);
}
}
Expand All @@ -287,10 +314,10 @@ public void onItemClick(AdapterView<?> arg0, View arg1,
final int arg2, long arg3) {
ShortyzApplication.BOARD.jumpTo(arg2, false);
imageView.scrollTo(0, 0);
skipFilled();
render();

if (prefs.getBoolean("snapClue", false)) {
down.setSelectionFromTop(arg2, 5);
down.setSelection(arg2);
}
}
Expand All @@ -303,10 +330,10 @@ public void onItemSelected(AdapterView<?> arg0, View arg1,
|| (ShortyzApplication.BOARD.getCurrentClueIndex() != arg2)) {
ShortyzApplication.BOARD.jumpTo(arg2, false);
imageView.scrollTo(0, 0);
skipFilled();
render();

if (prefs.getBoolean("snapClue", false)) {
down.setSelectionFromTop(arg2, 5);
down.setSelection(arg2);
}
}
Expand All @@ -315,7 +342,26 @@ public void onItemSelected(AdapterView<?> arg0, View arg1,
public void onNothingSelected(AdapterView<?> arg0) {
}
});
this.render();

// Initial position to the clue that is current on the play board
(ShortyzApplication.BOARD.isAcross() ? across : down)
.setSelection(ShortyzApplication.BOARD.getCurrentClueIndex());

ShortyzApplication.BOARD.jumpTo(ShortyzApplication.BOARD.getCurrentClueIndex(),
ShortyzApplication.BOARD.isAcross());

skipFilled();
this.render();
}

private void skipFilled()
{
// Position on the first blank in the current word, or on the first
// character if there is no blank in the word.
Position p = ShortyzApplication.BOARD.getNextBlankOrError();
if (p != null) {
ShortyzApplication.BOARD.setHighlightLetter(p, false);
}
}

@Override
Expand All @@ -337,22 +383,15 @@ public boolean onKeyDown(int keyCode, KeyEvent event) {

case KeyEvent.KEYCODE_DPAD_LEFT:

if (!ShortyzApplication.BOARD.getHighlightLetter().equals(
ShortyzApplication.BOARD.getCurrentWord().start)) {
ShortyzApplication.BOARD.previousLetter();

this.render();
}

MovementStrategy.STOP_ON_END.back(ShortyzApplication.BOARD);
this.render();
return true;

case KeyEvent.KEYCODE_DPAD_RIGHT:

if (!ShortyzApplication.BOARD.getHighlightLetter().equals(last)) {
ShortyzApplication.BOARD.nextLetter();
this.render();
}

MovementStrategy.STOP_ON_END.move(ShortyzApplication.BOARD,
ShortyzApplication.BOARD.isSkipCompletedLetters());
this.render();
return true;

case KeyEvent.KEYCODE_DEL:
Expand Down Expand Up @@ -456,6 +495,49 @@ protected void onPause() {
}
}

public void jumpToNextUnsolved(boolean forward) {
Playboard board = ShortyzApplication.BOARD;

int clue = board.getCurrentClueIndex();
int original_clue = clue;

boolean acr = board.isAcross();
boolean original_acr = acr;

while (true)
{
if (forward) {
if (clue == (acr ? this.across : this.down).getAdapter().getCount() - 1) {
clue = 0;
acr = !acr;
}
else {
clue++;
}
} else {
if (clue == 0) {
acr = !acr;
clue = (acr ? this.across : this.down).getAdapter().getCount() - 1;
} else {
clue--;
}
}
board.jumpTo(clue, acr);
Position p = board.getNextBlankOrError();
if (p != null) {
board.setHighlightLetter(p, false);
imageView.scrollTo(0, 0);
this.tabHost.setCurrentTab(acr ? 0 : 1);
(acr ? across : down).setSelection(clue);
break;
}
if (clue == original_clue && acr == original_acr) {
imageView.scrollTo(0, 0);
break;
}
}
}

private void render() {
if (this.prefs.getBoolean("forceKeyboard", false)
|| (this.configuration.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES)
Expand Down
24 changes: 22 additions & 2 deletions puzlib/src/main/java/com/totsp/crossword/puz/Playboard.java
Original file line number Diff line number Diff line change
Expand Up @@ -221,11 +221,11 @@ public Clue[] getDownClues() {
return clues;
}

public Word setHighlightLetter(Position highlightLetter) {
public Word setHighlightLetter(Position highlightLetter, boolean toggle) {
Word w = this.getCurrentWord();

if (highlightLetter.equals(this.highlightLetter)) {
this.toggleDirection();
if (toggle) this.toggleDirection();
} else {
if ((this.boxes.length > highlightLetter.across) && (highlightLetter.across >= 0) &&
(this.boxes[highlightLetter.across].length > highlightLetter.down) && (highlightLetter.down >= 0) &&
Expand All @@ -237,6 +237,10 @@ public Word setHighlightLetter(Position highlightLetter) {
return w;
}

public Word setHighlightLetter(Position highlightLetter) {
return setHighlightLetter(highlightLetter, true);
}

public Position getHighlightLetter() {
return highlightLetter;
}
Expand Down Expand Up @@ -680,6 +684,22 @@ public void toggleShowErrors() {
this.showErrors = !this.showErrors;
}

// find next blank or error (if showing errors), starting scan at current position
public Position getNextBlankOrError() {
int across = this.highlightLetter.across;
int down = this.highlightLetter.down;
Box b;

while (across < this.puzzle.getWidth() && down < this.puzzle.getHeight()) {
b = this.boxes[across][down];
if (b == null) return null;
if (!skipCurrentBox(b, true)) return new Position(across, down);
if (this.isAcross()) across++; else down++;
}

return null;
}

public static class Clue implements Serializable {
public String hint;
public int number;
Expand Down