/*
   * (non-Javadoc)
   * @see com.salmonllc.html.events.ValueChangedListener#valueChanged(com.salmonllc.html.events.ValueChangedEvent)
   */
  public boolean valueChanged(ValueChangedEvent e) throws Exception {
    // TextEdits para fechas de vigencia
    if (e.getComponent() == _fechaTE3) {
      if (_dsPartes != null) {
        if (!_dsPartes.isFormattedStringValid(e.getColumn(), e.getNewValue())) {
          // No movemos el nuevo valor al dataStore,pero evitamos
          // que sea eliminado la proxima vez que la pagina sea mostrada
          e.setAcceptValue(ValueChangedEvent.PROCESSING_KEEP_CHANGE_IN_QUEUE);

          // Mostramos el error
          if (_dsPartes.getMensajeError(_dsPartes.getRow()) == null)
            _dsPartes.setMensajeError(_dsPartes.getRow(), "Formato de fecha incorrecto.");
          else
            _dsPartes.setMensajeError(
                _dsPartes.getRow(),
                _dsPartes.getMensajeError(_dsPartes.getRow()) + " - Formato de fecha incorrecto.");

          displayErrorMessage("Hubo errores procesando partes. Corríjalos y grabe nuevamente.");

          return false;
        }
      }
    }
    return true;
  }
  /**
   * Initialize the page. Set up listeners and perform other initialization activities.
   *
   * @throws Exception
   */
  public void initialize() throws Exception {
    super.initialize();

    // genera botones custom
    _grabarParteBUT3 = new HtmlSubmitButton("grabarParteBUT3", "Grabar", this);
    _grabarParteBUT3.setAccessKey("G");
    _listFormDisplayBox1.addButton(_grabarParteBUT3);

    _nuevoParteCopiarBUT1 = new HtmlSubmitButton("nuevoParteCopiarBUT1", "Copiar Parte", this);
    _nuevoParteCopiarBUT1.setAccessKey("G");
    _listFormDisplayBox1.addButton(_nuevoParteCopiarBUT1);
    _nuevoParteNuevoBUT2 = new HtmlSubmitButton("nuevoParteNuevoBUT2", "Nuevo Parte", this);
    _nuevoParteNuevoBUT2.setAccessKey("N");
    _listFormDisplayBox1.addButton(_nuevoParteNuevoBUT2);

    _eliminaParteBUT4 = new HtmlSubmitButton("eliminaParteBUT4", "Eliminar", this);
    _eliminaParteBUT4.setAccessKey("E");
    _listFormDisplayBox1.addButton(_eliminaParteBUT4);

    _refrescarBUT5 = new HtmlSubmitButton("refrescarBUT5", "Recargar", this);
    _refrescarBUT5.setAccessKey("R");
    _listFormDisplayBox1.addButton(_refrescarBUT5);

    // Agrega columna de seleccion al datasource de informes
    _dsPartes.addBucket(SELECCION_PARTE_FLAG, DataStore.DATATYPE_INT);
    _seleccionParte.setColumn(_dsPartes, SELECCION_PARTE_FLAG);
    _seleccionParte.setFalseValue(null);

    addPageListener(this);
    _nuevoBUT92.addSubmitListener(this);
    _nuevoBUT91.addSubmitListener(this);
    _menuBUT.addSubmitListener(this);
    _grabarParteBUT3.addSubmitListener(this);
    _nuevoParteCopiarBUT1.addSubmitListener(this);
    _nuevoParteNuevoBUT2.addSubmitListener(this);
    _eliminaParteBUT4.addSubmitListener(this);
    _refrescarBUT5.addSubmitListener(this);

    // Listener para validar fecha antes de ser enviada al DataStore
    _fechaTE3.addValueChangedListener(this);

    _dsPartes.setAutoValidate(true);

    // refresca la pantalla de partes
    refrescaPartes();

    // completa la poplist de categorías
    try {
      completaCategorias();
    } catch (DataStoreException e) {
      displayErrorMessage("Error cargando categorias: " + e.getMessage());
    }
  }
  public void refrescaPartes() throws SQLException, DataStoreException {
    // setea y recupera los partes en estado generados
    _dsPartes.reset();
    _dsPartes.retrieve("partes_mo.estado = \"0003.0001\"");

    // si no recuperó ningún parte en estado generado, inserta al menos un registro
    _dsPartes.waitForRetrieve();
    if (_dsPartes.getRowCount() == 0) {
      int row = _dsPartes.insertRow();
      java.sql.Date hoy = new java.sql.Date(System.currentTimeMillis() - (1000 * 60 * 60 * 24));
      _dsPartes.setPartesMoFecha(row, hoy);
      _fechaTE3.setFocus(row, true);
    }
  }
  @Override
  public void pageRequested(PageEvent p) throws Exception {
    int v_parte_id = -1;
    String v_grp_parte_id = null;

    // si la página es requerida por si misma no hago nada
    if (!isReferredByCurrentPage()) {

      // verifico si tiene parametro
      v_parte_id = getIntParameter("p_parte_id");
      v_grp_parte_id = getParameter("p_grp_parte_id");

      // Viene seteado el parte. lo recupero sino no se hace nada
      if (v_parte_id > 0) {
        // resetea todos los datasource
        _dsPartes.reset();

        // recupera toda la informacion del parte
        _dsPartes.retrieve("partes_mo.parte_id = " + Integer.toString(v_parte_id));
        _dsPartes.gotoFirst();
        _fechaTE3.setFocus(true);
      }
      // Varios partes
      else if (v_grp_parte_id != null) {
        if (v_grp_parte_id.trim().length() > 0) {
          // resetea todos los datasource
          _dsPartes.reset();

          // recupera toda la informacion del parte
          _dsPartes.retrieve("partes_mo.parte_id IN (" + v_grp_parte_id + ")");
          _dsPartes.gotoFirst();
          _fechaTE3.setFocus(true);
        }
      } else {
        refrescaPartes();
      }
    }

    super.pageRequested(p);
  }
  @Override
  public boolean submitPerformed(SubmitEvent e) throws Exception {

    if (e.getComponent() == _grabarParteBUT3) {
      try {
        _dsPartes.update();
      } catch (DataStoreException ex) {
        displayErrorMessage(ex.getMessage());
        return false;
      }
    }

    if (e.getComponent() == _nuevoParteCopiarBUT1 || e.getComponent() == _nuevoBUT91) {

      int rowActual = _dsPartes.getRow();
      // si existe row anterior, le copia los valores
      if (rowActual != -1) {
        // valido el parte que estoy copiando
        try {
          _dsPartes.completaUnParte(rowActual);
        } catch (DataStoreException ex) {
          // muestro mensaje pero sigo sin problemas
          displayErrorMessage(ex.getMessage());
          _fechaTE3.setFocus(rowActual, true);
          return false;
        }
        int row = _dsPartes.insertRow(0);

        _dsPartes.setPartesMoFecha(row, _dsPartes.getPartesMoFecha(rowActual + 1));
        _dsPartes.setPartesMoHoraDesde(row, _dsPartes.getPartesMoHoraDesde(rowActual + 1));
        _dsPartes.setPartesMoHoraHasta(row, _dsPartes.getPartesMoHoraHasta(rowActual + 1));
        _dsPartes.setPartesMoNroLegajo(row, _dsPartes.getPartesMoNroLegajo(rowActual + 1));
        _dsPartes.setPartesMoProyecto(row, _dsPartes.getPartesMoProyecto(rowActual + 1));
        _dsPartes.setPartesMoProyectoNombre(
            row, _dsPartes.getPartesMoProyectoNombre(rowActual + 1));
        _dsPartes.setPartesMoSectorId(row, _dsPartes.getPartesMoSectorId(rowActual + 1));
        _dsPartes.setPartesMoSupervisor(row, _dsPartes.getPartesMoSupervisor(rowActual + 1));

        // hace foco en el registro
        int nroPagerow = _datatable1.getPage(row);
        int nroPageActual = _datatable1.getPage(_dsPartes.getRow());
        if (nroPagerow != nroPageActual) _datatable1.setPage(_datatable1.getPage(row));
        _fechaTE3.setFocus(row, true);
      } else {
        displayErrorMessage("Debe seleccionar un parte primero antes de copiarlo");
        return false;
      }
    }

    if (e.getComponent() == _nuevoParteNuevoBUT2 || e.getComponent() == _nuevoBUT92) {

      int rowActual = _dsPartes.getRow();
      int row = _dsPartes.insertRow(0);
      // si existe row anterior, s�lo copia valores b�sicos
      if (row > 1) {
        // valido el parte que estoy copiando
        _dsPartes.setPartesMoFecha(row, _dsPartes.getPartesMoFecha(rowActual + 1));
        _dsPartes.setPartesMoProyectoId(row, _dsPartes.getPartesMoProyectoId(rowActual + 1));
      }

      // hace foco en el registro
      int nroPagerow = _datatable1.getPage(row);
      int nroPageActual = _datatable1.getPage(_dsPartes.getRow());
      if (nroPagerow != nroPageActual) _datatable1.setPage(_datatable1.getPage(row));
      _fechaTE3.setFocus(row, true);
    }

    if (e.getComponent() == _eliminaParteBUT4) {
      // elimina todos los partes seleccionados
      for (int i = 0; i < _dsPartes.getRowCount(); i++) {
        if (_dsPartes.getInt(i, SELECCION_PARTE_FLAG) == 1) {
          // Rol marcado para selecci�n
          _dsPartes.deleteRow(i);
        }
      }

      _dsPartes.update();
      refrescaPartes();
    }

    if (e.getComponent() == _refrescarBUT5) {
      refrescaPartes();
    }

    return super.submitPerformed(e);
  }