diff --git a/res/layout/navigate.xml b/res/layout/navigate.xml
new file mode 100644
index 0000000..7a586a8
--- /dev/null
+++ b/res/layout/navigate.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b1c616e..3d77d33 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2,8 +2,10 @@
RpyPlayer. Everlasting Summer
Действия
+ Навигация
+ - @string/navigate
diff --git a/src/com/annimon/everlastingsummer/Dialogs.java b/src/com/annimon/everlastingsummer/Dialogs.java
index cb875e7..43ef6b7 100644
--- a/src/com/annimon/everlastingsummer/Dialogs.java
+++ b/src/com/annimon/everlastingsummer/Dialogs.java
@@ -35,6 +35,44 @@ public final class Dialogs {
builder.show();
}
+ public void showNavigate() {
+ final View root = LayoutInflater.from(context).inflate(R.layout.navigate, null);
+ final TextView positionIndicator = (TextView) root.findViewById(R.id.position);
+ final SeekBar slider = (SeekBar) root.findViewById(R.id.slider);
+ final TextView text = (TextView) root.findViewById(R.id.text);
+
+ final Parser parser = Parser.getInstance();
+ positionIndicator.setText(String.valueOf(parser.getPosition()));
+ slider.setMax(parser.getTokensCount() - 1);
+ slider.setProgress(parser.getPosition());
+ slider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) { }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) { }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ positionIndicator.setText(String.valueOf(progress));
+ if (progress >= parser.getTokensCount()) return;
+ text.setText(parser.getTokens().get(progress).getText());
+ }
+ } );
+
+ builder.setTitle(R.string.navigate);
+ builder.setView(root);
+ builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ parser.setPosition(slider.getProgress());
+ }
+ });
+ builder.setCancelable(false);
+ builder.show();
+ }
+
private final DialogInterface.OnClickListener dismissDialog = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java
index 7eeb6fd..bac15f8 100644
--- a/src/com/annimon/everlastingsummer/Parser.java
+++ b/src/com/annimon/everlastingsummer/Parser.java
@@ -24,13 +24,32 @@ public final class Parser {
private final List tokens;
+ private final int tokensCount;
private int position;
public Parser(List tokens) {
this.tokens = tokens;
+ tokensCount = tokens.size();
position = 0;
}
+ public List getTokens() {
+ return tokens;
+ }
+
+ public int getTokensCount() {
+ return tokensCount;
+ }
+
+ public int getPosition() {
+ return position;
+ }
+
+ public void setPosition(int position) {
+ this.position = position;
+ next();
+ }
+
public void next() {
// Команды разделяются на терминальные и нетерминальные.
// Нетерминальные подготавливают сцену к выводу.
@@ -264,7 +283,7 @@ public final class Parser {
}
private Token get(int offset) {
- if (position + offset >= tokens.size()) return EOF;
+ if (position + offset >= tokensCount) return EOF;
return tokens.get(position + offset);
}
}