diff options
| -rw-r--r-- | res/layout/go_dialog.xml | 28 | ||||
| -rw-r--r-- | res/menu/options_menu.xml | 2 | ||||
| -rw-r--r-- | res/values/strings.xml | 6 | ||||
| -rw-r--r-- | src/org/madore/android/unicodeMap/UnicodeMapActivity.java | 93 | 
4 files changed, 125 insertions, 4 deletions
| diff --git a/res/layout/go_dialog.xml b/res/layout/go_dialog.xml new file mode 100644 index 0000000..1ee6319 --- /dev/null +++ b/res/layout/go_dialog.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +    android:layout_width="wrap_content" +    android:layout_height="fill_parent" +    android:padding="10dp" +    android:orientation="vertical"> +  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +      android:layout_width="fill_parent" +      android:layout_height="wrap_content" +      android:orientation="horizontal"> +    <TextView +        android:layout_width="wrap_content" +        android:layout_height="wrap_content" +        android:textSize="20sp" +        android:text="U+" /> +    <EditText android:id="@+id/goForm" +        android:layout_width="80sp" +        android:layout_height="wrap_content" /> +    <Button android:id="@+id/goButton" +        android:layout_width="wrap_content" +        android:layout_height="fill_parent" +        android:text="@string/go_button" /> +  </LinearLayout> +  <TextView +      android:layout_width="fill_parent" +      android:layout_height="wrap_content" +      android:text="@string/go_hint" /> +</LinearLayout> diff --git a/res/menu/options_menu.xml b/res/menu/options_menu.xml index 2cb4eb9..d101b1f 100644 --- a/res/menu/options_menu.xml +++ b/res/menu/options_menu.xml @@ -1,5 +1,7 @@  <?xml version="1.0" encoding="utf-8"?>  <menu xmlns:android="http://schemas.android.com/apk/res/android"> +  <item android:id="@+id/menuGo" +      android:title="@string/menu_go" />    <item android:id="@+id/menuSearch"        android:title="@string/menu_search" />    <item android:id="@+id/menuAbout" diff --git a/res/values/strings.xml b/res/values/strings.xml index 6c90667..acdc3e0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7,6 +7,12 @@      <string name="copy_button">Copy</string>      <string name="copied_toast">Copied to clipboard</string>      <string name="empty_list">(Empty!)</string> +    <string name="menu_go">Go</string> +    <string name="go_title">Go to char number</string> +    <string name="go_button">Go</string> +    <string name="go_hint">Enter codepoint (hex)</string> +    <string name="invalid_codepoint">Invalid codepoint</string> +    <string name="no_character">No such character</string>      <string name="menu_search">Search</string>      <string name="search_title">Search in character names</string>      <string name="search_button">Search</string> diff --git a/src/org/madore/android/unicodeMap/UnicodeMapActivity.java b/src/org/madore/android/unicodeMap/UnicodeMapActivity.java index 0c80741..5410b11 100644 --- a/src/org/madore/android/unicodeMap/UnicodeMapActivity.java +++ b/src/org/madore/android/unicodeMap/UnicodeMapActivity.java @@ -379,9 +379,10 @@ public final class UnicodeMapActivity extends ListActivity {  		    if ( ( event.getAction() == KeyEvent.ACTION_DOWN )  			 && ( keyCode == KeyEvent.KEYCODE_ENTER ) ) {  			String s = textForm.getText().toString(); -			if ( ! Pattern.matches("^\\s*$", s) ) +			if ( ! Pattern.matches("^\\s*$", s) ) {  			    doSearch(s); -			dialog.dismiss(); +			    dialog.dismiss(); +			}  			return true;  		    }  		    return false; @@ -391,10 +392,91 @@ public final class UnicodeMapActivity extends ListActivity {  	btn.setOnClickListener(new View.OnClickListener() {  		public void onClick(View view) {  		    String s = textForm.getText().toString(); -		    if ( ! Pattern.matches("^\\s*$", s) ) { +		    if ( ! Pattern.matches("^\\s*$", s) )  			doSearch(s); -			dialog.dismiss(); +		    dialog.dismiss(); +		} +	    }); +	dialog.show(); +    } + +    protected void doGo(String s) { +	try { +	    s = s.replaceAll("\\s+", ""); +	    int code = Integer.parseInt(s, 16); +	    if ( code < 0 || code >= 0x110000 ) +		throw new NumberFormatException(); +	    int codeFrom = Math.max((code&~31)-32, 0); +	    int codeTo = Math.min((code|31)+32, 0x110000); +	    String str = String.format("%04X\u2013%04X", codeFrom, codeTo-1); +	    Display newDisp +		= new RangeDisplay(str, codeFrom, codeTo, rangeLimit); +	    saveDisplay(); +	    doDisplay(newDisp, true); +	    int dichoFrom = 0; +	    int dichoTo = Math.min(codeTo-codeFrom, lv.getAdapter().getCount()); +	    int dicho = Math.max(Math.min(code-codeFrom, dichoTo-1), 0); +	    LOOP: +	    while ( true ) { +		if ( dichoTo <= dichoFrom+1 ) +		    break LOOP; +		UnicodeCharacter chx +		    = (UnicodeCharacter) lv.getAdapter().getItem(dicho); +		int codex = chx.getCodePoint(); +		if ( codex == code ) +		    break LOOP; +		else if ( codex > code ) { +		    dichoTo = dicho; +		    dicho = (dichoFrom+dichoTo)/2; +		} else if ( codex < code ) { +		    dichoFrom = dicho; +		    dicho = (dichoFrom+dichoTo)/2; +		} +	    } +	    lv.setSelectionFromTop(dicho, 0); +	    if ( db.getSingle(code) == null ) +		Toast.makeText(UnicodeMapActivity.this, +			       R.string.no_character, +			       Toast.LENGTH_SHORT).show(); +	} catch (NumberFormatException e) { +	    Toast.makeText(UnicodeMapActivity.this, +			   R.string.invalid_codepoint, +			   Toast.LENGTH_SHORT).show(); +	} +    } + +    protected void queryGo() { +	final Dialog dialog = new Dialog(UnicodeMapActivity.this); +	// dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); +	dialog.setTitle(R.string.go_title); +	dialog.setOwnerActivity(this); +	dialog.setContentView(R.layout.go_dialog); +	dialog.setCancelable(true); +	// dialog.getWindow().setLayout(ViewGroup.LayoutParams.FILL_PARENT, +	// 			     ViewGroup.LayoutParams.WRAP_CONTENT); +	final EditText textForm +	    = (EditText) dialog.findViewById(R.id.goForm); +	textForm.setOnKeyListener(new View.OnKeyListener() { +		public boolean onKey(View view, int keyCode, KeyEvent event) { +		    if ( ( event.getAction() == KeyEvent.ACTION_DOWN ) +			 && ( keyCode == KeyEvent.KEYCODE_ENTER ) ) { +			String s = textForm.getText().toString(); +			if ( ! Pattern.matches("^\\s*$", s) ) { +			    doGo(s); +			    dialog.dismiss(); +			} +			return true;  		    } +		    return false; +		} +	    }); +	final Button btn = (Button) dialog.findViewById(R.id.goButton); +	btn.setOnClickListener(new View.OnClickListener() { +		public void onClick(View view) { +		    String s = textForm.getText().toString(); +		    if ( ! Pattern.matches("^\\s*$", s) ) +			doGo(s); +		    dialog.dismiss();  		}  	    });  	dialog.show(); @@ -432,6 +514,9 @@ public final class UnicodeMapActivity extends ListActivity {      @Override      public boolean onOptionsItemSelected(MenuItem item) {  	switch ( item.getItemId() ) { +	case R.id.menuGo: +	    queryGo(); +	    return true;  	case R.id.menuSearch:  	    querySearch();  	    return true; | 
