MyFavouriteThings project update,

Tuesday, 18 November 2008 14:43 by frimbooze

I have been working on my project where I can and I have decided on a JavaScript Library for the project. The winner was jquery, due to a recent decision by Microsoft ‘jquery will be the official script library for asp projects and as such there is a patch to add intellisense for jquery, this obviously helps development of custom JavaScript widgets.

I have been doing research and found the following sites helpful:

 ClassDiagram1

I have prototyped the methods for the web-service, No other code is yet implemented, I will use these prototypes to build custom ajax calls using the jquery methods and not the built in script manager.  Hopefully then after creating the data objects in JavaScript I will be able to test these methods and see the resulting post data they generate and in the web services test if the ajax calls product expected input and output using magic data.

What to do next?

  • Code the Data objects in javascript.
  • Code custom ajax calls.
  • Test input and output for these calls.
  • Design template for the site.
  • Mock-up the interfaces for adding, removing and updating.
  • Look at UI tools offered by jquery UI.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags:   , ,
Categories:   Projects
Actions:   E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

My Favourite Things

Friday, 24 October 2008 13:25 by frimbooze

I altered a requirement of the project, Originally I decided that I would only have one implementation of each time e.g only one category of type book. I was thinking that I would rather have many instances of each type. Say I wanted to have favourites book list and a 2nd books I hate list. This would have been impossible with my first implementation.

I have altered the DB schema accordingly. There is now a table for each type that will store each instance as a row, the instance data is serialized into Json. I have not normalizing the data further and thus have avoided second and third tables for each category.

Each type needs its own DB class which cannot be generic as specific SQL queries are needed for each type. I have implement and interface ICategory.

ClassDiagram1 

Each Type will implement this interface and the IErrorLog which contains a simple method to log each exception in a textfile.

Each Type is able to save an instance of itself into a SQLite table. Now all we need is a generic collection to interact with.

ClassDiagram1

This generic collection when created gather all items in the DB for that type and de-serialize them into a collection. Any items added removed or updated will be altered in the DB table as well.

The main purpose of this collection is to provide and abstraction to the DB and allow all instances to be serialized and sent to the client. A data-table could be used in this collections place.

What’s Next?

  • Test, must write a test for these interfaces and magic data for each type.
  • Implement the interfaces IErrorLog and ICategory in all category types, 8 in all

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags:   , ,
Categories:   Projects
Actions:   E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

Favourite Things- Data Package

Friday, 10 October 2008 11:18 by frimbob

I have been working on this project in my spare time for a few weeks now, as I mentioned in a previous post , I have define a number of data classes and have decided to use an SQL Lite DB as a robust data store.

I built a simple data-class to handle the transactions to the DB.

image

The class consisted of a few methods that execute a pre-built sql command, 2 method in which to build the SQLLiteCommand object and some public methods to return a category and an image.

Handling Images

I wanted my application to store images in a separate table for performance reasons, a http handler could then be used to return an image. Since the images will upload as a byte stream , it is very easy to store them in the DB.

Going to make some changes

Last night I was thinking that wouldn't it be great if I could create multiple instances of each type on the client side. Say for example I wanted to create a ’list of books I hate’ the data is still of type books, but since my current DB schema only supports one category of a particular type this would be impossible.

How to Fix?

Again not too difficult I will have to move each type out of a single table and into its own, then I could store each instance in the table as a serialized JSON stream. I will need to create Collection class for each type, able to read the data from the DB and de-serialize into a collection.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags:   , ,
Categories:   Projects
Actions:   E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

New Project: My Favourite Things

Friday, 19 September 2008 14:56 by Frimbob

I have been wanting to try this for a while, I have wanted an easy way to create lists of my Favourite; movies , books, songs etc and display them on my Blog, now I could just do a couple of blog posts but my lists change very quickly and its would just become a time issue.

I wanted to attempt a ajax app, so my a project that would allow me to use ajax techniques with a persistent data store seem in fruition, I could then dynamically display the lists and a have an easily modify control.

Quickly I have some requirements.

  1. Use the .Net 3.5, framework
  2. Blog use a flat file so must this datastore.
  3. Use JSON and not xml as data format.
  4. Use AJAX techniques.
  5. YUI library components for the script.

I have identified 3 packages:

  • Library which handle object definitions and persistence.
  • Web-services that provide the access layer.
  • Client Side package to display and allow control.  

Nothing too ground breaking about that setup, I have made good inroads into the first data layer.

Objectives of Data Layer

  • It must accept string paramaters and return JSON string.
  • Handle all transactions and object Deinitions.
  • Provide a robust data-store.

I have decided to use the following libraries for this package.

  • Json.net - This provides the Json TO .Net Object mapping. Is better than the inbuilt Json parser IMOP.
  • SQLlite ado.net Provider - This provide the flat-file DB and help ensure transactional and data integrity.

