/*
* Copyright (C) 2010-2016 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.gui;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.text.JTextComponent;
import jsyntaxpane.actions.DocumentSearchData;
/**
*
* @author JPEXS
* @param <E> Element to search
*/
public class SearchPanel<E> extends JPanel {
private final SearchListener<E> listener;
private final JLabel searchPos;
private int foundPos = 0;
private final JLabel searchForLabel;
private String searchFor;
private boolean searchIgnoreCase;
private boolean searchRegexp;
private List<E> found = new ArrayList<>();
public SearchPanel(LayoutManager lm, SearchListener<E> listener) {
super(lm);
this.listener = listener;
JButton prevSearchButton = new JButton(View.getIcon("prev16"));
prevSearchButton.setMargin(new Insets(3, 3, 3, 3));
prevSearchButton.addActionListener(this::prevButtonActionPerformed);
JButton nextSearchButton = new JButton(View.getIcon("next16"));
nextSearchButton.setMargin(new Insets(3, 3, 3, 3));
nextSearchButton.addActionListener(this::nextButtonActionPerformed);
JButton cancelSearchButton = new JButton(View.getIcon("cancel16"));
cancelSearchButton.setMargin(new Insets(3, 3, 3, 3));
cancelSearchButton.addActionListener(this::cancelButtonActionPerformed);
searchPos = new JLabel("0/0");
searchForLabel = new JLabel(AppStrings.translate("search.info").replace("%text%", ""));
add(searchForLabel);
add(prevSearchButton);
add(new JLabel(AppStrings.translate("search.script") + " "));
add(searchPos);
add(nextSearchButton);
add(cancelSearchButton);
setVisible(false);
}
public void showQuickFindDialog(JTextComponent editor) {
DocumentSearchData dsd = DocumentSearchData.getFromEditor(editor);
dsd.setPattern(searchFor, searchRegexp, searchIgnoreCase);
dsd.showQuickFindDialogEx(editor, searchIgnoreCase, searchRegexp);
}
public void setSearchText(String txt) {
searchFor = txt;
searchForLabel.setText(AppStrings.translate("search.info").replace("%text%", txt) + " ");
}
public boolean setResults(List<E> results) {
found = results;
if (found.isEmpty()) {
setVisible(false);
return false;
} else {
setPos(0);
setVisible(true);
return true;
}
}
public void setOptions(boolean ignoreCase, boolean regExp) {
searchIgnoreCase = ignoreCase;
searchRegexp = regExp;
}
public void setPos(int pos) {
foundPos = pos;
doUpdate();
}
public void clear() {
foundPos = 0;
found.clear();
}
private void doUpdate() {
View.execInEventDispatchLater(() -> {
searchPos.setText((foundPos + 1) + "/" + found.size());
listener.updateSearchPos(found.get(foundPos));
});
}
private void cancelButtonActionPerformed(ActionEvent evt) {
foundPos = 0;
setVisible(false);
found = new ArrayList<>();
searchFor = null;
}
private void prevButtonActionPerformed(ActionEvent evt) {
foundPos--;
if (foundPos < 0) {
foundPos += found.size();
}
doUpdate();
}
private void nextButtonActionPerformed(ActionEvent evt) {
foundPos = (foundPos + 1) % found.size();
doUpdate();
}
}