import java.io.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.geom.*;
import java.awt.Graphics;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.image.*;
import javax.swing.*;
import java.util.Locale;
import java.text.*;
import java.util.*;
import javax.swing.table.*;
import visad.*;
import visad.java3d.DisplayImplJ3D;
import visad.java2d.DisplayImplJ2D;
import java.rmi.RemoteException;

public class  SCO_menu extends JFrame implements ListSelectionListener 
{
  Container c;
  JPanel inputPanel;
  JTextArea t1,t2;
  JPanel outputPanel;
  int oldindex;
  ListSelectionEvent e1;
  String fonksiyonismi;
  JList fonksiyonlistesi;
  JList fonksiyonsinirlistesi;
  JList grafiklistesi;
  JList kokbulmalistesi;
  JList integrallistesi;
  JList optimizasyonlistesi;
  JMenuBar menuBar;
  JMenu m1,m2,m3,m4,m5,m6;
  String fonksiyonisimleri[]={"Bir boyutlu fonksiyon y=f(x)",
  "İki boyutlu fonksiyon z=f(x,y)",
  "n boyutlu fonksiyon z=f(x[0],x[1],x[2],...)",
  "n boyutlu m adet fonksiyon z[0]=f(x[0],x[1],...),z[1]=f(x[0],x[1],...),.."};
  String fonksiyonsinirleri[]={"Fonksiyon sınırları : ","boş değer"};
  String grafikcizimleri[]={"iki boyutlu grafik çizimleri y=f(x) : ",
  "üç boyutlu grafik çizimleri z=f(x,y): "};
  String kokbulma[]={"İkiye bölme yöntemi","newton-ikiye bölme","brent"};
  String integral[]={"gauss-konrad integral","adaptiv 1/3 simpson integral","adaptiv Gauss-Legendre integral","türev"};
  String optimizasyon[]={"Fibobacchi","brent"};
  double a[];
  String fonksiyon;
  String dosyaismi;
  String sinif;
  public SCO_menu()
  { 
	super("Sayısal Çözümleme");   
    a=new double[4];
    oldindex=100;
    e1=null;
    a[0]=-1.0;
    a[1]=1.0;
    a[2]=-1.0;
    a[3]=1.0;
    c=getContentPane();
    inputPanel=new JPanel();
    outputPanel=new JPanel();
	fonksiyonlistesi=new JList(fonksiyonisimleri);
	fonksiyonsinirlistesi=new JList(fonksiyonsinirleri);
	optimizasyonlistesi=new JList(optimizasyon);
	grafiklistesi=new JList(grafikcizimleri);
	kokbulmalistesi=new JList(kokbulma);
	integrallistesi=new JList(integral);
    kokbulmalistesi.setVisibleRowCount(4);
    integrallistesi.setVisibleRowCount(5);
	grafiklistesi.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	fonksiyonlistesi.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	fonksiyonsinirlistesi.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    optimizasyonlistesi.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	fonksiyonlistesi.setVisibleRowCount(4);
    fonksiyonsinirlistesi.setVisibleRowCount(2);
    grafiklistesi.setVisibleRowCount(2);
     optimizasyonlistesi.setVisibleRowCount(2);
    fonksiyonlistesi.addListSelectionListener(this);
    fonksiyonsinirlistesi.addListSelectionListener(this);
    grafiklistesi.addListSelectionListener(this);
    kokbulmalistesi.addListSelectionListener (this);
    integrallistesi.addListSelectionListener(this);
    optimizasyonlistesi.addListSelectionListener(this);
    menuBar=new JMenuBar();
	setJMenuBar(menuBar);
	m1 = new JMenu("Fonksiyon tanımla");
    m1.setMnemonic('F');
    m1.getAccessibleContext().setAccessibleDescription("Fonksiyon tanımları bu menuden yapılır");    
    m1.add(new JScrollPane(fonksiyonlistesi));    
    menuBar.add(m1);
    m2 = new JMenu("Fonksiyon sınır değerleri"); 
    m2.setMnemonic('S');
    m2.getAccessibleContext().setAccessibleDescription("Fonksiyon sınırları bu menuden girilir");     
    m2.add(new JScrollPane(fonksiyonsinirlistesi)); 
    menuBar.add(m2);          
    m3 = new JMenu("grafik çizimleri");
    m3.setMnemonic('G');
    m3.getAccessibleContext().setAccessibleDescription("Fonksiyon grafikleri çizer");    
    m3.add(new JScrollPane(grafiklistesi));    
    menuBar.add(m3);     
    m4 = new JMenu("kök bulma");
    m4.getAccessibleContext().setAccessibleDescription("Fonksiyon kök değerlerini bulur");    
    m4.add(new JScrollPane(kokbulmalistesi)); 
    m4.setMnemonic('K');   
    menuBar.add(m4);    
    m5 = new JMenu("integral ve türev");
    m5.getAccessibleContext().setAccessibleDescription("Fonksiyonun integral-türev değerlerini bulur");    
    m5.add(new JScrollPane(integrallistesi));
    m5.setMnemonic('I');    
    menuBar.add(m5);
    
    m6 = new JMenu("optimizasyon");
    m6.getAccessibleContext().setAccessibleDescription("optimizasyon");    
    m6.add(new JScrollPane(optimizasyonlistesi));
   m5.setMnemonic('O');    
    menuBar.add(m5);   
    menuBar.add(m6);
    t1=new JTextArea("ali");
    t2=new JTextArea("veli");
    outputPanel.add(t1,BorderLayout.SOUTH);
    outputPanel.add(t2,BorderLayout.CENTER);
    c.add(outputPanel,BorderLayout.SOUTH);
    //c.add(outputPanel,BorderLayout.SOUTH);    
  }


public void valueChanged( ListSelectionEvent e) 
{
	
if(e.getSource()==fonksiyonlistesi)
    {   int index1=fonksiyonlistesi.getSelectedIndex();
        if(index1==0 && index1!=oldindex)
        {
	    g2 f2 = new g2("f2D"," ");oldindex=index1;
	    fonksiyon=f2.fg.fonksiyon;
        dosyaismi=f2.fg.dosyaismi;
        sinif=f2.fg.sinif;
        System.out.println(sinif);
        t1.setText(sinif);
	    f2.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {repaint();}
        });
        f2.pack();
        f2.setDefaultCloseOperation(f2.DISPOSE_ON_CLOSE);
        f2.setSize(new Dimension(350,400));
        f2.setVisible(true);
        }
        else if(index1==1 && index1!=oldindex )
        {
	    g3 f3 = new g3("f2DM"," ");oldindex=index1;
	    fonksiyon=f3.fg.fonksiyon;
        dosyaismi=f3.fg.dosyaismi;
        sinif=f3.fg.sinif;
        t1.setText(sinif);
	    f3.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {repaint();}
        });
        f3.pack();
        f3.setDefaultCloseOperation(f3.DISPOSE_ON_CLOSE);
        f3.setSize(new Dimension(350,400));
        f3.setVisible(true);
        }
        else if(index1==2 && index1!=oldindex)
        {
	    g4 fN = new g4("f3D"," ");oldindex=index1;
	    fonksiyon=fN.fg.fonksiyon;
        dosyaismi=fN.fg.dosyaismi;
        sinif=fN.fg.sinif;
        t1.setText(sinif);
	    fN.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {repaint();}
        });
        fN.pack();
        fN.setDefaultCloseOperation(fN.DISPOSE_ON_CLOSE);
        fN.setSize(new Dimension(350,400));
        fN.setVisible(true);
        }
        else if(index1==3 && index1!=oldindex) 
        {
	    g5 fiN = new g5("fND"," ");oldindex=index1;
	    fonksiyon=fiN.fg.fonksiyon[0];
        dosyaismi=fiN.fg.dosyaismi;
        sinif=fiN.fg.sinif;
        t1.setText(sinif);
	    fiN.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {repaint();}
        });
        fiN.pack();
        fiN.setDefaultCloseOperation(fiN.DISPOSE_ON_CLOSE);
        fiN.setSize(new Dimension(350,400));
        fiN.setVisible(true);
        }
        e1=e;
    }
