« Dev »

[JS] Le scrolling : Plein de scrollers prêt à l’emploi

18 octobre 2006

Bon je ne vais pas revenir sur ce qu’est le scrolling ou un scroller mais rapidement c’est qu’il vous permez de faire défiler du contenu (texte, image, etc…) à l’ecran :)
Certe votre navigateur préféré vous offrent de belles barres grises pour pouvoir faire défiler les pages mais dans certains sitse, pour mieux intégrer le design, l’on developpe notre propre systeme de scrolling… C’est ce que je fais nottament avec un site d’un client où je propose de belles petites fleches (qui ne sont ni plus ni moins que des images) pour pouvoir faire defiler le contenu (en fait je deplace juste un div).

J’avais déjà developpé un petit systeme de scrolling pour mon projet SUPINFO DotNet l’an dernier, mais devant souvent reprendre le code pour l’integrer dans mes developpements en cours j’ai décidé de faire un script complet et générique pour pouvoir l’intégrer dans n’importe quel site.

Je vous met donc ici à disposition mon code (vive l’open source :) ). Bon biensur, merci vous faire connaitre si vous l’utilisez dans vos developpements ^_^

Mon script contient (entre autre) :

  • RegisterScroller(name,parentSize,initial_position,reload_postback). Le 1er parametre est le nom (id) du DIV a scroller, le parentSize est un objet Point qui definit la taille du parent (partie visible), initial_position est aussi un Point qui définit les coordonnées initiales du DIV et reload_postback est un booléan qui défini si le DIV doit etre remplacé à sa derniere position lors de l’appel de la fonction refixPosition (que nous verrons ci-après)
  • refixPosition() : permet de repositionner les scrollers marqués de reload_postback à True. (Utile dans le cas d’une utilisation avec Atlas. cf ce post)
  • resetPosition(sender) : où sender est l’id du DIV/Scroller à remettre à sa position d’origine (initial_position)
  • startScroll(sender, direction) : sender etant l’ID du DIV/Scroller et direction peut etre UP, DN, GT, LT. La fonction permet donc de demarrer le scrolling (à placer sur le click de la fleche)
  • stopScroll(sender) : permet d’arreter le scroll (à placer sur le mouseout de la fleche)
  • scroll(sender, direction) : fonction qui vient scroller le sender en fonction de sa direction. (à placer sur le mouseover de la fleche).

Exemple dans mon load de ma page je retrouve :

1
2
RegisterScroller("pellicule_content",
              new Point(295,65), new Point(13,0), true);

Qui me permet d’enregistrer le sroller sur le DIV pellicule_content qui sera visible dans un rectangle de 275x65px, qui démarre à 13px du bord gauche et qui est repositionné à sa derniere postion lors de l’appel de la fonction refixPostion()
Puis dans mon code HTML je retrouve quelque chose du type :

1
2
3
4
5
<img id="img_btLeft" src="..." alt="" onclick="scroll('pellicule_content','LT')" onmouseover="startScroll('pellicule_content','LT')" onmouseout="stopScroll('pellicule_content')" />
<img id="img_btRight" src="..." alt="" onclick="scroll('pellicule_content','GT')" onmouseover="startScroll('pellicule_content','GT')" onmouseout="stopScroll('pellicule_content')" />
<div id="pellicule_content">
    <!-- mes Images -->
</div>

Bon biensur à vous de vous débrouillez avec le CSS et les ZIndex pour faire quelque chose potable :)

Donc vous voila parrez pour faire pleins de scrollers dans vos sites, en haut/bas, gauche/droite. Elles est pas belle la vie ? ^_^

Télécharger mon script Scroll.js

Tous commentaires sont les bienvenues :)

[JS] Surcharge de parametres JavaScript

18 octobre 2006

C’est en lisant le code source JS d’Atlas que j’ai decouvert la surcharge de parametres Javascript. Ok cela vous parrez peut être idiot mais comme dirait un certain B.Watterson : L’idiotie est l’essence des hommes et je n’ai d’honte à apprendre :)

