/******************************************************************************
* Copyright: GPL v3 *
* *
* 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 dba.gui.auxClasses;
import dba.gui.CustomTree;
import dba.gui.auxClasses.feedback.FeedbackbarPanel;
import dba.options.FeedbackEnum;
import dba.utils.GetIcons;
import dba.utils.Localization;
import dba.utils.Observable;
import dbaCore.data.Database;
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Observer;
/**
* Provide the search panel
*
* @author Andreas Freitag
*/
public class SearchPanel extends JPanel implements Observable {
private GetIcons getIcon;
private JPanel panel;
private JTextField txtSearch;
private ArrayList<Object> searchResults;
private JButton btnNext;
private JButton btnPrev;
private int searchIterator;
private String lastSearchName = "THISWILLNEVERBEANAMEINADATABASE123!\"�@";
private FeedbackbarPanel feedbackbarPanel;
private ArrayList<Observer> observers;
private Localization locale;
public SearchPanel() {
super();
this.panel = this;
this.observers = new ArrayList<>();
this.searchResults = new ArrayList<>();
this.getIcon = GetIcons.getInstance();
this.feedbackbarPanel = FeedbackbarPanel.getInstance();
this.locale = Localization.getInstance();
panel.setLayout(new MigLayout("wrap 3", "[grow, fill][grow,fill,38:38:38][grow,fill,38:38:38]"));
JLabel lblsearch = new JLabel(locale.getString("GUI_Search"));
JButton btnClose = new JButton(getIcon.getButtonClose());
btnClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
notifyObservers();
}
});
btnNext = new JButton(getIcon.getNext());
btnNext.setBorderPainted(false);
btnNext.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
if(searchResults.isEmpty() || !lastSearchName.equals(txtSearch.getText())) {
lastSearchName = txtSearch.getText();
search();
return;
}
if((++searchIterator) < searchResults.size()) {
CustomTree.getInstance().setSelectedNode(searchResults.get(searchIterator));
} else {
searchIterator = 0;
CustomTree.getInstance().setSelectedNode(searchResults.get(searchIterator));
}
}
});
btnPrev = new JButton(getIcon.getPrev());
btnPrev.setBorderPainted(false);
btnPrev.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
if(searchResults.isEmpty() || !lastSearchName.equals(txtSearch.getText())) {
lastSearchName = txtSearch.getText();
search();
return;
}
if((--searchIterator) >= 0) {
CustomTree.getInstance().setSelectedNode(searchResults.get(searchIterator));
} else {
searchIterator = searchResults.size()-1;
CustomTree.getInstance().setSelectedNode(searchResults.get(searchIterator));
}
}
});
txtSearch = new JTextField();
txtSearch.setColumns(Integer.MAX_VALUE);
txtSearch.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
lastSearchName = txtSearch.getText();
search();
}
});
panel.add(new JSeparator(), "span");
panel.add(lblsearch, "span 2");
panel.add(btnClose);
panel.add(txtSearch);
panel.add(btnPrev);
panel.add(btnNext);
}
private void search(){
Database database = CustomTree.getInstance().getDatabase();
if (txtSearch.getText().isEmpty()) {
return;
}
searchResults = database.search(txtSearch.getText());
searchIterator = 0;
if (!searchResults.isEmpty()) {
CustomTree.getInstance().setSelectedNode(searchResults.get(searchIterator));
} else {
feedbackbarPanel.showFeedback(txtSearch.getText() + " " + locale.getString("GUI_NotFound"), FeedbackEnum.FAILED);
}
}
/**
* Add a Observer to the Collection
*
* @param observer the observer to add
* @return true for success
*/
public boolean addObserver(Observer observer) {
return observers.add(observer);
}
/**
* Notifies Observers about change
*/
protected void notifyObservers() {
for (Observer stalker : observers) {
stalker.update(null, this);
}
}
}