/* 

Copyright 2006 Eric Hakenholz

This file is part of C.a.R. software.

C.a.R. is a 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, version 3 of the License.

C.a.R. 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 eric.bar;

import eric.JZirkelCanvas;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

import eric.controls.JCanvasButton;
import eric.controls.JCanvasPanel;
import eric.controls.JCanvasPopup;
import eric.controls.JCanvasSlider;
import eric.controls.JCanvasTxtfield;
import eric.textfieldpopup.JTextFieldPopup;

/**
 * 
 * @author erichake
 */
public class JControlProperties extends JProperties {

    /**
     *
     */
    
    JCanvasPanel JCP;
    myJSliderShowTicks jsShowTicks;
    myJSliderSnapTicks jsSnapTicks;
    myJSliderMin jsMin;
    myJSliderMax jsMax;
    myJSliderTicks jsTicks;
    myJComment jsComment;
    myJSliderUnit jsUnit;
    myJSliderShowComment jsShowcom;
    myJSliderShowVal jsShowval;
    myJSliderShowUnit jsShowunit;
    myJPopupItems jsPopupitems;

    public JControlProperties(final int w, final int h) {
        super(w, h);
        jsShowTicks=new myJSliderShowTicks(Loc("ctrlshowticks"), true, 200,
                TextFieldHeight);
        jsSnapTicks=new myJSliderSnapTicks(Loc("ctrlsnap"), true, 200,
                TextFieldHeight);
        jsMin=new myJSliderMin("min:", "", 50, 150, TextFieldHeight);
        jsMax=new myJSliderMax("max:", "", 50, 150, TextFieldHeight);
        jsTicks=new myJSliderTicks(Loc("ctrltickspacing"), "", 100, 200,
                TextFieldHeight);
        jsComment=new myJComment(Loc("expl"), "", 100, 250, TextFieldHeight);
        jsUnit=new myJSliderUnit(Loc("unit"), "", 100, 250, TextFieldHeight);
        jsShowcom=new myJSliderShowComment("", true, 18, TextFieldHeight);
        jsShowval=new myJSliderShowVal(Loc("ctrlshowvalue"), true, 200,
                TextFieldHeight);
        jsShowunit=new myJSliderShowUnit("", true, 18, TextFieldHeight);
        jsPopupitems=new myJPopupItems("", 250, TextFieldHeight*3+2);
    }

    public void setObject(final JCanvasPanel jcp) {
        if (JZirkelCanvas.getCurrentZF()==null) {
            return;
        }
        ZF=JZirkelCanvas.getCurrentZF();
        ZC=JZirkelCanvas.getCurrentZC();
        JCP=jcp;
        O=JCP.O;

        Cn=ZC.getConstruction();
        this.clearAll();
        addName();
        addCommonProps();
        addJSliderProps();
        addJPopupProps();
        addConditionals();
        selectTab(1);
        this.revalidate();
        this.repaint();
    }

    private void addName() {
        final JPanel rubname=new myRub();
        name.init();
        rubname.add(name);
        addMain(margin(5));
        addMain(rubname);
        addMain(margin(5));
        final JPanel rub=new myRub();
        addMain(rub);
    }

    private void addCommonProps() {
        jsComment.init();
        jsUnit.init();
        jsShowcom.init();
        jsShowval.init();
        jsShowunit.init();
        final ContentLine l1=new ContentLine();
        l1.add(jsShowcom);
        l1.add(jsComment);
        final ContentLine l2=new ContentLine();
        l2.add(jsShowunit);
        l2.add(jsUnit);
        final JPanel rub4=new myRub();
        rub4.add(margintop(2));
        rub4.add(l1);
        if ((JCP instanceof JCanvasTxtfield)||(JCP instanceof JCanvasButton)) {
            rub4.add(margintop(jsShowval.H*2+2));
        } else {
            rub4.add(margintop(1));
            rub4.add(l2);
            rub4.add(margintop(1));
            rub4.add(jsShowval);
        }
        addToNum(rub4);
        addToNum(new myRubSep());
    }

