Monday, September 18, 2006

Escribiendo Plugins para LiveWriter ( I )

Introducción:

En esta serie de articulos, comentare lo que estoy aprendiendo acerca de los plugins en Windows Live Writer (de ahora en adelante WLW). Si no tienes instalado este programa descargatelo junto con el SDK.

El objetivo de los plugin, es extender las funcionalidades de un programa, en el caso de WLW concretamente escribiremos plugins para añadir contenidos de manera más interactiva (sin tocar el html), y enriquecer el sistema de blogging, ejemplos de contenidos que podemos añadir como plugins:

  1. Tags de servicios como Del.icio.us, Technorati, etc.
  2. Imagenes online de sitios como Flickr.

Los plugin para WLW reciben el nombre Content Source Plugin, estos se clasifican en dos tipos:

Simple: Permite la inserción de codigo html dentro de un post, Para implementar un plugin de este tipo debemos heredar de la clase base ContentSource.

Smart: Al igual que el anterior permite la inserción de codigo html, pero provee un comportamiento más intuitivo: podemos definir un editor para el SideBar y la habilidad de tener dos representaciones del html (una para la edición y otra para la publicación), entre otras. Para implementar un plugin de este tipo debemos heredar de la clase base SmartContentSource.

Los dos tipos de plugin, pueden originar html desde un cuadro de dialogo, una URL, y datos de Live Clipboard . Para cada una de estas "especificaciones" se debe sobreescribir un metodo en la clase base. En esta entrega solo nos preocuparemos del tipo Simple y de proveer un cuadro de dialogo.

Supongo que ya te has bajado el WLW, así que creemos un nuevo proyecto del tipo Libreria de clases, y agregamos la referencia a la Api de WLW situada en el directorio de instalación, si no cambiaste la ruta de instalación por defecto de la instalación el path debe ser:

C:\Archivos de programa\Windows Live Writer\WindowsLive.Writer.Api.dll

Una vez establecida la referencia podemos crear nuestra clase que herede de ContentSource. Para marcar nuestra clase como plugin, debemos adornarla un atributo:

  • Atributo WriterPlugin

Atributo WriterPlugin, en el constructor de este atributo estamos obligados a indicarle la ID (en forma de GUID, si necesitas una entra aquí) y el Name que sera la cadena por la cual identificaremos al nuestro en la lista.Es posible proporcionar otros parametros al atributo: ImagePath, que indicara la ruta de una imagen incrustada en el assembly, esta imagen sera él icono que lucira nuestro plugin, para que la imagen pueda ser mostrada por el WLW debe ser 20x18 en formato png, tambien es importante que hallamos definido el plugin en el namespace por defecto del proyecto y en caso de haber puesto la imagen dentro de alguna carpeta como Resources,  debemos especificar Resources.imagen.png con el . para indicar la jerarquia;  Description sera una pequeña descripción (2 lineas) del plugin que podremos ver las preferencias del programa; Publish Url, la pagina del autor; HasEditableOptions, añade un botón para editar las opciones en el panel de plugins, ejecutando un metodo que debemos sobreescribir EditOptions.

 y para indicar que esta clase propociona un procedimiento de inserción para un nuevo  contenido mediante un cuadro de dialogo:

  • Atributo InsertableContentSourceAttribute

Especificaremos en el contructor, el texto que tendra en el menu, y si queremos el texto que tendra en la barra (sidebar), en caso de no especificar esta ultimo, se mostrara el texto que tiene del menu en su lugar.

El metodo que se ejecutara al hacer click en el menu o en la barra, sera el que CreateContent que debemos sobreescribir (en el caso de los cuadros de dialogo, como se dijo un poco antes).  Es importante tener claro que este metodo lo ejecuta el WLW, pasando a esta función parametros. Ahora bien, esta función recibe un primer parametro dialogOwner del tipo IWin32Windows, y un segundo del tipo string pasado por referencia newContent, sera este ultimo el que usaremos para devolver el html . Como resultado a esta función pasaremos un valor de la enumeración DialogResult.

El codigo:

 C#

	//el plugin 

using System.Windows.Forms;
using WindowsLive.Writer.Api;
[WriterPlugin("5C572939-449F-499C-8AD8-F17639458440", "MarqueeTag", HasEditableOptions = true,
ImagePath = "Resources.marquee.png", PublisherUrl =
"http://elblogdehoracio.blogspot.com",
Description = "Gives ... can be added")]
[InsertableContentSource("Insert A Marquee Tag", SidebarText = "Marquee Tag")]
public class MarqueeTag : ContentSource
{
public override DialogResult CreateContent(IWin32Window dialogOwner, ref string newContent)
{
DialogResult result;
using (frmMarquee frmInsert = new frmMarquee())
{
result = frmInsert.ShowDialog();
if (result == DialogResult.OK)
{
MessageBox.Show(frmInsert.Handle.ToString() + dialogOwner.Handle.ToString());
newContent = frmInsert.Content;
}
}
return result;
}
}

//el formulario
using System.Windows.Forms;

namespace Typhoon
{
public partial class frmMarquee : Form
{
public string Content;
public frmMarquee()
{
InitializeComponent();
}

private void btnOK_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
char temp = (char)34;
this.Content = string.Format("<marquee direction={4}{1}{4} scrolldelay={4}{2}{4} loop={4}{3}{4}>{0}</marquee>", this.textBox1.Text, this.cmbDirection.Text, this.nudScrolldelay.Value, this.nudLoop.Value, temp);
Close();
}

private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
Close();
}
}
}

VB.NET


//el plugin