Alors voila, je lisais le code et un moment donné je vois une fonction du type :

1
2
3
function test(arg1, arg2) {
     // Code.....
}

Qui était appellé par une ligne de type :

1
test("ceci", "est", "un", "test");

A ce moment j’ai senti mes petits neuronnes s’exciter dans tous les sens avec la question : Je ne comprends pas, ma fonction attend deux arguments et moi je lui en passe quatre.. Qu’est ce qu’il se passe ? :)
Dans le code de la fonction j’ai vu à plusieurs reprises le mot arguments. En fouillant un peu plus, impossible de trouver la déclaration de cette variable. Serait-ce une variable propre à JS ???
J’ai donc créé une page html entierement vide pour faire un alert() dans une fonction de cette fameuse variable arguments. Suspense jusqu’a l’execution de la page : vais-je tomber sur un undefined ?? => Et ben non, une belle alerte avec inscrit [object Object] et mes petits neuronnes reprirent une activité normale :)

En effet, tous les parametres passés à une fonction javascript sont contenu dans un tableau (Array) nommé arguments.
Exemple simple :

1
2
3
4
5
6
7
8
9
10
function test() {
 	var output = "";
 	for(var a=0;a<arguments.length;a++) {
 		output += arguments[a] + " ";
 	}
 	alert(output);
}
test("1er argument (normal non ?)",
        "et un 2eme.... etonnant",
        "allez, un dernier pour la route :)");

Vous affichera un beau message :

1er argument (normal non ?) et un 2eme.... etonnant allez, un dernier pour la route :) 

Et pourtant ma fonction ne prend aucun parametre explicitement :) Genial non ?

[Atlas] Appeller une fonction JS après un UpdatePanel

9 octobre 2006

J’ai passé ma journée d’hier a chercher comment appeler une fonction JS (coté client donc) après l’update d’un UpdatePanel avec un rendu partiel du ScriptManager (enablepartialrendering= »True »).

J’ai enfin trouvé et en fait c’est vraiment tout bête. Il suffit d’ajouter dans votre Page_Load la ligne :

1
2
Page.ClientScript.RegisterStartupScript(GetType(Page), _
        "<nom_cle>", "<fonction_JS>", True)

Exemple :

1
2
Page.ClientScript.RegisterStartupScript(GetType(Page), _
        "pageLoad", "alert('Salut à tous');", True)

Et surtout n’oubliez pas le dernier parametre à True dans le cas d’un enablepartialrendering= »True » à votre ScriptManager, car c’est lui que j’avais oublié et qui m’a fait chercher de longues heures :)

S’amuser avec MSN et .NET : DotMSN

13 septembre 2006

DotMSN est un projet OpenSource proposé par la socièté Xih Solutions disponnible à l’adresse : http://www.xihsolutions.net/dotmsn/.
DotMSN est une assembly .NET écrite en C# qui implémente la quasi-totalité du protocole MSN dans sa version 9.
Vous pourrez grâce à DotMSN:

  • gérer les connexions à MSN, les status, données personnels et images perso
  • gérer la ContactList (ajout, suppression, bloquer, autoriser)
  • gérer de multiples conversations, les emoticones, texte décoré, etc…
  • interface avec Hotmail (connexion, avertissement des nouveaux mail, etc..)
  • gestion des transferts (fichiers, emoticones, images perso des contacts)

Bref, grâce à DotMSN vous pouvez redevelopper entierement votre propre client MSN. La seule chose à la limite qu’il manque, c’est la gestion du Wizz :)

