/* * Copyright (c) 2010-2016, Sikuli.org, sikulix.com * Released under the MIT License. * */ package org.sikuli.ide; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import org.json.simple.JSONValue; import org.sikuli.basics.Debug; import org.sikuli.basics.Debug; import org.sikuli.basics.Settings; import org.sikuli.basics.Settings; import org.sikuli.ide.SikuliIDE; public class ExtensionManagerFrame extends JFrame { final static String EXTENSION_LIST_URL = SikuliIDE.runTime.SikuliRepo + "extensions.json"; private static ExtensionManagerFrame _instance = null; private int selected_idx = 0; ArrayList<ExtensionItem> _extensions; static public ExtensionManagerFrame getInstance() { if (_instance == null) { //TODO reactivate extension manager _instance = null; // _instance = new ExtensionManagerFrame(); } return _instance; } private ExtensionManagerFrame() { super(); setTitle("Sikuli Extensions"); setResizable(false); createComponents(); addKeyListener(new SelectExtensionKeyListener()); pack(); setLocationRelativeTo(null); } private void createComponents() { Container pane; pane = getContentPane(); pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); try { // Populate the list of extensions _extensions = retrieveExtensions(); for (ExtensionItem ext : _extensions) { pane.add(ext); } // Select the first one select(0); } catch (IOException io) { String msg = "Unable to load extensions list from: " + EXTENSION_LIST_URL; JTextField txt = new JTextField(msg); txt.setBackground(null); txt.setBorder(null); txt.setEditable(false); pane.add(txt); } JPanel bottomBar = new JPanel(); bottomBar.setLayout(new BorderLayout()); bottomBar.setMinimumSize(new Dimension(400, 20)); JButton closeBtn = new JButton("Close"); closeBtn.addActionListener(new ActionListener() { //TODO: clean extensions: old versions? @Override public void actionPerformed(ActionEvent arg0) { dispose(); } }); closeBtn.setFocusable(false); bottomBar.add(closeBtn, BorderLayout.LINE_END); pane.add(bottomBar); } private ArrayList<ExtensionItem> retrieveExtensions() throws IOException { ArrayList<ExtensionItem> extensions = new ArrayList<ExtensionItem>(); Debug.log(2, "Retrieving from " + EXTENSION_LIST_URL); String json = ExtensionManagerFrame.html2txt(EXTENSION_LIST_URL); Object obj = JSONValue.parse(json); Map map = (Map) obj; Map extension_list = (Map) map.get("extension-list"); List exts = (List) extension_list.get("extensions"); for (Object o : exts) { Map ext = (Map) o; String name = (String) ext.get("name"); String version = (String) ext.get("version"); String description = (String) ext.get("description"); String imgurl = (String) ext.get("imgurl"); String infourl = (String) ext.get("infourl"); String jarurl = (String) ext.get("jarurl"); extensions.add(new ExtensionItem(name, version, description, imgurl, infourl, jarurl)); } return extensions; } private static String html2txt(String urlstring) throws IOException { URL url = new URL(urlstring); URLConnection yc = url.openConnection(); yc.setConnectTimeout(5000); BufferedReader in = new BufferedReader( new InputStreamReader( yc.getInputStream())); String txt = ""; String inputLine; while ((inputLine = in.readLine()) != null) { txt = txt + inputLine; } in.close(); return txt; } protected void select(ExtensionItem ext) { int idx = _extensions.indexOf(ext); select(idx); } private void select(int idx) { _extensions.get(selected_idx).setSelected(false); selected_idx = idx; _extensions.get(selected_idx).setSelected(true); } private void selectPrevious() { if (selected_idx == 0) { return; } select(selected_idx - 1); } private void selectNext() { if (selected_idx == _extensions.size() - 1) { return; } select(selected_idx + 1); } private class SelectExtensionKeyListener implements KeyListener { @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_UP) { selectPrevious(); } else if (key == KeyEvent.VK_DOWN) { selectNext(); } } @Override public void keyReleased(KeyEvent arg0) { } @Override public void keyTyped(KeyEvent arg0) { } } // public static void main(String[] args) throws IOException { // // ExtensionManagerFrame f = ExtensionManagerFrame.getInstance(); // f.setVisible(true); // } }