/*
 * 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 2 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 PURPOUSE. See the GNU
 * General Public License for more details.
 *
 * You should have recieved a copy of the GNU General Public License
 * along with this program; if not write to the Free Software
 * Foundation, inc., 59 Temple Place, Suite 330, Boston MA 02111-1307
 * USA
 */
package j3d;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.tree.*;
import java.io.*;
import gui.*;
import javax.swing.*;
import java.awt.event.*;
/**
 * Insert the type's description here.
 *
 * @author: Yuriy Mikhaylovskiy
 */

public class _Element4 implements _Object, Serializable{
  private Canvas3D J3D;
  private PreProcessor PreP;
  public _Node node1,node2,node3,node4,node1_tmp,node2_tmp,node3_tmp,node4_tmp;
  public Material material = null;
  public Loads load;
  public float thickness;
  public Integer NIP=new Integer(5),PIP;
  public Float factor/* = new Float(10)*/,friction,shear_factor,MHC,OOPHC,RHC;
  public String hourglass;// = "ON";
  public String contact;// = "BASIC";
  public String thinning;// = "ON";
  public Color contur = Color.black;
  private String Id;
  public boolean selected = false;
  private String msh_name = "Shell_BT_4";
  private int msh_type = Canvas3D.MESH_Shell_BT_4;
  private JComboBox cb_ctype,cb_mat,cb_load,cb_thin,cb_hourglass;
  private JTextField tfn1,tfn2,tfn3,tfn4,tft,tffact,tffrict,tfnip,tfpip,tfshear,tfmhc,tfoophc,tfrhc;

  public void mesh(int type, float size){}
  public boolean delete(){return selected;}


  public _Element4(_Node n1, _Node n2, _Node n3, _Node n4, Material m, float th){
    node1=n1; node2=n2; node3=n3; node4=n4; material=m; thickness=th;
  }
  public _Element4(_Node n1, _Node n2, _Node n3, _Node n4, float th){
    this(n1,n2,n3,n4,null,th);
  }
  public _Element4(_Node n1, _Node n2, _Node n3, _Node n4){
    this(n1,n2,n3,n4,null,1);
  }