    private void addJSliderProps() {
        if (!(JCP instanceof JCanvasSlider)) {
            return;
        }

        jsShowTicks.init();
        jsSnapTicks.init();
        jsMin.init();
        jsMax.init();
        jsTicks.init();
        final JPanel rub1=new myRub();
        rub1.add(margintop(2));
        rub1.add(jsTicks);
        rub1.add(margintop(1));
        rub1.add(jsSnapTicks);
        rub1.add(margintop(1));
        rub1.add(jsShowTicks);

        addToNum(rub1);
        addToNum(new myRubSep());

        final JPanel rub2=new myRub();
        rub2.add(margintop(2));
        rub2.add(jsMin);
        rub2.add(margintop(jsMin.H+2));
        rub2.add(jsMax);

        addToNum(rub2);

    }

    private void addJPopupProps() {
        if (!(JCP instanceof JCanvasPopup)) {
            return;
        }
        final JPanel rub2=new myRub();
        rub2.add(margintop(2));
        jsPopupitems.init();
        rub2.add(jsPopupitems);
        addToNum(rub2);
    }

    private void addConditionals() {
        final JPanel rub=new myRub();
        chidden.init();
        csuperhidden.init();
        rub.add(margintop(1));
        rub.add(chidden);
        rub.add(margintop(2*chidden.H+3));

        addToConditional(rub);

    }

    // class myJSliderName extends myJLine {
    //
    // public myJSliderName(String comment, String txt, int comwidth, int width,
    // int height) {
    // super(comment, txt, comwidth, width, height);
    // this.JTF.setHorizontalAlignment(SwingConstants.CENTER);
    //
    // }
    //
    // public void doAction(Component e) {
    // JTextField jtf = (JTextField) e;
    // if (O.getName().equals(jtf.getText())) {
    // return;
    // }
    // O.setName(jtf.getText());
    // O.setShowName(true);
    // show.forceSelect(2); // Force the ShowName icon to be selected
    // if (ZC != null) {
    // ZC.repaint();
    // }
    // }
    //
    // public void init() {
    // setText(O.getName());
    // }
    // }
    class myJComment extends myJLine {

        /**
         *
         */
        

        public myJComment(final String comment, final String txt,
                final int comwidth, final int width, final int height) {
            super(comment, txt, comwidth, width, height, true);
            carPopup.setDisabled(","+JTextFieldPopup.LATEXMENU+","+JTextFieldPopup.FUNCTIONMENU+",");
        }

        @Override
        public void doAction(final Component e) {

            JCP.setComment(getText());
        }

        public void init() {
            setText(JCP.getComment());
        }
    }

    class myJSliderUnit extends myJLine {

        /**
         *
         */
        

        public myJSliderUnit(final String comment, final String txt,
                final int comwidth, final int width, final int height) {
            super(comment, txt, comwidth, width, height, true);
            carPopup.setDisabled(","+JTextFieldPopup.LATEXMENU+","+JTextFieldPopup.FUNCTIONMENU+",");
        }

        @Override
        public void doAction(final Component e) {

            JCP.setUnit(getText());
        }

        public void init() {
            setText(JCP.getUnit());
        }
    }

    class myJSliderShowComment extends myJLine {

        /**
         *
         */
        

        public myJSliderShowComment(final String comment, final boolean bool,
                final int width, final int height) {
            super(comment, bool, width, height);
        }

        @Override
        public void doAction(final Component e) {
            JCP.setShowComment(!isSelected());

        }

        public void init() {
            setSelected(JCP.getShowComment());
        }
    }

    class myJSliderShowVal extends myJLine {

        /**
         *
         */
        

        public myJSliderShowVal(final String comment, final boolean bool,
                final int width, final int height) {
            super(comment, bool, width, height);
        }

        @Override
        public void doAction(final Component e) {
            JCP.setShowVal(!isSelected());

        }

        public void init() {
            setSelected(JCP.getShowVal());
        }
    }

    class myJSliderShowUnit extends myJLine {

        /**
         *
         */
        

        public myJSliderShowUnit(final String comment, final boolean bool,
                final int width, final int height) {
            super(comment, bool, width, height);
        }