Toutes les specs de l’assembly sont disponnible à l’adresse: http://www.xihsolutions.net/dotmsn/api
DotMSN contient 3 espaces de nom :

  • XihSolutions.DotMSN : classes de base pour la connexion/deconnexion, conversation, parametres persos, etc…
  • XihSolutions.DotMSN.Core : c’est le moteur, là où se trouve toute l’implémentation du protocole. Nous n’avons pas besoin d’utiliser les classes qu’il renferme.
  • XihSolutions.DotMSN.DataTransfer : toutes les classes en rapport avec le transfert de fichiers, images, emoticones, etc..

Pour démarrer, commencez par instancier la classe Messenger (dans XihSolutions.DotMSN) puis remplir la propriété Credentials avec comme Account et Password votre compte MSN et le ClientID = « msmsgs@msnmsgr.com » et ClientCode = « Q1P7W2E4J9R8U3S5″ pour enfin lancer la méthode Connect

1
2
3
4
5
6
7
Dim msn As New Messenger()
msn.Credentials = New XihSolutions.DotMSN.Credentials()
msn.Credentials.ClientID = "msmsgs@msnmsgr.com"
msn.Credentials.ClientCode = "Q1P7W2E4J9R8U3S5"
msn.Credentials.Account = "VOTRE_COMPTE_MSN"
msn.Credentials.Password = "VOTRE_PWD_MSN"
msn.Connect()

Vous êtes maintenant connecté au service MSN mais pas encore en ligne. Pour cela abonnez-vous à l’évenement SignedIn dans Nameserver de votre objet MSN (AddHandler msn.Nameserver.SignedIn, AddressOf ….). L’évenement sera appellé dès que votre connexion sera effective. En reponse à l’appel de cet evenement, placez le code :

1
2
msn.Owner.Status = PresenceStatus.Online
msn.Owner.Name = "VOTRE_PSEUDO"

Le code aura pour but de définir votre pseudo ainsi que votre status.

La proprièté Owner permet donc de definir votre profil, nom, image perso, status, etc… Vous trouverez aussi la propriété ContactList pour la liste de vos contacts. Exemple pour afficher votre ContactList :

1
2
3
4
For Each c As Contact In session.MSNSession.ContactList.All
     Debug.WriteLine(String.Format("Email: {0} - Status : {1} - Autorisé : {2}", _
              c.Mail, c.Status.ToString(), c.OnAllowedList.ToString())
Next

Il faudra aussi vous abonnez à l’évenement ConversationCreated de la classe Messenger qui averti qu’une nouvelle conversation est crée. Vous recuperez alors l’objet Conversation qui contient la propriété Switchboard pour pouvoir lire les messages, en envoyer, lancer des invitations de transfert de fichiers, etc… A ce titre, dès qu’une conversation est crée, n’oubliez pas aussi de vous abonnez à l’événement Conversation.Switchboard.TextMessageReceived permettant d’être averti de l’arrivée d’un message.

Enfin pour finir, après la connexion du service MSN, oubliez pas non plus de vous abonnez à l’évenement TransferInvitationReceived de l’objet Messenger permettant d’être averti de l’envoi d’une invitation de transfert. Vous pourrez alors l’accepter en mettant True à la propriété Accept de MSNSLPInvitationEventArgs et démarrer le transfert dans TransferSession.StartDataTransfer(False) (False pour un transfert non direct et True pour direct).
Encore une fois, il faudra vous abonnez à l’évenement TransferFinished de la propriété TransferSession pour être averti de la fin du téléchargement.
Pour enregistrer le fichier transferé en dur dans un fichier :

1
2
3
4
5
Dim stream As New FileStream("CHEMIN_DU_FICHIER", FileMode.Create, FileAccess.Write, FileShare.Read)
With CType(transferSession.DataStream, MemoryStream)
      stream.Write(.GetBuffer(), 0, .Position)
      stream.Close()
End With

Voila, vous êtes maintenant paré pour ecrire votre propre client MSN ^_^ Le mieux, pour bien comprendre, est de regarder les specs de l’assembly pour trouver tous les evenements et methodes dont vous aurez besoin. Vous trouverez de toute facon, un client de démo avec les sources fournis en téléchargeant l’assembly DotMSN. Si avez des soucis, n’hesitez pas à me contacter :)

