Cu ajutorul Pocket Outlook Object Model, se poate accesa datele de Calendar, Contacts, si Tasks. Aceste date sunt cunoscutate si sub numele de date PIM (Personal Information Management). Toate elementele de tip PIM sunt derivate din clasa PimItem, iar fiecare are o proprietate unica, ItemId.
Toate proprietatile claselor derivate din PimItem au evenimente corespunzatoare. De exemplu, pentru proprietatea Body, exista evenimentul de BodyChanged.
Observatie: Aceste evenimente reflecta doar schimbarile din codul scris de noi, pentru aplicatia noastra. Daca utilizatorul modifica elemente din aplicatiile PIM standard sau dintr-o aplicatie third-party, datele in aplicatia noastra nu se vor actualiza automat.
In cadrul aplicatiei pe care o voi da ca exemplu in acest articol, presupunem ca ne dorim ca ea sa contina un meniu care sa fie format din: Sarcini, Contacte, Intalniri. Crearea unui meniu este foarte usor de realizat si am aratat-o in cadrul articolului Controale CE.
Asa cum ne-am obisnuit, va trebui sa adaugam referinta in proiect si in cod.
using Microsoft.WindowsMobile.PocketOutlook
Este nevoie sa deschidem o sesiune Outlook cu ajutorul clasei OutlookSession.
OutlookSession session = null;
O vom instantia la evenimentul de Form_Load.
private void Form1_Load(object sender, EventArgs e) { session = new OutlookSession(); }
Pentru a evita neinchiderea conexiunii, in evenimentul de Form_Closing, facem urmatoarea verificare:
private void Form1_Closing(object sender, CancelEventArgs e) { if (session != null) session.Dispose(); }
Presupunem ca avem inregistrari pe dispozitiv in ceea ce priveste cele trei categorii.
Task
Un element de tip Task este folosit pentru stocarea unei liste de tip “to-do”. Acesta are proprietati ca: data limita, status, prioritate, etc. Lista de sarcini din Windows Mobile se poate sincroniza cu lista de task-uri din Outlook.
In primul rand, sa afisam taskurile in aplicatia noastra. Pentru aceasta, parcurgem elementele din OutlookSession.Tasks, elemente pe care le putem afisa cu ajutorul unui control ListBox.
foreach (Task t in session.Tasks.Items) { listBox1.Items.Add(t); }
Un alt mod de afisare:
dataGrid1.DataSource = session.Contacts.Items;
Daca dorim sa cautam un anumit task, folosim metoda Find, ce are doi parametri: unul de tip PropertyDescriptor (un obiect care descrie anumite proprietati ale unui tip) si un alt parametru, de tip object (ceea ce cautam).
Sa observam lucrul cu PropertyDescriptor:
Mai intai declaram obiectul PropertyDescriptor:
PropertyDescriptor pd = null;
In Form_Load vom avea nevoie prima data de tip.
Type taskType = typeof(Task);
Acum putem folosi TypeDescriptor cu metoda GetProperties care va returna o colectie, avand posibilitatea sa indexam dupa numele proprietatii dorite.
pd = TypeDescriptor.GetProperties(taskType)["Subject"];
Pentru al doilea parametru al metodei Find, vom retine intr-o constanta de tip string numele task-ului, pentru simplitatea exemplului.
const string subjectToFind = "Read book";
Apelul metodei Find va returna un int, reprezentand index-ul pentru PropertyDescriptor.
var taskIndex = session.Tasks.Items.Find(pd, subjectToFind);
Vom returna Task-ul specific index-ului returnat, din colectia Items.
Task theTask = session.Tasks.Items[taskIndex];
Pentru verificare, putem afisa, de exemplu, proprietatea Body a task-ului.
MessageBox.Show(theTask.Body.ToString());
Contacts
Clasa Contact este derivata din PimItem. Ea contine proprietati care descriu metode de contact cum ar fi: numar de telefon, email, cod postal.
Pentru afisarea tuturor contactelor salvate in dispozitiv, putem folosi acelasi cod ca in cazul task-urilor.
foreach (Contact c in session.Contacts.Items) { listBox1.Items.Add(c); }
Salvarea unui contact se face foarte usor.
Contact c = session.Contacts.Items.AddNew(); c.FirstName = "first"; c.LastName = "last"; c.MobileTelephoneNumber = "123445789";
Textul (string-ul) afisat pentru un contact poate fi obtinut/creat cu ajutorul proprietatii FileAs. Acesta este generat automat din proprietatile FirstName si LastName.
c.FileAs = "contact";
Appointments
Afisam toate inregistrarile de tip Appointment.
foreach(Appointment a in session.Appointments.Items) { listBox1.Items.Add(a); }
Putem adauga un Appointment prin folosirea metodei AppointmentCollection.AddNew() sau pur si simplu prin constructorul Appointment (in acest caz, folosim AppointmentCollection.Add()).
Appointment a = session.Appointments.Items.AddNew(); a.Subject = "Party"; a.Location = "Brasov"; a.Update();
O inregistrare de tip Appointment poate fi marcata ca un eveniment pentru intreaga zi, cu ajutorul proprietatii AllDayEvent.
a.AllDayEvent = true;
Observatie: Aceasta proprietatea va afecta modul de afisare in cadrul aplicatie Calendar si va ignora componentele pentru stabilirea timpului, proprietatile Start si End.
Proprietatile pe care le are un element de tip PIM sunt, de cele mai multe ori, suficiente. Totusi, in anumite cazuri, dezvoltatorul isi poate crea propriile proprietati, proprietati care nu vor putea fi sincronizate si afisate in Outlook Mobile. Fiecare tip de element PimItem are un set specific de proprietati “strongly-typed” si o colectie Properties care va permite accesul la valorile proprietatilor.
Pentru a construi o proprietate “custom” trebuie mai intai sa o adaugam cu metoda Add.
Contact c = session.Contacts.Items.AddNew(); c.Properties.Add("LastInvoice", typeof(int)); c.Properties["LastInvoice"] = 1234;
Dupa cum am putut observa, lucrul cu elemente Personal Information Management este simplu.
Pocket Outlook Object Model, API-ul pe care se bazeaza dll-ul folosit de noi, este un subset al Outlook Object Model din aplicatia Microsoft Office Outlook de pe sistemele Windows desktop. Bineinteles ca diferenta intre cele doua consta in diferente majore in devafoare versiunii mobile. De exemplu, suportul pentru email nu este inclus in Pocket Outlook Object Model, ci este dat de un API separat.
Toate datele PIM stocate in memoria dispozitivului pot fi sincronizate cu Outlook-ul de pe desktop-ul unui utilizator sau prin Microsoft Exchange Server, in functie de setarile stabilite pentru sincronizare.