Paso 8: Codificación de los eventos
En este paso tenemos que introducir el código para los eventos de los botones
y ListView. Estos eventos son genéricos, lo que significa que todos los controles generados dinámicamente llamará a estos eventos. Así, para saber qué ranura llamado el evento vamos a leer la propiedad Tag del control, que contiene el índice correcto de la aClipboardSlotData de la matriz.
Vamos a comenzar con el evento que maneja el doble clic en ListView. Cuando el usuario haga doble clic en un ListViewItem debemos demostrar un cuadro de mensaje con el contenido de los elementos seleccionados.
Si el SelectedIndex de la propiedad ListView es mayor que -1 que esto significa que se selecciona un elemento y será utilizar el valor de esta propiedad como un índice para el arreglo de discos que almacenan los datos del portapapeles (aClipboardSlotData). El código siguiente muestra el contenido del método delegado lstData_MouseDoubleClick().
void lstData_MouseDoubleClick (objeto sender, MouseButtonEventArgs e)
{
Lista v = (ListView) sender;
Índice de int = Convert.ToInt32(v.Tag);
Si (v.SelectedIndex! = -1)
MessageBox.Show (aClipboadSlotData [index]. ElementAt(v.SelectedIndex). ToString());
}
El siguiente método de delegado, que tenemos que crear es el evento que la haga clic en el botón Copiar. Copy_Click() llama a este método de delegado y necesitamos primero la ventana de código activa con el método de GetActiveView() creado en el paso 6 y comprobar si la visión es la correcta.
A continuación, debemos leer el texto seleccionado actual con el método de GetTextForPastie() que también fue creado en el paso 6. Después de recibir el texto que necesitamos comprobar si está vacía.
Si el texto seleccionado no está vacío, deberemos insertar en el array aClipboardSlotData. Realizamos esta inserción en un nuevo método llamado InsertDataHistory(). Por último, debemos actualizar el ListView utilizando otro método nuevo llamado AccomodateDataListView(). Pero primero veamos el código para el Copy_Click() delegado de método.
void Copy_Click (objeto sender, RoutedEventArgs e)
{
int index = Convert.ToInt32(((Button)sender). Etiqueta);
vista = GetActiveTextView();
Si (! () this.View == null || MultiSlotClipboardPackage.thePackage.Dte.ActiveDocument == null))
{
String sData = GetTextForPastie(view);
Si (sData! = "")
{
InsertDataHistory (index, sData);
AccomodateDataListView(index);
}
}
}
La Copy_Click() comienza por leer el valor de la propiedad Tag del botón que se hizo clic. Esta propiedad contiene el índice que vamos a utilizar como el número de ranura. A continuación llame al método GetActiveTextView() y compruebe el valor devuelto para ver si tenemos la ventana correcta.
Las siguientes líneas de código Obtén el texto seleccionado con el método GetTextForPastie(). Entonces comprobamos si hay cualquier texto seleccionado y si llamamos al método InsertDataHistory() para insertar los datos en la matriz aClipboardSlotData. Por último, cambiamos los elementos del ListView con el método AccomodateDataListView().
El método InsertDataHistory() tiene un trabajo sencillo. En primer lugar, que recibe el índice de la ranura del portapapeles y el texto seleccionado. Luego debe insertar el texto seleccionado en la primera posición de la matriz aClipboardSlotData, que debería funcionar como una pila o una estructura de datos LIFO (http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29).
En lugar de implementar una estructura de datos pila desde cero solo creamos una nueva lista e insertar el valor de texto seleccionado enviado como un parámetro en su primera posición. A continuación, atraviesa la matriz existente de aClipboardSlotData a partir del segundo elemento y colocar los datos en la nueva lista. Finalmente, reemplaza la lista existente en aClipboardSlotData con el que acabamos de crear. El código siguiente muestra cómo se realizan estas operaciones.
privado void InsertDataHistory (int indexSlot, String sData)
{
Lista de list_temp = new List();
list_temp. Insertar (0, sData);
para (int i = 0; i < aClipboadSlotData [indexSlot]. Count - 1; i ++)
{
list_temp. Insertar (i + 1, aClipboadSlotData [indexSlot]. ElementAt(i). ToString());
}
aClipboadSlotData [indexSlot]. RemoveRange (0, aClipboadSlotData [indexSlot]. Cuenta);
aClipboadSlotData [indexSlot]. InsertRange (0, list_temp);
retorno;
}
Ahora que hemos insertado el texto seleccionado en la posición correcta de la lista almacenada dentro de la matriz de aClipboardSlotData debemos actualizar los elementos de ListView. Lo hacemos dentro del método AccomodateDataListView() que recibe el índice de la matriz como un parámetro.
El AccomodateDataListView() es sencillo: nos borra todos los elementos de ListViewItem e inserta los nuevos en el orden de la lista almacenada dentro de la aClipboardSlotData. Asegúrese de insertar sólo 15 caracteres de cada texto para evitar cortan el texto. Finalmente, pedimos una actualización en la interfaz de usuario y seleccione el primer elemento del ListView.
privado void AccomodateDataListView (int indexSlot)
{
Lista v = aGroupGrids (ListView) [indexSlot]. Niños [2];
v.Items.Clear();
foreach (String s en aClipboadSlotData[indexSlot])
{
Si (! s.Equals(""))
{
Si (15 > s.Length)
v.Items.Add (s.Substring (0, 15));
otra cosa
v.Items.Add(s);
}
}
v.Items.Refresh();
v.SelectedIndex = 0;
}
Ya casi terminamos. Tenemos que crear el código para los eventos que manejan la haga clic en el corte y los botones de pasta. El evento para el botón de corte es casi lo mismo que el botón de copia: la única diferencia es que después de recibir el texto seleccionado necesita para borrar el texto que está seleccionado en la ventana de código y eliminar selección del texto.
Para borrar el texto seleccionado debemos utilizar el objeto que implementa la interfaz ITextEdit. Obtenemos este objeto al método CreateEdit() de la propiedad de TextBuffer que se encuentran en la variable ver que representa la vista actual del editor de código. Una vez que el objeto de ITextEdit utilizamos el método Delete() para borrar los caracteres y el método Apply() para cambiar el texto. Por último, quitamos la selección utilizando el método Clear() de la propiedad de la selección de la vista.
Pero hay un retén cuando se utiliza el método Delete(): debemos proporcionar la posición que queremos empezar a borrar los caracteres y los caracteres cuántos tenemos que eliminar. Para obtener la posición de la selección actual utilizamos la propiedad Position de la propiedad Selection.Start, que representa el lugar de inicio donde comienza la selección. De manera similar, usamos la propiedad Selection.End para conseguir el puesto entero exacto del final de la selección. Continuación se muestra el código para el método de delegado Cut_Click().
void Cut_Click (objeto sender, RoutedEventArgs e)
{
int index = Convert.ToInt32(((Button)sender). Etiqueta);
vista = GetActiveTextView();
Si (! () this.View == null || MultiSlotClipboardPackage.thePackage.Dte.ActiveDocument == null))
{
String sData = GetTextForPastie(view);
Si (sData! = "")
{
InsertDataHistory (index, sData);
AccomodateDataListView(index);
Editar Microsoft.VisualStudio.Text.ITextEdit = view. TextBuffer.CreateEdit();
editar. Borrar (vista. Selection.Start.Position.Position, ver. Selection.End.Position.Position - ver. Selection.Start.Position.Position);
editar. Apply();
vista. Selection.Clear();
}
}
}
El método de delegado final que debemos crear es la que manejan el evento click en el botón pegar. Sin embargo, antes de crear este método primero debemos desarrollar una forma de extraer el elemento de texto de la matriz aClipboardSlotData, que es la estructura de datos que almacenan las ranuras y su historia.
El nuevo método que extrae el texto de una historia de ranura se llama getSelectedItem() y recibe el índice de la ranura como parámetro. Este método debe devolver el valor de los datos de la historia de la ranura que corresponde al elemento seleccionado en el ListView. Si ningún elemento está seleccionado en el ListView el método debe devolver el primer elemento del ListView.
La primera tarea de la getSelectedItem() es conseguir la lista correspondiente con el índice y la matriz de aGroupGrids. A continuación, el método comprueba si el ListView obtenido está vacío y si no es la propiedad SelectedIndex se utiliza con la matriz de aClipboardSlodData para obtener el elemento de la ranura correcta y la posición correcta de la historia.
privada cadena getSelectedItem (int indexSlot)
{
String ret = "";
Lista v = aGroupGrids (ListView) [indexSlot]. Niños [2];
Si (v.Items.Count > 0)
{
Si (v.SelectedIndex > = 0)
{
RET = aClipboadSlotData [indexSlot]. ElementAt(v.SelectedIndex). ToString();
}
otra cosa
RET = aClipboadSlotData [indexSlot]. ElementAt(0). ToString();
}
Return ret;
}
Finalmente, la última pieza de código que debemos implementar es el método de delegado que manejan los haga clic en el botón Paste. El método Paste_Click() Haz primero la corriente ve con el GetActiveTextView() y comprobar si la vista actual es el editor de código, al igual que el Copy_Click() y el Cut_Click() delegan de métodos. El método llama getSelectedItem() enviar como parámetro el índice de valor de la propiedad Tag del botón que se hizo clic.
Si hay algunos datos sobre la historia correspondiente y la posición de la ranura, se debe insertar este texto en la posición actual del cursor (cursor). Para insertar el valor de texto en la posición exacta del cursor usamos otra vez el objeto que implementa la interfaz ITextEdit obtenida por el método CreateEdit() de la propiedad de TextBuffer, al igual que en el método de evento de corte. Sin embargo, aquí nos debemos utilizar el método Insert() en vez de la Delete() y proporcionar la corriente carret posición obtenida de la propiedad Position de la propiedad Caret.Position.BufferPostion del objeto view. La parte final del código de este Instructable es muestra a continuación
void Paste_Click (objeto sender, RoutedEventArgs e)
{
int index = Convert.ToInt32(((Button)sender). Etiqueta);
vista = GetActiveTextView();
Si (! () this.View == null || MultiSlotClipboardPackage.thePackage.Dte.ActiveDocument == null))
{
String sData = getSelectedItem(index);
Si (! sData.Equals(""))
{
Editar Microsoft.VisualStudio.Text.ITextEdit = view. TextBuffer.CreateEdit();
editar. Insertar (vista. Caret.Position.BufferPosition.Position, sData);
editar. Apply();
}
}
}