Persistance&Tracking avec Workflow Foundation

6 août 2006

Windows Workflow Foundation propose deux services fort utile qui sont le Tracking et la Persistance.

La persistance va permettre d’enregistrer l’instance d’un workflow en dur dans un serveur SQL. On va pouvoir grace a cela, demarrer une instance de workflow depuis une application host, la quitter, puis la reprendre a tout moment. La persistance devient alors très utile, imaginez un workflow de gestion d’article qui demarre au moment où un article serait posté et attendrait la validation des admins pour etre publié. Il serait alors fort utile de pouvoir enregistrer et reprendre le workflow quand on le souhaite pour que les admins puissent donner leur reponse à tout moment.

La persistance sous WF est très simple a mettre en oeuvre :
Il faut d’abord préparer la base de données en executant les scripts SQL qui se trouvent dans C:\WINDOWS\WinFX\v3.0\Windows Workflow Foundation\SQL\EN. Il y a 4fichiers : 2 pour les schémas et 2 pour la logique pour la persistance et le tracking. Executez les schémas en 1er biensûr :)
Ensuite pour activer la persistance dans votre workflow, ajoutez le service SqlWorkflowPersistenceService à votre runtime. ex:

1
Dim persistance As New SqlWorkflowPersistenceService(CONNSTRING, True, New TimeSpan(0, 0, 5), New TimeSpan(0, 0, 5) runtime.AddService(persistance)

A tout moment vous allez pouvoir recuperer les instances persistées par le code :

1
Dim instances As IEnumerable(Of SqlPersistenceWorkflowInstanceDescription) = persistance.GetAllWorkflows()

Vous recuperez une collection de SqlPersistenceWorkflowInstanceDescription où vous allez pouvoir recuperer des informations comme son status, son ID d’instance, etc…
Enfin pour récupérer une instance :

1
Dim instance as WorkflowInstance = runtime.GetWorkflow(_instanceID)

_instanceID est un Guid qui correspond à l’ID de l’instance à resumer.

Le Tracking quant à lui, permet de « traquer » un workflow en enregistrant des tas de parametres sur son déroulement. Pour le mettre en place, c’est aussi facile que pour la persistance. Assurez-vous d’avoir bien créé les tables (scripts Tracking_Logic et Tracking_Shema). Ensuite tout comme la persistance, il faudra ajouter le service tracking à la runtime par le code :

1
Dim tracking As New SqlTrackingService(CONNSTRING) runtime.AddService(tracking)

Vous pourrez ensuite recuperer un tas de parametres pour toutes les instances par le code :

1
2
Dim stq As New SqlTrackingQuery(CONNSTRING)
Return stq.GetWorkflows(New SqlTrackingQueryOptions())

Ce code vous retournera une List(Of SqlTrackingWorkflowInstance) (autopub: explication des List ici) :) )

L’objet SqlTrackingQueryOptions permet quant à lui, d’imposer des conditions de recherche. L’exemple ci-dessous permet de recuperer seulement les instances en cours (running) :

1
2
3
4
Dim stq As New SqlTrackingQuery(CONNSTRING)
Dim opt As New SqlTrackingQueryOptions()
opt.WorkflowStatus = WorkflowStatus.Running
Return stq.GetWorkflows(opt)

L’objet SqlTrackingWorkflowInstance contient toutes les informations sur une instance de Workflow. On y trouve les propriètés ActivityEvents (evenement des Activity), Status, UserEvents (evenement des utilisateurs comme par exemple les traces laissées par les TrackData dans le workflow), WorkflowInstanceId, etc…

Toutes les specs du SqlTrackingWorkflowInstance : http://windowssdk.msdn.microsoft.com/en-us/lib…

Conclusion : ca devient un vrai jeu d’enfant, sous WF, de persister et tracer un workflow. Moi j’adore :)