/*
* Copyright (c) 2010-2016, Sikuli.org, sikulix.com
* Released under the MIT License.
*
*/
package org.sikuli.ide;
import org.sikuli.basics.PreferencesUser;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.swing.*;
import javax.swing.border.*;
import org.sikuli.basics.Debug;
import org.sikuli.script.TextRecognizer;
//RaiMan not used import org.sikuli.script.TextRecognizer;
public class PatternPaneNaming extends JPanel {
final static int TXT_FILE_EXT_LENGTH = 4;
final static int TXT_FILENAME_LENGTH = 20;
final static int MAX_OCR_TEXT_LENGTH = 12;
final static int THUMB_MAX_HEIGHT = 200;
EditorPatternButton _imgBtn;
JTextField _txtPath, _txtFileExt;
JComboBox _txtFilename;
String _oldFilename;
static String _I(String key, Object... args) {
return SikuliIDEI18N._I(key, args);
}
public PatternPaneNaming(EditorPatternButton imgBtn, JLabel msgApplied) {
super(new GridBagLayout());
init(imgBtn, msgApplied);
}
private void init(EditorPatternButton imgBtn, JLabel msgApplied) {
_imgBtn = imgBtn;
JLabel lblPath = new JLabel(_I("lblPath"));
JLabel lblFilename = new JLabel(_I("lblFilename"));
String filename = _imgBtn.getFilename();
File f = new File(filename);
String fullpath = f.getParent();
filename = getFilenameWithoutExt(f);
_oldFilename = filename;
BufferedImage thumb = _imgBtn.createThumbnailImage(THUMB_MAX_HEIGHT);
Border border = LineBorder.createGrayLineBorder();
JLabel lblThumb = new JLabel(new ImageIcon(thumb));
lblThumb.setBorder(border);
_txtPath = new JTextField(fullpath, TXT_FILENAME_LENGTH);
_txtPath.setEditable(false);
_txtPath.setEnabled(false);
String[] candidates = new String[]{filename};
//<editor-fold defaultstate="collapsed" desc="OCR --- not used">
/*
String ocrText = getFilenameFromImage(thumb);
if(ocrText.length()>0 && !ocrText.equals(filename))
candidates = new String[] {filename, ocrText};
*/
//</editor-fold>
_txtFilename = new AutoCompleteCombo(candidates);
_txtFileExt = new JTextField(getFileExt(f), TXT_FILE_EXT_LENGTH);
_txtFileExt.setEditable(false);
_txtFileExt.setEnabled(false);
GridBagConstraints c = new GridBagConstraints();
c.gridy = 0;
c.insets = new Insets(100, 0, 0, 0);
this.add(new JLabel(""), c);
c = new GridBagConstraints();
c.fill = 0;
c.gridwidth = 3;
c.gridy = 1;
c.insets = new Insets(0, 10, 20, 10);
this.add(lblThumb, c);
c = new GridBagConstraints();
c.fill = 1;
c.gridy = 2;
this.add(lblPath, c);
c.gridx = 1;
c.gridwidth = 2;
this.add(_txtPath, c);
c = new GridBagConstraints();
c.gridy = 3;
c.fill = 0;
this.add(lblFilename, c);
this.add(_txtFilename, c);
this.add(_txtFileExt, c);
c = new GridBagConstraints();
c.gridy = 4;
c.gridx = 1;
c.insets = new Insets(200, 0, 0, 0);
this.add(msgApplied, c);
}
protected void updateFilename() {
_oldFilename = (String) _txtFilename.getSelectedItem();
}
private String getFilenameWithoutExt(File f) {
String name = f.getName();
int pos = name.lastIndexOf('.');
if (pos > 0) {
return name.substring(0, pos);
}
return name;
}
private String getFileExt(File f) {
String name = f.getName();
int pos = name.lastIndexOf('.');
if (pos > 0) {
return name.substring(pos);
}
return "";
}
public static String getFilenameFromImage(BufferedImage img) {
TextRecognizer tr = TextRecognizer.getInstance();
if (!PreferencesUser.getInstance().getPrefMoreTextOCR() || tr == null) {
return "";
}
String text = tr.recognize(img);
text = text.replaceAll("\\W", "");
if (text.length() > MAX_OCR_TEXT_LENGTH) {
return text.substring(0, MAX_OCR_TEXT_LENGTH);
}
return text;
}
public String getAbsolutePath() {
return _txtPath.getText() + File.separatorChar
+ _txtFilename.getSelectedItem() + _txtFileExt.getText();
}
public boolean isDirty() {
String newFilename = (String) _txtFilename.getSelectedItem();
return !_oldFilename.equals(newFilename);
}
}
class AutoCompleteCombo extends JComboBox {
private static final String me = "PatternPaneNaming: ";
final static int TXT_FILENAME_LENGTH = 20;
public int caretPos = 0;
public JTextField editor = null;
public AutoCompleteCombo(final Object items[]) {
super(items);
this.setEditable(true);
setHook();
//hideDropDownButton();
}
private void hideDropDownButton() {
for (Component component : this.getComponents()) {
if (component instanceof AbstractButton && component.isVisible()) {
component.setVisible(false);
this.revalidate();
}
}
}
@Override
public void setSelectedIndex(int ind) {
super.setSelectedIndex(ind);
editor.setText(getItemAt(ind).toString());
editor.setSelectionEnd(caretPos + editor.getText().length());
editor.moveCaretPosition(caretPos);
}
public void setHook() {
ComboBoxEditor anEditor = this.getEditor();
if (anEditor.getEditorComponent() instanceof JTextField) {
editor = (JTextField) anEditor.getEditorComponent();
editor.setColumns(TXT_FILENAME_LENGTH);
editor.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ev) {
char key = ev.getKeyChar();
if (!(Character.isLetterOrDigit(key) || Character
.isSpaceChar(key))) {
return;
}
caretPos = editor.getCaretPosition();
String text = "";
try {
text = editor.getText(0, caretPos);
} catch (Exception ex) {
Debug.error(me + "setHook: Problem getting image file name\n%s", ex.getMessage());
}
int n = getItemCount();
for (int i = 0; i < n; i++) {
int ind = ((String) getItemAt(i)).indexOf(text);
if (ind == 0) {
setSelectedIndex(i);
return;
}
}
}
});
}
}
}