/* WC.fx - Word card corresponds to a page (entry) in Wiktionary. * * Copyright (c) 2009-2011 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com> * Distributed under EPL/LGPL/GPL/AL/BSD multi-license. */ package wiwordik.word_card; import wikokit.base.wikt.constant.Relation; import wikokit.base.wikt.constant.POS; import wikokit.base.wikt.sql.TLang; import wikokit.base.wikt.sql.TLangPOS; import wikokit.base.wikt.sql.TPage; import wikokit.base.wikt.api.WTRelation; import wikokit.base.wikt.api.WTMeaning; import java.awt.Dimension; import wikokit.base.wikipedia.sql.Connect; import wikokit.base.wikipedia.language.LanguageType; import java.lang.*; import javafx.scene.text.Text; import javafx.scene.text.Font; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.Scene; import javafx.stage.Stage; import javafx.geometry.Insets; import javafx.scene.layout.HBox; import wiwordik.WConstants; import javafx.scene.control.Hyperlink; import java.net.*; import java.util.LinkedList; import java.util.List; import javafx.application.Application; import javafx.collections.ObservableList; import javafx.embed.swing.JFXPanel; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.control.ScrollPane; import javafx.scene.text.FontWeight; import javax.swing.JFrame; /** One word card describes one word (page, entry in Wiktionary). * * Word's definition, semantic relations, quotations, translations. */ public class WC { /** Current TPage corresponds to selected word. */ public TPage tpage; /** Languages of the word. @see wikt.word.WLanguage */ //var cx_lang : WCLanguage[]; /** Todo: text of card should be available by Ctrl+C. */ String card_text_value; /*var page_title_Label: Label = Label { //x: 10 y: 30 font: Font { size: 16 } //content: "слово" text: "page_title" } */ /*var headerText: Text = Text { content: "headerText (page.is_in_wiktionary)" // bind definition_text_value // "line 1\n\nline2\n \nline3" font: Font { name: "sansserif" size: 14 oblique: true } fill: Color.YELLOWGREEN } var link_to_wikt: Hyperlink = Hyperlink{ //text: "http://{WCConstants.native_lang}.wiktionary.org/wiki/" //text: wiwordik.Main.native_lang.toString() font: Font { name: "sansserif" size: 12 oblique: true } action: function():Void{ try { // java.awt.Desktop.getDesktop().browse(new URI(link_to_wikt.text)); def desktopClass = Class.forName("java.awt.Desktop"); def desktop = desktopClass.getMethod("getDesktop").invoke(null); def browseMethod = desktopClass.getMethod("browse", [URI.class] as java.lang.Class[]); browseMethod.invoke(desktop, new URI(link_to_wikt.text)); // AppletStageExtension.showDocument(link_to_wikt.text); } catch (e) { System.out.println("Error: the following link could not be open: {link_to_wikt.text}"); } } } // temp (all POS as one text) --------------------------- var langPOSCards: Text = Text { //content: "langPOSCards todo" content: bind card_text_value // "line 1\n\nline2\n \nline3" wrappingWidth: WConstants.wrapping_width font: Font { name: "sansserif" size: 10 } fill: Color.BLUE } // ---------------------- eo temp var lang_VBox : VBox = VBox { //opacity: 0.5 width: bind card_scene.width - 30 //width: wrapping_width +2 - 30 spacing: 20 }; var card_scene: Scene; public var card : Stage = Stage { title : bind header_page_title scene: card_scene = Scene { width: WConstants.wrapping_width + 2 height: height content: ScrollView { width: bind card_scene.width height: bind card_scene.height //fitToWidth: true //nodeWidth: width + 20 //nodeHeight: height + 20 //hbarPolicy: ScrollBarPolicy.NEVER node: HBox { padding: Insets { left: 5 top: 1 bottom: 10} spacing: 20 content: [ VBox { // x: bind scene.width-scene.width*0.9 //padding: Insets {left: 5 right: 5} content: [ HBox { spacing: 12 content: [ headerText, link_to_wikt] } lang_VBox] //content: [headerText, lang_VBox, langPOSCards] spacing: 10 } ] } } } }*/ String header_page_title; // int height = 600; JFrame card; //Stage card; Scene card_scene; //card.setScene(scene); //card.show(); Text headerText; Hyperlink link_to_wikt; VBox lang_VBox; /** Prints meanings for each language. Wiktionary language (e.g. Russian in Russian Wiktionary) should be in first place in enumeration of definitions in different languages. */ String getDefinitionsForLangPOS( Connect conn, String page_title, // source word TLangPOS[] _lang_pos_array) { LinkedList<String> lang_pos_def_collection = new LinkedList<String>(); // collection of definitions for each Lang and POS for (int i=0; i<_lang_pos_array.length; i++) { TLangPOS lang_pos = _lang_pos_array[i]; //TMeaning.get(arg0, arg1) //lang_pos. //definition_Text.content = _lang_pos_array.size().toString(); // number of lang-POS pairs // simple LanguageType lang = lang_pos.getLang().getLanguage(); POS pos = lang_pos.getPOS().getPOS(); String s = lang.getName() + " (" + lang.getCode() + "):" + pos.toString(); if (WConstants.DEBUGUI) s = s + "; lang_pos.id = " + lang_pos.getID(); s = s + "\n"; String[] definitions = WTMeaning.getDefinitionsByLangPOS(conn, lang_pos); String[] synonyms = WTRelation.getForEachMeaningByPageLang(conn, lang_pos, Relation.synonymy); //def synonyms : String[] = ["", "synonyms 2"]; for (int j=0; j<definitions.length; j++) { s = s + " " + (j+1) + ". " + definitions[j] + " \n"; if(synonyms.length > j && synonyms[j].length() > 0) s = s + " Syn.: " + synonyms[j] + "\n"; //fill: Color.rgb (0xec, 0xed, 0xee) // todo: Text {fill: Color.BLUE; content: synonyms[j]} } if(lang == conn.getNativeLanguage()) { // insert s before lang_pos_def_collection[0]; lang_pos_def_collection.addFirst(s); } else { //insert s into lang_pos_def_collection; lang_pos_def_collection.add(s); } } String res = ""; if (1 == lang_pos_def_collection.size()) { // let's skip numbering "1)" if there is only one lang res = lang_pos_def_collection.getFirst(); } else { for (int i=0; i<lang_pos_def_collection.size(); i++) { String s = lang_pos_def_collection.get(i); res = res + (i+1) + ") " + s + "}\n \n"; // "\n \n" because the bug in JavaFX http://javafx-jira.kenai.com/browse/JFXC-3299 // res = "{res}{i+1}) {s}\n \n"; // "\n \n" because the bug in JavaFX http://javafx-jira.kenai.com/browse/JFXC-3299 } } return res; } /** Gets link to entry, if there is a corresponding Wiktionary article.*/ public String getLinktoWiktionaryEntry (TPage _tpage) { String s = ""; if(null != _tpage) { //if(_tpage.isInWiktionary()) { // todo - in really, isInWiktionary() should be called - to test more // replace all spaces by underscores "_" String s_underscored = _tpage.getPageTitle().replaceAll(" ", "_"); s = "http://" + WConstants.native_lang + ".wiktionary.org/wiki/" + s_underscored; //System.out.println("WC.getLinktoWiktionaryEntry: link="+s); } return s; } /** Prints page_title as a header of a word card. * Prints sign "+" or "-" if there is a separate page for this word in WT. */ public void printHeaderText (TPage _tpage) { if(null != _tpage) { String page_title = _tpage.getPageTitle(); header_page_title = page_title; card.setTitle(header_page_title); String s = ""; if(_tpage.isInWiktionary()) { s = page_title + " (+)"; } else s = page_title + " (-)"; if(_tpage.isRedirect()) s += "\n \nSee " + _tpage.getRedirect() + " (Redirect)"; // See or См.??? // headerText.content = s; // content: "headerText (page.is_in_wiktionary)" headerText.setText(s); String link = getLinktoWiktionaryEntry(_tpage); if(link.length() > 0) link_to_wikt.setText(link); } } /** Word is a selected word in the list, an index is a number of the word. * Prints meanings for each language. */ public void getDataForSelectedWordByTPage ( Connect conn, TPage _tpage) { //word : String, index:Integer) { if(null != _tpage) { //System.out.println("Ops 1. getDataForSelectedWordByTPage"); // printHeaderText (_tpage); it will be printed in createCXLangList if(_tpage.isRedirect()) { headerText.setText( headerText.getText() + "\n \nSee " + _tpage.getRedirect() + " (Redirect)"); // See or См.??? // headerText.content = "\n \nСм. {_tpage.getRedirect()} (Redirect)"; // System.out.println("\nRedirect."); } else { // Prints meanings for each language TLangPOS[] lang_pos_array = TLangPOS.get(conn, _tpage); // var lang_pos_array : TLangPOS[] card_text_value = getDefinitionsForLangPOS(conn, _tpage.getPageTitle(), lang_pos_array); // System.out.println("\nNot a redirect."); } } else card_text_value = ""; // System.out.println(" title={_tpage.getPageTitle()}."); // System.out.println(" getRedirect={_tpage.getRedirect()}."); } /** Word is given by user, language is unknown, so prints all languages. * * If a word (printed by user) is absent in dictionary, then print first * word from the list of nearest words. * * @params page_array list of titles of pages in ListView window (scroll) **/ public void getDataByWord(Connect conn, String word, TPage[] page_array) { headerText.setText(word); TPage _tpage = TPage.get(conn, word); if(null == _tpage && page_array.length > 0) // If a word is absent in dictionary... _tpage = page_array[0]; // then let's take first from the scroll list getDataForSelectedWordByTPage (conn, _tpage); // System.out.println("\n\n. getDataByWord(). definition_Text.content = {definition_text_value}."); } void initHeaderAndLink() { headerText = new Text(); headerText.setFont(Font.font("sansserif", FontWeight.LIGHT, 14)); headerText.setFill(Color.YELLOWGREEN); link_to_wikt = new Hyperlink(); link_to_wikt.setFont(Font.font("sansserif", FontWeight.LIGHT, 12)); link_to_wikt.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { //System.out.println("This link is clicked"); try { URI u = new URI(link_to_wikt.getText()); java.awt.Desktop.getDesktop().browse(u); //def desktopClass = Class.forName("java.awt.Desktop"); //def desktop = desktopClass.getMethod("getDesktop").invoke(null); //def browseMethod = desktopClass.getMethod("browse", [URI.class] as java.lang.Class[]); //browseMethod.invoke(desktop, new URI(link_to_wikt.text)); } catch (final Exception exc) { System.out.println("Error: the following link could not be open:" + link_to_wikt.getText()); } } }); } void initGUI() { initHeaderAndLink(); card = new JFrame(); card.setPreferredSize(new Dimension(WConstants.wordcard_width, WConstants.wordcard_height)); card.setMinimumSize(new Dimension(WConstants.wordcard_min_width, WConstants.wordcard_min_height)); final JFXPanel fxPanel = new JFXPanel(); VBox root_vbox = new VBox(); root_vbox.setSpacing(10); root_vbox.setPadding(new Insets(1, 0, 10, 5)); ScrollPane sp = new ScrollPane(); sp.setVmax(WConstants.wordcard_height*2); sp.setPrefSize(WConstants.wordcard_width, WConstants.wordcard_height); sp.setContent(root_vbox); sp.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED); sp.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); sp.setFitToWidth(true); //sp.setFitToHeight(true); Scene scene = new Scene(sp, WConstants.wordcard_width, WConstants.wordcard_height); fxPanel.setScene(scene); HBox root2_hbox = new HBox(); root2_hbox.setSpacing(12); // top right bottom left root2_hbox.setPadding(new Insets(1, 0, 10, 5)); lang_VBox = new VBox(); lang_VBox.setSpacing(20); root2_hbox.getChildren().addAll(headerText); root2_hbox.getChildren().addAll(link_to_wikt); root_vbox.getChildren().addAll(root2_hbox); root_vbox.getChildren().addAll(lang_VBox); //root_vbox.getChildren().addAll(sp); fxPanel.setSize(WConstants.wordcard_height, WConstants.wordcard_width); card.add(fxPanel); card.setVisible(true); } /** Creates list of sub-languages (parts of wiki pages), * builds visual blocks with these languages, * fills ->lang_VBox.content[] * * @params page_array list of titles of pages in ListView window (scroll). **/ public void createCXLangList( Connect conn, TPage _tpage) { if(null != _tpage) { //System.out.println("Ops 2. createCXLangList"); initGUI(); printHeaderText (_tpage); // Prints meanings for each language TLangPOS[] lang_pos_array = TLangPOS.get(conn, _tpage); // var lang_pos_array : TLangPOS[] // get list of languages for this word TLang[] tlanguages = TLangPOS.getLanguages(conn, _tpage); lang_VBox.getChildren().clear(); // 1. for 1: add language section in native (e.g., English for English Wiktionary) // Wiktionary (native) language should be before foreign languages //insert l.group into lang_VBox.content; for (TLang tl : tlanguages) { if(tl.getLanguage() == conn.getNativeLanguage()) { WCLanguage l = new WCLanguage(); l.create(conn, card_scene, tl.getLanguage(), lang_pos_array); lang_VBox.getChildren().add(l.group); } } // 2. for 2: add all other languages for (TLang tl : tlanguages) { if(tl.getLanguage() != conn.getNativeLanguage()) { WCLanguage l = new WCLanguage(); l.create(conn, card_scene, tl.getLanguage(), lang_pos_array); lang_VBox.getChildren().add(l.group); } } if(lang_pos_array.length > 0) {// big new frame (with word card) card.setPreferredSize(new Dimension(WConstants.wordcard_width, WConstants.wordcard_height)); card.setMinimumSize(new Dimension(WConstants.wordcard_width, WConstants.wordcard_height)); } } } /** Creates list of sub-languages (parts of wiki pages), * builds visual blocks with these languages, * fills ->lang_VBox.content[] * * @params page_array list of titles of pages in ListView window (scroll). **/ /*public void createCXLangListByWord( Connect conn, String word, TPage[] page_array) { //headerText.content = word; TPage _tpage = TPage.get(conn, word); if(null == _tpage && page_array.length > 0) // If a word is absent in dictionary... _tpage = page_array[0]; // then let's take first from the scroll list createCXLangList (conn, _tpage); //group.parent.notifyAll(); //card.notifyAll(); }*/ } /* ================================================================================== public var card : Group = Group { content : VBox { //content: [headerText, langPOSCards] content: [headerText, lang_VBox, langPOSCards] spacing: 10 }; }*/ /*public var card : Stage = Stage { title : bind header_page_title scene: Scene { width: 382 height: 500 //content: Flow{ content: //SwingScrollPane{ //height: bind Math.min(150, (sizeof swing_list_group) * (font_size +5)) // 165 // scrollable: true //font: Font { size: font_size } // view: VBox { content: [headerText, lang_VBox] //content: [headerText, lang_VBox, langPOSCards] spacing: 10 } //} //} } }*/