The Data-Definitions

This is hierarchal data, With each category and items under the category. I have defined 2 base cases that cover the common data between each category. Below is a print out of these two classes

ClassDiagram1

The 'CategoriesBase' implements 2 important static generic  methods. The first is a Serialize obj to json, which as its name suggest return a json string from an object.

The 2nd method is the reverse, De-serialize takes a Json string and returns an object.

These classes are still a work in progress but I will require a method that will store and object in the DB an other to retrieve it.

The Sub-Classes

I have created a number of categories and items.

  • Albums
  • Books
  • Drinks
  • Movies
  • Recepies
  • Songs
  • Sports
  • TVShows

ClassDiagram2

Observations

  • By Hard Coding the data-objects, I make adding new ones more difficult.
  • The DB will consists of a single table with each category consuming one column, The objects state will be mapped to a single record and stored in JSON text string.
  • I'm working on an object level, To edit and 'item' I will have to restore the state of the category first.
  • No be appropriate for complex structures.
  • Using DB over the .net streamwriter or and XML data-store(my first choice) gives Transaction integrity where none would have existed and easier to backup a single file than 5 or six.

Jobs to Come

I still must develop an DB helper class to handle the transaction to the DB file and obviously needs some magic data to test the methods.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags:   , , , ,
Categories:   Projects
Actions:   E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed

Word Menus Update:

Friday, 20 June 2008 22:19 by frimbob

I have modified the code that I used to create a word menu to build a dynamic version of the previous code. The Application uses an xml file to store the names and location of a list of word-documents that need a menu button.

XML_File


   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:   <templates>
   4:     <name location="c:\template1.dot">Template1</name>
   5:     <name location="c:\template2.dot">Template2</name>
   6:     <name location="c:\template3.dot">Template3</name>
   7:     <name location="c:\template4.dot">Template4</name>
   8:   </templates>
   9: </configuration>

I then built a simple class to load and parse the xml file. The class uses and event handler to send the results to other class that are registered. (really an experiment for a delegate call back used in implementing patters like the observer, just for the practice).

ConfigData


   1: Imports System.Xml
   2: Imports System.Xml.Serialization
   3: Imports System.IO
   4:  
   5: '<summary> Reads a Config XmlFile and provides its data as Properties </summary>
   6: Public Class ConfigFile
   7:  
   8: #Region "Private Members"
   9:  
  10:     'Private Members
  11:     Dim TemplateNames_Collection As New System.Collections.Generic.Dictionary(Of String, String)
  12:     Dim objxmlDocument As New XmlDocument
  13:     Dim objRootNode As XmlNode
  14:  
  15:     Delegate Sub UpdateHandler(ByVal sender As Object)
  16:     Public Event UpdateEvent As UpdateHandler
  17:  
  18: #End Region
  19:  
  20: #Region "Properties"
  21:  
  22:     'Declare Properties
  23:     ReadOnly Property TemplateCollection() As System.Collections.Generic.Dictionary(Of String, String)
  24:         Get
  25:             Return TemplateNames_Collection
  26:         End Get
  27:     End Property
  28:  
  29: #End Region
  30:  
  31: #Region "Public Methods"
  32:  
  33:     Public Sub ReadXMLFile()
  34:         'declarations
  35:         Dim objRootChildNodes As XmlNodeList
  36:  
  37:         'get values out of the file and into the dataStructure
  38:         objRootChildNodes = objRootNode.ChildNodes
  39:  
  40:         For Each xmlnode As System.Xml.XmlNode In objRootChildNodes
  41:             For Each xmlNode2 As System.Xml.XmlNode In xmlnode.ChildNodes
  42:                 Dim strNodeValue As String = xmlNode2.InnerText
  43:                 Dim strNodeLocation As String = xmlNode2.Attributes.ItemOf(0).Value
  44:                 TemplateNames_Collection.Add(strNodeValue, strNodeLocation)
  45:             Next
  46:         Next
  47:  
  48:         RaiseEvent UpdateEvent(Me) ' Call the update Event
  49:  
  50:     End Sub
  51:  
  52: #End Region
  53:  
  54: #Region "Constructor"
  55:  
  56:     Public Sub New()
  57:         'loadtheXmlFile 
  58:         objxmlDocument.Load("C:\Users\Guest\Documents\Visual Studio 2005\Projects\WordAddIn1\WordAddIn1\Custom Classes\XMLFile1.xml")
  59:         objRootNode = objxmlDocument.DocumentElement
  60:     End Sub
  61:  
  62: #End Region
  63:  
  64:  
  65: End Class
  66:  

I used the collection in the above class in a For Each loop.  This loop creates a new commandbutton , which is then stored in an array declared at the class level. If the button object where not stored in the array they would go out of scope when the function ends and only the last instance of the button would still exist.