else if(e.getSource()==fonksiyonsinirlistesi)
    {int index2=fonksiyonsinirlistesi.getSelectedIndex();
	if(index2==0) {a=Text.readDoubleV("Fonksiyonun minimum ve maksimum değerlerini giriniz xmin[0] xmax[0] xmin[1] xmax[2]....");oldindex=index2;}
    e1=e;
	}
else if(e.getSource()==grafiklistesi)
    {   int index3=grafiklistesi.getSelectedIndex();
        if(index3==0 )//&& index!=oldindex)
        {ce3 x1=new ce3(a[0],a[1],100,"iki boyutlu grafik");oldindex=index3;}
        else if(index3==1 && ((index3!=oldindex) && (e.getSource()==e1.getSource())))
        {   try{
	        try{
               ce6 xy=new ce6(a[0],a[1],a[2],a[3],400);oldindex=index3;
               } catch(RemoteException e1) {System.err.println("girdi hatası.");} 
               } catch(VisADException e1) {System.err.println("girdi hatası.");}       
	    }    
    e1=e;
	}
else if(e.getSource()==kokbulmalistesi)
    {   int index4=kokbulmalistesi.getSelectedIndex();
        if(index4==0)
        {ce2 x2=new ce2(a[0],a[1],"kök bulma_ikiye bölme");oldindex=index4;}
        if(index4==1)
        {ce13 x2=new ce13(a[0],a[1],"kök bulma_newton-ikiye bölme");oldindex=index4;}
        if(index4==2)
        {ce14 x2=new ce14(a[0],a[1],"kök bulma-brent");oldindex=index4;}
    e1=e;
    }    		
else if(e.getSource()==integrallistesi)
    {   int index5=integrallistesi.getSelectedIndex();
    if(index5==0)
    {ce4 x3=new ce4(a[0],a[1],20,"gauss konrad integral");oldindex=index5;}
    else if(index5==1)
    {ce15 x4=new ce15(a[0],a[1],"adaptive 1/3 simpson integral");oldindex=index5;} 
    else if(index5==2)
    {ce16 x4=new ce16(a[0],a[1],"adaptive Gauss-Legendre integral");oldindex=index5;} 
    else if(index5==3)
    {ce4a x4=new ce4a(a[0],"türev");oldindex=index5;}
    e1=e;
    }     
else if(e.getSource()==optimizasyonlistesi)
    {   int index6=optimizasyonlistesi.getSelectedIndex();
    if(index6==0)
    {ce7 x5=new ce7(a[0],a[1],"altın oran minimum");oldindex=index6;}
    else if(index6==1)
    {ce8 x6=new ce8(a[0],a[1],"brent minimum");oldindex=index6;}
    else if(index6==2)
    {ce8 x6=new ce8(a[0],a[1],"brent minimum");oldindex=index6;}
    e1=e;
    }               		
}

public static void main(String s[])
    {        
        SCO_menu f1 = new SCO_menu();
        f1.pack();
        f1.setDefaultCloseOperation(f1.EXIT_ON_CLOSE);
        f1.setSize(new Dimension(1000,800));
        f1.setVisible(true);                
    }
}