using GMW_data;
using SteamWare;
using System;
using System.Data;
using System.Web.UI.WebControls;

namespace GMW.WebUserControls
{
    public partial class mod_tipoCella : SteamWare.ApplicationUserControl
    {
        #region area da NON modificare

        #region area protected

        protected string _idxGridView;
        protected string _idxGridViewExt;
        protected string _tabCache;
        protected bool _showNewBtn = false;

        /// <summary>
        /// imposta errore non cancellabilità per record correlati
        /// </summary>
        protected void setNoDeletableErrorMessage()
        {
            // mostro avviso di non cancellabilità...
            lblWarning.Text = traduci("notDeletable_hasChild");
            lblWarning.Visible = true;
            grView.DataBind();
        }
        /// <summary>
        /// esegue cancellazioen record
        /// </summary>
        protected void doDelete()
        {
            // posso cancellare...
            lblWarning.Visible = false;
            ods.Delete();
        }
        /// <summary>
        /// Valida la cancellazione per i dati mostrati dal gridView
        /// richiede sia preventivamentedichiarato _idxGridView
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void validaDelete(object sender, ObjectDataSourceMethodEventArgs e)
        {
            int idx = Convert.ToInt32(e.InputParameters[string.Format("Original_{0}", _idxGridView)]);
            if (objIsNotRelated(idx))
            {
                // annullo cancellazione...
                e.Cancel = true;
                // seleziono record... metto in session valore idx e poi ridisegno...
                SteamWare.memLayer.ML.setSessionVal(_idxGridView, idx);
                setNoDeletableErrorMessage();
            }
            else
            {
                doDelete();
            }
        }

        /// <summary>
        /// recupera i dati di un nuovo record contenuti nel footer di un gridView;
        /// questi devono esses opportunamente nominati (es: txt{0}, dl{0}, ...)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void recuperaFooter(object sender, ObjectDataSourceMethodEventArgs e)
        {
            //recupero la riga footer...
            DataColumnCollection colonne = colonneObj();
            string nomeCol;
            string tipoColonna = "";
            foreach (DataColumn colonna in colonne)
            {
                nomeCol = colonna.ColumnName;
                // cerco un textbox o quello che sia...
                if (grView.FooterRow.FindControl(string.Format("txt{0}", nomeCol)) != null)
                {
                    tipoColonna = "textBox";
                }
                else if (grView.FooterRow.FindControl(string.Format("dl{0}", nomeCol)) != null)
                {
                    tipoColonna = "dropDownList";
                }
                else if (grView.FooterRow.FindControl(string.Format("chk{0}", nomeCol)) != null)
                {
                    tipoColonna = "checkBox";
                }
                else if (grView.FooterRow.FindControl(string.Format("selAjax_{0}", nomeCol)) != null)
                {
                    tipoColonna = "selAjax";
                }
                // in base al tipo salvo negli inputparameters dell'ODS
                switch (tipoColonna)
                {
                    case "textBox":
                        e.InputParameters[nomeCol] = ((TextBox)grView.FooterRow.FindControl(string.Format("txt{0}", nomeCol))).Text;
                        break;
                    case "dropDownList":
                        e.InputParameters[nomeCol] = ((DropDownList)grView.FooterRow.FindControl(string.Format("dl{0}", nomeCol))).SelectedValue;
                        break;
                    case "checkBox":
                        e.InputParameters[nomeCol] = ((CheckBox)grView.FooterRow.FindControl(string.Format("chk{0}", nomeCol))).Checked;
                        break;
                    case "selAjax":
                        e.InputParameters[nomeCol] = ((mod_selettore_ajax)grView.FooterRow.FindControl(string.Format("selAjax_{0}", nomeCol))).valore;
                        break;
                    default:
                        break;
                }
                tipoColonna = "";
            }
        }
        /// <summary>
        /// inserisce nuovo valore da footer
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lblIns_click(object sender, EventArgs e)
        {
            // click su inserimento, chiamo il metodo insert dell'ObjectDataSource
            ods.Insert();
            SteamWare.memLayer.ML.emptyCacheVal(_tabCache);
        }
        /// <summary>
        /// annulla inserimento nuovo valore da footer
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lblCanc_click(object sender, EventArgs e)
        {
            // annullo inserimento: nascondo footer, bind controlli...
            grView.FooterRow.Visible = false;
        }

