From 735f5ff76f79ca53a1b2ed8cc0e13a75c9a01f5d Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Thu, 15 Nov 2018 10:33:31 +0100 Subject: [PATCH] Remove `src/ui` folder, moved to: https://github.com/GrammaticalFramework/gf-offline-translator --- .gitignore | 2 - index.html | 2 +- src/server/lighttpd.conf | 6 +- src/ui/android/.classpath | 9 - src/ui/android/.project | 33 - src/ui/android/AndroidManifest.xml | 63 - src/ui/android/LICENSE | 27 - src/ui/android/README | 68 - src/ui/android/ant.properties | 2 - src/ui/android/assets/help_content.html | 157 -- src/ui/android/assets/phrases.xml | 1035 --------- src/ui/android/build.xml | 92 - src/ui/android/gf-translator-alignment.dot | 60 - src/ui/android/gf-translator.svg | 28 - src/ui/android/glosses.hs | 46 - src/ui/android/hlc.svg | 10 - src/ui/android/jni/Android.mk | 28 - src/ui/android/jni/Application.mk | 3 - src/ui/android/proguard-project.txt | 20 - src/ui/android/project.properties | 14 - .../android/res/drawable-hdpi/btn_close.png | Bin 2220 -> 0 bytes .../android/res/drawable-hdpi/close_arrow.png | Bin 9643 -> 0 bytes .../res/drawable-hdpi/ic_action_switch.png | Bin 436 -> 0 bytes src/ui/android/res/drawable-hdpi/ic_app.png | Bin 2458 -> 0 bytes .../android/res/drawable-hdpi/ic_drawer.png | Bin 2829 -> 0 bytes .../android/res/drawable-hdpi/ic_keyboard.png | Bin 695 -> 0 bytes src/ui/android/res/drawable-hdpi/ic_mic.png | Bin 665 -> 0 bytes .../drawable-hdpi/ic_search_black_24dp.png | Bin 390 -> 0 bytes .../android/res/drawable-hdpi/open_arrow.png | Bin 8107 -> 0 bytes .../res/drawable-hdpi/sym_keyboard_delete.png | Bin 885 -> 0 bytes .../res/drawable-hdpi/sym_keyboard_return.png | Bin 536 -> 0 bytes .../res/drawable-hdpi/sym_keyboard_search.png | Bin 1623 -> 0 bytes .../res/drawable-hdpi/sym_keyboard_shift.png | Bin 1247 -> 0 bytes .../res/drawable-hdpi/sym_keyboard_space.png | Bin 859 -> 0 bytes .../res/drawable-mdpi/ic_action_switch.png | Bin 327 -> 0 bytes src/ui/android/res/drawable-mdpi/ic_app.png | Bin 1502 -> 0 bytes .../android/res/drawable-mdpi/ic_drawer.png | Bin 2820 -> 0 bytes src/ui/android/res/drawable-mdpi/ic_mic.png | Bin 437 -> 0 bytes .../drawable-mdpi/ic_search_black_24dp.png | Bin 249 -> 0 bytes .../res/drawable-mdpi/sym_keyboard_delete.png | Bin 465 -> 0 bytes .../res/drawable-mdpi/sym_keyboard_done.png | Bin 771 -> 0 bytes .../res/drawable-mdpi/sym_keyboard_return.png | Bin 337 -> 0 bytes .../res/drawable-mdpi/sym_keyboard_search.png | Bin 1029 -> 0 bytes .../res/drawable-mdpi/sym_keyboard_shift.png | Bin 1029 -> 0 bytes .../res/drawable-mdpi/sym_keyboard_space.png | Bin 436 -> 0 bytes .../res/drawable-xhdpi/ic_action_switch.png | Bin 547 -> 0 bytes src/ui/android/res/drawable-xhdpi/ic_app.png | Bin 3672 -> 0 bytes .../res/drawable-xhdpi/ic_dictionary.png | Bin 3591 -> 0 bytes .../android/res/drawable-xhdpi/ic_drawer.png | Bin 2836 -> 0 bytes src/ui/android/res/drawable-xhdpi/ic_mic.png | Bin 783 -> 0 bytes .../drawable-xhdpi/ic_search_black_24dp.png | Bin 464 -> 0 bytes src/ui/android/res/drawable-xxhdpi/ic_app.png | Bin 6265 -> 0 bytes .../android/res/drawable-xxhdpi/ic_drawer.png | Bin 202 -> 0 bytes .../drawable-xxhdpi/ic_search_black_24dp.png | Bin 684 -> 0 bytes .../drawable-xxxhdpi/ic_search_black_24dp.png | Bin 868 -> 0 bytes .../drawable/first_person_utterance_bg.xml | 6 - .../res/drawable/grid_phrasebook_button.xml | 7 - .../res/drawable/ic_volume_up_black_18dp.png | Bin 282 -> 0 bytes .../second_person_best_utterance_bg.xml | 6 - .../second_person_chunk_utterance_bg.xml | 6 - .../drawable/second_person_utterance_bg.xml | 6 - .../second_person_worst_utterance_bg.xml | 6 - src/ui/android/res/layout/activity_help.xml | 11 - .../res/layout/activity_lexical_entry.xml | 80 - src/ui/android/res/layout/activity_main.xml | 91 - .../res/layout/activity_navigation.xml | 16 - .../res/layout/activity_semantic_graph.xml | 61 - .../android/res/layout/alternative_item.xml | 36 - .../res/layout/checkbox_input_list_item.xml | 13 - .../res/layout/first_person_utterance.xml | 11 - .../res/layout/fragment_phrase_list.xml | 16 - .../res/layout/fragment_translator.xml | 60 - src/ui/android/res/layout/input.xml | 9 - .../res/layout/keyboard_languages_options.xml | 20 - src/ui/android/res/layout/languages_item.xml | 8 - src/ui/android/res/layout/lexical_item.xml | 27 - .../res/layout/number_input_list_item.xml | 28 - .../android/res/layout/phrase_list_item.xml | 13 - .../res/layout/second_person_utterance.xml | 12 - .../res/layout/spinner_input_list_item.xml | 19 - src/ui/android/res/menu/main.xml | 10 - src/ui/android/res/values-sw600dp/dimens.xml | 8 - .../res/values-sw720dp-land/dimens.xml | 9 - src/ui/android/res/values-v11/styles.xml | 11 - src/ui/android/res/values-v14/styles.xml | 12 - src/ui/android/res/values/attrs.xml | 6 - src/ui/android/res/values/colors.xml | 9 - src/ui/android/res/values/dimens.xml | 10 - src/ui/android/res/values/strings.xml | 38 - src/ui/android/res/values/styles.xml | 24 - src/ui/android/res/xml/cyrillic.xml | 76 - src/ui/android/res/xml/devanagari_page1.xml | 67 - src/ui/android/res/xml/devanagari_page2.xml | 67 - src/ui/android/res/xml/method.xml | 6 - src/ui/android/res/xml/nordic.xml | 77 - src/ui/android/res/xml/popup_keyboard.xml | 5 - src/ui/android/res/xml/qwerty.xml | 74 - src/ui/android/res/xml/searchable.xml | 8 - src/ui/android/res/xml/symbols_page1.xml | 73 - src/ui/android/res/xml/symbols_page2.xml | 71 - src/ui/android/res/xml/thai_page1.xml | 86 - src/ui/android/res/xml/thai_page2.xml | 83 - .../grammaticalframework/ui/android/ASR.java | 240 -- .../ui/android/AlternativesActivity.java | 674 ------ .../ui/android/CompletionsView.java | 291 --- .../ui/android/ConversationView.java | 242 -- .../ui/android/GFTranslator.java | 22 - .../ui/android/HelpActivity.java | 15 - .../ui/android/Language.java | 62 - .../ui/android/LanguageSelector.java | 55 - .../ui/android/LanguagesAdapter.java | 16 - .../ui/android/LexiconSuggestionProvider.java | 52 - .../ui/android/LocaleUtils.java | 42 - .../ui/android/MainActivity.java | 377 ---- .../ui/android/ParseTreeView.java | 270 --- .../ui/android/RotationGestureDetector.java | 109 - .../ui/android/SemanticGraph.java | 235 -- .../ui/android/SemanticGraphActivity.java | 102 - .../ui/android/SemanticGraphManager.java | 101 - .../ui/android/SemanticGraphView.java | 144 -- .../grammaticalframework/ui/android/TTS.java | 75 - .../ui/android/Translator.java | 777 ------- .../android/TranslatorInputMethodService.java | 666 ------ .../ui/android/TranslatorKeyboard.java | 107 - .../ui/android/TranslatorKeyboardView.java | 128 -- .../se/chalmers/phrasebook/backend/Model.java | 206 -- .../backend/syntax/ChoiceContext.java | 61 - .../backend/syntax/SyntacticChoice.java | 25 - .../phrasebook/backend/syntax/SyntaxNode.java | 33 - .../backend/syntax/SyntaxNodeArgument.java | 15 - .../backend/syntax/SyntaxNodeBoolean.java | 7 - .../backend/syntax/SyntaxNodeCall.java | 52 - .../backend/syntax/SyntaxNodeFunction.java | 39 - .../backend/syntax/SyntaxNodeNumeral.java | 84 - .../backend/syntax/SyntaxNodeOption.java | 22 - .../phrasebook/backend/syntax/SyntaxTree.java | 33 - .../gui/activities/NavigationActivity.java | 79 - .../gui/fragments/PhraseListFragment.java | 86 - .../gui/fragments/TranslatorFragment.java | 253 --- src/ui/android/topics.txt | 951 -------- src/ui/gwt/.classpath | 7 - src/ui/gwt/.project | 28 - src/ui/gwt/Editor-compile | 17 - src/ui/gwt/Editor-compile.bat | 7 - src/ui/gwt/Fridge-compile | 17 - src/ui/gwt/Fridge-compile-fast | 19 - src/ui/gwt/Fridge-compile.bat | 9 - src/ui/gwt/Fridge-shell-external | 19 - src/ui/gwt/Morpho-compile | 17 - src/ui/gwt/Translate-compile | 17 - src/ui/gwt/Translate-compile.bat | 9 - src/ui/gwt/Translate-shell-external | 19 - .../ui/gwt/EditorApp.gwt.xml | 27 - .../ui/gwt/FridgeApp.gwt.xml | 25 - .../ui/gwt/FridgeApp_IE6.gwt.xml | 5 - .../ui/gwt/MorphoApp.gwt.xml | 20 - .../grammaticalframework/ui/gwt/PGF.gwt.xml | 9 - .../ui/gwt/TranslateApp.gwt.xml | 25 - .../ui/gwt/client/BrowsePanel.java | 269 --- .../ui/gwt/client/CompletionOracle.java | 152 -- .../ui/gwt/client/ContentService.java | 136 -- .../ui/gwt/client/DocumentsPanel.java | 142 -- .../ui/gwt/client/EditorApp.java | 461 ---- .../ui/gwt/client/FridgeApp.java | 338 --- .../ui/gwt/client/FridgeBagPanel.java | 38 - .../ui/gwt/client/FridgeTextPanel.java | 113 - .../ui/gwt/client/GrammarsPanel.java | 201 -- .../ui/gwt/client/IterableJsArray.java | 39 - .../ui/gwt/client/JSONCallback.java | 8 - .../ui/gwt/client/JSONRequest.java | 19 - .../ui/gwt/client/JSONRequestBuilder.java | 109 - .../ui/gwt/client/LinearizationsPanel.java | 150 -- .../ui/gwt/client/Magnet.java | 22 - .../ui/gwt/client/MagnetFactory.java | 31 - .../ui/gwt/client/MagnetSearchBox.java | 49 - .../ui/gwt/client/MorphoApp.java | 63 - .../ui/gwt/client/MyListBox.java | 40 - .../ui/gwt/client/PGF.java | 241 -- .../ui/gwt/client/PGFWrapper.java | 294 --- .../ui/gwt/client/QueryPanel.java | 144 -- .../ui/gwt/client/SettingsListener.java | 10 - .../ui/gwt/client/SettingsPanel.java | 136 -- .../ui/gwt/client/StatusPopup.java | 36 - .../ui/gwt/client/SubList.java | 37 - .../ui/gwt/client/SuggestPanel.java | 102 - .../ui/gwt/client/TextInputPanel.java | 600 ----- .../ui/gwt/client/TranslateApp.java | 321 --- .../ui/gwt/client/selection/Selection.java | 66 - .../client/selection/SelectionEndPoint.java | 69 - .../InternetExplorerSelectionSupport.java | 248 --- .../selection/support/SelectionSupport.java | 69 - .../ui/gwt/public/Editor.css | 333 --- .../ui/gwt/public/Fridge.css | 89 - .../ui/gwt/public/Translate.css | 82 - .../ui/gwt/public/align-btn.png | Bin 138 -> 0 bytes .../ui/gwt/public/background.png | Bin 760 -> 0 bytes .../ui/gwt/public/brushed-metal.png | Bin 36233 -> 0 bytes .../ui/gwt/public/delete-last.png | Bin 395 -> 0 bytes .../ui/gwt/public/grammar-buttons.png | Bin 1732 -> 0 bytes .../ui/gwt/public/new.png | Bin 230 -> 0 bytes .../ui/gwt/public/textinput-buttons.png | Bin 1171 -> 0 bytes .../ui/gwt/public/trash-button.png | Bin 930 -> 0 bytes .../ui/gwt/public/tree-btn.png | Bin 149 -> 0 bytes src/ui/gwt/www/editor/editor.html | 36 - src/ui/gwt/www/editor/index.html | 4 - src/ui/gwt/www/fridge/index.html | 36 - src/ui/gwt/www/morpho/index.html | 36 - src/ui/gwt/www/morpho/morpho.fcgi | 1 - src/ui/gwt/www/translate/index.html | 36 - .../project.pbxproj | 1189 ---------- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 26747 -> 0 bytes .../xcschemes/GF Offline Translator.xcscheme | 112 - .../xcschemes/xcschememanagement.plist | 27 - .../contents.xcworkspacedata | 10 - .../WorkspaceSettings.xcsettings | 10 - .../GF Offline Translator/AppDelegate.h | 19 - .../GF Offline Translator/AppDelegate.m | 50 - .../GF Offline Translator/ArrowsButton.h | 13 - .../GF Offline Translator/ArrowsButton.m | 23 - .../Base.lproj/Main.storyboard | 311 --- .../GF Offline Translator/Grammar.h | 21 - .../GF Offline Translator/Grammar.m | 45 - .../AppIcon.appiconset/Contents.json | 137 -- .../AppIcon.appiconset/Icon-60.png | Bin 2406 -> 0 bytes .../AppIcon.appiconset/Icon-60@2x.png | Bin 6622 -> 0 bytes .../AppIcon.appiconset/Icon-60@3x.png | Bin 11748 -> 0 bytes .../AppIcon.appiconset/Icon-76.png | Bin 3367 -> 0 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 9519 -> 0 bytes .../AppIcon.appiconset/Icon-76@3x.png | Bin 16746 -> 0 bytes .../AppIcon.appiconset/Icon-Small.png | Bin 1011 -> 0 bytes .../AppIcon.appiconset/Icon-Small@2x.png | Bin 2317 -> 0 bytes .../AppIcon.appiconset/Icon-Small@3x.png | Bin 4070 -> 0 bytes .../AppIcon.appiconset/Icon-Spotlight-40.png | Bin 1448 -> 0 bytes .../Icon-Spotlight-40@2x.png | Bin 3718 -> 0 bytes .../Icon-Spotlight-40@3x.png | Bin 6388 -> 0 bytes .../GF Offline Translator/Info.plist | 47 - .../GF Offline Translator/Language.h | 25 - .../GF Offline Translator/Language.m | 75 - .../LanguagesViewController.h | 19 - .../LanguagesViewController.m | 62 - .../GF Offline Translator/MenuView.h | 13 - .../GF Offline Translator/MenuView.m | 23 - .../GF Offline Translator/MorphAnalyser.h | 32 - .../GF Offline Translator/MorphAnalyser.m | 194 -- .../NSString+StringToArray.h | 15 - .../NSString+StringToArray.m | 22 - .../GF Offline Translator/PhraseTranslation.h | 18 - .../GF Offline Translator/PhraseTranslation.m | 19 - .../SLKTextView+TextInputMode.h | 15 - .../SLKTextView+TextInputMode.m | 45 - .../SentenceTranslationUITableViewCell.h | 15 - .../SentenceTranslationUITableViewCell.m | 56 - .../GF Offline Translator/StyleKitGF.h | 21 - .../GF Offline Translator/StyleKitGF.m | 86 - .../GF Offline Translator/Translation.h | 35 - .../GF Offline Translator/Translation.m | 109 - .../TranslationInputTableViewCell.xib | 58 - .../TranslationOptionsViewController.h | 15 - .../TranslationOptionsViewController.m | 106 - .../TranslationOutputTableViewCell.xib | 45 - .../TranslationTextTableViewCell.h | 17 - .../TranslationTextTableViewCell.m | 47 - .../TranslationTextViewController.h | 20 - .../TranslationTextViewController.m | 307 --- .../GF Offline Translator/Translator.h | 34 - .../GF Offline Translator/Translator.m | 286 --- .../GF Offline Translator/TranslatorStore.h | 32 - .../GF Offline Translator/TranslatorStore.m | 79 - .../UIColor+TranslationsResults.h | 16 - .../UIColor+TranslationsResults.m | 57 - .../UITableViewCell+Customize.h | 15 - .../UITableViewCell+Customize.m | 22 - .../GF Offline Translator/WebViewController.h | 13 - .../GF Offline Translator/WebViewController.m | 25 - .../GF Offline Translator/WordTranslation.h | 17 - .../GF Offline Translator/WordTranslation.m | 13 - .../GF Offline Translator/help_content.html | 131 -- .../GF Offline Translator/main.m | 16 - .../GF_Offline_TranslatorTests.m | 40 - .../GF Offline TranslatorTests/Info.plist | 24 - src/ui/ios/GF-Offline-Translator/Podfile | 5 - src/ui/ios/GF-Offline-Translator/Podfile.lock | 10 - .../GF-Offline-Translator/Pods/Manifest.lock | 10 - .../Pods/Pods.xcodeproj/project.pbxproj | 499 ----- .../Pods/SlackTextViewController/LICENSE | 14 - .../Pods/SlackTextViewController/README.md | 324 --- .../Additions/SLKTextView+SLKAdditions.h | 80 - .../Additions/SLKTextView+SLKAdditions.m | 170 -- .../Source/Additions/SLKUIConstants.h | 61 - .../Additions/UIResponder+SLKAdditions.h | 30 - .../Additions/UIResponder+SLKAdditions.m | 39 - .../Additions/UIScrollView+SLKAdditions.h | 48 - .../Additions/UIScrollView+SLKAdditions.m | 73 - .../Source/Additions/UIView+SLKAdditions.h | 59 - .../Source/Additions/UIView+SLKAdditions.m | 73 - .../Source/Classes/SLKInputAccessoryView.h | 23 - .../Source/Classes/SLKInputAccessoryView.m | 100 - .../Source/Classes/SLKTextInputbar.h | 149 -- .../Source/Classes/SLKTextInputbar.m | 707 ------ .../Source/Classes/SLKTextView.h | 90 - .../Source/Classes/SLKTextView.m | 796 ------- .../Source/Classes/SLKTextViewController.h | 468 ---- .../Source/Classes/SLKTextViewController.m | 1956 ----------------- .../Source/Classes/SLKTypingIndicatorView.h | 78 - .../Source/Classes/SLKTypingIndicatorView.m | 358 --- ...s-SlackTextViewController-Private.xcconfig | 6 - .../Pods-SlackTextViewController-dummy.m | 5 - .../Pods-SlackTextViewController-prefix.pch | 5 - .../Pods-SlackTextViewController.xcconfig | 0 .../Pods/Pods-acknowledgements.markdown | 21 - .../Pods/Pods-acknowledgements.plist | 51 - .../Target Support Files/Pods/Pods-dummy.m | 5 - .../Pods/Pods-environment.h | 14 - .../Pods/Pods-resources.sh | 78 - .../Pods/Pods.debug.xcconfig | 6 - .../Pods/Pods.release.xcconfig | 6 - .../gf-ios-swift.xcodeproj/project.pbxproj | 811 ------- .../contents.xcworkspacedata | 7 - .../xcshareddata/gf-ios-swift.xccheckout | 41 - .../UserInterfaceState.xcuserstate | Bin 16628 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 50093 -> 0 bytes .../old-swift/gf-ios-swift/AppDelegate.swift | 38 - .../gf-ios-swift/Base.lproj/LaunchScreen.xib | 32 - .../gf-ios-swift/Base.lproj/Main.storyboard | 242 -- .../ios/old-swift/gf-ios-swift/Colors.swift | 72 - .../gf-ios-swift/HelpViewController.swift | 24 - .../AppIcon.appiconset/Contents.json | 68 - src/ui/ios/old-swift/gf-ios-swift/Info.plist | 47 - .../old-swift/gf-ios-swift/Languages.swift | 39 - .../old-swift/gf-ios-swift/Translator.swift | 210 -- .../gf-ios-swift/ViewController.swift | 223 -- .../gf-ios-swift-Bridging-Header.h | 13 - .../gf-ios-swift/images/ic_action_switch.png | Bin 436 -> 0 bytes .../gf-ios-swift/images/ic_app copy.png | Bin 2458 -> 0 bytes .../old-swift/gf-ios-swift/images/ic_app.png | Bin 2073 -> 0 bytes .../gf-ios-swift/images/ic_keyboard.png | Bin 695 -> 0 bytes .../old-swift/gf-ios-swift/images/ic_mic.png | Bin 665 -> 0 bytes .../old-swift/gf-ios-swiftTests/Info.plist | 24 - .../gf-ios-swiftTests/gf_ios_swiftTests.swift | 28 - 340 files changed, 4 insertions(+), 28240 deletions(-) delete mode 100644 src/ui/android/.classpath delete mode 100644 src/ui/android/.project delete mode 100644 src/ui/android/AndroidManifest.xml delete mode 100644 src/ui/android/LICENSE delete mode 100644 src/ui/android/README delete mode 100644 src/ui/android/ant.properties delete mode 100644 src/ui/android/assets/help_content.html delete mode 100644 src/ui/android/assets/phrases.xml delete mode 100644 src/ui/android/build.xml delete mode 100644 src/ui/android/gf-translator-alignment.dot delete mode 100644 src/ui/android/gf-translator.svg delete mode 100644 src/ui/android/glosses.hs delete mode 100644 src/ui/android/hlc.svg delete mode 100644 src/ui/android/jni/Android.mk delete mode 100644 src/ui/android/jni/Application.mk delete mode 100644 src/ui/android/proguard-project.txt delete mode 100644 src/ui/android/project.properties delete mode 100644 src/ui/android/res/drawable-hdpi/btn_close.png delete mode 100644 src/ui/android/res/drawable-hdpi/close_arrow.png delete mode 100644 src/ui/android/res/drawable-hdpi/ic_action_switch.png delete mode 100644 src/ui/android/res/drawable-hdpi/ic_app.png delete mode 100644 src/ui/android/res/drawable-hdpi/ic_drawer.png delete mode 100644 src/ui/android/res/drawable-hdpi/ic_keyboard.png delete mode 100644 src/ui/android/res/drawable-hdpi/ic_mic.png delete mode 100644 src/ui/android/res/drawable-hdpi/ic_search_black_24dp.png delete mode 100644 src/ui/android/res/drawable-hdpi/open_arrow.png delete mode 100644 src/ui/android/res/drawable-hdpi/sym_keyboard_delete.png delete mode 100644 src/ui/android/res/drawable-hdpi/sym_keyboard_return.png delete mode 100644 src/ui/android/res/drawable-hdpi/sym_keyboard_search.png delete mode 100644 src/ui/android/res/drawable-hdpi/sym_keyboard_shift.png delete mode 100644 src/ui/android/res/drawable-hdpi/sym_keyboard_space.png delete mode 100644 src/ui/android/res/drawable-mdpi/ic_action_switch.png delete mode 100644 src/ui/android/res/drawable-mdpi/ic_app.png delete mode 100644 src/ui/android/res/drawable-mdpi/ic_drawer.png delete mode 100644 src/ui/android/res/drawable-mdpi/ic_mic.png delete mode 100644 src/ui/android/res/drawable-mdpi/ic_search_black_24dp.png delete mode 100644 src/ui/android/res/drawable-mdpi/sym_keyboard_delete.png delete mode 100644 src/ui/android/res/drawable-mdpi/sym_keyboard_done.png delete mode 100644 src/ui/android/res/drawable-mdpi/sym_keyboard_return.png delete mode 100644 src/ui/android/res/drawable-mdpi/sym_keyboard_search.png delete mode 100644 src/ui/android/res/drawable-mdpi/sym_keyboard_shift.png delete mode 100644 src/ui/android/res/drawable-mdpi/sym_keyboard_space.png delete mode 100644 src/ui/android/res/drawable-xhdpi/ic_action_switch.png delete mode 100644 src/ui/android/res/drawable-xhdpi/ic_app.png delete mode 100644 src/ui/android/res/drawable-xhdpi/ic_dictionary.png delete mode 100644 src/ui/android/res/drawable-xhdpi/ic_drawer.png delete mode 100644 src/ui/android/res/drawable-xhdpi/ic_mic.png delete mode 100644 src/ui/android/res/drawable-xhdpi/ic_search_black_24dp.png delete mode 100644 src/ui/android/res/drawable-xxhdpi/ic_app.png delete mode 100644 src/ui/android/res/drawable-xxhdpi/ic_drawer.png delete mode 100644 src/ui/android/res/drawable-xxhdpi/ic_search_black_24dp.png delete mode 100644 src/ui/android/res/drawable-xxxhdpi/ic_search_black_24dp.png delete mode 100644 src/ui/android/res/drawable/first_person_utterance_bg.xml delete mode 100644 src/ui/android/res/drawable/grid_phrasebook_button.xml delete mode 100644 src/ui/android/res/drawable/ic_volume_up_black_18dp.png delete mode 100644 src/ui/android/res/drawable/second_person_best_utterance_bg.xml delete mode 100644 src/ui/android/res/drawable/second_person_chunk_utterance_bg.xml delete mode 100644 src/ui/android/res/drawable/second_person_utterance_bg.xml delete mode 100644 src/ui/android/res/drawable/second_person_worst_utterance_bg.xml delete mode 100644 src/ui/android/res/layout/activity_help.xml delete mode 100644 src/ui/android/res/layout/activity_lexical_entry.xml delete mode 100644 src/ui/android/res/layout/activity_main.xml delete mode 100644 src/ui/android/res/layout/activity_navigation.xml delete mode 100644 src/ui/android/res/layout/activity_semantic_graph.xml delete mode 100644 src/ui/android/res/layout/alternative_item.xml delete mode 100644 src/ui/android/res/layout/checkbox_input_list_item.xml delete mode 100644 src/ui/android/res/layout/first_person_utterance.xml delete mode 100644 src/ui/android/res/layout/fragment_phrase_list.xml delete mode 100644 src/ui/android/res/layout/fragment_translator.xml delete mode 100644 src/ui/android/res/layout/input.xml delete mode 100644 src/ui/android/res/layout/keyboard_languages_options.xml delete mode 100644 src/ui/android/res/layout/languages_item.xml delete mode 100644 src/ui/android/res/layout/lexical_item.xml delete mode 100644 src/ui/android/res/layout/number_input_list_item.xml delete mode 100644 src/ui/android/res/layout/phrase_list_item.xml delete mode 100644 src/ui/android/res/layout/second_person_utterance.xml delete mode 100644 src/ui/android/res/layout/spinner_input_list_item.xml delete mode 100644 src/ui/android/res/menu/main.xml delete mode 100644 src/ui/android/res/values-sw600dp/dimens.xml delete mode 100644 src/ui/android/res/values-sw720dp-land/dimens.xml delete mode 100644 src/ui/android/res/values-v11/styles.xml delete mode 100644 src/ui/android/res/values-v14/styles.xml delete mode 100644 src/ui/android/res/values/attrs.xml delete mode 100644 src/ui/android/res/values/colors.xml delete mode 100644 src/ui/android/res/values/dimens.xml delete mode 100644 src/ui/android/res/values/strings.xml delete mode 100644 src/ui/android/res/values/styles.xml delete mode 100644 src/ui/android/res/xml/cyrillic.xml delete mode 100644 src/ui/android/res/xml/devanagari_page1.xml delete mode 100644 src/ui/android/res/xml/devanagari_page2.xml delete mode 100644 src/ui/android/res/xml/method.xml delete mode 100644 src/ui/android/res/xml/nordic.xml delete mode 100644 src/ui/android/res/xml/popup_keyboard.xml delete mode 100644 src/ui/android/res/xml/qwerty.xml delete mode 100644 src/ui/android/res/xml/searchable.xml delete mode 100644 src/ui/android/res/xml/symbols_page1.xml delete mode 100644 src/ui/android/res/xml/symbols_page2.xml delete mode 100644 src/ui/android/res/xml/thai_page1.xml delete mode 100644 src/ui/android/res/xml/thai_page2.xml delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/ASR.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/AlternativesActivity.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/CompletionsView.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/ConversationView.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/GFTranslator.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/HelpActivity.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/Language.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/LanguageSelector.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/LanguagesAdapter.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/LexiconSuggestionProvider.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/LocaleUtils.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/MainActivity.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/ParseTreeView.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/RotationGestureDetector.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraph.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphActivity.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphManager.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphView.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/TTS.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/Translator.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/TranslatorInputMethodService.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboard.java delete mode 100644 src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboardView.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/Model.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/syntax/ChoiceContext.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntacticChoice.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNode.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeArgument.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeBoolean.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeCall.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeFunction.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeNumeral.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeOption.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxTree.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/gui/activities/NavigationActivity.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/gui/fragments/PhraseListFragment.java delete mode 100644 src/ui/android/src/se/chalmers/phrasebook/gui/fragments/TranslatorFragment.java delete mode 100644 src/ui/android/topics.txt delete mode 100644 src/ui/gwt/.classpath delete mode 100644 src/ui/gwt/.project delete mode 100644 src/ui/gwt/Editor-compile delete mode 100644 src/ui/gwt/Editor-compile.bat delete mode 100644 src/ui/gwt/Fridge-compile delete mode 100644 src/ui/gwt/Fridge-compile-fast delete mode 100644 src/ui/gwt/Fridge-compile.bat delete mode 100644 src/ui/gwt/Fridge-shell-external delete mode 100644 src/ui/gwt/Morpho-compile delete mode 100644 src/ui/gwt/Translate-compile delete mode 100644 src/ui/gwt/Translate-compile.bat delete mode 100644 src/ui/gwt/Translate-shell-external delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/EditorApp.gwt.xml delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/FridgeApp.gwt.xml delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/FridgeApp_IE6.gwt.xml delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/MorphoApp.gwt.xml delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/PGF.gwt.xml delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/TranslateApp.gwt.xml delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/BrowsePanel.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/CompletionOracle.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/DocumentsPanel.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/EditorApp.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeApp.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeBagPanel.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeTextPanel.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/GrammarsPanel.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/IterableJsArray.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONCallback.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONRequest.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONRequestBuilder.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/LinearizationsPanel.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/Magnet.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MagnetFactory.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MagnetSearchBox.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MorphoApp.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MyListBox.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGF.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/QueryPanel.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsListener.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/StatusPopup.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SubList.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SuggestPanel.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TextInputPanel.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TranslateApp.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/selection/Selection.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/selection/SelectionEndPoint.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/selection/support/InternetExplorerSelectionSupport.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/selection/support/SelectionSupport.java delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Editor.css delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Fridge.css delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Translate.css delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/align-btn.png delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/background.png delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/brushed-metal.png delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/delete-last.png delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/grammar-buttons.png delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/new.png delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/textinput-buttons.png delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/trash-button.png delete mode 100644 src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/tree-btn.png delete mode 100644 src/ui/gwt/www/editor/editor.html delete mode 100644 src/ui/gwt/www/editor/index.html delete mode 100644 src/ui/gwt/www/fridge/index.html delete mode 100644 src/ui/gwt/www/morpho/index.html delete mode 100644 src/ui/gwt/www/morpho/morpho.fcgi delete mode 100644 src/ui/gwt/www/translate/index.html delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator.xcodeproj/project.pbxproj delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator.xcodeproj/project.xcworkspace/xcuserdata/cennydavidsson.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator.xcodeproj/xcuserdata/cennydavidsson.xcuserdatad/xcschemes/GF Offline Translator.xcscheme delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator.xcodeproj/xcuserdata/cennydavidsson.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator.xcworkspace/contents.xcworkspacedata delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator.xcworkspace/xcuserdata/cennydavidsson.xcuserdatad/WorkspaceSettings.xcsettings delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/AppDelegate.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/AppDelegate.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/ArrowsButton.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/ArrowsButton.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Base.lproj/Main.storyboard delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Grammar.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Grammar.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-60.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-76.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-76@3x.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-Small.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-Spotlight-40.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Images.xcassets/AppIcon.appiconset/Icon-Spotlight-40@3x.png delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Info.plist delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Language.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Language.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/LanguagesViewController.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/LanguagesViewController.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/MenuView.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/MenuView.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/MorphAnalyser.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/MorphAnalyser.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/NSString+StringToArray.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/NSString+StringToArray.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/PhraseTranslation.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/PhraseTranslation.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/SLKTextView+TextInputMode.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/SLKTextView+TextInputMode.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/SentenceTranslationUITableViewCell.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/SentenceTranslationUITableViewCell.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/StyleKitGF.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/StyleKitGF.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Translation.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Translation.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/TranslationInputTableViewCell.xib delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/TranslationOptionsViewController.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/TranslationOptionsViewController.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/TranslationOutputTableViewCell.xib delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/TranslationTextTableViewCell.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/TranslationTextTableViewCell.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/TranslationTextViewController.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/TranslationTextViewController.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Translator.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/Translator.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/TranslatorStore.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/TranslatorStore.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/UIColor+TranslationsResults.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/UIColor+TranslationsResults.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/UITableViewCell+Customize.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/UITableViewCell+Customize.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/WebViewController.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/WebViewController.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/WordTranslation.h delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/WordTranslation.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/help_content.html delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline Translator/main.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline TranslatorTests/GF_Offline_TranslatorTests.m delete mode 100644 src/ui/ios/GF-Offline-Translator/GF Offline TranslatorTests/Info.plist delete mode 100644 src/ui/ios/GF-Offline-Translator/Podfile delete mode 100644 src/ui/ios/GF-Offline-Translator/Podfile.lock delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Manifest.lock delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Pods.xcodeproj/project.pbxproj delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/LICENSE delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/README.md delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Additions/SLKTextView+SLKAdditions.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Additions/SLKTextView+SLKAdditions.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Additions/SLKUIConstants.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Additions/UIResponder+SLKAdditions.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Additions/UIResponder+SLKAdditions.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Additions/UIScrollView+SLKAdditions.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Additions/UIScrollView+SLKAdditions.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Additions/UIView+SLKAdditions.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Additions/UIView+SLKAdditions.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Classes/SLKInputAccessoryView.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Classes/SLKInputAccessoryView.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Classes/SLKTextInputbar.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Classes/SLKTextInputbar.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Classes/SLKTextView.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Classes/SLKTextView.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Classes/SLKTextViewController.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Classes/SLKTextViewController.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Classes/SLKTypingIndicatorView.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/SlackTextViewController/Source/Classes/SLKTypingIndicatorView.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods-SlackTextViewController/Pods-SlackTextViewController-Private.xcconfig delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods-SlackTextViewController/Pods-SlackTextViewController-dummy.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods-SlackTextViewController/Pods-SlackTextViewController-prefix.pch delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods-SlackTextViewController/Pods-SlackTextViewController.xcconfig delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods/Pods-acknowledgements.plist delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods/Pods-dummy.m delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods/Pods-environment.h delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods/Pods-resources.sh delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods/Pods.debug.xcconfig delete mode 100644 src/ui/ios/GF-Offline-Translator/Pods/Target Support Files/Pods/Pods.release.xcconfig delete mode 100644 src/ui/ios/old-swift/gf-ios-swift.xcodeproj/project.pbxproj delete mode 100644 src/ui/ios/old-swift/gf-ios-swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 src/ui/ios/old-swift/gf-ios-swift.xcodeproj/project.xcworkspace/xcshareddata/gf-ios-swift.xccheckout delete mode 100644 src/ui/ios/old-swift/gf-ios-swift.xcodeproj/project.xcworkspace/xcuserdata/aarne.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 src/ui/ios/old-swift/gf-ios-swift.xcodeproj/project.xcworkspace/xcuserdata/joelhinz.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/AppDelegate.swift delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/Base.lproj/LaunchScreen.xib delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/Base.lproj/Main.storyboard delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/Colors.swift delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/HelpViewController.swift delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/Info.plist delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/Languages.swift delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/Translator.swift delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/ViewController.swift delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/gf-ios-swift-Bridging-Header.h delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/images/ic_action_switch.png delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/images/ic_app copy.png delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/images/ic_app.png delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/images/ic_keyboard.png delete mode 100644 src/ui/ios/old-swift/gf-ios-swift/images/ic_mic.png delete mode 100644 src/ui/ios/old-swift/gf-ios-swiftTests/Info.plist delete mode 100644 src/ui/ios/old-swift/gf-ios-swiftTests/gf_ios_swiftTests.swift diff --git a/.gitignore b/.gitignore index 9505a95b3..97875e85a 100644 --- a/.gitignore +++ b/.gitignore @@ -39,8 +39,6 @@ src/runtime/c/sg/.dirstamp src/runtime/c/stamp-h1 src/runtime/java/.libs/ src/runtime/python/build/ -src/ui/android/libs/ -src/ui/android/obj/ .cabal-sandbox cabal.sandbox.config .stack-work diff --git a/index.html b/index.html index 78d263be5..bc621311c 100644 --- a/index.html +++ b/index.html @@ -80,7 +80,7 @@ function sitesearch() { diff --git a/src/server/lighttpd.conf b/src/server/lighttpd.conf index a495d705b..88a016513 100644 --- a/src/server/lighttpd.conf +++ b/src/server/lighttpd.conf @@ -1,4 +1,4 @@ -# Run with (with -D for no-daemon) +# Run with (with -D for no-daemon) # /usr/sbin/lighttpd -f lighttpd.conf -D # @@ -10,8 +10,9 @@ server.modules = ( "mod_cgi" ) -var.basedir = var.CWD +var.basedir = var.CWD +# John: no longer valid after removing `src/ui` 2018-11-15 server.document-root = basedir + "/../ui/gwt/www" server.errorlog = basedir + "/error.log" @@ -96,4 +97,3 @@ static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" ) ## bind to port (default: 80) server.port = 41296 - diff --git a/src/ui/android/.classpath b/src/ui/android/.classpath deleted file mode 100644 index 7bc01d9a9..000000000 --- a/src/ui/android/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/ui/android/.project b/src/ui/android/.project deleted file mode 100644 index abf063e43..000000000 --- a/src/ui/android/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - GFTranslator - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/src/ui/android/AndroidManifest.xml b/src/ui/android/AndroidManifest.xml deleted file mode 100644 index 84b837a08..000000000 --- a/src/ui/android/AndroidManifest.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/LICENSE b/src/ui/android/LICENSE deleted file mode 100644 index cf90ceb14..000000000 --- a/src/ui/android/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ - BSD LICENSE - -Copyright (c) 1998, Grammatical Framework -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/src/ui/android/README b/src/ui/android/README deleted file mode 100644 index 7adb7fe50..000000000 --- a/src/ui/android/README +++ /dev/null @@ -1,68 +0,0 @@ -= Overview = - -This directory contains a sample Android app tht uses -the Android speech recognition and TTS APIs along with -JNI bindings to the C PGF runtime to implement a simple -speech translation app. - - -= Requirements = - -1. Android SDK: http://developer.android.com/sdk/ - installed in $ANDROID_SDK_LOCATION - -2. Android NDK: http://developer.android.com/tools/sdk/ndk/ - installed in $ANDROID_NDK_LOCATION - -= Building = - -Set up Android project: - -# Creates local.properties, not to be checked in -$ $ANDROID_SDK_LOCATION/tools/android update project -p . - -Build libs/libjpgf.jar: - -$ (cd ../../runtime/java && javac org/grammaticalframework/*/*.java && jar -cf ../../ui/android/libs/jpgf.jar org/grammaticalframework/*/*.class) - -Build JNI code: - -$ cd jni -$ $ANDROID_NDK_LOCATION/ndk-build - -Build the semantic database code: - -$ runghc glosses.hs - -Build APK: - -$ ant debug - - -Install on your device: - -$ ant debug install - -or: - -$ adb install -r bin/MainActivity-debug.apk - - -= Changing the grammar = - -1. Replace assets/ResourceDemo.pgf - -2. Edit Translator.java to point to the new file and include its metadata - - -= Developing in Eclipse = - -1. Install Android ADT - -2. Eclipse > File > Import > Existing Projects into Workspace > Next - -3. Select root directory... - -4. Select GF/src/ui/android - -5. Finish \ No newline at end of file diff --git a/src/ui/android/ant.properties b/src/ui/android/ant.properties deleted file mode 100644 index 59ddc9800..000000000 --- a/src/ui/android/ant.properties +++ /dev/null @@ -1,2 +0,0 @@ -key.store=/home/krasimir/dg/src/keys/dg_keystore -key.alias=dg diff --git a/src/ui/android/assets/help_content.html b/src/ui/android/assets/help_content.html deleted file mode 100644 index 279a2a963..000000000 --- a/src/ui/android/assets/help_content.html +++ /dev/null @@ -1,157 +0,0 @@ - - -

-GF Offline Translator: -text and speech translation for 16 languages with -quality control. Version 19 April 2017 (beta). -

-

-Speech input: Tap microphone icon and talk while it is red. -
-Text input: Select "keyboard" from menu, tap keyboard icon. -
-Correction: Tap input text and edit. -
-Alternatives: Tap output text. -
-Grammar info: Tap any of the alternatives. -
-Confidence: colour of output text -

    -
  • Green: semantic, probably correct (but has alternatives)
  • -
  • Yellow: syntactic, often incorrect (has alternatives)
  • -
  • Light red: chunk-based, probably incorrect (has alternatives)
  • -
  • Dark red: word-based, often very bad
  • -
-
-Topics (new, select from menu): Words grouped by semantic categories, with WordNet glosses. -
-Phrasebook (new, select from menu): Conceptual authoring with the green translations. -

- -
- -

More details

-

-GF Offline Translator is based on grammar and semantics. It is compact in size -and gives control on quality. Its technology is inspired by compilers, which are -programs that translate computer languages. -Most other translators for human language are based on -statistics and have less control of quality and are much bigger, so that -they require either an internet connection or a huge storage on your phone. -

-The app indicates translation confidence with colours: -
    -
  • Green: - semantic translation, should be correct. - But not necessarily the only correct one. - You can tap the output to see alternatives. -
  • -
  • Yellow: - syntactic translation, should be grammatically correct. - But can be very strange in its interpretation and choice of words. -
  • -
  • Light red: - chunk translation, probably incorrect. - Builds the translation from small pieces. -
  • -
  • Dark red: - word-by-word translation, almost certainly incorrect. - Builds the translation word by word. -
  • -
-The green translations come from a tourist phrasebook, which allows -you to translate things like "hello" and "how far is the airport from -the hotel". -

- -

-You can translate both speech and text, as selected in the menu in the -upper right corner. Both kinds of input can be edited with the -keyboard by first tapping at the input field. This is often needed -because of speech recognition errors. Changing words -from upper to lower case may also be needed. -At the moment, Japanese and Thai input must be separated -to words, whereas Chinese works without spaces. -

-

-Translation works between any of the 16 supported languages, which means 240 -language pairs in the current version. But different languages are on different levels of development. -The following table gives a rough idea of what to expect: -

- -

-

- - - - - - - - - - - - - - - - - - -
coverage quality speed speech
Bulgarian in only
Catalan
Chinese
Dutch
English
Estonian
Finnish
French
German
Hindi
Italian
Japanese*
Russian
Spanish
Swedish
Thai*
-
-* For translation from Japanese and Thai you need to separate each word with a space -

-

-The speech input and output use Google's voice services. Their status -can hence change without notice. You can make it more stable by -installing third-party speech tools, such as SVOX, which provides -output for most of the listed languages. -

- -

-When you tap on a translation you get a screen with alternative translations. -Tapping on each of the alternatives -gives you grammatical information: -an inflection table, if it is a single word, -and a syntax tree otherwise. -

- -

-The app also provides an input method which you can use as -an alternative keyboard which allows you to do translation from -other applications, for instance while you are entering SMS or e-mail. -To activate it go to Settings > Language & input. -

- -

-The translation works completely off-line, without -internet connection, when doing text-based translation. -Even speech works off-line in some languages, -but being on-line may give you better -speech input and output and more languages. -

-

-You can also install third-party off-line speech engines, such as -SVOX. -Consult the voice/language settings on your phone to find the optimal -speech engines, and restart the app after changing the settings. -

- -

-The GF Offline Translator is powered by -GF, Grammatical Framework. -It is open-source software, -built by support from the GF community and from Digital Grammars. -

- -

-Digital Grammars is a company that can tailor this app to you needs and provide good -translation for the kind of vocabulary you need. Just tell us what you want to see - in the green area! -

- - - diff --git a/src/ui/android/assets/phrases.xml b/src/ui/android/assets/phrases.xml deleted file mode 100644 index 847339135..000000000 --- a/src/ui/android/assets/phrases.xml +++ /dev/null @@ -1,1035 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/build.xml b/src/ui/android/build.xml deleted file mode 100644 index d60bf62f2..000000000 --- a/src/ui/android/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/gf-translator-alignment.dot b/src/ui/android/gf-translator-alignment.dot deleted file mode 100644 index 8eaaa72a5..000000000 --- a/src/ui/android/gf-translator-alignment.dot +++ /dev/null @@ -1,60 +0,0 @@ -digraph { - rankdir=LR ; - node [shape = record] ; - bgcolor = "#FFFFFF00" ; - - struct0[label = "твоят | телефон | може | да | превежда"] ; - struct0:n0:e -> struct1:n0:w ; - struct0:n1:e -> struct1:n1:w ; - struct0:n2:e -> struct1:n2:w ; - struct0:n4:e -> struct1:n3:w ; - struct1[label = "el teu | telèfon | sap | traduir"] ; - struct1:n0:e -> struct2:n0:w ; - struct1:n1:e -> struct2:n2:w ; - struct1:n2:e -> struct2:n3:w ; - struct1:n3:e -> struct2:n4:w ; - struct2[label = "你 | 的 | 电 话 | 会 | 翻 译"] ; - struct2:n0:e -> struct3:n0:w ; - struct2:n2:e -> struct3:n1:w ; - struct2:n3:e -> struct3:n2:w ; - struct2:n4:e -> struct3:n3:w ; - struct3[label = "je | telefoon | kan | vertalen"] ; - struct3:n0:e -> struct4:n0:w ; - struct3:n1:e -> struct4:n1:w ; - struct3:n2:e -> struct4:n2:w ; - struct3:n3:e -> struct4:n3:w ; - struct4[label = "your | phone | can | translate"] ; - struct4:n1:e -> struct5:n1:w ; - struct4:n2:e -> struct5:n2:w ; - struct4:n3:e -> struct5:n3:w ; - struct5[label = "puhelimesi | osaa | kääntää"] ; - struct5:n1:e -> struct6:n1:w ; - struct5:n2:e -> struct6:n2:w ; - struct5:n3:e -> struct6:n3:w ; - struct6[label = "ton | téléphone | sait | traduire"] ; - struct6:n0:e -> struct7:n0:w ; - struct6:n1:e -> struct7:n1:w ; - struct6:n2:e -> struct7:n2:w ; - struct6:n3:e -> struct7:n3:w ; - struct7[label = "dein | Telefon | kann | übersetzen"] ; - struct7:n0:e -> struct8:n0:w ; - struct7:n1:e -> struct8:n1:w ; - struct7:n2:e -> struct8:n3:w ; - struct7:n3:e -> struct8:n2:w ; - struct8[label = "तुम्हारा | फोन | अनुवाद कर | सकता | है"] ; - struct8:n0:e -> struct9:n1:w ; - struct8:n1:e -> struct9:n2:w ; - struct8:n2:e -> struct9:n4:w ; - struct8:n3:e -> struct9:n3:w ; - struct9[label = "il | tuo | telefono | sa | tradurre"] ; - struct9:n1:e -> struct10:n0:w ; - struct9:n2:e -> struct10:n1:w ; - struct9:n3:e -> struct10:n2:w ; - struct9:n4:e -> struct10:n3:w ; - struct10[label = "tu | teléfono | sabe | traducir"] ; - struct10:n0:e -> struct11:n0:w ; - struct10:n1:e -> struct11:n1:w ; - struct10:n2:e -> struct11:n2:w ; - struct10:n3:e -> struct11:n3:w ; - struct11[label = "din | telefon | kan | översätta"] ; -} diff --git a/src/ui/android/gf-translator.svg b/src/ui/android/gf-translator.svg deleted file mode 100644 index 21eee477d..000000000 --- a/src/ui/android/gf-translator.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - Offline Translation - with - Grammatical Framework - Grammatical Framework - - diff --git a/src/ui/android/glosses.hs b/src/ui/android/glosses.hs deleted file mode 100644 index 966ec90aa..000000000 --- a/src/ui/android/glosses.hs +++ /dev/null @@ -1,46 +0,0 @@ -import SG -import PGF2 -import Data.Char -import Data.List - -main = do - db <- openSG "assets/semantics.db" - inTransaction db $ do - ls <- fmap lines $ readFile "../../../lib/src/translator/Dictionary.gf" - let glosses = [x | Just (fn,gloss) <- map gloss ls, x <- glossTriples fn gloss] - topics <- fmap (map toTriple . lines) $ readFile "topics.txt" - sequence_ [insertTriple db s p o | (s,p,o) <- glosses++topics] - closeSG db - -toTriple l = - case readTriple l of - Just t -> t - Nothing -> error ("topics.txt: "++l) - -gloss l = - case words l of - ("fun":fn:_) -> case dropWhile (/='\t') l of - '\t':l -> Just (fn,l) - _ -> Nothing - _ -> Nothing - -glossTriples fn s = - (if null gs then [] else [(fn_e,gloss,mkStr (merge gs))])++ - (if null es then [] else [(fn_e,example,mkStr (merge (map (init . tail) es)))]) - where - fn_e = mkApp fn [] - gloss = mkApp "gloss" [] - example = mkApp "example" [] - (es,gs) = partition isExample (splitGloss s) - -splitGloss s = - let (xs,s') = break (==';') s - in trim xs : case s' of - ';':s -> splitGloss s - _ -> [] - where - trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace - -merge = intercalate "; " - -isExample s = not (null s) && head s == '"' && last s == '"' diff --git a/src/ui/android/hlc.svg b/src/ui/android/hlc.svg deleted file mode 100644 index e61e41c19..000000000 --- a/src/ui/android/hlc.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Digital Grammar Logo - - - diff --git a/src/ui/android/jni/Android.mk b/src/ui/android/jni/Android.mk deleted file mode 100644 index f1f697bed..000000000 --- a/src/ui/android/jni/Android.mk +++ /dev/null @@ -1,28 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -jni_c_files := jpgf.c jsg.c jni_utils.c -sg_c_files := sg.c sqlite3Btree.c -pgf_c_files := data.c expr.c graphviz.c linearizer.c literals.c parser.c parseval.c pgf.c printer.c reader.c \ -reasoner.c evaluator.c jit.c typechecker.c lookup.c aligner.c writer.c -gu_c_files := assert.c choice.c exn.c fun.c in.c map.c out.c utf8.c \ -bits.c defs.c enum.c file.c hash.c mem.c prime.c seq.c string.c ucs.c variant.c - -LOCAL_MODULE := jpgf -LOCAL_SRC_FILES := $(addprefix ../../../runtime/java/, $(jni_c_files)) \ - $(addprefix ../../../runtime/c/sg/, $(sg_c_files)) \ - $(addprefix ../../../runtime/c/pgf/, $(pgf_c_files)) \ - $(addprefix ../../../runtime/c/gu/, $(gu_c_files)) -LOCAL_C_INCLUDES := ../../../runtime/c - -include $(BUILD_SHARED_LIBRARY) - -$(realpath ../obj/local/armeabi/objs/jpgf/__/__/__/runtime/c/pgf/jit.o): lightning -$(realpath ../obj/local/armeabi/objs-debug/jpgf/__/__/__/runtime/c/pgf/jit.o): lightning - -lightning: - ln -s -f arm/asm.h ../../../runtime/c/pgf/lightning/asm.h - ln -s -f arm/core.h ../../../runtime/c/pgf/lightning/core.h - ln -s -f arm/fp.h ../../../runtime/c/pgf/lightning/fp.h - ln -s -f arm/funcs.h ../../../runtime/c/pgf/lightning/funcs.h diff --git a/src/ui/android/jni/Application.mk b/src/ui/android/jni/Application.mk deleted file mode 100644 index 6a9876332..000000000 --- a/src/ui/android/jni/Application.mk +++ /dev/null @@ -1,3 +0,0 @@ -APP_PLATFORM := android-8 -APP_CFLAGS := -std=gnu99 -APP_OPTIM := release diff --git a/src/ui/android/proguard-project.txt b/src/ui/android/proguard-project.txt deleted file mode 100644 index f2fe1559a..000000000 --- a/src/ui/android/proguard-project.txt +++ /dev/null @@ -1,20 +0,0 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/src/ui/android/project.properties b/src/ui/android/project.properties deleted file mode 100644 index 6e18427a4..000000000 --- a/src/ui/android/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-21 diff --git a/src/ui/android/res/drawable-hdpi/btn_close.png b/src/ui/android/res/drawable-hdpi/btn_close.png deleted file mode 100644 index 47f11e5bf67fcb0284261ff30310d58a325d4329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2220 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 ncwRc-)>ypA*+XmlfA+P^pUbP0l+XkK)>k+_ diff --git a/src/ui/android/res/drawable-hdpi/ic_action_switch.png b/src/ui/android/res/drawable-hdpi/ic_action_switch.png deleted file mode 100644 index 5449a32b8aa91df7f477d64c1b5f5c69d4153128..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 436 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F(Z$|=lf1onxM_c6dswCSS!O7?jd#XnS-OnIW2kB__LJ<9XMW3Y&gnu zrnzy+@4avGCYe9B(3zKb}xJhSTYu6KEB7+3W#($I@IFg>->?ZbQF2e%iARxkTp zaHh!mVq$D`gZz;i_A3nK%z+}QCI3xUv`R4V*jDr8T9yOv3P#ffY*!kjek?E8Eb&k4 z!FR`=MnSf#4N?-?N8FfdW=dHK1`CEq&TwdOpD>?czw_dTt6mGH8YzA_ADO3aveoUt z`U@(LtK`x$^yM1vFS0%Pi?@YMUuv%ybG1p^(w4g9%3t2@lMKGRIGArBBACjMtll%< rpzV;wsfijq42B#fAzD*cUFM&=XV$7T#?mPa3=9mOu6{1-oD!M diff --git a/src/ui/android/res/drawable-hdpi/ic_app.png b/src/ui/android/res/drawable-hdpi/ic_app.png deleted file mode 100644 index 8d9bdd820089406b216cdf2964f1037787954821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2458 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D4dSc;uILpV4%IBGajIv5xj zI14-?iy0VL)Ipf>roU_h0|SF(iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$ zQVa~7;+`&!Ar*7p-l^=l8+!A=$MZW+mrT>kZ=C5Ay+LoHt3lQku80*K9PhQgOlmv5 z87{j#>iaDwnv^7!;d)fVyW_!cCVfxSkZ5hCgWD&HsWt=z2u`_GYc+T2<(byS(|6kc z|MAx?fBEHeKF{y%Y<)R-&Y81k=N8ZVY3 zg`7AzMB`lp=N@k`xcXFGAn5$27cS>c7G))rCFCXa{rEhmV_!#XYT1;VkxA)|vi+Zb z9R1=N7&1?&Hk&s?!oxa0E6sD-W@8;cgJuk9G*}=@1Eng=P$CCRGQ`LZZW-h z%^`YPC5Nk=UQs>&{-_g|HLjn!l*OjeA|RLWE@@rPqgN*DrJm?l|9mVa7k&Eu`gH9s z4fT~FA1zx=Hl4hG#z|`b;Ya2L|7y}C#$Aizm;^1Q>!;p{>d8KHM+((4vSBlG*igIqx|Dnqo2JsV!0{o~)xU)Dd@`g1&_d^xAnsf2UeE%zVjli9yx;<8x`zeJ3G z?O5${{q7#~mq9P9nkCp*h|CKAaE;~Ct&dK#COrM}v7WW;uE_ZyFzj_j%saMJd1RUhTT#q9A(X;?dG%(@#5$YWp^y=CM0udh*a4SN3$4 zCC{GD`IjozYwFT7^QP1-uAH0a{;PQZ5%=9L#eC_5+4Bv(wKvXYaVTCsUn|Ic?%}27 zH)LG{UrzY{L1>Dz+>BO%L)8MloK1e~@_pZ{)oHKV+7@7ngjcSr49g1Pgn8{-!m%zbFEsJm6*(B_zi z52bQOyvx5%G`iGuN&Uk*IWs$#d=uAlfA`HYEE!_&@0?|Rq&*{3pPeD<{2?7~`KRW6 zrTQTZT#8Hl9;6CB4b2gZzvo-Ma?1jP*^|BB+_X7+-EL|T!vZxiksH0q1wxh#7kVTv z_#J2X>#cR&QStO1rrlRKFXSqw=s&&ksL{@;bmH3_%l3WD47`CJ$N89o`7~N4yn4DT zvL^28ZgK^A?u6)_gaORZW>W-Fuq#)P_^?&pM5E ze&1-)V(_+Rg)>K@@bcv|cTYSX%G9+;F&=ym0iAk(q?PN|1%$-_pANBI8ne$ z_D`Og_Ypsj%f6R3@5s>SUnJogXd-ms!sI_`Y|Ga^J5rSq;U9T$PMVm#w7fZgVS%~U ze{+BF%zEzkGyNV1a42r=;ckBse@<;NqgS5=*XqLP&fQbbTc1*D%2Ihb z`RB2?Yr4-p+nJ}#2>Yl0CxI>9=Dc;>sjw+ArE_l|x_#}VtnwcLx4pCdl}cun7o9Gg zQ^@-Kp0q2oY1o#9&GP02N#@$=eviUb18nB;KHj;FOEKm5PJ8!tQ@?jRul>jS)F3Wm zW`A*1W9;3S^~dh5$+&U&ZYr1a7eBSBFDhnTmpWX{v+}Nv{^b45OHcIOKCH8G(XrB) zGEV!-M(?J*tLtM_&;O2MigI(7 zFQ4{eXL^&Pg?rG%hH38$|0$dot<1B2?k5(c%b@tD^)lPf|4MJSe>%4$y4O1DK?k?n zWy?K9+U3(U-=!Z-dE~sB_eGS{w~tqicKW^h&yz30{?JEbN>b3;$!jeAez1n~9B^Kt0mp35^TEz`FhFO*&Cc&+@%zP`uz=J|*T z1l_JI*1NY(;Z51UYb>0<+W=UP#)zw|LX_wEw1B>Uz?9>ck(rAU^Zyz{PI{b9GXZ^o{P#?v-EnewCKvuI>g@W*E&Q%)|N z;kE4Xlh+v?>uPN_HXoOJI`RC+6#l;w0?wLlrUlXSCVg*in}5RdlEH?D+ii@zXH*)h z>n7D{t513Hep$8p-SZc|dVhPXsLy7oVCN(46?Asqv4wp6I)wro47{Ymw4^4U%HnyV o5c`_(#ZeXgn}>g7owR3MCiXt|jc`sO0|Nttr>mdKI;Vst02t+_K>z>% diff --git a/src/ui/android/res/drawable-hdpi/ic_drawer.png b/src/ui/android/res/drawable-hdpi/ic_drawer.png deleted file mode 100644 index c59f601ca31dae344d0dc95912713ce54a8fbefe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2829 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 diff --git a/src/ui/android/res/drawable-hdpi/ic_keyboard.png b/src/ui/android/res/drawable-hdpi/ic_keyboard.png deleted file mode 100644 index ce257a2697ee365ccf2f3b2525ad55f0ec593650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 695 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F^e0|SF(iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$ zQVa}CCY~;iAsLNtXBw_s6d=;}-})TWiaV{dD*|3H<;)8SmhNm7ZRO-#xWRa#;>>5h zCMs>RJ^8}#4v9{fQ*3*g$EBd=;>7QIYBi$&IXR#2|Ne)wU~0#MnLpEZHM+m#nX$|` zVb-~ZOe^MP*f`70KkVIc<89gAy8ZvT5*QN_)-7Ev!?33B_~SAgxz~##q&Dchp4xG* zXG@thGeiEgRK^4A7ez>2h|-@`b4&f7LG*(&4l@~*qyz+K+?3>N@0vN+eap35iD?;Y z=U&XXG9&HTtBP(87naCrp3_o;UM#w17Q24#dxj2<%vrY>CM;Wd*Ui^uDsRBiHF;*U z{iSa$`}|s?c4*0~see)_6|W0J~56;G|tSKVUQPqhx% z(f#-aTZ2Vku2Ry_J{O{-4~bz;TLaihgmc@zN>6Z4d8# zuZ?!8>+Xcr=o+poVWC~+?h(JouG&4GRC6|d~Qw)$Ga ht8b|I|4)9+uT;KVSuaIQiGhKE!PC{xWt~$(698MTF<1Zq diff --git a/src/ui/android/res/drawable-hdpi/ic_mic.png b/src/ui/android/res/drawable-hdpi/ic_mic.png deleted file mode 100644 index f79ff489b42ffab34cfbff2ce48fcf53d1cf8919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 665 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F6j&295^@_6%|-o9M-crmWdW6h&epdcu=MKz~WqN-C>in z%jfz%_sU^Wn5bU6>sjJ@mIX1>Ywqt9f6mF1c>T<21qQ(#vcEYmWNp25B2~bE=W)1F zFZkI!dDD-)#TR!hdvxD>Q|0`x&l!2uKXDwm_vq(5{giDF*8ef@ zJvB3IX^^CM55r*&g=-J2k0yQG_rHEm=nVBYQ=4r!WZCy`{O$KhbVm59e4&p_t+`5X zY=sWJv`GkF@01y+t$A>_49mV%6KJ4i*Lm25-&)VFm_9Ur!gukP61P7uK)R3KTj1 zalMg&+WV7AY~4rI1!fk_j*WNZX*yY?&NnAdz~|U!rt9`kjrKJs%v9q@GLmpPV!0vW zrN!ZUR)=)!$|S$#pY1>U=xwIzEuN1rFCKX4xu0{V;No^>MpwCz1g|*-WflEb|6G<| zzeYmPAa%8QdQ`;a>mOWML;CotciIMSzSDc{&%@$f)i?{Kt^LXsJ?^uRLv+^a8(uZ#Qc-WQ{s_aj?GWnop=Bi2W4YN)>m?m>_*Cc(z zB8w9l>Z*4=ZXI`8(63+oK6sO|e8i8Ve#ewwaXiiNJ;UHFm;UqNA(nn6zR+DcThx^L zw~DDhIwJgXQ>@Naj`v=DJSSd%KeUf)R!?N{qf_%#YhynKt$wy6C8#2H>S?FdX*X9t xTfhF-?7dmbLhVx4UlLDU|Ech&{k?sROrQ3PX;1yKkb!}L!PC{xWt~$(69As2tpWf5 diff --git a/src/ui/android/res/drawable-hdpi/open_arrow.png b/src/ui/android/res/drawable-hdpi/open_arrow.png deleted file mode 100644 index ec7453797997c4c1c5456b3aa206e7b6070ae646..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8107 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 diff --git a/src/ui/android/res/drawable-hdpi/sym_keyboard_delete.png b/src/ui/android/res/drawable-hdpi/sym_keyboard_delete.png deleted file mode 100644 index 5139c7179066ca30e114eebb8dd721262dc55ec6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmeAS@N?(olHy`uVBq!ia0y~yU{GgZV6fz1V_;y|T5oiZfq_A?#5JNMI6tkVJh3R1 z!7(L2DOJHUH!(dmC^a#qvhZZ84FdzSxTlL_NX4x;5&0>hi4yzEPwzOQQMhyG{G^_x z{E==u4WAzC3G#aB+%?f|Nu*D$l;Gud5kbSnnrGcoBB$9c$&|`GV)Dr7yFl_0)o0&q z{@k;Pdv5#w_q^S6s~_9^ne%u-gC>FReR@UhGw7MvSI0ypd!tkQ|_4E z(7W8N!11GK;)fWUIMomie~!(H^I!fu6~@7Sw3h#&^sU7$zkjj+thrbHY!`<*hjB}I zOCLwP+zGd!(^d{Qymz$!-rQm>`0x6I`B&3&kAIUne-za9pGo9 zpz|$u%Wht~=0~#Uf0P70`PcEyuK9e2*xJsClf#T{>d$tye5;ytI!fTJY4drDhsnlF zkM?Bj&tICcSLaKvSkmo|+`QwP>=gDi)U0^ANA970Q{xI-^Ry3-mETX;v47>ajr=?H zV(OiryXhXkyg+QNT9G?r>h{=^dsSt`zQ0ytiv8m&xHs)XaC3RoHQw`wZ(p5%Qt$Sh zO__J4zUR0G{j5(tG;6D{R|_-e$49n5FSXvuTyk$`i~74&y)lx9ZeMH()pccc;oQn3 z{M%JR>5coXy^|%jz1?YdNM_ok($^{vS0`^v^6Iykdw-IWbfARf(k0;nkDY%`QQqj@ zBHy-Uu4lbs&9zIq`g311ZuIM!(5Y+r<#79VUY-m$fKKpEajX&Om^$ZzL{?Kq)Q@}vGw%K88>q! z4kpDUb=_HVV@a|{^&=_aJuNGye7iAyhLU-UpRvdO-%<+U2kfVm#lC$kazFRN)Vddu zd>5}sPoA;wr?#Twqq#RkC=nx;XJ$TLGi8PC{pHV9Y_!#7zu;Z@szSzc6QO)YiE(C$FnkdC8Q{Wp#rm zdfVAKQ@V-{8C%S~wpMfJlo&5P)$1<5wGS|KFWL4#b?(cv3=9kmp00i_>zopr0Q|?O A1^@s6 diff --git a/src/ui/android/res/drawable-hdpi/sym_keyboard_return.png b/src/ui/android/res/drawable-hdpi/sym_keyboard_return.png deleted file mode 100644 index 5a5670c320ffe799ebc46b7834c4be80b68edbed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 536 zcmeAS@N?(olHy`uVBq!ia0y~yV9;V-L1 z;Fyx1l&avFo0y&&l$w}QS$HzlhJk@`m#2$kNX4zBKmY&R9}Zyf;c;f^u`0Q;a50~3 z>5CQ4?y^>|E(EsoaUF2#TXufF{pCZtS`Kemj_5a3unYWu^z`Y{GYd@^W;)nNcFbJ( z=dr^Zwj=Ru!B@B$KeDK}H#MjVi1ThUS;coGC*nvi=dwVlrH(NTGbIYWoUicoyEZSY z=wf=5?69ZA!1{`4$8%@r%gGz8L`3dN7p62gJ`RXgxW{y4PV-K#scetlI_P*UkMW=8 z?AT|`P^z=Fk%jN${v}pZ;*((Ri3rVGGAe0foM!iuLUg?M;`? zabdaqU=E(g*dmI zk6So9f?vEj(C-k#cI4%fGFLH&;xubUZU@EsMke;AqVIVMas6>B6N79@9Zp~5vdMC| z%R2esg`KNguKAq&A);7*gl*G0|8}>t3*KLEzLdx!@LrmWSzv#I1xJTJZ|g*%0KrGh zN6guGJ3Brw6|iRh7`$YH+?Lv9%P&mix$wbT+g8TwTMx{Q2|e^yH)@y^5-;q`kAlR^OdHd-m?70UCKce0=v> zSLsg3onRYsn^nedxoJ{bebVvyY?bTQtavRR^73wwwQ0C?{rdOKE=rY>UpN&66%ti`%xTzl@7}%m3)6DD!RpJ|3}h}A zS5{WaOYpGSa(1bUyUlh zK0bF+++$XTlnJa5cqNg(%=VR&b1ZMhO3?W7Z=^8VAOPdxeg`SSaU zYHDgKl9Q7~<;or9TpYM%9q01pZajP9#EJKN_-dz3nX;#$|M zzC8Vbb1%=KjH9evHx+IN+;2McN=R5(|3Xif46o0Tb7Iq`PMym8sCL^0r6(Qi+1c6u zH%yI-ixXn3EQ`DK==t+(mw#Jt)UrMe?Dk&*x z`!@gH#5Z#8RuWGpc`dz_bY3Chwb6?H<;ExOHt`GIj9Ig4)vunfjdlzFxmLA1pEsQM z=NO}IR=V}pef#z?3ci)SaJ1pa=QYk3!h9^FebUmN?f(Am?(LM?FWg1cf*B2QfT+-dtDQPxG_?@P&_NkL&@*M2)0@oZk&)!SP;Imc$sK~YPo zi#K-d+I7CwM|P%*xA*DqC$tW*efQ_`bo21=@XOB57CvqEBPcldv+|8Sd_tNJX7c$) zA2DIpWM*czpLuHYx9{IgCwTm0T=SQW%kF-AlAbP1hkGPrLK;LwwtHi>7){jRMI3OCk- zg@s*nG|4qt8Xpz4%Xj8iV-Z)^KBi;mWacGaG&nU~lyfEb{66DgN{OORw6t;);=k9E}d-v{LO&y&-6V^#Hy|j4n zW~YcRA5XEYf)axbhu@4AA&*Q~*Q4%MbN#aU?#PMU=)Z2TSuriiaN$;NgXk89$Dewq zpMGlO{UG4_g$o~41sUdKe)MEJrk@y-)Oq#l)uQ0W_Pt*MwWeM-j8NQbz3~9cg95Qh zuU^02zk!7>T~A5rQRSWW>ar62=bFFy7bPb@F5MfKZ^3(@ z%{z1W?TY%yO$RcLOu6w(C}0ow&*^nKS8R8kG=BVj#ep{w6}yhfzjIp@%$BVonqKnP k^9(Blz6t#4-@wQqYA{>t&iC1p3=9kmp00i_>zopr0JoS9TmS$7 diff --git a/src/ui/android/res/drawable-hdpi/sym_keyboard_shift.png b/src/ui/android/res/drawable-hdpi/sym_keyboard_shift.png deleted file mode 100644 index 275769618a23b642d3ff7305de827a49e5b72ce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1247 zcmeAS@N?(olHy`uVBq!ia0y~yU@!w=4mJh`h91|fy9^8rk|nMYCBgY=CFO}lsSJ)O z`AMk?p1FzXsX?iUDV2pMQ*9U+SQB`zkfMV@N`G&5u+qY!~Ys3mn}J(>clVVE>S&i_IzER z-{-uA_ou#m;u>2W-@CPd7S zo4@t{=Ndd6$@7r z^KT75l>Jb$@{RSQT-W8IEz6EX9NZ_|-Pt;~e&Ju6!p}EUlP6|4UC_A^FyDK^Ztj_q zLX~y#okx!(T@vp06#6J6cDw7|wRqo-S=rOBme2Y&`^aq4md$^7F7+7Sw^3epU(MDH|a^otz*8|I*F%#Vfz~VK6qh~vnI@rBZnBd7o>Plqxm;PU)bl34`N|UeT%+FX zxE^>R#GZG{42OBs&60|2{Cs+Ds^fY;|;I)S9>JV`6GHoYH=;eAZ@KM&=!qZ~uwwtG6c9P3YYD*5}E||JM&OpI4f;eV@a<*I)A0f94vV&Hp}e`J`?4qdq*@ z>(hC~@AcE0?~`qJE$QBwnY8ZB&POG)xMxqhW4>onRc66 zJtRbKdwJzEQ>94}PcNQ!Gu{_}YhBouQ}^nWW;tA&tNNGaE!%1Zt@DaE?xfalGe1%$ zpz{54&O{0Bdk?qyt_l6DHF2+M*@V6~|80ztBsca%xalaDP3Zs6BEhiWMzEGgR@tg7+xLu>n3XGm6^{BWV zb>TSm|Ik^vJ>S>AxXb*H|DWI-9}AIW9SOZXWe-x7N1xBX&h?VRKfoEuCc*mPWr zlQ%Hd_G+s)?K}N%u0(dfhfGd?$@dq}?LEt%OxIj>{%5d>ulM`+@Auo-*wjov|9t)f zm&F$|u4QfIU%q_#@yjo-lpL;g?%$^pdp&q(%)6rp4<5Xov@zm9XW8z*Z(qE4@%QG< zn;TOj#lNiK*pjR;fo;L^r9m%47Y2AdYFVW5v1;$XmDgYYW!S*DX4efBfej0eCOB?h z@Ow>+-u`tVTHUhVON00grq%8LFMHse=COp8FD&}(iJ)p|X z)>1zm6U2;9iJe&FKNI`)^#k0ot9KGR3daQ^xEhxdr4?QCD@y7(eb zhKX|@^LM|zwe9Vt%5QIHe-cYDTQiS!wYpNdjR4o9 z4K_>d1SI|~Vm_x=URKuD>2hda_J$NA%kJZkoqJwd@m2*MTDWEQ?%liZrfvQysdZ`g z!Gr|ol}D%CxDs;xBJKO%%WpBhSkf-{v5fPLkn2UK*%o(yY|XvBU6Fyau*uqDpUWyPcE=4V zr3c-a4#;kJQv9;~O(f$6+3aO(2N?e7G3YFd;uA|@eKGq#i^B(nhB#IcCLYISyi9^U z8gfhyE!qEtG?cwugCASEcRu7=u|_%WkZjI$fukX}Hm%LjSobDZQdBlnc53aG?@V&q gI$O`2+5MbRzTt|f{>7F#3=9kmp00i_>zopr0KlY!5dZ)H diff --git a/src/ui/android/res/drawable-mdpi/ic_app.png b/src/ui/android/res/drawable-mdpi/ic_app.png deleted file mode 100644 index 923d0fe9135f5dd3d360e726ce7ed03da80b13ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1502 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F5I(Vy)zavzyIZp~wHe;1+1?ibH{Zh8K_<;0**VQy)QID5oH#RdLWm@e9= z{ODE95q2&?^KGtM*7Tj=u~~ns=CSF*jt;Y^SrHLWCLeVFHKV5OP-fBIlJ6JITP45x z@CPjtJugzZZDMVvjLI>cgi@Dha$>1J{3bp-yk|%Ibh)(KVz&a`%o zy?LO{`fu{%gL!FTN0v`I7rE~A=9dEd|66_j6ClJ`6jyJz{-^rAJ^9+!8pD(w1EIL&wdGS-<{Lh_Ctht1w;Zdl!H znJl(p&a6B+%QN!NroP#;YIU8UqN#M`y!7uGN^Y^8lmGnL|3`{CaB3x}%47UYV||aGKXL?kD5*SijAZXQfV=DZ2FKO8d+>{Tl|zh}DS*605^I!+Ycm*08#rpSY?V-sXgY}zvS@Al2cUvFQY z+ULk9C}>*qv$U>T`(6o~!Hixv7q#Q-_=_H|)|@*lAuct!fW7bIL%(lt9)EEWS|uXs z^{lvUw%@1nJ*qkN49(U7hfSAT+DuG2*2Ksdczg}hdS8{98xuartVj-<=6scB{%U2T z`+7?sgt||BbY{w?W~N^n+olwKT&1A&NaB9RgWarsVcB;W_so@!>;7?MLBr)O*Nugb zuQK(VCmH)EPcJ*f+#==H%{~2x7Bnaw&(2);NM*sc5{-GQmSwuREbDvrezI)AqbuIq z8ZEEtSjBp=Y`tx1EaA2}XYQ%xY7>HQS{$nW{8!PQS##+Z9etAx4x+L@gBIAQM}Jd0 zugLrEKyAtQq9Xpy>J#EEJ67u4JA0YOcll+(dGij+hHsLWc@jILO!{}QS9-a^(kXI} zE^5{!TJs8@D0FdgF)4gsckPw`&-R)NHh#|q&En3^4S%F3lk!bPtgd@2b7JKQ^;EBw z`JqS7?>j!9e*@pmkAAn#EVAicuB2DRrxK;U{LATw^IToFY_8Jp&r!GkQ2+L)Y`x2C z-#hyojw>gftl(SFB0T3t{Ii$$j(?0+O4?!B|9R(;J?D$BPk63;CGl0<^G@MAw)3LS zIflt4sAkR4-QRz$ZSDUpMZWyi*QRJaa{krh@nH6z#oe;9HEA|XeA8HZc3NzkeoQW| zYF&uv{sn%fk7RE~-MaQ+YLr|?e?(LtXNa`B^14}vKU+uc@8CUrb*0{iM#d#mf?VEs z>%<=no+~(cc0~QoQ@Xi=y2d{)hso`3y}x8im$KmA8Ja2YQr{K+oAmf%_>3}5Uyqku z*@g4&N_(4|nlApPUmoC7J28~?-_?`H_1&^`nEDDr`${9t)+g;V%Gx~DD($VaPENA- zJl(r@tb}$Ju_{>2nEbfW=KsAzcV`5xdtvA*Zenxhtb4_(1E*QTz8L&(f8KKFB8$R5 z_s^QszHZpqJ^lZwuJ6= zjkW+Vq$V4?QMNR>)4#kBxMFS5Cy1KGRpIFer+}GF8BO0i~)5Udz{fXkDzUIXp zU8jCOtX`abZO`{-Xa8-zZufl6=ee8DvmfB#ndV^}XxhND(n(J6LG$q=#~wb>b7d=7!LT(K42iz{-6Jq)65vgh8D&HB@->Y zIT}P59IE=9mN7WEF*eMdp%%=rfQ2F9baK*Th5%iL1oir7ml+!7{+LO86pfAMAE#ESTfwuWiapzPxD~du$|$+IRWlX3>-WR27w)| znhY$}3<)Qcl`9xpW-^GleG0evsJ%|$xfTOM#mr4MJ5?-Q8>2aN3)#cN_2e|pd5UX` zm?bhL&T`N@R5?@9sL_P~!RIp!3=1ZT3O;E5{I}v9-@0?>%=)(R#p}M>&-Py_De3XQ zr{`A}I503gEUCNrPe*^VRD(5JL+-yts_$4b;Q;wm;6nz~Hi=QEP*v^p}GYItSQf4zk`k$o(h5ti?&?$RQ^IC$5wR znW6;EHBC+$ZD%*gY9;7jaga4R5SY<6xqwgaQ0NXm+XDVyi5&9|YV2v`WN|#fA)Kgq ztAjDAD?+)CLwsiI5524k8#^I(fR~~ zQPZEcJ?@568aD;nUg6p5ymN)QREygp?h7d;hO_#`7Ra3h?;vuCx`Q)vX>`m;JQ*;!xPqaRn z`{eKw<0sNj6hB3C%}sJBT=FCMkw(y|EHBBY0#8kzvZc;2atvKOE9mZug&~5b{ZUS9 z7j6q$AK1P^*rarp<=JL2Pw%B`7frn^l_8$-J#+nwl3jv#r^@+FzYu=u^h@^_(_b)u zDd*vB6Ky`;k**;*TY_C8U9wza{S2RFl9#(BkB1nT8@`_Ld?x?Q{Ll!kZCW*=6HjqX z^_r?SRa#3wWaX-5tM0Ah4*eW@I;4MPTyX6=w@~BY$16FnOj{kgYHq;mVCmrWmDVfT zSEaAW53yfT7x}l7E%LC>VSnc(feSXqKi+dpfje1pbA^s#Ht*`T(nixGY8%hqtSQsl zJ>#$J?rz&vD;HWi8+#dtZw~rACC#4w@r=SBb4vU;pKC0i{<*H}p2&O6N1D>hOni14 zrp9Einl^n}#A=V#fveqL?=@TZcKO_8dtG-&{%+)RJnp3)qwb#Ge~xwT^WdAocb9W5 z7xT5X`npbURrXTpg}YtK_vbBtH)GzuxQ2N?`OEKB?tT7CrdI!N$lu&w%fGtwM6hk< zQDM8yb56qMsA*xojjaCh+aCj+V-GtxFHM}9IQ?PE#GMyy7GHJib>r{JJQnj<<#Fz@ z++&N?*whr&ynSE!zMB=~yK|Z5GHV}epW|oGoLzMG+Dy~gwuaY@p3i|aQRNZ$$qQnT}wZ_ z;p4WG+g5Iu-0<`U+wFDRa<|ncrYDJ~Z$G;3@Vm)-C)e((?fq-Z&f9*IZ?$ZcY+dn| zA`z=Ft9!G~&3R{Ed-Th+m-^`u=LOE+Fn+vE__XGc%(=m{FT1CUr|&Fo{@l^s>D_c% zZ@Qh{Z0TcnPwai-Rr0kk_F>hfuXAT_o_*-;ireeonZ3(=*M4XI8I$>%^CFFlFC0GM z{2=h@MSJe~Qw_53uc`BQ_HRtz`dnE*S$|^q+Upy(FD+m7J@LJ`-8Z|U`H$@$+nC=o zx)&LL#{9tc6WdSwAI_f_-+JGbFfd-#Ydz*y$+h*x$6a>FL3>iWw)~OjxV<{rQY@6VGMxwFcC^xORa(@mXT`;W{4m z*7nx$Hv7JUjtHrXhSN>UFWzx3zVGtOWtz*q+3AM1Em6GT&vg%l?>N zTI89l5pyFvbG&6N^|aQR<>lEq&E}ym{zJB zHD0RobZ3kD$_aaXczy29wwfn4t4tx+$kuAFVe_Pk6AGPHDf&*{mi{XJSz6iYHL0ze z{vFNh-mWh&l+efI5{&8Kcp zFrV{&{{Oc^hlCzZ+P1XKJ6u;b;@RFcS(ck@3M+4OJr-rvZVO{uW3!`cn^x{s|J859 zr?0Eqt5)Tk-57W9RMWw&jM=ZbL%E)|*1o=T{cWs&gns1xt%<+d=1SX%c6O~3xh+0j zwEl+1orFOT=;tu4Iw!?wKr z`pxyW{`9jNw|6&hbKbdlzs-(4smo8EJ8NwpvLxh7$gdEycbD#NO}zdi@8Ub@>OJ2~ z-dw#Mz32O1yOaBFhcbrxUQN52`rGsO=I{3FI#<2?G3|G5>{`Fv!nennFERgRSLWMx zedm>{vX^W_g8Hv%zjo(4F2C>J-1p_Wyk@+iy>pH|QZ8_*eDd-;=l$<;yjHi$daBnv zWWOw5CYvs+pXD^`(=4~y!LxoxCq?h_KVx_C+N*n2f81}&^UpD{iLCVc9C9-A*2|{L zlhZ$)@0mMwZf%|3&pQdX7j3J4o_y|p7JvTxT>>Q!FS-8jer~a_1KrRSNSyZdEtD@QW)!(h%=ES4z)+>iz|hdl z!0_`w14F}028L1t28LG&3=CE?7#PI!C&eFiV_;y=_jGX#u{fRlm^Jv0T#Q)Yq{CBV!uL0Vfx+s@-gxEC18NKm3=E#GelF{r5}E)Q C*F3fW diff --git a/src/ui/android/res/drawable-mdpi/ic_mic.png b/src/ui/android/res/drawable-mdpi/ic_mic.png deleted file mode 100644 index 8f7f55cf913b9abf83c75ab1c0f76734e4917b61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNfHJ&bxAr-fh6C_v{CulHv zdwVAf3r{u*4!-Q^P{lMsZ^Ooo7Z-Ft6?0(NQlchi!~DX)be8pjGiP*I+nLj5&7RGE z=`iEU9Wo44xTQ)DtYB_i&fLIun|bpL>y3O2Vm^uo9vzxCi?4t&>Vn4_=7u+#4(zuB z&och|_fKYt1%m|B-jLp=zrVj5GwQxz+Sq8vee@|q!Uk(rHnt*W*$YlzOBhVH9JzKa zOft(+QSAQmYuB%DX3ET7p!_%^ka-oO?z-*UwmoD2*w{Cbt&8!kk@?o`+r^tZ8*AP_ zd7|RAdRBn^6tRYBKNwfXi>9ZiJNomdKI;Vst04c$*xc~qF diff --git a/src/ui/android/res/drawable-mdpi/ic_search_black_24dp.png b/src/ui/android/res/drawable-mdpi/ic_search_black_24dp.png deleted file mode 100644 index 6b16343235c2729720113158598c891fd041949f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4i*Lm2CurW#S9D#2RvOILo5W(9yIhjl)%7t zLHvnKy>j}59WxRhtyL)K=X=BQ#3RH#kxlKya}O(#*T<@DcJN2DhqKSW_ct*^Q%OlF z%eh?V=*1AjfSHz^QOo%YzdTBNqoQV&b2Q|3OiqbK$D+59e_j-bGUxg~T6EYk=V_;yo^{HEefq_A?#5JNMI6tkVJh3R1 z!7(L2DOJHUH!(dmC^a#qvhZZ84FdyXv8Rh;NX4x;q1Jv!3z-uI*kt0}eT4CZ zoWi2zjaiu!Ef{9YiD_(a7H*irEU?b8`BH%LPlji_Qr?HPI2UVd(=fU;`R&Fz=Km$0 z-%)9Mj*13EK)|3*DNlPwOZ4vq{{D9d)WS4Qm zwGZ!REd1QDRN%Mw1IZiWyVSoWU68Te#J>5$(FdQEJL4FSpQsXT4iZyzn!YhS^uz_h zld=W!s}gJfbUsO3&9%K)<#%4IU5Q*==CS)O?<3QDGWV=_{Y&I@-i3u+LSA`tB~{#$ z${&<5^l2y9y;a!harugwgwgS$hTWUI)!)5YpA;}jCBp2A`HkmIM_zxkTJ7iTbm*6< z{L91MYKqKUcj~tZWqPtiYA!nxG+~P3uM*J4mJh`hKCF@W-u@?NS3%plmzFem6RtIr7}3C zrF&p_T>PPbH48C}3Xo+`{Gu!SD zf_{_keSUi9{k-BlSBbW$iEZmdbM6T3Qk_!DvB1TEBQ?g`^5=Zvnx^*GF^7KYJrua% z_{1q;aw7-F^cF^ghwY+GskgsfzL;UcQ!Mvpa;-7@vqL(sTiCxm@ZK6_`=V_3ee1b> z$+MQ}w{VyV$~{_mKFxUX-Mr|vVXybS-X*>@>g^1<+Nl@L$W4Cv{kOgD>0b`poF(!q zPFe_rt-oGnEZMO)a-~%a;@X_7Ca|>qHXResi zdZG8?1@EmKlmCXDHBZ^^xX*Kq;>@CzyeUz}YJ%q`6c=5-U|quT`j|>MZ(yO!`m-yR zNv2&35MZ(Dis6-dp!(61d3lzm!f(-2C(F+4iJ7k_!aG-MYtQpFhmOnD=m|b5{l7P( zM@zJQYTiuIyBeHrOQ+4)3Qk{wW^8h?#);C>hb*lS7D+1@nu#VF^djg z*)X--A*JK@XBE4YQygz6P3~9t5vM79C)V!Z-{XODUSAGsDy1xN-2P&_e!+X=ZJ(WQ ztS>Bj*xWS#Nc)KmDc>DV#Z}g^8QHpMT%7b$v-}tfpR7QK>g3~-bTc_mhllrBK3|BkS{0}M`EBftOsT&>E$z`)??>gTe~DWM4fls;i_ diff --git a/src/ui/android/res/drawable-mdpi/sym_keyboard_return.png b/src/ui/android/res/drawable-mdpi/sym_keyboard_return.png deleted file mode 100644 index cbe2b152f32330ea352d1954b822c6601860be7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmeAS@N?(olHy`uVBq!ia0y~yV31*8U{K>=V_;yo{^oZ)0|SF(iEBhjaDG}zd16s2 zgJVj5QmTSyZen_BP-%hAr-fh{`~)M&uq&m%slttiq^$qeNh%Z zx_|!sEM^ec&;IDY!yfs_zKLS4(ibLub~wf0d1B)9>E9W2o3Au1QefQ`!PxRrsNJDk zsNqVjf}KCF_sotBId)UD8IEk(ERZpic~a_@vtkaX9VYIZC$_SawLSIsLdTAYzZyQZ zoGCe=-Z_b%Gs2BifaTd?eho)1-^MK)av0ATeX(HSv|F$#RlH$`K=z`>T}pykhD#Yz zj7^jYy>Q*JY{?6gxLs7Glyq9f4~3j<4-mHs(yZvz&df;FythdtD^tld r*zj@2{iG|00=eCFmsm1z7%;d6=2W-(lw4q7U|{fc^>bP0l+XkKl0tu1 diff --git a/src/ui/android/res/drawable-mdpi/sym_keyboard_search.png b/src/ui/android/res/drawable-mdpi/sym_keyboard_search.png deleted file mode 100644 index 127755d6b597c85c00eb05f760dfd48230352dd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1029 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 diff --git a/src/ui/android/res/drawable-xhdpi/ic_app.png b/src/ui/android/res/drawable-xhdpi/ic_app.png deleted file mode 100644 index f7eb066825c2beef5b37ad3f9f539cd7b860e7ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3672 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RWSc;uILpV4%IBGajIv5xj zI14-?iy0VLJ3*K+H)HNE1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh zq!<`@uX?&ThE&XXd$)SRz0gYb59i~1E$+ljcZ2=&inA)S+cK3aVl+1FJ#dU^t!3P+ zM;qIJJZ-kEE!wf@n>e z?((e#XIcK~Bno}`xZ5l&C*`Qnyq_leZ@ZqUsB>j+a4XTuV#~f>^rgMxHs_wTGdE|? z;HkX!{o@U@eYG;@7a1&bX%RTKMX}hp_x6tj{rx;G4t47LE1F*0ovE4Al6HScv&>H-0cFCRX*-J52oE-75u zv-Cl@(eBCTpI4d+6m41ixO)E6q(6>Y3p6d1MB`$$ZYGu{fEpe*d`HLeW%z za&WL=nwC9_qUp*slgBf(XM9(RKflRVpsM1_$_ydnb{57(=j|3Y&*uIj@*?`Ix&MO{ zAAjF7a-V}Z558~jXuHC5u8Mp4+NXUEcIUsH4V3n>iacdF;f&R})1PKL+&FqU{%Oz| zFY(KpRu*%1o>=1IbIkC&dwZg@LP_EG{>Q%pCmBxJ^?7UbkAlXWdFRr9#w44V2M3Gl z@8s%d6zrW*XPJNNjDOJchf{fD0=hm<*|d4)_8dCNL-@QvyFMH^^fNcKV-|3%3j@;|8_`TgWcz6vfukBH?PRl)~FOoobA81 z=IJMgea-)^=RK~MZ?&J$qHVFZS-t!iXQX|Mu+5^kFH}5@x-CB1%+q>sIp&vY*h1}= z3G&~X`HWROgS4wWgeSPFZ%VW{B+GdDr2EVphd(*IJGf(c@sj2*&HU5T-am`mE4bsH za?sYYeX<<-pHd57?>LwE>TS=Y7Qxd=5o#Kqlg?!6)yek1dD5BuqdRZgVsoD7jG;W8 z%*R-ly0@2ZethoPyZz56-`%o!z1E-R;{{BcjaKhmGjVhM@wwYK^Vur49Aexbd6aQu zyzrEB|Jvl{t$Ny`ZTY)>O{l4@>fuHch0W8xn;Lu<-S^wsOmbay=+O-ZOW0IAC!JZE zY3ZLnqmVV-{z%o;oAE(!{F#mTKQ>l9Tk~*R`;A4rK1`Eo&T`oQ_Wh%eRre|wKZ{+K za(W^ATTkwugctLq=$ZFUL|RuQ8Co9=f1~BqvykIN%(>mdS=T%V%*MwP=)+|IdF|FE^o(KKf>bu5*+dz!6U-z6ka z?Tzz+mshSDEuJ18IQM7jF$bne(w1DNcMBh{eN{D0^0z=i5Rc(S*VU_jYFe`iO_(X9 zuXN+6TPUxF^|w1y-tX7DCGz;k)@4!!8haSuzrXgU!eyfm`!cN)CP%un!;ZOD+~KnK zob+V&mHqS0b2}C`wewt4J=yoT(y}GshI+V*UG2xJS{@Ur?JNtPW$n9vf?ezG#ED85 zw)b^UQmHJGXR3O1ZSzdS7g;gq)?9gVMSaf1)X$&q%#*x7nU!UdS%x()OmB1If zMN}V1EcduzV0$)lqnedvB0r;I%LEnAjDEp(ParfZg2w)Erf zydQbL7FmC=Rmkx(UGPufVuLf!%&N3!H#W|ZYZm;#bbG-%F9*vBS1wNK6;xww7W}|k z_Uwk0;k}YILIF`KrDuFNZxp{?FTwcJY?|ML9{*$9<)K1e%}*Tt)+}AxEWYG-PV-#$ zCsC1e0)9`NVZGeTA#=jd!(WzsWUbS?`>LLoai#dg>K^q3wtVsYx{yMF7vCFZRi@9| zwm)U%m27Dr=1=n}##}p^co^k2OA2YH1PPq#c)HD|4tN*`!LNmVq zW$G#x85yJS!a}FNRdV9rZ?na=EUiD0n_y@(z3`#H{MAVkFZfGlAKX1*zpETK2Tn{$l<%rKd-AivLep{>?fALdA2i}ea=>X)6LxX6HlwX%TD@N{Ac1SNhw{U z{tXMJExz_So{eP}uO~y*zVrK8H>n@XQ7BEmaPu(NOV#Pe7VlI%{cQD*M#gd-HdTec z4&US>_qNWLJE-bCbGC|Ssjh^i5&wn-^CpKE{|>r!Bx3bm`5Wh_bHDh>dEd#x^lWGF zv2$`^9+OmNx*qn)^GW~zowsOri3d}V?u*@R;@du-aJl#U{+y7jO^M2zP0szZT)ngQ zX2A3qzLKwUzW?RkbG7ijbN*Z5!P($>cg?G=lTNdany%V*BsWA;YvP$jE2oFn?x_kp zqjA~bMSAD|kst^2~xNosPgsGa(nIZ@TTyV8T* z_kp3z?0LuE^%q^fyQflZyWX>tDxTMPwxo+XOj=xP+&}GMfL+Rsul66`m?h6B+~hea zCGNo)vAmZ_Pv?KO{e4o$;7*FH>5L!A_ddqeT{-=!yzt>7uDgapA^Zf8~@PO`~y!J|IfdID?(+{);yHX%vyJTWxzTG zSG5)0;zv(O^(M_a6SU1r`Q%^cSoQDhhlK2=eaqf&B=vHEbb8?(y?J^QVnxq$AG6V4 zvB-6Ywcer0Jd>XNOSsMPJLI#Ly!Z8!)kl|X&d1)n{3it<&A}o2{WFsIekY) z`qP_zQ@f8WzLQwlwOF>sHcIT{cGgXi*Zy`{Cc7T0P-K{CdglCQUH|KcUM!No@J?QY z(UmE~<@EW*YG0m4{O8G+;TAf^%y=T_!6X}5%UkbL8)vxZ-_X={_dVbsB=__c(_Txn zbq}T#O%BLp3b=f#$w{Yk>sK>9VShgU9WSQ!G$=WmBpf>&6S~0K{q^aOIy-Z&8fv*Z z{Mv0A{qwcMw&`F03%%y>k$!nbpOcZe(d${Yga~I+R|_YB`hMGHpTptw-`lYYn))%dDWMLcnlJ9m7dv?G z*8bki>>paidP)B_&M{V z<;!A?AKUBqO6d4JF;zXS9{AmE+0&EyDbK%M$*IU)`FW4Vle)&|-BAy=o-{rt^|-B} zQNqDv|1=fX|N8%?Yn(Y4Whf~s{==asnu+ajhVzr-lMk>znxOQcz{T|3=0iW~c}{zp V9(f$x!@$76;OXk;vd$@?2>_KG^`HO% diff --git a/src/ui/android/res/drawable-xhdpi/ic_dictionary.png b/src/ui/android/res/drawable-xhdpi/ic_dictionary.png deleted file mode 100644 index 985644ebd18dc6d62a42c2d9834fadb59fd809e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3591 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 diff --git a/src/ui/android/res/drawable-xhdpi/ic_drawer.png b/src/ui/android/res/drawable-xhdpi/ic_drawer.png deleted file mode 100644 index a5fa74def4b40d7eb6826da05bd5e12b836cb999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2836 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}oCO|{#S9GG!XV7ZFl&wk z0|S?Trn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st+~PJA;B-jY`@?8;^f`YFvUAR zNR&e%$f>(QWTKjuBBy{?hvLGUqJakmU0qqEPb}zQ?(1vl5e?Mg>EgP<{zP$6U-ROQ zu2a7sRxi%Jw&(k^v;VeUw|lQz`~GlIyvbvLx3(rf_nY4%M1;3f6T0AWQd-kD9X5C zB7=f(YKIF$hBd>Q^I=`C3=swlB5B@7EE#U-G8lMT#JFBV&*2Bohp{DjnN#sh3w(sdU6`)JjJy| z%o3RrXF2E{s+=il)M�PV*|l=S%D z)AOqf92giLmegJRr=!1Fs==DAA@|=R)pslzaoh_^zjvo?;&<4}u;Asb@XrOHuyI{D zVdu@8PoF%w;dR6*I`LF^?Z5Ox@dv{H=KQR)`SbnjgME)w8jWHb-C2G-ICSQV&r+H5 zlQ>(F?mX*v|FfO@{~y`QN=H1Cc1CE4JPs5p>~opb^Vw*rQm4}-&7-Q9{-->;uk)MP z?!GC*hAcbA>WR85Vw0J_d8-RVlpJ{Uoq^%g?)-ySG&qj}HTE=evN)dL5KdIQ z)xnt56`|b6AwIM9hvGpG7NKqxg_9j3flA&JO+5^QxN*)_l1-a!&&`e3ua#^+9GA!W47@5h1D7SxBBgz zj~g6#A;E5ZB*#GS*kPxQ7CM}hlTU9{TEnyYnAC=_HO#v^zb2pGSk5BU=z4(DjHTR3 zAyLlJBf=-b?}o<;1sN3+!CRc>oXjnOht!oOukhZYwoCBm5s4%t!}bUd9p!66{lfYJ z)g8`9%vFRsosHCYPGIufxFqC~&?UD^c|poAbym(c@sLuUeDYRG_9k}ADLM+;Ct9D( zeRBAT@e}DMil3sn<|a85F8LAsNF(S}mY3vHfu|-<*-~d1IfgEt6?AvS!Vp2z{wSxl z3%3QW4{To{Y*ISQ@@%u1r}xsei>6+d$`H@^p1J--$u7aWQ|0`oUkJZ+`lb7e=`WbS zl=JYmi8deaNY{{@Ex|64E?F+IeumF7$;;i6$3qOv4PVcAK9hfDerSZ&Hmw@biKn=x zdQDZEDy^j-vU1h3RrgkLhkgz{9n!xtF1U7`Tc~mHe>d_u9`{m@QFl-8KgT-vdGO8PyUV$j zi}~7GeO;%wDtoE)!rd*_s-Zv4yNvdDMa_T;rjSw=362#t!}?6!99TGea2*X~{}xO}JIWWUw(uB9K| z@NwJ8Z7a7+Zg_fw?e@BDx!Y zH{DKew)C;PC-y$^D*0L%`>^WL*SWJd&pz~a#qIU)%-&_bYrix9jLCe>d6CA&7Y?6r zeh~QdqCNNgsRr5i*VOqt`!}Xte?weiF{Ks~WZOrc( z-HVJrV}4-!iS4KT59iN|Z@uqaulzsdf7Sns49go-8Pl0N8yy>?nSTGMs!`nEXK!^o z_1mVKZykFU>~s`$>~C7z^z`6b#f%egCahKb{(Q!{iRUu;S_A4{T)V)Y_$;yea2=0& zYkO;Wn|)tFM}*Wx!|A5w7w~uqa%k{cmrdoEZ^s;PjneQ^$Wq(XB zE%MCOh`AA-Io>jsdRptu@^bdw|MT{9`=hy!xF1)G&(J>+TTr?1+@UY6%f(je3F%l( zbMWc#vzYS1Q9x^jSdZ!_;d0eJuF6BQhtiewFPdHKxZxb5CFl3aL(8{n(wm8UOe9?^Mp05k-A*loR+-^iPE^P#l9&$H9T$q+0Ijz(^k*ZKKu5}=2N#P zn9q4X|NmQ|LqZQHZCl#r9j+@I@oev!EXz$cg_XCt9*eSSw}r8-vDwkJO)K}R|LV8l z)7RDQRjcyNZj3v4s_EcX#_ZSJpLO=5U*2G_JbEWM>JG<72+!miM zT7N_1PQ_E{_WV=(XWp5zW##H4J5$c5T}pfT?4IttXufHyrazm`m&bea))wCTVO!pQ z{pNaGfBIRC+q;{$IqzJ&-)6_2)a577owc?PSrYOkt)mB z$?2cY_spF-x3*62=bePxi?&riPd;})i$DMUE`gGVmt6mMKeygveJhIR>@!u2w#o?{vP3ODqSM8(!-MR7pPJPya z@&%tS-f{oV*4ljj-^8!|{LZZXGy6}s@wUC5XJKb)`N+QL@5?{SozJJ7SDPpPZ_&Tg z>%_(M>wa8)ef`|U85b8$|1^E_{@j|Se_tJVExG>ou|vn?_MNOSHjMic_WSL@@;l|S z?-$?a_kU8OP_OYna3$jP7}zo^M^L^0kQd!rh&g3=PQ#X1sn?!oc9r!BEr4$H2fLc%Zz2H)T=zB(_H? R2@DJj44$rjF6*2UngAQMK|lZi diff --git a/src/ui/android/res/drawable-xhdpi/ic_mic.png b/src/ui/android/res/drawable-xhdpi/ic_mic.png deleted file mode 100644 index 13d21274ac33c9ba8cbd4f104886d78f83afa13d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 783 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE?jhe zyYFbz56>koB96H$CoH+SfirN5LZHv*h5aT@uF)CFAsbk|MHg#`&JS%`A3u5iw0X+L z8+6VtzU`7$_P+77+RYTB=V$hozdN($F$W7%ql1C~2aB`&&KSFSe#?tjhGdCe|Gwkh zfqf6ZzV=bu{9@O;l+{=KTY*|D#H0T znBi8M3QL1^f4jo}^RK@Cx~RcXpuC3RYSz~!912Vw3`z~C)Wr-FDfbO+@=JeO+i5VC z+&1}hy`xh(_G4*X=>;a1vR*H>cfZd3b7z#BA;l!#rpaI)B*}CvZ_cJ-=Wh+$-PE0Q z84fL!^JdK2ddu+XDrvjGb!{RK_z!pGigX_pUUgUZ@p9*Pe=py9`%Q7*^J8lF>Tj-R z_;EJ)ZkpZv{Yz}JZ&ol${C}fkz1IG8+UDyYZl13@sXqB6f2-5OoPw^WKbt->HRKr0 zU>E5$eE0QxQFWiuiTM}z2S4Ysamt?Nwe<2a?gN@!Dsh^Edu)YLnUd}t|0{YY{`gnR zJAV!1?mMoT&%N#Fdr9l>A#>e>H z-S0b6Xz9%K)kNx)x_MebfEP1wtqx!^C!^z7-H|h&O eQr!lQ-J1^ExC`wHHD_R8VDNPHb6Mw<&;$TP{$?8h diff --git a/src/ui/android/res/drawable-xhdpi/ic_search_black_24dp.png b/src/ui/android/res/drawable-xhdpi/ic_search_black_24dp.png deleted file mode 100644 index 6381902686163ea2671b9ce56e275afe393accae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4i*LmhQHi~JPZts(>+}rLn;{GUOw+79VpW9 zF@NzSwa6u}b3UctZqaG#Sn$PCq?Y%;^jFb48nwKEORT!KU8?2$!7wY`gURyjqk7NJ>hlg=^mw9mX2O~6t3|`Z;6<7 zJ#BXMky!!i0lwi+QtD4WzOa3VgVF3lKiP|Y99xbFPr9_YE@~qm=e36|*7qcgpU!Pz zloeq0YBvbGIeqX W$M5KRoyNexz~JfX=d#Wzp$P!Vj?<(7 diff --git a/src/ui/android/res/drawable-xxhdpi/ic_app.png b/src/ui/android/res/drawable-xxhdpi/ic_app.png deleted file mode 100644 index 6154d852aeeea84c67ce81471002758c062dc213..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6265 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 AKmY&$ diff --git a/src/ui/android/res/drawable-xxhdpi/ic_drawer.png b/src/ui/android/res/drawable-xxhdpi/ic_drawer.png deleted file mode 100644 index 9c4685d6e046ce6c450c19426dce627a88718bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?Fl})SuHmUGk~L?t|?22Q^FQs((tCEt(D%S%tq;u4O>aM`G(aho|@J$`9w4K2GPo?_LCphMLsLcTDF#d zm!0ilo17NwshNi->??2UOm|soW_Y=^F5=@$_UnxkMZapLcf99auC%+OQ|;^7SI5sU zIC1YnL*u4h<(GbN?hyEy$K%u4D*ESa*B=(PYexT!N))VLt5o07sJ(H6 zT)pJP{YM-$#Fl-SF7)$*U4z$vQRl&)3dBR%~iV4@v$x+xf?W%`55Q z&i}q=^C!MP=&<`Gkz`;>lZk` z!YemnMeP4tnbnt8oNC!~{EGUVS(Tga=pSeDJ1cRFXkFUJ3JMN{sb={WfAyol(L7B_HO)XQNI%~3*l&=25OXqKe-`c335`J<~ wUt?O?nb#5_o7N@=teh#XGtomusGgzs?(g#_7rI+8FfcH9y85}Sb4q9e0J(@r(f|Me diff --git a/src/ui/android/res/drawable-xxxhdpi/ic_search_black_24dp.png b/src/ui/android/res/drawable-xxxhdpi/ic_search_black_24dp.png deleted file mode 100644 index 21be572990b53d8e0e518c620a3257f19bd1864b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4i*Lm29JsRH#0CWYkRslhEy=Vxw+TdIb5RQ z<8jrEt9MLq%5-A)_2Ia6Wp7mBYk`u9(eeEQ$c*a4K-6m(vg#=})n(qrZ-#5B;@Y;TNp1H!uW-2wki=X!L%5f8cl5C4fW^;bm zPhKGHna6v+)l){|(V2pug1bbY@&$$#BpfXGtn$M3R6*a_#8}oq-OH{8?^dX?EC!nYru>Hn}l7y3hw>I68N{F z^mE55$4PNZDxE?$TNHGy$m_hcR^t1)x_@3>VvBYuyP98WJDor2z{FCPyUIKD-u+c) zxqIEh_zY{(3ZFI2&7TDfzZfgZbOpHcnBG*r{A}fJe{RE&$G$SBFE|*4r_Oer)FY&J zM#FQO#>;ZKtsnUd^QN&qs*ZmY&}Q{$e)1C33<#(@GFNXSRxzwbK=c`Ws{K>*KeM9TV zr|LC6haRc>B - - - - \ No newline at end of file diff --git a/src/ui/android/res/drawable/grid_phrasebook_button.xml b/src/ui/android/res/drawable/grid_phrasebook_button.xml deleted file mode 100644 index 21a6ac127..000000000 --- a/src/ui/android/res/drawable/grid_phrasebook_button.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/ui/android/res/drawable/ic_volume_up_black_18dp.png b/src/ui/android/res/drawable/ic_volume_up_black_18dp.png deleted file mode 100644 index 992d2c45257add162fbd90dde743e76cc2ebfa33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmeAS@N?(olHy`uVBq!ia0y~yV2}o34i*Lm2KBo(_ZS!$9(uYshEy=#y}Z%0IZ%T2 zLbKScxaxxq6Bt=KkC;TgP!iJV5ndv~Ig3$*sgUWYQ%7qn$F7zY*+;bh#BTWTcj>+8 z`Oo&g|HU79HOM&oMOQd`m$89^`zk+^Qvo~&mRSq-OR26%YM3{3hn_=mkFwzJ{foO^ zN<^}Jf5gg=@M7(&-DftgvtW-_iefkr5%Txs8IyzUFQ#s`U^Gu!GDothb4SRzF9+A| z&`39a{UBIo+Wse!8QnKDes9lRE_NWq=K9`A$%55i^ESQr?l~>)a69Bk^U_ay-+Elt nK3#hKZ%X*tH5tEF|73ezxN42{A+ - - - - \ No newline at end of file diff --git a/src/ui/android/res/drawable/second_person_chunk_utterance_bg.xml b/src/ui/android/res/drawable/second_person_chunk_utterance_bg.xml deleted file mode 100644 index d10d67122..000000000 --- a/src/ui/android/res/drawable/second_person_chunk_utterance_bg.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/ui/android/res/drawable/second_person_utterance_bg.xml b/src/ui/android/res/drawable/second_person_utterance_bg.xml deleted file mode 100644 index e07cc10b3..000000000 --- a/src/ui/android/res/drawable/second_person_utterance_bg.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/ui/android/res/drawable/second_person_worst_utterance_bg.xml b/src/ui/android/res/drawable/second_person_worst_utterance_bg.xml deleted file mode 100644 index f4effe3bc..000000000 --- a/src/ui/android/res/drawable/second_person_worst_utterance_bg.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/ui/android/res/layout/activity_help.xml b/src/ui/android/res/layout/activity_help.xml deleted file mode 100644 index 3cb88a569..000000000 --- a/src/ui/android/res/layout/activity_help.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/src/ui/android/res/layout/activity_lexical_entry.xml b/src/ui/android/res/layout/activity_lexical_entry.xml deleted file mode 100644 index fa49f252b..000000000 --- a/src/ui/android/res/layout/activity_lexical_entry.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/res/layout/activity_main.xml b/src/ui/android/res/layout/activity_main.xml deleted file mode 100644 index b77fe5857..000000000 --- a/src/ui/android/res/layout/activity_main.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ui/android/res/layout/activity_navigation.xml b/src/ui/android/res/layout/activity_navigation.xml deleted file mode 100644 index 44311b90d..000000000 --- a/src/ui/android/res/layout/activity_navigation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - diff --git a/src/ui/android/res/layout/activity_semantic_graph.xml b/src/ui/android/res/layout/activity_semantic_graph.xml deleted file mode 100644 index 004e22a7c..000000000 --- a/src/ui/android/res/layout/activity_semantic_graph.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/res/layout/alternative_item.xml b/src/ui/android/res/layout/alternative_item.xml deleted file mode 100644 index f35d1b938..000000000 --- a/src/ui/android/res/layout/alternative_item.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/ui/android/res/layout/checkbox_input_list_item.xml b/src/ui/android/res/layout/checkbox_input_list_item.xml deleted file mode 100644 index 255d0ae8d..000000000 --- a/src/ui/android/res/layout/checkbox_input_list_item.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/src/ui/android/res/layout/first_person_utterance.xml b/src/ui/android/res/layout/first_person_utterance.xml deleted file mode 100644 index 97171149c..000000000 --- a/src/ui/android/res/layout/first_person_utterance.xml +++ /dev/null @@ -1,11 +0,0 @@ - - diff --git a/src/ui/android/res/layout/fragment_phrase_list.xml b/src/ui/android/res/layout/fragment_phrase_list.xml deleted file mode 100644 index 1868da31c..000000000 --- a/src/ui/android/res/layout/fragment_phrase_list.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/src/ui/android/res/layout/fragment_translator.xml b/src/ui/android/res/layout/fragment_translator.xml deleted file mode 100644 index 6b6584f98..000000000 --- a/src/ui/android/res/layout/fragment_translator.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/ui/android/res/layout/input.xml b/src/ui/android/res/layout/input.xml deleted file mode 100644 index fdef07a53..000000000 --- a/src/ui/android/res/layout/input.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/src/ui/android/res/layout/keyboard_languages_options.xml b/src/ui/android/res/layout/keyboard_languages_options.xml deleted file mode 100644 index 17512df19..000000000 --- a/src/ui/android/res/layout/keyboard_languages_options.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/ui/android/res/layout/languages_item.xml b/src/ui/android/res/layout/languages_item.xml deleted file mode 100644 index d5f47ab27..000000000 --- a/src/ui/android/res/layout/languages_item.xml +++ /dev/null @@ -1,8 +0,0 @@ - - diff --git a/src/ui/android/res/layout/lexical_item.xml b/src/ui/android/res/layout/lexical_item.xml deleted file mode 100644 index 1d3835e54..000000000 --- a/src/ui/android/res/layout/lexical_item.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - diff --git a/src/ui/android/res/layout/number_input_list_item.xml b/src/ui/android/res/layout/number_input_list_item.xml deleted file mode 100644 index a3cfa07e5..000000000 --- a/src/ui/android/res/layout/number_input_list_item.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/ui/android/res/layout/phrase_list_item.xml b/src/ui/android/res/layout/phrase_list_item.xml deleted file mode 100644 index f812ad871..000000000 --- a/src/ui/android/res/layout/phrase_list_item.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/src/ui/android/res/layout/second_person_utterance.xml b/src/ui/android/res/layout/second_person_utterance.xml deleted file mode 100644 index 416d85328..000000000 --- a/src/ui/android/res/layout/second_person_utterance.xml +++ /dev/null @@ -1,12 +0,0 @@ - - diff --git a/src/ui/android/res/layout/spinner_input_list_item.xml b/src/ui/android/res/layout/spinner_input_list_item.xml deleted file mode 100644 index be07004f4..000000000 --- a/src/ui/android/res/layout/spinner_input_list_item.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - diff --git a/src/ui/android/res/menu/main.xml b/src/ui/android/res/menu/main.xml deleted file mode 100644 index f36095749..000000000 --- a/src/ui/android/res/menu/main.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - diff --git a/src/ui/android/res/values-sw600dp/dimens.xml b/src/ui/android/res/values-sw600dp/dimens.xml deleted file mode 100644 index 44f01db75..000000000 --- a/src/ui/android/res/values-sw600dp/dimens.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/src/ui/android/res/values-sw720dp-land/dimens.xml b/src/ui/android/res/values-sw720dp-land/dimens.xml deleted file mode 100644 index 61e3fa8fb..000000000 --- a/src/ui/android/res/values-sw720dp-land/dimens.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - 128dp - - diff --git a/src/ui/android/res/values-v11/styles.xml b/src/ui/android/res/values-v11/styles.xml deleted file mode 100644 index 3c02242ad..000000000 --- a/src/ui/android/res/values-v11/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/src/ui/android/res/values-v14/styles.xml b/src/ui/android/res/values-v14/styles.xml deleted file mode 100644 index a91fd0372..000000000 --- a/src/ui/android/res/values-v14/styles.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/src/ui/android/res/values/attrs.xml b/src/ui/android/res/values/attrs.xml deleted file mode 100644 index debd08fa0..000000000 --- a/src/ui/android/res/values/attrs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/ui/android/res/values/colors.xml b/src/ui/android/res/values/colors.xml deleted file mode 100644 index e7dbbada4..000000000 --- a/src/ui/android/res/values/colors.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - #FF000000 - #FFE35900 - #ff808080 - #ffffffff - #75CD75 - #616161 - diff --git a/src/ui/android/res/values/dimens.xml b/src/ui/android/res/values/dimens.xml deleted file mode 100644 index 04289dc79..000000000 --- a/src/ui/android/res/values/dimens.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - 16dp - 16dp - 50dip - 25sp - 6sp - - diff --git a/src/ui/android/res/values/strings.xml b/src/ui/android/res/values/strings.xml deleted file mode 100644 index 8281a1353..000000000 --- a/src/ui/android/res/values/strings.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - GF Offline Translator - - Microphone - Switch languages - Opening - Speech Input - Keyboard Input - Semantic Graph - Help - org.grammaticalframework.ui.android.GLOBAL_PREFERENCES - - authority_key - source_key - target_key - alternatives_key - - - Done - Go - Next - Previous - Send - - - normalKeyboardMode - internalKeyboardMode - - Search word: - Search for words in the lexicon - - Topics - Open topics - Close topics - - Phrasebook - diff --git a/src/ui/android/res/values/styles.xml b/src/ui/android/res/values/styles.xml deleted file mode 100644 index c839d30a9..000000000 --- a/src/ui/android/res/values/styles.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - diff --git a/src/ui/android/res/xml/cyrillic.xml b/src/ui/android/res/xml/cyrillic.xml deleted file mode 100644 index b699d9c19..000000000 --- a/src/ui/android/res/xml/cyrillic.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/res/xml/devanagari_page1.xml b/src/ui/android/res/xml/devanagari_page1.xml deleted file mode 100644 index 14e87a4f3..000000000 --- a/src/ui/android/res/xml/devanagari_page1.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ui/android/res/xml/devanagari_page2.xml b/src/ui/android/res/xml/devanagari_page2.xml deleted file mode 100644 index 982adb277..000000000 --- a/src/ui/android/res/xml/devanagari_page2.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - "आ" - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ui/android/res/xml/method.xml b/src/ui/android/res/xml/method.xml deleted file mode 100644 index af83761ca..000000000 --- a/src/ui/android/res/xml/method.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/ui/android/res/xml/nordic.xml b/src/ui/android/res/xml/nordic.xml deleted file mode 100644 index 80b1d6e51..000000000 --- a/src/ui/android/res/xml/nordic.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/res/xml/popup_keyboard.xml b/src/ui/android/res/xml/popup_keyboard.xml deleted file mode 100644 index 521d3d278..000000000 --- a/src/ui/android/res/xml/popup_keyboard.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/src/ui/android/res/xml/qwerty.xml b/src/ui/android/res/xml/qwerty.xml deleted file mode 100644 index a0021d4b4..000000000 --- a/src/ui/android/res/xml/qwerty.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/res/xml/searchable.xml b/src/ui/android/res/xml/searchable.xml deleted file mode 100644 index 7e7b6a846..000000000 --- a/src/ui/android/res/xml/searchable.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/src/ui/android/res/xml/symbols_page1.xml b/src/ui/android/res/xml/symbols_page1.xml deleted file mode 100644 index 509bb79ae..000000000 --- a/src/ui/android/res/xml/symbols_page1.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ui/android/res/xml/symbols_page2.xml b/src/ui/android/res/xml/symbols_page2.xml deleted file mode 100644 index b55e6f521..000000000 --- a/src/ui/android/res/xml/symbols_page2.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/res/xml/thai_page1.xml b/src/ui/android/res/xml/thai_page1.xml deleted file mode 100644 index bcc2aee39..000000000 --- a/src/ui/android/res/xml/thai_page1.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/res/xml/thai_page2.xml b/src/ui/android/res/xml/thai_page2.xml deleted file mode 100644 index 00e76f525..000000000 --- a/src/ui/android/res/xml/thai_page2.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/ASR.java b/src/ui/android/src/org/grammaticalframework/ui/android/ASR.java deleted file mode 100644 index 8d683e1f5..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/ASR.java +++ /dev/null @@ -1,240 +0,0 @@ - -package org.grammaticalframework.ui.android; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.speech.RecognitionListener; -import android.speech.RecognizerIntent; -import android.speech.SpeechRecognizer; -import android.text.TextUtils; -import android.util.Log; - -import java.util.ArrayList; - -/** - * Convenience wrapper around the {@link SpeechRecognizer} API. - */ -public class ASR { - - private static final boolean DBG = false; - private static final String TAG = "ASR"; - - private final Context mContext; - - private SpeechRecognizer mSpeechRecognizer; - - private String mLanguage = null; - - private State mState = State.IDLE; - - private Listener mListener; - - public static enum State { - IDLE, INITIALIZING, WAITING_FOR_SPEECH, RECORDING, WAITING_FOR_RESULTS; - } - - public ASR(Context context) { - mContext = context; - if (SpeechRecognizer.isRecognitionAvailable(context)) { - mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(context); - mSpeechRecognizer.setRecognitionListener(new MyRecognitionListener()); - } - } - - public void setListener(Listener listener) { - mListener = listener; - } - - public void setLanguage(String language) { - mLanguage = language; - } - - public void startRecognition() { - Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); - if (!TextUtils.isEmpty(mLanguage)) { - intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, mLanguage); - } - intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, - RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); - intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 2); - intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); - // Weird, this shouldn't be required, but on ICS it seems to be - intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, - mContext.getPackageName()); - - mSpeechRecognizer.startListening(intent); - setState(State.INITIALIZING); - } - - public void stopRecognition() { - mSpeechRecognizer.stopListening(); - setState(State.IDLE); - } - - public boolean isRunning() { - return mState != State.IDLE; - } - - private void setState(State newState) { - if (DBG) Log.d(TAG, "Entering state: " + newState); - mState = newState; - if (mListener != null) { - mListener.onStateChanged(mState); - } - } - - public State getState() { - return mState; - } - - public void destroy() { - if (mSpeechRecognizer != null) { - mSpeechRecognizer.destroy(); - mSpeechRecognizer = null; - } - } - - private void handlePartialInput(String text) { - if (mListener != null) { - mListener.onPartialInput(text); - } - } - - private void handleSpeechInput(String text) { - if (mListener != null) { - mListener.onSpeechInput(text); - } - } - - private class MyRecognitionListener implements RecognitionListener { - @Override - public void onReadyForSpeech(Bundle params) { - if (DBG) Log.d(TAG, "onReadyForSpeech"); - setState(State.WAITING_FOR_SPEECH); - } - - @Override - public void onBeginningOfSpeech() { - if (DBG) Log.d(TAG, "onBeginningOfSpeech"); - setState(State.RECORDING); - } - - @Override - public void onBufferReceived(byte[] buffer) { - // Ignore - } - - @Override - public void onRmsChanged(float rmsdB) { - if (DBG) Log.d(TAG, "onRmsChanged(" + rmsdB + ")"); - } - - @Override - public void onEndOfSpeech() { - if (DBG) Log.d(TAG, "onEndOfSpeech"); - setState(State.WAITING_FOR_RESULTS); - } - - @Override - public void onError(int error) { - if (DBG) Log.d(TAG, "Error: " + errorMessage(error) + " (" + error + ")"); - setState(State.IDLE); - } - - private String errorMessage(int speechRecognizerError) { - switch(speechRecognizerError) { - case SpeechRecognizer.ERROR_NETWORK_TIMEOUT: - return "network timeout"; - case SpeechRecognizer.ERROR_NETWORK: - return "network"; - case SpeechRecognizer.ERROR_AUDIO: - return "audio"; - case SpeechRecognizer.ERROR_SERVER: - return "server"; - case SpeechRecognizer.ERROR_CLIENT: - return "client"; - case SpeechRecognizer.ERROR_SPEECH_TIMEOUT: - return "timeout waiting for speech"; - case SpeechRecognizer.ERROR_NO_MATCH: - return "no match found"; - case SpeechRecognizer.ERROR_RECOGNIZER_BUSY: - return "recognizer busy"; - case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS: - return "insufficient permissions (missing RECORD_AUDIO?)"; - default: - return "unknown"; - } - } - - @Override - public void onEvent(int eventType, Bundle params) { - if (DBG) Log.d(TAG, "onEvent(" + eventType + ")"); - } - - @Override - public void onPartialResults(Bundle bundle) { - if (DBG) { - StringBuilder sb = new StringBuilder(); - sb.append("onPartialResults:"); - appendResults(sb, bundle); - Log.d(TAG, sb.toString()); - } - - String result = getResult(bundle); - if (!TextUtils.isEmpty(result)) { - handlePartialInput(result); - } - } - - @Override - public void onResults(Bundle bundle) { - if (DBG) { - StringBuilder sb = new StringBuilder(); - sb.append("onResults:"); - appendResults(sb, bundle); - Log.d(TAG, sb.toString()); - } - - setState(State.IDLE); - - String result = getResult(bundle); - if (!TextUtils.isEmpty(result)) { - handleSpeechInput(result); - } - } - - private String getResult(Bundle bundle) { - ArrayList results = - bundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); - if (results != null && !results.isEmpty()) { - return results.get(0); - } else { - return null; - } - } - - private void appendResults(StringBuilder sb, Bundle bundle) { - ArrayList results = - bundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); - float[] scores = bundle.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES); - - if (results != null) { - int size = results.size(); - for (int i = 0; i < size; i++) { - sb.append("\n> ").append(results.get(i)); - if (scores != null && i < scores.length) { - sb.append(" [").append(scores[i]).append("]"); - } - } - } - } - } - - public interface Listener { - void onPartialInput(String input); - void onSpeechInput(String input); - void onStateChanged(State newState); - } - -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/AlternativesActivity.java b/src/ui/android/src/org/grammaticalframework/ui/android/AlternativesActivity.java deleted file mode 100644 index 4f39a04e1..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/AlternativesActivity.java +++ /dev/null @@ -1,674 +0,0 @@ -package org.grammaticalframework.ui.android; - -import java.util.*; - -import android.app.Activity; -import android.app.ListActivity; -import android.content.Context; -import android.content.res.Configuration; -import android.os.AsyncTask; -import android.os.Bundle; -import android.view.*; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.view.ViewGroup.LayoutParams; -import android.view.MenuItem; -import android.view.LayoutInflater; -import android.webkit.WebView; -import android.widget.BaseAdapter; -import android.widget.ListAdapter; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.TextView; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.ListView; -import android.widget.AdapterView; -import android.util.Log; -import android.support.v4.widget.DrawerLayout; -import android.support.v4.app.ActionBarDrawerToggle; - -import org.grammaticalframework.pgf.*; -import org.grammaticalframework.ui.android.LanguageSelector.OnLanguageSelectedListener; - -public class AlternativesActivity extends ListActivity { - - private Translator mTranslator; - private LanguageSelector mShowLanguageView; - private View mProgressBarView = null; - private AlternativesAdapter mAdapter = null; - private DrawerLayout mDrawerLayout; - private ListView mDrawerList; - private ActionBarDrawerToggle mDrawerToggle; - - /** Called when the activity is first created. */ - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_lexical_entry); - - mTranslator = ((GFTranslator) getApplicationContext()).getTranslator(); - - mShowLanguageView = (LanguageSelector) findViewById(R.id.show_language); - mShowLanguageView.setLanguages(mTranslator.getAvailableLanguages()); - mShowLanguageView.setOnLanguageSelectedListener(new OnLanguageSelectedListener() { - @Override - public void onLanguageSelected(final Language language) { - new AsyncTask() { - @Override - protected void onPreExecute() { - showProgressBar(); - } - - @Override - protected Void doInBackground(Void... params) { - mTranslator.setTargetLanguage(language); - mTranslator.isTargetLanguageLoaded(); - return null; - } - - @Override - protected void onPostExecute(Void result) { - mAdapter.notifyDataSetChanged(); - collapse(); - hideProgressBar(); - } - }.execute(); - } - }); - - mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); - mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, - R.drawable.ic_drawer, - R.string.topics_open, - R.string.topics_close); - mDrawerLayout.setDrawerListener(mDrawerToggle); - - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setHomeButtonEnabled(true); - - TextView descrView = (TextView) findViewById(R.id.lexical_desc); - - if (getIntent().getData() != null) { - String authority = getIntent().getData().getAuthority(); - String source = getIntent().getData().getQueryParameter("source"); - - List analyses = new ArrayList(); - for (String an : getIntent().getData().getQueryParameters("alternative")) { - analyses.add(Expr.readExpr(an)); - } - descrView.setText(source); - - mAdapter = new AlternativesAdapter(this, authority, analyses); - } else { - mDrawerLayout.openDrawer(Gravity.LEFT); - - mAdapter = new AlternativesAdapter(this, Translator.WORDS); - } - - expandedView = null; - setListAdapter(mAdapter); - - mDrawerList = (ListView) findViewById(R.id.topics_list); - mDrawerList.setAdapter(mAdapter.getTopicsAdapter()); - - mProgressBarView = findViewById(R.id.progressBarView); - } - - @Override - protected void onResume() { - super.onResume(); - - mShowLanguageView.setSelectedLanguage(mTranslator.getTargetLanguage()); - } - - private void showProgressBar() { - mProgressBarView.setVisibility(View.VISIBLE); - } - - private void hideProgressBar() { - mProgressBarView.setVisibility(View.GONE); - } - - private View expandedView; - - private void collapse() { - if (expandedView == null) - return; - - ImageView arrow = (ImageView) expandedView.findViewById(R.id.arrow); - arrow.setImageResource(R.drawable.open_arrow); - - View view = (View) expandedView.findViewById(R.id.desc_details); - ((RelativeLayout) expandedView).removeView(view); - - TextView textView = (TextView) expandedView.findViewById(R.id.abstract_tree); - if (textView != null) - ((RelativeLayout) expandedView).removeView(textView); - - expandedView = null; - } - - private void expandWord(View view, Expr lemma) { - String html = mTranslator.getInflectionTable(lemma); - if (html == null) - return; - - ImageView arrow = (ImageView) view.findViewById(R.id.arrow); - arrow.setImageResource(R.drawable.close_arrow); - - WebView inflectionView = (WebView) view.findViewById(R.id.desc_details); - if (inflectionView == null) { - inflectionView = new WebView(this); - inflectionView.setId(R.id.desc_details); - RelativeLayout.LayoutParams params = - new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); - params.addRule(RelativeLayout.BELOW, R.id.lexical_desc); - ((RelativeLayout) view).addView(inflectionView, params); - } - - inflectionView.loadData(html, "text/html; charset=UTF-8", null); - - expandedView = view; - } - - private void expandSentence(View view, Expr expr) { - ImageView arrow = (ImageView) view.findViewById(R.id.arrow); - arrow.setImageResource(R.drawable.close_arrow); - - ParseTreeView parseView = (ParseTreeView) view.findViewById(R.id.desc_details); - if (parseView == null) { - parseView = new ParseTreeView(this); - parseView.setId(R.id.desc_details); - RelativeLayout.LayoutParams params = - new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); - params.addRule(RelativeLayout.BELOW, R.id.alternative_desc); - ((RelativeLayout) view).addView(parseView, params); - } - - Object[] brackets = mTranslator.bracketedLinearize(expr); - if (brackets[0] instanceof Bracket) { - Bracket b = (Bracket) brackets[0]; - if (b.children[0].equals("*") || - b.children[0].equals("+")) { - Object[] children = new Object[b.children.length-1]; - for (int i = 1; i < b.children.length; i++) - children[i-1] = b.children[i]; - b = new Bracket(b.cat, b.fun, b.fid, b.lindex, children); - brackets[0] = b; - } - } - parseView.setBrackets(brackets); - - TextView textView = (TextView) view.findViewById(R.id.abstract_tree); - if (textView == null) { - textView = new TextView(this); - textView.setId(R.id.abstract_tree); - textView.setTextSize(15); - RelativeLayout.LayoutParams params = - new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); - params.addRule(RelativeLayout.BELOW, R.id.desc_details); - ((RelativeLayout) view).addView(textView, params); - } - textView.setText(expr.toString()); - - expandedView = view; - } - - private class Topic { - public String name; - public Expr expr; - public boolean isChecked; - public boolean isAvailable; - - public Topic(String name, Expr expr) { - this.name = name; - this.expr = expr; - this.isChecked = false; - this.isAvailable = true; - } - } - - private class AlternativesAdapter extends BaseAdapter implements ListAdapter { - /** - * Contains the list of objects that represent the alternatives - */ - private List mAlternatives; - - private Context mContext; - - // A copy of the original mAlternatives array, initialized from and then used instead as soon as - // a topic filtering is applied. mAlternatives will then only contain the filtered values. - private ArrayList mOriginalAlternatives; - - private LayoutInflater mInflater; - - private String mAuthority; - - /** - * A list of lists of topics. Each element in this list contains - * the list of topics for the correponding item in - * mAlternatives/mOriginalAlternatives - */ - private List> mTopics; - - private Map mTopicMap; - private Topic[] mAllTopics; - private Topic[] mOriginalAllTopics; - - private Topic mOtherTopic; - private Topic mSourceTopic; - - private TopicsAdapter mTopicsAdapter; - - public AlternativesAdapter(Context context, String authority, List alternatives) { - mContext = context; - mAuthority = authority; - mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - mAlternatives = alternatives; - - boolean addOther = false; - mTopics = new ArrayList>(); - mTopicMap = new TreeMap(); - for (Expr e : mAlternatives) { - List topics = new ArrayList(); - for (Expr topicExpr : mTranslator.getTopicsOf(e)) { - String name = mTranslator.linearizeSource(topicExpr); - String key = name.toLowerCase(); - Topic topic = mTopicMap.get(key); - if (topic == null) { - topic = new Topic(name, topicExpr); - mTopicMap.put(key,topic); - } - topics.add(topic); - } - mTopics.add(topics); - - if (topics.size() == 0) - addOther = true; - } - - int i = 0; - mAllTopics = new Topic[mTopicMap.size() + (addOther ? 1 : 0)]; - for (Map.Entry entry : mTopicMap.entrySet()) { - mAllTopics[i++] = entry.getValue(); - } - if (addOther) { - Expr topicExpr = Expr.readExpr("other_A"); - String name = mTranslator.linearizeSource(topicExpr); - mOtherTopic = new Topic(name, topicExpr); - mAllTopics[i++] = mOtherTopic; - } - - mOriginalAllTopics = mAllTopics; - - mTopicsAdapter = new TopicsAdapter(); - } - - public AlternativesAdapter(Context context, String authority) { - mContext = context; - mAuthority = authority; - mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - mAlternatives = null; - - mTopics = null; - - int i = 0; - mTopicMap = new TreeMap(); - for (Expr topicExpr : mTranslator.getTopicsOf(null)) { - String name = mTranslator.linearizeSource(topicExpr); - String key = name.toLowerCase(); - Topic topic = mTopicMap.get(key); - if (topic == null) { - topic = new Topic(name, topicExpr); - mTopicMap.put(key,topic); - } - } - mAllTopics = new Topic[mTopicMap.size()]; - for (Map.Entry entry : mTopicMap.entrySet()) { - mAllTopics[i++] = entry.getValue(); - } - - mOriginalAllTopics = mAllTopics; - - mTopicsAdapter = new TopicsAdapter(); - } - - /** - * Returns the context associated with this array adapter. The context is used - * to create views from the resource passed to the constructor. - * - * @return The Context associated with this adapter. - */ - public Context getContext() { - return mContext; - } - - public String getAuthority() { - return mAuthority; - } - - /** - * {@inheritDoc} - */ - public int getCount() { - if (mAlternatives == null) - return 0; - else - return mAlternatives.size(); - } - - /** - * {@inheritDoc} - */ - public Expr getItem(int position) { - return mAlternatives.get(position); - } - - /** - * Returns the position of the specified item in the array. - * - * @param item The item to retrieve the position of. - * - * @return The position of the specified item. - */ - public int getPosition(Expr item) { - if (mAlternatives == null) - return -1; - else - return mAlternatives.indexOf(item); - } - - /** - * {@inheritDoc} - */ - public long getItemId(int position) { - return position; - } - - public View getView(int position, View convertView, ViewGroup parent) { - final Expr expr = getItem(position); - - if (mAuthority.equals(Translator.WORDS)) { - if (convertView == null) { - convertView = mInflater.inflate(R.layout.lexical_item, null); - } - - TextView descView = (TextView) - convertView.findViewById(R.id.lexical_desc); - - String phrase = mTranslator.generateLexiconEntry(expr); - descView.setText(phrase); - - convertView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - if (expandedView == view) - collapse(); - else if (expandedView == null) - expandWord(view, expr); - else { - collapse(); - expandWord(view, expr); - } - } - }); - } else if (mAuthority.equals(Translator.SENTENCES)) { - if (convertView == null) { - convertView = mInflater.inflate(R.layout.alternative_item, null); - - View treeView = (View) convertView.findViewById(R.id.desc_details); - ((RelativeLayout) convertView).removeView(treeView); - - TextView textView = (TextView) convertView.findViewById(R.id.abstract_tree); - ((RelativeLayout) convertView).removeView(textView); - } - - TextView descView = (TextView) - convertView.findViewById(R.id.alternative_desc); - - String phrase = mTranslator.linearize(expr); - - // parse by words, marked by %, darkest red color - if (phrase.charAt(0) == '%') { - descView.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_worst_utterance_bg)); - phrase = phrase.substring(2); - } - - // parse by chunks, marked by *, red color - else if (phrase.charAt(0) == '*') { - descView.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_chunk_utterance_bg)); - phrase = phrase.substring(2); - } - - // parse error or unknown translations (in []) present, darkest red color - else if (phrase.contains("parse error:") || phrase.contains("[")) { - descView.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_worst_utterance_bg)); - } - - // parse by domain grammar, marked by +, green color - else if (phrase.charAt(0) == '+') { - descView.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_best_utterance_bg)); - phrase = phrase.substring(2); - } - - else { - descView.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_utterance_bg)); - } - - descView.setText(phrase); - - convertView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - if (expandedView == view) - collapse(); - else if (expandedView == null) - expandSentence(view, expr); - else { - collapse(); - expandSentence(view, expr); - } - } - }); - } - - return convertView; - } - - public boolean areAllItemsEnabled() { - return true; - } - - public boolean isEnabled(int position) { - return true; - } - - public TopicsAdapter getTopicsAdapter() { - return mTopicsAdapter; - } - - void filterOnTopics(List selected_topics) { - if (mSourceTopic != null && !selected_topics.contains(mSourceTopic)) { - mAlternatives = null; - mOriginalAlternatives = null; - mTopics = null; - mAllTopics = mOriginalAllTopics; - } - - if (mAlternatives == null) { - if (selected_topics.size() == 0) { - notifyDataSetChanged(); - return; - } - - mSourceTopic = selected_topics.get(0); - mAlternatives = mTranslator.getTopicWords(mSourceTopic.expr); - - mTopics = new ArrayList>(); - for (Expr e : mAlternatives) { - List topics = new ArrayList(); - for (Expr topicExpr : mTranslator.getTopicsOf(e)) { - String name = mTranslator.linearizeSource(topicExpr); - String key = name.toLowerCase(); - topics.add(mTopicMap.get(key)); - } - mTopics.add(topics); - } - } - - if (mOriginalAlternatives == null) { - mOriginalAlternatives = new ArrayList(mAlternatives); - } - - mAlternatives = new ArrayList(); - List> topics = new ArrayList>(); - - for (Topic topic : mOriginalAllTopics) { - topic.isAvailable = false; - } - - int count = 0; - for (int i = 0; i < mOriginalAlternatives.size(); i++) { - boolean match = true; - for (Topic topic : selected_topics) { - if (topic == mOtherTopic) { - if (mTopics.get(i).size() > 0) { - match = false; - break; - } - } else if (!mTopics.get(i).contains(topic)) { - match = false; - break; - } - } - if (match) { - mAlternatives.add(mOriginalAlternatives.get(i)); - if (mTopics.get(i).size() == 0) { - if (!mOtherTopic.isAvailable) - count++; - mOtherTopic.isAvailable = true; - } else { - for (Topic topic : mTopics.get(i)) { - if (!topic.isAvailable) - count++; - topic.isAvailable = true; - } - } - } - } - - int i = 0; - mAllTopics = new Topic[count]; - for (Topic topic : mOriginalAllTopics) { - if (topic.isAvailable) - mAllTopics[i++] = topic; - } - - notifyDataSetChanged(); - } - } - - private class TopicsAdapter extends BaseAdapter implements ListAdapter { - public TopicsAdapter() { - } - - public Context getContext() { - return mAdapter.getContext(); - } - - public int getCount() { - return mAdapter.mAllTopics.length; - } - - public Topic getItem(int position) { - return mAdapter.mAllTopics[position]; - } - - public int getPosition(Topic topic) { - for (int i = 0; i < mAdapter.mAllTopics.length; i++) { - if (mAdapter.mAllTopics[i] == topic) - return i; - } - return -1; - } - - public long getItemId(int position) { - return position; - } - - // Shame on you Google this class should not have been here - // but unfortuantely CheckBox.setChecked doesn't work and here - // we need a workarround. Since the class is there now it is also - // used to implement OnClickListener. - private class TopicCheckBox extends CheckBox implements OnClickListener { - private Topic mTopic; - - public TopicCheckBox(Context context, Topic topic) { - super(context); - mTopic = topic; - setOnClickListener(this); - } - - @Override - public boolean isChecked() { - if (mTopic == null) - return false; - else - return mTopic.isChecked; - } - - @Override - public void onClick(View view) { - mTopic.isChecked = !mTopic.isChecked; - filterOnTopics(); - notifyDataSetChanged(); - } - } - - private void filterOnTopics() { - List selected_topics = new ArrayList(); - for (int i = 0; i < getCount(); i++) { - Topic topic = getItem(i); - if (topic.isChecked) - selected_topics.add(topic); - } - mAdapter.filterOnTopics(selected_topics); - } - - public View getView(int position, View convertView, ViewGroup parent) { - Topic entry = getItem(position); - - CheckBox checkBox = new TopicCheckBox(getContext(), entry); - checkBox.setText(entry.name); - checkBox.setTextSize(25); - checkBox.setTextColor(android.graphics.Color.parseColor("#808080")); - return checkBox; - } - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - // Sync the toggle state after onRestoreInstanceState has occurred. - mDrawerToggle.syncState(); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - mDrawerToggle.onConfigurationChanged(newConfig); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Pass the event to ActionBarDrawerToggle, if it returns - // true, then it has handled the app icon touch event - if (mDrawerToggle.onOptionsItemSelected(item)) { - return true; - } - return super.onOptionsItemSelected(item); - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/CompletionsView.java b/src/ui/android/src/org/grammaticalframework/ui/android/CompletionsView.java deleted file mode 100644 index c59dbfe86..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/CompletionsView.java +++ /dev/null @@ -1,291 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.view.View; -import android.view.inputmethod.CompletionInfo; - -import java.util.ArrayList; -import java.util.List; - -public class CompletionsView extends View { - - private static final int OUT_OF_BOUNDS = -1; - - private TranslatorInputMethodService mService; - private CompletionInfo[] mSuggestions; - private int mSelectedIndex; - private int mTouchX = OUT_OF_BOUNDS; - private Drawable mSelectionHighlight; - private boolean mTypedWordValid; - - private Rect mBgPadding; - - private static final int MAX_SUGGESTIONS = 32; - private static final int SCROLL_PIXELS = 20; - - private int[] mWordWidth = new int[MAX_SUGGESTIONS]; - private int[] mWordX = new int[MAX_SUGGESTIONS]; - - private static final int X_GAP = 10; - - private int mColorNormal; - private int mColorRecommended; - private int mColorOther; - private int mVerticalPadding; - private Paint mPaint; - private boolean mScrolled; - private int mTargetScrollX; - - private int mTotalWidth; - - private GestureDetector mGestureDetector; - - /** - * Construct a CandidateView for showing suggested words for completion. - * @param context - * @param attrs - */ - public CompletionsView(Context context) { - super(context); - mSelectionHighlight = context.getResources().getDrawable( - android.R.drawable.list_selector_background); - mSelectionHighlight.setState(new int[] { - android.R.attr.state_enabled, - android.R.attr.state_focused, - android.R.attr.state_window_focused, - android.R.attr.state_pressed - }); - - Resources r = context.getResources(); - - setBackgroundColor(r.getColor(R.color.candidate_background)); - - mColorNormal = r.getColor(R.color.candidate_normal); - mColorRecommended = r.getColor(R.color.candidate_recommended); - mColorOther = r.getColor(R.color.candidate_other); - mVerticalPadding = r.getDimensionPixelSize(R.dimen.candidate_vertical_padding); - - mPaint = new Paint(); - mPaint.setColor(mColorNormal); - mPaint.setAntiAlias(true); - mPaint.setTextSize(r.getDimensionPixelSize(R.dimen.candidate_font_height)); - mPaint.setStrokeWidth(0); - - mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, - float distanceX, float distanceY) { - mScrolled = true; - int sx = getScrollX(); - sx += distanceX; - if (sx < 0) { - sx = 0; - } - if (sx + getWidth() > mTotalWidth) { - sx -= distanceX; - } - mTargetScrollX = sx; - scrollTo(sx, getScrollY()); - invalidate(); - return true; - } - }); - setHorizontalFadingEdgeEnabled(true); - setWillNotDraw(false); - setHorizontalScrollBarEnabled(false); - setVerticalScrollBarEnabled(false); - } - - /** - * A connection back to the service to communicate with the text field - * @param listener - */ - public void setService(TranslatorInputMethodService listener) { - mService = listener; - } - - @Override - public int computeHorizontalScrollRange() { - return mTotalWidth; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int measuredWidth = resolveSize(50, widthMeasureSpec); - - // Get the desired height of the icon menu view (last row of items does - // not have a divider below) - Rect padding = new Rect(); - mSelectionHighlight.getPadding(padding); - final int desiredHeight = ((int)mPaint.getTextSize()) + mVerticalPadding - + padding.top + padding.bottom; - - // Maximum possible width and desired height - setMeasuredDimension(measuredWidth, - resolveSize(desiredHeight, heightMeasureSpec)); - } - - /** - * If the canvas is null, then only touch calculations are performed to pick the target - * candidate. - */ - @Override - protected void onDraw(Canvas canvas) { - if (canvas != null) { - super.onDraw(canvas); - } - mTotalWidth = 0; - if (mSuggestions == null) return; - - if (mBgPadding == null) { - mBgPadding = new Rect(0, 0, 0, 0); - if (getBackground() != null) { - getBackground().getPadding(mBgPadding); - } - } - int x = 0; - final int count = mSuggestions.length; - final int height = getHeight(); - final Rect bgPadding = mBgPadding; - final Paint paint = mPaint; - final int touchX = mTouchX; - final int scrollX = getScrollX(); - final boolean scrolled = mScrolled; - final boolean typedWordValid = mTypedWordValid; - final int y = (int) (((height - mPaint.getTextSize()) / 2) - mPaint.ascent()); - - for (int i = 0; i < count; i++) { - String suggestion = mSuggestions[i].getText().toString(); - float textWidth = paint.measureText(suggestion); - final int wordWidth = (int) textWidth + X_GAP * 2; - - mWordX[i] = x; - mWordWidth[i] = wordWidth; - paint.setColor(mColorNormal); - if (touchX + scrollX >= x && touchX + scrollX < x + wordWidth && !scrolled) { - if (canvas != null) { - canvas.translate(x, 0); - mSelectionHighlight.setBounds(0, bgPadding.top, wordWidth, height); - mSelectionHighlight.draw(canvas); - canvas.translate(-x, 0); - } - mSelectedIndex = i; - } - - if (canvas != null) { - if ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid)) { - paint.setFakeBoldText(true); - paint.setColor(mColorRecommended); - } else if (i != 0) { - paint.setColor(mColorOther); - } - canvas.drawText(suggestion, x + X_GAP, y, paint); - paint.setColor(mColorOther); - canvas.drawLine(x + wordWidth + 0.5f, bgPadding.top, - x + wordWidth + 0.5f, height + 1, paint); - paint.setFakeBoldText(false); - } - x += wordWidth; - } - mTotalWidth = x; - if (mTargetScrollX != getScrollX()) { - scrollToTarget(); - } - } - - private void scrollToTarget() { - int sx = getScrollX(); - if (mTargetScrollX > sx) { - sx += SCROLL_PIXELS; - if (sx >= mTargetScrollX) { - sx = mTargetScrollX; - requestLayout(); - } - } else { - sx -= SCROLL_PIXELS; - if (sx <= mTargetScrollX) { - sx = mTargetScrollX; - requestLayout(); - } - } - scrollTo(sx, getScrollY()); - invalidate(); - } - - @SuppressLint("WrongCall") - public void setSuggestions(CompletionInfo[] suggestions, boolean completions, - boolean typedWordValid) { - clear(); - if (suggestions != null) { - mSuggestions = suggestions; - } - mTypedWordValid = typedWordValid; - scrollTo(0, 0); - mTargetScrollX = 0; - // Compute the total width - onDraw(null); - invalidate(); - requestLayout(); - } - - public void clear() { - mSuggestions = new CompletionInfo[0]; - mTouchX = OUT_OF_BOUNDS; - mSelectedIndex = -1; - invalidate(); - } - - @Override - public boolean onTouchEvent(MotionEvent me) { - - if (mGestureDetector.onTouchEvent(me)) { - return true; - } - - int action = me.getAction(); - int x = (int) me.getX(); - int y = (int) me.getY(); - mTouchX = x; - - switch (action) { - case MotionEvent.ACTION_DOWN: - mScrolled = false; - invalidate(); - break; - case MotionEvent.ACTION_MOVE: - if (y <= 0) { - // Fling up!? - if (mSelectedIndex >= 0) { - mService.pickSuggestionManually(mSelectedIndex); - mSelectedIndex = -1; - } - } - invalidate(); - break; - case MotionEvent.ACTION_UP: - if (!mScrolled) { - if (mSelectedIndex >= 0) { - mService.pickSuggestionManually(mSelectedIndex); - } - } - mSelectedIndex = -1; - removeHighlight(); - requestLayout(); - break; - } - return true; - } - - private void removeHighlight() { - mTouchX = OUT_OF_BOUNDS; - invalidate(); - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/ConversationView.java b/src/ui/android/src/org/grammaticalframework/ui/android/ConversationView.java deleted file mode 100644 index b7d118e7c..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/ConversationView.java +++ /dev/null @@ -1,242 +0,0 @@ -package org.grammaticalframework.ui.android; - -import java.io.Serializable; -import java.util.*; - -import android.content.Context; -import android.os.Bundle; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputMethodManager; -import android.view.KeyEvent; -import android.widget.EditText; -import android.widget.ScrollView; -import android.widget.TextView; -import android.widget.TextView.OnEditorActionListener; - -import org.grammaticalframework.pgf.Expr; - -public class ConversationView extends ScrollView { - - private LayoutInflater mInflater; - - private ViewGroup mContent; - - private OnClickListener mAlternativesListener; - private ASR.Listener mSpeechListener; - - public ConversationView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - public ConversationView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public ConversationView(Context context) { - super(context); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mContent = (ViewGroup) findViewById(R.id.conversation_content); - mInflater = LayoutInflater.from(getContext()); - } - - private class EditorListener implements OnEditorActionListener, OnClickListener { - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((actionId & EditorInfo.IME_MASK_ACTION) != 0) { - CharSequence text = v.getText(); - InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - if (inputMethodManager != null) { - inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); - } - v.setFocusable(false); - mLastUtterance = v; - if (mSpeechListener != null) - mSpeechListener.onSpeechInput(text.toString().trim()); - return true; - } - return false; - } - - @Override - public void onClick(View v) { - v.setFocusableInTouchMode(true); - v.requestFocus(); - InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT); - } - }; - - private EditorListener mEditorListener = new EditorListener(); - private TextView mLastUtterance = null; - - public void addFirstPersonUtterance(CharSequence text, boolean focused) { - EditText edittext = (EditText) - mInflater.inflate(R.layout.first_person_utterance, mContent, false); - edittext.setText(text); - edittext.setOnEditorActionListener(mEditorListener); - edittext.setOnClickListener(mEditorListener); - edittext.setHorizontallyScrolling(false); - edittext.setMaxLines(Integer.MAX_VALUE); - Bundle extras = edittext.getInputExtras(true); - extras.putBoolean("show_language_toggle", false); - mContent.addView(edittext); - - if (focused) { - edittext.requestFocus(); - InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT); - } else { - edittext.setFocusable(false); - } - - post(new Runnable() { - public void run() { - fullScroll(FOCUS_DOWN); - } - }); - - mLastUtterance = edittext; - } - - @SuppressWarnings("deprecation") - public CharSequence addSecondPersonUtterance(String authority, CharSequence source, CharSequence target, List alternatives) { - TextView view; - if (mLastUtterance != null && mLastUtterance.getTag() != null) - view = (TextView) mLastUtterance.getTag(); - else { - view = (TextView) - mInflater.inflate(R.layout.second_person_utterance, mContent, false); - if (mAlternativesListener != null) - view.setOnClickListener(mAlternativesListener); - mContent.addView(view); - post(new Runnable() { - public void run() { - fullScroll(FOCUS_DOWN); - } - }); - - mLastUtterance.setTag(view); - } - - view.setTag(R.string.authority_key, authority); - view.setTag(R.string.source_key, source); - view.setTag(R.string.target_key, target); - view.setTag(R.string.alternatives_key, alternatives); - - // parse by words, marked by %, darkest red color - if (target.charAt(0) == '%') { - view.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_worst_utterance_bg)); - target = target.subSequence(1, target.length()).toString().trim(); - } - - // parse by chunks, marked by *, red color - else if (target.charAt(0) == '*') { - view.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_chunk_utterance_bg)); - target = target.subSequence(1, target.length()).toString().trim(); - } - - // parse error: darkest red color - else if (target.toString().contains("parse error:")) { - view.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_worst_utterance_bg)); - } - - // unknown linearizations in output: darkest red color. But replace [ ] by spaces and remove _ for better speech synthesis - else if (target.toString().contains("[")) { - view.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_worst_utterance_bg)); - } - - // parse by domain grammar, marked by +, green color - else if (target.charAt(0) == '+') { - view.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_best_utterance_bg)); - target = target.subSequence(1, target.length()).toString().trim(); - } - - else { - view.setBackgroundDrawable(getResources().getDrawable(R.drawable.second_person_utterance_bg)); - } - - view.setText(target); - return target; - } - - public void updateLastUtterance(CharSequence text) { - if (mLastUtterance != null) - mLastUtterance.setText(text); - } - - public void setOnAlternativesListener(final OnAlternativesListener listener) { - if (listener == null) - mAlternativesListener = null; - else - mAlternativesListener = new OnClickListener() { - @Override - public void onClick(View v) { - String authority = v.getTag(R.string.authority_key).toString(); - String source = v.getTag(R.string.source_key).toString(); - List alternatives = (List) v.getTag(R.string.alternatives_key); - listener.onAlternativesSelected(authority, source, alternatives); - } - }; - } - - public void setSpeechInputListener(ASR.Listener listener) { - mSpeechListener = listener; - } - - public interface OnAlternativesListener { - public void onAlternativesSelected(CharSequence authority, CharSequence word, List althernatives); - } - - public void saveConversation(Bundle state) { - ArrayList authorities = new ArrayList(); - ArrayList firstPersonUtterances = new ArrayList(); - ArrayList secondPersonUtterances = new ArrayList(); - ArrayList translationAlternatives = new ArrayList(); - - int childCount = mContent.getChildCount(); - for (int i = 0; i < childCount; i++) { - View child = mContent.getChildAt(i); - if (child.getClass() == TextView.class) { - authorities.add(child.getTag(R.string.authority_key).toString()); - firstPersonUtterances.add(child.getTag(R.string.source_key).toString()); - secondPersonUtterances.add(child.getTag(R.string.target_key).toString()); - translationAlternatives.add(child.getTag(R.string.alternatives_key)); - } - } - - state.putStringArrayList("authorities", authorities); - state.putStringArrayList("first_person_uterances", firstPersonUtterances); - state.putStringArrayList("second_person_uterances", secondPersonUtterances); - state.putSerializable("translation_alternatives",(Serializable) translationAlternatives); - } - - public void restoreConversation(Bundle state) { - ArrayList authorities = state.getStringArrayList("authorities"); - ArrayList firstPersonUtterances = state.getStringArrayList("first_person_uterances"); - ArrayList secondPersonUtterances = state.getStringArrayList("second_person_uterances"); - ArrayList> translationAlternatives= (ArrayList>) state.getSerializable("translation_alternatives"); - - int i = 0; - while (i < authorities.size() && - i < firstPersonUtterances.size() && - i < Math.min(secondPersonUtterances.size(), translationAlternatives.size())) { - String text = firstPersonUtterances.get(i); - addFirstPersonUtterance(text, false); - - String authority = authorities.get(i); - String translation = secondPersonUtterances.get(i); - List alternatives = translationAlternatives.get(i); - addSecondPersonUtterance(authority, text, translation, alternatives); - - i++; - } - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/GFTranslator.java b/src/ui/android/src/org/grammaticalframework/ui/android/GFTranslator.java deleted file mode 100644 index 8900b2415..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/GFTranslator.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.app.Application; - -public class GFTranslator extends Application { - private Translator mTranslator; - private static GFTranslator instance; - - @Override - public void onCreate() { - mTranslator = new Translator(this); - instance = this; - } - - public Translator getTranslator() { - return mTranslator; - } - - public static GFTranslator get() { - return instance; - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/HelpActivity.java b/src/ui/android/src/org/grammaticalframework/ui/android/HelpActivity.java deleted file mode 100644 index c6a822484..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/HelpActivity.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.app.Activity; -import android.os.Bundle; -import android.webkit.WebView; - -public class HelpActivity extends Activity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_help); - WebView wv = (WebView) findViewById(R.id.help_content); - wv.loadUrl("file:///android_asset/help_content.html"); - } -} \ No newline at end of file diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/Language.java b/src/ui/android/src/org/grammaticalframework/ui/android/Language.java deleted file mode 100644 index 000206045..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/Language.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.grammaticalframework.ui.android; - -import java.io.Serializable; - -public class Language implements Serializable { - private static final long serialVersionUID = 1L; - - private final String mLangCode; - private final String mLangName; - private final String mConcrete; - private final int mKeyboardPage1Resource; - private final int mKeyboardPage2Resource; - - public Language(String langCode, String langName, String concrete, - int keyboardResource) { - mLangCode = langCode; - mLangName = langName; - mConcrete = concrete; - mKeyboardPage1Resource = keyboardResource; - mKeyboardPage2Resource = keyboardResource; - } - - public Language(String langCode, String langName, String concrete, - int keyboardPage1Resource, int keyboardPage2Resource) { - mLangCode = langCode; - mLangName = langName; - mConcrete = concrete; - mKeyboardPage1Resource = keyboardPage1Resource; - mKeyboardPage2Resource = keyboardPage2Resource; - } - - public String getLangCode() { - return mLangCode; - } - - public String getLangName() { - return mLangName; - } - - public int getKeyboardPage1Resource() { - return mKeyboardPage1Resource; - } - - public int getKeyboardPage2Resource() { - return mKeyboardPage2Resource; - } - - String getConcrete() { - return mConcrete; - } - - @Override - public String toString() { - return getLangName(); - } - - @Override - public boolean equals(Object o) { - Language other = (Language) o; - return mLangCode.equals(other.mLangCode); - } -} \ No newline at end of file diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/LanguageSelector.java b/src/ui/android/src/org/grammaticalframework/ui/android/LanguageSelector.java deleted file mode 100644 index de628b2b5..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/LanguageSelector.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.widget.AdapterView; -import android.widget.Spinner; - -import java.util.List; - -public class LanguageSelector extends Spinner { - - public LanguageSelector(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - public LanguageSelector(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public LanguageSelector(Context context) { - super(context); - } - - public void setLanguages(List languages) { - setAdapter(new LanguagesAdapter(getContext(), languages)); - } - - public void setSelectedLanguage(Language selected) { - setSelection(((LanguagesAdapter) getAdapter()).getPosition(selected)); - } - - public Language getSelectedLanguage() { - return (Language) getSelectedItem(); - } - - public void setOnLanguageSelectedListener(final OnLanguageSelectedListener listener) { - setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (listener != null) { - listener.onLanguageSelected((Language) parent.getItemAtPosition(position)); - } - } - @Override - public void onNothingSelected(AdapterView parent) { - } - }); - } - - public interface OnLanguageSelectedListener { - void onLanguageSelected(Language language); - } - -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/LanguagesAdapter.java b/src/ui/android/src/org/grammaticalframework/ui/android/LanguagesAdapter.java deleted file mode 100644 index e39ed7bd9..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/LanguagesAdapter.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.content.Context; -import android.widget.ArrayAdapter; -import android.widget.SpinnerAdapter; - - -import java.util.List; - -public class LanguagesAdapter extends ArrayAdapter implements SpinnerAdapter { - - public LanguagesAdapter(Context context, List objects) { - super(context, R.layout.languages_item, objects); - } - -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/LexiconSuggestionProvider.java b/src/ui/android/src/org/grammaticalframework/ui/android/LexiconSuggestionProvider.java deleted file mode 100644 index 7b9813b7d..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/LexiconSuggestionProvider.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.content.ContentProvider; -import android.content.ContentValues; -import android.provider.BaseColumns; -import android.database.Cursor; -import android.database.MatrixCursor; -import android.app.SearchManager; -import android.net.Uri; -import android.util.Log; -import android.view.inputmethod.CompletionInfo; - -public class LexiconSuggestionProvider extends ContentProvider { - private Translator mTranslator; - - public boolean onCreate() { - return true; - } - - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { - mTranslator = ((GFTranslator) getContext().getApplicationContext()).getTranslator(); - String[] columns = new String[] { - BaseColumns._ID, - SearchManager.SUGGEST_COLUMN_TEXT_1, - SearchManager.SUGGEST_COLUMN_QUERY - }; - - String query = uri.getLastPathSegment(); - MatrixCursor cursor = new MatrixCursor(columns, 100); - for (CompletionInfo info : mTranslator.lookupWordPrefix(query)) { - cursor.addRow(new String[] {Long.toString(info.getId()),info.getText().toString(),info.getText().toString()}); - } - - return cursor; - } - - public Uri insert (Uri uri, ContentValues values) { - throw new UnsupportedOperationException(); - } - - public int update (Uri uri, ContentValues values, String selection, String[] selectionArgs) { - throw new UnsupportedOperationException(); - } - - public int delete (Uri uri, String selection, String[] selectionArgs) { - throw new UnsupportedOperationException(); - } - - public String getType (Uri uri) { - return null; - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/LocaleUtils.java b/src/ui/android/src/org/grammaticalframework/ui/android/LocaleUtils.java deleted file mode 100644 index 9fb048908..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/LocaleUtils.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.text.TextUtils; - -import java.util.Locale; - -/** - * Collections of utils to handle locales. - */ -public class LocaleUtils { - - /** - * Parses a locale string formatted by {@link Locale#toString()}. - * - * @return the parsed {@code Locale} or {@code defaultLocale} if the input was null or empty. - */ - public static Locale parseJavaLocale(String localeString, Locale defaultLocale) { - if (TextUtils.isEmpty(localeString)) { - return defaultLocale; - } - final char separator = '_'; - int pos1 = localeString.indexOf(separator); - if (pos1 == -1) { - return new Locale(localeString); - } - String language = localeString.substring(0, pos1); - - int start2 = pos1 + 1; - int pos2 = localeString.indexOf(separator, start2); - if (pos2 == -1) { - return new Locale(language, localeString.substring(start2)); - } - String country = localeString.substring(start2, pos2); - - int start3 = pos2 + 1; - int pos3 = localeString.indexOf(separator, start3); - String variant = (pos3 == -1) - ? localeString.substring(start3) - : localeString.substring(start3, pos3); - return new Locale(language, country, variant); - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/MainActivity.java b/src/ui/android/src/org/grammaticalframework/ui/android/MainActivity.java deleted file mode 100644 index 369e542e9..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/MainActivity.java +++ /dev/null @@ -1,377 +0,0 @@ -package org.grammaticalframework.ui.android; - -import java.io.*; -import java.util.*; - -import android.app.Activity; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.AsyncTask; -import android.os.Bundle; -import android.speech.SpeechRecognizer; -import android.net.Uri; -import android.util.Log; -import android.util.Pair; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnTouchListener; -import android.widget.ImageView; - -import org.grammaticalframework.ui.android.ASR.State; -import org.grammaticalframework.ui.android.LanguageSelector.OnLanguageSelectedListener; -import org.grammaticalframework.ui.android.ConversationView.OnAlternativesListener; -import org.grammaticalframework.pgf.*; - -public class MainActivity extends Activity { - - private static final boolean DBG = true; - private static final String TAG = "MainActivity"; - - private ImageView mStartStopButton; - - private ConversationView mConversationView; - - private LanguageSelector mSourceLanguageView; - - private LanguageSelector mTargetLanguageView; - - private ImageView mSwitchLanguagesButton; - - private ASR mAsr; - - private TTS mTts; - - private Translator mTranslator; - - private boolean input_mode; - - private SpeechInputListener mSpeechListener; - - private View mProgressBarView = null; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - mStartStopButton = (ImageView) findViewById(R.id.start_stop); - mConversationView = (ConversationView) findViewById(R.id.conversation); - mSourceLanguageView = (LanguageSelector) findViewById(R.id.source_language); - mTargetLanguageView = (LanguageSelector) findViewById(R.id.target_language); - mSwitchLanguagesButton = (ImageView) findViewById(R.id.switch_languages); - mProgressBarView = findViewById(R.id.progressBarView); - - mStartStopButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if (mAsr.isRunning()) { - stopRecognition(); - } else { - startRecognition(); - } - } - }); - - SharedPreferences pref = getPreferences(MODE_PRIVATE); - input_mode = pref.getBoolean("input_mode", true); - if (!SpeechRecognizer.isRecognitionAvailable(this)) { - input_mode = false; - } - mStartStopButton.setImageResource(input_mode ? R.drawable.ic_mic : R.drawable.ic_keyboard); - - mSpeechListener = new SpeechInputListener(); - - mConversationView.setOnAlternativesListener(new OnAlternativesListener() { - @Override - public void onAlternativesSelected(CharSequence authority, CharSequence input, List alternatives) { - Uri.Builder builder = new Uri.Builder(); - builder.scheme("gf-translator"); - builder.authority(authority.toString()); - builder.appendQueryParameter("source", input.toString()); - for (Expr e : alternatives) { - builder.appendQueryParameter("alternative", e.toString()); - } - - Intent myIntent = new Intent(Intent.ACTION_VIEW, builder.build()); - MainActivity.this.startActivity(myIntent); - } - }); - mConversationView.setSpeechInputListener(mSpeechListener); - - mAsr = new ASR(this); - mAsr.setListener(mSpeechListener); - - mTts = new TTS(this); - - mTranslator = ((GFTranslator) getApplicationContext()).getTranslator(); - - mSourceLanguageView.setLanguages(mTranslator.getAvailableLanguages()); - mSourceLanguageView.setOnLanguageSelectedListener(new OnLanguageSelectedListener() { - @Override - public void onLanguageSelected(Language language) { - onSourceLanguageSelected(language); - } - }); - mTargetLanguageView.setLanguages(mTranslator.getAvailableLanguages()); - mTargetLanguageView.setOnLanguageSelectedListener(new OnLanguageSelectedListener() { - @Override - public void onLanguageSelected(Language language) { - onTargetLanguageSelected(language); - } - }); - - mSwitchLanguagesButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - onSwitchLanguages(); - } - }); - - if (savedInstanceState != null) { - mConversationView.restoreConversation(savedInstanceState); - } - } - - @Override - protected void onResume() { - super.onResume(); - - mSourceLanguageView.setSelectedLanguage(mTranslator.getSourceLanguage()); - mTargetLanguageView.setSelectedLanguage(mTranslator.getTargetLanguage()); - } - - private void showProgressBar() { - mProgressBarView.setVisibility(View.VISIBLE); - } - - private void hideProgressBar() { - mProgressBarView.setVisibility(View.GONE); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - mConversationView.saveConversation(outState); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.main, menu); - - menu.getItem(0).setTitle(input_mode ? R.string.keyboard_input : R.string.mic_input); - - if (!SpeechRecognizer.isRecognitionAvailable(this)) { - menu.getItem(0).setEnabled(false); - } - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle item selection - switch (item.getItemId()) { - case R.id.input_mode: - if (input_mode) { - item.setTitle(R.string.mic_input); - mStartStopButton.setImageResource(R.drawable.ic_keyboard); - input_mode = false; - } else { - item.setTitle(R.string.keyboard_input); - mStartStopButton.setImageResource(R.drawable.ic_mic); - input_mode = true; - } - - SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit(); - editor.putBoolean("input_mode", input_mode); - editor.commit(); - - return true; - case R.id.phrasebook: { - Intent myIntent = new Intent(MainActivity.this, se.chalmers.phrasebook.gui.activities.NavigationActivity.class); - MainActivity.this.startActivity(myIntent); - return true; - } - case R.id.topics: { - Intent myIntent = new Intent(MainActivity.this, AlternativesActivity.class); - MainActivity.this.startActivity(myIntent); - return true; - } - case R.id.help: { - Intent myIntent = new Intent(MainActivity.this, HelpActivity.class); - MainActivity.this.startActivity(myIntent); - return true; - } - default: - return super.onOptionsItemSelected(item); - } - } - - @Override - protected void onDestroy() { - if (mAsr != null) { - mAsr.destroy(); - mAsr = null; - } - if (mTts != null) { - mTts.destroy(); - mTts = null; - } - super.onDestroy(); - } - - void onSourceLanguageSelected(Language language) { - mTranslator.setSourceLanguage(language); - if (TranslatorInputMethodService.getInstance() != null) { - TranslatorInputMethodService.getInstance().handleChangeSourceLanguage(language); - } - } - - void onTargetLanguageSelected(Language language) { - mTranslator.setTargetLanguage(language); - if (TranslatorInputMethodService.getInstance() != null) { - TranslatorInputMethodService.getInstance().handleChangeTargetLanguage(language); - } - } - - public String getSourceLanguageCode() { - return mTranslator.getSourceLanguage().getLangCode(); - } - - public String getTargetLanguageCode() { - return mTranslator.getTargetLanguage().getLangCode(); - } - - void onSwitchLanguages() { - mTranslator.switchLanguages(); - mSourceLanguageView.setSelectedLanguage(mTranslator.getSourceLanguage()); - mTargetLanguageView.setSelectedLanguage(mTranslator.getTargetLanguage()); - - if (TranslatorInputMethodService.getInstance() != null) { - TranslatorInputMethodService.getInstance().handleSwitchLanguages(); - } - } - - private void startRecognition() { - if (input_mode) { - mConversationView.addFirstPersonUtterance("...", false); - mAsr.setLanguage(getSourceLanguageCode()); - mAsr.startRecognition(); - } else { - mConversationView.addFirstPersonUtterance("", true); - } - } - - private void stopRecognition() { - mAsr.stopRecognition(); - } - - private void handlePartialSpeechInput(String input) { - mConversationView.updateLastUtterance(input); - } - - private void handleSpeechInput(final String input) { - final List list = mTranslator.lookupMorpho(input); - - mConversationView.updateLastUtterance(input); - new AsyncTask>>() { - @Override - protected void onPreExecute() { - showProgressBar(); - } - - @Override - protected Pair> doInBackground(Void... params) { - return mTranslator.translate(input); - } - - @Override - protected void onPostExecute(Pair> res) { - String text = res.first; - List transl = res.second; - - List alts = null; - String authority = null; - - // filter out duplicates - int i = 0; - if (list.size() > 0) { - alts = new ArrayList(list.size()); - authority = Translator.WORDS; - - while (i < list.size()) { - MorphoAnalysis an = list.get(i); - boolean found = false; - for (int j = 0; j < i; j++) { - if (list.get(j).getLemma().equals(an.getLemma())) { - found = true; - break; - } - } - - if (!found) { - alts.add(Expr.readExpr(an.getLemma())); - } - - i++; - } - } else { - alts = new ArrayList(transl.size()); - authority = Translator.SENTENCES; - - Set strings = new HashSet(); - while (i < transl.size()) { - String s = mTranslator.linearize(transl.get(i).getExpr()); - if (s.length() > 0 && - (s.charAt(0) == '%' || s.charAt(0) == '*' || s.charAt(0) == '+')) { - s = s.substring(2); - } - - if (!strings.contains(s)) { - strings.add(s); - alts.add(transl.get(i).getExpr()); - } - - i++; - } - } - - if (DBG) Log.d(TAG, "Speaking: " + res.first); - CharSequence text2 = - mConversationView.addSecondPersonUtterance(authority, input, text, alts); - text2 = text2.toString().replace('[',' ').replace(']',' ').replaceAll("_","").trim(); - mTts.speak(getTargetLanguageCode(), text2.toString()); - - hideProgressBar(); - } - }.execute(); - } - - private class SpeechInputListener implements ASR.Listener { - - @Override - public void onPartialInput(String input) { - handlePartialSpeechInput(input); - } - - @Override - public void onSpeechInput(String input) { - handleSpeechInput(input); - } - - @Override - public void onStateChanged(State newState) { - if (newState == ASR.State.IDLE) { - //clear the overlay - mStartStopButton.getDrawable().clearColorFilter(); - } else { - mStartStopButton.getDrawable().setColorFilter(0xffff0000,android.graphics.PorterDuff.Mode.SRC_ATOP); - } - mStartStopButton.invalidate(); - } - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/ParseTreeView.java b/src/ui/android/src/org/grammaticalframework/ui/android/ParseTreeView.java deleted file mode 100644 index b2ff74183..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/ParseTreeView.java +++ /dev/null @@ -1,270 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.PointF; -import android.graphics.Rect; -import android.util.AttributeSet; -import android.util.SparseArray; -import android.view.MotionEvent; -import android.view.View; - -import org.grammaticalframework.pgf.Bracket; - - -public class ParseTreeView extends View { - private static final float SISTER_SKIP = 25; - private static final float PARENT_SKIP = 0.5f; - private static final float ABOVE_LINE_SKIP = 0.1f; - private static final float BELOW_LINE_SKIP = 0.1f; - - private Paint paint; - private Object[] brackets; - - private float lastMotionX; - private float scrollRange; - - public ParseTreeView(Context context) { - this(context, null); - } - - public ParseTreeView(Context context, AttributeSet attrs) { - super(context, attrs, R.attr.parseTreeViewStyle); - - paint = new Paint(); - paint.setTextSize(60); - brackets = null; - scrollRange = 0; - } - - public Object[] getBrackets() { - return brackets; - } - - public void setBrackets(Object[] brackets) { - this.brackets = brackets; - awakenScrollBars(); - } - - static class MeasureResult { - float width = 0.0f; - float height = 0.0f; - float nodeTab = 0.0f; - float nodeCenter = 0.0f; - float childTab = 0.0f; - float localWidth = 0.0f; - float localHeight = 0.0f; - } - - private MeasureResult mr = new MeasureResult(); - private SparseArray coords = new SparseArray(); - private PointF zeroPoint = new PointF(); - - private void measureTree(Object o) { - if (o instanceof Bracket) { - Bracket bracket = (Bracket) o; - - Rect bounds = new Rect(); - paint.getTextBounds(bracket.cat,0,bracket.cat.length(),bounds); - float localWidth = bounds.width(); - float localHeight = bounds.height(); - float layerHeight = localHeight * (1.0f + BELOW_LINE_SKIP + ABOVE_LINE_SKIP + PARENT_SKIP); - - PointF local = coords.get(bracket.fid); - if (local == null) { - coords.put(bracket.fid, zeroPoint); - } else { - localWidth = 0; - } - - float subWidth = 0.0f; - float subHeight = 0.0f; - float nodeCenter = 0.0f; - for (int i = 0; i < bracket.children.length; i++) { - measureTree(bracket.children[i]); - - if (i == 0) { - nodeCenter += (subWidth + mr.nodeCenter) / 2.0; - } - if (i == bracket.children.length - 1) { - nodeCenter += (subWidth + mr.nodeCenter) / 2.0; - } - - subWidth += mr.width; - if (i < bracket.children.length - 1) { - subWidth += SISTER_SKIP; - } - - if (subHeight < mr.height) - subHeight = mr.height; - } - float localLeft = localWidth / 2.0f; - float subLeft = nodeCenter; - float totalLeft = Math.max(localLeft, subLeft); - float localRight = localWidth / 2.0f; - float subRight = subWidth - nodeCenter; - float totalRight = Math.max(localRight, subRight); - mr.width = totalLeft + totalRight; - mr.height = layerHeight + subHeight; - mr.childTab = totalLeft - subLeft; - mr.nodeTab = totalLeft - localLeft; - mr.nodeCenter = nodeCenter + mr.childTab; - mr.localWidth = localWidth; - mr.localHeight = localHeight; - } else { - String word = o.toString(); - - Rect bounds = new Rect(); - paint.getTextBounds(word,0,word.length(),bounds); - mr.width = bounds.width(); - mr.height = bounds.height(); - mr.nodeTab = 0.0f; - mr.nodeCenter = bounds.width() / 2.0f; - mr.childTab = 0.0f; - mr.localWidth = bounds.width(); - mr.localHeight = bounds.height(); - } - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (brackets == null) { - setMeasuredDimension(0, 0); - return; - } - - coords.clear(); - - float width = 0.0f; - float height = 0.0f; - for (int i = 0; i < brackets.length; i++) { - measureTree(brackets[i]); - - width += mr.width; - if (i < brackets.length - 1) { - width += SISTER_SKIP; - } - - if (height < mr.height) - height = mr.height; - } - - height += paint.getFontMetrics().descent; - - int w = getPaddingLeft() + (int) width + getPaddingRight(); - int h = getPaddingTop() + (int) height + getPaddingBottom(); - - scrollRange = w; - - int widthReq = MeasureSpec.getSize(widthMeasureSpec); - if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY || - (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST && w > widthReq)) { - w = widthReq; - } - int heightReq = MeasureSpec.getSize(heightMeasureSpec); - if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY || - (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && h > heightReq)) { - h = heightReq; - } - - setMeasuredDimension(w, h); - } - - private void drawTree(Canvas canvas, - float x, float y, float bottom, PointF parentPoint, - Object o) { - if (o instanceof Bracket) { - Bracket bracket = (Bracket) o; - - PointF lineStart = coords.get(bracket.fid); - if (lineStart == null) { - lineStart = new PointF(x + mr.nodeCenter, y + mr.localHeight * (1.0f + BELOW_LINE_SKIP)); - coords.put(bracket.fid, lineStart); - - if (parentPoint != null) { - float lineEndX = x + mr.nodeCenter; - float lineEndY = y; - canvas.drawLine(parentPoint.x, parentPoint.y, lineEndX, lineEndY, paint); - } - - canvas.drawText(bracket.cat, x+mr.nodeTab, y+mr.localHeight, paint); - } - - float layerMultiplier = (1.0f + BELOW_LINE_SKIP + ABOVE_LINE_SKIP + PARENT_SKIP); - float layerHeight = mr.localHeight * layerMultiplier; - float childStartX = x + mr.childTab; - float childStartY = y + layerHeight; - for (int i = 0; i < bracket.children.length; i++) { - Object child = bracket.children[i]; - SparseArray copy = coords.clone(); - measureTree(child); - coords = copy; - float w = mr.width; - drawTree(canvas, childStartX, childStartY, bottom, lineStart, child); - childStartX += w + SISTER_SKIP; - } - } else { - float lineEndX = x + mr.nodeCenter; - float lineEndY = bottom - mr.height; - canvas.drawLine(parentPoint.x, parentPoint.y, lineEndX, lineEndY, paint); - canvas.drawText(o.toString(), x, bottom, paint); - } - } - - @Override - protected void onDraw (Canvas canvas) { - super.onDraw(canvas); - - if (brackets == null) { - return; - } - - coords.clear(); - - float startX = getPaddingLeft(); - for (int i = 0; i < brackets.length; i++) { - Object child = brackets[i]; - - SparseArray copy = coords.clone(); - measureTree(child); - coords = copy; - float w = mr.width; - drawTree(canvas, startX, getPaddingTop(), getPaddingTop()+mr.height, null, child); - startX += w + SISTER_SKIP; - } - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - switch (ev.getAction()) { - case MotionEvent.ACTION_DOWN: - // Remember where the motion event started - lastMotionX = ev.getX(); - break; - case MotionEvent.ACTION_MOVE: - // Scroll to follow the motion event - float x = ev.getX(); - final int deltaX = (int) (lastMotionX - x); - lastMotionX = x; - int offset = computeHorizontalScrollOffset() + deltaX; - int range = computeHorizontalScrollRange() - computeHorizontalScrollExtent(); - if (range > 0) { - if (offset < 0) - offset = 0; - if (offset > range) - offset = range; - scrollTo(offset, 0); - } - break; - case MotionEvent.ACTION_UP: - break; - } - return true; - } - - @Override - protected int computeHorizontalScrollRange() { - return (int) scrollRange; - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/RotationGestureDetector.java b/src/ui/android/src/org/grammaticalframework/ui/android/RotationGestureDetector.java deleted file mode 100644 index d077db1bc..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/RotationGestureDetector.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.view.MotionEvent; - -public class RotationGestureDetector { - - private static final int INVALID_POINTER_ID = -1; - private float fX, fY, sX, sY, focalX, focalY; - private int ptrID1, ptrID2; - private float mAngle; - private boolean firstTouch; - - private OnRotationGestureListener mListener; - - public RotationGestureDetector(OnRotationGestureListener listener) { - mListener = listener; - ptrID1 = INVALID_POINTER_ID; - ptrID2 = INVALID_POINTER_ID; - } - - public float getAngle() { - return mAngle; - } - - public boolean onTouchEvent(MotionEvent event){ - switch (event.getActionMasked()) { - case MotionEvent.ACTION_DOWN: - sX = event.getX(); - sY = event.getY(); - ptrID1 = event.getPointerId(0); - mAngle = 0; - firstTouch = true; - break; - case MotionEvent.ACTION_POINTER_DOWN: - fX = event.getX(); - fY = event.getY(); - focalX = getMidpoint(fX, sX); - focalY = getMidpoint(fY, sY); - ptrID2 = event.getPointerId(event.getActionIndex()); - mAngle = 0; - firstTouch = true; - break; - case MotionEvent.ACTION_MOVE: - if(ptrID1 != INVALID_POINTER_ID && ptrID2 != INVALID_POINTER_ID) { - float nfX, nfY, nsX, nsY; - nsX = event.getX(event.findPointerIndex(ptrID1)); - nsY = event.getY(event.findPointerIndex(ptrID1)); - nfX = event.getX(event.findPointerIndex(ptrID2)); - nfY = event.getY(event.findPointerIndex(ptrID2)); - if (firstTouch) { - mAngle = 0; - firstTouch = false; - } else { - mAngle = angleBetweenLines(fX, fY, sX, sY, nfX, nfY, nsX, nsY); - } - - if (mListener != null) { - mListener.OnRotation(this); - } - fX = nfX; - fY = nfY; - sX = nsX; - sY = nsY; - } - break; - case MotionEvent.ACTION_UP: - ptrID1 = INVALID_POINTER_ID; - break; - case MotionEvent.ACTION_POINTER_UP: - ptrID2 = INVALID_POINTER_ID; - break; - } - return true; - } - - private float getMidpoint(float a, float b) { - return (a + b) / 2; - } - - private float findAngleDelta(float angle1, float angle2) - { - angle2 = angle2 % 360.0f; - angle1 = angle1 % 360.0f; - - float dist = angle1 - angle2; - if (dist < -180.0f) - { - dist += 360.0f; - } - else if (dist > 180.0f) - { - dist -= 360.0f; - } - - return dist; - } - - private float angleBetweenLines(float fx1, float fy1, float fx2, float fy2, float sx1, float sy1, float sx2, float sy2) - { - float angle1 = (float) Math.atan2((fy1 - fy2), (fx1 - fx2)); - float angle2 = (float) Math.atan2((sy1 - sy2), (sx1 - sx2)); - - return findAngleDelta((float)Math.toDegrees(angle1),(float)Math.toDegrees(angle2)); - } - - public static interface OnRotationGestureListener { - public boolean OnRotation(RotationGestureDetector detector); - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraph.java b/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraph.java deleted file mode 100644 index 0033404c9..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraph.java +++ /dev/null @@ -1,235 +0,0 @@ -package org.grammaticalframework.ui.android; - -import java.util.*; - -public class SemanticGraph { - private Map nodes; - private List edges; - - private float layoutMinX; - private float layoutMaxX; - private float layoutMinY; - private float layoutMaxY; - - public SemanticGraph() { - nodes = new HashMap(); - edges = new ArrayList(); - - layoutMinX = 0; - layoutMaxX = 0; - layoutMinY = 0; - layoutMaxY = 0; - } - - public Node addNode(String lemma, List senses) { - Node n = nodes.get(lemma); - if (n == null) { - n = new Node(lemma, senses); - } - nodes.put(lemma,n); - return n; - } - - public Node getNode(String lemma) { - return nodes.get(lemma); - } - - public Collection getNodes() { - return Collections.unmodifiableCollection(nodes.values()); - } - - public Edge addEdge(Node node1, Node node2) { - Edge edge = new Edge(node1, node2); - edges.add(edge); - return edge; - } - - private static final int LAYOUT_ITERATIONS = 500; - private static final float LAYOUT_K = 2; - private static final float LAYOUT_C = 0.01f; - private static final float LAYOUT_MAX_VERTEX_MOVEMENT = 0.5f; - private static final float LAYOUT_MAX_REPULSIVE_FORCE_DISTANCE = 6; - - public void layout() { - layoutPrepare(); - for (int i = 0; i < LAYOUT_ITERATIONS; i++) { - layoutIteration(); - } - layoutCalcBounds(); - } - - public float getLayoutMinX() { - return layoutMinX; - } - - public float getLayoutMaxX() { - return layoutMaxX; - } - - public float getLayoutMinY() { - return layoutMinY; - } - - public float getLayoutMaxY() { - return layoutMaxY; - } - - private void layoutPrepare() { - for (Node node : nodes.values()) { - node.layoutForceX = 0; - node.layoutForceY = 0; - } - } - - private void layoutIteration() { - List prev = new ArrayList(); - for(Node node1 : this.nodes.values()) { - for (Node node2 : prev) { - layoutRepulsive(node1, node2); - } - prev.add(node1); - } - - // Forces on nodes due to edge attractions - for (Edge edge : edges) { - layoutAttractive(edge); - } - - // Move by the given force - for (Node node : nodes.values()) { - float xmove = LAYOUT_C * node.layoutForceX; - float ymove = LAYOUT_C * node.layoutForceY; - - float max = LAYOUT_MAX_VERTEX_MOVEMENT; - if (xmove > max) xmove = max; - if (xmove < -max) xmove = -max; - if (ymove > max) ymove = max; - if (ymove < -max) ymove = -max; - - node.layoutPosX += xmove; - node.layoutPosY += ymove; - node.layoutForceX = 0; - node.layoutForceY = 0; - } - } - - private void layoutRepulsive(Node node1, Node node2) { - float dx = node2.layoutPosX - node1.layoutPosX; - float dy = node2.layoutPosY - node1.layoutPosY; - float d2 = dx * dx + dy * dy; - if (d2 < 0.01) { - dx = (float) (0.1 * Math.random() + 0.1); - dy = (float) (0.1 * Math.random() + 0.1); - d2 = dx * dx + dy * dy; - } - float d = (float) Math.sqrt(d2); - if (d < LAYOUT_MAX_REPULSIVE_FORCE_DISTANCE) { - float repulsiveForce = LAYOUT_K * LAYOUT_K / d; - node2.layoutForceX += repulsiveForce * dx / d; - node2.layoutForceY += repulsiveForce * dy / d; - node1.layoutForceX -= repulsiveForce * dx / d; - node1.layoutForceY -= repulsiveForce * dy / d; - } - } - - private void layoutAttractive(Edge edge) { - Node node1 = edge.source; - Node node2 = edge.target; - - float dx = node2.layoutPosX - node1.layoutPosX; - float dy = node2.layoutPosY - node1.layoutPosY; - float d2 = dx * dx + dy * dy; - if (d2 < 0.01) { - dx = (float) (0.1 * Math.random() + 0.1); - dy = (float) (0.1 * Math.random() + 0.1); - d2 = dx * dx + dy * dy; - } - float d = (float) Math.sqrt(d2); - if (d > LAYOUT_MAX_REPULSIVE_FORCE_DISTANCE) { - d = LAYOUT_MAX_REPULSIVE_FORCE_DISTANCE; - d2 = d * d; - } - float attractiveForce = (d2 - LAYOUT_K * LAYOUT_K) / LAYOUT_K; - attractiveForce *= Math.log(edge.attraction) * 0.5 + 1; - - node2.layoutForceX -= attractiveForce * dx / d; - node2.layoutForceY -= attractiveForce * dy / d; - node1.layoutForceX += attractiveForce * dx / d; - node1.layoutForceY += attractiveForce * dy / d; - } - - private void layoutCalcBounds() { - float minx = Float.POSITIVE_INFINITY, - maxx = Float.NEGATIVE_INFINITY, - miny = Float.POSITIVE_INFINITY, - maxy = Float.NEGATIVE_INFINITY; - - for (Node node : nodes.values()) { - float x = node.layoutPosX; - float y = node.layoutPosY; - - if (x > maxx) maxx = x; - if (x < minx) minx = x; - if (y > maxy) maxy = y; - if (y < miny) miny = y; - } - - layoutMinX = minx; - layoutMaxX = maxx; - layoutMinY = miny; - layoutMaxY = maxy; - } - - public static class Node { - private String lemma; - private List senses; - - private float layoutPosX; - private float layoutPosY; - private float layoutForceX; - private float layoutForceY; - - - private Node(String lemma, List senses) { - this.lemma = lemma; - this.senses = senses; - - layoutPosX = 0; - layoutPosY = 0; - layoutForceX = 0; - layoutForceY = 0; - } - - public String getLemma() { - return lemma; - } - - public int getSenseCount() { - return senses.size(); - } - - public Object getSenseId(int i) { - return senses.get(i); - } - - public float getLayoutX() { - return layoutPosX; - } - - public float getLayoutY() { - return layoutPosY; - } - } - - public static class Edge { - private Node source; - private Node target; - private float attraction; - - private Edge(Node source, Node target) { - this.source = source; - this.target = target; - this.attraction = 1; - } - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphActivity.java b/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphActivity.java deleted file mode 100644 index 38878cc50..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphActivity.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.grammaticalframework.ui.android; - -import java.util.*; - -import android.app.Activity; -import android.app.SearchManager; -import android.os.Bundle; -import android.os.AsyncTask; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.ImageView; -import android.widget.Toast; -import android.content.Intent; - -import org.grammaticalframework.pgf.MorphoAnalysis; -import org.grammaticalframework.ui.android.LanguageSelector.OnLanguageSelectedListener; - -public class SemanticGraphActivity extends Activity { - private Translator mTranslator; - - private LanguageSelector mLanguageView; - private View mProgressBarView = null; - private ImageView mAddWordButton; - private SemanticGraphView mGraphView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_semantic_graph); - - mTranslator = ((GFTranslator) getApplicationContext()).getTranslator(); - - mLanguageView = (LanguageSelector) findViewById(R.id.show_language); - mLanguageView.setLanguages(mTranslator.getAvailableLanguages()); - mLanguageView.setOnLanguageSelectedListener(new OnLanguageSelectedListener() { - @Override - public void onLanguageSelected(final Language language) { - new AsyncTask() { - @Override - protected void onPreExecute() { - showProgressBar(); - } - - @Override - protected Void doInBackground(Void... params) { - mTranslator.setSourceLanguage(language); - mTranslator.isTargetLanguageLoaded(); - return null; - } - - @Override - protected void onPostExecute(Void result) { - hideProgressBar(); - } - }.execute(); - } - }); - - mAddWordButton = (ImageView) findViewById(R.id.add_word); - - mGraphView = (SemanticGraphView) findViewById(R.id.semantic_graph); - - mAddWordButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - onSearchRequested(); - } - }); - - mProgressBarView = findViewById(R.id.progressBarView); - } - - @Override - protected void onResume() { - super.onResume(); - - mLanguageView.setSelectedLanguage(mTranslator.getSourceLanguage()); - } - - private void showProgressBar() { - mProgressBarView.setVisibility(View.VISIBLE); - } - - private void hideProgressBar() { - mProgressBarView.setVisibility(View.GONE); - } - - @Override - protected void onNewIntent (Intent intent) { - if (Intent.ACTION_SEARCH.equals(intent.getAction())) { - String query = intent.getStringExtra(SearchManager.QUERY); - List list = mTranslator.lookupMorpho(query); - if (list == null || list.size() == 0) { - Toast toast = Toast.makeText(this, "\""+query+"\" doesn't match", Toast.LENGTH_SHORT); - toast.show(); - } else { - mGraphView.getGraph().addNode(query, list); - mGraphView.refresh(); - } - } - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphManager.java b/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphManager.java deleted file mode 100644 index f3b26a3cf..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphManager.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.grammaticalframework.ui.android; - -import java.io.*; -import android.content.Context; -import android.util.Log; - -import org.grammaticalframework.sg.*; -import org.grammaticalframework.pgf.*; - -public class SemanticGraphManager implements Closeable { - private final Context mContext; - private SG mDB; - - public static final String DATABASE_FILE_NAME = "semantics.db"; - - public SemanticGraphManager(Context context) { - mContext = context; - mDB = null; - } - - private void createDatabaseFromAssets() throws SGError, IOException { - if (mDB != null) - return; - - String path = mContext.getDatabasePath(DATABASE_FILE_NAME).getPath(); - - boolean exists = false; - - File file = new File(path); - if (((GFTranslator) mContext.getApplicationContext()).getTranslator().isUpgraded("db_version")) { - file.delete(); - } else { - if (file.exists()) { - exists = true; - } - } - - File dir = new File(mContext.getApplicationInfo().dataDir + "/databases"); - if (!dir.exists()) { - dir.mkdir(); - } - - if (!extractDatabase(file)) - return; - - mDB = SG.openSG(path); - if (exists) - return; - } - - private boolean extractDatabase(File outFile) { - InputStream in = null; - OutputStream out = null; - try { - in = mContext.getAssets().open(DATABASE_FILE_NAME); - out = new FileOutputStream(outFile); - copyFile(in, out); - return true; - } catch(IOException e) { - Log.e("tag", "Failed to copy asset file: " + DATABASE_FILE_NAME, e); - } - finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - // NOOP - } - } - if (out != null) { - try { - out.close(); - } catch (IOException e) { - // NOOP - } - } - } - - return false; - } - - private void copyFile(InputStream in, OutputStream out) throws IOException { - byte[] buffer = new byte[1024]; - int read; - while((read = in.read(buffer)) != -1){ - out.write(buffer, 0, read); - } - } - - public void close() { - if (mDB != null) { - mDB.close(); - mDB = null; - } - } - - public TripleResult queryTriple(Expr subj, Expr pred, Expr obj) throws IOException { - createDatabaseFromAssets(); - return mDB.queryTriple(subj, pred, obj); - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphView.java b/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphView.java deleted file mode 100644 index 81785d5ce..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/SemanticGraphView.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.view.View; -import android.view.GestureDetector; -import android.view.ScaleGestureDetector; -import android.view.MotionEvent; -import android.graphics.Paint; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Rect; -import android.content.Context; -import android.util.AttributeSet; -import android.util.Log; - -public class SemanticGraphView extends View implements GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener, RotationGestureDetector.OnRotationGestureListener { - - private SemanticGraph mGraph = new SemanticGraph(); - - private float mStartX = 0; - private float mStartY = 0; - private float mFocusX = 0; - private float mFocusY = 0; - private float mScale = 1; - private float mAngle = 0; - - private Paint mPaint; - - private GestureDetector mGD; - private ScaleGestureDetector mSGD; - private RotationGestureDetector mRGD; - - private static final float TEXT_PAD = 10; - private static final float SENSE_POINT_RADIUS = 5; - - public SemanticGraphView(Context context, AttributeSet attrs) { - super(context, attrs); - - mPaint = new Paint(); - mPaint.setTextSize(60); - - mGD = new GestureDetector(this); - mSGD = new ScaleGestureDetector(context,this); - mRGD = new RotationGestureDetector(this); - } - - public SemanticGraph getGraph() { - return mGraph; - } - - public void refresh() { - mGraph.layout(); - invalidate(); - } - - @Override - protected void onDraw (Canvas canvas) { - super.onDraw(canvas); - - canvas.scale(mScale,mScale,mFocusX,mFocusY); - canvas.translate(mStartX, mStartY); - canvas.rotate(mAngle); - - Rect bounds = new Rect(); - - float dx = mGraph.getLayoutMinX(); - float sx = getWidth()/(mGraph.getLayoutMaxX()-mGraph.getLayoutMinX()); - float dy = mGraph.getLayoutMinY(); - float sy = getHeight()/(mGraph.getLayoutMaxY()-mGraph.getLayoutMinY()); - for (SemanticGraph.Node node : mGraph.getNodes()) { - mPaint.getTextBounds(node.getLemma().toCharArray(), 0, node.getLemma().length(), bounds); - - float left = (node.getLayoutX()-dx)*sx - TEXT_PAD; - float base = (node.getLayoutY()-dy)*sy; - float top = base - bounds.height() - TEXT_PAD; - float right = left + bounds.right + TEXT_PAD; - float bottom = base + bounds.bottom + TEXT_PAD; - float sqrt2 = (float) Math.sqrt(2); - - canvas.drawText(node.getLemma(), left + TEXT_PAD, base, mPaint); - - float pi = (float) Math.PI; - for (int i = 0; i < node.getSenseCount(); i++) { - float phi = i * 2*pi / node.getSenseCount(); - float cx = ((left+right) + (right-left)*sqrt2*((float) Math.sin(phi)))/2; - float cy = ((top+bottom) + (bottom-top)*sqrt2*((float) Math.cos(phi)))/2; - - canvas.drawCircle(cx,cy,SENSE_POINT_RADIUS,mPaint); - } - } - } - - public boolean onTouchEvent(MotionEvent ev) { - mGD.onTouchEvent(ev); - mSGD.onTouchEvent(ev); - mRGD.onTouchEvent(ev); - return true; - } - - public boolean onDown(MotionEvent e) { - return true; - } - - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - return true; - } - - public void onLongPress(MotionEvent e) { - } - - public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - mStartX -= distanceX; - mStartY -= distanceY; - invalidate(); - return true; - } - - public void onShowPress(MotionEvent e) { - } - - public boolean onSingleTapUp(MotionEvent e) { - return true; - } - - public boolean onScaleBegin(ScaleGestureDetector detector) { - return true; - } - - public boolean onScale(ScaleGestureDetector detector) { - mScale *= detector.getScaleFactor(); - mFocusX = detector.getFocusX(); - mFocusY = detector.getFocusY(); - invalidate(); - return true; - } - - public void onScaleEnd(ScaleGestureDetector detector) { - } - - public boolean OnRotation(RotationGestureDetector detector) { - mAngle -= detector.getAngle(); - invalidate(); - return true; - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/TTS.java b/src/ui/android/src/org/grammaticalframework/ui/android/TTS.java deleted file mode 100644 index 3e020f0af..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/TTS.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.content.Context; -import android.media.AudioManager; -import android.speech.tts.TextToSpeech; -import android.util.Log; - -import java.util.HashMap; -import java.util.Locale; - -public class TTS { - - private static final String TAG = "TTS"; - - private TextToSpeech mTts; - private AudioManager mAudioManager; - - public TTS(Context context) { - mTts = new TextToSpeech(context, new InitListener()); - mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); - } - - // TODO: handle speak() calls before service connects - public void speak(String language, String text) { - - - if (mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL) { - - /* hack for missing TTS -- don't use for official release! - if (language.equals("bg-BG")) { - language = "ru-RU"; - } - if (language.equals("ca-ES")) { - language = "es-ES"; // hardly politically correct... - } - */ - - /* Google Chinese speech input has a nonstandard code. In output, yue works for Chi in Google, but SVOX uses the standard zh-CN */ - if (language.equals("cmn-Hans-CN")) { - language = "zh-CN"; - } - - Locale locale = LocaleUtils.parseJavaLocale(language.replace('-', '_'), - Locale.getDefault()); - - int result = mTts.setLanguage(locale); - if (result == TextToSpeech.LANG_MISSING_DATA || - result == TextToSpeech.LANG_NOT_SUPPORTED) { - Log.e(TAG, "Language is not available"); - } else { - HashMap params = new HashMap(); - mTts.speak(text, TextToSpeech.QUEUE_FLUSH, params); - } - } - } - - public void destroy() { - if (mTts != null) { - mTts.stop(); - mTts.shutdown(); - } - } - - private class InitListener implements TextToSpeech.OnInitListener { - @Override - public void onInit(int status) { - if (status == TextToSpeech.SUCCESS) { - Log.d(TAG, "Initialized TTS"); - } else { - Log.e(TAG, "Failed to initialize TTS"); - } - } - - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java b/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java deleted file mode 100644 index 4bfe9690a..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/Translator.java +++ /dev/null @@ -1,777 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.pm.PackageManager.NameNotFoundException; -import android.util.Log; -import android.util.Pair; -import android.net.Uri; -import android.view.inputmethod.CompletionInfo; -import android.database.sqlite.SQLiteDatabase; -import android.database.Cursor; - -import org.grammaticalframework.sg.*; -import org.grammaticalframework.pgf.*; -import java.io.*; -import java.util.*; - -public class Translator { - - private static final String TAG = "Translator"; - - // new - - // TODO: allow changing - private String mGrammar = "App.pgf" ; - - // TODO: build dynamically? - private Language[] mLanguages = { - new Language("bg-BG", "Bulgarian", "AppBul", R.xml.cyrillic), - new Language("ca-ES", "Catalan", "AppCat", R.xml.qwerty), - new Language("cmn-Hans-CN", "Chinese", "AppChi", R.xml.qwerty), - // new Language("zh-CN", "Chinese", "AppChi", R.xml.qwerty), - // new Language("yue", "Chinese (Cantonese)", "AppChi", R.xml.qwerty), - // new Language("cmn-Hans-CN", "Chinese (Mandarin)", "AppChi", R.xml.qwerty), - new Language("nl-NL", "Dutch", "AppDut", R.xml.qwerty), - new Language("en-US", "English", "AppEng", R.xml.qwerty), - new Language("et-EE", "Estonian","AppEst", R.xml.nordic), - new Language("fi-FI", "Finnish", "AppFin", R.xml.nordic), - new Language("fr-FR", "French", "AppFre", R.xml.qwerty), //// - new Language("de-DE", "German", "AppGer", R.xml.qwerty), - new Language("hi-IN", "Hindi", "AppHin", R.xml.devanagari_page1, R.xml.devanagari_page2), - new Language("it-IT", "Italian", "AppIta", R.xml.qwerty), - new Language("ja-JP", "Japanese","AppJpn", R.xml.qwerty), - new Language("ru-RU", "Russian", "AppRus", R.xml.cyrillic), - new Language("es-ES", "Spanish", "AppSpa", R.xml.qwerty), - new Language("sv-SE", "Swedish", "AppSwe", R.xml.nordic), - new Language("th-TH", "Thai", "AppTha", R.xml.thai_page1, R.xml.thai_page2), - new Language("ur-PK", "Urdu", "AppUrd", R.xml.qwerty), // TODO language code and keyboard to check - }; - - private Context mContext; - - private GrammarLoader mGrammarLoader; - private ConcrLoader mSourceLoader; - private ConcrLoader mTargetLoader; - private ConcrLoader mOtherLoader; - private SemanticGraphManager mSGManager; - - private static final String SOURCE_LANG_KEY = "source_lang"; - private static final String TARGET_LANG_KEY = "target_lang"; - - public static final String WORDS = "words"; - public static final String SENTENCES = "sentences"; - - private static final int NUM_ALT_TRANSLATIONS = 10; - - private SharedPreferences mSharedPref; - - private Language getPrefLang(String key, int def) { - int index = mSharedPref.getInt(key, def); - if (index < 0 || index >= mLanguages.length) - index = def; - return mLanguages[index]; - } - - private void setPrefLang(String key, Language def) { - for (int index = 0; index < mLanguages.length; index++) { - if (def == mLanguages[index]) { - SharedPreferences.Editor editor = mSharedPref.edit(); - editor.putInt(key, index); - editor.commit(); - break; - } - } - } - - public Translator(Context context) { - mContext = context; - - mSharedPref = context.getSharedPreferences( - context.getString(R.string.global_preferences_key), Context.MODE_PRIVATE); - - mGrammarLoader = new GrammarLoader(); - mGrammarLoader.start(); - - Language prefSourceLang = getPrefLang(SOURCE_LANG_KEY, 0); - Language prefTargetLang = getPrefLang(TARGET_LANG_KEY, 1); - - mSourceLoader = new ConcrLoader(prefSourceLang); - mSourceLoader.start(); - - if (prefSourceLang == prefTargetLang) { - mTargetLoader = mSourceLoader; - } else { - mTargetLoader = new ConcrLoader(prefTargetLang); - mTargetLoader.start(); - } - - mOtherLoader = null; - - mSGManager = new SemanticGraphManager(context); - } - - public List getAvailableLanguages() { - return Arrays.asList(mLanguages); - } - - public Language getSourceLanguage() { - return mSourceLoader.getLanguage(); - } - - public void setSourceLanguage(Language language) { - setPrefLang(SOURCE_LANG_KEY, language); - - if (mSourceLoader.getLanguage() == language) - return; - if (mTargetLoader.getLanguage() == language) { - cacheOrUnloadLanguage(mSourceLoader); - mSourceLoader = mTargetLoader; - return; - } - if (mOtherLoader != null && - mOtherLoader.getLanguage() == language) { - ConcrLoader tmp = mSourceLoader; - mSourceLoader = mOtherLoader; - mOtherLoader = tmp; - return; - } - - try { - mSourceLoader.join(); - } catch (InterruptedException e) { - Log.e(TAG, "Loading interrupted", e); - } - - if (mSourceLoader.getLanguage() != mTargetLoader.getLanguage()) { - cacheOrUnloadLanguage(mSourceLoader); - } - - mSourceLoader = new ConcrLoader(language); - mSourceLoader.start(); - } - - public boolean isSourceLanguageLoaded() { - try { - mSourceLoader.join(); - return true; - } catch (InterruptedException e) { - Log.e(TAG, "Loading interrupted", e); - } - return false; - } - - private Concr getSourceConcr() { - try { - mSourceLoader.join(); - } catch (InterruptedException e) { - Log.e(TAG, "Loading interrupted", e); - } - return mSourceLoader.getConcr(); - } - - public Language getTargetLanguage() { - return mTargetLoader.getLanguage(); - } - - public void setTargetLanguage(Language language) { - setPrefLang(TARGET_LANG_KEY, language); - - if (mTargetLoader.getLanguage() == language) - return; - if (mSourceLoader.getLanguage() == language) { - cacheOrUnloadLanguage(mTargetLoader); - mTargetLoader = mSourceLoader; - return; - } - if (mOtherLoader != null && - mOtherLoader.getLanguage() == language) { - ConcrLoader tmp = mTargetLoader; - mTargetLoader = mOtherLoader; - mOtherLoader = tmp; - return; - } - - try { - mTargetLoader.join(); - } catch (InterruptedException e) { - Log.e(TAG, "Loading interrupted", e); - } - - if (mSourceLoader.getLanguage() != mTargetLoader.getLanguage()) { - cacheOrUnloadLanguage(mTargetLoader); - } - - mTargetLoader = new ConcrLoader(language); - mTargetLoader.start(); - } - - public boolean isTargetLanguageLoaded() { - try { - mTargetLoader.join(); - return true; - } catch (InterruptedException e) { - Log.e(TAG, "Loading interrupted", e); - } - return false; - } - - private Concr getTargetConcr() { - try { - mTargetLoader.join(); - } catch (InterruptedException e) { - Log.e(TAG, "Loading interrupted", e); - } - return mTargetLoader.getConcr(); - } - - private void cacheOrUnloadLanguage(ConcrLoader loader) { - if (mOtherLoader != null) { - mOtherLoader.getConcr().unload(); - Log.d(TAG, mOtherLoader.getLanguage().getConcrete() + ".pgf_c unloaded"); - } - mOtherLoader = loader; - } - - public void switchLanguages() { - ConcrLoader tmp = mSourceLoader; - mSourceLoader = mTargetLoader; - mTargetLoader = tmp; - } - - private static String explode(String in) { - String out = ""; - for (int i = 0; i < in.length(); i++) { - if (i > 0) - out += ' '; - out += in.charAt(i); - } - return out; - } - - private static String implode(String s) { - return s.replaceAll("(? iter = sourceLang.parse("Chunk", input).iterator(); // try parse as chunk - Expr expr = iter.next().getExpr(); - output = targetLang.linearize(expr); - return output ; - } catch (ParseError e) { // if this fails - List morphos = lookupMorpho(input) ; // lookup morphological analyses - - morphos.addAll(lookupMorpho(lowerinput)) ; // including the analyses of the lower-cased word - - for (MorphoAnalysis ana : morphos) { - if (targetLang.hasLinearization(ana.getLemma())) { // check that the word has linearization in target - output = targetLang.linearize(Expr.readExpr(ana.getLemma())) ; - break ; // if yes, don't search any more - } - } - return output ; - } - } - - private String translateByLookup(String input) { - String[] words = input.split(" ") ; - - String output = "%" ; - for (String w : words) { - output = output + " " + translateWord(w) ; - } - - return output ; - } - - // lowercase the first word if (1) it is not in the lexicon and (2) its lowercase version is in the lexicon - // otherwise it will be left uppercase and treated as a name - private String lowercaseIfBetter(String input) { - String[] words = input.split(" ") ; - - String firstword = words[0] ; - - String lowerfirstword = firstword.toLowerCase() ; - - if (lookupMorpho(firstword).isEmpty() && !(lookupMorpho(lowerfirstword).isEmpty())) { - words[0] = lowerfirstword ; - String output = "" ; - for (String w : words) { - output = output + " " + w ; - } - return output ; - } else { - return input ; - } - - } - - /** - * Takes a lot of time. Must not be called on the main thread. - */ - public Pair> translate(String input) { - if (getSourceLanguage().getLangCode().equals("cmn-Hans-CN")) { - // for Chinese we need to put space after every character - input = explode(input); - } else { - input = lowercaseIfBetter(input); - } ; - - String output = null; - List exprs = new ArrayList(); - - try { - Concr sourceLang = getSourceConcr(); - Concr targetLang = getTargetConcr(); - - Map callbacks = new HashMap(); - callbacks.put("PN", new NercLiteralCallback(mGrammarLoader.getGrammar(), sourceLang, input)); - callbacks.put("Symb", new UnknownLiteralCallback(sourceLang, input)); - - int count = NUM_ALT_TRANSLATIONS; - for (ExprProb ep : sourceLang.parseWithHeuristics(getGrammar().getStartCat(), input, -1, callbacks)) { - if (count-- <= 0) - break; - exprs.add(ep); - if (output == null) - output = targetLang.linearize(ep.getExpr()); - } - } catch (ParseError e) { - output = translateByLookup(input); - } - - if (output == null) - output = "% "; // make sure that we return something - - if (getTargetLanguage().getLangCode().equals("cmn-Hans-CN") || - getTargetLanguage().getLangCode().equals("ja-JP") || - getTargetLanguage().getLangCode().equals("th-TH")) - output = implode(output) ; - - return new Pair>(output, exprs); - } - - public String linearize(Expr expr) { - Concr targetLang = getTargetConcr(); - String s = targetLang.linearize(expr); - if (s == null) - s = "% "; // make sure that we return something - - if (getTargetLanguage().getLangCode().equals("cmn-Hans-CN") || - getTargetLanguage().getLangCode().equals("ja-JP") || - getTargetLanguage().getLangCode().equals("th-TH")) - return implode(s); - else - return s; - } - - public String linearizeSource(Expr expr) { - Concr targetLang = getSourceConcr(); - String s = targetLang.linearize(expr); - if (s == null) - s = "% "; // make sure that we return something - - if (getSourceLanguage().getLangCode().equals("cmn-Hans-CN") || - getSourceLanguage().getLangCode().equals("ja-JP") || - getSourceLanguage().getLangCode().equals("th-TH")) - return implode(s); - else - return s; - } - - public Object[] bracketedLinearize(Expr expr) { - Concr targetLang = getTargetConcr(); - return targetLang.bracketedLinearize(expr); - } - - public String generateLexiconEntry(Expr lemma) { - Concr sourceLang = getSourceConcr(); - Concr targetLang = getTargetConcr(); - String fun = lemma.toString(); - String cat = getGrammar().getFunctionType(fun).getCategory(); - - Expr e2 = Expr.readExpr("MkTag (Inflection"+cat+" "+fun+")"); - - if (targetLang.hasLinearization("Inflection"+cat)) { - if (targetLang.hasLinearization(fun)) - return sourceLang.linearize(lemma) + " - " + targetLang.linearize(e2) + ". " + targetLang.linearize(lemma); - else - return sourceLang.linearize(lemma) + " " + targetLang.linearize(e2)+"."; - } else { - if (targetLang.hasLinearization(fun)) - return sourceLang.linearize(lemma) + " - " + targetLang.linearize(lemma); - else - return sourceLang.linearize(lemma); - } - } - - private static final Expr gloss_pred = Expr.readExpr("gloss"); - private static final Expr topic_pred = Expr.readExpr("topic"); - private static final Expr example_pred = Expr.readExpr("example"); - - public Expr getDefinition(Expr lemma, boolean withExample) { - Expr gloss = null; - Expr example = null; - Map topics = new TreeMap(); - - try { - TripleResult res = mSGManager.queryTriple(lemma, null, null); - while (res.hasNext()) { - if (res.getPredicate().equals(gloss_pred)) - gloss = res.getObject(); - else if (res.getPredicate().equals(topic_pred)) - updateWordsMap(res.getObject(), topics); - else if (res.getPredicate().equals(example_pred)) - example = res.getObject(); - } - res.close(); - } catch (IOException e) { - // nothing - } catch (SGError e) { - // nothing - } - - Expr topic = null; - if (topics.size() > 0) { - StringBuilder builder = new StringBuilder(); - builder.append('('); - buildWordsHtml(topics, builder); - builder.append(')'); - topic = new Expr(builder.toString()); - } - if (gloss == null) - return topic; - else { - if (topic == null) - topic = new Expr(""); - if (withExample && example != null) - return new Expr("MkDefinitionEx", topic, gloss, example); - else - return new Expr("MkDefinition", topic, gloss); - } - } - - private void updateWordsMap(Expr expr, Map map) { - String word = getTargetConcr().linearize(expr); - - Uri.Builder builder = map.get(word); - if (builder == null) { - builder = new Uri.Builder(); - builder.scheme("gf-translator"); - builder.authority(WORDS); - builder.appendQueryParameter("source", word); - map.put(word,builder); - } - builder.appendQueryParameter("alternative", expr.toString()); - } - - private void buildWordsHtml(Map map, StringBuilder sbuilder) { - boolean first = true; - for (Map.Entry entry : map.entrySet()) { - if (first) - first = false; - else - sbuilder.append(", "); - - sbuilder.append(""+entry.getKey()+""); - } - } - - public List getTopicWords(Expr lemma) { - TripleResult res = null; - List words = new ArrayList(); - try { - res = mSGManager.queryTriple(null, topic_pred, lemma); - while (res.hasNext()) { - words.add(res.getSubject()); - } - } catch (IOException e) { - // nothing - } catch (SGError e) { - // nothing - } finally { - if (res != null) - res.close(); - } - return words; - } - - private Expr getTopicWordsHtml(Expr lemma) { - StringBuilder sbuilder = new StringBuilder(); - TripleResult res = null; - try { - res = mSGManager.queryTriple(null, topic_pred, lemma); - Map map = new TreeMap(); - while (res.hasNext()) { - updateWordsMap(res.getSubject(), map); - } - - StringBuilder builder = new StringBuilder(); - buildWordsHtml(map, builder); - return new Expr(builder.toString()); - } catch (IOException e) { - // nothing - } catch (SGError e) { - // nothing - } finally { - if (res != null) - res.close(); - } - return null; - } - - public String getInflectionTable(Expr lemma) { - boolean withExample = - (getSourceLanguage().getLangCode().equals("en-US") || - getTargetLanguage().getLangCode().equals("en-US")); - Expr def = - getDefinition(lemma, withExample); - - String fun = lemma.toString(); - Concr targetLang = getTargetConcr(); - String cat = getGrammar().getFunctionType(fun).getCategory(); - - if (targetLang.hasLinearization(fun) && - targetLang.hasLinearization("Inflection"+cat)) { - if (def == null) - def = Expr.readExpr("NoDefinition"); - - Expr e = new Expr("MkDocument", - def, - new Expr("Inflection"+cat,lemma), - getTopicWordsHtml(lemma)); - String html = - "" + - targetLang.linearize(e) + - ""; - return html; - } else if (def != null) { - String html = - "" + - targetLang.linearize(def) + - ""; - return html; - } else { - return null; - } - } - - public List getTopicsOf(Expr lemma) { - TripleResult res = null; - List topics = new ArrayList(); - try { - res = mSGManager.queryTriple(lemma, topic_pred, null); - while (res.hasNext()) { - topics.add(res.getObject()); - } - } catch (IOException e) { - // nothing - } catch (SGError e) { - // nothing - } finally { - if (res != null) - res.close(); - } - return topics; - } - - private static String escapeHtml(CharSequence text) { - StringBuilder out = new StringBuilder(); - - for (int i = 0; i < text.length(); i++) { - char c = text.charAt(i); - - if (c == '<') { - out.append("<"); - } else if (c == '>') { - out.append(">"); - } else if (c == '&') { - out.append("&"); - } else if (c == '"') { - out.append("""); - } else if (c > 0x7E || c < ' ') { - out.append("&#").append((int) c).append(";"); - } else if (c == ' ') { - while (i + 1 < text.length() && text.charAt(i + 1) == ' ') { - out.append(" "); - i++; - } - - out.append(' '); - } else { - out.append(c); - } - } - - return out.toString(); - } - - public List lookupMorpho(String sentence) { - List ans = getSourceConcr().lookupMorpho(sentence); - Collections.sort(ans, new Comparator() { - public int compare(MorphoAnalysis a1, MorphoAnalysis a2) { - if (a1.getProb() > a2.getProb()) - return 1; - else if (a1.getProb() < a2.getProb()) - return -1; - else - return 0; - } - }); - return ans; - } - - public CompletionInfo[] lookupWordPrefix(String prefix) { - PriorityQueue queue = - new PriorityQueue(500, new Comparator() { - @Override - public int compare(FullFormEntry lhs, FullFormEntry rhs) { - return Double.compare(lhs.getProb(), rhs.getProb()); - } - }); - for (FullFormEntry entry : getSourceConcr().lookupWordPrefix(prefix)) { - queue.add(entry); - if (queue.size() >= 1000) - break; - } - - CompletionInfo[] completions = new CompletionInfo[Math.min(queue.size(), 5)+1]; - completions[0] = new CompletionInfo(0, 0, prefix); - for (int i = 1; i < completions.length; i++) { - completions[i] = new CompletionInfo(i,i,queue.poll().getForm()); - } - - if (completions.length > 1) { - Arrays.sort(completions, 1, completions.length-1, new Comparator() { - @Override - public int compare(CompletionInfo arg0, CompletionInfo arg1) { - return ((String) arg0.getText()).compareTo((String) arg1.getText()); - } - }); - } - - return completions; - } - - private PGF getGrammar() { - try { - mGrammarLoader.join(); - } catch (InterruptedException e) { - Log.e(TAG, "Loading interrupted", e); - } - return mGrammarLoader.getGrammar(); - } - - private class GrammarLoader extends Thread { - private PGF mPGF; - - public GrammarLoader() { - mPGF = null; - } - - public PGF getGrammar() { - return mPGF; - } - - public void run() { - InputStream in = null; - - try { - in = mContext.getAssets().open(mGrammar); - Log.d(TAG, "Trying to open " + mGrammar); - long t1 = System.currentTimeMillis(); - mPGF = PGF.readPGF(in); - long t2 = System.currentTimeMillis(); - Log.d(TAG, mGrammar + " loaded ("+(t2-t1)+" ms)"); - } catch (FileNotFoundException e) { - Log.e(TAG, "File not found", e); - } catch (IOException e) { - Log.e(TAG, "Error loading grammar", e); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - Log.e(TAG, "Error closing the stream", e); - } - } - } - } - } - - private class ConcrLoader extends Thread { - private Language mLanguage; - private Concr mConcr; - - public ConcrLoader(Language lang) { - this.mLanguage = lang; - this.mConcr = null; - } - - public Language getLanguage() { - return mLanguage; - } - - public Concr getConcr() { - return mConcr; - } - - public void run() { - try { - mGrammarLoader.join(); - } catch (InterruptedException e) { - Log.d(TAG, "interrupted", e); - } - - InputStream in = null; - - try { - String name = mLanguage.getConcrete()+".pgf_c"; - in = mContext.getAssets().open(name); - Log.d(TAG, "Trying to load " + name); - long t1 = System.currentTimeMillis(); - mConcr = mGrammarLoader.getGrammar().getLanguages().get(mLanguage.getConcrete()); - mConcr.load(in); - long t2 = System.currentTimeMillis(); - Log.d(TAG, name + " loaded ("+(t2-t1)+" ms)"); - } catch (FileNotFoundException e) { - Log.e(TAG, "File not found", e); - } catch (IOException e) { - Log.e(TAG, "Error loading concrete", e); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - Log.e(TAG, "Error closing the stream", e); - } - } - } - } - } - - public boolean isUpgraded(String key) { - int old_code = mSharedPref.getInt(key, 0); - - int new_code = 0; - try { - new_code = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionCode; - } catch (NameNotFoundException e) { - // Huh? Really? - } - - SharedPreferences.Editor editor = mSharedPref.edit(); - editor.putInt(key, new_code); - editor.commit(); - - return (old_code != new_code); - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorInputMethodService.java b/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorInputMethodService.java deleted file mode 100644 index d621e2f69..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorInputMethodService.java +++ /dev/null @@ -1,666 +0,0 @@ -package org.grammaticalframework.ui.android; - -import android.inputmethodservice.InputMethodService; -import android.text.InputType; -import android.text.method.MetaKeyKeyListener; -import android.view.KeyCharacterMap; -import android.view.KeyEvent; -import android.view.View; -import android.view.inputmethod.CompletionInfo; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; - - -public class TranslatorInputMethodService extends InputMethodService - implements android.inputmethodservice.KeyboardView.OnKeyboardActionListener { - - private TranslatorKeyboardView mInputView; - private CompletionsView mCandidateView; - private CompletionInfo[] mCompletions; - - private StringBuilder mComposingText = new StringBuilder(); - private StringBuilder mComposingWord = new StringBuilder(); - private boolean mPredictionOn; - private boolean mCompletionOn; - private boolean mCapsLock; - private long mLastShiftTime; - private long mMetaState; - - private TranslatorKeyboard mSymbolsPage1Keyboard; - private TranslatorKeyboard mSymbolsPage2Keyboard; - private TranslatorKeyboard mLanguagePage1Keyboard; - private TranslatorKeyboard mLanguagePage2Keyboard; - - private TranslatorKeyboard mCurKeyboard; - - private int mActionId; - - private Translator mTranslator; - - @Override - public void onCreate() { - super.onCreate(); - - mTranslator = ((GFTranslator) getApplicationContext()).getTranslator(); - - mSymbolsPage1Keyboard = null; - mSymbolsPage2Keyboard = null; - mLanguagePage1Keyboard = null; - mLanguagePage2Keyboard = null; - } - - @Override - public View onCreateInputView() { - mInputView = (TranslatorKeyboardView) - getLayoutInflater().inflate(R.layout.input, null); - mInputView.setOnKeyboardActionListener(this); - mInputView.setKeyboard(mCurKeyboard); - return mInputView; - } - - @Override - public View onCreateCandidatesView() { - mCandidateView = new CompletionsView(this); - mCandidateView.setService(this); - return mCandidateView; - } - - private int mModeId; - private EditorInfo mAttribute; - private static TranslatorInputMethodService mInstance; - - static TranslatorInputMethodService getInstance() { - return mInstance; - } - - @Override - public void onStartInput(EditorInfo attribute, boolean restarting) { - super.onStartInput(attribute, restarting); - - // Reset our state. We want to do this even if restarting, because - // the underlying state of the text editor could have changed in any way. - mComposingText.setLength(0); - mComposingWord.setLength(0); - updateCandidates(); - - if (!restarting) { - // Clear shift states. - mMetaState = 0; - } - - mPredictionOn = false; - mCompletionOn = false; - mCompletions = null; - - int res1 = - mTranslator.getSourceLanguage().getKeyboardPage1Resource(); - int res2 = - mTranslator.getSourceLanguage().getKeyboardPage2Resource(); - mModeId = R.string.normalKeyboardMode; - if (attribute.extras != null && - !attribute.extras.getBoolean("show_language_toggle", true)) { - mModeId = R.string.internalKeyboardMode; - } - mAttribute = attribute; - mLanguagePage1Keyboard = new TranslatorKeyboard(this, res1, mModeId); - mLanguagePage2Keyboard = new TranslatorKeyboard(this, res2, mModeId); - mSymbolsPage1Keyboard = new TranslatorKeyboard(this, R.xml.symbols_page1, mModeId); - mSymbolsPage2Keyboard = new TranslatorKeyboard(this, R.xml.symbols_page2, mModeId); - - // We are now going to initialize our state based on the type of - // text being edited. - switch (attribute.inputType & InputType.TYPE_MASK_CLASS) { - case InputType.TYPE_CLASS_NUMBER: - case InputType.TYPE_CLASS_DATETIME: - // Numbers and dates default to the symbols keyboard, with - // no extra features. - mCurKeyboard = mSymbolsPage1Keyboard; - break; - - case InputType.TYPE_CLASS_PHONE: - // Phones will also default to the symbols keyboard, though - // often you will want to have a dedicated phone keyboard. - mCurKeyboard = mSymbolsPage1Keyboard; - break; - - case InputType.TYPE_CLASS_TEXT: - // This is general text editing. We will default to the - // normal alphabetic keyboard, and assume that we should - // be doing predictive text (showing candidates as the - // user types). - mCurKeyboard = mLanguagePage1Keyboard; - mPredictionOn = true; - - // We now look for a few special variations of text that will - // modify our behavior. - int variation = attribute.inputType & InputType.TYPE_MASK_VARIATION; - if (variation == InputType.TYPE_TEXT_VARIATION_PASSWORD || - variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD || - variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) { - // Do not display predictions / what the user is typing - // when they are entering a password. - mPredictionOn = false; - } - - if (variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS || - variation == InputType.TYPE_TEXT_VARIATION_URI || - variation == InputType.TYPE_TEXT_VARIATION_FILTER) { - // Our predictions are not useful for e-mail addresses - // or URIs. - mPredictionOn = false; - } - - if ((attribute.inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) { - // If this is an auto-complete text view, then our predictions - // will not be shown and instead we will allow the editor - // to supply their own. We only show the editor's - // candidates when in full-screen mode, otherwise relying - // own it displaying its own UI. - mPredictionOn = false; - mCompletionOn = isFullscreenMode(); - } - - // We also want to look at the current state of the editor - // to decide whether our alphabetic keyboard should start out - // shifted. - updateShiftKeyState(attribute); - break; - - default: - // For all unknown input types, default to the alphabetic - // keyboard with no special features. - mCurKeyboard = mLanguagePage1Keyboard; - updateShiftKeyState(attribute); - } - - mActionId = attribute.imeOptions & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION); - mLanguagePage1Keyboard.setImeOptions(getResources(), attribute.imeOptions); - mLanguagePage2Keyboard.setImeOptions(getResources(), attribute.imeOptions); - - mInstance = this; - } - - @Override - public void onFinishInput() { - super.onFinishInput(); - - // Clear current composing text and candidates. - mComposingText.setLength(0); - mComposingWord.setLength(0); - updateCandidates(); - - // We only hide the candidates window when finishing input on - // a particular editor, to avoid popping the underlying application - // up and down if the user is entering text into the bottom of - // its window. - setCandidatesViewShown(false); - - mCurKeyboard = mLanguagePage1Keyboard; - if (mInputView != null) { - mInputView.closing(); - } - - mInstance = null; - mAttribute = null; - } - - @Override - public void onStartInputView(EditorInfo attribute, boolean restarting) { - super.onStartInputView(attribute, restarting); - // Apply the selected keyboard to the input view. - mInputView.setKeyboard(mCurKeyboard); - mInputView.closing(); - } - - @Override - public void onUpdateSelection(int oldSelStart, int oldSelEnd, - int newSelStart, int newSelEnd, - int candidatesStart, int candidatesEnd) { - super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, - candidatesStart, candidatesEnd); - - // If the current selection in the text view changes, we should - // clear whatever candidate text we have. - if (mComposingText.length() + mComposingWord.length() > 0 && - (newSelStart != candidatesEnd || newSelEnd != candidatesEnd)) { - mComposingText.setLength(0); - mComposingWord.setLength(0); - updateCandidates(); - InputConnection ic = getCurrentInputConnection(); - if (ic != null) { - ic.finishComposingText(); - } - } - } - - @Override - public void onDisplayCompletions(CompletionInfo[] completions) { - if (mCompletionOn) { - mCompletions = completions; - if (completions == null) { - setSuggestions(null, false, false); - return; - } - - setSuggestions(completions, true, true); - } - } - - /** - * This translates incoming hard key events in to edit operations on an - * InputConnection. It is only needed when using the - * PROCESS_HARD_KEYS option. - */ - private boolean translateKeyDown(int keyCode, KeyEvent event) { - mMetaState = MetaKeyKeyListener.handleKeyDown(mMetaState, - keyCode, event); - int c = event.getUnicodeChar(MetaKeyKeyListener.getMetaState(mMetaState)); - mMetaState = MetaKeyKeyListener.adjustMetaAfterKeypress(mMetaState); - InputConnection ic = getCurrentInputConnection(); - if (c == 0 || ic == null) { - return false; - } - - if ((c & KeyCharacterMap.COMBINING_ACCENT) != 0) { - c = c & KeyCharacterMap.COMBINING_ACCENT_MASK; - } - - if (mComposingWord.length() > 0) { - char accent = mComposingWord.charAt(mComposingWord.length()-1); - int composed = KeyEvent.getDeadChar(accent, c); - - if (composed != 0) { - c = composed; - mComposingWord.setLength(mComposingWord.length()-1); - } - } - - onKey(c, null); - - return true; - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_BACK: - // The InputMethodService already takes care of the back - // key for us, to dismiss the input method if it is shown. - // However, our keyboard could be showing a pop-up window - // that back should dismiss, so we first allow it to do that. - if (event.getRepeatCount() == 0 && mInputView != null) { - if (mInputView.handleBack()) { - return true; - } - } - break; - - case KeyEvent.KEYCODE_DEL: - // Special handling of the delete key: if we currently are - // composing text for the user, we want to modify that instead - // of let the application to the delete itself. - if (mComposingText.length() + mComposingWord.length() > 0) { - onKey(TranslatorKeyboard.KEYCODE_DELETE, null); - return true; - } - break; - - case KeyEvent.KEYCODE_ENTER: - // Let the underlying text editor always handle these. - return false; - - default: - if (mPredictionOn && translateKeyDown(keyCode, event)) { - return true; - } - } - - return super.onKeyDown(keyCode, event); - } - - /** - * Helper function to commit any text being composed in to the editor. - */ - private void commitTyped(InputConnection inputConnection) { - if (mComposingText.length() + mComposingWord.length() > 0) { - String s = getComposingString(); - inputConnection.commitText(s, s.length()); - mComposingText.setLength(0); - mComposingWord.setLength(0); - updateCandidates(); - } - } - - /** - * Helper to update the shift state of our keyboard based on the initial - * editor state. - */ - private void updateShiftKeyState(EditorInfo attr) { - if (attr != null && mInputView != null && - (mLanguagePage1Keyboard == mInputView.getKeyboard() || - mLanguagePage2Keyboard == mInputView.getKeyboard())) { - int caps = 0; - EditorInfo ei = getCurrentInputEditorInfo(); - if (ei != null && ei.inputType != InputType.TYPE_NULL) { - caps = getCurrentInputConnection().getCursorCapsMode(attr.inputType); - } - mInputView.setShifted(mCapsLock || caps != 0); - } - } - - /** - * Helper to send a key down / key up pair to the current editor. - */ - private void keyDownUp(int keyEventCode) { - getCurrentInputConnection().sendKeyEvent( - new KeyEvent(KeyEvent.ACTION_DOWN, keyEventCode)); - getCurrentInputConnection().sendKeyEvent( - new KeyEvent(KeyEvent.ACTION_UP, keyEventCode)); - } - - // Implementation of KeyboardViewListener - public void onKey(int primaryCode, int[] keyCodes) { - if (primaryCode == TranslatorKeyboard.KEYCODE_DELETE) { - handleBackspace(); - } else if (primaryCode == TranslatorKeyboard.KEYCODE_SHIFT) { - handleShift(); - } else if (primaryCode == TranslatorKeyboard.KEYCODE_SOURCE_LANGUAGE - && mInputView != null) { - mTranslator.switchLanguages(); - handleSwitchLanguages(); - } else if (primaryCode < TranslatorKeyboard.KEYCODE_SOURCE_LANGUAGE && - primaryCode > TranslatorKeyboard.KEYCODE_SOURCE_LANGUAGE-TranslatorKeyboard.MAX_LANGUAGE_KEYCODES) { - Language newSource = - mTranslator.getAvailableLanguages().get(TranslatorKeyboard.KEYCODE_SOURCE_LANGUAGE-primaryCode-1); - mTranslator.setSourceLanguage(newSource); - handleChangeSourceLanguage(newSource); - } else if (primaryCode == TranslatorKeyboard.KEYCODE_TARGET_LANGUAGE) { - String translation = mTranslator.translate(getComposingString()).first; - if (translation.startsWith("% ") || translation.startsWith("* ") || translation.startsWith("+ ")) - translation = translation.substring(2); - getCurrentInputConnection().commitText(translation, 1); - return; - } else if (primaryCode < TranslatorKeyboard.KEYCODE_TARGET_LANGUAGE && - primaryCode > TranslatorKeyboard.KEYCODE_TARGET_LANGUAGE-TranslatorKeyboard.MAX_LANGUAGE_KEYCODES) { - Language newTarget = - mTranslator.getAvailableLanguages().get(TranslatorKeyboard.KEYCODE_TARGET_LANGUAGE-primaryCode-1); - mTranslator.setTargetLanguage(newTarget); - handleChangeTargetLanguage(newTarget); - } else if (primaryCode == TranslatorKeyboard.KEYCODE_MODE_CHANGE && - mInputView != null) { - TranslatorKeyboard current = (TranslatorKeyboard) mInputView.getKeyboard(); - if (current == mSymbolsPage1Keyboard || current == mSymbolsPage2Keyboard) { - current = mLanguagePage1Keyboard; - } else { - current = mSymbolsPage1Keyboard; - } - mInputView.setKeyboard(current); - if (current == mSymbolsPage1Keyboard) { - current.setShifted(false); - } - } else if (primaryCode == TranslatorKeyboard.KEYCODE_PAGE_CHANGE && - mInputView != null) { - TranslatorKeyboard current = (TranslatorKeyboard) mInputView.getKeyboard(); - if (current == mLanguagePage1Keyboard) { - current = mLanguagePage2Keyboard; - } else { - current = mLanguagePage1Keyboard; - } - mInputView.setKeyboard(current); - } else if (primaryCode == 10) { - if ((mActionId & EditorInfo.IME_FLAG_NO_ENTER_ACTION) == 0) - getCurrentInputConnection().performEditorAction(mActionId & EditorInfo.IME_MASK_ACTION); - else - handleCharacter(primaryCode, keyCodes); - } else if (primaryCode == ' ') { - if (mComposingText.length() + mComposingWord.length() == 0) - getCurrentInputConnection().commitText(" ", 1); - else if (mComposingWord.length() > 0) { - mComposingText.append(mComposingWord); - mComposingText.append(' '); - mComposingWord.setLength(0); - getCurrentInputConnection().setComposingText(getComposingString(), 1); - } else { - mComposingText.append(' '); - getCurrentInputConnection().setComposingText(getComposingString(), 1); - } - } else { - handleCharacter(primaryCode, keyCodes); - } - } - - public void onText(CharSequence text) { - InputConnection ic = getCurrentInputConnection(); - if (ic == null) return; - ic.beginBatchEdit(); - if (mComposingText.length() > 0) { - commitTyped(ic); - } - ic.commitText(text, 0); - ic.endBatchEdit(); - updateShiftKeyState(getCurrentInputEditorInfo()); - } - - /** - * Update the list of available candidates from the current composing - * text. This will need to be filled in by however you are determining - * candidates. - */ - private void updateCandidates() { - if (!mCompletionOn) { - if (mComposingWord.length() > 1) { - mCompletions = - mTranslator.lookupWordPrefix(mComposingWord.toString()); - setSuggestions(mCompletions, true, true); - } else { - setSuggestions(null, false, false); - } - } - } - - public void setSuggestions(CompletionInfo[] completions, boolean isCompletions, - boolean typedWordValid) { - if (completions != null && completions.length > 0) { - setCandidatesViewShown(true); - } else if (isExtractViewShown()) { - setCandidatesViewShown(true); - } - if (mCandidateView != null) { - mCandidateView.setSuggestions(completions, isCompletions, typedWordValid); - } - } - - private void handleBackspace() { - int wordLength = mComposingWord.length(); - int textLength = mComposingText.length(); - if (wordLength > 1) { - mComposingWord.delete(wordLength - 1, wordLength); - getCurrentInputConnection().setComposingText(getComposingString(), 1); - if (mPredictionOn) - updateCandidates(); - } else if (wordLength > 0) { - mComposingWord.setLength(0); - getCurrentInputConnection().setComposingText(getComposingString(), 1); - updateCandidates(); - } else if (textLength > 0) { - if (mComposingText.charAt(textLength - 1) == ' ') { - mComposingText.delete(textLength - 1, textLength); - getCurrentInputConnection().setComposingText(getComposingString(), 1); - } else { - mComposingText.delete(textLength - 1, textLength); - textLength--; - int index = mComposingText.lastIndexOf(" "); - if (index == -1) { - mComposingWord.append(mComposingText.toString()); - mComposingText.setLength(0); - } else { - mComposingWord.append(mComposingText.substring(index+1, textLength)); - mComposingText.delete(index+1, textLength); - } - getCurrentInputConnection().setComposingText(getComposingString(), 1); - } - updateCandidates(); - } else { - keyDownUp(KeyEvent.KEYCODE_DEL); - } - updateShiftKeyState(getCurrentInputEditorInfo()); - } - - private void handleShift() { - if (mInputView == null) { - return; - } - - TranslatorKeyboard currentKeyboard = (TranslatorKeyboard) mInputView.getKeyboard(); - if (mLanguagePage1Keyboard == currentKeyboard || - mLanguagePage2Keyboard == currentKeyboard) { - // Alphabet keyboard - checkToggleCapsLock(); - mInputView.setShifted(mCapsLock || !mInputView.isShifted()); - } else if (currentKeyboard == mSymbolsPage1Keyboard) { - mSymbolsPage1Keyboard.setShifted(true); - mInputView.setKeyboard(mSymbolsPage2Keyboard); - mSymbolsPage2Keyboard.setShifted(true); - } else if (currentKeyboard == mSymbolsPage2Keyboard) { - mSymbolsPage2Keyboard.setShifted(false); - mInputView.setKeyboard(mSymbolsPage1Keyboard); - mSymbolsPage1Keyboard.setShifted(false); - } - } - - private String getComposingString() { - return mComposingText.toString() + mComposingWord.toString(); - } - - private void handleCharacter(int primaryCode, int[] keyCodes) { - if (keyCodes.length > 0 && keyCodes[0] > 0) { - for (int i = 0; i < keyCodes.length && keyCodes[i] > 0; i++) { - int code = keyCodes[i]; - if (mInputView.isShifted()) - code = Character.toUpperCase(code); - mComposingWord.append((char) code); - } - } else { - if (mInputView.isShifted()) - primaryCode = Character.toUpperCase(primaryCode); - mComposingWord.append((char) primaryCode); - } - - if (primaryCode == 10) - commitTyped(getCurrentInputConnection()); - else - getCurrentInputConnection().setComposingText(getComposingString(), 1); - updateShiftKeyState(getCurrentInputEditorInfo()); - - if (mPredictionOn) { - updateCandidates(); - } - } - - private void handleClose() { - commitTyped(getCurrentInputConnection()); - requestHideSelf(0); - mInputView.closing(); - } - - void handleChangeSourceLanguage(Language newSource) { - updateLanguageKeyboard(newSource); - mSymbolsPage1Keyboard.updateLanguageKeyLabels(); - mSymbolsPage2Keyboard.updateLanguageKeyLabels(); - if (mInputView != null) { - mInputView.setKeyboard(mCurKeyboard); - } - } - - void handleChangeTargetLanguage(Language newTarget) { - mLanguagePage1Keyboard.updateLanguageKeyLabels(); - mLanguagePage2Keyboard.updateLanguageKeyLabels(); - mSymbolsPage1Keyboard.updateLanguageKeyLabels(); - mSymbolsPage2Keyboard.updateLanguageKeyLabels(); - if (mInputView != null) { - mInputView.invalidateAllKeys(); - } - } - - void handleSwitchLanguages() { - Language newSource = mTranslator.getSourceLanguage(); - updateLanguageKeyboard(newSource); - mSymbolsPage1Keyboard.updateLanguageKeyLabels(); - mSymbolsPage2Keyboard.updateLanguageKeyLabels(); - if (mInputView != null) - mInputView.setKeyboard(mCurKeyboard); - } - - private void updateLanguageKeyboard(Language language) { - TranslatorKeyboard keyboard1 = - new TranslatorKeyboard(this, language.getKeyboardPage1Resource(), mModeId); - TranslatorKeyboard keyboard2 = - new TranslatorKeyboard(this, language.getKeyboardPage2Resource(), mModeId); - keyboard1.setImeOptions(getResources(), mAttribute.imeOptions); - keyboard2.setImeOptions(getResources(), mAttribute.imeOptions); - if (mCurKeyboard == mLanguagePage1Keyboard) { - mCurKeyboard = keyboard1; - } else if (mCurKeyboard == mLanguagePage2Keyboard) { - mCurKeyboard = keyboard2; - } - mLanguagePage1Keyboard = keyboard1; - mLanguagePage2Keyboard = keyboard2; - } - - private void checkToggleCapsLock() { - long now = System.currentTimeMillis(); - if (mLastShiftTime + 800 > now) { - mCapsLock = !mCapsLock; - mLastShiftTime = 0; - } else { - mLastShiftTime = now; - } - } - - public void pickDefaultCandidate() { - pickSuggestionManually(0); - } - - public void pickSuggestionManually(int index) { - if (mCompletions != null && - index >= 0 && index < mCompletions.length) { - CompletionInfo ci = mCompletions[index]; - - if (mCompletionOn) - getCurrentInputConnection().commitCompletion(ci); - else { - mComposingWord.setLength(0); - mComposingWord.append(ci.getText()); - getCurrentInputConnection().setComposingText(getComposingString(), 1); - } - - if (mCandidateView != null) { - mCandidateView.clear(); - } - updateShiftKeyState(getCurrentInputEditorInfo()); - } - } - - public void swipeRight() { - if (mCompletionOn) { - pickDefaultCandidate(); - } - } - - public void swipeLeft() { - handleBackspace(); - } - - public void swipeDown() { - handleClose(); - } - - public void swipeUp() { - } - - public void onPress(int primaryCode) { - } - - public void onRelease(int primaryCode) { - } -} diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboard.java b/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboard.java deleted file mode 100644 index 876f660da..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboard.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.grammaticalframework.ui.android; - -import java.util.Locale; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.XmlResourceParser; -import android.view.inputmethod.EditorInfo; -import android.inputmethodservice.Keyboard; - -public class TranslatorKeyboard extends Keyboard { - - private Key mEnterKey; - private Key mSourceLanguageKey; - private Key mTargetLanguageKey; - - static final int KEYCODE_PAGE_CHANGE = -10; - static final int KEYCODE_SOURCE_LANGUAGE = -100; - static final int KEYCODE_TARGET_LANGUAGE = -200; - static final int MAX_LANGUAGE_KEYCODES = 99; - - private Translator mTranslator; - - public TranslatorKeyboard(Context context, int xmlLayoutResId, int modeId) { - super(context, xmlLayoutResId, modeId); - - mTranslator = ((GFTranslator) context.getApplicationContext()).getTranslator(); - updateLanguageKeyLabels(); - } - - public void updateLanguageKeyLabels() { - if (mSourceLanguageKey != null) - mSourceLanguageKey.label = getLanguageKeyLabel(mTranslator.getSourceLanguage()); - - if (mTargetLanguageKey != null) - mTargetLanguageKey.label = getLanguageKeyLabel(mTranslator.getTargetLanguage()); - } - - public static String getLanguageKeyLabel(Language lang) { - if ("cmn-hans-cn".equalsIgnoreCase(lang.getLangCode())) // this one has no ISO code - return "chi"; - else - return - LocaleUtils.parseJavaLocale(lang.getLangCode(), Locale.getDefault()) - .getISO3Language(); - } - - @Override - protected Key createKeyFromXml(Resources res, Row parent, int x, int y, - XmlResourceParser parser) { - Key key = new Key(res, parent, x, y, parser); - if (key.codes[0] == 10) { - mEnterKey = key; - } else if (key.codes[0] == KEYCODE_SOURCE_LANGUAGE) { - mSourceLanguageKey = key; - } else if (key.codes[0] == KEYCODE_TARGET_LANGUAGE) { - mTargetLanguageKey = key; - } - return key; - } - - /** - * This looks at the ime options given by the current editor, to set the - * appropriate label on the keyboard's enter key (if it has one). - */ - void setImeOptions(Resources res, int options) { - if (mEnterKey == null) { - return; - } - - switch (options&(EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) { - case EditorInfo.IME_ACTION_DONE: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_done_key); - break; - case EditorInfo.IME_ACTION_GO: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_go_key); - break; - case EditorInfo.IME_ACTION_NEXT: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_next_key); - break; - case EditorInfo.IME_ACTION_PREVIOUS: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_previous_key); - break; - case EditorInfo.IME_ACTION_SEARCH: - mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_search); - mEnterKey.label = null; - break; - case EditorInfo.IME_ACTION_SEND: - mEnterKey.iconPreview = null; - mEnterKey.icon = null; - mEnterKey.label = res.getText(R.string.label_send_key); - break; - default: - mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_return); - mEnterKey.label = null; - break; - } - } -} \ No newline at end of file diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboardView.java b/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboardView.java deleted file mode 100644 index 0a42eca2d..000000000 --- a/src/ui/android/src/org/grammaticalframework/ui/android/TranslatorKeyboardView.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.grammaticalframework.ui.android; - -import org.grammaticalframework.ui.android.TranslatorKeyboard; - -import android.content.Context; -import android.graphics.Point; -import android.inputmethodservice.Keyboard.Key; -import android.inputmethodservice.KeyboardView; -import android.util.AttributeSet; -import android.view.Display; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.WindowManager; -import android.widget.Button; -import android.widget.PopupWindow; -import android.widget.TableLayout; -import android.widget.TableRow; - -public class TranslatorKeyboardView extends KeyboardView { - - private Translator mTranslator; - - public TranslatorKeyboardView(Context context, AttributeSet attrs) { - super(context, attrs); - mTranslator = ((GFTranslator) context.getApplicationContext()).getTranslator(); - } - - public TranslatorKeyboardView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - mTranslator = ((GFTranslator) context.getApplicationContext()).getTranslator(); - } - - private PopupWindow mLanguagesPopup = null; - private Key mLanguagesKey = null; - - private void showLanguageOptions(Key popupKey) { - if (mLanguagesPopup == null) { - LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - TableLayout popupContainer = (TableLayout) - inflater.inflate(R.layout.keyboard_languages_options, null); - - int index = 0; - TableRow row = null; - for (Language lang : mTranslator.getAvailableLanguages()) { - int col_index = index % 4; - if (col_index == 0) { - row = new TableRow(getContext()); - popupContainer.addView(row); - } - - Button item = new Button(getContext()); - item.setText(TranslatorKeyboard.getLanguageKeyLabel(lang)); - item.setTag(index); - item.setOnClickListener(this); - row.addView(item, col_index); - index++; - } - - WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); - Display display = wm.getDefaultDisplay(); - Point size = new Point(); - display.getSize(size); - - popupContainer.measure( - MeasureSpec.makeMeasureSpec(size.x, MeasureSpec.AT_MOST), - MeasureSpec.makeMeasureSpec(size.y, MeasureSpec.AT_MOST)); - - mLanguagesPopup = new PopupWindow(getContext()); - mLanguagesPopup.setWidth(popupContainer.getMeasuredWidth()); - mLanguagesPopup.setHeight(popupContainer.getMeasuredHeight()); - mLanguagesPopup.setContentView(popupContainer); - - int[] windowOffset = new int[2]; - getLocationInWindow(windowOffset); - int popupX = popupKey.x + popupKey.width - popupContainer.getMeasuredWidth(); - int popupY = popupKey.y - popupContainer.getMeasuredHeight(); - final int x = popupX + popupContainer.getPaddingRight() + windowOffset[0]; - final int y = popupY + popupContainer.getPaddingBottom() + windowOffset[1]; - mLanguagesPopup.showAtLocation(this, Gravity.NO_GRAVITY, x, y); - - View closeButton = popupContainer.findViewById(R.id.closeButton); - if (closeButton != null) closeButton.setOnClickListener(this); - } - - mLanguagesKey = popupKey; - } - - private void dismissLanguages() { - if (mLanguagesPopup != null) { - mLanguagesPopup.dismiss(); - mLanguagesPopup = null; - mLanguagesKey = null; - } - } - - @Override - public void onClick(View v) { - super.onClick(v); - - if (v.getTag() != null) { - if (mLanguagesKey.codes[0] == TranslatorKeyboard.KEYCODE_SOURCE_LANGUAGE || - mLanguagesKey.codes[0] == TranslatorKeyboard.KEYCODE_TARGET_LANGUAGE) { - int keyCode = mLanguagesKey.codes[0] - ((Integer) v.getTag()) - 1; - getOnKeyboardActionListener().onKey(keyCode, new int[] {keyCode}); - } - } - - dismissLanguages(); - } - - public void closing() { - super.closing(); - dismissLanguages(); - } - - @Override - protected boolean onLongPress(Key key) { - if (key.codes[0] == TranslatorKeyboard.KEYCODE_SOURCE_LANGUAGE || - key.codes[0] == TranslatorKeyboard.KEYCODE_TARGET_LANGUAGE) { - showLanguageOptions(key); - return true; - } else { - return super.onLongPress(key); - } - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/Model.java b/src/ui/android/src/se/chalmers/phrasebook/backend/Model.java deleted file mode 100644 index 8e4b07b21..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/Model.java +++ /dev/null @@ -1,206 +0,0 @@ -package se.chalmers.phrasebook.backend; - -import org.w3c.dom.*; -import org.xml.sax.*; -import org.w3c.dom.ls.*; - -import java.io.*; -import java.util.*; -import javax.xml.parsers.*; - -import org.grammaticalframework.pgf.Expr; -import org.grammaticalframework.ui.android.R; -import org.grammaticalframework.ui.android.GFTranslator; -import se.chalmers.phrasebook.backend.syntax.*; - -public class Model { - private static Model model; - - private List phrases; - private Map> groups; - - private Model() { - try { - DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - InputStream is = GFTranslator.get().getAssets().open("phrases.xml"); - Document document = documentBuilder.parse(is); - parseSentencesData(document); - is.close(); - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } catch (SAXException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static Model getInstance() { - if (model == null) model = getSync(); - return model; - } - - private synchronized static Model getSync() { - if (model == null) model = new Model(); - return model; - } - - public List getSentences() { - return phrases; - } - - public List getGroup(String id) { - return groups.get(id); - } - - private void parseSentencesData(Document document) { - phrases = new ArrayList(); - groups = new HashMap>(); - Map ids = new HashMap(); - List calls = new ArrayList(); - - NodeList nodesList = document.getDocumentElement().getChildNodes(); - for (int i = 0; i < nodesList.getLength(); i++) { - Node node = nodesList.item(i); - - if (node != null && - node.getNodeType() == Node.ELEMENT_NODE && - node.getNodeName().equals("sentence")) { - NamedNodeMap attributes = node.getAttributes(); - - if (attributes == null) - continue; - - String desc = ""; - if (attributes.getNamedItem("desc") != null) { - desc = attributes.getNamedItem("desc").getNodeValue(); - } - - SyntaxNode[] nodes = constructSyntaxNodeList(node, ids, calls); - if (nodes.length > 0) - phrases.add(new SyntaxTree(desc, nodes[0])); - } else if (node != null && - node.getNodeType() == Node.ELEMENT_NODE && - node.getNodeName().equals("group")) { - - NamedNodeMap attributes = node.getAttributes(); - if (attributes == null) - continue; - - String id = null; - if (attributes.getNamedItem("id") != null) { - id = attributes.getNamedItem("id").getNodeValue(); - } - if (id == null) - continue; - - List group_phrases = new ArrayList(); - - NodeList nodesList2 = node.getChildNodes(); - for (int j = 0; j < nodesList2.getLength(); j++) { - node = nodesList2.item(j); - - if (node != null && - node.getNodeType() == Node.ELEMENT_NODE && - node.getNodeName().equals("sentence")) { - attributes = node.getAttributes(); - - if (attributes == null) - continue; - - String desc = ""; - if (attributes.getNamedItem("desc") != null) { - desc = attributes.getNamedItem("desc").getNodeValue(); - } - - SyntaxNode[] nodes = constructSyntaxNodeList(node, ids, calls); - if (nodes.length > 0) { - SyntaxTree tree = new SyntaxTree(desc, nodes[0]); - phrases.add(tree); - group_phrases.add(tree); - } - } - } - - groups.put(id, group_phrases); - } else if (node.getAttributes() != null && node.getAttributes().getNamedItem("id") != null) { - String id = node.getAttributes().getNamedItem("id").getNodeValue(); - SyntaxNode snode = constructSyntaxNode(node, ids, calls); - if (snode == null) { - throw new IllegalArgumentException(outerXml(node)); - } - ids.put(id,snode); - } - } - - for (SyntaxNodeCall call : calls) { - call.bind(ids); - } - } - - private SyntaxNode constructSyntaxNode(Node node, Map ids, List calls) { - NamedNodeMap attributes = node.getAttributes(); - if (attributes == null) - return null; - - String desc = ""; - if (attributes.getNamedItem("desc") != null) { - desc = attributes.getNamedItem("desc").getNodeValue(); - } - - if (node.getNodeName().equals("function")) { - String function = attributes.getNamedItem("name").getNodeValue(); - SyntaxNode[] arguments = constructSyntaxNodeList(node, ids, calls); - return new SyntaxNodeFunction(desc, function, arguments); - } else if (node.getNodeName().equals("numeral")) { - return new SyntaxNodeNumeral(desc, 1, 100); - } else if (node.getNodeName().equals("option")) { - SyntaxNode[] options = constructSyntaxNodeList(node, ids, calls); - return new SyntaxNodeOption(desc, options); - } else if (node.getNodeName().equals("boolean")) { - SyntaxNode[] options = constructSyntaxNodeList(node, ids, calls); - return new SyntaxNodeBoolean(desc, options); - } else if (node.getNodeName().equals("call")) { - if (attributes.getNamedItem("ref") == null) - return null; - - String ref = attributes.getNamedItem("ref").getNodeValue(); - SyntaxNode[] arguments = constructSyntaxNodeList(node, ids, calls); - SyntaxNodeCall call = new SyntaxNodeCall(desc, ref, arguments); - calls.add(call); - return call; - } else if (node.getNodeName().equals("argument")) { - int d = 0; - if (attributes.getNamedItem("index") != null) - d = Integer.parseInt(attributes.getNamedItem("index").getNodeValue()); - return new SyntaxNodeArgument(desc, d); - } - - return null; - } - - private SyntaxNode[] constructSyntaxNodeList(Node root, Map ids, List calls) { - NodeList nl = root.getChildNodes(); - - int index = 0; - SyntaxNode[] list = new SyntaxNode[nl.getLength()]; - for (int i = 0; i < nl.getLength(); i++) { - Node node = nl.item(i); - if (node != null && node.getNodeType() == Node.ELEMENT_NODE) { - list[index] = constructSyntaxNode(node, ids, calls); - if (list[index] == null) - throw new IllegalArgumentException(outerXml(node)); - index++; - } - } - return Arrays.copyOf(list, index); - } - - private String outerXml(Node node) { - DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0"); - LSSerializer lsSerializer = lsImpl.createLSSerializer(); - lsSerializer.getDomConfig().setParameter("xml-declaration", false); - return lsSerializer.writeToString(node); - } -} - diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/ChoiceContext.java b/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/ChoiceContext.java deleted file mode 100644 index 3995ad063..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/ChoiceContext.java +++ /dev/null @@ -1,61 +0,0 @@ -package se.chalmers.phrasebook.backend.syntax; - -import java.util.*; - -public class ChoiceContext { - private int pos; - private List choices; - private List stack; - - public ChoiceContext() { - this.pos = pos; - this.choices = new ArrayList(); - this.stack = new ArrayList(); - } - - public void reset() { - pos = 0; - stack.clear(); - } - - public void trim() { - while (pos < choices.size()) - choices.remove(choices.size()-1); - } - - public int choose(SyntaxNode node) { - SyntacticChoice choice = null; - - if (pos < choices.size()) { - if (choices.get(pos).getNode().unlink() == node.unlink()) { - choice = choices.get(pos); - } else { - trim(); - } - } - - if (choice == null) { - choice = new SyntacticChoice(node); - choices.add(choice); - } - - pos++; - return choice.getChoice(); - } - - public void push(SyntaxNode[] args) { - stack.add(args); - } - - public SyntaxNode[] pop() { - return stack.remove(stack.size()-1); - } - - public SyntaxNode getArgument(int i) { - return stack.get(stack.size()-1)[i]; - } - - public List getChoices() { - return choices; - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntacticChoice.java b/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntacticChoice.java deleted file mode 100644 index 709893504..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntacticChoice.java +++ /dev/null @@ -1,25 +0,0 @@ -package se.chalmers.phrasebook.backend.syntax; - -import java.io.*; - -public class SyntacticChoice implements Serializable { - private int choice; - private SyntaxNode node; - - public SyntacticChoice(SyntaxNode node) { - this.node = node; - this.choice = node.getDefaultChoice(); - } - - public SyntaxNode getNode() { - return node; - } - - public int getChoice() { - return choice; - } - - public void setChoice(int choice) { - this.choice = choice; - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNode.java b/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNode.java deleted file mode 100644 index 5268e41d4..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNode.java +++ /dev/null @@ -1,33 +0,0 @@ -package se.chalmers.phrasebook.backend.syntax; - -import java.io.Serializable; -import org.grammaticalframework.pgf.Expr; - -public class SyntaxNode implements Serializable { - private String desc; - - public SyntaxNode(String desc) { - this.desc = desc; - } - - public String getDesc() { - return desc; - } - - public String getAbstractSyntax(ChoiceContext context) { - return null; - } - - public int getDefaultChoice() { - return 0; - } - - public SyntaxNode unlink() { - return this; - } - - @Override - public String toString() { - return desc; - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeArgument.java b/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeArgument.java deleted file mode 100644 index 12b13aa4b..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeArgument.java +++ /dev/null @@ -1,15 +0,0 @@ -package se.chalmers.phrasebook.backend.syntax; - -public class SyntaxNodeArgument extends SyntaxNode { - private int index; - - public SyntaxNodeArgument(String desc, int index) { - super(desc); - this.index = index; - } - - @Override - public String getAbstractSyntax(ChoiceContext context) { - return context.getArgument(index).getAbstractSyntax(context); - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeBoolean.java b/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeBoolean.java deleted file mode 100644 index da1e95e04..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeBoolean.java +++ /dev/null @@ -1,7 +0,0 @@ -package se.chalmers.phrasebook.backend.syntax; - -public class SyntaxNodeBoolean extends SyntaxNodeOption { - public SyntaxNodeBoolean(String desc, SyntaxNode[] options) { - super(desc,options); - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeCall.java b/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeCall.java deleted file mode 100644 index 199c818ae..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeCall.java +++ /dev/null @@ -1,52 +0,0 @@ -package se.chalmers.phrasebook.backend.syntax; - -import java.util.*; - -public class SyntaxNodeCall extends SyntaxNode { - private String id; - private SyntaxNode ref; - private SyntaxNode[] arguments; - - public SyntaxNodeCall(String desc, String id, SyntaxNode[] arguments) { - super(desc); - this.id = id; - this.ref = null; - this.arguments = arguments; - } - - public String getDesc() { - String desc = super.getDesc(); - if (desc == null || desc.isEmpty()) - return ref.getDesc(); - return desc; - } - - @Override - public String getAbstractSyntax(ChoiceContext context) { - context.push(arguments); - String res = ref.getAbstractSyntax(context); - context.pop(); - return res; - } - - @Override - public SyntaxNode unlink() { - return ref.unlink(); - } - - public String getId() { - return id; - } - - public SyntaxNode getRef() { - return ref; - } - - public void bind(Map ids) { - if (ref == null) { - ref = ids.get(id); - if (ref == null) - throw new IllegalArgumentException("Missing reference to "+id); - } - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeFunction.java b/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeFunction.java deleted file mode 100644 index 2bc6e187d..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeFunction.java +++ /dev/null @@ -1,39 +0,0 @@ -package se.chalmers.phrasebook.backend.syntax; - -import java.util.*; - -public class SyntaxNodeFunction extends SyntaxNode { - private String function; - private SyntaxNode[] arguments; - - public SyntaxNodeFunction(String desc, String function, SyntaxNode[] arguments) { - super(desc); - this.function = function; - this.arguments = arguments; - } - - public String getFunction() { - return function; - } - - public SyntaxNode[] getArguments() { - return arguments; - } - - @Override - public String getAbstractSyntax(ChoiceContext context) { - if (arguments == null || arguments.length == 0) - return function; - - StringBuilder builder = new StringBuilder(); - builder.append(function); - for (SyntaxNode argument : arguments) { - builder.append(' '); - builder.append('('); - builder.append(argument.getAbstractSyntax(context)); - builder.append(')'); - } - - return builder.toString(); - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeNumeral.java b/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeNumeral.java deleted file mode 100644 index 11a6b4103..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeNumeral.java +++ /dev/null @@ -1,84 +0,0 @@ -package se.chalmers.phrasebook.backend.syntax; - -public class SyntaxNodeNumeral extends SyntaxNode { - private int min; - private int max; - - public SyntaxNodeNumeral(String desc, int min, int max) { - super(desc); - this.min = min; - this.max = max; - } - - public String getAbstractSyntax(ChoiceContext context) { - return nbrToSyntax(context.choose(this)); - } - - @Override - public int getDefaultChoice() { - return 1; - } - - public int getMin() { - return min; - } - - public int getMax() { - return max; - } - - private String nbrToSyntax(int nbr) throws IllegalArgumentException { - String syntax = ""; - if(nbr < 1000000 && nbr > 0) { - if (nbr <=999) { - syntax = "(num (pot2as3 " + subs1000(nbr) + "))"; - } else if(nbr % 1000 == 0) { - syntax = "(num (pot3 " + subs1000(nbr/1000) + "))"; - } else if(nbr > 1000 && nbr%1000 != 0) { - syntax = "(num (pot3plus " + subs1000(nbr/1000) + " " + - subs1000(nbr%1000) + "))"; - } - } else { - throw new IllegalArgumentException("Input must be between 1 and 999999"); - } - return syntax; - } - - private String subs1000(int nbr) { - String syntax = ""; - if(nbr < 100) { - syntax = "(pot1as2 " + subs100(nbr) + ")"; - } else if(nbr % 100 == 0) { - syntax = "(pot2 " + subs10(nbr/100) + ")"; - } else if(nbr > 100 && nbr%100 != 0) { - syntax = "(pot2plus " + subs10(nbr/100) + " " + subs100(nbr%100) + ")"; - } - return syntax; - } - - private String subs100(int nbr) { - String syntax = ""; - if(nbr < 10) { - syntax = "(pot0as1 " + subs10(nbr) + ")"; - } else if(nbr == 10 || nbr == 11) { - syntax = "pot1" + nbr; - } else if(nbr >= 12 && nbr <= 19) { - syntax = "(pot1to19 n" + nbr%10 + ")"; - } else if(nbr >= 20 && nbr%10 == 0) { - syntax = "(pot1 n" + Integer.toString(nbr/10) + ")"; - } else if(nbr%10 != 0) { - syntax = "(pot1plus n" + nbr/10 + " " + subs10(nbr%10) + ")"; - } - return syntax; - } - - private String subs10(int nbr) { - String syntax = ""; - if (nbr == 1) { - syntax = "pot01"; - } else if (nbr >= 2 && nbr <= 9) { - syntax = "(pot0 n" + nbr + ")"; - } - return syntax; - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeOption.java b/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeOption.java deleted file mode 100644 index d7dc4ca83..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxNodeOption.java +++ /dev/null @@ -1,22 +0,0 @@ -package se.chalmers.phrasebook.backend.syntax; - -import java.util.*; -import se.chalmers.phrasebook.backend.*; - -public class SyntaxNodeOption extends SyntaxNode { - private SyntaxNode[] options; - - public SyntaxNodeOption(String desc, SyntaxNode[] options) { - super(desc); - this.options = options; - } - - public SyntaxNode[] getOptions() { - return options; - } - - @Override - public String getAbstractSyntax(ChoiceContext context) { - return options[context.choose(this)].getAbstractSyntax(context); - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxTree.java b/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxTree.java deleted file mode 100644 index 964f07d0b..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/backend/syntax/SyntaxTree.java +++ /dev/null @@ -1,33 +0,0 @@ -package se.chalmers.phrasebook.backend.syntax; - -import java.io.Serializable; -import org.grammaticalframework.pgf.Expr; - -public class SyntaxTree implements Serializable { - private String desc; - private SyntaxNode root; - - public SyntaxTree(String desc, SyntaxNode root) { - this.desc = desc; - this.root = root; - } - - public String getDesc() { - return desc; - } - - public SyntaxNode getRoot() { - return root; - } - - public Expr getAbstractSyntax(ChoiceContext choices) { - Expr expr = Expr.readExpr(root.getAbstractSyntax(choices)); - choices.trim(); - return expr; - } - - @Override - public String toString() { - return desc; - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/gui/activities/NavigationActivity.java b/src/ui/android/src/se/chalmers/phrasebook/gui/activities/NavigationActivity.java deleted file mode 100644 index 1dc754380..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/gui/activities/NavigationActivity.java +++ /dev/null @@ -1,79 +0,0 @@ -package se.chalmers.phrasebook.gui.activities; - -import android.app.ActionBar; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.content.LocalBroadcastManager; -import android.support.v4.widget.DrawerLayout; - -import org.grammaticalframework.ui.android.R; -import se.chalmers.phrasebook.backend.Model; -import se.chalmers.phrasebook.backend.syntax.*; -import se.chalmers.phrasebook.gui.fragments.PhraseListFragment; -import se.chalmers.phrasebook.gui.fragments.TranslatorFragment; - -public class NavigationActivity extends FragmentActivity { - - /** - * Used to store the last screen title. For use in {@link #restoreActionBar()}. - */ - private CharSequence mTitle; - private Fragment mContent; - - private Model mModel; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_navigation); - - mModel = Model.getInstance(); - mTitle = getTitle(); - - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - transaction.replace(R.id.container, PhraseListFragment.newInstance("Phrasebook")); - transaction.commit(); - } - - public void switchContent(Fragment fragment, String message) { - mContent = fragment; - - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - transaction.replace(R.id.container, fragment); - transaction.addToBackStack(message); - transaction.commit(); - } - - public void restoreActionBar() { - ActionBar actionBar = getActionBar(); - actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); - actionBar.setDisplayShowTitleEnabled(true); - actionBar.setTitle(mTitle); - } - - @Override - public void onBackPressed() { - if (getSupportFragmentManager().getBackStackEntryCount() > 1) { - getSupportFragmentManager().popBackStack(); - getSupportFragmentManager().beginTransaction().commit(); - //Switches to the previous entry on the stack to ensure - //that mContent is preserved - mContent = getSupportFragmentManager().getFragments() - .get(getSupportFragmentManager().getFragments().size() - 2); - } else { - super.onBackPressed(); - } - } - - public void setToTranslationFragment(SyntaxTree phrase) { - switchContent(TranslatorFragment.newInstance(phrase), ""); - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/gui/fragments/PhraseListFragment.java b/src/ui/android/src/se/chalmers/phrasebook/gui/fragments/PhraseListFragment.java deleted file mode 100644 index 7e3c09ada..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/gui/fragments/PhraseListFragment.java +++ /dev/null @@ -1,86 +0,0 @@ -package se.chalmers.phrasebook.gui.fragments; - -import android.os.Bundle; - -import java.util.*; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.content.LocalBroadcastManager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.ListView; - -import java.util.ArrayList; - -import org.grammaticalframework.ui.android.R; -import se.chalmers.phrasebook.backend.Model; -import se.chalmers.phrasebook.backend.syntax.SyntaxTree; -import se.chalmers.phrasebook.gui.activities.NavigationActivity; - - -/** - * Created by Björn on 2016-04-25. - */ -public class PhraseListFragment extends Fragment { - - protected Model model; - private String title; - private String id; - - public static PhraseListFragment newInstance(String title) { - PhraseListFragment fragment = new PhraseListFragment(); - Bundle args = new Bundle(); - args.putString("title", title); - fragment.setArguments(args); - return fragment; - } - - public static PhraseListFragment newInstance(String title, String id) { - PhraseListFragment fragment = new PhraseListFragment(); - Bundle args = new Bundle(); - args.putString("title", title); - args.putString("id", id); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - model = Model.getInstance(); - title = getArguments().getString("title"); - id = getArguments().getString("id"); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - View view = inflater.inflate(R.layout.fragment_phrase_list, container, false); - getActivity().getActionBar().setTitle(title); - - final List sentences = (id == null) ? model.getSentences() : model.getGroup(id); - ArrayAdapter adapter = new ArrayAdapter(getActivity(), R.layout.phrase_list_item, sentences); - - final ListView phraseListView = (ListView) view.findViewById(R.id.phrase_listView); - phraseListView.setAdapter(adapter); - - phraseListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long item_id) { - SyntaxTree phrase = sentences.get(position); - getActivity().getActionBar().setTitle(phrase.getDesc()); - ((NavigationActivity) getActivity()).setToTranslationFragment(phrase); - } - }); - - return view; - } -} diff --git a/src/ui/android/src/se/chalmers/phrasebook/gui/fragments/TranslatorFragment.java b/src/ui/android/src/se/chalmers/phrasebook/gui/fragments/TranslatorFragment.java deleted file mode 100644 index cb5d50841..000000000 --- a/src/ui/android/src/se/chalmers/phrasebook/gui/fragments/TranslatorFragment.java +++ /dev/null @@ -1,253 +0,0 @@ -package se.chalmers.phrasebook.gui.fragments; - -import java.util.*; - -import android.os.Bundle; -import android.content.Context; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; -import android.view.*; -import android.widget.*; -import android.text.Editable; -import android.text.TextWatcher; -import android.text.method.PasswordTransformationMethod; - -import org.grammaticalframework.pgf.Expr; -import org.grammaticalframework.ui.android.Translator; -import org.grammaticalframework.ui.android.GFTranslator; -import org.grammaticalframework.ui.android.TTS; -import org.grammaticalframework.ui.android.R; -import se.chalmers.phrasebook.backend.*; -import se.chalmers.phrasebook.backend.syntax.*; - -/** - * Created by matilda on 04/04/16. - */ -public class TranslatorFragment extends Fragment { - protected Model model; - Translator mTranslator; - private TTS mTts; - - private TextView origin,target; - private ListView list; - SyntaxTree phrase; - - ChoiceContext mContext; - ArrayAdapter mAdapter; - - public static TranslatorFragment newInstance(SyntaxTree phrase) { - TranslatorFragment translatorFragment = new TranslatorFragment(); - Bundle args = new Bundle(); - args.putSerializable("phrase", phrase); - translatorFragment.setArguments(args); - return translatorFragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - phrase = (SyntaxTree) getArguments().getSerializable("phrase"); - model = Model.getInstance(); - mTranslator = ((GFTranslator) getContext().getApplicationContext()).getTranslator(); - mTts = new TTS(getActivity()); - mContext = new ChoiceContext(); - - - mAdapter = - new ArrayAdapter(getActivity(), R.layout.spinner_input_list_item, mContext.getChoices()) { - LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - - @Override - public View getView (int position, View convertView, ViewGroup parent) { - SyntacticChoice choice = mContext.getChoices().get(position); - View view = null; - if (choice.getNode() instanceof SyntaxNodeBoolean) { - view = createCheckBoxInputView(inflater, choice, (SyntaxNodeBoolean) choice.getNode(), parent); - } else if (choice.getNode() instanceof SyntaxNodeOption) { - view = createSpinnerInputView(inflater, choice, (SyntaxNodeOption) choice.getNode(), parent); - } else if (choice.getNode() instanceof SyntaxNodeNumeral) { - view = createNumeralInputView(inflater, choice, (SyntaxNodeNumeral) choice.getNode(), parent); - } - return view; - } - }; - } - - @Override - public View onCreateView(final LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_translator, container, false); - origin = (TextView) view.findViewById(R.id.origin_phrase); - target = (TextView) view.findViewById(R.id.target_phrase); - list = (ListView) view.findViewById(R.id.input_holder); - list.setAdapter(mAdapter); - - ImageView button = (ImageView) view.findViewById(R.id.button3); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mTts.speak(mTranslator.getTargetLanguage().getLangCode(), (String) target.getText()); - } - }); - - updateSyntax(); - return view; - } - - private View createSpinnerInputView(LayoutInflater inflater, final SyntacticChoice choice, final SyntaxNodeOption options, ViewGroup parent) { - View view = inflater.inflate(R.layout.spinner_input_list_item, parent, false); - TextView viewLabel = (TextView) view.findViewById(R.id.text_view_spinner); - Spinner spinner = (Spinner) view.findViewById(R.id.choice_spinner); - - String label = options.getDesc(); - if (label == null || label.isEmpty()) { - viewLabel.setVisibility(View.GONE); - } else { - viewLabel.setText(label); - } - - final ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1,options.getOptions()); - adapter.setDropDownViewResource(android.R.layout.simple_list_item_1); - spinner.setAdapter(adapter); - - spinner.setSelection(choice.getChoice()); - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (position != choice.getChoice()) { - choice.setChoice(position); - updateSyntax(); - } - } - - @Override - public void onNothingSelected(AdapterView parent) { - } - }); - - return view; - } - - private class NumericKeyBoardTransformationMethod extends PasswordTransformationMethod { - @Override - public CharSequence getTransformation(CharSequence source, View view) { - return source; - } - } - - private View createNumeralInputView(LayoutInflater inflater, final SyntacticChoice choice, final SyntaxNodeNumeral numeral, ViewGroup parent) { - View view = inflater.inflate(R.layout.number_input_list_item, parent, false); - TextView viewLabel = (TextView) view.findViewById(R.id.textView_number); - final SeekBar seekBar = (SeekBar) view.findViewById(R.id.seekBar); - final EditText editNumber = (EditText) view.findViewById(R.id.editNumber); - - String label = choice.getNode().getDesc(); - if (label == null || label.isEmpty()) { - viewLabel.setVisibility(View.GONE); - } else { - viewLabel.setText(label); - } - - seekBar.setProgress(choice.getChoice()); - editNumber.setText(Integer.toString(choice.getChoice())); - - editNumber.setTransformationMethod(new NumericKeyBoardTransformationMethod()); - editNumber.requestFocus(); - seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - editNumber.setText(Integer.toString(progress+1)); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); - - - editNumber.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - - } - - @Override - public void afterTextChanged(Editable s) { - int number; - boolean update = false; - try { - if(editNumber.getText().toString().equals("")) { - number = numeral.getMin(); - } else { - number = Integer.parseInt(editNumber.getText().toString()); - if (number < numeral.getMin()) { - number = numeral.getMin(); - update = true; - } - if (number > numeral.getMax()) { - number = numeral.getMax(); - update = true; - } - editNumber.setInputType(0); - } - } catch (NumberFormatException e) { - number = choice.getChoice(); - update = true; - } - choice.setChoice(number); - if (update) - editNumber.setText(Integer.toString(number)); - seekBar.setProgress(number-numeral.getMin()); - updateSyntax(); - } - }); - - return view; - } - - private View createCheckBoxInputView(LayoutInflater inflater, final SyntacticChoice choice, final SyntaxNodeBoolean options, ViewGroup parent) { - View view = inflater.inflate(R.layout.checkbox_input_list_item, parent, false); - final CheckBox checkBox = (CheckBox) view.findViewById(R.id.choice_checkbox); - - String label = options.getDesc(); - if (label != null && !label.isEmpty()) { - checkBox.setText(label); - } - - checkBox.setChecked(choice.getChoice() == 1); - checkBox.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View view) { - int position = checkBox.isChecked() ? 1 : 0; - if (position != choice.getChoice()) { - choice.setChoice(position); - updateSyntax(); - } - } - }); - - return view; - } - - public void updateSyntax() { - mContext.reset(); - - Expr expr = phrase.getAbstractSyntax(mContext); - origin.setText(mTranslator.linearizeSource(expr)); - target.setText(mTranslator.linearize(expr)); - mAdapter.notifyDataSetChanged(); - } -} diff --git a/src/ui/android/topics.txt b/src/ui/android/topics.txt deleted file mode 100644 index 785d07ba4..000000000 --- a/src/ui/android/topics.txt +++ /dev/null @@ -1,951 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/gwt/.classpath b/src/ui/gwt/.classpath deleted file mode 100644 index 781d7a2f8..000000000 --- a/src/ui/gwt/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/ui/gwt/.project b/src/ui/gwt/.project deleted file mode 100644 index dfd6dab3f..000000000 --- a/src/ui/gwt/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - GF-GWT - GF-GWT project - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.google.gdt.eclipse.core.webAppProjectValidator - - - - - com.google.gwt.eclipse.core.gwtProjectValidator - - - - - - org.eclipse.jdt.core.javanature - com.google.gwt.eclipse.core.gwtNature - - diff --git a/src/ui/gwt/Editor-compile b/src/ui/gwt/Editor-compile deleted file mode 100644 index 4106298ea..000000000 --- a/src/ui/gwt/Editor-compile +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -APPDIR=`dirname $0`; - -if [ -z "$GWT_CLASSPATH" ]; then - echo 'ERROR: $GWT_CLASSPATH is not set' - echo 'Set $GWT_CLASSPATH to point to the GWT JAR files. For example:' - echo 'export GWT_DIR="/Users/bringert/src/gwt-2.0.4"' - echo 'export GWT_CLASSPATH="$GWT_DIR/gwt-user.jar:$GWT_DIR/gwt-dev.jar"' - exit 1 -fi - -if [ `uname` = "Darwin" ]; then - GWT_JAVA_OPTS=-XstartOnFirstThread -fi - -java $GWT_JAVA_OPTS -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:$GWT_CLASSPATH" com.google.gwt.dev.Compiler -war "$APPDIR/www/editor" "$@" org.grammaticalframework.ui.gwt.EditorApp; diff --git a/src/ui/gwt/Editor-compile.bat b/src/ui/gwt/Editor-compile.bat deleted file mode 100644 index 2c9b77f4e..000000000 --- a/src/ui/gwt/Editor-compile.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off - -set APPDIR=. -set GWT_DIR=C:\Program Files\eclipse\plugins\com.google.gwt.eclipse.sdkbundle.2.0.4_2.0.4.v201006301254\gwt-2.0.4 -set GWT_CLASSPATH=%GWT_DIR%\gwt-user.jar;%GWT_DIR%\gwt-dev.jar - -java %GWT_JAVA_OPTS% -Xmx256M -cp "%APPDIR%\src;%GWT_CLASSPATH%" com.google.gwt.dev.Compiler -war "%APPDIR%\www\editor" org.grammaticalframework.ui.gwt.EditorApp -style PRETTY diff --git a/src/ui/gwt/Fridge-compile b/src/ui/gwt/Fridge-compile deleted file mode 100644 index 887e253bc..000000000 --- a/src/ui/gwt/Fridge-compile +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -APPDIR=`dirname $0`; - -if [ -z "$GWT_CLASSPATH" ]; then - echo 'ERROR: $GWT_CLASSPATH is not set' - echo 'Set $GWT_CLASSPATH to point to the GWT JAR files. For example:' - echo 'export GWT_DIR="/Users/bringert/src/gwt-2.0.4"' - echo 'export GWT_CLASSPATH="$GWT_DIR/gwt-user.jar:$GWT_DIR/gwt-dev.jar"' - exit 1 -fi - -if [ `uname` = "Darwin" ]; then - GWT_JAVA_OPTS=-XstartOnFirstThread -fi - -java $GWT_JAVA_OPTS -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:$GWT_CLASSPATH" com.google.gwt.dev.Compiler -war "$APPDIR/www/fridge" "$@" org.grammaticalframework.ui.gwt.FridgeApp; diff --git a/src/ui/gwt/Fridge-compile-fast b/src/ui/gwt/Fridge-compile-fast deleted file mode 100644 index 1a7a4df03..000000000 --- a/src/ui/gwt/Fridge-compile-fast +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -APPDIR=`dirname $0`; - -if [ -z "$GWT_CLASSPATH" ]; then - echo 'ERROR: $GWT_CLASSPATH is not set' - echo 'Set $GWT_CLASSPATH to point to the GWT JAR files. For example:' - echo 'export GWT_DIR="/Users/bringert/src/gwt-mac-1.5.2"' - echo 'export GWT_CLASSPATH="$GWT_DIR/gwt-user.jar:$GWT_DIR/gwt-dev-mac.jar"' - exit 1 -fi - -if [ `uname` = "Darwin" ]; then - GWT_JAVA_OPTS=-XstartOnFirstThread -fi - -LIBS=$APPDIR/lib/gwt-dnd-2.5.6.jar - -java $GWT_JAVA_OPTS -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:$LIBS:$GWT_CLASSPATH" com.google.gwt.dev.GWTCompiler -out "$APPDIR/www" -style DETAILED "$@" se.chalmers.cs.gf.gwt.FridgeApp_IE6; diff --git a/src/ui/gwt/Fridge-compile.bat b/src/ui/gwt/Fridge-compile.bat deleted file mode 100644 index 8617d8528..000000000 --- a/src/ui/gwt/Fridge-compile.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off - -set APPDIR=. -set GWT_DIR=c:\gwt-windows-1.5.2 -set GWT_CLASSPATH="%GWT_DIR%\gwt-user.jar;%GWT_DIR%\gwt-dev-windows.jar" - -set LIBS=%APPDIR%\lib\gwt-dnd-2.5.6.jar - -java %GWT_JAVA_OPTS% -Xmx256M -cp "%APPDIR%\src;%APPDIR%\bin;%LIBS%;%GWT_CLASSPATH%" com.google.gwt.dev.GWTCompiler -out "%APPDIR%\www\fridge" se.chalmers.cs.gf.gwt.FridgeApp diff --git a/src/ui/gwt/Fridge-shell-external b/src/ui/gwt/Fridge-shell-external deleted file mode 100644 index 1209047ed..000000000 --- a/src/ui/gwt/Fridge-shell-external +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -APPDIR=`dirname $0`; - -if [ -z "$GWT_CLASSPATH" ]; then - echo 'ERROR: $GWT_CLASSPATH is not set' - echo 'Set $GWT_CLASSPATH to point to the GWT JAR files. For example:' - echo 'export GWT_DIR="/Users/bringert/src/gwt-mac-1.5.2"' - echo 'export GWT_CLASSPATH="$GWT_DIR/gwt-user.jar:$GWT_DIR/gwt-dev-mac.jar"' - exit 1 -fi - -if [ `uname` = "Darwin" ]; then - GWT_JAVA_OPTS=-XstartOnFirstThread -fi - -LIBS=$APPDIR/lib/gwt-dnd-2.5.6.jar - -java $GWT_JAVA_OPTS -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:$LIBS:$GWT_CLASSPATH" com.google.gwt.dev.GWTShell -out "$APPDIR/www" -noserver "$@" http://localhost:41296/fridge/; diff --git a/src/ui/gwt/Morpho-compile b/src/ui/gwt/Morpho-compile deleted file mode 100644 index 234e18322..000000000 --- a/src/ui/gwt/Morpho-compile +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -APPDIR=`dirname $0`; - -if [ -z "$GWT_CLASSPATH" ]; then - echo 'ERROR: $GWT_CLASSPATH is not set' - echo 'Set $GWT_CLASSPATH to point to the GWT JAR files. For example:' - echo 'export GWT_DIR="/Users/bringert/src/gwt-2.0.4"' - echo 'export GWT_CLASSPATH="$GWT_DIR/gwt-user.jar:$GWT_DIR/gwt-dev.jar"' - exit 1 -fi - -if [ `uname` = "Darwin" ]; then - GWT_JAVA_OPTS=-XstartOnFirstThread -fi - -java $GWT_JAVA_OPTS -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:$LIBS:$GWT_CLASSPATH" com.google.gwt.dev.Compiler -war "$APPDIR/www/morpho" "$@" org.grammaticalframework.ui.gwt.MorphoApp; diff --git a/src/ui/gwt/Translate-compile b/src/ui/gwt/Translate-compile deleted file mode 100644 index 220cf4a46..000000000 --- a/src/ui/gwt/Translate-compile +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -APPDIR=`dirname $0`; - -if [ -z "$GWT_CLASSPATH" ]; then - echo 'ERROR: $GWT_CLASSPATH is not set' - echo 'Set $GWT_CLASSPATH to point to the GWT JAR files. For example:' - echo 'export GWT_DIR="/Users/bringert/src/gwt-2.0.4"' - echo 'export GWT_CLASSPATH="$GWT_DIR/gwt-user.jar:$GWT_DIR/gwt-dev.jar"' - exit 1 -fi - -if [ `uname` = "Darwin" ]; then - GWT_JAVA_OPTS=-XstartOnFirstThread -fi - -java $GWT_JAVA_OPTS -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:$GWT_CLASSPATH" com.google.gwt.dev.Compiler -war "$APPDIR/www/translate" "$@" org.grammaticalframework.ui.gwt.TranslateApp; diff --git a/src/ui/gwt/Translate-compile.bat b/src/ui/gwt/Translate-compile.bat deleted file mode 100644 index df3ee9389..000000000 --- a/src/ui/gwt/Translate-compile.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off - -set APPDIR=. -set GWT_DIR=c:\gwt-windows-1.5.2 -set GWT_CLASSPATH="%GWT_DIR%\gwt-user.jar;%GWT_DIR%\gwt-dev-windows.jar" - -set LIBS=%APPDIR%\lib\gwt-dnd-2.5.6.jar - -java %GWT_JAVA_OPTS% -Xmx256M -cp "%APPDIR%\src;%APPDIR%\bin;%LIBS%;%GWT_CLASSPATH%" com.google.gwt.dev.GWTCompiler -out "%APPDIR%\www\translate" se.chalmers.cs.gf.gwt.TranslateApp diff --git a/src/ui/gwt/Translate-shell-external b/src/ui/gwt/Translate-shell-external deleted file mode 100644 index b1e58f019..000000000 --- a/src/ui/gwt/Translate-shell-external +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -APPDIR=`dirname $0`; - -if [ -z "$GWT_CLASSPATH" ]; then - echo 'ERROR: $GWT_CLASSPATH is not set' - echo 'Set $GWT_CLASSPATH to point to the GWT JAR files. For example:' - echo 'export GWT_DIR="/Users/bringert/src/gwt-mac-1.5.2"' - echo 'export GWT_CLASSPATH="$GWT_DIR/gwt-user.jar:$GWT_DIR/gwt-dev-mac.jar"' - exit 1 -fi - -if [ `uname` = "Darwin" ]; then - GWT_JAVA_OPTS=-XstartOnFirstThread -fi - -LIBS=$APPDIR/lib/gwt-dnd-2.5.6.jar - -java $GWT_JAVA_OPTS -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:$LIBS:$GWT_CLASSPATH" com.google.gwt.dev.GWTShell -out "$APPDIR/www" -noserver "$@" http://localhost:41296/translate/; diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/EditorApp.gwt.xml b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/EditorApp.gwt.xml deleted file mode 100644 index a7b24c1af..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/EditorApp.gwt.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/FridgeApp.gwt.xml b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/FridgeApp.gwt.xml deleted file mode 100644 index b041f9830..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/FridgeApp.gwt.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/FridgeApp_IE6.gwt.xml b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/FridgeApp_IE6.gwt.xml deleted file mode 100644 index 70d2b1714..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/FridgeApp_IE6.gwt.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/MorphoApp.gwt.xml b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/MorphoApp.gwt.xml deleted file mode 100644 index 9bdd8d5ac..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/MorphoApp.gwt.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/PGF.gwt.xml b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/PGF.gwt.xml deleted file mode 100644 index 549a16f0d..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/PGF.gwt.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/TranslateApp.gwt.xml b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/TranslateApp.gwt.xml deleted file mode 100644 index ef51227ec..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/TranslateApp.gwt.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/BrowsePanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/BrowsePanel.java deleted file mode 100644 index 3f4c8a9a4..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/BrowsePanel.java +++ /dev/null @@ -1,269 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; -import com.google.gwt.user.client.History; -import com.google.gwt.user.client.HistoryListener; -import com.google.gwt.user.client.Command; -import com.google.gwt.user.client.DeferredCommand; -import com.google.gwt.user.client.ui.*; -import com.google.gwt.http.client.*; -import com.google.gwt.xml.client.*; -import com.google.gwt.event.logical.shared.*; - -public class BrowsePanel extends Composite { - - private PGFWrapper pgf; - private StatusPopup statusPopup; - private HTML sourceView; - private SuggestBox searchBox; - private CompletionOracle oracle; - private List identifiers = null; - - public BrowsePanel(PGFWrapper pgf, StatusPopup statusPopup) { - this.pgf = pgf; - this.statusPopup = statusPopup; - - oracle = new CompletionOracle(); - - HorizontalPanel browsePanel = new HorizontalPanel(); - VerticalPanel vPanel = new VerticalPanel(); - vPanel.add(createSearchPanel(oracle)); - vPanel.add(createTreeView()); - browsePanel.add(vPanel); - browsePanel.add(createSourcePanel()); - browsePanel.setCellWidth(sourceView,"100%"); - - initWidget(browsePanel); - setStylePrimaryName("my-BrowsePanel"); - - pgf.addSettingsListener(new MySettingsListener(pgf)); - } - - public native void onActivate() /*-{ - $doc.browsePanel = this; - $doc.callBrowse = @org.grammaticalframework.ui.gwt.client.BrowsePanel::callBrowse(Lorg/grammaticalframework/ui/gwt/client/BrowsePanel;Ljava/lang/String;); - }-*/; - - protected Widget createSearchPanel(CompletionOracle oracle) { - searchBox = new SuggestBox(oracle); - searchBox.setLimit(10); - searchBox.addKeyboardListener(new KeyboardListenerAdapter() { - public void onKeyUp (Widget sender, char keyCode, int modifiers) { - if (keyCode == KEY_ENTER) { - callBrowse(BrowsePanel.this,searchBox.getText()); - } - } - }); - - DecoratorPanel decorator = new DecoratorPanel(); - VerticalPanel vPanel = new VerticalPanel(); - vPanel.add(new Label("Search")); - vPanel.add(searchBox); - decorator.add(vPanel); - return decorator; - } - - private static void callBrowse(BrowsePanel panel, String id) { - panel.browse(id); - History.newItem("browse:"+id, false); - } - - public void browse(final String id) { - if (id == null || id.equals("")) { - sourceView.setHTML(""); - return; - } - - pgf.browse(id, "javascript:document.callBrowse(document.browsePanel,'$ID')", - "my-identifierLink", - new RequestCallback() { - public void onResponseReceived(Request request, Response response) { - sourceView.setHTML(response.getText()); - } - - public void onError(Request request, java.lang.Throwable e) { - statusPopup.showError("Cannot load the page", e); - } - }); - } - - protected Widget createTreeView() { - hierarchyTree = new Tree(); - hierarchyTree.addSelectionHandler(new SelectionHandler() { - public void onSelection(SelectionEvent event) { - TreeItem item = event.getSelectedItem(); - callBrowse(BrowsePanel.this,item.getText()); - } - }); - return hierarchyTree; - } - - protected Widget createSourcePanel() { - sourceView = new HTML(); - sourceView.setStylePrimaryName("source"); - return sourceView; - } - - protected class CompletionOracle extends SuggestOracle { - - public CompletionOracle() { - } - - public void requestSuggestions(SuggestOracle.Request request, SuggestOracle.Callback callback) { - List list = new ArrayList(); - - int index = Collections.binarySearch(identifiers, request.getQuery()); - index = (index >= 0) ? index : -(index+1); - - for (; index < identifiers.size(); index++) { - String id = identifiers.get(index); - - if (id.startsWith(request.getQuery())) { - list.add(new CompletionSuggestion(id)); - } - else - break; - - if (list.size() > request.getLimit()) - break; - } - - callback.onSuggestionsReady(request, new SuggestOracle.Response(list)); - } - } - - protected static class CompletionSuggestion implements SuggestOracle.Suggestion { - private String string; - - public CompletionSuggestion(String string) { - this.string = string; - } - - public String getDisplayString() { - return string; - } - - public String getReplacementString() { - return string; - } - } - - Tree hierarchyTree = null; - - protected void reloadHierarchyTree() { - hierarchyTree.clear(); - - final String url = pgf.getGrammarURL()+".xml"; - RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url)); - try - { - builder.sendRequest(null, new RequestCallback() { - public void onResponseReceived(Request request, Response response) - { - if (200 == response.getStatusCode()) - { - try - { - Document browseDoc = XMLParser.parse(response.getText()); - - TreeLoader loader = new TreeLoader(); - - Element element = browseDoc.getDocumentElement(); - NodeList children = element.getChildNodes(); - for (int i = 0; i < children.getLength(); i++) { - Node node = children.item(i); - if (node instanceof Element) { - Element childElement = (Element) node; - TreeItem childItem = hierarchyTree.addItem(childElement.getAttribute("name")); - loader.push(childElement, childItem); - } - } - - loader.execute(); - } - catch (DOMException e) - { - } - } - else - { - } - } - - public void onError(Request request, Throwable e) - { - } - }); - } - catch (RequestException e) - { - } - } - - private class TreeLoader implements Command { - private int count = 0; - private ArrayList elements = new ArrayList(); - private ArrayList items = new ArrayList(); - - public void execute() { - for (int n = 0; n < 100; n++) { - if (count <= 0) - return; - - int index = --count; - Element element = (Element) elements.remove(index); - TreeItem item = (TreeItem) items.remove(index); - - NodeList children = element.getChildNodes(); - for (int i = 0; i < children.getLength(); i++) { - Node node = children.item(i); - if (node instanceof Element) { - Element childElement = (Element) node; - TreeItem childItem = item.addItem(childElement.getAttribute("name")); - push(childElement, childItem); - } - } - } - DeferredCommand.addCommand(this); - } - - public final void push(Element element, TreeItem item) { - elements.add(element); - items.add(item); - count++; - } - } - - protected class MySettingsListener implements SettingsListener { - - private PGFWrapper pgf; - - public MySettingsListener(PGFWrapper pgf) { - this.pgf = pgf; - } - - public void onAvailableGrammarsChanged() { } - public void onSelectedGrammarChanged() - { - List ids = new ArrayList(); - - for (int i = 0; i < pgf.getCategories().length(); i++) { - ids.add(pgf.getCategories().get(i)); - } - for (int i = 0; i < pgf.getFunctions().length(); i++) { - ids.add(pgf.getFunctions().get(i)); - } - - Collections.sort(ids); - - identifiers = ids; - sourceView.setText(""); - searchBox.setText(""); - reloadHierarchyTree(); - } - public void onInputLanguageChanged() { } - public void onOutputLanguageChanged() { } - public void onStartCategoryChanged() { } - public void onSettingsError(String msg, Throwable e) { } - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/CompletionOracle.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/CompletionOracle.java deleted file mode 100644 index 7ea5d2be6..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/CompletionOracle.java +++ /dev/null @@ -1,152 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import com.google.gwt.user.client.ui.SuggestOracle; - -public class CompletionOracle extends SuggestOracle { - - private static final int LIMIT_SCALE_FACTOR = 4; - - private PGFWrapper pgf; - - private ErrorHandler errorHandler; - - private JSONRequest jsonRequest = null; - - private String oldQuery = null; - - private List oldSuggestions = Collections.emptyList(); - - - public CompletionOracle (PGFWrapper pgf) { - this(pgf, null); - } - - public CompletionOracle (PGFWrapper pgf, ErrorHandler errorHandler) { - this.pgf = pgf; - this.errorHandler = errorHandler; - pgf.addSettingsListener(new SettingsListener() { - public void onAvailableGrammarsChanged() { clearState(); } - public void onSelectedGrammarChanged() { clearState(); } - public void onInputLanguageChanged() { clearState(); } - public void onOutputLanguageChanged() { clearState(); } - public void onStartCategoryChanged() { clearState(); } - public void onSettingsError(String msg, Throwable e) { clearState(); } - }); - } - - private void clearState () { - this.oldQuery = null; - this.oldSuggestions = Collections.emptyList(); - if (jsonRequest != null) { - jsonRequest.cancel(); - jsonRequest = null; - } - } - - public void setErrorHandler(ErrorHandler errorHandler) { - this.errorHandler = errorHandler; - } - - public static interface ErrorHandler { - public void onError(Throwable e); - } - - public static class CompletionSuggestion implements SuggestOracle.Suggestion { - private String string; - public CompletionSuggestion(String string) { - this.string = string; - } - - public String getDisplayString() { - return string; - } - - public String getReplacementString() { - return string; - } - } - - public void requestSuggestions(SuggestOracle.Request request, SuggestOracle.Callback callback) { - // Only allow a single completion request at a time - if (jsonRequest != null) { - jsonRequest.cancel(); - jsonRequest = null; - } - - List suggestions = filterOldSuggestions(request); - if (suggestions != null) { - suggestionsReady(request, callback, suggestions); - } else { - retrieveSuggestions(request, callback); - } - } - - /** Filters old suggestions and checks if we still have enough suggestions. */ - private List filterOldSuggestions(SuggestOracle.Request request) { - String query = request.getQuery(); - if (query.length() > 0 && oldQuery != null && query.startsWith(oldQuery)) { - // If the prefix had no completions, there is no way that the current input will. - if (oldSuggestions.isEmpty()) { - return Collections.emptyList(); - } - // If the new input since the previous query ends in whitespace, - // always get completions from the server, - // since the old suggestions won't include the next word. - if (query.indexOf(' ', oldQuery.length()) != -1) { - return null; - } - List suggestions = new ArrayList(); - for (CompletionSuggestion c : oldSuggestions) { - if (c.getReplacementString().startsWith(query)) { - suggestions.add(c); - } - } - if (suggestions.size() >= request.getLimit() || oldSuggestions.size() < request.getLimit()) { - return suggestions; - } - } - return null; - } - - private void retrieveSuggestions(final SuggestOracle.Request request, final SuggestOracle.Callback callback) { - // hack: first report no completions, to hide suggestions until we get the new completions - callback.onSuggestionsReady(request, new SuggestOracle.Response(Collections.emptyList())); - - jsonRequest = pgf.complete(request.getQuery(), LIMIT_SCALE_FACTOR * request.getLimit(), - new PGF.CompleteCallback() { - public void onResult(IterableJsArray completions) { - jsonRequest = null; - List suggestions = new ArrayList(); - for (PGF.Completion completion : completions.iterable()) { - String text = completion.getBracketedString().render(); - for (String tokn : completion.getCompletions()) { - StringBuilder sbuilder = new StringBuilder(); - sbuilder.append(text); - if (sbuilder.length() > 0) - sbuilder.append(' '); - sbuilder.append(tokn); - suggestions.add(new CompletionSuggestion(sbuilder.toString())); - } - } - suggestionsReady(request, callback, suggestions); - } - - public void onError(Throwable e) { - errorHandler.onError(e); - } - - }); - } - - private void suggestionsReady(SuggestOracle.Request request, SuggestOracle.Callback callback, List suggestions) { - this.oldQuery = request.getQuery(); - this.oldSuggestions = suggestions; - suggestions = suggestions.size() <= request.getLimit() ? suggestions : SubList.makeSubList(suggestions, 0, request.getLimit()); - callback.onSuggestionsReady(request, new SuggestOracle.Response(suggestions)); - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java deleted file mode 100644 index fd336bf34..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java +++ /dev/null @@ -1,136 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import org.grammaticalframework.ui.gwt.client.JSONRequestBuilder.Arg; - -import java.util.*; -import com.google.gwt.core.client.*; - -public class ContentService { - - // Event listeners - private List listeners = new LinkedList(); - private List grammars = null; - - - public ContentService() { - } - - public static class Init extends JavaScriptObject { - protected Init() { } - - public final native String getUserId() /*-{ return this.userId; }-*/; - public final native String getUserURL() /*-{ return this.userURL; }-*/; - public final native String getUserEMail() /*-{ return this.userEMail; }-*/; - public final native String getContentURL() /*-{ return this.contentURL; }-*/; - } - - public static final native Init getInit() /*-{ - return $wnd.__gfInit; - }-*/; - - public void addSettingsListener(SettingsListener listener) { - listeners.add(listener); - } - - public void updateAvailableGrammars() { - List args = new ArrayList(); - args.add(new Arg("userId", getInit().getUserId())); - args.add(new Arg("command", "grammars")); - JSONRequestBuilder.sendRequest(getInit().getContentURL(), args, new GrammarsCallback() { - public void onResult(IterableJsArray grammars_) { - grammars = new ArrayList(); - for (ContentService.GrammarInfo grammar : grammars_.iterable()) { - grammars.add(grammar); - } - - for (SettingsListener listener : listeners) { - listener.onAvailableGrammarsChanged(); - } - } - - public void onError(Throwable e) { - } - }); - } - - public List getGrammars() { - return grammars; - } - - public interface GrammarsCallback extends JSONCallback> {} - - public static class GrammarInfo extends JavaScriptObject { - protected GrammarInfo() { } - - public final native String getURL() /*-{ return this.url; }-*/; - public final native String getName() /*-{ return this.name; }-*/; - public final native String getDescription() /*-{ return this.description; }-*/; - } - - public JSONRequest deleteGrammar(String grammarURL, DeleteCallback callback) { - List args = new ArrayList(); - args.add(new Arg("url", grammarURL)); - args.add(new Arg("userId", getInit().getUserId())); - args.add(new Arg("command", "delete_grammar")); - return JSONRequestBuilder.sendRequest(getInit().getContentURL(), args, callback); - } - - public JSONRequest save(Object id, String content, SaveCallback callback) { - List args = new ArrayList(); - if (id != null) - args.add(new Arg("id", id.toString())); - args.add(new Arg("command", "save")); - return JSONRequestBuilder.sendDataRequest(getInit().getContentURL(), args, content, callback); - } - - public interface SaveCallback extends JSONCallback {} - - public JSONRequest load(Object id, LoadCallback callback) { - List args = new ArrayList(); - args.add(new Arg("command", "load")); - args.add(new Arg("id", id.toString())); - return JSONRequestBuilder.sendRequest(getInit().getContentURL(), args, callback); - } - - public interface LoadCallback extends JSONCallback {} - - public JSONRequest search(String fullTextQuery, SearchCallback callback) { - List args = new ArrayList(); - args.add(new Arg("command", "search")); - args.add(new Arg("query", fullTextQuery)); - return JSONRequestBuilder.sendRequest(getInit().getContentURL(), args, callback); - } - - public interface SearchCallback extends JSONCallback> {} - - public static class DocumentSignature extends JavaScriptObject { - protected DocumentSignature() { } - - public final native int getId() /*-{ return this.id; }-*/; - public final native String getTitle() /*-{ return this.title; }-*/; - public final native String getCreated() /*-{ return this.created; }-*/; - public final native String getModified() /*-{ return this.modified; }-*/; - } - - public static class Document extends DocumentSignature { - protected Document() { } - - public final native String getContent() /*-{ return this.content; }-*/; - } - - public JSONRequest delete(List ids, DeleteCallback callback) { - List args = new ArrayList(); - args.add(new Arg("command", "delete")); - for (Object id : ids) { - args.add(new Arg("id", id.toString())); - } - return JSONRequestBuilder.sendRequest(getInit().getContentURL(), args, callback); - } - - public interface DeleteCallback extends JSONCallback {} - - public static class DeleteResult extends JavaScriptObject { - protected DeleteResult() { } - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/DocumentsPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/DocumentsPanel.java deleted file mode 100644 index 09acce5f5..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/DocumentsPanel.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; -import com.google.gwt.user.client.*; -import com.google.gwt.user.client.ui.*; -import com.google.gwt.http.client.*; -import com.google.gwt.xml.client.*; -import com.google.gwt.event.logical.shared.*; -import com.google.gwt.event.dom.client.*; -import com.google.gwt.event.shared.*; - -public class DocumentsPanel extends Composite implements HasSelectionHandlers { - - private PGFWrapper pgf; - private ContentService contentService; - private StatusPopup statusPopup; - private FlexTable table; - private ArrayList documentIds = new ArrayList(); - - public DocumentsPanel(PGFWrapper pgf, ContentService contentService, StatusPopup statusPopup) { - this.pgf = pgf; - this.contentService = contentService; - this.statusPopup = statusPopup; - - VerticalPanel documentsPanel = new VerticalPanel(); - documentsPanel.setStylePrimaryName("my-DocumentsFrame"); - - HorizontalPanel searchPanel = new HorizontalPanel(); - searchPanel.setStylePrimaryName("my-DocumentsSearchFrame"); - final TextBox searchBox = new TextBox(); - searchBox.setWidth("20em"); - final Button searchBtn = new Button("Search"); - searchPanel.add(searchBox); - searchPanel.add(searchBtn); - documentsPanel.add(searchPanel); - - Image deleteButton = new Image("org.grammaticalframework.ui.gwt.EditorApp/trash-button.png"); - deleteButton.setTitle("Deletes the selected documents."); - deleteButton.setStylePrimaryName("toolbar-button"); - deleteButton.addClickListener(new ClickListener () { - public void onClick(Widget sender) { - deleteSelected(); - } - }); - - FlexTable header = new FlexTable(); - header.setStylePrimaryName("my-TableHeader"); - header.setText(0,0,"Documents"); - header.setWidget(0,1,deleteButton); - header.getColumnFormatter().setWidth(1,"20px"); - documentsPanel.add(header); - - table = new FlexTable(); - table.setCellPadding(2); - table.setStylePrimaryName("my-DocumentsTable"); - table.getColumnFormatter().setWidth(1,"80em"); - table.getColumnFormatter().setWidth(2,"80em"); - documentsPanel.add(table); - - searchBtn.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent event) { - searchDocuments(searchBox.getText()); - } - }); - table.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent event) { - HTMLTable.Cell cell = table.getCellForEvent(event); - if (cell != null) { - int row = cell.getRowIndex(); - selectDocument(row); - } - } - }); - - initWidget(documentsPanel); - setStylePrimaryName("my-DocumentsPanel"); - } - - public HandlerRegistration addSelectionHandler(SelectionHandler handler) { - return addHandler(handler, SelectionEvent.getType()); - } - - protected void selectDocument(int row) { - SelectionEvent.fire(this, documentIds.get(row)); - } - - protected void searchDocuments(String fullTextQuery) { - statusPopup.setStatus("Searching..."); - - documentIds.clear(); - while (table.getRowCount() > 0) - table.removeRow(0); - - contentService.search(fullTextQuery, new ContentService.SearchCallback() { - public void onResult(IterableJsArray documents) { - for (ContentService.DocumentSignature sign : documents.iterable()) { - int row = table.getRowCount(); - table.setWidget(row, 0, new CheckBox(sign.getTitle())); - table.setText(row, 1, sign.getCreated()); - table.setText(row, 2, sign.getModified()); - table.getRowFormatter().addStyleName(row, "row"); - documentIds.add(sign.getId()); - } - - statusPopup.clearStatus(); - } - - public void onError(Throwable e) { - statusPopup.showError("Search failed", e); - } - }); - } - - protected void deleteSelected() { - statusPopup.setStatus("Deleting..."); - - final ArrayList ids = new ArrayList(); - final ArrayList rows = new ArrayList(); - for (int row = 0; row < table.getRowCount(); row++) { - CheckBox checkBox = (CheckBox) table.getWidget(row,0); - if (checkBox.isChecked()) { - ids.add(documentIds.get(row)); - rows.add(new Integer(row)); - } - } - - contentService.delete(ids, new ContentService.DeleteCallback() { - public void onResult(ContentService.DeleteResult result) { - for (Integer row : rows) { - table.removeRow(row.intValue()); - } - - statusPopup.clearStatus(); - } - - public void onError(Throwable e) { - statusPopup.showError("Delete failed", e); - } - }); - - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/EditorApp.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/EditorApp.java deleted file mode 100644 index ece9ecac8..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/EditorApp.java +++ /dev/null @@ -1,461 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; - -import com.google.gwt.core.client.*; -import com.google.gwt.user.client.*; -import com.google.gwt.user.client.ui.*; -import com.google.gwt.event.dom.client.*; -import com.google.gwt.event.logical.shared.*; -import com.google.gwt.event.shared.*; - -public class EditorApp implements EntryPoint { - - protected ContentService contentService; - protected PGFWrapper pgf; - - protected SettingsPanel settingsPanel; - protected VerticalPanel outputPanel; - protected Widget editorPanel; - protected BrowsePanel browsePanel; - protected QueryPanel queryPanel; - protected DocumentsPanel documentsPanel; - protected GrammarsPanel grammarsPanel; - protected StatusPopup statusPopup; - protected TextInputPanel textPanel; - protected FridgeBagPanel bagPanel; - protected MagnetFactory magnetFactory; - protected TabBar tabBar; - - private JSONRequest completeRequest = null; - private JSONRequest translateRequest = null; - - private int maxMagnets = 100; - private static final int LIMIT_SCALE_FACTOR = 4; - - private String cachedPrefix = null; - private List cachedMagnets = Collections.emptyList(); - - // - // Update - // - protected void update() { - clearMagnetCache(); - updateBag(""); - updateTranslation(); - } - - protected void clearMagnetCache() { - cachedPrefix = null; - cachedMagnets = Collections.emptyList(); - } - - protected void updateTranslation() { - if (translateRequest != null) { - translateRequest.cancel(); - } - - outputPanel.clear(); - outputPanel.addStyleDependentName("working"); - translateRequest = pgf.translate(textPanel.getText(), - new PGF.TranslateCallback() { - public void onResult (IterableJsArray translations) { - translateRequest = null; - - outputPanel.clear(); - outputPanel.removeStyleDependentName("working"); - for (PGF.TranslationResult tr : translations.iterable()) { - textPanel.renderBracketedString(tr.getBracketedString()); - - if (tr.getTranslations() != null) - for (PGF.Linearizations lins : tr.getTranslations().iterable()) { - LinearizationsPanel lin = new LinearizationsPanel(pgf, lins); - lin.setWidth("100%"); - outputPanel.add(lin); - } - - if (tr.getTypeErrors() != null && tr.getTypeErrors().length > 0) { - for (PGF.TcError error : tr.getTypeErrors()) { - VerticalPanel panel = new VerticalPanel(); - panel.addStyleName("my-typeError"); - Label errLabel = new Label("Type Error"); - errLabel.addStyleName("title"); - panel.add(errLabel); - panel.add(createErrorMsg(error)); - outputPanel.add(panel); - } - textPanel.showError(tr.getTypeErrors()[0].getFId()); - } - } - } - public void onError (Throwable e) { - translateRequest = null; - - statusPopup.showError("Translation failed", e); - } - }); - } - - private class Callback { - private String prefix; - - public Callback(String prefix) { - this.prefix = prefix; - } - - public void onResult(List magnets) { - bagPanel.fill(magnets); - - if (magnets.size() == 0) { - if (prefix.isEmpty()) { - textPanel.hideSearchBox(); - textPanel.setFocus(true); - } - else - textPanel.showSearchError(); - } else { - textPanel.clearSearchError(); - } - } - } - - public void updateBag(String prefix) { - Callback callback = new Callback(prefix); - List magnets = filterCachedMagnets(prefix); - if (magnets != null) - callback.onResult(magnets); - else - retrieveMagnets(prefix, callback); - } - - public List filterCachedMagnets(final String prefix) { - if (prefix.length() > 0 && cachedPrefix != null && prefix.startsWith(cachedPrefix)) { - // If the prefix had no completions, there is no way that the current input will. - if (cachedMagnets.isEmpty()) { - return Collections.emptyList(); - } - - List magnets = new ArrayList(); - for (Magnet magnet : cachedMagnets) { - if (magnet.getWord().startsWith(prefix)) { - magnets.add(magnet); - if (magnets.size() >= maxMagnets) - return magnets; - } - } - } - return null; - } - - public void retrieveMagnets(final String prefix, final Callback callback) { - final String query = textPanel.getText() + " " + prefix; - - if (completeRequest != null) { - completeRequest.cancel(); - } - - bagPanel.clear(); - completeRequest = pgf.complete(query, LIMIT_SCALE_FACTOR * maxMagnets, - new PGF.CompleteCallback() { - public void onResult(IterableJsArray completions) { - completeRequest = null; - - cachedPrefix = query; - cachedMagnets = new ArrayList(); - - for (PGF.Completion completion : completions.iterable()) { - textPanel.renderBracketedString(completion.getBracketedString()); - if (completion.getCompletions() != null) { - if (completion.getText() != prefix) - textPanel.setSearchTerm(completion.getText()); - - for (String word : completion.getCompletions()) { - Magnet magnet = magnetFactory.createMagnet(word, completion.getFrom()); - cachedMagnets.add(magnet); - } - } else { - textPanel.setSearchTerm(completion.getText()); - } - } - - List magnets = new ArrayList(); - for (Magnet magnet : cachedMagnets) { - magnets.add(magnet); - if (magnets.size() >= maxMagnets) - break; - } - callback.onResult(magnets); - } - - public void onError(Throwable e) { - completeRequest = null; - - statusPopup.showError("Getting completions failed", e); - } - }); - } - - // - // GUI - // - - protected Widget createUI() { - editorPanel = createEditorPanel(); - browsePanel = createBrowsePanel(); - queryPanel = createQueryPanel(); - documentsPanel = createDocumentsPanel(); - grammarsPanel = createGrammarsPanel(); - - VerticalPanel vPanel = new VerticalPanel(); - vPanel.setWidth("100%"); - vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); - - HorizontalPanel hPanel = new HorizontalPanel(); - hPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); - hPanel.setStylePrimaryName("my-HeaderPanel"); - - TabBar linksPanel = createLinksPanel(vPanel); - hPanel.add(linksPanel); - hPanel.setCellHorizontalAlignment(linksPanel,HorizontalPanel.ALIGN_LEFT); - linksPanel.selectTab(1); - - settingsPanel = createSettingsPanel(); - hPanel.add(settingsPanel); - hPanel.setCellHorizontalAlignment(settingsPanel,HorizontalPanel.ALIGN_RIGHT); - - vPanel.add(hPanel); - vPanel.add(editorPanel); - - return vPanel; - } - - protected SettingsPanel createSettingsPanel () { - return new SettingsPanel(pgf, contentService, statusPopup); - } - - protected Widget createEditorPanel() { - textPanel = new TextInputPanel(contentService, statusPopup); - textPanel.addValueChangeHandler(new ValueChangeHandler() { - public void onValueChange(ValueChangeEvent event) { - update(); - } - }); - textPanel.addSelectionHandler(new SelectionHandler() { - public void onSelection(SelectionEvent event) { - String prefix = event.getSelectedItem(); - char lastChar = prefix.charAt(prefix.length()-1); - - Iterator iter = bagPanel.iterator(); - if ((Character.isSpace(lastChar) || lastChar == 160) && iter.hasNext()) { - Magnet magnet = iter.next(); - textPanel.setSearchTerm(""); - textPanel.addMagnet(magnet); - } - else - updateBag(prefix); - } - }); - - final ClickListener magnetClickListener = new ClickListener () { - public void onClick(Widget widget) { - Magnet magnet = (Magnet)widget; - textPanel.hideSearchBox(); - textPanel.addMagnet(magnet); - textPanel.setFocus(true); - } - }; - magnetFactory = new MagnetFactory(magnetClickListener); - - bagPanel = new FridgeBagPanel(); - - outputPanel = new VerticalPanel(); - outputPanel.addStyleName("my-translations"); - - final DockPanel editorPanel = new DockPanel(); - editorPanel.setStyleName("my-EditorPanel"); - editorPanel.add(textPanel, DockPanel.NORTH); - editorPanel.add(bagPanel, DockPanel.CENTER); - editorPanel.add(outputPanel, DockPanel.EAST); - - editorPanel.setCellHeight(bagPanel, "100%"); - editorPanel.setCellWidth(bagPanel, "70%"); - editorPanel.setCellHeight(outputPanel, "100%"); - editorPanel.setCellWidth(outputPanel, "30%"); - editorPanel.setCellVerticalAlignment(bagPanel, HasVerticalAlignment.ALIGN_TOP); - editorPanel.setCellHorizontalAlignment(outputPanel, HasHorizontalAlignment.ALIGN_RIGHT); - - Window.addWindowResizeListener(new WindowResizeListener() { - public void onWindowResized(int w, int h) { - editorPanel.setPixelSize(w-20, h-50); - } - }); - int w = Window.getClientWidth(); - int h = Window.getClientHeight(); - editorPanel.setPixelSize(w-20, h-50); - - return editorPanel; - } - - protected BrowsePanel createBrowsePanel() { - return new BrowsePanel(pgf, statusPopup); - } - - protected QueryPanel createQueryPanel() { - return new QueryPanel(pgf, statusPopup); - } - - protected DocumentsPanel createDocumentsPanel() { - DocumentsPanel panel = new DocumentsPanel(pgf, contentService, statusPopup); - panel.addSelectionHandler(new SelectionHandler() { - public void onSelection(SelectionEvent event) { - tabBar.selectTab(1); - textPanel.load(event.getSelectedItem()); - } - }); - return panel; - } - - protected GrammarsPanel createGrammarsPanel() { - return new GrammarsPanel(pgf, contentService, statusPopup); - } - - protected TabBar createLinksPanel(final Panel parent) { - tabBar = new TabBar(); - tabBar.setStylePrimaryName("my-LinksPanel"); - tabBar.addTab("Documents"); - tabBar.addTab("Editor"); - tabBar.addTab("Query"); - tabBar.addTab("Browse"); - tabBar.addTab("Grammars"); - - NavigationHandler handler = new NavigationHandler(tabBar, parent); - tabBar.addSelectionHandler(handler); - History.addHistoryListener(handler); - - return tabBar; - } - - // - // History stuff - // - - protected class NavigationHandler implements HistoryListener, SelectionHandler { - private final TabBar linksPanel; - private final Panel parent; - private int level = 0; - - public NavigationHandler(TabBar linksPanel, Panel parent) { - this.linksPanel = linksPanel; - this.parent = parent; - } - - public void onSelection(SelectionEvent event) { - parent.remove(documentsPanel); - parent.remove(editorPanel); - parent.remove(queryPanel); - parent.remove(browsePanel); - parent.remove(grammarsPanel); - - switch (event.getSelectedItem().intValue()) { - case 0: parent.add(documentsPanel); - if (level == 0) History.newItem("documents", false); - break; - case 1: parent.add(editorPanel); - if (level == 0) History.newItem("editor", false); - break; - case 2: parent.add(queryPanel); - if (level == 0) History.newItem("query", false); - break; - case 3: parent.add(browsePanel); - if (level == 0) History.newItem("browse", false); - browsePanel.onActivate(); - break; - case 4: parent.add(grammarsPanel); - if (level == 0) History.newItem("grammars", false); - break; - } - } - - public void onHistoryChanged(String token) { - level++; - - if (token.equals("documents")) { - linksPanel.selectTab(0); - } else if (token.equals("editor")) { - linksPanel.selectTab(1); - } else if (token.equals("query")) { - linksPanel.selectTab(2); - } else if (token.equals("browse")) { - linksPanel.selectTab(3); - browsePanel.onActivate(); - browsePanel.browse(null); - } else if (token.startsWith("browse:")) { - linksPanel.selectTab(3); - browsePanel.browse(token.substring(7)); - } else if (token.equals("grammars")) { - linksPanel.selectTab(4); - } - - level--; - } - }; - - protected Widget createErrorMsg(final PGF.TcError error) { - HTML msgHTML = new HTML("
"+error.getMsg()+"
"); - msgHTML.addStyleName("content"); - msgHTML.addClickListener(new ClickListener() { - public void onClick(Widget sender) { - textPanel.showError(error.getFId()); - } - }); - return msgHTML; - } - - // - // Initialization - // - - protected class MySettingsListener implements SettingsListener { - // Will only happen on load - public void onAvailableGrammarsChanged() { - if (pgf.getGrammarURL() == null) { - List grammars = pgf.getGrammars(); - if (!grammars.isEmpty()) { - pgf.setGrammarURL(grammars.get(0)); - } - } - } - public void onSelectedGrammarChanged() { - textPanel.clear(); - if (pgf.getInputLanguage() == null) { - GWT.log("Setting input language to user language: " + pgf.getUserLanguage(), null); - pgf.setInputLanguage(pgf.getUserLanguage()); - } - update(); - } - public void onInputLanguageChanged() { - update(); - } - public void onOutputLanguageChanged() { - update(); - } - public void onStartCategoryChanged() { - update(); - } - public void onSettingsError(String msg, Throwable e) { - statusPopup.showError(msg,e); - } - } - - public void onModuleLoad() { - statusPopup = new StatusPopup(); - - pgf = new PGFWrapper(); - contentService = new ContentService(); - RootPanel.get().add(createUI()); - pgf.addSettingsListener(new MySettingsListener()); - contentService.updateAvailableGrammars(); - - textPanel.setFocus(true); - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeApp.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeApp.java deleted file mode 100644 index 4e9963451..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeApp.java +++ /dev/null @@ -1,338 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; - -import com.google.gwt.core.client.EntryPoint; -import com.google.gwt.user.client.*; -import com.google.gwt.user.client.ui.*; - - -public class FridgeApp implements EntryPoint { - - protected static final String pgfBaseURL = "/grammars"; - - protected PGFWrapper pgf; - - protected JSONRequest completeRequest = null; - protected JSONRequest translateRequest = null; - - private FridgeBagPanel bagPanel; - private FridgeTextPanel textPanel; - protected VerticalPanel outputPanel; - protected StatusPopup statusPopup; - - private FlowPanel prefixPanel; - private LinkedHashSet prefixes = new LinkedHashSet(); - - private int maxMagnets = 100; - - private MagnetFactory magnetFactory; - - // - // Text - // - - protected void update () { - updateBag(getText()); - translate(); - } - - public void updateBag (String text) { - updateBag(text, ""); - } - - public void updateBag (final String text, String prefix) { - if (completeRequest != null) { - completeRequest.cancel(); - } - final boolean updatePrefixes = prefix.equals(""); - bagPanel.clear(); - bagPanel.addStyleDependentName("empty"); - if (updatePrefixes) { clearPrefixes(); } - int limit = updatePrefixes ? 0 : maxMagnets; - completeRequest = pgf.complete(text + " " + prefix, - limit, new PGF.CompleteCallback() { - public void onResult(IterableJsArray completions) { - List magnets = new ArrayList(); - for (PGF.Completion completion : completions.iterable()) { - for (String word : completion.getCompletions()) { - if (updatePrefixes) { - addPrefix(text, word.substring(0,1)); - } - if (magnets.size() < maxMagnets) { - Magnet magnet = magnetFactory.createMagnet(word, completion.getFrom()); - magnets.add(magnet); - } else { - prefixPanel.setVisible(true); - } - } - } - bagPanel.fill(magnets); - } - public void onError(Throwable e) { - showError("Translation failed", e); - } - }); - } - - protected void clearPrefixes () { - prefixes.clear(); - prefixPanel.clear(); - prefixPanel.setVisible(false); - } - - protected void addPrefix(final String text, final String prefix) { - if (prefixes.add(prefix)) { - Button prefixButton = new Button(prefix, new ClickListener() { - public void onClick(Widget sender) { - updateBag(text, prefix); - } - }); - prefixButton.setTitle("Show only magnets stating with '" + prefix + "'"); - prefixPanel.add(prefixButton); - } - } - - // - // Translation - // - - protected void translate() { - outputPanel.clear(); - outputPanel.addStyleDependentName("working"); - if (translateRequest != null) { - translateRequest.cancel(); - } - translateRequest = pgf.translate(getText(), - new PGF.TranslateCallback() { - public void onResult (IterableJsArray translations) { - outputPanel.removeStyleDependentName("working"); - for (PGF.TranslationResult tr : translations.iterable()) { - if (tr.getTranslations() != null) - for (PGF.Linearizations t : tr.getTranslations().iterable()) { - for (PGF.Linearization l : t.getLinearizations().iterable()) { - outputPanel.add(createTranslation(l.getTo(), l.getText())); - } - } - - if (tr.getTypeErrors() != null) - for (PGF.TcError error : tr.getTypeErrors()) { - SimplePanel panel = new SimplePanel(); - panel.addStyleName("my-typeError"); - panel.add(new HTML("
"+error.getMsg()+"
")); - outputPanel.add(panel); - } - } - } - public void onError (Throwable e) { - showError("Translation failed", e); - } - }); - } - - protected ClickListener translationClickListener = new ClickListener () { - public void onClick(Widget widget) { - Magnet magnet = (Magnet)widget; - setInputLanguage(magnet.getLanguage()); // FIXME: this causes an unnecessary update() - setText(magnet.getText(), magnet.getLanguage()); - } - }; - - protected Widget createTranslation(String language, String text) { - Magnet magnet = magnetFactory.createUsedMagnet(text, language); - magnet.addClickListener(translationClickListener); - String lang = pgf.getLanguageCode(language); - if (lang != null) { - magnet.getElement().setLang(lang); - } - return magnet; - } - - // - // Current text - // - - public String getText () { - return textPanel.getText(); - } - - public void setText(String text, String language) { - textPanel.setText(text, language); - } - - private void clear() { - textPanel.clear(); - } - - - // - // Status stuff - // - - protected void setStatus(String msg) { - statusPopup.setStatus(msg); - } - - protected void showError(String msg, Throwable e) { - statusPopup.showError(msg, e); - } - - protected void clearStatus() { - statusPopup.clearStatus(); - } - - // GUI - - protected Widget createUI() { - ClickListener magnetClickListener = new ClickListener () { - public void onClick(Widget widget) { - Magnet magnet = (Magnet)widget; - textPanel.addMagnet(magnet); - } - }; - magnetFactory = new MagnetFactory(magnetClickListener); - - textPanel = new FridgeTextPanel(magnetFactory); - textPanel.addChangeListener(new ChangeListener() { - public void onChange(Widget widget) { - update(); - } - }); - prefixPanel = new FlowPanel(); - prefixPanel.setStylePrimaryName("my-PrefixPanel"); - bagPanel = new FridgeBagPanel(); - outputPanel = new TranslationsPanel(); - SettingsPanel settingsPanel = new SettingsPanel(pgf, null, statusPopup); - - VerticalPanel vPanel = new VerticalPanel(); - vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); - vPanel.setWidth("100%"); - vPanel.add(prefixPanel); - vPanel.add(bagPanel); - - final DockPanel mainPanel = new DockPanel(); - mainPanel.setStyleName("my-FridgeApp"); - mainPanel.add(textPanel, DockPanel.NORTH); - mainPanel.add(settingsPanel, DockPanel.SOUTH); - mainPanel.add(vPanel, DockPanel.CENTER); - mainPanel.add(outputPanel, DockPanel.EAST); - - mainPanel.setCellHeight(vPanel, "100%"); - mainPanel.setCellWidth(vPanel, "80%"); - mainPanel.setCellHeight(outputPanel, "100%"); - mainPanel.setCellWidth(outputPanel, "20%"); - mainPanel.setCellVerticalAlignment(vPanel, HasVerticalAlignment.ALIGN_TOP); - mainPanel.setCellHorizontalAlignment(outputPanel, HasHorizontalAlignment.ALIGN_RIGHT); - mainPanel.setCellWidth(settingsPanel, "100%"); - - Window.addWindowResizeListener(new WindowResizeListener() { - public void onWindowResized(int w, int h) { - mainPanel.setPixelSize(w, h); - } - }); - int w = Window.getClientWidth(); - int h = Window.getClientHeight(); - mainPanel.setPixelSize(w, h); - - return mainPanel; - } - - private static class TranslationsPanel extends VerticalPanel { - public TranslationsPanel () { - setStylePrimaryName("my-TranslationsPanel"); - addStyleDependentName("empty"); - } - - public void clear () { - super.clear(); - addStyleDependentName("empty"); - } - - public void add(Widget w) { - removeStyleDependentName("empty"); - super.add(w); - } - - } - - - // - // History stuff - // - - protected class MyHistoryListener implements HistoryListener { - public void onHistoryChanged(String historyToken) { - updateSettingsFromHistoryToken(); - } - }; - - protected void updateSettingsFromHistoryToken() { - updateSettingsFromHistoryToken(History.getToken().split("/")); - } - - protected void updateSettingsFromHistoryToken(String[] tokenParts) { - if (tokenParts.length >= 1 && tokenParts[0].length() > 0) { - setGrammarURL(tokenParts[0]); - } - if (tokenParts.length >= 2 && tokenParts[1].length() > 0) { - setInputLanguage(tokenParts[1]); - } - } - - protected void setGrammarURL(String url) { - if (url != null && !url.equals(pgf.getGrammarURL())) { - pgf.setGrammarURL(url); - } - } - - protected void setInputLanguage (String inputLanguage) { - if (inputLanguage != null && !inputLanguage.equals(pgf.getInputLanguage())) { - pgf.setInputLanguage(inputLanguage); - } - } - - // - // Initialization - // - - protected class MySettingsListener implements SettingsListener { - // Will only happen on load - public void onAvailableGrammarsChanged() { - if (pgf.getGrammarURL() == null) { - List grammars = pgf.getGrammars(); - if (!grammars.isEmpty()) { - pgf.setGrammarURL(grammars.get(0)); - } - } - } - public void onSelectedGrammarChanged() { - if (pgf.getInputLanguage() == null) { - pgf.setInputLanguage(pgf.getUserLanguage()); - } - } - public void onInputLanguageChanged() { - clear(); - } - public void onOutputLanguageChanged() { - update(); - } - public void onStartCategoryChanged() { - update(); - } - public void onSettingsError(String msg, Throwable e) { - showError(msg,e); - } - } - - public void onModuleLoad() { - statusPopup = new StatusPopup(); - - pgf = new PGFWrapper(); - RootPanel.get().add(createUI()); - pgf.addSettingsListener(new MySettingsListener()); - History.addHistoryListener(new MyHistoryListener()); - updateSettingsFromHistoryToken(); - pgf.updateAvailableGrammars(); - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeBagPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeBagPanel.java deleted file mode 100644 index bab14808e..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeBagPanel.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.*; - -public class FridgeBagPanel extends Composite implements Iterable { - - private FlowPanel mainPanel; - - public FridgeBagPanel () { - mainPanel = new FlowPanel(); - - initWidget(new ScrollPanel(mainPanel)); - setStylePrimaryName("my-FridgeBagPanel"); - addStyleDependentName("empty"); - } - - public void clear() { - mainPanel.clear(); - } - - public void fill(List magnets) { - for (Magnet magnet : magnets) { - mainPanel.add(magnet); - } - - if (mainPanel.getWidgetCount() == 0) - addStyleDependentName("empty"); - else - removeStyleDependentName("empty"); - } - - public Iterator iterator() { - return (Iterator) (Iterator) mainPanel.iterator(); - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeTextPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeTextPanel.java deleted file mode 100644 index a44a72446..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeTextPanel.java +++ /dev/null @@ -1,113 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import com.google.gwt.user.client.ui.*; - -public class FridgeTextPanel extends Composite { - - private MagnetFactory magnetFactory; - - private FlowPanel mainPanel; - - private ChangeListenerCollection listeners = null; - - public FridgeTextPanel (MagnetFactory magnetFactory) { - this.magnetFactory = magnetFactory; - mainPanel = new FlowPanel(); - mainPanel.setStylePrimaryName("magnets"); - DockPanel wrapper = new DockPanel(); - wrapper.add(mainPanel, DockPanel.CENTER); - Widget buttons = createButtonPanel(); - wrapper.add(buttons, DockPanel.EAST); - wrapper.setCellWidth(mainPanel, "100%"); - wrapper.setCellWidth(buttons, "6em"); - wrapper.setHorizontalAlignment(DockPanel.ALIGN_RIGHT); - initWidget(wrapper); - setStylePrimaryName("my-FridgeTextPanel"); - } - - - protected Widget createButtonPanel () { - Panel buttons = new VerticalPanel(); - buttons.setStylePrimaryName("buttons"); - PushButton deleteLastButton = new PushButton(new Image("org.grammaticalframework.ui.gwt.FridgeApp/delete-last.png")); - deleteLastButton.setTitle("Removes the last magnet."); - deleteLastButton.addClickListener(new ClickListener () { - public void onClick(Widget sender) { - deleteLast(); - } - }); - buttons.add(deleteLastButton); - PushButton clearButton = new PushButton("Clear"); - clearButton.addClickListener(new ClickListener () { - public void onClick(Widget sender) { - clear(); - } - }); - clearButton.setTitle("Removes all magnets."); - buttons.add(clearButton); - return buttons; - } - - public void setEngaged(boolean engaged) { - if (engaged) { - addStyleDependentName("engage"); - } else { - removeStyleDependentName("engage"); - } - } - - public String getText () { - StringBuilder sb = new StringBuilder(); - for (Widget w : mainPanel) { - if (w instanceof Magnet) { - String word = ((Magnet)w).getText(); - if (sb.length() > 0) { - sb.append(' '); - } - sb.append(word); - } - } - return sb.toString(); - } - - public void setText (String text, String language) { - if (!text.equals(getText())) { - mainPanel.clear(); - for (String word : text.split("\\s+")) { - if (word.length() > 0) { - mainPanel.add(magnetFactory.createUsedMagnet(word, language)); - } - } - fireChange(); - } - } - - public void clear () { - mainPanel.clear(); - fireChange(); - } - - public void addMagnet (Magnet magnet) { - mainPanel.add(magnetFactory.createUsedMagnet(magnet)); - fireChange(); - } - - public void deleteLast() { - int c = mainPanel.getWidgetCount(); - if (c > 0) { - mainPanel.remove(c-1); - fireChange(); - } - } - - protected void fireChange() { - listeners.fireChange(this); - } - - public void addChangeListener(ChangeListener listener) { - if (listeners == null) { - listeners = new ChangeListenerCollection(); - } - listeners.add(listener); - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/GrammarsPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/GrammarsPanel.java deleted file mode 100644 index 0857c3c4e..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/GrammarsPanel.java +++ /dev/null @@ -1,201 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; -import com.google.gwt.user.client.*; -import com.google.gwt.user.client.ui.*; -import com.google.gwt.http.client.*; -import com.google.gwt.xml.client.*; -import com.google.gwt.event.logical.shared.*; -import com.google.gwt.event.dom.client.*; -import com.google.gwt.event.shared.*; - -public class GrammarsPanel extends Composite { - - private PGFWrapper pgf; - private ContentService contentService; - private StatusPopup statusPopup; - - private VerticalPanel grammarsPanel; - private FormPanel form = null; - - public GrammarsPanel(PGFWrapper pgf, ContentService contentService, StatusPopup statusPopup) { - this.pgf = pgf; - this.contentService = contentService; - this.statusPopup = statusPopup; - - VerticalPanel vpanel = new VerticalPanel(); - - Button btnNew = new Button("New Grammar"); - btnNew.addClickListener(new ClickListener() { - public void onClick(Widget sender) { - if (form == null) { - grammarsPanel.insert(new GrammarInfoPanel(null),0); - } - } - }); - vpanel.add(btnNew); - - grammarsPanel = new VerticalPanel(); - grammarsPanel.setWidth("100%"); - vpanel.add(grammarsPanel); - - initWidget(vpanel); - setStylePrimaryName("my-GrammarsPanel"); - - contentService.addSettingsListener(new MySettingsListener()); - } - - private class GrammarInfoPanel extends Composite { - public GrammarInfoPanel(final ContentService.GrammarInfo grammar) { - final VerticalPanel vpanel = new VerticalPanel(); - - if (grammar != null) { - FlexTable header = new FlexTable(); - header.setStylePrimaryName("my-TableHeader"); - header.setText(0,0,grammar.getName()); - vpanel.add(header); - - final Image updateButton = new Image("org.grammaticalframework.ui.gwt.EditorApp/grammar-buttons.png",0,0,20,20); - updateButton.setTitle("Edit the grammar definition."); - updateButton.setStylePrimaryName("toolbar-button"); - header.setWidget(0,1,updateButton); - header.getColumnFormatter().setWidth(1,"20px"); - - final Image deleteButton = new Image("org.grammaticalframework.ui.gwt.EditorApp/grammar-buttons.png",20,0,20,20); - deleteButton.setTitle("Delete this grammar."); - deleteButton.setStylePrimaryName("toolbar-button"); - header.setWidget(0,2,deleteButton); - header.getColumnFormatter().setWidth(2,"20px"); - - final Label descr = new Label(grammar.getDescription()); - descr.setStylePrimaryName("descr-label"); - vpanel.add(descr); - - updateButton.addClickListener(new ClickListener () { - public void onClick(Widget sender) { - if (form == null) { - vpanel.remove(descr); - vpanel.add(form = createUploadForm(grammar)); - } - } - }); - - deleteButton.addClickListener(new ClickListener () { - public void onClick(Widget sender) { - contentService.deleteGrammar(grammar.getURL(), new ContentService.DeleteCallback() { - public void onResult(ContentService.DeleteResult result) { - contentService.updateAvailableGrammars(); - } - - public void onError(Throwable e) { - statusPopup.showError("Delete failed", e); - } - }); - } - }); - } else { - FlexTable header = new FlexTable(); - header.setStylePrimaryName("my-TableHeader"); - header.setText(0,0,"Add New Grammar"); - vpanel.add(header); - vpanel.add(form = createUploadForm(grammar)); - } - - initWidget(vpanel); - setStylePrimaryName("my-GrammarInfoPanel"); - } - - public FormPanel createUploadForm(final ContentService.GrammarInfo grammar) { - UploadFormHandler uploadFormHandler = new UploadFormHandler(); - - final FormPanel form = new FormPanel(); - form.setWidth("100%"); - form.setEncoding(FormPanel.ENCODING_MULTIPART); - form.setMethod(FormPanel.METHOD_POST); - form.setAction(ContentService.getInit().getContentURL()); - form.addSubmitHandler(uploadFormHandler); - form.addSubmitCompleteHandler(uploadFormHandler); - - VerticalPanel vPanel = new VerticalPanel(); - vPanel.setWidth("100%"); - form.add(vPanel); - - vPanel.add(new HTML("\n"+ - "")); - - HorizontalPanel hPanel = new HorizontalPanel(); - hPanel.setSpacing(8); - hPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); - vPanel.add(hPanel); - - final FileUpload fileUpload = new FileUpload(); - fileUpload.setName("file"); - hPanel.add(fileUpload); - - hPanel.add(new HTML(" ")); - - hPanel.add(new Label("Name:")); - final TextBox grammarName = new TextBox(); - grammarName.setName("name"); - grammarName.setWidth("300px"); - hPanel.add(grammarName); - - hPanel.add(new HTML(" ")); - - hPanel.add(new Button("Upload", new ClickListener() { - public void onClick(Widget sender) { - if (grammar == null && - fileUpload.getFilename().equals("")) - statusPopup.showError("You must select a file to upload", null); - else - form.submit(); - } - })); - hPanel.add(new Button("Cancel", new ClickListener() { - public void onClick(Widget sender) { - contentService.updateAvailableGrammars(); - } - })); - - vPanel.add(new Label("Description:")); - TextArea grammarDescr = new TextArea(); - grammarDescr.setName("description"); - grammarDescr.setWidth("100%"); - grammarDescr.setHeight("50px"); - vPanel.add(grammarDescr); - - if (grammar != null) { - grammarName.setText(grammar.getName()); - grammarDescr.setText(grammar.getDescription()); - - vPanel.add(new HTML("")); - } - - return form; - } - - private class UploadFormHandler implements FormPanel.SubmitHandler, FormPanel.SubmitCompleteHandler { - public void onSubmit(FormPanel.SubmitEvent event) { - } - - public void onSubmitComplete(FormPanel.SubmitCompleteEvent event) { - contentService.updateAvailableGrammars(); - } - } - } - - private class MySettingsListener implements SettingsListener { - public void onAvailableGrammarsChanged() { - form = null; - grammarsPanel.clear(); - for (ContentService.GrammarInfo grammar : contentService.getGrammars()) { - grammarsPanel.add(new GrammarInfoPanel(grammar)); - } - } - public void onSelectedGrammarChanged() { } - public void onInputLanguageChanged() { } - public void onOutputLanguageChanged() { } - public void onStartCategoryChanged() { } - public void onSettingsError(String msg, Throwable e) { } - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/IterableJsArray.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/IterableJsArray.java deleted file mode 100644 index b1d501ddb..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/IterableJsArray.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.Iterator; -import java.util.NoSuchElementException; - -import com.google.gwt.core.client.JavaScriptObject; -import com.google.gwt.core.client.JsArray; - -public class IterableJsArray extends JsArray { - - protected IterableJsArray() {} - - public final boolean isEmpty() { - return length() == 0; - } - - public final Iterable iterable() { - return new Iterable() { - public Iterator iterator() { - return new Iterator() { - private int i = 0; - public boolean hasNext() { - return i < length(); - } - public T next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - return get(i++); - } - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - }; - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONCallback.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONCallback.java deleted file mode 100644 index 485173b49..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONCallback.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import com.google.gwt.core.client.JavaScriptObject; - -public interface JSONCallback { - public void onResult (T result) ; - public void onError (Throwable e) ; -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONRequest.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONRequest.java deleted file mode 100644 index 15da7caf0..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import com.google.gwt.http.client.*; - -public class JSONRequest { - - private Request httpRequest; - - JSONRequest (Request httpRequest) { - this.httpRequest = httpRequest; - } - - public void cancel() { - if (httpRequest != null) { - httpRequest.cancel(); - } - } - -} \ No newline at end of file diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONRequestBuilder.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONRequestBuilder.java deleted file mode 100644 index e2e83dc6f..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/JSONRequestBuilder.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import com.google.gwt.core.client.JavaScriptObject; -import com.google.gwt.http.client.Request; -import com.google.gwt.http.client.RequestBuilder; -import com.google.gwt.http.client.RequestCallback; -import com.google.gwt.http.client.RequestException; -import com.google.gwt.http.client.Response; -import com.google.gwt.http.client.URL; - -import java.util.List; - -public class JSONRequestBuilder { - - public static class Arg { - public final String name; - public final String value; - public Arg (String name, String value) { - this.name = name; - this.value = value; - } - public Arg (String name, int value) { - this(name, Integer.toString(value)); - } - } - - public static JSONRequest sendRequest (String base, List vars, final JSONCallback callback) { - String url = getQueryURL(base,vars); - RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url); - builder.setTimeoutMillis(30000); - builder.setHeader("Accept","text/plain, text/html;q=0.5, */*;q=0.1"); - Request request = null; - - try { - request = builder.sendRequest(null, new RequestCallback() { - public void onError(Request request, Throwable e) { - callback.onError(e); - } - - public void onResponseReceived(Request request, Response response) { - if (200 == response.getStatusCode()) { - callback.onResult(JSONRequestBuilder.eval(response.getText())); - } else { - RequestException e = new RequestException("Response not OK: " + response.getStatusCode() + ". " + response.getText()); - callback.onError(e); - } - } - }); - } catch (RequestException e) { - callback.onError(e); - } - - return new JSONRequest(request); - } - - public static JSONRequest sendDataRequest (String base, List vars, String content, final JSONCallback callback) { - String url = getQueryURL(base,vars); - RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, url); - builder.setTimeoutMillis(30000); - builder.setHeader("Content-Length", Integer.toString(content.length())); - builder.setHeader("Accept","text/plain, text/html;q=0.5, */*;q=0.1"); - Request request = null; - - try { - request = builder.sendRequest(content, new RequestCallback() { - public void onError(Request request, Throwable e) { - callback.onError(e); - } - - public void onResponseReceived(Request request, Response response) { - if (200 == response.getStatusCode()) { - callback.onResult(JSONRequestBuilder.eval(response.getText())); - } else { - RequestException e = new RequestException("Response not OK: " + response.getStatusCode() + ". " + response.getText()); - callback.onError(e); - } - } - }); - } catch (RequestException e) { - callback.onError(e); - } - - return new JSONRequest(request); - } - - private static native T eval(String json) /*-{ - return eval('(' + json + ')'); - }-*/; - - public static String getQueryURL(String base, List args) { - StringBuffer sb = new StringBuffer(); - sb.append(base); - sb.append("?"); - if (args != null) { - for (Arg arg : args) { - if (arg.value != null) { - if (sb.length() > 0) { - sb.append("&"); - } - sb.append(URL.encodeComponent(arg.name)); - sb.append("="); - sb.append(URL.encodeComponent(arg.value)); - } - } - } - return sb.toString(); - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/LinearizationsPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/LinearizationsPanel.java deleted file mode 100644 index 04aa5d5d7..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/LinearizationsPanel.java +++ /dev/null @@ -1,150 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; - -import com.google.gwt.core.client.*; -import com.google.gwt.user.client.*; -import com.google.gwt.user.client.ui.*; -import com.google.gwt.event.dom.client.*; -import com.google.gwt.event.logical.shared.*; -import com.google.gwt.event.shared.*; - -public class LinearizationsPanel extends Composite { - - protected PGFWrapper pgf; - - public LinearizationsPanel(PGFWrapper pgf, PGF.Linearizations lins) { - this.pgf = pgf; - - HorizontalPanel hPanel = new HorizontalPanel(); - VerticalPanel linsPanel = new VerticalPanel(); - linsPanel.addStyleName("my-translation-bar"); - hPanel.add(linsPanel); - HorizontalPanel btnPanel = new HorizontalPanel(); - btnPanel.addStyleName("my-translation-btns"); - btnPanel.setSpacing(4); - btnPanel.add(createAbsTreeButton(lins.getTree())); - btnPanel.add(createAlignButton(lins.getTree())); - hPanel.add(btnPanel); - hPanel.setCellHorizontalAlignment(btnPanel,HasHorizontalAlignment.ALIGN_RIGHT); - - for (PGF.Linearization l : lins.getLinearizations().iterable()) { - linsPanel.add(createTranslation(l.getTo(), lins.getTree(), l.getText())); - } - - initWidget(hPanel); - setStylePrimaryName("my-translation-frame"); - } - - protected Widget createAbsTreeButton(final String abstractTree) { - Image treeBtn = new Image("org.grammaticalframework.ui.gwt.EditorApp/tree-btn.png"); - treeBtn.setTitle("Displays the abstract syntax tree."); - treeBtn.addClickListener( - new ClickListener() { - public void onClick(Widget sender) { - // Create a dialog box and set the caption text - final DialogBox dialogBox = new DialogBox(); - dialogBox.setText("Abstract Syntax Tree"); - - // Create a table to layout the content - HorizontalPanel dialogContents = new HorizontalPanel(); - dialogContents.setSpacing(4); - dialogBox.setWidget(dialogContents); - - // Add an image to the dialog - - Frame image = new Frame(pgf.graphvizAbstractTree(abstractTree)); - image.addStyleName("my-treeimage"); - dialogContents.add(image); - - // Add a close button at the bottom of the dialog - Button closeButton = new Button("Close", - new ClickListener() { - public void onClick(Widget sender) { - dialogBox.hide(); - } - }); - dialogContents.add(closeButton); - - dialogBox.center(); - dialogBox.show(); - } - }); - return treeBtn; - } - - protected Widget createAlignButton(final String abstractTree) { - Image alignBtn = new Image("org.grammaticalframework.ui.gwt.EditorApp/align-btn.png"); - alignBtn.setTitle("Displays word-alignment diagram."); - alignBtn.addClickListener( - new ClickListener() { - public void onClick(Widget sender) { - // Create a dialog box and set the caption text - final DialogBox dialogBox = new DialogBox(); - dialogBox.setText("Word Alignment"); - - // Create a table to layout the content - HorizontalPanel dialogContents = new HorizontalPanel(); - dialogContents.setSpacing(4); - dialogBox.setWidget(dialogContents); - - // Add an image to the dialog - Frame image = new Frame(pgf.graphvizAlignment(abstractTree)); - image.addStyleName("my-alignmentimage"); - dialogContents.add(image); - - // Add a close button at the bottom of the dialog - Button closeButton = new Button("Close", - new ClickListener() { - public void onClick(Widget sender) { - dialogBox.hide(); - } - }); - dialogContents.add(closeButton); - - dialogBox.center(); - dialogBox.show(); - } - }); - return alignBtn; - } - - protected Widget createTranslation(final String language, final String abstractTree, String text) { - Label l = new Label(text); - l.addStyleName("my-translation"); - String lang = pgf.getLanguageCode(language); - if (lang != null) { - l.getElement().setLang(lang); - } - l.addClickListener(new ClickListener() { - public void onClick(Widget sender) { - // Create a dialog box and set the caption text - final DialogBox dialogBox = new DialogBox(); - dialogBox.setText("Parse Tree"); - - // Create a table to layout the content - HorizontalPanel dialogContents = new HorizontalPanel(); - dialogContents.setSpacing(4); - dialogBox.setWidget(dialogContents); - - // Add an image to the dialog - Frame image = new Frame(pgf.graphvizParseTree(abstractTree, language)); - image.addStyleName("my-treeimage"); - dialogContents.add(image); - - // Add a close button at the bottom of the dialog - Button closeButton = new Button("Close", - new ClickListener() { - public void onClick(Widget sender) { - dialogBox.hide(); - } - }); - dialogContents.add(closeButton); - - dialogBox.center(); - dialogBox.show(); - } - }); - return l; - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/Magnet.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/Magnet.java deleted file mode 100644 index ded8a171a..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/Magnet.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import com.google.gwt.user.client.ui.HTML; - -public class Magnet extends HTML { - - private String language; - - public Magnet (String text, String language) { - this.language = language; - setHTML(text); - setStylePrimaryName("my-Magnet"); - } - - public String getLanguage() { - return language; - } - - public String getWord() { - return getHTML(); - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MagnetFactory.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MagnetFactory.java deleted file mode 100644 index 5bb780456..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MagnetFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import com.google.gwt.user.client.ui.*; - -public class MagnetFactory { - - private ClickListener clickListener; - - public MagnetFactory (ClickListener clickListener) { - this.clickListener = clickListener; - } - - public Magnet createUsedMagnet(Magnet magnet) { - return createUsedMagnet(magnet.getText(), magnet.getLanguage()); - } - - public Magnet createUsedMagnet(String text, String language) { - return new Magnet(text, language); - } - - public Magnet createMagnet(Magnet magnet) { - return createMagnet(magnet.getText(), magnet.getLanguage()); - } - - public Magnet createMagnet(String text, String language) { - Magnet magnet = new Magnet(text, language); - magnet.addClickListener(clickListener); - return magnet; - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MagnetSearchBox.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MagnetSearchBox.java deleted file mode 100644 index 5a2a70401..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MagnetSearchBox.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; - -import com.google.gwt.core.client.*; -import com.google.gwt.user.client.*; -import com.google.gwt.user.client.ui.*; -import com.google.gwt.event.dom.client.*; -import com.google.gwt.event.logical.shared.*; -import com.google.gwt.event.shared.*; -import com.google.gwt.dom.client.Node; -import com.google.gwt.dom.client.Text; -import com.google.gwt.dom.client.Element; -import com.google.gwt.dom.client.Document; -import org.grammaticalframework.ui.gwt.client.selection.*; - -public class MagnetSearchBox extends FocusWidget { - public MagnetSearchBox() { - this(Document.get().createDivElement()); - } - - public MagnetSearchBox(Element elem) { - super(elem); - elem.setAttribute("contentEditable", "true"); - setStyleName("searchbox"); - } - - public String getText() { - return getElement().getInnerText(); - } - - public void setText(String s) { - getElement().setInnerText(s); - } - - public int getCursorPos() { - return 0; - } - - public void setCursorPos(int pos) { - Node child = getElement().getFirstChild(); - if (child instanceof Text) { - SelectionEndPoint selPoint = new SelectionEndPoint((Text) child,pos); - Selection sel = Selection.getSelection(); - sel.select(selPoint,selPoint); - } - return; - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MorphoApp.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MorphoApp.java deleted file mode 100644 index 44e7bacb6..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MorphoApp.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; - -import com.google.gwt.core.client.*; -import com.google.gwt.user.client.ui.*; -import com.google.gwt.core.client.JavaScriptObject; - -public class MorphoApp implements EntryPoint { - private TextBox lemmaBox = new TextBox(); - private Button submitButton = new Button("Submit"); - private Grid outputGrid = new Grid(2,0); - - public void onModuleLoad() { - HorizontalPanel inputPanel = new HorizontalPanel(); - inputPanel.add(lemmaBox); - inputPanel.add(submitButton); - - submitButton.addClickListener(new ClickListener() { - public void onClick(Widget sender) { - - String url = "http://localhost:41296/morpho/morpho.fcgi/eval"; - List args = new ArrayList(); - args.add(new JSONRequestBuilder.Arg("term", lemmaBox.getText())); - - JSONRequestBuilder.sendRequest(url, args, new TableCallback() { - public void onResult (IterableJsArray table) - { - outputGrid.resize(table.length(),2); - int row = 0; - for (InflectionForm form : table.iterable()) { - outputGrid.setText(row,0,form.getName()); - outputGrid.setText(row,1,form.getValue()); - row++; - } - } - - public void onError (Throwable e) - { - outputGrid.resize(1,1); - outputGrid.setText(0,0,e.toString()); - } - }); - } - }); - - - VerticalPanel mainPanel = new VerticalPanel(); - mainPanel.add(inputPanel); - mainPanel.add(outputGrid); - RootPanel.get().add(mainPanel); - } - - public interface TableCallback extends JSONCallback> { } - - public static class InflectionForm extends JavaScriptObject { - protected InflectionForm() { } - - public final native String getName() /*-{ return this.name; }-*/; - - public final native String getValue() /*-{ return this.value; }-*/; - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MyListBox.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MyListBox.java deleted file mode 100644 index ce716b91d..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/MyListBox.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.Collection; - -import com.google.gwt.user.client.ui.ListBox; - -public class MyListBox extends ListBox { - - public MyListBox () { } - - public void clearSelection () { - setSelectedIndex(-1); - } - - public String getSelectedValue() { - int i = getSelectedIndex(); - return i == -1 ? null : getValue(i); - } - - public void setSelectedValue(String value) { - if (value == null) { - clearSelection(); - } else { - int c = getItemCount(); - for (int i = 0; i < c; i++) { - if (getValue(i).equals(value)) { - setSelectedIndex(i); - return; - } - } - } - } - - public void addItems(Collection items) { - for (String item : items) { - addItem(item); - } - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGF.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGF.java deleted file mode 100644 index 17eef12bb..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGF.java +++ /dev/null @@ -1,241 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import org.grammaticalframework.ui.gwt.client.JSONRequestBuilder.Arg; - -import java.util.*; -import com.google.gwt.core.client.*; -import com.google.gwt.http.client.*; - -public class PGF { - - public PGF () { - } - - /* Grammar */ - - public JSONRequest grammar (String pgfURL, final GrammarCallback callback) { - return sendGrammarRequest(pgfURL, "grammar", new ArrayList(), callback); - } - - public interface GrammarCallback extends JSONCallback { } - - public static class Grammar extends JavaScriptObject { - protected Grammar() { } - - public final native String getName() /*-{ return this.name; }-*/; - - public final native String getUserLanguage() /*-{ return this.userLanguage; }-*/; - - public final native IterableJsArray getLanguages() /*-{ return this.languages; }-*/; - - public final native JsArrayString getCategories() /*-{ return this.categories; }-*/; - - public final native JsArrayString getFunctions() /*-{ return this.functions; }-*/; - } - - public static class Language extends JavaScriptObject { - protected Language() { } - - public final native String getName() /*-{ return this.name; }-*/; - public final native String getLanguageCode() /*-{ return this.languageCode; }-*/; - } - - /* Translation */ - - public JSONRequest translate (String pgfURL, String input, String fromLang, String cat, String toLang, - final TranslateCallback callback) { - List args = new ArrayList(); - args.add(new Arg("input", input)); - args.add(new Arg("from", fromLang)); - args.add(new Arg("cat", cat)); - args.add(new Arg("to", toLang)); - return sendGrammarRequest(pgfURL, "translate", args, callback); - } - - public interface TranslateCallback extends JSONCallback> { } - - public static class TranslationResult extends JavaScriptObject { - protected TranslationResult() { } - - public final native String getFrom() /*-{ return this.from; }-*/; - public final native BracketedString getBracketedString() /*-{ return this.brackets; }-*/; - public final native IterableJsArray getTranslations() /*-{ return this.translations; }-*/; - public final native TcError[] getTypeErrors() /*-{ return this.typeErrors; }-*/; - } - - public static class Linearizations extends JavaScriptObject { - protected Linearizations() { } - - public final native String getTree() /*-{ return this.tree; }-*/; - public final native IterableJsArray getLinearizations() /*-{ return this.linearizations; }-*/; - } - - /* Completion */ - - /** - * Get suggestions for completing the input. - * @param limit The number of suggestions to get. - * If -1 is passed, all available suggestions are retrieved. - */ - public JSONRequest complete (String pgfURL, String input, String fromLang, String cat, int limit, final CompleteCallback callback) { - List args = new ArrayList(); - args.add(new Arg("input", input)); - args.add(new Arg("from", fromLang)); - args.add(new Arg("cat", cat)); - if (limit > 0) { - args.add(new Arg("limit", limit)); - } - return sendGrammarRequest(pgfURL, "complete", args, callback); - } - - public interface CompleteCallback extends JSONCallback> { } - - public static class Completion extends JavaScriptObject { - protected Completion() { } - - public final native String getFrom() /*-{ return this.from; }-*/; - public final native BracketedString getBracketedString() /*-{ return this.brackets; }-*/; - public final native String[] getCompletions() /*-{ return this.completions; }-*/; - public final native String getText() /*-{ return this.text; }-*/; - } - - /* Parsing */ - - public JSONRequest parse (String pgfURL, String input, String fromLang, String cat, final ParseCallback callback) { - List args = new ArrayList(); - args.add(new Arg("input", input)); - args.add(new Arg("from", fromLang)); - args.add(new Arg("cat", cat)); - return sendGrammarRequest(pgfURL, "parse", args, callback); - } - - public interface ParseCallback extends JSONCallback> { } - - public static class ParseResult extends JavaScriptObject { - protected ParseResult() { } - - public final native String getFrom() /*-{ return this.from; }-*/; - public final native BracketedString getBracketedString() /*-{ return this.brackets; }-*/; - public final native String[] getTrees() /*-{ return this.trees; }-*/; - public final native TcError[] getTypeErrors() /*-{ return this.typeErrors; }-*/; - } - - public static class BracketedString extends JavaScriptObject { - protected BracketedString() { } - - public final native String getToken() /*-{ return this.token; }-*/; - - public final native String getCat() /*-{ return this.cat; }-*/; - public final native int getFId() /*-{ return this.fid; }-*/; - public final native int getIndex() /*-{ return this.index; }-*/; - public final native BracketedString[] getChildren() /*-{ return this.children; }-*/; - - public final String render() { - if (getToken() != null) - return getToken(); - else { - StringBuilder sbuilder = new StringBuilder(); - for (BracketedString bs : getChildren()) { - if (sbuilder.length() > 0) - sbuilder.append(' '); - sbuilder.append(bs.render()); - } - return sbuilder.toString(); - } - } - } - - public static class TcError extends JavaScriptObject { - protected TcError() { } - - public final native int getFId() /*-{ return this.fid; }-*/; - public final native String getMsg() /*-{ return this.msg; }-*/; - } - - - /* Linearization */ - - public JSONRequest linearize (String pgfURL, String tree, String toLang, final LinearizeCallback callback) { - List args = new ArrayList(); - args.add(new Arg("tree", tree)); - args.add(new Arg("to", toLang)); - return sendGrammarRequest(pgfURL, "linearize", args, callback); - } - - public interface LinearizeCallback extends JSONCallback> { } - - public static class Linearization extends JavaScriptObject { - protected Linearization() { } - - public final native String getTo() /*-{ return this.to; }-*/; - public final native String getText() /*-{ return this.text; }-*/; - } - - public String graphvizAbstractTree(String pgfURL, String abstractTree) { - List args = new ArrayList(); - args.add(new Arg("command", "abstrtree")); - args.add(new Arg("tree", abstractTree)); - return JSONRequestBuilder.getQueryURL(pgfURL,args); - } - - public String graphvizParseTree(String pgfURL, String abstractTree, String lang) { - List args = new ArrayList(); - args.add(new Arg("command", "parsetree")); - args.add(new Arg("tree", abstractTree)); - args.add(new Arg("from", lang)); - return JSONRequestBuilder.getQueryURL(pgfURL,args); - } - - public String graphvizAlignment(String pgfURL, String abstractTree) { - List args = new ArrayList(); - args.add(new Arg("command", "alignment")); - args.add(new Arg("tree", abstractTree)); - return JSONRequestBuilder.getQueryURL(pgfURL,args); - } - - public Request browse(String pgfURL, String id, String href, String cssClass, RequestCallback callback) { - List args = new ArrayList(); - args.add(new Arg("command", "browse")); - args.add(new Arg("id", id)); - args.add(new Arg("href", href)); - args.add(new Arg("css-class", cssClass)); - - Request request = null; - try { - RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, - JSONRequestBuilder.getQueryURL(pgfURL,args)); - builder.setCallback(callback); - request = builder.send(); - } catch (RequestException ex) { - callback.onError(request, ex); - } - - return request; - } - - public JSONRequest generateAll(String pgfURL, String cat, int depth, int limit, String toLang, GenerationCallback callback) { - List args = new ArrayList(); - args.add(new Arg("cat", cat)); - args.add(new Arg("depth", depth)); - args.add(new Arg("limit", limit)); - args.add(new Arg("to", toLang)); - return sendGrammarRequest(pgfURL, "generate", args, callback); - } - - public JSONRequest generateRandom(String pgfURL, String cat, int depth, int limit, String toLang, GenerationCallback callback) { - List args = new ArrayList(); - args.add(new Arg("cat", cat)); - args.add(new Arg("depth", depth)); - args.add(new Arg("limit", limit)); - args.add(new Arg("to", toLang)); - return sendGrammarRequest(pgfURL, "random", args, callback); - } - - public interface GenerationCallback extends JSONCallback> {} - - public JSONRequest sendGrammarRequest(String pgfURL, String resource, List args, final JSONCallback callback) { - args.add(new Arg("command", resource)); - return JSONRequestBuilder.sendRequest(pgfURL, args, callback); - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java deleted file mode 100644 index 1e248fa40..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java +++ /dev/null @@ -1,294 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import com.google.gwt.http.client.*; -import com.google.gwt.xml.client.*; -import com.google.gwt.core.client.*; - -public class PGFWrapper { - - private String grammarURL = null; - - private PGF pgf; - - private String inputLanguage = null; - - private String outputLanguage = null; - - private String cat = null; - - // Cached info about the available grammars - - private List grammars; - - // Cached info about the currently selected grammar - - private String userLanguage; - - private LinkedHashMap languages; - - private JsArrayString categories; - private JsArrayString functions; - - // Event listeners - - private List listeners = new LinkedList(); - - - public PGFWrapper() { - this.pgf = new PGF(); - } - - public void updateAvailableGrammars() { - String url = "/grammars.xml"; - RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url)); - try - { - builder.sendRequest(null, new RequestCallback() { - public void onResponseReceived(Request request, Response response) - { - if (200 == response.getStatusCode()) - { - grammars = new ArrayList(); - try - { - Document grammarsDoc = XMLParser.parse(response.getText()); - - NodeList grammarsList = grammarsDoc.getElementsByTagName("grammar"); - for (int i = 0; i < grammarsList.getLength(); i++) - { - Node grammarNode = grammarsList.item(i); - grammars.add(((Element)grammarNode).getAttribute("name")); - } - } - catch (DOMException e) - { - fireSettingsError("Could not parse XML document.", e); - } - fireAvailableGrammarsChanged(); - } - else - { - fireSettingsError("Error getting grammar list", null); - } - } - - public void onError(Request request, Throwable e) - { - fireSettingsError("Error getting grammar list", e); - } - }); - } - catch (RequestException e) - { - fireSettingsError("Couldn't connect to server", e); - } - } - - protected void updateSelectedGrammar () { - if (grammarURL == null) - return; - - clearCachedInfo(); - pgf.grammar(grammarURL, new PGF.GrammarCallback() { - public void onResult(PGF.Grammar grammar) { - userLanguage = grammar.getUserLanguage(); - languages = new LinkedHashMap(); - for (PGF.Language l : grammar.getLanguages().iterable()) { - String name = l.getName(); - languages.put(name, l); - } - - categories = grammar.getCategories(); - functions = grammar.getFunctions(); - - fireSelectedGrammarChanged(); - } - - public void onError (Throwable e) { - fireSettingsError("Error getting language information", e); - } - }); - } - - // - // PGF functionality - // - - public JSONRequest translate (String input, final PGF.TranslateCallback callback) { - return pgf.translate(grammarURL, input, inputLanguage, cat, outputLanguage, callback); - } - - public JSONRequest complete (String input, int limit, final PGF.CompleteCallback callback) { - return pgf.complete(grammarURL, input, inputLanguage, cat, limit, callback); - } - - public JSONRequest parse (String input, final PGF.ParseCallback callback) { - return pgf.parse(grammarURL, input, inputLanguage, cat, callback); - } - - public JSONRequest linearize (String tree, final PGF.LinearizeCallback callback) { - return pgf.linearize(grammarURL, tree, outputLanguage, callback); - } - - public String graphvizAbstractTree(String abstractTree) { - return pgf.graphvizAbstractTree(grammarURL,abstractTree); - } - - public String graphvizParseTree(String abstractTree, String lang) { - return pgf.graphvizParseTree(grammarURL,abstractTree,lang); - } - - public String graphvizAlignment(String abstractTree) { - return pgf.graphvizAlignment(grammarURL,abstractTree); - } - - public Request browse(String id, String href, String cssClass, RequestCallback callback) { - return pgf.browse(grammarURL, id, href, cssClass, callback); - } - - public JSONRequest generateAll(String cat, int depth, int limit, PGF.GenerationCallback callback) { - return pgf.generateAll(grammarURL, cat, depth, limit, outputLanguage, callback); - } - - public JSONRequest generateRandom(String cat, int depth, int limit, PGF.GenerationCallback callback) { - return pgf.generateRandom(grammarURL, cat, depth, limit, outputLanguage, callback); - } - - // - // Settings - // - - public String getGrammarURL() { - return grammarURL; - } - - public void setGrammarURL(String grammarURL) { - this.grammarURL = grammarURL; - this.inputLanguage = null; - this.outputLanguage = null; - this.cat = null; - updateSelectedGrammar(); - } - - public String getInputLanguage() { - return inputLanguage; - } - - public void setInputLanguage(String inputLanguage) { - this.inputLanguage = inputLanguage; - fireInputLanguageChanged(); - } - - public String getOutputLanguage() { - return outputLanguage; - } - - public void setOutputLanguage(String outputLanguage) { - this.outputLanguage = outputLanguage; - fireOutputLanguageChanged(); - } - - public String getStartCategory() { - return cat; - } - - public void setStartCategory(String cat) { - this.cat = cat; - fireStartCategoryChanged(); - } - - public JsArrayString getCategories() { - return categories; - } - - public JsArrayString getFunctions() { - return functions; - } - - - // - // Information about the available grammars - // - public List getGrammars() { - return grammars; - } - - // - // Information about the selected grammar - // - private void clearCachedInfo () { - languages = null; - } - - public String getUserLanguage () { - return userLanguage; - } - - public String getLanguageCode (String language) { - PGF.Language l = languages.get(language); - return l == null ? null : l.getLanguageCode(); - } - - public Collection getAllLanguages() { - return languages.keySet(); - } - - // - // Listeners - // - - public static class SettingsAdapter implements SettingsListener { - public void onAvailableGrammarsChanged() {} - public void onSelectedGrammarChanged() {} - public void onInputLanguageChanged() {} - public void onOutputLanguageChanged() {} - public void onStartCategoryChanged() {} - public void onSettingsError(String msg, Throwable e) {} - } - - public void addSettingsListener(SettingsListener listener) { - listeners.add(listener); - } - - protected void fireAvailableGrammarsChanged() { - for (SettingsListener listener : listeners) { - listener.onAvailableGrammarsChanged(); - } - } - - protected void fireSelectedGrammarChanged() { - for (SettingsListener listener : listeners) { - listener.onSelectedGrammarChanged(); - } - } - - protected void fireInputLanguageChanged() { - for (SettingsListener listener : listeners) { - listener.onInputLanguageChanged(); - } - } - - protected void fireOutputLanguageChanged() { - for (SettingsListener listener : listeners) { - listener.onOutputLanguageChanged(); - } - } - - protected void fireStartCategoryChanged() { - for (SettingsListener listener : listeners) { - listener.onStartCategoryChanged(); - } - } - - protected void fireSettingsError(String msg, Throwable e) { - for (SettingsListener listener : listeners) { - listener.onSettingsError(msg, e); - } - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/QueryPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/QueryPanel.java deleted file mode 100644 index b364ed0b6..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/QueryPanel.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; - -import com.google.gwt.http.client.*; -import com.google.gwt.user.client.ui.*; - -public class QueryPanel extends Composite { - - private PGFWrapper pgf; - private StatusPopup statusPopup; - private TextArea queryBox; - private VerticalPanel outputPanel; - private JSONRequest executeRequest = null; - - public QueryPanel(PGFWrapper pgf, StatusPopup statusPopup) { - this.pgf = pgf; - this.statusPopup = statusPopup; - - VerticalPanel vPanel = new VerticalPanel(); - vPanel.add(createQueryPanel()); - - initWidget(vPanel); - setStylePrimaryName("my-QueryPanel"); - - pgf.addSettingsListener(new MySettingsListener()); - } - - protected Widget createQueryPanel() { - queryBox = new TextArea(); - queryBox.setStylePrimaryName("my-QueryBox"); - queryBox.setTitle("Goal category"); - - HorizontalPanel boxPanel = new HorizontalPanel(); - boxPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); - boxPanel.setSpacing(5); - - final TextBox limitBox = new TextBox(); - limitBox.setTitle("Upper limit of the number of examples generated"); - limitBox.setWidth("5em"); - limitBox.setText("10"); - boxPanel.add(new Label("limit:")); - boxPanel.add(limitBox); - - boxPanel.add(new HTML("")); - - final TextBox depthBox = new TextBox(); - depthBox.setTitle("Maximal depth for every example"); - depthBox.setWidth("5em"); - depthBox.setText("4"); - boxPanel.add(new Label("depth:")); - boxPanel.add(depthBox); - - boxPanel.add(new HTML("")); - - final CheckBox randomBox = new CheckBox(); - randomBox.setTitle("random/exhaustive generation"); - randomBox.setText("random"); - boxPanel.add(randomBox); - - outputPanel = new VerticalPanel(); - outputPanel.addStyleName("my-translations"); - outputPanel.addStyleDependentName("working"); - - Button execButton = new Button("Execute"); - - DecoratorPanel queryDecorator = new DecoratorPanel(); - VerticalPanel vPanel = new VerticalPanel(); - vPanel.add(new Label("Query")); - HorizontalPanel hPanel = new HorizontalPanel(); - hPanel.add(queryBox); - hPanel.add(execButton); - vPanel.add(hPanel); - vPanel.add(boxPanel); - queryDecorator.add(vPanel); - - VerticalPanel queryPanel = new VerticalPanel(); - queryPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); - queryPanel.add(queryDecorator); - queryPanel.add(outputPanel); - - execButton.addClickListener(new ClickListener() { - public void onClick(Widget sender) { - if (executeRequest != null) { - executeRequest.cancel(); - } - - PGF.GenerationCallback callback = new PGF.GenerationCallback() { - public void onResult(IterableJsArray result) { - executeRequest = null; - - outputPanel.clear(); - outputPanel.removeStyleDependentName("working"); - - for (PGF.Linearizations lins : result.iterable()) { - LinearizationsPanel lin = new LinearizationsPanel(pgf, lins); - lin.setWidth("100%"); - outputPanel.add(lin); - } - } - - public void onError(Throwable e) { - executeRequest = null; - statusPopup.showError("The execution failed", e); - } - }; - - int depth, limit; - try { - depth = Integer.parseInt(depthBox.getText()); - limit = Integer.parseInt(limitBox.getText()); - } catch (NumberFormatException e) { - statusPopup.showError("Invalid depth/limit parameter", e); - return; - } - - if (randomBox.getValue()) - executeRequest = pgf.generateRandom(queryBox.getText(), depth, limit, callback); - else - executeRequest = pgf.generateAll(queryBox.getText(), depth, limit, callback); - } - }); - - return queryPanel; - } - - protected class MySettingsListener implements SettingsListener { - - public MySettingsListener() { - } - - public void onAvailableGrammarsChanged() { } - - public void onSelectedGrammarChanged() { - queryBox.setText(""); - outputPanel.clear(); - } - - public void onInputLanguageChanged() { } - public void onOutputLanguageChanged() { } - public void onStartCategoryChanged() { } - public void onSettingsError(String msg, Throwable e) { } - } -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsListener.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsListener.java deleted file mode 100644 index 494c990f6..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsListener.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -public interface SettingsListener { - public void onAvailableGrammarsChanged(); - public void onSelectedGrammarChanged(); - public void onInputLanguageChanged(); - public void onOutputLanguageChanged(); - public void onStartCategoryChanged(); - public void onSettingsError(String msg, Throwable e); -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java deleted file mode 100644 index b3c22572c..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java +++ /dev/null @@ -1,136 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import com.google.gwt.user.client.ui.*; - -public class SettingsPanel extends Composite { - - private PGFWrapper pgf; - private ContentService contentService; - private StatusPopup statusPopup; - - private MyListBox grammarBox; - private MyListBox fromLangBox; - private MyListBox toLangBox; - - public SettingsPanel (PGFWrapper pgf, ContentService contentService, StatusPopup statusPopup) { - this.pgf = pgf; - this.contentService = contentService; - this.statusPopup = statusPopup; - - HorizontalPanel settingsPanel = new HorizontalPanel(); - settingsPanel.setHorizontalAlignment(HorizontalPanel.ALIGN_CENTER); - settingsPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); - - grammarBox = new MyListBox(); - grammarBox.addChangeListener(new ChangeListener() { - public void onChange(Widget sender) { - SettingsPanel.this.pgf.setGrammarURL(grammarBox.getSelectedValue()); - } - }); - settingsPanel.add(new FormWidget("Grammar:", grammarBox)); - - fromLangBox = new MyListBox(); - fromLangBox.addChangeListener(new ChangeListener() { - public void onChange(Widget sender) { - SettingsPanel.this.pgf.setInputLanguage(fromLangBox.getSelectedValue()); - } - }); - settingsPanel.add(new FormWidget("From:", fromLangBox)); - - toLangBox = new MyListBox(); - toLangBox.addChangeListener(new ChangeListener() { - public void onChange(Widget sender) { - SettingsPanel.this.pgf.setOutputLanguage(toLangBox.getSelectedValue()); - } - }); - settingsPanel.add(new FormWidget("To:", toLangBox)); - - if (contentService.getInit().getUserEMail() != null) { - String url = contentService.getInit().getContentURL(); - settingsPanel.add(new FormWidget(contentService.getInit().getUserEMail(), - new HTML("Sign Out"))); - } else { - String url = contentService.getInit().getContentURL(); - url = "https://www.google.com/accounts/o8/ud" - + "?openid.ns=http://specs.openid.net/auth/2.0" - + "&openid.ns.max_auth_age=300" - + "&openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select" - + "&openid.identity=http://specs.openid.net/auth/2.0/identifier_select" - + "&openid.return_to=http://localhost:8080"+url - + "&openid.realm=http://localhost:8080/" - + "&openid.mode=checkid_setup" - + "&openid.ns.ax=http://openid.net/srv/ax/1.0" - + "&openid.ax.mode=fetch_request" - + "&openid.ax.type.email=http://axschema.org/contact/email" - + "&openid.ax.required=email"; - settingsPanel.add(new FormWidget("", - new HTML("Sign In"))); - } - - initWidget(settingsPanel); - setStylePrimaryName("my-SettingsPanel"); - - pgf.addSettingsListener(new MySettingsListener()); - contentService.addSettingsListener(new MySettingsListener()); - } - - private static class FormWidget extends HorizontalPanel { - public FormWidget(String label, Widget w) { - setStylePrimaryName("form-widget"); - setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); - add(new Label(label)); - add(w); - } - } - - private class MySettingsListener implements SettingsListener { - public void onAvailableGrammarsChanged() { - if (grammarBox != null) { - grammarBox.clear(); - fromLangBox.clear(); - toLangBox.clear(); - - for (ContentService.GrammarInfo grammar : contentService.getGrammars()) { - grammarBox.addItem(grammar.getName(), grammar.getURL()); - } - pgf.setGrammarURL(grammarBox.getSelectedValue()); - } - } - public void onSelectedGrammarChanged() { - if (grammarBox != null) { - grammarBox.setSelectedValue(pgf.getGrammarURL()); - } - if (fromLangBox != null) { - fromLangBox.clear(); - fromLangBox.addItem("Any language", ""); - fromLangBox.addItems(pgf.getAllLanguages()); - String inputLanguage = pgf.getInputLanguage(); - if (inputLanguage != null) { - fromLangBox.setSelectedValue(inputLanguage); - } - } - if (toLangBox != null) { - toLangBox.clear(); - toLangBox.addItem("All languages", ""); - toLangBox.addItems(pgf.getAllLanguages()); - String outputLanguage = pgf.getOutputLanguage(); - if (outputLanguage != null) { - fromLangBox.setSelectedValue(outputLanguage); - } - } - } - public void onInputLanguageChanged() { - if (fromLangBox != null) { - fromLangBox.setSelectedValue(pgf.getInputLanguage()); - } - } - public void onOutputLanguageChanged() { - if (toLangBox != null) { - toLangBox.setSelectedValue(pgf.getOutputLanguage()); - } - } - public void onStartCategoryChanged() { } - public void onSettingsError(String msg, Throwable e) { } - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/StatusPopup.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/StatusPopup.java deleted file mode 100644 index 73ff82e0d..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/StatusPopup.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.PopupPanel; - -public class StatusPopup extends PopupPanel { - - private Label label = new Label(); - - public StatusPopup () { - super(true, true); - label = new Label(); - add(label); - } - - public void setStatus(String msg) { - removeStyleDependentName("error"); - label.setText(msg); - center(); - } - - public void showError(String msg, Throwable e) { - GWT.log(msg, e); - addStyleDependentName("error"); - label.setText(msg); - center(); - } - - public void clearStatus() { - removeStyleDependentName("error"); - label.setText(""); - hide(); - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SubList.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SubList.java deleted file mode 100644 index 9d3221f39..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SubList.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.AbstractList; -import java.util.List; - -/** Work-around for missing List.subList() method in GWT JRE API emulation. */ -public class SubList extends AbstractList { - - private List list; - - private int fromIndex; - - private int toIndex; - - public SubList(List list, int fromIndex, int toIndex) { - this.list = list; - this.fromIndex = fromIndex; - this.toIndex = toIndex; - if (fromIndex < 0 || toIndex > list.size()) - throw new IndexOutOfBoundsException("Endpoint index value out of range"); - if (fromIndex > toIndex) - throw new IllegalArgumentException("Endpoint indices out of order"); - } - - public T get(int index) { - return list.get(fromIndex + index); - } - - public int size() { - return toIndex - fromIndex; - } - - public static SubList makeSubList(List list, int fromIndex, int toIndex) { - return new SubList(list, fromIndex, toIndex); - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SuggestPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SuggestPanel.java deleted file mode 100644 index 8e2edf582..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SuggestPanel.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.LinkedList; -import java.util.List; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.*; - -public class SuggestPanel extends Composite implements HasText { - - private SuggestBox suggest; - private Button submitButton; - - private List listeners = new LinkedList(); - - public SuggestPanel (PGFWrapper pgf) { - - CompletionOracle oracle = new CompletionOracle(pgf, new CompletionOracle.ErrorHandler() { - public void onError(Throwable e) { - GWT.log("Completion failed", e); - } - }); - - suggest = new SuggestBox(oracle); - suggest.setLimit(10); - suggest.addKeyboardListener(new KeyboardListenerAdapter() { - public void onKeyUp (Widget sender, char keyCode, int modifiers) { - if (keyCode == KEY_ENTER) { - submit(); - } - } - }); - - submitButton = new Button("Submit"); - submitButton.addClickListener(new ClickListener() { - public void onClick(Widget sender) { - submit(); - } - }); - - DockPanel mainPanel = new DockPanel(); - mainPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); - mainPanel.add(suggest, DockPanel.CENTER); - mainPanel.add(submitButton, DockPanel.EAST); - - initWidget(mainPanel); - setStylePrimaryName("my-SuggestPanel"); - - } - - public int getLimit() { - return suggest.getLimit(); - } - - public String getText() { - return suggest.getText(); - } - - public String getTitle() { - return suggest.getTitle(); - } - - public void onLoad() { - suggest.setFocus(true); - } - - public void setButtonText (String text) { - submitButton.setText(text); - } - - public void setEnabled(boolean enabled) { - submitButton.setEnabled(enabled); - } - - public void setLimit(int limit) { - suggest.setLimit(limit); - } - - public void setText (String text) { - suggest.setText(text); - } - - public void setTitle(String title) { - suggest.setTitle(title); - } - - public void addSubmitListener(SubmitListener listener) { - listeners.add(listener); - } - - public void submit() { - String text = getText(); - for (SubmitListener listener : listeners) { - listener.onSubmit(text); - } - } - - public interface SubmitListener { - public void onSubmit(String text); - } - -} diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TextInputPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TextInputPanel.java deleted file mode 100644 index bf2c04a03..000000000 --- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TextInputPanel.java +++ /dev/null @@ -1,600 +0,0 @@ -package org.grammaticalframework.ui.gwt.client; - -import java.util.*; - -import com.google.gwt.core.client.*; -import com.google.gwt.user.client.*; -import com.google.gwt.user.client.ui.*; -import com.google.gwt.event.dom.client.*; -import com.google.gwt.event.logical.shared.*; -import com.google.gwt.event.shared.*; - -public class TextInputPanel extends Composite implements Focusable, HasValueChangeHandlers, HasSelectionHandlers { - - protected ContentService contentService; - protected StatusPopup statusPopup; - protected FlowPanel textPanel = null; - protected FlowPanel mainPanel = null; - protected FocusPanel focusPanel = null; - protected Panel focusedPanel = null; - protected List selectedPanels = null; - protected List errorPanels = null; - protected Panel tempPanel = null; - protected Label status = null; - protected NavigationController navigationController; - protected MagnetSearchBox searchBox = null; - - private List