  private void writeObject(ObjectOutputStream out)  throws IOException{
    out.writeObject(node1);
    out.writeObject(node2);
    out.writeObject(node3);
    out.writeObject(node4);
    out.writeObject(material);
    out.writeObject(load);
    out.writeObject(contur);
    out.writeFloat(thickness);
    out.writeObject(NIP);
    out.writeObject(PIP);
    out.writeObject(factor);
    out.writeObject(friction);
    out.writeObject(contact);
    out.writeObject(thinning);
    out.writeObject(shear_factor);
    out.writeObject(hourglass);
    out.writeObject(MHC);
    out.writeObject(OOPHC);
    out.writeObject(RHC);
    out.writeObject(msh_name);
    out.writeInt(msh_type);
  }
  private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
    node1 = (_Node)in.readObject();
    node2 = (_Node)in.readObject();
    node3 = (_Node)in.readObject();
    node4 = (_Node)in.readObject();
    material = (Material)in.readObject();
    load = (Loads)in.readObject();
    contur = (Color)in.readObject();
    thickness = in.readFloat();
    NIP = (Integer)in.readObject();
    PIP = (Integer)in.readObject();
    factor = (Float)in.readObject();
    friction = (Float)in.readObject();
    contact = (String)in.readObject();
    thinning = (String)in.readObject();
    shear_factor = (Float)in.readObject();
    hourglass = (String)in.readObject();
    MHC = (Float)in.readObject();
    OOPHC = (Float)in.readObject();
    RHC = (Float)in.readObject();
    selected = false;
    msh_name = (String)in.readObject();
    msh_type = in.readInt();
  }


  public Object[] get_Array(Canvas3D j3d){
    int k=0;
    Object[] arr = new Object[1+(j3d.SHOW_ID_NODE?4:0)+(j3d.SHOW_ID_ELEMENT?1:0)+((j3d.SHOW_ID_LOADS && load!=null)?1:0)];
    if(material==null)arr[k++]=new shpQuad(node1.x,node1.y,node1.z,node2.x,node2.y,node2.z,node3.x,node3.y,node3.z,node4.x,node4.y,node4.z,selected ? j3d.SELECTCOLOR : null, contur);
    else arr[k++]=new shpQuad(node1.x,node1.y,node1.z,node2.x,node2.y,node2.z,node3.x,node3.y,node3.z,node4.x,node4.y,node4.z,selected ? j3d.SELECTCOLOR : material.color, selected ? j3d.SELECTCOLOR : material.color);
    if(j3d.SHOW_ID_NODE){
      arr[k++]=new shpOrientedText(node1.get_Id()+"",node1.x,node1.y,node1.z,contur);
      arr[k++]=new shpOrientedText(node2.get_Id()+"",node2.x,node2.y,node2.z,contur);
      arr[k++]=new shpOrientedText(node3.get_Id()+"",node3.x,node3.y,node3.z,contur);
      arr[k++]=new shpOrientedText(node4.get_Id()+"",node4.x,node4.y,node4.z,contur);
    }
    if(j3d.SHOW_ID_ELEMENT){
      arr[k++]=new shpOrientedText(node4.get_Id(),(node1.x+node2.x+node3.x+node4.x)/4,(node1.y+node2.y+node3.y+node4.y)/4,(node1.z+node2.z+node3.z+node4.z)/4,contur);
    }
    if(j3d.SHOW_ID_LOADS && load!=null) arr[k++]=new shpOrientedText(load.name,(node1.x+node2.x+node3.x+node4.x)/4,(node1.y+node2.y+node3.y+node4.y)/4,(node1.z+node2.z+node3.z+node4.z)/4,load.color);
    return arr;
  }
  public String get_Id(){
    return Id;
  }
  public void set_Id(String id){
    Id=id;
  }
  public boolean isSelected(){return selected;}
  public void Select(String st){ selected=st!=null; }
  public String toString(){ return msh_name+" ID="+Id;}
  public MutableTreeNode get_TreeNode(){
    DefaultMutableTreeNode node = new DefaultMutableTreeNode(this);
    node.add(node1.get_TreeNode());
    node.add(node2.get_TreeNode());
    node.add(node3.get_TreeNode());
    node.add(node4.get_TreeNode());
    node.add(new DefaultMutableTreeNode("Material - "+material.name));
    node.add(new DefaultMutableTreeNode("Thickness - "+thickness));
    node.add(new DefaultMutableTreeNode("Factor - "+(factor!=null?factor+"":"Default")));
    node.add(new DefaultMutableTreeNode("Friction - "+friction));
    node.add(new DefaultMutableTreeNode("Contact - "+(contact!=null?contact+"":"Default")));
    node.add(new DefaultMutableTreeNode("Load - "+load));
    node.add(new DefaultMutableTreeNode("NIP - "+NIP));
    node.add(new DefaultMutableTreeNode("PIP - "+PIP));
    node.add(new DefaultMutableTreeNode("Thinning - "+(thinning!=null?thinning+"":"Default")));
    node.add(new DefaultMutableTreeNode("Shear factor - "+(shear_factor!=null?shear_factor+"":"Default")));
    node.add(new DefaultMutableTreeNode("Hourglass - "+(hourglass!=null?hourglass+"":"Default")));
    node.add(new DefaultMutableTreeNode("MHC - "+(MHC!=null?MHC+"":"Default")));
    node.add(new DefaultMutableTreeNode("OOPHC - "+(OOPHC!=null?OOPHC+"":"Default")));
    node.add(new DefaultMutableTreeNode("RHC - "+(RHC!=null?RHC+"":"Default")));
    return node;
  }
  public void transform3D(Matrix3D t){
    if(!selected)return;
    node1.Select("");
    node2.Select("");
    node3.Select("");
    node4.Select("");
    node1.transform3D(t);
    node2.transform3D(t);
    node3.transform3D(t);
    node4.transform3D(t);
    node1.Select(null);
    node2.Select(null);
    node3.Select(null);
    node4.Select(null);
  }
  public void error(Object st){
    JOptionPane.showMessageDialog(null,"Error: "+st,"Error!",JOptionPane.ERROR_MESSAGE);
    System.out.println("Error: "+st);
    if(st instanceof Exception) ((Exception)st).printStackTrace();
  }
  public JPanel getEditPanel(Canvas3D j3d, PreProcessor pp){
    J3D=j3d;
    PreP = pp;
    JPanel p = new JPanel(new BorderLayout());
    JPanel p1 = new JPanel(new GridLayout(4,3));
    JPanel p3 = new JPanel();
    JPanel p2 = new JPanel(new GridLayout(14,1));
    JPanel p4 = new JPanel(new BorderLayout());
    JPanel p5 = new JPanel(new BorderLayout());
    JPanel p6 = new JPanel(new BorderLayout());
    JPanel p7 = new JPanel(new BorderLayout());
    JPanel p8 = new JPanel(new BorderLayout());
    JPanel p9 = new JPanel(new BorderLayout());
    JPanel p10 = new JPanel(new BorderLayout());
    JPanel p11 = new JPanel(new BorderLayout());
    JPanel p12 = new JPanel(new BorderLayout());
    JPanel p13 = new JPanel(new BorderLayout());
    JPanel p14 = new JPanel(new BorderLayout());
    JPanel p15 = new JPanel(new BorderLayout());
    JPanel p16 = new JPanel(new BorderLayout());
    JPanel p17 = new JPanel(new BorderLayout());
    JPanel p18 = new JPanel(new BorderLayout());
    node1_tmp=node1;
    node2_tmp=node2;
    node3_tmp=node3;
    node4_tmp=node4;
    String[] ctype = {"","EDGE","ADVANCED","ADVANCED_EDGE","OFF"};
    String[] ttype = {"","ON","OFF"};
    cb_mat = new JComboBox();
    cb_ctype = new JComboBox(ctype);
    cb_load = new JComboBox();
    cb_thin = new JComboBox(ttype);
    cb_hourglass = new JComboBox(ttype);
    cb_load.addItem("");
    for(Enumeration en = PreP.LoadDB.keys(); en.hasMoreElements();)  cb_load.addItem(en.nextElement());
    if(load!=null)cb_load.setSelectedItem(load.name);
    if(contact!=null)cb_ctype.setSelectedItem(contact);
    if(thinning!=null)cb_thin.setSelectedItem(thinning);
    if(cb_hourglass!=null)cb_hourglass.setSelectedItem(hourglass);
    tfn1 = new JTextField(node1+"",3);
    tfn2 = new JTextField(node2+"",3);
    tfn3 = new JTextField(node3+"",3);
    tfn4 = new JTextField(node4+"",3);
    tft = new JTextField(thickness+"");
    tffact = new JTextField(factor!=null?factor+"":"");
    tffrict = new JTextField(friction!=null?friction+"":"");
    tfnip = new JTextField(NIP!=null?NIP+"":"");
    tfpip = new JTextField(PIP!=null?PIP+"":"");
    tfshear = new JTextField(shear_factor!=null?shear_factor+"":"");
    tfmhc = new JTextField(MHC!=null?MHC+"":"");
    tfoophc = new JTextField(OOPHC!=null?OOPHC+"":"");
    tfrhc = new JTextField(RHC!=null?RHC+"":"");
    tfn1.setEditable(false);
    tfn2.setEditable(false);
    tfn3.setEditable(false);
    tfn4.setEditable(false);
    JButton b_1 = new JButton("<<");
    b_1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try{
          Object obj = J3D.getSelectedObject3D();
          if(obj!=null && obj instanceof _Node){
            node1_tmp=(_Node)obj;
            tfn1.setText(obj.toString());
          }else{
            node1_tmp=null;
            tfn1.setText("");
          }
        }catch(Exception e1) { error(e1);}
      }
    });
    JButton b_2 = new JButton("<<");
    b_2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try{
          Object obj = J3D.getSelectedObject3D();
          if(obj!=null && obj instanceof _Node){
            node2_tmp=(_Node)obj;
            tfn2.setText(obj.toString());
          }else{
            node2_tmp=null;
            tfn2.setText("");
          }
        }catch(Exception e1) { error(e1);}
      }
    });
    JButton b_3 = new JButton("<<");
    b_3.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try{
          Object obj = J3D.getSelectedObject3D();
          if(obj!=null && obj instanceof _Node){
            node3_tmp=(_Node)obj;
            tfn3.setText(obj.toString());
          }else{
            node3_tmp=null;
            tfn3.setText("");
          }
        }catch(Exception e1) { error(e1);}
      }
    });
    JButton b_4 = new JButton("<<");
    b_4.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try{
          Object obj = J3D.getSelectedObject3D();
          if(obj!=null && obj instanceof _Node){
            node4_tmp=(_Node)obj;
            tfn4.setText(obj.toString());
          }else{
            node4_tmp=null;
            tfn4.setText("");
          }
        }catch(Exception e1) { error(e1);}
      }
    });
    JButton b_upd = new JButton("Update");
    b_upd.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try{
          if(node1_tmp==null || node2_tmp==null || node3_tmp==null || node4_tmp==null){error("Node = null!"); return;}
          float thickness_tmp = Float.parseFloat(tft.getText());
          Float factor_tmp=tffact.getText().trim().length()==0?null:new Float(tffact.getText());
          Float friction_tmp=tffrict.getText().trim().length()==0?null:new Float(tffrict.getText());
          Integer NIP_tmp=tfnip.getText().trim().length()==0?null:new Integer(tfnip.getText());
          Integer PIP_tmp=tfpip.getText().trim().length()==0?null:new Integer(tfpip.getText());
          Float shear_factor_tmp=tfshear.getText().trim().length()==0?null:new Float(tfshear.getText());
          Float MHC_tmp=tfmhc.getText().trim().length()==0?null:new Float(tfmhc.getText());
          Float OOPHC_tmp=tfoophc.getText().trim().length()==0?null:new Float(tfoophc.getText());
          Float RHC_tmp=tfrhc.getText().trim().length()==0?null:new Float(tfrhc.getText());
          node1=node1_tmp;
          node2=node2_tmp;
          node3=node3_tmp;
          node4=node4_tmp;
          material = (Material)PreP.MatDB.get(cb_mat.getSelectedItem()+"");
          contact=cb_ctype.getSelectedItem()+"";
          load = (cb_load.getSelectedItem()+"").length()==0?null:(Loads)PreP.LoadDB.get(cb_load.getSelectedItem()+"");
          thinning=(cb_thin.getSelectedItem()+"").length()==0?null:cb_thin.getSelectedItem()+"";
          hourglass=(cb_hourglass.getSelectedItem()+"").length()==0?null:cb_hourglass.getSelectedItem()+"";
          thickness=thickness_tmp;
          factor=factor_tmp;
          friction=friction_tmp;
          NIP=NIP_tmp;
          PIP=PIP_tmp;
          shear_factor=shear_factor_tmp;
          MHC=MHC_tmp;
          OOPHC=OOPHC_tmp;
          RHC=RHC_tmp;
          J3D.tree_reset();
          J3D.view_reset();
        }catch(Exception e1) { error(e1);}
      }
    });
    p.add(p1, BorderLayout.CENTER);
    p1.add(new JLabel("Node 1"));
    p1.add(tfn1);
    p1.add(b_1);
    p1.add(new JLabel("Node 2"));
    p1.add(tfn2);
    p1.add(b_2);
    p1.add(new JLabel("Node 3"));
    p1.add(tfn3);
    p1.add(b_3);
    p1.add(new JLabel("Node 4"));
    p1.add(tfn4);
    p1.add(b_4);
    JLabel lb = new JLabel("Edit - "+toString());
    lb.setForeground(Color.blue);
    p.add(lb, BorderLayout.NORTH);
    p.add(p10,  BorderLayout.SOUTH);
    p10.add(p2,  BorderLayout.CENTER);
    p2.add(p4);
    p4.add(new JLabel("Material"), BorderLayout.WEST);
    p4.add(cb_mat, BorderLayout.CENTER);
    p2.add(p5);
    p5.add(new JLabel("Thickness"), BorderLayout.WEST);
    p5.add(tft, BorderLayout.CENTER);
    p2.add(p7);
    p7.add(new JLabel("Factor"), BorderLayout.WEST);
    p7.add(tffact, BorderLayout.CENTER);
    p2.add(p8);
    p8.add(new JLabel("Friction"), BorderLayout.WEST);
    p8.add(tffrict, BorderLayout.CENTER);
    p2.add(p9);
    p9.add(new JLabel("Contact"), BorderLayout.WEST);
    p9.add(cb_ctype, BorderLayout.CENTER);
    p10.add(p3,BorderLayout.SOUTH);
    p2.add(p11);
    p11.add(new JLabel("Load"), BorderLayout.WEST);
    p11.add(cb_load, BorderLayout.CENTER);
    p2.add(p12);
    p12.add(new JLabel("NIP"), BorderLayout.WEST);
    p12.add(tfnip, BorderLayout.CENTER);
    p2.add(p13);
    p13.add(new JLabel("PIP"), BorderLayout.WEST);
    p13.add(tfpip, BorderLayout.CENTER);
    p2.add(p14);
    p14.add(new JLabel("Thinning"), BorderLayout.WEST);
    p14.add(cb_thin, BorderLayout.CENTER);
    p2.add(p6);
    p6.add(new JLabel("Shear factor"), BorderLayout.WEST);
    p6.add(tfshear, BorderLayout.CENTER);
    p2.add(p15);
    p15.add(new JLabel("Hourglass"), BorderLayout.WEST);
    p15.add(cb_hourglass, BorderLayout.CENTER);
    p2.add(p16);
    p16.add(new JLabel("MHC"), BorderLayout.WEST);
    p16.add(tfmhc, BorderLayout.CENTER);
    p2.add(p17);
    p17.add(new JLabel("OOPHC"), BorderLayout.WEST);
    p17.add(tfoophc, BorderLayout.CENTER);
    p2.add(p18);
    p18.add(new JLabel("RHC"), BorderLayout.WEST);
    p18.add(tfrhc, BorderLayout.CENTER);
    p3.add(b_upd);
    for(Enumeration en = PreP.MatDB.keys(); en.hasMoreElements();)  cb_mat.addItem(en.nextElement());
    cb_mat.setSelectedItem(material.name);
    p.validate();
    return p;
  }

  public _Node[] get_Nodes(){
    _Node[] arr = {node1,node2,node3,node4};
    return arr;
  }
  public _Object[] get_Elements(){
    _Object[] arr = {this};
    return arr;
  }
}