        /// <summary>
        /// aggiorna controlli datagrid e numero righe in pagina
        /// </summary>
        protected override void aggiornaControlliDataGL()
        {
            base.aggiornaControlliDataGL();
            grView.PageSize = _righeDataGridMed;
        }
        /// <summary>
        /// traduce gli header delle colonne
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void grView_DataBound(object sender, EventArgs e)
        {
            if (grView.Rows.Count > 0)
            {
                LinkButton lb;
                // aggiorno gli headers        
                foreach (TableCell cella in grView.HeaderRow.Cells)
                {
                    try
                    {
                        lb = (LinkButton)cella.Controls[0];
                        lb.Text = traduci(lb.Text);
                    }
                    catch
                    { }
                }
                int totRecord = grView.Rows.Count + grView.PageSize * (grView.PageCount - 1);
                lblNumRec.Text = string.Format("{0} records of ~ {1}", grView.Rows.Count, totRecord);
            }
            else
            {
                lblNumRec.Text = "";
            }
        }
        /// <summary>
        /// gestione evento richiesta nuovo valore (mostra footer, ...)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnNew_Click(object sender, EventArgs e)
        {
            // reset selezione...
            resetSelezione();
            // mostro il footer oppure la riga dei dettagli x nuovo...
            if (grView.FooterRow != null)
            {
                grView.FooterRow.Visible = true;
            }
            // sollevo evento nuovo valore...
            if (eh_nuovoValore != null)
            {
                eh_nuovoValore(this, new EventArgs());
            }
        }
        /// <summary>
        /// reset della selezione
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnReset_Click(object sender, EventArgs e)
        {
            resetSelezione();
        }
        /// <summary>
        /// gestione cambio selezione valore
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void grView_SelectedIndexChanged(object sender, EventArgs e)
        {
            // salvo in session il valore selezionato...
            SteamWare.memLayer.ML.setSessionVal(string.Format("{0}_sel", _idxGridView), grView.SelectedValue, true);
            // sollevo evento nuovo valore...
            if (eh_selValore != null)
            {
                eh_selValore(this, new EventArgs());
            }
        }
        /// <summary>
        /// resetta la selezione dei valori in caso di modifiche su altri controlli
        /// </summary>
        public void resetSelezione()
        {
            SteamWare.memLayer.ML.emptySessionVal(string.Format("{0}_sel", _idxGridView));
            grView.SelectedIndex = -1;
            grView.DataBind();
            lblWarning.Visible = false;
            if (eh_resetSelezione != null)
            {
                eh_resetSelezione(this, new EventArgs());
            }
        }

        /// <summary>
        /// collega i controlli
        /// </summary>
        protected override void bindControlli()
        {
            base.bindControlli();
            caricaTabelle();
        }

        #endregion

        #region gestione eventi

        public event EventHandler eh_resetSelezione;
        public event EventHandler eh_nuovoValore;
        public event EventHandler eh_selValore;

        #endregion

        #region public

        /// <summary>
        /// definisce visibilità btnNew
        /// </summary>
        public bool showNewBtn
        {
            get
            {
                return _showNewBtn;
            }
            set
            {
                _showNewBtn = value;
            }
        }
        /// <summary>
        /// effettua update del modulo
        /// </summary>
        public void doUpdate()
        {
            resetSelezione();
        }


        #endregion

        #endregion

        #region area codice variabile


        /// <summary>
        /// carico le tabelle
        /// </summary>
        private void caricaTabelle()
        {
        }
        /// <summary>
        /// verifica complessiva non esistenza record child
        /// </summary>
        /// <param name="idxObj"></param>
        /// <returns></returns>
        protected bool objIsNotRelated(object idxObj)
        {
            return MagClass.magazzino.taCelle.getByTipoCella(Convert.ToInt32(idxObj)).Rows.Count == 0;
        }
        /// <summary>
        /// elenco colonne del datagrid
        /// </summary>
        /// <returns></returns>
        protected DataColumnCollection colonneObj()
        {
            DS_magazzino.TipoCellaDataTable tabella = new DS_magazzino.TipoCellaDataTable();
            DataColumnCollection colonne = tabella.Columns;
            return colonne;
        }
        /// <summary>
        /// inizializzazione valori di default
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            _idxGridView = "IdxTipoCella";
            lblTitolo.Text = traduci("ElencoTipoCelle");
        }
        /// <summary>
        /// svuoto da cache post update
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ods_Updated(object sender, ObjectDataSourceStatusEventArgs e)
        {
            // evento come nuovo...
            if (eh_nuovoValore != null)
            {
                eh_nuovoValore(this, new EventArgs());
            }
        }
        /// <summary>
        /// determina se sia eliminabile il record (=non usato)
        /// </summary>
        /// <param name="idxMaker"></param>
        /// <returns></returns>
        public bool delEnabled(object idxObj)
        {
            bool answ = isWritable();
            // solo se ha diritti scrittura controllo
            if (answ)
            {
                int trovati = 0;
                // controllo se ci siano celle associate
                trovati = MagClass.magazzino.taCelle.getByTipoCella(Convert.ToInt32(idxObj)).Rows.Count;
                // controllo se ci sono record correlati...
                if (trovati > 0)
                {
                    answ = false;
                }
            }
            return answ;
        }
        /// <summary>
        /// gestione evento inserimento nuovo record standard (se ZERO presenti)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnNewFromEmpty_Click(object sender, EventArgs e)
        {
            // reset selezione...
            resetSelezione();
            // i primi valori ("0") di default sono "ND"... li inserisco come standard...
            MagClass.magazzino.taTipoCella.Insert(memLayer.ML.StringSessionObj("CodMag_sel"), memLayer.ML.cdv("CodCS"), 1, 1, memLayer.ML.cdvi("Max_X"), memLayer.ML.cdvi("Max_Y"), memLayer.ML.cdvi("Max_Z"), memLayer.ML.cdvi("Max_Kg"), false, true);
            // sollevo evento nuovo valore...
            if (eh_nuovoValore != null)
            {
                eh_nuovoValore(this, new EventArgs());
            }
            updateOdsDaFiltro();
        }
        /// <summary>
        /// aggiorno visualizzazione
        /// </summary>
        private void updateOdsDaFiltro()
        {
            grView.DataBind();
        }

        #endregion
    }
}