package benutzeroberflaeche;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import produkte.Eigenschaften;
import produkte.Produkt;
import speichern.Einlesen;
public class Produktsuche {
/**
* ArrayList für die Attribute.
*/
private static ArrayList<Eigenschaften> pAttribute =
new ArrayList<Eigenschaften>();
/**
* ArrayList, die die Attribute, die vom Benutzer ausgewählt werden,
* beinhaltet.
*/
private static ArrayList<String> produktArray = new ArrayList<String>();
/**
* "Suchen"-Button für das Fenster "Produktsuche".
*/
private JButton suchen = new JButton(" Suchen ");
/**
* "Abbrechen"-Button für das Fenster "Produktsuche".
*/
private JButton abbrechen = new JButton(" Abbrechen ");
/**
* Bildchen für den Infobutton.
*/
private ImageIcon icon = new ImageIcon(getClass().getClassLoader().
getResource("http://www.tutorials.de/forum/images/button_info.gif"));
/**
* "InfoButton" - Button öffnet dem User ein Informationsfeld.
*/
private JButton infoButton = new JButton(" Info ",
icon);
/**
* Checkbox in der Tabelle.
*/
private JCheckBox checkbox = new JCheckBox();
/**
* Rahmen des Fensters "Produktsuche".
*/
private JFrame produktsuche;
/**
* Tabelle für Produktliste.
*/
private JTable produktliste;
/**
* ArrayList, die die Produkte, die vom Benutzer ausgewählt werden,
* beinhaltet.
*/
private ArrayList<Produkt> proArray = new ArrayList<Produkt>();
/**
* ArrayList, die die Eingabefelder beinhaltet.
*/
private ArrayList<JComboBox> eingabespeichern =
new ArrayList<JComboBox>();
/**
* ArrayList mit den Eingabetypen.
*/
private ArrayList<String> eingabetyp = new ArrayList<String>();
/**
* Zwischenspeicher für die Nummer von markierten Zeilen.
*/
private ArrayList<Integer> zeilenspeicher = new ArrayList<Integer>();
/**
* ArrayList mit den Produkten für den Mouselistener.
*/
private ArrayList<Produkt> produk = Einlesen.getProdukte();
/**
* Liste der Produkte.
*/
private ArrayList<Produkt> pro = Matrixansicht.getProduktdatentmp();
/**
* Speicher für die Inhalte der Attribute, die in den Comboboxen
* ausgegeben werden sollen.
*/
private Object eigens;
/**
* Variable zum Zwischenspeichern einer Zeilennummer.
*/
private int zeile;
/**
* Zwischenspeicher für die ausgewählten Produkte.
*/
private Produkt ausgewaehlt;
/**
* Inhalt für die Tabellen: Arrayliste der Produkte.
*/
private ArrayList<String> bewertungskriterien =
Matrixansicht.getKriterientable();
/**
* Inhalt für die Tabellen: Arrayliste der Produkte.
*/
private ArrayList<String> attributtypen = new ArrayList<String>();
/**
* ArrayList zum Speichern der Attributnamen.
*/
private ArrayList<String> newArray = new ArrayList<String>();
/**
* ArrayList, in der die Produktnamen gespeichert werden.
*/
private ArrayList<String> produktname = new ArrayList<String>();
/**
* Icon für die den "Abbrechen Button".
*/
private ImageIcon abbr = new ImageIcon(getClass().getClassLoader().
getResource("http://www.tutorials.de/forum/images/abbr.png"));
/**
* Icon für die den "Suchen Button".
*/
private ImageIcon suche = new ImageIcon(getClass().getClassLoader().
getResource("http://www.tutorials.de/forum/images/suche.png"));
/**
* Warnung, dass das Optionsformat nicht berücksichtigt wird..
*/
private ImageIcon icon1 = new ImageIcon(getClass().getClassLoader().
getResource("http://www.tutorials.de/forum/images/infoprosuch.gif"));
/**
* Konstruktor mit aufruf der Produktsuche.
*/
public Produktsuche() {
}
/**
* Getter für das ProduktArray.
* @return produktArray gibt das Array zurück.
*/
public static ArrayList<String> getproduktArray() {
return produktArray;
}
/**
* Erstellt ein Fenster für "Produktsuche".
*/
public void produktsuche() {
aTypenAuslesen();
produktsuche = new JFrame("Produktsuche");
produktsuche.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Container suche = produktsuche.getContentPane();
suche.setLayout(new BorderLayout());
// Tablemodel Produktliste.
produktliste = erstelleTabelle();
produktliste.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
TableColumn tc2 = produktliste.getTableHeader().getColumnModel().getColumn(0);
produktliste.getTableHeader().setResizingColumn(tc2);
produktliste.getTableHeader().getResizingColumn().setWidth(425);
TableColumn tc = produktliste.getTableHeader().getColumnModel().getColumn(1);
produktliste.getTableHeader().setResizingColumn(tc);
produktliste.getTableHeader().getResizingColumn().setWidth(30);
produktliste.setDefaultRenderer(produktliste.getColumnClass(1),
new Renderer());
produktliste.addMouseListener(new MouseL());
produktliste.setRowSelectionAllowed(true);
// Linke Seite des Fensters
JPanel west = new JPanel(new BorderLayout());
west(west);
JPanel links = new JPanel(new BorderLayout());
links.add(west, BorderLayout.CENTER);
// Rechte Seite des Fensters
JPanel eingabefelder = new JPanel(new GridLayout(
attributtypen.size(), 2, 2, 5));
eingabe(eingabefelder);
//"center" = Attribute.
JPanel center = new JPanel(new BorderLayout());
//Ausgelagerte Methode fuer Center.
center(center);
center.setBackground(Color.WHITE);
center.add(eingabefelder, BorderLayout.CENTER);
FlowLayout flowlay = new FlowLayout();
JPanel westinfo = new JPanel(flowlay);
//Ausgelagerte Methode fuer die Buttons.
buttons(westinfo);
flowlay.setHgap(10);
flowlay.setVgap(20);
//Panel "abstaende" fuer Abstaende an den Seiten.
JPanel abstaende = new JPanel(new BorderLayout());
//ausgelagerte Methode fuer die Abstaende um das Panel abstaende.
abstand(abstaende);
JPanel attrib = new JPanel(new BorderLayout());
abstaende.add(new JScrollPane(attrib), BorderLayout.CENTER);
attrib.add(center, BorderLayout.CENTER);
JPanel alles = new JPanel(new BorderLayout());
alles.add(abstaende, BorderLayout.CENTER);
alles.add(links, BorderLayout.WEST);
suche.add(westinfo, BorderLayout.SOUTH);
suche.add(alles, BorderLayout.CENTER);
produktsuche.setResizable(false);
produktsuche.pack();
produktsuche.setBounds(10, 10, 1100, 500);
// In der Mitte des Bildschirmes platzieren
produktsuche.setLocation((Toolkit.getDefaultToolkit()
.getScreenSize().width - produktsuche.getSize().width) / 2,
(Toolkit.getDefaultToolkit().getScreenSize().height - produktsuche
.getSize().height) / 2);
produktsuche.setVisible(true);
}
/**
* Methode um das in das JPanel Buttons mit den jeweiligen
* Buttons zu füllen.
* @param westinfo JPanel, in das die Buttons reinkommen.
* @return westinfo JPanel, in das die
* Buttons reinkommen.
*/
public JPanel buttons(JPanel westinfo) {
westinfo.add(infoButton);
westinfo.add(suchen);
suchen.setToolTipText("Suchen Sie Ihr Produkt");
suchen.setIcon(suche);
suchen.addActionListener(new Listener());
westinfo.add(abbrechen);
abbrechen.addActionListener(new Listener());
abbrechen.setIcon(abbr);
abbrechen.setToolTipText("Abbruch - zur\u00fcck zur Matrixansicht");
infoButton.addActionListener(new Listener());
infoButton.setToolTipText("Infos rund um die Produktsuche");
return westinfo;
}
/**
* Methode um das in das JPanel eingabe beliebig viele
* Textfelder, Comboboxen für den jeweiligen Attribuswert
* und Labels mit den Attributstname zu erstellen und
* Abstände an den Seiten zu erzeugen.
* @param einga JPanel, in das die Inhate reinkommen.
* @return einga JPanel, in das die Inhate reinkommen.
*/
public JPanel eingabe(JPanel einga) {
einga.setBackground(Color.WHITE);
for (int i = 0; i < attributtypen.size(); i++) {
/*Fuer Strings und Doubles beliebig
*viele Comboboxen mit Inhalten Attributswerte von allen
*Produkten.
*/
if (attributtypen.get(i).equals("String")
|| attributtypen.get(i).equals("Double")
|| attributtypen.get(i).equals("Boolean")) {
einga.add(new JLabel(" "
+ bewertungskriterien.get(i) + " "));
JComboBox eingabe = new JComboBox();
eingabe.setBackground(Color.WHITE);
Object leer = "";
eingabe.addItem(leer);
for (int j = 0; j < pro.size(); j++) {
eigens = pro.get(j).getPAttribute().get(i).getInhalt();
eingabe.addItem(eigens);
einga.add(eingabe);
eingabetyp.add("String");
eingabespeichern.add(eingabe);
}
} else if (attributtypen.get(i).equals("Option")) {
eingabetyp.add("Option");
}
}
return einga;
}
/**
* Methode um Abstände um die Componenten zu erzeugen.
* @param abstand JPanel, in dem die
* Abstände um ein "Objekt" sind.
* @return abstand JPanel, in dem die
* Abstände um ein "Objekt" sind.
*/
public JPanel abstand(JPanel abstand) {
FlowLayout georg = new FlowLayout();
JPanel platzmacherrechts = new JPanel(georg);
georg.setHgap(15);
georg.setVgap(15);
abstand.add(platzmacherrechts, BorderLayout.EAST);
JPanel platzmacherlinks = new JPanel(georg);
abstand.add(platzmacherlinks, BorderLayout.WEST);
JPanel platzmachero = new JPanel(georg);
abstand.add(platzmachero, BorderLayout.NORTH);
return abstand;
}
/**
* Methode um Abstände um die Componenten zu erzeugen.
* @param west JPanel, in dem die
* Abstände um ein "Objekt" sind.
* @return west JPanel, in dem die
* Abstände um ein "Objekt" sind.
*/
public JPanel west(JPanel west) {
FlowLayout georg = new FlowLayout();
georg.setHgap(15);
georg.setVgap(15);
JPanel platzmacherob = new JPanel(georg);
west.add(platzmacherob, BorderLayout.NORTH);
JPanel platzmacherli = new JPanel(georg);
west.add(platzmacherli, BorderLayout.WEST);
west.add(new JScrollPane(produktliste), BorderLayout.CENTER);
return west;
}
/**
* Methode um Abstände um die Componenten zu erzeugen.
* @param center JPanel, in dem die
* Abstände um ein "Objekt" sind.
* @return center JPanel, in dem die
* Abstände um ein "Objekt" sind.
*/
public JPanel center(JPanel center) {
JLabel text = new JLabel();
text.setIcon(icon1);
center.add(text, BorderLayout.NORTH);
JPanel panelunten = new JPanel();
panelunten.setBackground(Color.WHITE);
center.add(panelunten, BorderLayout.SOUTH);
JPanel panelrechts = new JPanel();
panelrechts.setBackground(Color.WHITE);
center.add(panelrechts, BorderLayout.EAST);
JPanel panellinks = new JPanel();
panellinks.setBackground(Color.WHITE);
center.add(panellinks, BorderLayout.WEST);
return center;
}
/**
* Vergleicht die Attribute der ausgewählten Produkte mit pAttribute.
* @return produktArray gibt ein ProduktArray zurück.
*/
public ArrayList<String> suche() {
Object ct2 = null;
produktArray.clear();
for (int j = 0; j < proArray.size(); j++ ) {
newArray.clear();
for (int k = 0; k < pAttribute.size(); k++ ) {
Object ct = proArray.get(j).getPAttribute().get(k).getInhalt();
try {
ct2 = (pAttribute.get(k).getInhalt().toString()
.replace("?", ""));
} catch (NullPointerException e) {
/*Hier funktioniert die Produktsuche manchmal leider noch
*nicht einwandtfrei und es wird eine NullPointerException
*geworfen.
*/
JOptionPane.showMessageDialog(null, "Es ist ein Fehler"
+ "aufgetreten. Bitte oeffnen Sie Ihre Datei erneut"
+ "oder fahren Sie mit andern Funktionen fort.",
"Fehler", (JOptionPane.INFORMATION_MESSAGE));
produktsuche.dispose();
}
System.out.println(ct + " " + ct2);
if (ct.equals(ct2)) {
newArray.add(pAttribute.get(k).getName());
}
}
produktname.add(proArray.get(j).getProduktname());
produktArray.addAll(newArray);
produktArray.add("");
}
produktArray.add(" ");
produktArray.addAll(produktname);
System.out.println(produktArray);
return produktArray;
}
/**
* Speichert die eingegebenen/ausgewählten Strings in pAttribute.
*/
public void speicher() {
pAttribute = new ArrayList<Eigenschaften>();
int k = 0;
int i = 0;
while (k < eingabetyp.size()) {
if (eingabetyp.get(k).equals("Option")) {
pAttribute.add(speichern.Einlesen.bastelAttribut(
eingabetyp.get(k), bewertungskriterien.get(i),
"", ""));
k += 1;
} else {
pAttribute.add(speichern.Einlesen.bastelAttribut(
eingabetyp.get(k), bewertungskriterien.get(i),
eingabespeichern.get(k).getSelectedItem().toString(), ""));
k += pro.size();
}
i++;
}
}
/**
* Methode zum Auslesen der Attributstypen.
*/
private void aTypenAuslesen() {
ArrayList<Eigenschaften> tmp = pro.get(0).getPAttribute();
attributtypen.clear();
for (int i = 0; i < tmp.size(); i++) {
attributtypen.add(tmp.get(i).getTyp().toString());
}
}
private class Listener implements ActionListener {
/**
* Reagiert auf die Ereignisse bei einem "Buttonklick".
*
* @param event "Buttonklick"
*/
public void actionPerformed(ActionEvent event) {
if (event.getSource() == abbrechen) {
produktsuche.dispose();
} else if (event.getSource() == suchen) {
speicher();
suche();
produktsuche.dispose();
new Suche();
} else if (event.getSource() == infoButton) {
@SuppressWarnings("unused")
Infos proinfo = new Infos("infoproduktsuche.gif");
}
}
}
/**
* Standard-Aktualisierungsoperation. Void - keine Rückgabe.
*/
public void aktualisiereListe() {
aktualisiereListe(false);
}
/**
* Aktualisiert den Inhalt der Tabelle.
*
* @param init false, falls nur aktualisiert wird.
* @return neues Tablemodel für "produktliste".
*/
private ProduktTableModel aktualisiereListe(boolean init) {
ProduktTableModel tablemodel = new ProduktTableModel();
// Setzt beim Aktualisieren neue Inhalte.
if (!init) {
produktliste.setModel(tablemodel);
}
return tablemodel;
}
/**
* Erstellt eine Tabelle aus den Produkten.
*
* @return die Tabelle.
*/
private JTable erstelleTabelle() {
return new JTable(aktualisiereListe(true));
}
private class Renderer extends DefaultTableCellRenderer {
/**
* SerialisierungsID.
*/
private static final long serialVersionUID = -2715405660821835786L;
// checkstyle: stop parameter number check
/**
* Überschriebene Methode, um Checkboxen zurückzugeben.
* @param table die zugehörige Tabelle.
* @param value Wert des Tabellenzelle.
* @param isSelected ob die Zelle ausgewählt ist.
* @param hasFocus ob die Zelle umrahmt ist.
* @param row Zeile.
* @param column Spalte.
* @return Component.
*/
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
Component rueckgabe = null;
rueckgabe = super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
TableColumn tc = produktliste.getTableHeader().getColumnModel().getColumn(1);
produktliste.getTableHeader().setResizingColumn(tc);
produktliste.getTableHeader().getResizingColumn().setWidth(30);
produktliste.setRowHeight(30);
TableColumn tc2 = produktliste.getTableHeader().getColumnModel().getColumn(0);
produktliste.getTableHeader().setResizingColumn(tc2);
produktliste.getTableHeader().getResizingColumn().setWidth(425);
if (zeilenspeicher.contains(row)) {
rueckgabe.setBackground(new Color(117, 193, 242));
// Fuer die Checkboxen an Spalte N°1.
if (column == 1) {
checkbox.setHorizontalAlignment(JCheckBox.CENTER);
rueckgabe = checkbox;
checkbox.setVisible(true);
checkbox.setSelected(false);
if (zeilenspeicher.contains(row)) {
checkbox.setSelected(true);
rueckgabe.setBackground(new Color(117, 193, 242));
}
if (!zeilenspeicher.contains(row)) {
checkbox.setSelected(false);
rueckgabe.setBackground(Color.WHITE);
}
}
}
if (!zeilenspeicher.contains(row)) {
rueckgabe.setBackground(Color.WHITE);
// tc.setMaxWidth(30);
// tc.setMinWidth(30);
if (column == 1) {
checkbox.setHorizontalAlignment(JCheckBox.CENTER);
rueckgabe = checkbox;
checkbox.setVisible(true);
checkbox.setSelected(false);
if (!zeilenspeicher.contains(row)) {
checkbox.setSelected(true);
rueckgabe.setBackground(new Color(117, 193, 242));
}
if (!zeilenspeicher.contains(row)) {
checkbox.setSelected(false);
rueckgabe.setBackground(Color.WHITE);
}
}
}
return rueckgabe;
}
// checkstyle: resume parameter number check
}
private class ProduktTableModel extends AbstractTableModel {
/**
* SerialisierungsID.
*/
private static final long serialVersionUID = -3042987409161204297L;
/**
* Gibt die Zeilenanzahl über die Anzahl der Produkte zurück.
*
* @return Zeilenanzahl
*/
public int getRowCount() {
int zeilenanzahl = pro.size();
return zeilenanzahl;
}
/**
* Gibt die Spaltenanzahl zurück.
* @return spaltenanzahl, 2.
*/
public int getColumnCount() {
int spaltenanzahl = 2;
return spaltenanzahl;
}
/**
* Die Spaltenüberschriften.
* @param column Spalte
* @return ergebnis - Name der Spalte
*/
public String getColumnName(int column) {
String ergebnis = "";
switch (column) {
case 0:
ergebnis = "Produkte";
break;
case 1:
ergebnis = "";
break;
default:
ergebnis = "";
break;
}
return ergebnis;
}
/**
* Gibt den Inhalt der Zelle zurück.
* @param row Zeile
* @param column Spalte
* @return n Object
*/
public Object getValueAt(int row, int column) {
Object zurueck = null;
Produkt bsp = pro.get(row);
switch (column) {
case 0:
zurueck = bsp.getProduktname();
break;
case 1:
zurueck = bsp.getIsEdit();
break;
default:
zurueck = "";
break;
}
return zurueck;
}
/**
* Methode, ob die Inhalte der Zellen veränderbar sind.
* @param row Zeile
* @param column Spalte
* @return false - also nicht veränderbar.
*/
public boolean isCellEditable(int row, int column) {
return false;
}
}
/**
* MouseListener zum Abhören von Mouse-Aktionen. (Mouseklicks).
*/
private class MouseL implements MouseListener {
/**
* Leere Methode.
* @param event leer
*/
public void mouseClicked(MouseEvent event) {
}
/**
* Leere Methode.
* @param event leer
*/
public void mouseEntered(MouseEvent event) {
}
/**
* Leere Methode.
* @param event leer
*/
public void mouseExited(MouseEvent event) {
}
/**
* Leere Methode.
* @param event leer
*/
public void mousePressed(MouseEvent event) {
}
/**
* Methode für das Reagieren der Klicks auf die Tabelle.
* @param event Mouseklick.
*/
@Override
public void mouseReleased(MouseEvent event) {
produktliste.setAutoResizeMode(produktliste.AUTO_RESIZE_OFF);
if (event.getButton() == 1) {
// "zeile" wird ueber Mouseklick bestimmt.
zeile = produktliste.rowAtPoint(event.getPoint());
ausgewaehlt = produk.get(zeile);
/*
* "proArray" mit den Attributen fuellen, die angeklickt werden
* und nicht schon in "checkArray" enthalten sind.
*/
if (!proArray.contains(ausgewaehlt)) {
proArray.add(ausgewaehlt);
} else {
proArray.remove(ausgewaehlt);
}
if (!zeilenspeicher.contains(zeile)) {
zeilenspeicher.add(zeile);
} else {
zeilenspeicher.remove((Object) zeile);
}
aktualisiereListe();
}
}
}
}