MenuBuilder


   1: Public Class MenuBuilder
   2:  
   3: #Region "Declarations"
   4:  
   5:     Private TemplateCollection As System.Collections.Generic.Dictionary(Of String, String)
   6:     Private MenuTag As String = "Air Stories Helper Program"
   7:     Dim menuCommand() As Office.CommandBarButton
   8: #End Region
   9:  
  10: #Region "properties"
  11:     Private thisapp As Word.Application
  12:     Public Property ThisApplication() As Word.Application
  13:         Get
  14:             Return thisapp
  15:         End Get
  16:         Set(ByVal value As Word.Application)
  17:             thisapp = value
  18:         End Set
  19:     End Property
  20:  
  21: #End Region
  22:  
  23: #Region "Public Methods"
  24:     'loads the controls on the toolbar
  25:     Public Sub LoadData(ByVal subject As Object)
  26:         Dim configData As ConfigFile = TryCast(subject, ConfigFile)
  27:         If Not IsNothing(configData) Or Not IsDBNull(configData) Then
  28:             TemplateCollection = configData.TemplateCollection
  29:         End If
  30:     End Sub
  31:  
  32:  
  33:     Public Sub LoadControls()
  34:  
  35:         'Test for data
  36:         If Not IsNothing(TemplateCollection) Then
  37:             'check if menu bar exists function
  38:             Call CheckIfMenuBarExists()
  39:  
  40:             'load function
  41:             Call AddMenuBar()
  42:         Else
  43:             MessageBox.Show("No menu data present plese contant Administrator")
  44:  
  45:         End If
  46:     End Sub
  47:  
  48:     ' Create the menu, if it does not exist.
  49:     Private Sub AddMenuBar()
  50:         Try
  51:             Dim menuBar As Office.CommandBar = WordAddIn1.Globals.ThisAddIn.Application.CommandBars.ActiveMenuBar
  52:             Dim menuCaption As String = "AIR Template Menu"
  53:             Dim intcounter As Integer = 0
  54:  
  55:             If menuBar IsNot Nothing Then
  56:                 Dim cmdBarControl As Office.CommandBarPopup = Nothing
  57:                 Dim controlCount As Integer = menuBar.Controls.Count
  58:  
  59:                 ' Add the new menu.
  60:                 cmdBarControl = CType(menuBar.Controls.Add(Type:=Office.MsoControlType.msoControlPopup, Before:=controlCount, Temporary:=True),  _
  61:                     Office.CommandBarPopup)
  62:                 cmdBarControl.Caption = "AirStories"
  63:                 cmdBarControl.Tag = MenuTag
  64:  
  65:                 For Each item As String In TemplateCollection.Keys
  66:                     Dim Button As Office.CommandBarButton
  67:                     'Add the menu command.
  68:                     Button = CType(cmdBarControl.Controls.Add(Type:=Office.MsoControlType.msoControlButton, Temporary:=True), Office.CommandBarButton)
  69:                     With Button
  70:                         .Caption = item.ToString
  71:                         .Tag = item.ToString
  72:                         .FaceId = 300
  73:                     End With
  74:                     AddHandler Button.Click, AddressOf menuCommand_Click
  75:                     ReDim Preserve menuCommand(intcounter) ' re-size the array
  76:                     menuCommand(intcounter) = Button
  77:                     intcounter = intcounter + 1 ' increment the counter       
  78:                 Next
  79:  
  80:             End If
  81:         Catch ex As Exception
  82:             MessageBox.Show(ex.Message)
  83:         End Try
  84:     End Sub
  85:  
  86:  
  87: #Region "Constructor"
  88:     Public Sub New()
  89:  
  90:  
  91:     End Sub
  92: #End Region
  93:  
  94: #End Region
  95:  
  96: #Region "Private Methods"
  97:  
  98:     ' If the menu already exists, remove it.
  99:     Private Sub CheckIfMenuBarExists()
 100:         Try
 101:             Dim foundMenu As Office.CommandBarPopup = thisapp.Application.CommandBars.ActiveMenuBar.FindControl(Office.MsoControlType.msoControlPopup, Tag:=MenuTag, Visible:=True, Recursive:=True)
 102:             If foundMenu IsNot Nothing Then
 103:                 foundMenu.Delete(True)
 104:             End If
 105:  
 106:         Catch ex As Exception
 107:             MessageBox.Show(ex.Message)
 108:         End Try
 109:     End Sub
 110:  
 111:  
 112:     'Method to verify the template location
 113:     Private Function VerifyTemplateLoc(ByVal Template As String) As Boolean
 114:         Dim Applic As Word.Application = Globals.ThisAddIn.Application
 115:  
 116:         'split the file name and the location