source: trunk/src/org/expeditee/actions/JfxBrowserActions.java@ 876

Last change on this file since 876 was 876, checked in by csl14, 10 years ago

Exploratory Search web browser now anchors to fullscreen + fixed bug with anchoring widgets

File size: 10.0 KB
Line 
1package org.expeditee.actions;
2
3import java.io.IOException;
4import java.io.InputStreamReader;
5import java.net.HttpURLConnection;
6import java.net.MalformedURLException;
7import java.net.URI;
8import java.net.URISyntaxException;
9import java.net.URL;
10import java.net.URLEncoder;
11import java.util.ArrayList;
12
13import org.expeditee.gui.Browser;
14import org.expeditee.gui.DisplayIO;
15import org.expeditee.gui.Frame;
16import org.expeditee.gui.FrameGraphics;
17import org.expeditee.gui.FrameIO;
18import org.expeditee.gui.FrameMouseActions;
19import org.expeditee.gui.FrameUtils;
20import org.expeditee.gui.FreeItems;
21import org.expeditee.gui.MessageBay;
22import org.expeditee.io.WebParser;
23import org.expeditee.items.Item;
24import org.expeditee.items.Picture;
25import org.expeditee.items.Text;
26import org.expeditee.items.widgets.InteractiveWidget;
27import org.expeditee.items.widgets.JfxBrowser;
28import org.expeditee.settings.exploratorysearch.ExploratorySearchSettings;
29import org.expeditee.settings.network.NetworkSettings;
30import org.json.simple.JSONObject;
31import org.json.simple.parser.JSONParser;
32import org.json.simple.parser.ParseException;
33
34
35
36/**
37 * A list of Actions used with the JFX Browser widget
38 *
39 */
40public class JfxBrowserActions {
41
42 /**
43 * Launches items.widgets.JfxBrowser and uses Text item as URL.
44 * @param text Text item which passes contents as URL for browser.
45 * @throws Exception
46 */
47 public static void startBrowser(Item text) throws Exception {
48 if (!(text instanceof Text)) {
49 MessageBay.errorMessage("Must be a text item.");
50 return;
51 }
52 if(text.getLink() != null) {
53 MessageBay.errorMessage("Text item cannot have link.");
54 return;
55 }
56
57 Text wt = new Text("@iw:org.expeditee.items.widgets.JfxBrowser"); // create new text item for browser widget
58
59 if(FreeItems.textOnlyAttachedToCursor()) { // navigates to url specified by the text item
60 wt.appendText(":" + text.getText());
61 } else {
62 wt.appendText(":http://www.waikato.ac.nz");
63 }
64
65 FreeItems.getInstance().clear(); // remove url text from cursor
66
67 wt.setParent(DisplayIO.getCurrentFrame()); // set parent of text source for InteractiveWidget.createWidget()
68 wt.setXY(FrameMouseActions.getX(), FrameMouseActions.getY());
69
70 // create widget from text item
71 JfxBrowser browser = (JfxBrowser) InteractiveWidget.createWidget(wt);
72
73 FrameMouseActions.pickup(browser.getItems()); // attach browser widget to mouse
74 }
75
76 /**
77 * Text item becomes link to new frame containing items.widgets.JfxBrowser and uses Text item as URL for browser.
78 * @param text Text item which passes contents as URL for browser and becomes link to the browser's new frame.
79 * @throws Exception
80 */
81 public static void startBrowserNewFrame(Item text) throws Exception {
82 if (!(text instanceof Text)) {
83 MessageBay.errorMessage("Must be a text item.");
84 return;
85 }
86 if(text.getLink() != null) { // text item can't already have a link
87 MessageBay.errorMessage("Text item already has link.");
88 return;
89 }
90
91 // If no text with url is passed to action create a new text item with http://www.waikato.ac.nz for a default url
92 if(!FreeItems.textOnlyAttachedToCursor()) {
93 text = DisplayIO.getCurrentFrame().addText(FrameMouseActions.getX(), FrameMouseActions.getY(),
94 NetworkSettings.HomePage.get(), null);
95 text.setParent(DisplayIO.getCurrentFrame()); // set parent of text source for InteractiveWidget.createWidget()
96 FrameMouseActions.pickup(text); // Attach new text link to cursor
97 }
98
99 // Create JfxBrowser widget on a new frame
100 Frame frame = FrameIO.CreateNewFrame(text); // create new frame for browser
101 frame.removeAllItems(frame.getItems());
102 text.setLink("" + frame.getNumber()); // link this text item to new frame
103
104 // Create widget via text annotation
105 Text wt = frame.addText(0, 0, "@iw: org.expeditee.items.widgets.JfxBrowser "
106 + ("--anchorLeft 0 --anchorRight 0 --anchorTop 0 --anchorBottom 0 ")
107 + Browser._theBrowser.getContentPane().getWidth() + " " + Browser._theBrowser.getContentPane().getHeight()
108 + " : " + text.getText(), null);
109
110 InteractiveWidget.createWidget(wt);
111
112 FrameIO.SaveFrame(frame); // save frame to disk
113 }
114
115 public static void parsePage(Item text) throws Exception {
116 if (!(text instanceof Text) || !FreeItems.textOnlyAttachedToCursor()) {
117 MessageBay.errorMessage("Must provide a text item.");
118 return;
119 }
120 if(text.getLink() != null) { // text item can't already have a link
121 MessageBay.errorMessage("Text item already has link.");
122 return;
123 }
124
125 // Create JfxBrowser widget on a new frame
126 Frame frame = FrameIO.CreateNewFrame(text); // create new frame for browser
127 text.setLink("" + frame.getNumber()); // link this text item to new frame
128 frame.addText(100, 100, "test", null);
129
130 WebParser.parseURL(text.getText(), frame);
131 System.out.println(text.getText());
132 }
133
134 public static void gotoURL(Text link, String URL) {
135 Frame frame = FrameIO.CreateNewFrame(link);
136 link.setAction(null);
137 link.setLink("" + frame.getNumber());
138
139 WebParser.parseURL(URL, frame);
140
141 frame.change();
142
143 FrameIO.SaveFrame(frame);
144 }
145
146 /**
147 * Creates a frame containing a JFXBrowser pointed to the specified URL, then navigates to that frame
148 *
149 * @param link
150 * Item that will link to the new frame
151 * @param url
152 * URL to load in the Web Browser of the new frame
153 * @throws Exception
154 */
155 public static void createFrameWithBrowser(Text link, String url) throws Exception {
156 Frame frame = FrameIO.CreateNewFrame(link);
157 frame.removeAllItems(frame.getItems());
158 link.setLink("" + frame.getNumber());
159 link.setAction(null);
160
161 // Create widget via text annotation
162 Text wt = frame.addText(10, 10, "@iw: org.expeditee.items.widgets.JfxBrowser " + (int) (FrameGraphics.getMaxFrameSize().getWidth() * 0.9) + " "
163 + (int) (FrameGraphics.getMaxFrameSize().getHeight() * 0.9) + " : " + url, null);
164
165 FrameIO.SaveFrame(frame);
166
167 FrameUtils.DisplayFrame(link.getAbsoluteLink());
168 }
169
170 /**
171 * Uses the DuckDuckGo search API to provide short answers (e.g. definitions
172 *
173 * @param input
174 */
175 public static void askTheDuck(Text input) {
176
177 final String query = input.getText();
178 System.out.println(query);
179 input.delete();
180
181
182 final JSONParser parser = new JSONParser();
183
184
185 new Thread(new Runnable() {
186
187 @Override
188 public void run() {
189 try {
190 String queryForUrl = URLEncoder.encode(query.trim(), "UTF-8");
191
192 HttpURLConnection connection = (HttpURLConnection) (new URL("http://api.duckduckgo.com/?q=" + queryForUrl + "&format=json&no_html=1&no_redirect=1&t=expeditee").openConnection());
193
194 Object parsedObject = parser.parse(new InputStreamReader(connection.getInputStream()));
195
196 JSONObject jsonObject = (JSONObject) parsedObject;
197
198 String abstractText = (String) jsonObject.get("AbstractText");
199 String definition = (String) jsonObject.get("Definition");
200 String answer = (String) jsonObject.get("Answer");
201
202 String title = "";
203 String mainText = "";
204 String sourceUrl = "";
205 String sourceName = "";
206
207 if (!abstractText.equals("")) {
208
209 sourceUrl = (String) jsonObject.get("AbstractURL");
210 sourceName = "Via " + (String) jsonObject.get("AbstractSource");
211 title = (String) jsonObject.get("Heading");
212 mainText = abstractText;
213
214 } else if (!definition.equals("")) {
215
216 sourceUrl = (String) jsonObject.get("DefinitionURL");
217 sourceName = "Via " + (String) jsonObject.get("DefinitionSource");
218 title = query;
219 mainText = definition;
220
221 } else if (!answer.equals("")) {
222
223 sourceUrl = (String) jsonObject.get("AbstractURL");
224 sourceName = "Via " + (String) jsonObject.get("AbstractSource");
225 title = (String) jsonObject.get("AnswerType") + " " + query;
226 mainText = answer;
227
228 } else {
229 title = query;
230
231 mainText = "No instant answer available";
232
233 sourceUrl = (String) jsonObject.get("Redirect");
234 sourceName = "View Search Results";
235 }
236
237 if (sourceUrl.equals("")) {
238 sourceUrl = "http://duckduckgo.com/?q=" + queryForUrl;
239 }
240
241 String picSource = (String) jsonObject.get("Image");
242
243 // List to hold the items that will be attached to the cursor
244 ArrayList<Item> items = new ArrayList<Item>();
245
246 Text titleItem = new Text(title);
247 Text mainTextItem = new Text(mainText);
248 Text sourceItem = new Text(sourceName);
249 Text ddgLink = new Text("Results from DuckDuckGo");
250
251 sourceItem.setAction("createFrameWithBrowser " + sourceUrl);
252 ddgLink.setAction("createFrameWithBrowser " + "http://duckduckgo.com/?q=" + queryForUrl);
253
254 titleItem.setFamily("sans-serif");
255 titleItem.setSize(16);
256 titleItem.setFontStyle("bold");
257 titleItem.setWidth(400);
258
259 mainTextItem.setFamily("sans-serif");
260 mainTextItem.setSize(14);
261 mainTextItem.setWidth(400);
262
263 sourceItem.setFamily("sans-serif");
264 sourceItem.setSize(12);
265 sourceItem.setWidth(400);
266 sourceItem.setFontStyle("italic");
267
268 ddgLink.setFamily("sans-serif");
269 ddgLink.setSize(12);
270 ddgLink.setWidth(400);
271 ddgLink.setFontStyle("italic");
272
273
274 Picture pic = null;
275
276 if (!picSource.equals("")) {
277 pic = WebParser.getImageFromUrl(picSource, null, DisplayIO.getCurrentFrame(), 0, 0, 50, null, null,
278 null, null, null, 0, 0);
279 items.add(pic);
280 items.add(pic.getSource());
281 }
282
283 titleItem.setPosition(FrameMouseActions.getPosition());
284 mainTextItem.setPosition(titleItem.getX(), titleItem.getY() + titleItem.getBoundsHeight());
285 sourceItem.setPosition(mainTextItem.getX(), mainTextItem.getY() + mainTextItem.getBoundsHeight());
286 ddgLink.setPosition(sourceItem.getX() + sourceItem.getBoundsWidth(), sourceItem.getY());
287
288 if (pic != null) {
289 pic.getSource().setPosition(titleItem.getX() - 55, titleItem.getY() - 14);
290 }
291
292 items.add(titleItem);
293 items.add(mainTextItem);
294 items.add(sourceItem);
295 items.add(ddgLink);
296 FrameMouseActions.pickup(items);
297 } catch (IOException e) {
298 MessageBay.displayMessage("Problem loading results");
299 e.printStackTrace();
300 } catch (ParseException e) {
301 e.printStackTrace();
302 }
303 }
304 }).start();
305 }
306}
Note: See TracBrowser for help on using the repository browser.