/**
* Class: CTex_TextArea extends JTextArea
*
* Author: Dimi, Sven, Lars, Stefan
*
* Funktion: Die Eingabe Text Felder fuer CTex_TextFieldTab
*
*/
package gui;
import gui.dialog.ConditionalDialog;
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextArea;
import container.ContainerAttribute;
import database.Db;
public class TextArea extends JTextArea implements ActionListener{
private static final long serialVersionUID = -7190710401802304948L;
TextArea me;
private final String typeName;
private Vector<ContainerAttribute> attV = new Vector<ContainerAttribute>();
private final Db theDb;
private enum states {TEXT, OBJECT, CONDITION};
states state = states.TEXT;
//Right Click Menu
final JPopupMenu rightClickMenu = new JPopupMenu();
JMenuItem cutItem = new JMenuItem("Cut");
JMenuItem copyItem = new JMenuItem("Copy");
JMenuItem pasteItem = new JMenuItem("Paste");
/**
* Construktor: fuer CTex_ContainerAttribut att aus Tabel Model
*
* @return gui.CTex_TextArea
*/
TextArea(Db db, String typeName, Vector<ContainerAttribute> attV, final EntryPanel Tab){
this.theDb = db;
this.attV = attV;
this.setTabSize(0);
this.me = this;
this.typeName = typeName;
if (attV.size() > 1){
state = states.CONDITION;
} else if (attV.size() != 0 && attV.get(0).getLink() == true){
state = states.OBJECT;
} else {
state = states.TEXT;
}
/*this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
// Tab Nummer an TextFieldTab uebergeben
Tab.SetAreaId(Id, Tab.ReqorOpt());
}
});*/
cutItem.addActionListener(this);
cutItem.setEnabled(false);
copyItem.addActionListener(this);
copyItem.setEnabled(false);
pasteItem.addActionListener(this);
pasteItem.setEnabled(false);
rightClickMenu.add(cutItem);
rightClickMenu.add(copyItem);
rightClickMenu.add(pasteItem);
/*this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
JOptionPane.showMessageDialog(null, "Righ Click", "Test",JOptionPane.INFORMATION_MESSAGE);
}
}
});*/
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
switch(e.getModifiers()) {
case InputEvent.BUTTON3_MASK: {
Clipboard systemClip = Toolkit.getDefaultToolkit().getSystemClipboard();
if(me.getSelectionStart() != me.getSelectionEnd())
{
copyItem.setEnabled(true);
cutItem.setEnabled(true);
} else {
copyItem.setEnabled(false);
cutItem.setEnabled(false);
}
if(systemClip.isDataFlavorAvailable(DataFlavor.stringFlavor)){
pasteItem.setEnabled(true);
} else {
pasteItem.setEnabled(false);
}
rightClickMenu.show(e.getComponent(), e.getX(), e.getY());
rightClickMenu.setInvoker(e.getComponent());
break;
}
}
}
});
update();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == cutItem) {
this.cut();
} else if (e.getSource() == copyItem) {
this.copy();
} else if (e.getSource() == pasteItem) {
this.paste();
}
}
public void addCondition(){
if (state != states.OBJECT){
new ConditionalDialog(typeName, this, theDb);
}
}
/**
* Methode: gibt den Attribute zurueck
*
* @return container.CTex_ContainerAttribut
*/
public Vector<ContainerAttribute> getAtt(){
if (state == states.TEXT){
attV.clear();
attV.add(new ContainerAttribute(-1, theDb.convTypeNameToTypeId(typeName), this.getText(), false, new Vector<ContainerAttribute>()));
}
return attV;
}
/**
* Methode: gibt den TextFeld zurueck
*
* @return gui.CTex_TextArea
*/
public String getTypeName(){return typeName;}
/**
*
*/
public void removeCondition (){
state = states.TEXT;
attV.clear();
attV.add(new ContainerAttribute(-1, theDb.convTypeNameToTypeId(typeName), this.getText(), false, new Vector<ContainerAttribute>()));
update();
}
/**
* Procedure: setzt die Farbe des Text Feldes entspraechend der Einstellungen
*/
public void setBackground (){this.setBackground(Color.WHITE);}
@Override
public void setBackground (Color bfg){
if (state == states.TEXT){
super.setBackground(Color.WHITE);
} else if (state == states.OBJECT){
super.setBackground(Color.YELLOW);
} else if (state == states.CONDITION){
super.setBackground(Color.GREEN);
}
}
/**
* Procedure: setzt Condition
*/
public void setCondition (Vector<ContainerAttribute> v){
attV = v;
state = states.CONDITION;
update();
}
public void setEditable() {this.setEditable(true);}
@Override
public void setEditable(boolean b) {
if (state == states.TEXT){
super.setEditable(true);
} else if (state == states.OBJECT){
super.setEditable(false);
} else if (state == states.CONDITION){
super.setEditable(false);
}
}
public void setObject (){
if (states.TEXT == state){
attV.clear();
//TODO: Split Objects
// and
// Test is Object?
attV.add(new ContainerAttribute(-1, theDb.convTypeNameToTypeId(typeName), this.getText(), true, new Vector<ContainerAttribute>()));
state = states.OBJECT;
} else if (states.OBJECT == state){
attV.clear();
attV.add(new ContainerAttribute(-1, theDb.convTypeNameToTypeId(typeName), this.getText(), false, new Vector<ContainerAttribute>()));
state = states.TEXT;
}
update();
}
/**
* Procedure: setzt den Inhalt der Text Felder enstsprechend der Attrubute
*/
public void setText() {this.setText("");}
@Override
public void setText(String t) {
super.setText("");
if (state == states.TEXT){
if (attV.size() != 0) {
super.setText(attV.get(0).getValue());
}
} else if (state == states.OBJECT){
Vector<ContainerAttribute> v = attV;
Iterator<ContainerAttribute> i = v.iterator();
while (i.hasNext()){
super.setText(getText() + i.next().getValue());
if (i.hasNext()){
super.setText(getText() + " AND ");
}
}
} else if (state == states.CONDITION) {
Iterator<ContainerAttribute> i = attV.iterator();
while (i.hasNext()){
ContainerAttribute o = i.next();
super.setText(getText().concat("[" + theDb.convTypeIdToTypeName(o.getObjectTypeId()) + "=" + o.getValue() + "]: "));
Vector<ContainerAttribute> v2 =o.getCondition();
Iterator<ContainerAttribute> i2 = v2.iterator();
while (i2.hasNext()){
ContainerAttribute o2 = i2.next();
super.setText(getText().concat(theDb.convTypeIdToTypeName(o2.getObjectTypeId()) + " = " + o2.getValue() + ", "));
}
super.setText(getText().concat("\n"));
}
}
}
private void update (){
setEditable();
setBackground();
setText();
}
}