/**
  * Contrutor da janela para requantizar uma imagem
  *
  * @param i A imagem a ser requantizada
  */
 public JanelaDecomposicao() {
   this.setLayout(null);
   this.setSize(485, 200);
   Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
   setLocation(d.width / 2 - 485 / 2, d.height / 2 - 200 / 2);
   this.setTitle("DecomposiĆ§Ć£o de Canais");
   this.setModal(true);
   this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
   createAndShowGUI();
   buttonOk.addKeyListener(this);
   buttonCancel.addKeyListener(this);
   buttonAjuda.addKeyListener(this);
   rgb.addKeyListener(this);
   cmy.addKeyListener(this);
   cmyk.addKeyListener(this);
   hsl.addKeyListener(this);
   hsv.addKeyListener(this);
   ycrcb.addKeyListener(this);
   xyz.addKeyListener(this);
   this.setVisible(true);
 }
  /**
   * Initializes a window with all necessary components. This includes a JComboBox, JButton,
   * multiple JRadioButtons and multiple JLabels into the appropriate panels and adds them to the
   * current frame.
   */
  private void initUI() {

    // Get data for comboBox
    final ArrayList<String> locList = new ArrayList<String>();

    // Catch exceptions
    try {
      locationList(locList);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

    // Search buttons and selected value text
    JLabel lblHello = new JLabel("Choose your location...");
    lblHello.setForeground(Color.BLACK);
    final JLabel lblText = new JLabel();
    lblText.setForeground(Color.BLACK);

    // Radio Buttons
    JRadioButton radCelsius;
    final JRadioButton radFahrenheit;

    radCelsius = new JRadioButton("Celsius");
    radCelsius.setSelected(true);
    radCelsius.setForeground(Color.BLACK);
    radFahrenheit = new JRadioButton("Fahrenheit");
    radFahrenheit.setForeground(Color.BLACK);

    ButtonGroup grpTemp = new ButtonGroup();
    grpTemp.add(radCelsius);
    grpTemp.add(radFahrenheit);

    // Auto Complete Combo Box
    StringSearchable searchable = new StringSearchable(locList);
    final AutoCompleteJComboBox combo = new AutoCompleteJComboBox(searchable);
    combo.setEditable(true);

    // Change listener for when switching between radio buttons
    radCelsius.addChangeListener(
        new ChangeListener() {
          public void stateChanged(ChangeEvent arg0) {
            String msg = "Selected: " + combo.getSelectedItem() + " in Celsius";
            lblText.setText(msg);
          }
        });

    // Change listener for when switching between radio buttons
    radFahrenheit.addChangeListener(
        new ChangeListener() {
          public void stateChanged(ChangeEvent arg0) {
            String msg = "Selected: " + combo.getSelectedItem() + " in Fahrenheit";
            lblText.setText(msg);
          }
        });

    // KeyListener for when hitting enter in window
    KeyListener eListener =
        new KeyListener() {
          public void keyReleased(KeyEvent event) {
            if (event.getKeyChar() == KeyEvent.VK_ENTER) {
              combo.setPopupVisible(true);
              if (!(locList.contains(combo.getSelectedItem()))) {
                String err = "Error: Incorrect Location, Please Try Again";
                lblText.setText(err);
              } else {
                String msg = "Selected: " + combo.getSelectedItem();
                if (radFahrenheit.isSelected()) msg += " in Fahrenheit";
                else msg += " in Celsius";
                lblText.setText(msg);
              }
            }
          }

          public void keyTyped(KeyEvent arg0) {}

          public void keyPressed(KeyEvent e) {}
        };

    // Action listeners for window
    radCelsius.addKeyListener(eListener);
    radFahrenheit.addKeyListener(eListener);
    combo.getEditor().getEditorComponent().addKeyListener(eListener);

    // Set Preferred width of combo box
    combo.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXX");

    // Add panes to window
    JPanel paneNorth = new JPanel();
    JPanel paneCenter = new JPanel();
    JPanel paneSouth = new JPanel();

    JButton GWButton = new JButton("Get Weather");

    // Add action listener to button "Get Local Weather"
    GWButton.addActionListener(
        new ActionListener() {

          public void actionPerformed(ActionEvent e) {
            if (!(combo.getSelectedItem().toString().equalsIgnoreCase("mars"))
                && !(locList.contains(combo.getSelectedItem()))) {
              String err = "Error: Incorrect Location, Please Try Again";
              lblText.setText(err);
              // combo.setPopupVisible(true);
            } else {
              String msg = "Selected: " + combo.getSelectedItem();
              if (radFahrenheit.isSelected()) {
                msg += " in Fahrenheit";
                dataRequester.setFahrenheit();
              } else {
                msg += " in Celsius";
                dataRequester.setCelcius();
              }
              lblText.setText(msg);

              // Print result to preferences file for secondary startup
              try {
                PrintWriter out =
                    new PrintWriter(new BufferedWriter(new FileWriter("preferences.txt", true)));
                out.println(lblText.getText().toString());
                out.close();
              } catch (IOException f) {
              }

              String city = combo.getSelectedItem().toString();
              String cityName;
              String cityId;
              if (city.equalsIgnoreCase("mars")) {
                cityName = "Mars";
                cityId = "Mars";
              } else {
                cityName = city.substring(0, city.indexOf('['));
                cityId = city.substring(city.indexOf('[') + 1, city.indexOf(']'));
              }

              if (cityId.equals("Mars")) {
                dataRequester.update(cityId);
                localWeatherView.setCityName(cityName);
                try {
                  localWeatherView.setLabels();
                } catch (IOException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
                }
                shortTermView.clear();
                lblText.setText("Weather Fetched");
              } else {
                dataRequester.update(cityId);
                localWeatherView.setCityName(cityName);
                try {
                  localWeatherView.setLabels();
                } catch (IOException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
                }
                shortTermView.display();
                lblText.setText("Weather Fetched");
              }
            }
          }
        });

    // Layout for window
    paneNorth.setLayout(new FlowLayout(FlowLayout.LEFT));
    paneNorth.add(lblHello);

    GroupLayout groupLayout = new GroupLayout(this);
    groupLayout.setHorizontalGroup(
        groupLayout
            .createParallelGroup(Alignment.TRAILING)
            .addGroup(
                groupLayout
                    .createSequentialGroup()
                    .addGroup(
                        groupLayout
                            .createParallelGroup(Alignment.LEADING)
                            .addGroup(
                                groupLayout
                                    .createSequentialGroup()
                                    .addGap(36)
                                    .addComponent(
                                        paneNorth,
                                        GroupLayout.PREFERRED_SIZE,
                                        GroupLayout.DEFAULT_SIZE,
                                        GroupLayout.PREFERRED_SIZE))
                            .addGroup(
                                groupLayout
                                    .createSequentialGroup()
                                    .addContainerGap()
                                    .addComponent(
                                        paneCenter, GroupLayout.DEFAULT_SIZE, 438, Short.MAX_VALUE))
                            .addGroup(
                                groupLayout
                                    .createSequentialGroup()
                                    .addContainerGap()
                                    .addComponent(
                                        paneSouth, GroupLayout.DEFAULT_SIZE, 438, Short.MAX_VALUE)))
                    .addContainerGap()));
    groupLayout.setVerticalGroup(
        groupLayout
            .createParallelGroup(Alignment.LEADING)
            .addGroup(
                groupLayout
                    .createSequentialGroup()
                    .addGap(5)
                    .addComponent(
                        paneNorth,
                        GroupLayout.PREFERRED_SIZE,
                        GroupLayout.DEFAULT_SIZE,
                        GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(
                        paneCenter,
                        GroupLayout.PREFERRED_SIZE,
                        GroupLayout.DEFAULT_SIZE,
                        GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(
                        paneSouth,
                        GroupLayout.PREFERRED_SIZE,
                        GroupLayout.DEFAULT_SIZE,
                        GroupLayout.PREFERRED_SIZE)
                    .addGap(181)));
    GroupLayout gl_paneCenter = new GroupLayout(paneCenter);
    gl_paneCenter.setHorizontalGroup(
        gl_paneCenter
            .createParallelGroup(Alignment.LEADING)
            .addGroup(
                gl_paneCenter
                    .createSequentialGroup()
                    .addContainerGap()
                    .addComponent(
                        combo,
                        GroupLayout.PREFERRED_SIZE,
                        GroupLayout.DEFAULT_SIZE,
                        GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(radFahrenheit)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(radCelsius)
                    .addGap(62)));
    gl_paneCenter.setVerticalGroup(
        gl_paneCenter
            .createParallelGroup(Alignment.LEADING)
            .addGroup(
                gl_paneCenter
                    .createSequentialGroup()
                    .addGap(7)
                    .addGroup(
                        gl_paneCenter
                            .createParallelGroup(Alignment.BASELINE)
                            .addComponent(
                                combo,
                                GroupLayout.PREFERRED_SIZE,
                                GroupLayout.DEFAULT_SIZE,
                                GroupLayout.PREFERRED_SIZE)
                            .addComponent(radFahrenheit)
                            .addComponent(radCelsius))));
    paneCenter.setLayout(gl_paneCenter);

    GroupLayout gl_paneSouth = new GroupLayout(paneSouth);
    gl_paneSouth.setHorizontalGroup(
        gl_paneSouth
            .createParallelGroup(Alignment.LEADING)
            .addGroup(
                Alignment.TRAILING,
                gl_paneSouth
                    .createSequentialGroup()
                    .addGap(7)
                    .addComponent(lblText, GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(GWButton)
                    .addContainerGap()));
    gl_paneSouth.setVerticalGroup(
        gl_paneSouth
            .createParallelGroup(Alignment.TRAILING)
            .addGroup(
                Alignment.LEADING,
                gl_paneSouth
                    .createSequentialGroup()
                    .addContainerGap()
                    .addGroup(
                        gl_paneSouth
                            .createParallelGroup(Alignment.TRAILING)
                            .addComponent(
                                lblText,
                                Alignment.LEADING,
                                GroupLayout.DEFAULT_SIZE,
                                29,
                                Short.MAX_VALUE)
                            .addComponent(GWButton, Alignment.LEADING))
                    .addContainerGap()));
    paneSouth.setLayout(gl_paneSouth);
    setLayout(groupLayout);
  }
  void initial() {
    JPanel dpanel = new JPanel();
    dpanel.setLayout(new GridLayout(3, 1, 4, 4));

    display = new JLabel(" ", JLabel.RIGHT);
    display.setFont(new Font(DLGFONTNAME, DLGFONTSTYLE, 18));
    display.setForeground(Color.white);
    display.setBackground(Color.black);
    display.setOpaque(true);

    dpanel.add(display);

    ButtonGroup group = new ButtonGroup();
    faxNumButton = new JRadioButton("Fax number", true);
    broadcastButton = new JRadioButton("Group Send", false);
    broadcastButton.setFont(new Font(DLGFONTNAME, DLGFONTSTYLE, 14));
    faxNumButton.setFont(new Font(DLGFONTNAME, DLGFONTSTYLE, 14));
    faxNumButton.addKeyListener(this);
    broadcastButton.addKeyListener(this);
    group.add(faxNumButton);
    group.add(broadcastButton);

    dpanel.add(faxNumButton);
    dpanel.add(broadcastButton);
    dpanel.addKeyListener(this);

    JPanel npanel = new JPanel();
    npanel.setLayout(new GridLayout(4, 3, 4, 4));
    button = new JButton[20];

    for (int i = 0; i < 11; i++) {
      button[i] = new JButton(NBUTTON_NAME[i]);
      button[i].setFont(new Font(DLGFONTNAME, DLGFONTSTYLE, 16));
      //			if ((i % 5) == 3)
      //			if ((i % 5) == 4) button[i].setForeground(Color.red);
      button[i].setFocusPainted(false);
      button[i].addActionListener(this);
      button[i].addKeyListener(this);
      if (NBUTTON_NAME[i].equals(" ")) button[i].setVisible(false);
      npanel.add(button[i]);

      addKeyListener(this);
    }

    Container container = getContentPane();
    container.setLayout(new BorderLayout());
    container.add(dpanel, BorderLayout.NORTH);
    container.add(npanel, BorderLayout.CENTER);

    JPanel cpanel = new JPanel();
    cpanel.setLayout(new GridLayout(3, 1, 4, 4));
    cbutton = new JButton[20];

    for (int i = 0; i < 3; i++) {
      cbutton[i] = new JButton(CBUTTON_NAME[i]);
      cbutton[i].setFont(new Font(DLGFONTNAME, DLGFONTSTYLE, 16));
      cbutton[i].setFocusPainted(false);
      cbutton[i].addActionListener(this);
      cbutton[i].addKeyListener(this);
      cbutton[i].setForeground(Color.blue);
      // if (CBUTTON_NAME[i].equals(" ")) cbutton[i].setVisible(false);
      cpanel.add(cbutton[i]);

      addKeyListener(this);
    }

    faxNumberStr = "0";
    not1stChar = 0;

    container.add(cpanel, BorderLayout.EAST);
    container.addKeyListener(this);
  }