/// Go throught all widgets and save changes made by user back to the config item
        /// and then call SaveConfigToFile to default configuration file
        /// <param name="configItem">The configuration object whose information should be saved</param>
        protected virtual void Save(BConfigItem configItem)
        {
            foreach (Widget folderWidget in nbProperties.AllChildren)
              {// go through all tabs (there are stored VBoxs with tab contain and Labels with tab name)
            Gtk.VBox tmpVBox = folderWidget as Gtk.VBox;
            if (tmpVBox == null) continue;   // skip labels
            foreach (Widget propertyWidget in tmpVBox.AllChildren)
              { // go through all headers
            Gtk.HBox tmpHBox = propertyWidget as Gtk.HBox;
            if (tmpHBox == null) continue;   // skip headings

            foreach (Widget item in tmpHBox.AllChildren)
            {
              if (item.Name.Substring(0,4) == "item")
              {
                string [] property = (string[])properties[item.Name];
                if (item.GetType() == typeof(Gtk.Entry))
                  configItem.SetAttribute(property[0], property[1], ((Gtk.Entry)item).Text);
                else if (item.GetType() == typeof(Gtk.SpinButton))
                  configItem.SetAttribute(property[0], property[1], ((Gtk.SpinButton)item).Value.ToString());
                else if (item.GetType() == typeof(Gtk.CheckButton))
                  configItem.SetAttribute(property[0], property[1], ((Gtk.CheckButton)item).Active.ToString());
                else if (item.GetType() == typeof(Gtk.ComboBox))
                  configItem.SetAttribute(property[0], property[1], ((Gtk.ComboBox)item).Active.ToString());
              }
            }
              }
              }

              // save to ~/.beline/messages config file
              configItem.SaveConfigToFile(null);
        }