Imports WindowsLive.Writer.Api
Imports System.Windows.Forms
<WriterPlugin("5C572939-449F-499C-8AD8-F17639458440", "MarqueeTag", _
Description:="Gives ... can be added", _
ImagePath:="Resources.marquee.png", _
PublisherUrl:="http://elblogdehoracio.blogspot.com")> _
<InsertableContentSource("Insert A Marquee Tag", SidebarText:="Marquee Tag")> _
Public Class MarqueeTag
Inherits ContentSource
Public Overrides Function CreateContent(ByVal dialogOwner As System.Windows.Forms.IWin32Window, ByRef newContent As String) As DialogResult
Dim result As DialogResult
Using frmInsert As New frmMarquee()
result = frmInsert.ShowDialog
If result = DialogResult.OK Then
newContent = frmInsert.Content
End If
End Using
Return result
End Function
End Class

//el formulario
Imports System.Windows.Forms
Public Class frmMarquee
Public Content As String
Private Sub btnOK_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click
Me.DialogResult = Windows.Forms.DialogResult.OK
//'cuando ponemos "" insertamos un ", en c# desconozco la forma de hacer algo parecido por lo que
//'tuve que recurrir a (char)34
Me.Content = String.Format("<marquee direction=""{1}"" scrolldelay=""{2}"" loop=""{3}"">{0}</marquee>", Me.textBox1.Text, Me.cmbDirection.Text, Me.nudScrolldelay.Value, Me.nudLoop.Value)
End Sub
Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
Me.DialogResult = Windows.Forms.DialogResult.Cancel
Close()
End Sub
End Class

 El codigo anterior habla por si solo, utilizamos using para crear una instancia, almacenamos el resultado, de ser OK el resultado, pasamos el texto, liberamos el recurso (la instancia) y devolvemos el resulado. El aspecto del form seria el siguiente:



Para que la depuración sea más comoda, añadan estos comandos en los eventos post compilación en las propiedades del proyecto:



  • XCOPY /D /Y /R "$(TargetPath)" "C:\Archivos de programa\Windows Live Writer\Plugins\"
  • C:\Archivos de Programa\Windows Live Writer\WindowsLiveWriter.exe

Conclusiones:


Como vemos, hacer  un plugin para WLW no es dificil. Con pocas lineas de codigo podemos hacer un sencillo plugin como el anterior que nos permite insertar un texto en movimiento, y solo tenemos que añadir la etiqueta marquee, que tendra en efecto en cualquier etiqueta dentro de su definición, permitiendo insertar el resultado de cualquier plugin (haz doble click en la marquesina y comenzaras a editarla), ejemplo:



Me estoy moviendo muy rapido smile_speedy


En las proximas entregas, veremos como hacer plugins más complejos, si creas un plugin puedes enviarlo a las paginas:


http://windowswriterplugins.wordpress.com/


http://wlwplugins.com/ en esta hay un foro, postealo alli


Bibliografia:


http://tech.pederborgpoulsen.dk/2006/09/05/creating-a-plugin-for-windows-live-writer-using-vbnet/


http://nayyeri.net/archive/2006/08/15/Write-a-Windows-Live-Writer-plugin-using-C_2300_.aspx


salu2smile_sarcastic

1 comment:

Anonymous said...

Do You interesting how to [b]Buy Viagra per pill[/b]? You can find below...
[size=10]>>>[url=http://listita.info/go.php?sid=1][b]Buy Viagra per pill[/b][/url]<<<[/size]

[URL=http://imgwebsearch.com/30269/link/viagra%2C%20tramadol%2C%20zithromax%2C%20carisoprodol%2C%20buy%20cialis/1_valentine3.html][IMG]http://imgwebsearch.com/30269/img0/viagra%2C%20tramadol%2C%20zithromax%2C%20carisoprodol%2C%20buy%20cialis/1_valentine3.png[/IMG][/URL]
[URL=http://imgwebsearch.com/30269/link/buy%20viagra/3_headsex1.html][IMG]http://imgwebsearch.com/30269/img0/buy%20viagra/3_headsex1.png[/IMG][/URL]
[b]Bonus Policy[/b]
Order 3 or more products and get free Regular Airmail shipping!
Free Regular Airmail shipping for orders starting with $200.00!

Free insurance (guaranteed reshipment if delivery failed) for orders starting with $300.00!
[b]Description[/b]

Generic Viagra (sildenafil citrate; brand names include: Aphrodil / Edegra / Erasmo / Penegra / Revatio / Supra / Zwagra) is an effective treatment for erectile dysfunction regardless of the cause or duration of the problem or the age of the patient.
Sildenafil Citrate is the active ingredient used to treat erectile dysfunction (impotence) in men. It can help men who have erectile dysfunction get and sustain an erection when they are sexually excited.
Generic Viagra is manufactured in accordance with World Health Organization standards and guidelines (WHO-GMP). Also you can find on our sites.
Generic [url=http://viagra.gertantis.ru]legal buy viagra online[/url] is made with thorough reverse engineering for the sildenafil citrate molecule - a totally different process of making sildenafil and its reaction. That is why it takes effect in 15 minutes compared to other drugs which take 30-40 minutes to take effect.
[b]top viagra online sales
Viagra Stop Stop Stop English Lyrics
5 sildenafil citrate viagra
Viagra Heart Transplant
viagra mexico ciudad del carmen
penes con viagra
hide viagra in health reform
[/b]
Even in the most sexually liberated and self-satisfied of nations, many people still yearn to burn more, to feel ready for bedding no matter what the clock says and to desire their partner of 23 years as much as they did when their love was brand new.
The market is saturated with books on how to revive a flagging libido or spice up monotonous sex, and sex therapists say “lack of desire” is one of the most common complaints they hear from patients, particularly women.