        @Override
        public void doAction(final Component e) {
            JCP.setShowUnit(!isSelected());

        }

        public void init() {
            setSelected(JCP.getShowUnit());
        }
    }

    class myJSliderShowTicks extends myJLine {

        /**
         *
         */
        

        public myJSliderShowTicks(final String comment, final boolean bool,
                final int width, final int height) {
            super(comment, bool, width, height);
        }

        @Override
        public void doAction(final Component e) {
            ((JCanvasSlider) JCP).setShowTicks(!isSelected());

        }

        public void init() {
            setSelected(((JCanvasSlider) JCP).getShowTicks());
        }
    }

    class myJSliderSnapTicks extends myJLine {

        /**
         *
         */
        

        public myJSliderSnapTicks(final String comment, final boolean bool,
                final int width, final int height) {
            super(comment, bool, width, height);
        }

        @Override
        public void doAction(final Component e) {
            ((JCanvasSlider) JCP).setSnap(!isSelected());

        }

        public void init() {
            setSelected(((JCanvasSlider) JCP).getSnap());
        }
    }

    class myJSliderMin extends myJLine {

        /**
         *
         */
        
        String current;
        String origin;

        public myJSliderMin(final String comment, final String txt,
                final int comwidth, final int width, final int height) {
            super(comment, txt, comwidth, width, height);
        }

        @Override
        public void doAction(final Component e) {
            if ((current.equals(getText()))||(!(isValidExpression(getText())))) {
                return;
            }

            current=getText();

        }

        @Override
        public void doQuitMe(final Component e) {
            if (!(isValidExpression(getText()))) {
                JOptionPane.showMessageDialog(null, Loc("error"));
                ((JCanvasSlider) JCP).setMin(ValueOf(origin));
                setText(origin);
                JTF.requestFocus();
                return;
            }
            current=getText();
            ((JCanvasSlider) JCP).setMin(ValueOf(current));
            jsMax.setText(((JCanvasSlider) JCP).getMax());
        }

        public void init() {
            current=String.valueOf(((JCanvasSlider) JCP).getMin());
            origin=current;
            setText(current);
            System.out.println(JTF.getText());
        }
    }

    class myJSliderMax extends myJLine {

        /**
         *
         */
        
        String current;
        String origin;

        public myJSliderMax(final String comment, final String txt,
                final int comwidth, final int width, final int height) {
            super(comment, txt, comwidth, width, height);
        }

        @Override
        public void doAction(final Component e) {
            if ((current.equals(getText()))||(!(isValidExpression(getText())))) {
                return;
            }

            current=getText();

        }

        @Override
        public void doQuitMe(final Component e) {
            if (!(isValidExpression(getText()))) {
                JOptionPane.showMessageDialog(null, Loc("error"));
                ((JCanvasSlider) JCP).setMax(ValueOf(origin));
                setText(origin);
                JTF.requestFocus();
                return;
            }
            current=getText();
            ((JCanvasSlider) JCP).setMax(ValueOf(current));
            jsMin.setText(((JCanvasSlider) JCP).getMin());

        }

        public void init() {
            current=String.valueOf(((JCanvasSlider) JCP).getMax());
            origin=current;
            setText(current);
        }
    }

    class myJSliderTicks extends myJLine {

        /**
         *
         */
        
        String current, origin;

        public myJSliderTicks(final String comment, final String txt,
                final int comwidth, final int width, final int height) {
            super(comment, txt, comwidth, width, height);
        }

        @Override
        public void doAction(final Component e) {
            if ((current.equals(getText()))||(!(isValidExpression(getText())))) {
                return;
            }

            current=getText();
            ((JCanvasSlider) JCP).setTicks(ValueOf(current));
        }

        @Override
        public void doQuitMe(final Component e) {
            if (!(isValidExpression(getText()))) {
                JOptionPane.showMessageDialog(null, Loc("error"));
                ((JCanvasSlider) JCP).setTicks(ValueOf(origin));
                setText(origin);
                return;
            }
            current=getText();
            ((JCanvasSlider) JCP).setTicks(ValueOf(current));
        }

