/* * Copyright (c) 2010-2016, Sikuli.org, sikulix.com * Released under the MIT License. * */ package org.sikuli.ide; import org.sikuli.basics.PreferencesUser; import javax.swing.*; import java.awt.event.*; import javax.swing.text.*; import java.net.URL; import org.sikuli.basics.Debug; public class ButtonGenCommand extends JButton implements ActionListener, MouseListener { String _cmd; String[] _params; String _desc; EditorPane pane; PreferencesUser pref; final static String DefaultStyle = "color:black;font-family:monospace;font-size:10px; font-weight:normal", HoverStyle = "color:#3333ff;font-family:monospace;font-size:10px; font-weight:bold;", PressedStyle = "color:#3333ff;font-family:monospace;font-size:10px; font-weight:bold;text-decoration:underline;"; public ButtonGenCommand(String cmd, String desc, String... params) { super(getRichRepresentation(DefaultStyle, cmd, desc, params, false)); _cmd = cmd; _params = params; _desc = desc; setToolTipText(getRichRepresentation(DefaultStyle, cmd, desc, params, true)); setHorizontalAlignment(SwingConstants.LEFT); addActionListener(this); addMouseListener(this); setBorderPainted(false); setBorder(BorderFactory.createEmptyBorder(1, 2, 2, 1)); setContentAreaFilled(false); } static String getParamHTML(String p, boolean first, boolean showOptParam) { URL imgPattern = SikuliIDE.class.getResource("/icons/capture-small.png"); String item = ""; if (!first) { item += ", "; } if (p.equals("PATTERN")) { item += "<img src=\"" + imgPattern + "\">"; } else { if (p.startsWith("[") && p.endsWith("]")) { if (showOptParam) { item += "<i>" + p + "</i>"; } } else { if (p.startsWith("_")) { item += "<u>" + p.substring(1, 2) + "</u>" + p.substring(2); } else { item += p; } } } return !item.equals(", ") ? item : ""; } static String getRichRepresentation(String style, String cmd, String desc, String[] params, boolean showOptParam) { String ret = "<html><table><tr><td valign=\"middle\">" + "<span style=\"" + style + "\">" + cmd + "("; int count = 0; for (String p : params) { String item = getParamHTML(p, count == 0, showOptParam); if (!item.equals("")) { ret += "<td valign=\"middle\" style=\"" + style + "\">" + item; } count++; } ret += "<td>)</table>"; if (showOptParam) { ret += "<p> " + desc; } return ret; } static String getTextRepresentation(String cmd, String[] params) { String ret = "" + cmd + "("; int count = 0; for (String p : params) { ret += p; if (++count < params.length) { ret += ", "; } } ret += ")"; return ret; } @Override public String toString() { return getTextRepresentation(_cmd, _params); } @Override public void actionPerformed(ActionEvent ae) { SikuliIDE ide = SikuliIDE.getInstance(); pane = ide.getCurrentCodePane(); pref = PreferencesUser.getInstance(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { insertCommand(); } }); } public void insertCommand() { pref = PreferencesUser.getInstance(); int endPos = -1, endPosLen = 0; boolean first = true; ButtonCapture btnCapture; Element line; pane.insertString(_cmd + "("); for (String p : _params) { if (p.equals("PATTERN")) { line = pane.getLineAtCaret(-1); if (!first) { pane.insertString(", "); } else { first = false; } if (pref.getAutoCaptureForCmdButtons()) { btnCapture = new ButtonCapture(pane, line); pane.insertComponent(btnCapture); btnCapture.captureWithAutoDelay(); } else { if (pane.showThumbs && pref.getPrefMoreImageThumbs()) { pane.insertComponent(new ButtonCapture(pane, line)); } else { pane.insertComponent(new EditorPatternLabel(pane, "")); } } continue; } if (!p.startsWith("[")) { if (!first) { pane.insertString(", "); } if (p.startsWith("_")) { endPos = pane.getCaretPosition(); p = p.substring(1); } endPosLen = p.length(); pane.insertString(p); first = false; } } pane.insertString(")"); (new SikuliEditorKit.InsertBreakAction()).insertBreak(pane); if (endPos >= 0) { pane.requestFocus(); pane.setCaretPosition(endPos); pane.setSelectionStart(endPos); pane.setSelectionEnd(endPos + endPosLen); Debug.log(5, "sel: " + pane.getSelectedText()); } pane.requestFocus(); } @Override public void mouseClicked(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { setText(getRichRepresentation(HoverStyle, _cmd, _desc, _params, false)); } @Override public void mouseExited(MouseEvent e) { setText(getRichRepresentation(DefaultStyle, _cmd, _desc, _params, false)); } @Override public void mousePressed(MouseEvent e) { setText(getRichRepresentation(PressedStyle, _cmd, _desc, _params, false)); } @Override public void mouseReleased(MouseEvent e) { setText(getRichRepresentation(HoverStyle, _cmd, _desc, _params, false)); } }