Máscara de formatação
Neste meu primeiro artigo para a comunidade estou postando uma adaptação da classe Gtk2_EntryMask desenvolvida inicialmente pelo Pablo Dall'Oglio para formatação de campos entry.
A classe foi adaptada para uso em conjunto com o Glade, funcionalidade que antes não havia.
Agora é possível aplicar a funcionalidade de máscaras de formatação nos campos entry feitos no Glade, e não mais "na mão" como era o funcionamento anterior da classe.
É importante enfatizar que a classe foi desenvolvida pelo Pablo Dall'Oglio, eu apenas fiz uma adaptação das funcionalidades que já existiam.
Espero que aproveitem bem esta minha primeira contribuíção, que eu espero ser a primeira de muitas.
Leonardo C. Thibes
XML DO GLADE
---------------------------------------------------------
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
<glade-interface>
<widget class="GtkWindow" id="window1">
<property name="width_request">278</property>
<property name="height_request">100</property>
<property name="title" translatable="yes">Máscara de Formatação</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">False</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="focus_on_map">True</property>
<property name="urgency_hint">False</property>
<child>
<widget class="GtkFixed" id="fixed1">
<property name="visible">True</property>
<child>
<widget class="GtkEntry" id="entry1">
<property name="width_request">160</property>
<property name="height_request">27</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">•</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="x">105</property>
<property name="y">7</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button1">
<property name="width_request">55</property>
<property name="height_request">29</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">OK</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
</widget>
<packing>
<property name="x">104</property>
<property name="y">48</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label1">
<property name="width_request">96</property>
<property name="height_request">17</property>
<property name="visible">True</property>
<property name="label" translatable="yes">Máscara Padrão</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="x">5</property>
<property name="y">11</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>
---------------------------------------------------------
PHP QUE MONTA A TELA
---------------------------------------------------------
<?php
require_once('EntryMask.class.php');
class janela {
public function __construct() {
//Glade
$this->glade = new GladeXML('masks.glade');
//EntryMask
$this->EntryMask = new EntryMask();
//Window
$this->win = $this->glade->get_widget('window1');
$this->win->connect('destroy',array($this,'close'));
//Entry1
$this->entry1 = $this->glade->get_widget('entry1');
$this->EntryMask->setMask($this->entry1, '999.999.999-99');
//Button
$this->button = $this->glade->get_widget('button1');
$this->button->connect('clicked', array($this, 'close'));
//Show_all
$this->win->show_all();
}
public function close() {
echo $this->entry1->get_text() . "\n";
gtk::main_quit();
}
}
new janela();
GTK::Main();
?>
---------------------------------------------------------
A CLASSE PROPRIAMENTE DITA
---------------------------------------------------------
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* GtkEntry with mask validation
*
* @category Gtk2
* @package Gtk2_EntryMask
* @author Pablo Dall'Oglio <pablo@php.net>
* @author Leonardo Castilhos Thibes <leonardothibes@yahoo.com.br>
* @license LGPL
* @version $Id: EntryMask.class.php,v 1.0 2007/01/30 11:37:43 leonardo Exp $
*/
class EntryMask {
/**
* Characters used to format mask
* @var array
*/
private $chars;
/**
* The Mask applied to the GtkEntry
* @var string
*/
private $mask;
/**
* The GtkEntry object
* @var $object
*/
private $object;
/**
* The Signal handler that is fired when the user types something
* @var integer
*/
private $handler;
/**
* constructor.
*/
public function __construct() {}
/**
* Setando máscara.
*
* @param string $mask the allowed mask
* @param object $object GtkEntry Object
*/
public function setMask($object, $mask) {
/** Obtebdo objeto GtkEntry **/
$this->obj = $object;
/** Obtendo máscara **/
$this->mask = $mask;
/** Setando tamanho máximo do campo **/
$this->obj->set_max_length(strlen(trim($mask)));
/** Array de separadores **/
$this->chars = array('-', '_', '.', ',', '/', '\\', ':', '|', '(', ')', '[', ']', '{', '}');
/** Conectando o sinal "changed" ao metodo onChange **/
$this->handler = $this->obj->connect('changed', array($this, 'onChange'));
}
/**
* whenever the user types something the content is validated according to
* the mask.
*/
public function onChange() {
/** Setando o texto **/
$text = $this->obj->get_text();
/** Removendo separadores **/
$text = $this->unMask($text);
/** Obtendo o tamanho do texto **/
$len = strlen(trim($text));
/** Aplicando a máscara **/
$new = $this->Mask($this->mask, $text);
/** Agendando novo conteúdo **/
Gtk::timeout_add(1, array($this, 'Set'), $new);
Gtk::timeout_add(1, array($this, 'Validate'));
}
/**
* changes the Entry contents without fire "changed" signal
* @param string $text the new text
*/
public function Set($text) {
/** Desconectando o sinal "changed" do metodo "onChange" **/
$this->obj->disconnect($this->handler);
/** Setando o texto do entry **/
$this->obj->set_text($text);
/** Posicionando o cursor no final do texto **/
$this->obj->select_region(-1,-1);
/** Conectando novamente o sinal "changed" no metodo "onChange" **/
$this->handler = $this->obj->connect_after('changed', array($this, 'onChange'));
}
/**
* Validate the content of GtkEntry
*/
public function Validate() {
/** Obtendo texto do objeto **/
$text = $this->obj->get_text();
/** Obtendo máscara **/
$mask = $this->mask;
/** Obtendo tamanho do texto **/
$len = strlen($text);
$text_char = substr($text, $len-1, 1);
$mask_char = substr($mask, $len-1, 1);
/** Comparando os caracteres digitados com a máscara **/
if ($mask_char == '9')
$valid = ereg('([0-9])', $text_char);
elseif ($mask_char == 'a')
$valid = ereg('([a-z])', $text_char);
elseif ($mask_char == 'A')
$valid = ereg('([A-Z])', $text_char);
elseif ($mask_char == 'X')
$valid = (ereg('([a-z])', $text_char) or
ereg('([A-Z])', $text_char) or
ereg('([0-9])', $text_char));
/** Comparando os caracteres digitados com a máscara **/
/** Caracteres que não se aplicam no escopo da máscara são removidos **/
if (!$valid) {
$this->Set(substr($text, 0, -1));
}
}
/**
* put the typed content in the mask format
* @param string $mask the mask
* @param string $text the content
*/
public function Mask($mask, $text) {
/** Run through the mask chars **/
$z = 0;
for ($n=0; $n < strlen($mask); $n++) {
$mask_char = substr($mask, $n, 1);
$text_char = substr($text, $z, 1);
/** Check when has to concatenate with the separator **/
if(in_array($mask_char, $this->chars)) {
if($z < strlen($text)) {
$result .= $mask_char;
}
} else {
$result .= $text_char;
$z++;
}
}
return $result;
}
/**
* removes the mask from text
* @param string $text the content
*/
public function unMask($text) {
/** Run through the content **/
for ($n=0; $n <= strlen($text); $n++) {
$char = substr($text, $n, 1);
/** Check if it's a separator **/
if (!in_array($char, $this->chars)) {
$result .= $char;
}
}
return $result;
}
}
?>
---------------------------------------------------------