        public void init() {
            current=String.valueOf(((JCanvasSlider) JCP).getTicks());
            origin=current;
            setText(current);

        }
    }

    class txtfieldTemplate extends myJLine {

        /**
         *
         */
        

        public txtfieldTemplate(final String comment, final String txt,
                final int comwidth, final int width, final int height) {
            super(comment, txt, comwidth, width, height, true);
        }

        @Override
        public void doAction(final Component e) {
        }

        @Override
        public void doQuitMe(final Component e) {
        }

        public void init() {
        }
    }

    class myJPopupItems extends ContentLine {

        /**
         *
         */
        
        JButton carBTN=null;
        JTextArea JTX;

        public myJPopupItems(final String mytxt, final int width,
                final int height) {
            super(width, height);
            this.setFocusable(false);
            this.add(margin(5));
            JTX=new JTextArea(mytxt);
            JTX.setFont(F_TextArea);
            JTX.setBackground(new Color(245, 246, 255));
            // JTX.setBorder(BorderFactory.createEtchedBorder());

            JTX.addKeyListener(new KeyAdapter() {

                @Override
                public void keyReleased(final KeyEvent e) {
                    doAction(e.getComponent());
                }
            });
            JTX.addFocusListener(new FocusAdapter() {

                @Override
                public void focusGained(final FocusEvent e) {
                    // JTX.selectAll();
                    carBTN.setEnabled(true);
                }

                @Override
                public void focusLost(final FocusEvent e) {
                    carBTN.setEnabled(false);
                    doQuitMe(e.getComponent());
                }
            });
            JTX.setLineWrap(true);

            //
            final JScrollPane jstxt=new JScrollPane(JTX);
            jstxt.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            jstxt.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

            // jstxt.setViewportView(JTX);
            // fixsize(jstxt,PW-11,h);
            this.add(jstxt);
            final ImageIcon carimg=new ImageIcon(getClass().getResource(
                    "/eric/GUI/icons/bar/carbtn.png"));
            final ImageIcon carimg_dis=new ImageIcon(getClass().getResource(
                    "/eric/GUI/icons/bar/carbtn_dis.png"));
            carBTN=new JButton(carimg);
            carBTN.setDisabledIcon(carimg_dis);
            // carbtn.setRolloverIcon(closeoverimg);
            carBTN.setBorder(BorderFactory.createEmptyBorder());
            carBTN.setOpaque(false);
            carBTN.setContentAreaFilled(false);
            carBTN.setFocusable(false);
            carBTN.addMouseListener(new MouseAdapter() {

                @Override
                public void mousePressed(final MouseEvent e) {
                    doShowPopup(e);
                }
            });
            carBTN.setEnabled(false);

            this.add(margin(2));
            this.add(carBTN);
        }

        public void doShowPopup(final MouseEvent e) {
            if (carBTN.isEnabled()) {
                final JTextFieldPopup mypop=new JTextFieldPopup(JTX);
                mypop.setDisabled(","+JTextFieldPopup.LATEXMENU+","+JTextFieldPopup.FUNCTIONMENU+",");
                mypop.addPopupMenuListener(new PopupMenuListener() {

                    public void popupMenuWillBecomeVisible(
                            final PopupMenuEvent arg0) {
                    }

                    public void popupMenuWillBecomeInvisible(
                            final PopupMenuEvent arg0) {
                        doAction(JTX);
                    }

                    public void popupMenuCanceled(final PopupMenuEvent arg0) {
                    }
                });
                mypop.openMenu(e);
            }
        }

        public void setText(final String txt) {
            JTX.setText(txt);
        }

        public String getText() {
            return JTX.getText();
        }

        public void doAction(final Component cp) {
            if (O.getText().equals(getText())) {
                return;
            }
            ((JCanvasPopup) JCP).setItems(getText());
            // O.setLines(getText());
            // O.setText(getText(), true);
            // ZC.recompute();
            // ZC.validate();
            // ZC.repaint();
        }

        public void doQuitMe(final Component cp) {
        }

        public void init() {
            // setText(O.getLines());
            setText(((JCanvasPopup) JCP).getItems());
        }
    }
}
